Skip to content

Decoupled OTA and Wi-Fi Passwords + New Boot Page#22

Merged
edwardtfn merged 15 commits intomainfrom
update-pics
Feb 24, 2026
Merged

Decoupled OTA and Wi-Fi Passwords + New Boot Page#22
edwardtfn merged 15 commits intomainfrom
update-pics

Conversation

@edwardtfn
Copy link
Copy Markdown
Owner

@edwardtfn edwardtfn commented Feb 24, 2026

Summary by CodeRabbit

  • Documentation

    • Switched many docs images to local assets for faster, more reliable loading.
    • Updated OTA password guidance and migration notes across documentation.
  • Configuration Updates

    • Introduced substitutions-based OTA password workflow (default blank) and migration hints.
    • Raised minimum TFT version requirement to 2.
  • UI Improvements

    • Redesigned boot screens to use image-based rendering with updated layout and status displays.
  • Chores

    • Updated Markdown link-check workflow action.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Feb 24, 2026

Warning

Rate limit exceeded

@edwardtfn has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 0 minutes and 46 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between d168618 and 11242fa.

📒 Files selected for processing (3)
  • .github/workflows/validate_markdown.yml
  • esphome/nspanel_esphome_page_boot.yaml
  • hmi/dev/manuals_screenshots.md
📝 Walkthrough

Walkthrough

This PR localizes doc image assets, introduces an ota_password substitutions workflow (default ""), raises the TFT minimum version to 2, and applies a large HMI boot UI redesign (image-cropped fills, Postinitialize drawing, and component ID renumbering).

Changes

Cohort / File(s) Summary
Docs — Image assets
docs/alarm.md, docs/blueprint.md, docs/error_initializing.md, docs/howto.md
Replaced external GitHub image URLs with local pics/ asset paths for header images and per-state/icon assets.
Docs — OTA/password & workflow
docs/addon_climate.md, docs/customization.md, docs/install.md, docs/migration_from_blackymas.md
Added ota_password: "" to substitutions, reworked examples to use substitutions-based OTA password workflow, removed/retired nextion_update_url references, and added migration notes.
ESPHome substitutions
esphome/nspanel_esphome_base.yaml, esphome/nspanel_esphome_version.yaml
Changed ota_password substitution from ${wifi_password} to ""; bumped min_tft_version substitution from 1 to 2.
HMI — Boot UI redesign (many locales)
hmi/dev/nspanel_*_code/boot.txt (EU/US/CJK/land variants, all listed)
Switched many UI elements from solid-color fills to crop-image/picture fills (Picture ID 32), added a Postinitialize drawing event, renumbered numerous Variables/Text/Button/Timer IDs, replaced text blocks with cropped-image variants, and adjusted layouts/attributes.
HMI docs / screenshots
hmi/dev/manuals_screenshots.md
Replaced older boot static fields with new log/version/system status lines and added progress indicator content.
CI workflow
.github/workflows/validate_markdown.yml
Switched markdown-link-check action to tcort/github-action-markdown-link-check@v1.1.2.

Sequence Diagram(s)

(omitted)

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰 I hopped from URLs into pics/ so bright,

OTA secrets tucked in substitutions at night,
Boot screens now cropped and IDs rearranged,
TFT raised to two — the layout's exchanged,
A tiny rabbit cheers this tidy update light.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately captures the two main changes: decoupling OTA and Wi-Fi passwords (addressed across multiple YAML config and documentation files) and a complete redesign of the boot page UI (reflected in all boot.txt HMI files with extensive ID renumbering and image-crop styling).
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch update-pics

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 009d53c4b1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
docs/error_initializing.md (1)

82-86: ⚠️ Potential issue | 🟠 Major

Add the missing image asset pics/ha_device_sensors_duplicated.png.
The documentation at line 86 references an image that doesn't exist in the repository, which will break the doc rendering. This file must be added to pics/ before merging.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/error_initializing.md` around lines 82 - 86, The docs reference a
missing image named ha_device_sensors_duplicated.png which breaks rendering; add
the actual image file (exactly named ha_device_sensors_duplicated.png) into the
pics/ assets used by docs/error_initializing.md, commit it, and verify the image
renders in the built docs (and optionally optimize or resize the image to match
other pics and ensure casing matches the markdown reference).
hmi/dev/nspanel_CJK_us_code/boot.txt (1)

