From 10dee4e825a27c85db9cd673394ede729a44e047 Mon Sep 17 00:00:00 2001 From: Hunter Paulson Date: Fri, 4 Sep 2026 02:10:47 -0400 Subject: [PATCH 1/5] Minor fixes and repo cleanup for 0.1.0-beta.2 --- .github/workflows/ci.yml | 4 +- .github/workflows/publish-app.yml | 2 +- CHANGELOG.md | 9 ++ CONTRIBUTING.md | 8 +- Dockerfile | 32 ++-- README.md | 31 ++-- assets/virtual-carillon-icon.svg | 15 +- assets/virtual-carillon-logo.svg | 21 ++- .../virtual_carillon/brand/icon.png | Bin 19554 -> 0 bytes .../virtual_carillon/brand/icon@2x.png | Bin 30699 -> 0 bytes .../virtual_carillon/brand/logo.png | Bin 33331 -> 0 bytes .../virtual_carillon/brand/logo@2x.png | Bin 51033 -> 0 bytes {doc => docs}/README.md | 16 +- {doc => docs}/api.md | 0 {doc => docs}/architecture.md | 25 +-- {doc => docs}/automatic-mode.md | 2 +- docs/configuration.md | 4 +- {doc => docs}/content.md | 2 +- {doc => docs}/development.md | 26 ++-- {doc => docs}/home-assistant.md | 0 {doc => docs}/operations.md | 4 +- {doc => docs}/roadmap.md | 0 {doc => docs}/testing.md | 12 +- {bin => engine/bin}/virtual-carillon.mjs | 0 {src => engine/src}/api/server.ts | 0 {src => engine/src}/audio/analysis.ts | 0 {src => engine/src}/audio/engine.ts | 0 {src => engine/src}/audio/outputs.ts | 0 {src => engine/src}/audio/wav.ts | 0 {src => engine/src}/bells/instrument.ts | 0 {src => engine/src}/bells/synth.ts | 0 {src => engine/src}/bells/types.ts | 0 {src => engine/src}/cli/hymn-cycle.ts | 0 {src => engine/src}/cli/hymn-order.ts | 0 {src => engine/src}/cli/index.ts | 0 {src => engine/src}/configuration/config.ts | 0 {src => engine/src}/database/db.ts | 0 {src => engine/src}/index.ts | 0 {src => engine/src}/library/catalog.ts | 0 {src => engine/src}/library/hymns.ts | 0 .../src}/library/hymns/defineHymn.ts | 0 {src => engine/src}/library/hymns/index.ts | 0 .../src}/library/hymns/music/abide-with-me.ts | 0 .../hymns/music/adoramus-te-christe.ts | 0 .../library/hymns/music/adoro-te-devote.ts | 0 .../hymns/music/aeterna-christi-munera.ts | 0 .../hymns/music/alleluia-sing-to-jesus.ts | 0 .../alma-redemptoris-mater-simple-tone.ts | 0 .../hymns/music/alma-redemptoris-mater.ts | 0 .../src}/library/hymns/music/amazing-grace.ts | 0 .../music/angels-from-the-realms-of-glory.ts | 0 .../src}/library/hymns/music/anima-christi.ts | 0 .../music/as-with-gladness-men-of-old.ts | 0 .../music/at-the-cross-her-station-keeping.ts | 0 .../library/hymns/music/ave-de-lourdes.ts | 0 .../library/hymns/music/ave-maris-stella.ts | 0 .../music/ave-regina-caelorum-simple-tone.ts | 0 .../hymns/music/ave-regina-caelorum.ts | 0 .../library/hymns/music/away-in-a-manger.ts | 0 .../christ-is-made-the-sure-foundation.ts | 0 .../hymns/music/christe-redemptor-omnium.ts | 0 .../library/hymns/music/christus-vincit.ts | 0 .../music/come-holy-ghost-creator-blest.ts | 0 .../library/hymns/music/come-holy-spirit.ts | 0 .../library/hymns/music/come-thou-fount.ts | 0 .../music/come-thou-long-expected-jesus.ts | 0 .../hymns/music/creator-alme-siderum.ts | 0 .../hymns/music/exsultet-caelum-laudibus.ts | 0 .../hymns/music/exsultet-orbis-gaudiis.ts | 0 .../src}/library/hymns/music/first-noel.ts | 0 .../library/hymns/music/for-all-the-saints.ts | 0 .../library/hymns/music/gabriels-message.ts | 0 .../hymns/music/gloria-in-excelsis-deo.ts | 0 .../music/god-rest-ye-merry-gentlemen.ts | 0 .../music/hail-the-day-that-sees-him-rise.ts | 0 .../music/hark-the-herald-angels-sing.ts | 0 .../library/hymns/music/holy-holy-holy.ts | 0 .../src}/library/hymns/music/hyfrydol.ts | 0 .../src}/library/hymns/music/hymn-to-joy.ts | 0 .../hymns/music/in-the-bleak-midwinter.ts | 0 .../music/jesus-christ-is-risen-today.ts | 0 .../library/hymns/music/joy-to-the-world.ts | 0 .../hymns/music/o-come-all-ye-faithful.ts | 0 .../hymns/music/o-come-o-come-emmanuel.ts | 0 .../music/o-fathers-of-our-ancient-faith.ts | 0 .../hymns/music/o-god-beyond-all-praising.ts | 0 .../hymns/music/o-sacred-head-now-wounded.ts | 0 .../src}/library/hymns/music/old-hundredth.ts | 0 .../hymns/music/once-in-royal-davids-city.ts | 0 .../src}/library/hymns/music/pange-lingua.ts | 0 .../library/hymns/music/psalm-51-miserere.ts | 0 .../hymns/music/rector-potens-verax-deus.ts | 0 .../hymns/music/regina-caeli-simple-tone.ts | 0 .../src}/library/hymns/music/regina-caeli.ts | 0 .../hymns/music/salve-regina-simple-tone.ts | 0 .../src}/library/hymns/music/salve-regina.ts | 0 .../hymns/music/sub-tuum-praesidium.ts | 0 .../hymns/music/te-lucis-ante-terminum.ts | 0 .../hymns/music/veni-creator-spiritus.ts | 0 .../src}/library/hymns/music/vexilla-regis.ts | 0 .../library/hymns/music/victimae-paschali.ts | 0 .../music/when-i-survey-the-wondrous-cross.ts | 0 .../hymns/music/while-shepherds-watched.ts | 0 .../library/hymns/music/winchester-new.ts | 0 .../src}/library/hymns/notation/index.ts | 0 .../src}/library/hymns/notation/toAbc.ts | 0 .../hymns/notation/tunes/easter-hymn.ts | 0 .../library/hymns/notation/tunes/hyfrydol.ts | 0 .../hymns/notation/tunes/veni-creator.ts | 0 .../src}/library/hymns/notation/types.ts | 0 {src => engine/src}/library/hymns/types.ts | 0 {src => engine/src}/library/library.ts | 0 {src => engine/src}/liturgical/litcal.ts | 0 {src => engine/src}/liturgical/resolver.ts | 0 {src => engine/src}/liturgical/taxonomy.ts | 0 {src => engine/src}/melodies/arranger.ts | 0 {src => engine/src}/melodies/parsers.ts | 0 {src => engine/src}/melodies/types.ts | 0 {src => engine/src}/scheduling/schedule.ts | 0 {tests => engine/tests}/api.test.ts | 0 .../tests}/audio-overhaul.test.ts | 0 {tests => engine/tests}/catalog.test.ts | 0 {tests => engine/tests}/content.test.ts | 0 {tests => engine/tests}/database.test.ts | 0 {tests => engine/tests}/hymn-cycle.test.ts | 0 {tests => engine/tests}/liturgical.test.ts | 0 {tests => engine/tests}/melodies.test.ts | 0 {tests => engine/tests}/notation.test.ts | 0 .../tests}/schedule-category.test.ts | 0 {tests => engine/tests}/synth.test.ts | 0 eslint.config.mjs | 4 +- homeassistant/app/README.md | 2 +- homeassistant/app/config.yaml | 2 +- homeassistant/app/entrypoint.mjs | 2 +- homeassistant/app/icon.png | Bin 9095 -> 7638 bytes homeassistant/app/logo.png | Bin 11312 -> 6671 bytes .../integration}/virtual_carillon/README.md | 4 +- .../integration}/virtual_carillon/__init__.py | 0 .../virtual_carillon/brand/icon.png | Bin 0 -> 17486 bytes .../virtual_carillon/brand/icon@2x.png | Bin 0 -> 40204 bytes .../virtual_carillon/brand/logo.png | Bin 0 -> 28132 bytes .../virtual_carillon/brand/logo@2x.png | Bin 0 -> 66354 bytes .../virtual_carillon/config_flow.py | 0 .../integration}/virtual_carillon/const.py | 0 .../virtual_carillon/coordinator.py | 0 .../virtual_carillon/manifest.json | 2 +- .../virtual_carillon/media_source.py | 0 .../virtual_carillon/schedule_runner.py | 0 .../integration}/virtual_carillon/sensor.py | 0 .../virtual_carillon/services.yaml | 0 .../virtual_carillon/strings.json | 0 .../virtual_carillon/translations/en.json | 0 package.json | 14 +- repository.yaml | 2 +- scripts/build.mjs | 23 ++- scripts/check-ci.mjs | 4 +- scripts/check-release.mjs | 2 +- scripts/push-live.sh | 4 +- scripts/render-branding.swift | 146 ++++++++++++++++++ tsconfig.json | 8 +- 160 files changed, 291 insertions(+), 141 deletions(-) delete mode 100644 custom_components/virtual_carillon/brand/icon.png delete mode 100644 custom_components/virtual_carillon/brand/icon@2x.png delete mode 100644 custom_components/virtual_carillon/brand/logo.png delete mode 100644 custom_components/virtual_carillon/brand/logo@2x.png rename {doc => docs}/README.md (54%) rename {doc => docs}/api.md (100%) rename {doc => docs}/architecture.md (67%) rename {doc => docs}/automatic-mode.md (98%) rename {doc => docs}/content.md (98%) rename {doc => docs}/development.md (91%) rename {doc => docs}/home-assistant.md (100%) rename {doc => docs}/operations.md (98%) rename {doc => docs}/roadmap.md (100%) rename {doc => docs}/testing.md (89%) rename {bin => engine/bin}/virtual-carillon.mjs (100%) rename {src => engine/src}/api/server.ts (100%) rename {src => engine/src}/audio/analysis.ts (100%) rename {src => engine/src}/audio/engine.ts (100%) rename {src => engine/src}/audio/outputs.ts (100%) rename {src => engine/src}/audio/wav.ts (100%) rename {src => engine/src}/bells/instrument.ts (100%) rename {src => engine/src}/bells/synth.ts (100%) rename {src => engine/src}/bells/types.ts (100%) rename {src => engine/src}/cli/hymn-cycle.ts (100%) rename {src => engine/src}/cli/hymn-order.ts (100%) rename {src => engine/src}/cli/index.ts (100%) rename {src => engine/src}/configuration/config.ts (100%) rename {src => engine/src}/database/db.ts (100%) rename {src => engine/src}/index.ts (100%) rename {src => engine/src}/library/catalog.ts (100%) rename {src => engine/src}/library/hymns.ts (100%) rename {src => engine/src}/library/hymns/defineHymn.ts (100%) rename {src => engine/src}/library/hymns/index.ts (100%) rename {src => engine/src}/library/hymns/music/abide-with-me.ts (100%) rename {src => engine/src}/library/hymns/music/adoramus-te-christe.ts (100%) rename {src => engine/src}/library/hymns/music/adoro-te-devote.ts (100%) rename {src => engine/src}/library/hymns/music/aeterna-christi-munera.ts (100%) rename {src => engine/src}/library/hymns/music/alleluia-sing-to-jesus.ts (100%) rename {src => engine/src}/library/hymns/music/alma-redemptoris-mater-simple-tone.ts (100%) rename {src => engine/src}/library/hymns/music/alma-redemptoris-mater.ts (100%) rename {src => engine/src}/library/hymns/music/amazing-grace.ts (100%) rename {src => engine/src}/library/hymns/music/angels-from-the-realms-of-glory.ts (100%) rename {src => engine/src}/library/hymns/music/anima-christi.ts (100%) rename {src => engine/src}/library/hymns/music/as-with-gladness-men-of-old.ts (100%) rename {src => engine/src}/library/hymns/music/at-the-cross-her-station-keeping.ts (100%) rename {src => engine/src}/library/hymns/music/ave-de-lourdes.ts (100%) rename {src => engine/src}/library/hymns/music/ave-maris-stella.ts (100%) rename {src => engine/src}/library/hymns/music/ave-regina-caelorum-simple-tone.ts (100%) rename {src => engine/src}/library/hymns/music/ave-regina-caelorum.ts (100%) rename {src => engine/src}/library/hymns/music/away-in-a-manger.ts (100%) rename {src => engine/src}/library/hymns/music/christ-is-made-the-sure-foundation.ts (100%) rename {src => engine/src}/library/hymns/music/christe-redemptor-omnium.ts (100%) rename {src => engine/src}/library/hymns/music/christus-vincit.ts (100%) rename {src => engine/src}/library/hymns/music/come-holy-ghost-creator-blest.ts (100%) rename {src => engine/src}/library/hymns/music/come-holy-spirit.ts (100%) rename {src => engine/src}/library/hymns/music/come-thou-fount.ts (100%) rename {src => engine/src}/library/hymns/music/come-thou-long-expected-jesus.ts (100%) rename {src => engine/src}/library/hymns/music/creator-alme-siderum.ts (100%) rename {src => engine/src}/library/hymns/music/exsultet-caelum-laudibus.ts (100%) rename {src => engine/src}/library/hymns/music/exsultet-orbis-gaudiis.ts (100%) rename {src => engine/src}/library/hymns/music/first-noel.ts (100%) rename {src => engine/src}/library/hymns/music/for-all-the-saints.ts (100%) rename {src => engine/src}/library/hymns/music/gabriels-message.ts (100%) rename {src => engine/src}/library/hymns/music/gloria-in-excelsis-deo.ts (100%) rename {src => engine/src}/library/hymns/music/god-rest-ye-merry-gentlemen.ts (100%) rename {src => engine/src}/library/hymns/music/hail-the-day-that-sees-him-rise.ts (100%) rename {src => engine/src}/library/hymns/music/hark-the-herald-angels-sing.ts (100%) rename {src => engine/src}/library/hymns/music/holy-holy-holy.ts (100%) rename {src => engine/src}/library/hymns/music/hyfrydol.ts (100%) rename {src => engine/src}/library/hymns/music/hymn-to-joy.ts (100%) rename {src => engine/src}/library/hymns/music/in-the-bleak-midwinter.ts (100%) rename {src => engine/src}/library/hymns/music/jesus-christ-is-risen-today.ts (100%) rename {src => engine/src}/library/hymns/music/joy-to-the-world.ts (100%) rename {src => engine/src}/library/hymns/music/o-come-all-ye-faithful.ts (100%) rename {src => engine/src}/library/hymns/music/o-come-o-come-emmanuel.ts (100%) rename {src => engine/src}/library/hymns/music/o-fathers-of-our-ancient-faith.ts (100%) rename {src => engine/src}/library/hymns/music/o-god-beyond-all-praising.ts (100%) rename {src => engine/src}/library/hymns/music/o-sacred-head-now-wounded.ts (100%) rename {src => engine/src}/library/hymns/music/old-hundredth.ts (100%) rename {src => engine/src}/library/hymns/music/once-in-royal-davids-city.ts (100%) rename {src => engine/src}/library/hymns/music/pange-lingua.ts (100%) rename {src => engine/src}/library/hymns/music/psalm-51-miserere.ts (100%) rename {src => engine/src}/library/hymns/music/rector-potens-verax-deus.ts (100%) rename {src => engine/src}/library/hymns/music/regina-caeli-simple-tone.ts (100%) rename {src => engine/src}/library/hymns/music/regina-caeli.ts (100%) rename {src => engine/src}/library/hymns/music/salve-regina-simple-tone.ts (100%) rename {src => engine/src}/library/hymns/music/salve-regina.ts (100%) rename {src => engine/src}/library/hymns/music/sub-tuum-praesidium.ts (100%) rename {src => engine/src}/library/hymns/music/te-lucis-ante-terminum.ts (100%) rename {src => engine/src}/library/hymns/music/veni-creator-spiritus.ts (100%) rename {src => engine/src}/library/hymns/music/vexilla-regis.ts (100%) rename {src => engine/src}/library/hymns/music/victimae-paschali.ts (100%) rename {src => engine/src}/library/hymns/music/when-i-survey-the-wondrous-cross.ts (100%) rename {src => engine/src}/library/hymns/music/while-shepherds-watched.ts (100%) rename {src => engine/src}/library/hymns/music/winchester-new.ts (100%) rename {src => engine/src}/library/hymns/notation/index.ts (100%) rename {src => engine/src}/library/hymns/notation/toAbc.ts (100%) rename {src => engine/src}/library/hymns/notation/tunes/easter-hymn.ts (100%) rename {src => engine/src}/library/hymns/notation/tunes/hyfrydol.ts (100%) rename {src => engine/src}/library/hymns/notation/tunes/veni-creator.ts (100%) rename {src => engine/src}/library/hymns/notation/types.ts (100%) rename {src => engine/src}/library/hymns/types.ts (100%) rename {src => engine/src}/library/library.ts (100%) rename {src => engine/src}/liturgical/litcal.ts (100%) rename {src => engine/src}/liturgical/resolver.ts (100%) rename {src => engine/src}/liturgical/taxonomy.ts (100%) rename {src => engine/src}/melodies/arranger.ts (100%) rename {src => engine/src}/melodies/parsers.ts (100%) rename {src => engine/src}/melodies/types.ts (100%) rename {src => engine/src}/scheduling/schedule.ts (100%) rename {tests => engine/tests}/api.test.ts (100%) rename {tests => engine/tests}/audio-overhaul.test.ts (100%) rename {tests => engine/tests}/catalog.test.ts (100%) rename {tests => engine/tests}/content.test.ts (100%) rename {tests => engine/tests}/database.test.ts (100%) rename {tests => engine/tests}/hymn-cycle.test.ts (100%) rename {tests => engine/tests}/liturgical.test.ts (100%) rename {tests => engine/tests}/melodies.test.ts (100%) rename {tests => engine/tests}/notation.test.ts (100%) rename {tests => engine/tests}/schedule-category.test.ts (100%) rename {tests => engine/tests}/synth.test.ts (100%) rename {custom_components => homeassistant/integration}/virtual_carillon/README.md (67%) rename {custom_components => homeassistant/integration}/virtual_carillon/__init__.py (100%) create mode 100644 homeassistant/integration/virtual_carillon/brand/icon.png create mode 100644 homeassistant/integration/virtual_carillon/brand/icon@2x.png create mode 100644 homeassistant/integration/virtual_carillon/brand/logo.png create mode 100644 homeassistant/integration/virtual_carillon/brand/logo@2x.png rename {custom_components => homeassistant/integration}/virtual_carillon/config_flow.py (100%) rename {custom_components => homeassistant/integration}/virtual_carillon/const.py (100%) rename {custom_components => homeassistant/integration}/virtual_carillon/coordinator.py (100%) rename {custom_components => homeassistant/integration}/virtual_carillon/manifest.json (91%) rename {custom_components => homeassistant/integration}/virtual_carillon/media_source.py (100%) rename {custom_components => homeassistant/integration}/virtual_carillon/schedule_runner.py (100%) rename {custom_components => homeassistant/integration}/virtual_carillon/sensor.py (100%) rename {custom_components => homeassistant/integration}/virtual_carillon/services.yaml (100%) rename {custom_components => homeassistant/integration}/virtual_carillon/strings.json (100%) rename {custom_components => homeassistant/integration}/virtual_carillon/translations/en.json (100%) create mode 100644 scripts/render-branding.swift diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 30e9505e..1b8e8913 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,11 +43,11 @@ jobs: run: pnpm release:check - name: Validate Home Assistant integration syntax - run: python3 -m compileall -q custom_components/virtual_carillon + run: python3 -m compileall -q homeassistant/integration/virtual_carillon - name: Validate JSON metadata run: | - python3 -m json.tool custom_components/virtual_carillon/manifest.json >/dev/null + python3 -m json.tool homeassistant/integration/virtual_carillon/manifest.json >/dev/null python3 -m json.tool hacs.json >/dev/null container: diff --git a/.github/workflows/publish-app.yml b/.github/workflows/publish-app.yml index d7477289..81f378d7 100644 --- a/.github/workflows/publish-app.yml +++ b/.github/workflows/publish-app.yml @@ -61,7 +61,7 @@ jobs: run: pnpm release:check -- "${RELEASE_VERSION#v}" - name: Validate Home Assistant integration syntax - run: python3 -m compileall -q custom_components/virtual_carillon + run: python3 -m compileall -q homeassistant/integration/virtual_carillon - name: Log in to GHCR uses: docker/login-action@v3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a5bce56..3fe88d4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.1.0-beta.2 + +Follow-up beta release containing the polish and cleanup that missed the initial beta. + +- Updated the Virtual Carillon logo and Home Assistant app branding. +- Reorganized the engine, Home Assistant integration, and documentation for clearer ownership and maintenance. +- Cleaned up and expanded project documentation and contributor guidance. +- Applied minor code-quality, build, CI, and release-process improvements. + ## 0.1.0-beta.1 First public beta release. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a29c3ee9..d1448aad 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ Thank you for helping improve Virtual Carillon. Contributions should preserve a ## Before you begin -Read the [development guide](doc/development.md) for setup, checks, deployment helpers, and releases. The [architecture guide](doc/architecture.md) explains the project boundaries, and the [testing guide](doc/testing.md) describes the expected smoke tests. +Read the [development guide](docs/development.md) for setup, checks, deployment helpers, and releases. The [architecture guide](docs/architecture.md) explains the project boundaries, and the [testing guide](docs/testing.md) describes the expected smoke tests. For a bug, include the deployment method, the relevant date and calendar when liturgical selection is involved, steps to reproduce, and the useful portion of the logs. Remove API tokens, private URLs, personal information, and private recordings before posting. @@ -57,7 +57,7 @@ Run the same combined checks locally with `pnpm ci:check` before requesting revi ## Development deployment helper -`scripts/push-live.sh` is available for testing Home Assistant integration changes on a configured remote Docker installation. It type-checks the project, copies the current working tree’s `custom_components/virtual_carillon` directory over SSH, restarts the target Home Assistant container, and waits for it to become healthy. +`scripts/push-live.sh` is available for testing Home Assistant integration changes on a configured remote Docker installation. It type-checks the project, copies the current working tree’s `homeassistant/integration/virtual_carillon` directory into the target Home Assistant container’s `/config/custom_components/virtual_carillon` location over SSH, restarts the container, and waits for it to become healthy. It reads `REMOTE_HOST` and `HA_CONTAINER` from a local ignored `dev.env` file. This is a development convenience, not a substitute for CI or the release process. Check the current branch, working tree, remote host, and target container before running it. It does not deploy the engine container or publish a release. @@ -65,7 +65,7 @@ It reads `REMOTE_HOST` and `HA_CONTAINER` from a local ignored `dev.env` file. T ## Releases -Release versions must agree in `package.json`, `custom_components/virtual_carillon/manifest.json`, `homeassistant/app/config.yaml`, and `Dockerfile`. Run: +Release versions must agree in `package.json`, `homeassistant/integration/virtual_carillon/manifest.json`, `homeassistant/app/config.yaml`, and `Dockerfile`. Run: ```bash pnpm release:check @@ -91,4 +91,4 @@ git status git diff --check ``` -Do not commit `.env` or `dev.env` files, credentials, runtime data, private recordings, generated audio, `dist/`, `node_modules/`, Python bytecode, coverage output, or editor files. Keep test data disposable and avoid placing personal deployment details in examples. +Do not commit `.env` or `dev.env` files, credentials, runtime data, private recordings, generated audio, `engine/dist/`, `node_modules/`, Python bytecode, coverage output, or editor files. Keep test data disposable and avoid placing personal deployment details in examples. diff --git a/Dockerfile b/Dockerfile index c7be1eac..c4b4f62f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,19 +6,10 @@ COPY package.json pnpm-lock.yaml ./ RUN pnpm install --frozen-lockfile COPY tsconfig.json eslint.config.mjs .prettierrc.json ./ COPY scripts ./scripts -COPY src ./src +COPY engine/src ./engine/src RUN pnpm build -FROM node:24-bookworm-slim AS runtime -ARG BUILD_VERSION=0.1.0-beta.1 -ARG BUILD_ARCH=amd64 -LABEL \ - io.hass.version="${BUILD_VERSION}" \ - io.hass.type="app" \ - io.hass.arch="aarch64|amd64" \ - org.opencontainers.image.title="Virtual Carillon" \ - org.opencontainers.image.source="https://github.com/HPaulson/virtual-carillon" \ - org.opencontainers.image.licenses="MIT" +FROM node:24-bookworm-slim AS runtime-deps ENV NODE_ENV=production \ VIRTUAL_CARILLON_HOST=0.0.0.0 \ VIRTUAL_CARILLON_PORT=9876 \ @@ -30,13 +21,24 @@ RUN apt-get update \ RUN corepack enable COPY package.json pnpm-lock.yaml ./ RUN pnpm install --prod --frozen-lockfile -COPY --from=build /app/dist ./dist -COPY bin ./bin + +FROM runtime-deps AS runtime +ARG BUILD_VERSION=0.1.0-beta.2 +ARG BUILD_ARCH=amd64 +LABEL \ + io.hass.version="${BUILD_VERSION}" \ + io.hass.type="app" \ + io.hass.arch="aarch64|amd64" \ + org.opencontainers.image.title="Virtual Carillon" \ + org.opencontainers.image.source="https://github.com/HPaulson/virtual-carillon" \ + org.opencontainers.image.licenses="MIT" +COPY --from=build /app/engine/dist ./engine/dist +COPY engine/bin ./engine/bin COPY homeassistant ./homeassistant COPY README.md LICENSE ./ -COPY homeassistant/app/entrypoint.mjs ./bin/virtual-carillon-app-entrypoint.mjs +COPY homeassistant/app/entrypoint.mjs ./engine/bin/virtual-carillon-app-entrypoint.mjs RUN mkdir -p /app/.data/cache EXPOSE 9876 HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD node -e "fetch('http://127.0.0.1:9876/health').then(r => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))" -CMD ["node", "bin/virtual-carillon-app-entrypoint.mjs"] +CMD ["node", "engine/bin/virtual-carillon-app-entrypoint.mjs"] diff --git a/README.md b/README.md index 3573ec48..4125ee7e 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ You can also run the carillon on its own from the command line or connect to it Most people will use Virtual Carillon with [Home Assistant](https://www.home-assistant.io/getting-started/), a free, self-hosted home-automation system. The included Home Assistant Integration provides a user-friendly GUI to interact with Virtual Carillon. We also provide Virtual Carillon as a standalone app for advanced users who are comfortable working from the command line and don't want to use Home Assistant. -[HACS](https://hacs.xyz/docs/use/) (Home Assistant Community Store) is an optional community store inside Home Assistant that we recommend for most users. It makes the Virtual Carillon integration easy to install, but it is not required if you prefer to copy the integration files manually. +[HACS](https://hacs.xyz/docs/use/) (Home Assistant Community Store) is an optional community store inside Home Assistant. This repository keeps all Home Assistant sources under `homeassistant/`; use the manual installation path below unless a HACS release package is provided. For either Home Assistant path, you must have at least one working Home Assistant `media_player` (speaker) before setting up Virtual Carillon. @@ -42,8 +42,7 @@ Use this path when your Home Assistant installation has **Settings → Apps**. I 3. Open the app’s **Configuration** tab. Set **API token** to a long, unique private value, choose **Save**, and restart the app if Home Assistant asks. 4. Install the integration: - - **With HACS (Recommended):** open **HACS → Integrations**. Open the three-dot menu, choose **Custom repositories**, add `https://github.com/HPaulson/virtual-carillon` with category **Integration**, then choose **Add**. Search HACS for **Virtual Carillon**, open it, and choose **Download**. Restart Home Assistant when the download finishes. - - **Without HACS:** copy this repository’s `custom_components/virtual_carillon` directory to `/config/custom_components/virtual_carillon/`, then restart Home Assistant. + - **Manual installation:** copy this repository’s `homeassistant/integration/virtual_carillon` directory to `/config/custom_components/virtual_carillon/`, then restart Home Assistant. 5. Open **Settings → Devices & services → Add integration**, search for **Virtual Carillon**, and enter: @@ -81,7 +80,7 @@ Use this path when Home Assistant itself runs in a Docker container. Virtual Car The `virtual-carillon_default` network is created by the command in step 3. Once both containers share it, Home Assistant can reach the engine as `http://virtual-carillon:9876`. Keep this connection in your own Compose configuration if you recreate the Home Assistant container. -5. In the Home Assistant web interface, install the integration through HACS: **HACS → Integrations → three-dot menu → Custom repositories**. Add `https://github.com/HPaulson/virtual-carillon` as an **Integration**, download **Virtual Carillon**, and restart Home Assistant. Without HACS, copy `custom_components/virtual_carillon` to `/config/custom_components/virtual_carillon/` and restart instead. +5. Copy this repository’s `homeassistant/integration/virtual_carillon` directory to `/config/custom_components/virtual_carillon/`, then restart Home Assistant. HACS custom repositories currently require the integration under a repository-root `custom_components/` directory, so this source layout is intentionally installed manually. 6. Open **Settings → Devices & services → Add integration**, search for **Virtual Carillon**, and enter: - **Engine URL:** `http://virtual-carillon:9876` @@ -94,7 +93,7 @@ Do not run the Home Assistant app and the Compose service against the same port ### 3. Standalone engine (advanced) -Use this path only when you are comfortable working with the command line without a GUI to interact with the Virtual Carillon. It can play the host’s default audio output, but local speakers, Bluetooth, and unusual audio setups are outside the project’s supported deployment paths. The CLI and [HTTP API](doc/api.md) are provided for experienced users to integrate as they see fit. +Use this path only when you are comfortable working with the command line without a GUI to interact with the Virtual Carillon. It can play the host’s default audio output, but local speakers, Bluetooth, and unusual audio setups are outside the project’s supported deployment paths. The CLI and [HTTP API](docs/api.md) are provided for experienced users to integrate as they see fit. Install Node.js 24 or later and the pnpm version declared in `package.json`, then run: @@ -103,18 +102,18 @@ pnpm install --frozen-lockfile pnpm build # List the available bells, signals, and hymns. -node dist/cli/index.js assets +node engine/dist/cli/index.js assets # Check whether this host has an available local audio output. -node dist/cli/index.js doctor -node dist/cli/index.js devices +node engine/dist/cli/index.js doctor +node engine/dist/cli/index.js devices # Play through the default local output. -node dist/cli/index.js play test-bell -node dist/cli/index.js play angelus +node engine/dist/cli/index.js play test-bell +node engine/dist/cli/index.js play angelus ``` -To expose the API on the local machine, run `node dist/cli/index.js server`. Set `VIRTUAL_CARILLON_API_TOKEN` before binding it to any network address. Run `node dist/cli/index.js --help` for the complete command reference. +To expose the API on the local machine, run `node engine/dist/cli/index.js server`. Set `VIRTUAL_CARILLON_API_TOKEN` before binding it to any network address. Run `node engine/dist/cli/index.js --help` for the complete command reference. ## Scheduling in Home Assistant @@ -129,11 +128,11 @@ The editor has one Westminster schedule and three routine modes: | **Category — Select from a hymn category** | Variety within a chosen category, such as Marian or Eucharistic. | | **Automatic — Hymn selected based on liturgical calendar** | A hymn chosen from the current LitCal context, with an optional Liturgy of the Hours preference. | -Automatic mode uses the selected LitCal calendar, favoring the day’s feast, saint, category, and season while avoiding a suitable hymn already used that day. See the [automatic mode guide](doc/automatic-mode.md) for details on the hymn selection behavior. +Automatic mode uses the selected LitCal calendar, favoring the day’s feast, saint, category, and season while avoiding a suitable hymn already used that day. See the [automatic mode guide](docs/automatic-mode.md) for details on the hymn selection behavior. Use the built-in editor for simple, repetitive schedules with fixed times, days, and media players. When a schedule depends on other Home Assistant entities, use a regular automation and select a Virtual Carillon item from the Media browser. The engine renders and serves the audio and keeps it available in Home Assistant’s media library; Home Assistant chooses the media players and handles those additional conditions. -The [Home Assistant guide](doc/home-assistant.md#create-schedules) documents every schedule field, cadence, time-window rule, category, canonical-hour preference, and volume behavior in the GUI. +The [Home Assistant guide](docs/home-assistant.md#create-schedules) documents every schedule field, cadence, time-window rule, category, canonical-hour preference, and volume behavior in the GUI. ## A few good starting points @@ -148,11 +147,11 @@ Virtual Carillon does not set up speakers, Bluetooth pairing, or media-player in ## Further reading -- [Home Assistant setup, actions, and schedule details](doc/home-assistant.md) +- [Home Assistant setup, actions, and schedule details](docs/home-assistant.md) - [Docker deployment](docs/docker.md) - [Configuration reference](docs/configuration.md) -- [Adding your own recordings](doc/content.md) -- [Documentation index](doc/README.md) +- [Adding your own recordings](docs/content.md) +- [Documentation index](docs/README.md) ## License diff --git a/assets/virtual-carillon-icon.svg b/assets/virtual-carillon-icon.svg index e0f701a0..80af0487 100644 --- a/assets/virtual-carillon-icon.svg +++ b/assets/virtual-carillon-icon.svg @@ -1,11 +1,10 @@ Virtual Carillon - A golden bell inside a deep blue roundel with sound waves. - - - - - - - + A quiet golden bell bearing a cross, set in a deep navy roundel. + + + + + + diff --git a/assets/virtual-carillon-logo.svg b/assets/virtual-carillon-logo.svg index c2bd4010..3484cd65 100644 --- a/assets/virtual-carillon-logo.svg +++ b/assets/virtual-carillon-logo.svg @@ -1,14 +1,13 @@ Virtual Carillon - A golden bell inside a deep blue roundel beside the Virtual Carillon wordmark. - - - - - - - - - Virtual Carillon - + A quiet golden bell bearing a cross, set in a deep navy roundel beside the Virtual Carillon wordmark. + + + + + + + + Virtual Carillon + diff --git a/custom_components/virtual_carillon/brand/icon.png b/custom_components/virtual_carillon/brand/icon.png deleted file mode 100644 index 75515e46317c17cd6a6317bf11380eb58c1e8e3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19554 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 Y?FX*cu3MstE;z0ST85gn>WIky0{NZfj{pDw diff --git a/custom_components/virtual_carillon/brand/icon@2x.png b/custom_components/virtual_carillon/brand/icon@2x.png deleted file mode 100644 index 512065fe57ef387336cf83c73ec527ce444e1ba2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30699 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 diff --git a/custom_components/virtual_carillon/brand/logo.png b/custom_components/virtual_carillon/brand/logo.png deleted file mode 100644 index b8a4b318a982438c4316177ea83577cfc756bfe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33331 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

