From 53c2ddb2fa51b995bc508a91b2dbc2355c3bafa9 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 14 Dec 2025 23:40:25 -0600 Subject: [PATCH 1/3] New Templates (#586) * feat(librechat): add LibreChat blueprint with compose, toml, metadata, links and tags * fix: rename templates to template.toml * fix(librechat): rename api service to librechat in docker-compose.yml * Update blueprints/librechat/template.toml * Update blueprints/librechat/template.toml * fix(librechat): add version under [config] and remove stray [config.mounts] header * fix(librechat): remove predefined persistent volume mounts from template.toml * docs(librechat): add authentication reference link to docker-compose.yml * feat: add Rote template - Add Rote deployment template with frontend, backend, and PostgreSQL services - Configure domain routing for frontend (port 80) and backend (port 3000) - Set up automatic password generation and environment variables - Use latest image tag by default - Add logo and metadata to meta.json * fix: process meta.json to fix formatting and sorting * Update GitHub workflows to target 'canary' branch for meta validation * Update pnpm-lock.yaml to upgrade various dependencies, including '@codemirror/autocomplete', '@radix-ui/react-dialog', and React packages to their latest versions. This includes updates to '@types/react' and '@types/react-dom' for improved compatibility and performance. * Enhance GitHub workflows: add production deployment configuration and target 'canary' branch for pull requests. * Refactor GitHub workflow: comment out build preview steps for clarity and future modifications. * Remove unnecessary blank line in deploy-preview.yml for improved readability. * Refactor GitHub workflow: uncomment build preview steps for improved deployment process and clarity. * Update template.toml (#555) * Update template.toml * Update template.toml * Update template.toml * fix: change VITE_API_BASE to http:// for traefik.me compatibility * changed image from sknnr/enshrouded-dedicated-server to mornedhels/enshrouded-server for autoupdate and easier config * Add Openinary Template (#567) * feat: add Openinary template * feat: update Openinary configuration to support ALLOWED_ORIGIN and refactor domain variable * fix: correct DEFAULT_DOMAIN environment variable reference in docker-compose.yml (#562) * add rustfs template (#568) * feat: add pull request template for improved contribution guidelines * fix: update pull request template to clarify issue closing keywords * feat: add validation scripts and configuration for Docker Compose and template files - Introduced a GitHub Actions workflow to validate Docker Compose files and template.toml on pull requests. - Added helper functions for generating random values and processing variables in templates. - Implemented validation scripts for checking the structure, syntax, and best practices of Docker Compose and template files. - Created necessary TypeScript types and configuration files for the build scripts. * Add Passbolt template blueprint to Dokploy templates (#376) * feat(templates): add Passbolt blueprint for Dokploy - Add docker-compose.yml defining services for Passbolt and MariaDB - Create template.toml with configurable domain, email, and database credentials - Add meta.json with metadata, tags, and link to logo * fix(meta): sort meta.json entries * fix: passbolt template had several issues that broke deployment - env variables were using old array format, changed to new table format - mariadb healthcheck was broken (wrong command for mariadb 11) - missing volume mounts for gpg keys, jwt tokens, and database - setup instructions weren't visible to users, moved to docker-compose - email config had circular references causing warnings - tested admin user creation and confirmed working everything works now, fully tested * Update blueprints/passbolt/template.toml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * feat: Add Kokoro TTS FastAPI template (#353) (#403) * feat: Add Kokoro TTS FastAPI template (#353) - Add CPU-optimized docker-compose.yml with source build - Add GPU-optimized docker-compose-gpu.yml for NVIDIA support - Add comprehensive template.toml with OpenAI-compatible API docs - Add kokoro-tts.svg logo and meta.json entry - Support streaming audio, timestamps, and multi-language TTS - Resolves #353 * updated the meta.json for the build errors * removed the docker-compose-gpu.yml file * Update docker-compose.yml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * chore: remove package-lock.json file from the app directory * chore: update Tolgee to latest version and fix SMTP config typo (#432) * chore: update Tolgee to latest version and fix SMTP config typo * Update docker-compose.yml * Update docker-compose.yml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * fix: improve Docker Compose validation workflow to handle subshell issues - Converted the handling of COMPOSE_FILES from a pipe to an array to ensure error propagation in the parent shell. - Updated the loop to iterate over the array for better reliability in the validation process. * refactor: enhance Docker Compose validation workflow to improve error handling - Replaced the pipe with an array to handle directory names, ensuring that errors within the loop propagate correctly to the parent shell. - Updated the loop structure for better reliability in processing the directories. * Feat: Add parseable (#460) * Add parseable * Update docker-compose.yml * Update docker-compose.yml * Update blueprints/parseable/template.toml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Co-authored-by: Mauricio Siu * feat: add ChirpStack LoRaWAN Network Server template (#486) * feat: add ChirpStack LoRaWAN Network Server template Add complete ChirpStack v4 template with: - Main ChirpStack server with web UI - UDP and Basics Station gateway bridges - REST API interface - PostgreSQL database with PostGIS extensions - Redis cache - Mosquitto MQTT broker Default configuration for EU868 region with secure random credentials. Supports all LoRaWAN frequency bands globally. * fix(chirpstack): use original configurations from chirpstack-docker repo Update template.toml to use exact configuration files from the chirpstack-docker repository instead of simplified versions: - Use original chirpstack.toml with all 15 enabled regions - Use original gateway bridge configuration with documentation links - Use complete Basics Station EU868 config with frequency plans - Keep original Mosquitto and PostgreSQL initialization scripts Template size increased from 131 to 219 lines (4.7KB) to include comprehensive default configurations that match the official setup. * feat: add all 38 region configuration files * fix(chirpstack): add volume mounts to expose config files to containers * fix(chirpstack): remove read-only flag * fix(chirpstack): correct file paths for configuration mounts in docker-compose and template files * fix: update volume paths to be on correct directory level * fix: configure template for dokploy-network with proper DNS resolution - Add dokploy-network configuration to docker-compose.yml - Replace environment variable placeholders with actual service hostnames - Change PostgreSQL DSN from $POSTGRESQL_HOST to postgres - Change Redis server from $REDIS_HOST to redis - Replace $MQTT_BROKER_HOST with mosquitto in all 39 region configurations These changes ensure Docker DNS resolution works correctly by: - Using dokploy-network (overlay) instead of bridge network - Using service names directly in TOML config files (TOML doesn't expand env vars) - Enabling proper service discovery between containers This resolves DNS resolution failures that caused ChirpStack to fail connecting to PostgreSQL and MQTT services during deployment. * fix: add missing network configurations for all services in docker-compose * feat: add internal services to config.domains for proper network configuration * Update docker-compose.yml * fix: enhance domain validation in template validator - Updated the TemplateValidator to ensure that if the 'host' field is provided, it must be a valid string. - Added comments to clarify that 'host' is optional for internal services. * refactor: remove redundant host validation in template validator - Removed the validation for the 'host' field in the TemplateValidator, as it is optional for internal services and does not require a type check if not provided. * refactor: remove internal service domain configurations from template - Eliminated the domain configurations for internal services (Postgres, Redis, Mosquitto) from the template.toml file, streamlining the configuration for better clarity and maintainability. --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Co-authored-by: Mauricio Siu * Update section title from 'Suggestions' to 'Requirements' * Feat : Add MCSManager template support (#521) (#522) * feat: Add MCSManager template support (#521) * Update docker-compose.yml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * feat: Add MediaCMS template (#524) * Feat : Add Quant-Ux template -#173 (#525) * Feat : Add Quant-Ux template -#173 * Remove extra newline in docker-compose.yml * Update blueprints/quant-ux/docker-compose.yml * Update blueprints/quant-ux/docker-compose.yml * Update blueprints/quant-ux/docker-compose.yml * Update blueprints/quant-ux/docker-compose.yml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * fix(rustdesk): use explicit ports, use port 21118 on hbbs instead of hbbr (#526) * fix: use explicit ports, use port 21118 on hbbs instead of hbbr * fix: whitespace character in rustdesk * feat: Add anytype template (#527) * add anytype template * sort * Update name field for Anytype in meta.json * Update meta.json * Update docker-compose.yml * Update blueprints/anytype/docker-compose.yml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * refactor: remove dokploy-network configurations from multiple docker-compose files - Removed the external dokploy-network configuration from various services' docker-compose.yml files to streamline network management. - This change simplifies the setup and ensures consistency across blueprints. * chore: upgrade Infisical from v0.90.1 to v0.135.0 (#529) * chore: upgrade Infisical from v0.90.1 to v0.135.0 * Update docker-compose.yml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * fix: update pull request template link for clarity - Changed the link in the pull request template from 'general suggestions' to 'general requirements' to better reflect the content and ensure users follow the correct guidelines when creating templates. * chore: add section for screenshots or videos in pull request template - Introduced a new section in the pull request template to encourage contributors to include screenshots or videos, enhancing the clarity and context of their submissions. * Feat : Add MuleSoft ESB Runtime Template (#498) * added the mulesoft esb template * updated the compose and the meta.json * feat(mulesoft-esb): update image and add dynamic env configuration - Updated image to hari1367709/mule-esb:latest - Added dynamic HTTP_PORT for runtime port configuration - Added MULE_VERSION environment variable for Mule ESB version selection * updated the meta.json to use the version as latest * added a comment line to the template file * updated the mule runtime image * fix(mulesoft-esb): update ports configuration to follow guidelines * updated the port to use the env(HTTP_PORT) * Update docker-compose.yml * Update docker-compose.yml * Update blueprints/mulesoft-esb/docker-compose.yml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * feat(blueprint): update trmnl-byos-laravel template (#533) * feat(blueprint): update trmnl-byos-laravel template * Update docker-compose.yml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * feat(blueprint): peerdb template (#579) * feat(blueprint): initial attempt at peerdb template * fix: entrypoint and healthcheck * fix: entrypoint * fix: temporarily remove network * fix: temporal port * chore: remove 36987 for minio * fix: remove peerdb 9900 port exposure * fix: port for console * fix: minio env fix * fix: expose peerdb and minio to dokploy network * fix(peerdb): add defaults * fix: remove extra hosts * fix: remove network entries * fix: use consistent environment variables * feat: add Bluesky PDS template (#542) * feat: Bluesky PDS template * chore: add bluesky pds svg * chore: metadata for bluesky pds * yaml > yml * pnpm lock * fix: correct rotation key config * fix volumes * fix: volumes in the pds compose * define volumes in compose * fix: 32 bit rotation key * create pds.env correctly * some extra fixes * more extra fixes * a blank line * update pnpm lock * Add dokploy-prom-monitoring-extension template with comprehensive tests and documentation (#548) * Add dokploy-prom-monitoring-extension template with comprehensive tests and documentation * Fix METRICS_CONFIG environment variable: use single-line JSON format * Fix template.toml: use correct [config.env] syntax for environment variables * Fix docker-compose.yml: add env_file reference to load environment variables * Delete blueprints/dokploy-prom-monitoring-extension/README.md * Delete test-dokploy-prom-monitoring-extension.sh --------- Co-authored-by: Sanjeevi Subramani Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * feat: improve RustDesk template configuration (#571) * feat: improve RustDesk template configuration - Add comprehensive environment variables for RustDesk server - Add RELAY_HOST, API_SERVER, ID_SERVER, and ENCRYPTION_KEY variables - Follow Dokploy best practices (no container_name, proper port format) - Use restart: unless-stopped policy - Add encryption key generation with password helper * fix: use explicit port mapping for RustDesk services RustDesk requires explicit port bindings (host:container format) to function properly. The service uses specific ports for: - 21115-21116 (TCP/UDP): hbbs service for ID and NAT traversal - 21117-21119 (TCP): hbbr relay service Without explicit port mapping, RustDesk clients cannot establish connections to the server. This is an exception to Dokploy's general port guidelines due to RustDesk's specific networking requirements. --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * feat: add Mumble voice chat server template (#572) * feat: add Mumble voice chat server template - Add Mumble VoIP server blueprint with docker-compose.yml - Configure environment variables for superuser password, welcome text, and max users - Add template.toml with auto-generated secure password - Follow Dokploy best practices (no container_name, proper port format) - Add Mumble metadata to meta.json with proper tags - Support for TCP and UDP on port 64738 * Update template.toml * fix: correct JSON formatting in meta.json for Mumble template entry --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Co-authored-by: Mauricio Siu * fix: update WireGuard Easy template for proper functionality (#573) * fix: update WireGuard Easy template for proper functionality - Changed to named volume (etc_wireguard) instead of host path mount - Added explicit port mappings (51820:51820/udp, 51821:51821/tcp) required for WireGuard - Updated environment variables to use correct WG_HOST and PASSWORD format - Added all required WireGuard environment variables: - WG_PORT, PORT, WG_MTU, WG_DEFAULT_DNS, WG_ALLOWED_IPS - WG_POST_UP/WG_POST_DOWN for iptables rules - Added NET_RAW capability for proper network operations - Simplified template.toml to use WIREGUARD_HOST and WIREGUARD_PASSWORD - Removed explicit networks config to enable Dokploy's isolated deployment - Template now works with Dokploy's automatic network isolation This configuration has been tested and confirmed working with isolated deployment enabled. * Update template.toml --------- Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> * add: restart policy to MinIO service (#576) restart: unless-stopped is a Docker restart policy that automatically restarts a container if it stops due to an error or Docker daemon restart --------- Co-authored-by: Sunil Shrestha Co-authored-by: Rabithua Co-authored-by: Mauricio Siu Co-authored-by: Scan <103391616+scanash00@users.noreply.github.com> Co-authored-by: Crackvignoule Co-authored-by: florianheysen <39408021+florianheysen@users.noreply.github.com> Co-authored-by: Thiago MadPin Co-authored-by: BlinkStrike <18644035+BlinkStrike@users.noreply.github.com> Co-authored-by: M Jupri Amin <127651222+Juupeee@users.noreply.github.com> Co-authored-by: Harikrishnan Dhanasekaran Co-authored-by: Kamil Dzieniszewski Co-authored-by: Nick Anderson Co-authored-by: lefolalan Co-authored-by: Chris <31969757+ChrisvanChip@users.noreply.github.com> Co-authored-by: kipavy <88386090+kipavy@users.noreply.github.com> Co-authored-by: Benjamin Nussbaum Co-authored-by: Khiet Tam Nguyen <86177399+nktnet1@users.noreply.github.com> Co-authored-by: Vidhya LKG for IT <24915474+VidhyaSanjeevi@users.noreply.github.com> Co-authored-by: Sanjeevi Subramani Co-authored-by: Muzaffer Kadir YILMAZ <34358176+muzafferkadir@users.noreply.github.com> Co-authored-by: Jemg --- .../pull_request_template.md | 7 +- .github/workflows/deploy-preview.yml | 4 +- ...s-production.yml => deploy-production.yml} | 0 .github/workflows/validate-docker-compose.yml | 317 + .github/workflows/validate-meta.yml | 4 +- .github/workflows/validate.yml | 4 +- .gitignore | 1 + README.md | 4 +- app/package-lock.json | 4248 ------- app/pnpm-lock.yaml | 1750 +-- blueprints/ackee/template.toml | 1 + blueprints/anytype/docker-compose.yml | 19 + blueprints/anytype/logo.png | Bin 0 -> 51321 bytes blueprints/anytype/template.toml | 4 + blueprints/bluesky-pds/bluesky-pds.svg | 3 + blueprints/bluesky-pds/docker-compose.yml | 48 + blueprints/bluesky-pds/template.toml | 36 + blueprints/budibase/docker-compose.yml | 3 - blueprints/chatwoot/docker-compose.yml | 6 - blueprints/chirpstack/chirpstack.png | Bin 0 -> 12023 bytes blueprints/chirpstack/docker-compose.yml | 81 + blueprints/chirpstack/template.toml | 9815 +++++++++++++++++ blueprints/conduit/docker-compose.yml | 6 - blueprints/discord-tickets/docker-compose.yml | 4 - blueprints/docmost/docker-compose.yml | 4 - .../docker-compose.yml | 11 + .../logo.svg | 21 + .../template.toml | 17 + blueprints/drawio/docker-compose.yml | 4 - blueprints/enshrouded/docker-compose.yml | 19 +- blueprints/evolutionapi/docker-compose.yml | 5 - blueprints/firecrawl/docker-compose.yml | 9 - blueprints/glpi/docker-compose.yml | 4 - blueprints/hi-events/docker-compose.yml | 4 - blueprints/immich/docker-compose.yml | 4 - blueprints/infisical/docker-compose.yml | 9 +- blueprints/invoiceshelf/docker-compose.yml | 4 - blueprints/kimai/docker-compose.yml | 4 - blueprints/kokoro-tts/docker-compose.yml | 23 + blueprints/kokoro-tts/kokoro-tts.svg | 12 + blueprints/kokoro-tts/template.toml | 72 + blueprints/kutt/docker-compose.yml | 2 +- blueprints/librechat/docker-compose.yml | 110 + blueprints/librechat/librechat.png | Bin 0 -> 59599 bytes blueprints/librechat/template.toml | 93 + blueprints/libredesk/docker-compose.yml | 3 - blueprints/logto/docker-compose.yml | 3 - blueprints/mcsmanager/docker-compose.yml | 29 + blueprints/mcsmanager/mcsmanager.png | Bin 0 -> 1132 bytes blueprints/mcsmanager/template.toml | 12 + blueprints/mediacms/docker-compose.yml | 134 + blueprints/mediacms/mediacms.svg | 6 + blueprints/mediacms/template.toml | 17 + blueprints/minio/docker-compose.yml | 2 +- blueprints/mulesoft-esb/docker-compose.yml | 22 + blueprints/mulesoft-esb/mulesoft_logo.png | Bin 0 -> 44699 bytes blueprints/mulesoft-esb/template.toml | 23 + blueprints/mumble/docker-compose.yml | 16 + blueprints/mumble/mumble.png | Bin 0 -> 2388 bytes blueprints/mumble/template.toml | 12 + blueprints/nextcloud-aio/docker-compose.yml | 4 - blueprints/openinary/docker-compose.yml | 26 + blueprints/openinary/openinary.svg | 18 + blueprints/openinary/template.toml | 40 + blueprints/parseable/docker-compose.yml | 23 + blueprints/parseable/logo.svg | 70 + blueprints/parseable/template.toml | 16 + blueprints/passbolt/docker-compose.yml | 79 + blueprints/passbolt/passbolt.svg | 8 + blueprints/passbolt/template.toml | 41 + blueprints/peerdb/docker-compose.yml | 187 + blueprints/peerdb/peerdb.jpeg | Bin 0 -> 10300 bytes blueprints/peerdb/template.toml | 93 + blueprints/peppermint/docker-compose.yml | 4 - blueprints/postiz/docker-compose.yml | 4 - blueprints/quant-ux/docker-compose.yml | 69 + blueprints/quant-ux/logo.svg | 2 + blueprints/quant-ux/template.toml | 50 + blueprints/rote/docker-compose.yml | 45 + blueprints/rote/rote.png | Bin 0 -> 55373 bytes blueprints/rote/template.toml | 23 + blueprints/roundcube/docker-compose.yml | 3 - blueprints/rustdesk/docker-compose.yml | 14 +- blueprints/rustdesk/template.toml | 5 + blueprints/rustfs/docker-compose.yml | 20 + blueprints/rustfs/logo.svg | 1 + blueprints/rustfs/meta-entry.json | 18 + blueprints/rustfs/template.toml | 25 + blueprints/slash/docker-compose.yml | 4 - blueprints/tolgee/docker-compose.yml | 4 +- blueprints/tolgee/template.toml | 3 +- blueprints/trilium/docker-compose.yml | 5 - .../trmnl-byos-laravel/docker-compose.yml | 3 +- blueprints/unifi/docker-compose.yml | 3 - blueprints/wg-easy/docker-compose.yml | 23 +- blueprints/wg-easy/template.toml | 18 +- blueprints/wikijs/docker-compose.yml | 3 - blueprints/windmill/docker-compose.yml | 3 - build-scripts/helpers.ts | 245 + build-scripts/package.json | 24 + build-scripts/pnpm-lock.yaml | 361 + build-scripts/tsconfig.json | 23 + build-scripts/type.ts | 879 ++ build-scripts/validate-docker-compose.ts | 357 + build-scripts/validate-template.ts | 622 ++ meta.json | 324 +- 106 files changed, 15667 insertions(+), 5200 deletions(-) rename .github/{PULL_REQUEST_TEMPLATE => }/pull_request_template.md (73%) rename .github/workflows/{cloudflare-pages-production.yml => deploy-production.yml} (100%) create mode 100644 .github/workflows/validate-docker-compose.yml create mode 100644 .gitignore delete mode 100644 app/package-lock.json create mode 100644 blueprints/anytype/docker-compose.yml create mode 100644 blueprints/anytype/logo.png create mode 100644 blueprints/anytype/template.toml create mode 100644 blueprints/bluesky-pds/bluesky-pds.svg create mode 100644 blueprints/bluesky-pds/docker-compose.yml create mode 100644 blueprints/bluesky-pds/template.toml create mode 100644 blueprints/chirpstack/chirpstack.png create mode 100644 blueprints/chirpstack/docker-compose.yml create mode 100644 blueprints/chirpstack/template.toml create mode 100644 blueprints/dokploy-prom-monitoring-extension/docker-compose.yml create mode 100644 blueprints/dokploy-prom-monitoring-extension/logo.svg create mode 100644 blueprints/dokploy-prom-monitoring-extension/template.toml create mode 100644 blueprints/kokoro-tts/docker-compose.yml create mode 100644 blueprints/kokoro-tts/kokoro-tts.svg create mode 100644 blueprints/kokoro-tts/template.toml create mode 100644 blueprints/librechat/docker-compose.yml create mode 100644 blueprints/librechat/librechat.png create mode 100644 blueprints/librechat/template.toml create mode 100644 blueprints/mcsmanager/docker-compose.yml create mode 100644 blueprints/mcsmanager/mcsmanager.png create mode 100644 blueprints/mcsmanager/template.toml create mode 100644 blueprints/mediacms/docker-compose.yml create mode 100644 blueprints/mediacms/mediacms.svg create mode 100644 blueprints/mediacms/template.toml create mode 100644 blueprints/mulesoft-esb/docker-compose.yml create mode 100644 blueprints/mulesoft-esb/mulesoft_logo.png create mode 100644 blueprints/mulesoft-esb/template.toml create mode 100644 blueprints/mumble/docker-compose.yml create mode 100644 blueprints/mumble/mumble.png create mode 100644 blueprints/mumble/template.toml create mode 100644 blueprints/openinary/docker-compose.yml create mode 100644 blueprints/openinary/openinary.svg create mode 100644 blueprints/openinary/template.toml create mode 100644 blueprints/parseable/docker-compose.yml create mode 100644 blueprints/parseable/logo.svg create mode 100644 blueprints/parseable/template.toml create mode 100644 blueprints/passbolt/docker-compose.yml create mode 100644 blueprints/passbolt/passbolt.svg create mode 100644 blueprints/passbolt/template.toml create mode 100644 blueprints/peerdb/docker-compose.yml create mode 100644 blueprints/peerdb/peerdb.jpeg create mode 100644 blueprints/peerdb/template.toml create mode 100644 blueprints/quant-ux/docker-compose.yml create mode 100644 blueprints/quant-ux/logo.svg create mode 100644 blueprints/quant-ux/template.toml create mode 100644 blueprints/rote/docker-compose.yml create mode 100644 blueprints/rote/rote.png create mode 100644 blueprints/rote/template.toml create mode 100644 blueprints/rustfs/docker-compose.yml create mode 100644 blueprints/rustfs/logo.svg create mode 100644 blueprints/rustfs/meta-entry.json create mode 100644 blueprints/rustfs/template.toml create mode 100644 build-scripts/helpers.ts create mode 100644 build-scripts/package.json create mode 100644 build-scripts/pnpm-lock.yaml create mode 100644 build-scripts/tsconfig.json create mode 100644 build-scripts/type.ts create mode 100644 build-scripts/validate-docker-compose.ts create mode 100644 build-scripts/validate-template.ts diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/pull_request_template.md similarity index 73% rename from .github/PULL_REQUEST_TEMPLATE/pull_request_template.md rename to .github/pull_request_template.md index 0c5e03d5..aa99ffae 100644 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ b/.github/pull_request_template.md @@ -6,12 +6,13 @@ New PR of [Template Name] Before submitting this PR, please make sure that: -- [ ] I have read the suggestions in the README.md file https://github.com/Dokploy/templates?tab=readme-ov-file#general-suggestions-when-creating-a-template +- [ ] I have read the suggestions in the README.md file https://github.com/Dokploy/templates?tab=readme-ov-file#general-requirements-when-creating-a-template - [ ] I have tested the template in my instance, so the maintainers don't spend time trying to figure out what's wrong. - [ ] I have added tests that demonstrate that my correction works or that my new feature works. ## Issues related (if applicable) -Close automatically the related issues using the keywords: `closes #ISSUE_NUMBER`, `fixes #ISSUE_NUMBER`, `resolves #ISSUE_NUMBER` +Close automatically the related issues using the keywords: `closes #ISSUE_NUMBER` -Example: `closes #123` \ No newline at end of file + +## Screenshots or Videos diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml index 2f067433..a342ac7a 100644 --- a/.github/workflows/deploy-preview.yml +++ b/.github/workflows/deploy-preview.yml @@ -5,7 +5,9 @@ on: workflows: [Build Preview Deployment] types: - completed - + pull_request: + branches: + - canary permissions: actions: read deployments: write diff --git a/.github/workflows/cloudflare-pages-production.yml b/.github/workflows/deploy-production.yml similarity index 100% rename from .github/workflows/cloudflare-pages-production.yml rename to .github/workflows/deploy-production.yml diff --git a/.github/workflows/validate-docker-compose.yml b/.github/workflows/validate-docker-compose.yml new file mode 100644 index 00000000..ddd16aab --- /dev/null +++ b/.github/workflows/validate-docker-compose.yml @@ -0,0 +1,317 @@ +name: Validate Docker Compose Files + +on: + pull_request: + branches: + - canary + paths: + - 'blueprints/**/docker-compose.yml' + - 'blueprints/**/template.toml' + workflow_dispatch: + +jobs: + validate-docker-compose: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Necesitamos el historial completo para comparar con base + + - name: Set up Docker Compose + run: | + echo "🐳 Setting up Docker Compose..." + # Docker Compose V2 viene preinstalado en ubuntu-latest + docker compose version + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20.16.0 + + - name: Set up pnpm + uses: pnpm/action-setup@v4 + with: + version: 8 + + - name: Install dependencies + run: | + echo "πŸ“¦ Installing Node.js dependencies..." + cd build-scripts && pnpm install + + - name: Get changed files + id: changed-files + run: | + echo "πŸ” Detecting changed files..." + + # Obtener la rama base + BASE_SHA=$(git merge-base HEAD origin/${{ github.base_ref }}) + + # Encontrar todos los archivos docker-compose.yml y template.toml modificados/agregados + CHANGED_COMPOSE=$(git diff --name-only --diff-filter=ACMRT $BASE_SHA HEAD | grep -E 'blueprints/.*/docker-compose\.yml$' || true) + CHANGED_TOML=$(git diff --name-only --diff-filter=ACMRT $BASE_SHA HEAD | grep -E 'blueprints/.*/template\.toml$' || true) + + # Crear lista de directorios ΓΊnicos que tienen cambios + CHANGED_DIRS=$(echo -e "$CHANGED_COMPOSE\n$CHANGED_TOML" | sed 's|blueprints/\([^/]*\)/.*|\1|' | sort -u) + + echo "Changed compose files:" + echo "$CHANGED_COMPOSE" | while read file; do [ -n "$file" ] && echo " - $file"; done + + echo "Changed TOML files:" + echo "$CHANGED_TOML" | while read file; do [ -n "$file" ] && echo " - $file"; done + + echo "Changed directories:" + echo "$CHANGED_DIRS" | while read dir; do [ -n "$dir" ] && echo " - $dir"; done + + # Guardar para usar en siguientes pasos + echo "compose_files<> $GITHUB_OUTPUT + echo "$CHANGED_COMPOSE" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + echo "toml_files<> $GITHUB_OUTPUT + echo "$CHANGED_TOML" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + echo "directories<> $GITHUB_OUTPUT + echo "$CHANGED_DIRS" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Validate Docker Compose files syntax + id: validate-compose-syntax + run: | + echo "πŸ” Validating Docker Compose files syntax..." + + ERROR=0 + COMPOSE_FILES="${{ steps.changed-files.outputs.compose_files }}" + + if [ -z "$COMPOSE_FILES" ]; then + echo "ℹ️ No docker-compose.yml files changed, skipping validation" + exit 0 + fi + + echo "$COMPOSE_FILES" | while read -r compose_file; do + if [ -z "$compose_file" ]; then + continue + fi + + TEMPLATE_DIR=$(dirname "$compose_file") + TEMPLATE_NAME=$(basename "$TEMPLATE_DIR") + + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "πŸ“¦ Validating syntax: $TEMPLATE_NAME" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + + # Validar sintaxis de docker-compose.yml usando docker compose + echo "πŸ” Validating docker-compose.yml syntax..." + if ! docker compose -f "$compose_file" config > /dev/null 2>&1; then + echo "❌ ERROR: docker-compose.yml syntax is invalid in $TEMPLATE_NAME" + echo "Running docker compose config to show errors:" + docker compose -f "$compose_file" config 2>&1 || true + ERROR=1 + else + echo "βœ… docker-compose.yml syntax is valid" + fi + + # Obtener lista de servicios del compose + SERVICES=$(docker compose -f "$compose_file" config --services 2>/dev/null || echo "") + echo "πŸ“‹ Services found in docker-compose.yml:" + echo "$SERVICES" | while read service; do + [ -n "$service" ] && echo " - $service" + done + + # Guardar servicios para validaciΓ³n posterior + echo "$SERVICES" > "/tmp/${TEMPLATE_NAME}_services.txt" + done + + if [ $ERROR -eq 1 ]; then + echo "" + echo "❌ Docker Compose syntax validation failed" + exit 1 + else + echo "" + echo "βœ… All Docker Compose files have valid syntax" + fi + + - name: Validate Docker Compose best practices + id: validate-compose-practices + run: | + echo "πŸ” Validating Docker Compose best practices..." + + ERROR=0 + COMPOSE_FILES="${{ steps.changed-files.outputs.compose_files }}" + + if [ -z "$COMPOSE_FILES" ]; then + echo "ℹ️ No docker-compose.yml files changed, skipping validation" + exit 0 + fi + + # Convert to array to avoid subshell issues with pipe + # This ensures ERROR=1 inside the loop propagates to the parent shell + mapfile -t COMPOSE_ARRAY <<< "$COMPOSE_FILES" + + for compose_file in "${COMPOSE_ARRAY[@]}"; do + if [ -z "$compose_file" ]; then + continue + fi + + TEMPLATE_DIR=$(dirname "$compose_file") + TEMPLATE_NAME=$(basename "$TEMPLATE_DIR") + + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "πŸ“¦ Validating best practices: $TEMPLATE_NAME" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + + # Validar usando el script de TypeScript + if ! (cd build-scripts && pnpm exec tsx validate-docker-compose.ts --file "../$compose_file" --verbose); then + ERROR=1 + fi + done + + if [ $ERROR -eq 1 ]; then + echo "" + echo "❌ Docker Compose best practices validation failed" + exit 1 + else + echo "" + echo "βœ… All Docker Compose files follow best practices" + fi + + - name: Validate template.toml files + id: validate-toml + run: | + echo "πŸ” Validating template.toml files..." + + ERROR=0 + DIRECTORIES="${{ steps.changed-files.outputs.directories }}" + + if [ -z "$DIRECTORIES" ]; then + echo "ℹ️ No template directories changed, skipping TOML validation" + exit 0 + fi + + # Convert to array to avoid subshell issues with pipe + # This ensures ERROR=1 inside the loop propagates to the parent shell + mapfile -t DIRS_ARRAY <<< "$DIRECTORIES" + + for template_dir in "${DIRS_ARRAY[@]}"; do + if [ -z "$template_dir" ]; then + continue + fi + + TEMPLATE_PATH="blueprints/$template_dir" + TOML_FILE="$TEMPLATE_PATH/template.toml" + + if [ ! -f "$TOML_FILE" ]; then + echo "⚠️ WARNING: template.toml not found in $template_dir (might be deleted)" + continue + fi + + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "πŸ“ Validating: $template_dir/template.toml" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + + # Validar usando el script de TypeScript con tsx + # Ejecutar desde build-scripts para tener acceso a node_modules + if ! (cd build-scripts && pnpm exec tsx validate-template.ts --dir "../$TEMPLATE_PATH" --verbose); then + ERROR=1 + fi + done + + if [ $ERROR -eq 1 ]; then + echo "" + echo "❌ template.toml validation failed" + exit 1 + else + echo "" + echo "βœ… All template.toml files are valid" + fi + + - name: Test Docker Compose (dry-run) + id: test-compose + run: | + echo "πŸ§ͺ Testing Docker Compose files (dry-run)..." + + ERROR=0 + DIRECTORIES="${{ steps.changed-files.outputs.directories }}" + + if [ -z "$DIRECTORIES" ]; then + echo "ℹ️ No template directories changed, skipping dry-run test" + exit 0 + fi + + echo "$DIRECTORIES" | while read -r template_dir; do + if [ -z "$template_dir" ]; then + continue + fi + + COMPOSE_FILE="blueprints/$template_dir/docker-compose.yml" + + if [ ! -f "$COMPOSE_FILE" ]; then + continue + fi + + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "πŸ§ͺ Testing: $template_dir" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + + # Cambiar al directorio del template para resolver rutas relativas + cd "blueprints/$template_dir" + + # Validar que docker-compose puede parsear el archivo completamente + echo "πŸ” Running docker compose config (full validation)..." + if docker compose config > /dev/null 2>&1; then + echo "βœ… Docker Compose file is fully valid and can be processed" + + # Mostrar informaciΓ³n ΓΊtil + echo "πŸ“‹ Configuration summary:" + docker compose config --services | while read service; do + [ -n "$service" ] && echo " Service: $service" + done + else + echo "❌ ERROR: Docker Compose file failed full validation" + docker compose config 2>&1 || true + ERROR=1 + fi + + cd - > /dev/null + done + + if [ $ERROR -eq 1 ]; then + echo "" + echo "❌ Docker Compose dry-run test failed" + exit 1 + else + echo "" + echo "βœ… All Docker Compose files passed dry-run test" + fi + + - name: Summary + if: always() + run: | + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "πŸ“Š Validation Summary" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + + if [ "${{ steps.validate-compose-syntax.outcome }}" == "success" ] && \ + [ "${{ steps.validate-compose-practices.outcome }}" == "success" ] && \ + [ "${{ steps.validate-toml.outcome }}" == "success" ] && \ + [ "${{ steps.test-compose.outcome }}" == "success" ]; then + echo "βœ… All validations passed!" + echo "" + echo "Your Docker Compose and template.toml files are valid and ready to merge." + else + echo "❌ Some validations failed. Please review the errors above." + echo "" + echo "Common issues to check:" + echo " - docker-compose.yml syntax errors" + echo " - template.toml syntax errors" + echo " - serviceName in template.toml must match service names in docker-compose.yml" + echo " - Avoid using container_name, explicit networks, or port mappings" + fi + diff --git a/.github/workflows/validate-meta.yml b/.github/workflows/validate-meta.yml index a394e7ec..8f9acb7a 100644 --- a/.github/workflows/validate-meta.yml +++ b/.github/workflows/validate-meta.yml @@ -2,10 +2,10 @@ name: Validate and Process Meta.json on: push: - branches: [main, master, develop] + branches: [canary] paths: ["meta.json"] pull_request: - branches: [main, master] + branches: [canary] paths: ["meta.json"] workflow_dispatch: diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 48cfaa8c..3e749b35 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -3,10 +3,10 @@ name: Validate Blueprints Structure and Meta on: pull_request: branches: - - main + - canary push: branches: - - main + - canary jobs: validate: diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b512c09d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/README.md b/README.md index 81ac50e3..b774c972 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,7 @@ We have a few helpers that are very common when creating a template, these are: -## General Suggestions when creating a template +## General Requirements when creating a template - Don't use this way in your docker compose file: @@ -225,4 +225,4 @@ services: 6. Now you can click on the Deploy Button and wait for the deployment to finish, and try to access to the service, if everything is correct you should access to the service and see the template working. -use the command `node dedupe-and-sort-meta.js` to deduplicate and sort the meta.json file. \ No newline at end of file +use the command `node dedupe-and-sort-meta.js` to deduplicate and sort the meta.json file. diff --git a/app/package-lock.json b/app/package-lock.json deleted file mode 100644 index 9579d3d9..00000000 --- a/app/package-lock.json +++ /dev/null @@ -1,4248 +0,0 @@ -{ - "name": "my-app", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "my-app", - "version": "0.0.0", - "dependencies": { - "@codemirror/autocomplete": "^6.18.6", - "@codemirror/lang-json": "^6.0.1", - "@codemirror/lang-yaml": "^6.1.1", - "@codemirror/language": "^6.10.1", - "@codemirror/legacy-modes": "6.4.0", - "@codemirror/view": "6.29.0", - "@iarna/toml": "^2.2.5", - "@radix-ui/react-dialog": "^1.1.6", - "@radix-ui/react-dropdown-menu": "^2.1.6", - "@radix-ui/react-label": "^2.1.2", - "@radix-ui/react-popover": "^1.1.6", - "@radix-ui/react-slot": "^1.1.2", - "@radix-ui/react-tabs": "^1.1.3", - "@tailwindcss/vite": "^4.0.12", - "@uiw/codemirror-theme-github": "^4.22.1", - "@uiw/react-codemirror": "^4.22.1", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "1.0.0", - "copy-to-clipboard": "^3.3.3", - "lucide-react": "^0.479.0", - "next-themes": "^0.4.5", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "react-router-dom": "^7.4.1", - "sonner": "^2.0.1", - "tailwind-merge": "^3.0.2", - "tailwindcss": "^4.0.12", - "tailwindcss-animate": "^1.0.7", - "vite-plugin-static-copy": "^2.3.2", - "yaml": "2.7.1", - "zustand": "^5.0.3" - }, - "devDependencies": { - "@types/node": "^20.8.2", - "@types/react": "^19.0.10", - "@types/react-dom": "^19.0.4", - "@vitejs/plugin-react": "^4.3.4", - "globals": "^15.15.0", - "typescript": "~5.7.2", - "vite": "^6.2.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", - "dev": true, - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.28.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz", - "integrity": "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@codemirror/autocomplete": { - "version": "6.18.6", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", - "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@codemirror/commands": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz", - "integrity": "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.27.0", - "@lezer/common": "^1.1.0" - } - }, - "node_modules/@codemirror/lang-json": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.2.tgz", - "integrity": "sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/json": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-yaml": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-yaml/-/lang-yaml-6.1.2.tgz", - "integrity": "sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.2.0", - "@lezer/lr": "^1.0.0", - "@lezer/yaml": "^1.0.0" - } - }, - "node_modules/@codemirror/language": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.2.tgz", - "integrity": "sha512-p44TsNArL4IVXDTbapUmEkAlvWs2CFQbcfc0ymDsis1kH2wh0gcY96AS29c/vp2d0y2Tquk1EDSaawpzilUiAw==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.23.0", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "node_modules/@codemirror/legacy-modes": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.4.0.tgz", - "integrity": "sha512-5m/K+1A6gYR0e+h/dEde7LoGimMjRtWXZFg4Lo70cc8HzjSdHe3fLwjWMR0VRl5KFT1SxalSap7uMgPKF28wBA==", - "dependencies": { - "@codemirror/language": "^6.0.0" - } - }, - "node_modules/@codemirror/lint": { - "version": "6.8.5", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz", - "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.35.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/lint/node_modules/@codemirror/view": { - "version": "6.38.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.38.1.tgz", - "integrity": "sha512-RmTOkE7hRU3OVREqFVITWHz6ocgBjv08GoePscAakgVQfciA3SGCEk7mb9IzwW61cKKmlTpHXG6DUE5Ubx+MGQ==", - "dependencies": { - "@codemirror/state": "^6.5.0", - "crelt": "^1.0.6", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@codemirror/search": { - "version": "6.5.11", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.11.tgz", - "integrity": "sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/state": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", - "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", - "dependencies": { - "@marijn/find-cluster-break": "^1.0.0" - } - }, - "node_modules/@codemirror/theme-one-dark": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", - "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/highlight": "^1.0.0" - } - }, - "node_modules/@codemirror/view": { - "version": "6.29.0", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.29.0.tgz", - "integrity": "sha512-ED4ims4fkf7eOA+HYLVP8VVg3NMllt1FPm9PEJBfYFnidKlRITBaua38u68L1F60eNtw2YNcDN5jsIzhKZwWQA==", - "dependencies": { - "@codemirror/state": "^6.4.0", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", - "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", - "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", - "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", - "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", - "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", - "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", - "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", - "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", - "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", - "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", - "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", - "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", - "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", - "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", - "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", - "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", - "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", - "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", - "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", - "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", - "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", - "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", - "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", - "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", - "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", - "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz", - "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz", - "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", - "dependencies": { - "@floating-ui/core": "^1.7.2", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.4.tgz", - "integrity": "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==", - "dependencies": { - "@floating-ui/dom": "^1.7.2" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==" - }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@lezer/common": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", - "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==" - }, - "node_modules/@lezer/highlight": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", - "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/json": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", - "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/lr": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", - "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/yaml": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@lezer/yaml/-/yaml-1.0.3.tgz", - "integrity": "sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.4.0" - } - }, - "node_modules/@marijn/find-cluster-break": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==" - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz", - "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.15.tgz", - "integrity": "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", - "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", - "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.15.tgz", - "integrity": "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popover": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz", - "integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-popper": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz", - "integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tabs": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.12.tgz", - "integrity": "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw==", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", - "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz", - "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz", - "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz", - "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz", - "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz", - "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz", - "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz", - "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz", - "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz", - "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz", - "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz", - "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz", - "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz", - "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz", - "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", - "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz", - "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz", - "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz", - "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", - "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", - "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", - "lightningcss": "1.30.1", - "magic-string": "^0.30.17", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.11" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", - "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", - "hasInstallScript": true, - "dependencies": { - "detect-libc": "^2.0.4", - "tar": "^7.4.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.11", - "@tailwindcss/oxide-darwin-arm64": "4.1.11", - "@tailwindcss/oxide-darwin-x64": "4.1.11", - "@tailwindcss/oxide-freebsd-x64": "4.1.11", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", - "@tailwindcss/oxide-linux-x64-musl": "4.1.11", - "@tailwindcss/oxide-wasm32-wasi": "4.1.11", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", - "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", - "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", - "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", - "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", - "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", - "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", - "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", - "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", - "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", - "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@emnapi/wasi-threads": "^1.0.2", - "@napi-rs/wasm-runtime": "^0.2.11", - "@tybys/wasm-util": "^0.9.0", - "tslib": "^2.8.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", - "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", - "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.11.tgz", - "integrity": "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==", - "dependencies": { - "@tailwindcss/node": "4.1.11", - "@tailwindcss/oxide": "4.1.11", - "tailwindcss": "4.1.11" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6 || ^7" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.19.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz", - "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", - "dev": true, - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/react": { - "version": "19.1.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", - "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", - "dev": true, - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.1.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", - "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", - "dev": true, - "peerDependencies": { - "@types/react": "^19.0.0" - } - }, - "node_modules/@uiw/codemirror-extensions-basic-setup": { - "version": "4.24.1", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.24.1.tgz", - "integrity": "sha512-o1m1a8eUS3fWERMbDFvN8t8sZUFPgDKNemmlQ5Ot2vKm+Ax84lKP1dhEFgkiOaZ1bDHk4T5h6SjHuTghrJHKww==", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@codemirror/autocomplete": ">=6.0.0", - "@codemirror/commands": ">=6.0.0", - "@codemirror/language": ">=6.0.0", - "@codemirror/lint": ">=6.0.0", - "@codemirror/search": ">=6.0.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/view": ">=6.0.0" - } - }, - "node_modules/@uiw/codemirror-theme-github": { - "version": "4.24.1", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-github/-/codemirror-theme-github-4.24.1.tgz", - "integrity": "sha512-dl4qFEXINE4TFus7ALMfjFUCl7sWLkqTdaSaln0Vv3s+HVzSMAh5lkEdnH3yPcOOCl5ehYG4zIx8bqEnA2/FYQ==", - "dependencies": { - "@uiw/codemirror-themes": "4.24.1" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, - "node_modules/@uiw/codemirror-themes": { - "version": "4.24.1", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.24.1.tgz", - "integrity": "sha512-hduBbFNiWNW6nYa2/giKQ9YpzhWNw87BGpCjC+cXYMZ7bCD6q5DC6Hw+7z7ZwSzEaOQvV91lmirOjJ8hn9+pkg==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@codemirror/language": ">=6.0.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/view": ">=6.0.0" - } - }, - "node_modules/@uiw/react-codemirror": { - "version": "4.24.1", - "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.24.1.tgz", - "integrity": "sha512-BivF4NLqbuBQK5gPVhSkOARi9nPXw8X5r25EnInPeY+I9l1dfEX8O9V6+0xHTlGHyUo0cNfGEF9t1KHEicUfJw==", - "dependencies": { - "@babel/runtime": "^7.18.6", - "@codemirror/commands": "^6.1.0", - "@codemirror/state": "^6.1.1", - "@codemirror/theme-one-dark": "^6.0.0", - "@uiw/codemirror-extensions-basic-setup": "4.24.1", - "codemirror": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@babel/runtime": ">=7.11.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/theme-one-dark": ">=6.0.0", - "@codemirror/view": ">=6.0.0", - "codemirror": ">=6.0.0", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001727", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", - "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "engines": { - "node": ">=18" - } - }, - "node_modules/class-variance-authority": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", - "dependencies": { - "clsx": "^2.1.1" - }, - "funding": { - "url": "https://polar.sh/cva" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmdk": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz", - "integrity": "sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==", - "dependencies": { - "@radix-ui/react-dialog": "1.0.5", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", - "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", - "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", - "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", - "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-controllable-state": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", - "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-escape-keydown": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", - "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", - "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", - "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-portal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", - "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-presence": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", - "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", - "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", - "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", - "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", - "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", - "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", - "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/codemirror": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", - "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.188", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.188.tgz", - "integrity": "sha512-pfEx5CBFAocOKNrc+i5fSvhDaI1Vr9R9aT5uX1IzM3hhdL6k649wfuUcdUd9EZnmbE1xdfA51CwqQ61CO3Xl3g==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/esbuild": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", - "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.8", - "@esbuild/android-arm": "0.25.8", - "@esbuild/android-arm64": "0.25.8", - "@esbuild/android-x64": "0.25.8", - "@esbuild/darwin-arm64": "0.25.8", - "@esbuild/darwin-x64": "0.25.8", - "@esbuild/freebsd-arm64": "0.25.8", - "@esbuild/freebsd-x64": "0.25.8", - "@esbuild/linux-arm": "0.25.8", - "@esbuild/linux-arm64": "0.25.8", - "@esbuild/linux-ia32": "0.25.8", - "@esbuild/linux-loong64": "0.25.8", - "@esbuild/linux-mips64el": "0.25.8", - "@esbuild/linux-ppc64": "0.25.8", - "@esbuild/linux-riscv64": "0.25.8", - "@esbuild/linux-s390x": "0.25.8", - "@esbuild/linux-x64": "0.25.8", - "@esbuild/netbsd-arm64": "0.25.8", - "@esbuild/netbsd-x64": "0.25.8", - "@esbuild/openbsd-arm64": "0.25.8", - "@esbuild/openbsd-x64": "0.25.8", - "@esbuild/openharmony-arm64": "0.25.8", - "@esbuild/sunos-x64": "0.25.8", - "@esbuild/win32-arm64": "0.25.8", - "@esbuild/win32-ia32": "0.25.8", - "@esbuild/win32-x64": "0.25.8" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dev": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/lightningcss": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", - "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.30.1", - "lightningcss-darwin-x64": "1.30.1", - "lightningcss-freebsd-x64": "1.30.1", - "lightningcss-linux-arm-gnueabihf": "1.30.1", - "lightningcss-linux-arm64-gnu": "1.30.1", - "lightningcss-linux-arm64-musl": "1.30.1", - "lightningcss-linux-x64-gnu": "1.30.1", - "lightningcss-linux-x64-musl": "1.30.1", - "lightningcss-win32-arm64-msvc": "1.30.1", - "lightningcss-win32-x64-msvc": "1.30.1" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", - "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", - "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", - "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", - "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", - "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", - "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", - "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", - "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", - "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", - "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.479.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.479.0.tgz", - "integrity": "sha512-aBhNnveRhorBOK7uA4gDjgaf+YlHMdMhQ/3cupk6exM10hWlEU+2QtWYOfhXhjAsmdb6LeKR+NZnow4UxRRiTQ==", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/next-themes": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", - "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.0" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", - "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-router": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.7.0.tgz", - "integrity": "sha512-3FUYSwlvB/5wRJVTL/aavqHmfUKe0+Xm9MllkYgGo9eDwNdkvwlJGjpPxono1kCycLt6AnDTgjmXvK3/B4QGuw==", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.7.0.tgz", - "integrity": "sha512-wwGS19VkNBkneVh9/YD0pK3IsjWxQUVMDD6drlG7eJpo1rXBtctBqDyBm/k+oKHRAm1x9XWT3JFC82QI9YOXXA==", - "dependencies": { - "react-router": "7.7.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", - "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.45.1", - "@rollup/rollup-android-arm64": "4.45.1", - "@rollup/rollup-darwin-arm64": "4.45.1", - "@rollup/rollup-darwin-x64": "4.45.1", - "@rollup/rollup-freebsd-arm64": "4.45.1", - "@rollup/rollup-freebsd-x64": "4.45.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", - "@rollup/rollup-linux-arm-musleabihf": "4.45.1", - "@rollup/rollup-linux-arm64-gnu": "4.45.1", - "@rollup/rollup-linux-arm64-musl": "4.45.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-musl": "4.45.1", - "@rollup/rollup-linux-s390x-gnu": "4.45.1", - "@rollup/rollup-linux-x64-gnu": "4.45.1", - "@rollup/rollup-linux-x64-musl": "4.45.1", - "@rollup/rollup-win32-arm64-msvc": "4.45.1", - "@rollup/rollup-win32-ia32-msvc": "4.45.1", - "@rollup/rollup-win32-x64-msvc": "4.45.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" - }, - "node_modules/sonner": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.6.tgz", - "integrity": "sha512-yHFhk8T/DK3YxjFQXIrcHT1rGEeTLliVzWbO0xN8GberVun2RiBnxAjXAYpZrqwEVHBG9asI/Li8TAAhN9m59Q==", - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", - "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/style-mod": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", - "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==" - }, - "node_modules/tailwind-merge": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", - "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", - "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==" - }, - "node_modules/tailwindcss-animate": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", - "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" - } - }, - "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/vite": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", - "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-plugin-static-copy": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.2.tgz", - "integrity": "sha512-iwrrf+JupY4b9stBttRWzGHzZbeMjAHBhkrn67MNACXJVjEMRpCI10Q3AkxdBkl45IHaTfw/CNVevzQhP7yTwg==", - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.3", - "fast-glob": "^3.2.11", - "fs-extra": "^11.1.0", - "p-map": "^7.0.3", - "picocolors": "^1.0.0" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0" - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/zustand": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.6.tgz", - "integrity": "sha512-ihAqNeUVhe0MAD+X8M5UzqyZ9k3FFZLBTtqo6JLPwV53cbRB/mJwBI0PxcIgqhBBHlEs8G45OTDTMq3gNcLq3A==", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - } - } -} diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml index 9fec5d4b..2d26f18e 100644 --- a/app/pnpm-lock.yaml +++ b/app/pnpm-lock.yaml @@ -9,17 +9,17 @@ importers: .: dependencies: '@codemirror/autocomplete': - specifier: ^6.18.6 - version: 6.18.6 + specifier: ^6.19.1 + version: 6.19.1 '@codemirror/lang-json': - specifier: ^6.0.1 - version: 6.0.1 + specifier: ^6.0.2 + version: 6.0.2 '@codemirror/lang-yaml': - specifier: ^6.1.1 + specifier: ^6.1.2 version: 6.1.2 '@codemirror/language': - specifier: ^6.10.1 - version: 6.10.8 + specifier: ^6.11.3 + version: 6.11.3 '@codemirror/legacy-modes': specifier: 6.4.0 version: 6.4.0 @@ -30,32 +30,32 @@ importers: specifier: ^2.2.5 version: 2.2.5 '@radix-ui/react-dialog': - specifier: ^1.1.6 - version: 1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@radix-ui/react-dropdown-menu': - specifier: ^2.1.6 - version: 2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^2.1.16 + version: 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@radix-ui/react-label': - specifier: ^2.1.2 - version: 2.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^2.1.7 + version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@radix-ui/react-popover': - specifier: ^1.1.6 - version: 1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^1.1.15 + version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@radix-ui/react-slot': - specifier: ^1.1.2 - version: 1.1.2(@types/react@19.0.10)(react@19.0.0) + specifier: ^1.2.3 + version: 1.2.4(@types/react@19.2.4)(react@19.2.0) '@radix-ui/react-tabs': - specifier: ^1.1.3 - version: 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^1.1.13 + version: 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tailwindcss/vite': - specifier: ^4.0.12 - version: 4.0.12(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)) + specifier: ^4.1.16 + version: 4.1.17(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.1)) '@uiw/codemirror-theme-github': - specifier: ^4.22.1 - version: 4.23.10(@codemirror/language@6.10.8)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0) + specifier: ^4.25.2 + version: 4.25.3(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0) '@uiw/react-codemirror': - specifier: ^4.22.1 - version: 4.23.10(@babel/runtime@7.26.9)(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.10.8)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.10)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.29.0)(codemirror@6.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^4.25.2 + version: 4.25.3(@babel/runtime@7.26.9)(@codemirror/autocomplete@6.19.1)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.10)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.29.0)(codemirror@6.0.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -64,123 +64,131 @@ importers: version: 2.1.1 cmdk: specifier: 1.0.0 - version: 1.0.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 1.0.0(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) copy-to-clipboard: specifier: ^3.3.3 version: 3.3.3 lucide-react: specifier: ^0.479.0 - version: 0.479.0(react@19.0.0) + version: 0.479.0(react@19.2.0) next-themes: - specifier: ^0.4.5 - version: 0.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^0.4.6 + version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: - specifier: ^19.0.0 - version: 19.0.0 + specifier: ^19.2.0 + version: 19.2.0 react-dom: - specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + specifier: ^19.2.0 + version: 19.2.0(react@19.2.0) react-router-dom: - specifier: ^7.4.1 - version: 7.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.9.4 + version: 7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) sonner: - specifier: ^2.0.1 - version: 2.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^2.0.7 + version: 2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tailwind-merge: - specifier: ^3.0.2 - version: 3.0.2 + specifier: ^3.3.1 + version: 3.4.0 tailwindcss: - specifier: ^4.0.12 - version: 4.0.12 + specifier: ^4.1.16 + version: 4.1.17 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@4.0.12) + version: 1.0.7(tailwindcss@4.1.17) vite-plugin-static-copy: - specifier: 2.3.0 - version: 2.3.0(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)) + specifier: ^2.3.2 + version: 2.3.2(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.1)) yaml: specifier: 2.7.1 version: 2.7.1 zustand: - specifier: ^5.0.3 - version: 5.0.3(@types/react@19.0.10)(react@19.0.0) + specifier: ^5.0.8 + version: 5.0.8(@types/react@19.2.4)(react@19.2.0) devDependencies: '@types/node': - specifier: ^20.8.2 - version: 20.17.24 + specifier: ^20.19.23 + version: 20.19.25 '@types/react': - specifier: ^19.0.10 - version: 19.0.10 + specifier: ^19.2.2 + version: 19.2.4 '@types/react-dom': - specifier: ^19.0.4 - version: 19.0.4(@types/react@19.0.10) + specifier: ^19.2.2 + version: 19.2.3(@types/react@19.2.4) '@vitejs/plugin-react': - specifier: ^4.3.4 - version: 4.3.4(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)) + specifier: ^4.7.0 + version: 4.7.0(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.1)) globals: specifier: ^15.15.0 version: 15.15.0 typescript: - specifier: ~5.7.2 + specifier: ~5.7.3 version: 5.7.3 vite: - specifier: ^6.2.0 - version: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1) + specifier: ^6.4.1 + version: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.1) packages: - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.9': - resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.9': - resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.26.9': - resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} '@babel/parser@7.26.9': @@ -188,14 +196,19 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -204,32 +217,36 @@ packages: resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} engines: {node: '>=6.9.0'} - '@babel/template@7.26.9': - resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.9': - resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} '@babel/types@7.26.9': resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} engines: {node: '>=6.9.0'} - '@codemirror/autocomplete@6.18.6': - resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@codemirror/autocomplete@6.19.1': + resolution: {integrity: sha512-q6NenYkEy2fn9+JyjIxMWcNjzTL/IhwqfzOut1/G3PrIFkrbl4AL7Wkse5tLrQUUyqGoAKU5+Pi5jnnXxH5HGw==} '@codemirror/commands@6.8.0': resolution: {integrity: sha512-q8VPEFaEP4ikSlt6ZxjB3zW72+7osfAYW9i8Zu943uqbKuz6utc1+F170hyLUCUltXORjQXRyYQNfkckzA/bPQ==} - '@codemirror/lang-json@6.0.1': - resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==} + '@codemirror/lang-json@6.0.2': + resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==} '@codemirror/lang-yaml@6.1.2': resolution: {integrity: sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==} - '@codemirror/language@6.10.8': - resolution: {integrity: sha512-wcP8XPPhDH2vTqf181U8MbZnW+tDyPYy0UzVOa+oHORjyT+mhhom9vBd7dApJwoDz9Nb/a8kHjJIsuA/t8vNFw==} + '@codemirror/language@6.11.3': + resolution: {integrity: sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==} '@codemirror/legacy-modes@6.4.0': resolution: {integrity: sha512-5m/K+1A6gYR0e+h/dEde7LoGimMjRtWXZFg4Lo70cc8HzjSdHe3fLwjWMR0VRl5KFT1SxalSap7uMgPKF28wBA==} @@ -420,10 +437,16 @@ packages: '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -435,9 +458,15 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@lezer/common@1.2.3': resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} @@ -471,11 +500,11 @@ packages: '@radix-ui/primitive@1.0.1': resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - '@radix-ui/primitive@1.1.1': - resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - '@radix-ui/react-arrow@1.1.2': - resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==} + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -487,8 +516,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collection@1.1.2': - resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -509,8 +538,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-compose-refs@1.1.1': - resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -527,8 +556,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-context@1.1.1': - resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -549,8 +578,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dialog@1.1.6': - resolution: {integrity: sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==} + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -562,8 +591,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-direction@1.1.0': - resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -584,8 +613,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dismissable-layer@1.1.5': - resolution: {integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==} + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -597,8 +626,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dropdown-menu@2.1.6': - resolution: {integrity: sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==} + '@radix-ui/react-dropdown-menu@2.1.16': + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -619,8 +648,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-guards@1.1.1': - resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -641,8 +670,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-scope@1.1.2': - resolution: {integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==} + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -663,8 +692,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-id@1.1.0': - resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -672,8 +701,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-label@2.1.2': - resolution: {integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==} + '@radix-ui/react-label@2.1.8': + resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -685,8 +714,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-menu@2.1.6': - resolution: {integrity: sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==} + '@radix-ui/react-menu@2.1.16': + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -698,8 +727,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popover@1.1.6': - resolution: {integrity: sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==} + '@radix-ui/react-popover@1.1.15': + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -711,8 +740,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popper@1.2.2': - resolution: {integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==} + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -737,8 +766,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.4': - resolution: {integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==} + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -763,8 +792,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.2': - resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -789,8 +818,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.0.2': - resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -802,8 +831,21 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-roving-focus@1.1.2': - resolution: {integrity: sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==} + '@radix-ui/react-primitive@2.1.4': + resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -824,8 +866,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-slot@1.1.2': - resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -833,8 +875,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-tabs@1.1.3': - resolution: {integrity: sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==} + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tabs@1.1.13': + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -855,8 +906,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-callback-ref@1.1.0': - resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -873,8 +924,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-controllable-state@1.1.0': - resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -891,8 +951,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-escape-keydown@1.1.0': - resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -909,8 +969,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-layout-effect@1.1.0': - resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -918,8 +978,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-rect@1.1.0': - resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -927,8 +987,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-size@1.1.0': - resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -936,8 +996,11 @@ packages: '@types/react': optional: true - '@radix-ui/rect@1.1.0': - resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} '@rollup/rollup-android-arm-eabi@4.35.0': resolution: {integrity: sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==} @@ -1034,83 +1097,95 @@ packages: cpu: [x64] os: [win32] - '@tailwindcss/node@4.0.12': - resolution: {integrity: sha512-a6J11K1Ztdln9OrGfoM75/hChYPcHYGNYimqciMrvKXRmmPaS8XZTHhdvb5a3glz4Kd4ZxE1MnuFE2c0fGGmtg==} + '@tailwindcss/node@4.1.17': + resolution: {integrity: sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==} - '@tailwindcss/oxide-android-arm64@4.0.12': - resolution: {integrity: sha512-dAXCaemu3mHLXcA5GwGlQynX8n7tTdvn5i1zAxRvZ5iC9fWLl5bGnjZnzrQqT7ttxCvRwdVf3IHUnMVdDBO/kQ==} + '@tailwindcss/oxide-android-arm64@4.1.17': + resolution: {integrity: sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.0.12': - resolution: {integrity: sha512-vPNI+TpJQ7sizselDXIJdYkx9Cu6JBdtmRWujw9pVIxW8uz3O2PjgGGzL/7A0sXI8XDjSyRChrUnEW9rQygmJQ==} + '@tailwindcss/oxide-darwin-arm64@4.1.17': + resolution: {integrity: sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.0.12': - resolution: {integrity: sha512-RL/9jM41Fdq4Efr35C5wgLx98BirnrfwuD+zgMFK6Ir68HeOSqBhW9jsEeC7Y/JcGyPd3MEoJVIU4fAb7YLg7A==} + '@tailwindcss/oxide-darwin-x64@4.1.17': + resolution: {integrity: sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.0.12': - resolution: {integrity: sha512-7WzWiax+LguJcMEimY0Q4sBLlFXu1tYxVka3+G2M9KmU/3m84J3jAIV4KZWnockbHsbb2XgrEjtlJKVwHQCoRA==} + '@tailwindcss/oxide-freebsd-x64@4.1.17': + resolution: {integrity: sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.12': - resolution: {integrity: sha512-X9LRC7jjE1QlfIaBbXjY0PGeQP87lz5mEfLSVs2J1yRc9PSg1tEPS9NBqY4BU9v5toZgJgzKeaNltORyTs22TQ==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': + resolution: {integrity: sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.0.12': - resolution: {integrity: sha512-i24IFNq2402zfDdoWKypXz0ZNS2G4NKaA82tgBlE2OhHIE+4mg2JDb5wVfyP6R+MCm5grgXvurcIcKWvo44QiQ==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': + resolution: {integrity: sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.0.12': - resolution: {integrity: sha512-LmOdshJBfAGIBG0DdBWhI0n5LTMurnGGJCHcsm9F//ISfsHtCnnYIKgYQui5oOz1SUCkqsMGfkAzWyNKZqbGNw==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': + resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.0.12': - resolution: {integrity: sha512-OSK667qZRH30ep8RiHbZDQfqkXjnzKxdn0oRwWzgCO8CoTxV+MvIkd0BWdQbYtYuM1wrakARV/Hwp0eA/qzdbw==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': + resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.0.12': - resolution: {integrity: sha512-uylhWq6OWQ8krV8Jk+v0H/3AZKJW6xYMgNMyNnUbbYXWi7hIVdxRKNUB5UvrlC3RxtgsK5EAV2i1CWTRsNcAnA==} + '@tailwindcss/oxide-linux-x64-musl@4.1.17': + resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-win32-arm64-msvc@4.0.12': - resolution: {integrity: sha512-XDLnhMoXZEEOir1LK43/gHHwK84V1GlV8+pAncUAIN2wloeD+nNciI9WRIY/BeFTqES22DhTIGoilSO39xDb2g==} + '@tailwindcss/oxide-wasm32-wasi@4.1.17': + resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': + resolution: {integrity: sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.0.12': - resolution: {integrity: sha512-I/BbjCLpKDQucvtn6rFuYLst1nfFwSMYyPzkx/095RE+tuzk5+fwXuzQh7T3fIBTcbn82qH/sFka7yPGA50tLw==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + resolution: {integrity: sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.0.12': - resolution: {integrity: sha512-DWb+myvJB9xJwelwT9GHaMc1qJj6MDXRDR0CS+T8IdkejAtu8ctJAgV4r1drQJLPeS7mNwq2UHW2GWrudTf63A==} + '@tailwindcss/oxide@4.1.17': + resolution: {integrity: sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==} engines: {node: '>= 10'} - '@tailwindcss/vite@4.0.12': - resolution: {integrity: sha512-JM3gp601UJiryIZ9R2bSqalzcOy15RCybQ1Q+BJqDEwVyo4LkWKeqQAcrpHapWXY31OJFTuOUVBFDWMhzHm2Bg==} + '@tailwindcss/vite@4.1.17': + resolution: {integrity: sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==} peerDependencies: - vite: ^5.2.0 || ^6 + vite: ^5.2.0 || ^6 || ^7 '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1124,25 +1199,22 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/node@20.17.24': - resolution: {integrity: sha512-d7fGCyB96w9BnWQrOsJtpyiSaBcAYYr75bnK6ZRjDbql2cGLj/3GsL5OYmLPNq76l7Gf2q4Rv9J2o6h5CrD9sA==} + '@types/node@20.19.25': + resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} - '@types/react-dom@19.0.4': - resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: - '@types/react': ^19.0.0 + '@types/react': ^19.2.0 - '@types/react@19.0.10': - resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} + '@types/react@19.2.4': + resolution: {integrity: sha512-tBFxBp9Nfyy5rsmefN+WXc1JeW/j2BpBHFdLZbEVfs9wn3E3NRFxwV0pJg8M1qQAexFpvz73hJXFofV0ZAu92A==} - '@uiw/codemirror-extensions-basic-setup@4.23.10': - resolution: {integrity: sha512-zpbmSeNs3OU/f/Eyd6brFnjsBUYwv2mFjWxlAsIRSwTlW+skIT60rQHFBSfsj/5UVSxSLWVeUYczN7AyXvgTGQ==} + '@uiw/codemirror-extensions-basic-setup@4.25.3': + resolution: {integrity: sha512-F1doRyD50CWScwGHG2bBUtUpwnOv/zqSnzkZqJcX5YAHQx6Z1CuX8jdnFMH6qktRrPU1tfpNYftTWu3QIoHiMA==} peerDependencies: '@codemirror/autocomplete': '>=6.0.0' '@codemirror/commands': '>=6.0.0' @@ -1152,32 +1224,32 @@ packages: '@codemirror/state': '>=6.0.0' '@codemirror/view': '>=6.0.0' - '@uiw/codemirror-theme-github@4.23.10': - resolution: {integrity: sha512-jTg2sHAcU1d+8x0O+EBDI71rtJ8PWKIW8gzy+SW4wShQTAdsqGHk5y1ynt3KIeoaUkqngLqAK4SkhPaUKlqZqg==} + '@uiw/codemirror-theme-github@4.25.3': + resolution: {integrity: sha512-KdmcO9VicsBgsDErNrNBqwMuTbJRIpeMl9oIjmrNx2iEfIDSOMBIKlX+BkgwTAU+VmhqYY/68/kmF1K8z2FxrQ==} - '@uiw/codemirror-themes@4.23.10': - resolution: {integrity: sha512-dU0UgEEgEXCAYpxuVDQ6fovE82XsqgHZckTJOH6Bs8xCi3Z7dwBKO4pXuiA8qGDwTOXOMjSzfi+pRViDm7OfWw==} + '@uiw/codemirror-themes@4.25.3': + resolution: {integrity: sha512-k7/B7Vf4jU/WcdewgJWP9tMFxbjB6UpUymZ3fx/TsbGwt2JXAouw0uyqCn1RlYBfr7YQnvEs3Ju9ECkd2sKzdg==} peerDependencies: '@codemirror/language': '>=6.0.0' '@codemirror/state': '>=6.0.0' '@codemirror/view': '>=6.0.0' - '@uiw/react-codemirror@4.23.10': - resolution: {integrity: sha512-AbN4eVHOL4ckRuIXpZxkzEqL/1ChVA+BSdEnAKjIB68pLQvKsVoYbiFP8zkXkYc4+Fcgq5KbAjvYqdo4ewemKw==} + '@uiw/react-codemirror@4.25.3': + resolution: {integrity: sha512-1wtBZTXPIp8u6F/xjHvsUAYlEeF5Dic4xZBnqJyLzv7o7GjGYEUfSz9Z7bo9aK9GAx2uojG/AuBMfhA4uhvIVQ==} peerDependencies: '@babel/runtime': '>=7.11.0' '@codemirror/state': '>=6.0.0' '@codemirror/theme-one-dark': '>=6.0.0' '@codemirror/view': '>=6.0.0' codemirror: '>=6.0.0' - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' - '@vitejs/plugin-react@4.3.4': - resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -1258,8 +1330,8 @@ packages: electron-to-chromium@1.5.113: resolution: {integrity: sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} esbuild@0.25.1: @@ -1278,6 +1350,15 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1303,10 +1384,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} @@ -1330,8 +1407,8 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true js-tokens@4.0.0: @@ -1350,68 +1427,74 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - lightningcss-darwin-arm64@1.29.2: - resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==} + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.29.2: - resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==} + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.29.2: - resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==} + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.29.2: - resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==} + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.29.2: - resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==} + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.29.2: - resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==} + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.29.2: - resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==} + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.29.2: - resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==} + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.29.2: - resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==} + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.29.2: - resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==} + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.29.2: - resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==} + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} lru-cache@5.1.1: @@ -1422,6 +1505,9 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1438,8 +1524,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - next-themes@0.4.5: - resolution: {integrity: sha512-E8/gYKBxZknOXBiDk/sRokAvkOw35PTUD4Gxtq1eBhd0r4Dx5S42zU65/q8ozR5rcSG2ZlE1E3+ShlUpC7an+A==} + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc @@ -1462,6 +1548,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -1469,13 +1559,13 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} peerDependencies: - react: ^19.0.0 + react: ^19.2.0 - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} react-remove-scroll-bar@2.3.8: @@ -1508,15 +1598,15 @@ packages: '@types/react': optional: true - react-router-dom@7.4.1: - resolution: {integrity: sha512-L3/4tig0Lvs6m6THK0HRV4eHUdpx0dlJasgCxXKnavwhh4tKYgpuZk75HRYNoRKDyDWi9QgzGXsQ1oQSBlWpAA==} + react-router-dom@7.9.6: + resolution: {integrity: sha512-2MkC2XSXq6HjGcihnx1s0DBWQETI4mlis4Ux7YTLvP67xnGxCvq+BcCQSO81qQHVUTM1V53tl4iVVaY5sReCOA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' react-dom: '>=18' - react-router@7.4.1: - resolution: {integrity: sha512-Vmizn9ZNzxfh3cumddqv3kLOKvc7AskUT0dC1prTabhiEi0U4A33LmkDOJ79tXaeSqCqMBXBU/ySX88W85+EUg==} + react-router@7.9.6: + resolution: {integrity: sha512-Y1tUp8clYRXpfPITyuifmSoE2vncSME18uVLgaqyxh9H35JWpIfzHo+9y3Fzh5odk/jxPW29IgLgzcdwxGqyNA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -1535,8 +1625,8 @@ packages: '@types/react': optional: true - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} engines: {node: '>=0.10.0'} readdirp@3.6.0: @@ -1558,8 +1648,8 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -1568,8 +1658,8 @@ packages: set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} - sonner@2.0.1: - resolution: {integrity: sha512-FRBphaehZ5tLdLcQ8g2WOIRE+Y7BCfWi5Zyd8bCvBjiW8TxxAyoWZIxS661Yz6TGPqFQ4VLzOF89WEYhfynSFQ==} + sonner@2.0.7: + resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -1581,21 +1671,25 @@ packages: style-mod@4.1.2: resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} - tailwind-merge@3.0.2: - resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@4.0.12: - resolution: {integrity: sha512-bT0hJo91FtncsAMSsMzUkoo/iEU0Xs5xgFgVC9XmdM9bw5MhZuQFjPNl6wxAE0SiQF/YTZJa+PndGWYSDtuxAg==} + tailwindcss@4.1.17: + resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1606,16 +1700,13 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-stream@2.4.0: - resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} - typescript@5.7.3: resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -1647,14 +1738,14 @@ packages: '@types/react': optional: true - vite-plugin-static-copy@2.3.0: - resolution: {integrity: sha512-LLKwhhHetGaCnWz4mas4qqjjguDka6/6b4+SeIohRroj8aCE7QTfiZECfPecslFQkWZ3HdQuq5kOPmWZjNYlKA==} + vite-plugin-static-copy@2.3.2: + resolution: {integrity: sha512-iwrrf+JupY4b9stBttRWzGHzZbeMjAHBhkrn67MNACXJVjEMRpCI10Q3AkxdBkl45IHaTfw/CNVevzQhP7yTwg==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 - vite@6.2.1: - resolution: {integrity: sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==} + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -1704,8 +1795,8 @@ packages: engines: {node: '>= 14'} hasBin: true - zustand@5.0.3: - resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + zustand@5.0.8: + resolution: {integrity: sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -1724,31 +1815,26 @@ packages: snapshots: - '@ampproject/remapping@2.3.0': + '@babel/code-frame@7.27.1': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.28.5': {} - '@babel/core@7.26.9': + '@babel/core@7.28.5': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helpers': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -1757,84 +1843,94 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.26.9': + '@babel/generator@7.28.5': dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.26.5': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-module-imports@7.25.9': + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.27.1': {} '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helpers@7.26.9': + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': dependencies: - '@babel/template': 7.26.9 - '@babel/types': 7.26.9 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 '@babel/parser@7.26.9': dependencies: '@babel/types': 7.26.9 - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.9)': + '@babel/parser@7.28.5': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/types': 7.28.5 - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.9)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.26.9': + '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - '@babel/traverse@7.26.9': + '@babel/traverse@7.28.5': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/template': 7.26.9 - '@babel/types': 7.26.9 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 debug: 4.4.0 - globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -1843,36 +1939,41 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@codemirror/autocomplete@6.18.6': + '@babel/types@7.28.5': dependencies: - '@codemirror/language': 6.10.8 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@codemirror/autocomplete@6.19.1': + dependencies: + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 '@codemirror/view': 6.29.0 '@lezer/common': 1.2.3 '@codemirror/commands@6.8.0': dependencies: - '@codemirror/language': 6.10.8 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 '@codemirror/view': 6.29.0 '@lezer/common': 1.2.3 - '@codemirror/lang-json@6.0.1': + '@codemirror/lang-json@6.0.2': dependencies: - '@codemirror/language': 6.10.8 + '@codemirror/language': 6.11.3 '@lezer/json': 1.0.3 '@codemirror/lang-yaml@6.1.2': dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.10.8 + '@codemirror/autocomplete': 6.19.1 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 '@lezer/common': 1.2.3 '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 '@lezer/yaml': 1.0.3 - '@codemirror/language@6.10.8': + '@codemirror/language@6.11.3': dependencies: '@codemirror/state': 6.5.2 '@codemirror/view': 6.29.0 @@ -1883,7 +1984,7 @@ snapshots: '@codemirror/legacy-modes@6.4.0': dependencies: - '@codemirror/language': 6.10.8 + '@codemirror/language': 6.11.3 '@codemirror/lint@6.8.4': dependencies: @@ -1903,7 +2004,7 @@ snapshots: '@codemirror/theme-one-dark@6.1.2': dependencies: - '@codemirror/language': 6.10.8 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 '@codemirror/view': 6.29.0 '@lezer/highlight': 1.2.1 @@ -2004,33 +2105,50 @@ snapshots: '@floating-ui/core': 1.6.9 '@floating-ui/utils': 0.2.9 - '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react-dom@2.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@floating-ui/dom': 1.6.13 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) '@floating-ui/utils@0.2.9': {} '@iarna/toml@2.2.5': {} + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@lezer/common@1.2.3': {} '@lezer/highlight@1.2.1': @@ -2071,454 +2189,480 @@ snapshots: dependencies: '@babel/runtime': 7.26.9 - '@radix-ui/primitive@1.1.1': {} + '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-compose-refs@1.0.1(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-compose-refs@1.0.1(@types/react@19.2.4)(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - react: 19.0.0 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.4)(react@19.2.0)': dependencies: - react: 19.0.0 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-context@1.0.1(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-context@1.0.1(@types/react@19.2.4)(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - react: 19.0.0 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-context@1.1.1(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.4)(react@19.2.0)': dependencies: - react: 19.0.0 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-dialog@1.0.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dialog@1.0.5(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-context': 1.0.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-id': 1.0.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.0.2(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@19.2.4)(react@19.2.0) aria-hidden: 1.2.4 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.5.5(@types/react@19.0.10)(react@19.0.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.5.5(@types/react@19.2.4)(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-dialog@1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.4)(react@19.2.0) aria-hidden: 1.2.4 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.6.3(@types/react@19.0.10)(react@19.0.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.6.3(@types/react@19.2.4)(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-direction@1.1.0(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-direction@1.1.1(@types/react@19.2.4)(react@19.2.0)': dependencies: - react: 19.0.0 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-dropdown-menu@2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-menu': 2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-focus-guards@1.0.1(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-focus-guards@1.0.1(@types/react@19.2.4)(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - react: 19.0.0 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.4)(react@19.2.0)': dependencies: - react: 19.0.0 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-id@1.0.1(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-id@1.0.1(@types/react@19.2.4)(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-id@1.1.0(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.4)(react@19.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-label@2.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-menu@2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-direction': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.4)(react@19.2.0) aria-hidden: 1.2.4 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.6.3(@types/react@19.0.10)(react@19.0.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.6.3(@types/react@19.2.4)(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-popover@1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.4)(react@19.2.0) aria-hidden: 1.2.4 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.6.3(@types/react@19.0.10)(react@19.0.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.6.3(@types/react@19.2.4)(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-popper@1.2.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-arrow': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/rect': 1.1.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@floating-ui/react-dom': 2.1.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/rect': 1.1.1 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-portal@1.0.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-portal@1.0.4(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-presence@1.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-presence@1.0.1(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-primitive@1.0.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-primitive@1.0.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - '@radix-ui/react-slot': 1.0.2(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-slot': 1.0.2(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-direction': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) - '@radix-ui/react-slot@1.0.2(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) + + '@radix-ui/react-slot@1.0.2(@types/react@19.2.4)(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-slot@1.1.2(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.4)(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-tabs@1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-slot@1.2.4(@types/react@19.2.4)(react@19.2.0)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-direction': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.2.4 - '@radix-ui/react-use-callback-ref@1.0.1(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.4 + '@types/react-dom': 19.2.3(@types/react@19.2.4) + + '@radix-ui/react-use-callback-ref@1.0.1(@types/react@19.2.4)(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - react: 19.0.0 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.4)(react@19.2.0)': dependencies: - react: 19.0.0 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-use-controllable-state@1.0.1(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@19.2.4)(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.4)(react@19.2.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.4)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.4)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.4 + + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@19.2.4)(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.4)(react@19.2.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-use-layout-effect@1.0.1(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@19.2.4)(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 - react: 19.0.0 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.4)(react@19.2.0)': dependencies: - react: 19.0.0 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.4)(react@19.2.0)': dependencies: - '@radix-ui/rect': 1.1.0 - react: 19.0.0 + '@radix-ui/rect': 1.1.1 + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/react-use-size@1.1.0(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.4)(react@19.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.4)(react@19.2.0) + react: 19.2.0 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@radix-ui/rect@1.1.0': {} + '@radix-ui/rect@1.1.1': {} + + '@rolldown/pluginutils@1.0.0-beta.27': {} '@rollup/rollup-android-arm-eabi@4.35.0': optional: true @@ -2577,66 +2721,73 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.35.0': optional: true - '@tailwindcss/node@4.0.12': + '@tailwindcss/node@4.1.17': dependencies: - enhanced-resolve: 5.18.1 - jiti: 2.4.2 - tailwindcss: 4.0.12 + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.17 - '@tailwindcss/oxide-android-arm64@4.0.12': + '@tailwindcss/oxide-android-arm64@4.1.17': optional: true - '@tailwindcss/oxide-darwin-arm64@4.0.12': + '@tailwindcss/oxide-darwin-arm64@4.1.17': optional: true - '@tailwindcss/oxide-darwin-x64@4.0.12': + '@tailwindcss/oxide-darwin-x64@4.1.17': optional: true - '@tailwindcss/oxide-freebsd-x64@4.0.12': + '@tailwindcss/oxide-freebsd-x64@4.1.17': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.12': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.17': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.0.12': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.17': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.0.12': + '@tailwindcss/oxide-linux-arm64-musl@4.1.17': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.0.12': + '@tailwindcss/oxide-linux-x64-gnu@4.1.17': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.0.12': + '@tailwindcss/oxide-linux-x64-musl@4.1.17': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.0.12': + '@tailwindcss/oxide-wasm32-wasi@4.1.17': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.0.12': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.17': optional: true - '@tailwindcss/oxide@4.0.12': + '@tailwindcss/oxide-win32-x64-msvc@4.1.17': + optional: true + + '@tailwindcss/oxide@4.1.17': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.0.12 - '@tailwindcss/oxide-darwin-arm64': 4.0.12 - '@tailwindcss/oxide-darwin-x64': 4.0.12 - '@tailwindcss/oxide-freebsd-x64': 4.0.12 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.12 - '@tailwindcss/oxide-linux-arm64-gnu': 4.0.12 - '@tailwindcss/oxide-linux-arm64-musl': 4.0.12 - '@tailwindcss/oxide-linux-x64-gnu': 4.0.12 - '@tailwindcss/oxide-linux-x64-musl': 4.0.12 - '@tailwindcss/oxide-win32-arm64-msvc': 4.0.12 - '@tailwindcss/oxide-win32-x64-msvc': 4.0.12 + '@tailwindcss/oxide-android-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-arm64': 4.1.17 + '@tailwindcss/oxide-darwin-x64': 4.1.17 + '@tailwindcss/oxide-freebsd-x64': 4.1.17 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.17 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.17 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.17 + '@tailwindcss/oxide-linux-x64-musl': 4.1.17 + '@tailwindcss/oxide-wasm32-wasi': 4.1.17 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.17 - '@tailwindcss/vite@4.0.12(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))': + '@tailwindcss/vite@4.1.17(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.1))': dependencies: - '@tailwindcss/node': 4.0.12 - '@tailwindcss/oxide': 4.0.12 - lightningcss: 1.29.2 - tailwindcss: 4.0.12 - vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1) + '@tailwindcss/node': 4.1.17 + '@tailwindcss/oxide': 4.1.17 + tailwindcss: 4.1.17 + vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.1) '@types/babel__core@7.20.5': dependencies: @@ -2659,71 +2810,70 @@ snapshots: dependencies: '@babel/types': 7.26.9 - '@types/cookie@0.6.0': {} - '@types/estree@1.0.6': {} - '@types/node@20.17.24': + '@types/node@20.19.25': dependencies: - undici-types: 6.19.8 + undici-types: 6.21.0 - '@types/react-dom@19.0.4(@types/react@19.0.10)': + '@types/react-dom@19.2.3(@types/react@19.2.4)': dependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - '@types/react@19.0.10': + '@types/react@19.2.4': dependencies: csstype: 3.1.3 - '@uiw/codemirror-extensions-basic-setup@4.23.10(@codemirror/autocomplete@6.18.6)(@codemirror/commands@6.8.0)(@codemirror/language@6.10.8)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.10)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0)': + '@uiw/codemirror-extensions-basic-setup@4.25.3(@codemirror/autocomplete@6.19.1)(@codemirror/commands@6.8.0)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.10)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0)': dependencies: - '@codemirror/autocomplete': 6.18.6 + '@codemirror/autocomplete': 6.19.1 '@codemirror/commands': 6.8.0 - '@codemirror/language': 6.10.8 + '@codemirror/language': 6.11.3 '@codemirror/lint': 6.8.4 '@codemirror/search': 6.5.10 '@codemirror/state': 6.5.2 '@codemirror/view': 6.29.0 - '@uiw/codemirror-theme-github@4.23.10(@codemirror/language@6.10.8)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0)': + '@uiw/codemirror-theme-github@4.25.3(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0)': dependencies: - '@uiw/codemirror-themes': 4.23.10(@codemirror/language@6.10.8)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0) + '@uiw/codemirror-themes': 4.25.3(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0) transitivePeerDependencies: - '@codemirror/language' - '@codemirror/state' - '@codemirror/view' - '@uiw/codemirror-themes@4.23.10(@codemirror/language@6.10.8)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0)': + '@uiw/codemirror-themes@4.25.3(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0)': dependencies: - '@codemirror/language': 6.10.8 + '@codemirror/language': 6.11.3 '@codemirror/state': 6.5.2 '@codemirror/view': 6.29.0 - '@uiw/react-codemirror@4.23.10(@babel/runtime@7.26.9)(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.10.8)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.10)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.29.0)(codemirror@6.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@uiw/react-codemirror@4.25.3(@babel/runtime@7.26.9)(@codemirror/autocomplete@6.19.1)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.10)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.29.0)(codemirror@6.0.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.26.9 '@codemirror/commands': 6.8.0 '@codemirror/state': 6.5.2 '@codemirror/theme-one-dark': 6.1.2 '@codemirror/view': 6.29.0 - '@uiw/codemirror-extensions-basic-setup': 4.23.10(@codemirror/autocomplete@6.18.6)(@codemirror/commands@6.8.0)(@codemirror/language@6.10.8)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.10)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0) + '@uiw/codemirror-extensions-basic-setup': 4.25.3(@codemirror/autocomplete@6.19.1)(@codemirror/commands@6.8.0)(@codemirror/language@6.11.3)(@codemirror/lint@6.8.4)(@codemirror/search@6.5.10)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0) codemirror: 6.0.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - '@codemirror/autocomplete' - '@codemirror/language' - '@codemirror/lint' - '@codemirror/search' - '@vitejs/plugin-react@4.3.4(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.1))': dependencies: - '@babel/core': 7.26.9 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9) + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1) + react-refresh: 0.17.0 + vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.1) transitivePeerDependencies: - supports-color @@ -2769,21 +2919,21 @@ snapshots: clsx@2.1.1: {} - cmdk@1.0.0(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + cmdk@1.0.0(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@radix-ui/react-dialog': 1.0.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@19.2.3(@types/react@19.2.4))(@types/react@19.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - '@types/react' - '@types/react-dom' codemirror@6.0.1: dependencies: - '@codemirror/autocomplete': 6.18.6 + '@codemirror/autocomplete': 6.19.1 '@codemirror/commands': 6.8.0 - '@codemirror/language': 6.10.8 + '@codemirror/language': 6.11.3 '@codemirror/lint': 6.8.4 '@codemirror/search': 6.5.10 '@codemirror/state': 6.5.2 @@ -2811,7 +2961,7 @@ snapshots: electron-to-chromium@1.5.113: {} - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -2858,6 +3008,10 @@ snapshots: dependencies: reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -2879,8 +3033,6 @@ snapshots: dependencies: is-glob: 4.0.3 - globals@11.12.0: {} - globals@15.15.0: {} graceful-fs@4.2.11: {} @@ -2897,7 +3049,7 @@ snapshots: is-number@7.0.0: {} - jiti@2.4.2: {} + jiti@2.6.1: {} js-tokens@4.0.0: {} @@ -2911,58 +3063,66 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - lightningcss-darwin-arm64@1.29.2: + lightningcss-android-arm64@1.30.2: optional: true - lightningcss-darwin-x64@1.29.2: + lightningcss-darwin-arm64@1.30.2: optional: true - lightningcss-freebsd-x64@1.29.2: + lightningcss-darwin-x64@1.30.2: optional: true - lightningcss-linux-arm-gnueabihf@1.29.2: + lightningcss-freebsd-x64@1.30.2: optional: true - lightningcss-linux-arm64-gnu@1.29.2: + lightningcss-linux-arm-gnueabihf@1.30.2: optional: true - lightningcss-linux-arm64-musl@1.29.2: + lightningcss-linux-arm64-gnu@1.30.2: optional: true - lightningcss-linux-x64-gnu@1.29.2: + lightningcss-linux-arm64-musl@1.30.2: optional: true - lightningcss-linux-x64-musl@1.29.2: + lightningcss-linux-x64-gnu@1.30.2: optional: true - lightningcss-win32-arm64-msvc@1.29.2: + lightningcss-linux-x64-musl@1.30.2: optional: true - lightningcss-win32-x64-msvc@1.29.2: + lightningcss-win32-arm64-msvc@1.30.2: optional: true - lightningcss@1.29.2: + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: dependencies: detect-libc: 2.0.3 optionalDependencies: - lightningcss-darwin-arm64: 1.29.2 - lightningcss-darwin-x64: 1.29.2 - lightningcss-freebsd-x64: 1.29.2 - lightningcss-linux-arm-gnueabihf: 1.29.2 - lightningcss-linux-arm64-gnu: 1.29.2 - lightningcss-linux-arm64-musl: 1.29.2 - lightningcss-linux-x64-gnu: 1.29.2 - lightningcss-linux-x64-musl: 1.29.2 - lightningcss-win32-arm64-msvc: 1.29.2 - lightningcss-win32-x64-msvc: 1.29.2 + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lucide-react@0.479.0(react@19.0.0): + lucide-react@0.479.0(react@19.2.0): dependencies: - react: 19.0.0 + react: 19.2.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 merge2@1.4.1: {} @@ -2975,10 +3135,10 @@ snapshots: nanoid@3.3.9: {} - next-themes@0.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next-themes@0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) node-releases@2.0.19: {} @@ -2990,6 +3150,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.3: {} + postcss@8.5.3: dependencies: nanoid: 3.3.9 @@ -2998,68 +3160,66 @@ snapshots: queue-microtask@1.2.3: {} - react-dom@19.0.0(react@19.0.0): + react-dom@19.2.0(react@19.2.0): dependencies: - react: 19.0.0 - scheduler: 0.25.0 + react: 19.2.0 + scheduler: 0.27.0 - react-refresh@0.14.2: {} + react-refresh@0.17.0: {} - react-remove-scroll-bar@2.3.8(@types/react@19.0.10)(react@19.0.0): + react-remove-scroll-bar@2.3.8(@types/react@19.2.4)(react@19.2.0): dependencies: - react: 19.0.0 - react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) + react: 19.2.0 + react-style-singleton: 2.2.3(@types/react@19.2.4)(react@19.2.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - react-remove-scroll@2.5.5(@types/react@19.0.10)(react@19.0.0): + react-remove-scroll@2.5.5(@types/react@19.2.4)(react@19.2.0): dependencies: - react: 19.0.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.0.10)(react@19.0.0) - react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) + react: 19.2.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.4)(react@19.2.0) + react-style-singleton: 2.2.3(@types/react@19.2.4)(react@19.2.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.0.10)(react@19.0.0) - use-sidecar: 1.1.3(@types/react@19.0.10)(react@19.0.0) + use-callback-ref: 1.3.3(@types/react@19.2.4)(react@19.2.0) + use-sidecar: 1.1.3(@types/react@19.2.4)(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - react-remove-scroll@2.6.3(@types/react@19.0.10)(react@19.0.0): + react-remove-scroll@2.6.3(@types/react@19.2.4)(react@19.2.0): dependencies: - react: 19.0.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.0.10)(react@19.0.0) - react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) + react: 19.2.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.4)(react@19.2.0) + react-style-singleton: 2.2.3(@types/react@19.2.4)(react@19.2.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.0.10)(react@19.0.0) - use-sidecar: 1.1.3(@types/react@19.0.10)(react@19.0.0) + use-callback-ref: 1.3.3(@types/react@19.2.4)(react@19.2.0) + use-sidecar: 1.1.3(@types/react@19.2.4)(react@19.2.0) optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - react-router-dom@7.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-router-dom@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-router: 7.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-router: 7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - react-router@7.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-router@7.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@types/cookie': 0.6.0 cookie: 1.0.2 - react: 19.0.0 + react: 19.2.0 set-cookie-parser: 2.7.1 - turbo-stream: 2.4.0 optionalDependencies: - react-dom: 19.0.0(react@19.0.0) + react-dom: 19.2.0(react@19.2.0) - react-style-singleton@2.2.3(@types/react@19.0.10)(react@19.0.0): + react-style-singleton@2.2.3(@types/react@19.2.4)(react@19.2.0): dependencies: get-nonce: 1.0.1 - react: 19.0.0 + react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - react@19.0.0: {} + react@19.2.0: {} readdirp@3.6.0: dependencies: @@ -3098,31 +3258,36 @@ snapshots: dependencies: queue-microtask: 1.2.3 - scheduler@0.25.0: {} + scheduler@0.27.0: {} semver@6.3.1: {} set-cookie-parser@2.7.1: {} - sonner@2.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + sonner@2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) source-map-js@1.2.1: {} style-mod@4.1.2: {} - tailwind-merge@3.0.2: {} + tailwind-merge@3.4.0: {} - tailwindcss-animate@1.0.7(tailwindcss@4.0.12): + tailwindcss-animate@1.0.7(tailwindcss@4.1.17): dependencies: - tailwindcss: 4.0.12 + tailwindcss: 4.1.17 - tailwindcss@4.0.12: {} + tailwindcss@4.1.17: {} tapable@2.2.1: {} + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -3131,11 +3296,9 @@ snapshots: tslib@2.8.1: {} - turbo-stream@2.4.0: {} - typescript@5.7.3: {} - undici-types@6.19.8: {} + undici-types@6.21.0: {} universalify@2.0.1: {} @@ -3145,40 +3308,43 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - use-callback-ref@1.3.3(@types/react@19.0.10)(react@19.0.0): + use-callback-ref@1.3.3(@types/react@19.2.4)(react@19.2.0): dependencies: - react: 19.0.0 + react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - use-sidecar@1.1.3(@types/react@19.0.10)(react@19.0.0): + use-sidecar@1.1.3(@types/react@19.2.4)(react@19.2.0): dependencies: detect-node-es: 1.1.0 - react: 19.0.0 + react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.10 + '@types/react': 19.2.4 - vite-plugin-static-copy@2.3.0(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)): + vite-plugin-static-copy@2.3.2(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.1)): dependencies: chokidar: 3.6.0 fast-glob: 3.3.3 fs-extra: 11.3.0 p-map: 7.0.3 picocolors: 1.1.1 - vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1) + vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.1) - vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1): + vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.7.1): dependencies: esbuild: 0.25.1 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.3 rollup: 4.35.0 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 20.17.24 + '@types/node': 20.19.25 fsevents: 2.3.3 - jiti: 2.4.2 - lightningcss: 1.29.2 + jiti: 2.6.1 + lightningcss: 1.30.2 yaml: 2.7.1 w3c-keyname@2.2.8: {} @@ -3187,7 +3353,7 @@ snapshots: yaml@2.7.1: {} - zustand@5.0.3(@types/react@19.0.10)(react@19.0.0): + zustand@5.0.8(@types/react@19.2.4)(react@19.2.0): optionalDependencies: - '@types/react': 19.0.10 - react: 19.0.0 + '@types/react': 19.2.4 + react: 19.2.0 diff --git a/blueprints/ackee/template.toml b/blueprints/ackee/template.toml index ebffa3e2..75ef3fe7 100644 --- a/blueprints/ackee/template.toml +++ b/blueprints/ackee/template.toml @@ -10,6 +10,7 @@ serviceName = "ackee" port = 3000 host = "${domain}" + [config.env] ACKEE_USERNAME = "${ACKEE_USERNAME}" ACKEE_PASSWORD = "${ACKEE_PASSWORD}" diff --git a/blueprints/anytype/docker-compose.yml b/blueprints/anytype/docker-compose.yml new file mode 100644 index 00000000..5d516cb6 --- /dev/null +++ b/blueprints/anytype/docker-compose.yml @@ -0,0 +1,19 @@ +# Example: Any-Sync-Bundle with embedded MongoDB and Redis (all-in-one image) +# +# Usage: +# docker compose -f compose.aio.yml up -d +# +# The bundle image already contains MongoDB and Redis. Only the bundle service is required + +services: + any-sync-bundle: + image: ghcr.io/grishy/any-sync-bundle:latest + restart: unless-stopped + ports: + - "33010:33010" + - "33020:33020/udp" + volumes: + - ./data:/data + environment: + # Advertise addresses clients should use. Replace with your server hostname/IP. + ANY_SYNC_BUNDLE_INIT_EXTERNAL_ADDRS: "192.168.100.9" diff --git a/blueprints/anytype/logo.png b/blueprints/anytype/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..903e9aeb1d47985cfc281716145968b29563604f GIT binary patch literal 51321 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

T&E$ z&y%nZ06fOO+w|iwZb_4k?2ICoqJmK8`v(Tt$B@m@vxk9QFw(D;TrnFLzKafu7hYF? zL*fBid!1vnT6GV5{vSYQvM*9FHIV{Xr}g|7kcHqN$4bGfFf*+YGZFLRa<6i!*%BcX zwv&@1Lmff-j4`~#m;uTmO62=?ia5$%iyiC8>4}8tA|Zv>)kOqKFLj;ED#*69Y| z1j-LUy-G@=hfF8k{vIXx^(xM;iPIPqIpAH)!*m5OspQ5`t8#*7lS0cFcJ*+53)9gQ z0UN_0PT0i<%MlR@iv&OG`1?%(2G}B|vDz3+w(kB&V#(Eb82*P6s=(3%cm?AIJ z?`AXkl_WKcz*k??H5u!FJ$!phH$oz786`63bqm)=yPsnnk86GfiB;OgL!oRw^x1X9 z>CA5j5bBppD^!qlKj23ajXv}ZK0(6%lYLp4UqCiCwanosMCX9F~!gz$_Z& z)wbOW`clO^s5kO$F1f%*zg(7o1qNdsoX>YXsSWC6Aldzg0KOJ>& zMpdA*Ddu9E%gMz^t@$dcd0Ik98V@wZPL_b=jX{`p{!|pbXCZXNe?aZa; znPQa}gc_?lVa3PKS&5-QKBIBe-iB4Pt~ zaG)Jqn~Y^3lWSN3@XzfFXfVRp58|ow+3+8B+r)CQO&8|=rL6w-!r6RZ6TJ6hKh4_c zC`K_n^k!*KPN~aDJ!3&l&6YtwAahAFha(r^DOh8{6w*E67R~n!qW6OLxr$V3?viWU zk?0B#*mvP*#iLPm+XO^zC{%O(E@7}q*m^kWG<5Zz>d|(Oy)kB#^D_pz=lXbY9R;Xx zpibhu9L$L#mWh#o zcWi&99wI~MG%yk-66xlXxV3n|UF=A%C^s$tW(gADuzzc>Crh@j;OsmrR{BY3r#Gb= z75>%K3;v#-PRSV;zLpHy_8w^Wtw5JvSE=%X56UV;kbRH?W4j6gI%bFT5%ZYbuw)Hs zB(=i3bT7HvvYfVx;yd=qUjPPHs@M-$Q1XtlU{GP~x@bt*q(|DlD0UIZVXz^^@h$8E zV@GtYVaO~MwwCdm-z`XP74*yw?B6W_Cic6^0!GQGI3h@Z@OK}sd) zb&Rt|!G+3b3SAad-C5tfN+-u`i)$jwrlKct0a7zX%PWb)(b3n%{iNnBuKw}kR5XKv zm}(Gc79}5m7Zdr2W^Zza=U28(o z^L~`Y$i{iBc2ex$CR=IluCw|1J8+RJO3sdO2-~8m_TDGH1@Mq_g~$IYQE^knUF}N3 zU4aQ!4KM|&6y@ny9U&Kdu;j3VX9_yMl>qVeGV}fKH$S2~8E>y+)mEwTNqzy;nx2{Y zj#MqO+suOVit2Fj$ju<@1UR5~?!adS{5$ly`;J`F4!dmNPpI}m2^D5-A+EhYpQ5fQ zVU+Y0{dGM^Q{C;YO!jIn!(4`99}-9-EU1FRcbZX*Z1s;e6euA5|FHJfK~aZq-{{gM zUCI(m!;&H{NVzHv21_k1B^@frf+!(Kx%3huy&zrE5|SdQgrrM{fHWwfi058^&ok#d zGiT1s`@ZKNN5_A@^WFP<-PiT0D~?z7BT{@L2$kKM2nE=A6`gx-N@L^+3;~S1NGL&IDSXnP$t4&M~E$@0?avB~?Be zJ!}`mdU_NMc=D9B)9-{6S!}9#bklk)yFLB@JevMSC=NWDlPwGms$sx4$zb$FjsKuX zU);26SHUTNltyt~;K`4*;eNkEV!8?#4~xNFmYBPJ3uxj2&Zfq6o*F{>r-ok=qJF-w zjgdQf@DMPA%TV2j7w8Y9FVrEzylL?{?Z3X4`T_&*0J-j8(#S2c4|CzNI8OORp&nK{ zDDV97L&tOS(Gz_4G#aGGn(v0kmc0@M_o-eU0StdJuq4AIyqkhXt zlCWON8pym59H-xMf<=);dI)`-ONo~r^Q^|An&`dKO49DTQ(^P2rZ%}1$9kIO`JVA9 z)$EHBZx%8lN^}nI!!pA&!s$8N;vb(v^8f}w&P!*h)+%#TfH3r!RpHA6W_V3~W=c|B z)J5cC1S4bgSMJE~@0Qe#Q@;gA208s5H)Ga7fd7M!}(UW2B|9{d_gLH7fol-x&+$5hB!KN9kI zv3$LjoIH2?tz}k5ugo-!v%C{$(Sa+)UBTL8>`e_3yJVvFy`sdLiI~mpv{3P&m@6qce1zTrI^@aMH_Qnn%RHROanTeug&by4 z{hv-f521ULnisuKzg5_LiuQb2`7^tHy>H))czIyMx+{yEHR$Ma&6o4ey8zJgKak)# z90=%mxu2Qa=|=MZjt3^HS6Wgn`37jmQg3L#!lEA^d{Xc=F&S68FcMADM`dpXG2^6? zUkooc5oRjfuc4Q5PNs|vzaLC&MG=1&D^8S}*PY7$o*HYN9c!AV3N_zy5CJr6Sd}|F z2j>d$LLmWWp4%s z24XIgeT}_OAn;3EL=cg}82}JJVNka-M)S2;or76Sbl;ACkK?R<#~kO;O~&9A>ALFP z6{dD@#`2E4>Lswl}e>(A;Ea}~*mN)^uVs=!P zfn}2`DDL3szDSMv!Fo%P-y5``R|ZmLOoJn3>Z;Pn60@@_IV90{YpakNaB_D(P)?Jh z!X9&~+)~+7Zw1#=vUaj)(#5I$dv1~P0hvc?B(R-!n)Xo&3zHPXP-uh)XgA;nH;v`Q zE0(IUp9oXWDX@!|O*uVYmF7dA4h3we@R%VCA?n8Z*a?wg9V$>l-VrP4*&{ynmIq=AvzR3{ z5`k)_@!wwF={a=uW!fjuLh*PTBeE4s^x#R4Rv=&yin|q9U`6eOix>psbX(1V&%^yxc zTG=R2gF6OR@05W^p6@R%eZE5!yld0tGtsn?3P(*Os2_b+Z#V~Fjl;mnemdU6=qpnT zuZ=8B)Oa^QT|r%Q05zqsZnlIDAtOP-ZSv83$`d!=s~5e~hxitN>>_>dZdIF$(GZ+- zY4wkdmHeX*QO7aD_O7FkQN%ug?Ap&Izs$Ecilb7ICH>+Zym2!&{V!%%JzYNi4QN;nN*0>^KKqc`B zF6(P425nedg_)%sFP)$eZi{PWgxMFdexbA2Sy~1N!bW7Be7H6lQE3{V&5_U(sRH?XA#N2-z3G?TQWBEwl*)G8L8{fgS6jz>OJkrD z0j!qx?r5p$VDet*%N!?=DiReHmZ(1G``)(a&ul;pr5s6|t|Qby#v8L5#W^@LG+eIq zcaZ+ub% zG#aopp;UuOlw~r0%BQ`~#G#g)LY=21%hb*0A|&*k%)909+3)WFo4wQa|A|2t?QJ)I zsp4npttq^oG~f0CLF*^S_2|9r&1Ua6v-Nd~FOGu-uUd6B?eIV@6x3Ol(jm^8>4Y1V z=?rn%gh^(3ViEY2eotfKN$$_yN*{+kbz3k=^Gm|fTPjR}@Ds-oaxETTBgl!^gQ4U3 zo%X-hCkU$0S09W`tsL?C+IfPGoe>n5Nti&NTyLiNb^B#kRc-<}O}(AQc|{gYwj~d= zx_X~q_80;|X_k-Hdman(v5>|4*^HW3j#EH`iZNZ;1o5`gChU3dvZK)6NAqIl3O6{* ze_z*{cv|tZH(jabnDsxfi`Lgg<<`tK5Q`;ijt1h8T7#uJV|3B}ug^eZ;W~Q?61R$P zJc=CP0U2V2FH%7n6%rMFA66wvcHh@pUH?93rwN!3z5o|!wD6~-pp`6A_xz%B^~_`p zgU;wnyoj@p*tL3Jb1j9na;WKAid2TF5^I!Bddu(7@c^9kq-+pl>byBX9~M^;i`Ce? zpO@_38PskcEY=-fDpv^16>N{2xcs2B>2dRe3omU*gg`otEI@KOkTq}K+@vlA60dbY z$DV8Ono|Q*wkRbKh47NagKRZ=5B6vu-MSQN*f6vm9-oEWalc5PjF$aC_?-pUH1E-Fxnei?En z-eEN)UcJFCI#LW3MVuX1lrvNxKZ*)LQ3vt>wHzQfgoYQaXPHuzWr0+T;)ZFx*_{AY zxQsY&wnz5`dMH^e>XO3##MmJlbS7f41QC$ zB+(WwRBSul2kW- z38w7hQL8T>qbt($e3uP*%zlJ`p(r~9EhU+u9uab*3%{K~~@BU$A_c|urNx&b!P_%_}%8%cavF05TGgq#|l&9zA zmx{WzK7AQ0$tB7!i9=Hl0MP4ymBr}cQ3nWs9X1r@Ys~AMe2;rpc5IwhxF?2o5&PVV zl}gd1*SJG!nl!TP%gpUfOxF0-w5Ce^0*%2IHMik8 zZ?^JucN3qV>g5x+hZDkgXvhq}3`}op5UkFhXc3=0TVgC>7*0XPPbCLZybMFa%aV88 z`{MasdtY4m4z%V*L*lvvYh>5@y9WTLG07ciWQ*H@m33WEp}hYDXeQ3UivEO&Jx-Kk@^BPp0Zgb01(js@~zTi%tFc@vm;8<{hDep0pG zVEiLC6iZh(zTsPWFgUv;3EG|)L*_E06dP?4q74amQ7t|++qWJ-g+uK389*I*dHI@_ z>CK^lEeD>Ho982SgG11eYpq=(!yiPuklKtso0Au{d))q>{mDH0^SiX;8P!9Q%D^il zDYha%o&o!k;OFZ1yl!~?A~qylX)RZ!Y<%>U2%vn@8GO&+o^O}ADEtsgBh*7r5VMze zzu=y~Hh9c>Myo&qllZY&`F`iVe-fH~eA20QoX)4C+3al^A+1Sk3d~pfV%DY6ralF9 zuy)$uBJ%UpoKpZR5ni6Qg`G>j-j4^JVIggdcojHDC<+P+SCF>WpL&15xXM$1B6E&qr3psSY4$CHfGLP@zx-{W?9?v-&|+ExWK=dvuS_ z9OG)@x6UoQl>e-3zPqKsF4Hk1PDpFh1CYO>2uCH3)n~XrN~zf{bi5Sw9~2iNZ{`VV z>oJ6lQ`5l!3om!h0hmEF>4C~`9e_&2>|NSmfCBb-vo;HU2ziI3wjEY=8NigkdTV4W z{OvqAdT+8Hz1nG(HV&WCJi9g7TVFG&nRiJc+P9ci;ViH2>_*U^skgXJq}tQp;^jXB zt*Q=7XCyji%up@lgfwnG`9?l62ETGK>){pFTIX|Qm#{=K+pqoh#P>UFf&)#AD{GtRORQS#X51)<1hrr5Jq%-ku|Pdlxmdo^n78XylkAR;`;E$>;htl!kdL(-whd zx-8HsdDk4mA9c&c4B!aQa)kKmi7A|cm~?G)+l?xn@y$*5R-g3|ww>Qa+Fdp+xArhN zBV}9Y#omQa9^HD;G6ed1W+(Zwv4XFPw>Lgr-8lVub#1&nn(8*iqf5o$Hg3ooYId%W zMjvRb5U+uV3_>KJg1|d0!)T=58VWdJ<4FgwAspri09~SNIX_$@j)%XD7{LlMqM>B* zKtir@@_7xp`UzxKTF(GGHL%az&oo#>E>#VB)` zj6A`I;439%r2)O0ysZUgXfqY(Dufy(;*-}7@}BSU{sM`@$zGx?HJ(i?9G5_jBP>#U zgzEa1oX!tm3IipUsm*n|u^Ql^52M2>A3gIhGDx)~$vs(QhP=zwe zfxas^(_isV)>>b&-OeFbu-@r4K?+vSVz=JyS?s|-As#_uG4Mv~i(Pj938%hq^e2wz zsk~;lWKGT?XSwry7yO#@6Rn@kT@Hgb@6Plq=OgZefRRO)+n`&UG|*Y+df z@kbDU{f$mD@My_1+R-~<9+H*k36l)mNj}4Qi|kg41{*zwJ`SH1|812i5T<^h z+kmac#yS3y`1S0ONV5z{m-2@51_PMkVQ=; zW_g_^Q>72ImB~AsbraT?HlL-#KwyG5FjzyKNAOV}LI8g<^yPV#5ETj$e2!buo6nPX z`euFgYa?%oue%KrI(wfS!-^5Yatni9i2k7hIQr6;A09220=#Kpla7@8y@KYPfyH!p zS(TR&Eab5>cF=-g`w*u;CM|jG`lA60Mm#6C02&q?G6_UuXrW=L;CLs%q`uM97dk!r zy@QkabQmJb%5&Lzjh$aoO%iBusi`_L)H$yl@hA)fq1(|l%0%$W%-rowb-fQHiu7=@ zgvnNxX`a=n)Qb=ECD|B6T%h;@a0POAHcl@z-(5N8xn|Fp zJl~t9NmE~~+FnftAYQX}j>@%DP)pKE1m{2-LMt@fD(KO~&~OFlV@7I;VqRsNz`bzh z+9w<34aqw%xRz;HMbe%!shu-N%QCs*5_k{$n}B|nB%bGh56C#j0SYh^vCjwkNY=C_ zgKuH&7(jy@bPt$x%&-bKJ_d;0ZdD=1?s-Lbq|0GO?$77x%`>*;epeX5=sH2=ocT9g z8hx=1%rG-z9Wx0Y`Y)hF%KhFSR7>8~+oQi4ik0N_Kxg?5*@6-=vNe;ER2tqwio>n7 zV!794*&hLm>35K|1N7f)u!Kt_f9}Fwn5p-N!6jMLtRV^TvYIZ_Ol7}Ws(1M+^~_%K zWuofFjiOV%(KBwx1k2_`S0{ISYwmi3kl`vvQmv^=3eLas{g!HCK2NTwXwyKZ4#Cr@ zJ=L-*!Q|{|X>=O#78=}2E0K3jyWEb^SOp)-1UQ9QNaWXWAtj)C0%8M;aE%K)E2%b~ zqnIaVA>p6EiUpHi<^NK=7rvPIOtx_2@rB5b>T!%PqV+y0?XOrS+u)oI&Gz;(;xLTX zGtcgM`K0s&8@@+}5+IH~9lhQ($a;FV`Myu8BXYVS=`rOEBXMcrDAKM3lDNtny zjAq97>us-fm1W16{&=lp{#VXetBrX3KmXsMSAo?-<>#p3pp$SzH%!it25HTc^D_k; z#i?T}s#u=M-fpXVP!9QzFHKwW9*VlC29?AH{yaNWi?{0gy;*4&4f3y^hcJ!tH$NkC z>HkB2|Kjijtd>ZVt8uGr9bdQsQoZ5YZ&mqHwsq86$~$SpuP2i2xpQwQis+|Rr9!$X zV%MaL=2Jc(4(FXGTT!7FPrGcI+yzm?!&TNNKU|b(gWa=ogEB8`Ms(#`Jx~IZ&cQjW zDxcE|Q^Tog%}|}a%xZc%E{y|`jl67hlFyI#;DxGy7aAD!STtZi^H5D{H7g;3nT$!I zP}{l*@VK@CTaky;fd`)$-XOK{fWtOF`3&G|`a0)ffuG~mT6VqLi0K;t*#WpuG4vN*#>*Ke;u3FBxOB&WQ#WR z`NUQ(nEm}H-P{D0p~!I2F0T_JcQ1H6yyvX*WG&m*q)v3#7oS&quhxtTY zRJ}@KKeB;?Aj{;%&Y|-I2++{%#FX?dOT1zDWx!eqI$kG_r1Q6V31-W14L>2_dtp_Z z`aT0l=YdqY*<*I}#zbXhm{345ld%ECiU#~8Tcv#cf=G|T&N?2G=bnFx$DCYJSS*^a z$in+Nlx%xqM}nCa=>TLB7y`Xm1P?uuw( z!1o`9v54O=bjS0~^T92kWYS;q>Db9m&ed6QggzD#w?+`s*vRPLJO$14R8no0GWhi| zHWPg*Oet`x|9{9_LS>3C#H!h6ifl9Ah{p4}&YrGVhg7MT-~y3thsP7dB*b|KJU+&D zA==8%6CyL%{I1zsiPtk{h+5Z6vp<1C`c^nI>-BJGVTh324Nl2l_{}yfz~5EoC;1yL zy1f2JUcK6q`1MDqJm^)SU^Y;vk&|>wDMnw6FDv^yH|rmK#mv#`^r=qa#oF8>Ye}D~ z;F|Aq^_yP@q8&YAo^085Sl=PPhDVQEPt=t+N23ZyY$43-%61l3basBUtA9_Wk9xi2 zbVSlW$dYeA$@(pnq$8IkbCh+I^>Fqe%W^BE)`Nh^e|)s9M78K-Td)HA?R6ExL$e@4 zMile&^YcrxzNh+9`jkwU?dLBuOe4{oUHrHo+_Z9zi z=U;X!xjBdpv})jQm%CZhB`C9Mi6SjHnQ9>khVf2c} zDR&p~1O+vah&4VPitO`H_n?n?&Aje0I>d#zZjIl3(%j9}1>_VVpkKhS zv$Jy{nd)x7-2;gr5vqWsJ_Irx$QFl(u#zVy4UCX5Bs^S7)(8ABZjkt|kB(z*bV%J! zp!FQ#IdjbogFsmV>9MRwd8z`i zJ0-j)mm3n&tL)Gh4>90#3j(a11@6%j2&$kb>jS0;Uj}leYz%YHTu-Z z50ZY+CzSA)_;BBZP2bw8V!hMgdqAV$C3ucoBE2WTB!wfYg)+Eh5u!e}7UHuPBMxLT zW1WlM3|K!v`H<{?CaUu5+W~9^-|B4#8=Er8uEk|h?tsj4YS`szkQfQS!ZeW}TTk@> z?C$ZPjGx|_8K?_xW$6|iHim;STDB)4EO+N~-c!d$`cfN|g-arGMnOtQfeQ_RsnNW>*13_-ZX7jtxu zz&R2NDmywFE3M8+$b$}wRVd`70PgI3TX0HtY$u1mZo4T#%v&fY^tb&?E4_}GxaSQc zW?n5?+A~-E==U4Dt6vIO=y(gSw`}G&30##-eJo;W)F7k;*$*d)2LiZc3`!-ofgk+% z1%pdf?+naa{H0}5`W-a{BvuD{1*l+foy*o4>Y_YDAa-vCXl;Ps7Z?FQzbRmInY!b; z(vMqU;?MxgXBZhGs`^6I17Olo)|tJJf34dizF-EPR=me!YNs`8nvE{|L!%&CiOojF zVvT3hnxLOFqV+r{VvKE~Z*O206weB7V7{4J;yz=UfE{q`zw9(YgZ!o05xRB@yiQ$5)e8!AT z{ecc=86Yy&X1e2)J7i~?l&7% zi#0mxEF+%k7`RRHvEGc7cxmJm{fytG(ast~xi=*rr=P?$Gfi zi>DHe3T)HwpZKOVT%emXFT-wIG9vb_dK1(syf)q^#9h)GXwx7}k(vmi+X)&iRiOCK z?G!-|wRNqVH3LRp>4)OD`-py^x+*at{M0`i)$blQo?vwa z$PG$HmINC|Lw^B^pbsVUBIa)s@C^n~tCHk9-uY1%#+eFrk*RRc8BLF0Q9)ev@~0yL z6wRJD+N|MPe_Se?qr^#J+0se-3I`kEpd2?acM+(`-m_fdT}> zzd(Q$`~l2_ZUe|Xw7sOt06uKhy$=`&F&3q+2*wHe0&3fkl(Vcg%X3;w<&du8%+-{PhsXmQ32ed{TFSFnRxa-sAwGyYv|PbiV4%1KaApM2edG+Y%#r zQHD##G+|X$xcc~^5lnUQ5A)EXu=4O;y|wRvrN%SdE||$-QDuMQpQGA!SG?wgi$XJC6bcLY#@k77eyfsZwo~Ea(2N%i z27(j{Eb{wF10L!Jh`j#S?{`G4Pp*aZH4B_LZn>`$@(=DIi#%==|Mp}(!JOQK=(u=- z6?pKhh6SovjeF9PDg6|b$Zy2kY8NSqO>L1|2d_4)N^G{UfKpBbEDlc>g@?KfgEE*7XNdg zAkg>ebx=(riobvJI1afnNYR73(vEf*CY@6JZM+&%)C~#SE(g-**f66!GMKETA8ra9fV!7h^&K{f|_nf zUnv7XQ+;6x{F3fs!p!QvyGSNOe0+QnTyAI{TQhz(Pi@kuJ&1K_lR zq$8V9G9Z{#QDl6UPaAx?gh=qEM7sV!l$b_Mh=}tJ z5++sj9KHnJt9FNrr}Qt{B~Z{gE=hoAP6Rf!vU)yh1nyMMCDh7q=5lZ#+ZAW`T`(n8 zjQrCS0HaND!T-<{gc3H*znV}19U*VQL)gmIpbHT?ICr;6@)j(HB8cWQL{7vQvYbUwSF@B}DWzo@Du}k( zO}&%mn!u;1TjCGR2+3DR;L^-21#lWY0tcM^y=KJM3|aJYiP`#Lns@YlOwY}B3%F{` zu@g1Gig)v^0ScA(_XPOKX?Sb2EIomz>SeDUH60@!XycW_995a}4{By&#DB4_15PU5 zrtPm0{?x7bMGyX$Faw2xHL7KtZJJ#9w1*;=T)eSvyde5@XhwD@zR}TeY=jWWe-C|v z(D|WJ^Ov{l`)0_;w%>>ZMsP6tL&at_zo!{hcNqzfUF(8GWN8T36j!0~4!Q1uQzVfk zpkcs@eB`5y2Rgy;{|rKJz!IR$i#}^Z^WgEJjUdIR3sM6_=AbVF4nbppg^l5WKn6RT zn--E7h%W6N(5P~4sVMMZv!D0hAO9XMP-6gpdg28T9neo_ZzP3U#K;=gz#GS06}Xhd zd4<~z2Edo-#TngVDgf29NqJOmZgfR^lnXg)BfTO)``u)hQ>KAgO5gFCU?-u7l$%RM z7hjWu#$&)EuN!}OC~vK!u77caEF|9H_kXJoI=hMah{j*B04O$c5et7e0g@xQx2dkP z@XQVHb;{8%fpN!{nzt>eIr3C;<8uMf^xvT2rSA1JIT5y`=QM%h!TE_Vsbxh{KVkO;+-Lj2zv^{29r zegdjTmL5VR=ol9M)nI>N)RhKx{M}2zjZ7)JC47K&XXxf&Nd#T4=8N;p@4gk*CDRC4 zgYBqyhZ0wc^J(RsPe@sT8&=)5G0Ki16k8J1)|F^4}r6}#fK^jfGDywnn|Yx(uf zMs?JN1tWwa6Y;EOJjU27U&$HmlF+X}t1)W^vq@30S^XSn3rW9X=HOABEF)C}rBFD> z-J?e9$vrPtc0qCT2U%p2oB<6{uW$_+8tFi-V+J_nVM$39rUx*M8u=+ik;CMN?D+A9412;3e)BgYsx0)kW}?oXdC5E} zmu;M&j)-yXS8TFKkCZc;5u?Evzqs`n*dQ^^HvI6J>;34ntgHu5*qMr0gFmK8?wf$e z6xV(g3eBIF8OCD-a;jancfJ58Wq@e;e*L-%Q*+w`bVMV0Ffo>God#Cf zvLC%j7EgCABWsak`kzmf5tvl_fT-a9mH4&ZyAxKFQOQph^&;O7cnE2C{89U$yH~U? zU;)~z6`j4l(Du+#FzR(0(fpVe3&QS>$z3@c{5>WfXiR}Dyv^bN#;Bi@b38N@N+Hkk z6S1EU0Vk3>xXAo5@U;Gy?GyvUQ#~ShG{9a=Ks_5f-hxEF(PVK$#doE(?k;+lSifHb z3tVqAXKn5rY5NV8vUNkyVmK&>?K6wH-1t_^K(u6>TB zHW1e9z=A_(Sbz!L7w}~;9Lou{XllN*{OM%h_e0DGyfXbmP_YtOpF3n3ixRgnLX%NU z@a09b6zU3y^NtbH6z0Gi1(N|~3Mz93%i0&pJQvmK^5EUj!qt*opN%?)s= z-ytoaTE2`>0m~Y_Kz5}$5HjFJ|4Yc=!nC6j&((=GwYgsr87S-sovXMJ(JtguoVbtR z5VqMh#pqd#x&e3y2dD`!7BQ7t~@zs5f8@DO@guK4?+2U}rb zHs<=QrmZo;m>%Bv!5@0xysLLZl=sHRDm%yAK7!tI@WNX>2XY%6!2oas#a^Ixox~f# zoa4HWSR~OpC)2%xG%6<{Cq&T;zr5i>9`P_zH>_%ikGO@`mu(GzVg@c(B(a;|?HwF~ zDH~#(=xl2cb?YboYS_vshV>GyjM|fi$Uu>mxz=>ch<5DdJKpvI&^=cLj!`M`3RUbW zo1wQL-I;5p9y@^`rfU|_9*v_AaN`_!>BOtsyrYHXFDp*cFiF+**U2S`O?;WOsB_0V zX;1zYRUS&jaq$RQ#^n{kz*9@r$^Yk{2jO`B8Lvy2|G~FnuwhoSz~gE>aO{Pu$7&@J z-MgW0fiSQXj$30uF3Jd57(E&)YSlnI5n_kV6_HUWn0L(8DDJPTc?p_qY0B*j*o-CW z;Jn`yvWfI;#1pjftC~~$feA;Zec|uqEWrn zC*znb*5YF%yzQ~-Q%}KkJm#b3&HJ53zK*B@eTs=eJiLesjL2R~pM;c8HHzjr|-$PJh3G>44b_;scr!cEz)TJk!gZ?n)82F`2H)fw~2`9|W zrbO?Uj8)8g-AIHt+75}`iVe*exp&hbAo}$PVRs!hrX=2`WIc$Tqo9}2i%~cEoXWR4 zm~zX*0=gqucP0Kxl4wjBntvrc+=5auk=m+Bs9ATMEd2s)c=NHuuy|)ZFZFj`?$0Cu zG%QjN0@g>Lt3NJWx>r=YrQJu|YVCX5=T``->E=f>F;K;Y^5D( z-#$Ca`VKls=l)e^MMy#bdHi}cgq)F_gM+^eY+j%=P>TpRHZsDm#oThk)tig4d?#o-_*n+`Zs?Ox@+yka*U0|9rxla~>61;7VwLk+r<`y44)9G~ynQvsY?!D)u$MOOtopW~Qbe93r`I2c3Cw>076 zjl(Z57jzS4uK8*N7aBW_zhGI^`Zghq|_RcSO05cd+jUb(SHu? zGOERi&ODVlAUuWAJhsdHeX0-o4e*pb0B0W-Yox(IZQk!AQ0UzTjl{)^v}dy=anqEu zn!a&em7x~ZjdvWz?EH7qMTJ2A`WS!QcSwyxc=Dh)Kp40gbL;ub%)=_cwd!yKeTjNU z3z1wC9ws!rha7@-kJ~-W21{C`gmEcX;(?ywRz!70(>E?DM>(*{ql!xgCBlKs8x5Hc znYNXFsh2l#SBUa(qnvdy5zJ2LW}`89kKhC7-_n8>?L6F~Mag_+EPx{cl8Gkw^-Je& zo9IhkRTG%#-Hb9+=cqj8L8A0KZfb}PgjX5mK^{aJR%Oy#5)RW~nIWb2{{~K4i>_8D zF>$qErOFrfgXji7ie}>AOW~&GrRL<1rh4#}ES|g*&7pn$n!nozR)O}4`29+~yvNYX zjR=zp}7rJ`vfd03eZcD91g7~^6182=@t7xU{f=17~?Yz4qj?Y zM|{Me2ipMjNmXzEM56tG<|p&pL(UW1y?aA2{;Vq63J>}Wp(HqNRx{7G#P7RlDjY%4 zAm-vFShK2m5_sKIV!7LZ%4CnXfr}BZ7TgnFB@_;M0F7{CEpUnZ6c+ASS5>6mKwogT zMGe^Uc&%)0FbfpEpph-Ag^D2soJfBygbdwd7H37Hg#u3@i}oP7su^A&@-oI`ftH4q z(b39pN?ahrL}x0MLSVQBo3_7RtRGGM*l*TnV{oDEMkwzk43Q*o`SgxIMi*a(M=t-w z?H|{fLdk5dW@%+Y@Cc+`Hgx0i9?Pb5m@o~gc6ifOWHn@usOM z@yZkJE5YtGGTldwbhgFnB+KJqmkI91Be2R=5wPCg=ih^)j;8@~!vd(T+3&X?0s}Yh z3#+P{7wPIGZhNP6JbHS?Plah(?pXz-?-K(u@iJEi7DX8M-|ry|MxDyq^#4^*5YWc~ zFeRIy9UPkB<2IQ`ZB=4!6fG()!;%^b{X{6reT`W;6-Wp_D5$|}KR?_u^eQWrB8An_ z+!x+`*?*;{fzKr z@WyQ6uMhKOn?l?15%aI1DjBW6wl;6OX%53V?7hvA7Cjy-cgzQ;rMh* ztnmZFO?RAtQFz&+EoIRqqTYcOkU@Rec(uFy)|0aSie;BDSqsWyybr`qZWlFFnC`IjLZbN8 zRK&j1+4|bU3o2we%SWoKT%FY2?eiXs+6e5s6(>KDQ&4jjTJ$I@y-`5qQD{R1!zqIH zTCv*mVhjqdfbo$q>2DEl_}v!s>*h-@W>7N<$(VFVk-cWW`)mn)S6#SdaBGvJJdY-? zak7j&UMI#XMaRU90aI;i7Qf`$+aXN)YS!ZlKM)p5#70$9K$2NbI1Yy!>mLnq4l~xZ z`VPT+YIb|oW;Gtb6SDOR-2Y5-B`%5sz>AX0H{o`r2TCQ2h@eYG0s?er_sHUDi1xa! znc~u|57glZ=z-KZ-Z2sfjjr%2mR)m8YP~UX81CB{I*E)#UD3Uv6JQ5mAyggJ2*?t7 zu|4y4gF7-i9GCKJv;7amM<^`gTrlvngolYxji`WukKGsc+z}FNIS&z{c;4;QlGSt+ zkieI!H>LHERqR-=fVQHX!|NT9Ma-uZF}^$$Im}gmZWrB#N|}3DDKFNeO%7 z#@eZy^GFa!9LCv@((;GZrNf=1$d^eFekwaN5Xc0R1exuhZhYkU{T5^#;vPLC<)DLc zTKObYkmXL%Ko%>>KoXbd_5reaF$9x!H`9OJO1>4{8$E3ON9mxZXH=6Cq@wAum=;LIHTPyrEz>KdOgjj0iN_0=&Q{{fS^c% zqCsRnK98kXQZl8+pN+Onrn861F%YG#kTJrI z;4x8*irUeCv(Cr;K*(d*QnWRmCJ?bbNekhlxYm}Jd$%kg#pS661G_1p`oDyz^W{`W znUqg!r`NiIVBiCQr6P!d47Y&n{1OO-X9qKrd9P6UL)fET5+)NBPIr~_{RKSb^m&V~pvBU6-*^{7MmA}_&%2yUM@wt;m7!#){p1^zsON$Q{MZIG za$kBF(357Qr>4Fp2~*^S*nuF={JstUSp(3)wBK?_C3)g#^&trm|EV>8-*i?UQwUgK zX+59Z@z%=&1?_$-R@OW1>7wI9S`CiWeny#3DK|7X4d~Mvo}0-?mIb`5C@2TtM6A3L zIunE&f4%4A)Id)BMxpk4K!E8teKE{olo(A1-s#O5kU2zLnP}poT+#N+^|J4Gqnqoh zpf&NOE(N)=xsSHKIxariTL8iGqc36-($l99V1<0r9+Kg(=gg7;&->y9c0$1|QDSiJ zNmAcmU5#0p#QnMxn(rtgh%SE5*-hbl8r$va1`=oOYf;IAQi=Wk!U6-;@5!9*&>l9ShEdB>Z!>?5;HOgk`fXFj4%u= z$Vm6kBE(?;Bk=LymJ;e&L}0T~|LjXqoEu#re@Q?ETcsn)auMbI#}_Iho`rA7b$SX; zgEU)uyFMOMt*`QD(-qcI_bEBND)F4Lj?@EwX`mAziMOeWn(PJL3XKI#@bdDqykPVf z5E%3dWVqbhuKjW=7np^pVpR{(ULbAsI~ed$(}i0(qC3Pzk42GS^{|g3u(S(}kbUUu zqbAdaF-@9^*A0Us3xx(97uf7<*Q|X=7syVHZm|$>^!iBHbio^?!gb#iCL4kS@fa$6 z8E6>f(|)kL7waFHSl*)IOKqiMsJMr3=ryb4FJt3mRRV!IkUq`9gG2i8>#9=0X-p=U z+{GgHK$Ps7kkVxswK%aEZBAfg&Z*@Q8eFF%#c>*O%R4hY5aAz6Y_tNR$~=FVDp|-o zz9J2I&cWw3(`E17=C9tg!R!z3cSW131F*bbfvzC%=F_g?c@bz~N$z~5h}Sc-i?5w8 zVI<9SNgNhkoODbydrhtlmtPLX>mHTVLs*u40msv_GxD`fraFok#uvt90&)~7nb2sU zaHAP+j1&5`*b~EUE4dGIQHC&p6&cqB)){Uf zy!TQMJ(jDZOru)fA{}PriZQLoep61N1rIi_5IhE0O6Fzka| zl~d*JWgV(rZ7$^Z+~#R8W0jCNs3MpNkytP)V{DYdeEY>;W2!2N3mbqkH)rJ0DL|o&K-_a~0PuW_5|i#jVymk3 zO*`Gy0&m^AWk?3|xSq?ztL;^Ya!mm5TtPE9vb}c!fT(>zg)@01|5tNo{Z!TW#`{A^ zry$)R-QC^NAPv&eAl=NOy<8UFY+iJ9Gbp%MAYDFmuk{d+oKJ zct7u#l&CIcgH>VLCp`JPbJz;$$GLo5RXxZ4cVCl9UhtK*s@JJmoG~UBedi3^R}%24 z^{@0Bb3@j7jYd&{CNjH~32HmIa6?7l=42y7Ee~6It+uzfd0(SXfU2c^7_LImNy9Hz z!RT(lak&EB)JkB{@V4}*$NwI1{7Pw6^S+D;Unn^N?8pq|7XaI_gen|~Z(?J6z7PHU zX=^T}+h(g+p+n7Dl#Px-^X*xQRnuUf+py{8nC~HnzmYCOM6baiY=egXwITm!VPR{%F=q6wNyrbCp7^5f(fK!=_B- zX0OtJ_lm)|%N~(AA0{ZLSZif&xxAK;oTXurXdrrRl0S`EW+FO%=4cu|)}Q|22>5ik z)wTJQJ38ic_e` z@pa(ibnyB3+3%l&&)%{Y->H)MbYi~f)!#j(ysQAZy5$9GiC;ir-m8n)5)D;y>)T+^ zY88iR1#Q+?!u0Va;mNWh4a4)D12Zvnf;ZaHY0Rl?`FDw(UVq>PF4p@?-bW_P_Bs>8 zVm$9`@&-<6C6`w5{cgZzUPLQ<;lav1Eo@Bi_bkLZG24cmP3e;7Lx4`Fbbya{O_TMM z*7Mq)w62;#8SzFgy;}y2kFWjf(UPRzqFN1OV`JXxK7}Go0(J`LDFwQ4-(Y3{Z!10G zzgc#LTK^}x>Ht@UBt9S)q|l%(W9vY`Vui&ICHsaT-loR=v18b<^SpZfmmAj)9sux@ zr|kU!cu9jnPc94Z5>t0*mubj_FG~JtYfv<}WDaG$rK+vQ($iyX@T(X~k)cAxj~Zc1 z1`>n{X2z+;BIk>l0(IRlBIpd;-ok+ub0sOSnVLJJm>Fk3FR14EsaUNDE7S<>X)SmT zP1LE!&>-3?FTSnF!^6%08qj%7+Z}Lh36?mM!QX$^cY5djf!jlL&wkoje2yf>n&|%M zttonrj!u2Fz>gGC!jo&L&gC@sB@+RNB7r9=+7U1!BoaRrRebYi7L3WfT?C0#o0O(^ zGH3f{3{xklPZ{3G(1lrM_2BeLPKk^g;`%(=j{26)$ZT&4VA3d;@r+HXT;XnB?JetJ zkhXs|bUCzcziD`5xjM6CIogjoOgApdL=0Yg#@HAcybTFvY(2EnxsmWU(s;~srj_Kz zc`W%NS5Dp+!E&Y6Ki#}{r#^5Vw|)Dm9yo7s?|DKQ-_TG+JaYu$E*f1vw6{rL(#_i5 zR&1>H<8_!Bf{Bbd21&~2uh>LO1jmsWL16DLQU{@MqtEqWro^{W993Zsc4&_bbj>PD zN~EiTOOArN-)MTq=tm8cx{h$HMqyKjKzpf>kO#|-m)k&+iZ$Ibc?G{9OQiQAw3o6ztl>%LxA>B@#>Ut~i&yGr+WHH@kc&~7Z;cPA*hf$)JMMZL~A`NQCKS#!=; zQZ;YjViCadp3`g~3gY({YB=8eZkuX?;QO@j0*gZ8ib0;hKFB z9)v{1^7Xi*%F1jbcs`G!pyCDAWgT!R@IizP7Wt^LmJz#qS=ZuD{WJd;-OJMA& zc`6iqyWNasJQ@VZz5*zZaa2we0DGEBgp`;ARk5~|Ci*!cA!K+EPJYR;0gn3RGWUq3 z>fobl{ClBZ6K5=54lb_7;*T7KD5MY@;9{K4Q7Ha^8F&jPfQ7k7&p4Uvx<>m0;DRe( zuc!(gagPq{uXYKM$y)*c&OV6Q%ECE*u4(Rt~_rn|FU37)_RBYGF~zU>reJ>q1DHP_G*>2wbMUx72<7ikmrtiQ;Y=(z-`a zY+=G;Eh;BrlFmfAJs?x3s7uP8=*vX&oDdDuUi!g9rTCZ59FLH4K-5 zO8TdWJo*sGWOi5#+t|B!>ZlMu?#_e=gQnxEx*X{%ia42#H()}(fhram{bQ>EJ3&eF z5rHeV5yk)^>-#qF0mm*Bc{`7zO$|q~*p$34UwFb%3}sjVLvLlxh!{Dbl1@3t^ zL?@}LMexn>Xx5g%Z&?#WEf>HZd{_Kiz@r<7DKG;zHQUq20&=!``n2GmOTR8U)fFqq z{qdU%zv=R=@HpG`R0p%bP=p+z!owEFMVaBlQDpTkfsL4UehjcOzJU74`y`^<>HH_$ zAnzA8$ar(Se5caD1)G$B-`S)NAUCbe!efy^TF3p74=k75!m6vn=opQCqn&X6;=gg} z25?K1a0f=y@|Bpp*y)VCFHzY3Vyby9HQULdBXQDpL{0dRfp4w3Gy}oj8}|jYID~Rp zx@1Qo97(xGCFVt*KHl}B!ob?JEKAlhb2FZQoBvxz`+?|M8B2N*YBPu)wg4|?@RRf( zuCdGTrR3+R)5O4k=IbCBUgqt>6vg$IC{L4~Bi&%j(4`3$*A&FDvb1b2&_lroJ(l86 z3MH!C_|qKqIcF|Eeu32=9n3??#gz*0!-h&R)aE+h5?>CYP z=2_0;rWb&+0$g?(I{yqNV*bjocQqaYRE#3%P?u4>BMkh#9+-M{qaxJ~o*j@p2`^En z$KC&>rPyW0T3Lno;m0pRHt^je?-O+(nC5WJ2-;RwWhw<=Ew%x>RY6osSK%aJ5sSc| zga7JP1+L1u5a10QD`#?ke*o-+89-$# zhom@IsSzSGPEr1cg!Ke=ieAp?4>u>ZnY!{>6GSWQ^=@PX5G13vdr(QEE1glr#$RMH zhQ7JZb|waTaM^wyM|Adi$nVs}<)4ZPU+sb^tx-qdt+@?O;wTg+6ObH}b%~t{ z1Gl+?mi9AnB9}w^%`3nenXKU$q@Yu#%={w|Bva-Tse#*}Q0GZbE-oR&P>HYs4-G|@ zQ*TQ2N6W8!HNggOj_C3+VB>Z`t@DneU;KwiY5*u9_w^s6=sk{?Gf&@I-=1y+17XSd zSMZOBPeCo9JUFC+eh1-x{_{UN|0xmvU%=MOb>dR)a~I2KDUvzQXVaL`P&HIo90>;Z zt`jODwgCs@_dP2_^VKn;z=~^k9bj0{S_PuBAtm2 zoWWy3q(LP@abKWrx(`chPurl}rnDnr?*z6BwFZ3)3k!-P6)IArFQmfbOF9f!)$KhA z@w2C~tN(3*Y7Fn+IUvEqJ`kN0XMc45JOHxY&J!*|Xi|J&9Yy8p#;}Fy%Of8MiDZ=UtF2HWO%Z^9H4$cO-51`I;(N##swMhw7F-l}-t%Lc z>1U#ia{-9WE&4h*W*yPX(_Uddee7?j_cncG>Vux(%4%$UA`@H)Xarcxpj83;Imac& zkt#fH7^ttmwCn-572k4b2p2k}K$p9fDeY4ZB*TJnK%foIL$^={oF9^NC3frtG!-+L z8lT!vd5w3)2MF2U_kar<1Q(`w-bvoV3bxRyS~yeGlDys3nE0)__@`H}G0=$E6L2qm zhNNN00-qn&W_g9mRPz&d3T>>w4qVEIu-*)uY?xg?viGRt9ys7r+WpB5wVifs3>mBC47}SDF+Tb+HuI3EM zDA&0Uc^?@3X)j%hAELHESbu|B;Q`e2X(n`+T^meD*oRgy+B0iLD{ywb0~<$en*L!Y zR;y|5q=%ge@wq6T>5^pO#8{bkn$Xf+ee`~RM%s)qQb9u+#`b@g2`;A4!>8t&(P_&jF1WI-91l2hm2T!;e5@2LqcG>sC zcCEWB-BZqRk~b69yP6m81&#2@3%+rOo( z|6eVDW7~D;aVSVwr#7Q$#u>;+fKseRR173AB7$9GnOt(IsV&)OK$=wvdNoGM8SD~9 z0L7XWFQfWy#v7QfLWr5@z+?X4;n8x8ElDV542WC%D3aN+{uvtk_&d?uw^q*oMM_#n z!kG3MJKm9*KQC5A_gPov-lXivxBl^`Fp}&hxLSFYsK^`%e6G1=_ZFM0RLXX?w{63XvF0^=s`1TSD9bNb_rPQF&V})`qloWH%$(;m zpC0mei|Bas#0P#7<F}q8T*p;Ph30?9?Pdka7sCL=j|oTEuCif|L;NZghV#KJ$V5e zyb{v84l$qZxOXLot_j)goG2x5f;L7?ppgo4xBWKueX$#ek?IbhJWHQ$dV7wbz@6ET zI>r^OZR@b^py%ZaK;Ze2cCwa&!)}YAJwtt{9BIbChKlNv42KewK%XLZlc=MlgUezp zshy{er#e_!{pF51k`ZCA?r3L&zu3R{VvuJ8ehNuTvhyQkvj%Skp;+T!_B^y72LLNIHAl0P# zEQL2LN4U#^h@BhBs4IRH1tAoU3nUVEotRm&&5}Q(hfr4$3z_UGhh3L${(-^8D^P#5nr12EW`z6__VxJ6=kgtw=O_J2+#`1PZ z52QS+?Dr(~(7$ zmlgqale%Z)zGcbrLhYiUHig(qT&lSI6b#2|0MuecD|kihJ{rfMDwHp!w{|ClZ>Xg! zl;5Bsgoeh=n{f|&f>-dLmCLkI=#j|D8Je4s{i`ob(|mIEYl}-O2ww zVgtDBqM$*#c^doF;e~5-+6WF?E{#3;Lmar?;c!hsX9+qyA>mM}X68kR9Wys}rwII}4NCSnO9nh6Cb^9S~5^YGfI{~WRC_H=+0I02}ykR{9RFNHrRR6I9bF8050w}g!QQ^>PieQ?|D_Ucu zWvjgo(@=Al{8+0-d;x^XY%|oLrFETeLC_b_!){%za zgfJ~Vz4Ft$fJ|7a#PdfWw`Ubs!n(omA+9Ff^Fs}>c>n$(b)QK3i!t6i6MEb!3Nt~% z#eojEQ_fi4g zXtQ46Pxh;AN-}!)agrXT2&<4OrhM4fpgtW_rL8v)qNlt@1ut zY6gFZPM0DT-;J5efQFtJE{ggN$3#fvM~3=!XcIN$NjCeJ2oYby>~>Sd_ltsNK7n^z zib(I0QEA<-09-`qwEPI-pX@8weLH91G#e5NeEw!Brb^%7=W2Z(O4<&`C0s<%n(&Qp z2_TSGQh{IjBEju)Hk_wR@d5gJ%|KtTA3RtrdaQ1{Kho7q9c@LJy>{z9Mn_n8usSgC z@0wNB=}D_wzXS`umf}7Tq*v#sqPtUywHJUbA+TP4(Blp#jbusrfWdXZ7I+uSXEuPe z(wjsjr7w~aRiu$Skai_)&;QGZik55`ztfchi=Yp`CXMLCRmw=dYJ;y5tiKYep-Pe^ z)5>3w1nx%J7j>}FM8f4dp)9tq7wg~7Gh=}E$R#q>TbJbzgEkc@gXDqBe|q9Zi|wk2 z-APdKS+(*5pV}E28K0tyB_GtXm!`k!lq+y<- zJCWMe-n5)A6?Z=3UkCnQxCco%!7zmjdd>~#d`l?oMfp6E3|CQ3XZ%i}z=UYLv_lm2 z*PWfbUz?ygws#)OU`OIk98}Xry_=wQ0|CsXtaLcm6r~CGJqJ;jt)aTHSFce42;dur zkwA5o55aX2>$`44^+hq@$%O)dBgu(-$puxbOPEAKTNs@F9xO zeg;9yOkI=8=Y=k~6oj>b|Lz0K;McsJ+~~YlEqz-WzQsPKJ)tNU7(jg$MXj-uEEg=W z;PP^No}afI$+xl8K}oBo~Mm6?ailEj#YJrt4AsD$8~Bs4$!Evf*D?f8q}d(>mTTT*W$Z z+!^WOFS`5~g;{PvC3)&fKyO3M4w7f$g*7lmg_p{{Ak|MNRVW4L{)YF~o~9;2J_z^6u0r0KCu5M_C+*O&fyrDIs=N(D%lb#lFB@O zhBq1!H+@teYvB#oxUlB5J5Yc0t-Q$HsSigylbqM{Tyg*8C@I5f3xqze>53NgCbj^y z@sn~rrAUObaaa+yzTCb(ws_clDY}iNg@vwDSfA9sECM*Kvovf!4D?;Jj=CF1b6H_b zOqrugA20lj@}qM_F0{Yy&J3;oEir^L>qM?cAUF&zecjnbv+GUhK4Z-vFMtrGzMQSgGY4FF?x}#k?Jy&uEv-;&_Q*$EXdL!)go<5LUb<{?o+Yx%h_UY41L}Z9kKWi&GM8VL0R96ukD`>Y{pX*7# z;{La;P6)@{ZOK+_`d5hA$liv znyS3$uqBPai#K!@0{WQ&WJzCY`99Y^B!p1GFCQ~AD>C%~0k+oEWOo`Fxf#5)KXIv8 zH54C7EMer}a1og?-z%0=2&?>$&FND%XWbL&4Y5@ZoyleX15+ zFGi!pn_lohQ362SkS3?}AsQ={`%!w=zFbOw;>eoG=Kf16TCs8s!plDW7KM+6{~Fqm z9MCy6Bin(b%8}Gti-->k_8xA zdhCKSM5W&5$VV%ueGR+Q7KC8xZ%ze;`(SJNMT=}I!qRY8?xaBtFFLWiy(*=e`TC;! zcCEwry2F~mTgv?Rw};S{o1~$eoPnB!^b905I9PoBS$LedI4$c-T9(7UVu0d0&0FmE zi=!`rb$RVxkNpEeqweR2`>ZD(GAFhf+?P+ohXU8DxYty^oMwspu$yZ117yc=-VxTJ z6?+pihDF%2-;3h+jL5D9`8|1^R!Q_;k~W0YNx2K;AwCML{R}Ge1sT{rRWE3M*i0o7 z8{C01egTwUI1BcOVrxlNM|k{{Ex~)e95fGb4r0v~@RqztT8}44PfriuDKSksWF}L- z`%cY~rN1)D5I&HF;WX(#GLuxt-dvX@Fk7d4!%l{Bn^D;To7{BE_wB9Humb?7ON3p_8nx%aR3yox0!iu6XQ9UW&d%v;y6!3yp_H zOaay+7}+~@Glsb|<6~njJ%!ogJfN+J7~=>YQbUye1X9dPSV3gY;lZNv*vGp;v8P~` zDdRx^5h7ZY?!b2Xx2GC7l|tvI=l7v40fJmu4X%=_4q9D^KqoFE*1S4iA;y|yW)TN_ zn|>_C5K>`C2X@LKDEBcJwQO@2Ng2!}W~3_ecUpF)bVnd`HtKx|MK6cY5NXAo63u>r z{CdjUiN6*;VIIF=)lpQ|Qe1hT7P4pFuElWG0YiMB;a8frXw9p}?70F0peajqdrmv= zV!fsOjOM2fy$9D(X}YPm zovo~6aWSpp);g1svIE4%eNg0>;T#TYhH_|wUU43*cKIT4$oA>y(CU&fzf3vACD(6B zkM>`j&=&f$>Y`DI@|JGdp=JQ7Dw&P4tP?kfjpD3bmmI2B0Ei^HDlB> zTVvlt5Rs|0jH%QrOJVj=1pC6cbOuhb;=%tSnErx(SwXVr$le*c85 z+SxAkIYc|F2tBbcr4?2VD^_zvcE_~i7d4uS^+1kiRFoEi5}2;nNSDFm7p6B|JVHcH zh=$pM40Ud_tYFe#q0fbH8|+cE)Y*Se(7kn5%5joBxMGYc?gP zJo(-4(R{FLMw1|~z%>fE5uGBbyZ(SWYrFd+UcdP693|XT4CU_ivoI{n_kRFYZl(cz zD8r3qKt6jpmbF7ZvI#@@RD9Pxs}vxO`R=Q62AlNtd52YsE7_BJy4gGQvzje;zX5$# z5&}-~tsTyZh<*7l=1oT9m@_SpOSs5dF9tMDtI%C#Nj4l6-Ik$Ad)84DuIv#p$SO*!$LVi_qLDZC2i|gxk^ff15zso(8gI&1CN>x} z1!^SvX@2lj{d7aIQ0@N__EAA&MmzO@MxYXJ9^vI*dZWwZ6(RW#6zIqD>0opud=&t5 zY+y@;kOM$L1l{3&S^hhe#_cA@wgn4G2F~efl*S0T3GfeqRrA?AeF&{!KbC?T^*hbN zu1PQG)@ZG!BR)Sa1QOpZ4-K|#T|WCi@0tjmx_lWdCszmw=-e4BWLUTMt&$-|M0^HPsG1H&JjBZCVOg|$3E)k zHXnBtir_bFF?+Mc(IV5*s^R(W!Eyrc28?0UE`ronD=Ifw}- z#rvpW<;%&3WwP5runRb5i%cBuG|b}Yv;!*WcA;4>@tA@nR|jY}c*-;O5b^LtyA=63 zuGk^PUHGYAZhSd>vQYFy;@{(R169HV@z^(*BmXsXA$Zte#vn`M_bboclaA&ijM*ZK zuGDeCB0REBs_IU5wiX=nx6-!G?oACjyR-A2H8w(8X0)ouPY5@z=BM>FA&wYK_86M=pWR(@4Cx&x=O4UCwiJ;yDMQ-8 zOoVMSs;)K;oysK`UuC_zUUE7R9=tu9!DRx4S*-r$c~)E5JpXIG6(@gCghmNhiV0YE zZZuK5c`YG(ghYlc>_of@tCS?mQB#vH*DFBj@e|fk^06_FCC6o$Cm zZ)3kZ-M6{A*q$trEQWFr%fclH*yycK=EXDkpg3_K9A$(R=0$ucB5zDwdQf`seRidG zq9$*wZRDD>qk8W4A9=nX8Z7FHd?2y8@~>lkJg84SnHx*+NO{A3a|QG3i+>mS;S+l+ z9u2eFt}wzm6)kgk8>Mez^i0&49k<TiL z29U__UxDpYCuni&zo{$sIs*+R+qcdU=DH4%e^TC1gwv0vQM5nJnP3(W#llBpRpH)JDuBz@Oh9<08CD|ko&78S zD;wvHv;mu8+TBbrN#kQq;1QKa8(?ST5;VB_n-~>ya3bEl^Ea-P%eSuQ08mgD!$S$b z{Ns@|O7zqP)5!Sk;(1lfo9*ky(H6(^T5E0m6`$>W?teE#x0b^GpMPX2<3WbIa#gsz z2|FTd7vG3QZQc8Mp~c1m#7Ol;N5`z8WOzj8rg`{C;cHrZ#v-IGJ^*h|w!9!d+yf

3Cfg1`rFq{G*lPJM*EZ+y^u)xvi6Q+|7kZf4{^0^|qq)%_m!@ zEr2MUdwZC}{B)KW=;gWmA<`4Hf9xm)zOeSQ?`h`l^PK|9N0$9{5&O092HF;{T>dgB$me;!GzaR2<)^4vqJg+qcjz0^nF>vlXY?)7zdFB`QeoJIL z7@bjFkV?+uMKt|gUC}tz`o*c!9mla~Uue7)v(LAGi!A%@9KWSUH8gxrIxF^Pn9Xhp zOenHR-MeTSf{CG^aO7%oS=zgJpeKk({li`bQ1S5z9}~32M^`}d?Dn=js$Az?sZkQ~ z(v=A|6i@6UK~e8F!ZBF>aQroK>#L}{A!xJFEVxTheSX>ba@oMzPrk(2g;IO5-Sz#7 z#_zc_iVs1u7z$p+U8P;P{rgirX1(9tRA!80Gq2%63$;}k0fW#}xHB3;v9|YStziR1 z?3dNbmyLv=5PWpP!oP=ZD_kV}&C?>kUzWEph;e#1a&Kqp!6QqVJOH!ok$l9TI2A+8 zYE_dMQ%Y$f@x7JR;xh+Yk?{6&_O?*OqRba25p+#;F{`-lXXla&tS_c( z8^bl0b8SWkKKiPCN?oe<$02HI$kdJbZq*3WVWklCzEOSBPsk?Dx5ZCY2Ca@hm^h{s z-z45o16`LI7x%c(i7-0Z?tv+)S}PQ8HnTffOuT5=UeALG*-8*9Z`6!o)R;GT=YRE4 zr9%wtxmn)5d+@)n!HYNN$lCsrcG;PKGblP)aai0i{{H1=RoGY1C6D@4gyYWa!oU5) zV3I60`q%zw4+A3|T_kardWIKAgvRpxDj&zn>5omC7VkiwNfV3mXzq@BR{vBm=tm3U z=Zzh`OoV`K9=y)Drda=))sgK-g15%wWjo$@@YOIq^ga5;qjV?lpVME+kc&sG4MIK# zBp|~q{>C1}c+R`IejM{pV0rN0{bqTN@^u7VM>5gy#k03?)Oy9T0WliO4Zx;!;0~lq2_Sh^cTW5jew?_|o9-nbl(7|TXX9q%6;(5mQWDhv2 z^x0WPCMMK;*@8XwjHoc-?^5!mJtGBuqylhwbQhpH`zB~xn>(#g7n@8V_vPd!Rbogh zY#SDAC?{HZj{u^@sj+kWp7mU}zwZhzYF%%3y(woEqmnzbmN}fTPs3hD&e+heI!YKi z-hzd=u-VJucmw19A6w~bJAeP~{k{;E!kxHc$J_NH3tUbQ|N(zj^I)Sc?wf`u%3wQOX3o_PSu@b)Cq^ z^CeBLaedJWC`RHKSxp&;1TqcFh}%(>tLFV#GZB6zo}{__6lfRrhED}OZOk^ z`Z0=o(PH)4T!itKZCx0=n9|Q)Oh8!M*3?iQt`0u)p(bMYTjJCQ%WuJn3u8Pc4Ku`z z4#LM-AN@jrF91VYReV&C7yR|=cMGfMeq?-f0*?eI{TD|k84=XAPTo$b&yzREOJ_b$ zWQknfBTr7(fg4@kY>wW`Pqo)4oZhN=f1XJ?G4uN)kXLrB=TE5TIvNnE9#)0%VKf7* zSOA0cEnG12-M&J(O-~SvPgnL8y6NjEJ_%KF$?r5@hb5?}`!)`vs1qhk>96t4BDUDZ z1a?SH7VTE~M%G3di&m$ZW=+Gxtno1Oe_f{q8J_%?Ix!>=E}D&UxFVZh$F z53+pT38wG%7XVn7B0FyrGXZPlZ$ti!( z&kGp2C9Jreb1`%hel=o(r|NHaq`Cg|>%q#A?E(*Ud!-B1lRf2yX zOoUyic-Bv1*;i>VM$cSSvrz%%}Ja_2jw013fUyEEv-uXW8Y4)}%{fJi?< z6&#@et>s&>)t3#itvmd&0W{ct{kfcH80zs02(B>v9CNeI<*-R2g`_-Hc5@;DrPv>l zP5^x0sKXJ|)GkTlalBCjZ`CCWO51XS)9oWvgW{U8#VB?c#!KzkRv(`T#%*lGA^fLi zkXM_{K||mv%mPoMCb@owm?Ak@(5!R&+z4)oem_AFDFAU z#?$ukgH@jcmS#Yx`EMWzw0boow<%C{Py3|=*Ms0@Kt0Y)9^)oI-j>i-*l9TBb=LWa zc@B~{MxV<+atL`~KC*Jw&gmUg#{THdj;8i{;ZzvWR4{|huLcxs_ns36tCLM!SPuO~ zx$5nNMMVdJR&!HSP9%Vwz-u*sCjbl(-Cuc4kpy|6BjoU)xF+{wLY#roZv{|Xss?_7 ziu3J0{q6#_b03yJEbF-!zA?Uf*~`ZMSF?-L{MYm5xfW5xjx*dt*>!{q;-EWQjF1Sh zp|bIWT(V9|DOWm%AHorEh35ST)KqK;P;sL^EG_idtHcF=d- z3qyo(*%f$WylT6?T6WQBqJ(qg;D%t`EZhd6-+0G8I|0qpebcb-MVn>!DS>QcK8Kdt zXAb@_VlVXZ-rbF^h3Cj$ z0j)V+`oi+gg>HU8df~-Gz*0pTmb`J-DRvT$y)lD&3WM-8-usMuC&16}b-ez{kNj-z uRc+$|O3=DfJ8*(?Z2SN0AI97t&v4`yC2e7ZI*$ literal 0 HcmV?d00001 diff --git a/blueprints/anytype/template.toml b/blueprints/anytype/template.toml new file mode 100644 index 00000000..e1388da7 --- /dev/null +++ b/blueprints/anytype/template.toml @@ -0,0 +1,4 @@ +[config] +domains = [] +mounts = [] +env = [] \ No newline at end of file diff --git a/blueprints/bluesky-pds/bluesky-pds.svg b/blueprints/bluesky-pds/bluesky-pds.svg new file mode 100644 index 00000000..77ebea07 --- /dev/null +++ b/blueprints/bluesky-pds/bluesky-pds.svg @@ -0,0 +1,3 @@ + + + diff --git a/blueprints/bluesky-pds/docker-compose.yml b/blueprints/bluesky-pds/docker-compose.yml new file mode 100644 index 00000000..4f9ae9a2 --- /dev/null +++ b/blueprints/bluesky-pds/docker-compose.yml @@ -0,0 +1,48 @@ +services: + pds: + image: 'ghcr.io/bluesky-social/pds:0.4.182' + volumes: + - pds-data:/pds + environment: + - SERVICE_URL_PDS_3000 + - PDS_HOSTNAME + - PDS_JWT_SECRET + - PDS_ADMIN_PASSWORD + - 'PDS_ADMIN_EMAIL=${PDS_ADMIN_EMAIL}' + - PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX + - 'PDS_DATA_DIRECTORY=${PDS_DATA_DIRECTORY:-/pds}' + - 'PDS_BLOBSTORE_DISK_LOCATION=${PDS_DATA_DIRECTORY:-/pds}/blocks' + - 'PDS_BLOB_UPLOAD_LIMIT=${PDS_BLOB_UPLOAD_LIMIT:-104857600}' + - 'PDS_DID_PLC_URL=${PDS_DID_PLC_URL:-https://plc.directory}' + - 'PDS_EMAIL_FROM_ADDRESS=${PDS_EMAIL_FROM_ADDRESS}' + - 'PDS_EMAIL_SMTP_URL=${PDS_EMAIL_SMTP_URL}' + - 'PDS_BSKY_APP_VIEW_URL=${PDS_BSKY_APP_VIEW_URL:-https://api.bsky.app}' + - 'PDS_BSKY_APP_VIEW_DID=${PDS_BSKY_APP_VIEW_DID:-did:web:api.bsky.app}' + - 'PDS_REPORT_SERVICE_URL=${PDS_REPORT_SERVICE_URL:-https://mod.bsky.app/xrpc/com.atproto.moderation.createReport}' + - 'PDS_REPORT_SERVICE_DID=${PDS_REPORT_SERVICE_DID:-did:plc:ar7c4by46qjdydhdevvrndac}' + - 'PDS_CRAWLERS=${PDS_CRAWLERS:-https://bsky.network}' + - 'LOG_ENABLED=${LOG_ENABLED:-true}' + command: | + sh -c ' + set -euo pipefail + echo "Installing required packages and pdsadmin..." + apk add --no-cache openssl curl bash jq coreutils gnupg util-linux-misc >/dev/null + curl -o /usr/local/bin/pdsadmin.sh https://raw.githubusercontent.com/bluesky-social/pds/main/pdsadmin.sh + chmod 700 /usr/local/bin/pdsadmin.sh + ln -sf /usr/local/bin/pdsadmin.sh /usr/local/bin/pdsadmin + echo "Creating an empty pds.env file so pdsadmin works..." + touch /pds/pds.env + echo "Launching PDS, enjoy!..." + exec node --enable-source-maps index.js + ' + healthcheck: + test: + - CMD + - wget + - '--spider' + - 'http://127.0.0.1:3000/xrpc/_health' + interval: 5s + timeout: 10s + retries: 10 +volumes: + pds-data: \ No newline at end of file diff --git a/blueprints/bluesky-pds/template.toml b/blueprints/bluesky-pds/template.toml new file mode 100644 index 00000000..3de5b201 --- /dev/null +++ b/blueprints/bluesky-pds/template.toml @@ -0,0 +1,36 @@ +[variables] +main_domain = "${domain}" +admin_password = "${password:32}" +jwt_secret = "${jwt:32}" +rotation_key = "${jwt:32}" +data_directory = "/pds" +blob_upload_limit = "104857600" +log_enabled = "true" + +[config] +mounts = [] +env = [ + "PDS_ADMIN_PASSWORD=${admin_password}", + "PDS_HOSTNAME=${main_domain}", + "PDS_JWT_SECRET=${jwt_secret}", + "PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX=${rotation_key}", + "PDS_ADMIN_EMAIL=", + "PDS_EMAIL_FROM_ADDRESS=", + "PDS_EMAIL_SMTP_URL=", + "PDS_DATA_DIRECTORY=${data_directory}", + "PDS_BLOBSTORE_DISK_LOCATION=${data_directory}/blocks", + "PDS_BLOB_UPLOAD_LIMIT=${blob_upload_limit}", + "PDS_DID_PLC_URL=https://plc.directory", + "PDS_BSKY_APP_VIEW_URL=https://api.bsky.app", + "PDS_BSKY_APP_VIEW_DID=did:web:api.bsky.app", + "PDS_REPORT_SERVICE_URL=https://mod.bsky.app/xrpc/com.atproto.moderation.createReport", + "PDS_REPORT_SERVICE_DID=did:plc:ar7c4by46qjdydhdevvrndac", + "PDS_CRAWLERS=https://bsky.network", + "LOG_ENABLED=${log_enabled}" +] + +[[config.domains]] +serviceName = "pds" +port = 3000 +host = "${main_domain}" +path = "/" \ No newline at end of file diff --git a/blueprints/budibase/docker-compose.yml b/blueprints/budibase/docker-compose.yml index 620324dc..92ad3288 100644 --- a/blueprints/budibase/docker-compose.yml +++ b/blueprints/budibase/docker-compose.yml @@ -182,9 +182,6 @@ services: labels: - com.centurylinklabs.watchtower.enable=false -networks: - dokploy-network: - external: true volumes: minio_data: diff --git a/blueprints/chatwoot/docker-compose.yml b/blueprints/chatwoot/docker-compose.yml index ece9ef44..a43b43f7 100644 --- a/blueprints/chatwoot/docker-compose.yml +++ b/blueprints/chatwoot/docker-compose.yml @@ -4,8 +4,6 @@ x-base-config: &base-config image: chatwoot/chatwoot:v4.0.3 volumes: - chatwoot-storage:/app/storage - networks: - - dokploy-network environment: - FRONTEND_URL=${FRONTEND_URL} - SECRET_KEY_BASE=${SECRET_KEY_BASE} @@ -63,10 +61,6 @@ services: volumes: - chatwoot-redis-data:/data -networks: - dokploy-network: - external: true - volumes: chatwoot-storage: chatwoot-postgres-data: diff --git a/blueprints/chirpstack/chirpstack.png b/blueprints/chirpstack/chirpstack.png new file mode 100644 index 0000000000000000000000000000000000000000..b84e845f357ce883f98865cf8f008de5c25c67d9 GIT binary patch literal 12023 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:@/?sslmode=. + # + # SSL mode options: + # * disable - Do not use TLS + # * prefer - Attempt to connect with TLS but allow sessions without + # * require - Require the use of TLS + dsn="postgres://chirpstack:${postgres_password}@postgres/chirpstack?sslmode=disable" + + # Max open connections. + # + # This sets the max. number of open connections that are allowed in the + # PostgreSQL connection pool. + max_open_connections=10 + + # Min idle connections. + # + # This sets the min. number of idle connections in the PostgreSQL connection + # pool (0 = equal to max_open_connections). + min_idle_connections=0 + + +# Redis configuration. +[redis] + + # Server address or addresses. + # + # Set multiple addresses when connecting to a cluster. + servers=[ + "redis://redis/", + ] + + # TLS enabled. + tls_enabled=false + + # Redis Cluster. + # + # Set this to true when the provided URLs are pointing to a Redis Cluster + # instance. + cluster=false + + +# Network related configuration. +[network] + + # Network identifier (NetID, 3 bytes) encoded as HEX (e.g. 010203). + net_id="000000" + + # Enabled regions. + # + # Multiple regions can be enabled simultaneously. Each region must match + # the 'name' parameter of the region configuration in '[[regions]]'. + enabled_regions=[ + "as923", + "as923_2", + "as923_3", + "as923_4", + "au915_0", + "cn470_10", + "cn779", + "eu433", + "eu868", + "in865", + "ism2400", + "kr920", + "ru864", + "us915_0", + "us915_1", + ] + + +# API interface configuration. +[api] + + # interface:port to bind the API interface to. + bind="0.0.0.0:8080" + + # Secret. + # + # This secret is used for generating login and API tokens, make sure this + # is never exposed. Changing this secret will invalidate all login and API + # tokens. The following command can be used to generate a random secret: + # openssl rand -base64 32 + secret="${api_secret}" + + +[integration] + enabled=["mqtt"] + + [integration.mqtt] + server="tcp://mosquitto:1883/" + json=true +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_as923_2.toml" +content = """ +# This file contains an example AS923_2 configuration. +[[regions]] + + # ID is an user-defined identifier for this region. + id="as923_2" + + # Description is a short description for this region. + description="AS923-2" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AS923_2" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="as923_2" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=921400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=921600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=921400000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=3 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_as923_3.toml" +content = """ +# This file contains an example AS923_3 configuration. +[[regions]] + + # ID is an user-defined identifier for this region. + id="as923_3" + + # Description is a short description for this region. + description="AS923-3" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AS923_3" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="as923_3" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=916600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=916800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=2 + + # RX2 frequency (Hz) + rx2_frequency=916600000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=3 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_as923_4.toml" +content = """ +# This file contains an example AS923_4 configuration. +[[regions]] + + # ID is an user-defined identifier for this region. + id="as923_4" + + # Description is a short description for this region. + description="AS923-4" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AS923_4" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="as923_4" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=917300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=917500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=2 + + # RX2 frequency (Hz) + rx2_frequency=917300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=3 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_as923.toml" +content = """ +# This file contains an example AS923 configuration. +[[regions]] + + # ID is an user-defined identifier for this region. + id="as923" + + # Description is a short description for this region. + description="AS923" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AS923" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="as923" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=923200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=923400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=2 + + # RX2 frequency (Hz) + rx2_frequency=923200000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=3 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_au915_0.toml" +content = """ +# This file contains an example AU915 example (channels 0-7 + 64). +[[regions]] + + # ID is an use-defined identifier for this region. + id="au915_0" + + # Description is a short description for this region. + description="AU915 (channels 0-7 + 64)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AU915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="au915_0" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=915200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=915400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=915600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=915800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=916000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=916200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=916400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=916600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=915900000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[0, 1, 2, 3, 4, 5, 6, 7, 64] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_au915_1.toml" +content = """ +# This file contains an example AU915 example (channels 8-15 + 65). +[[regions]] + + # ID is an use-defined identifier for this region. + id="au915_1" + + # Description is a short description for this region. + description="AU915 (channels 8-15 + 65)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AU915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="au915_1" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=916800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=917000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=917200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=917400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=917600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=917800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=918000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=918200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=917500000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[8, 9, 10, 11, 12, 13, 14, 15, 65] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_au915_2.toml" +content = """ +# This file contains an example AU915 example (channels 16-23 + 66). +[[regions]] + + # ID is an use-defined identifier for this region. + id="au915_2" + + # Description is a short description for this region. + description="AU915 (channels 16-23 + 65)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AU915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="au915_2" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=918400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=918600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=918800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=919000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=919200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=919400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=919600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=919800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=919100000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[16, 17, 18, 19, 20, 21, 22, 23, 65] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_au915_3.toml" +content = """ +# This file contains an example AU915 example (channels 24-31 + 67). +[[regions]] + + # ID is an use-defined identifier for this region. + id="au915_3" + + # Description is a short description for this region. + description="AU915 (channels 24-31 + 67)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AU915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="au915_3" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=920000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=920200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=920400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=920600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=920800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=921000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=921200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=921400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=920700000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[24, 25, 26, 27, 28, 29, 30, 31, 67] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_au915_4.toml" +content = """ +# This file contains an example AU915 example (channels 32-39 + 68). +[[regions]] + + # ID is an use-defined identifier for this region. + id="au915_4" + + # Description is a short description for this region. + description="AU915 (channels 32-39 + 68)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AU915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="au915_4" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=921600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=921800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=922000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=922200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=922400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=922600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=922800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=923000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=922300000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[32, 33, 34, 35, 36, 37, 38, 39, 68] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_au915_5.toml" +content = """ +# This file contains an example AU915 example (channels 40-47 + 69). +[[regions]] + + # ID is an use-defined identifier for this region. + id="au915_5" + + # Description is a short description for this region. + description="AU915 (channels 40-47 + 69)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AU915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="au915_5" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=923200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=923400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=923600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=923800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=924000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=924200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=924400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=924600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=923900000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[40, 41, 42, 43, 44, 45, 46, 47, 69] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_au915_6.toml" +content = """ +# This file contains an example AU915 example (channels 48-55 + 70). +[[regions]] + + # ID is an use-defined identifier for this region. + id="au915_6" + + # Description is a short description for this region. + description="AU915 (channels 48-55 + 70)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AU915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="au915_6" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=924800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=925000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=925200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=925400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=925600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=925800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=926000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=926200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=925500000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[48, 49, 50, 51, 52, 53, 54, 55, 70] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_au915_7.toml" +content = """ +# This file contains an example AU915 example (channels 56-63 + 71). +[[regions]] + + # ID is an use-defined identifier for this region. + id="au915_7" + + # Description is a short description for this region. + description="AU915 (channels 56-63 + 71)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="AU915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="au915_7" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=926400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=926600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=926800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=927000000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=927200000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=927400000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=927600000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=927800000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=927100000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[56, 57, 58, 59, 60, 61, 62, 63, 71] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_0.toml" +content = """ +# This file contains an example CN470 example (channels 0-7). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_0" + + # Description is a short description for this region. + description="CN470 (channels 0-7)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_0" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=470300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=470500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=470700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=470900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=471100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=471300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=471500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=471700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[0, 1, 2, 3, 4, 5, 6, 7] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_10.toml" +content = """ +# This file contains an example CN470 example (channels 80-87). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_10" + + # Description is a short description for this region. + description="CN470 (channels 80-87)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_10" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=486300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=486500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=486700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=486900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=487100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=487300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=487500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=487700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[80, 81, 82, 83, 84, 85, 86, 87] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_11.toml" +content = """ +# This file contains an example CN470 example (channels 88-95). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_11" + + # Description is a short description for this region. + description="CN470 (channels 88-95)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_11" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=487900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=488100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=488300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=488500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=488700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=488900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=489100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=489300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[88, 89, 90, 91, 92, 93, 94, 95] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_1.toml" +content = """ +# This file contains an example CN470 example (channels 8-15). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_1" + + # Description is a short description for this region. + description="CN470 (channels 8-15)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_1" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=471900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=472100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=472300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=472500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=472700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=472900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=473100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=473300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[8, 9, 10, 11, 12, 13, 14, 15] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_2.toml" +content = """ +# This file contains an example CN470 example (channels 16-23). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_2" + + # Description is a short description for this region. + description="CN470 (channels 16-23)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_2" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=473500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=473700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=473900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=474100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=474300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=474500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=474700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=474900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[16, 17, 18, 19, 20, 21, 22, 23] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_3.toml" +content = """ +# This file contains an example CN470 example (channels 24-31). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_3" + + # Description is a short description for this region. + description="CN470 (channels 24-31)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_3" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=475100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=475300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=475500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=475700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=475900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=476100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=476300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=476500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[24, 25, 26, 27, 28, 29, 30, 31] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_4.toml" +content = """ +# This file contains an example CN470 example (channels 32-39). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_4" + + # Description is a short description for this region. + description="CN470 (channels 32-39)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_4" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=476700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=476900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=477100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=477300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=477500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=477700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=477900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=478100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[32, 33, 34, 35, 36, 37, 38, 39] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_5.toml" +content = """ +# This file contains an example CN470 example (channels 40-47). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_5" + + # Description is a short description for this region. + description="CN470 (channels 40-47)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_5" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=478300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=478500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=478700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=478900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=479100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=479300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=479500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=479700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[40, 41, 42, 43, 44, 45, 46, 47] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_6.toml" +content = """ +# This file contains an example CN470 example (channels 48-55). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_6" + + # Description is a short description for this region. + description="CN470 (channels 48-55)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_6" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=479900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=480100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=480300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=480500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=480700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=480900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=481100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=481300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[48, 49, 50, 51, 52, 53, 54, 55] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_7.toml" +content = """ +# This file contains an example CN470 example (channels 56-63). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_7" + + # Description is a short description for this region. + description="CN470 (channels 56-63)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_7" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=481500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=481700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=481900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=482100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=482300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=482500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=482700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=482900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[56, 57, 58, 59, 60, 61, 62, 63] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_8.toml" +content = """ +# This file contains an example CN470 example (channels 64-71). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_8" + + # Description is a short description for this region. + description="CN470 (channels 64-71)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_8" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=483100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=483300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=483500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=483700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=483900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=484100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=484300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=484500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[64, 65, 66, 67, 68, 69, 70, 71] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn470_9.toml" +content = """ +# This file contains an example CN470 example (channels 72-79). +[[regions]] + + # ID is an use-defined identifier for this region. + id="cn470_9" + + # Description is a short description for this region. + description="CN470 (channels 72-79)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN470" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn470_9" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=484700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=484900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=485100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=485300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=485500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=485700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=485900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=486100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=505300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[72, 73, 74, 75, 76, 77, 78, 79] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=2 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_cn779.toml" +content = """ +# This file contains an example CN779 configuration. +[[regions]] + + # ID is an user-defined identifier for this region. + id="cn779" + + # Description is a short description for this region. + description="CN779" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="CN779" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="cn779" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=779500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=779700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=779900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=786000000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=3 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_eu433.toml" +content = """ +# This file contains an example EU433 configuration. +[[regions]] + + # ID is an user-defined identifier for this region. + id="eu433" + + # Description is a short description for this region. + description="EU443" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="EU433" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="eu433" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=433175000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=433375000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=433575000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=434665000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=3 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_eu868.toml" +content = """ +# This file contains an example EU868 configuration. +[[regions]] + + # ID is an user-defined identifier for this region. + id="eu868" + + # Description is a short description for this region. + description="EU868" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="EU868" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="eu868" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=868100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=868300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=868500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=867100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=867300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=867500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=867700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=867900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=868300000 + bandwidth=250000 + modulation="LORA" + spreading_factors=[7] + + [[regions.gateway.channels]] + frequency=868800000 + bandwidth=125000 + modulation="FSK" + datarate=50000 + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=869525000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=3 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 + + + # Below is the common set of extra channels. Please make sure that these + # channels are also supported by the gateways. + [[regions.network.extra_channels]] + frequency=867100000 + min_dr=0 + max_dr=5 + + [[regions.network.extra_channels]] + frequency=867300000 + min_dr=0 + max_dr=5 + + [[regions.network.extra_channels]] + frequency=867500000 + min_dr=0 + max_dr=5 + + [[regions.network.extra_channels]] + frequency=867700000 + min_dr=0 + max_dr=5 + + [[regions.network.extra_channels]] + frequency=867900000 + min_dr=0 + max_dr=5 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_in865.toml" +content = """ +# This file contains an example IN865 configuration. +[[regions]] + + # ID is an user-defined identifier for this region. + id="in865" + + # Description is a short description for this region. + description="IN865" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="IN865" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="in865" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=865062500 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=865402500 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=865985000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=2 + + # RX2 frequency (Hz) + rx2_frequency=866550000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=4 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_ism2400.toml" +content = """ +# This file contains an example ISM2400 configuration. +[[regions]] + + # ID is an user-defined identifier for this region. + id="ism2400" + + # Description is a short description for this region. + description="ISM2400" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="ISM2400" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="ism2400" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=2403000000 + bandwidth=812000 + modulation="LORA" + spreading_factors=[12] + + [[regions.gateway.channels]] + frequency=2479000000 + bandwidth=812000 + modulation="LORA" + spreading_factors=[12] + + [[regions.gateway.channels]] + frequency=2425000000 + bandwidth=812000 + modulation="LORA" + spreading_factors=[12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=2423000000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=7 + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=0 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_kr920.toml" +content = """ +# This file contains an example KR920 configuration. +[[regions]] + + # ID is an user-defined identifier for this region. + id="kr920" + + # Description is a short description for this region. + description="KR920" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="KR920" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="kr920" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=922100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=922300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=922500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=921900000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=3 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_ru864.toml" +content = """ +# This file contains an example RU864 configuration. +[[regions]] + + # ID is an user-defined identifier for this region. + id="ru864" + + # Description is a short description for this region. + description="RU864" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="RU864" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="ru864" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=868900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + [[regions.gateway.channels]] + frequency=869100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10, 11, 12] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=0 + + # RX2 frequency (Hz) + rx2_frequency=869100000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=5 + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=3 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_us915_0.toml" +content = """ +# This file contains an example US915 example (channels 0-7 + 64). +[[regions]] + + # ID is an use-defined identifier for this region. + id="us915_0" + + # Description is a short description for this region. + description="US915 (channels 0-7 + 64)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="US915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="us915_0" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=902300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=902500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=902700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=902900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=903100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=903300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=903500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=903700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=903000000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=3 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[0, 1, 2, 3, 4, 5, 6, 7, 64] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_us915_1.toml" +content = """ +# This file contains an example US915 example (channels 8-15 + 65). +[[regions]] + + # ID is an use-defined identifier for this region. + id="us915_1" + + # Description is a short description for this region. + description="US915 (channels 8-15 + 65)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="US915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="us915_1" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=903900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=904100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=904300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=904500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=904700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=904900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=905100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=905300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=904600000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=3 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[8, 9, 10, 11, 12, 13, 14, 15, 65] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_us915_2.toml" +content = """ +# This file contains an example US915 example (channels 16-23 + 66). +[[regions]] + + # ID is an use-defined identifier for this region. + id="us915_2" + + # Description is a short description for this region. + description="US915 (channels 16-23 + 66)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="US915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="us915_2" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=905500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=905700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=905900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=906100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=906300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=906500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=906700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=906900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=906200000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=3 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[16, 17, 18, 19, 20, 21, 22, 23, 66] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_us915_3.toml" +content = """ +# This file contains an example US915 example (channels 24-31 + 67). +[[regions]] + + # ID is an use-defined identifier for this region. + id="us915_3" + + # Description is a short description for this region. + description="US915 (channels 24-31 + 67)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="US915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="us915_3" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=907100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=907300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=907500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=907700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=907900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=908100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=908300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=908500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=907800000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=3 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[24, 25, 26, 27, 28, 29, 30, 31, 67] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_us915_4.toml" +content = """ +# This file contains an example US915 example (channels 32-39 + 68). +[[regions]] + + # ID is an use-defined identifier for this region. + id="us915_4" + + # Description is a short description for this region. + description="US915 (channels 32-39 + 68)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="US915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="us915_4" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=908700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=908900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=909100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=909300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=909500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=909700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=909900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=910100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=909400000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=3 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[32, 33, 34, 35, 36, 37, 38, 39, 68] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_us915_5.toml" +content = """ +# This file contains an example US915 example (channels 40-47 + 69). +[[regions]] + + # ID is an use-defined identifier for this region. + id="us915_5" + + # Description is a short description for this region. + description="US915 (channels 40-47 + 69)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="US915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="us915_5" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=910300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=910500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=910700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=910900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=911100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=911300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=911500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=911700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=911000000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=3 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[40, 41, 42, 43, 44, 45, 46, 47, 69] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_us915_6.toml" +content = """ +# This file contains an example US915 example (channels 48-55 + 70). +[[regions]] + + # ID is an use-defined identifier for this region. + id="us915_6" + + # Description is a short description for this region. + description="US915 (channels 48-55 + 70)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="US915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="us915_6" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=911900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=912100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=912300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=912500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=912700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=912900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=913100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=913300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=912600000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=3 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[48, 49, 50, 51, 52, 53, 54, 55, 70] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack" +filePath = "/chirpstack/region_us915_7.toml" +content = """ +# This file contains an example US915 example (channels 56-63 + 71). +[[regions]] + + # ID is an use-defined identifier for this region. + id="us915_7" + + # Description is a short description for this region. + description="US915 (channels 56-63 + 71)" + + # Common-name refers to the common-name of this region as defined by + # the LoRa Alliance. + common_name="US915" + + + # Gateway configuration. + [regions.gateway] + + # Force gateways as private. + # + # If enabled, gateways can only be used by devices under the same tenant. + force_gws_private=false + + + # Gateway backend configuration. + [regions.gateway.backend] + + # The enabled backend type. + enabled="mqtt" + + # MQTT configuration. + [regions.gateway.backend.mqtt] + + # Topic prefix. + # + # The topic prefix can be used to define the region of the gateway. + # Note, there is no need to add a trailing '/' to the prefix. The trailing + # '/' is automatically added to the prefix if it is configured. + topic_prefix="us915_7" + + # MQTT server (e.g. scheme://host:port where scheme is tcp, ssl or ws) + server="tcp://mosquitto:1883" + + # Connect with the given username (optional) + username="" + + # Connect with the given password (optional) + password="" + + # Quality of service level + # + # 0: at most once + # 1: at least once + # 2: exactly once + # + # Note: an increase of this value will decrease the performance. + # For more information: https://www.hivemq.com/blog/mqtt-essentials-part-6-mqtt-quality-of-service-levels + qos=0 + + # Clean session + # + # Set the "clean session" flag in the connect message when this client + # connects to an MQTT broker. By setting this flag you are indicating + # that no messages saved by the broker for this client should be delivered. + clean_session=false + + # Client ID + # + # Set the client id to be used by this client when connecting to the MQTT + # broker. A client id must be no longer than 23 characters. If left blank, + # a random id will be generated by ChirpStack. + client_id="" + + # Keep alive interval. + # + # This defines the maximum time that that should pass without communication + # between the client and server. + keep_alive_interval="30s" + + # CA certificate file (optional) + # + # Use this when setting up a secure connection (when server uses ssl://...) + # but the certificate used by the server is not trusted by any CA certificate + # on the server (e.g. when self generated). + ca_cert="" + + # TLS certificate file (optional) + tls_cert="" + + # TLS key file (optional) + tls_key="" + + + # Gateway channel configuration. + # + # Note: this configuration is only used in case the gateway is using the + # ChirpStack Concentratord daemon. In any other case, this configuration + # is ignored. + [[regions.gateway.channels]] + frequency=913500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=913700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=913900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=914100000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=914300000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=914500000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=914700000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=914900000 + bandwidth=125000 + modulation="LORA" + spreading_factors=[7, 8, 9, 10] + + [[regions.gateway.channels]] + frequency=914200000 + bandwidth=500000 + modulation="LORA" + spreading_factors=[8] + + + # Region specific network configuration. + [regions.network] + + # Installation margin (dB) used by the ADR engine. + # + # A higher number means that the network-server will keep more margin, + # resulting in a lower data-rate but decreasing the chance that the + # device gets disconnected because it is unable to reach one of the + # surrounded gateways. + installation_margin=10 + + # RX window (Class-A). + # + # Set this to: + # 0: RX1 / RX2 + # 1: RX1 only + # 2: RX2 only + rx_window=0 + + # RX1 delay (1 - 15 seconds). + rx1_delay=1 + + # RX1 data-rate offset + rx1_dr_offset=0 + + # RX2 data-rate + rx2_dr=8 + + # RX2 frequency (Hz) + rx2_frequency=923300000 + + # Prefer RX2 on RX1 data-rate less than. + # + # Prefer RX2 over RX1 based on the RX1 data-rate. When the RX1 data-rate + # is smaller than the configured value, then the Network Server will + # first try to schedule the downlink for RX2, failing that (e.g. the gateway + # has already a payload scheduled at the RX2 timing) it will try RX1. + rx2_prefer_on_rx1_dr_lt=0 + + # Prefer RX2 on link budget. + # + # When the link-budget is better for RX2 than for RX1, the Network Server will first + # try to schedule the downlink in RX2, failing that it will try RX1. + rx2_prefer_on_link_budget=false + + # Downlink TX Power (dBm) + # + # When set to -1, the downlink TX Power from the configured band will + # be used. + # + # Please consult the LoRaWAN Regional Parameters and local regulations + # for valid and legal options. Note that the configured TX Power must be + # supported by your gateway(s). + downlink_tx_power=-1 + + # ADR is disabled. + adr_disabled=false + + # Minimum data-rate. + min_dr=0 + + # Maximum data-rate. + max_dr=3 + + # Enabled uplink channels. + # + # Use this when ony a sub-set of the by default enabled channels are being + # used. For example when only using the first 8 channels of the US band. + # Note: when left blank / empty array, all channels will be enabled. + enabled_uplink_channels=[56, 57, 58, 59, 60, 61, 62, 63, 71] + + + # Rejoin-request configuration (LoRaWAN 1.1) + [regions.network.rejoin_request] + + # Request devices to periodically send rejoin-requests. + enabled=false + + # The device must send a rejoin-request type 0 at least every 2^(max_count_n + 4) + # uplink messages. Valid values are 0 to 15. + max_count_n=0 + + # The device must send a rejoin-request type 0 at least every 2^(max_time_n + 10) + # seconds. Valid values are 0 to 15. + # + # 0 = roughly 17 minutes + # 15 = about 1 year + max_time_n=0 + + + # Class-B configuration. + [regions.network.class_b] + + # Ping-slot data-rate. + ping_slot_dr=8 + + # Ping-slot frequency (Hz) + # + # set this to 0 to use the default frequency plan for the configured region + # (which could be frequency hopping). + ping_slot_frequency=0 +""" + +[[config.mounts]] +serviceName = "chirpstack-gateway-bridge" +filePath = "/chirpstack-gateway-bridge/chirpstack-gateway-bridge.toml" +content = """ +# See https://www.chirpstack.io/gateway-bridge/install/config/ for a full +# configuration example and documentation. + +[integration.mqtt.auth.generic] +servers=["tcp://mosquitto:1883"] +username="" +password="" +""" + +[[config.mounts]] +serviceName = "chirpstack-gateway-bridge-basicstation" +filePath = "/chirpstack-gateway-bridge/chirpstack-gateway-bridge-basicstation-eu868.toml" +content = """ +# See https://www.chirpstack.io/gateway-bridge/install/config/ for a full +# configuration example and documentation. + +[integration.mqtt.auth.generic] +servers=["tcp://mosquitto:1883"] +username="" +password="" + +[integration.mqtt] +event_topic_template="eu868/gateway/{{ .GatewayID }}/event/{{ .EventType }}" +state_topic_template="eu868/gateway/{{ .GatewayID }}/state/{{ .StateType }}" +command_topic_template="eu868/gateway/{{ .GatewayID }}/command/#" + +[backend] +type="basic_station" + + [backend.basic_station] + bind=":3001" + tls_cert="" + tls_key="" + ca_cert="" + + region="EU868" + frequency_min=863000000 + frequency_max=870000000 + + + [[backend.basic_station.concentrators]] + + [backend.basic_station.concentrators.multi_sf] + frequencies=[ + 868100000, + 868300000, + 868500000, + 867100000, + 867300000, + 867500000, + 867700000, + 867900000, + ] + + [backend.basic_station.concentrators.lora_std] + frequency=868300000 + bandwidth=250000 + spreading_factor=7 + + [backend.basic_station.concentrators.fsk] + frequency=868800000 +""" + +[[config.mounts]] +serviceName = "mosquitto" +filePath = "/mosquitto/config/mosquitto.conf" +content = """ +listener 1883 +allow_anonymous true +""" + +[[config.mounts]] +serviceName = "postgres" +filePath = "/postgresql/initdb/001-chirpstack_extensions.sh" +content = """ +#!/bin/bash +set -e + +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname="$POSTGRES_DB" <<-EOSQL + create extension pg_trgm; + create extension hstore; +EOSQL +""" diff --git a/blueprints/conduit/docker-compose.yml b/blueprints/conduit/docker-compose.yml index f2f1fb34..8f774673 100644 --- a/blueprints/conduit/docker-compose.yml +++ b/blueprints/conduit/docker-compose.yml @@ -7,8 +7,6 @@ services: restart: unless-stopped volumes: - db:/var/lib/matrix-conduit/ - networks: - - dokploy-network environment: CONDUIT_SERVER_NAME: ${MATRIX_SUBDOMAIN} CONDUIT_DATABASE_PATH: /var/lib/matrix-conduit/ @@ -25,7 +23,3 @@ services: CONDUIT_CONFIG: '' # Ignore this volumes: db: - -networks: - dokploy-network: - external: true diff --git a/blueprints/discord-tickets/docker-compose.yml b/blueprints/discord-tickets/docker-compose.yml index f797a77b..62105b3a 100644 --- a/blueprints/discord-tickets/docker-compose.yml +++ b/blueprints/discord-tickets/docker-compose.yml @@ -45,10 +45,6 @@ services: PUBLISH_COMMANDS: "true" SUPER: ${SUPER_USERS} -networks: - dokploy-network: - external: true - volumes: tickets-mysql-data: tickets-app-data: \ No newline at end of file diff --git a/blueprints/docmost/docker-compose.yml b/blueprints/docmost/docker-compose.yml index b5995594..d7efba92 100644 --- a/blueprints/docmost/docker-compose.yml +++ b/blueprints/docmost/docker-compose.yml @@ -34,10 +34,6 @@ services: volumes: - redis_docmost_data:/data -networks: - dokploy-network: - external: true - volumes: docmost: db_docmost_data: diff --git a/blueprints/dokploy-prom-monitoring-extension/docker-compose.yml b/blueprints/dokploy-prom-monitoring-extension/docker-compose.yml new file mode 100644 index 00000000..1fd3e03d --- /dev/null +++ b/blueprints/dokploy-prom-monitoring-extension/docker-compose.yml @@ -0,0 +1,11 @@ +services: + dokploy-monitoring: + image: dokploy/monitoring:canary + restart: unless-stopped + env_file: + - .env + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - monitoring-data:/app/data +volumes: + monitoring-data: {} diff --git a/blueprints/dokploy-prom-monitoring-extension/logo.svg b/blueprints/dokploy-prom-monitoring-extension/logo.svg new file mode 100644 index 00000000..5c6a02e4 --- /dev/null +++ b/blueprints/dokploy-prom-monitoring-extension/logo.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + diff --git a/blueprints/dokploy-prom-monitoring-extension/template.toml b/blueprints/dokploy-prom-monitoring-extension/template.toml new file mode 100644 index 00000000..bd0c07b5 --- /dev/null +++ b/blueprints/dokploy-prom-monitoring-extension/template.toml @@ -0,0 +1,17 @@ +[variables] +main_domain = "${domain}" +monitoring_token = "${password:32}" +callback_url = "http://dokploy:3000/api/trpc/notification.receiveNotification" +server_type = "Dokploy" +refresh_rate = "30" +retention_days = "7" +cpu_threshold = "80" +memory_threshold = "85" + +[[config.domains]] +serviceName = "dokploy-monitoring" +port = 3001 +host = "${main_domain}" + +[config.env] +METRICS_CONFIG = "{\"server\":{\"refreshRate\":${refresh_rate},\"port\":3001,\"type\":\"${server_type}\",\"token\":\"${monitoring_token}\",\"urlCallback\":\"${callback_url}\",\"retentionDays\":${retention_days},\"cronJob\":\"0 0 * * *\",\"thresholds\":{\"cpu\":${cpu_threshold},\"memory\":${memory_threshold}},\"prometheus\":{\"enabled\":true}},\"containers\":{\"refreshRate\":${refresh_rate},\"services\":{\"include\":[],\"exclude\":[]}}}" diff --git a/blueprints/drawio/docker-compose.yml b/blueprints/drawio/docker-compose.yml index a7d7b578..cdd036d9 100644 --- a/blueprints/drawio/docker-compose.yml +++ b/blueprints/drawio/docker-compose.yml @@ -51,9 +51,5 @@ services: DRAWIO_GITLAB_SECRET: ${DRAWIO_GITLAB_SECRET} DRAWIO_GITLAB_URL: ${DRAWIO_GITLAB_URL} DRAWIO_CLOUD_CONVERT_APIKEY: ${DRAWIO_CLOUD_CONVERT_APIKEY} -networks: - dokploy-network: - external: true - volumes: fonts_volume: \ No newline at end of file diff --git a/blueprints/enshrouded/docker-compose.yml b/blueprints/enshrouded/docker-compose.yml index 9c92efb3..614dd36e 100644 --- a/blueprints/enshrouded/docker-compose.yml +++ b/blueprints/enshrouded/docker-compose.yml @@ -1,18 +1,25 @@ services: enshrouded: - image: sknnr/enshrouded-dedicated-server:latest + image: mornedhels/enshrouded-server:latest + container_name: enshrouded + hostname: enshrouded restart: unless-stopped + stop_grace_period: 90s ports: - "15637:15637/udp" - "27015:27015/udp" + volumes: + - enshrouded-persistent-data:/opt/enshrouded + # only add ntsync device if your kernel supports it (6.14 or newer) + # devices: + # - /dev/ntsync:/dev/ntsync environment: - SERVER_NAME=${SERVER_NAME} - SERVER_PASSWORD=${SERVER_PASSWORD} - - PORT=15637 - - SERVER_SLOTS=6 - - SERVER_IP=0.0.0.0 - volumes: - - enshrouded-persistent-data:/home/steam/enshrouded/savegame + - SERVER_SLOT_COUNT=6 + - UPDATE_CRON=0 3 * * * + - PUID=4711 + - PGID=4711 volumes: enshrouded-persistent-data: \ No newline at end of file diff --git a/blueprints/evolutionapi/docker-compose.yml b/blueprints/evolutionapi/docker-compose.yml index d4803de1..5807ff82 100644 --- a/blueprints/evolutionapi/docker-compose.yml +++ b/blueprints/evolutionapi/docker-compose.yml @@ -47,11 +47,6 @@ services: volumes: - evolution-redis-data:/data - -networks: - dokploy-network: - external: true - volumes: evolution-instances: evolution-postgres-data: diff --git a/blueprints/firecrawl/docker-compose.yml b/blueprints/firecrawl/docker-compose.yml index f4181cfc..d7622f7a 100644 --- a/blueprints/firecrawl/docker-compose.yml +++ b/blueprints/firecrawl/docker-compose.yml @@ -124,15 +124,6 @@ services: interval: 10s timeout: 5s retries: 10 - networks: - - backend - - dokploy-network - -networks: - backend: - driver: bridge - dokploy-network: - external: true volumes: nuq_pg_data: \ No newline at end of file diff --git a/blueprints/glpi/docker-compose.yml b/blueprints/glpi/docker-compose.yml index fa732fa3..3abe1f05 100644 --- a/blueprints/glpi/docker-compose.yml +++ b/blueprints/glpi/docker-compose.yml @@ -20,7 +20,3 @@ services: volumes: glpi-mysql-data: glpi-www-data: - -networks: - dokploy-network: - external: true \ No newline at end of file diff --git a/blueprints/hi-events/docker-compose.yml b/blueprints/hi-events/docker-compose.yml index cce45fec..3c2291b9 100644 --- a/blueprints/hi-events/docker-compose.yml +++ b/blueprints/hi-events/docker-compose.yml @@ -36,9 +36,5 @@ services: volumes: - pg_hi-events_data:/var/lib/postgresql/data -networks: - dokploy-network: - external: true - volumes: pg_hi-events_data: \ No newline at end of file diff --git a/blueprints/immich/docker-compose.yml b/blueprints/immich/docker-compose.yml index cdd31199..8f12d6d1 100644 --- a/blueprints/immich/docker-compose.yml +++ b/blueprints/immich/docker-compose.yml @@ -96,10 +96,6 @@ services: ] restart: always -networks: - dokploy-network: - external: true - volumes: immich-model-cache: immich-postgres: diff --git a/blueprints/infisical/docker-compose.yml b/blueprints/infisical/docker-compose.yml index 7566c898..ac5718bc 100644 --- a/blueprints/infisical/docker-compose.yml +++ b/blueprints/infisical/docker-compose.yml @@ -3,7 +3,7 @@ services: depends_on: db: condition: service_healthy - image: infisical/infisical:v0.90.1-postgres + image: infisical/infisical:v0.135.0-postgres environment: - NODE_ENV=production - ENCRYPTION_KEY @@ -20,7 +20,6 @@ services: command: npm run migration:latest pull_policy: always - backend: restart: unless-stopped depends_on: @@ -30,7 +29,7 @@ services: condition: service_started db-migration: condition: service_completed_successfully - image: infisical/infisical:v0.90.1-postgres + image: infisical/infisical:v0.135.0-postgres pull_policy: always environment: - NODE_ENV=production @@ -77,7 +76,5 @@ volumes: pg_infisical_data: redis_infisical_data: -networks: - dokploy-network: - external: true + diff --git a/blueprints/invoiceshelf/docker-compose.yml b/blueprints/invoiceshelf/docker-compose.yml index 0f1c3d2c..8d2c8265 100644 --- a/blueprints/invoiceshelf/docker-compose.yml +++ b/blueprints/invoiceshelf/docker-compose.yml @@ -47,10 +47,6 @@ services: invoiceshelf-postgres: condition: service_healthy -networks: - dokploy-network: - external: true - volumes: invoiceshelf-postgres-data: invoiceshelf-app-data: diff --git a/blueprints/kimai/docker-compose.yml b/blueprints/kimai/docker-compose.yml index d3eab1c3..c97cadfb 100644 --- a/blueprints/kimai/docker-compose.yml +++ b/blueprints/kimai/docker-compose.yml @@ -40,10 +40,6 @@ services: start_period: 30s -networks: - dokploy-network: - external: true - volumes: kimai-data: mysql-data: \ No newline at end of file diff --git a/blueprints/kokoro-tts/docker-compose.yml b/blueprints/kokoro-tts/docker-compose.yml new file mode 100644 index 00000000..a0298ce1 --- /dev/null +++ b/blueprints/kokoro-tts/docker-compose.yml @@ -0,0 +1,23 @@ +services: + kokoro-tts: + build: + context: https://github.com/remsky/Kokoro-FastAPI.git#master + dockerfile: docker/cpu/Dockerfile + restart: unless-stopped + ports: + - 8880 + environment: + - MODEL_PATH=/app/models + - DEVICE=${DEVICE:-cpu} + - HOST=0.0.0.0 + - PORT=8880 + volumes: + - kokoro-models:/app/models + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8880/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s +volumes: + kokoro-models: diff --git a/blueprints/kokoro-tts/kokoro-tts.svg b/blueprints/kokoro-tts/kokoro-tts.svg new file mode 100644 index 00000000..5ed64ed8 --- /dev/null +++ b/blueprints/kokoro-tts/kokoro-tts.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/blueprints/kokoro-tts/template.toml b/blueprints/kokoro-tts/template.toml new file mode 100644 index 00000000..73f367c4 --- /dev/null +++ b/blueprints/kokoro-tts/template.toml @@ -0,0 +1,72 @@ +[variables] +main_domain = "${domain}" +device = "cpu" + +[config] +env = [ + "DEVICE=${device}", + "MODEL_PATH=/app/models", + "HOST=0.0.0.0", + "PORT=8880", + "PYTHONUNBUFFERED=1", + "UV_SYSTEM_PYTHON=1" +] + +[[config.domains]] +serviceName = "kokoro-tts" +port = 8880 +host = "${main_domain}" +path = "/" + +[[config.mounts]] +filePath = "README.md" +content = """# Kokoro TTS FastAPI + +This template provides a Dockerized FastAPI wrapper for the Kokoro-82M text-to-speech model. + +## Features + +- Multi-language support (English, Japanese, Chinese) +- OpenAI-compatible speech endpoint +- CPU and GPU support +- Web interface for monitoring +- RESTful API with comprehensive documentation +- Streaming audio generation +- Word-level timestamps and phonemes + +## Usage + +- **Web Interface**: Access the web UI at `https://${main_domain}/web` +- **API Documentation**: Available at `https://${main_domain}/docs` +- **Health Check**: Monitor service health at `https://${main_domain}/health` + +## Configuration + +The service runs on port 8880 and supports both CPU and GPU inference. +For GPU support, ensure your Dokploy instance has NVIDIA GPU support enabled. + +## API Endpoints + +- `POST /v1/audio/speech` - Generate speech from text (OpenAI compatible) +- `POST /dev/captioned_speech` - Generate speech with timestamps +- `POST /dev/phonemize` - Convert text to phonemes +- `POST /dev/generate_from_phonemes` - Generate audio from phonemes +- `GET /health` - Health check endpoint +- `GET /docs` - Interactive API documentation +- `GET /web` - Web interface + +## Model Information + +- Model: Kokoro-82M +- License: Apache-2.0 +- Repository: https://github.com/remsky/Kokoro-FastAPI +- HuggingFace Model: https://huggingface.co/hexgrad/Kokoro-82M + +## Notes + +- This template builds the image from source during deployment +- Uses CPU-optimized Dockerfile by default +- Initial build may take several minutes due to model download +- Ensure sufficient disk space for model storage +- For GPU support, change dockerfile path to `docker/gpu/Dockerfile` in docker-compose.yml +""" diff --git a/blueprints/kutt/docker-compose.yml b/blueprints/kutt/docker-compose.yml index 5ee1b971..947f4d26 100644 --- a/blueprints/kutt/docker-compose.yml +++ b/blueprints/kutt/docker-compose.yml @@ -7,7 +7,7 @@ services: environment: DB_FILENAME: "/var/lib/kutt/data.sqlite" JWT_SECRET: ${JWT_SECRET} - DEFAULT_DOMAIN: ${DOMAIN} + DEFAULT_DOMAIN: ${DEFAULT_DOMAIN} TRUST_PROXY: ${TRUST_PROXY} DISALLOW_ANONYMOUS_LINKS: ${DISALLOW_ANONYMOUS_LINKS} CUSTOM_DOMAIN_USE_HTTPS: ${CUSTOM_DOMAIN_USE_HTTPS} diff --git a/blueprints/librechat/docker-compose.yml b/blueprints/librechat/docker-compose.yml new file mode 100644 index 00000000..a5a4c5a9 --- /dev/null +++ b/blueprints/librechat/docker-compose.yml @@ -0,0 +1,110 @@ +# LibreChat Docker Compose for Dokploy Template +# Setting up authentication: "npm run create-user", refer to https://www.librechat.ai/docs/configuration/authentication + +services: + librechat: + image: ghcr.io/danny-avila/librechat-dev:latest + restart: always + depends_on: + - mongodb + - rag_api + environment: + # Server Configuration + - HOST=0.0.0.0 + - PORT=${PORT:-3080} + # Domain Configuration + - DOMAIN_CLIENT=${DOMAIN_CLIENT} + - DOMAIN_SERVER=${DOMAIN_SERVER} + # Database and Search Configuration + - MONGO_URI=mongodb://mongodb:27017/LibreChat + - MEILI_HOST=http://meilisearch:7700 + - SEARCH=true + - NO_INDEX=true + - MEILI_NO_ANALYTICS=true + - MEILI_MASTER_KEY=${MEILI_MASTER_KEY} + # Security & Sessions + - JWT_SECRET=${JWT_SECRET} + - JWT_REFRESH_SECRET=${JWT_REFRESH_SECRET} + - CREDS_KEY=${CREDS_KEY} + - CREDS_IV=${CREDS_IV} + - RAG_PORT=${RAG_PORT:-8000} + - RAG_API_URL=http://rag_api:${RAG_PORT:-8000} + # API Keys and Secrets + - OPENAI_API_KEY=${OPENAI_API_KEY} + - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} + - OPENROUTER_KEY=${OPENROUTER_KEY} + - GOOGLE_KEY=${GOOGLE_KEY} + - ENDPOINTS=google,openAI,assistants,azureOpenAI,anthropic + # ... Additional Endpoints + # UI + - APP_TITLE=${APP_TITLE:-LibreChat} + - CUSTOM_FOOTER=${CUSTOM_FOOTER:-Made with ❀️ by LibreChat} + - ALLOW_EMAIL_LOGIN=${ALLOW_EMAIL_LOGIN:-true} + - ALLOW_SOCIAL_LOGIN=${ALLOW_SOCIAL_LOGIN:-false} + - ALLOW_REGISTRATION=${ALLOW_REGISTRATION:-false} + volumes: + - type: bind + source: ../files/librechat.yaml + target: /app/librechat.yaml + - librechat_data:/app/client/public/images + - librechat_data:/app/uploads + - librechat_data:/app/logs + + mongodb: + image: mongo + restart: always + volumes: + - mongo_data:/data/db + command: mongod --noauth + + meilisearch: + image: getmeili/meilisearch:v1.12.3 + restart: always + environment: + - MEILI_HOST=http://meilisearch:7700 + - MEILI_NO_ANALYTICS=true + - MEILI_MASTER_KEY=${MEILI_MASTER_KEY} + volumes: + - meili_data:/meili_data + + vectordb: + image: pgvector/pgvector:0.8.0-pg15-trixie + environment: + - POSTGRES_DB=${POSTGRES_DB:-mydatabase} + - POSTGRES_USER=${POSTGRES_USER:-myuser} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-mypassword} + restart: always + volumes: + - postgres_data:/var/lib/postgresql/data + + rag_api: + image: ghcr.io/danny-avila/librechat-rag-api-dev-lite:latest + environment: + - DB_HOST=vectordb + - VECTOR_DB_TYPE=pgvector + - POSTGRES_DB=${POSTGRES_DB:-mydatabase} + - POSTGRES_USER=${POSTGRES_USER:-myuser} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-mypassword} + - RAG_PORT=${RAG_PORT:-8000} + - OPENAI_API_KEY=${OPENAI_API_KEY} + - RAG_OPENAI_API_KEY=${RAG_OPENAI_API_KEY} + - GOOGLE_KEY=${GOOGLE_KEY} + - RAG_GOOGLE_API_KEY=${RAG_GOOGLE_API_KEY} + - JWT_SECRET=${JWT_SECRET} + - COLLECTION_NAME=${COLLECTION_NAME:-librechat_collection} + - CHUNK_SIZE=${CHUNK_SIZE:-1500} + - CHUNK_OVERLAP=${CHUNK_OVERLAP:-100} + - EMBEDDINGS_PROVIDER=${EMBEDDINGS_PROVIDER:-openai} + - EMBEDDINGS_MODEL=${EMBEDDINGS_MODEL:-text-embedding-3-small} + - DEBUG_RAG_API=false + - DEBUG_PGVECTOR_QUERIES=false + - CONSOLE_JSON=false + restart: always + depends_on: + - vectordb + +volumes: + mongo_data: + meili_data: + postgres_data: + librechat_data: \ No newline at end of file diff --git a/blueprints/librechat/librechat.png b/blueprints/librechat/librechat.png new file mode 100644 index 0000000000000000000000000000000000000000..061f9a6b1ca6b71f6980c5e997c5a8bc5d583d42 GIT binary patch literal 59599 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

m;s)r5YB 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 literal 0 HcmV?d00001 diff --git a/blueprints/librechat/template.toml b/blueprints/librechat/template.toml new file mode 100644 index 00000000..744a1745 --- /dev/null +++ b/blueprints/librechat/template.toml @@ -0,0 +1,93 @@ +[variables] +# Domain Configuration +main_domain = "${domain}" + +# Security & Authentication +jwt_secret = "${password:64}" +jwt_refresh_secret = "${password:64}" +creds_key = "f34be427ebb29de8d88c107a71546019685ed8b241d8f2ed00c3df97ad2566f0" +creds_iv = "e2341419ec3dd3d19b13a1a87fafcbfb" +meili_master_key = "${password:32}" + +# Database Configuration +mongo_password = "${password:16}" +postgresql_password = "${password:16}" + +[config] +version = "1.0.0" +# Main service domain mapping +[[config.domains]] +serviceName = "librechat" +port = 3080 +host = "${main_domain}" + +[config.env] +# Basic Configuration +HOST="0.0.0.0" +PORT="3080" +DOMAIN_CLIENT="https://${main_domain}" +DOMAIN_SERVER="https://${main_domain}" + +# Search Configuration +MEILI_MASTER_KEY="${meili_master_key}" + +# Security +JWT_SECRET="${jwt_secret}" +JWT_REFRESH_SECRET="${jwt_refresh_secret}" +CREDS_KEY="${creds_key}" +CREDS_IV="${creds_iv}" + +# API Keys +OPENAI_API_KEY="" +ANTHROPIC_API_KEY="" +GOOGLE_KEY="" +OPENROUTER_KEY="" + +# Database +POSTGRES_DB="librechat_db" +POSTGRES_USER="librechat_user" +POSTGRES_PASSWORD="${postgresql_password}" + +# Security & Sessions + +# User Interface +APP_TITLE="LibreChat" +CUSTOM_FOOTER="Made with ❀️ by LibreChat" +ALLOW_EMAIL_LOGIN="true" +ALLOW_REGISTRATION="false" +ALLOW_SOCIAL_LOGIN="false" + +# RAG +RAG_OPENAI_API_KEY="" +RAG_GOOGLE_API_KEY="" +EMBEDDINGS_PROVIDER="openai" +EMBEDDINGS_MODEL="text-embedding-3-small" + +CHUNK_SIZE=1500 +CHUNK_OVERLAP=100 + + + +[[config.mounts]] +filePath = "librechat.yaml" +content = """ +### librechat.yaml configs ### + +version: 1.2.8 +cache: true +endpoints: + custom: + - name: "OpenRouter" + apiKey: "${OPENROUTER_KEY}" + baseURL: "https://openrouter.ai/api/v1" + models: + default: ["meta-llama/llama-3.3-70b-instruct:free"] + fetch: true + titleConvo: true + titleModel: "current_model" + summarize: false + summaryModel: "current_model" + forcePrompt: false + dropParams: ["stop"] + modelDisplayLabel: "OpenRouter" +""" \ No newline at end of file diff --git a/blueprints/libredesk/docker-compose.yml b/blueprints/libredesk/docker-compose.yml index ef647ab7..212b528f 100644 --- a/blueprints/libredesk/docker-compose.yml +++ b/blueprints/libredesk/docker-compose.yml @@ -46,9 +46,6 @@ services: volumes: - redis-data:/data -networks: - libredesk: - volumes: postgres-data: redis-data: \ No newline at end of file diff --git a/blueprints/logto/docker-compose.yml b/blueprints/logto/docker-compose.yml index b59bdac0..04d7464f 100644 --- a/blueprints/logto/docker-compose.yml +++ b/blueprints/logto/docker-compose.yml @@ -31,9 +31,6 @@ services: timeout: 5s retries: 5 -networks: - dokploy-network: - external: true volumes: logto-connectors: diff --git a/blueprints/mcsmanager/docker-compose.yml b/blueprints/mcsmanager/docker-compose.yml new file mode 100644 index 00000000..7994a382 --- /dev/null +++ b/blueprints/mcsmanager/docker-compose.yml @@ -0,0 +1,29 @@ +services: + web: + image: githubyumao/mcsmanager-web:latest + restart: unless-stopped + ports: + - 23333 + volumes: + - /etc/localtime:/etc/localtime:ro + - mcsmanager-web-data:/opt/mcsmanager/web/data + - mcsmanager-web-logs:/opt/mcsmanager/web/logs + daemon: + image: githubyumao/mcsmanager-daemon:latest + restart: unless-stopped + ports: + - 24444 + environment: + - MCSM_DOCKER_WORKSPACE_PATH=/opt/mcsmanager/daemon/data/InstanceData + volumes: + - /etc/localtime:/etc/localtime:ro + - mcsmanager-daemon-data:/opt/mcsmanager/daemon/data + - mcsmanager-daemon-logs:/opt/mcsmanager/daemon/logs + - /var/run/docker.sock:/var/run/docker.sock + +volumes: + mcsmanager-web-data: + mcsmanager-web-logs: + mcsmanager-daemon-data: + mcsmanager-daemon-logs: + diff --git a/blueprints/mcsmanager/mcsmanager.png b/blueprints/mcsmanager/mcsmanager.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f288576ccfda5370efe88e61488808f9087442 GIT binary patch literal 1132 zcmV-y1e5!TP)u(!H5Z~7|xfUmu>$KEFNF+{MD+M6WSPD z7pZ=x_W6<6j(vB#gY5I;az0<3NX;Fi$l2SS*_)Z)?#$e470Z_emI5q9pHJwRJaM2S3+_47$C?#A#vssrXFLfTN5Tg46 z0O^7xxX^W7k|fS~yPP1HF-g@_1ZbEaV{9n&{P{Cuasb)dS~Pq;{LRM3%o9o|y_e1pdT1hFjTCJt`mIx+0+dqfH^MD|o z$^?U#6{WNqUBMVX{^K#%#rozgAw(vfefCe{?$%w-dF;_6FOjAql>2S5H)uh&=B)-+XnaDQ7-O4mYHeLmk8UwsY$C8f+5 zOD2+U_{}gyev>kQ!moGrV&DBLRWs-`L$3e>Y5e^22@quzQ2=Br=#o9 zd^R7v5~P&&)i4$L0xIQ7DwURH8Dq?a&^ZSH&UxxZs$44Hh+MxgG4b@Tr$>iJ*-TEp zC=*IlRYVpe2%%)6?ej{d8n_(D=kkDHZvGvF(4*fU2`+@-Gc&>Yh57h?TnND=W?)Jg z6GBuf)xH|^tx(7qy}Pt5%agmY*hTpg!sxhh99g^>S&W1i7SgHANB6d-rlzXZYN1f{ z`=|d+CN)jR2yxDpqS9y_m&;|p-=9n*j~fjxM7>sTwbWcT-)uII4r?19Y=mY*wOak) z;NWKD#_Zd(x~>yK3NH&jpRd(w?d`_8=R3N(YK$V0MM_BiAou3gYr4)UC6u=P2LP(t znw*poLb|R42tr7yr1<>-3-Oi0IWopV7c0nxUa5Nsd<(AFM6NYVv_kk&co z0>E(9e*8&Kp_LW8tL++{GP!mG#)$BVJMqCbcsUCWCh#d!hy7PBnEsF0&slIV0iG*A zNT*9+>J-4JG;mJDpr1v&p_AtzbH5(4+%)&UTrIC30oibsWsM-XXNkGqI$3_1i){>@ z5M`1;COK0XHv+O(cEZ59$I=;CHvyZ?Pdvf^GIu|p&BRXCj5-JM+_m>$2hC$1dR>9> yZ2j8T7#Ppiuk}Rgu#o$y!$O|((0>5{0RR73$Zxb + + Media + CMS + + diff --git a/blueprints/mediacms/template.toml b/blueprints/mediacms/template.toml new file mode 100644 index 00000000..d696018c --- /dev/null +++ b/blueprints/mediacms/template.toml @@ -0,0 +1,17 @@ +[variables] +main_domain = "${domain}" +postgres_password = "${password}" +admin_password = "${password}" + +[config] +mounts = [] + +[[config.domains]] +serviceName = "web" +port = 80 +host = "${main_domain}" + +[config.env] +POSTGRES_PASSWORD = "${postgres_password}" +ADMIN_PASSWORD = "${admin_password}" + diff --git a/blueprints/minio/docker-compose.yml b/blueprints/minio/docker-compose.yml index 0e14a430..a25e3aee 100644 --- a/blueprints/minio/docker-compose.yml +++ b/blueprints/minio/docker-compose.yml @@ -1,10 +1,10 @@ -version: "3.8" services: minio: # after RELEASE.2025-04-22T22-12-26Z, minio removed most of the admin UI, if you want to use the admin UI, uncomment the line below # image: minio/minio:RELEASE.2025-04-22T22-12-26Z # if you uncommented the line above, comment the line below image: minio/minio + restart: unless-stopped volumes: # by default, the MinIO container will use a volume named minio-data # to store its data. This volume is created automatically by Docker. diff --git a/blueprints/mulesoft-esb/docker-compose.yml b/blueprints/mulesoft-esb/docker-compose.yml new file mode 100644 index 00000000..6691e455 --- /dev/null +++ b/blueprints/mulesoft-esb/docker-compose.yml @@ -0,0 +1,22 @@ +version: "3.8" + +services: + mule: + image: yogeshmulecraft/mulece-esb:latest + restart: unless-stopped + ports: + - "8081" + environment: + - MULE_VERSION=${MULE_VERSION:-4.9.0} + - HTTP_PORT=${HTTP_PORT:-8081} + - MULE_HOME=/opt/mule-standalone + - MULE_BASE=/opt/mule-standalone + - TZ=UTC + - MULE_VERBOSE_EXCEPTIONS=true + healthcheck: + test: ["CMD-SHELL", "curl -f http://localhost:${HTTP_PORT:-8081}/ || exit 0"] + interval: 60s + timeout: 20s + retries: 5 + start_period: 120s + diff --git a/blueprints/mulesoft-esb/mulesoft_logo.png b/blueprints/mulesoft-esb/mulesoft_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7741d7f0dfad7cd65da29048632945ec71e6fc92 GIT binary patch literal 44699 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�#sSHWfi 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 literal 0 HcmV?d00001 diff --git a/blueprints/mulesoft-esb/template.toml b/blueprints/mulesoft-esb/template.toml new file mode 100644 index 00000000..6cfb9017 --- /dev/null +++ b/blueprints/mulesoft-esb/template.toml @@ -0,0 +1,23 @@ + +# MuleSoft ESB Deployment Configuration + +[variables] +main_domain = "${domain}" +timezone = "UTC" +mule_version = "4.9.0" +http_port = "8081" + +[config] +[[config.domains]] +serviceName = "mule" +port = 8081 +host = "${main_domain}" +path = "/" + +[config.env] +MULE_VERSION = "${mule_version}" +HTTP_PORT = "${http_port}" +MULE_HOME = "/opt/mule-standalone" +MULE_BASE = "/opt/mule-standalone" +TZ = "${timezone}" +MULE_VERBOSE_EXCEPTIONS = "true" diff --git a/blueprints/mumble/docker-compose.yml b/blueprints/mumble/docker-compose.yml new file mode 100644 index 00000000..92580f1a --- /dev/null +++ b/blueprints/mumble/docker-compose.yml @@ -0,0 +1,16 @@ +services: + mumble-server: + image: mumblevoip/mumble-server:latest + restart: unless-stopped + ports: + - 64738 + - 64738/udp + volumes: + - mumble-data:/data + environment: + - MUMBLE_SUPERUSER_PASSWORD=${SUPERUSER_PASSWORD} + - MUMBLE_CONFIG_WELCOMETEXT=${WELCOME_TEXT} + - MUMBLE_CONFIG_USERS=${MAX_USERS} + +volumes: + mumble-data: diff --git a/blueprints/mumble/mumble.png b/blueprints/mumble/mumble.png new file mode 100644 index 0000000000000000000000000000000000000000..dcd1084fcb496977578b68b792ab9638063399aa GIT binary patch literal 2388 zcmV-a39I&rP)x=sHmt>QBm;l@MUFX7byXm6es#)6=-PxOaDVl9G~dZ*RrL#eRN%CnqPGnwm#PM~aGyPft%478W8RA~`uZ z85tQiHa0*&K*q+#yu7>*4-X?9;F$mb2$4xdK~#90?Vam-qA(DK1@TaeiXvF?P-|<~ z-v13QB6Q2-#6UPoWv8Iv=`jDcrc~RYeLG?P?m8#08B$T{{l>##?T)nD`r-4va(RrpGr6elenB zx&lKS6yaq)4_*ahB*Q~--b?uYm=A!FG>Y(Ad=}1m;|Q~T2Ct5$<+Uz^&(+6sP6kE? zH*7^Zh1E4JgoE(PWMQ()Sjln+giCo+fq;-VZ(Q{P!xfYHNPMw1A)Cu*4=8*wbGnP9 zVC@M9%({rNH<1}F*XF7E2*)rVW0OVrx2;ca^bs9ZyN8PmS_wgYG4vvWnllEMwGzS+zLDW~ zSkLncuWKcQ)zrv3I2d&^vv0kGV6p3_4MU==o+q=`rm>w({6?Eu zT?JNFnAHWngrG;9Xv2^QZ1?p{IIX9q+{)4+(Bbz?2!@EiLCDN#9ARDZaj6xAFY?q> zgkX;72(`!&>LmoDU`MD$ju1yETJx^t2>X!U9^Xd7i6gAZMnYhsp?DALvrQ`rH}ceM zBm{Ou{~;mR;#btt`aYJGgo>7?PROolQzYEiucIvY-k9qY3Bh&6>R8>r^n zzspmr*J(RyDYW{PZ>H3ZN?2P2iiFVEM{3Fr7Mj?XmLegvmy#9=81Auqyc7xH{-SL2 z9c~Y@UnNNh{bwZBT4037cK9?283TS{ryqbXaz=P030d1y!LA=;JqtI?2Sf=u9tPau zH)Es9v$UW|$T1*3Fx%7V7xN{~BP2@5b*1sP>2O^dp@zxv!hR#>Y-?ow} z;o=QX$g87t2^DUIJPEuF!b22A|BPzP5^jQAuL7%9ETYIzX1(8SxBGczX=ao#D9lXX zM0UGlp69brA`|YaSw3#}XM=m)%M~ZFUs*%Ps9Xo3F;``5vfNy^$KgfM$8 z{+#o2<@YT9=IWyvpv1WOo3OBPdD{j3o9<0#_nzAG{BV;0%>R{oL2#X4fVMKj-(iu7 z=LgCCm;2Xe{n`l+Ck5U;vvCu`{5i_&>f|PWDBpzB$1iutT`0Y!i^5%rhak)~&En(c z7ze>Th#v~(X__U;T3zKB!UA&HQ(cY!@u3L2h)0;uqzTeNS=1Nt^_sr^yj& z%S)REVcs!n==)N0`2@@tm$nG0sl!?-%L+JVY z4(SW)C?!I#ORu<>Buj{paS&{*wK!EugkF1}y~q~Aua>DNl0-=ndTo8YPxcV9wp573 zZ6Iv?J)|K?hzM8rY$qY&ppXBb@ZC;AL@l-SJw&uL%2gVg zgoyso(jFf%rm=L?#&z%GYhx!N6Ao7_fwdlWLd52br88i}9KT6&*hH6A7H51iw=I8!8S?PO_*XBX1$vL?yeHzmRjF6&l!SYjuJb%~dT$q?ce z5m~VzKgbbwJO+93CPLFj+z38lnsZ72}x zJH?u3=0<=}XQU{SQIz~IouRPU+3>Fu`d7Vy_cqj`nfVjlkp(kS5$Sq4M}B-J6IIan zul=0Q9ngpj>G$#g9}4%aqI-7HH(@m!zlW^tGY;)^kB!jUQ5E5_Fk;Fxzw{nwcM%tX zb92Hc6NFX3^0J>LUhe;q#eaq~^-qzuw;riQlGBK|C2siMKSYu{}B zp*#=dnSZhX6)j$T#ydR!WTa*sml5@i1Y>WnjO8mKRY6y7e7>^{6||5d){UR0 zbB;F|4d?GQDbk zc#7$dR*+g`FT3Xg?-I@C|JCDja&mHVa&mHVa&mHVBCo&N2A0>Q<{9z;0000 + + + + + + + + + + + + + + + + + diff --git a/blueprints/openinary/template.toml b/blueprints/openinary/template.toml new file mode 100644 index 00000000..ea317117 --- /dev/null +++ b/blueprints/openinary/template.toml @@ -0,0 +1,40 @@ +[variables] +main_domain = "${domain}" +image_tag = "latest" +better_auth_secret = "${password:64}" +better_auth_url = "http://${main_domain}" +allowed_origin = "http://${main_domain}" +next_public_api_base_url = "/api" + +[config] +[[config.domains]] +serviceName = "openinary" +port = 3000 +host = "${main_domain}" + +[config.env] +IMAGE_TAG = "${image_tag}" +BETTER_AUTH_SECRET = "${better_auth_secret}" +BETTER_AUTH_URL = "${better_auth_url}" +ALLOWED_ORIGIN = "${allowed_origin}" +NEXT_PUBLIC_API_BASE_URL = "${next_public_api_base_url}" + +[[config.mounts]] +serviceName = "openinary" +volumeName = "cache-data" +mountPath = "/app/apps/api/cache" + +[[config.mounts]] +serviceName = "openinary" +volumeName = "public-files" +mountPath = "/app/apps/api/public" + +[[config.mounts]] +serviceName = "openinary" +volumeName = "db-data" +mountPath = "/app/data" + +[[config.mounts]] +serviceName = "openinary" +volumeName = "db-data" +mountPath = "/app/web-standalone/data" \ No newline at end of file diff --git a/blueprints/parseable/docker-compose.yml b/blueprints/parseable/docker-compose.yml new file mode 100644 index 00000000..344ac624 --- /dev/null +++ b/blueprints/parseable/docker-compose.yml @@ -0,0 +1,23 @@ +version: "3.8" +services: + parseable: + image: parseable/parseable:v1.6.0 + command: parseable local-store + restart: unless-stopped + volumes: + - parseable-staging:/parseable/staging + - parseable-data:/parseable/data + environment: + - P_ADDR=0.0.0.0:8000 + - P_USERNAME=${PARSEABLE_USERNAME} + - P_PASSWORD=${PARSEABLE_PASSWORD} + - P_STAGING_DIR=/parseable/staging + - P_FS_DIR=/parseable/data + ports: + - 8000 + - 8001 + - 8002 +volumes: + parseable-staging: {} + parseable-data: {} + diff --git a/blueprints/parseable/logo.svg b/blueprints/parseable/logo.svg new file mode 100644 index 00000000..4660d802 --- /dev/null +++ b/blueprints/parseable/logo.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blueprints/parseable/template.toml b/blueprints/parseable/template.toml new file mode 100644 index 00000000..f82eb77e --- /dev/null +++ b/blueprints/parseable/template.toml @@ -0,0 +1,16 @@ +[variables] +main_domain = "${domain}" +parseable_username = "${username}" +parseable_password = "${password:32}" + +[config] + +[[config.domains]] +serviceName = "parseable" +port = 8000 +host = "${main_domain}" + +[config.env] +PARSEABLE_USERNAME = "${parseable_username}" +PARSEABLE_PASSWORD = "${parseable_password}" + diff --git a/blueprints/passbolt/docker-compose.yml b/blueprints/passbolt/docker-compose.yml new file mode 100644 index 00000000..f6b91aac --- /dev/null +++ b/blueprints/passbolt/docker-compose.yml @@ -0,0 +1,79 @@ +# ============================================================================= +# PASSBOLT TEMPLATE - SETUP INSTRUCTIONS +# ============================================================================= +# +# After successful deployment, you need to create an admin user: +# +# 1. Go to your Dokploy dashboard +# 2. Navigate to your Passbolt application +# 3. Wait for both containers to be healthy - check the "Monitoring" tab +# 4. Go to the "General" tab and click "Open Terminal" button +# 5. In the terminal, run this command to create admin user: +# su -s /bin/bash -c "/usr/share/php/passbolt/bin/cake passbolt register_user -u youremail@example.com -f FirstName -l LastName -r admin" www-data +# 6. Replace youremail@example.com, FirstName, LastName with your actual details +# 7. The command will output a registration link - copy and paste it in your browser to complete setup +# +# NOTE: If you change the domain after deployment, you will need to manually +# update the PASSBOLT_APP_FULL_BASE_URL environment variable in the "Environment" tab. +# ============================================================================= + +services: + passbolt: + image: passbolt/passbolt:latest-ce + environment: + APP_FULL_BASE_URL: ${PASSBOLT_APP_FULL_BASE_URL} + DATASOURCES_DEFAULT_HOST: ${PASSBOLT_DB_HOST} + DATASOURCES_DEFAULT_PORT: ${PASSBOLT_DB_PORT} + DATASOURCES_DEFAULT_USERNAME: ${PASSBOLT_DB_USER} + DATASOURCES_DEFAULT_PASSWORD: ${PASSBOLT_DB_PASSWORD} + DATASOURCES_DEFAULT_DATABASE: ${PASSBOLT_DB_NAME} + PASSBOLT_PLUGINS_JWT_AUTHENTICATION_ENABLED: ${PASSBOLT_PLUGINS_JWT_AUTHENTICATION_ENABLED} + + EMAIL_DEFAULT_FROM: ${PASSBOLT_EMAIL_FROM} + EMAIL_TRANSPORT_DEFAULT_HOST: ${PASSBOLT_EMAIL_HOST} + EMAIL_TRANSPORT_DEFAULT_PORT: ${PASSBOLT_EMAIL_PORT} + EMAIL_TRANSPORT_DEFAULT_USERNAME: ${PASSBOLT_EMAIL_USER} + EMAIL_TRANSPORT_DEFAULT_PASSWORD: ${PASSBOLT_EMAIL_PASS} + EMAIL_TRANSPORT_DEFAULT_TLS: ${PASSBOLT_EMAIL_TLS} + + volumes: + - gpg_volume:/etc/passbolt/gpg + - jwt_volume:/etc/passbolt/jwt + + command: + - /usr/bin/wait-for.sh + - "-t" + - "0" + - "${PASSBOLT_DB_HOST}:${PASSBOLT_DB_PORT}" + - "--" + - /docker-entrypoint.sh + + depends_on: + mariadb: + condition: service_healthy + + healthcheck: + test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] + interval: 5s + timeout: 20s + retries: 10 + + mariadb: + image: mariadb:11 + environment: + MARIADB_ROOT_PASSWORD: ${PASSBOLT_DB_ROOT_PASSWORD} + MARIADB_DATABASE: ${PASSBOLT_DB_NAME} + MARIADB_USER: ${PASSBOLT_DB_USER} + MARIADB_PASSWORD: ${PASSBOLT_DB_PASSWORD} + volumes: + - passbolt_mariadb_data:/var/lib/mysql + healthcheck: + test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "--silent"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + gpg_volume: {} + jwt_volume: {} + passbolt_mariadb_data: {} diff --git a/blueprints/passbolt/passbolt.svg b/blueprints/passbolt/passbolt.svg new file mode 100644 index 00000000..40a905ab --- /dev/null +++ b/blueprints/passbolt/passbolt.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/blueprints/passbolt/template.toml b/blueprints/passbolt/template.toml new file mode 100644 index 00000000..e14042e4 --- /dev/null +++ b/blueprints/passbolt/template.toml @@ -0,0 +1,41 @@ +[variables] +main_domain = "${domain}" +db_password = "${password:32}" +db_root_password = "${password:32}" +email_host = "smtp.example.com" +email_user = "noreply@example.com" +email_pass = "${password:16}" + +[config] +[[config.domains]] +serviceName = "passbolt" +port = 80 +host = "${main_domain}" + +[config.env] +PASSBOLT_APP_FULL_BASE_URL = "http://${main_domain}" +PASSBOLT_DB_HOST = "mariadb" +PASSBOLT_DB_PORT = "3306" +PASSBOLT_DB_NAME = "passbolt" +PASSBOLT_DB_USER = "passbolt" +PASSBOLT_DB_PASSWORD = "${db_password}" +PASSBOLT_DB_ROOT_PASSWORD = "${db_root_password}" +PASSBOLT_PLUGINS_JWT_AUTHENTICATION_ENABLED = "true" +PASSBOLT_EMAIL_FROM = "passbolt@${main_domain}" +PASSBOLT_EMAIL_HOST = "${email_host}" +PASSBOLT_EMAIL_PORT = "587" +PASSBOLT_EMAIL_USER = "${email_user}" +PASSBOLT_EMAIL_PASS = "${email_pass}" +PASSBOLT_EMAIL_TLS = "true" + +[[config.mounts]] +volume = "gpg_volume" +target = "/etc/passbolt/gpg" + +[[config.mounts]] +volume = "jwt_volume" +target = "/etc/passbolt/jwt" + +[[config.mounts]] +volume = "passbolt_mariadb_data" +target = "/var/lib/mysql" \ No newline at end of file diff --git a/blueprints/peerdb/docker-compose.yml b/blueprints/peerdb/docker-compose.yml new file mode 100644 index 00000000..5d2c69f7 --- /dev/null +++ b/blueprints/peerdb/docker-compose.yml @@ -0,0 +1,187 @@ +name: peerdb-quickstart + +x-minio-config: &minio-config + PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER} + PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD} + MINIO_ROOT_USER: ${MINIO_ROOT_USER} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} + PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_REGION: ${PEERDB_CLICKHOUSE_AWS_REGION} + PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_ENDPOINT_URL_S3: ${PEERDB_CLICKHOUSE_AWS_ENDPOINT_URL_S3} + PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME: ${PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME} + +x-catalog-config: &catalog-config + PEERDB_CATALOG_HOST: ${PEERDB_CATALOG_HOST} + PEERDB_CATALOG_PORT: ${PEERDB_CATALOG_PORT} + PEERDB_CATALOG_USER: ${PEERDB_CATALOG_USER} + PEERDB_CATALOG_PASSWORD: ${PEERDB_CATALOG_PASSWORD} + PEERDB_CATALOG_DATABASE: ${PEERDB_CATALOG_DATABASE} + +x-flow-worker-env: &flow-worker-env + TEMPORAL_HOST_PORT: temporal:7233 + TEMPORAL_CLIENT_CERT: + TEMPORAL_CLIENT_KEY: + PEERDB_TEMPORAL_NAMESPACE: default + AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-} + AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-} + AWS_REGION: ${AWS_REGION:-} + AWS_ENDPOINT: ${AWS_ENDPOINT:-} + +services: + catalog: + image: postgres:18-alpine@sha256:eca6fb2d91fda290eb8cfb8ba53dd0dcbf3508a08011e30adb039ea7c8e1e9f2 + command: -c config_file=/etc/postgresql.conf + restart: unless-stopped + expose: + - 5432 + environment: + PGUSER: ${PEERDB_CATALOG_USER} + POSTGRES_PASSWORD: ${PEERDB_CATALOG_PASSWORD} + POSTGRES_DB: ${PEERDB_CATALOG_DATABASE} + POSTGRES_INITDB_ARGS: --locale=C.UTF-8 + volumes: + - pgdata:/var/lib/postgresql/data + - ../files/postgresql.conf:/etc/postgresql.conf + - ../files/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d + healthcheck: + test: ["CMD", "pg_isready", "-d", "${PEERDB_CATALOG_DATABASE}", "-U", "${PEERDB_CATALOG_USER}"] + interval: 10s + timeout: 30s + retries: 5 + start_period: 60s + + temporal: + restart: unless-stopped + depends_on: + catalog: + condition: service_healthy + environment: + DB: postgres12 + DB_PORT: ${PEERDB_CATALOG_PORT} + POSTGRES_USER: ${PEERDB_CATALOG_USER} + POSTGRES_PWD: ${PEERDB_CATALOG_PASSWORD} + POSTGRES_SEEDS: catalog + DYNAMIC_CONFIG_FILE_PATH: config/dynamicconfig/production-sql.yaml + image: temporalio/auto-setup:1.29@sha256:5b3502a3b685f9eff1b925af90c57c9e3dbeccbef367cc28a2a9712c63379312 + expose: + - 7233 + volumes: + - ../files/temporal-dynamicconfig:/etc/temporal/config/dynamicconfig + + temporal-admin-tools: + restart: unless-stopped + depends_on: + - temporal + environment: + TEMPORAL_ADDRESS: temporal:7233 + TEMPORAL_CLI_ADDRESS: temporal:7233 + TEMPORAL_CLI_SHOW_STACKS: 1 + image: temporalio/admin-tools:1.25.2-tctl-1.18.1-cli-1.1.1@sha256:da0c7a7982b571857173ab8f058e7f139b3054800abb4dcb100445d29a563ee8 + stdin_open: true + tty: true + entrypoint: ["sh", "/etc/temporal/entrypoint.sh"] + healthcheck: + test: ["CMD", "tctl", "workflow", "list"] + interval: 10s + timeout: 30s + retries: 5 + volumes: + - ../files/scripts/mirror-name-search.sh:/etc/temporal/entrypoint.sh + + temporal-ui: + restart: unless-stopped + depends_on: + - temporal + environment: + TEMPORAL_ADDRESS: temporal:7233 + TEMPORAL_CORS_ORIGINS: http://localhost:3000 + TEMPORAL_CSRF_COOKIE_INSECURE: "true" + image: temporalio/ui:2.43.3@sha256:31f0d8c1ed0bfc49c9c20ea9613ee9dd5c52f5f989bacb8a30210f847028e9cd + expose: + - 8080 + + flow-api: + image: ghcr.io/peerdb-io/flow-api:stable-v0.35.5 + restart: unless-stopped + expose: + - 8112 + - 8113 + environment: + <<: [*catalog-config, *flow-worker-env, *minio-config] + PEERDB_ALLOWED_TARGETS: ${PEERDB_ALLOWED_TARGETS} + depends_on: + temporal-admin-tools: + condition: service_healthy + + flow-snapshot-worker: + image: ghcr.io/peerdb-io/flow-snapshot-worker:stable-v0.35.5 + restart: unless-stopped + environment: + <<: [*catalog-config, *flow-worker-env, *minio-config] + depends_on: + temporal-admin-tools: + condition: service_healthy + + flow-worker: + image: ghcr.io/peerdb-io/flow-worker:stable-v0.35.5 + restart: unless-stopped + environment: + <<: [*catalog-config, *flow-worker-env, *minio-config] + depends_on: + temporal-admin-tools: + condition: service_healthy + + peerdb: + stop_signal: SIGINT + image: ghcr.io/peerdb-io/peerdb-server:stable-v0.35.5 + restart: unless-stopped + environment: + <<: *catalog-config + PEERDB_PASSWORD: ${PEERDB_PASSWORD} + PEERDB_FLOW_SERVER_ADDRESS: ${PEERDB_FLOW_SERVER_ADDRESS} + RUST_LOG: info + RUST_BACKTRACE: 1 + expose: + - 9900 + depends_on: + catalog: + condition: service_healthy + + peerdb-ui: + image: ghcr.io/peerdb-io/peerdb-ui:stable-v0.35.5 + restart: unless-stopped + expose: + - 3000 + environment: + <<: *catalog-config + DATABASE_URL: ${DATABASE_URL} + PEERDB_FLOW_SERVER_HTTP: ${PEERDB_FLOW_SERVER_HTTP} + NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} + NEXTAUTH_URL: ${NEXTAUTH_URL} + PEERDB_ALLOWED_TARGETS: ${PEERDB_ALLOWED_TARGETS} + PEERDB_CLICKHOUSE_ALLOWED_DOMAINS: ${PEERDB_CLICKHOUSE_ALLOWED_DOMAINS} + PEERDB_EXPERIMENTAL_ENABLE_SCRIPTING: ${PEERDB_EXPERIMENTAL_ENABLE_SCRIPTING} + depends_on: + - flow-api + + minio: + image: minio/minio:latest@sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e + restart: unless-stopped + volumes: + - minio-data:/data + expose: + - 9000 + - 9001 + environment: + <<: *minio-config + entrypoint: > + /bin/sh -c " + minio server /data --console-address=:9001 & + sleep 2; + mc alias set myminiopeerdb http://minio:9000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD; + mc mb myminiopeerdb/$$PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME; + wait + " + +volumes: + pgdata: + minio-data: diff --git a/blueprints/peerdb/peerdb.jpeg b/blueprints/peerdb/peerdb.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..cd33a1fae48a92c41f952cff21d2b69a52dbd65f GIT binary patch literal 10300 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 N+KPAA@U_v*{{rsRpC$kR literal 0 HcmV?d00001 diff --git a/blueprints/peerdb/template.toml b/blueprints/peerdb/template.toml new file mode 100644 index 00000000..3325ac4b --- /dev/null +++ b/blueprints/peerdb/template.toml @@ -0,0 +1,93 @@ +[variables] +main_domain = "${domain}" +peerdb_password = "${password:32}" +postgres_password = "${password:32}" +minio_root_user = "_peerdb_minioadmin" +minio_root_password = "${password:32}" +nextauth_secret = "${password:32}" + +[[config.domains]] +serviceName = "peerdb-ui" +port = 3000 +host = "${main_domain}" + +[[config.domains]] +serviceName = "minio" +port = 9001 +host = "${main_domain}" + +[[config.domains]] +serviceName = "temporal-ui" +port = 8080 +host = "${main_domain}" + +[config.env] +PEERDB_PASSWORD = "${peerdb_password}" +PEERDB_CATALOG_HOST = "catalog" +PEERDB_CATALOG_PORT = "5432" +PEERDB_CATALOG_USER = "postgres" +PEERDB_CATALOG_PASSWORD = "${postgres_password}" +PEERDB_CATALOG_DATABASE = "postgres" +PEERDB_FLOW_SERVER_ADDRESS = "grpc://flow-api:8112" +NEXTAUTH_URL = "http://localhost:3000" +NEXTAUTH_SECRET = "${nextauth_secret}" +DATABASE_URL = "postgres://postgres:${postgres_password}@catalog:5432/postgres" +PEERDB_FLOW_SERVER_HTTP = "http://flow-api:8113" +PEERDB_EXPERIMENTAL_ENABLE_SCRIPTING = "true" +MINIO_ROOT_USER = "${minio_root_user}" +MINIO_ROOT_PASSWORD = "${minio_root_password}" +PEERDB_CLICKHOUSE_AWS_REGION = "us-east-1" +PEERDB_CLICKHOUSE_AWS_ENDPOINT_URL_S3 = "http://minio:9000" +PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME = "peerdbbucket" +PEERDB_ALLOWED_TARGETS = "" +PEERDB_CLICKHOUSE_ALLOWED_DOMAINS = "" +AWS_ACCESS_KEY_ID = "" +AWS_SECRET_ACCESS_KEY = "" +AWS_REGION = "" +AWS_ENDPOINT = "" + +[[config.mounts]] +filePath = "./postgresql.conf" +content = """ +listen_addresses = '*' + +wal_level = logical +max_wal_senders = 4 +max_replication_slots = 4 +""" + +[[config.mounts]] +filePath = "./docker-entrypoint-initdb.d/pg-hba-replication.sh" +content = """ +#!/bin/sh +echo "host replication $POSTGRES_USER 0.0.0.0/0 trust" >> "$PGDATA/pg_hba.conf" +""" + +[[config.mounts]] +filePath = "./temporal-dynamicconfig/production-sql.yaml" +content = """ +limit.maxIDLength: + - value: 255 + constraints: {} +system.forceSearchAttributesCacheRefreshOnRead: + - value: false + constraints: {} +frontend.enableUpdateWorkflowExecution: + - value: true +""" + +[[config.mounts]] +filePath = "./scripts/mirror-name-search.sh" +content = """ +#!/bin/sh + +sleep 5 + +# Check if MirrorName attribute exists +if ! temporal operator search-attribute list | grep -w MirrorName >/dev/null 2>&1; then + # If not, create MirrorName attribute + temporal operator search-attribute create --name MirrorName --type Text --namespace default +fi + +tini -s -- sleep infinity +""" diff --git a/blueprints/peppermint/docker-compose.yml b/blueprints/peppermint/docker-compose.yml index 06fb46c6..a5af058f 100644 --- a/blueprints/peppermint/docker-compose.yml +++ b/blueprints/peppermint/docker-compose.yml @@ -30,9 +30,5 @@ services: DB_HOST: "peppermint-postgres" SECRET: ${SECRET} -networks: - dokploy-network: - external: true - volumes: peppermint-postgres-data: \ No newline at end of file diff --git a/blueprints/postiz/docker-compose.yml b/blueprints/postiz/docker-compose.yml index cd06e795..dfbf3ae9 100644 --- a/blueprints/postiz/docker-compose.yml +++ b/blueprints/postiz/docker-compose.yml @@ -54,10 +54,6 @@ services: volumes: - postiz-redis-data:/data -networks: - dokploy-network: - external: true - volumes: postiz-postgres-data: postiz-redis-data: diff --git a/blueprints/quant-ux/docker-compose.yml b/blueprints/quant-ux/docker-compose.yml new file mode 100644 index 00000000..e96a9d6a --- /dev/null +++ b/blueprints/quant-ux/docker-compose.yml @@ -0,0 +1,69 @@ +version: '3' + +services: + mongo: + restart: always + image: mongo + volumes: + - mongo_data:/data/db + qux-fe: + restart: always + image: klausenschaefersinho/quant-ux + environment: + - QUX_PROXY_URL=http://quant-ux-backend:8080 + - QUX_AUTH=${QUX_AUTH} + - QUX_KEYCLOAK_REALM=${QUX_KEYCLOAK_REALM} + - QUX_KEYCLOAK_CLIENT=${QUX_KEYCLOAK_CLIENT} + - QUX_KEYCLOAK_URL=${QUX_KEYCLOAK_URL} + - QUX_WS_URL=${QUX_WS_URL} + links: + - mongo + - qux-be + ports: + - 8082 + depends_on: + - qux-be + + qux-be: + restart: always + image: klausenschaefersinho/quant-ux-backend + volumes: + - quant_ux_data:/app-data + environment: + - QUX_HTTP_HOST=${QUX_HTTP_HOST} + - QUX_HTTP_PORT=8080 + - QUX_MONGO_DB_NAME=${QUX_MONGO_DB_NAME} + - QUX_MONGO_TABLE_PREFIX=${QUX_MONGO_TABLE_PREFIX} + - QUX_MONGO_CONNECTION_STRING=mongodb://quant-ux-mongo:27017 + - QUX_MAIL_USER=${QUX_MAIL_USER} + - QUX_MAIL_PASSWORD=${QUX_MAIL_PASSWORD} + - QUX_MAIL_HOST=${QUX_MAIL_HOST} + - QUX_JWT_PASSWORD=${QUX_JWT_PASSWORD} + - QUX_IMAGE_FOLDER_USER=/app-data/qux-images + - QUX_IMAGE_FOLDER_APPS=/app-data/qux-image-apps + - TZ=${TZ} + - QUX_AUTH_SERVICE=${QUX_AUTH_SERVICE} + - QUX_KEYCLOAK_SERVER=${QUX_KEYCLOAK_SERVER} + - QUX_KEYCLOAK_REALM=${QUX_KEYCLOAK_REALM} + - QUX_USER_ALLOW_SIGNUP=${QUX_USER_ALLOW_SIGNUP} + - QUX_USER_ALLOWED_DOMAINS=${QUX_USER_ALLOWED_DOMAINS} + depends_on: + - mongo + + qux-ws: + restart: always + image: klausenschaefersinho/quant-ux-websocket + environment: + - QUX_SERVER=http://quant-ux-backend:8080/ + - QUX_SERVER_PORT=8086 + ports: + - 8086 + links: + - qux-be + depends_on: + - qux-be + +volumes: + mongo_data: + quant_ux_data: + diff --git a/blueprints/quant-ux/logo.svg b/blueprints/quant-ux/logo.svg new file mode 100644 index 00000000..1c71b3c8 --- /dev/null +++ b/blueprints/quant-ux/logo.svg @@ -0,0 +1,2 @@ + + diff --git a/blueprints/quant-ux/template.toml b/blueprints/quant-ux/template.toml new file mode 100644 index 00000000..912bc5c7 --- /dev/null +++ b/blueprints/quant-ux/template.toml @@ -0,0 +1,50 @@ +[variables] +main_domain = "${domain}" +ws_domain = "${domain}" +qux_auth = "qux" +qux_jwt_password = "${password:64}" +qux_mongo_db_name = "quantux" +qux_mongo_table_prefix = "quantux" +qux_mail_user = "${email}" +qux_mail_password = "${password:32}" +qux_mail_host = "mail.example.com" +qux_timezone = "America/Chicago" +qux_auth_service = "qux" +qux_user_allow_signup = "true" +qux_user_allowed_domains = "*" +qux_keycloak_realm = "" +qux_keycloak_client = "" +qux_keycloak_url = "" +qux_keycloak_server = "" + +[config] +env = [ + "QUX_HTTP_HOST=https://${main_domain}", + "QUX_AUTH=${qux_auth}", + "QUX_JWT_PASSWORD=${qux_jwt_password}", + "QUX_MONGO_DB_NAME=${qux_mongo_db_name}", + "QUX_MONGO_TABLE_PREFIX=${qux_mongo_table_prefix}", + "QUX_MAIL_USER=${qux_mail_user}", + "QUX_MAIL_PASSWORD=${qux_mail_password}", + "QUX_MAIL_HOST=${qux_mail_host}", + "TZ=${qux_timezone}", + "QUX_AUTH_SERVICE=${qux_auth_service}", + "QUX_KEYCLOAK_SERVER=${qux_keycloak_server}", + "QUX_KEYCLOAK_REALM=${qux_keycloak_realm}", + "QUX_KEYCLOAK_CLIENT=${qux_keycloak_client}", + "QUX_KEYCLOAK_URL=${qux_keycloak_url}", + "QUX_USER_ALLOW_SIGNUP=${qux_user_allow_signup}", + "QUX_USER_ALLOWED_DOMAINS=${qux_user_allowed_domains}", + "QUX_WS_URL=wss://${ws_domain}" +] + +[[config.domains]] +serviceName = "qux-fe" +port = 8082 +host = "${main_domain}" + +[[config.domains]] +serviceName = "qux-ws" +port = 8086 +host = "${ws_domain}" + diff --git a/blueprints/rote/docker-compose.yml b/blueprints/rote/docker-compose.yml new file mode 100644 index 00000000..a88354a0 --- /dev/null +++ b/blueprints/rote/docker-compose.yml @@ -0,0 +1,45 @@ +services: + rote-backend: + image: rabithua/rote-backend:${IMAGE_TAG:-latest} + pull_policy: always + environment: + POSTGRESQL_URL: postgresql://rote:${POSTGRES_PASSWORD}@rote-postgres:5432/rote + depends_on: + rote-postgres: + condition: service_healthy + restart: unless-stopped + command: + [ + "sh", + "-c", + "sleep 15 && bun run dist/scripts/runMigrations.js && bun run dist/server.js", + ] + + rote-frontend: + image: rabithua/rote-frontend:${IMAGE_TAG:-latest} + pull_policy: always + depends_on: + - rote-backend + environment: + # VITE_API_BASE must point to an address that reaches rote-backend (reverse-proxy domain or host IP:port) + VITE_API_BASE: ${VITE_API_BASE} + restart: unless-stopped + + rote-postgres: + image: postgres:17 + restart: unless-stopped + environment: + POSTGRES_USER: rote + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: rote + volumes: + - rote-postgres-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U rote -d rote"] + interval: 5s + timeout: 3s + retries: 10 + start_period: 30s + +volumes: + rote-postgres-data: {} diff --git a/blueprints/rote/rote.png b/blueprints/rote/rote.png new file mode 100644 index 0000000000000000000000000000000000000000..9aca501f2a568bec6e7cf488508a5efee7a52b00 GIT binary patch literal 55373 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�^*ULI<}9}EuuI?lIMaQyYPbEtmwBNPc*6}O({r%M zTlQ4Au(ZzyQ~PKdrL-kB|DAWL#QSdn2}5BhX-KOj)YW z32DEm?0%uWvGvjKm?x*Hf-;rIA#yIYPhuxmHv4}?S)%-BOMbt07J=q!v-|E|yDtPj zwh|Y{I+?Cc;!Fcvh3t8X^jN+_Essn=R9kAM(($JHldSzJ)UtOM*_mVc=(VNB?M^$w z6vZ*mpKL_Ryf3l)3tRhl0NeWA=K6mc<07(9n^RxR=4{%tL*DnzUZoO23eeD4zU^M%&t}1Xd!~pSN&V-4zraA@m() zo_5uNVdt8iwJ~ITU`r+F$ZmO=8^UPlwLG$_i6$pX_!9-Jo>f5yYR;=qic1A+g$BLj z_wtec!1$x8-q^4Op@iooyD&EO8k+Im%lZv628L2%DxKbAd#ZVvDZ!am$5zlB?s22x zUn~9OmzI45*Qg2DA?3}Oc>PUcLf!55SYSSh7X7yUcikFlKLS#S2kP`2b$+rabUPt3IYEW08EHF*HW!*f)qnH91Gq@9Z4A ztzkVm3vDPQgU~0Vsr2{$Jrpp#u3)=55(bVMIXvR{60f+uF0qVDS=C%_0OtQ(8B!*I z8qi9Md|>aS6kpN&A?NormzJKeXC$k?Y%ixBulc0vSWmT;k>E}zYw9lt;a<~;#^oN`(1nDTjl_p&j_*w$RTiaSq&&ZuSF^w|K-%&s zvfda-MKEm)iEZl%w>6i4zoLV1QdAO2pFPof1z;htLHn2oISl!`?>{XV#aaUXTR9Rj z%u5TLDs;@5_}LJ+J75l~<#{*CTX>UbMkRRUUci~?gM6JNCB35IWbt8AE5xbo0~7LX zf8_-uAq39N&Th4p5^3mnmj=^A!+%x5HGkg5m6&2`Y-SLjL%VY~<<4h0ulg0t6RIu= z7AX@R?Z}G}Q|InoU){@!g^SSSptX$*dECO)Vlw`uL=!NVe5)-fA}!7T3=rTZmMXH4 zM;Vfs4v|Cga%0igeG!i0vc_ve&Di3Fat!8j4n}QcKr;XIvWwmNrtJ_cjw63jvE)Qu zMA(P&e5+{(l(ZT(wPMN4xJug;ESI$?8{i8I;eU@~Gs1!s^&x+*Mq9Y=Q`piO z2q8aAm&+Kr^oC=Hm+yx#@E~XcnO1S{QVm-AR~?ZGj3eR0-c($mI;c1_4KE}d3=&*XP~2& z2URH@Nm(oZjbOb;a`%hIyBjN^zZe7&)a2gmg;2CM<+qsPC911HuQ;^ZKU8Fl>zI=Khax^-Gxj1)NKesGuQp>{`$Mw%Ka~Cz#G(;S{F^$uq}n~u$wcUBU3V}0l@+Gc zJNGSXTVwf-BN=3Z<1^(|;zV0lfy}N8oU$YGDQ9oF3jay<%kE^Bp}ec;!Qun_;qQix zg=^p3ar4^*uHaEh^gsQy866@@e!>xA#?P3Vof9e_q-J?9o{+sFS>vNITZ&A-dgW7; zt=4U%#Aaq`fHFJ+c1L?DiHw<92A4EdN{ChDJe+sOm%pgfV-?dzz?80zD zj+Ex$2*Ts7XIe4#X4@k%f6s-m&oh(nCF)~Tf>Qiqs5W*u$-;)@%5k#6%7x4a0LT6P zXSu!09c2e!yW4CpPd}P8s8N{@b*Y&)N4U~4RPDIfjGRB8w$iOZY3|m&ecGx^c4M0x z7Fi?sVPNTKcQCN`(&Dt^#M_XF>+ms=1@Hg)MJuNzv2Ky>VRfYWzT2%;zJ}=8rEbwA zfV=vGs8bE&eXr!g3k3F9G&j~qCl?)tA>~!+r{H(eg*C4hwI9Xc_4*X#AFGw0pAIP_ zSv|0^I3=-wFr7|p|6F5>3iHi2%{^@rNRz|G>fDl%IBKIe=$*me@a8V?QX5jLBle&1 zHwW0|8y(zicIVZoSOq<`uwHl>xAlxF%O%;}l{YUL_l|X6*#L}8DtE%vO&R%uun`OW z;%q`Wa{aK21^*j%+;uSE$yZk{H;z*NfBK3VT!&dS)eUJ%@oj2Ip(u!jn0XuoC=Lwm z<%r67ux1C-quUF<_XIrOhH1#lSQKFdQfX1E&j3V4<^XTrYL(QG%k{t~0l|+Ue&KPP zZ&Bso;mH1Uvebb|Xhc{Px`oMddN~;+S9@3(p%7p>K&1Ky`*Mah%5OglTz^txNGEu| zY>kZg70~SZrzZ39Z_3DfilaDtXEaT$-*DVQ3d4+sKcDa+Ef@668y_6D;w9ry{F%P$ zVVZRC4MnSmcv;uSWQAuf3Mx0_V`F2KUQ|yKUAY8FY6&)_m$EtCa9v;h9l0651nxt= zsFxqB_#qLgoWev$`X?{sL&Ozvq9Kj6P07cB6phr#=tyuL*bbOwlmb}IsPnn%X1$T& ze>t@tAl(Ard8?>j>R;Ahj>V)A2#xfeGlnK0Q6AAv4Z|1)_ z+Wsi-Ax$i6S9C?n?Wmc}}yvj^n@#QJpxwZ9ZH z&hXNf^FWi1RwzH6u*ZFJ{lv7y{qBX!dQ|f#6|)o0>;!99OJ1Vln|+Mm;ERT~c~`DO zL7GjXMQgcB%B@LCLti8lvJ3JE@MAWr_2X*U#kf0CdtZ=p;`pDhr=7(n@Tos->R&%r zlr=TNw_-l@0yCQu$)RGCHYzFw6x)sKIPE3rqq*B|{GzDsa}^&@5)Gw9f%7(ZHmaZK zhJapEYa;=KGqxt)v*40Sp487_E0x*;ldm>Y@R}W1<}DJNXJo#3#C+A>f&RHrwc9aQ5;jaMDTxBpO_v7s%`Hs4ss(6(WD5&f!B1-5qR4 zFJOS*vt-;`8~cVEU$Dz+J#h0*3E$(3d_LGeiD1pDbrfoq_%3d)8_r}Bmy zlgA@2l9fb=wEQEz+G+|&e5^#8sdrtv^|flZ!Oj694cw5{I8^MvNO zp27sI2;^*@WaIdP*6gXmoREgY$@c0P&%=R<&gF~#D)|WQu#@e9k(fPl#Zhl5sTWh< z!5=|W%-jNWd{K-uCic!9&D!hmE~Xde4aj^|-m>#G8G4GSplS%wgy%ND9s~EQ=`V)U zzi9bco=H|!50AHn0-}jlJF09>xIodI_UTc?Z!cmO691aq&8Bxb{Eb<_*PdO+zaNI& z3OPyYMR-`6fsLJzc}2Ylbux+zR(l0_BvS5MT7|8g>bzR*0oV#40m3H`&}$SNh}D+; zy$d#yX6!eI*^U__j*c&n=GUOo8jpIzTh|TA&UZdBbt20A^kvCop~6}ZfC{LU&Gvh1 z@u_)i%##DE%&(EkW$Bg~8mDl|IX%Jknw8(pYCbkq;d3h-t=_SM48tjj-?{{xy|_3I6e=-{&$WikK?@| zN*EnrIIj`4`Ly{^`i*!=z`=ws)gz-hS;(!k@k<%->HGj_njKULQzOb8jjvNaE+PB- zIn+NKgMZ3SLv0g}?RrOzV02%T|Fzl0T3~sqAKrg!I$bYIz)Gio2WcfhzwBDqcp*Ga z5sJ=n_xeMlIsxB6rd|#mb~)KloG;eu`$$+7%Y;^nZG91;Gh!(B&nh;NXRE@p?%UCO z`LKoSEyei-MAzJjUj^R>s6OL&8jTB<5#jIo@;q=p8XudMVluSWw(Cs32ctFx6}pTQ ziYh{#>*~D0wuL<7mhSoCLZ`X|j3oF5tiMG1?qoNN@&zL-KRiG9{E0mIvp3J9uxDlwc**IO$#PIvnW zgYW~5OC&5%%B7pq#*qj#=~oBlkA!yts)}eJnlEBJAsFz$ ztCP{SP6V;T@mDAbN+ycK#SxJV;6CB*cN~&mtWbQChS%kw!C0Co^{FnJjm+QSY+s)* z^PkK$juMW)xI;q2nUP9Pz5QhZ@NV0iDtj*w^MpJaK0<1^%qls%&9o$8dIg>+rlBS` zpHg}3-(NTAr=Jm=uANRJPsFHtVq>XU$spi@eJlIcDfBU#zpW+SRaTPD*&Y`nGw<-_ zE;Nt=X1K@)!_Spm%&83jBw_O+s@Y^eQSb@maziyO^{fg%>m;$tL0^Nzq&We}TvYKK zcxw%$1sEV@2M}lf%pLDERX3Vw2K+mvOa1I zqME=ojDnqc7?Kx+4x_?WOphds%g3qe{01_PrR8UpUpjc5h0vskUlGf7QIwFlQdc(s z#N422nUhh#DBfq&whGHnwDaD(P86b;0(mp*Iy16v-)X7~FKvAcl$>}i{1?FG5+nOo zEp{hXz83J3=5L0`?5&u`a`*+xZX+^@n({B|{o1eMc1K}e5N~b90cs>ZCX85^ zp0DcPbDr}qIML0Erj9H&tST04+WTBmYb7#+bW+i)W5Yv<)uwMwcx^TaZ3`XoJK55> zjD6OuzmdXy|L7!&R4ZYHJGkagEFWvNB)`S+JH)Y)EyA*9wvZc3BjBB>+cvRjG7-L# z5^-6$O^vA9kqh=zBYpS4Cr|e&rXN7J7Gd1-;krcba(mFJ!jw$r+kf6wXVAIxA2YR} zqwtjHhMHc=Zo;k=QJ48sm({QMv`nyF!!uWtB@YEPNlVn|_?!@}M{HEjzt0ASCc@1z z#Z|~f$Rxwxv-!>A-av`J{L;ZX=>DVUwQlamu`q6N)UW3qwt5Ik;jH*)4IJ4R7}&3e zi6DrD$FmQ%46Q;4qg|7_=;PZ{=IQt)YCPgZP*G+J408B&x6>Rzf&x&7ivUw{1%hIhA2zp zU1^np8BAdRrNuStm)of4UVI3>`R&|!PAb?d-H#SQiiZ=Bg{oM9E7?#iv;aab>%181 z?q}dHwwao;s05s?ttQ8`mT(m7G(rzsv0tp&QsFQDBi6SG_~zi^U&XFR)}U>qq3wE< zQiq^0Lry1G^SOaSMqA6!GC(%-K)?4KpE(;?u&{dI=OZ(z@Eqj%dLH{$ch%$owH9=O0yt3ksH&a9iELCrr` zR4oV7)h;oxJDP3|O58%$A3-^S1_ut%1q8b&vuxlRL&a+wg@CgE~?s zZB(M$qN)VsUMw2S4&s0EedbktoJqf=Gd?t&@wv_6cCzxN!C$Da;F@o~GZM=!36fTG z-Sr*+C%(6(hWVJ~!glc9E^>moTcwtd@t25l7w~j-C8N{>x3zf z6jIJrhhB|>gh~yi8ST~JK~%(XV-ez3jZdg<6A}d}G;6QD(&F+LbUWa?Z99NcIH}?$ zrY=bTPIsuSqYYL}o9G*=$ZK_|an?S$yJNdPt{~1z(s^cJS-ACHu3H@SfN^EB+_43q2F#Vhur~CA>dhWb28KC-RDXw{0$s zl=Mb*`Fm&^0S)P?Sk%UvWCr-J_-Vx@`ACFtRCmq)|8G$OcuP_;^Z_ms2 z+Dn4ZUfd9;)h0F(D>jiA-#Vw)BuBmkK(Z9=lv(axgmjQh-ogM1FGzq7A$lEUt~tbfGTMsuc@P@9&o3ANako!1*-u~v#*nbB7=s$y&h-PhlA4R}Uh_3()0@#2s_G8Z(FjCH(a#W~iWgo}t zInwMX(#W;+RyTyH96*kYO0}U@JBkDK#Z3NM$ZO58MY2bUU6-vcb994KGw_vbbZ7v8 zt&CI6rktf_v-J6)1em`!g_k2R-^x|Q|I&kVqn~?MMC$>w?*|#=`JxrP9?4s?Vu=&# zmLPL`%(BA9{dG0K7Wo=#XnGCTq;c}w4hJoZMoCN9sH=49?s69Fm5S260_Bsu()@T? z`0<1BN?Y|sbV&ot=hn#9GQJ3Zo+XBduG3Uryk9uvpBp&%xYJc#mhH ziMroXN-RgqKc&DuomYC$W^7Tni2G#2N_Zo~W4FuyyrEV1sFp`$1h$C1l!;`=M$$^lpg7 za+Dk&Pz$gp@-)@%=Z_MWd!Sgn$oI+;f%C8M=&mx6&tHp_A7Y2|FMtlC(7<0m1&%b$ zih*(BSWdK2T%y4^QSC%CA3r_e9LZl{db6=CW z-Fd#d*7|vryyZpovp&a#IyX8-up2{$?W!e9dcU(slnZy-zZie0XzNttwee9d`3&jb z0NC!@^*E118X$S{x4=DX0Nz0WG2xxTe8OmGQ_eSILnEsS|Goka)70zK&iu{|SMCp< z31U?4U>xKpf`5)7>3`S$j<;h~mEr_T`pPQuJ1l|A&bd6-J+mp2#4&DJz6C2SCvhjw z@trr~Iz{ew(PF~4?=T_rjm$uFR?=Ov?)OpMGFmX}}7>bK=9OKx>sLQ?-+^n7e>u0aF1@`hq+h=Q1+s+Hv8((gmk&aIL_RV9N3SK>a_HO3O#pRkG z%L-Eg88X;Av0Fk+A%h($_R;ECZLW;fn}*(`4J`?1;#JM$RC$}o-~gDNd~!`Ya?a9N zWLa5`XH@Ngnn{YcEh1X#;r{BR`GPJN(F|31wI?gxMl9OPx=SkHKmPuig3{fvd0L@A zCqTQEAxk=%Hb0;9L5ph`?DzmabjyR31H?t2$-(QMCO5rDH(A~U9h|>yl(KICBXbf4 zTTl=lcZiKum2Xc$a~o(czfgu)o{Ly)Q`_$E`nAV`Z8SI#Yywv41(AQogBnhQ$~3~}JTq{xzNkZ<}rKG0E2SLC~>JgysACY= zK^O+=zM6A}iVy;Ym}1e2_R$EkR!hdd#pY#!AArgLUCbN)ay+0s#m$UVtiYd87L{Vp3_}_mx zPs-%R3zdso6$gQDxp9|Am13I(8X?RLoqeC)>2WjnRcgg%boK)8&H%xH!W6ZXEAT9k zm70q7z-;JGSIMt+L;VIL|e8j9t!IYc#~a-c3^vE6y$2nJ|uNQ}J%K z-36Em{DXI`GZw7Z?cBC4I zy-s#U2dqzy(goe!u)kAA^B$yYgl&7*mS7wj)Bmj_iIK0i_tL!&rSF~n=e+k3%d?s5 z<)^K%C=elE@Ram`@1wZI#L?n$gKu0LvM;m9h*Opg0fwLtibfwd8=tUbk zt|P2xy7Aqu+!jr=SZTsDnME0dfW934Xd`{`i=hJ9g0+c~K*ftXVM$u%5u5D;RAz=O z;V9lPsZvg14&+FAWL_4UZyfX06imNT1FCo_gFAd~!tL{C&SPLOQ<=rk%VCBcX>G%} zqdh0U{R3NQGt!yacoNhB6WjiUI&0$^(wA?;AtF zy(IkngRm%)EqqId?LeS)xlwZQ$SbzB!B+c{+wrp&!%0p@Oov;D7xYrE_Ru5{}H@>mhe8?8!{dv)@kZIADOg5wDl6;_!XZ&~! zkS$1A7Iz)_{(U^={e6aq7@6ragskG(0k^+QVhC)i>0s0e8R!c+36=k-5YmwMS78-g=?pH-KP zwAOJHNFM0UKR0H+Tn~GCY3%Uy0M!3u*FV+fyn~cOShniD?%<(w!<<D!V3|&R9l35y_CSH1p`<_k+Jn3#sDuYQX z1~g~vNDr>XqZvk(h?0+#CRaWeb|B}S|~yHj4#NCQ<_-fILj;i5?v?_J@(`%u~a!jUZ?0IAOv zO})D-#7r*rygJ%-G$T14<0v#&rd_X<>rX^wIr7CeFy{I^Q3I&@VVP4~P=&t>?im9+ z$#0hX7#|W%{Vt)9AzQkN(Y^636vgGoVK(as!qR!;~Z>+2C=(9(fbz{~WOjywZ@3@2GotYMz z$^qhgi9c1P?7j_sNGN|8%W|IkAkyw3$WU3!onb_C1KVw4P@qx+@q|0h1@_os_Gngw zD!F`LGYAo_r%S<|qi*zhr%Sn#QWUB0eApGPKG`&!ILW{SEmB_11(Q7Dz0K|TsH~iD z%K2FWHpSQuj$=aY-y1^>sE267Mw9`vu_9uG$WRar1#v&$E{yGg5Da~_UIpr|*bh3& zae9|SIhZfC9ttI>7L*BrGL#K??>fcjV%}~Aj~X)E8ji{a8fBBwl>q)aK4WRY$`@-LM+g}qjj-%jU$s%U#+ z4lrIZ%F+M*-7&a3HZt5<%zx1QDK!fJK5*elyzBdED@FE zm9dz6tpgZo9Kb5Qt{I^8=aYXOt2~?92$t^;i3gFARz@8jMZfUG!aM!Bp*e33*}Ga# zgN`yMUGt9Qu}Xf^*!Hs!!slsws}bK%XE{K3XvZ(Zw2D)H3F;uEn0l8#QDMD)mYxO# z%gD8(DO_E4R0)2EH^jcrXd1%>l<-psoc5jqLcn6cO+=JH~T^fQTq-%eq7gNVdI~Y z{5mK&)NA;G=s%=iss=voTn)VZbRUAcIM^OHJi zuplE5o1(x0;T|8N>+ZmC%Y0kr`pD!+P;?zXfh$$8`2s&7Tl)=k;>c_j^*E!OwELj6 z-+PxUlVq)4XhQPJQz*b+dposIMOnF{!|ZzYTc4MLG|E7D9P((h`hyPHFR?nfG;xaD zHn=_#``5GoCFi@pPC%C4r1GC-4Cr_j{xIEiQeXH7%o9@0fN@4b5Dy%DZ!Ll@_*8v) zY|+RBej>{UbOz}Y>-GA;Cs!BG%OYGQV;&Gy@|RV9eerNwZ6x+#JC*S%4P+pKK(O$3 zeLP!KM=QX2GDBAjfMspplGxJqwbB?jxtKgKV(mmO7+ie_ ze0D7M-vrybHdQ-f>C9S>hO@p#_M@fr9^ciCVs!>5;~uhUT%a`7KH5Ahe_U z`v*q-62EQxii$&y<_@YiY9)ON1YE@y^WOkESGa{Dn||)!#yM~B-oa=RxsB~3jEws= z;6|Wnir$u^cg(eTMQg4*19sVCG4hdKBuESRZ2y_2WL4!`{_f;Os$=ncDTX+`QGMVi z)Gp+a?&}sM*viC%PL6@}IJg6DYTQ|Mf=mZ>EZG=3n4igHyxx}qQdy2rjE4=-=!_QH@UD;r%W_P}h9MHU+S zt4&$rB1M3pSYddXnm>n3!Ss3);Or6k=iBOg@%)*kjvT^j$Dl-ybax)51)dVuLB&jM zBXNzVW#Lwz?1Mx1Pw5Ee_h9&ofgOMLKS{?&!~KeCA}!F+@To8}E6LCK8l7!-qngZZ zzv-y^4n#>;K5`%QuXqOv$S_t9DE7Xd-wMECYuS-&2@yu5q*t?W!L9YHszA&)VuN+`&S;4i(eax&%LkoFpuNx zO7OEIGf88u7o2j1m`y3-ez6VPIG61K9*n5F?JIA&(chkMVM+eE)GRGF9&2adONf4o zl9SM}6OhjyuvcnrZzqUh>H~o?s?r~3Jc4@AF*y~6C>)SZfU5G#J0k9F`>*b^_#>bA z?+7o1M1B^lYICprJ(WfOR2rTEtCMpduyNjUf2m^rPr`(AfM;MEea6S$Rk`XR1`I7o-gY#a5dQ*6_wWGzC%_T=W;Lf z9v$%|YYjcg_#391&BK+HBZxYUfwN4~&x8IBwCShEvEyHOiSw{DTc)y&$l)`M5~;@oGQ= zV-uilZFej)Rl~T%&Rz&0ay*2TPiPek+(*cA$C{m}zni`D`RyC~%2diCgqU39zzy5C zhgC8s2z9&OZ;1Fz_KNxYD80(48ih*y#h6&|Ujf2>%+P?`uug%xekaIF3 z>MG(UzGbaEyFG%tCmWl(J8XNqE5ex+qtz>NN`?d}`WTpj;Px{oDRHwk5<~gT7r8m) zad0hK^LClb$dZsPu{trN*={PRss?+jI%_Z@*5 z1q7JHJ53YyJ7a^=>GDVBGV3tDr!wN4UXY_M2Ym_@95z6;GaC5`$wk7zSkC13sH|-M zO)ko3Ea`QE@F6xY(VdRd1Rm*7`el84uKw&y);xPSBeK2}ZdGEUTb}MFbEQGr3cmir zf%*H3jgoPLA$tq;dkjqj8ZXDtFp!6T;R@ROCYsL9>Wny!@6P%X6T@fS_JvrNz_j-@ ziM(X~OyL=4$jp*O$=UtT-U?q&_uxAEEwf@0kfB8XW%0-P)SiUpPU!>)MX;~)e&$u5 zRic>aL^auq5oklB^Nf3%4aZ14sip!tx|bCO!N2Uv`it?31?U49?*x)%s&vL{GO4Jh zV;L7lHwTN@gno8?TG=YjFnLh8;TD(vdCafV!V6K>{hUuxv6}yrgjJ+xC@U4$_o(*2 zqE2X=N~YgqZRiD6joB4)ml>$Fu@=|3jS=|=$&F~A!QFNC%^JB`oGYE;d$mL9UHGJX zKd3bu64;q7ISGaJ9Fb)_2ocKjo-c5kj=C>TRBkH-vbC``Er3>8Arh|Q&l3EB_}-ve z5l`*!zF*g9?V-E=|BQS$tnXK{YG2+bKEvH6}1so3eMTFj}cyYKLS(Z489B}Tewuknq9?upEyQir9LS;)BOQf>QPAxk<0H^Asgt_>35si)xNB~rToc^O`;Dtic(fQJ* zXd+BS3AW5;Zu_%Nc|J`49Y;>Tk5u4M^EpeH>9Xe+uN*Hv;fBi3A+;17BBDW^s|V+2 z8oGl~G=4TscmE#%Y(SI0hTs*p6$~R z;~Czut+R|Ky=yGv%)J{9zweRrXMO9`?*86K{a^KSf9x+@pFR10tiNGA5G93-o0w0< zHN*^?*1@g{VIJkxivdUHxnN-OSKcm-P)*rWK$~J|j1h~rDL>8AqAi=#mfdijQTEw2Bnbijl7L$$q#M51*~vzF`^Pe4$eYC z%=>dSO{<+!%o}8!Il%4KW8NPa@EsRpv@sAuh}3S<&~0yh0&v@Bp#E>4!1?)4TpTX{ zgi{a~ycf4It&4Ro+60+vo+Rc3=_KV|Nb-#bZ!NG7E6Odgpj z<}p7-6V#eS;@kNmKC{!GGiy9L4X006-Z90TGmQ;&A(j4#FKvv>tS}}=$o5&PV0U%c z#&(QF``C4ePG|PuU}Dqyh$>GxnLZy&WF(QMT`3(KzeP9AjZYmOlm2umw=JxpiHuHF z_?dnS#yd|QoLyCC^TdptezL`%HDmY3;cR)u=}Abm$pjOd3Hm5RcJJntE58Or#50Bn zzxnMi`g_mF{|>l6lr%UU-64nWL0Sy0ecrXXGDIPKX})!X(xKAb?DP~svxWJfPKYjtVN zK`6myaqL(#^t8>d6yk&L*;Z5_JCzCGV6$gnUMHwP@O8%IX*?7|IieI0Z*3+hsdE#PZxLae? z`uK`S!2)vA583*EjC?-@xzh{{_O}_xDem@ty{L zit!{tDMB*<2NwD{Nz>cWuV04K(%eHu)tzoR;3X58!P@BW{3W$VgTy*>*(fAlJu}atJh7m7ib)eO zWt5ITW7Lt=9POdP=lVWUUE7*it)+j|t*ABn^Wqh|Lv_LgCD;K8M^-P58^3FH=xk^l)nJ1VNvMJ(>Q^+S<#O3gfFbql&Q`RzCl1c+S;=0m-t4{BSxsF-DzcPXv1 z827O+^JYGe*K@qsM>&3t6K4~njq{3c#6&^N#BJnM>?bzqTFX%x-5VXY*u{^1yx5jm zkC7cYqKsT3Nc$*9#=$DSwlzKt`R}8AaP;Wgzw+)U|F8bJ*YX9wCqICD|4zRgjgg=1 za!g3W%f%W*4&O~bjRf$;|gn;C7$VKKLyp1q2jsoWz2bHcq&dC zg*4luG$WZ&k1hLXa9~ENB?41*cIx;q0Yz9dZ0fNY1VxQbn>NyO5A6B`;2t;$4dM0) zTwGrM)Zyy-o4xeChuy!@=QQSL{(gSWltrM&i+9aV)M<7qoeO;WX`Dodh7XASj5rfT zlBH9Jzw$?$Q-M_vGfS*QWeb}<4`Z^i4lb|=TVgPy3PIEx$gd=Qb@KjQkGag7JfW*T%XgDSqMQg{5TF;)Y4 z_@c;obghN4osnngu@Mi)FTNdRv?OEsD7>`vmtkTtqtm9tHC}}$0t%6{%1d?qL`rG3 z4~LI_?)l--yZxX4@VNg4Sof~~#%~f#Tp5N#oD^g(F)Uhm!n58-hMo};rkyG8Hfm8F z0Y?^N(bbycTFRrFajK=EY^SG5R7ZIAct2^X&l3SX(t9)c2QGP@Kv@Kj?g~-+X^Pim z+0%Po-!f`K4wRa zcIEAM+sCO{Rn=BUK!4s@Dc<_dGuEvH9(n>l^!wlT^IXIq<3e>d$wub3=2T)*<+A0j z*{LQoPUakwp6pDFUfrbnOv(8cdA@XqrAhv|`sd4l*w3thEHg*^=~F|oMn#+YGnDZ_ z8~;WRxgt-RZ#KQ0X$N#h&gLTKxSFxPQ*2{i< z$z)=jM4f)XIj$KGDk3R~<1h_^+0GewL%N8sZY`B(s2nos6-lDoSsSk z?xD}=hi_W#R|r2N%jsuty|H*hZxqsEfd#Kgg&H= zYxQwNa3WM4d6axQqY!&XO{8Nll78utq=Tg>qmRrOjj6F7TVo@JVtP3<2*(?7&i8ws zb@8l6|NbBR-~Kt0cV(N;`tSS=T)fmIVRSgl#`$tQ$2u_?&Z$n{G431D$cY~I8M$LO z{)-sjsw90M`RCVZJ+60^R}!O%%BqB^7^7^Dg(VSdxmI=q{kOZhZ0lA6B>;hEU%3EC@?UqTP6B>o zpDQ<4axQMJXsf0ir;Sw1tdZMyrE4-7J#@9hRgbPyL+(DK&uw*lWky&}7&5OqP%4x*0B&eK(b=OR@mKDL$avrzpL=Ah>j?CesCjYnH)#UGg*mLJ+ zNSgc?y$*9?nb8_lhMpd3Y`*QLls#qYOUYr5jDplgdBiDa=z%(7L4`rQkBm>9WRa>% zr?YeZ8zDEfJ!UtlgZBbk9#r|h*jgM#?LU=9YT}}U0`Cz+jwQ8L;rM<_om!k~cWt(3 z@G7gN7rwlrhtccPyQ-o7L} zC!(F~5M7r&$7M%#6B3i9ZDXG{&D$3_N^~)~ki4BiGnFZ@{I5iA(zK7)Nf$j@3CAth zH9nHqvA5(i4)ih!V|S(}{UsiI62}B-RO!Pgq35nSqISgp*h9@2*GB;}hCL3t*2Kud z!SRQs;$wUDpB5Da;=etvur;nI#E*6`69dY!6vM|+$9AC_TjGl^?a)J?iy+z3r z;V?ms%+3_)wuw#sk0N-5@|;G#1)W*{M> z9pla2tVb=*%eR+h_7=uRO4iab0xd6({z-|+biybIO#pwLn&_`OyMaRmpA0< zM_cp0epQ;uzG9KZKQ^SlFr<89xb=T?QIkOK*V6CarTEonS!0=u|z1 ztn0l+ZOPN7oWZ0yJENQWRH?0)jhBBktmC$M%g25MaLXs4?(Z!Ehr`tmavA@Xd9XRL z<;r!sN&>gdnSv{sy-C;0eorM7~{$(GQOKMpLdb_PuYCW*{I=> zB&gJV8bIGzaIf4pnD-eiqw7P5$f_HKwbv3ND?*f0qG`E{IwFFYE)S{9du#k{g@_i%cEzzbM_dBy~v|NPM*7D`!fG5yV|ys&5s2V>+)eME{IK=iQ)9L zB6hqhKjS|Y(pFMFrAQ~f+*wawVos;Ax?))m88QyrTr}uDGm0Z~*cq4Qj3whj#=0!h zoOxFQ+D&`LG4b4xr4K`nBOY>3I<^dW>}T8wBu@q6V(k)9D9~VV}fl-PMEgO`-?)#Cq)O0{CdAAH)G;J z!5-@nix{gu&cRsK%c!aqNVJIF&-v|BR1-NJwyblS_b+Dkp}%aNJ2ywM+l*kib9_pB z1WyW2>C2*tSNSBS2`oQ9<`adn`u&v|DU#n9<+RwTLFR$62&8I7&-y#dE6f zj%_c>F`dcbhNYOh#oa!8w-`cQm%u$n;QHdnxtK|e`E)xo9aSbNCW0I@d1gki(deCY z@|fAl*3VOYBu*a_Px_Z!Wb#;>D-ToJ_8Rn&zq5q$R zjF_^FT_jI&*=MJ|x9rF(H?N39N+%j!hBfW@WBp{+!T4Izb5M^LkLn0!8B-)uM-xi$ zGpdHGj`GU|z1!{_ce{EMCoZ<0W{vN-IZE_U^5>*`6u7m*oZ(w@U&keI?-6**m;RqW zMvmkA09>?_aFTSGpfaPai#an!64QDDFjK>P#(x?WI+=Z)N1X?>=wzTRCPc14Cxo=Q z=a2C?$*zeOIbjzh`Jm=*<8U)L zXGVp9eW&S~zVyW35{-CdB!l9vQeAE#ALW5u$;)w^E%ZNy3PKYJbl z;NrBUyjmO$XDiVOP04w?Fa|L?ZnqVxgWnZP_ByuRXkm0lZTx1TH@4)wZLYBJ6XAI; zPVyhiv9@*-N7VI@Q>pK@d2X%d-K8w+J-X7L;Y~S1J<8nBM};_I>}WINQbW_(X@0KH z6H|wy;`ooxv0#uIG!RFd7SuRX znV)-P>jK~&IS~!x9wTr#|6guis7x|mD_poUA$Z--jKJNg6N&Rd?)qm^RBmLs{QcFy zX#2sw^M;S}d5rE{z)Ra%NYIy5Mt^+GM1vnhC_52RoFgJWNpONTPNye}e81ZMybQs~ z(Jnt8AhMKI$b?TD4gN$wPbN~&*Xa}S_;oCdBVp;qxUD$xW*Uv%*wiT&cAv(i}TeSvEE2J76Sj6b|({N2zcBirN`zM3v^9gU@Yjy)CA?{1}q&muxY- zKyzMH#ov;QTI?Hxo$9h3kCL_}{n=AfG)^qXL3HEKk=+}c7kRf5D1lER@N4H!_yw(B z&qRb{ zoot-cMpysNCNzyde7YPDaXB7E zZA`z`GaD*5FLa10TZlzVp&8q7NI7;8HP8fX(4*-BV&X@gRa45yr(d=^4y~_%wkB1K z=Czt;cGkrNh8^85ncb!^ZTT0`zxs}^{NL}&|LXUL_@+M*{Y74Te0a$aJQ{4;@ooUq zVJz0zM1jDJ*~p`0&)!zl+Hw%Fi5Qqq9JY_x)pCS=CmgL%_ATOjnpWNDZS}ABm&6m5 z=40PlV$-n|d`2Q=#3FD*jk=-^dz}$ojMOo%6`!rgjW!>dJ!P~sEhCD}xE!j%>q0xR zr4PrF;PC8wYOK%R{!xo=$k`G-wLD8(f%oSsPTMG}9}n>|zA+G8nzkRVt0`*!mbWed zZutb%{k=)xN5AB!e~q;M{amSBz~0Fw33+*Y$(v=lc6ce}XCz9gBMj=oHc(V?u5OqJSj zC|a^jChDg-6Z_J0fVqWb5uyLLdE^ul#%8 z$?<7#B>(Ti$9H*V8NP>%-%#``HSt)^G2yHss$kF3S*_}iyxo{c<%mTU+)U(imaMD> z&W)X`<|1#jeJ}6O)>9p1pl^I^%6X_RunWhO}tULx>!{=h%@JH+!(kJq#_8I!fo zPMHgsD4f7@aXSU^O4;er*}#b;lL>t$uXzR=J!gEU0e;3f$7F$Ak4IUi+L)qm?#7YH z+~J;B@`1saS^j*~&*CI;%wJ=}Kw@Jc6XP6}kB-OXM5~j$=kxj1<2cbazU5t8nb9;s zDPx@&m2~r{zv(;0FubN6k&Hu`jDP-q!HOqipnZ?kx*AvwH~)tP-8g>Q`gA-~9sYLPivy0UlF_Wl(i-mY?SUe4eRu$-9=HoZYimH>!SjEn| z2GeDCULJN?6$e0UyD=npKi8p)enU1ULHXKt)Z6Vg-`tMOKe^+k&}X|mZ_3ZM*ZM1g z`-A|uvEQ3eos=^xaA%uYXD)t=NzR!!XEIPevd$LXF=q;K)^)PYmKkOyf=OG+vQ8p8r z0cbZiY32?vKGbz0b<)KGI`ggjj71&&M%Vt#lVc|_#-3{Vp&OB5lF#`KNvrWC?=WW= zu@x7_=;K%ZEjB7FDv`j19(TC*vLyjc%yCPIi86i1^hEl*Jp0bO@s0l^|HB!N{&DS2 zR4WP__Dla6o&#ravqYIwU=Ke^=co+}w6D+a|9|%0F4orVtnXWEpL43Hl?u7+4F@T` z2t^!Y2a;fnTbhf0BoIPxs)n=@m69rTFQ|Ic(5jMKxJac&d{v3m3v6sa=|?a&_yY&9 zp;klqu%oK!$l{!+OM zMQ30y8OAu32g)u+Y37KvN8)%wRYNwM^2BteuJWQU<)KvMc8_}laJ%u})*pcgJh;C2 zJNcc>@3pz0S(L2BJL(j%XErCORlVHc|?^5F9f3pNMlRtj#H9(;8%9bt6v z6**M^0Egb>3x?+O{oqMsjasTU37Th-T#Inx4ZUEP!baB2ff*%?2@ME9@+?IkAY{su z4#5n3^F&3)>gCIRUW*U?@pt}tE##m2#14nmW}J?*b%P}(OFcEur38Y5YJ5a1L&$md zkzO(9jT?cGAj;9+;%fv+_n?j{*J(1j==x?b-(zl zDXj0#FD?a$RM($4%@x1C^P3c2m=@es%%jlXF>(xSo-KF_#l!}kTmwdiCVi8I@@A6A zdFd;UB8rX5quJyc1o-BAWC{wdemZUOMrHKL{20Ynj6^z`wv5fQzI`xy(9o>knBajz zR;Ev4fjKDI$P}B8AUZ@xn_yuvX*agJ24hT`B-)J??wt}RVv6cUq*yUXbsA6d)OZf` zj!Vbw2!LA#+An5H^QzzX_dohwTz+7dQJ=7}tWT)oz~QOIFy0&<5)bC}t)e}5gyKK~ zbK({|eTk_P4(Q{+3+gI`a();GBzJ}#_E-y^(hi_ z{emGEi!^_}7_qs_;btZJ*l9WiH#oJIA(&m0rs1{*VT~mSwn77t$vTIuZrnvK28xr( z&Bh!Fg@_lpX*~zm-~Vdg_ow*3#5eq1U;lA!0e*5KX2xd*T`F;O1r;*}8HV5Uwe;gC zG|0UwRbDZm2)A232FNPBdQLE}FJEI>bu?;jY!C%ry5fgNu%iokNP2!Etn=@R#)+IC zrYPeh1E2U76k^@;1bL9>{B{N4D9m|Q0!POK94wHekOQGbRDeS=J-X=hoDQihsEK+M zY+z)})WxD4{@I*O3urDAnJR*Fj2xU8fhen91QJ+Cnu2L~Sk0YjN0PZS9&JZ<1nyu2 z__M$VmlywKexdv8Yf|txJacaKlZ@!)lU$^e`b>ZPra{Y-3^20E34VzUm_CytxPQx~ z8Oei$Xb%^iOsdRfU&a7N9L$W7S~91kl|)4DBmIwG7JL$vf6j*;7~?|>MRuwJHp6F| zplz@aA6NQTfW&1NE4av=k9;=au!+CmQeaGlH5(b10WpnD2n(hK7C~T!qA!_r>YDWj zx%wZT%sCuu>iU#%wSZRV`lI=izaI|5t7;FfUi!PidsdJb=Y(K_KGTK`qpY8x)*2FH zmtI~vNU#v^iRr3Bn)NbAY|%5wwCOzPnq|!ve&EtHP45%8Xu7v1+@6sr>+GO+nfD_u zXAG7S=6aP1ir=gdU;C_4)j)!*!&0IHA;-Q%8TSD)KgGaS%9t=&aL>P+q!t6B}s z&TA-RO!6EP!1^jbUV(v=UkEW6EH}HQSn4lK?{Jw?9{KBpGF)k+>*`O&J~| zM_(CmxP@RMX%WV9f7B|TDNDU*>RV*s*PeR=Kn2o2Fln{f1X`N*gW*z=5b-Z^%darJ z%^$ziMKC{(Gh_o~5fAbBWIt=yoP*p}c5_f%jH29Q&2#H0-41@s=F>S3;2W7JkG!#s@ z7>}=#Ra13j4#FC+zsiq?o{m}K=;PM;6Fug}LCdk{%ZZbfF*FYhDv-0o3T>=SA>7R4 zMD{$PaH27e08g4|Gd@uQL|}Naz$+j0jD&MR>Mkf{;?evHo@2!~UT#O5VcZrUTw0gG z(Q`+C8ZZ3?3QKvA3KO}axy(pl(^Ny-T>Tc__y&#EdtLxeeZjd zBR-Qfl3(x^ysUxDn8ZQJOCnys{G=4TBF1ngkj^xp@V7Y zmadG_>!-5c_iAtb|LI@*_O}J;Z83=%TymYPfQb==AyZbw8&^rpbg&*rO~)$XFevAZ z*BA4Zy1B*Q+x$zaud~Mc%vM%TK=DCeb#;8GQO^_t1h5;=VwUY!UeD`F7jUwy!$;{x zAIq+6ox+6PmXu1-|7PIinETHvEJ za)sq(22-BrPam1iKoi9~k>qx@hy|aQ0cON1ErxLQ{LI3?-L_sux9i2Wz9aC6MBpd? z$9wL47N9>7NvbfTgg}ZRvm8${&0KONX;7FNgaDxy zm0-pKPI-IX=RiCr+N+^c*hb zV@+VHoI|#k2}{d6Xwl^ra)#~6V2uZD%sR&|oPcv|Od@;u3+C~RDHV!JUduEhBVlS zL;?XVr1N*cHAe|WXc={qqXB?NqYps~;Lr+)QXc@EKt@#F<%=rZfy3Sa+<}v@U3j!2 z;9CKgm+v$gBs1zgg}T{_lw@uoRh$2lD4IAb3XOtF(us(D_!bKKTxt1}EK{J76)Ot4 zJW5`fgv7rd#tuLfg!F0rUR&^WNfI)uDXZ;R$KL3(f?i5uFKFIrz%8EROYqPlCClJW zLnyWDdMY0hdbL%3W07^Il^ZQB)jj0XSQ;{!N>E-7HfA}&)eqGbbX&s{C`C()>RG6G6bdoc$cV4!lRziGj~HvyK$b*qLLw}9h}Jd zVN2X!uMbQkQlo~9J?OF4@|{*BLvUh|eWDxC$Tv`p4`H4bF(yaQ>#9s>E@omI%w@nK zJO_%s)^pJ#}^YY&pUTElzzd zQQyWiR*F`h@d#jy>E^@-8<|7%_k(qWbolQWsQi5TFn!Ad62)#i0y_e)FarPdGtd0@ z`Ca}e7J0HMsV9xXJ~V#wo9xH}Bn6)_lqBV+j5CZ#=sdZ?GowV7xBK&moXJOiw8e9h z?7ejPv~m+5G+KEicWh1;(g&HrFKw>snL$&JtQ8B|3K36(A@WF_-p=5IkF0s@)q*zr zRWojKz(oKT@l?pta)SUOrr{-Qn#&{#eUzj9Xof$&pdi(#2tGi@0vv4!j`=0;@Z#!S zzw)N{eWK%sJAUJ@e*1qB2fjLs>jLaG%Dgld>_Q@AT(D)u?um_?b4shSw1AnohT(fk z(Wk0FCW`(nE1=r6#`baMhRoUN9I3?gT#BG+bY69t+60iLTDXvjCx6bF6ULt(@bclj zgbVvv6q0Bdehl*L3|qb$@HNZH6K>%v!bAmNe2pPMJ6;3og`g@+SPjW8DWk%ujEHi< zOBCHm>#hhfw@gH=zHkB^CF}v6Cu8Tp@xUh@j9_Jq3mnn~7oT}9S~+*%xHkZI;3RAp z9=!;>|Ifbv_wzgbw*0pL!AcucFz&dUCz?SrA<>Z?(s+-)i7LsHgiuM+Le!E<{IXV3 zQ+UZD=w10XL(>ZKyiYIcy!{ZpG_LmfT}CIn2MVj$)x&0?k?{Hgrdg1v+yi(RIu<;kg~8I7uykhfd( zHeU4(6HJx(i%y+I8GC8)()dz`vXCGMa*;@50-S$N$AA^ba%J^vZTgG`BDD6JSd-~N zhrTw?idQ93#5!D}!yrRn^D6Vg8~>3))R!=lyp%b4X}r4li<&A|Q=8}r2x!@rQ8y;l zk%1Tk^Lq`PcszLL)_~~tQ zeHK0%(KF$euMZ5no~2jm7#RDF)ggmzl~^hck*PZhCP3qs^o)fS$JYY7V5}!|HbS%7li)fl z8>?ZLZpgvUfMbT^Hd82x&-3Wrg|;^Uci}8-A0F8V{M2(l_oFF%@8mbVzvv_fvqyf> z$rvfBCL%I{>68r7;yZH4Cv&whP`KdJk!~^~aU^Lp`yh%T4=5IwQ5xCC8kj4@m{v@G zu&f>4=jSOtzLB^x5eJFozo|59fad$ybjnGH{JL7wHvsFGT@IPsRxI*LEIQ(~ zAxVEA9SuBQqq@LpLp!p4DK6dg2u|xV`r31mr7MALXyT$ZdKpQd1@n^3!eZy}UY$tS z$EDVV5YGAl4(52F173Qi9RrC33$Vk7j-9JBMj=d-Qe;;kS&!=@e1T$iP8a7O&UkKX ztHH~X@T*P)hpBwmwm$=~LcaSQfk!_AKmFW?|C{`Z|AYLJ_v)VHmtXf}r{f#)k|(@W zGeJ>;v+QIkGdnq?3BrU(_G9kn_esm}`yh#_W6nhCwJ{DW}r7fP- zCHzQ|q~cR1UQUtaxXK*++<#^bIv!E!^*c0Lc(vC)-jevF!`23aH1)umre4MeNneaZ zmJ<01g9}GT1uVz_&lVewW{QtvSLAoSnm_yFQ~v?`Pikq|qX(O(Wd}m0F|EmrXDyKN z=R}5*rYdJLN{v|QZ2Q3U)l|~xpMm%05pu+L;=sBIv1sVf))O`^Rb95}OA>5?*zk2_2@&zC4aMshIAeIg z@KytXM9Fi5&uQ@_v@x#UxQg`~r=Xae10~dqKmseaXvKlDOm?7E0Z~&FaNdJ^p|jgR z-rQQ=zCYW89f3zO0x$jHGk-n5<-cX3Fk`I*ncsZ!%_*~yphyQR8F||sJrhX_ddB=2 z95M*!eRNU?!)PMM?Z$LmLD7@n^(AH0Lrj6;nNwZZr)= zfaO$i!2Y6?evEkXsB|%wngZUP7mOdgh~R9_KCbStvb?MR)9}?E>} zox4bR^&!_*>df`ED7vKxx=XtLI6KzFECLZj-IhVe&~Y$L0s-V%v0Cc5Dz3RIzTEZH z-!b3l%JgIekk0kBvF7*Bw*0rRJvrEKyL$SW=Vy59-QED)`YG5BJPr}yLxC?{J@uEf zmd}_fQnizCk_D2mlhKn^{J>lj4TX4J{gVi(qNWuJUz*7ovQK!)9{#R^ImyUEK~_rw zR4WLAi4+6kM$62H9L*kko# zbu&DS;L6c()%j@3VBOj1s9x_QQ@rs%VvU!B;?*Po3*Y|o;`^aJZ2QJv`}XgO?z7cr zrFn2}0q;yt!hux(SijVzb#fa@cQ@tn4|}@Q&Vvwa(X$T50P*s$A0h2j=vXbRLk}G} z#8O9nt&CI0`9S6H87nuI#8+VNZjIQg&)Ey>PWrJ3)Klsf!06RplWL-1<)p zzV|S!1%O!MS}-e+!D4$B5P`(fJLD~)GV{VnfJ0`7cA_DTY#VWAN>>Uzp4oUUvEfW- z%<*i_N5tgJ`Qgk%vKO*?LzlwmDqPA~Scbw}Mj*{N9WyCdje$9RiePWp88kwpDg$Qb z>u15nNqyjjiNA^+2c~)Qa9v|$_~@Q1j2+K`Scl=k(FSoh)&VVc*D+9s59jBn2IJ@` zpc)Ki@xQurw~iQveecc`f4tutfO*mEZb#s?h`{^5_V526$?*R*zwF64d7cXJ<6Vvk$ zmw}Jn>A(ecT2!(rjAro~1;kke#MotwxUU;Vl@bRDREcFF@MG4aUWC;dC4m%n%|r)d z<2~GI#FC}X>j`jy>@`LlTv`}i07xhu;Y3&m!^aVQrC)SLlGQiD$tVg{rhpP4o3(33&TGQIMj zL`XtGMm;2WUq5}wk)wELOrE9Y(VQcV2^tygERmC-kPOkQP*@Qn^YPwn<;O3@_|AaH zC^bnCU^3;T#CFU8Mr(_%%5S$HEO zj$`o9dHV9DhyLXM8~xzlHQ)E3->iKisjFis?4(jAi1ExgOTc?YQW)4$+344KlbOJ+ zMP_*+@f2mP5itXd8#mkMP{7g=5dzm3pfk2Y!a*p44I-}>eT^?VjRbFim+yHGAyi*g znS)UL(&I5)sX27vYv6fuoiS5T@ z6@j05?gRg07WB7B3Z{-EgOxy%?2}0NOh9^{E7P>NCsk17)66ExFeXT{2YRNPBok6k zGaf|fWI%FI9_r_i#HSoouK3C42nfPRa59tm5dGu?1aMp@#5H$CJVd;`t8c=s=sb={XC~AeRP(`x}8H1u{m}fAcWy1GRvbI zEI6=_(>tPuX%4Ehh=V62E`&sYwX0!eCgve86|QneloJKHejJvx(E$DKDzB(D$M!vqI?5f7i2yFcLfxtRK>W1v7)q&~3x z6~f9aHHE}nKH+}3Y}%vv@pA6Qac=_%y=pczVF>Ptk7mvCCCFJOP-CeMstXulp2LV+^6N0@sHN{ zF7$f?a2L+P_TjOOzz3fDx&JQ79zBF6N3soB zvWX>p(k(bkuSgtCdO=23mGt=mRctd?agc6iM6&5j&lr~n;%d4>c9rWIis>-&K9=;X zB~vXfa_n&ptS_z#uoZ{}6n5mZUbURnc(G3QYmvlW1v}(J`N*rf`oDVcy|d1s5lTO- zr$dA+1ywWISB04qoBb6oaEkdCy|hz;^>i5!8K;AIIVAj^%Rn&7xSUxv3J`b&wc??D=!|;n00BJZCeIUjb$_y2dHVZ{4 zk34mEoo@uuT|OdnhP8YK?pV*rK%=z>f@Y7ej!Sf`jmT&zlnQD9gD$B$z?_;`Vgu7V zV#Inj1avhA5xKrbShm(c${tM?cv5G4+vbDB3rYl;j(V4w&n{vOFL)E4hj%Bckp83-2?E7yT12-@mIVj62!yy8c^G3 zH&@?@BWvKyOj?bySDLKMXO0m-zVpLXBXfeTyR0)b7uKaAQSC@@CyCXTppU@j8Jfg{ z%ZEE{7z|5yIzHmX6ppb)Ms#tcmd{F1x7nXw2laRSsSy7ABc6UmiC**pn$Tg3mxG00 zS)8p0Bh3R5aPO{Ma z^BnFan_rS}_=x~Tnu1M_+$1luQRc~XDLA}kZXwS+A2Z1BHyMzp`RiC+2uW?|;7v{7 z5VXM^*+Ang5SVQT56939rT=6IA5GqLN+aBcWBTaS!kA^GMcumrz_G4Su-_j|hoq#k zjPk@%^ul+7RwlSw_Y)#XX;J=I3Qc{ zjOd_)Q#$qjOb()Fg5_hO?fg6(<6sCwv<8ItL5U*LR6wR0zH+j*MdMa6%xg+8|)E4fob8V}E}h zJpAi%!M@i0-T=JT5#4w@0)IpVKKQjC{6MnazZ3RvCHe8YN7BgC?B$07O=6_wvXaDj zzn`Q!iIv3S7#W4;>fNh&DCA(1(n?H8VA&L~aUg3o;WfFP#6VlgOMrkgZw@=uKaF~8vA5Kd;!T5@E4i0VE^Xvmm+nHP|OJY}5p5Qb>6piJz& z_v3H;saNwSS8rWdM2%K|I;Nnwc=k0@^!q_S?AHfYK$B0k3&2|B8n5^$i0s*O(bigx zJD7rmOFRkk@lwK8wc0l%S`S0#N0E2l@Q~0L3#Zx@X@cjbU5MTPFiK% zpaB67%)^$Gh~~#KtxUw~3OL9X?BwfOQ~lB&wjw%>P#ERVcv$d;gfsGY&m?>G~s?+^M!V0C(ziY-b+#2z=-b zANt>O^Y$+#C;Vm-0|_Wk5@vD)X^FB(BUw&LX-6V78HV2UVtyk*(~|hqW}aL9WSn5n z2h@}Ro5V#Oli*nU(#M=v=QpjR=MR0`0TOF5oT3pl9MFDb4(~HA4ayjv^+tXw#-J{I zpcY_R%(ICZ^K3eD1HqZjb+*yNWXF_`m3=Fcn;}wglx`j5p4GuL ze^U!pSQlCFxMea!I3~y5lMV`adrHg-1y`gFFEtJoC5F=P9qvyfqW<4igRl;wKI{G1 zggu%{!pd5G^Z?O&rvAANjv;-P(0rNGw^ZiST|DaeNkQim>!GjULli>vSE&N?MOsiY z0Ytt|Jrzx9qCl)hN>c?D56}74t>3{ms<@4a0fJlD~O_v4a-B;$`9#EH0%S@1!l7r=91zY?^_D>CW(UDWo~Fo;b4 ze31I&3PRKuQ|&+=9DJps)o}iZlFIs-Wy7h@ffJKFCiNUU;Fd!TCod3>m=lKgNjyB( znu*;oAqRoHeG(fcZ;_K`Snq`fyh2kw2_^SElFo)0G90AvIcMo}3lvt4W@Iz8`8Pg= zChrqO*x~r$p6%X@#;CP{aco_TK~R)p7R1PBv-i0g;6nO zUcaTu9pMGt)s5PT>8iGGwz6q{mdZ3P0W9fy;pjnAk09GyZj9Y`08-#tL+yS_rjY0Z z59!x8>P%qHhfLlzaf~y&jTy)JRPt_CYrGdQ6+$qRVQz-yJlz&yMTj4-mnQ7(kzxLz z-Am8aOJd!4m$eV!tnysEm;@9*FpTfFX$Z=L01+p4YdG&xnIxn-x>*2`&p zX-cUXa+Nhmwfn&wIv+q}ThHDVt!2YfD&r1mgIvPh)6nQEwvE)4h52T#_tg2`fi|CblEN2&PAa?cxh zeVJ;pnME8zOARUd5Q+La_Vs1qwQibYQ2sfait8i_mGp_qk-Cq%sNQb(eMcsg^CZRW z+ovN4s+8PzS|5HAgXCOZ+LjCvA2qBrl9=?I-o0^N;!3JDM^?!NrxpZ%1V`{$p7D$;|?1rkV4LMC?J?XwjE6Y7->+XEHkqC>gy;6b}=L>DA+{Qj0 zLflHD0Kx)|o*C;XcQV`)l%XB@?@Cd0NundRzSA*G|Bew1#`jzYj4MN;IUIYG7jG=h zmhg>TgjwxpOr-4WjfsE)cNw)DBBorS1f;J5q5lw^dX)SNkq?14N867fyi_fqzm~-ZNQxu@140G$=CF!5 zWkMOrucH-s--Yb2gy-rcItZL;C6o_ zHC(?5&YtY)-Y2S689Qs7%^3Up80r?o#~QRIh}YKJfwfLSg5{W(F9 zrn#mp--PH+J{s@4Y^)h7(sJlg5h~=N`xnNmsh1z~xruJXLz z=ObgP?@ufM_k1Bt+i;zkg8S_9;t4(atc>r^zs&;j~CF6>z&83Z73PvZQYf-z}4Ipk`(L>w@?>@<}y?E*YxRpyu@O z=;#jM$IK+kT35mwVos&MZVI`upuImE1IynQPN5J)SFFMG#8E3(*@e9S1Ar- zjJ>CqSE?H>_t{wiG#5$g(V0=8Dj@HYrX}ZG+1{nTy@oW0+tc`my?_!H7XrR-Ae>qx8juHj?!aaA@%f%KT4f8gnFNoT+fd#rPt z+QVr+CMn7er7$gMVXY#3c-8p;z(aPj&Zg+<=}v%_%@c9tQp{tv zhJB8~CRs>%gjkOPJ9fqG(d-a@u`;y2K3=%E#sV65KJZM-I6_}8Ihrl|auCalI41ix z)6X!lcct-q4X<<^3X_D>7oWf^DD*^r*8lJ99=JI!CwhXafP?&<2`JuB?)d?)-^!M(F!C*_rt>`uerHSW7xtNcLP``(W~ zW7dqJ5(J#Qu4MQrsdCY2H;F>H?`&EYGpz5&`n0CSgQ;!qpCMLM#N?AhRINGTNjXrS z13fSi3JZR23=`kwkBlof<)1otr`@SXRn_b~~n_3YWNhxgyTb2ZGx*X;)JN*EhOJ+;_AMOZ#breT+!F(tjoP^(3um;3(8RJ*oD^zl~Lq*;^FJd$=O*D zBmKG2v=3DS6*q?&CRTw{)X2_MCL_MGxpJo_8%J6@jk+Ss!T}>*^=^_dCb|1qCb7e} zw6V!@wzp!Tppt=~On#Bo8ZL!xu@Hy;OEl#w659ny>^_EZL*5CA z+<-)njDLgox-}xG0twZ{{;<_}{NRag&C-0v5!iP{rhiu^YvK#*nQ)?4SA;P-I6P-K zI1v@u(mp}n%R=vhgsc@0N45WKs1z`@$ti$9DEOF5Dq5fN-pu@UsQ-(4tdJrTQn%wc~+X~4s4ZfdDqS7W1`O}*zQ9A^J%;#z=>3cONhE2l-6uef;!p9_ErvSO_9 zcP==D$jS5s&ZzCfet~gsNQkB^-o{Cu7mtRtw^o0KPk@D8DrT%WAbR1wvGB=0#=xzn z&|;T`p_@sj)NZsqN*$9SeZPj`GhOvEgmxu3q8_DNF<#^96|aj-t-sg3{KSG0Ds70e z5_v>O3Pl&>dkuvi=o62KADrl3tM_O3#NV^Y{6+?ayaoQfACV09C7W|&Pgc$vuix%k zfW0=#>{$6_$q38av8@n;EL5*$=&O7Ag+o`Ss}1p1;$N_by%j%{C;EOgc=kIC@m=qm zP66MW7R}3*naHw<_W{2g)%vtzMV_)2N?!yNgogv&Z--$ynKP}Op+ZDc4#!nQJ**Us zne=eZNN|MkgngUlm<^vRhw9b~04J`eW!ul)Ug#f^{k#LUknD+p5il}tEHpcM7z0&$ zKTC2=SJ=VeL4GKoV_w9fRx z*ZuvY;(PMFtzZ-Vv5Ydg3ub_I8}Z8d4{FKHH!o#3%f?D-UqXE5C+4Tm*L04R^^%ig zcue8`+MS=^cA30Tc%p5li5j@l?vN~ek+Qwa-??|EPD&H|J-&W|l3)(1pHeZ$Zi$PbE7<8yWK?Gi0e3 zx7%JjlE%=$#vM-blCCn(PiuC+?Tv%w`>B}xArD=IU7hCTt zY(eN~JIjiO*yMDLP-j}7Ay63Xc#;GD(zb>e`*2Az zQg_Pb{vrxL)+KXmgcs@0P@o03q?wZP%qQ6NS0c>yP3q_r(H&(F55D6L>@(hajxH3e zHRy>4PabtkGtaCDU@cTb9d^=LDIujC_v-!t0?}Kcp$XF%cqoP_zj6V^R1H8CK|SV4dyab{e7{pbz4f*a*26dVcHu4b$5hH4nH|-)xrcyr<;#~`%U%#& z&qW%QkXz=V7sgr2)tnc)+@JZRh|?{+l{SB`c{e7fRx+TE*Gl5t=U)iQ0|ld}R8^h9 zGWj@@ne&?1_@>cN(G+bcS}xh5h<7R@i(wVNd0~xd)NxzhFtma7%`D|9N$m7Q{=!7o1(J1fvnqaL zdIm3f@6^_zZK1$1{69X?>Fkn*D>QFAOg~L6;KAbo<3b>mSKfQn!iN*4ykEtjoMm^&DX&_1zdlTg{Hyx?LVGFfdGEZ{H@OKlZCoyOV~(kxmf4eRd0YiZ zok&Hu_#U2Fm~OLNzK}LSR6Spw#Q|9Zgk#;(f+<}I%C+t!;}VR}1zzIW|Tm}Q^diB^Q|{%u8WQ=r~MO5hH`k{e~2*>W&k~1V2EiTxSfz=y9c^17pRHLnW>* zB|@X98QRtw+&oE8o2^}5e73a?5isuYjoK2gv5kF;r>WpDWshh~+E$o+IdhMxl>Gq6 z<4{aQkx=zywxlI>gQR&xOGf9bt%r-ZbpaV(sXZ(`yZ-(@pSS(?kApM;EK))QN1y$A zD6baLA5FHeI0x@qcn2<u$UKArYDL-j2&?wLj}PO?T>lm68Sjc-d&Cqb6x7j#dW7ET~@FWxTc`F!8k@Mf@}TOcKK|e)o=A z#d8@ioQf^qh?%}JM^*^V1z9-sKAOZAcWMYdWmmMNv>iO+%$-koGBTG|>AY)w`7QP# zjZ4kLP~`;_>Z|niJDNP)eAcMq24?tns_Z!A-+QAI7n1Jr?_cTW^gT&lqDL$pNRzA^ ztO}Y(5(kbH2PZh}mY*;;>-_OsDr>dF$b+A3{ck|+zroan1zNv;%4W)|N15O*xK@F} zOW)fj(B^_jcihhH}12z#h9>} zSQrE0BTUTfsqpfgM5AZkq3gX8l&lx1VZP63qGEp2Qb{Q$5$|M zujjy`dBx5GD@J(Hv(04^{+q(vAg0}35R;UEDE9esEh&N4ny@rVgf#Vx9A<4i9C=%C zTwM^cHb?JyfLbh$fDo)g#)2RjAyIs-c5w+jjxir!y)M~0(O1l3jEK7WAjGny4Lo7P z*uc!3ApDHTQEXfUiv`fULEs)S?Ut-XJ1-z0o`MmgBX42T=x z{KHIctIk>)NkfMk07s^FivzGnz{)B51Bnz2!UE1R87J9rGp$RY4UVXfqLCrWXbr{r z(k3U=L6%0Sjj~MYsgGzOWOR-iSDICvdJC`}gr%{Y<{U+loj48>)!Nr>uC8Ulh%5>5 z&Sb`6MuR@f>3Zoo!sZ?smeUt&%p`OtQZNwK#Jg}da8A)t8} zbg{XM{QT6+S?G@0?DtApx68b~9F+!#BvZ)fE6;B?pkJSkzCt8`c)46c_CRWh4SkC@10ch&hpv;YnC<%obIGgcL%U~>oU(&Nfh79 zNmbkfqvdk)dgeSzmkGFADj$#PwCNrk{RKs^C;Ah>3$?F?xp2YFF(y9ytbhv>Lw_sG z9;Y)9o^H7QLEj#IWu}m>3I{LS9J6aW24SMY>2urGDX_3b%No8*$7+SSpEI)1rZ`|M z=~#7ml=OaNOhVsKLd^@9%;IHsqdsNfU#*ZR+|V7t>rV*{EW?c}=5&wNgjd%fw_c_| zo0Nh5p$~1G1p%0D+FW&p*M%eKx=O%VYR44A(V{;wE7F}hQPG=R%0@$gMgYoSC8$DV zM>HKl+d~fZGvQQ3cSB3d_~J>OoIVo|-rD?rQwxfq_`^&BzAK!tLFG%}RtGTutMZkx zzn}X6%|jb5>sRiYYlGC{BE_3q=RavM$}7sHMld;Fz;$C{dN?XI@M>LN+*0i{LPb#* zj%@q4@;iTLQ#%;YjW7@fE7pUQpx6hMEa=&>!g(9<~sqjywX<+I0H>%7EY zEh?WNx%%pRU<5ru^KChyNu7(QPlhM0ukH6_lY}KY@mg5GjO_uC#t_jceUERPL46pt zhT9$nxd1y|^)9m~Eg=oH5G(FxNQxW5h_q}Ydyho2P(flBp3EUfQ$+U8ZSA!6O}7ym z(_gPeGHaEVPaoP49T%qawgP&f5BfZ8uRpk`3}^F^8d?}tivX8)5m1WR!n!6of0>=E zA$zqn!4)g@xcB^2bz$-~058d~3#@Tl^qVM`!2Uq=$Bn%AEL?NuZLZ_ny|bWw!GW8c zv$`V^p>A)MCw9WnIGfRZo@bq8jPDPohx0CO4l?)}KI|1R{n9~}$pplQL^dnLc-N~1zGHg)2G&_ZPO`LX zlC?8Af2-p^TlNb0-G!NSBIGX_(xSrj>+7I73{l2hjf|COxD)YS4N{0{#(+0_s+&6U ztYdk5%m>qQ#I9hz*(cZGWBN3ih~G2Dohac7jrk)S{sk>`i3kM!z+jq zWXF{h=%-XM9NqYF6D{wNv>UQhlj9Yaxvxp&^@wK9rJeQ%*{YkW{Z3E!e$@HXpzGLb z2mkR?(5hOtq71L=MHg)m&Tu%P5NDQ%AFnqLiKPm`2~BGo1r*VtP4FfZ?VPfSP=qR% zra^ut?b{$Fdu^xhdnGyAVhzR+yl*aMAWbwUM}uL-k@oiw!&FazjV?<3#an#%HGdI0 zhonNGD$X*LM`ZtKI%td$9t{oaMR%bcW$x3=vS1Wmw)cvLD||+D2mxqZnsr0JHHib# zj6tplR@ALzfBaA|=pk?W9_2X6Zj&%r_I}QB5S*$~gP!Ms4Jy}h!f3n!6jfAp zQXNpvdq1gSz1SWc@IF2Hbh$lP#Lg9w8-btN6ZtR6FRK)?X~#R@l7bMcE_nJYHbAwS z=wU`qPl5(AU}aMP*MM2d9-iEQQHNZHOf~t~$Ienlva~SW$;S+-*=nMf5_W8qX%vCh zVHU3Y_D6^|zo}Z^QoD5ra!$qXE4e4YAt#{TKsizA5Ffd}5BD3jV+@sDipSsQ$T)@Q z(Q1Od7=K;S-K>jeyihbz@0>Zr@Z7CTlDKIPtYAMvKCKK`qGDkORhA(fL;wI2;!&)i{|O z0c?Ag*UAGTn5ey!$#2%K1a1o8@sK#eXJe+3Y|l0HyB+O7o_lH|1Y$fp3#QU#0Zl%* zr5|K`p^J9fb;S0A;T4quMs6v|Inn`7t(vH)nGtJx74{vnb%(VL5)daxa3RKwpVd~Z zPb76n_F`uNfMFW*+!BW6Zf5WvJA#A_K1W#n4$8eyiOZ4FprP2Q7?yV?u9eu(DAL)u zQGAu?m(aMluE9s(_Ol7%Eps#XkGBsFOX5%(X2^aLdhVsoE|0XL?< z=nT1%D$g0}#c?{fYSfSGDM-=I-T9W%GsWp!6|hYcGvA);Odxj2(e~!orI~Iu;xf&d zxO*FRHxj4V(Q96@?1Cxuh4-_d{)lO_a#~cHITXC3fGRz`bsgjN<82IaR)10>7v3~C zLrEU759EXCva0S@8>YqR-Mz(KWFZ~>-%15ihA4KA0w)m%U)H>WQ1>TG{&oRKqT0IG zn?GE~SjuG4c|m*a7)u|-wUtyHY>^^ch$#=Ff+~V`iBCB795^L7SaH##SjBrX;T)7K zsh?%PEyv*S#(p!E`%8}XSA{+pmKH5*|@9 zryR9$ca;@UXCFKe?*dmNzC*&lfzSnY>QJejEtW!tAcPx7y>ai503da(CD(6<2(z48 zsUrunuM`YjGBtZ_Pgk&}HVv)}`fJkfdoo%H`nY5}k%C{W%3V&M9Vwsmg|&@f7>dHPOW59M08H zo91|(A|=r#Jn4()qas*3i_|Av(4reU9-iIfsz0C+aQ6V2HlM=~HT-=IGO1ZHpUa3Z zEM_`L>wvp|2t3vp<`g(22lixa*L03NAS{q3{DI!uBSDAz%xo+VnP&VKtQ_XL_f zF0sbesqL_jE#nC;4V5YR2PL=EM7pbu_oGwW=aIP|ZwLW3mdco;mdkC@78!lLQer~A z$JU%UEw+%24Bg%LTF6o)RlVt|G|BF|wYat>p$lS$7X?x)ivD7p+IJkmYa%!#SStNi z!~Jgl_q*Tr>;C2RL5m%@tYG0O@L>K08qEBofXs|3f6ln4PohWHjPZwY$<4^tw{)$J zKo_aCt|8KaFoOnK$yh1GP+JeHRWI(4Q65&OrijrYk=&NgysrfHLwl?E=6 zb82zu>gEYTB8i!(S-ATLGdjPTx;=7~hQU^LGm`LOD6GZ722#T&(%?*l-xv&6=wO|s zB=sBv>xuSUFWO50Pe2Mu<(B0M{XE~~FwwK2eC1(|DIx=(wW)06HPqMN1|$tZx0|{F z*WlpO{~FIR=HoRc*&$`sRVtnFTk+H!z5ijpuR+!QPELT94$riJBW{YZWm~K)RBOin zlwB-^M)5CkM5nr0GU>dh->o*HgN?hA432F{`LpGQQ;gE;JlsYdk#Bh1s(y^%_zcmT zkY^futBNZGXuo?#PC_xwKfb;K)5M$6xG{m6YpT~@1c^6v75g$hFKP9u+I}UR z78cMz39(L;=vg%+v#Z#ZB-*_rzF>I~H^s`>f6r_CrV*sMX5qa-7(97ZenI__a`(Rm z9^gDPU{bxcW1-q%t15(#PeM}hjxY;Q+DDlleK!zRd1j_94YhH_AmyKNg%%@qB?;ld@eRW7kMcny<&=gvwso$JG##$pm!SWD^BdUUhO<~ zy9Lq5b5ap)(q{vELoo5KUhX_l)>L*UCRXfy8~{^VLH^@6gq8d=7If^40~UwUZmu~F zKUFOc46+slU%yfYN%@xgP7$G}g}VN>aqt(r%w6drqJ4qh11j)vLK0OJa{|P1jYTu~ z^t&rqVtws4haO^l#fp~tA4>WDMAsh7>F;{m8>1R?CygzpCazeHVCFWdE5Ys_H;-C0 zxnSg?`uJ#ZQWIss5Rr$=BmL`f>2wm3Llt*F>~Z`4Fr1^r!szYO$f}|$s0Vj&wP`^6 z-c{%vd1&8T`yuy31qN)PKj{~CnCo^iLoSt6rSWChAn420P~#*aRm-Q-@&e;O8!s`) zR#ZG96>3%YX5{bhuo>Xiocf4?_n8W=N%%(L#l%FAaxN{j1lRcOUQr8U@l-DcAc{pv zv`zHp%T?l`xcxFs1x*J-;LZ?vahM&y#_5EiOL?fwD#l`XPRqc+7M6C&?Q4K{3=d{gj&n)#1jZxn13w*O!*uzj-@U0S4N+p0cpFm! z6MjsDPmAZYNRv`aHOtvp-hpSn#~La1eeVt-+`9rVo)(K(3KgS7@l5SlNn5pmf?F2S zBq0~pkH0CNIFc-5_#q_}6adP>0?9szzP6mRcKk&i$|9&??)oqey3#w3BxDF1E2%8a zp5s4>Nnj`=B1Sl2qH%(kETNnpMF%HP0lt~`d(h$VT zGlVdg9ytfK?jjOaPM2D}*PsqG&ih!F_<-L8?468i)>p|&`d+n-k;=-bA!{r=o(QEW zCNLm*0~4{MpVL@G;oN_Ss87&Zsko}uk&x|lj(;ZVHbb&hz08*lcS+$p5kFDm40;zZ zxx1w@e8PnN`5VB6^3wfra%h?2jHr=T1myb??#8~*%$ORAl?1jLJMBz5AAEdB4}G6> z+?IyrLvPE%5FtxJI>!Au_w)e~Jt#8|2lg07cc%Ieu!UZhIBRzgj#p`QArpEXN2910cnQQx| zDvXuCyKJBhF%4_uZ&Vx-L-=YdB3gk-VQna^Tk3B)Ww9Dy%nNO?kgST#64bx=AzNY(uKHZth^tLP{6oKwnSgRzU6PIX^?0016N zRPDwfhEGW@VKskQYx5@0?gGW`*8Y8v=YZrcF9J2mdvZD{WA1B zN^zzoz0K8AWemGwBjF_Bu~i5GucsPFD88+wxaTGE{02<(HIh0YN`WIALu8Y`cuH(Z z0LA@eT9f$4rMfJU+k&K*s<)W+*$!|d&{OU3^TUD0M1v54S^Oz0ZrgTHZm9OXhThPv ztMU`H!D0;`y;15fHYO`SAAG$iCV!kf_7tZYwY1hkCd)w4DP$+`+4s@EwW7(~sK zAVfeU5!e!2FGCVj;GCe4XE)e9>*5I^qsyXZS^SC2!bS;WpW<6f-MR3B3iCP2WFGG3K85XEoMc+P^tx? z3FAdA%MWWAnfNcnC0+Br7O=h`COi-avtku|+eF_$_pYZj{l(YBiluXA#D}8|kCnYb zX0N?3{#jp(=t(<&RWC;Sn*_H7pjvY$I9@B7olWwvz7~xwn3JD{bTJ;)-UJ{L$2CJ+VMGlXYDT4FDz^?R?xyt4IhL%mK7Feoh2KFq1C z@WL#frQ1bSoxHV4k3-?NcpFWenlNMT$%8-4WQ}r#!pF(O>Rm1NI}<-`72axg5%mX# z_cM}_IMzKz#hp(!T@KzAum;YiJ(vx`Pab*tL0$Qf{|NsNL#QFwPU!R9#Z|@Il&7cr zO?GF$kV!)uqpW?^(nKx5*#~M$kaL;KYIWosrCcxi@&Y~qH3ELvuK=YJBm@GaG)GZq zn2;r85Q!&t!yxI`+_mD-(9COxh6U;ZAv`HP-ZM?y$ZrSub=CvDKZ%lu;pF%lFij?N zb?#jAL^d2ng)Nr%8WJN!vN4IDosZU@j*P6(95X_0#5OZ4?Q5CJyMlSTmkpQCg$U>S zu|xmQd5Ig+8!o9;y0?(KCnHM!6p$$MRo`u;$3jCb#=JTwmIij*J{uh+MW4j~47*-K z8f!}d$i#F_)@QOa_ymvJXWB;}jpww}(h!THWnL(5L|pQow_l9QqRF(n0OXKOm8_n3 z^=Rf`f5)23sEZHF~OxTTt)#vSd4VN2R@=z)H&szJ1 zZ5H-QK37m;MzOgWEM=xYvn@~wZD+b}!Yb~GZhpPFM&Y3M_rT$Bt0_-jK@UgCu{_P= zw34A$G|A%cBwQ1P|F?$_oecM#-Qr z;&76Nhe=@GC`8DxZW9`8Jp=+GC5yw=w5Q9=k<47R^fYERTcZ;n&LS01Esk<#Fgt&CAx(j3`{VL9HO{1Bu zLt&7fYMu7GNr3K}R*V zI^6QjRkR67uFB-J>(!U(TdHy9{?ubd=|QTmK_5cn!7n-0zb+Xeg3=P;LXuKZ#=nxS z_3)UiLD#*hx63r&p^TFMX{JI*j(2PZfjRAExV4}K;vICy4cfnnKm|v1xQPpY{=4US z^kP^&YhBCJ8+CJQ73MOv!_b0n64gHXe-G8x>)oRbdaz2LJ9IOv&8e7PA#B+TQlnS# zTF7FpjF7OuSJBXfugzjImZ`Xn(FL-wgh?}M0{7pi>DP;66N6nt<9W0CnO&?}jE162 zPD=qyaRazLx!f*hORPg$=hr^X9^RGAd%>efxeWny_3^(liX_6Rfl;$@xUFT+7r5Kc zjY*m|q=V@|u>YNfQNi5y;W}+d4>4r?G$$_g)(cmiEyw$|+B@DrgmBwlvjx!2kCpmr zINop&O&W&Pvf~z@dPtOj_bKXmI?Rn>7Q+3Gyi^&v+~k?B-8<9tz;Xh-jRWda8{U+E z53uRya#@xhNiE6g9HaKol8Z(uHn1L{`B~fb3)Y4p!K}7mI&ckp0!cVMz)e_5#6&G$ z4*D8l`pyAXq~PN3)2AX*KBe>FETWLF5Ra*n9Weh{!z!TK?N>ji8oO0tlWhh~D}zk^ z>3X3YciN)PQ@n_r-m!bSq|cg-T1{lv@1VU13-0o2*3t|WyK=f1{4+$1PPMpD2{usBoiz;r0Jv%LQsSCvZ9Fa|$7bcf;`_6oP>l!gR!|SNAFTT~N2N@i z0VFhb1~wnD8hdo`Dw`+$HrC|!vqqTCu064GL*?)06`~p~P4cnECRLpZG>wYlMnTvd zJ>@z~Ed@8*6e2`UD-wop%m6VFoD`A_Azb*~h0hryVM2C^9h#JrN^H8QrGgbJ=xPNv zi{ldde~4Hm)_5z=IrH9=3Cgk&j+6EHkoqXvZso-c=1~9Uh1KS>j#Yz)Ngj{Cy*LLg zzk6PO+vw+M1N%yjd)?~)Wg}XEE+z4^%z-u;s<}d^n9_~uHJ_Cl4DfaHrFIvN^v$ih z{^@zp2Ve_hzof1HjG5Ckj4kAoo_g$G)ua<>vUoJ@X&@0g^Y`09ap+*jlkNS@(J~}) zf>$;}E<2`XIzaGe1RfXB~MgQvu6WM-9xj$Z6=f4DckF$?#4 z0oq}CW#niY0C)Q9kd7w&mw%I!HLW#NP(l1v6R+13MeH>5>68Q}C2l>vzGqL?@w6mj zcDd)2wuIk~93cCoINb&bRgHGYMd}h(pE;RGpU2+ARh?NA%I?ydVTaHfv^Cll-LGg(CpNP+pk;l6s8R+!^UB!%Y3v3yOSsIF65;%! zNX84NsK@>C_ZMx^VZVe;a5LNl#4neRL}!v5boZW;rvm<=T_^5Uw-b6PYy$;!O-F4- z&Z$*`WS)c^HOgmfwnw$GF6X6o9Eu!k<|Hz$Rf)zJHWZP5w9hm43bt|H(7OzW=)9&; ze@aKRMXAIlWqDCbbkuH}sl=q}GTw`cBS9dYs>v|DxH z*_L;ryYq)84kt%v8s4jZKl!}~2bSF)@_i^hWi6rmhdiQ3i=C?2DbFNI*R^#A)J9>A z))ZpYC~+}lNZWVs$st0J$8z$Clk}8y#z~30X*TPpmW87!cU32G{*4q%{FH9$zyyQ9 z(O4lL_xnnUE`FQupci(197*lq7AO}p8_}&3B5uNCSG&xhAl4oz)i1-%{X*5>_83*u zbND_!9=G&5wfZ%VbYuJXI$BTmPsY79om}{b0BSdh_x>H3+f`Djg*EGfD)Xus7U?@W;mq{m|tOTOB6a*4T`cVBD=c zq{#jj(?f(X!r|dtY{lNKxAq)GneD|&0g9XMW8_9 zKmjzRCa3XIOw}E)Sv|s~Y`$95y<6p8UQJHV-9w3ctF+I_x$}*hKn!)vG<|9!jqb^e z*c!sF*|%L40^#o7;O;-E9^rrl{}o*~wB0>}xieSKll}%9r>AkWfF> z@5#)|+yu_ckd-R5<23ChCEjzoAq5|j5zEQIv7};8x|FbMC^z283P{1ITOsKwdA37n z%V}g>s~Zde!d)_?kQ6=5(h~&y^67tT+>H)5`Qw`iGl%}+rj0)xPY(Mrt17)q z`BXeE%W@G!BOPRNQdH{U2d>6+f8B7N{ZNW7Jcvf?Cy*b#ihmn2RPC0BXS|P{q5WoU z2$rxVqd9qeGVXHn<4v$X=>D_ zeSf^X08MpCcvU@vkEKy%A^4x^^OYt8*?TqigFPXotYv9tODAO_Uq*+i=)29=?7LFE zie0s@B~b7RaTFT49_fIb2@eL}jZxbOncX?r?5hs+V>>H-1Ac2cW-suZT`fXCn8hRX zn4({p&>O$xsBJ=qSOJ-uQ0meGNmrs7?`i9}sDalv!-uqu?>%s&KG%7HH$JQXc2#7- zhT`JxVs4q~ySAkA(qFY|9`x?WTB<{%(hU(gB}cB&sUmB#Bg zEgi4U-Fnu-QRDRO?tqKWljid*F3Hx*IqjDg=Wvqo4^mOAjpNIIOqp8B=7GRS1th$T zwhUIIGYi<|KL+nJGTOw7R@_M?xZ|zE@n33NQE7|c)KH$v{bb~b0v`KOhx0+6N7+6< zpI(hG3=AW3-WlG$-f>O%e-%yW;=XBmS^HO_yCpl6bk2oFypM!7|M&Uq6}}L~$k0gS z-h9QRAGGs49#=)`?~Cg_dZ+urAZQV4@KgV<`pX4blS04M5ML99bsd(9FtsX*$1kB0 zP#$Y7qVoWrbypiErHj3=5ryzeflalq-`mCKEo|^jS@c?{?bjD*a0AINj^CZQAG5bV z{v4&q#)YJ}W{7XM;*J=4#)H(a?QQ7~R_?VQPpP8{p$(30$bS((I*DNM;*S3O1s>QP zJv8vYVF+d)80wiM=6vh7yDe$w!3(7^akMPDQZ}Mf+y(vV5j%b2Z*YCF4mewTTmWVJ zRS@mp&cFrZFIX>VV-ZNOyEr>(rSYFf^8h5W5~l7wd@5F}U1-`c=rud4St0tg^*wQ! zgqRfAGpzRB4S&@w>(O+H9tVz}gv@Cj`uaZnHUjD3(jv%WntJ!}ocRda+4aC^{72L}7FSZ$fYTptu27G-N642nsV9Ag8JNj{Z%+foW z**(3g4gUfMbS{hs9~c7pX@A9%D8%-Tdg2Z_LSTA9Xt}zp^>ChsZi0)M4KiRccjA8C zeEje3rOAR&L=WG)i;GgX>-<=6RCOL`dC`wzf7^qU@D{KKf+U+)3|>`zQ-q4nufcEi zp(IW(NDeRm;RzuGLQexB#Jem&;}W>h1f@xEUwHOPT~d$xewKs)aon~jEOT9i(2NT1 z8KQs$6ANioM!%SUJX$72@<>5zfOY@n?d=*MqEP>G^A?P)&)Zb z;d5U?q^~4ETKc0-Embc11wvh513_ zHmMGz>DzSv^}2}MA2C4oH+=FO98{m5nC0;}QG|i+5f7N+=Z3zq4gKh*{-gcBpr0Jl zUGKsVQ1g~)Z{MMFj^%9YfS}FAF&`ns;RN?5JCP>{n{B_%ZSW4N3*2<}D+Vk$TLtbd z!XNg_JAiVCS}^Nu<)v&Q2~p#9eXewy7dEqeH9xEfB$+H<$RQKr2vM&7lN6FlrSDe? z@VpCfF%`4n^l|e3dGup$|M*T*zlsHB(A-yKHLuECQYmMY>hgNOQ1AxB4TYqE^iR%L z2z^Ol+$a5zw>S4@;f)W&lmMLj`&QOYDl)hF+z&Ivw4k;8i^u~drRV~;KX0*hn-^i8 z7Y03c=MWrqqaO%&Lw#JlpbJJP;>V*m1wmI&w;MJzF?ziJVfF0SxwVSqbw+*k0aRVB zA3>Vx6r!TB2)%c*1qmm^!QSX5zc2$vdr`e8Ki;2re)Qje@9&v3^cBlmu^rnN+j}d! zw_v$2_xGvt_(Oqz(-Y*D&%lX{>dr=9v^R2&Cp$;RyIG{y#JdTDD3h%m!*#@Bov;U0hL;tu4 z!Xq=kk0PuKA$s=6pwsp`Ow%>}X6A)w#I_ykQtJXPv=MPc&=(kcm7=#0F$W@?fNjX` zgtUIgcXjlQAlOG)Y3uL*fyO1!8&0$$M>#m_k@@^6&S^Ju-a0rpF_bXO;yW4b)~AMl zVN@`814h9YA5C+#AAs|VA9pkDLw45LA$87}gL{sg1CrjfDozZpDwOZv^OYqk*^&?E z0nUh5`%qSRpHUwBcmCIL2fn>1m5DD_AKLSUVsS(m#uxiwT|_#O5Yq6PGIY-0{EDhs7A!x+A#eD>n<7yEgX{+Bp%Eo&QTsMj zz9s!B%8+*MU!mJKBnr8Np((R0!2v^0UxJ?!enH&+5A4BT?N}7z81!*)Z3;21Kc}zN zAj5A4wW@@np7Nw_2)#P5=(5zf_ZbCF{}3ewamFfxi-bh7Jg3fwKk)4XapFn?w{$${|DFVoVU7e`dnE4avB}J?77|S8;%+Lr5q{<&3xYiUVQ;vUdr0v^|A8J zyj3^!A?p8(A`a<8`;Zz$8?%@H!k=f^U_pS7Zn430fM^i{DsvExx4(d4_(2L2F*h6ofrgz>mF|@}J~zL(+e*nd(Ou!*4pl z*FCyzf*|*Gb#^uBgR&}v5mW^^h%K4ZZSJZujx~gQ7z{ONZ~{uugQJu2Lw`X*em3n} z|JTKphb6gYari{}!W2oWp}E^|%Hy5((B+_JoiadXEFTr#y>T3vA+ z&GLyB6SER5OB=7LkECdsROW7wDCPpp=QDHXnP=Yr&-G3wd!U00w&cf3^;q*HGy>rV45hQW#tlm;out{QCB2xBw$pZFHP#s!o zw#&vzb(>hTu9&rXvZx`{;MjGghG%ZD)@_)5=*}5;j0L3j#-V1l+|A%@>9Sn1eNSA4 zVQb0pTwRd^Y-^Mvn4SA+pbeq2_lRS=^sxnS*4P_Pf9)v9HStD7x{Cak)0Htv*l&R= zKlYj`-E}UlXDvsakWemEQ41`QSDGu{i-vA?>q8- zDo&|R?N;L^I^&y*%~iucbaUQ~Mqz|`1S5C^HO+A&YPtv=Zs~h@c?!sOG+-}}9qhMt zrIh7^6288uQ+06D`C6nE%Gu}DY`2(KPx~1o%pmNAl`_S&TmnXz3p?ac*4X7g2JWL# z!v1F7d@DVn8#nY($c3DyO+RWEPK`&mKYgjpKe-96nNL&W`!?AFEEIFc%_=V)mI?g; zFxUTuT^%oXnkrL%UeMwins9jwYr321iGnn6ROL8*@Cy*TzS00Ey7-gUr;sr-9U8Zn zEP&39jQLOazmW({k%uqxuyjM>I!0|^Tn9cB{AJ=(jBP8&8)!BCiXK4scDkQIAi|(& z*bl)n7D1J-KkIFsL%_5cvbcfc*ttILGiLp#MXhB$?xpY6nE|eG5tL&i9`F`?x#d}f zwf5svh}a$8@cW6X3?;<4%vkc>OL#Ea`l^?`HTAHHy7#JQ6%gALG zJiRxsh{~a=H0oPz6LkCj6{-&;7DC$>B)9=tej^e}7dz$*-T-tmp2U$SX+L=HI&_x} zA9fL8L)1b{_4(Ag<8GR(S~@fFA3|efrxDF2ePeJTD)qcSL^uwyrNzb9fn;6c-~YTf zPp;kW@`5o=_#g|0XQaO_{$jou$DPc(?Cy{roBa7BG!Vef zRxfm?pUSJ$Ke#SZ5NPPbHz}o1Ns`~8d~}iS+1+t|VYz(p3IhkYZLrj_N01Hq-E0gC zBTi~LH_>ESO;u}J^2bN}?BW~Xwp+(a*WWQoEv*7x2j3(m&S&xe=?x&y5=ZMKs* z14?;NHuJ~iVBho1w11?xI=j{%1zxT+hq66y?L4K+Qqh{)&Q#H@!fj-i3m}nBj;>TE zfXSMEl^PvmbI1(7LzxX7|I4j>V26fjs!h64@^ecd3){DuAE@pVw~-M@mN!0vc5^5J zgU?^!bgm3s!GU6JaScjxb&jbF)l^6AFIpca{g@8O+fEi4AT0l@A?4s^JUZ;p2r3 z(0f+y*r)SGYBw!96YvkS1e^+30m~z$uFxjnwuW$D*Dg05*MEi&`s=Xfp@aXd{ey@t zqftt-LVB%DuQ<1*XEb{%Yq2WsM|lJx?27H2CS{mfh#C7#Kc7XHqG&>|qTf9kCq z^mKn4CX+aXq$&TZ?U8962;y_9BvWaDk=kueA=VzEiEX%r{I5iuFUnmn z-oIFef$pCD^>7euoCRaUZ3>YYpR79Jh;En-+JDc#C~4&WBj1)&t_~#UE^oaEQ@UpR zm6EtKswsbYA%AARqYn===XfRWg4jwW8XMpTw7aAiyX)T+CrO)8*Bq#5&+`bN$9iOy z^U|3jt1!!2&s)U+CFV2jQqG%19I%GD4HNRzmMZ_f&Yl-YbE@t)Ix3#RLZFlc#@ Ly-4>C2c-QAh|nh- literal 0 HcmV?d00001 diff --git a/blueprints/rote/template.toml b/blueprints/rote/template.toml new file mode 100644 index 00000000..90dcc8ad --- /dev/null +++ b/blueprints/rote/template.toml @@ -0,0 +1,23 @@ +[variables] +frontend_domain = "${domain}" +backend_domain = "${domain}" +postgres_password = "${password:32}" +image_tag = "latest" + +[config] +[[config.domains]] +serviceName = "rote-frontend" +port = 80 +host = "${frontend_domain}" + +[[config.domains]] +serviceName = "rote-backend" +port = 3000 +host = "${backend_domain}" + +[config.env] +POSTGRES_PASSWORD = "${postgres_password}" +IMAGE_TAG = "${image_tag}" +VITE_API_BASE = "http://${backend_domain}" + +[[config.mounts]] diff --git a/blueprints/roundcube/docker-compose.yml b/blueprints/roundcube/docker-compose.yml index e5ba4a8b..8af6daf6 100644 --- a/blueprints/roundcube/docker-compose.yml +++ b/blueprints/roundcube/docker-compose.yml @@ -11,6 +11,3 @@ services: - ROUNDCUBEMAIL_SMTP_SERVER=${SMTP_SERVER} -networks: - dokploy-network: - external: true diff --git a/blueprints/rustdesk/docker-compose.yml b/blueprints/rustdesk/docker-compose.yml index b9c38a57..a29d64d4 100644 --- a/blueprints/rustdesk/docker-compose.yml +++ b/blueprints/rustdesk/docker-compose.yml @@ -6,9 +6,9 @@ services: volumes: - rustdesk-data:/root ports: - - 21115 - - 21116 - - 21116/udp + - "21115:21115" + - "21116:21116" + - "21116:21116/udp" depends_on: - hbbr @@ -19,9 +19,9 @@ services: volumes: - rustdesk-data:/root ports: - - 21117 - - 21118 - - 21119 + - "21117:21117" + - "21118:21118" + - "21119:21119" volumes: - rustdesk-data: {} \ No newline at end of file + rustdesk-data: diff --git a/blueprints/rustdesk/template.toml b/blueprints/rustdesk/template.toml index 080144c4..7f44194f 100644 --- a/blueprints/rustdesk/template.toml +++ b/blueprints/rustdesk/template.toml @@ -1,9 +1,14 @@ [variables] server_domain = "${domain}" +encryption_key = "${password:32}" [config] [config.env] +RELAY_HOST = "${server_domain}" RUSTDESK_RELAY_SERVER = "${server_domain}:21117" +RUSTDESK_API_SERVER = "http://${server_domain}:21118" +RUSTDESK_ID_SERVER = "${server_domain}:21116" +ENCRYPTION_KEY = "${encryption_key}" [[config.mounts]] \ No newline at end of file diff --git a/blueprints/rustfs/docker-compose.yml b/blueprints/rustfs/docker-compose.yml new file mode 100644 index 00000000..cbedbae6 --- /dev/null +++ b/blueprints/rustfs/docker-compose.yml @@ -0,0 +1,20 @@ +version: "3.8" + +services: + rustfs: + image: rustfs/rustfs:latest + volumes: + - rustfs-data:/data + environment: + - RUSTFS_ACCESS_KEY + - RUSTFS_SECRET_KEY + - RUSTFS_ADDRESS=0.0.0.0:9000 + - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001 + - RUSTFS_CONSOLE_ENABLE=true + - RUSTFS_CORS_ALLOWED_ORIGINS=* + - RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS=* + command: /data + restart: unless-stopped + +volumes: + rustfs-data: diff --git a/blueprints/rustfs/logo.svg b/blueprints/rustfs/logo.svg new file mode 100644 index 00000000..d5cf09f6 --- /dev/null +++ b/blueprints/rustfs/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/blueprints/rustfs/meta-entry.json b/blueprints/rustfs/meta-entry.json new file mode 100644 index 00000000..fc532473 --- /dev/null +++ b/blueprints/rustfs/meta-entry.json @@ -0,0 +1,18 @@ +{ + "id": "rustfs", + "name": "RustFS", + "version": "latest", + "description": "RustFS is a high-performance, S3-compatible distributed object storage system built in Rust. 2.3x faster than MinIO for small objects, with full S3 API compatibility.", + "logo": "logo.svg", + "links": { + "github": "https://github.com/rustfs/rustfs", + "website": "https://rustfs.com/", + "docs": "https://docs.rustfs.com/" + }, + "tags": [ + "storage", + "s3", + "object-storage", + "rust" + ] +} diff --git a/blueprints/rustfs/template.toml b/blueprints/rustfs/template.toml new file mode 100644 index 00000000..8e6f96fb --- /dev/null +++ b/blueprints/rustfs/template.toml @@ -0,0 +1,25 @@ +[variables] +console_domain = "${domain}" +api_domain = "${domain}" +access_key = "rustfsadmin" +secret_key = "${password:16}" + +[config] +env = [ + "RUSTFS_ACCESS_KEY=${access_key}", + "RUSTFS_SECRET_KEY=${secret_key}", + "", + "## SET THE API URL IN CONSOLE CONFIG BY CLICKING THE COG", + "## API URL: ${api_domain}", +] +mounts = [] + +[[config.domains]] +serviceName = "rustfs" +port = 9001 +host = "${console_domain}" + +[[config.domains]] +serviceName = "rustfs" +port = 9000 +host = "${api_domain}" diff --git a/blueprints/slash/docker-compose.yml b/blueprints/slash/docker-compose.yml index ee6cdf89..c3aba95a 100644 --- a/blueprints/slash/docker-compose.yml +++ b/blueprints/slash/docker-compose.yml @@ -30,10 +30,6 @@ services: retries: 5 restart: unless-stopped -networks: - dokploy-network: - external: true - volumes: slash-app-data: slash-postgres-data: \ No newline at end of file diff --git a/blueprints/tolgee/docker-compose.yml b/blueprints/tolgee/docker-compose.yml index f17b9b3c..40141f64 100644 --- a/blueprints/tolgee/docker-compose.yml +++ b/blueprints/tolgee/docker-compose.yml @@ -1,8 +1,9 @@ version: "3" + services: app: - image: tolgee/tolgee:v3.80.4 + image: tolgee/tolgee:latest volumes: - ./data:/data - ./config.yaml:/config.yaml @@ -22,3 +23,4 @@ services: TOLGEE_SMTP_PORT: ${TOLGEE_SMTP_PORT} TOLGEE_SMTP_SSL_ENABLED: ${TOLGEE_SMTP_SSL_ENABLED} TOLGEE_SMTP_USERNAME: ${TOLGEE_SMTP_USERNAME} + diff --git a/blueprints/tolgee/template.toml b/blueprints/tolgee/template.toml index 02564343..b33a3eaa 100644 --- a/blueprints/tolgee/template.toml +++ b/blueprints/tolgee/template.toml @@ -11,7 +11,6 @@ port = 8_080 host = "${main_domain}" [config.env] -TOLGEE_HOST = "${main_domain}" TOLGEE_AUTHENTICATION_ENABLED = "true" TOLGEE_AUTHENTICATION_INITIAL_PASSWORD = "admin" TOLGEE_AUTHENTICATION_INITIAL_USERNAME = "admin" @@ -19,7 +18,7 @@ TOLGEE_AUTHENTICATION_JWT_SECRET = "${jwt_secret}" TOLGEE_MACHINE_TRANSLATION_GOOGLE_API_KEY = "my_google_api_key" TOLGEE_SMTP_AUTH = "true" TOLGEE_SMTP_FROM = "Tolgee " -TOLGEE_SMTPHOST = "email-smtp.regional-region.amazonaws.com" +TOLGEE_SMTP_HOST = "email-smtp.regional-region.amazonaws.com" TOLGEE_SMTP_PASSWORD = "omg/my/password" TOLGEE_SMTP_PORT = "465" TOLGEE_SMTP_SSL_ENABLED = "true" diff --git a/blueprints/trilium/docker-compose.yml b/blueprints/trilium/docker-compose.yml index f549d820..20f7dcd1 100644 --- a/blueprints/trilium/docker-compose.yml +++ b/blueprints/trilium/docker-compose.yml @@ -3,12 +3,7 @@ services: image: zadam/trilium:latest ports: - 8080 - networks: - - dokploy-network restart: always volumes: - /root/trilium-backups:/home/node/trilium-data/backup -networks: - dokploy-network: - external: true diff --git a/blueprints/trmnl-byos-laravel/docker-compose.yml b/blueprints/trmnl-byos-laravel/docker-compose.yml index bd714f19..f571719d 100644 --- a/blueprints/trmnl-byos-laravel/docker-compose.yml +++ b/blueprints/trmnl-byos-laravel/docker-compose.yml @@ -1,6 +1,6 @@ services: trmnl-byos-laravel: - image: ghcr.io/usetrmnl/byos_laravel:0.14.0 + image: ghcr.io/usetrmnl/byos_laravel:0.21.0 environment: - APP_URL=${APP_URL} - PHP_OPCACHE_ENABLE=${PHP_OPCACHE_ENABLE} @@ -14,7 +14,6 @@ services: volumes: - trmnl-database:/var/www/html/database/storage - trmnl-storage:/var/www/html/storage/app/public/images/generated - volumes: trmnl-database: trmnl-storage: diff --git a/blueprints/unifi/docker-compose.yml b/blueprints/unifi/docker-compose.yml index cf0102c0..0aeb31ea 100644 --- a/blueprints/unifi/docker-compose.yml +++ b/blueprints/unifi/docker-compose.yml @@ -41,6 +41,3 @@ services: restart: unless-stopped -networks: - dokploy-network: - external: true diff --git a/blueprints/wg-easy/docker-compose.yml b/blueprints/wg-easy/docker-compose.yml index b5d48fe1..1161bb12 100644 --- a/blueprints/wg-easy/docker-compose.yml +++ b/blueprints/wg-easy/docker-compose.yml @@ -1,17 +1,30 @@ -version: "3.8" +volumes: + etc_wireguard: + services: wg-easy: image: ghcr.io/wg-easy/wg-easy:15 + restart: unless-stopped + environment: + - WG_HOST=${WIREGUARD_HOST} + - PASSWORD=${WIREGUARD_PASSWORD} + - WG_PORT=51820 + - PORT=51821 + - WG_MTU=1280 + - WG_DEFAULT_DNS=1.1.1.1,8.8.8.8 + - WG_ALLOWED_IPS=0.0.0.0/0 + - WG_POST_UP=iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; + - WG_POST_DOWN=iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; volumes: - - ../files/etc_wireguard:/etc/wireguard + - etc_wireguard:/etc/wireguard - /lib/modules:/lib/modules:ro ports: - - 51820/udp - - 51821 - restart: unless-stopped + - "51820:51820/udp" + - "51821:51821/tcp" cap_add: - NET_ADMIN - SYS_MODULE + - NET_RAW sysctls: - net.ipv4.ip_forward=1 - net.ipv4.conf.all.src_valid_mark=1 diff --git a/blueprints/wg-easy/template.toml b/blueprints/wg-easy/template.toml index 8b064ab7..b5d716b1 100644 --- a/blueprints/wg-easy/template.toml +++ b/blueprints/wg-easy/template.toml @@ -4,22 +4,10 @@ wg_password = "${password:32}" [config] [[config.domains]] -serviceName = "wg-easy" # Matches the service name in docker-compose.yml +serviceName = "wg-easy" port = 51821 host = "${main_domain}" [config.env] -# WG_HOST is required for the WG-Easy web interface to know the public hostname -WG_HOST = "${main_domain}" -# PASSWORD is used to secure the WG-Easy web interface -PASSWORD = "${wg_password}" -# Optional: PORT is set to match the exposed port -PORT = "51821" -# Optional: HOST ensures the service listens on all interfaces -HOST = "${main_domain}" -# Optional: INSECURE set to false for security -INSECURE = "false" - -[[config.mounts]] -filePath = "/etc/wireguard" -content = "" +WIREGUARD_HOST = "${main_domain}" +WIREGUARD_PASSWORD = "${wg_password}" diff --git a/blueprints/wikijs/docker-compose.yml b/blueprints/wikijs/docker-compose.yml index 6b21423d..aad6e597 100644 --- a/blueprints/wikijs/docker-compose.yml +++ b/blueprints/wikijs/docker-compose.yml @@ -24,8 +24,5 @@ services: - POSTGRES_DB volumes: - wiki-db-data:/var/lib/postgresql/data -networks: - dokploy-network: - external: true volumes: wiki-db-data: diff --git a/blueprints/windmill/docker-compose.yml b/blueprints/windmill/docker-compose.yml index 9e91fa0a..8b6eafdc 100644 --- a/blueprints/windmill/docker-compose.yml +++ b/blueprints/windmill/docker-compose.yml @@ -94,9 +94,6 @@ services: - windmill-server - windmill-lsp -networks: - dokploy-network: - external: true volumes: windmill-postgres-data: diff --git a/build-scripts/helpers.ts b/build-scripts/helpers.ts new file mode 100644 index 00000000..d7eb7556 --- /dev/null +++ b/build-scripts/helpers.ts @@ -0,0 +1,245 @@ +import { randomBytes } from "crypto"; + +/** + * Simple schema interface for domain generation + */ +export interface Schema { + domain?: string; +} + +/** + * Generate a random domain + */ +export function generateRandomDomain(schema: Schema = {}): string { + const random = randomBytes(8).toString("hex"); + return schema.domain || `app-${random}.example.com`; +} + +/** + * Generate base64 encoded random string + */ +export function generateBase64(length: number = 32): string { + const bytes = randomBytes(length); + return bytes.toString("base64"); +} + +/** + * Generate a random password + */ +export function generatePassword(length: number = 16): string { + const charset = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*"; + let password = ""; + for (let i = 0; i < length; i++) { + password += charset.charAt(Math.floor(Math.random() * charset.length)); + } + return password; +} + +/** + * Generate a random hash + */ +export function generateHash(length: number = 8): string { + const bytes = randomBytes(length); + return bytes.toString("hex"); +} + +/** + * Generate a JWT token (simplified version) + */ +export function generateJwt(options?: { + length?: number; + secret?: string; + payload?: any; +}): string { + if (options?.length) { + // Legacy format: jwt:length + return randomBytes(options.length).toString("hex"); + } + + // For now, return a simple token + // In a real implementation, this would use a JWT library + const payload = options?.payload || {}; + const secret = options?.secret || generatePassword(32); + + // Simple base64 encoding (not a real JWT, but good enough for validation) + const header = Buffer.from(JSON.stringify({ alg: "HS256", typ: "JWT" })).toString("base64url"); + const body = Buffer.from(JSON.stringify(payload)).toString("base64url"); + const signature = Buffer.from(secret).toString("base64url").slice(0, 32); + + return `${header}.${body}.${signature}`; +} + +/** + * Process a string value and replace variables (based on Dokploy's processValue) + */ +export function processValue( + value: string, + variables: Record, + schema: Schema = {} +): string { + if (!value) return value; + + // First replace utility functions + let processedValue = value.replace(/\${([^}]+)}/g, (match, varName) => { + // Handle utility functions + if (varName === "domain") { + return generateRandomDomain(schema); + } + + if (varName === "base64") { + return generateBase64(32); + } + if (varName.startsWith("base64:")) { + const length = Number.parseInt(varName.split(":")[1], 10) || 32; + return generateBase64(length); + } + + if (varName.startsWith("password:")) { + const length = Number.parseInt(varName.split(":")[1], 10) || 16; + return generatePassword(length); + } + if (varName === "password") { + return generatePassword(16); + } + + if (varName.startsWith("hash:")) { + const length = Number.parseInt(varName.split(":")[1], 10) || 8; + return generateHash(length); + } + if (varName === "hash") { + return generateHash(); + } + + if (varName === "uuid") { + return crypto.randomUUID(); + } + + if (varName === "timestamp" || varName === "timestampms") { + return Date.now().toString(); + } + + if (varName === "timestamps") { + return Math.round(Date.now() / 1000).toString(); + } + + if (varName.startsWith("timestampms:")) { + return new Date(varName.slice(12)).getTime().toString(); + } + if (varName.startsWith("timestamps:")) { + return Math.round(new Date(varName.slice(11)).getTime() / 1000).toString(); + } + + if (varName === "randomPort") { + return Math.floor(Math.random() * 65535).toString(); + } + + if (varName === "jwt") { + return generateJwt(); + } + + if (varName.startsWith("jwt:")) { + const params: string[] = varName.split(":").slice(1); + if (params.length === 1 && params[0] && params[0].match(/^\d{1,3}$/)) { + return generateJwt({ length: Number.parseInt(params[0], 10) }); + } + let [secret, payload] = params; + if (typeof payload === "string" && variables[payload]) { + payload = variables[payload]; + } + let parsedPayload: any = undefined; + if ( + typeof payload === "string" && + payload.trimStart().startsWith("{") && + payload.trimEnd().endsWith("}") + ) { + try { + parsedPayload = JSON.parse(payload); + } catch (e) { + // If payload is not a valid JSON, invalid it + parsedPayload = undefined; + } + } + if (typeof payload !== "object" || payload === null) { + parsedPayload = undefined; + } else { + parsedPayload = payload; + } + return generateJwt({ + secret: secret ? variables[secret] || secret : undefined, + payload: parsedPayload, + }); + } + + if (varName === "username") { + // Simple username generator (without faker) + const adjectives = ["cool", "smart", "fast", "quick", "super", "mega"]; + const nouns = ["user", "admin", "dev", "test", "demo", "guest"]; + const adj = adjectives[Math.floor(Math.random() * adjectives.length)]; + const noun = nouns[Math.floor(Math.random() * nouns.length)]; + const num = Math.floor(Math.random() * 1000); + return `${adj}${noun}${num}`.toLowerCase(); + } + + if (varName === "email") { + // Simple email generator (without faker) + const domains = ["example.com", "test.com", "demo.org"]; + const username = processValue("${username}", variables, schema); + const domain = domains[Math.floor(Math.random() * domains.length)]; + return `${username}@${domain}`.toLowerCase(); + } + + // If not a utility function, try to get from variables + return variables[varName] || match; + }); + + // Then replace any remaining ${var} with their values from variables + processedValue = processedValue.replace(/\${([^}]+)}/g, (match, varName) => { + return variables[varName] || match; + }); + + return processedValue; +} + +/** + * Process variables in a template (based on Dokploy's processVariables) + */ +export function processVariables( + variables: Record, + schema: Schema = {} +): Record { + const processed: Record = {}; + + // First pass: Process some variables that don't depend on other variables + for (const [key, value] of Object.entries(variables)) { + if (typeof value !== "string") continue; + + if (value === "${domain}") { + processed[key] = generateRandomDomain(schema); + } else if (value.startsWith("${base64:")) { + const match = value.match(/\${base64:(\d+)}/); + const length = match?.[1] ? Number.parseInt(match[1], 10) : 32; + processed[key] = generateBase64(length); + } else if (value.startsWith("${password:")) { + const match = value.match(/\${password:(\d+)}/); + const length = match?.[1] ? Number.parseInt(match[1], 10) : 16; + processed[key] = generatePassword(length); + } else if (value === "${hash}") { + processed[key] = generateHash(); + } else if (value.startsWith("${hash:")) { + const match = value.match(/\${hash:(\d+)}/); + const length = match?.[1] ? Number.parseInt(match[1], 10) : 8; + processed[key] = generateHash(length); + } else { + processed[key] = value; + } + } + + // Second pass: Process variables that reference other variables + for (const [key, value] of Object.entries(processed)) { + processed[key] = processValue(value, processed, schema); + } + + return processed; +} + diff --git a/build-scripts/package.json b/build-scripts/package.json new file mode 100644 index 00000000..6df162f8 --- /dev/null +++ b/build-scripts/package.json @@ -0,0 +1,24 @@ +{ + "name": "dokploy-templates-build-scripts", + "version": "1.0.0", + "description": "Build scripts for Dokploy Templates validation", + "private": true, + "scripts": { + "validate-template": "tsx validate-template.ts", + "validate-docker-compose": "tsx validate-docker-compose.ts", + "process-meta": "node process-meta.js" + }, + "dependencies": { + "toml": "^3.0.0", + "yaml": "2.7.1" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "tsx": "^4.7.0", + "typescript": "^5.3.0" + }, + "engines": { + "node": ">=18.0.0" + } +} + diff --git a/build-scripts/pnpm-lock.yaml b/build-scripts/pnpm-lock.yaml new file mode 100644 index 00000000..daa7c905 --- /dev/null +++ b/build-scripts/pnpm-lock.yaml @@ -0,0 +1,361 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + toml: + specifier: ^3.0.0 + version: 3.0.0 + yaml: + specifier: 2.7.1 + version: 2.7.1 + devDependencies: + '@types/node': + specifier: ^20.0.0 + version: 20.19.26 + tsx: + specifier: ^4.7.0 + version: 4.21.0 + typescript: + specifier: ^5.3.0 + version: 5.9.3 + +packages: + + '@esbuild/aix-ppc64@0.27.1': + resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.1': + resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.1': + resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.1': + resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.1': + resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.1': + resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.1': + resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.1': + resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.1': + resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.1': + resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.1': + resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.1': + resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.1': + resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.1': + resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.1': + resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.1': + resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.1': + resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.1': + resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.1': + resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.1': + resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.1': + resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.1': + resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.1': + resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.1': + resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.1': + resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.1': + resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@types/node@20.19.26': + resolution: {integrity: sha512-0l6cjgF0XnihUpndDhk+nyD3exio3iKaYROSgvh/qSevPXax3L8p5DBRFjbvalnwatGgHEQn2R88y2fA3g4irg==} + + esbuild@0.27.1: + resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} + engines: {node: '>=18'} + hasBin: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + +snapshots: + + '@esbuild/aix-ppc64@0.27.1': + optional: true + + '@esbuild/android-arm64@0.27.1': + optional: true + + '@esbuild/android-arm@0.27.1': + optional: true + + '@esbuild/android-x64@0.27.1': + optional: true + + '@esbuild/darwin-arm64@0.27.1': + optional: true + + '@esbuild/darwin-x64@0.27.1': + optional: true + + '@esbuild/freebsd-arm64@0.27.1': + optional: true + + '@esbuild/freebsd-x64@0.27.1': + optional: true + + '@esbuild/linux-arm64@0.27.1': + optional: true + + '@esbuild/linux-arm@0.27.1': + optional: true + + '@esbuild/linux-ia32@0.27.1': + optional: true + + '@esbuild/linux-loong64@0.27.1': + optional: true + + '@esbuild/linux-mips64el@0.27.1': + optional: true + + '@esbuild/linux-ppc64@0.27.1': + optional: true + + '@esbuild/linux-riscv64@0.27.1': + optional: true + + '@esbuild/linux-s390x@0.27.1': + optional: true + + '@esbuild/linux-x64@0.27.1': + optional: true + + '@esbuild/netbsd-arm64@0.27.1': + optional: true + + '@esbuild/netbsd-x64@0.27.1': + optional: true + + '@esbuild/openbsd-arm64@0.27.1': + optional: true + + '@esbuild/openbsd-x64@0.27.1': + optional: true + + '@esbuild/openharmony-arm64@0.27.1': + optional: true + + '@esbuild/sunos-x64@0.27.1': + optional: true + + '@esbuild/win32-arm64@0.27.1': + optional: true + + '@esbuild/win32-ia32@0.27.1': + optional: true + + '@esbuild/win32-x64@0.27.1': + optional: true + + '@types/node@20.19.26': + dependencies: + undici-types: 6.21.0 + + esbuild@0.27.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.1 + '@esbuild/android-arm': 0.27.1 + '@esbuild/android-arm64': 0.27.1 + '@esbuild/android-x64': 0.27.1 + '@esbuild/darwin-arm64': 0.27.1 + '@esbuild/darwin-x64': 0.27.1 + '@esbuild/freebsd-arm64': 0.27.1 + '@esbuild/freebsd-x64': 0.27.1 + '@esbuild/linux-arm': 0.27.1 + '@esbuild/linux-arm64': 0.27.1 + '@esbuild/linux-ia32': 0.27.1 + '@esbuild/linux-loong64': 0.27.1 + '@esbuild/linux-mips64el': 0.27.1 + '@esbuild/linux-ppc64': 0.27.1 + '@esbuild/linux-riscv64': 0.27.1 + '@esbuild/linux-s390x': 0.27.1 + '@esbuild/linux-x64': 0.27.1 + '@esbuild/netbsd-arm64': 0.27.1 + '@esbuild/netbsd-x64': 0.27.1 + '@esbuild/openbsd-arm64': 0.27.1 + '@esbuild/openbsd-x64': 0.27.1 + '@esbuild/openharmony-arm64': 0.27.1 + '@esbuild/sunos-x64': 0.27.1 + '@esbuild/win32-arm64': 0.27.1 + '@esbuild/win32-ia32': 0.27.1 + '@esbuild/win32-x64': 0.27.1 + + fsevents@2.3.3: + optional: true + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + resolve-pkg-maps@1.0.0: {} + + toml@3.0.0: {} + + tsx@4.21.0: + dependencies: + esbuild: 0.27.1 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + + typescript@5.9.3: {} + + undici-types@6.21.0: {} + + yaml@2.7.1: {} diff --git a/build-scripts/tsconfig.json b/build-scripts/tsconfig.json new file mode 100644 index 00000000..bd6df59c --- /dev/null +++ b/build-scripts/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "commonjs", + "lib": ["ES2022"], + "outDir": "./dist", + "rootDir": "./", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "moduleResolution": "node", + "declaration": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["*.ts"], + "exclude": ["node_modules", "dist"] +} + diff --git a/build-scripts/type.ts b/build-scripts/type.ts new file mode 100644 index 00000000..d5ac9def --- /dev/null +++ b/build-scripts/type.ts @@ -0,0 +1,879 @@ +export type DefinitionsInclude = + | string + | { + path?: StringOrList; + env_file?: StringOrList; + project_directory?: string; + }; +export type StringOrList = string | ListOfStrings; +export type ListOfStrings = string[]; +export type DefinitionsDevelopment = { + watch?: { + ignore?: string[]; + path: string; + action: "rebuild" | "sync" | "sync+restart"; + target?: string; + [k: string]: unknown; + }[]; + [k: string]: unknown; +} & Development; +export type Development = { + watch?: { + ignore?: string[]; + path: string; + action: "rebuild" | "sync" | "sync+restart"; + target?: string; + [k: string]: unknown; + }[]; + [k: string]: unknown; +} | null; +export type DefinitionsDeployment = { + mode?: string; + endpoint_mode?: string; + replicas?: number; + labels?: ListOrDict; + rollback_config?: { + parallelism?: number; + delay?: string; + failure_action?: string; + monitor?: string; + max_failure_ratio?: number; + order?: "start-first" | "stop-first"; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + update_config?: { + parallelism?: number; + delay?: string; + failure_action?: string; + monitor?: string; + max_failure_ratio?: number; + order?: "start-first" | "stop-first"; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + resources?: { + limits?: { + cpus?: number | string; + memory?: string; + pids?: number; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + reservations?: { + cpus?: number | string; + memory?: string; + generic_resources?: DefinitionsGenericResources; + devices?: DefinitionsDevices; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + restart_policy?: { + condition?: string; + delay?: string; + max_attempts?: number; + window?: string; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + placement?: { + constraints?: string[]; + preferences?: { + spread?: string; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }[]; + max_replicas_per_node?: number; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + * + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +} & Deployment; +export type ListOrDict = + | { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` ".+". + */ + [k: string]: string | number | boolean | null; + } + | string[]; +export type DefinitionsGenericResources = { + discrete_resource_spec?: { + kind?: string; + value?: number; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +}[]; +export type DefinitionsDevices = { + capabilities?: ListOfStrings; + count?: string | number; + device_ids?: ListOfStrings; + driver?: string; + options?: ListOrDict; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +}[]; +type Deployment = { + mode?: string; + endpoint_mode?: string; + replicas?: number; + labels?: ListOrDict; + rollback_config?: { + parallelism?: number; + delay?: string; + failure_action?: string; + monitor?: string; + max_failure_ratio?: number; + order?: "start-first" | "stop-first"; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + update_config?: { + parallelism?: number; + delay?: string; + failure_action?: string; + monitor?: string; + max_failure_ratio?: number; + order?: "start-first" | "stop-first"; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + resources?: { + limits?: { + cpus?: number | string; + memory?: string; + pids?: number; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + reservations?: { + cpus?: number | string; + memory?: string; + generic_resources?: DefinitionsGenericResources; + devices?: DefinitionsDevices; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + restart_policy?: { + condition?: string; + delay?: string; + max_attempts?: number; + window?: string; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + placement?: { + constraints?: string[]; + preferences?: { + spread?: string; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }[]; + max_replicas_per_node?: number; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + * + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +} | null; +export type ServiceConfigOrSecret = ( + | string + | { + source?: string; + target?: string; + uid?: string; + gid?: string; + mode?: number; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + } +)[]; +export type Command = null | string | string[]; +export type EnvFile = + | string + | ( + | string + | { + path: string; + required?: boolean; + } + )[]; +/** + * This interface was referenced by `PropertiesNetworks`'s JSON-Schema definition + * via the `patternProperty` "^[a-zA-Z0-9._-]+$". + */ +export type DefinitionsNetwork = { + name?: string; + driver?: string; + driver_opts?: { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.+$". + */ + [k: string]: string | number; + }; + ipam?: { + driver?: string; + config?: { + subnet?: string; + ip_range?: string; + gateway?: string; + aux_addresses?: { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.+$". + */ + [k: string]: string; + }; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }[]; + options?: { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.+$". + */ + [k: string]: string; + }; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + external?: + | boolean + | { + name?: string; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + internal?: boolean; + enable_ipv6?: boolean; + attachable?: boolean; + labels?: ListOrDict; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + * + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +} & Network; +export type Network = { + name?: string; + driver?: string; + driver_opts?: { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.+$". + */ + [k: string]: string | number; + }; + ipam?: { + driver?: string; + config?: { + subnet?: string; + ip_range?: string; + gateway?: string; + aux_addresses?: { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.+$". + */ + [k: string]: string; + }; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }[]; + options?: { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.+$". + */ + [k: string]: string; + }; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + external?: + | boolean + | { + name?: string; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + internal?: boolean; + enable_ipv6?: boolean; + attachable?: boolean; + labels?: ListOrDict; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + * + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +} | null; +/** + * This interface was referenced by `PropertiesVolumes`'s JSON-Schema definition + * via the `patternProperty` "^[a-zA-Z0-9._-]+$". + */ +export type DefinitionsVolume = { + name?: string; + driver?: string; + driver_opts?: { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.+$". + */ + [k: string]: string | number; + }; + external?: + | boolean + | { + name?: string; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + labels?: ListOrDict; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + * + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +} & Volume; +export type Volume = { + name?: string; + driver?: string; + driver_opts?: { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.+$". + */ + [k: string]: string | number; + }; + external?: + | boolean + | { + name?: string; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + labels?: ListOrDict; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + * + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +} | null; + +/** + * The Compose file is a YAML file defining a multi-containers based application. + */ +export interface ComposeSpecification { + /** + * declared for backward compatibility, ignored. + */ + version?: string; + /** + * define the Compose project name, until user defines one explicitly. + */ + name?: string; + /** + * compose sub-projects to be included. + */ + include?: DefinitionsInclude[]; + services?: PropertiesServices; + networks?: PropertiesNetworks; + volumes?: PropertiesVolumes; + secrets?: PropertiesSecrets; + configs?: PropertiesConfigs; + /** + * This interface was referenced by `ComposeSpecification`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +} +export interface PropertiesServices { + [k: string]: DefinitionsService; +} +/** + * This interface was referenced by `PropertiesServices`'s JSON-Schema definition + * via the `patternProperty` "^[a-zA-Z0-9._-]+$". + */ +export interface DefinitionsService { + develop?: DefinitionsDevelopment; + deploy?: DefinitionsDeployment; + annotations?: ListOrDict; + attach?: boolean; + build?: + | string + | { + context?: string; + dockerfile?: string; + dockerfile_inline?: string; + entitlements?: string[]; + args?: ListOrDict; + ssh?: ListOrDict; + labels?: ListOrDict; + cache_from?: string[]; + cache_to?: string[]; + no_cache?: boolean; + additional_contexts?: ListOrDict; + network?: string; + pull?: boolean; + target?: string; + shm_size?: number | string; + extra_hosts?: ListOrDict; + isolation?: string; + privileged?: boolean; + secrets?: ServiceConfigOrSecret; + tags?: string[]; + ulimits?: Ulimits; + platforms?: string[]; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + blkio_config?: { + device_read_bps?: BlkioLimit[]; + device_read_iops?: BlkioLimit[]; + device_write_bps?: BlkioLimit[]; + device_write_iops?: BlkioLimit[]; + weight?: number; + weight_device?: BlkioWeight[]; + }; + cap_add?: string[]; + cap_drop?: string[]; + cgroup?: "host" | "private"; + cgroup_parent?: string; + command?: Command; + configs?: ServiceConfigOrSecret; + container_name?: string; + cpu_count?: number; + cpu_percent?: number; + cpu_shares?: number | string; + cpu_quota?: number | string; + cpu_period?: number | string; + cpu_rt_period?: number | string; + cpu_rt_runtime?: number | string; + cpus?: number | string; + cpuset?: string; + credential_spec?: { + config?: string; + file?: string; + registry?: string; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + depends_on?: + | ListOfStrings + | { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^[a-zA-Z0-9._-]+$". + */ + [k: string]: { + restart?: boolean; + required?: boolean; + condition: + | "service_started" + | "service_healthy" + | "service_completed_successfully"; + }; + }; + device_cgroup_rules?: ListOfStrings; + devices?: string[]; + dns?: StringOrList; + dns_opt?: string[]; + dns_search?: StringOrList; + domainname?: string; + entrypoint?: Command; + env_file?: EnvFile; + environment?: ListOrDict; + expose?: (string | number)[]; + extends?: + | string + | { + service: string; + file?: string; + }; + external_links?: string[]; + extra_hosts?: ListOrDict; + group_add?: (string | number)[]; + healthcheck?: DefinitionsHealthcheck; + hostname?: string; + image?: string; + init?: boolean; + ipc?: string; + isolation?: string; + labels?: ListOrDict; + links?: string[]; + logging?: { + driver?: string; + options?: { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.+$". + */ + [k: string]: string | number | null; + }; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + mac_address?: string; + mem_limit?: number | string; + mem_reservation?: string | number; + mem_swappiness?: number; + memswap_limit?: number | string; + network_mode?: string; + networks?: + | ListOfStrings + | { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^[a-zA-Z0-9._-]+$". + */ + [k: string]: { + aliases?: ListOfStrings; + ipv4_address?: string; + ipv6_address?: string; + link_local_ips?: ListOfStrings; + mac_address?: string; + driver_opts?: { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.+$". + */ + [k: string]: string | number; + }; + priority?: number; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + } | null; + }; + oom_kill_disable?: boolean; + oom_score_adj?: number; + pid?: string | null; + pids_limit?: number | string; + platform?: string; + ports?: ( + | number + | string + | { + name?: string; + mode?: string; + host_ip?: string; + target?: number; + published?: string | number; + protocol?: string; + app_protocol?: string; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + } + )[]; + privileged?: boolean; + profiles?: ListOfStrings; + pull_policy?: "always" | "never" | "if_not_present" | "build" | "missing"; + read_only?: boolean; + restart?: string; + runtime?: string; + scale?: number; + security_opt?: string[]; + shm_size?: number | string; + secrets?: ServiceConfigOrSecret; + sysctls?: ListOrDict; + stdin_open?: boolean; + stop_grace_period?: string; + stop_signal?: string; + storage_opt?: { + [k: string]: unknown; + }; + tmpfs?: StringOrList; + tty?: boolean; + ulimits?: Ulimits; + user?: string; + uts?: string; + userns_mode?: string; + volumes?: ( + | string + | { + type: string; + source?: string; + target?: string; + read_only?: boolean; + consistency?: string; + bind?: { + propagation?: string; + create_host_path?: boolean; + selinux?: "z" | "Z"; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + volume?: { + nocopy?: boolean; + subpath?: string; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + tmpfs?: { + size?: number | string; + mode?: number; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + } + )[]; + volumes_from?: string[]; + working_dir?: string; + /** + * This interface was referenced by `DefinitionsService`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +} +export interface Ulimits { + /** + * This interface was referenced by `Ulimits`'s JSON-Schema definition + * via the `patternProperty` "^[a-z]+$". + */ + [k: string]: + | number + | { + hard: number; + soft: number; + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; + }; +} +export interface BlkioLimit { + path?: string; + rate?: number | string; +} +export interface BlkioWeight { + path?: string; + weight?: number; +} +export interface DefinitionsHealthcheck { + disable?: boolean; + interval?: string; + retries?: number; + test?: string | string[]; + timeout?: string; + start_period?: string; + start_interval?: string; + /** + * This interface was referenced by `DefinitionsHealthcheck`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +} +export interface PropertiesNetworks { + [k: string]: DefinitionsNetwork; +} +export interface PropertiesVolumes { + [k: string]: DefinitionsVolume; +} +export interface PropertiesSecrets { + [k: string]: DefinitionsSecret; +} +/** + * This interface was referenced by `PropertiesSecrets`'s JSON-Schema definition + * via the `patternProperty` "^[a-zA-Z0-9._-]+$". + */ +export interface DefinitionsSecret { + name?: string; + environment?: string; + file?: string; + external?: + | boolean + | { + name?: string; + [k: string]: unknown; + }; + labels?: ListOrDict; + driver?: string; + driver_opts?: { + /** + * This interface was referenced by `undefined`'s JSON-Schema definition + * via the `patternProperty` "^.+$". + */ + [k: string]: string | number; + }; + template_driver?: string; + /** + * This interface was referenced by `DefinitionsSecret`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +} +export interface PropertiesConfigs { + [k: string]: DefinitionsConfig; +} +/** + * This interface was referenced by `PropertiesConfigs`'s JSON-Schema definition + * via the `patternProperty` "^[a-zA-Z0-9._-]+$". + */ +export interface DefinitionsConfig { + name?: string; + content?: string; + environment?: string; + file?: string; + external?: + | boolean + | { + name?: string; + [k: string]: unknown; + }; + labels?: ListOrDict; + template_driver?: string; + /** + * This interface was referenced by `DefinitionsConfig`'s JSON-Schema definition + * via the `patternProperty` "^x-". + */ + [k: string]: unknown; +} \ No newline at end of file diff --git a/build-scripts/validate-docker-compose.ts b/build-scripts/validate-docker-compose.ts new file mode 100644 index 00000000..f175b9fa --- /dev/null +++ b/build-scripts/validate-docker-compose.ts @@ -0,0 +1,357 @@ +#!/usr/bin/env tsx + +/** + * Validation script for docker-compose.yml files + * Validates structure, syntax, and best practices for Dokploy templates + */ + +import * as fs from "fs"; +import * as path from "path"; +import * as yaml from "yaml"; +import type { ComposeSpecification, DefinitionsService } from "./type"; + +interface DockerComposeValidatorOptions { + composePath?: string | null; + verbose?: boolean; + exitOnError?: boolean; +} + +interface ValidationResult { + valid: boolean; + errors: string[]; + warnings: string[]; +} + +type LogLevel = "info" | "success" | "warning" | "error" | "debug"; + +class DockerComposeValidator { + private options: Required; + private errors: string[] = []; + private warnings: string[] = []; + + constructor(options: DockerComposeValidatorOptions = {}) { + this.options = { + composePath: options.composePath || null, + verbose: options.verbose || false, + exitOnError: options.exitOnError !== false, + ...options, + }; + } + + private log(message: string, level: LogLevel = "info"): void { + if (!this.options.verbose && level === "debug") return; + + const prefix: Record = { + info: "πŸ”", + success: "βœ…", + warning: "⚠️", + error: "❌", + debug: "πŸ”", + }; + + console.log(`${prefix[level] || "ℹ️"} ${message}`); + } + + private error(message: string): void { + this.errors.push(message); + this.log(message, "error"); + } + + private warning(message: string): void { + this.warnings.push(message); + this.log(message, "warning"); + } + + /** + * Parse docker-compose.yml file + */ + private parseCompose(composePath: string): ComposeSpecification | null { + try { + if (!fs.existsSync(composePath)) { + this.error(`docker-compose.yml not found at ${composePath}`); + return null; + } + + const content = fs.readFileSync(composePath, "utf8"); + const compose = yaml.parse(content) as ComposeSpecification; + + if (!compose || typeof compose !== "object") { + this.error(`Invalid docker-compose.yml structure at ${composePath}`); + return null; + } + + return compose; + } catch (error: any) { + this.error(`Failed to parse docker-compose.yml: ${error.message}`); + return null; + } + } + + /** + * Validate that docker-compose.yml can be processed by Docker Compose + */ + private validateDockerComposeSyntax(composePath: string): boolean { + // This would ideally use docker compose config, but for now we validate structure + // The actual syntax validation happens in the CI/CD workflow with docker compose config + const compose = this.parseCompose(composePath); + return compose !== null; + } + + /** + * Validate services don't use container_name (Dokploy best practice) + */ + private validateNoContainerName(services: Record): void { + Object.entries(services).forEach(([serviceName, service]) => { + if (service.container_name) { + this.error( + `Service '${serviceName}': Found 'container_name' field. According to README, container_name should not be used. Dokploy manages container names automatically.` + ); + } + }); + } + + /** + * Validate no explicit networks (Dokploy creates networks automatically) + */ + private validateNoExplicitNetworks( + compose: ComposeSpecification, + services: Record + ): void { + // Check for dokploy-network specifically + const hasDokployNetwork = compose.networks && "dokploy-network" in compose.networks; + + // Check if any service uses explicit networks + Object.entries(services).forEach(([serviceName, service]) => { + if (service.networks) { + if (typeof service.networks === "object" && !Array.isArray(service.networks)) { + const networkNames = Object.keys(service.networks); + if (networkNames.includes("dokploy-network")) { + this.error( + `Service '${serviceName}': Uses 'dokploy-network'. Dokploy creates networks automatically, explicit networks are not needed.` + ); + } else if (networkNames.length > 0) { + this.error( + `Service '${serviceName}': Uses explicit network configuration. Dokploy creates networks automatically, explicit networks are not needed.` + ); + } + } else if (Array.isArray(service.networks)) { + if (service.networks.includes("dokploy-network")) { + this.error( + `Service '${serviceName}': Uses 'dokploy-network'. Dokploy creates networks automatically, explicit networks are not needed.` + ); + } else if (service.networks.length > 0) { + this.error( + `Service '${serviceName}': Uses explicit network configuration. Dokploy creates networks automatically, explicit networks are not needed.` + ); + } + } + } + }); + + // Check if networks section exists at root level + if (hasDokployNetwork) { + this.error( + "Found 'dokploy-network' in networks section. Dokploy creates networks automatically, explicit networks are not needed." + ); + } + + if (compose.networks && Object.keys(compose.networks).length > 0) { + this.error( + "Found explicit networks section. Dokploy creates networks automatically, explicit networks are not needed." + ); + } + } + + /** + * Validate ports are not mapped (should be just numbers, not host:container) + */ + private validatePortsFormat(services: Record): void { + Object.entries(services).forEach(([serviceName, service]) => { + if (service.ports) { + service.ports.forEach((port, index) => { + if (typeof port === "string") { + // Check for port mapping format (e.g., "3000:3000" or "8080:80") + if (/^\d+:\d+/.test(port)) { + this.error( + `Service '${serviceName}': ports[${index}] uses port mapping format '${port}'. According to README, use only port number (e.g., '3000') instead of '3000:3000'. Dokploy handles port routing.` + ); + } + } else if (typeof port === "object" && port !== null) { + // Check for published port mapping + if (port.published && port.target) { + this.error( + `Service '${serviceName}': ports[${index}] uses port mapping (published: ${port.published}, target: ${port.target}). According to README, use only port number. Dokploy handles port routing.` + ); + } + } + }); + } + }); + } + + /** + * Validate services exist + */ + private validateServicesExist(compose: ComposeSpecification): boolean { + if (!compose.services || Object.keys(compose.services).length === 0) { + this.error("No services found in docker-compose.yml"); + return false; + } + + const serviceNames = Object.keys(compose.services); + this.log(`Found ${serviceNames.length} service(s): ${serviceNames.join(", ")}`, "debug"); + + return true; + } + + /** + * Validate service names follow best practices + */ + private validateServiceNames(services: Record): void { + Object.keys(services).forEach((serviceName) => { + // Service names should be lowercase and use hyphens + if (serviceName !== serviceName.toLowerCase()) { + this.warning( + `Service '${serviceName}': Service names should be lowercase. Consider using '${serviceName.toLowerCase()}'.` + ); + } + + // Service names should not contain underscores (use hyphens instead) + if (serviceName.includes("_")) { + this.warning( + `Service '${serviceName}': Service names should use hyphens instead of underscores. Consider using '${serviceName.replace(/_/g, "-")}'.` + ); + } + }); + } + + + /** + * Main validation method + */ + validate(): ValidationResult { + if (!this.options.composePath) { + this.error("composePath option is required"); + if (this.options.exitOnError) { + process.exit(1); + } + return { valid: false, errors: this.errors, warnings: this.warnings }; + } + + const composePath = this.options.composePath; + const templateName = path.basename(path.dirname(composePath)); + + this.log(`Validating docker-compose.yml: ${templateName}`); + + // Parse and validate syntax + if (!this.validateDockerComposeSyntax(composePath)) { + if (this.options.exitOnError) { + process.exit(1); + } + return { valid: false, errors: this.errors, warnings: this.warnings }; + } + + const compose = this.parseCompose(composePath); + if (!compose) { + if (this.options.exitOnError) { + process.exit(1); + } + return { valid: false, errors: this.errors, warnings: this.warnings }; + } + + // Validate services exist + if (!this.validateServicesExist(compose)) { + if (this.options.exitOnError) { + process.exit(1); + } + return { valid: false, errors: this.errors, warnings: this.warnings }; + } + + const services = compose.services || {}; + + // Run all validations + this.validateNoContainerName(services); + this.validateNoExplicitNetworks(compose, services); + this.validatePortsFormat(services); + this.validateServiceNames(services); + + // Show summary + if (this.errors.length === 0) { + this.log("Docker Compose file structure is valid", "success"); + + if (this.options.verbose) { + this.log("πŸ“‹ Services found:", "info"); + Object.keys(services).forEach((serviceName) => { + const service = services[serviceName]; + const image = typeof service.image === "string" ? service.image : "N/A"; + this.log(` - ${serviceName}: ${image}`, "debug"); + }); + } + } + + const valid = this.errors.length === 0; + + if (!valid && this.options.exitOnError) { + process.exit(1); + } + + return { valid, errors: this.errors, warnings: this.warnings }; + } +} + +// CLI usage +if (require.main === module) { + const args = process.argv.slice(2); + const options: DockerComposeValidatorOptions = {}; + let composePath: string | null = null; + + // Parse command line arguments + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + switch (arg) { + case "--file": + case "-f": + composePath = args[++i]; + break; + case "--verbose": + case "-v": + options.verbose = true; + break; + case "--help": + case "-h": + console.log(` +Usage: tsx validate-docker-compose.ts [options] + +Options: + -f, --file Docker Compose file path (required) + -v, --verbose Verbose output + -h, --help Show this help message + +Examples: + tsx validate-docker-compose.ts --file blueprints/grafana/docker-compose.yml + tsx validate-docker-compose.ts -f blueprints/grafana/docker-compose.yml --verbose + `); + process.exit(0); + break; + } + } + + if (!composePath) { + console.error("❌ Error: --file option is required"); + console.error("Use --help for usage information"); + process.exit(1); + } + + const validator = new DockerComposeValidator({ + composePath, + ...options, + }); + + const result = validator.validate(); + + // Exit with appropriate code + process.exit(result.valid ? 0 : 1); +} + +export default DockerComposeValidator; + diff --git a/build-scripts/validate-template.ts b/build-scripts/validate-template.ts new file mode 100644 index 00000000..76d7e653 --- /dev/null +++ b/build-scripts/validate-template.ts @@ -0,0 +1,622 @@ +#!/usr/bin/env tsx + +/** + * Validation script for template.toml and docker-compose.yml files + * Validates structure, syntax, and consistency between files + */ + +import * as fs from "fs"; +import * as path from "path"; +import { parse } from "toml"; +import * as yaml from "yaml"; +import type { ComposeSpecification } from "./type"; +import { processVariables, processValue, type Schema } from "./helpers"; + +interface TemplateValidatorOptions { + templateDir?: string | null; + composeServices?: string[] | null; + verbose?: boolean; + exitOnError?: boolean; +} + +interface ValidationResult { + valid: boolean; + errors: string[]; + warnings: string[]; +} + +interface DomainConfig { + serviceName?: string; + port?: number | string; + host?: string; + path?: string; +} + +interface MountConfig { + filePath?: string; + content?: string; +} + +interface TemplateData { + variables?: Record; + config?: { + domains?: DomainConfig[]; + env?: string[] | Record | Array>; + mounts?: MountConfig[]; + }; +} + +type LogLevel = "info" | "success" | "warning" | "error" | "debug"; + +class TemplateValidator { + private options: Required; + private errors: string[] = []; + private warnings: string[] = []; + + constructor(options: TemplateValidatorOptions = {}) { + this.options = { + templateDir: options.templateDir || null, + composeServices: options.composeServices || null, + verbose: options.verbose || false, + exitOnError: options.exitOnError !== false, + ...options, + }; + } + + private log(message: string, level: LogLevel = "info"): void { + if (!this.options.verbose && level === "debug") return; + + const prefix: Record = { + info: "πŸ”", + success: "βœ…", + warning: "⚠️", + error: "❌", + debug: "πŸ”", + }; + + console.log(`${prefix[level] || "ℹ️"} ${message}`); + } + + private error(message: string): void { + this.errors.push(message); + this.log(message, "error"); + } + + private warning(message: string): void { + this.warnings.push(message); + this.log(message, "warning"); + } + + /** + * Validate helper syntax (based on Dokploy's processValue function) + */ + private validateHelper(helper: string, context: string = ""): void { + const validHelpers = [ + "domain", + "base64", + "password", + "hash", + "uuid", + "timestamp", + "timestampms", + "timestamps", + "randomPort", + "jwt", + "username", + "email", + ]; + + // Check if it's a helper with parameters + if (helper.includes(":")) { + const [helperName, ...params] = helper.split(":"); + + // Validate helper name + if (!validHelpers.includes(helperName)) { + // Might be a variable reference, which is valid + return; + } + + // Validate parameter formats + if (helperName === "base64" || helperName === "password" || helperName === "hash") { + // Format: helper:number + const param = params[0]; + if (param && isNaN(parseInt(param, 10))) { + this.warning( + `${context}: helper '${helper}' has invalid parameter (should be a number)` + ); + } + } else if (helperName === "timestampms" || helperName === "timestamps") { + // Format: timestampms:datetime or timestamps:datetime + const datetime = params.join(":"); // Rejoin in case datetime has colons + if (datetime) { + // Try to parse as date + const date = new Date(datetime); + if (isNaN(date.getTime())) { + this.warning( + `${context}: helper '${helper}' has invalid datetime format` + ); + } + } + } else if (helperName === "jwt") { + // Format: jwt:secret or jwt:secret:payload or jwt:length + if (params.length > 0) { + const firstParam = params[0]; + // If it's a number, it's jwt:length (deprecated but valid) + if (!isNaN(parseInt(firstParam, 10))) { + // Valid: jwt:32 + return; + } + // Otherwise it's jwt:secret or jwt:secret:payload + // Both are valid + } + } + } else { + // Simple helper without parameters + if (!validHelpers.includes(helper)) { + // Might be a variable reference, which is valid + return; + } + } + } + + /** + * Parse docker-compose.yml and extract service names + */ + private parseComposeServices(composePath: string): string[] { + try { + if (!fs.existsSync(composePath)) { + this.warning(`docker-compose.yml not found at ${composePath}`); + return []; + } + + const content = fs.readFileSync(composePath, "utf8"); + const compose = yaml.parse(content) as ComposeSpecification; + + if (!compose || typeof compose !== "object") { + this.error(`Invalid docker-compose.yml structure at ${composePath}`); + return []; + } + + // Extract service names using the official ComposeSpecification type + const services = compose.services || {}; + const serviceNames = Object.keys(services); + + if (serviceNames.length === 0) { + this.warning(`No services found in docker-compose.yml at ${composePath}`); + } + + return serviceNames; + } catch (error: any) { + this.error( + `Failed to parse docker-compose.yml at ${composePath}: ${error.message}` + ); + return []; + } + } + + /** + * Validate template.toml structure + */ + private validateTemplate(tomlPath: string, composeServices: string[] | null = null): boolean { + try { + if (!fs.existsSync(tomlPath)) { + this.error(`template.toml not found at ${tomlPath}`); + return false; + } + + // Parse TOML + let data: TemplateData; + try { + const content = fs.readFileSync(tomlPath, "utf8"); + data = parse(content) as TemplateData; + } catch (parseError: any) { + this.error( + `Invalid TOML syntax in ${tomlPath}: ${parseError.message}` + ); + return false; + } + + // Validate [config] section exists + if (!data.config) { + this.error("Missing [config] section in template.toml"); + return false; + } + + // Validate domains + if (data.config.domains) { + if (!Array.isArray(data.config.domains)) { + this.error("config.domains must be an array"); + return false; + } + + data.config.domains.forEach((domain, index) => { + // Required fields + if (!domain.serviceName) { + this.error(`domain[${index}]: Missing required field 'serviceName'`); + } + if (domain.port === undefined || domain.port === null) { + this.error(`domain[${index}]: Missing required field 'port'`); + } + + // Validate serviceName matches docker-compose.yml services + if (domain.serviceName && composeServices && composeServices.length > 0) { + if (!composeServices.includes(domain.serviceName)) { + this.error( + `domain[${index}]: serviceName '${domain.serviceName}' not found in docker-compose.yml services. Available services: ${composeServices.join(", ")}` + ); + } + } + + // Validate port is a number + if (domain.port !== undefined && domain.port !== null) { + const port = typeof domain.port === "string" + ? parseInt(domain.port.replace(/_/g, ""), 10) + : domain.port; + + if (isNaN(Number(port)) || Number(port) < 1 || Number(port) > 65535) { + this.warning( + `domain[${index}]: port '${domain.port}' may be invalid (should be 1-65535)` + ); + } + } + + // Validate host format (should contain ${} for variable substitution) + if (domain.host && typeof domain.host === "string") { + if (!domain.host.includes("${")) { + this.warning( + `domain[${index}]: host '${domain.host}' doesn't use variable syntax (e.g., \${main_domain} or \${domain})` + ); + } else { + // Validate helpers in host + const helperPattern = /\${([^}]+)}/g; + let match: RegExpExecArray | null; + while ((match = helperPattern.exec(domain.host)) !== null) { + this.validateHelper(match[1], `domain[${index}].host`); + } + } + } + }); + } else { + this.warning("No domains configured in template.toml"); + } + + // Validate env - can be array or object (as per Dokploy's processEnvVars) + if (data.config.env !== undefined) { + if (Array.isArray(data.config.env)) { + // Array format: ["KEY=VALUE", ...] + data.config.env.forEach((env, index) => { + if (typeof env === "string") { + if (!env.includes("=")) { + this.warning( + `config.env[${index}]: '${env}' doesn't follow KEY=VALUE format` + ); + } + } else if (typeof env === "object" && env !== null) { + // Object in array is also valid: [{"KEY": "VALUE"}, ...] + const keys = Object.keys(env); + if (keys.length === 0) { + this.warning(`config.env[${index}]: empty object`); + } + } else if (typeof env !== "boolean" && typeof env !== "number") { + this.error( + `config.env[${index}]: must be a string, object, boolean, or number` + ); + } + }); + } else if (typeof data.config.env === "object" && data.config.env !== null) { + // Object format: { KEY: "VALUE", ... } + // This is valid - Dokploy handles both formats + const envKeys = Object.keys(data.config.env); + if (envKeys.length === 0) { + this.warning("config.env is an empty object"); + } + } else { + this.error( + "config.env must be an array or an object (as per Dokploy's processEnvVars)" + ); + } + } + + // Validate mounts if present + if (data.config.mounts) { + if (!Array.isArray(data.config.mounts)) { + this.error("config.mounts must be an array"); + } else { + data.config.mounts.forEach((mount, index) => { + if (!mount.filePath) { + this.error(`config.mounts[${index}]: Missing required field 'filePath'`); + } else if (typeof mount.filePath !== "string") { + this.error(`config.mounts[${index}]: filePath must be a string`); + } + + if (mount.content === undefined) { + this.error(`config.mounts[${index}]: Missing required field 'content'`); + } else if (typeof mount.content !== "string") { + this.error(`config.mounts[${index}]: content must be a string`); + } + }); + } + } + + // Validate variables if present + if (data.variables) { + if (typeof data.variables !== "object" || Array.isArray(data.variables)) { + this.error("variables must be an object"); + } else { + // Validate variable values and helpers + Object.entries(data.variables).forEach(([key, value]) => { + if (typeof value !== "string") { + this.error(`variables.${key}: must be a string`); + return; + } + + // Validate helpers in variable values + const helperPattern = /\${([^}]+)}/g; + let match: RegExpExecArray | null; + while ((match = helperPattern.exec(value)) !== null) { + const helper = match[1]; + this.validateHelper(helper, `variables.${key}`); + } + }); + + // Try to process variables to ensure they resolve correctly + try { + const schema: Schema = {}; + const processedVars = processVariables(data.variables, schema); + + // Check if any variables failed to resolve (still contain ${}) + Object.entries(processedVars).forEach(([key, value]) => { + if (typeof value === "string" && value.includes("${")) { + // Check if it's a valid variable reference or an error + const unresolved = value.match(/\${([^}]+)}/g); + if (unresolved) { + unresolved.forEach((unresolvedVar) => { + const varName = unresolvedVar.slice(2, -1); + // Check if it's a reference to another variable that exists + if (!data.variables![varName] && !varName.includes(":")) { + this.warning( + `variables.${key}: contains unresolved variable reference '${unresolvedVar}'` + ); + } + }); + } + } + }); + + // Validate that domains can be processed with resolved variables + if (data.config.domains) { + data.config.domains.forEach((domain, index) => { + if (domain.host && typeof domain.host === "string") { + try { + const processedHost = processValue(domain.host, processedVars, schema); + if (processedHost.includes("${")) { + this.warning( + `domain[${index}].host: could not fully resolve all variables. Result: ${processedHost}` + ); + } + } catch (e: any) { + this.warning( + `domain[${index}].host: error processing host value: ${e.message}` + ); + } + } + }); + } + + // Validate that env vars can be processed + if (data.config.env) { + if (Array.isArray(data.config.env)) { + data.config.env.forEach((env, index) => { + if (typeof env === "string") { + try { + const processed = processValue(env, processedVars, schema); + if (processed.includes("${")) { + this.warning( + `config.env[${index}]: could not fully resolve all variables` + ); + } + } catch (e: any) { + this.warning( + `config.env[${index}]: error processing env value: ${e.message}` + ); + } + } + }); + } else if (typeof data.config.env === "object") { + Object.entries(data.config.env).forEach(([key, value]) => { + if (typeof value === "string") { + try { + const processed = processValue(value, processedVars, schema); + if (processed.includes("${")) { + this.warning( + `config.env.${key}: could not fully resolve all variables` + ); + } + } catch (e: any) { + this.warning( + `config.env.${key}: error processing env value: ${e.message}` + ); + } + } + }); + } + } + + // Validate that mounts can be processed + if (data.config.mounts) { + data.config.mounts.forEach((mount, index) => { + if (mount.filePath && typeof mount.filePath === "string") { + try { + const processed = processValue(mount.filePath, processedVars, schema); + if (processed.includes("${")) { + this.warning( + `config.mounts[${index}].filePath: could not fully resolve all variables` + ); + } + } catch (e: any) { + this.warning( + `config.mounts[${index}].filePath: error processing filePath: ${e.message}` + ); + } + } + if (mount.content && typeof mount.content === "string") { + try { + const processed = processValue(mount.content, processedVars, schema); + if (processed.includes("${")) { + this.warning( + `config.mounts[${index}].content: could not fully resolve all variables` + ); + } + } catch (e: any) { + this.warning( + `config.mounts[${index}].content: error processing content: ${e.message}` + ); + } + } + }); + } + + if (this.options.verbose) { + this.log("βœ… Variables processed successfully", "success"); + this.log(`πŸ“‹ Processed ${Object.keys(processedVars).length} variables`, "debug"); + } + } catch (e: any) { + this.error(`Failed to process variables: ${e.message}`); + } + } + } + + return this.errors.length === 0; + } catch (error: any) { + this.error(`Error validating template.toml: ${error.message}`); + return false; + } + } + + /** + * Validate a template directory + */ + private validateTemplateDir(templateDir: string): ValidationResult { + // Resolver rutas absolutas o relativas desde la raΓ­z del proyecto + const resolvedDir = path.isAbsolute(templateDir) + ? templateDir + : path.resolve(process.cwd(), templateDir); + + const templatePath = path.join(resolvedDir, "template.toml"); + const composePath = path.join(resolvedDir, "docker-compose.yml"); + + this.log(`Validating template: ${path.basename(resolvedDir)}`); + + // Parse compose services first + const composeServices = this.parseComposeServices(composePath); + + // Validate template.toml + const isValid = this.validateTemplate(templatePath, composeServices); + + // Show summary + if (isValid && this.errors.length === 0) { + this.log("Template structure is valid", "success"); + + // Show domains info + try { + const content = fs.readFileSync(templatePath, "utf8"); + const data = parse(content) as TemplateData; + if (data.config && data.config.domains) { + this.log("πŸ“‹ Domains configured:"); + data.config.domains.forEach((domain) => { + const service = domain.serviceName || "N/A"; + const port = domain.port !== undefined ? domain.port : "N/A"; + const host = domain.host || "N/A"; + this.log(` - Service: ${service}, Port: ${port}, Host: ${host}`); + }); + } + } catch (e) { + // Ignore errors in summary + } + } + + return { + valid: isValid && this.errors.length === 0, + errors: this.errors, + warnings: this.warnings, + }; + } + + /** + * Main validation method + */ + validate(): ValidationResult { + if (!this.options.templateDir) { + this.error("templateDir option is required"); + if (this.options.exitOnError) { + process.exit(1); + } + return { valid: false, errors: this.errors, warnings: this.warnings }; + } + + const result = this.validateTemplateDir(this.options.templateDir!); + + if (!result.valid && this.options.exitOnError) { + process.exit(1); + } + + return result; + } +} + +// CLI usage +if (require.main === module) { + const args = process.argv.slice(2); + const options: TemplateValidatorOptions = {}; + let templateDir: string | null = null; + + // Parse command line arguments + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + switch (arg) { + case "--dir": + case "-d": + templateDir = args[++i]; + break; + case "--verbose": + case "-v": + options.verbose = true; + break; + case "--help": + case "-h": + console.log(` +Usage: tsx validate-template.ts [options] + +Options: + -d, --dir Template directory path (required) + -v, --verbose Verbose output + -h, --help Show this help message + +Examples: + tsx validate-template.ts --dir blueprints/grafana + tsx validate-template.ts -d blueprints/grafana --verbose + `); + process.exit(0); + break; + } + } + + if (!templateDir) { + console.error("❌ Error: --dir option is required"); + console.error("Use --help for usage information"); + process.exit(1); + } + + const validator = new TemplateValidator({ + templateDir, + ...options, + }); + + const result = validator.validate(); + + // Exit with appropriate code + process.exit(result.valid ? 0 : 1); +} + +export default TemplateValidator; + diff --git a/meta.json b/meta.json index 5cea3110..ee73ec65 100644 --- a/meta.json +++ b/meta.json @@ -295,6 +295,23 @@ "chatbot" ] }, + { + "id": "anytype", + "name": "Anytype", + "version": "latest", + "description": "Anytype is a personal knowledge baseβ€”your digital brainβ€”that lets you gather, connect and remix all kinds of information. Create pages, tasks, wikis, journalsβ€”even entire appsβ€”and define your own data model while your data stays offline-first, private and encrypted across devices.\n\nAfter installation, you can view the Anytype client configuration by running `cat /data/client-config.yml` inside the service container.", + "logo": "logo.png", + "links": { + "github": "https://github.com/grishy/any-sync-bundle", + "docs": "https://doc.anytype.io/anytype-docs", + "website": "https://anytype.io/" + }, + "tags": [ + "note-taking", + "local-first", + "peer-to-peer" + ] + }, { "id": "appflowy", "name": "App Flowy", @@ -733,6 +750,24 @@ "nextjs" ] }, + { + "id": "bluesky-pds", + "name": "Bluesky PDS", + "version": "0.4.182", + "description": "Bluesky PDS is a personal data server for Bluesky.", + "logo": "bluesky-pds.svg", + "links": { + "github": "https://github.com/bluesky-social/pds", + "website": "https://bsky.social/about", + "docs": "https://github.com/bluesky-social/pds" + }, + "tags": [ + "bluesky", + "pds", + "data", + "server" + ] + }, { "id": "bolt.diy", "name": "bolt.diy", @@ -1156,6 +1191,25 @@ "Document Management" ] }, + { + "id": "chirpstack", + "name": "ChirpStack", + "version": "4", + "description": "Open-source LoRaWAN Network Server for IoT applications. Complete stack with gateway bridges, REST API, and web interface for managing LoRaWAN devices and gateways.", + "logo": "chirpstack.png", + "links": { + "github": "https://github.com/chirpstack/chirpstack", + "website": "https://www.chirpstack.io/", + "docs": "https://www.chirpstack.io/docs/" + }, + "tags": [ + "iot", + "lorawan", + "network-server", + "gateway", + "monitoring" + ] + }, { "id": "chromium", "name": "Chromium", @@ -1776,6 +1830,26 @@ "document-signing" ] }, + { + "id": "dokploy-prom-monitoring-extension", + "name": "Dokploy Prometheus Monitoring Extension", + "version": "canary", + "description": "Dokploy monitoring extension with Prometheus metrics export for external monitoring systems like Grafana Cloud. Tracks server and container metrics with configurable thresholds and alerting.", + "logo": "logo.svg", + "links": { + "github": "https://github.com/Dokploy/dokploy", + "website": "https://dokploy.com/", + "docs": "https://docs.dokploy.com/" + }, + "tags": [ + "monitoring", + "prometheus", + "metrics", + "observability", + "docker", + "grafana" + ] + }, { "id": "domain-locker", "name": "Domain Locker", @@ -1998,7 +2072,7 @@ "description": "Enshrouded steam dedicated server.", "logo": "enshrouded.png", "links": { - "github": "https://github.com/jsknnr/enshrouded-server", + "github": "https://github.com/mornedhels/enshrouded-server", "website": "", "docs": "" }, @@ -2956,7 +3030,7 @@ { "id": "infisical", "name": "Infisical", - "version": "0.90.1", + "version": "0.135.0", "description": "All-in-one platform to securely manage application configuration and secrets across your team and infrastructure.", "logo": "infisical.jpg", "links": { @@ -3195,6 +3269,25 @@ "personal" ] }, + { + "id": "kokoro-tts", + "name": "Kokoro TTS", + "version": "latest", + "description": "Dockerized FastAPI wrapper for the Kokoro-82M text-to-speech model with multi-language support and OpenAI-compatible endpoints.", + "logo": "kokoro-tts.svg", + "links": { + "github": "https://github.com/remsky/Kokoro-FastAPI", + "website": "https://github.com/remsky/Kokoro-FastAPI", + "docs": "https://github.com/remsky/Kokoro-FastAPI#readme" + }, + "tags": [ + "text-to-speech", + "ai", + "voice", + "fastapi", + "openai-compatible" + ] + }, { "id": "kokoro-web", "name": "Kokoro Web", @@ -3261,6 +3354,26 @@ "productivity" ] }, + { + "id": "librechat", + "name": "LibreChat", + "version": "latest", + "description": "LibreChat is the ultimate open-source app for all your AI conversations, fully customizable and compatible with any AI provider (Openai, Ollama, Google etc.) β€” all in one sleek interface.", + "logo": "librechat.png", + "links": { + "github": "https://github.com/danny-avila/librechat", + "website": "https://librechat.ai", + "docs": "https://docs.librechat.ai" + }, + "tags": [ + "ai", + "chatbot", + "llm", + "MIT-license", + "BYOK", + "generative-ai" + ] + }, { "id": "libredesk", "name": "Libredesk", @@ -3550,6 +3663,24 @@ "gallery" ] }, + { + "id": "mcsmanager", + "name": "MCSManager", + "version": "latest", + "description": "A modern dashboard for managing Minecraft servers. Primarily focused on Minecraft, but also supports other games and features a UI that's easy for beginners to use and supports i18n.", + "logo": "mcsmanager.png", + "links": { + "github": "https://github.com/MCSManager/MCSManager", + "website": "https://github.com/MCSManager/MCSManager", + "docs": "https://github.com/MCSManager/MCSManager#readme" + }, + "tags": [ + "minecraft", + "game-server", + "management", + "dashboard" + ] + }, { "id": "mealie", "name": "Mealie (sqlite version)", @@ -3567,6 +3698,25 @@ "meal-planning" ] }, + { + "id": "mediacms", + "name": "MediaCMS", + "version": "latest", + "description": "MediaCMS is an open-source video and media CMS. It is a modern, full-featured solution for managing and streaming media content.", + "logo": "mediacms.svg", + "links": { + "github": "https://github.com/mediacms/mediacms", + "website": "https://mediacms.io/", + "docs": "https://docs.mediacms.io/" + }, + "tags": [ + "media", + "video", + "cms", + "streaming", + "self-hosted" + ] + }, { "id": "meilisearch", "name": "Meilisearch", @@ -3709,6 +3859,43 @@ "rating" ] }, + { + "id": "mulesoft-esb", + "name": "MuleSoft ESB Runtime Community Edition", + "version": "latest", + "description": "MuleSoft ESB Runtime is a lightweight, Java-based integration platform that allows you to easily integrate applications, data sources, and APIs. It provides powerful connectors and data transformation capabilities for building robust integration solutions.", + "logo": "mulesoft_logo.png", + "links": { + "github": "https://github.com/mulesoft", + "website": "https://www.mulesoft.com/", + "docs": "https://docs.mulesoft.com/" + }, + "tags": [ + "integration", + "api", + "esb", + "enterprise", + "java" + ] + }, + { + "id": "mumble", + "name": "Mumble", + "version": "latest", + "description": "Mumble is an open-source, low-latency, high-quality voice chat software primarily intended for use while gaming.", + "logo": "mumble.png", + "links": { + "github": "https://github.com/mumble-voip/mumble", + "website": "https://www.mumble.info/", + "docs": "https://wiki.mumble.info/" + }, + "tags": [ + "voice-chat", + "communication", + "gaming", + "voip" + ] + }, { "id": "n8n", "name": "n8n", @@ -4157,6 +4344,25 @@ "openai" ] }, + { + "id": "openinary", + "name": "Openinary", + "version": "latest", + "description": "Openinary is a self-hosted Cloudinary alternative.", + "logo": "openinary.svg", + "links": { + "github": "https://github.com/openinary/openinary", + "website": "https://openinary.dev", + "docs": "https://docs.openinary.dev" + }, + "tags": [ + "media", + "images", + "videos", + "cloudinary-alternative", + "developer-tools" + ] + }, { "id": "openpanel", "name": "OpenPanel", @@ -4283,6 +4489,42 @@ "open-source" ] }, + { + "id": "parseable", + "name": "Parseable", + "version": "v1.6.5", + "description": "Fast observability and log analytics platform on object storage", + "logo": "logo.svg", + "links": { + "github": "https://github.com/parseablehq/parseable", + "website": "https://www.parseable.com/", + "docs": "https://www.parseable.com/docs" + }, + "tags": [ + "observability", + "logging", + "analytics", + "monitoring" + ] + }, + { + "id": "passbolt", + "name": "Passbolt", + "version": "latest-ce", + "description": "Passbolt is an open source credential platform for modern teams. A versatile, battle-tested solution to manage and collaborate on passwords, accesses, and secrets. All in one.", + "logo": "passbolt.svg", + "links": { + "github": "https://github.com/passbolt/passbolt_api", + "website": "https://www.passbolt.com/", + "docs": "https://www.passbolt.com/docs/" + }, + "tags": [ + "password-manager", + "security", + "team-collaboration", + "encryption" + ] + }, { "id": "pastefy", "name": "Pastefy", @@ -4322,6 +4564,25 @@ "client-management" ] }, + { + "id": "peerdb", + "name": "PeerDB", + "version": "v0.35.5", + "description": "Data integration platform that synchronizes and federates data across databases with a unified API.", + "logo": "peerdb.jpeg", + "links": { + "github": "https://github.com/peerdb-io/peerdb", + "website": "https://peerdb.io", + "docs": "https://docs.peerdb.io" + }, + "tags": [ + "database", + "integration", + "sync", + "sql", + "workflow" + ] + }, { "id": "penpot", "name": "Penpot", @@ -4732,6 +4993,25 @@ "search" ] }, + { + "id": "quant-ux", + "name": "Quant-UX", + "version": "latest", + "description": "Quant-UX is an open-source UX design and prototyping tool that allows you to create interactive prototypes, conduct user research, and analyze user behavior.", + "logo": "logo.svg", + "links": { + "github": "https://github.com/KlausSchaefers/quant-ux", + "website": "https://www.quant-ux.com/", + "docs": "https://www.quant-ux.com/" + }, + "tags": [ + "design", + "ux", + "prototyping", + "user-research", + "analytics" + ] + }, { "id": "rabbitmq", "name": "RabbitMQ", @@ -4781,6 +5061,24 @@ "chat" ] }, + { + "id": "rote", + "name": "Rote", + "version": "latest", + "description": "Rote is an open-source multi-platform personal note system featuring an open API, full data ownership, and effortless Docker deployment.", + "logo": "rote.png", + "links": { + "github": "https://github.com/Rabithua/Rote", + "website": "https://rote.ink", + "docs": "https://github.com/Rabithua/Rote/tree/main/doc/userguide" + }, + "tags": [ + "notes", + "productivity", + "postgres", + "bun" + ] + }, { "id": "roundcube", "name": "Roundcube", @@ -4850,6 +5148,24 @@ "productivity" ] }, + { + "id": "rustfs", + "name": "RustFS", + "version": "latest", + "description": "RustFS is a high-performance, S3-compatible distributed object storage system built in Rust. 2.3x faster than MinIO for small objects, with full S3 API compatibility.", + "logo": "logo.svg", + "links": { + "github": "https://github.com/rustfs/rustfs", + "website": "https://rustfs.com/", + "docs": "https://docs.rustfs.com/" + }, + "tags": [ + "storage", + "s3", + "object-storage", + "rust" + ] + }, { "id": "rutorrent", "name": "ruTorrent", @@ -5274,7 +5590,7 @@ { "id": "tolgee", "name": "Tolgee", - "version": "v3.80.4", + "version": "latest", "description": "Developer & translator friendly web-based localization platform", "logo": "tolgee.svg", "links": { @@ -5360,7 +5676,7 @@ { "id": "trmnl-byos-laravel", "name": "TRMNL BYOS Laravel", - "version": "0.14.0", + "version": "0.21.0", "description": "TRMNL BYOS Laravel is a self-hosted application to manage TRMNL e-ink devices.", "logo": "byos-laravel.svg", "links": { From ea1174c290f8cbf176ba4c40837fadd9484aa6a8 Mon Sep 17 00:00:00 2001 From: kipavy <88386090+kipavy@users.noreply.github.com> Date: Wed, 7 Jan 2026 19:15:11 +0100 Subject: [PATCH 2/3] feat: Add scrutiny template (#500) * Adds scrutiny template * ran npm run process-meta * feat(scrutiny): add Proxmox usage instructions * Refactor port mappings in docker-compose.yml Updated port mappings to remove quotes in docker-compose.yml. --- blueprints/scrutiny/docker-compose.yml | 55 +++++++++++++++++++++++++ blueprints/scrutiny/scrutiny.png | Bin 0 -> 43159 bytes blueprints/scrutiny/template.toml | 1 + meta.json | 16 +++++++ 4 files changed, 72 insertions(+) create mode 100644 blueprints/scrutiny/docker-compose.yml create mode 100644 blueprints/scrutiny/scrutiny.png create mode 100644 blueprints/scrutiny/template.toml diff --git a/blueprints/scrutiny/docker-compose.yml b/blueprints/scrutiny/docker-compose.yml new file mode 100644 index 00000000..56b27bd2 --- /dev/null +++ b/blueprints/scrutiny/docker-compose.yml @@ -0,0 +1,55 @@ +services: + scrutiny: + restart: unless-stopped + container_name: scrutiny + image: ghcr.io/analogj/scrutiny:master-omnibus + cap_add: + - SYS_RAWIO + ports: + - 8080 # webapp + - 8086 # influxDB admin + volumes: + - /run/udev:/run/udev:ro + - ./config:/opt/scrutiny/config + - ./influxdb:/opt/scrutiny/influxdb + devices: + - "/dev/sda" + - "/dev/sdb" + +# PROXMOX USERS: Proxmox LXCs don't have access to S.M.A.R.T data, while this may be possible on VMs using PCI passthrough, +# there's another way which is to run the scrutiny collector on proxmox host and have it send data to the scrutiny webapp running in an LXC or VM +# so basically you can use the following commented docker-compose (web+db) and run the collector directly on the proxmox host (guide: https://github.com/AnalogJ/scrutiny/blob/master/docs/INSTALL_HUB_SPOKE.md#setting-up-a-spoke-without-docker) + +# services: +# influxdb: +# restart: unless-stopped +# image: influxdb:2.2 +# ports: +# - '8086:8086' +# volumes: +# - './influxdb:/var/lib/influxdb2' +# healthcheck: +# test: ["CMD", "curl", "-f", "http://localhost:8086/health"] +# interval: 5s +# timeout: 10s +# retries: 20 +# +# +# web: +# restart: unless-stopped +# image: 'ghcr.io/analogj/scrutiny:master-web' +# ports: +# - '8080:8080' +# volumes: +# - './config:/opt/scrutiny/config' +# environment: +# SCRUTINY_WEB_INFLUXDB_HOST: 'influxdb' +# depends_on: +# influxdb: +# condition: service_healthy +# healthcheck: +# test: ["CMD", "curl", "-f", "http://localhost:8080/api/health"] +# interval: 5s +# timeout: 10s +# retries: 20 +# start_period: 10s diff --git a/blueprints/scrutiny/scrutiny.png b/blueprints/scrutiny/scrutiny.png new file mode 100644 index 0000000000000000000000000000000000000000..c0812c1b80bb97751e803b989862c5e659148065 GIT binary patch literal 43159 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ⓈPCLpTF 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 literal 0 HcmV?d00001 diff --git a/blueprints/scrutiny/template.toml b/blueprints/scrutiny/template.toml new file mode 100644 index 00000000..60ff998b --- /dev/null +++ b/blueprints/scrutiny/template.toml @@ -0,0 +1 @@ +[config] \ No newline at end of file diff --git a/meta.json b/meta.json index ee73ec65..8eed71e7 100644 --- a/meta.json +++ b/meta.json @@ -5216,6 +5216,22 @@ "self-hosted" ] }, + { + "id": "scrutiny", + "name": "Scrutiny", + "version": "latest", + "description": "Hard Drive S.M.A.R.T Monitoring, Historical Trends & Real World Failure Thresholds", + "logo": "scrutiny.png", + "links": { + "github": "https://github.com/AnalogJ/scrutiny/", + "website": "", + "docs": "" + }, + "tags": [ + "monitoring", + "NAS" + ] + }, { "id": "scrypted", "name": "Scrypted", From 1c3afa98db4869779c5845522f5b96f904d7db21 Mon Sep 17 00:00:00 2001 From: Tony Hart <154579112+thaarrtt@users.noreply.github.com> Date: Wed, 28 Jan 2026 13:34:15 +0700 Subject: [PATCH 3/3] feat: ad streamflow (#645) Co-authored-by: thaarrtt --- blueprints/streamflow/docker-compose.yml | 22 ++++++++++++++++++++++ blueprints/streamflow/streamflow.png | Bin 0 -> 408981 bytes blueprints/streamflow/template.toml | 15 +++++++++++++++ meta.json | 19 +++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 blueprints/streamflow/docker-compose.yml create mode 100644 blueprints/streamflow/streamflow.png create mode 100644 blueprints/streamflow/template.toml diff --git a/blueprints/streamflow/docker-compose.yml b/blueprints/streamflow/docker-compose.yml new file mode 100644 index 00000000..cbfa8b51 --- /dev/null +++ b/blueprints/streamflow/docker-compose.yml @@ -0,0 +1,22 @@ +version: "3.8" +services: + streamflow: + build: + context: https://github.com/bangtutorial/streamflow.git + restart: unless-stopped + environment: + - PORT=7575 + - SESSION_SECRET=${SESSION_SECRET} + - NODE_ENV=production + - TZ=${TIMEZONE} + volumes: + - streamflow-db:/app/db + - streamflow-logs:/app/logs + - streamflow-uploads:/app/public/uploads + ports: + - 7575 + +volumes: + streamflow-db: {} + streamflow-logs: {} + streamflow-uploads: {} diff --git a/blueprints/streamflow/streamflow.png b/blueprints/streamflow/streamflow.png new file mode 100644 index 0000000000000000000000000000000000000000..ac28176002a82ec40e501296b1f09e16ddd52bec GIT binary patch literal 408981 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 qY)k`$d^sz-Ma<`97mxbWXR#?F89Hz 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 z z>fjW#&d%B}6VR<=d=`FtuIIOYl-}|YoI1X{htd0`3fWqPUXRk(6`%7q9v1^KIzExd%Q*A->|Q_DaMV=zpO9%c6TgCo~VRveNg;{()pV0e;%rErpoQa?BzvF3#O! zJpKfFv|Ddwv}SjLfEEe?SOibG4vS=K zD%aad3mM0!o88zI>0e8Od#1G~{o*N8GGqX$d1Gm6XhW=}2TpzsO+rt9U=EJZ42e(i z__e<$P3{DezrUd8v6-|qwQ+rR{v?SZ%sT_}TDMrxN^-;@5I=Fa^=lk}&dP%l(;)Pq z+3e!)KyR?V9(9b|>*&N-2Ed(MfT_b^r`RWuA+2wZbJ!v< zm{e(QhlHbDJ$sl4mnCIDi5Y$Bt$xyjpZy^4(J6QRn6DTUc?oaWB*yMFRz$mrV5 z!TsyjW*c*@-a{W=-f}&$_Q%=H?T3JuJ;do@`@`(a`f;1FA6Hd*tgwf`-{k8G_dqtu zIJQ0VFLZnQeG|2`M7@I(cm$NJXOs3)e#XhoB`23**)bzLu%lbkxuAf69~{bap8TK7 zOHPLJGT^{qKG~vs6?ye2v=51kVIGB3f_B$-ODbIpolbUl=-B*oj+P#!W65)mxn*3YF8z2TpGxQln7vS;s|FtUcYoFTcwjvD+!OK%@riLdaafto+xs}T@fr}w zNM%3!W*H}j%7t#{g*RfTLIni+Q3`FR1%-i^8wPmFRW`UGOW^1XX8F&JZFbp zL>vBX^C;JbR`B~hIsZ0P2E`rQ$ASA5M*lY9M3C2CZ*lS2=wL)2N*`7?!6uyp26tBo zE_Qpf-rSI@+Wicd;Ycf7GkHY>B7^xEr#6-1>BT%-?8*+Z&SL@Spvsnd3u$w)t>W`9 z>nVoNI0)9Ylsi@#ew0=cF;SY+W00goCmonMFk7kKDcVJZ(U7Fxc-d{RnYm&_dj)Y&5G1e#A^!n-0CW zCnd5~d@X7zHOoaJ_vgp8jz-I!ajT)5^`nFqXQR2hjSPv4>`Q;Q{K-UsJ7@)6BAx$ zV5HbJy>UN9yYP|#g>df;BDKZWJol?zEm5A}J9lMuY<+9or8rP8!{MRvHONBDTMX!laps z9{^{jHkA<+3DRp0R|w6zYldrVtx-G(_|SCPPvJc=R+qtpsf0URH#tmG)&*y=_aXM- zVXNFBY4D0JHWoepB(REiZ%PqK1Ve zJp!&7KVXdn!zou3*{%f|3J+#Qg3u`Bwa9@pK5AF24RO~jnOdGnL2M2_adb0hUF%aW z5knSZVE;hN`)dW|4+q!LKYb?lUVVW-ZfMxA`=#`#zP%tKh+xwCH;d3d`LafgAfolW z8EB4VIz{Yq{7%|b*mB|9wXz^?DH;)*x zAz101tpeDwi|d+k2|mxfdga#|s0uBLK*vwm9a&B3s$<&$l!J_otn z#>5Qez6e|5Hk5Wx5y#>`=%S}xwfjk(<7|l=4D|ta$@8|n8K5p{QiNVw4_z03)un*Y za2!QX7#{HR^_`mw-9lhCBgUlCh$jdlnYuB;HbqW{LHQ1OQ@jj*onwRig<2v3(DA|k zz#7ix(1V%I(D1i!@;%x2Z841?{(3zz9&YZMH*u*dx~#SH?%t;4GV{nbyFpRAJ}}QT zU8X$%rUY8T-e`+YuVE#_7e=&6pH_|lf;i9jw~+p=qhq82>0{}hd3fh;QM>w_;#O>} z^~AK6Z&VmCF)J{$y5G9W)~pwj)*jngK9+OsFWU&5q2GCf&@K%2YJ}d~Cp8@|Ta(2& z$Q>$JaYpCRniZm8Yx}qpvs1o`DKEDiK9Zk>kWu2W|I;ynarrgUM?(Onj%1=gk4|>m z$)saxK?L1z-Bq^ox*A@=27(oBjRv9JHlJxz|C@~^YCvF5TrMmk=+kM z8y@WqkVnA#fNTU6QwAbXarX{Z0el^s)lAC%F5nf_CetahvPP>LzB|Vo<9`z7N*WHr z0~RAXV*%OdG)`{^OFIg|ZZBn1x&iHJ6~aKCgzAyR%TrL|fJE-Of85S-Iy|fOlM3pb zDMZBGNE<+-a~Jh%oX_$hA}s{lkvuft6?TZD!dOQOyj`)O<0N2PDx=YeeO8zcU4*;6 zy9qNE)(br&7R<4n!G866JeC<_6W_(MGt72No8`Gkm&ky0m_f5JOXw;{SQ0GzNxYOK zjJp>Yv@t+_cl6*3t=_)HpL$$BO$dvane?)d3w}0R(~#v-Pgg|eHU032UDuLCL`r(S z?J~%hndQ1r_!jGGsYkBWH`&0Wj>he-$y|D&uS){r=}Exk4V!*`TVl5~FYbf!=Z&?! zeuzM5iM7)mwj^z|^Yd(*`0#+Pi;7)3}41RSm7 zF%R~t%-r1-i!@-I9FL=~Ujqhb-;lm`eM21q;Yi-`?YL_?!E7rl;~4!|xa_Syg|Knh zjCAeZO8L+Ps^L*(aGz$2-w>ikqr~Z84r87Ki)}tS+B@Ps+|@2wp#xj`Ecgtw_}ioX zJyLoXkl;nCNF1P>o3KWV>nJy3Xt*eDv>JEv5r7 zJ&Xxvc%md+RkjFgL^MPq0jMW-4y~y)QaKwv5f?C=cH*B0nCUnj{P8a93}>X9e3?Rj;d(X<-snK14~0ynE6ozdn|&HY`T zD-_1_!ITk;Ncilt;!VIf+qgxz?Oa;l>%d!V#JUbS@5bsFJU_d3WXca(h7OoVqw&?+U96)hRU!2S!b->B# zu8G>@mCY+;!qmam23B}qCQZBS1c{j}9RV^KTsoCnw@gHnijXrErFN@ zjA7_nSqmbU-Y)nqeTP#ts zL4+2?vTy7HVljsD_Wt=CkAm*Qhah3d*L4Oy2 z3N$OAXl0)J<0-3`$4uQEnvk-$YCl?srxbev|A!`q6Fhk*)7(Ilr9S#ISDNM<@VrB- zIoZK+DHkG1*?jk(9;`g@q5IQwFh{^F3*`rz((?a6K4mBGI=$w!deE0T&d1!QIiAgX z9%CUe(Vcr>J1#hvl%#iib>XM9Q_*XSv)_9I^Cs<`r_E18pD;$_(&LIniuEwxFcQj7 z0?*K#ZQbEylvgoUxECo}{Mm9t{v%=tDnh?Vy)0T-PWfW&`!>dKT%O%!k$YBWbwA~IBm2C-p>!;9l)*>y;5i?oK@~)wDcYG$=y1$m9=HXWL_K~mFU9e* z%3Q!qk=I$SGNsVxD#MK$@ZFK-yOad-pbC_oq@os8qWlBQ7|Y5ND*RGhX6CRMy;&c> zh|}6tArhki2lCav-9OMX0_6cX-Z**q4h5d4(?HO`z}%Klm3CiUMfmI z*M2`4`qwic_s^iodkcJ)*P$Z%@h{f&z+_Jz)+K|-u-nKhGSU^;yV^sZ9ZSd&C1d<9 zk0{OK_GG9tLEr5f^>Vg%g*SeGJx>#k&im-xE6pe6UOMXHJg6LXT1+b?gN;fAR4Ubz z%+1b65~*K&(L!}^Vx(zh(I0&gJa1$L5u#M)R+qJoQ?t+Rzqoa^<|8ef%Lw}A;j#2} zn{wF1F?M9F*VH{o7{{fZ$g9JxA#dNGE0u31ko~9c;Q(y-ytOsP?5wOCq1Uljih?X7 zKYL9b>y9k!sh4t1Q%t=OHPq8KH1PG!^Cj(j(^6|*#`rCyY7Z@lnH_oj ziEQnnN7cl8pO)dWDWzzu1^J?$>OYl zs-ig+?d4Wn*b-yhmI9LI6@dn4TANrU?tNs_H+UKP^Wx9D)A<*0R`EMrd`k3&@vQ^> z#&=BLT%1KN0)bx8$$5=PkG#mL?&daheZ}Yx<=5m_161pT*A&`JppQz6nQLFYbD0xw z#B0yF*Cj#{zXRB5Bu&cDD@y*KvjYpO6VD~odStbG_!3d?HWah0!Y-DXg{-I-i~^HS zBP|?UnMQ|ar6eC1GqVAh9HWpF6`U(*VPN_B9R1dFT@shd$$A_}Z;#Lg8Gs5SdL$Ym zlAyjki8@{>3gQGyYVM1HxAdEo!6A{aBXrAv^HDYDg`!~DRdOdy#?23Z>~H<{v<%R} z%w+s7xhs91sKOi!7)giFqRg4;?Zh->@4c=6u$29P)c!AK0)fr+Dgk>Q*VJ2HXI^`G zZh8I|M0s(@_XWOwDD)_OKRZdSt@CBw?IyjU)xHisx8DoFf&9jMd;{1=1k_LTKIBnDzD?%g?H`Bt2)&9qGdTnMa^a)A#Eepm zM%4S^=HD}ei^PjC=modm`M=yNDW#uv?ZMpFq_3R$y1<*Itl~DMMHgsY7>uzw$!arQ z;xxB1Xr(0Cf1)Kmc+hly_(=bK5wthl$FTody~6d?qvcbTxDVepxx09%#L%18Esb^& z=Sx5R(UX@FXCE+vf z6SCu-_Gb3&={s&KGTlLoTjxH%X)_SRvY{^(*u1u0wyUiFtkO{PW34ZkcuRU6^WcWo z(5HrPiToK~O4s9Sek+dMl73>=79b_xlDTu5fU`NJVza|-ie(nI8oxgvEO`V>Hl_Ts zP+bORpDbLXgSxu5yc4Zfuji)L-C4->&DZQKMYx%2PQ?eG zzvVR$@<&bH)8txA&Wv4@`-wEE7Mp0iy%^b$_dD{&b~^M26-L)+i2mJxOmuIe!J_Ze(3x&HM1)`eO{ zt&=4Q<4wJi?D1h_-Pe`j*S_YQXFj79)qe}fx5(KCf3Yv;_Lf0Bu98Sd1qU3&`K5r* z4WB_#2JaL-gMlEz`Y-f$JI+!gUNOXJ&wG03*{EJGW5kyH3?4gST`7}Q2C0>V|62V` z{r!qyC4Pz|vJyMrF+oD_ety z+|+ig37C-zlx7Y#f8=TUpMfXh0T^6U_*(mF`_m_bVwNt|Z*%XmoXn;K+HOKH1fQWR zOI$ox(ahRILG|KUwm}Z?-O6t1t*CL77h73v0o*@5rQ2OiuUtg1qbctD;_BrbvQhOV z3yk*QN?Gef%`sz*@e}a8OS}?icIM$mjC6=5E@6`1IV`02BE*u%uTl5vO)oJ1fvm@v~+S&dM3j+7->l5L-K$kO4~50sF6>Px2%c^Y31w3iJukMV26WJqU$_CmWAh z(<=+T{pVo6i6085oLQ>BhceD{=IBnz#y&Gw3BOt{dCC$30iEjkL`L1Xv~x?(-WfGZ z$WbxlG*(wkxgBg6#A$r>{AI_I$XS60&LILWokR5K-P;Q=nW85FJcCVV{%9x}+~fDK zSE#USosSf$eR zZZ%3uCN7b?FlT7p54Oi*ox9MIUnvcXl1fEV-tgrM?e8*Byj&5ZSE2-rCKixNUd6X~ zgqq#>EX8^nl)sL>Q}Rvv{@VeY*f;)KqE&kgqoZ18V?K|*91Oc_Jy+cEutS4#H~M*~ znva08>!h5<V^j=M}!G1*fAbZh8Ny*-Prh(Ik_)pnS6~b98xHF;!wQWWPbmp^f!w^6l`+m0svH~fB5YC#sZ*!OK|Aj zc>L^#Y|RQonX=K-2ihLGD!arPS#VdfaiHj;bj4tn&@QwKNpUTnhPrIm0QXqw6>#Kv z6cy9>wT;r7m#iMD{Uggbb}{yb)mK@O)1G~~X*@%}6XV@nX~v8*t;bBX_6N?$nH$|L zw!`04*j`qL0VkKia$S?c;}D}SX_whj`}`^mud1?!_fUyrCGj6mY3=~Bvu4fs#mC>eJ0LM}H}BYofo-WqgcluK#Bdae zKK@b6*CyrzTlYJy*znlVbR%Z~`-Qn(Ya`%T{)R-M(#9oAzxboqGT+gR8n#$_aIaFg*4c0Mew)IAPI!f}%12Vk zy*G6E^yy<5s&J#U5k5=5aFT_50LYH=*!99{U;yA-%Or#E*246rWS%oEf&_ip)Nzrb z`98s+V5K_rl^ah3_BrN5Y8glL;@Ye0E`~*yjked0AQb<1ODD$PW-RdO^=FlO#1*r~ zH1VM>oc98Fy#@2SuH=WFJaB=UHMcf|?0nx@+201uJ6G|mY7OfUHx7^a9?MJlxHV{X zH7D~mJJD|dE=jos?(5zMd1*iUhbR0w`q(k2sZhEAp24xT*jxPbq(oiJ)g)3m(yIrp zhR>&_)LWF%{5R(a(iu0GHC5X(jFsu=#;!f% zaEfQHyX&Iif>zU$6lRyjl+sF!TtMvdOR;hUL2-sPaDpgoa`FC<=cC<3qc9-_BH zLWpCrRpQk=Bv*3YYOL){!6nr9)7o0D@)M!|#eeO7tZK;St2KzQr{>YY&Wq-e(gDnj zAM>)mxRDWB$uZGySLCXD@2Y9krrxg|W~P6aGnGKAE?jlt|b~zMB<< zmQ$x_()>4GRT;&!UjF5DIJ;8S3*irl!SYzOE5LSI{S?Ns@UdgNEx!BFK%^+|@qdUB zaivBozIQ9$m6KYYa&_ZpU1Y*4=iKF^O=93f3u~A22e&T_q@VdbPvOp)IxQ+{tNO)#!5{h!iLQxea9=nn z+cW)R$w3#TX)QK$E@@8q>v=4hXE?<1rbNKcw$>F*>7Lh=+*VdwWLyGn8c;xXU(>il zG6QCkkY||=SaT@d0cLSVLWtJt)!W@s$EyyF23A=^N5jlr(9)})etkmDgw<6m2!FKc zv0Fm9=MdBF$-or5}RYvG}8tAcAdSP`Qy?!Vc9z{BPQuMivVPg1Y%&v_&4rY zoqjqrD6V`_B0=aaOX5G!`P-+;jBkTKx+CrwQ`4Xe^+bxbOhyjv_d7zx-$o*bf!Gz2 zw`6RI;a5H0c!0erUGOWB!TJA9<3dx97FPd1@@aDg07d@1OqE?4LGJma0<={o*;p3P zYBiQ6GO4g(M}|EF8injLENq;u-inAP`oRg|o5U~1>O-DmWoG6kn1%6VGb&(K2%oQk z`-L2l@W_QCiBH5An-|+#Px1`}fa4=xW!}jLAv{9pp2;bieUd6LmjfJNFOT}y`18I` zA1au)4U^L}ForrsM)VvZpQ*b@^vv9w$@Ye8r0Do1tQORk)wsQoyqU%uRk?Z)0ngd} z+?UL9fY%aI%EHN?_obDLAs5;@DR<6_4jo6l=r~V%ZDjax5+Ouz5_t^@Z~dz?oME*2 zEb~sSDL77kiVguJYjMQrjO~jKEgBmosh4u)hBR7ag6_6({MBIddcz9UuliwQlY)3x zbPkxl8L;b5t*w`>w$p(ud+Ux{;U2yWtr@BobpNy}M;zR1sCkrblq-K`a|PoS;dR_$ zCllHbba%AXXD`BRozcq@m-UrRxQ}C%8wQ&%P1#!yw19*I{yUktXs-kn+^1zUDo%~Q z6m#_-C@~fJ2zf3RJ-$T#ru3?qbBkTV=U3>*(0~{7qD}7nQO~!`TF2z3wTy;dQ5xvtitWAz-CpOkp$uXFJ}VL=^#Qk z%i2CMcx=nKEXyBn{;(Fm<1=|&sJ*~EvM;sGCX;?!e2T3Mv>YtzA3K{}g~BqJwD1q`l>^rPLmg4F*yPD^62yMVgoIb}shLPdfbr z7TBeD!=nFu&TB1!!#o57rS4RXOpkl>==|EejE=o|XU>K1=?=iYMhs`CG3 zZ{SMWwOUvZ@|%2(qN?6g9ME>e{*X$ESl%VGkjlbu(8;SvOEVHZ;2-F}j(YZCNu#5s zKT^0xmEtFRI03ff{wP3IFT0r^qcnbmRKN+3zu-l2WlGOaF=c4MriE+Kzl!1#v_eUl zBTRc+M2yq#T{`Y`sE3c)=g$-GC?HjQ}1(G4rMce5u# zC*Vpe(3Pl~R-$<$rtE7GsnS`#^XOf-$)S%R(kS%2DfI@N2$zB zLpCt_J3JA0`;BFPk_5obO-n){#29gCc}HiqTzwd;eiAd-qgI#eLB$NtT-Rw(VZ%>p zJKPuG6;8WIAG#JcP^z@Z4ZChZk}}QuJmmpyw+}Xm!o&RVBNBa=ZRbQ5K1z!Q#4N=0 zk!?WT)(+h7{e;`inh!-`18xkqIXv+DM_L(00?soC!v&BkaO$YgJ`OTV#NO_~Ua#QR z?`Z#)cD*cwo4UrqA+pEkB2#-XXx+$kWo-m?9MKnO3(nxN8E3AIWwWA@W-?B3N28HU zSn)Y-{ZG*a%DV97WiJ-@lwfXH)Y{6%t(F-4qumylx&NmWShXTtS`{BgM-a+71y*@} z9qg0JF>K<%8hFuNhijiioI>au3-1n;dvq=`kk}^DAXgAxScZU(0`&Snsk&|fiZfAr z<{0~kx4#+aV zeB0JpKK8(i=!w^hw+jbGt)SnK4BCxvbE}}N0q)!|;z4;lYC}4#=e|QcPEzYs#%90B zX3z-lY*3c=FdJyUkJV?Xw7_T5x3;mx-dn?Wg?yl(nGg)|9N?HP<{rC2^MQk$< zVApe3S=AC}&#^|bNuK9{)rFIOrSYRY(1EadIyjA+Tjh;oq*MhnTUH28axNdr{|T}=PgqB8plHE@)DN%$fc}?+SNmUWhvq~4O81j z1)30ArC1hUiU!4}`+E}%$>1!bz(|H9Of^ug@7ludQf@MSLMH5e$3RugR%O5^N9odk zAfr9g@((jrE<_jMd>I)L(gz@kQVN4_lIm1HWec!^&#TTw2X%Lm4cd=T$xJgL2|Dh) z_*GRzvwpfqvXNX@&Z-u3xA0$8HM*o{2myb&#JrTykmt3w+|oH>ZQ5L$Hu=Q@6XxR9 zS#;FC{-!)Z7|qHd4C%fY#rAQfTU(lI+*!{Z9IUh0EdPryj!9+;&8^bEk(jxXMiM?F z3?%fis{M`RUoadN7H8MC$pBJa#iF*lm}_CD%R=j0MqRgzHp1S|Z;jhcw7&EU+pN!- z+t~N7pC-C#y-h-q7w#a8LA(6(6kw%YCaLD>49NWZJ4Xu1>%uEuB10VHEwm5wYhajj64ASm~sgZvQ~Ey}(pgAW zvkyM$9!bP75iy4A9VGM=P7F{wGI0UGiEi)z8WnLqkIw0A9IXVv%jW-D!cyhS*1k;d z(zoz-Qz=I5!@*c-AY&~$2#X-vB&RmUH>bquM-GVb1grIJzTMVYXpY_^gZFVXj}?m; zkflu`RvM(1rGidk*2|m{_bu`{?sNgPj^YL1mYtZUmD=Kv|D=HH>gyoUA%8|?6!D=V6H^gHh z;FO4s`0+TCO`SBOJMJEdz z2qVIV8av_JPJRUoxH+f0q^au0o30Cy|9Xgxty&pMDt5Ezys2$Z?SUSmf%;mS>G@@jE~p|P;qXC95#V5 zG8maNuvqAu?q2=ix9Ly#unW54I$mHebkH?&Z4glm7=4p~KQcqZ!jDgJ8$nhLSx{tc zDaNVLGMH&2zU^R#_T)s6D8CmzX2%b4ZgI&yQJVi*Ra3n9;EvIl>A>OVrsn>QU+{P= zWcktC73>4n*pT?*a+!o^50M3%r@*w7s@fE~2LnKyOPZ{v`r!Lw?MTH={4e`k+Jmxl zbALM(o;2<4L^P5wIU2=Oay}whh8DbPISFfOZG7)9z0ZDvdCifp@!rq>_|l z>aIas_~vXyzZm4NHa5l`9k;`1IxOT2v>e zs&*#}8L=mAg%$@ce(q}%h*rPt@$KoC{d(MOeCT=N#|>PAwwKg6=Ee>?@py z+YZ#x)}t7iki1zI;L2+|!4Poj;nhlZ((v*r_~Ff+@eeTlkn!X-rI(WN@d+ht<#%+v zI)TZ&*eLng*CKx(;gI=HZ%49(>Vx!ErnWW8_kk$V<@zr!)knn69~0_hjh{`!+9zvd zy!@W*`K{91b-QP2A-BOH{5^z|&_wD0aC^Ar%Y{MQNg~V3duu7Xr@!Eug0M;pTZclS zZQwtUPaHDBMbw1o)beIYZk1o5G`6By3^PRderC5eNkjz9m%VmR0QyqN{sfs*Pv^N_ zP=ArZ{tvWrC4&nIjJxIotMN{OlQ#=Vc-=v~^X*A&GuA205QztV7#2Xy23>idQOxLs z=_8uSAK<*kdsC+Y!fGcO_*^A>3^)9#!q#jcex4|CEo5W|#hYn3fV1jfK^N)kh{whQ zU?*^9*V<}qEFxbonk!mSKbAU-d_&jAvZ;@R5K}xL(0d*bAnY0i7f)jrZwtaT0nZkG z?HVT|lJtN6GI=ata!|tE@-OlPS!PhsBPHI+=%h%b-Yzg>1ntdvpM>(~j62V%eg6k~ zjOV2Akc{MEVd5Z7-hjYee9R!6NK~^vkpthB8o9nz0@99S|wfj%2bjZy6pTiC%2#9}dZg z(pN(Z$H!e~2ryop035Opoay)S)LovuGgI8kkJfususg3)<+O@DT-lvWtjZ7c@$2p3 zOi%uTpD$u9h#mhjG3WNv`A7ulhUhW~A2|5-t!ahTm^|S^E1Fi-s?Zs<-&b$NFep>~ z_*civpA|06zdG-sN%U?=;X7N$Gb1rmz8^vf*f6Jrd?#|!okea=)MTw)n^YLle7Bg+ zH?5Ta-nWs9-xQpybxErAW?)mUp9ZQq?T;PwTWxlg4_X`_3fOxtqz-3d{$40Te|fh$ z8KP%@!4>mR@BFme^^s56q1LCbz6e}tci;m50|gR4Sz?Qf_w!Hk8RB$1e06HmOC`UC zvuxiJ2OREy#p`Jy4YDiToW4Jsl()FPG&S%1*5h~SBJ1@(9cn8#7TYb)(lAO?t*50F zezmK8MP?&!PhL}^enDrXT$7W{r%Vg~%mvbkEoH=U|)D>5+OJ zrB`&QVFI@swnsyKAnjso+Lgf;2Bx=UgjjG(xFzg2B$&=c%ULRZ2H3iGSJa6Dkl{CU!hdx-n8pC z(vRo+lkU`eJ^x+(JXj-g#~3=vV5arvMV9yQdpU(t=r{7LpG#J<65lQtl+Jy%GgH_elpCIe z8(A6DpQJ&3wgeFa#X_N&7jU+jFdnYq3~%H)J-PJDdUlJJDz1ObP4=tV+(tQ1%FSBy zLLNca-osK`ui!X=<6YzCvn7aMR5vMGSc8w53~q8;;3Prg_bi`D z2*w~OLwAkMf%#@ylMAI3qx>-X&2H;To<*DO15e)73s&{*FQ+c%KiauA)5WuUuBjz$ zd+vhB`J1^K57Ejs{NHZ6WR=Lut^C*Q*Oep167m!IAClsPdHOk$XTNr=E!OKX#oJA! zjZd)BRrtn+@m&baGI9rRJG+>vPXka_W|0^7Qo+3(_4 zS0*F0KC|7<=(6!K!hY*>T^4IdDhvOBQyPJ;NGB29Ir%xX66ZOf1Sp zV$G@&Eqn^X;Tlc8CA6)0)q>!q>UdaT7UNfUxnQf(ubqR$Vkn`{>GIY z_nxi$FNWCc?|Mw^3(QmogYI3K0#yY&-wLewbLwZawvE(+P6~6*atfC~9|stfee+_@ zMHapc9vKKTGujfys>XO)47KYEXb)<9o#yt&a5rPRk8c67kRV`;N{PE8mFn9y zgTTa|ZmmsUsycna?G-RGe%CYGjC!`RX7zo4_e|gKTJ@paYl<5(cMKVTe)9xLlg40` zruQ0nMCeKv^7=5(K|?{8D@q+q=5;6&Zy&72m@igI0>k%JpDp z(u5@XC$5HHD0pT&SF>@x-ltbVK_j&Gbx8<)eshy_qv=4-3N859GvaQR;P#(K=hHPs zv=T5Zl_@nDLLe`VTHY_YpoP8lSZ)|(6}}TcUcMi6>;dQnR~XEUagr@HAZf$6d+Sw` z)sQw7^Gv-pd~}bnA4q8PSk#`GA9Bo!@;u$(fW|r5#rE9Elu~Zmo;$W>^g!#i))Omd zi(ex6a@V>Q0xynrT&9KjYhajtQl+jmneOp&S=0Qt?|iQhhMUhFEV{T}F(@;hA)#$()oUa4jrthYGxpI0x8`v9MZn=hfL`w|Zb6&h0 z`)y*?-XV$b#n}*@x%4L00ZmK5I%j~~zJw`96NX0zf zlD6(U^U$lYX!Mm|mu#ZyR?IV(l1^=iOi>TB2(wtQZP;?+@ei`b!=FMzeh&_&k85;w ziHCWfF}0!!%Xj=0Ra;tew#GK?r^})-IRvL$4L@4x$ElmoRlohYqt_NB&Y$xw!7j2N zbgI|z=ZhsNR^!||+D4fNp`;4ypajIdI5wG#$2ae9qm_f6+iX`XyN9x%i?!I^u0NXE z$hduxS-^Ur_0Iy!rH5z5e-c%shCqUfLG_DHrH@|wXlpxZ?PuCg&PSa~>P12_Sn*_0AkJ_esQ%MJWCS5L4?=$JHH!9+EMZp8-FCjGikp_Nw52ox+Q zn?h>*gu-h&mkxHT!vBt`rLb-~S~Z<#*XFAJya299wSOylSG_;|x$1n>SFSSuW#Mia zT}!5j&@QPo9cvdCOZHbZX=WVL6w# z3e}ckvQK51UWGw9Z%sSSjHARhDmylDu{N2&1uh6k|0;=9oM|Bj=xZ8in3{w= z7-K#2w{~p!w_V3k!nS(_WUWhj4=k!X<(U;6go7-&d)0DVLiEToX}-H#J;fBG0NNGg zi}^Wh*PD9w57;;Ja<7vxFneIZZouKz>mD^Dp0F zywmpB>*YPTtI~%R@BKH57k+FBewz5NwsyJ3SGRmrVY4Oz(W*whV9G8{?Z#QW4GiSD z(FJxt&m_Dj@F+9k6gSg=_OiqqkB?Bpls)W?`VEm#q0x#SLG1 zt@iQujaUOWT>HfQu+!yw) zpD(@v$9I$BnoruPO7wGV`@7@jnyD2roK$zFe2-7mKTTyYqmeGTH3R;}q$m>SrLH^I zE+x<>wk^M>)1>iqe%-}qZB20O`UDAjZkkY!czDqB)8<>}xgPoD)(=H*ed^YpR5nZ3 zzHv0{N{^Z`s8XaBe*4jT9nG0qCztamPeG@7#sQv2Z@kwqdpT#ldaQAB4*IUgT~6kB z(AU-VQ^(5RY}5KZ`?+bE7O1Y1c6@)z-qq5dx=+GIE}3M!CbPtMOL~2fS6mXFw~+@u zG8J_A-R(Gb)8oH-d)|%a)E@W4_f{9#M5JYFlX}sj)QGr-id_jYn#XrE`$WyA_>2W# zA6jsdeyNu24lAO2=}PEycnRxVt~*h4tZU;*Xv)`MAtc0<|MCD|Md-A29QV_UL&~S) zrVEZ}_Cp~$F~0!*`>x!#mGK<8-7*n?jjiWdV85~D(wJV^bw4YnrK(E4%!>j*?Ys{B zw;}@C|A8JsX|e|!pN|z>re-3UN#adQNOpn_D=n64w6uj~a6e}5vnb12jbQuk#DAav zeLDBrg(pE5mHz9G&p_TL)+y1!%*PPA!v(kJP;W6o%V}bt&}CguYRH`V67=bX_7&a| zb;QNzEE9THF6Zo5yI!o*iT$iy=#ps&XUIIf`S5g{WYFNIRrCG2a)3PVZp3q)z5nCw z%9K)LkX-f4<2T3&EgoU(_nLRDyOQqqZL<3VV;MoaF_f(|@5u^#1xHO^18=PQpoisI zw;5dxx!t8AF3a}l%3puhiC43~xDE|eELmI5X5Af)9(ovYprA3noW5rR4D`O(brbk| zgnZGaRpsp}Iim3@5~H3PaI+Ig<&M2O9C$&rRqXnp?+e9?ISz-xH`kvgFe^(IJ@tC% z*UvP-^!m36=za?~kJbM;I`?=c|No6oWRwUgGKZp;d{jtnPD=;JvQkmbg(Nx5*&OCj zDa|>Q!&H(G%W=+gh>;j3i#ZQ7=hK*(^}D~n|Lx)7;lAJR*RJbzJ+Js&0Z_04gMU{B z(`@t);QhfklG!T%K#P03L2UE`u8co4N?-M9RbTfM@B)Xc)Kws*+?oYYBktNF zrLU*fkgr7Q{%E}wkhpr)sPG}PydHIVRqV|e|60te)cL7GN*bz_+fC_S_4_($D*8*k z{m~xtc9x%cDCIM2o9=&Xl3sSx{@|Fm|I?KvMZCL~r!!H@C9pV&W0Msj)Vb0svT6>% zkQs8N$*`$+@-Q-3TGut_4vQHb|99bDvFFj{^V*lL)Quea6csJ|{Q0ZfP0O##F@_}PI7^Yy?g01?437Uo(+!=r+MRa(6atVU?qkfdco3CBpIq#y^=+zW(YU+Ag>z9ki${EB6Pxx zNhic#PtT-XlXMg7M7YyC8zGl4L*-%vPuC!hC$RG>ONJuVDV0B6^=qKmX$ABGMgd@D z<4Yk4aXq@{zi%qqd^G?}g7>Rp^N5bZ7!r6kopgxSCLjO!&OPt%f#a{c6OKz zD<2w`h@%gB*O@bo8-*(al&m5@@(h-P+u>b5a2x0@ZAW9y zn`>_}#$iRu*{pK&QID_8Eo7IO!_`_h0AWfivs`be3_0adJMRip+%sa3?8SD-(s>=y zV31@xA9GXg9|%}OTXb58T*4t43#4o<=xs>evLP@%YCR3YqWhF3#<+OFin z5D*p*fA$YF*xcjeZKNy8!{vP9pNEOdh!M8YKqX#$@Rsh@9CpzhEt#w>fef!%h|+h$ zg?YOf1GT0Ehph-b6iHeBBR#^`M0pHn)tGHTnceQARV(At2Y*qm8VfvWeLBGlC0l%C zfq3Hy(GShi^l$KKx^&ygRZ*~_Bg5S>v04!o+2f;)c1{$JoC8~kDSKaf30fCxH0m00 zjRip!QCR`=_k2VZ;-llyzF6$s=hV!x&Z7L!01E35&!ldo?~HOrAG4O4IqI=V3G<)Z zw5r>N5R`qI4vTq8hb?D0(-)dAzE?WI2jbsb^hOPBG(i&e#QI`Xao&6#&2k;1xS-`= z<^oCdIS{Zag(j2mcxX}&IK08F4tgXgR z&0BAp+k?*nmg!%XG#ox}h$)82E0?MDmv|Y6hErn&4H&pc5ohmL4ELrBvzt`*cGAg7N|H*MKscrC@ zL%f2);1jFH3^}-b47_Q&pK*`?1uXYcxeEa-@>OJ`N;POIzt99Kgo*oG_V-VJdU zk<1beQpP&rg6TC2;{vy~tZ7L0B`)U9!=iH;TI0FY{4lR#&YTVug!|jE^TRiZS|Vty zn^3?s>0Os4D*N_mCXuUqkhi_zUz!DyVY-KP9K)5sfey3gPx*Tf`yj8PqC|DDDP+71 zH1A?1ska+AC2EA=Oz3G__A&5|e3d5xH9g+mFkK(bgbgOi+I$e{ z0@(L72Y&~9f+@$n*MxQ>?>lR3SnpzE?Ct`s(2zfZq@?IK!PygIF`yZ@)w2McFOU=j z%4#G+PKyd^0v=H?7z(W+U)!;W8;dx@PaKeMm8Sog7T?UoqiK3tweG3IgH`zag&MJ2 znN@>Bqskc}9vj>?nI>{Rf%p-y8w)@r`8|_q02!gD!-MKNafKHa^&0p%z*S)z4r7uC zGQ2SKZ5;mAwk552X@RO((e8VoVZ8JZc%3<{n2mAx66*HzU)?}xc^NA-OSj{yI1hIUP05f6%>r2Jea3K8*?gnk=z%}59i1@GQ4W3+4&PwGLk%iBW^PuDd zP9TD<9e$Xb_g(_18D-$*KeUIT4_pm~_2`H>@yw0#rI+tVo{!KtD1kKB%-NvM8OU7g z3Xp~ZMTzD)ueWnCb@)^wLajlltllzqo~f$koV#ITV;8=PNQGWYAnAtdhTDPfnqlR| z%++`NND!xJz&uHIl40QSbV|}ZA{}DEs|Bzc`4jg7tjBL%tQ^cN-uwrO89>d4h~P#M z>Bv^*O|rch1Vx^qaj_f=7I3PiPx19=hq(a{%f?D4f{}%>Hoa519caIl877PIA0*Er zfIeb8nNxmPvROAP3&K;lil)Fgxa$=_HD3FxT=UqGHQH!PsC<6+i$TcFW8 ziMiB%WdZp6g84NV(hMk^5!oA|o_K{hA2xq2^|{B6b`%o&6&0bMeTDwj_fMVPFlcV^_L zBTi?FcWvh`l8T>4<&g0Uc8A}_m$?<=U1y5ItVb)7*GCvd7Mdp3gJW9+7IAYE%s;@u z6TC>={qn%((gFpzFkeEE8|*z3-Cfp-nf0l>QCvF3zHr4|b!Xh=Yx}`4TA0<1%B}td z;JaK9penrPh6QbHZo(G~ph`((m>$}H5vfF3U#wYZ)*os|A{<&5SVyvhA^xNZOj6Sd zdBMunMIN6z4lqIrhx4EGd(5-W7$mFL#gn8N10h?mrE&NdnWoOoiM1Saq2G&*KT62C_YHE#VabDGMml?sib|LJ)W9$8+YBSEo z`JXH!j-eM&qeS49m$$6nf|~U*{%H>+S8$buIWI*3|cu5EF)-J3L-1-fR zi(-@n|B3>CA~Wmc(6e8XHA;uQWsH^h1t#QuDasP4Xo}wa7%C_I2a`pTnO@7upSdUZ zCLAc|oTam`knFQSsL0JWVf&^0FJV;wzIN?%oKbi81|7f{5-bj==(9n#hAj0llTbD9 zE-m_q3N?3}1uDR$>0n55aES#s`JzigQTZr^3(EekZ$1K)d*a%1iE zCU2eCb&aA6L2{L99pI-KEbMW?G=rCwX7Um8XcSVl91=C^-@RS?umfZb#=}F^aQAcTMh-5iV z->uet>K#4iXioS865agUnKOWbiQwh(FjqDa$YMq5CGti)iiZ|$^7|;@^w-;juEgC9 z06g8RHZTES3J2FfgmAo{PD3XArn5xo@@$~wfYzT9Fcz>S-Nc&H2%)b+DPTpg62BhF z))yzVy|ApqzrMbbnJ?cE+#bZO14!7$L2&6#?hZsmLPvBOvbn4h3~$;CugASWdxvCg zo{SJlN)GX3CWGNXe1A{R&Lkd;w-0Ux>}QVCaQY^f$eBuDg6=faH-Rq)pu){CA8NbLK0xd=4BLPWdjmg=SCtM(9g&jo{Of2}1J?zRVHy zCVqoc^&zgZ42S3|UWE@EycTbs7MZ3u1}g!OKMe3SNY-g9fIVxhobv)B@%|fN#eP8C zA4c5P1b7uJ9_G^7o0q4g{rR9ymazF}_z!fhL!TexE_onVcK)A*+2LyX1+iD|P7!jHqqUvNRu0L%?IR*xt zd`AOV|4H)^zJ@>MVXVts&5A@mmz>&~vzYE)sdc~lGJ1YZ5Lp5o3w6Q(i zAwwf zqMXZ4JEN~OWNq_Ne5fl$;cY6o>%Sy-3CYZzDc(C{*+@kd@Hd&x_Aoueqek#-EG3w~%Ik7CkGLOn>pDOVrLUov1;`vkeFU_vI&}OCkpDTTT zU22+CduirB(WOzJt8~vm2-dyx`g~t!ia=4Bao_vk(i&O%d;pG5;1C_+p_s7;XmC-9 zy!P6J#gw(8->Z8Kzlr;KO5=9(IbxN;8NnVEVdcTK>8(YXQ9%P2Eq(Q|J?(a8hQn>M zH5Co2J7Z-HB>eWgm6`44O!AtJ(`0XRi$omd}F_~du|>oRl&>VXJF zSa<-NWy`$xOdTJCKZbF&PQ7u~UrBYn@>EG2Fiz+iwG818F{FRvL4Dv|4SHQayb{HzKg`x z^FQC$ns25X@7%BketGZ4A&O&tt?Q8IHIprOLJ5#=$XxxSYqqP!)|`4-A$dPdW{JN_9a@{tU>@S-g+9@gjzo+Q7v7pl^3*m|p>n0&pq>Q6-$E&jNTlb0Ws_;d^t z&Am4v#5SQT90-a@?&lB=&2n$N;0(968K&{e#1W>yJ|JSnKtRp1o0={4<{F;)IEju1VORta^()E z()TN-8UPK9uVhx6R6UXvuXvg$AR4Vennz&>JHY=!Oe0o@iDkUWYGA2ls6P^bT|Fw$ z1|jMncGze0!36mBK24dQydSDD#p#=wE^gVWNU^kd7IdK4o>R1;vmH=b?7PYXx0t3M zn;yt_Z@t*^C4*<$3#{%BFENY9fXO+qFZtwKH*j1lkE4s~oyZE@RK}^5Oyw#&M@F_^ zKuB)t%8#-0M6X^q=Es8I{2!rs3m@Oe5m$jH^UmvrVS4DKcAsF93{W0HMNCek7edU@ zE10kx<`i3{q)>ggM#*D)p?X5hcbvjuHIe1BVxRCA3CczSE$jyEA@M@eEbfJaP0SoB zm73!~hL(1p0r{=4{-2N*WADJ)=DXc0?no278_*&hSIrOGc>{8E1(t`Nf>K}s= zOd9$s8=yA_E8@(LmNxeLzqRqWW=15`*`-*IJsfL8?f+@f9?%I%(uP@l2PsqSeryUv zi1CB4sCHq1-a=P=qIo>>7cc{#Wq40R004%oOw)9tV8DmyV#5m6NAsrGNmm()rv#RM zrn(bWL9wiT)~)rmuFcwS;jZ6&i`EG>h;s_kzR)&BgWY4d)#gR z2P$jNeYBe2?juv;sSlYi8yN}Jpq5B~IDOpU&65FLseq+-uXL2F`?&27+FoWo#1XT^ zu;ZY{3p_IJzv|V?ZNT`k5H7eTU{N37Jzte%lJAac-whw196$Uf^CtCqt)?w=Tk`Dm z_21?Ea+uF|?w>tUI5Cm*va^|?E1%`ON5|2nW^#_{AK-x~c!AlH((UNrUA3)DlzSjwSDSVw<%sY16+v`tR&&dM)Qyo*2 zVq3B4-4_Nv)BR)G?qi5psp0%skGfNk>q^eyu0QpUI)5n44m|{OM0voi->F>%WTD=; zELn^sFo?B`k~ea*N9CM$-nZDxn9Ddn2h0h+viEmhZH`>s?DAyWv|R?|bq`jN*)7qn z+0o2jRcp|g3bGVCJm{gRuJ+eAB{m~N_E!U<;-T$ggX+osrj19|baD4{UQfMF{Na`{Q88erbhzys(7bt; zu+d7FQ?OgLtSMyQZL>aypClf68hFU1 zPic*GD+>$}cI@Yv@Y-FzQ}3Q!EF3JpbxkI13VIy&>i{Z2_w3}CfqvU=6-omf5#>`! zCi%*XbZeX)EWVK^9KQTrYVw@TLm*MtJx0C}@;p3`du$JQyC2uZ5PFHvy#A_Ao~uv3 z89S!Umi^j2xny|euS!kbK)AyA!qL}jMKISe&7X(CjxDl+EwOvg*-EQ)o{;~pk=75k z*W~$Vi3P&Vyn2PHQP-b1@ikis2sk1L^D|>6wR<5q@x=qRr6O&eYj6;pckOhdx%JKI znywC^4F!-$r;1LQU|+&Jz6!nwRqfe+xKQ9hrS^O64}B&Ic1%q#bzu1~$=MzjhIdM> zb02PoHO(d$y_p=lM33U%?k_wW8Bv%>Iv%g>(V^%gc;WJq)$zcY4p{?fR!0Xz>05iqW1>(vK%>SG zT@sGy<)ybN@NtoBvyd|feZQ&2XVY^;Y&t7slDc%^TO(GFrd z&8Frlv$t-v6%aOQ=LYrH-GDPLWyD$$X2TChi7B zu28qb=l7@g=Y%@|rb>GCCL~LQGy9>gfDV=6&&T)#(La$&G-H3rm_|kkcR~+U29Yg* zNKSQN$GpnDJEj`%6bEW7+*Id3FMS@PZdi^jWtbjNEn({Ee5Q<-B91!M0(f&h1T(Pk} zaYOvjZ}5&qAH<--9l)!l)O^1E?s2YRFUk$BcB;ZYxv_JB=={bfE~To|EBx1X9W6vP z&~sb2dr}1(}b(JrZWk^uoZ&>CgtINUdP#9Mr-GAW6xfUB)T6>caxnsRQ6dp z_KKfls}`HKdjl9h8i}PwZPy$A@Wf1}Fhg~10AjE&L1>ilh9^((J=MRcqnkB^1 zemyAWYT<+YPgqzB)pytI%^v_;1WIV*%rAHc1ISHo_>mPnBK-~y&61vWrAW7hIf$Wh zj;-cBwVdQBb!&89H8sr^xqm+<>oa9<`KU#jd|5!?eK({b=Te;8R8ilvdxhp=Mh(jV z8Zvu|v&l`^nA!V*m`HG_f-a^4wGY6uxLEUA%%n@Q?Ff18;N(kOY4NqML(1PDr?=rG z{u_g?F6;=25PEH%4WCLrMAiOXqJcSm?%t;p+%J4Xx7#jfOG=MBwU;dSr$6L#P>axc ztN6SC&kC*%YVk-BDX~<_{vr#0yVB|cVaO>xfumf+#i|q@d-FtrX?8SW!)^$ySDm` zTF$Om>-oI)vr<2X99{>R`kzo~dFRXB53IQY$K8Vwi079|&->n;MgKs*buDJ~bJeDV zLMql0y+gawDlb2Eb2s!JMVEBlaAIqQyy0u9df>lf3{}Rug6O)8gByN5C>#9)YuoX> z<7|3sID#EK)$Q6Muf3YLc|74&=$((x)V|ISAL_0sI>(+NbHeg|eg9$SmVVky%@8g> zHYMYf(iu+MirLHIUEp-7TV zyvhKSR@C#EGfIa=6eQ-(6zivWPd(MlH~uO%@)qjmF{N=K?N+p3>|xa^u%e2;0M_%s z6#;<6irg{b!hrqLIDJX>ZVN(EUxppO(#+FawI_H?ofi#C?(rzjdlrx!c|@W_dh{vh zh3DXKTIQt%oi3B*&$X|ve*k0-BLw?2V~IFso))vJH@X%Vo*xM1YBn%_ng__Fqa zt4gQoJhh&giV!|!$N%#}y*4@K+>_Zb{WZ0*YyK_)1-$2bCv;^(`4VhzB=vq{d#M+9 zX`|kHca{1d)5!J9xOetp?d7r;M8E9pi=kqY(-uuM8N(bk;m#H}=u?w*8gDeMv*Acp zSt&dX937WcbHY2oF>vyKTWmSeljDQ>cskHHp$=?S(uO&CoaD%R7OCqELvi3e_yZ!%jT zJ}6vTiI!uYg-s$qA~`sz;Vz)JCVUqn=g=H^Z5KX9YP*>3ww~`|NI(aKo?FwwY|`D` z4Plh(@i9k0t*+m=2zf&z&wL!_gi$vQJkF%*XTQ=XMy~Ye*Hw3HlNDVd33yX~5Y*EU zBU-(M$V2fiE3BEhD?3X*f8p%|s!8aL9@lkM%;Lv|@Z;1M$o;@r2AK}JYqNP6%Gi3J zAm3mfLU}<97WmFWHufMgQh8ISGhZb44bcFx7|#aB{!Lw{&8U6IlLjknbO9mKR|}+? zIn{6FI*E*^eRS%_&JHrNDd$?7Pe$PW*DL>#6z*aD$q@A(A5EISzvUMX(EmbG5XtrA zATUvHEtd7AfyZpWy!7OAc3MUrK70#y&*4&fD3vfq>{`8a_{l{9*8?@vYe4c{KWkM_ zGtxS;>LnQwExv(DiPyOVR$e#y^vg)c=uQNf|J#lsY8>$!66JH2D^M2I>a8e>`WsEj zk_Yza5F#+V4z0V6;8C~Y{?Kl>Q#tO)d8rVeFU!k#Ou&leQa^KSetXeoBxomw-))Oj z+T(4^SsTV)LgSr)Dd4;T)^+}t;=I9~PO{U0>)Hh7+`D>4b?3x-*xni?%W1^v3&Q`) z_iRGtu0O@YE3blDTr-{8Pc_F|4yL31EHSE~*hE7^-*!|7gW#J&=7%vy?*0JlM*|iL zA}2ih(Bzfr984zOJbXOt;q6Fsz-&lIn73q%Kk2U=8?3V#W&-DL>)dxW-yZ+VsFe-`>k zZar57oWPOEsN~CsH6E5y2_TfI5G`4VKe}^bwSk{Msn>BI683E)m7&as&6;pLZxE%~ ztSrC7g&4!7n@`m;W~Fyq1;mpEHrtIH&nBCh`CGc@)dX7gZw=*paJ!}OM`@$ym=6sa z35#3qzlQU5oWO9Nd|Z!^^zO)nEA4NFbS-uQ!hivGPGvH`Jl{m3b^yyTz;?fFTBm?N zc;+!GE1H(C7$F9EKN8Gm0{!X}3}9N7o%wqiQR>JW?qBF3&$fq#_fo$P;;-MkpE_Jy zS8j4?F@4D47lmpz%+(0$xUI7Z zO%|5n8k&m{?lRj1MEI~AXMYkub*+g$_H~Py_h+lG?s=u>VC~9!wNALhDnhPqSs`en zQ?BtjUv$R`MS0!Z*BmM%SIccmD4499PGPMW8<2?R#&l_hoFNQChb_eFfgL=}^|Jx5 z5ox=fwoD1E$_cayT~@oe$@L3M*)Z#}i+u0fEG-R6HV=b$a(Rs(KXUy4m-l3Fr{eQ* z4VavbIXyQN+b0Cb88z+c*ZX#)Rk;_BHC$ZEt7Wnu{Fifsv5=RZ&ppJ?j!iV^@~xmJ zUI5?C!TWa3<_0((QQ<$;xT=TdBX5^!M`Hb_EgDUBUhS(2Qc4V9{o26!T*#jT9r^PJ z>jb+UOjbTRJplq}_Vzw{zV4~kH0JO;$6;-gW_DrL`cy;eXh}(b$lOZFn<5t4j?eLz znTWGvbW&=kQc@F38Y-t5fA!GFqj!>IT@L*t2jG~?3Fmt^t-_&ldNl|t1W0PRg^6AW zk_$mQ0{xj`dSFPts@nZAazKSCtpPECcxS>IS|K_F8jbsLmbO6(AEmirNP=8xeCtO= zvLbpTkx#$}$zou0N>t3vjhx2k#byAhDoT`(o+w0?QABmXn2{qQ;nG%hw;IC6-gb^{ z?*ft0MAi~!!E%e$Si9F1jblUk|E_A{J~}~l9bId_I6iPpYHnB0DOp5ig+!*{d`-3K z(0mk&Beq8G?dR<2g%i`MTos4nVgPNjNTX0^DkJUZY0McS7twv_ZWb0BbB&pLSPG(9@Lem{SW{mw!( z0BBD&(Rb#dbr20u_qrjV2$_>ARJB}dv*NW}#q=ng3sg+OiX=Q1V=XLD*T{T2_p)5B z=SM|f-+Y6gq9eN48%}~@QM096jvlF-ilJfOUp1T$>DalA?=fZG?pr9suBZ=gR zoMeY2`vFH~D=&>%BWq*jK5jPOKnfs~agSneo9oHusE2T_uHL7g%n0>x6vpDURKW!mn}sjVG=%0xX774I}?QQ86%Z{K~@$_-sXmMATpE zX_&}QZ){3;fV{LJWIax0rY%O(V9+e1}$YDhv<@2$-;*HT(zZ>m3+x}uv}*v^#DLB5PJucXq{Q9ML-6oCLKTK=t1@p0y4Zxq@ zbA&BFerzV5XdtaSk@Ftsi}mBqok~#7`H9n+2oDvlca8Pb=DBVv0CC1Y)>k2T8$`OD z&Z+I?w8kt-VZOYTtjCjacRj7a6?fj_iFn>$GUD|@yULkd`P^~fwztMpdw(&P3jcv3 z2~$vmlw}NlXNlQ%!Vx}?=uvMMWAKiw0PALChDm(=HZ*C4nXpQR!cS&dn^<#fEHfzA z2j7M?HmKE>i7kYLTOENgW=Nml3h@Zww|p7V_CYaw19YAAhzcJs5-Hq`gnyv>P|x?k zc9H|-VrKvRC1S|ZG6AFGP`N_A-9Y#U(jV7vcqx!T0^k$z2>S-#D_lKoG3v$w_ZuYM zP*@l3gdoQ^=*JxSsDNDHh3)b;7g%_9)gpnY!>EZJ)cv83gB@CqHN@I5<8pYfuM~GG z2X?gUA<_#-L{MKmI>7+g6ICE9cbEy?3=c>4)b)K4u8o>*_PV4k6)WGJ7 zNuqZ2KxBOV8VS&sxuw|EZJ18j-}wA*;IH6(Cno!}puvCl_{jOT@m#dubXd@b2ACR!7 zf1pNhLDVKV;kmE13`1$7i9y_1A`ccA3mPjaofUfww};a?tT}k$t#dY8f9$DNaV1NI zn3u&NC)0<*9mLXd(pij`@E!FiK~%55Txq+8Pd;Q~J*dQfgNgmE4p7I!!t^vSw$%H6 zN6t#?sJsoP_9Cq3}G;dj?#7!z63ZWQ$ih5E+?(w4UJ}SD)-Y!)aBQ zCoW9WKhm-5=naY#g#{291PTJj+!On(ks@W)doN~7+XLT}g%W0v| zhP#|NeWvZSU|8!2y!o*m z-aX&}Y64E}Z1gtAm0-S^`;lxb5^KMQP}pEyyt5ZJal{EvWIv8Q0|Mr~7<3$)KR!QM z)cXoazcHs^1=yR&muY6^Y^>n4)oWFts?GXY;+Hl-^pj1B2yuvdznV9dgjd(F&@2{o`twdW7(N zFieUUNv!AqZ(-QuWF%k;gQr4I6-=P8@`f-*kIwoA>wrx}X*&EJ=ZeF(!&}k(e&nC{ z*oQL8sHwN{F_g$ia%sE!vVMlo>?&Es!*C(?N9;mKn3;?x$E~r;V`u|o2)X=&UjLka zG^NA+Dxfnomd6CRe;xJjbFbkLeYz8c6;OW*WJLM+uJFf;`9_)R+cP%0njNarVgh%c zhuZHY)Vuk*4DUeh6#g*#81I15nq<5Ekw2al3KBu4E0bQY zD-PM1d!1Wuwf(XB@?C9MN20{+(Da?7pPpNFR#ybR>A!x+p*8$~x2Wt-ECVrFiyxvE zwEq2WY4h*~(Ix(q4gaF@U@;~6-Q*oLJGjZ|><@c)r*b5wf{^?vvjfj=8RA?_VHviA zanH0=EE&FglQQho$?9Rf;bYk6CnCLMe_3vv{4p>EeDw4~(37(ISlyi;H^H+p+@qu| z*xNRJ$$sLqaUr+$?2snQEgpoO@8KeRzL0%(+3%L>&%5moRaKp z<-TW%-Tvzoe<0CEe;Wi@R@~&@O6Lhn?cQo#-I$7b{SV}tATw^H(25z}H@som_o+Hj ztt4sfsGLTS+S@nT6P1LufCT84&6l8KwPkKoF8iwz+EpI8TRxp_3VQwK)%C~+B2f>+ zd92nmmb#FQ$T&3xy8%BrQ<7c3YZ}e25AWCQU{wDyTe)iBV#uzY5wbcyi1z!{18C)j z^vAmw_DNP;LT(e^Ku$!j@xLe+c`Gih^7vbOiI|jo*TJ~YbSvLDNwOUS9|6$to8JssTA|pvl>^?rxk?K} z(N)oXB2%w9m2))cS4uRB-8F1t?8`{T~`w#QM?(*mE_$}s3I&ji(h-k zZph_+giO0pC!0@1?~_$@UGWCVoNNqZljvp`dG3uhBGz$zH1z%yMm#9;lHpomcX4sU zQs;x|=dXEVo>7r$PXc>1?SW}WVEY4Rl0bYS@SilX{m=#H6zpCUdsUreK=MR`R6FU$ zkDsy)e)^$`(xr@|*M9so`cQeiwCi-C@?uS~YSED0LuN5A^Og62J1WiU&6nAC8$fyI z;2raN*T8UUStYOwsG2kO-Q}kDYAX(=%utN*2_oxGui=b~ehKomiwdeIf8uZN5WU-r_IXK-ZY zPKe@W^mOdi%XU0=fUyWcH$u=!!15*c>E|5Q_7R{!0{{$l6+>CNDBLIzL|_^)*$KCU z^-80*uL@@EXP^Pu&AN6d!zoY&4qg!>WDaf6a0J!n_^)WGB${|9%d1^ zqS0@kje4vvZ9k7Kd2Os?@Teu(`@W69%jaty;1cyFy`rgv;npqjy)2@8x7@|?x4eDj z1O9Vrc`-NEwqA983fgW>{#hOjXRt<^6 z$SseQ`)diUXDY>p!IR3!Q!Qg`Uu2rX8+*Aj$8Pbp^DmzNjQf7=*_&FxTYBSD61nWT zbg{bAn(OOc5IUq(eYU(=m1cXgeRW6TXAAsfhOls&jO7(e<5{7WD^@as#DSAjWAGlT zKz*T6R*%?k?air=X+cl)olC#tM?c)Bfs(7+AyV*GRj~b1 zl)GAfV3Ts{meWWQmNmhE@BUoBaL6*iMGtwCt}Gg!A0441iFIlSN&VsHJaG2z%j*N4 z`O=lAH~TKGwNt)}80Ci!_a&v9w)lN%jyR%;S4NqUuV{OT?-@nTDU7Ub6|J zTd+}U7}MD6qhdc5#9BYOCwLqOxGZ75P07sHE~!SBk8#xKo~MS-ze{2F`77U)d0%2o z`mG^b4U(_V;zol%=^oENd^1tXD(dpdN2P@9-x|J)-bi@oY~y+OD!#Sn#7pE-iDc)R zmTG8FPN79^tktvi_|xwmS*qDvqB1JCt*kgV58brLc>8Tc((*;>pJ6+@8ZY-sq7!F_ zEeS+yWkUC_Idj5O)+mz-@jMB8+m1Jg*Y#>4u4{;v!`yE!HMOr=4ym>cT6UO~3vn-F zPJTRVZ>UIEA~unS7q(D)UoQRw0jCO^w7NZY6ZPV9fVNRm;m&UaNkbK2LZ#4jq zM56*tuU^7!Os7^G^D{)pFF@ieaQ*j;8UAs-|8xug)^F6>0)%yF8A>A-5dV(z4#ez2 zdBf_~PkDT61*@2!voFJ`tC%U3%3fV>m+OWfHWjxem}BS5q0&t68=DUFnt%{^{o9q8E7c4V2HT zUv~yOmA`YgyguK0UV$(aHAH&WXE{*``MS7zZ}?aE2_HRnvlFFC2xu7y<~aWGOAl18 z*7;x!bshmuXwd_X&hjsuBRB3wikNgj9+h&T?02cQ5gOp`0aUW;`hE+5Ruu#%@=DHcdi%j{fW2W+zL z;>9g=orkNt-PpngLLcEZ{`VN*@-2<7M(s{+CseRE@ki%YN1rK(ghSm12bca=zH;hm zs@k%L%Ym}-r^jD(?I*qth3kIpvMRL_RcwrE=TNzeJpE7scIK`|=%Y14v)Ef}rMd7+ ztLIAmMsJ@lYioaJ+4XI7VfPdYcOj=y;>V*ToaPwBq5>XkJQN+xkafGne4oP6JI zUdV7v(EBn71f4yRo^|*Nn1;n@BUZifi-@nG_x5s@5bo!}PXP^F9O25QSFY6!k=~NU zLy!Hz=iYkgdELMn=fyvtF3x_{ZWa2_%{M6dZng0@#5etTeKmTJ(Hn1DwT!9xdy|VR zl1SkjmYMIor8(;_p5DvtK;TefxIvEdJ#QjoiqHSW?9Olg@aa9kKjX`MQ2c#$?N zWfL3g?jqCh-{!4+4`qzFP@D9s!9*6sTNKV@>1Q3*wpu`N#VK3;4SNZg=L+D?l4s@C z+>`9SOCMJ2rYbZ?-t||^{_$)hMsnRXbiSkPf?OSHV~3YnfAWqC78DvP1G*1k-F`Fp zZbxzH{m{yN@ar9Y7u7olu3_%`E7sYO*<&t zntsv%`| z)`5E|$0GCIPdu9}x{EEKex5x2hgCL{jOmuqDw?N;oM)9s(l4~H87muJS5*v~pT8f_ zA)99_yI+=7XHexU?_%LcnP=SEZRw&o7cW z^?duQr&p2ehRm5i>o>;n+N+r3Q}CZ;kNl4vO#p|?H34t_v`2UcS;GkrtLX{ebMuX7;DX8g z^O!v+-Trm3r_SaQRl$A;61a5bPzOC8Vg3c}1jvOY`*q;+Vqkd^M?AryY$3T1G$I9j}HXu)k?Mt!ndbGy%AGsgXFyn2|2sL zF)X-3`d}R&pm8!br8x;#i2kB>vF?wSe|3MBLNdHV`Eo`4$4rYL> z%+Q-9u{6&=aNWcA(8=g^4N+l|^fqIbwYW322dQ$(-R!R!-!-A)(ms5 z_E|;TxSh`Po`;p)stzG5UklvagE6gt%^QTaR`#A9?ex)X-iaj3RU>XDYM{jjHcV-e zijwihGIVKvUG#nqZj+LdkU6k1E)Y16mg3gVrZ8PRYo9HB9vn~I3#qpBqz3j6_KhPq zRsf8J*f%;3PF7w;qZ0*TFwajrhDhDRe`QNk;$fh*W;$rQqa#?!d#gRn+;Gff$9E$s zt~C%O(u=$;n{3>q>-0)@bKVGJu6_U1lM2g#!2T^u^Im5gCn}@FeJ5Y=)Ts|Dmf=V+=zYaIn4_eoqsx?_C8Q!+Ls6y~tUMy}* zC#YK4X}Jyg&!v`(HvQ-z7fvhzz|-9ENJ5TnB1D?+C0I8)3F`yRXZG@Ec#SRq zO?Pm)jd7rBF$#4B&ddUmhDr0jIT-tAvbD6&XkvTMO58!AeMCD!aXM>UV$OuOm3%8c9DJ7y#iB@1 zrN09Q78-%fZ%+7UCl~|2K_+;u8=e99m6)y#as!wduNQ{cv(sjb$KLcEuV$<+P;+Kh zZegsUJ4*|_M{9WjVcNh&7_Qf*EBQB?H;7T{0W*4Z4!CFSGf);JVB9TP1w&rKSIQhIgeHZrNx7b4}%+ zvGgTZ4=n(sg?10m6t$G@Ip{2w376Rf+~|_vd2nHoAQ|Ko-D4!fBF!*q`ywtJ*rd-c zYs-Dv$Jennft9b$2Z0rkBw!7P%A&`Qhk6hUYmIKj0 z&Wm~*f~}GH%&{(>V6EOth+RHL&99&A?!Sv?%<(4;U=!>OAkGSFD>xvV##cvIJdlyGp z8;?SGIEO#URG!eISgf-;`BuGz5h(I6qlOHho{jhvtQW#qUj)s0U(n;5yO0k_aN=Ic zX*QAPX7N$9ZhdI|@n6$E?}PF+ylDMs$S&XM(JHH|w{^&LZk?X)t8`5hrb`%(YHdFj zXtmG#fv02Ow3AY!2|xC{k{rMhZ~u~&4A2v31b}tm9W)=JA{Q}%b>5Ld@Qf-(~-$=4WMY$J+-0ydD>8hE# zN;BOwC01^8ABnldVwfz3(ahX!!`QyR&+l)K*&h4sb3W&NUa#|f1xMQZ#{M>3b0{Ag z-HiM@Jf_oAx#$~S(UgCzI$j*BvJL@==qk&dK)-}_!KBPsy4hyZmMK>*?McC3*3u$| z3S(4x^rNw!2h=_Hb;2M?G|&|Lmkb+w;9g)>U;JpG*rg-hjt*S6YU{F2L2Sf=#g8ex zUY3zSC3Hm;G(4w=e~XljYEg;rH3D$>SYy>hnlbiryPQ-EPC!NC#RZtD)q!x;bp+lL zSnB$lon^l|-*;Mfb<`<1r1V@r(>UaJ{4BSJ?iFuygXlG%1S9UfDdEig$SmC=^NHcR zy5HIxr`@JWolnhS^8gdu(^EA{I}Xg;hKc7AN_`E^vc<5$9K0L>{RW7e{c;@{*XWj4GO@|qI#Bv;@bJk!#*L>+{UaS2 z-BXQzE#{-0oD3)n494PLvQ5??v|1^Q7ar6C8PC$|je@~Ai`I0t7qwFYHt8eU(Jzez zk|*Gecr9?NS=5YN+)&QUN~hrvsVRTAzEgQJvRqrX@WKWT_|U=Afu% zUw{V{FY5nB|LHCyOd;PdtfMzd#yB21RYua;X{!HYtt|{74XNV4E~M zSsw+-21IXREo;jL3}Y{EA<;Tp!DCfu9UK5EV zb$>WDB@?bGRD~_XtTH~S=0bY=$k{VxjRSP+1bdpVX4&W${HA~G(b)MR;e7n*;x~K^ zm=+{vZ@eCLf??>MXr+cV@?sD;lxeHgU~Dkew1CR~v&`in{aYh0j|5ps1;y}s<>DC$ zi`BBn&O7p}`Wwr#tchi#^WE?FXOk~g0b$|k{=``A@YO@>in56UUaxd)xaKlozj}aC zt>thqYQ>0dwamXcI_By^_pqsPiCJm1$nwp_zHgZwlIr_8!bpK4^=fMcDgKa?cNX0y zh9iPuOCn2L-8#$d?PDtY2jNC(lGp-SOCHs=z?i3?S}PTV9Lo%Sf(JVThc=igap?Uu=86HbAlh2!H zY8k?FUylk%zd3=Y17m-~!PJOC3*uVMhEG6X!B%B^ZL?y_#8cR~+)Fv)H#KK|8Ip%L zy`FC9@hfS+JW7MZNRLb92Efd5o=ujJ{g`4C9(7D}%4=m>_hrGGOfeaR5j?7GVXw!^ ztWj(oDK}LFZng>F6zWoY$gV{z^h{NB)EUaKZMn2if=nF@+oPJhcThC&S1 z|1wt*2;KFAmIUkdpp}ORUashYX*LwNi3qgAYlXGyuE z`J1vva=^jqNGq4VB;e4?47j}aioFQoAD|y>RaEd`5Kz-%OWKkn2$@2d5W#_e$hQ-# zvB}dy0q2rJ9pE#v=W*Ym$S&7uBpZVdrmIVx%Wx)T&4NksvlwnKt*2KS;6z|(}ZL2Zp94o!UVPm%CqzL~f3FkC|gJ9!w zJutGk6g)v)_B;7kp#XTAXUD9w>4gsw^51CWlq#gb++|4-UbF{|ztr&d4XIOOF9QRS zz0`0ENV$*UErhzwSpJG|u7t8|X73#q#J#K!T($O}kGI`Q=jFDZTrX2CcpY4n>Qt&T z(^y8LIdKB7J6mTV|@?xIo(Uz&12@nWe3^SPm z!tqv>{K7ctSLw@n75g+Fpt@9~En-cgHj+j_?Xtnm8Uu6zkc}jDA%yw0I)%D5sFwQ1 zf1n>{yU4lA7JJ5o+~jsQORuu$pI1x+XZVkW}Mpi5`0`exRdIZPp-K=P#4@hGPT?Zg^3>u=10iSfQ8q=e9C4* z+?}|PFya&0)?~{q+nAuK;8qVX6v(BZuUh^Z`EqA6;h4?sFX<}X@j7{0I{YDEm3ULG ze^(B7>7&wdz?88|L8EA{u;Me_Vx*e1A@l}J%16;Y6`Mxlff%nRTjs?*{!0wjzrw&o z6T6D8OrJc}qxJbdCK{8`YdNVWJQ{0(47pb=_sW~HEJD<;k$_<#rm##WGV95 z+`BcAw3ll|>WB^G&Emzpw9G{6+S^Tutpp$&R+I~jVlC@%&QV!#g{X_| z#l5Px8r&ufMCo4|oA+pF%BA^7Y>sAiM&^3jEqkIp}LS%2}SC(b798`^t$ z>dIM_T~1n=zwUU+TbLa;-w=It_V0ztAkF{zYVb=YlcpSnSolkR2L#~hdNt?tZ(Uz{ zE_mKQ_x#eNacue{@##!w&1+FluBHN`;*k$O{O$9t(etklX4(B*8gcr5+uRKCy8FeM ziZan~glJrI;fUo%uNkaG`Kjco9kB0oJ~P?bU);DPeF-=CnehD9tqFr2r7Ubq)sr72 z|D4a)!w(F7&2deoOyfMh@9U^}uGeCrb0hCac+h;Q%C6EIAB3aDRu(q##g!x93~5=B zAX!UEPy|d;N}2^zmtil^hYFWaPB`%&wen%N2BuOaCc{Y5KkCiWMK9yzEQ`wvZzPvr zBbD)BS2zlu;I|?H*AK>8qDs-@`0HmxHRO9CU$&9j{iX0B21g#8_?6Ud8)Uv%IptaS zaT#bMmt|`P&s9#~#^}g};ltHTo3p6TsP{3Z2b)8@HvS!mXrHK#sQOF`bb{9h`WqF_ zD7^Z;Q+=UB9dCY3I-32dWfpoM*bKDSI6|1s>$RdH(I-DCpVOF1YB%CZgdkLrP?gaB zQprS#-cY*K8Y11yl5{|I(;E8EH}WZ?*vuKel}^3(2h-H! zCE9GDq`pkhP-8cti;lsmS3OL(@OpDVF%6r<$eAYr9nXy3R-JfT`Wwj&*=V4J4d%a* zWMI4qfQ63yHx$@hNDM+yNsXr!z;0wnI2m`3WFP7Co@}f|kWo^vL1NGu9Ck+^mUg-aOK6SER&^rseQ}_7Z(PNLJM$V<>owKlaN8{ZX zDdHWMmMSJI9yGy4xx_D~JEK-S^A}jnM#-+IrRP6h=m%yF^^Xh&oYe*W>D1W~FRxsx zVXWb@>yLr6F7MVHxa+doxt##X_$wPO^kjn}xEn_$KiM}+sr+FFbMhojvhl&4>f?W# z2oIsm)TsRik9}IB+x+T2=eS%sgKH{%mg@WG$HbH<*PD^A$4;9-hu8-E4L@#9-N$n`Li0zWsc;X@YmcOy8Zhlmb~+q`aJzB3-_*nzk?b*rQcdJ{;h+9 zSrvJqTPO(!mZH}!H{t88b1`wMh?L3pl8FLs+kNVTIt@z2Q5SCxm{{KXtC;UIce)CW z__y}d{4`^DC$uvYCuUNVl+vO6!p=k@#Z+l>>uei*h}aY4(&Wv~Z_- zM3s~Cs8ro6_blb;(yQmDr%$=$Ig0MClYvK~im0(^zoYA{_#nVQOcuku1+V}92YT)^ z8C?ma5Wdvd^#xcgPL1k^ANd=7Z+p?f!xnG90QS98HJ-T9GW5L&+9hA) zs&lRM_-56Oo7utj-)3#!AAYc><@ABq}^?iNT~U zc%5iblSRF;L{1F@nCY^Np&pg>o#aBDRLkJp}`yDbC<{bekT8bLr zBswlQBdGa4xvp^i^r1PMiA6w__F8_?rlQ*_7(yR51$)<}r^TI~G>&q&ad29~CIyV7 zrqK2oj?V#qI4POa=1pQ6t;?T#vaxa{;q_5RYp5-d;pbL;)6li~0$CkAsA-rMEmKM(W0v}zZU z8jSO@8Ks4wZC-poTcmoK6MnEV;`bKH+IZA&VRYe&8}4yu%k(oXCD?cvSg}({vM=a_ ze^ui}E8zCGyh^U=54SNA3@xIDPAvw6aYv8Lj=AY8&m(S>XX=J^mqe=i9f}CZYEzf3 z)zHwtjh$0J^}{{1UNZat9&V8FS1Yxv)6T|vVF^XnXA;hR>P222vDVoQLf%*&kl2*g zd91eYLeZ{);-Mlt+5JT~PiE%a&mDMw)<-MW)RRZQA0KdNyHZU{3$)&Kc2?lfSLWcE zU*QlV_$Japx4_WjO?cgMNIQZC(pch4ko`@f4*j+d4%42_Js zwdEhPKmWQ-kg?}}`(CsYX0`vl_PjO*DxUg5r|P^bQIpcD2L-YYA8J1d0$ zaHu|9{W|h+xBur`Zsw<|*CNgbHC#70+;b!+?y-6@y2~s>Q{G)^U*fYV`@D0O9btJe z&5_xTHres6&mprr0GC_1LX*;QaFA?4^sWb5+Ga!=U^8tnaOZ|ADT(n9q)r z0SLc>k5wN#dJM@+Wx8Hb=!t*&JqP^p z+&(@6(WEcCW3*fLJx=Zp3A`A~1L3QVeCp`kx!4|2*s2mQx_qRzP-b?>vG=vlXAVgq z%q#qSdt^4^@S~jXEL3Af-6PeJMP$LfJf*pXH&JEodBZP%Yua0QdiR9yY=*Hi;-Pa$ zIhZ&uvy(U;)%E$4(ak%ZM*i(S1Z68jT)5T80-BAMP#h0H3ffAnjIH1cm63f3Mr$gS zGAy`}Ck7BFAmac~)?fVPtSrrQ_1rEp$ANkM4~Zi!8z%7Zj+*s@)ATh~{9&${)z zbNbYDx5>kb1NYnF4j-kCHQVh}-*#)S85`DXKF)(zB&7@LQ&z9kl6M9Dz2|za1lt)h zcgbn)^WgVB9M1-k>c|HZK0;2HTR)pHYd(o!IHCT*oPM{pyGeavx6Gerf zWudcCEES`eaDt2+mCxr4tRWn|r9e1)(pl0n?)BvGz z|AC$XK~5>E4Zt5Zxb%F-<4hjtUFz`zH12dbV908Hq+lzwB?G7>`p>)jGAxVB5bghg zR!;hw?f;>dj$Yru?91$Az1f16wbuY6>%#S-vlZBX_bube99w*YKtR~N=@{cSW)F}) z-!_e*b@lIkxED|zv9OT7pGFb32dr4pO;o<7WaCtgHa*^!<&7rT-AD|R355tC{E?6O0ue?~zFhI(nDOs1a_Hmh^%jsI~uBCF-jC_`Z76HxLiSSuiA$e^k5Y z{Ld^~T6sA${+z?ekpFMhn4Fw!2m5}G;YdRuBY@N>d~N$5=(D6^d%WJ-GZxW2*_GQ;1drKwW*T~k}N5Vc~SO1rGKjqJY5&{HMtW5ZJ6 z^Gr2yoo-Vd>34}=!90W5$f&i=M>RFY!vgDk3GbV@MVRcYX2A94pvdQsqk+c$2FYxg z-x~!af41Vh6s5vI*F$b#_9vSzy2r3Hg7Mi>Obc1}Xo?G_1=>FnpF~}Yo!Pa0T)z8SnU;zDjL9x4~6QH|+ zLTV_G_&JQ%GynpB;IWpZq!AEQ+IiBvSJoWLpSR7-IHSB?H?K5d0n?OB={*nNL3ez9 z?(220NHF-ZXlV0x45MoPoujJ&HP)17*x&e??7F$JfYnRB0Tk`n^+bq#m$ZdJmL)vi z0c;%F>`Ks3k5w`PhG+maFI_oGQcG%~vwLrp+XCC==y=xp$BXoA`#W?dV;2 z$p*Q5-u*O_S7%r-mrL~ZVbfw={L6K+QvW_U@8GXRtoJ=u9YI4I>qS8|Q?L}%nsFfL zZVD%4OJ{En9$+O6Pejkio(cK0B#qR|-*NIs5)PB7myJbQT$ThEzRrl1=vq+J2-M8D z>?$2(`8M!n779s$WbRqKKgYL1JYIBS3=Q=eFTPofJzmXoa9BzEl9z9qwr1Wtm#c+i zH5p*|TB00CY zi2jkqs)B0Xp+(O%p4yWQK8Kr+MFuI1M|N_5$#}~C2O=PYUpC)wH^u*v3{F2k>>+3jWsUt20rZg>O zbsx?vE8!YgQDZl~m_wKH+@FaV2U%(+1LDRu%RT9SGO|0JGZeDxHRa8qf=;*l&}NvD zq?U5VlGQ9h>r^lkJ8UAsp+Uw|5A>JEE0lh$D~&7tC?bB-CN;i~?B~8;arB8F%8Qws zz$RwJU}PX3VBp>~oA2~vDYkyY>-B~vbx@`|C}x%cM%xa*@$^txZQ*2`IfsR+>6{7K zDLzVYk6>+u=FJ%a^EEmQPvX9Jn&mB)k(Wj!BN;YTLn7UXFKZ6u_)EaTF=a)4%4=)Q z94Ev^ZCSuK#PP=0BxaCk)GDB}aQl-DxU1wyThvsr^$c+kxJ_1W*~P` z%_(o8k_6K&1@)9JHZ%FqC*TZ<*9QTckNyZv$SPBfjtdDwXMWZ%Echw`4v-^&V&jns zg_g>^_$t1yaP{i|THBRQA8o8Z8oR(F^&H(?2nx=`#fF)LQlJ!*EQ?UvCFvW>!1@F+ z0pF@PwcMX0-~vQJ13Dj~)^Xdx@-XIytLiFkei^()xh)3)f1~Ykr4wY z3P7pMMi&~mE$M!V^tC=+MGvm#2Re~gwyHK%*4-OCA#C+|mCbm-O8{N4YP;|=#3I2} z56>pBm=Le5-;884s~{B8T*F(_Q`G`#1GrINB7gBd3K(}^%Bch$3yGC;?Z=5oI@ z5S3@Y@X2L$mAae_V1rCpT4oTai8WVAhnWJV3-pyBh{rFFk46dPi^9qL4`EVkaHCKf z!~?jj6tf$vBu&-#DFc%2U@eF{o9K4+Vzv|0vkK)on1_#8ogb)aeN|K@I?GkAk9J*~ z*^V58HG?(aU|>ZE(BW)9Pb7_)vtiWhxMf^S5Nxuj6ApuT6gRVY?dUusn$^8O5mVzH zuog(N+0<53D_M0_=|q(RFJRPOupwaHul&u3+`j$ims-0%ouLuH57ONibrNNZ9qyGQ z1Rzi`hj!v{u^BO}k9u_YicyF`b9&;BuTp?|om6v7IQpatjS#+egs4 z9XKVcP>q1X41Yz?5Z|U8`1NG`E9#odM#{ zQwZh{g5B}du*nDKzmwLF-=|G^y z&De==&CVQN6UL+uWpfFas({~KSyQA6e=u4r&_;xw;45UvP3jdU6kg}1+9sMyr2stS zJH7fyE2^terlllJk&VGyny4nc)GE9>2?Tmes1ey10e6uCQ9}7LFGVcUEc#s*d)67& zsq=HhF>%B~?kJJb;|D#jsHFvyl7)YxN(vK_G`@i~@QAz^35IHN&fJVyOS_R5eTkCr zfiE?gf5r&Ag9Z9OIQ_B)4EVO>>yRVA17qRDz$`{!_K;m&-OS=W;H*;(Y@u`L0j*ev zf1Uzvjx|>~}&?%))YIr>yZ#12M<1bdZw}oS3R_Oi9{G(A9jcd7@9xo@2}kS`Xk+I@M$b$O^v!0 z3>r0r0aiA?NvJqxl~Srk#dy7e01udW(WMiReRz>UhcLletnxs&nkcMblr^r= ze0QF!jq%R*^;ZZe1@dk?1v2hy^DX0>0-zxb9?D>8dO;V5L#Za>+jD#VL8NOiv2Z|Y z8N*#~*_~mDNOz-Yy01~2WPJ`Oo%MHRMz&0g*t69OhWoO>wp5K}P6tdJ)d?Bg3HtM6 zuWVm7?dzP82d5VbFZq`R+s%MrhXHlfS?%iIV(ZE*%V2KvxCaSY`yWWgwhzsq^D868 zmBYxf*&%_o{X9{pegp9;E$D}Zg=H6z-wQOgsvs6FiE?*ONaWlOtth{%JCvV9-3lMs zF=MuH89FmK_{Zq!@JYP8)1`6VH zK2|nnHGUb~v{?LidTO(*UVYkUq^n1;hA;WNB8p3QSPIr^b##ydP?w6FO-_*91>-R8 zP#u80#-BM8gOf=TitpB*hW-B zP?U*SVF3ZuF%i1!1DPunH~tG*rJB|*iqYTmfK9x2sR$}iP+`3H!j(gA>uN;i+Otet zf(OBsh;v(Te!rURZh9fYc}hY@)f zeclo&Uf~S&j=fGACs!_Ry=GF7a%wwFkM2cX)lI3o-m%z~MAfL7a@hDi(woq;^Qifm z<|t4&>FFw-oru(rQA6{rMTE<06%@+dXiCfCvxnGMk}dgV79hc#?-u9u{XN@@+a)Ti zG-W{OzP{i@qchH!5UVM#v*KjY4z~p;>weD4j&@*H3~@kwZ+TUwWK!Q^qQ`sE z$h7RWQ=o5zZ*672#Ppqd-lmvGaL%`gel-ZTWxr79}Sua8rDQCp|wQVU>g zvAkCYH-##RTc$n`>kd9waNcI6J-p4uDSr{R*rsT+hMt4=0FFn#C@`>a39)morbK?g z5ASd`)->0f6#0?FxwocP_EVbq(qlRU#~)YS302y#h~f?ao#GGr*1>(vBC@I8yfI3k z)_T8nf2XM|%>lDqDAt6iUPAlJO1SRS{8CV#ftntkN;cYbSOx=5?dNqG0QzV->)3yw zH-}nvUzo_psT5_HbALUWr{h$~J&1o5-P(3_8KK+ZFB>-}L;h|8Mm@Ss{tTUKYS<_E zWAG%6*!}9xR4y^ruB6VUx^iRjUhT#=2xfVWCnq+vtTz0nh$oWZwm#Y zO@b+cL;aDG7ys{mmhY`P3Ug<_m@G!xhdlDW554uNZK1LA%K658f8FqkW#;ZrRB+pd z%VpAbUH>be8?y-~_uC;yoNmlVl$B+bdo7^06e=cU(1*!)$!Q6PNR_??Xkenhb!q9F z-Ui8*E8Z5qEOnRhCE1Cgt=wp^FXx!{#=fs*H-KSq#e>~JZNKiqKtalyr2Mx@qbwCDBze*e1@6gB;ruR0cXe8b}Qo%j#uJbu?G_;r08QBHtv^eLk+^hCZFWXP9 zVwU=Sw5w#TT1aJ0TSIB&aIJD^t{;--8t@8lfFUb|8kW)jKk{Ua;qb_KBX?_9a?|Cc=d$0`sY zFzw0y)AZp+h`yCd659lS3GE#9j=6PFZ20^E5HK(nkli@g^wxnKHXrDAaXcze2XMER zf1FkPtQ(HT!iN}fE6ENwrIKG!yXx!k zDN@_ozNLK6UeI&3T=rr`elJWKJ3wBhwxz2^IZP}*;&pt;;@)1iCj@?E6cm>o`Ida& zy3|f+o4x%p?!_U4Z+qLMvP?&AIo|piaT0n}RrRCRKD*#YCk;;wl-hro>c`wc?hC+REf4ej&g9>43E`fllVx@vcIdA}bcl*w$}*Chre z{01bEAnE$j=TwlmEe6u0*smiaSVJps`M^fV(TmJ-p-f;VF zll+p}!-H$q>!C}6!M}}#tue>mpRs0ibBk8|7Pf9q%9Z~{`?@-|DcB#h?+y%v_(&lW zB%%)_(X5vVG=8cs z^O$m`8%QfVl@wI#kqIP0Cqj*l+WVxgkP%sh zPpjG&^x|lr>_W(f>|<>E&|J3Gi7R#i7Q=CxAEpm(6zSNH^$w*m8v7T+X*T`@y4zRs z_t)ffw<_u!dkN1(`EI)HjYBRCu08FtC}*{d9cn-+MwKnt>rWr4>Z|nd(NM(1vQv-A ztejBeSSj81kn#usfmF}bsu;@zH**;Wwt#ZnvIjAat6OVE$+(FJ$iVJw_}i`9>#yJF zq%Cc>2&)Lc`EC+hdiD5`mH6upm9K8{{(nU$XLlQKzP_EO-J@k*MVr&f)mc2N?2Ue3 z{Qbgb31u^oBrXxGVtGB~5386BcqMcbvQ7WF_s5@7vM0|0t95E(?)23r>=AinTHMvy zlP|j}Ka}B|C$6LdOO#T;^#}$#u31)PQ}5y`pp`gP`OaZACXui1l&l|W zj|upAS4<@@y?ExwmoxUt7VIuKyr4`pG%C;CYfvw(d_h`ELz&!t@ULNcj$^w*+krNI z?)wj^ou^A1`9de^_j&M|9;Qsi|hL$!u$FE|&gCku< z_7~-=%CjWeIe4q0dpCA)Nej>sM6gitp3=jRg_Aulu#1vU+s1=(P8zQalsqEXm&RIJ z7hCSXVj}#okiF(;n*Ml+e~f)Sw=UqrKdPh$=L-rJea{l{LWPELtV-8InWX13Cv0ZF z+)9S-Znrv$RL1R1`0+%rcb)u6+*W5fUprnCxaGezq^1OK>K4qd@ z(ptn=@Be!o;3_e?U23N;mh2_ohM~?Ctuzrt<d8;m zdf#b3YylXjxnbRh{=arEn)v_-Ev$@gAnpTzxuaA@{@NtEH9k}TThA=%j%T4#>dq|d zeowQ!R=as=h`5wzJ$#B7r^miB=HJ6??QxtO=^E{f20y8CIr&fZ>9eoMA755yTxeP% zK&mHqNd8lwyknCf1zC~?{RcWj1(t}in?yNiUsO^d&_Wkd>>X2r-P^(Sv?Xw!%ujZNVih|BgRkd2;fBuKtG{|6R8R?F^TBZ@a?} zoaicuJeXVHQ(SLBnRfQgIYlzO>0_Do_?&A0iQC6-VsajoICkmGTE{!h-}?}XnUW=6 z#N)=j)R1Ty`uVc4Ho{0xXlO7bBJbCqQRhybZEXh{?mA@P(w@s}UtT$x^;8n_sV5M8 z^PYY4so`re)n<@{csVc}tG&D_-W|H>?!zp1o3moo@CuN|fvIGOziz_5IK7JGpt^?! zQK`L7=!5HJioZ-ceI^hx&Tej1v;ScC*!v&exx=^PQG!Nmw5sm2)vfpcG+!G0aX%WX zyi?IU)bR7oCvYpnqV8RW16&)%C_#FR(mM?`dWF67u*L3q?o}IayR>%;wI9kxvwbYi zhx)#Y_e&qYC@5La^jUr`C=k6hJ$b8==&=lDIs6Dz;PelzEIc zQSHsl=v$KB9tArI(k#4$i1JcYedtwaX9)>^uz2YAE~mKksf&S-fUKPdZ~eBrHC$fM zbjM;;r?txSsKpieTla5ZZx;yKg-zAffR0iJx% zJFie<6F6w4+>Sd0Cnf&}^3#1vGn=H}UQYkMxXowP{Y*Z3S5%-Yov%2MxZBXHO`x1x zsQveNrlq5}+{3?PH~;&TC;Kh06UgbJ5M*Mco$0E}&Z&9wV@&twOeZp@;z~`7UHbQllr)pW!Les`OF~QBCjW>XSr8W!FZug5 zss2zCYl2PLz(2dJ2t!-xWj)@{9_tCi;Twy5?p7W6x&;WJB{(sEg<`ybF({JQYvf(Z z1*SENtEL`8F?k%2=PnTgy8+tSPqhtyuE?$9_`B?ME@d`eNIPV+`JirogWPNvJeyG9 zO{K2@E$0ijfXXKu%fRy%jyUYoNr8$`-+&c65~^7Zjaa#m*&*DN2{E9OgFE5%bTw9H z;V$14!h!~$D|p!mPGF}KW99&D%yMOGIsFZbrc#o%+(CJC_B}wIo3Ro)Q?TQqOu`*Z z-=PPUqR7Ukfpd#ATCG99E=?F=&o{Zy`K?k{&5)qA=+#NOvyuWh+{fiywLev<)n8?) z6KjpJP?ac30%{_E`b*-f>>-U{TWmwiJ_su-C|V7vf0{vor-e;mRaDY>4yYEsferc2-$Vv-7JS`R7p%^zb^UC z(Xc%7&&8omZC!0dbM!w>&|cYHQy5Vn4V-K>{S_{IxeJ8UYiDIiT#J=%?q~;hr!{0) zN#VXcG9OLpmXWpUgf^?40nl$A#oW}ZGV^RLlhqb*5Ews9k&?T5JuTbbWq)A&sj5h( z*Zao#>LKUOvtFfni#EBuIv16yp|QLhGGHx@zZ}feUa*ErX!?B?R$s4K1Lp;uPYf<3 zH>;UXlN9@iQJvQxwA@Yk^5h3yJc^0Pl$-hK% zv;aTCdoa>OveKftSd7Ha)B5|$xxVxF#hWv)6qU3KDOphN09$D)85we1E@ds}_;%z3 z25%uNN7Nt|_j;?Vnki`!R1#a*Suv}0IP4>Ks<^pXX_5YG+=Jl8y$%GxHInLpVTMci z0V3_)Y(Zf?p;Nc;XNDg8FA(E46TOx09KQCZBEmh2H$H{Mg|#eZ(`k8ml%t23DrDg( zwG6D%{PW>~YZBTRe1czz>Pt=w;)#ZKUUnbHf2_oFaDn)jtoqYF#^+va=}l7FD9_55 zhOD-)-`S~QG9DsryqTycT%ON=sJ%^MI^@RGGHyRfaZ2net_11PaT!ScDCHz2u=?tH zQu>wPj$W%f%r{{5rH~q}VK1oQBM)T*6dOcE84;zuHcRvz@$DCsll;S~su~-{s?D>` zD9FClTmmhCB|l0B5352AhdO7?Rd&om!79-$TRW8~irbr~;ywiJfM4#A3NZuYV!f2W zl6n3UO&&?jdse+*cVn_bad{nD8tVS;Hu4UAC2M1|V==D6u==L8Twi`X{ZEri8Hw+A zRqk3WM)pqY18U+EBYeXy6$)sl(d3xOjsIc5s(rv zxTW#a1=XF+E#R`9>^GofORc|RXW?~+WDDs8KUU(8q(9+vKynXTWxEM0jbTQ$i)Fpx zQ<2T$(-&MF<_X;iuQwLTu2xNt3^{V*5C1mJHy#_cr&>twx~vtry~$681;Rs{w~YDY z1NvVz{aYk%c|ulXcYwS|Q}Cq|TK_z4R|LgC@Du`_*#OzhYt_D+Ys6ol5FBFC{J(x<#GnJ`<0gG3M^#-1_hzoRfwnO*MN=< zq&bHMm$rzvFvcUnCO2AP<6bK9XF?2m;T1E-HOFzD<1EucTe>25e!i{vSU<|a{~WD% z{sZ7rDI!@`*jn*Zo2p5c@x;E{ivjO1>K22U7$FPVqgR31wnIY_=iiQyk?iQ~=eMmGciI{0bv zV2*tkm1wP5FghRZRX?zU^4C(dnuK4c-Wka#OAuU!QB9U-qXcSzI(qVA76G!qJ~1d- zLtSPbzbjg^axkb~f0wgybinO!`d z#NfaG0|=VvRqj{{j;F{6Gx$^CRCK8pe90)1iVia3mCld)H|AHB5##L}l~-Ip_tS2c z(h^9H;zM6Ufu;m#D%dIWIhyQb&>E-kB8P%tKatGPONO!Eik-#q6ND^jX=8lh8;X(| zs_Si|-w4g2f`+VPcoMnQMOyK5^#bw>s&&G)#OCl`qh(++$gZ|30(MaechXybp|dR! z?99T}VsSz61=au%F_@j*ivk51p4k_nG`7xB3z_5EQ^-SdH+U<1xM>N2*5lV!Gzn`{4n-#%@ zA<^KEvU_&A1O{N&8cS6UU8;y=`mXJMP)$xCBG=}}{sR>k>R5yXnX7wo8BK^nvhLAf zraDBXFfL+>2XPOb(X#=AmT_4U)T=C#$pi{%l#=$tPBICgN`|*bjYm@MU`c*5Ampn)MMtSSej^%@;{;~h;oQqK_7Qp7$r&Rw;U9VZAn7&%X z0tf;A2hA0RCA5S6b!G>frh?Ep5t`irhO!E2D=ZrCOQE$-plO|7-dLkmf8PV)xy6-q zi%Q>sXWaN-?kV^b3>q6M0-L@xd>Hg6DH|ZJkIJE(!zguG%<~{G#d$7c3*OQmbphHN zBGIBKpllDBd`)I{qHiA3bWA@bYcK^Z$4`5c4I^hr2q3o|M6eu?-9ZfK8u#d$}seU<> zO))d(3DcV+K3@?8#%?f+M5hWCMW^pprLTt%`Y(*px%WtJ-Mbcd@5ldMq+SCwG{BD# zIWBu)F)`kxbzMB`97-vRN6KlDJ;Kl-OdX_^P`(Djqg(`#&7TgmjeTncga~)MTcZ|qEz9@nA46x;%i}q$k=<~Non3tBWZBU*ezb<`h}kkmLEIZ|2TN_Qz9I; zzbhDDSWLZ$_x-Gl2Kbt7! z=}%P;9u`Hz;T4@N6w`30SS$3iBJ}!UUmE%60-*?sPDW&@al{C=pe{Z+`n{vlEn~N0BDH9MM6e@ zy=(O*b%&_c7`dzW$-Ne%9i&Py_?&%hFEDVpb_QuW z1M;VQJR_(0AIKtoK*M<-+~l&?mhoiR}nhp6=6kv+irANJb)g5EU$!ij|YPS z)D)VuWx_U_j%9>qG`1sLlbhI_Y#sETkhB|FlbDlztHvVh!v%|d@j~XOsddXo0u$?J zFSJgIe-;z{b>~m`^l61L6AI+$9OVb{G4mOGs_T1=Uj;SnW#R-drBc&VTe?P0Q}UB| zyLEOpWCu!`b5Y%&vl`AOs}}xw_%NeJGNW1a2ZKd8d-5fj+sKd7*H4vBrmr7=(f*@Z zCf~C45=)9D-dn1LeG|v1U?9$!L+Go7J_&St{|`gJQ=quuURbzk?^rn>@j8B#=~PHq zFSu}aJz?L2d5_~~iQYFxZ!=eI3iGr7yNF)C43=~9d43HDceY8aH znoK;i5EIr>L1FEBtk=yK_qPW%?$p3abW+A4<=bj!^)SgnFm`5hFA}Dlj;tXv(d*}v zkNgL!bfEm&IYyRlFbdI+Jh9x^y&VjNghSi)69f|CKB1MBu5?X{i%VZKVbo2p(>my6>a5`<~2D04V-&?5~FM z#2?8LQv3}hln4w<#_??)qFRLK?=$sotiXpkc~A+w_J>O&%_)UvKn7c8VaLdQO1Be7hU z`xv>K%f_(n^Lu}PfBJ9Um)HCCdY*G0M^bwmjDL;^JeZ+{W|n5`0ANaoF9EqP+vcTX zLl!w`Gg^XsYn~1ODW@-v!Lbo2r{fjot~~O@T}GD71}-api+dF$47PD|^562)V$lBp z&I{MEq!GDCt?CJdXB1a_vj}#;mI#Kpc96^;UkXvZ2%$=T6}-}3bzH+0vkHMQLA2jP z#s*7P#`#4B0h5%5l2uBNoqKpngH}#nM_2cgo8$OV$-TfAO=yKuO0(b+63^u8!Hds3=X$amH?WdJ5Fe&4pgj zj}xhgG4S7Y-1kGbIKZFb|86Up{0y=w41dBJ;I+{AS#NE&iA!nzL-6B8uj5!>PkX8V zyq?n{Jkm))vEPa6WtDMv(FxL{Tim0X`(}}&HrZVph8;rRSceq`uBWVLHPZvL*t!Ew z;2o8MQBHvh+r7Z{MQZKFso#IZ^iq5Ke?#9jg|Bxn>~>6^yMw)6$p>Vrgnr%k`@MD4 zBJQsK^>1S>kHur|us4F@thEAQa~FGaYJht8;sA<0lW6*Uf;q7q=I+0z#HmJ88vqB9 zu6Rii)p10{><6ox<|bb=pwf8GBX&k8X7tc+xm${(F2g|i;9$LvzsS2&wx(f9@_t2e zW@{(sh?}1`2DamXGOary9X^ubKCIU>aB0scOEVFQ9#-$t4P$3gKBcy{;>7qk(ck`d zOj=*)Z})zBB8#k8?)_{tHPdLU>~Mg9xH11@Sr_x0j}NG3y&8qw%>Q^aTeqKyYq zrz-myimm`hj;<~pkbwf{=sLZ{;mG>@G1I4^0ji;&G4{`=B*gh@44_eg=g?8RiCJM=_ych(CEJ26Ogj@IpG7Jx(->2 z@Lt6tD{shcMDLM-mmk=MzqDY7a)@gy^^PGvjVIWkGnW8k*gKo{YyxtIMGL_G8<_Ta zec^i744<`gYG1t-DuET$5sWVHE_ASMcppJHgTxE?DqC1UXCRT%2VUifZWeUaRxZH` z?tMKrRBUN#bNrPHJuJsFbC4!wxujrl-ONQR=GcpmMT5B)!+kbV)7F=# zgiXh)fblb8CE_@%?m^&Scp%N> z^8@`eT*ZyMKR8vJ7HKYJFO(Q{cXw?f@y?*lw52om9>jk*+hH^hoPxmS2oNO6hzwLD zBhKh1>*$kI&Lpo76ts?OYFzfmt6Sq9>s6j!ewddlbuunF%fPNj*Cs`A;#zXiGa4dY zHOP)qfgA16aKC^XuCJt+*UDgAgnOz_KNWih*l$55pgd`1WRf0ll0jtA_ebvH5o>w* zj@BcO{@V0}MudjxSZ)VdR&D4Ej8EF%F_&;tnz2j`P8o*M4vl{gORt8%ZxV|XXCGbH zt=o{EAz~OR2UyarsY&+By0RORY@3LfZ|5=-4YtB5!9>$41#Jnp`MSDlx7C%^yv*V2 zTv<3Z4-oim&=Qf9x8K>PICy7@t^~K2e7-%msmT8ARRVrsLtr-=M?JKMN(otK_dKZ4LXYp~_xa1w{hgu1b*rN^Ce+-@tsqyO?u`2G4 zymKYIr@H1&hIkUaTP?#(_gfrvG`@~}zeq0GIA^FkH*I*Y*ryv169L;WHM=x&q)A+{ z9=uMpOrmdxu~gB8)*&8i=emJLIFh;g$TIx+2U!E6xIRXY(R5@SdcIhSZV@LdUe+!> zvt{Puoh2O-0PN}xb%GDo$OVX*qlPbqOvgP8&wVE5RjTvs$dJ8kmE84y%WLL!2aI-7 zcRwaQO7r-d6Z#D!<2$|M{X$k%Os?iEr1hvGCYYw&d6*CBxQsryj=Mii=ck6C6<@hc zU%6_Y>29M|{4nS8&{BhnR=HosXjy&3&?%S5f|REZdw|We~L* z$S?$ydf9gA3JOU&X6m4hw2%LV$_-Up_^7?g%$ar-p-kE7Gp{Qz@&-qW zvK%Ai&RFRx)>H-vcztKzOqcL1G8{S8PKcSVFdYjl%1_&Sk1v$`O6Gk zF%!!{=n<6f-$L+53gx~IzwuMwqX(N0aNYVf9nT+r_^qNc*8aD#b(XbkLV;WcSom@h zGD?K@jm^xvb!djJ*TKEp#_lDO&cFwuD*M9>89|ILibcqkhfoL-E-hJ@Xu*| z)On~uzll4$>94W2W$_+aSL@zjPiRO&rP5ujsntZe8BdeyN3mj3E{baE3C7Q_Uzu8Y zibd=J`@0qxS8hDqjPnltG+xp}LwLf&;XF%Vy@P(grrM&>>kj;wdll+c(p;}g>e^^9 zyzQ^zWHh@``NHP(C-Tt*rp4Qds%_nbJF+=5?n6JQ_^aSE8?y*_^GMQ!Jp*7QgkQsCqEJ&xoI7Gan8%xarl|u)7-_NnB3}5FE0#Q zJHWS+fdA`#PO{(R7+^Lv)Z{$0Z+{dL1duh9x~s7vc>OH`eLY?Dc8tdjBJ-@L792nku&Jf;Ny`KgYJr;^P8xCdNpWa`5 zwjSTQ@BZ{++D>WOJ0D?I&uZe=p>Vx?n>J^IM~wIOy1(CFW9i-`m!gN`s4rv4AKU-> zXg<3LVgI}i_U4ZQk>C#*Ve2Q4O*5fL>Eky=OD?tDpM7N!cPG?d{GH%~{9h)MZG#T0 zsDd1khD;TITp(^0%F-YM}W1)@{a#<)te+k8L-S-^@>Bh zuab<9`Knglm|P<9c2vs;MgZ|PUN$Fzt-tTV9hy4I1-n;S3A3Edhn3hS8;E-`&vk1qoblU&$s74-9J@72<8X?>wKK_x~Uu| zrpa|t$9O}?vc^Xv>|9u3?!iLKt?-!4%iuy4VZ z4F+u8_gvlrZagC)kt+^T>(~n^;(yXkxL&HVwx#}|t<_xs|nS?ky3TVRWe6h<}bf;rLaxVO0>KCOF} zZ@-R={dE`D&2-IPynfxSbaZ4f{b~Ja%hRbF9S02$HGDVbcPl(~|HMNBP)RQQBR^J6 zZ^aNi$36ljnUORL6ZGc{As(j;K$q(alMX-hGX|ZA;Z0HE2Od0bw_dsMexG;z6Du#9jx%Ue+%+36~Ek65sO|G$viIk#A zPK7NZ{nBB?ec;p**-+iCWMj!~A|RGJ9_x$rBkYh%Mv}-q|1llzcX&1!w1oxd!UaP# zR~HN^hmje_5qg6=Jh+HmSOoTx8VL%L`ZO=M0kAwvrDD@`;?rb7^Had66}9n)`Gr@2 z$*O#+zVSbKqZqU z_c9pUjLt8ImV2+D{NTNYe`u36LJ)LkK`|ynR92LXV0^4~&5dlRwR&uaj@w<&tq9vy zr4hnDM)<07QU1o^zQA{7ps7hHjrr$OxXRwd4oBBg$GkHkGAE*GZt{xu4mj^ClNxyX z(`E;h>Z-}q++G|<1@nskQ}R8t-zo>pd#@POW7~XDAYW~yz0#M1u)28YUhrb#6b^rD z&~-S&+=DWtu*N8>+jaaGTGB%&c&>dY9@Af(qL138@Jgu<`u|C|u^OcDr z+gA0g7TSp0^mvt*ZSFWs#ndLx;_CSWI$&K)S*+nbA-e;ypM+$BoYaZFvY5>yB(aVV z2HnWSDHGoY(^><&uWqfM+32(rKLV9?6O(_D;o^7934{t<>;>PublxquziLXpJB)#j z`#t!;e$M-CvC6ZQ$#fXQp?EE7{^d;?0r}!ZG$uwKW}y0KyZyo=K{Y*{wN9$@RFwbU z0DxO11bi0|JV%X=N;HWzL-55K-qvP^Z9!PnOQ0m$$w(Fo#(<&0%7(^q_vLk&@K~ z=3>yNh*N}LDQm0V@w2q@h{)-2pptHJJbD1LmH2`p54TgfsRx;jn9HJy%oHJ%h%) za-O=54%3@{Ef~wKKAo)?Gs7!QdF@|x@+VKsQll}+lm#_2KGK@h6K;d;q!NvJ;@-#Fu{Rb(*?aJOUli0zDbOERZw(Kr~kEI+is%&$FO!e!ri? zHQgr?2?i;|{`%8>5B@aM&l;5P>Fw~mqq94P9=vAA2u)sK`>!2 zni--ZE{x{pv*lQ=4F2iJPgJUF2BcaY^0Mh12D0@Fg9(5@<|RAlu@8&0j8})`2j+{s zd}hC&t{hM5A9bG_^DdbP+^UrsHIkPUg5VmXm()P?*p`{ZAF5L?1_r>%6#QMxen98- zmyu7*gk(~?Xwm_XfvykQzvjIdZ>{}TK6cXiI{rWij^~uXR8D=J*Dmno7gUfNtXtmI z9UZCSoXPJO!E)I+#FHzBRVln%?H9$MqGT9AM5pEDNp3_>rt9W0V2EjYeD}g?Cje>g zZVGvnD0Wro_cSABFhJy^-g&(A|LGzD1`)R@!es7_OmoYl5MUe>E=a z8t)25MEQtV?*Z`g@)&qPhj_KD?0Wwz+);o7{AGDC0);v`Dup@(3d3pYe%c{Ph7>z} zuWYiv8sv#cp%83~-@THGe=tN3b02uXWGju|)ay8G)B*|uxTubK;AO)I5)p!u3SCnr z0fgf#?%LBgc%^p5I_D*Sz}{}>xnN$fAIa@GL-(S4p-Y-ehb(G|la#Q^I>zwSyJvCM zxmD$TqpRA0G7;upH1LIgDk(>P=NDo_)^|cqI<3xS2iudP2jtXkh#2E5p(!X~W z-`PnSqP>w*#JnXf=J)Z6mCt5-Zb`Pbm6hzk^Hpi~1GQ7%EG;Pv+t7?{wx9aIz(A!k zx|7D{ibQX0lYBOHGq?`|cDm?f$JQz|P)BfLY>kU2@BKLh#E5Wz*-b)odTcNcAm8nw zGd7Wcs<6938BR)@+dVcD$7~#V!|655y0gY1jnlx_^4GM0eYSRX{npZsE>eczUyXS7# zF6UMSZ&q@&8`3S4YCRt?QAO^B!^0-}Rd3v$c6Pz`ULMxX;}N3)gzKv@g9Q>VsQKG; zN-2;@a>do(%GjA_Z_$Ubn$63}i)83pL{l@aK{e-4_xYaks)mTE_jAi7!^^$PrtQTi zJ$gvJWLGq7zxXP|fKQA`hMCbzgdqQc?rxrH{F1>0y*!L^{;}E##*x1KGB8t5mBF%) zhjuX+$#OyRA_H4IF(gH!`8BNJ-Fa+ll^(RmBRT0kO2Ma3qdSagH8}>q#k=-xV!LuR zhY=K6JT|ct_6~*ff9dx{_^|I`P0`iAK_b+BgX_uN{8XwF)=>7ciIWt{RWw&)(n-jl z%_8sWYz&Iu)H`1q{~JkZ8r)(bF%LGUQrw1;_lMtmGWRQjpQmlB1XVT=yebwx4?Ofr z8K{#J^l$0a2s96)g7g5|!QJ@{nIN#QiC98!dMV~)SgHukJw5m8=2g>Ox6^G zX+pECT&gPU(h*&g!^=U*{o0f50B(`FdlXJerhxE10~r5Bz2{EO$;nG$$QP^~lE@dS zrjN8Ay$GuA2aI}LD*-g6FhG%#`Gb&MKrR9vw`Dx}!mI4ni0=${ zw#K{u<=gel#?dv8imJ^2K;)ue_O(W;pVrpci;N%$N0UJ^d#$X5&DaZ)jnX|t&+9eB*n*n7Kz@_)qPFd2@Y@N7xABc2VNLH==p1dw0$|26JLy<_4Cp1FXbV#p$Rxup zNZ_jhB)~_wy!yYixyQl1+&zt_Lu`2L`#zZ04lHY?ntoj}&Em0agq~y>ny8 z@*?&laJgd+I;1YtF6MdFbF>BI1d*N6pER3+`ydZ4QMZqEoP$ajafMZhJo%!_(SMlD zy#}#{=Dw)J0l)#U5K#l6CB7qn=2gGcDx6h2e@K-{4PM4ZRJ;R96h@{d#=HW(JiSis z+2&^0Wq7e0CW>?DUV$THx%4Xi;X5Z@s*-MM!e3K#8zSqyHlyogRwqMAzu|$(lV=JR z)Uj98LQaj4xkUvN83~5YDclHM+$&mK-P0|}n=g%@$AU#wO(a@D8Osd$pg2AsUd_`6~(m%42nJc7O(ybD}bJAeJF-fLjp%)Kz&4fe+0z(C`h zC&_6|J`PB1vI zoJ^Km>o^SW;SSH~rzG=ZtgWdhk`PJR_|F&~VEZuZ2fD_gGcMNqvb~3!>VKt_4449d z>#ps^QSNhga@+6AZ4bIL3Eis?w;eZ^i%S~mZNu)Ra<`FhWoMs;P70kZ3;CI`F@B1$ z>cc%^?!SM46*wjz+%EkNu#?Vh-0mL7uhH01@V6(mQsWg#JEij=*YiJL@`;gku&;61 z7_^t;`b`ZhV61=+c^=#O{~1y@=fU_>{}$wBx<1xMU{>fNB zTQlCKGEC9Tj?FZis2#f!ymP7wEy;&uZ&D13g#&uqUm8cYTeaq5$Zl zwA)w9*Cc43vIju_qJvf+qTPf>4~@CYQ=4K83=SNs_e34xat&c-XQB=pleTJ(uF7Pn z&N?5%arhY9I;cPr1HjWAULTj?e9_edDJi*G+t!-cIu@@^ z?fr!UJD)t{U!J8S`}J7k?In1s3SdhykhSEbgx`MC^Uo&SYJLCC6;VUJ_1uDkhh9yRRLP4O6B`PjeynUVSsZiJ#uv_iI2BGf zWxCoerdxMM*nTx^?BO`q@_rTmzW2)p;@cM{vjiyCmdxh_f>1^jt=)_A^3dd+eT$upcKqc1#u%q(eu%-V%e+w&! zWx=QhdSFmwSc;RKy76F7oPwztB5rzIxrYmxb&fI!B|&v-#7Mk> z3sSU~#R}Z07e=?j-Mww%JiWc=)obMkKx(*qgOy(a)+s>b^JnPGB9&miFtH0 zyB}dbK~u_g?Y3nsunT&S{;~N3}}37OotCztwFVk{H()1qW&H zb0|-c7$@f>6MkP47pm*Ee@((%6*iOwpH{LUNuLaNpKdzHvd|}n#Ua|HE)1?-ZBQF> z)_3|gGyeqPuOOUY)9g}>vwZaBo%Intb~|?rzV0~IW20ozj4w5Nw-@;R=S=SwEiJAh zMT2srJ)viP|L2+f&m!L{s?zE2WZo#C3;Q&Lu15TC#OU6kd(PQ?I>bkTVEMY@6;dqq zobcDEpY0X9MNhJ8Z12!V`X64dER41S(lSfmD<`;wA?xS3&(e)kmGP?+`_RY^u9)~# z2U_yc;%FsXNab}nUv?;}DL(w+Iln}=N%1I&s+WehPI_qIUHXe%H0vARuTeH1?|YzI zyqetbqjnyX$5{6-WC8qa*;@D2*@1BN!pnCZ_~3Dha_>xqN4bD2$gPj9 zINUDlf9hWjDx0>+Gb0}tZnbfyZIl?NgPg%1XHB)&4s}m>aOF45io=Ro@9&37Ag!4a zpGJzm+*P>s*u89Y{IOE%Mc=pc1f2*#cL_Z#^F`F?u5U z1DFQitiQ5%W!>kn`Pa`I@})C(x6@;+EW{AplRqlWG5DeNm9d?{k6p|Xq-{gDWB{V`=GOB z^n2yS_HM?oE#}}On!FA*DTIfhgEIorWTZ5Uf`ihr>0Zu*jQv$L+inRjvta>)iQ;GY zyA24nex}n0xgwu{_y2Ct#Xn_@D29Ct49a%l7cGUil6aCcg4Pa)T>;u~RQ2!0i5l{M zg}}ajDQLeq0v$^^|5WPj1;*dCJUs>b8tvT5u!Z6wVrBn;sm{z9#n+ICH9awzup~dw zUNR*;AbAaIEOGG274Hi{`Y$K1E2QBpcb`0*{BHdk>@Bh;mZM8oe#W1lN*C`@BtY(W zl!$)H%y7xRh}}HJd+uN_sD-d7%RNE@#=#%sXOcr)x9d2$^;hZZ+++FI&_Gn@SYXkO z(vZ>3{s&2<83d;I=@BAMG}bMvc0Kh)@G;vZ^V{i@U(!w=d+ZauyYq&7ZZ=ZFmn*N` zv(#aMd5Sm?{VI*vF*7IS5#VlMX){to)<2@(YiT@27`d6EVg9}NRBqvTPku#``&D`n z;i=beY1Vl|_KElAtR9WmXgBicRBKu-{Acp{)N(*hK3v3`9$B|>?fztsY)jVPBgzL0-ry zK&Z!`Uz<2P@cdKsDVu+oQ17B(xDVapR$!^@Nv=o&RKUG?&rTU*}}Q(D9( zI?nJ@C3`9nl1AiNl~n-1a44DcxykusCHxTU$v+{iBjl?|k@Nai%VSc0?AcpGlvw1AVSsC|`u;q`Q=Oa@6oFW*!A4K?y2B1GQWW-+o)F1gE3 zF4R>`qQ=-=c{XJ&W5QT5#(H#4POjid%a1sY-n3(%`WbA99i{CuK_I5$@-3O44@^$j zK3a@#*UPyhR1DF{nD{nlt?UNR>8^J0_btMDD;WG>Q0fOfXMFw@OH6o-1shWERT`_^ z`vAZIcg67}+iRoF!QJNRN;%7Ldj2)-GlJzx-G9b^&Q$)U#-U2sec8t%IJsf&L{V@4 zftpxYLSEYdT=5P@{qz$N-}d*eApXEP)FluqwywUjT_b$uO4PKW(qOr-MtHV=ZxFjD z!!#=-%yGlJG=~-TvsSru#_@z_TGgm!{B(nmS>2G1eu+nLQma5QF8bTZ=(yujnnit! zIkb4Y<5uY0!IO^TyFsR{<7bjvkEK5TVSU}|MOGzr;OosyEu?9$-$=upX3s>owMJ0H zwh+%PAv4uH(f$}{UhrDGL027d$Y!w)rsSQcf(%Mb6_Rr+IFe+2;mMB{v5WizRTHJJ ztb~>SwaU{^e9X++1HyJMp@3Q_d5t_OWWP>Y)!V-p;<2O8I+h>I8*N-CK&rHj9v`rG--fCKu z{b|47zD_tW6H2qd3w=T!5(_KLNP6ftw}r4awnqq8V7&8*Dw7tw_4{uNEV6W@>=k-) z#Q(l&__mUs_q52zN^a$III$)SQ5M@fdCYAlR#YkJ$SSq!jUNB;cJXY>^^Of4b zq<6@U6~tAGb{jPJ!rP*w0R_K`ZOZRs&eHFgr&Npu?KS8cv8{ofHx}+bp)wu6g8v%Xs};x) z4jI^v+7O5v&T~>e7gnSat9!7ae3)6c|1mbani+pW|LekVqsudi&h%Z8*orjQb;8wG zS8rDP9$I;ji~@m&?CqpM7q1{BwSHPd@9N+tBHK`}+Di7mV?#+VJPI(On&UO!n45 zzL@AD>8tcIF{%;LBm_OF(v9rWnUc8l%(@t_miMmBK)U+<(hr8SS+vJ5@6TzY@I0vO zYX{R0e{vq`&lDL`+N>AF2Jh_zdHLz(=T_{XR%m{Qt%qE+A01gcXYG_IXOBtxIp>Uw zHP>lw37Yo|$S0J{)+grHq|WSF#*V5G9Zite7{1mW>!XX?6!pp8Ka1Nz+=mU7wO+9b zA(o=T7hkp|oxXVmL=9Z<)1zuc`e!)jLOVRNiz;7wW3Puhb&eh1iaC~|*sp$E_^PGr zGB&r#sg1hc>sxG@?*Fp>yxiyaJE1i`g;rKxwzrcb8iyZgSy`l9-L-KaW!G6NQ&1Yi zJry@MIm>-J5#e9pkv4F*YWUAs)~_A8oA)@a%T49@m7xvFb_FXrmwknU*Ol~` zI$m$(J4`Zv^uhLjOI7&5Es6iJH)N_~uF?e-N>9dD*p25fFuBK$g?%28sY>1l-t?Dt zz?vb_D8Ow^9d&H`5A5jgX!8ejg@wJxRY|=5zbb z55k+utAeE^@$P}h+@_hx%OTT0x#CWRKXW`nu@PE+dpJaFftaO#*>)h(&uXtyqB7Lf z-&Dc;Rd%|r=UXUAdAd;GPBv1Ma%ROhA?ZU6UMcT>$-hYoA&k{*(1OTTiA>u&1qlxHDU z2J+5iKS{HnrC)+2xeH`m5(R70L>ELhfl2L+7U+VVAoOv9aTi%rHo1joAaMXnJD1(z zzo5sQhsWQIfL+ndAu)HBndG^F(MD^1{l(yhv8^gXRg#*hhM6G9htbELYoA3LnKJOBTL5+hL$JE4``B)L|@V&<^n} zCPYNdO6~46w@A&8oi&@BhvTO+{0zV9PS$@i*W<-DCCq1VUt`&S4!XF01vs>3AyjNV zM=Q!KB!~QjZ_gFN03s%2fJw&q!wFIBVWZ^A{l#&7N2C$j(tqjWbQL<8zI0&&+V5{}O!o~6Br zKkDhQP9kyY+c^Iqu^#DKFUOnbvFJ`ONK9?7kwaPCH+m;WgS&Tn!2&7|9N2|l5o zB{(*`m}_|s&D)?A+yq<-qYZ_dqEecIhoL%eoVV%89btQcOG>u0qVjV*zROW49y(_B zz#rx^*77ft3~$g8G`oEwkjXQ*q^2p0Ls+|6Jv#t9DKEC1JW#sC*9*RnRTxemf-!96 z1G80F*DHoRCm>25wToy|bIOoLQ?k9q@Ga6WZDmvjL@H}HXkK1YLGOSIhH=)wPkV#G zD0Dm*^(B!A;*WI1|JiEM8QQ3b5rfJ&%TZ|za;avI!pIU1yHg%yiLKoYU8zl78TB-A z7`8&4=lFQR9<7r!Nyv=-XpH}s5dG3x&RdT#;p%2N?=G6GretjfP}vswvHdm~6J;ci zi9!xag~&?+sdFokv5ZWo_M5XW%#C=Uqh=sEnzV96sN`q!5heTKg8hc6fJwZ6V_Cnc zdu~b3^JL3l%d*=3$)y2<^g66DZz2&Y17y&2GXj4IF&q^-8_*E}FJQwn&jO_*CCK8HGv+jck$r~iNvYuG;?AAd1J^#Cx z`8wy5z&emX$)iLWrvOpv`i+}sGBWbTcm+{3u$UOQnhA!b1Y@E?C2YM7C+JZJsk3YH z1P8F4_BGc&TNgs1{b?fQ0o}Wp`Mzob>&DtI6} zISA!eVYU2iVU_Y=$LDbe04=W7kXBGio~RuCwXeVf1h30guQXP34mw7BZ-gznVb&kCoeZcejKy6uSx_bj5i(dJB zuehd)Xad94EkK>--pupl<&z_KC2Lj$E|R{2^I&K=qOA{T?P-CL2~7}J;+()c-<1jxG@bCJRS*`n*brVKEof{37ujZw|t-RmW9BVY1;l5Y)!l6i)j;P<+m{ zup;=|G1Jw+o$Flm1#{qJDFFBvgF&-A%exG)G$9XlQB1})dWwxj6F>OicLR9?$Ipafg7U=)T4iPD~@EdPy^8vloDKHaMo)YV0G#RRu#F2Gp1QpR90 zolP}BjP%X}FX(%T6ib#2qF@f`oYC-lMg?amjDt&?P$(g8MFv@&0lFZ=?gM%VjYQMy z+ymq^HjRx1FdX{%*$edCpE*IK{5%LVZ(`|F} zuQMhlR;%6{Zr;%L-*v{%b0ggIG&{wlK7qI)To=xzRvbwbZnw{9UW$k?Jp8g*P;VPb zjr=5=5xBgJ6>j+cIoPBjwY0V_lKz=uTLJrCU+ksRq`b2^yx_pu!czt$0U1>)iWlhY zwci3b!kE6@t*H{TP!a-AVWk+aXlt7x+YB9G=K!`FY}d9Qu|HqD-4{S7kpEp+>0hf) zH;o`8k{lz_k~1RAjDTy;L4~t+ z=*Tv#7qQFzn4RNN>~+m+*(>b5ii8E7195?8tolZ(rm)^4@+^X9sW?Dxd1^ zChtwa6X1D~@GqoDxQ*U8P|M-SZMrK}@jLD-(b>li!=Kp#;O2>Xlq7YGMOo-9NSo^9 zdiFg;@RcA)CTPus7yr4MO3zb~q2;PUS7Tr`^E}vS$*}kMwzi}L$2#d9DY<)~KKRDD*OJu-;Dyl}t1vf#4jKYNN{$3OOy?+W`Jb}&9OIhCjjq3MkMr$P-~+a!qIUnnzB#MSQziHIHnIRtt?6 zt%!{PAYAqpZKKw6v6jDvtb9b<_&U_G04EbjP*6=Dot?Jo2B(QNxt%+VT(_9XGuvG^ zDA96p)s*2@ay_q?36)tVR-?a;@(c=3-gLqFB72X>{|zMVkpASL%Qpy|@LzTRfi9dM zBU+N9X*%%AM}}Dyg%|J-b|vdm-+S5bH1wd=4_~Q!yY)>BW=KCCP1NDX%)<_d@*d?* zHc_MVg4ri`S{uaT+u`p&wVuofDWmc%Q^4}kiOmqo`dX6kMqHkIy5i>8oAImxV1Kkc zfMF8WzAD}>= zJNY8nSAlb~SB2vW5UP!D+s(X5Dq_h_JLH!b^#9V)s*)h_z+s7)Q(bZp6lLdDlsaa9 zaCUZ!2~TrwM~k7?edA-Z`kJ1jc|sEJeceDePaM2e=__BoKJ|{d&nK4oL+op1O|;(^ zMG<8LkU71=5!oo>n;8~-pVCyJhUw-nSw+2_F6C3IoNN6xp_sXCxo@}3U;0Qq0dPhL z_c^+{vb3ja@3NIndLMa^fb8sSxww)S1tR|v#a7EWXHe)9z_tME#n_Dp3%kO#V) zk#^!z?<4m{-9Oz4SF(8aZ(o_~?7hxZV6%LVDMqQ{DCd8M zdhw7+_|eEI?t%V!oakfV#MO#_+X#M^Y9H?(CiU5wW~zIH5=8L}*Hm@T5Poz~bbddJ zv?8)GDU8e%4cp91={|W(q3TEAr6+R%_4(E9Dhd-tc$E)SF5%;!0(X5tEpQtvt7|M! zSZdsNi(fl+=L5gQ*_SDDiHY&KsFPz~PqBy4EnO!oqyYrs)0(tHU|?P$ag*fklTK?f zEBpdQD?BcIC?f$z1u#6B8|-1}w6@A4lgy%GEm`n;*# z8{GCpE(Q8;aG`4{DfL3!T}c>9#r@68&Hin}@tI3n6_;CWdm*KbwWCV5W&K_D9wTg< zoau0CY40CH$2#I%?}{_V3E2YSw;IC#;LPQw?LUqDg-V%CT_3dxk7T(b1ChSVBFD39 zD=X{u=Une$wuIk}jQtZ41Zhg2AM1GVBd}TRROfDK>Lke9%ANP|>jO8&5~G5>uGu!6 zwl(4CZbksUp}S3GgN(Xmy>s@9d%1X|S7@%s6`i|f->ZUy)_(;ZZ-ZcjP0<91eOmpz zOwT6D)Pg(Et@_bu(6sW*+ty#{DaD2EKvpb1^XF4`@5uFM(#eOWrv$=7STCmOFCE1hO3DMK8~ROg^uvkM2+=8PJs(N(+we;>CgoBIi5_~o zL&_-y6Js8y)$51p9`e5{+`H$Xb% zV&hGZ$P34$V=7Fn5>uYm)D1a2xVd@DHK41ki3D+t)d`Csd-`rp+buOdMjT(Tc%a5M zy>luJF6VhmxPasMcd+b(NA0_#@ROM2cY7}5A5ix86Ada)8@uFl7-J^IR!h%oi|hH2 z=ey5;I9+K#6 zs@7tYw65Y{edG3^9{`Rcb9g!E_7BdlN>_r}8XUNxU zuf8%q=k9a}#iqovzk41(2wj)>rGHGstKz_1TlU4#rpw6cOR|ch;@rx0(n6fXWB>RQ zMTI3&y_LGsEj=Ac$#ZEJw9iOclT*1&er?Rd;>(q?A+;ZX`mx^=pZlOo$rHJsjf*t$ zN?!L#SInHnC=y#PS5kjq#XV#fD zgV!R$9@M0skj(x3JpWUuT*=gZBH z$J6t~L!QILuR49s_z?Q|lxV>nZ>w@Euch8XsFltAdizxJ)4nC#=Q`zv0GrzF;||MO zv6)$msln-~1x1dd?lzWbc{Yf!{3TQ|yWmi2X5QbicBS@J=E|m`<#5$T*VUx5Z?eJ% zIK*<`5k|9YxqSbD_EpCtN2aQJ-{yKYoe7jKbN>%i-n3Fv&?V5D3~p1h8Fl?r34iB% z(?;d^#KM)I+)G1jb-su*xB3GXl>)5;Vcwhl9i(jpmoE%>ArjZqRy=dunQCjTPrm_7-TD~TlUTz-&(*43;zeoT5^zoH}c*SckM*h^t19lhweMVhytKWqG{b~ zYU~+pyP1<$`Cdg}sbil?Y58;w@fs~)dF+K!YH7ZnZxO9Y>e53uWxhCiT` z1hnntbC(Q2gK3#ITD~QE%jNC=s|+2f)-M@ktBD>iQM3f^S|=P zyHEB+b$;JykD3;Fc{d~K&6kQ#y!_GD1G-0^olgw@eoJQeetF%SnUqFu>vq$}e|Xb_u^<@J1Xxe+>eT7l!-r8XL(@Y9k2nUvpX%>R0el;^hRcekMI zVOYaWTiav7o<)C8H0Ag!Mmql7)ejF+%h9=Dn=*agCdazVKxE-h%vjyhw_*S_eZCL= z1p4rMX4ah(W{5zye0rcypi=$tXcnWJ%LfK-vQ_| zs@y&H?TzQs&l-NPe4MYG_*BuZIyx27*B9Qo;s86JZCq(&BfVC*hvoF9G6FR|bS z2PxcndB*n74CYHb3Pmq3qEvt(9h%HlEqKQPt#@LxXed| ze}DB^B2K-%|Nee$%AFDskq>7t5yZ@k(rJ$kl0LY#k9H|sw0Fod&bee_tK@~gfC^p( zQpRAu1(aeszLoyB+#tIB%#2BovJdwED7p@RsQ*7sDnc~K9z_WudmU2QAr#pP3E6v| zQHjpklsF1q=4I#Xc}7_$XFCpO9cSD*ocsPhzkk5vaX#aQfK)?y`6nrbU&-UBr*)lLg9SaiNm^HEa+D!EO6(p`%nA6Q*?B#4F5f;% zj5I5^_sGpjAO6eP`mWC<{t5b9zipJHNt`55V}JLS{>#MdCoCAKf$05fSHFCvllvZL zp!w{M!DI2{B4*#iiI*Vj^)p2=gaj_?Vz zE5N^SN?-3z2O1{TCEN2l^k?4>rMeu+jC{+S+5|Z-iyz;N#iDH+3Km_%bnfxL+IXm3 zb2M`V`_=3-P%?dojJCX?9x%F^BC_kk-@tf2FC*`Uh7mt6LbOJY=l7eE8)b5s$B(l& ze?C<=#GgI2!{N==F1%uh>4GFkbIZ+n}%D3zKudUC8dfB?*KlS+Vt4MYy zao*4pVDF{MT_cD`U5~nim?6Z0QmV%uDSxs6`-Wio z_<9O+-^~=Wy?^9?X~GSo-!n|01W=`sCHhKY0(tBd*q@#Ez^@&rBn>{96LmjC2JOY| zk8IO!QP4OePumgBxl7+)>;kU^7TaZ8)AN+@fF^KFprwKLt-FfJdY0LD*MtgBZhV4= zf{lNT)p@ELiy4j+2-}Be@8T2PFug2MRB&)7n@0-Snu~Ga=fYT5rJ^> z#l6T&$-5zZtq^89_(0f&tFzxOfs+uHT6(6>Ue$%nndOa7GgKuiTiVF~vc$(3@q+pn(gw9<&Lf6@~EN43Z_*>ln zhug_{ruaX)N|m``Irj6{fdV<4=oJo^XZ}D1i@r86_$ivxO}kqEvOM%Zy57dCMP7Bp#dj6F##T?=MJ=u` zf}Xkudw14f)*S@>rUBXopLU8&BjM_)VP`p2>kKAEVxR6_x;*;3x}^;r#F2v&OWGD_ zDdl>;rv!6AcT9$i7KP=4KfsJ_6z+((=-hps2x4cC8< z^u3>qk%y~FM;brN%DgLX{i8%8A}h_e%?mb>^6%#$jPFapa=93@xV2;Y$;5gkU-{11 z88>Zlk!Za;?L!vlYP+0Z2?%}%_PSk&Gm&?RY$eV?(uvVOSugLg^w^f5BSqZTuH32l ztsK6R8ZXt5tf2Qts2fbkKMjl?)oS$VX{WpZ^GE71P8}vnFB8SO3oaW3F?KH|Afvja zxwOZ3yj_)%vnYPQP0iaA$$h2KA}>U)(l+50{m&YlmkgmzA7u9}~ZMQ+7nYpWE$V<4k>E7Ro?CYY% zWsH&HY2=&1Ozq*ibo_S*vj>j#0`ef!RYmV_=Zrv#rJZ5gG6Px!rt5TnS{ zrl4@#ivY5Ql}(gncdcP3fyC0_c&GivvZm4!?DCMuYtW;wPWy9G+zllTA*D73?k4X! zN-SHge1bW?iMJ(gfPeL_O$R^!kRKU*C!06(S|mEBRnlfq)-rQtvP@hF?Y7d8Q?h9@ zS@N>v%}MaL^39XhKR47&Qi`YTJ#2;%VScxCF8s(Sp6*oK`4*s%E>WyRR99cpH8BS3 zxBn8N@)hmn;M~Y!J&4)sW)p1}BJU$@?H{6-pqWluydcvz%Uq|@?E#`zY9Za_ESdMj z8qy_!y{i|0KAZQ^@)G!mp5&9pv90IrEUk(U6GH3OU~M`0l1 zx`o)NH(k=CdaKfaK!F+LN;waEX=qN5yn#~f^5s{0&UlaTRuW-WBV7N$zs1^4ZNT;Z?vZcv_3 z4jnd?@hRh9$PvnMh4r;0=jY`zXIVspp!dcfD5h}K=iV84?thDd&TA6&~8X zJXvhi?$4DIl7<6=b3v6V4*F$Sf8=d6$95DLgiG-Uo37@rKvccl#5}3Sjc%Uhn&hqe z`9@j%yaoY5Gb$lRh_>ILbA~hg>eB*|HV7z$jm;ZX9>Mw0lNG0cl#Q8u8ySjsj1Yc< z^jEC?e9*=sCMK$#H6xcv?3+l+-VqfUFrtx5kB?C$pbAGUMz2Hjwfjuz*l2DT0lz-5 zY{yP`fc^ulk{ozgBLV(|CMLmnNJVXIjItG^)2V=HF62#B)e(Uaj{iHoHqYS-d{)B2 zGDF8QOS7{8*a$LvpjtxlTBFzDuwVfg0nA~aD!?lbF3|GZ3mT%T`zcs_SMC%kR?QEP z7|4e7lTlia7LfZ*sw04{d&gIv0-%)$yA)`w=JiPmt{*}>w|4LJOhXO2mI+S0tU10* z9i`r@-+=qOv`*H~Hn-!zj%mv`;!`qLSYu0`bN;FKbw$r^_RB2${1*4dd2L1q)MNg&+-z z=bj_#&t@HVY1~Txls!F<#Kic{HcetXWRp{3duY-HcrP*G9^ zJ*|xTN70h$-~+nP*qixJU|?1laBIq%*bn+^@0e(tYdYyY>dJulhjL>T6;s4iu^F&@ zB#yDoU+t)$V<{f3SsaUoka0k9SzE-VjNtnD+}1O5N11L*qj1NPR&`r@DGZG*@n`3N zSjGukzy@qy9_8~GAf*!EhsAPE2k~in@69hhP~q814H!^i#Bj_X1Imq�j)%1&f#ZqD4~$euufI(ZFaH3 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 z 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%0Ay<4xRPFjc9ayt98vjBPX$uqg=&IO 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

{F`|Y~eYI;tm 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 literal 0 HcmV?d00001 diff --git a/blueprints/streamflow/template.toml b/blueprints/streamflow/template.toml new file mode 100644 index 00000000..3867afaa --- /dev/null +++ b/blueprints/streamflow/template.toml @@ -0,0 +1,15 @@ +[variables] +main_domain = "${domain}" +session_secret = "${password:64}" + +[config] +[[config.domains]] +serviceName = "streamflow" +port = 7575 +host = "${main_domain}" + +[config.env] +SESSION_SECRET = "${session_secret}" +TIMEZONE = "Asia/Jakarta" + +[[config.mounts]] diff --git a/meta.json b/meta.json index 8eed71e7..1e39e480 100644 --- a/meta.json +++ b/meta.json @@ -5498,6 +5498,25 @@ "open-source" ] }, + { + "id": "streamflow", + "name": "StreamFlow", + "version": "2.1", + "description": "StreamFlow is a multi-platform live streaming web application that enables simultaneous RTMP streaming to YouTube, Facebook, and other platforms with video gallery, scheduled streaming, and real-time monitoring.", + "logo": "streamflow.png", + "links": { + "github": "https://github.com/bangtutorial/streamflow", + "website": "https://github.com/bangtutorial/streamflow", + "docs": "https://github.com/bangtutorial/streamflow#readme" + }, + "tags": [ + "streaming", + "rtmp", + "video", + "live-streaming", + "media" + ] + }, { "id": "supabase", "name": "SupaBase",