143-581: ⚠️ Potential issue | 🔴 Critical

Fix critical component ID mismatch: bt_reboot HMI ID is 21 but ESPHome expects 24.

The reboot button's touch event handler in esphome/nspanel_esphome_page_boot.yaml (line 26) checks for component_id == ${PAGE_BOOT_COMPONENT_ID_BT_REBOOT} which is set to 24, but all HMI boot.txt files (across all variants) define bt_reboot with ID: 21. This mismatch prevents the touch event from being recognized, breaking the reboot functionality.

The timers (log_scroll and tm_esphome) are unaffected as they are referenced by component name in ESPHome scripts, not by numeric ID.

Update the HMI component ID from 21 to 24 to match the ESPHome configuration.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hmi/dev/nspanel_CJK_us_code/boot.txt` around lines 143 - 581, The bt_reboot
component in the HMI definition has ID: 21 but ESPHome expects
PAGE_BOOT_COMPONENT_ID_BT_REBOOT == 24, so the touch event never matches; change
the bt_reboot Attributes ID from 21 to 24 (update the "Dual-state Button
bt_reboot" block's ID attribute) so the HMI numeric component ID matches the
ESPHome constant used in esphome/nspanel_esphome_page_boot.yaml
(PAGE_BOOT_COMPONENT_ID_BT_REBOOT).
hmi/dev/nspanel_eu_code/boot.txt (1)

143-581: ⚠️ Potential issue | 🔴 Critical

ID mismatch breaks boot page reboot button handler.

The bt_reboot component has ID 21 in all boot.txt files, but the handler in esphome/nspanel_esphome_page_boot.yaml expects ID 24 (PAGE_BOOT_COMPONENT_ID_BT_REBOOT: 24). When users press the reboot button on the boot page, the display sends component_id 21, which does not match the handler's check, so the reboot function will never execute. Update PAGE_BOOT_COMPONENT_ID_BT_REBOOT to 21.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hmi/dev/nspanel_eu_code/boot.txt` around lines 143 - 581, The reboot button
on the boot page is defined as component bt_reboot with ID 21 but the handler
constant PAGE_BOOT_COMPONENT_ID_BT_REBOOT is set to 24, so component_id checks
never match; update PAGE_BOOT_COMPONENT_ID_BT_REBOOT to 21 in
esphome/nspanel_esphome_page_boot.yaml (or wherever the constant is defined) so
the handler compares against the actual bt_reboot ID and the reboot action will
execute when component_id 21 is received.
hmi/dev/nspanel_CJK_eu_code/boot.txt (1)

499-544: ⚠️ Potential issue | 🟠 Major

Fix substr length for \r character detection in log_scroll timer

At line 518 in all boot.txt files, substr log_body.txt,log_temp.txt,log_pos.val,2 extracts a 2-character substring, but line 519 compares it against the single-character string "\r". String comparison in Nextion is exact, so this will fail to match in all cases except when \r happens to be the final character in the log buffer with a null terminator immediately following—effectively missing the vast majority of carriage return occurrences.

This causes the line-counting logic to fail, allowing the log buffer to grow unbounded instead of trimming at log_max_lines. The comment indicates the intent is "Extract each character to find \r", confirming the substr length should be 1.

This issue exists identically across all six boot.txt file variants (nspanel_CJK_eu_code, nspanel_CJK_us_code, nspanel_CJK_us_land_code, nspanel_eu_code, nspanel_us_code, nspanel_us_land_code).