K#UE{rxr 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 diff --git a/custom_components/virtual_carillon/brand/logo@2x.png b/custom_components/virtual_carillon/brand/logo@2x.png deleted file mode 100644 index caba1353cc9729f84be46888cbb0d69d4cdb263f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51033 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 IM6N<$f-HQB3IG5A literal 9095 zcmZ{K1yEei((mFPEVx5};2zuw?vmgZ++lH-puq{YxH|-b>*B#JXmEF12rLBnHvfCy zz2B=>Z>wgf&-AZ*PWPPZ(`S03)m7!N&`Hq&005SPyo@HS5B}RwkzxP+VrFBo4$)dt zMG^q0Pr&$Nh6KB&{v@xd0s#0jz;K@dfQP^MLjb^o6970i1ptIH001JF>~;+i7(>QV zSHVg}1;7lWQ2}s~wg5yJ1qW-Sum%7i1W=Z{yos*rDRt%k*np(uo!b(U}M)u$0uq#no8+UgXAr1~NFE4g4 z9(HFpYYr|!K|u~qZVqm4HW-2p=;P#W=FR2=r2ChW|D#9768Oo@*2Ue{*@^nEUNduN z4|h>o+P@S1=l8GswDh+9?@Ug>f13p}kmE0hgNvP$<3GA#q9T7sh16}mEgf`aY#l9~ zfUr5l__(-5{=xr0od3@Fza;hkzmorp^KVHJj=u){FN6N&t$#*g?h->6;rNg1#n4+h zM15r1)kQbhsjNyr)2JD=%U=Q~U4p@b;_p^Icbhb?URULr| zC}~8vl-T)Da^sg{xRJ00WM7ie$Lf=zb-4vDQYug_k73&xF-7bZEvb4_Tj3EBp(G7* zL*H&edNBF?OF_1dQ|U}3dCQg`{^t|=B=AGLBblck6TOx#TPL?pcad9Fyi4Q(Z ztudm`dhmkr2xec+yoPZu9ZQZmTKG&zZPCbdqc!iE?p$}1ZNkByxv!GHF#tdPES;A% zCm30HwG1K%KdLxLtt{K0s1lAIno{F1XIN!bWZF;US0BGUHBLWUlUYEQfL5361#V0a z+N^z)M&Wn^ULL&h?!(86a53WFUJMH{ozya7J89o8`LPSB#t)vg#Y%k^Ia4%hJejUO z<|$lH8N{v1;+(LO9)E;K*zZU2H61Flx;P+Jl^I$X4CMN4OmB#%a%0A&2+oGlk?w6+}R3g@||VqVN4xyO7wc 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 z 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 literal 11312 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 diff --git a/custom_components/virtual_carillon/README.md b/homeassistant/integration/virtual_carillon/README.md similarity index 67% rename from custom_components/virtual_carillon/README.md rename to homeassistant/integration/virtual_carillon/README.md index 292c59ff..ed936fbe 100644 --- a/custom_components/virtual_carillon/README.md +++ b/homeassistant/integration/virtual_carillon/README.md @@ -1,6 +1,6 @@ # Virtual Carillon integration -This directory contains the Home Assistant integration only. For installation, follow the [main README](../../README.md), which explains the two Home Assistant engine paths, the optional [HACS](https://hacs.xyz/docs/use/) install, and the manual alternative. The integration needs a separately running Virtual Carillon engine: +This directory contains the Home Assistant integration only. For installation, follow the [main README](../../../README.md), which explains the two Home Assistant engine paths and the manual integration installation. The integration needs a separately running Virtual Carillon engine: - use the Virtual Carillon Home Assistant app on Home Assistant OS or Home Assistant Supervised; or - run the engine with Docker Compose for Home Assistant Container and other Docker installations. @@ -9,4 +9,4 @@ After the engine is running, add **Virtual Carillon** in **Settings → Devices Home Assistant controls the selected speakers. The engine generates and serves the audio, so its container does not need direct access to ALSA, PipeWire, Bluetooth, or speaker hardware. -See the [Home Assistant guide](../../doc/home-assistant.md) for media browsing, actions, exact settings, routine modes, and examples. +See the [Home Assistant guide](../../../docs/home-assistant.md) for media browsing, actions, exact settings, routine modes, and examples. diff --git a/custom_components/virtual_carillon/__init__.py b/homeassistant/integration/virtual_carillon/__init__.py similarity index 100% rename from custom_components/virtual_carillon/__init__.py rename to homeassistant/integration/virtual_carillon/__init__.py diff --git a/homeassistant/integration/virtual_carillon/brand/icon.png b/homeassistant/integration/virtual_carillon/brand/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f85620847d442d33eba62f41600168b3dda70a56 GIT binary patch literal 17486 zcmbTeb95x#7dBea#I~JGY}*qX6FZZMHL)gkCbn(cwkNi2^Jd=P{nmH?zN=TQs_H&{ z&aSAd%_LX<4O(U_t+~>qpP9yEldu4VS7;~G!+Ca5Tv*St&W0ha!vP^V9`kc zNUC?f1X+yO9qnS>3>Meh5Yc~94mpZ%0~6O(sIAGQ=&Kkr!+0>5IAGjY z0V<|z=jxdooS|j#9TSSizM$%qg;6-u{|_h9SwM17L`(;T<%z4oU}kFFSs|p@>4M=w zZZE`kmTQCr0(g#yYniluE?b%Iimr*oygq9u5>_Wt?h$qPIl6DTLdtKW1jdkw2K<^W zsxh1loW^afzy_;xNz}i*)I^Zsz*nMLWnFYDuALDF#&kW{EzI+5OPbX98 zp5@ReU^~iJPA+yZGO zUcnGaLVshW-~M1_Bx4WbOC1zeZbT^!Mh0AeL?@`8&`w;WzS0R< z5;4T+#ug(7mvypFP!!4T1vmeJa>4y27$Ksse|nme--slka0&G1)u@Y%ho}C*KxWQY z*92a3YTQeSBQ3_w_z|ru%!*=j>#|lR!|#o`HwH9d*xHUo$YksVAwBm4mr zPk1MCWW$af&;gL1$Jq~Mru|Vd8dlWm$CebG6ZvKr*wZ3IK7sHRDH1O%Oz5?mz9Yt} z6Q%LY<{pvYC1bG>0wXlA%~sz{+Er5Zm)%5}rS94j^y0KP^2s56XNjJ=QAj~c(T|d- z&@bV)!{n|c?r@VL_Go+Q14aHqzP2e>9xG1h`m}K)q6%Vn+Z9_TI8$qa)8zA;FI*6hp9aihN&Ckm%qQ zr@2W(shnV5Kpu0kh`G409k75a_vl*<(T!X?VFg4G4lt(!+Mvv0PykOp9l)EE}@Kj=QHvtbp zYp%`Uevowjd%jAfvzrlBd`Ym0Ij_-L@^sN7M!_@Yz7kx8--@ZYsJl@>ZhfLF@~s@? z;17=QKkG=QkV(jOhH9*;f=V`1ESyvbgu^;!KKb3s3c>5_kFNsmn!9+s6vXE*dvt zM)xm<6W2q0_1xf3`cejbKIt(GU5P@C+`nA?P1mMH`Z9iuj+9#0mJKCl`=|bqZU0K2 z0`j;tjy|EOzAqHaBvm^uax3DdxEvx*UdE6cktMZ}bsW@r$}bI8i+`*TgyhvT zKz&}GWS#VSzTR;Ccrc%dK}LSW$2#NMo*heI4W(;2=Xd<}wGzgPBvo+>3@@2t(n_J= zSA$B|DOb013XL)nUXLF8Z=e<8Qr++)>fP7KIX?GIa0wb9m=nq;>;mLWY z;LgGeX);+@;~;*{9_CQtL|`?7%&yI6uFel$u-|tAK$D~^%D}6vE(S!m3+#DpRm4HN zmS#Iq3-vpKrFNRaowso^XD8_az4JBYt)u`!AF@k-F#@>kg&Ss7o+C0&!CAq(D-C1s?-rRo${l|uWybjH0(BL-A53`2 zPrnLqyq237l2nh9j$-b3jc-gR^Nh+9G7A`+pSwXczfV|H+9J>~3BVjLY-HF@$QZ{7 z{DPS>vp!pE*y;|SfuOZ_fdJaBvRFKDXCLH^XDC>;(q}cP_F0X{gbXVvn;TBgGod2P zttnoi47D2!%vhF@q}h+HnlL!02vH&3SZqYd+6gH}8Uz2*D1LkSHnfjyt+1 zh;YGhQVGGqGbX<4aycmP-I=)3Jn(&DP{7-~+H1B_&A}HJ%TvTFT6X`z>tIBp^-96d z^xXZ9N$5?g0C%adI0fx9fUd5K5~0THA6oBP)QK9ZxcT;0FYY?|@esO_JmR?)eu18ToVXD5_7mGU`}5;g zh_%-2AhnK}$4R$73HktcLZzC4Lia3Vs8c;v(1BYcpm17Yl1Ro&;S{@`vqU?Vk$U?( z*t7Db@HZ_pF_MLaU$g``Ty-zl4CcR)C}}~7mRo+VHBJjUXJt1X&!Wi67O&|AQwboR z+iG3xy`hQ^7w&1>lH&P}ixZC3xUwe8$t;^vID$(^@WO&T{;sYlI?-mf$a8;~?1Hv| zmQFH33+<*@Pgei_frMk4z7T2~;eCBdZHXQpiDkeBXtb9yeQ~jlN4Kp-wQSDbOtII}?YWXUFhA`u^(TR=~q#i{Zyl zNb*^q*|o^4s|Jolfz83E@wUz^G4C3bw+B(!-g1JyAZS_QRu9Y*uG}yBX4x}Tf$Hy< z+)3Mt@7k&8cVO<1Qh7rn#7FS)n!$FRa5bUOXhE9%T zWr#L>Lbql}S2#`))W%Ws;q!nWy4B~7F1wy^H;r-(G6$0F{SGB~4vKj1NG}NFGGgs{ zY<44lV61n#i;BL(#=?Yk2VE{-LiJm5GeQ_nHkz*jvg~MVLA$ONl?~qDAZ+e>Eah$z zfY-XMLUtDpoCLEGcx(ijJs{rilm?H{rNGCtzZ48}4BX9t-$QJQ7Xd;FV6D^)JEx^DTyjKbH!QC zyVy4|u`>q7IlYKjDHdcq@D88E=RnPyINXj znOa(Xo_HE~FQ&i|85kr$=@N^Po=ADWq__s3$^V~{tl|1~Xd z3q}i_00bCpyP#rXo%=_U#DmeV2Y)La?GY`1avI>rt}~dM!IjW~zADm484amyP_aV(cAWL5 z?vlXyk(WqtH;1?cv_AVO4JV2od+72`eDAr#!{Tda}p9A#D@s z%D<@y7ie}ZCwJF*{fC_i7iOGjM(FFr`!-}yKdA-4j@c{Ag*;B&nL9x`W%)aXkvCeN^)3MTV4)fo12{(ik+*p(?mVELWAD0jv)!b8Yf zOvlv9uGEYI8SKKBOy5Ak;_W9b2XGcX)1J8Lur=@NaW^hkpOZd18|)sy5gpzR)8O`h zJm<XOe@ic?BMx z%qxbqOo}geQoL7lm4lQZ#!6yK`Vj>Q z7fg9bMSj>!iIAE#Wzwal>9=!>*?jKxcCbj&KdKy=UO13rJ0SPRvV zpIyLfS4)3t9tiL*-z;ZQTNC$$G60+HjU5#zLGES!Eikif&g^NNQ;)`&4F-oZR71C! z6_zM^?b&Nr-_Um5jFo>;+g7@$x97?t*68|xO(Wyc=k6%B;N%KNulQ5{Mk=b!nGO@j z!4UZReD9LPUSvN?S9S=RW%6EgAt+R%s}5h$c-Rpp3M+tP44%yYk&R*ZLRg2E4|7^4 z-&>Hm;xIQcYf7>ujH^@ICE5<~vA(@rh{L>^e&`RX;+s-^4E=zfhL6tm#q%Hivuf;@9{p71YOc@>JmZ(cb}g|Hpm&C1_B>C)xC)_3 z2~`T%I3++Pe7}H9Yd|po};a-0o>f;~j7~vo7809Y`)9>mA zWy}swEbPjG@=1ulbN)@Y9LDX67CRH?{_41&UEef<8v8nwVA}4ickxt#BB1LkOu#!R z;I!;5?7xdR@bq`IA2(o_^qRWp|8z?eg<5(nLW_i2!ubS4(**qZUVjd%J6&Figs(kC z47Q-`IF4p4&o6zT!d=j=aeY{l-gud~`FD^8-N7P~HwT;56+^{P&m_}i!-UXOZytql zOJ4+cdIKr|9e`cfR48=;yrm))XvW^WQ1D&8ECmrFM!$|1a%UgW)0P(gLY0RpHqMdR zmh+4v>>Q@K4sU~{uAZ#9h*?bB^Nh8=Bc=$32MKTLA0E8{ZQYhuhNzaWccqK@#`)Nb-oD|+?i4GK7cnP^waXR6Z{DhqPRD>H@P>zx57sz?F*&P(Ax?? z0Tj#jF9!KLV!&?qcU)StNgz1x4;vL;4gEfzSaay>u36%6A%{e+nLm9x)&b|_GuyZ{ zs45zcL=&8=O;LJ1L?)w?B4e-A*H6{CvN?Z3D~5J@18a6X$=O!QaJb-P*O{4M5NN*x zxPH_9lDwF>R4A#vUQ<~*%uVBq?L;deTrW0!M}9Y2dF;>d!Ekb&97HGZY+MLBQVVOU zQy>PThfvxd)xoj&vLt4xv%CY3)LBhd#}og0>D;j#`P=wz~M!R<%L zt(qjpvA!s}7Ivf*{qV9xGupp=S^JrN5n)MTN;~nD@;~f+Hm1I~@T#Jh0 zBYX0qr6=YOtm=e#N#D|e#^xei_nJJs=&H_~7U zeBgSzwC=AIZ=LR4?>*6xdHSNMLY~y&`HNc)opBN;DI9yF0YWC&*-a zJsn8O{E=E&p$gsUQMvV)!Ot+->DG!HZY*H)AdB=VbsVQrf>agsgo<{S(A$+3IY2XQ>iQ;d7IzMy_VDS6B%Pz%5x+Yrz@nXH>DMNYc@v(QGy zcG%Y;&thOGv~GH)MrjzjXb(Gi-`ol6Q}||iC8laX;$ozJT~f;7PQkZUS29wG)+@I@~5NSg7mPb)A41cgb+vS_F~VX_c{tx^Tu%uU0=Xf0w&^Or25>j88G z(IK6Q3+?`R)H9Ey^!-Xp?f9YI;Q%!3q-!EjEhxh|U<)ITqSco~A~hi71q0B0GE=2e zU0{>9{L;(boCZkQp@ja76>Ie0v0taZLbb`!k-DB6tfi&o8Fxz4BH{K0hsI#d_9^Yz z8YbC%vIc)u)pNxXGLqgxI=O8t`S1noag70WngHL!u^KL-g_pB%|a#^-JVzpW+O+oVG*{CEH>Pyw~Oz19jdEe2} zhMHtPm`fF}(x3whSg8>xcOzc-8JUYHdMuX_rq++Bw3tkZ3!+eV4}*I_&K``O?j;h$ zRcV!j!A4-8{K<~0ZNA{Bs#GkvbVD*+pDt);6pa+l^|WZxq`7au(PO?{&$4l}-`HCn zLQc~)sT;1^yys0?IGXUb4DiF7Jx%iD&wt;cCN;xa^!Ms#U);b2m1dqxUnCO$X)7L> zwAD{yEjotmF5%2KeS$GKdXokrXd*ifkEAYTHFlb}-^l}B_@mgL&e(rbmEOmYZ3}+4TUKw*$r`T!zG=Sx7AWwK|dhqj=ID z1!x-r2A~UN$64>3dFaK7rp1^M1^h$WTwL!o_1Ig^kLfF2>s@8NKrTy1Yo>nC(8&#zPTiU)39 zj+q2jvQ%6ss)bK4m9*ihn2IE6YA}JY1-0IVOr@sS&IQ6)8sfRt3+u5CovR0=e@sr5E=GjJ1TSU0_){xZZjN8QBywAm|uILad!+c1c%dN-lc zPfUM?PWz6xl(;Ov-3fpGV}zyZS}jdCfXS~!UkGXkS*|k}QmEto>Ry4f#dZfe-Nj>P z|Cb*8?^jE(MtjVY=Dx_j7z-{RG04~o~b_l_O8P) zz;$ZMRHe=#VLp`beJM?00-W<&;P$|wZ%Miar%3zh&>6R>qX-J558?CD*beDYruApa zAD1*hx6g&`xJ-cxGV+9(m|-?2S4agYUe`(9ZY!a4xJPoq| z`&^Iw3`nNFS`fNL6qWTvNf`=ywDBLEd`2Ks_5<+;`tHK6T1FPvN@Kb%JWO$1kWF}5 zsZ8%rVs&Q^)Bx1`inrcUpBMV*ZtfPqBnl!Z(>}f96`qkq#{QDwy^AfIKnZTv0Uj*6 zkP+P*N9Z)AVXre#Jjxi!fy0c)h&Pl0)`wIrDub*gHKWg>vm6fLgRXeN#r~I^_M>O} ziV}ZzjHTCC*j}IUh)>#Z^lXjWvOqfV5AZ{yy#c=!wdry;{jfUTkxX>ZYt6z!7!LA! z(zlx|fvjP5{hK99uJzVYh8Y=9ayo=l#-@EhJU66t)Jqc$8I^qJ%^jF(76_JX-_?!6 zC}vswi!WH#kTv#|1qBei4=5Q+r->vYI9&c}n(#rbmdw}-GKoi&5KML6c2tS1Y~*+> z{n-$S@ggHd==dVJ=^_e^BGbG0j%5QLGPEBggeruo(H_Vh5pw&5O0C9pB)UXWhjG)^KWa;E(RY{nKTpwxOxInx~jh#+yJmm_Fih8O*Vib!w! zCU6={*jgOG)(HUYFtl=Aqg*ACeRT=DRPXYe}EnvHSsH2Qp_?{tjCh*O?A}OWIgX3Q; zg27O2}Z{A zYAk^CC)oa3FBR`iVj%oZp4wsj(}kT}j4>+UQe(~gmEC2ZBo?rkpin`Tb|$dP$xBho zmKg{Z2==tuWvc{y8*6SC3HqKq5esw~8&%6hpDRm|vVeUX#J?G{?Gixv7A`r~yjRxy z*^45e0c-NxF_SGm#8P}<9EAwq`xAvAou9#?U^+-(fcuTn5|GdTKmriSSelr!p@&!w zgo851H}1D?`CQ;dW5p&pc>DT&ca}9^&Q=5F7&=S92BUwj>Y@oDptB+ktb_3-V*Q7H zLP)%D5Q{#%>H|47SuYb6#LxCm(JU?>(S?$!`9 z28l;?pj{Qgw2tl|nWOc=OCRcX!~WO^kAol~Y$1G&X-$-k}^ z7R;+g9W_CGuG+`%AfU3olbFXGpnuYOSO~lSuQ?2J|Cs|MqEVXx=)>4u;MUA+#+>?` z(cTE($|O&l+ZBU!3T9z|bhKib3BYgwx=M>D=^zlS!(Px()^L)}0smLB91UPO&P|en z1}ITCqYv=@1LI}T|E{8yXR_IeD65iLwhG>m2vg(5YqyLR(Ta-0&2H}z6BhV3- zjG$2Ht9mu&|1|1bV-ZF+A89lhkp9_W@~3}veu6~PLgdMQ|1$wsTb87_JCdNK^{wnE zfuH-dW~mMoU{GWLi2)_jHC6V(uGgGL$Hv&ZdA7HJ4PhIH0oXl$p1Pp`+*H5K17~OR zRHzfJ3tMxFwI3B=?r8tn6uanP0rqLq1e}re>MSoqqg{1-@v|2fF#C~)TQ!4+MI^F7$=2x`ee`gp|x zSzt+qP?1b?y%^bl&|v=`cmyfMA}b|ON`S^1|8v)7rxqpaE_;ix9TuOy-IaQC$3+w2 za=^#kK%NDVPK~wT0>hsA`_mN2pRwJW$3U@I#`gKrYAHZxX&_fL4?Y}lV}2sv4f5As{g?ktZ!jUW_XGjmC5QMs3@fZ^*NfEfyo;l# zRc@j+ta|rqQoqGKQR;7imYO(GRf!3?pJ3{{+nBj z7*VHApU#t}Qcz(+nN#pfs<}maBNj-j3Z4NyWHOf-pOZ+!`%l~;l z;OsIi72$80F30gN5nH@K!8vg?6^-8+-yH+&X)KX4oLR;CN5s0dJ_@fBgg1xX_e0En zMFc0V%V4?Mk58I+vNB3W5awN2;xmOf!hIL7|p0quqo0t~YmBnNK7-`Daxq^K{7Oo_So&-@(Vgho!eC&!1&Qz*X4*yM3OhLTk~*t_a%G0=d>P>LReY<~5a&3r|^ zH9*$${5t>_x>#wT4S@CCqVNR`o+%;M_lLmFE`s;CWA|4tKcH_D5xp6Ql;N8zaDFV z3~&BB*!{KYzwbDM_{1&hDA0pN;zb1>>zl+&GWx{kd7^i+o zCMzHtSUt|^J)CpIuIX2T@ezXgOf3{NA(FQ^^wz)19l;DP+x_%Q+_7mOUtuj0rR8D) z^hdjsYDj*D%gLtv0kA$rO+Sno*-)Q&0!yU=n{a*VrHlj{!4B$Ff>*pd#ngs90{y`( zl^d*(hW|@rk&UcH|8L&=PY)%;6{iIU)*G_slYED5l3rmc=6YWrRUgs9z`qXOR(Ea_78L|2Ej0r{N9f9l^s3z`jCfFiD zrjG-{Ur^@exP0b zP&WqkCGlevQma2XETR@sH8qeb+-jU15mXXRQl>e9%Xb+3Qkzs3aY!5>!aR|ft#$jP zVbEQ)|0pLab(-v7|8?4qRcCKkcDX613IE>$L{?gPS?7(w=yv)m0+o~N& zeU#Cdp_ul8+=JW)D7C6bClUV&CN`85Ny1+gB`40nopikmOk2g4+CiXI<{J$7RdwbXqZMx})myAK#{=9Z{~ zxR8tLi)M??FtRA5kS{vz7v!PfpCr#{wGS7pPi||*VLwHH682(LJzRP6PuprC2aqUe z2b#T?#!2LvG-e6irX(V-rVW z5^_y5X@mQ9*9hkP$DYWZHhEQVR16t}s*5VbVVdR}9oP_f!~V51xg0d^F;}`$2GA_$ z!9cTW!YAp!(ujyMp;#5HIToZx8#3quiHul^Tqm3kU6h#gDRsNR3z8G)sqzz<;qOn< zD;OOe*`hCvI&y(=1B2@->Cugqn%>@>>3DAp)Wt>%^Zm<)LJ9n8&DHIz^we$zUun1U zsy1o+JRg0=s;kUl8r%LeLF~IIf^Ft&47!t{qS?DAM-7ALQH$hNJmEg?4u3TYRcA0X ziiEeJm{?y5HE%4Vz+TGVPYDNo@JPNjgpa*)8E^5xw0%d7xAvhn-e->G<~9BVzr8Mx zvF|hKCyx-y@YZXPZ97{)T>?G&2W)k&`6SnB+vtL3Z2irwznW*wJ=8$JS+wDYEN-J|S_VGUow*BnGrHKxv2@}6A&kYfbHpB-j)B{6K8 zfxMytIo_9x5Bh0UA1>oF9|9{Z%pql2LhMZ^#qe3(?zWO`rG0T=gwD!}Y~4;@vc z3|kyuCw(UqQAhTdTG@rb+S!|!P_)0TZ!qqJXbN6144osY)=yRNMR2raIv*Ly9c_`G znOH;^ylKzw>5JEU{Zz@1^nkyMHRuHBxs>Z*UFGVIN3L0q>%=GywWo%fB7hbn_xnB> z<|`>U%tEz4o0#9nPTT<);|(~jo4?qH6;^QBI+7M?SL<;lCtN^qj*YcQ-V zzASoVfc{6c=|sg>tQTIycO|5tGwA6$ zMv`SFw+A>;l!ee@l&?Magc-I4O7##Oe}nL=u+kN}VNg{7gee2F22daKr30>0R50$E zoob$7DxEgVo|`K0Z)pDs60_?)q*RNT!j~bRQQ0Tc2Br};8(4iUz21cl>bjQ_rt@GS zA-5OZI6XwIN-xxu@9mn64K^shsEEQLOP6pq`|rsDRSMNfP4MUn^Ou4b{#f{pVpj3w zE%v;0kLlxJNF^f+dp$I<^R``ET{gd>LXmHmEQ3GmPwAc+o_b=RtY2Petc8XyMAzmG zZf37yHl#|xF8}$u2((Bf7o8#_c5E>tOwfRdb~PyUJylCx{|h2d@4<%p!p zrZy^e@!;+k**q9DT>j{IrrA>N_|D59#kQW$bk2-dOe7*6DU_L;O7d)XSgV(d#_LIC zeC3UXJ?gmarYHi^tMe9bmokINxo>Leir6PM1~BiP%4-qz2f8Oh#4g{|*B>S*+y56QtGtEVmU7p}{m{>h@xb=F z8sK?g6zAI*K#a-7TlKh9W}EXcqzZh$C4o`E-s2t3MWQCUK}a}eOWeJyiKjyVYs#7SczX3O9|DW6PK{SA&~ zFkCNrcyU#r&~y4~+;Q4^+FR_Y`Q)YF+a1gt)9DL=4osK}5nK15=ruQN5l}7Yv6z;)YOFS@T)v zu0eFK!2zeRZ{HQst2tu2o>DF7G(JYfvuwhhL1+d2xlL6}tR1Zo&^jZRA**cQ^jZ~U z?JZjwQov(D5ObB9REYU-tUGe(yd*^>aIbi;djI`i$MslMRou`wNuhsOT|*HZKxFTu zI6HCrBCO4G#>IHfVKY;q|Rm%+s+)3$ZNjY!<@iU z9aU3l&-2GK(NjZ`@zJg-y0Djj#F@0}8>k>u5@$ys_Dp#T=yi<$nlahC)8=nQYvcr) zY6dG8waPsKcgb>2vtnJn&G@LXFxTT?li53G9ReW)vkhZHlmEm5e^D4W^@VVm1du~1 z0FCr@D_jE6pk_UFHo1IVz9a>h8M!VSz27YliAs-%-dp2iPtt_N$LmumMMRoT z`@F;r984`c99fA^5nEU)!{nL{`;ERX_w)EUa(7KUX*ENQe9SsGFV&*@ow1GVt*7Uh z$G}(q(0faQu&5|cAU40ZC3MD$*|YFU=8kHrX2b!k#nAxvqg8fYF8A#TQp-UT#`buU zw{6Oq9o{7bqlNR-?=O>Bc)rB1R zA$Gv;qL7VCuAALvX^k#JJ8EOGS$#Ix7e-*MmP7IErGYRb%%E(T^74^4J8gP0Q$tIu z+>HD}@Iv%L@GjvXqX!c|QY5KZW}?mH5VXFo{(8OFo!Sk}tG^u7bB#m-q5$iBo2;-2L^))5fS( z+GfAR-6p!nykG*1AFYOWb?0k|uQgr&PA2YRbF+RyN6WQ~g@Fz|e?S!8@|%p#0m^!x zO9Qp^bu-~f8MYHN@f0`&T!1haJ|4-YT=$`fA1Z!zY{y61muf>rwzNt)&H<{U8Qb!Y z4eOtnjXGe9kYz;2@`6Tx;{ZY-om5C>>hUB<@X51t4H;NtxFYC z`?Qg{gDO3F8a9;13Kv*<2J3PEFGP+E?K`rI6hG9hlZ~}z?6|IPhTP!!gSIBU7gBey zTy8}KPC?jvW-cBSnqv&rs9*r%gi7-t|0H{-;A$ssU<-P9&{W_}7tb@PMw${~Exdkc zUPmR|2M8~QaZfuN++PV8a_a>oUX^2Ky?$r560}VzOE)ae^DsG9yV!-T2aBX8cOo<6 za=&^ux?A(T43saydTA0<^Mga@ua4$ip7G!~r+F(-PQj#iZQ8DC^)@9EF%nlANXc`1 zC$B3EPD;J~m4EI-^g17>=$?GQpkes=LjK5gM)}AW@!AAtHiy${YDNcjX)UoiMF1&O{ z5x%|#KOXmzFJ-u1~AX<1afC*r{t;IInt!JM_wei!i~`zQt(C8a@MZbJ}skIj2Jgw#bH7}`?HbvIs~m`kzDlg1e`tGndMFNL9`Mb+}0yLZ>P?#0r$U1qWy-i(ZBm1^E5rvrwX zrbSveDt_u+`=cW-Y`Nsmkc}gQD#$2GYw7u&41z$N!?`ex((Z|0YqINppFj>>h!^|O zdqQeg?*1UszKttzW$M4XQyP|lZuPPkz{YyLWj{Ll9Wo7q6D1Wb5uUfRn#j7{-aug( z7ErT3JzImc;Kuww0o~NJME?2E{v``cUu3+G-GKC*psdT_o^()3>M2D!m1@?y_m2U0 zH81Lf$ZHGZorz2J+hhCM_MZ*Y17!8@n<#L*f7T&tOThV_Vwxs4k`A-=AV4Nqnuo*U;rLsAc+uutd_cPwD*OiVCqC5Xn{qol~%4_;s z^MKt{RWqgT{kk7nyMo!Du4AhPgx^(|LzlH|8zlzDxZGH}kCmCj$v3Y)IFos=u?xKP;slnd7xgw-0$6Q+s*hTa7}1ePagtE)@gjM;i~_2_XWzTyg$nlk9q(jyPFEh*f!>{bVf7Cd>WIDWft!389Ou^#PN@!`Em zuD!)hU}P>(b;d#!KD#yAyrOy_zOLI7odS3Tr608tEzUN-1$=XnKof;a$Tii|#o-Js zqJOQ`q3aJGb{%oU1m?PS=*cV7qNYJ2ROuWT@;EXTys9Q$^EBQHPbUsbipyXafgU`? zO1NFIJfbCFcU>j?(6-wnpZ?J=Qk29YpYTocQ#bz=%1j7VCg$qAZ`j@^ zmyhoGXZ0=VwC7W*!mUXT@MRfsHg8bt1U$7tX{AFez_XJ=9bKhl!JNl7_j-MtV zD1j8pm6`Ky0KLr=yrghRm#mYnaU#;{PGo+-n2_CzMb_SF^Yy)ZI+5@U7S>zo1bGBo z@F#?pdgTXJ^oy0g#)TjQIdQrGZIY_%s(qwZVB1RiJ0yHOJ*119jjnq@ZT+CqOwE-O z=gAn_;~~owWr$YTS);&48bUij1onBe0m@j=2XZ_ggK{7{w|b0fsHQdc@4!Jr!;h_` z*=pwT(Y{GS$ds(1v!7vx7932)_}%ja@NPwi<8h3$FX)vg)cX;9$q8I5k0!(b%Gh`1 z>6)5%xkrpg66*Bn8AuvXA?0cMQ+#Q&oKMRtU_u6 zHL7f7Wi5<)^%jv|YB^v3Tv_Gz@$1-*59qN{K^?|7;o?V|!POl5%&rXZCij5AY&Kvs zuKxxK)OD5Mx&)w%GDIFn_wzUqf@C%APEOkWMD&nf8V)bCQGO>w(K0yUrVUKG&$XIPo;t#6903;JcwbXQ-aPcBMxMtHqhn0?@QnEcWBK{0> z=|#h3p`yr1z62d+4?%$qGcaVf-+8ON-UTw&6z7bY6Af&`n$?cA%FqKcIdbu1;ll8FpkA9_s#?r6uDuv#0 z2To^<7O#^w9dw7$=t8jgycHTU*=bGj-hVCGm5xRR=q)Y3H{Wa0puAE4#%vY6dQHl3 z*3528S?;ES`%z>M&I9FVtCg_K6z@_;e#Ljb`XLruDJIdZ)DkM z(8&4rZ1L3=x+dpPj2TpL3A_qlL&uvmXEkK)H^fL00T@?*KG7zt`Z5})Booixty+dc z-jQ9TU&bKHo&b)lgSp!H9`eIkdUWqThlCr)Gc?&;I1Miz+oJ^CQBI2c4_! zupQmy?6jS{U(NRWevK`?URll6=L5keYmo@;b6O-e)h;)15)wb#pi@-ZeaC#Ar>Faz zT;L=Ut|Sl0>+BBdnz8zdc_wA15U1U#}MQd_Fp$?BBBh`tEoGu${#@ zN3ZNF*XMZSI;~#fo2YLk6UlsCu zZE+_%<4<(WaSDtK^Zu7=nqphct41>9JY z3P|FmkuHKceKGeMBxJk1{X-Zq%_>klSLQRU0-t7X>tC7uq;gzzz8m)#b-_(x#(;Gc zBz|4EAxP&1z3FYF|5D)HzY<0Yt$a*SS1AtcE*kz5S{iBH7j_R>08o2>O}IKn6chd$ za*r>82tW^{ga(6+Y2Qpx@Ij0p8m}UAlLEXFu3r0|;)W|OVUN`&S`YWoa2R-d?q5O-{l7P4z)uRQ%POK>~H^{E!%1Iq@_4s zLHds5$B(SZ`zG7F1*VrBkYsGXV6lwrz}Don(~(D1(gbC$s(;W-mt?72=sR!YzW=ga z<@b-gc=5geUDcwRb?RkNn)d%C87Hvs`*c8X(_YpeyVw*ym-I%;bqRLqD9-6~(E2Me zb?5p!e6K_nG4?W?P@gWoer;ZsK(=z&lPI6?>&^-$;GOo;v*jbgayxE+Y-evflD0A3 z_{zMtPX`&589p7nT2gt=cK042CkED%kM$X4{%Z0b*-yoYee;Y&c=YST*d>pS9~lklTog**|zij zPxlpPnx`EMP_zsPo4am8&)FxjysNKo3%@zhbcXDMU&XKQ1{_)2@~%NTccJ2%r|K7P zmN9()-xv6AWuf-I)QsED=3NLeSRiW1v_M2U54cVYxcV#4L~5tNuI6$^8|{EIt^$0G z8Tx(iG~UN?Y@8c$`oEc2x4o%G(ta^(d09QzvgyS$nJz9owX?DB`rL8_w`~98ard}p z?3&lu7R}S3dt?n`eORvs*Ub+LlHWEr9GZWFIr!!CjpjQx1E-IjF1$aZ&1K#FAxN2_ z>p;o;_{@XT9oFVdQ&MBb@03G{9bN~PV literal 0 HcmV?d00001 diff --git a/homeassistant/integration/virtual_carillon/brand/icon@2x.png b/homeassistant/integration/virtual_carillon/brand/icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..62d63dc38c0baecd76850c5a8cf08ad7c8d3dceb GIT binary patch literal 40204 zcmdRW1y@@^*KP=bhT>M--Q8V^OK~V(thl=cDN@|ENYUcODHaMvi@Q@?io52f@B4l0 z-oJ3yBI}%llYREgd1hum&+MJ(cWUzJuZdp+004AF1zAl100=(?0>H@d!1N?yC zt|>1Ks2L+YfWMKo(pR)rRRu7^&%pqMNLv8t-zD%DG5iGpAQm715aCCJf1ecq|M$N@ zKmp?aJ^yzh>Rr<(06-F;C@ZDygYdT#1wtn8$^SkuWAQeLw`jE4a`B?#SO51O*0nme zAy#t~taL0+j29V7grCZk39KB6aiHXkC#)b!EJ|9A5Lz>3GtNv}ED_dZy^hnl8UtRQ z?CZ6lz4oHYgPKLB^@_EV=XkLnfzIAKUmhyjyQX!@)R^8<0c9azECgyvP!s^0^8fQU z9w5@^S3wLwS;`P_uIpPZZ+j;ls{EsoioeV|6(_N7KT?^!+OkwyG;2s%o|=YD8$=h_ zYAWAvxBk*lYp7g7-YKuzs$dm2rpvDx9`dDIx7mIO4d7@U`&(9=mCU>4b`!o;j_dY} zBGiA&bx)EkE2H*Zuw2`^ynKaf$fB;`b!5XdPbBhyHAW@FX=dUPBfM*A2@!|^C{Cmm zx)k8Xe0NXh=I?)acdX}Z$o6=5@aEfx4LE4q*EF2+6W#K$+~l(-u(tlR5|Tv9-iCe9 z7iGEjkvqIq>G8}@e-P8k%=Poz?paPK`KC6L2A&}X@&fFt-x}o0QUj95`FOwV37*i; zyYdf(wG1VxQw{TcS`oqh<}s+GxEfh^01I?uD!TAIu&Q#{!dsU9vZKbpMcUhXIwT7A!48Xwk)L~4ITYJX+<`42+N z#@b%2>Z;h?op*$N_eB*Ib`&zap_3cGHSMrM<}ST&1h#nytWw*J*A81)=2zLBuSx9d zDx%AiWAO$hL;R$L#!QIV77Vq=*1jEVst=s32XbP+)JE?#jmL?ab z|C$tYXN_#1YWj+FszlVPCn%DIOwvdqQu_Ti_<)1G5a8?YZ83naM(>{1vDhu!pWX8Mk4uTAe)3<>Ln)XSw&B_1!1Z6 z@gKWzkD+rH2Y>1KL*s%`GKQUq4FqvNq#JrTXJzFs^wLFn2Fc85T-yR>G%V&Vbo`r7 z1;^Q}P3SFQ+~?#317gt-c`9HGC8d@G4)$cHR&1!VVAiGp^392_S(5TS54M6B98Q|+ z;Z=}$$@w|5dQy(d!`Q8k_hVm*^7p){u>c{jVrm|B=GlTg_fN$95sSAe+V3#iyQ~-5^K?6|Y<<&>)90i54n&LAvz5GS|B2`}KjL)xd8^>SR}5R>A8?cB zsAtMPfRKsba67QcbGE}&cDFOx=^w8@l1_vj zl89Y^fW-~{y@m|b+y2qQdpc-Y@9a+IozZc==eRvA8U;}WS<0F%xqdN>`So)T`IKnA zXoif3|I)@p7RnFz)q!UCsfuc%Yv*C~UgbuP>PcXPyIS0ysEoI$Dx7ZEhAeG-C_lh@ zhl9bM*zLlfUQ0ZE|LukLh^9PU*^c+Uj4aI)eST=s6Gsj@B4R+~;1Nsc-;AI%#PAi4 z;WEK)MN4DXm;vVt#Gss{U~9`?0oeI&7z0RcX2iif4f#m-ohL|!R4lhK)4zV&$erBp z%6KNcLQtRuGWbJe59LY@aYAA)#g_HDrJa7~lsxFoqJo6X_vKJ{R~Q}g2nHhLsP2)U zhPcEprLX9K>Ijsal%>BoGjYPql<0@fg;2I6;~9S0W#(q{(Q3ZKH)Iadb0|~C_$zjH zs`PBRq+9ws5}Zjbi3r7$Ds2gs97me3(Yuex**?CKEBq0}l10yo+Yu+Q!&A{VsWEzC zKphZ3kUX#)Aci7`-fxbjGENNIx)2gSs6e^zE0=Nn?Eg;AK)k55OkB)m-En-zn#`b* zm+GBqr&{*=QZxqv3N{D=cVN65KCskKitLQ1tRd+f^F{jX^ABRT`C1?5+mmZYHG3M=j zo#p2cNs*Pic2Mz0=e@N7ymG!Mf>lL zmGvc%I`{E#d$Wt?zwU96Q>y~S`tT0kC|Q|CB%6k*`0@@BW01U{A$@m~v+^)=Ska-m z5E3>?>xbrqe?a5*E1W4-qwFR*uFh_ z;g(f_?sI0nyha<$Cj9{a<4%=0k~THQH6QagS~EJo`K%r=aK@jzbEvqn5@nk#cPBXr zel4eQ7JaG{BPmF)^@@h!Ob@Hb%&WNg@acmBqt`}a?0SHko%IFBz)Ab_J2d9HL1AeK zvLqRw*No2biraC7QS%=}?u{p1^U>1sk=jyGG;eqxH1Jglho5m3o5q>xcku=Xx()gP z-It{AnvOPf(UmTz0WgCws7Q%sX9{g8T6~NYrzmn5r7A|mNw_Faem;}R^TC-|ix?LL z(~C6dH+)hsi>Gp*fKOa5^KwMYu!7-o)8s`fB9L11hH7IaTjh`Nt7R*FiTyL)h_3_N zj<}ao7Pv^hsMXy94|RrwG|1K5(i2OmU#?pcHL?n{I5Mq?k`6+txR4{{P`|mbrs@NE zD$2VkwMZz)x^CwNdi%5P=Lz7m$zf%uOts@4lE~Qa-FgZf=XwE#tUIYQN|C<FKyPjlc9jbMEjAkjI-X41l?${q#$gSPAC>c3ea2d7mtWGp}dBT2v~FZ z>!->en%>)EU)BmY12sn)tiRFU99i|-nX&i9VcFBU5&i3F+s=y2=N2E^lq0U%mm4Y! zqbQOtnbR&fxd($}U$Cy@lSM&TWZ#W-EzI7^O&pNO@{{7pn7PQJ0kgOj4z*Q>u-+Y> zu6`R@r|5u*s58{!muqBWm3I)RXjPZn(}HtXGWWvVa93HkcH@%phzqcMioAzOf-oa) zcWO1q@U)B_^^PDNwI;9YAg;)AUP;K7${0`S+|CrXnfz?v_@NW(9Q5=ZtCPWIRwYyipG72o z=-JJ~XAVZAk=S~IjS_O^ANJTUK57ico#l?!jX;+Cn!_M8?CHGfD?^`h&ojB7Tm118 z)#_S&)%(RHmTDSPH4e06i+BQ=_RNtotPpPC85vX?J3y8>i&>I1l4iila>J*vaZy7k z9~2<2&-y0V{p@75g;tWFBGCmNhtPI}Z0gq9FONAIFkJ3^9nf(-3ccX6TV|7aVi9rY zZi#7aP_{>!q7YPkaM>)v3faMe;8MkgWKk2QCl%B5@@&dRF@^59CH#HzMs+$5 zlzH?zjj57-lPU~KKM>c_qhNMG35ma~JsR3`4`#&P41TMiC-=OC-;q|GO7)^+EEFx) zedTCKULod1YVwF9nlBBikOhpO`iu0H6^DMKtHKZx<)!JDAsk?B^_a0+g&UJope*lj;e}L#++&N*R5Q!#chZoP=gSn-B#Z6KoFX{!m7l+Yh_q zA{e>8SEl;q-i!qW;{~Xjp|KJ$6B`m!;K^)cs>u8zH-zf=um1d9i?Q-J3Tys^bg3u+ zH$Al)q}zD9ms-}c#Jk@<$+cRKnw56TH+&RRB|r88MnM!U4IozrlI{_J3pKGTen zGy*p&DSWsqs=|_=DcMw^Oz-%yI)_ZpEuXW%q1{P z#Q>V4Be3g~p0v}6o01iR=qN%E5qU}+^DHXAS7P9Q*>pxbS$$4h@G$H7PE+UOOww+r zO{oG>BDt~rqCWii(qx|ApuOhf|9w z89S@}Z2WAoP8~{iv!NPyKh3n*_(>Wx6#?+#45vWVtz~U;r%J~b_jV|4{I0FyDN4nI zNI|^dePpV5?|~Eh4SSO@9a)mJd_dd!G5ttjk7scl<-VH|10So}dG&JullbF@9rfX- z{hp8m%|<@CJwr6QmpppV##kt0+OwGNY-?W-NT2KM@8rQ0dy4CfdMt!OjR4h|q-`$; z^OuJBNG$n3?qfkNAH8_uDA2*N)!NN*l#%^a*X$-P*mg5gKw|eTc8Pif9g}RqE*8X} z4T#pWZuM;zkq(X(Lg05$jT^(~n#=aEM<=N>4&=%5w)P2ADq=v8sNG2p=xQ<5elS>r z_@Ta><&{nOHH%w)kl%UXiw4R}L$H~b`c3(@g|93nJLpWM>R@Pi?pKTiiOlBX#qUWX zq`mp_w+?3_Hl?NOtO()caX%c=3CQ3u{Msvgk^G}&?M%)02$l(AvyH2FL36J$W>PL% zB3L)K0$t`wKMm}pNP`aX5$<}b@MQ`DQGzpzXm}3WXzJ}K4|l?9MCgkUPANJb)759~ zA7}hJ;nc$nwI$bo^{}-6$;N8XRX%lgWJr3SZ*ygyy94{xsYcq6+fR9T;BiMNul18ikN4WEX~?DfVfN$e zTs9;%)g!&n-VLn2?-e+MQO2$N4$9y{$vYz8f-``{`VA^GFO#xGz7V&uTXr?8ys}=~ zp>sTXT$ibs??8A7X_jg%n03W|pd2d(BVO_pseR1za!f+W!U-ks#}7PJ^mt(lo!+m? z4_GHxL{ve2`~R^`23&AA>m&q%Q#upPenC?r%Vzqti;EC$1*cDr5>~yB#@|ducbB{h z`E*)wwQqWxedDlx?S+yb10YWVT}us4H+9~>-Mjz(XDEp1tEeC^8EluqGuRso@?H{< zV{z@hV>Ju;D^NG_8>$F{>{%X|g;Uk5E9h@|WB%>DZfJtIcFu($OTIS@TD{Ei*S%6; zG~LViS^->>Q%h+{dXjdgxd6H;@C%2e;CS!ERJ_$!6QhC{ga24AGvr{hHCpvI#{Li^ zJ1@_D1nNy1qP+-YNj6^(8srMBTKCs3O_zMS<-H-5zYHvp9i*xCd+n| zPjA9ep--A4n|H7n)N7yW_G@JQ0Bk7bb6b1z<}}Fn2>P8pb1(S81ub6T2lbO0=nxA* za3inT&Kw4)!h*g4Um+J6uu;lEU5V0t9-(W7FC`c`)J-}jqG&pHmD&xTZTy>09(brW z6HxC3B8-*8PggsdHLja&_L3xoGZ1n5_9nx$4*M)U#^lZCv+i+2c&Q-RExp{wrAG49 zua#;yxTaiV={|{FJW>DVkGxev)=yH#pvkByTewe%%7)WYLoM9S^RqEE+B= zslXX)VaOPNE)t#LKsU4zB&rTe$#<~%k(k;Mj~PAB<-KnRCV!CweUK_pO#hQN*>YDw z>QMGvC5ZA8MKAU-w3##5nrw%_aL8RFnDIhjdFu)4aTTAUi* zOk*onIQ@RR(QOl3pbdT>$A*M7OC*tA90WF2E=)q-7y&IMi|cgE8Xq)-=f zK}N#1R!+XkL*yj&TMP`m^naoJ=3A`;T53MkU)->M(OG-oXvzMbPSkuP=C0ZsN)m5& ze1`kVYC6v~;%wGzOOHD7JxJKHr3d|4XtBW}h*8R6=2KEvo!;vxQz&L>?&f&H$*MbT zljL0HCNBVIs^FNw#9vK(xz5m}Um*M&PCAlfYJoVBqdu0^hZ>me`PrUfa3&kHBU(}v zY{t96Yrs^O=q#zRi%y=gA%#fuhxmni>a5Sh+-`5Mvqg*$^EK;i3;-R#LCi(w?Y!*T zR>WrZ|radwE34UH-$>A4fXOMP018=c?x4LfPJqzh@hHqzx};m$5)1 zy2!VF3L+zfi?e*OfE)aUiF`fd>dP;|-y1e)UePwTfUsVxub}8?JBxbVR-2;MqV0B& z0xu1N+wer4(L>g%1v-?|hXT~ro-XIOXSv@~DTnaaI%c+nB!r)^emW0)0E<2G4c@_3 zQBj~ilZ#5kBiFWV1FvnC`ihCLj3uug-P~z$gHY2)$QcZ~t z$t0E=ge7c`!iu=}ByP72W{|X=%0@WXg%>;3(a=oC>dq+qyp+)6KH2_x{Jc#77t3*? zpbOzF%E&eusD5Rj2^+HtfJiX)gAHK}NGUMC$m=uq1g#w4=PNC0Ir#F@2T^v-%5!WN z-?7ZS4cFoAcoL{})?P(LJMEb~O?pl#^nZ%b5!h7*ML~=~b%D1@TRhTmae{gJlZmb4 zaJd>6D1Kx_nyTs+NxrkL4OYds^@?JV%_`E|-lww90u%V6Co_&h9uWflb)R=!+09tc z%^tgwWMiW&=a_u|!fF&G7D@$Uz#L^1ynpu}nIDx3!0?CX!SYt!(X5_Q?q|^^0Vit_ zf_XG2OadLQ{aBX-ag*s1{hm(%$OE2y!fzc%f3b<>Jit`RtMnpt!2D-IS|9F@l%MLl zyuAkVOXSDaJz9z@htEx{Z5E%Hh}olxRtM>8ROyEymn=2X}gW zZV)+1LP~qz2UFaplqWlskkO2mTV8LAI2bD1&i)88+-_Bw9{D?C&fwcj{S(67A~+T$ zLCjKsO3+wpQXdA9#>~#bpo;CHi@q`voh~#OJr?ss8}r#rmLq5V_@7+Go_FbXwC1B) zHa&UA=33F_v8ISB!8;fLGqAtp_7(`{+=Fg3`rUj4nTxZ{gc-o?C$fSzL^_<_s#Txl zbt~99Xa+>*@kz+M&}(YDXJ30uF`= z`cy`514;bXyKt2eyvgFHKkiD%CIgm)gxG(u2<_g9_PJ7!CHtI@M{%KqUD%@F@vyTf zGG2!OPKx46zP$|&v?+VTAk#sxlCPpZYUKa);*5T$yenV`zRT*>t@$nAlppx(bAa+u z%g$)9A)$-e#}n4*z0)scGD7;Bw{<@ETPd3U;NQf7=!Yww7Yr<7W5(<6+#dSG&oqX) z3{-(-b@^gp-HO*d2D+~$aEXyMnx#FgsG=4Y?TPo0a9I>2L*y+f5LEagsJL@`0;F3J)skVi;ZGc3D*q`5FqRYWL*=w0H(j_-Cbpz2@ zT+z@)31!}s%(&_|3Ng{bpsVtyp}iM`8es$SHV>mD zd~ZM%=iy8S!ASA*R%F@il7RxIeZ%DBEV{B@SnD_$9ZS5U=D|^gEt>hE2R$C1Swzl)2)lcewGYr((_zFaMa19f9%7 z0|nK$=^A+M{StmYMyt)Y;XkhBiw<2BoMT7Id#2xD>9f&j9nlS!v&(;%mTbl)_&KL; zaCh=jEGX*BM~28I>C25u3}~)nWxGE5ncMB@49l(R5wlk{X==IK^F2=#qaU$4_-j*% zT{KcwCRXHSvQlc|Wt;OuJK`oqxQgNpbtZeOaw)jWb-sM*IYq-&7|jMli1j(EmRTq( zugx#0{5%OaieI?ey6z9eDoOmbCgi*@!!5di%*+=S36_FOrTwj@{;EOASZ7t& z3VW>uc7*fi)Xz{T{nB<&gwFZ2ze9ph-j;{LwK+SN{yyWo(#4+A`9yGM;tPq%ipf$g z)6kFp>g5LRFV|@>LJd=Fi;eOs-U3<*ge&zND;=ejD?Jk_SokcJ)-+Wti19WD(I2xb z*F3B<>XpPzi~iZwbsmu9G2m^)b8rtomQUtbl9kB=ad5}^)+mLuYN{oTOX=U1py_Ml zLmiHfdU5afG95;@=AASZw(KQHHS%9}6aD_03C3HU&)0kLLe)YEQJ_%}y^Y)R0#@8F z;9juHD$Lnzz1lhP;*NeBNes$`4gr`QWW2tIRVTt!A5KfxbLh-Q+U!Ym)Glvj%-)1w zqnq1}YFm}wQl5z#)O%l!v3rg-r~4Xm`Ll1CBY~mgJ0g#2$(b5tjpO5<8~B!(=R9e_IhC8q-&?8sK%ZxRUWb6vo796a7H2w zX83lBE~RngY|+~Ha$r~7q~}eSI_V~7IYA078I9oh$$lORc)q!}@X^L^kuduLx!lYaz##A3VstM^fjUR(U-_=f{K z-s5)Gvy8Dh1LyZynr9_qj9d%Y{$Kv-pf(iFPu+|dLD$W(94B*7?w`R}@=~#2vu>c$ z1r~G-Z{h0-OXgGvCT=rnGgGqTr0eQDdHdsB?c(p2xyy?N)#~}Vx}eo%FQYtH?)4-| z3DpRL`(%qThm@+zj5JW!IwqP*2EW<)^B~7}8c1S!w})rhL!6#hr5YQ*%-`YJEMRZ_ z?$Z{Gzr4%kkyFNuq3-xQ*X$vAFq9HbGBu)c0r~Xpn`(Hgn|xu9H&0NfuBM!vd{?`c zyna6W?z1KLi^V6*ZS>9oK^}GF5`kbM>A4|_kwQZGRYYxRj6WN<1J1_Z#?twVXkUdy zS_yBohzEzqhYr~$Yh{~B#CX1+kt9U;$n!{pa02x(f4E5UclJL^1&Zq9!8Md*{V{OyTQGAAKU zS$uG(+~$ljL^{Wdx0%n<3suqi`#060WmD>>1NQ-S(%cWR9yyYRgGavzcq_YuPwlQZ zQCq9Vfw_fN2r_=l{q)zvBTF+h^+q?}dRL-3dFv3ZMfv|!Fxg_9;z%_T=%S*H=>D9> z;ee(qG_M-W`}X)OmvU5w$lud9f$Dex>3~;de(K9lzHJ)L`n&a#Wy(iSJENwihmiuo zPKh|+;ddNPshq#NA0zM&G1nS3JzZ)fw5uGgPK4h|#YDsyv%OWyUwl>S4ocXjiGBgqY9wcS< zR$lG-XUx)UA}hWnppbI#lQ-M$6E)Jcf#| zOd7~z!9HA}G9CtIRi2*{ppd^HTgP$SjzOWr9|5QR9IE8L4jo2sB+^ztdhr21^8X|G zi7+`s&!mnS1Dx%$wjPNT$ifTSsXeMyLje2gO0gGgP56`kOX`vwz%jO2E=Oxq9uP?R zAYEHfE1MtPHJx6dF2Bxxe_k?=$lP-VnQZW!&le)vQ_ahd#T2L+8>vf|AhovDlW=mi zi>;1BGoe!Mf4MP!?kZFux#v!RF9SM)wH;N)Vsuo^6v>|ZsXo|*$#qb+Df-boY)zFk z{$WtnDChVGQ10T2w{E2%(%Kv6xD+j6bV!OLLYYLHl(J|aqm|>OS{sUqwg52Jv7vX~7p<{sw^{=dM3c!ZodvXB7Tl>t%8N9% zR|L*$qBW!lv8+McY%DXiCx^|#zxCUYJGfE6V4`w@y!EeVRYB^xh)m~HklR8jA{3|+ z;0__Rq?4|Qo=#yRTG8KGCBD*Y`++~u^KgP@V0dTdhyfkqIqvLaZ-3wHfqdk+3L!>er7TXDn3lKk#*E#g$I4m!-Yp7ACtn-vfS*l~Mby^nb zPimucdHsl&`@%_9_m$=-CUJ>Pq$FMiZ??EY(g53cG6kW4rQe-Jyf$9q$Xl{bQ__z+ zi>GO-s6j{7zxi0YxZAWojfqr$!!eeszn*gUdVG77q8FBWhcy`8_Bem~S4$*+{!Km( zSGp*#?mN?NckMv+jtvSQYfUn;JoNZ5fsIScwBa;@=JJdf^>6`A!`MSPldBVogbMG# z!$jHQn2wKc_N4&Ih~u+23QSR+XVB>syMWXIXdaie1t&6efV2i-Akq!Nze49F^4?s#Jc$_ zVvT<<1RUOZHr&ar_!yVjO?}X1jdW$pg^hJ_U5|AO>3=pfMZH$EC-YM>EPm{*QyJ2R zKC7z_GFEiHS2X%b^6F;o!N6arl%?#)7vO%U*?gPYoK)^dm~3F$aioH7&M&)bzj|sG z(7lk`g=*z+Rn~7T1hmKC_oB~7TvZ%E)y@NpS2Oc3{@MzT_bm)Ymx$5%uxI~)Ssg>e zLnqI^{+Ebk?BJ0EIUzE$yOk{3fgJHtkg%A)i2z;&)Wo+4~RqEK;P@p{P@|)l;nKZmHUf*GA-3wU7N^M~AHOu-}Da^^Q2KUOcY~HNB4^kzl>7PEbxn zg^#!Z?T+W*LJYDO&c6u)FuTF-l@AN8J2jE?GnMSlm%i2+no5;lB?1^Pdv#H72?m>2 zCJ9?99I6oUr_zO&SxQILlKVMLnJ|uM30+cxffPQT3BRqpkrXv~=7a3U-`Os#H%h}p z+s3)^FRKpOI)_uvNwWwGt*Bbma3Di2?Giv*m+Y8*GXOL|3=3jV&G+ExuIR7?Q9M)C zA`Sy<`6K!FW1UW({X_chchFs~9Ho)xT~5}|8V_eLiZ$2yVYKN*^FtUer#}is((AX_ z@yO^&UmQ>_r1P#BTO(aKG&W@b&X4{O-)B5+@h)J;|o^HJ=!;=Fro>RHpw~ZbaIU5k=1GzF{OM>_X+NDee z8%&UHaZZ?&0>B08Z`Tj;uR8a`#8_%N%MdBTNN7Rldq4&i*U%qafdA~QWZkZtS5~W~ zK&h&^33k#D!={Z+_K;{Jws?LKU22^kvY@Z_zYC!L+$S8oj3bxV?1{!Ap@O)P_p|eD zG$sOTi5$fd{#DO@j3bI5(8!#nyLfNQrmooDuq3Gd*J)|&R#4UO_GL1a=4^#p_W+!o zln%f|%c-9WtA{j#Z;vVil_RNjD5*YC4JJ6E(5Np9M`Tg#=1Sa>FY+p#aQ$mT!dp}L z9e(YnIHI%ybK!TO-P6KEmgJvLgnbR)acr8zT2Mq&4(|wUnoc0wK$b93*%W-a6M2{+ zdcWLPD8FKrPV=-lLlZ0Ncu4Tpgrskg;Fge198~v05m-$=4GiRdux6n)(%6g@UJzcu z`JiitNtg0(e@xxsX2iiV-b^CuJV8}(ATZZo+I_kTLQ9=?MTlZW};ovhXd?5(reXtYR9P}dGz|v_zH*UaBF@9NN>y_rH zbEPqJ&yQPL;Z83R^<3y?{UvAcn}!fbkwo{t(*Fq~tH*6)R+dr__+Mjh0fBX0e~AN| zx~L4B-iOLS>1IpS{eEQg0)#nMnly+{X!xN69ps)~6L=Poul zL~nSmDN0A33g}7+@yEQSgg>5%S4A9h`9^Q9X7?M!YToZ?=>&!Z#xQ=u-!48sQ4FR*lr6{SDnEyPL zSn)-c{f0?z!{qdo+z(9c+m>54&D;ArP4uhF-d$3x-S(AZ(3Cozxu=@r>vdUh^yj;O zVaMHI4&2Ftzdl=zNa^wZShv)4CZGw1qdygs-bI)#R2z6MF>xKqsq(7-rlXqu;nu8# zWdPxb;@DqjJc^%fBp>C{^F<4N^OhK6d_gj1^K{jR*^WjR1ZaFFWN(121g`3uoA6HL zdDz#Y4itEBF;qtEVcW>mx}S$i!EF-FJ}}g?!=> zU$vR$NCsR*v-xcrfC^O`ZGA+b3_}!^c2d{s*_1{zVZr zH`S-KrUI#ILI4p%&LheBTrNp%Eev>}H*n)XM(cH8v))A6a^`Em0K}g5G<#z#yFC2wnnw!Sv-2&#Pt!n2A*^FP z-e+?o_Ck$KCr4m9i|Xvp{Ov=!MfOhrj4YHLs2>#JpNhi)+^?Lp@h?$)@QBeuSXR#6 zVxue>_$C0boG&G3D0-PdesM%ad+u$&x)Y3iaon&^9#C#+DjykdsIQ-vMK7fTDpN!J z@ot&_JxZIS$|g>Hi1=Cr#2qTefAN_IQ{-cxeprC`ZRACllY^JVjhRe-@EwMTnwWq1 zvGP59Ry41rO8Sk??h+^|EH=g2N;J*Hq@0*Js_( z!UTC!XBnv21|^B_uQd4zbVyaoy}PfgK#h!rI1k4Lrl?}1`W>0#rd_cgy8y@dVY^fL zx006Ym0V9P@0EsDZ>DoOcsut+Kw(mEkufOD zfjoo>Qcs!L$0PrAq&Tv7N5ls7NqKK?Pv+cM(aEa13B24{acX~H9s z6x^pJpew3JXj1rw;PRF|W$4KO`h(rax7LATvC#48KGmz2H8W8nA|Cp8IoNxDrw%}k zg$#r*iaA99a{vjadZNUGM{U8l{JOJ@b=&@DZDa<;5`>A)>T7!2R(BN=4wfbf$4~1x zqU>(~5Awm(i^+ZV z*k7I;$UqA0u0D86HMNc?kanpyVsnTFn9cUhf7k5F>C+c=a(aP@Kt{+|9(~Y8LdzDX zALD1@Y91r3d~;Qb6~apc@h80HrV9d1v=k-Wz7_-+nX$$<;H+5Ys`n8U4+B0fcUhEl zJa^9{%h^=nxSb2Wn0M~KNWnyt;@mRjJ>gC{+IXU5eFoE_A;3wjE!Nd}*8<=t0v&r@ z0d*@1sTEb_V7)>b!o-F!MRH=dW9j}?%_4~DLXXC$z`q3sK%Ix z>h~U;#A}vkOqyI7d^N$tPmfkb@MVe7RF=3GN-(wz=?2)}|dxU>IxZ{ryPnD_@6i zy#Y}We2|O!)>r7nayibXRc4Q4DFuP z$LA8CA|q^O`cn7QIN8Dv;;>pzzUt0eSqP3PpwiO=y|AHTasD~UXrTTQIIvFfT@VF- zhIZ`G+87Knudr&G11#MaF^A5&^V=$+NJnlBi*3mL0TVA4FF6ID9kTkUfw6hk*ecd( zj36Iph6*92!0!1|)D<(D6L9P6+_b7C_A1p)bjTR0x1)Ca@Ky=t(Gw{i$Jw66$0%j?Y0~`>`!<-F{zYcjN{sFWWLIcI`r_R;cWZ#PYIZAns z43V{aD2Qu;HL+L$dbYMhN+@4NKCKn}kse*i__tsP;`3o7;8xbbjc9ziV=hr#1zD}%UYOpLl^MJ=mcj_gyj2z3> z??uOwmiklg=}-~YwubC5RS+Pk9l#m@d|S{(FS<9D=QRf+Y7?4z+rRWy{*J|%_45l0keRAo5^B&aNrbmP=a-y~CfVXWxk>TV)XLdvwI z1l26|t8rnObqF?r&rH-!rbBR{=q8hGz5X>97G<{SBh2d9J846_0DjZ8lk(rArIL+& zR(L-}{dN|Mf@;-Ig~$iO0HH2VE7lf<9OOF&%-G;4z=@|RXFcS=*H;j{zXE{ATA51G zBjM93mnbxyzQ@uN742=8U$`}`I|%*?FP<*4(BNF$-l4#p-oYb~_*Wq##WD`V3>Uhw zudveJPlGp12E^1A-vBp|UBdM|FwXNTuLzBh)he$Z7;BZyYW-csw=9EJ@xqbTUx=;- z@aEo4b%!sPM1->NsImh)_EHx4$L&Zph>_|xP&r3z2_DxKZ~;=A@X_iRSc`8om-(SV z?ed8t#8Y6bC0NU-R{@4|@;EvP^%KgC1 z-#V)ON-Xf}2^79tY*Ik#8C_#Jaa!5_Ov6_6Vb=9Tg7NdDQSdqa*eAI#US&mMV8?CB z9CgD3gat}uGAZ=Szh=|oPczPdPA=sWDy|hk!82~}<&W|5^hxmJ`gjZM?6jC!xpiNK z7@#9PV96v8xean7dAEn=^0_39q@UCVx2ca1AVy%+ZbIGDG2G}@*>oJFt`J^U$kokf z^B#G6S!TnR6rt`Fy}J_rzk4qmZJ@bC>UlW9d;Lydu%^!wp8Sm^BhrFoOxMOrNz9oB;d{?f zV6$E#QN&bB>VJqzMfzt6U%pL%IW3khWVeayt<2P|!%=Wa`17&A5Hn5bZ|37;*ao!G zZEtCu*1r@TA!PJuYUeq@yr*_usG`gJ6y+MqlXAH4BBeT?6zIFeA@Sy?v01v63G$Qf zpnLGzgPdncUy9GYmE+~j3nvTJ%8U;(xyb%{9Qz7RmVXHtA_Aohki z?-YFA=m-fs%pRU4Ki1k_7KxTY4bHCGK=?XA6_zHOP2S`LYB3lD(`F>wL@A325g zJ8f*<6Q^0#k*GO@42xkM5s_i$*gOAS@Wm_wJgbb|bIbF~wHgQ$fSrhLewJQ>_Nq`m{mYj;Om0Gk?S0!!AcdV?9z)6GN8Q8D$h`=4V>D2 zqb)Iljk}7J6#~lWXJrckz(rQo@5oHWGKVF|eWO-rVNT(;#8cT-^>kRVIs!z}j7DaLI@KRK`{swQEl4(aqJk15`?{Jwu zf(wo(B0i234?m=N09EXkQ?G#;`(xXI#Cxf==odmGfqHk5HDQ)!f0p#oAt!93B7NWM z$BW7J(94z>x zVTXv&Xq6lmLU(Ua9w!3rcmt<8BTU$1lNMvS!UP*oCFph zZ&j-<%VypH6`iJOB~Y6@2{LDq;UkI(we=OLB{kePflIj*QI)A|TjzK6DXy_Bo%Pca zw+YD1K618bGZs^c*!#z4B2E!TMg@Pdw<9$T!L)6vDNn33bH--6BrY*8q2Ju!@zD(` z+~ia!+R&)7B1=BbeX&vA?v7Dq2E2+@TP#~-k&n2)IsHX5G_Z=JLh~(jgCccFnsUf7 zd)ub4`2={mv`-3;w!M(?*mHMe-Je5uv0@Msy}7#ywKbj}l4t*B1^0}pTHxlL6Nw>o zGrWdRz4}g_vgVRjQ2?xshQz!_0O{5;-8;d-esDaxS{3pyeLwR>w4Mck{$e2}?6SH# zn}o84S25^F%E4F3kt%VU|JZKlIlZ*~xcm*W{@z!+!w+G&l}rL||6-^w<680Vx_raw z)9?jQTPtku+SJQYu#`{f{(TTVZV0=~UKXeQr#LIdrcaW|%c(SggCFxsMq7(k7)Bs9 zZk#`TI0D30IHKPR=Xy|o@8-@Usqd&48eWE3yj@I->xBiSCO=oVQC%3;evqt5G~R)m z0eHPusi3_#P++!pJw&QO*zi6E{?rwNteaI?U`*~f6bk{@G4j?s>xDa?vNZ<0S7toR+|hLHh#RINYs z$IYga*>cP`c@B8>e3aq)oIdR_JmEUmaMMjWw~%NZmsY!DXe@|R!nkYsy@a)d zA4}4Z-ZxKdXk6NH1>wdX0Z!FYk#a#!+}JKOf>X2!1-7HS82Z^;ma%Iu8b;3TraKn( z=Ltty2`J?_90@2P#ogCt68CI269kl{%f0Wvf0Tg_6uN_P>E!P*$^tGJtphB=0>0xq zehy(YENrOr_lvv=!^}0Kg4QymKIf-Sm)*kTA}9GV-=x{-qY*+n`dk(2d3SgYc}`FE zVuN>B0^BBF=-XV3)dk>2$_xF-$ z@znG=+!~s%9r@-Of$G;HRLZmAdhB%^X6=@Or1Y{4Q`6aQLbD7Bz46o;D=k^C;1%L6 zBy2d89i7yQaW8jUsn>y7nLG<&gL!W!?OWrWPUmru%PTpBmzbhoJpAw)%cqf7^W~Tw zKO*Bp_yOobn1WA*)f3jXl(57+7JpHT&zlF<9~~K8SNqO`1;ps_gr`q zap?#*L5LnmRp5xjLCApz$@j(r9+d*diyBKh7$hT<&7wa?)TWV}P&_v}E-us{bo%;x z2_->iH|q7hrW>!hrM_YVUiqSrvd3zo>fxhXmns{5o1u``I9EV}+_=}Ar19ZoWNDWx ze_;2QkK?-Hre6+#S0`wLA^K}>o;C*@72K6fdyS?+RoRv!rM?fRV@5Z`CX%2-6a*Kn z*7CoDDDj7OL**eFh)y^)Ae(qmpU3ZY-(xLbQ_e3m%D9{-tiP%Q2Ogm-H;rWY{|EXk$ zJGE~Fs^La|Z8@BkHYfHPk&?v(eO{+xLVCVQK!m%Ndry*+ru`+}NB}kN$8Jijp5%sXD^BI*fdBa|0RA1ZUM8GSSD#oKfUz;Is~3P$1=cY_);bWBct$6v%!o|IvlkB-*SGq;vtB#vW-7& z3&HUYm61t(2Vd#><5@^|2!9bzNX>|`%k)JU{BLiUgAu;uc$`!);*P)FP;)8YV>pT| zBnJE|fR65uDlhiea=TjxX}}epe?En9VokK!dR=E5D3+4`Fgo}{3>fwua(m6{+11Ik zWvCtCfqBiZ$uv%HkI*Zx(X7amqC z8`b}161(YkGH1&{fY)OEPvfzH!tw{CZ?w@}7+ZNi{!psL90j~1i{rpU9At!HM1T96 z_6HaFJgt-HJoA500I>pj#7_yaesrb7z-LF#u9-S|Ml-ancwIBXc>4?AsCl2Rt*Yof z@$(^B8A2VSiKx_ne*@v1y1*Sz5Y5P%y42{0_F_E$Szg_us4eD(Ug9GIJ>3fR zJPgSJ$wckH-_W1}!~^ww-|lh4=ihi^28%21PHmz;gaCNX0`rc8X~o9QSkuT&x5*?M z3!D=DZ)Yn2fx>zRMsM`x^^A*^a)||Z>QSV*0Djr4F_tG^%@?OKS__PGU=%yM63PX? zwEo)>i6D?i%~Ts}dHjZ^i`~Tkq3SIIs`$P(&^d=ggMf4+sdPxUlt_2CbeDh>|v>4n{ivI8p`6>00&ckQ}II{$R^ zITjSb>@xWTkDbMJwwSs^fOB>H#|x}pKsA|N+mxZD&bAF-wyXX^h2h)5e@5^QG=k3_ z%9v$27G1>=iPj5%jc9;%i!_IjUp18FqN#l5=#m3nmg(9!F>$r+|1`5R5I(3URERu* zo{r&!o#s@(Q%(+GUqn`aepbo{%@)>T)p?Q$k~#cSeqyMQ^;Wuelri5oEsm)M2#q9W zWYV1(&YFXj6D(Ub;rwp#f}jZnEc5@T`81Mf@XxJAmXN~0ImONd17ha61_(mPYUge) z?S?tZ^*kWw)r#|fGBt&DF|K0)MaAw0suN1}o;iot4&R3fB?H_CWC8u!{g&Jnf85}b zjvbI);IBqXN3}NE0#S3&9gCiF%tY%6K%m}!BrFu8;M6$_3L~LgIz-n<5Qed8_ifahQ?SrRQCb@e-a9O`3TsBzD-1)M~UXaW7;t^ zjWbr+$uYRm+}|TzOD7hYFnmwsc(F9SO5yFUbMWqep7IcHSWt1}TQ)D}nr@RwDGFS@ zVgyaXK6goIv`%Y05$ybz_$N?#8Ho+fjFq4r$FAzvK1tZXXFRyofP$OioQ|GO=Fg_40{vSKoa8iiGGSkOENKVx}HK?q4n8hWmE{ zt!WtDN#FQf+C%Ymc>p(TCE24pmsp!|3VL5*X0|f%fPWqbEYp1s^LT*N?L)axsy3To z-(;!J1H24uXLRn8jQM!zufH9~{^`_o1 zBC124Jmm(`cu^%5+%SqBaQvUD2}6aFw+x9jB{eEelB@>++&e!WBnff|0!3ocYMJYw z2IPUhyg!Y%0#l#q@30|&lLBJnuwRm&;KX||bogIT!3|smqju_`r=&d%1QKQZwdr0c zhHIHy0|J|_xmJW*M~sq3D<}VUUjnuahCA+zouF;&zS_mZGVuJHgm_#y_R)2C#mW)6 z6$Z*KG>+FRNbW!4alV+!&Qc!fA?vk2 zx{K#=?_iMB`t^S+j0=Ge+6rwTPfoD+e9_hw?^{Q}P$vPigFrII zJO(lK%TwvMrV%PNl>?(ndGv76B(5J1``gGKYeds*|@wl!s-HbO2 zdzPSeT#>h)6Z?O0=N@DMhf4DDt0y>}| z-5_ji9uQc0&xo!#tTtGcHsm{*WoOmZ@+R(%wFU35?gDtvaiBtlTj|7K7#Ri$cd^ry zTNbAQ@K9Ag%7c9<%0l+sVMRk8morC#x>dt_|G%Y;Mgal?jZFAN~-@XlMVD*9|!#;cWnBa9uG|eEMJia?VXzJmXs7UB)p zD{VAqZ+~>-=;Pr7I^QnYz$E5SpKsA1BZvMs3X~NYRH$xip4iZY2V4pfxB)#tkIfbB z5J5c(=Xq2s!M`=fzWg`AZ@X6W5r?cKKwl3q{8o|#>G8Sa|BZ3@JEjujPt-T!wHZ!8 zzf|>FGcKJEs`?VQRbzU5JCJEtqg?yL2`w}b7r}#vR-tKJcE1=c&AxYU)H1P=vhy*1 zs4$G2n-B^hyI_3O7v;nb)+_y1Wqc9=WQETk0F*(VVTB#A>#9^fhVu}@rf_WtE6ohb!` zdOdiOYDn?n8lTlU1?@!w(JDAL>GA`Y1jcn;>iDCH$@YfMllWwWA$z+ z$WGGyfTkG@uA{H|#ZKa3*KT}dmtS){p)c2(F@c!_@U73WNMcHcW2BrW8eqlH8c0XX zDGxklU@=FBh~X!}6c)JWIGiovfpN@BA`%R(C|5+Nk!XK4gjS%F`EEtYc+&M3!$*t+(2#0~sTdR?XSOIJ?@<0DsN)$t!$`M>d+7^pt2J#on@;^AXuKaF zEJItXiSi_nSeG!3K*BTnVT-$uP9HXV)83*>XEzDv>VN$CXAq_x#f%qNg4fD3GMU#x ztDQlK&xi~9vEwF4P>I96Gx^4pG<~yj@1IP@MIP0owMHoap*(Z1_t0KDnP8JMi&?FIX={vZ**M0&2ysej_rJ532J@s z=!R3A@*h}f0BOkCr1F81Wf}FFP{u@-7YdYpMbsnU~?1iOcU z-k?W$h_kDfQ1Uknd2;^qt3AO{zXnn!Uw2epfi2lMg8DORxS=4H8V|6#NIL3&gp6Mf*lHub_g14 z2#|>@7 z^o)fW*QTImCF(n9<^Od#Hs${*ZLkH8EFFNXhm2StCRH#Kz{EY)etvs0$2SVRD@oM$ zn63NN(Zjp~QWa%X;`WfhjjaBdb&(}{x1_nJmx_%RsRUJK@hY;l@b@Tj9c;G zJ>+{`J3@)r&TgxLjgLn_zs0EE*uk!}@igNoD9QQ11@sM&L;;HS9gm_YAdl-*w#BDT z*T=U?zqQGaW6vZE6%93hH#zatx?7L_(u3rq_DKd9!pfw4;rLGwf%djN_ks|aL7wt! zxKA|WXDiUKf4h_fa(%F^ShQPu#P)$uDO>$NRIt>J9&o;W9wGAh0F3!eRP!B=wf@b= z_J8wvLI%!9IdLNO#$g#VmpYap;QOmL_U~&|TDEES11=C`CxJR=nyVyeZ^aEGp3>iW z&t(lMH=fV28r{DLnr!)ZLMdmVy~Tx}2PWRU9wK0P9P}Gqb&(Ang3oDfzWqe6f?j+@ z5_s9pJ8)pS$3`f14%UbmG;Q@gI5`oPn>gDQ&7u0QfVee~M*Kfiu&^VGxamCl;5UMl zjFdl;1mA>Ew}u8_KSF^(rvi@@Vd?g9&FPcxA)JSZKi#jt?vW+gY5!q+%I*(1X5zw? zo&tT23A00BXWe7bTTeR{4W#$M(@XbAVI@k5#*tR*=V0s29j~ZKUnBeaAOv?Md`D3_ z2*3_@S2}!LSj&SkQ5J+(A@Hk_b2m4q(yUoB$Xxlsczb8A24m|jQ{9WTaCtjb#b=N~Y?-R_~ z_)2ejVnJqe@C-{_8cphdZ_nN+Q!6cXpdq$SUp*zBWBSupDS)bCMD^+-# zPW?rtoj&2uz^-6HsCUx7qT1+NKtS;fEJ9$nDOaqYG{~&|Zf9k;47or1Ml2%<6#K|+ zCut0e`1pySHC~VMy}s*45>+UdgjJCNpj!B$ZBn2_BTc2g1I5(;)e1;RV)(XQ#ebCD zy`tg&GL5XPm{^n0*cskxFL3P)r;2|VcmXD9X)*F-{AWYEei5p#83&XWEu+lxd zZ6!RUC&@Y{2g;+8CXNz*bhzM7e-Wzu>g0gIFx3@l zadODYQ)clLo3lU=x{cWCJ9=}7>wTo9)gAQ0*s=%@?>U(4etkGjLRj+2J!R09&}yar zXQYKFY2t%&GC*dHj1*vEJjMgMpu^;>y-NlkDNfS*w{Egl`93*qfyPRd$@Stju8rey zUGku-q`i3`2v*z!E{MfK5P-M}S*HnXf*kuL1h016=gI(-1e0tUAYfD#17xz1O`p1A zv&gyV_ymwAKsLl((!*2S%8b8GEY6aCY%uslKsw=~c!p#uLDMww@am@gp>-y>ITGGz z`=ppS26KXScJuk}2E&J~<%sF*t)zy<5(wu#L1umxQxdaFy*rZ!Qg*m2XL1KC`i6t-xF<%sML07pBjO z1s9MnuFvba5$4U?j#K-8#Mc>355V%ctXhw!Uj~hY>hAOII(E%WPb7(U0#H`DX%LCR zA8`~A9eT<@X&?<*|n4ETXU((oa}8gj~Xy4NSi)fv(Kis~IxHzR|@B5j7b`CD}t#wSCBFtlORIr?^ywIvE zKwYUJe^i$rxF>uW*4oujAZ(bguXb(8AD?__G_a>gtkVnu4Tfo0R+#dm$lfRLIw zRWn9zoM9?Et5!BfI^P{+52=T@vO>L44p`OWg5iT&2yU0O4+Igi=?&n`BME@CGN{5p zg%~#v)jquHK^He~(2!y9*-zWYJ0%M$?* zE__je1A-+nyQ!Md-0I$|A&N-edASS}TB0)hRnK4*v!kDkUD$I!XrU2v&_Q!RN)5ar zdazb+(=gv%&y=k#A2E(g|5W>)7d2&5nERJ2G&ZuT+&tPJV2st5k9cy2bNj3^u`vZ5 z#8qD5w(`h(Q3&g%twN(m>ww96R-4;<%-ko36p%^0xK&5y@Nz0ZFpIvbanfT;Mje`y zL!5Bzs#;gBrRVy+Or^ssqJoITd-H)+l>a}>9en{AIZ^0(Q^?JSY*{Kj+ngL*@C?>Vb1Gw)eTy|tJ89Si?Bq%LuTugPajj+D=qlecS1R(KuoWU7GAsQ{p!gGjp{P}uY#JNE9HmbG+ANudh%-E zU0CRH9gEt_VtWsTlK3$|q0REod=z)2_l#iVxiz+`l{Ac28W>{FG<$IlVv~99+FE3~ zh{3f!>;-`2oAppkC#jo_piGibnlSYU1IWQcF?UPkp)CDpe(Li0n!vV<< zH-jO}LwQt?#byhk=wdzWAz6vD0N{pV)Nr)c1u?HT`A>dyb0VW*(lEG;RsipM9l`*S zcjC9vS~aWO@8>!cbqW}v(x$GkeXJF|^%D3GE^g7W#dIx1UJXG+&9#a_leU=7!3L}K zB_)Dc+3+It!|}e;NK?LB;<`!rNkXt8HYasTtp7!AvS(>IdD^qSj2RGd!({+t{DGoI zyJU9ZfJ!cc+4(xn?gj7K&lmm2_Qtj)@Tmbs<=-F9yy)z$TspHF3p2(5$j6*d{aJOz z@=YHzWMp&?XlY}KKo+o-nSyD#Y=afrjMAVaH1Mt!MM-DiiH>h?1w~+pmz$F&HaVShuO>^OJdy3$B$RvcFeUlxxi4&4xP?_FvOSX`d$>)D!I5B zfOzbZ_yJ8PNnq@8eBVR4SNuJXZ~2)uY=4#Fs>z>~{r+VK4{a+soN8$-Rw>^-P_)uY z#fb;O(pVALzQYP>;WT)zqH#%ZJrB;ES?REvb z=Z{b}1(VLtpjG9OK}1%(C!f3mE%W(Ck=={xw#39F@>B?CmDdo`r}5xK=C8w^9aR-y zYyodm^`E%s^`AeEU)2v(lD<<^f~kXs?J06ZzyoU)z1$ZU=u@Q<=}ioq(M%HIMgq18 zjLu3Ei);6_kRRQ(sohONn1b4DiC!61Vkp zv^CX`SpI7;a6&*k2k(~Xf|DqpylHS6=>a6xqNC0!SzrIa0fbG}g6M{6#%{8Fyjr&R z)*Ay{j#Glr@`xcKN8YC+sH#D909Y6SR&6l;tJ-*(Z~3d?IW|1!``K?o>sF?q$3-T> zBHEhBF{z1!Affx@^U|EsgxS4-!~W9oQyxKrlv$L#W$9J`B678f^tcTV*nq$3gDOM$ zQ{Qzy@TQ=!jguSx!o^uQ^Av!xQjD$ZX}dgTvH4zVQs1o5bcy^YaEuEAy7Agz;1W1S zPA~<{3Q3t8`<9N(mo0^8T}RFdAh4Pb;MTg@tXdlRWKdS!*iFVW&@wq@QlBpaI#AM$ zmdUx)6FO)j4ZIofgXVL?T6qx^m7D3SqB>jE*iL0%$__nm^%DZH58Th27sQD)w#?#b zWtraFnfI+Y240XvLp5Pf_)r3oRKt`52!H*EcqdU#_xD}=*d=B83Wh5O!brq{@sZL3 z)tynYsW26adI&&hwC2n3t>l(KF8WFbX;X^(w)6rU?by?DVyVT8mtTGPj|7+?;6NNI z!kQs|FiTtT4s@j6W@{WX%QNu`2Qv%(Y)ThA$JW^x&RBF?lC|=n4UeX%l`FX`lm2Q? zYM!5iedM_Ava5AMu0v5W*-^8g#TA2Yk`K#eS7x(D0s<(8?k_@uUl@99zukUNU}Sl% zZm86onWh=v*zlCjYcJ^uaMnGMpQ*&lOJ|(SblnWF2-g=_K2kg~AHT~o+0og^nEWZ?ll{;X6VnY9o-Dgid7Fyf~ z&`q9UFV%Hipw8Q`unlaGz=xm)VJaPR%9DSDa5i`i;dOgD@v0fKGI@IUh+|Zh#9QcC zDlXlQDtqEjohSW5FoCKC!IfAF6bs>wfDf`Es9a*h;Ye+vj6NxOQ3D{p{KNd0J7XW+ zAG}W3{?lil1#DV#YZuopBMc_)ZeHu}pZHT(-AcE@Ajgk36}F99pCFPnXwx;8Gd09D zy-b6VN?CmP5({M+XEc*v?Pnf{K3jZSq9FPa;{i#qg}-&{>lnv?k<_T|N+>-wjL2gPPh1d%`~sG+)5G{H36t@Kge-Dizqk|&r?G3sO#g4y0|p# zbGs}_znp)gU0M*9@^SKuT52Zf1f)T2hxuV#CcP$bK^OSJBDCQR)*^}Y`+1#jRIw;I zY&A^lnK$U3N7@=iXFV=CkdNUBa|sC0xmhS%a3nqXaaN%w`seoJ1c6Bbc;}eij3<#5 z)Qs$>*d!mWAhH*aAajW>o<@jiP?|dre0bA*5v#fUy?{`#C<O0kkhsMIcC%tZg9m|8&yP%SA+~3?#`|}2x+ejwPVvqbwT@<$BH0v zi2`ROqCpuehKJJHx`=egZq+Iok3ncDyeKu5Z06%yLly~g z8_Uki%T!z>i4rc+6I)UuE;56*8Z1A@_3g}APn1>tfU&u(E%2JUh$v7$1~1zk_1h1R zEtBw-ke!kr^RF7fnq{Q3h119ot;;l9WE`w>wx_@6$Me~Kak9~&Z`DtVqnArizLU72 zjr~x6pdWhj|vgCclU2giol@yfynN$}AU~<_>=CDmeE>=URG8ZBFyj4kXrkE>AE23HIj`hXv z6e0HI4Op{p0)JJ#Jt(d!8B6vojkvCa-j!^czZ51_xNAI7SY6;Bso!2)H#{0RoU|vH zbu#Zufh&s*Yd)fkhrPp?h_nhH+8o-W+1sGWp~FI3(h1-g1lV+C$` z%v$Aq73Ha9gSo`47`N>FLO)p(4x0$OZ3K(5Pr$f90tW%)_A#mnStV zT)0n6uQL4;ORJ->C2sewKS~|CghtUEF+qE!fwNmSaWV~%PHa3KZ$Az*ZNh6;EGPPX zbv%)vyJxW7KJ2z_?#|y)&xhC3RqJ2{|17{uh1a%2nTKDD>Xkg?C@U@XS^*tL1dns3 zu|G?+pd8JnuV*qky!=$;M*Q?ttK>-*mEVSzX&^P{@4MR}Dq{pz04?<7Es%*Uf?rFo zOLg9RH?a|sm%Mrzh(8-b-uTJ=?U~_P_iiU^vQ{Q-AIlAIbj_+|AKCZ4Q>hn%Stjc> zmMRvvRyIHHT*?i8#q2dYFmf5~zwe(V2ph9g;@l9oYb*Ua>0;)$jSmsQ^k%eE;ydLp z@@i=mCY%@*gru8U>{3(k^;`CaJgPj-2F;d_*sAR;2^ z{Kq+>gE|!SEP^lu%pl@$kkV-TH*c^1FDNk_ADn2|nPGl6g55KOBOk@{VzW#rg?_opT^F^}ALIs4he! zA}(3*WXadljWVSTf`C@u_gHk%&TB1mf^9|pG;IU|23yb6{KmT;x4O%90xla#DQz>k zE&WUTzuG87HnIZ5>dvsE$uw}m^!F*O;(L*nqhKzVtzF_V1l61Jt`(1=f^(b*#89|@ zG9Isn^8;afO((8vLMBgT%+v4%-zM3~zAp{<`ABtV zs8eamYe0+dk=*808^jnQ2WN?t5h(36>LLyOD7lOcXtr=_oWF}wgWuHf)vBi08)Ds+ zjZFH5VR~8CSH=n!({F2~p7xuB(mW;r&t~hmMJLwKTp$D8z%Nv6QWzV{36M*9vGvD9 zp#N#sLv z01HVz$pS;r%y508PII3bhThak>8zOMC6@a(9psCv_;j$*&gJv-PzZoF57NpfU!=-w z2s|)**ZsXbcYk=RG*0GQM&|yHf)ge4*WL@X%@Ay)Js{d!A$DQ$iQL|h2?Q4RwU8O?}$%(i~>p&V_`4nx<7?ZP-|)LY1ZKLC1t1g zvDKq)p0kU7uP1;ZS3{~qVn0F{>Y9pD1);Ugq{HfHp6CY^+doS>I*1m(Bs1HDyQdt< znSfn&5P>#bLtcz%?m?z@EOkpD5~KyqGux?Xi4}#4IlLdarv^?Mv$VxHogr*fkL6wP zndxj77c$jX=G`jClF`y|!LsE%zPQynNw_tCoGEjE!h8gEX^a>HB&aJnu8@eQaY-f5 zBS!q*L{Imyl!&PFfOQbD)yrA^x=~y`(@#`Qh`u#2vACXz;!71`M4ciIf)B_ajZCKG zgXcL_9JEcTJ+(TZYkN9wP^F}2_JLW!?(?G+Ynf7!Uz9Hm&mQ@iWcK;IHSX33a zxX`js1GI@?Ih)r{f`}hWUm%2Ee}&+`(@{1_)u~URgWYzVX;>@1ezf|xoU8RMkp7Wc z6cO<2&>ocSlZtsr?!sc(^LQ67ayKMS70>p84gAAYAbLFL zMI>MjwEGj((bGRGJ~a-%&E+`5xO{zlQ2^bApr)?lTVHCD1NX%I?g>|Qe1Hh2uIfq} z|7O@N3gL!g>phjCN`QNh>`4kLC^l&tJ{Xm_Kz_6Tluh1R?w%|)*xh@ux#Ng--{3)4 z`R(v|Ed&@YD75yMTl^4{3KbA$T|H~;em&yJrGk9DrGq*iAlh0CjGbEEm)R{#X49

n=yy@vRn3H$*Q{DUoxcPz27S}L3?5O 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 Oh(kxiK)piMDf)j2kde{= literal 0 HcmV?d00001 diff --git a/homeassistant/integration/virtual_carillon/brand/logo.png b/homeassistant/integration/virtual_carillon/brand/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4d6787da023feeee9de165d2fa576e135964c7 GIT binary patch literal 28132 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 C>8ex! literal 0 HcmV?d00001 diff --git a/homeassistant/integration/virtual_carillon/brand/logo@2x.png b/homeassistant/integration/virtual_carillon/brand/logo@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f1fccf1f6d5b1e16bec324eb89a2ff9dfdb86bea GIT binary patch literal 66354 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 S9~TGvQc_TRTJpps=zjrv%0XcO literal 0 HcmV?d00001 diff --git a/custom_components/virtual_carillon/config_flow.py b/homeassistant/integration/virtual_carillon/config_flow.py similarity index 100% rename from custom_components/virtual_carillon/config_flow.py rename to homeassistant/integration/virtual_carillon/config_flow.py diff --git a/custom_components/virtual_carillon/const.py b/homeassistant/integration/virtual_carillon/const.py similarity index 100% rename from custom_components/virtual_carillon/const.py rename to homeassistant/integration/virtual_carillon/const.py diff --git a/custom_components/virtual_carillon/coordinator.py b/homeassistant/integration/virtual_carillon/coordinator.py similarity index 100% rename from custom_components/virtual_carillon/coordinator.py rename to homeassistant/integration/virtual_carillon/coordinator.py diff --git a/custom_components/virtual_carillon/manifest.json b/homeassistant/integration/virtual_carillon/manifest.json similarity index 91% rename from custom_components/virtual_carillon/manifest.json rename to homeassistant/integration/virtual_carillon/manifest.json index 3045e472..c8215b4d 100644 --- a/custom_components/virtual_carillon/manifest.json +++ b/homeassistant/integration/virtual_carillon/manifest.json @@ -1,7 +1,7 @@ { "domain": "virtual_carillon", "name": "Virtual Carillon", - "version": "0.1.0-beta.1", + "version": "0.1.0-beta.2", "documentation": "https://github.com/HPaulson/virtual-carillon", "issue_tracker": "https://github.com/HPaulson/virtual-carillon/issues", "codeowners": [], diff --git a/custom_components/virtual_carillon/media_source.py b/homeassistant/integration/virtual_carillon/media_source.py similarity index 100% rename from custom_components/virtual_carillon/media_source.py rename to homeassistant/integration/virtual_carillon/media_source.py diff --git a/custom_components/virtual_carillon/schedule_runner.py b/homeassistant/integration/virtual_carillon/schedule_runner.py similarity index 100% rename from custom_components/virtual_carillon/schedule_runner.py rename to homeassistant/integration/virtual_carillon/schedule_runner.py diff --git a/custom_components/virtual_carillon/sensor.py b/homeassistant/integration/virtual_carillon/sensor.py similarity index 100% rename from custom_components/virtual_carillon/sensor.py rename to homeassistant/integration/virtual_carillon/sensor.py diff --git a/custom_components/virtual_carillon/services.yaml b/homeassistant/integration/virtual_carillon/services.yaml similarity index 100% rename from custom_components/virtual_carillon/services.yaml rename to homeassistant/integration/virtual_carillon/services.yaml diff --git a/custom_components/virtual_carillon/strings.json b/homeassistant/integration/virtual_carillon/strings.json similarity index 100% rename from custom_components/virtual_carillon/strings.json rename to homeassistant/integration/virtual_carillon/strings.json diff --git a/custom_components/virtual_carillon/translations/en.json b/homeassistant/integration/virtual_carillon/translations/en.json similarity index 100% rename from custom_components/virtual_carillon/translations/en.json rename to homeassistant/integration/virtual_carillon/translations/en.json diff --git a/package.json b/package.json index 86898286..d9bb234b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "virtual-carillon", - "version": "0.1.0-beta.1", + "version": "0.1.0-beta.2", "description": "A virtual carillon with Catholic bells, hymn arrangements, and Home Assistant integration.", "license": "MIT", "repository": { @@ -21,12 +21,12 @@ "type": "module", "packageManager": "pnpm@10.29.2", "bin": { - "virtual-carillon": "bin/virtual-carillon.mjs" + "virtual-carillon": "engine/bin/virtual-carillon.mjs" }, "files": [ - "dist", - "bin", - "custom_components", + "engine/dist", + "engine/bin", + "homeassistant", "README.md", "LICENSE" ], @@ -35,8 +35,8 @@ }, "scripts": { "build": "node scripts/build.mjs", - "dev": "tsx src/cli/index.ts server", - "start": "node dist/cli/index.js server", + "dev": "tsx engine/src/cli/index.ts server", + "start": "node engine/dist/cli/index.js server", "test": "vitest run", "test:watch": "vitest", "typecheck": "tsc --noEmit", diff --git a/repository.yaml b/repository.yaml index 5ccd78e4..2580dfd1 100644 --- a/repository.yaml +++ b/repository.yaml @@ -1,3 +1,3 @@ -name: Virtual Carillon Home Assistant apps +name: Virtual Carillon url: https://github.com/HPaulson/virtual-carillon maintainer: HPaulson diff --git a/scripts/build.mjs b/scripts/build.mjs index 893d1be4..9f9c90c6 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -1,4 +1,4 @@ -// Clear generated audio cache and compile the TypeScript application to dist/. +// Clear generated audio cache and compile the TypeScript engine to engine/dist/. import { rm } from 'node:fs/promises'; import path from 'node:path'; @@ -8,18 +8,13 @@ const projectRoot = process.cwd(); await rm(path.join(projectRoot, '.data', 'cache'), { recursive: true, force: true }); const tsc = process.platform === 'win32' ? 'tsc.cmd' : 'tsc'; -const compiler = spawn(tsc, ['-p', 'tsconfig.json'], { cwd: projectRoot, stdio: 'inherit' }); +await new Promise((resolve, reject) => { + const compiler = spawn(tsc, ['-p', 'tsconfig.json'], { cwd: projectRoot, stdio: 'inherit' }); -compiler.on('error', (error) => { - console.error(error); - process.exitCode = 1; -}); - -compiler.on('exit', (code, signal) => { - if (signal) { - console.error(`TypeScript compiler terminated with ${signal}`); - process.exitCode = 1; - } else if (code !== 0) { - process.exitCode = code ?? 1; - } + compiler.on('error', reject); + compiler.on('exit', (code, signal) => { + if (signal) reject(new Error(`TypeScript compiler terminated with ${signal}`)); + else if (code !== 0) reject(new Error(`TypeScript compiler exited with code ${code}`)); + else resolve(); + }); }); diff --git a/scripts/check-ci.mjs b/scripts/check-ci.mjs index d90d8e19..14aa1f34 100644 --- a/scripts/check-ci.mjs +++ b/scripts/check-ci.mjs @@ -30,8 +30,8 @@ async function check(label, callback) { } function checkPythonMetadata() { - run('python3', ['-m', 'compileall', '-q', 'custom_components/virtual_carillon']); - run('python3', ['-m', 'json.tool', 'custom_components/virtual_carillon/manifest.json']); + run('python3', ['-m', 'compileall', '-q', 'homeassistant/integration/virtual_carillon']); + run('python3', ['-m', 'json.tool', 'homeassistant/integration/virtual_carillon/manifest.json']); run('python3', ['-m', 'json.tool', 'hacs.json']); } diff --git a/scripts/check-release.mjs b/scripts/check-release.mjs index 991f0940..bbb21a2c 100644 --- a/scripts/check-release.mjs +++ b/scripts/check-release.mjs @@ -14,7 +14,7 @@ if (packageJson.version !== expectedVersion) { } const manifest = JSON.parse( - await readFile('custom_components/virtual_carillon/manifest.json', 'utf8'), + await readFile('homeassistant/integration/virtual_carillon/manifest.json', 'utf8'), ); if (manifest.version !== expectedVersion) { failures.push(`Home Assistant manifest is ${manifest.version}, expected ${expectedVersion}`); diff --git a/scripts/push-live.sh b/scripts/push-live.sh index 1329c367..52496a71 100755 --- a/scripts/push-live.sh +++ b/scripts/push-live.sh @@ -44,7 +44,7 @@ COPYFILE_DISABLE=1 tar \ --exclude='virtual_carillon/__pycache__' \ --exclude='virtual_carillon/**/*.pyc' \ -czf "$LOCAL_ARCHIVE" \ - -C "$ROOT_DIR/custom_components" \ + -C "$ROOT_DIR/homeassistant/integration" \ virtual_carillon scp "$LOCAL_ARCHIVE" "$REMOTE_HOST:$REMOTE_ARCHIVE" ssh "$REMOTE_HOST" "docker cp '$REMOTE_ARCHIVE' '$HA_CONTAINER:/tmp/virtual-carillon-ha.tar.gz'" @@ -66,7 +66,7 @@ COPYFILE_DISABLE=1 tar \ --exclude='*.sqlite-wal' \ -czf "$ENGINE_ARCHIVE" \ -C "$ROOT_DIR" \ - Dockerfile package.json pnpm-lock.yaml tsconfig.json eslint.config.mjs .prettierrc.json scripts src bin homeassistant README.md LICENSE + Dockerfile package.json pnpm-lock.yaml tsconfig.json eslint.config.mjs .prettierrc.json scripts engine homeassistant README.md LICENSE scp "$ENGINE_ARCHIVE" "$REMOTE_HOST:$REMOTE_ENGINE_ARCHIVE" echo "==> Rebuilding and restarting the Virtual Carillon engine" diff --git a/scripts/render-branding.swift b/scripts/render-branding.swift new file mode 100644 index 00000000..3bc6aadf --- /dev/null +++ b/scripts/render-branding.swift @@ -0,0 +1,146 @@ +import AppKit +import CoreGraphics +import CoreText +import Foundation +import ImageIO + +let navy = CGColor(red: 16.0 / 255.0, green: 36.0 / 255.0, blue: 59.0 / 255.0, alpha: 1) +let gold = CGColor(red: 242.0 / 255.0, green: 199.0 / 255.0, blue: 92.0 / 255.0, alpha: 1) +let ivory = CGColor(red: 1, green: 250.0 / 255.0, blue: 240.0 / 255.0, alpha: 1) + +struct Output { + let path: String + let width: Int + let height: Int +} + +let outputs = [ + Output(path: "homeassistant/app/icon.png", width: 128, height: 128), + Output(path: "homeassistant/app/logo.png", width: 250, height: 100), + Output(path: "homeassistant/integration/virtual_carillon/brand/icon.png", width: 256, height: 256), + Output(path: "homeassistant/integration/virtual_carillon/brand/icon@2x.png", width: 512, height: 512), + Output(path: "homeassistant/integration/virtual_carillon/brand/logo.png", width: 640, height: 256), + Output(path: "homeassistant/integration/virtual_carillon/brand/logo@2x.png", width: 1280, height: 512), +] + +func point(_ x: CGFloat, _ y: CGFloat) -> CGPoint { CGPoint(x: x, y: y) } + +func bellPath() -> CGPath { + let path = CGMutablePath() + path.move(to: point(128, 42)) + path.addCurve(to: point(79, 92), control1: point(101, 42), control2: point(79, 64)) + path.addLine(to: point(79, 122)) + path.addCurve(to: point(60, 170), control1: point(79, 141), control2: point(73, 156)) + path.addLine(to: point(53, 178)) + path.addCurve(to: point(60, 192), control1: point(48, 184), control2: point(52, 192)) + path.addLine(to: point(196, 192)) + path.addCurve(to: point(203, 178), control1: point(208, 192), control2: point(208, 184)) + path.addLine(to: point(196, 170)) + path.addCurve(to: point(177, 122), control1: point(183, 156), control2: point(177, 141)) + path.addLine(to: point(177, 92)) + path.addCurve(to: point(128, 42), control1: point(177, 64), control2: point(155, 42)) + path.closeSubpath() + return path +} + +func roundedLine(_ context: CGContext, from: CGPoint, to: CGPoint, width: CGFloat, color: CGColor) { + context.setStrokeColor(color) + context.setLineWidth(width) + context.setLineCap(.round) + context.beginPath() + context.move(to: from) + context.addLine(to: to) + context.strokePath() +} + +func drawMark(_ context: CGContext) { + context.setFillColor(navy) + context.fillEllipse(in: CGRect(x: 8, y: 8, width: 240, height: 240)) + + context.setStrokeColor(CGColor(red: 242.0 / 255.0, green: 199.0 / 255.0, blue: 92.0 / 255.0, alpha: 0.24)) + context.setLineWidth(2) + context.strokeEllipse(in: CGRect(x: 17, y: 17, width: 222, height: 222)) + + context.setFillColor(gold) + context.addPath(bellPath()) + context.fillPath() + + roundedLine(context, from: point(82, 181), to: point(174, 181), width: 7, color: navy) + let clapper = CGMutablePath() + clapper.move(to: point(112, 196)) + clapper.addCurve(to: point(128, 211), control1: point(115, 206), control2: point(121, 211)) + clapper.addCurve(to: point(144, 196), control1: point(135, 211), control2: point(141, 206)) + context.setStrokeColor(gold) + context.setLineWidth(9) + context.setLineCap(.round) + context.addPath(clapper) + context.strokePath() + + // A Latin cross: the lower stem is intentionally longer than the upper arm. + roundedLine(context, from: point(128, 61), to: point(128, 138), width: 11, color: navy) + roundedLine(context, from: point(104, 88), to: point(152, 88), width: 11, color: navy) + +} + +func drawWordmark(_ context: CGContext) { + let card = CGRect(x: 286, y: 72, width: 332, height: 111) + context.setFillColor(ivory) + context.addPath(roundedRectPath(card, radius: 26)) + context.fillPath() + context.setStrokeColor(CGColor(red: 16.0 / 255.0, green: 36.0 / 255.0, blue: 59.0 / 255.0, alpha: 0.12)) + context.setLineWidth(2) + context.addPath(roundedRectPath(card, radius: 26)) + context.strokePath() + + let font = CTFontCreateWithName("Helvetica Neue" as CFString, 39, nil) + let attributes: [NSAttributedString.Key: Any] = [ + NSAttributedString.Key(kCTFontAttributeName as String): font, + NSAttributedString.Key(kCTForegroundColorAttributeName as String): navy, + ] + let line = CTLineCreateWithAttributedString(NSAttributedString(string: "Virtual Carillon", attributes: attributes)) + context.textPosition = point(307, 117) + CTLineDraw(line, context) + roundedLine(context, from: point(308, 98), to: point(522, 98), width: 6, color: CGColor(red: 211.0 / 255.0, green: 155.0 / 255.0, blue: 42.0 / 255.0, alpha: 1)) +} + +func roundedRectPath(_ rect: CGRect, radius: CGFloat) -> CGPath { + CGPath(roundedRect: rect, cornerWidth: radius, cornerHeight: radius, transform: nil) +} + +func writePNG(_ output: Output) { + guard let context = CGContext( + data: nil, + width: output.width, + height: output.height, + bitsPerComponent: 8, + bytesPerRow: output.width * 4, + space: CGColorSpace(name: CGColorSpace.sRGB)!, + bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue + ) else { fatalError("Could not create bitmap context") } + + context.clear(CGRect(x: 0, y: 0, width: output.width, height: output.height)) + let scale = CGFloat(output.height) / 256 + context.saveGState() + context.scaleBy(x: scale, y: scale) + context.saveGState() + context.translateBy(x: 0, y: 256) + context.scaleBy(x: 1, y: -1) + drawMark(context) + context.restoreGState() + if output.width > 256 { + drawWordmark(context) + } + context.restoreGState() + + guard let image = context.makeImage() else { fatalError("Could not create image") } + let url = URL(fileURLWithPath: output.path) + guard let destination = CGImageDestinationCreateWithURL(url as CFURL, "public.png" as CFString, 1, nil) else { + fatalError("Could not create PNG destination for \(output.path)") + } + CGImageDestinationAddImage(destination, image, nil) + guard CGImageDestinationFinalize(destination) else { fatalError("Could not write \(output.path)") } +} + +for output in outputs { + writePNG(output) +} diff --git a/tsconfig.json b/tsconfig.json index f658c516..877235f2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,8 +3,8 @@ "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", - "outDir": "dist", - "rootDir": "src", + "outDir": "engine/dist", + "rootDir": "engine/src", "strict": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, @@ -12,6 +12,6 @@ "declaration": true, "sourceMap": true }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist"] + "include": ["engine/src/**/*.ts"], + "exclude": ["node_modules", "engine/dist"] } From a6af40643a00df2c0cc7ba1970b2510052e8c593 Mon Sep 17 00:00:00 2001 From: Hunter Paulson Date: Fri, 4 Sep 2026 02:27:31 -0400 Subject: [PATCH 2/5] Flatten Home Assistant integration layout --- CONTRIBUTING.md | 4 +-- README.md | 8 +++--- docs/architecture.md | 26 +++++++++--------- docs/development.md | 4 +-- homeassistant/app/config.yaml | 2 +- .../{virtual_carillon => }/README.md | 0 .../{virtual_carillon => }/__init__.py | 0 .../{virtual_carillon => }/brand/icon.png | Bin .../{virtual_carillon => }/brand/icon@2x.png | Bin .../{virtual_carillon => }/brand/logo.png | Bin .../{virtual_carillon => }/brand/logo@2x.png | Bin .../{virtual_carillon => }/config_flow.py | 0 .../{virtual_carillon => }/const.py | 0 .../{virtual_carillon => }/coordinator.py | 0 .../{virtual_carillon => }/manifest.json | 0 .../{virtual_carillon => }/media_source.py | 0 .../{virtual_carillon => }/schedule_runner.py | 0 .../{virtual_carillon => }/sensor.py | 0 .../{virtual_carillon => }/services.yaml | 0 .../{virtual_carillon => }/strings.json | 0 .../translations/en.json | 0 scripts/check-ci.mjs | 4 +-- scripts/check-release.mjs | 4 +-- scripts/push-live.sh | 9 +++--- 24 files changed, 30 insertions(+), 31 deletions(-) rename homeassistant/integration/{virtual_carillon => }/README.md (100%) rename homeassistant/integration/{virtual_carillon => }/__init__.py (100%) rename homeassistant/integration/{virtual_carillon => }/brand/icon.png (100%) rename homeassistant/integration/{virtual_carillon => }/brand/icon@2x.png (100%) rename homeassistant/integration/{virtual_carillon => }/brand/logo.png (100%) rename homeassistant/integration/{virtual_carillon => }/brand/logo@2x.png (100%) rename homeassistant/integration/{virtual_carillon => }/config_flow.py (100%) rename homeassistant/integration/{virtual_carillon => }/const.py (100%) rename homeassistant/integration/{virtual_carillon => }/coordinator.py (100%) rename homeassistant/integration/{virtual_carillon => }/manifest.json (100%) rename homeassistant/integration/{virtual_carillon => }/media_source.py (100%) rename homeassistant/integration/{virtual_carillon => }/schedule_runner.py (100%) rename homeassistant/integration/{virtual_carillon => }/sensor.py (100%) rename homeassistant/integration/{virtual_carillon => }/services.yaml (100%) rename homeassistant/integration/{virtual_carillon => }/strings.json (100%) rename homeassistant/integration/{virtual_carillon => }/translations/en.json (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d1448aad..a2708b96 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -57,7 +57,7 @@ Run the same combined checks locally with `pnpm ci:check` before requesting revi ## Development deployment helper -`scripts/push-live.sh` is available for testing Home Assistant integration changes on a configured remote Docker installation. It type-checks the project, copies the current working tree’s `homeassistant/integration/virtual_carillon` directory into the target Home Assistant container’s `/config/custom_components/virtual_carillon` location over SSH, restarts the container, and waits for it to become healthy. +`scripts/push-live.sh` is available for testing Home Assistant integration changes on a configured remote Docker installation. It type-checks the project, copies the current working tree’s `homeassistant/integration` directory into the target Home Assistant container’s `/config/custom_components/virtual_carillon` location over SSH, restarts the container, and waits for it to become healthy. It reads `REMOTE_HOST` and `HA_CONTAINER` from a local ignored `dev.env` file. This is a development convenience, not a substitute for CI or the release process. Check the current branch, working tree, remote host, and target container before running it. It does not deploy the engine container or publish a release. @@ -65,7 +65,7 @@ It reads `REMOTE_HOST` and `HA_CONTAINER` from a local ignored `dev.env` file. T ## Releases -Release versions must agree in `package.json`, `homeassistant/integration/virtual_carillon/manifest.json`, `homeassistant/app/config.yaml`, and `Dockerfile`. Run: +Release versions must agree in `package.json`, `homeassistant/integration/manifest.json`, `homeassistant/app/config.yaml`, and `Dockerfile`. Run: ```bash pnpm release:check diff --git a/README.md b/README.md index 4125ee7e..898f247b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Virtual Carillon

- Virtual Carillon + Virtual Carillon

-Virtual Carillon turns your speakers into a programmable carillon. Play a bell, signal, or liturgically-appropriate Catholic hymn whenever you like. +Virtual Carillon turns your speakers into a programmable Church carillon. Use it with Home Assistant to build routines such as: @@ -42,7 +42,7 @@ Use this path when your Home Assistant installation has **Settings → Apps**. I 3. Open the app’s **Configuration** tab. Set **API token** to a long, unique private value, choose **Save**, and restart the app if Home Assistant asks. 4. Install the integration: - - **Manual installation:** copy this repository’s `homeassistant/integration/virtual_carillon` directory to `/config/custom_components/virtual_carillon/`, then restart Home Assistant. + - **Manual installation:** copy this repository’s `homeassistant/integration` directory to `/config/custom_components/virtual_carillon/`, then restart Home Assistant. 5. Open **Settings → Devices & services → Add integration**, search for **Virtual Carillon**, and enter: @@ -80,7 +80,7 @@ Use this path when Home Assistant itself runs in a Docker container. Virtual Car The `virtual-carillon_default` network is created by the command in step 3. Once both containers share it, Home Assistant can reach the engine as `http://virtual-carillon:9876`. Keep this connection in your own Compose configuration if you recreate the Home Assistant container. -5. Copy this repository’s `homeassistant/integration/virtual_carillon` directory to `/config/custom_components/virtual_carillon/`, then restart Home Assistant. HACS custom repositories currently require the integration under a repository-root `custom_components/` directory, so this source layout is intentionally installed manually. +5. Copy this repository’s `homeassistant/integration` directory to `/config/custom_components/virtual_carillon/`, then restart Home Assistant. HACS custom repositories currently require the integration under a repository-root `custom_components/` directory, so this source layout is intentionally installed manually. 6. Open **Settings → Devices & services → Add integration**, search for **Virtual Carillon**, and enter: - **Engine URL:** `http://virtual-carillon:9876` diff --git a/docs/architecture.md b/docs/architecture.md index 3b2e13f8..61e25d57 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -18,19 +18,19 @@ The standard Home Assistant path is deliberately speaker-agnostic. The integrati ## Main modules -| Path | Responsibility | -| --------------------------------------------- | ------------------------------------------------------------------------------------------------------ | -| `engine/src/cli/` | Command-line entry point, hymn-cycle commands, and automatic-selection preview. | -| `engine/src/configuration/` | Environment settings and default data paths. | -| `engine/src/api/` | Fastify HTTP API, authentication, direct playback, and schedule handoff. | -| `engine/src/scheduling/` | Schedule validation, normalization, time windows, Westminster matching, and target rules. | -| `engine/src/database/` | SQLite storage for schedules, claims, events, and completed-hymn history. | -| `engine/src/audio/` and `engine/src/bells/` | Bell synthesis, WAV rendering, distance profiles, local-output discovery, and native playback. | -| `engine/src/library/` | Bundled assets, imported recordings, hymn catalog, metadata, rendering, and playback. | -| `engine/src/liturgical/` | LitCal retrieval and caching, calendar normalization, taxonomy, conditions, and hymn-query conversion. | -| `engine/tests/` | Automated tests for the engine’s API, audio, library, liturgical, notation, and scheduling behavior. | -| `homeassistant/integration/virtual_carillon/` | Home Assistant config flow, coordinator, schedule runner, media source, services, and status sensor. | -| `homeassistant/app/` | Supervisor app definition and entrypoint. | +| Path | Responsibility | +| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | +| `engine/src/cli/` | Command-line entry point, hymn-cycle commands, and automatic-selection preview. | +| `engine/src/configuration/` | Environment settings and default data paths. | +| `engine/src/api/` | Fastify HTTP API, authentication, direct playback, and schedule handoff. | +| `engine/src/scheduling/` | Schedule validation, normalization, time windows, Westminster matching, and target rules. | +| `engine/src/database/` | SQLite storage for schedules, claims, events, and completed-hymn history. | +| `engine/src/audio/` and `engine/src/bells/` | Bell synthesis, WAV rendering, distance profiles, local-output discovery, and native playback. | +| `engine/src/library/` | Bundled assets, imported recordings, hymn catalog, metadata, rendering, and playback. | +| `engine/src/liturgical/` | LitCal retrieval and caching, calendar normalization, taxonomy, conditions, and hymn-query conversion. | +| `engine/tests/` | Automated tests for the engine’s API, audio, library, liturgical, notation, and scheduling behavior. | +| `homeassistant/integration/` | Home Assistant integration config flow, coordinator, schedule runner, media source, services, status sensor, and branding. | +| `homeassistant/app/` | Supervisor app definition and entrypoint. | ## Data directory diff --git a/docs/development.md b/docs/development.md index be62a9fd..d66d2ebb 100644 --- a/docs/development.md +++ b/docs/development.md @@ -100,7 +100,7 @@ node engine/dist/cli/index.js schedule show ### `scripts/push-live.sh` -This script deploys the current working tree’s engine and Home Assistant integration to a remote Docker-based installation. It runs pnpm typecheck, archives `homeassistant/integration/virtual_carillon`, installs it into Home Assistant’s runtime `/config/custom_components/virtual_carillon` location, builds the engine image on the remote host for its architecture, and force-recreates the engine through its existing Compose project. It then restarts Home Assistant and waits for the Home Assistant health check. The engine’s persistent data volume is preserved and not modified. This is useful for live-testing the integration, though a local Home Assistant instance may also be used. The first run may take several minutes because the image installs FFmpeg and its dependencies. +This script deploys the current working tree’s engine and Home Assistant integration to a remote Docker-based installation. It runs pnpm typecheck, archives `homeassistant/integration`, installs it into Home Assistant’s runtime `/config/custom_components/virtual_carillon` location, builds the engine image on the remote host for its architecture, and force-recreates the engine through its existing Compose project. It then restarts Home Assistant and waits for the Home Assistant health check. The engine’s persistent data volume is preserved and not modified. This is useful for live-testing the integration, though a local Home Assistant instance may also be used. The first run may take several minutes because the image installs FFmpeg and its dependencies. Create a local, ignored `dev.env` with at least: @@ -168,7 +168,7 @@ Keep the major boundaries intact: audio synthesis, the asset library, persistenc The project version is duplicated intentionally for the package, Home Assistant integration, Home Assistant app, and container metadata. These values must agree in: - `package.json` (`version`); -- `homeassistant/integration/virtual_carillon/manifest.json` (`version`); +- `homeassistant/integration/manifest.json` (`version`); - `homeassistant/app/config.yaml` (`version`); and - `Dockerfile` (`ARG BUILD_VERSION`). diff --git a/homeassistant/app/config.yaml b/homeassistant/app/config.yaml index 29feccc1..347fa81b 100644 --- a/homeassistant/app/config.yaml +++ b/homeassistant/app/config.yaml @@ -1,7 +1,7 @@ name: Virtual Carillon version: 0.1.0-beta.2 slug: virtual_carillon -description: Bells, traditional signals, and Catholic hymn arrangements for Home Assistant +description: Virtual Carillon turns your speakers into a programmable carillon. Play Westminster Chimes, the Angelus, and liturgically-appropriate Catholic hymns. url: https://github.com/HPaulson/virtual-carillon image: ghcr.io/hpaulson/virtual-carillon arch: diff --git a/homeassistant/integration/virtual_carillon/README.md b/homeassistant/integration/README.md similarity index 100% rename from homeassistant/integration/virtual_carillon/README.md rename to homeassistant/integration/README.md diff --git a/homeassistant/integration/virtual_carillon/__init__.py b/homeassistant/integration/__init__.py similarity index 100% rename from homeassistant/integration/virtual_carillon/__init__.py rename to homeassistant/integration/__init__.py diff --git a/homeassistant/integration/virtual_carillon/brand/icon.png b/homeassistant/integration/brand/icon.png similarity index 100% rename from homeassistant/integration/virtual_carillon/brand/icon.png rename to homeassistant/integration/brand/icon.png diff --git a/homeassistant/integration/virtual_carillon/brand/icon@2x.png b/homeassistant/integration/brand/icon@2x.png similarity index 100% rename from homeassistant/integration/virtual_carillon/brand/icon@2x.png rename to homeassistant/integration/brand/icon@2x.png diff --git a/homeassistant/integration/virtual_carillon/brand/logo.png b/homeassistant/integration/brand/logo.png similarity index 100% rename from homeassistant/integration/virtual_carillon/brand/logo.png rename to homeassistant/integration/brand/logo.png diff --git a/homeassistant/integration/virtual_carillon/brand/logo@2x.png b/homeassistant/integration/brand/logo@2x.png similarity index 100% rename from homeassistant/integration/virtual_carillon/brand/logo@2x.png rename to homeassistant/integration/brand/logo@2x.png diff --git a/homeassistant/integration/virtual_carillon/config_flow.py b/homeassistant/integration/config_flow.py similarity index 100% rename from homeassistant/integration/virtual_carillon/config_flow.py rename to homeassistant/integration/config_flow.py diff --git a/homeassistant/integration/virtual_carillon/const.py b/homeassistant/integration/const.py similarity index 100% rename from homeassistant/integration/virtual_carillon/const.py rename to homeassistant/integration/const.py diff --git a/homeassistant/integration/virtual_carillon/coordinator.py b/homeassistant/integration/coordinator.py similarity index 100% rename from homeassistant/integration/virtual_carillon/coordinator.py rename to homeassistant/integration/coordinator.py diff --git a/homeassistant/integration/virtual_carillon/manifest.json b/homeassistant/integration/manifest.json similarity index 100% rename from homeassistant/integration/virtual_carillon/manifest.json rename to homeassistant/integration/manifest.json diff --git a/homeassistant/integration/virtual_carillon/media_source.py b/homeassistant/integration/media_source.py similarity index 100% rename from homeassistant/integration/virtual_carillon/media_source.py rename to homeassistant/integration/media_source.py diff --git a/homeassistant/integration/virtual_carillon/schedule_runner.py b/homeassistant/integration/schedule_runner.py similarity index 100% rename from homeassistant/integration/virtual_carillon/schedule_runner.py rename to homeassistant/integration/schedule_runner.py diff --git a/homeassistant/integration/virtual_carillon/sensor.py b/homeassistant/integration/sensor.py similarity index 100% rename from homeassistant/integration/virtual_carillon/sensor.py rename to homeassistant/integration/sensor.py diff --git a/homeassistant/integration/virtual_carillon/services.yaml b/homeassistant/integration/services.yaml similarity index 100% rename from homeassistant/integration/virtual_carillon/services.yaml rename to homeassistant/integration/services.yaml diff --git a/homeassistant/integration/virtual_carillon/strings.json b/homeassistant/integration/strings.json similarity index 100% rename from homeassistant/integration/virtual_carillon/strings.json rename to homeassistant/integration/strings.json diff --git a/homeassistant/integration/virtual_carillon/translations/en.json b/homeassistant/integration/translations/en.json similarity index 100% rename from homeassistant/integration/virtual_carillon/translations/en.json rename to homeassistant/integration/translations/en.json diff --git a/scripts/check-ci.mjs b/scripts/check-ci.mjs index 14aa1f34..464667a7 100644 --- a/scripts/check-ci.mjs +++ b/scripts/check-ci.mjs @@ -30,8 +30,8 @@ async function check(label, callback) { } function checkPythonMetadata() { - run('python3', ['-m', 'compileall', '-q', 'homeassistant/integration/virtual_carillon']); - run('python3', ['-m', 'json.tool', 'homeassistant/integration/virtual_carillon/manifest.json']); + run('python3', ['-m', 'compileall', '-q', 'homeassistant/integration']); + run('python3', ['-m', 'json.tool', 'homeassistant/integration/manifest.json']); run('python3', ['-m', 'json.tool', 'hacs.json']); } diff --git a/scripts/check-release.mjs b/scripts/check-release.mjs index bbb21a2c..9710de00 100644 --- a/scripts/check-release.mjs +++ b/scripts/check-release.mjs @@ -13,9 +13,7 @@ if (packageJson.version !== expectedVersion) { failures.push(`package.json is ${packageJson.version}, expected ${expectedVersion}`); } -const manifest = JSON.parse( - await readFile('homeassistant/integration/virtual_carillon/manifest.json', 'utf8'), -); +const manifest = JSON.parse(await readFile('homeassistant/integration/manifest.json', 'utf8')); if (manifest.version !== expectedVersion) { failures.push(`Home Assistant manifest is ${manifest.version}, expected ${expectedVersion}`); } diff --git a/scripts/push-live.sh b/scripts/push-live.sh index 52496a71..982c922c 100755 --- a/scripts/push-live.sh +++ b/scripts/push-live.sh @@ -41,14 +41,15 @@ COPYFILE_DISABLE=1 tar \ --no-fflags \ --exclude='._*' \ --exclude='*/._*' \ - --exclude='virtual_carillon/__pycache__' \ - --exclude='virtual_carillon/**/*.pyc' \ + --exclude='__pycache__' \ + --exclude='**/*.pyc' \ -czf "$LOCAL_ARCHIVE" \ -C "$ROOT_DIR/homeassistant/integration" \ - virtual_carillon + . scp "$LOCAL_ARCHIVE" "$REMOTE_HOST:$REMOTE_ARCHIVE" ssh "$REMOTE_HOST" "docker cp '$REMOTE_ARCHIVE' '$HA_CONTAINER:/tmp/virtual-carillon-ha.tar.gz'" -ssh "$REMOTE_HOST" "docker exec '$HA_CONTAINER' tar --extract --gzip --no-same-owner --no-same-permissions --file=/tmp/virtual-carillon-ha.tar.gz --directory=/config/custom_components" +ssh "$REMOTE_HOST" "docker exec '$HA_CONTAINER' mkdir -p /config/custom_components/virtual_carillon" +ssh "$REMOTE_HOST" "docker exec '$HA_CONTAINER' tar --extract --gzip --no-same-owner --no-same-permissions --file=/tmp/virtual-carillon-ha.tar.gz --directory=/config/custom_components/virtual_carillon" ssh "$REMOTE_HOST" "docker exec '$HA_CONTAINER' rm -f /tmp/virtual-carillon-ha.tar.gz" echo "==> Building the current engine source archive" From b9a17202afa64b3922ea83f590562864ad4bbf39 Mon Sep 17 00:00:00 2001 From: Hunter Paulson Date: Fri, 4 Sep 2026 02:42:44 -0400 Subject: [PATCH 3/5] Doc cleanup --- .env.example | 27 ++++++++-- CONTRIBUTING.md | 2 +- README.md | 11 +++-- docs/README.md | 26 ---------- docs/architecture.md | 70 -------------------------- docs/configuration.md | 32 ------------ docs/content.md | 46 ----------------- docs/development.md | 40 +++++++++++++-- docs/docker.md | 50 ------------------- docs/operations.md | 77 ----------------------------- docs/roadmap.md | 9 ---- docs/testing.md | 66 ------------------------- homeassistant/app/DOCS.md | 2 +- homeassistant/app/README.md | 15 ------ homeassistant/integration/README.md | 12 ----- 15 files changed, 69 insertions(+), 416 deletions(-) delete mode 100644 docs/README.md delete mode 100644 docs/architecture.md delete mode 100644 docs/configuration.md delete mode 100644 docs/content.md delete mode 100644 docs/docker.md delete mode 100644 docs/operations.md delete mode 100644 docs/roadmap.md delete mode 100644 docs/testing.md delete mode 100644 homeassistant/app/README.md delete mode 100644 homeassistant/integration/README.md diff --git a/.env.example b/.env.example index 6e0033ca..0f6f81d3 100644 --- a/.env.example +++ b/.env.example @@ -1,13 +1,32 @@ -# Docker Compose defaults. Copy this file to .env and set a long, private API -# token. The supplied Compose file keeps the API inside its Docker network. +# Docker Compose defaults. Copy this file to .env, then set a long, private API +# token. Home Assistant app users set the equivalent values in the app's +# Configuration tab instead. The supplied Compose file keeps the API inside +# its Docker network; the integration must be able to reach this address. +# +# Listen address and port. Keep HOST as 0.0.0.0 in the container so Home +# Assistant can connect. PORT is also the port used in the integration URL. VIRTUAL_CARILLON_HOST=0.0.0.0 VIRTUAL_CARILLON_PORT=9876 + +# Persistent runtime data: the SQLite schedule/history, imported recordings, +# LitCal cache, and rendered audio cache. Do not point this at source control. VIRTUAL_CARILLON_DATA_DIR=/app/.data + +# Bearer token for every /api/* request. /health remains public for health +# checks. Set this before allowing anything beyond a trusted local network. VIRTUAL_CARILLON_API_TOKEN= + +# Default acoustic character for generated bells and hymns. Valid profiles are +# near, church-grounds, quarter-mile, half-mile, and one-mile. Home Assistant +# schedules can choose the same profiles in the integration settings. VIRTUAL_CARILLON_DISTANCE_PROFILE=half-mile + +# Generated WAV sample rate. Valid values are 44100 and 48000 Hz. VIRTUAL_CARILLON_SAMPLE_RATE=44100 -# LitCal connection defaults. Automatic Home Assistant routines always use -# LitCal; each Home Assistant schedule stores its selected calendar. +# LitCal connection. The URL should point to a compatible Liturgical Calendar +# API. The calendar here is the default for CLI/API requests; each Home +# Assistant schedule stores its own calendar choice in the integration. VIRTUAL_CARILLON_LITCAL_URL=https://litcal.johnromanodorazio.com/api/v5 +# Valid calendars: general, US, IT, NL, VA, or CA. VIRTUAL_CARILLON_LITCAL_CALENDAR=general diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a2708b96..e7ad9a53 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ Thank you for helping improve Virtual Carillon. Contributions should preserve a ## Before you begin -Read the [development guide](docs/development.md) for setup, checks, deployment helpers, and releases. The [architecture guide](docs/architecture.md) explains the project boundaries, and the [testing guide](docs/testing.md) describes the expected smoke tests. +Read the [development guide](docs/development.md) for setup, architecture, checks, testing, deployment helpers, and releases. For a bug, include the deployment method, the relevant date and calendar when liturgical selection is involved, steps to reproduce, and the useful portion of the logs. Remove API tokens, private URLs, personal information, and private recordings before posting. diff --git a/README.md b/README.md index 898f247b..4e2e211a 100644 --- a/README.md +++ b/README.md @@ -147,11 +147,14 @@ Virtual Carillon does not set up speakers, Bluetooth pairing, or media-player in ## Further reading +The guides below expand on the relevant parts of this README: + - [Home Assistant setup, actions, and schedule details](docs/home-assistant.md) -- [Docker deployment](docs/docker.md) -- [Configuration reference](docs/configuration.md) -- [Adding your own recordings](docs/content.md) -- [Documentation index](docs/README.md) +- [Automatic hymn selection](docs/automatic-mode.md) +- [Development, architecture, and testing](docs/development.md) +- [HTTP API reference](docs/api.md) +- [Contributing guide](CONTRIBUTING.md) +- [Security policy](SECURITY.md) ## License diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 9b510125..00000000 --- a/docs/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Documentation - -The [main README](../README.md) is the canonical guide for installation choices, prerequisites, routine modes, and everyday use. The pages below each cover one subject in more detail; they do not repeat the installation instructions. - -## Using Virtual Carillon - -| Guide | When to use it | -| ----------------------------------------------- | --------------------------------------------------------------------------- | -| [Home Assistant](home-assistant.md) | Media browser, actions, status, and schedule details after installation. | -| [Automatic mode](automatic-mode.md) | How LitCal-based hymn scoring and selection work. | -| [Docker deployment](docker.md) | Docker networking, persistent data, and troubleshooting after installation. | -| [Configuration reference](configuration.md) | Set environment variables, LitCal, and audio-distance defaults. | -| [Content and recordings](content.md) | Understand bundled material and add or remove local recordings. | -| [Operations and troubleshooting](operations.md) | Maintain a deployment and diagnose common problems. | - -## For developers and contributors - -| Guide | Contents | -| ---------------------------------- | ---------------------------------------------------------------- | -| [Development](development.md) | Requirements, local commands, checks, and release preparation. | -| [Testing](testing.md) | Automated checks and manual smoke tests. | -| [HTTP API](api.md) | Advanced integration and API reference. | -| [Architecture](architecture.md) | Runtime boundaries, persistence, scheduling, and selection flow. | -| [Contributing](../CONTRIBUTING.md) | Contribution expectations and pull-request guidance. | -| [Security](../SECURITY.md) | Vulnerability reporting and deployment boundary. | -| [Roadmap](roadmap.md) | Current project direction. | diff --git a/docs/architecture.md b/docs/architecture.md deleted file mode 100644 index 61e25d57..00000000 --- a/docs/architecture.md +++ /dev/null @@ -1,70 +0,0 @@ -# Architecture - -This page is for contributors who need to understand the project boundary. User setup belongs in the [main guide](../README.md) and [Home Assistant guide](home-assistant.md). - -## Runtime roles - -The Node engine owns bell synthesis, asset rendering, the HTTP API, persistent schedules, schedule claims, event history, user recordings, and LitCal cache files. Home Assistant is optional: the integration supplies forms, media browsing, and speaker delivery, but it does not render the audio. - -```text -Home Assistant integration ── schedule/settings ──► Node API + SQLite - │ │ - │◄────────── due Home Assistant actions ────────┤ - ▼ ▼ - Home Assistant media players native local outputs -``` - -The standard Home Assistant path is deliberately speaker-agnostic. The integration turns a rendered asset into a Home Assistant media-source URL and calls `media_player.play_media`; the engine does not pair, discover, or configure those speakers. - -## Main modules - -| Path | Responsibility | -| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| `engine/src/cli/` | Command-line entry point, hymn-cycle commands, and automatic-selection preview. | -| `engine/src/configuration/` | Environment settings and default data paths. | -| `engine/src/api/` | Fastify HTTP API, authentication, direct playback, and schedule handoff. | -| `engine/src/scheduling/` | Schedule validation, normalization, time windows, Westminster matching, and target rules. | -| `engine/src/database/` | SQLite storage for schedules, claims, events, and completed-hymn history. | -| `engine/src/audio/` and `engine/src/bells/` | Bell synthesis, WAV rendering, distance profiles, local-output discovery, and native playback. | -| `engine/src/library/` | Bundled assets, imported recordings, hymn catalog, metadata, rendering, and playback. | -| `engine/src/liturgical/` | LitCal retrieval and caching, calendar normalization, taxonomy, conditions, and hymn-query conversion. | -| `engine/tests/` | Automated tests for the engine’s API, audio, library, liturgical, notation, and scheduling behavior. | -| `homeassistant/integration/` | Home Assistant integration config flow, coordinator, schedule runner, media source, services, status sensor, and branding. | -| `homeassistant/app/` | Supervisor app definition and entrypoint. | - -## Data directory - -The configured data directory contains the persistent state: - -| Path | Contents | -| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------- | -| `carillon.sqlite` | Saved schedules, claimed runs, event history, and completed-hymn history. | -| `cache/` | Lazily rendered WAV files. Safe to regenerate. | -| `assets/` | Imported recordings and their `index.json` library manifest. | -| `litcal/` | Cached normalized LitCal calendar years. Stale cached data is preferred to blocking playback when the calendar service is unavailable. | - -Back up the database and `assets/` when preserving saved configuration and imported content matters. Rendered audio can be recreated. - -## Schedule delivery - -The public schedule format uses Westminster, assets, and hymn modes. The internal action graph supports the execution details and legacy migration, but new integrations should use `GET` and `PUT /api/schedule`. - -- A routine with `mediaPlayers` is claimed by the Home Assistant integration and delivered through `media_player` entities. -- A routine with native `outputs`, or with neither target list, is evaluated by the server’s native schedule timer. -- A routine that names both can use both delivery paths. This is intentional API-level behavior, but normal Home Assistant routines supply media players only. -- Schedule claims use the local date and minute plus the schedule revision, so the same Home Assistant event is not claimed twice after a restart or repeated tick. - -## Hymn selection - -The hymn catalog is independent of rendering. Hymn definitions declare metadata; date and calendar logic live in the LitCal and catalog layers. - -```text -date + calendar - │ - ▼ -LitCal day ──► celebration / season tags ──► hymn catalog ──► selected asset - │ - daily completed-hymn history -``` - -Automatic selection scores feast, saint, category, season, and optional canonical-hour preference. Explicit category, season, and feast queries use a tiered match instead. The full external contract is in the [API reference](api.md#litcal-and-hymn-selection). diff --git a/docs/configuration.md b/docs/configuration.md deleted file mode 100644 index 4a25540b..00000000 --- a/docs/configuration.md +++ /dev/null @@ -1,32 +0,0 @@ -# Configuration reference - -The engine reads its deployment settings from environment variables when it starts. Copy `.env.example` to `.env` for Docker Compose, or set the same variables in the environment that starts the server. - -Home Assistant schedules, speaker targets, and the schedule’s LitCal choice are configured in the integration’s **Configure** flow, not with environment variables. See [Home Assistant setup](home-assistant.md). - -| Variable | Default | Use | -| ----------------------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `VIRTUAL_CARILLON_DATA_DIR` | `.data` | Stores `carillon.sqlite`, rendered audio, imported recordings, and LitCal cache files. Back up this directory if you want to retain schedules, history, and imported recordings. | -| `VIRTUAL_CARILLON_HOST` | `127.0.0.1` | HTTP address on which the engine listens. Docker Compose uses `0.0.0.0` inside the container. | -| `VIRTUAL_CARILLON_PORT` | `9876` | HTTP port for `/health` and the authenticated `/api/*` endpoints. | -| `VIRTUAL_CARILLON_API_TOKEN` | unset | Bearer token for every `/api/*` endpoint. Set a long, unique value for every networked deployment. `/health` remains unauthenticated for health checks. | -| `VIRTUAL_CARILLON_DISTANCE_PROFILE` | `half-mile` | Default acoustic distance used by native playback and API audio requests that do not specify a profile. | -| `VIRTUAL_CARILLON_SAMPLE_RATE` | `44100` | WAV sample rate. The only accepted values are `44100` and `48000`. | -| `VIRTUAL_CARILLON_LITCAL_URL` | `https://litcal.johnromanodorazio.com/api/v5` | Base URL for the Liturgical Calendar API. Change this only when using a compatible LitCal endpoint. | -| `VIRTUAL_CARILLON_LITCAL_CALENDAR` | `general` | Default calendar used by the command line and API: `general`, `US`, `IT`, `NL`, `VA`, or `CA`. A Home Assistant schedule stores its own calendar choice. | - -## Distance profiles - -The following names are accepted by `VIRTUAL_CARILLON_DISTANCE_PROFILE`, the `play --distance` command option, and the API’s `distance` field. The profile changes the generated audio: farther settings are quieter, less bright, and have more distant reflections. - -| Profile | Intended character | -| ---------------- | ----------------------------------------------- | -| `near` | Close, clear bells. | -| `church-grounds` | Bells heard from nearby grounds. | -| `quarter-mile` | Bells heard from a short distance away. | -| `half-mile` | The default: a more distant outdoor sound. | -| `one-mile` | The quietest and most filtered bundled profile. | - -The HTTP `POST /api/play` endpoint also accepts `custom` with individual distance values. That is an API-only advanced option; the environment variable and Home Assistant integration accept the five bundled profiles only. - -Home Assistant’s schedule controls, LitCal calendar, playback distance, routine modes, Westminster cadence, volume handling, time windows, and canonical-hour preference are documented in the [Home Assistant guide](home-assistant.md). diff --git a/docs/content.md b/docs/content.md deleted file mode 100644 index 54eea198..00000000 --- a/docs/content.md +++ /dev/null @@ -1,46 +0,0 @@ -# Content and recordings - -Virtual Carillon keeps its bundled material and your own recordings separate. - -## Bundled material - -- **Bells, Westminster Chimes, Angelus signals, and Office signals** are generated by the engine. No sampled church-bell recordings are included. -- **Hymns** are stored as symbolic melody and timing data, then arranged and rendered for the virtual carillon when needed. -- Built-in hymn metadata identifies relevant seasons, feasts, categories, Offices, or canonical-hour preferences. The selector uses those tags when choosing hymns. - -## Add a recording - -For an advanced standalone engine, use the command line to copy a local recording into the persistent library: - -```bash -node engine/dist/cli/index.js import \ - --name "Custom Angelus" \ - --file /path/to/custom-angelus.wav \ - --id custom-angelus -``` - -`--name` and `--file` are required. `--id` is optional; when you omit it, Virtual Carillon derives a stable ID from the source file name. IDs may contain letters, numbers, hyphens, and underscores after normalization. - -The supported formats are WAV, FLAC, MP3, OGG, M4A, and AAC. The file is copied into the data directory, usually `.data/assets` for a local install or the `virtual-carillon-data` Docker volume for Compose. The original file is left untouched. - -The command-line importer creates a general recording. For an imported hymn with liturgical metadata, use `POST /api/assets/import`; see the [API reference](api.md#import-a-recording). - -Imported recordings appear in **All assets** in the Home Assistant media browser and can be selected in a Manual routine. Imported assets whose `type` is `hymn` also appear in the hymn browser and can participate in category, season, and automatic selection when their metadata supports it. - -## Rights and local customs - -Only import recordings, hymn performances, arrangements, or other material that you have permission to copy and use. Virtual Carillon does not grant permission to redistribute imported material. - -Bell customs vary by place. The bundled Angelus and Office signals are usable starting points, not claims that one pattern is universal. A local recording can be a fitting way to preserve a local practice. - -## Remove an imported recording - -Use the API to remove an imported asset: - -```bash -curl -X DELETE \ - -H 'Authorization: Bearer YOUR_TOKEN' \ - http://127.0.0.1:9876/api/assets/custom-angelus -``` - -This deletes the copied file from the engine’s data directory and removes it from the persistent library. It cannot remove bundled assets and does not delete the original source file you imported. diff --git a/docs/development.md b/docs/development.md index d66d2ebb..f58a5cfa 100644 --- a/docs/development.md +++ b/docs/development.md @@ -1,6 +1,6 @@ # Development -This guide is for contributors working on the Virtual Carillon engine, Home Assistant integration, Home Assistant app, documentation, and hymn catalog. +This guide is for contributors working on the Virtual Carillon engine, Home Assistant integration, Home Assistant app, documentation, and hymn catalog. It also owns the project architecture and test workflow. ## Requirements @@ -62,7 +62,7 @@ Start the development server through `tsx`: pnpm dev ``` -The default address is `http://127.0.0.1:9876`. Set `VIRTUAL_CARILLON_API_TOKEN` when testing authenticated requests. Environment variables and their defaults are listed in the [configuration reference](configuration.md). +The default address is `http://127.0.0.1:9876`. Set `VIRTUAL_CARILLON_API_TOKEN` when testing authenticated requests. Docker defaults are available in `.env.example`. After a build, useful command-line checks include: @@ -146,7 +146,7 @@ For a bundled hymn or melody: 4. Add or update tests for notation, arrangement, metadata, or selection behavior. 5. Confirm that the project has the right to distribute the melody, arrangement, and any included text or recording. -For imported user recordings, follow [Content and recordings](content.md). User recordings and generated audio belong in runtime storage, not in the source tree. +Imported user recordings and generated audio belong in runtime storage, not in the source tree. The API guide covers importing recordings and their metadata. ## Public contracts @@ -203,3 +203,37 @@ Do not commit: - generated WAV files. The repository’s ignore rules cover the usual cases, but check `git status` before committing. + +## Architecture + +The Node engine owns bell synthesis, asset rendering, the HTTP API, persistent schedules, schedule claims, event history, user recordings, and LitCal cache files. Home Assistant is optional: the integration supplies forms, media browsing, and speaker delivery, but it does not render audio. + +The standard Home Assistant path is speaker-agnostic. The integration turns a rendered asset into a Home Assistant media-source URL and calls `media_player.play_media`; the engine does not pair, discover, or configure speakers. + +| Path | Responsibility | +| --------------------------------------------------- | --------------------------------------------------------------------------- | +| `engine/src/cli/` | Command-line entry point and hymn-selection preview. | +| `engine/src/api/` | Fastify API, authentication, direct playback, and schedule handoff. | +| `engine/src/audio/` and `engine/src/bells/` | Bell synthesis, WAV rendering, distance profiles, and native playback. | +| `engine/src/library/` | Bundled assets, imported recordings, hymn catalog, metadata, and rendering. | +| `engine/src/liturgical/` | LitCal retrieval and caching, taxonomy, conditions, and hymn queries. | +| `engine/src/scheduling/` and `engine/src/database/` | Schedule validation, matching, claims, events, and completed-hymn history. | +| `homeassistant/integration/` | Config flow, schedule runner, media source, services, sensor, and branding. | +| `homeassistant/app/` | Home Assistant Supervisor app definition and entrypoint. | + +Schedules with Home Assistant `mediaPlayers` are claimed by the integration. Schedules with native `outputs`, or no target list, are evaluated by the engine’s native timer. Claims use the local date, minute, and schedule revision to avoid duplicate delivery after restarts. + +## Testing + +Run the normal checks with `pnpm check` and the complete local CI preflight with `pnpm ci:check`. The preflight also validates release metadata, compiles the Home Assistant integration, validates JSON, builds the Docker image, and performs an authenticated API smoke test. It requires Docker and Python 3. + +After a build, useful CLI checks are: + +```bash +node engine/dist/cli/index.js doctor +node engine/dist/cli/index.js assets +node engine/dist/cli/index.js test +node engine/dist/cli/index.js hymn-order --count 3 +``` + +`test` renders representative bells, signals, chant, and hymns under the configured data directory’s `cache/` folder. Native playback needs a local audio backend and is separate from the Docker/Home Assistant path. For a Home Assistant smoke test, add the integration, confirm the status sensor is `online`, play `test-bell` from the media browser, create a Manual test routine a few minutes ahead, then test Westminster and Automatic mode. Remove or disable the test routine afterward. diff --git a/docs/docker.md b/docs/docker.md deleted file mode 100644 index 76ec3549..00000000 --- a/docs/docker.md +++ /dev/null @@ -1,50 +0,0 @@ -# Home Assistant Container with Docker - -This is installation path 2 from the [main guide](../README.md#2-home-assistant-container-with-docker). Use it when Home Assistant runs in a Docker container. It is not the Home Assistant OS or Supervised app installation. - -Virtual Carillon’s container renders and serves audio. Home Assistant’s integration sends that audio to the media players you select, so the engine container does not need access to ALSA, PipeWire, PulseAudio, Bluetooth, or the speaker hardware. - -## Installation - -Use the [main README](../README.md#2-home-assistant-container-with-docker) for the complete Docker installation: creating `.env`, starting the container, connecting Home Assistant to its network, installing the integration, and adding the device. This page is deliberately limited to Docker-specific storage and troubleshooting details. - -The supplied Compose file creates the `virtual-carillon_default` network and keeps port `9876` inside that network. It does not publish the API to the Docker host. The integration address is `http://virtual-carillon:9876` when Home Assistant is attached to that network. - -Do not expose the API to the public internet. If you need remote access, place it behind a properly configured reverse proxy and keep the bearer token secret. - -## Persistent data and backups - -The `virtual-carillon-data` Docker volume holds the engine’s persistent state: - -- `carillon.sqlite` — schedules, schedule claims, and playback history; -- rendered WAV files; -- LitCal cache files; and -- imported recordings and their library index. - -Back up the volume before removing or recreating it. You may replace the container image without losing this data as long as the volume remains in place. - -## Troubleshooting - -### Home Assistant cannot connect - -Check the following in order: - -1. The `virtual-carillon` container is running: `docker compose ps`. -2. Home Assistant and the engine share a Docker network. -3. The integration uses `http://virtual-carillon:9876`, not the Docker host’s `localhost:9876`. -4. The API token matches exactly. - -From a container on the shared network, these requests should succeed: - -```bash -curl http://virtual-carillon:9876/health -curl -H 'Authorization: Bearer YOUR_TOKEN' http://virtual-carillon:9876/api/status -``` - -### A media player does not play an asset - -The engine can be healthy while a particular speaker cannot retrieve the audio. Confirm that the speaker can reach Home Assistant’s configured internal or external URL and that its integration supports `media_player.play_media`. Pairing, network access, and speaker-specific playback remain the responsibility of that media-player integration. - -### I want direct audio from the container - -The standard Compose setup is deliberately Home Assistant–first and does not mount host audio devices. The CLI and `POST /api/play` support direct host-output playback in a separate native setup, but that is not part of this Docker configuration. diff --git a/docs/operations.md b/docs/operations.md deleted file mode 100644 index d7d36bb7..00000000 --- a/docs/operations.md +++ /dev/null @@ -1,77 +0,0 @@ -# Operations and troubleshooting - -Use this page after initial installation. The [main README](../README.md) is the only installation guide; this page covers maintenance and troubleshooting. - -## Routine maintenance - -For a Docker Compose deployment: - -```bash -docker compose ps -docker compose logs -f virtual-carillon -``` - -The `virtual-carillon-data` volume contains the saved schedule, playback history, imported recordings, LitCal cache, and rendered audio. Back it up before removing the volume or moving to a new host. - -For the Home Assistant app, the same information is held in Supervisor-managed app storage. Include the app data in ordinary Home Assistant backups. - -You may remove rendered WAV cache files while the engine is stopped; it will render them again when needed. Do not delete `carillon.sqlite`, the `assets/` directory, or SQLite `-wal` and `-shm` files while the engine is running unless you intentionally want to lose or reset that data. - -## Check the engine - -From the engine’s network: - -```bash -curl http://virtual-carillon:9876/health -curl -H 'Authorization: Bearer YOUR_TOKEN' http://virtual-carillon:9876/api/status -``` - -For a local native installation, replace `virtual-carillon` with `127.0.0.1` when the server uses its default address. - -`/health` confirms that the engine is running. `/api/status` also reports the current distance profile, discovered outputs, Bluetooth diagnostics, and recent playback events. - -## Common problems - -### The integration cannot connect - -Confirm all of the following: - -1. The engine is running and `/health` responds. -2. The API URL is reachable from Home Assistant. In the supplied Compose deployment, use `http://virtual-carillon:9876` only when both containers share a network. -3. The API token exactly matches the engine or app token. -4. The engine API is not being blocked by a reverse proxy or firewall. - -The default Compose file does not publish port `9876` to the Docker host. The host’s `localhost:9876` is therefore not an integration address unless you deliberately add a port mapping. - -### A schedule is saved but nothing plays - -Check the master **Enable schedules** switch in **Configure → Settings**, then check the individual **Enable Westminster** or **Enable schedule** switch. Confirm that the routine includes the current weekday, an exact `HH:MM` time, and at least one media player. - -For routines with **Never before** and **Never after**, remember that both boundaries are inclusive and overnight ranges continue into the next morning. Check the Home Assistant log for a claimed schedule event and the Virtual Carillon Status sensor’s recent events. - -### A speaker does not play an asset - -First play a normal Home Assistant media item on that speaker. Then confirm that it can reach Home Assistant’s configured internal or external URL and supports `media_player.play_media`. Virtual Carillon does not manage pairing, speaker groups, or transport details for another integration. - -When a routine specifies **Volume (%)**, Home Assistant sets the player’s volume before playback and leaves it there. An unexpectedly quiet or loud later playback may be the result of that setting. - -### Automatic mode cannot find a suitable hymn - -Check the selected **LitCal calendar** in **Configure → Settings** and the Home Assistant log for the exact selection message. The engine uses a cached calendar year when it has one. If it cannot obtain a LitCal day, the routine does not play and the Home Assistant log identifies the date and calendar involved. - -If no suitable hymn is available, the log identifies the routine and date. Check that the engine can reach LitCal and that the hymn library contains eligible hymns. - -### Native playback fails - -Native playback is an advanced standalone path, not the supported Home Assistant speaker path. Run: - -```bash -node engine/dist/cli/index.js doctor -node engine/dist/cli/index.js devices -``` - -Use the returned device information with the CLI or API if your setup requires it. Virtual Carillon does not provide configuration guidance for audio drivers, Bluetooth pairing, or particular speaker hardware. For ordinary use, send the audio through a working Home Assistant `media_player`. The standard Docker/Home Assistant deployment does not provide native audio devices to the container. - -### The database is locked - -Do not run two engine processes against the same data directory. The database uses WAL mode and a busy timeout, but simultaneous independent servers are not a supported arrangement. diff --git a/docs/roadmap.md b/docs/roadmap.md deleted file mode 100644 index e31710f9..00000000 --- a/docs/roadmap.md +++ /dev/null @@ -1,9 +0,0 @@ -# Roadmap - -Virtual Carillon’s next work is guided by real-world behavior across its supported interfaces and deployments. The current priorities are: - -- verify the Home Assistant app across its supported architectures; -- broaden the hymn catalog and its careful liturgical metadata; and -- refine scheduling, deployment, and accessibility from reproducible user reports. - -Reliability, clear behavior, and respectful handling of liturgical material take precedence over adding features quickly. Please use the issue tracker for a reproducible bug report or a concrete feature request. diff --git a/docs/testing.md b/docs/testing.md deleted file mode 100644 index e49e3143..00000000 --- a/docs/testing.md +++ /dev/null @@ -1,66 +0,0 @@ -# Testing - -## Automated checks - -Run the normal project checks while developing: - -```bash -pnpm check -``` - -Before review or release preparation, run the local CI preflight: - -```bash -pnpm ci:check -``` - -`pnpm ci:check` runs `pnpm check`, validates release metadata, compiles the Home Assistant integration, validates JSON metadata, builds the Docker image, and performs an authenticated API smoke test. It requires Docker and Python 3. - -The test suite covers bell synthesis and distance rendering, hymn notation and arrangements, LitCal normalization and caching, liturgical metadata and selection, imported recordings, schedule matching and claims, database history, and API validation. - -## Local command-line smoke test - -Build first, then run: - -```bash -node engine/dist/cli/index.js doctor -node engine/dist/cli/index.js assets -node engine/dist/cli/index.js test -node engine/dist/cli/index.js shuffle-hymns --count 1 -node engine/dist/cli/index.js hymn-order --count 3 -``` - -`test` renders representative bells, signals, chant, and hymns. Confirm that WAV files appear under the configured data directory’s `cache/` folder. Native playback needs a working local audio backend and is not part of the Docker/Home Assistant smoke path. - -## API smoke test - -Start the server with an API token, then query it: - -```bash -VIRTUAL_CARILLON_API_TOKEN=test-token node engine/dist/cli/index.js server -``` - -In another terminal: - -```bash -curl http://127.0.0.1:9876/health -curl -H 'Authorization: Bearer test-token' http://127.0.0.1:9876/api/status -curl -H 'Authorization: Bearer test-token' http://127.0.0.1:9876/api/assets -curl -H 'Authorization: Bearer test-token' http://127.0.0.1:9876/api/hymns -curl -H 'Authorization: Bearer test-token' \ - 'http://127.0.0.1:9876/api/liturgical/2026-08-15/hymn?calendar=general' -curl -H 'Authorization: Bearer test-token' \ - http://127.0.0.1:9876/api/assets/test-bell/audio -o /tmp/test-bell.wav -``` - -For native schedule testing, save an output-targeted schedule and call `POST /api/schedule/run` at a due time. See the [API reference](api.md#schedules) for the public schedule format. - -## Home Assistant smoke test - -1. Add the integration and confirm that the **Virtual Carillon Status** sensor is `online`. -2. In the media browser, play `test-bell` on one known-working media player. -3. Use **Configure** to turn on schedules and create a Manual test routine a few minutes ahead. -4. Confirm that it plays once, then test Westminster and an Automatic hymn routine. -5. Remove or disable the test routine afterward. - -This validates the intended path from engine to Home Assistant media player. Speaker-specific behavior belongs to the media-player integration being used. diff --git a/homeassistant/app/DOCS.md b/homeassistant/app/DOCS.md index 16d452be..92a71659 100644 --- a/homeassistant/app/DOCS.md +++ b/homeassistant/app/DOCS.md @@ -12,4 +12,4 @@ The Home Assistant app runs the engine on port `9876`. The separate Virtual Cari The app exposes port `9876` to the Home Assistant host and internal app network. Use `http://:9876` when adding the integration; `http://local-virtual-carillon:9876` may also work for a local app installation. -The app is for Home Assistant OS and Home Assistant Supervised. For Home Assistant Container, run the engine with [Docker Compose](../../docs/docker.md) instead. +The app is for Home Assistant OS and Home Assistant Supervised. For Home Assistant Container, run the engine with [Docker Compose](../../README.md#2-home-assistant-container-with-docker) instead. diff --git a/homeassistant/app/README.md b/homeassistant/app/README.md deleted file mode 100644 index f1d78ff9..00000000 --- a/homeassistant/app/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Virtual Carillon Home Assistant app - -This app runs the Virtual Carillon engine under Home Assistant Supervisor. Use it with Home Assistant OS or Home Assistant Supervised. It is not available for Home Assistant Container. - -The app runs the engine only. The separate **Virtual Carillon** integration supplies the media library, speaker selection, and schedules; follow the main README for its installation. - -## Setup - -Follow the [main README’s Home Assistant OS/Supervised path](../../README.md#1-home-assistant-os-and-home-assistant-supervised) for installation. It covers adding the app repository, installing the app, installing the integration with HACS (or manually), and connecting the two pieces. This page only documents the app’s own settings and storage. - -The app stores its database, rendered audio, LitCal cache, and imported recordings in Supervisor-managed persistent storage. Include that data in your Home Assistant backups. - -Home Assistant remains responsible for speaker configuration and playback. The integration sends the generated audio to the media players you select. - -For the app’s settings, see [DOCS.md](DOCS.md). For the complete integration guide, see [Home Assistant](../../docs/home-assistant.md). diff --git a/homeassistant/integration/README.md b/homeassistant/integration/README.md deleted file mode 100644 index ed936fbe..00000000 --- a/homeassistant/integration/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Virtual Carillon integration - -This directory contains the Home Assistant integration only. For installation, follow the [main README](../../../README.md), which explains the two Home Assistant engine paths and the manual integration installation. The integration needs a separately running Virtual Carillon engine: - -- use the Virtual Carillon Home Assistant app on Home Assistant OS or Home Assistant Supervised; or -- run the engine with Docker Compose for Home Assistant Container and other Docker installations. - -After the engine is running, add **Virtual Carillon** in **Settings → Devices & services**. The integration provides the media browser, `virtual_carillon.play`, `virtual_carillon.select_hymn`, and `virtual_carillon.stop` actions; a status sensor; and a saved schedule editor for Westminster, Manual, Category, and Automatic hymn routines. - -Home Assistant controls the selected speakers. The engine generates and serves the audio, so its container does not need direct access to ALSA, PipeWire, Bluetooth, or speaker hardware. - -See the [Home Assistant guide](../../../docs/home-assistant.md) for media browsing, actions, exact settings, routine modes, and examples. From efbad463ab2d0942929b6bea0b40d850748ee30e Mon Sep 17 00:00:00 2001 From: Hunter Paulson Date: Fri, 4 Sep 2026 02:46:20 -0400 Subject: [PATCH 4/5] Fixed actions path --- .github/workflows/ci.yml | 4 ++-- .github/workflows/publish-app.yml | 2 +- scripts/render-branding.swift | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1b8e8913..15c4d5a4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,11 +43,11 @@ jobs: run: pnpm release:check - name: Validate Home Assistant integration syntax - run: python3 -m compileall -q homeassistant/integration/virtual_carillon + run: python3 -m compileall -q homeassistant/integration - name: Validate JSON metadata run: | - python3 -m json.tool homeassistant/integration/virtual_carillon/manifest.json >/dev/null + python3 -m json.tool homeassistant/integration/manifest.json >/dev/null python3 -m json.tool hacs.json >/dev/null container: diff --git a/.github/workflows/publish-app.yml b/.github/workflows/publish-app.yml index 81f378d7..191d21e2 100644 --- a/.github/workflows/publish-app.yml +++ b/.github/workflows/publish-app.yml @@ -61,7 +61,7 @@ jobs: run: pnpm release:check -- "${RELEASE_VERSION#v}" - name: Validate Home Assistant integration syntax - run: python3 -m compileall -q homeassistant/integration/virtual_carillon + run: python3 -m compileall -q homeassistant/integration - name: Log in to GHCR uses: docker/login-action@v3 diff --git a/scripts/render-branding.swift b/scripts/render-branding.swift index 3bc6aadf..11a54354 100644 --- a/scripts/render-branding.swift +++ b/scripts/render-branding.swift @@ -17,10 +17,10 @@ struct Output { let outputs = [ Output(path: "homeassistant/app/icon.png", width: 128, height: 128), Output(path: "homeassistant/app/logo.png", width: 250, height: 100), - Output(path: "homeassistant/integration/virtual_carillon/brand/icon.png", width: 256, height: 256), - Output(path: "homeassistant/integration/virtual_carillon/brand/icon@2x.png", width: 512, height: 512), - Output(path: "homeassistant/integration/virtual_carillon/brand/logo.png", width: 640, height: 256), - Output(path: "homeassistant/integration/virtual_carillon/brand/logo@2x.png", width: 1280, height: 512), + Output(path: "homeassistant/integration/brand/icon.png", width: 256, height: 256), + Output(path: "homeassistant/integration/brand/icon@2x.png", width: 512, height: 512), + Output(path: "homeassistant/integration/brand/logo.png", width: 640, height: 256), + Output(path: "homeassistant/integration/brand/logo@2x.png", width: 1280, height: 512), ] func point(_ x: CGFloat, _ y: CGFloat) -> CGPoint { CGPoint(x: x, y: y) } From 017635ee339c29b299703924dbf3971d409ec468 Mon Sep 17 00:00:00 2001 From: Hunter Paulson Date: Fri, 4 Sep 2026 02:48:27 -0400 Subject: [PATCH 5/5] Remove old assets --- assets/virtual-carillon-icon.svg | 10 --- assets/virtual-carillon-logo.svg | 13 --- scripts/render-branding.swift | 146 ------------------------------- 3 files changed, 169 deletions(-) delete mode 100644 assets/virtual-carillon-icon.svg delete mode 100644 assets/virtual-carillon-logo.svg delete mode 100644 scripts/render-branding.swift diff --git a/assets/virtual-carillon-icon.svg b/assets/virtual-carillon-icon.svg deleted file mode 100644 index 80af0487..00000000 --- a/assets/virtual-carillon-icon.svg +++ /dev/null @@ -1,10 +0,0 @@ - - Virtual Carillon - A quiet golden bell bearing a cross, set in a deep navy roundel. - - - - - - - diff --git a/assets/virtual-carillon-logo.svg b/assets/virtual-carillon-logo.svg deleted file mode 100644 index 3484cd65..00000000 --- a/assets/virtual-carillon-logo.svg +++ /dev/null @@ -1,13 +0,0 @@ - - Virtual Carillon - A quiet golden bell bearing a cross, set in a deep navy roundel beside the Virtual Carillon wordmark. - - - - - - - - Virtual Carillon - - diff --git a/scripts/render-branding.swift b/scripts/render-branding.swift deleted file mode 100644 index 11a54354..00000000 --- a/scripts/render-branding.swift +++ /dev/null @@ -1,146 +0,0 @@ -import AppKit -import CoreGraphics -import CoreText -import Foundation -import ImageIO - -let navy = CGColor(red: 16.0 / 255.0, green: 36.0 / 255.0, blue: 59.0 / 255.0, alpha: 1) -let gold = CGColor(red: 242.0 / 255.0, green: 199.0 / 255.0, blue: 92.0 / 255.0, alpha: 1) -let ivory = CGColor(red: 1, green: 250.0 / 255.0, blue: 240.0 / 255.0, alpha: 1) - -struct Output { - let path: String - let width: Int - let height: Int -} - -let outputs = [ - Output(path: "homeassistant/app/icon.png", width: 128, height: 128), - Output(path: "homeassistant/app/logo.png", width: 250, height: 100), - Output(path: "homeassistant/integration/brand/icon.png", width: 256, height: 256), - Output(path: "homeassistant/integration/brand/icon@2x.png", width: 512, height: 512), - Output(path: "homeassistant/integration/brand/logo.png", width: 640, height: 256), - Output(path: "homeassistant/integration/brand/logo@2x.png", width: 1280, height: 512), -] - -func point(_ x: CGFloat, _ y: CGFloat) -> CGPoint { CGPoint(x: x, y: y) } - -func bellPath() -> CGPath { - let path = CGMutablePath() - path.move(to: point(128, 42)) - path.addCurve(to: point(79, 92), control1: point(101, 42), control2: point(79, 64)) - path.addLine(to: point(79, 122)) - path.addCurve(to: point(60, 170), control1: point(79, 141), control2: point(73, 156)) - path.addLine(to: point(53, 178)) - path.addCurve(to: point(60, 192), control1: point(48, 184), control2: point(52, 192)) - path.addLine(to: point(196, 192)) - path.addCurve(to: point(203, 178), control1: point(208, 192), control2: point(208, 184)) - path.addLine(to: point(196, 170)) - path.addCurve(to: point(177, 122), control1: point(183, 156), control2: point(177, 141)) - path.addLine(to: point(177, 92)) - path.addCurve(to: point(128, 42), control1: point(177, 64), control2: point(155, 42)) - path.closeSubpath() - return path -} - -func roundedLine(_ context: CGContext, from: CGPoint, to: CGPoint, width: CGFloat, color: CGColor) { - context.setStrokeColor(color) - context.setLineWidth(width) - context.setLineCap(.round) - context.beginPath() - context.move(to: from) - context.addLine(to: to) - context.strokePath() -} - -func drawMark(_ context: CGContext) { - context.setFillColor(navy) - context.fillEllipse(in: CGRect(x: 8, y: 8, width: 240, height: 240)) - - context.setStrokeColor(CGColor(red: 242.0 / 255.0, green: 199.0 / 255.0, blue: 92.0 / 255.0, alpha: 0.24)) - context.setLineWidth(2) - context.strokeEllipse(in: CGRect(x: 17, y: 17, width: 222, height: 222)) - - context.setFillColor(gold) - context.addPath(bellPath()) - context.fillPath() - - roundedLine(context, from: point(82, 181), to: point(174, 181), width: 7, color: navy) - let clapper = CGMutablePath() - clapper.move(to: point(112, 196)) - clapper.addCurve(to: point(128, 211), control1: point(115, 206), control2: point(121, 211)) - clapper.addCurve(to: point(144, 196), control1: point(135, 211), control2: point(141, 206)) - context.setStrokeColor(gold) - context.setLineWidth(9) - context.setLineCap(.round) - context.addPath(clapper) - context.strokePath() - - // A Latin cross: the lower stem is intentionally longer than the upper arm. - roundedLine(context, from: point(128, 61), to: point(128, 138), width: 11, color: navy) - roundedLine(context, from: point(104, 88), to: point(152, 88), width: 11, color: navy) - -} - -func drawWordmark(_ context: CGContext) { - let card = CGRect(x: 286, y: 72, width: 332, height: 111) - context.setFillColor(ivory) - context.addPath(roundedRectPath(card, radius: 26)) - context.fillPath() - context.setStrokeColor(CGColor(red: 16.0 / 255.0, green: 36.0 / 255.0, blue: 59.0 / 255.0, alpha: 0.12)) - context.setLineWidth(2) - context.addPath(roundedRectPath(card, radius: 26)) - context.strokePath() - - let font = CTFontCreateWithName("Helvetica Neue" as CFString, 39, nil) - let attributes: [NSAttributedString.Key: Any] = [ - NSAttributedString.Key(kCTFontAttributeName as String): font, - NSAttributedString.Key(kCTForegroundColorAttributeName as String): navy, - ] - let line = CTLineCreateWithAttributedString(NSAttributedString(string: "Virtual Carillon", attributes: attributes)) - context.textPosition = point(307, 117) - CTLineDraw(line, context) - roundedLine(context, from: point(308, 98), to: point(522, 98), width: 6, color: CGColor(red: 211.0 / 255.0, green: 155.0 / 255.0, blue: 42.0 / 255.0, alpha: 1)) -} - -func roundedRectPath(_ rect: CGRect, radius: CGFloat) -> CGPath { - CGPath(roundedRect: rect, cornerWidth: radius, cornerHeight: radius, transform: nil) -} - -func writePNG(_ output: Output) { - guard let context = CGContext( - data: nil, - width: output.width, - height: output.height, - bitsPerComponent: 8, - bytesPerRow: output.width * 4, - space: CGColorSpace(name: CGColorSpace.sRGB)!, - bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue - ) else { fatalError("Could not create bitmap context") } - - context.clear(CGRect(x: 0, y: 0, width: output.width, height: output.height)) - let scale = CGFloat(output.height) / 256 - context.saveGState() - context.scaleBy(x: scale, y: scale) - context.saveGState() - context.translateBy(x: 0, y: 256) - context.scaleBy(x: 1, y: -1) - drawMark(context) - context.restoreGState() - if output.width > 256 { - drawWordmark(context) - } - context.restoreGState() - - guard let image = context.makeImage() else { fatalError("Could not create image") } - let url = URL(fileURLWithPath: output.path) - guard let destination = CGImageDestinationCreateWithURL(url as CFURL, "public.png" as CFString, 1, nil) else { - fatalError("Could not create PNG destination for \(output.path)") - } - CGImageDestinationAddImage(destination, image, nil) - guard CGImageDestinationFinalize(destination) else { fatalError("Could not write \(output.path)") } -} - -for output in outputs { - writePNG(output) -}