Proposed fix
-                substr log_body.txt,log_temp.txt,log_pos.val,2
+                substr log_body.txt,log_temp.txt,log_pos.val,1
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hmi/dev/nspanel_CJK_eu_code/boot.txt` around lines 499 - 544, The Timer
"log_scroll" handler is extracting two characters when checking for a carriage
return using substr log_body.txt,log_temp.txt,log_pos.val,2 and then comparing
log_temp.txt to "\r", which never matches; change that substr call to extract a
single character (length 1) so the comparison to "\r" succeeds. Update the
substr call in the log_scroll event (the loop that uses log_pos.val,
log_temp.txt and compares to "\r") across all boot.txt variants
(nspanel_CJK_eu_code, nspanel_CJK_us_code, nspanel_CJK_us_land_code,
nspanel_eu_code, nspanel_us_code, nspanel_us_land_code) so line
counting/trimming works as intended.
🧹 Nitpick comments (1)
hmi/dev/nspanel_CJK_eu_code/boot.txt (1)

31-56: Consider batching the 24 line draws with ref_stop/ref_star to eliminate incremental-draw flicker

On slower panels, 24 sequential line commands can produce a visible one-by-one drawing effect. Wrapping the entire block in ref_stop / ref_star collapses all draws into a single screen refresh.

✨ Proposed refactor
         Postinitialize Event
+            ref_stop
             line 216,55,450,55,WHITE
             line 450,55,450,301,WHITE
             ...
             line 16,299,200,299,WHITE
             vis sys_title,1
+            ref_star
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@hmi/dev/nspanel_CJK_eu_code/boot.txt` around lines 31 - 56, Multiple
sequential `line` draws cause visible incremental rendering on slow panels; wrap
the whole block of `line` commands with `ref_stop` before the first `line` and
`ref_star` after the last `line` so the panel performs a single refresh.
Specifically, insert `ref_stop` immediately before the first `line
216,55,450,55,WHITE` and `ref_star` immediately after the final `line
16,299,200,299,WHITE` (the block that includes the `vis log_title,1` / `vis
ver_title,1` adjacent lines) to collapse the 24 draws into one atomic update.
Ensure the start/end tokens are balanced and keep the `vis` calls in place.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/howto.md`:
- Around line 93-100: The docs reference four missing image assets
(pics/ha_blueprint_dashboard_reimport.png,
pics/ha_blueprint_dashboard_reimport_confirm.png,
pics/esphome_dashboard_install_wirelessly.png,
pics/esphome_dashboard_install_completed.png) in docs/howto.md; either add those
exact files into the pics/ directory with matching filenames and correct
screenshots, or remove the corresponding markdown image references from
docs/howto.md (the two occurrences around the "NSPanel Configuration" blueprint
steps and the two occurrences around the ESPHome dashboard install steps) so the
doc no longer points to non-existent images.

In `@hmi/dev/manuals_screenshots.md`:
- Around line 19-25: Two log entries appended to log_body (the statements using
log_body.txt+=) are missing a space after the colon; update the two strings
"Boot:Waiting for Wi-Fi" and "Boot:Waiting for TFT version" to "Boot: Waiting
for Wi-Fi" and "Boot: Waiting for TFT version" so they match the other "Boot:
..." labels and maintain consistent formatting.

In `@hmi/dev/nspanel_CJK_eu_code/boot.txt`:
- Around line 30-58: The three title components (log_title, ver_title,
sys_title) are missing a Visible: 0 attribute so they render briefly before
Postinitialize runs; edit each component's attribute block to add "Visible: 0"
so they start hidden and the existing Postinitialize "vis <name>,1" calls will
reveal them after the border lines are drawn.

---

Outside diff comments:
In `@docs/error_initializing.md`:
- Around line 82-86: The docs reference a missing image named
ha_device_sensors_duplicated.png which breaks rendering; add the actual image
file (exactly named ha_device_sensors_duplicated.png) into the pics/ assets used
by docs/error_initializing.md, commit it, and verify the image renders in the
built docs (and optionally optimize or resize the image to match other pics and
ensure casing matches the markdown reference).

In `@hmi/dev/nspanel_CJK_eu_code/boot.txt`:
- Around line 499-544: The Timer "log_scroll" handler is extracting two
characters when checking for a carriage return using substr
log_body.txt,log_temp.txt,log_pos.val,2 and then comparing log_temp.txt to "\r",
which never matches; change that substr call to extract a single character
(length 1) so the comparison to "\r" succeeds. Update the substr call in the
log_scroll event (the loop that uses log_pos.val, log_temp.txt and compares to
"\r") across all boot.txt variants (nspanel_CJK_eu_code, nspanel_CJK_us_code,
nspanel_CJK_us_land_code, nspanel_eu_code, nspanel_us_code,
nspanel_us_land_code) so line counting/trimming works as intended.

In `@hmi/dev/nspanel_CJK_us_code/boot.txt`:
- Around line 143-581: The bt_reboot component in the HMI definition has ID: 21
but ESPHome expects PAGE_BOOT_COMPONENT_ID_BT_REBOOT == 24, so the touch event
never matches; change the bt_reboot Attributes ID from 21 to 24 (update the
"Dual-state Button bt_reboot" block's ID attribute) so the HMI numeric component
ID matches the ESPHome constant used in esphome/nspanel_esphome_page_boot.yaml
(PAGE_BOOT_COMPONENT_ID_BT_REBOOT).

In `@hmi/dev/nspanel_eu_code/boot.txt`:
- Around line 143-581: The reboot button on the boot page is defined as
component bt_reboot with ID 21 but the handler constant
PAGE_BOOT_COMPONENT_ID_BT_REBOOT is set to 24, so component_id checks never
match; update PAGE_BOOT_COMPONENT_ID_BT_REBOOT to 21 in
esphome/nspanel_esphome_page_boot.yaml (or wherever the constant is defined) so
the handler compares against the actual bt_reboot ID and the reboot action will
execute when component_id 21 is received.

---

Nitpick comments:
In `@hmi/dev/nspanel_CJK_eu_code/boot.txt`:
- Around line 31-56: Multiple sequential `line` draws cause visible incremental
rendering on slow panels; wrap the whole block of `line` commands with
`ref_stop` before the first `line` and `ref_star` after the last `line` so the
panel performs a single refresh. Specifically, insert `ref_stop` immediately
before the first `line 216,55,450,55,WHITE` and `ref_star` immediately after the
final `line 16,299,200,299,WHITE` (the block that includes the `vis log_title,1`
/ `vis ver_title,1` adjacent lines) to collapse the 24 draws into one atomic
update. Ensure the start/end tokens are balanced and keep the `vis` calls in
place.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f6c4b39 and 009d53c.

⛔ Files ignored due to path filters (41)
  • docs/pics/287632422-afb433e8-f29c-4b3f-8d6b-16a12b181422.png is excluded by !**/*.png
  • docs/pics/GitHub_repo_select_tag_tft_files.png is excluded by !**/*.png
  • docs/pics/alarm-shield-airplane-outline.svg is excluded by !**/*.svg
  • docs/pics/alarm-shield-alert-outline-white.svg is excluded by !**/*.svg
  • docs/pics/alarm-shield-alert-outline.svg is excluded by !**/*.svg
  • docs/pics/alarm-shield-half-full.svg is excluded by !**/*.svg
  • docs/pics/alarm-shield-home-outline.svg is excluded by !**/*.svg
  • docs/pics/alarm-shield-lock-outline.svg is excluded by !**/*.svg
  • docs/pics/alarm-shield-moon-outline.svg is excluded by !**/*.svg
  • docs/pics/alarm-shield-off-outline-amber.svg is excluded by !**/*.svg
  • docs/pics/alarm-shield-off-outline.svg is excluded by !**/*.svg
  • docs/pics/alarm-shield-outline.svg is excluded by !**/*.svg
  • docs/pics/alarm_home.png is excluded by !**/*.png
  • docs/pics/boot_eu.png is excluded by !**/*.png
  • docs/pics/boot_us.png is excluded by !**/*.png
  • docs/pics/esphome_dashboard_install_completed.png is excluded by !**/*.png
  • docs/pics/esphome_dashboard_install_download_project.jpg is excluded by !**/*.jpg
  • docs/pics/esphome_dashboard_install_wirelessly.png is excluded by !**/*.png
  • docs/pics/esphome_dashboard_yaml_ref_main.png is excluded by !**/*.png
  • docs/pics/esphome_web_connect.jpg is excluded by !**/*.jpg
  • docs/pics/esphome_web_install.jpg is excluded by !**/*.jpg
  • docs/pics/eu_boot.png is excluded by !**/*.png
  • docs/pics/eu_boot_initializing.png is excluded by !**/*.png
  • docs/pics/eu_boot_with_ip_address.png is excluded by !**/*.png
  • docs/pics/ha_blueprint_01.png is excluded by !**/*.png
  • docs/pics/ha_blueprint_dashboard_reimport.png is excluded by !**/*.png
  • docs/pics/ha_blueprint_dashboard_reimport_confirm.png is excluded by !**/*.png
  • docs/pics/ha_device_sensors_duplicated.png is excluded by !**/*.png
  • docs/pics/ha_esphome_dashboard_new_device_06.png is excluded by !**/*.png
  • docs/pics/ha_esphome_dashboard_new_device_07.png is excluded by !**/*.png
  • docs/pics/ha_file_editor_blueprint_source_url_v414.png is excluded by !**/*.png
  • docs/pics/home_page_chips.jpg is excluded by !**/*.jpg
  • docs/pics/home_page_custom_buttons.jpg is excluded by !**/*.jpg
  • docs/pics/home_page_entity_state_01_04.jpg is excluded by !**/*.jpg
  • docs/pics/image-20230317162851693.png is excluded by !**/*.png
  • docs/pics/moving_the_panels_board_away_from_the_metal_backing.jpg is excluded by !**/*.jpg
  • docs/pics/us_boot.png is excluded by !**/*.png
  • hmi/dev/ui/eu/pics/32.png is excluded by !**/*.png
  • hmi/dev/ui/eu/pics/32_big.png is excluded by !**/*.png
  • hmi/dev/ui/us/pics/32.png is excluded by !**/*.png
  • hmi/dev/ui/us/pics/32_big.png is excluded by !**/*.png
📒 Files selected for processing (29)
  • docs/addon_climate.md
  • docs/alarm.md
  • docs/blueprint.md
  • docs/customization.md
  • docs/error_initializing.md
  • docs/howto.md
  • docs/install.md
  • docs/migration_from_blackymas.md
  • esphome/nspanel_esphome_base.yaml
  • esphome/nspanel_esphome_version.yaml
  • hmi/dev/manuals_screenshots.md
  • hmi/dev/nspanel_CJK_eu_code/boot.txt
  • hmi/dev/nspanel_CJK_us_code/boot.txt
  • hmi/dev/nspanel_CJK_us_land_code/boot.txt
  • hmi/dev/nspanel_eu_code/boot.txt
  • hmi/dev/nspanel_us_code/boot.txt
  • hmi/dev/nspanel_us_land_code/boot.txt
  • hmi/nspanel_CJK_eu.HMI
  • hmi/nspanel_CJK_eu.tft
  • hmi/nspanel_CJK_us.HMI
  • hmi/nspanel_CJK_us.tft
  • hmi/nspanel_CJK_us_land.HMI
  • hmi/nspanel_CJK_us_land.tft
  • hmi/nspanel_eu.HMI
  • hmi/nspanel_eu.tft
  • hmi/nspanel_us.HMI
  • hmi/nspanel_us.tft
  • hmi/nspanel_us_land.HMI
  • hmi/nspanel_us_land.tft

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/validate_markdown.yml (1)

58-65: ⚠️ Potential issue | 🟡 Minor

Remove check-modified-files-only: yes or change trigger to pull_request.

The migration from gaurav-nelson/github-action-markdown-link-check (deprecated) to the maintained tcort/github-action-markdown-link-check@v1.1.2 fork is correct, and the v1.1.2 tag is valid. However, check-modified-files-only is designed for pull_request events only — it compares git refs between the PR head and base branch. The markdown-links job is triggered on push (not pull_request), where this logic produces unpredictable results since there is no PR context. Either remove check-modified-files-only: yes or change the trigger to pull_request.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/validate_markdown.yml around lines 58 - 65, The
markdown-links job using tcort/github-action-markdown-link-check@v1.1.2
currently sets check-modified-files-only: yes but is triggered on push, which
yields unpredictable results; either remove the check-modified-files-only: yes
input from the markdown-links job or change the workflow trigger from push to
pull_request so the action can compare PR refs correctly—update the
markdown-links job configuration (the step using
tcort/github-action-markdown-link-check@v1.1.2 and the check-modified-files-only
input) or adjust the workflow trigger to pull_request accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In @.github/workflows/validate_markdown.yml:
- Around line 58-65: The markdown-links job using
tcort/github-action-markdown-link-check@v1.1.2 currently sets
check-modified-files-only: yes but is triggered on push, which yields
unpredictable results; either remove the check-modified-files-only: yes input
from the markdown-links job or change the workflow trigger from push to
pull_request so the action can compare PR refs correctly—update the
markdown-links job configuration (the step using
tcort/github-action-markdown-link-check@v1.1.2 and the check-modified-files-only
input) or adjust the workflow trigger to pull_request accordingly.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 009d53c and d168618.

📒 Files selected for processing (1)
  • .github/workflows/validate_markdown.yml

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant