diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 00000000..0378bbfd --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,60 @@ +name: Deploy Documentation + +on: + push: + branches: + - main + - website-customDeviceSimulation + - release/v1.2.9 + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + defaults: + run: + working-directory: website + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: website/package-lock.json + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Install dependencies + run: npm ci + + - name: Build site + run: npm run build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: website/build + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index acbd12fa..d012d491 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,8 @@ __pycache__ build *.pot .agent +voice_to_text/lib/ +.clickable +website/node_modules +website/.docusaurus +website/build diff --git a/CMakeLists.txt b/CMakeLists.txt index 20462bf9..2f04fc99 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,77 @@ install(DIRECTORY src DESTINATION ${DATA_DIR}) install(DIRECTORY qml DESTINATION ${DATA_DIR}) install(DIRECTORY models DESTINATION ${DATA_DIR}) +install(DIRECTORY voice_to_text DESTINATION ${DATA_DIR} PATTERN "model" EXCLUDE) + + +# Map Clickable architecture to Pip platform tags +if(CLICK_ARCH STREQUAL "arm64") + set(PIP_PLATFORM "manylinux2014_aarch64") +elseif(CLICK_ARCH STREQUAL "amd64") + set(PIP_PLATFORM "manylinux2014_x86_64") +else() + set(PIP_PLATFORM "manylinux2014_${CLICK_ARCH}") +endif() + +# Detect Python version and ABI for pip dependencies +execute_process( + COMMAND python3 -c "import sys; print('{}.{}'.format(sys.version_info.major, sys.version_info.minor))" + OUTPUT_VARIABLE PYTHON_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE +) +execute_process( + COMMAND python3 -c "import sys; print('cp{}{}'.format(sys.version_info.major, sys.version_info.minor))" + OUTPUT_VARIABLE PYTHON_ABI + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# Dynamically download python dependencies during build +if(CLICK_ARCH STREQUAL "armhf") + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/voice_deps_installed.stamp + COMMAND rm -rf ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib + COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib + COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/voice_deps_installed.stamp + COMMENT "Skipping voice-to-text Python dependencies on armhf (unsupported architecture)" + ) +else() + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/voice_deps_installed.stamp + # Clean the build-time lib directory to ensure a fresh install + COMMAND rm -rf ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib + COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib + # 1. Download all dependencies with the correct architecture/platform tags + COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/python_downloads + # Download binary packages (force aarch64) + # We use --no-deps to prevent it from trying to resolve pure-python dependencies with platform tags + COMMAND python3 -m pip download --dest ${CMAKE_CURRENT_BINARY_DIR}/python_downloads + --platform ${PIP_PLATFORM} --python-version ${PYTHON_VERSION} --implementation cp --abi ${PYTHON_ABI} --only-binary=:all: --no-deps + vosk==0.3.45 cffi==1.17.1 websockets==13.1 charset-normalizer==3.4.7 + # Download pure-python packages (no platform tags needed as they are none-any) + COMMAND python3 -m pip download --dest ${CMAKE_CURRENT_BINARY_DIR}/python_downloads + certifi==2024.2.2 idna==3.13 requests==2.31.0 srt==3.5.3 tqdm==4.67.3 urllib3==1.26.18 pycparser + + # 2. Install the downloaded packages into the target lib folder + # Phase 1: Binary ones (force platform). Use --no-deps to skip resolution of pure-python deps. + COMMAND python3 -m pip install --target ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib + --no-index --find-links=${CMAKE_CURRENT_BINARY_DIR}/python_downloads + --platform ${PIP_PLATFORM} --python-version ${PYTHON_VERSION} --implementation cp --abi ${PYTHON_ABI} --only-binary=:all: --no-deps + vosk==0.3.45 cffi==1.17.1 websockets==13.1 charset-normalizer==3.4.7 + # Phase 2: Pure-python ones. We also use --no-deps here to be safe and specific. + COMMAND python3 -m pip install --target ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib + --no-index --find-links=${CMAKE_CURRENT_BINARY_DIR}/python_downloads --no-deps + certifi==2024.2.2 idna==3.13 requests==2.31.0 srt==3.5.3 tqdm==4.67.3 urllib3==1.26.18 pycparser + + # 3. Bundle libatomic.so.1 (required by vosk on some arm64 devices) + # It's installed in the container via dependencies_target in clickable.yaml + COMMAND cp /usr/lib/${ARCH_TRIPLET}/libatomic.so.1 ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib/ || true + COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/voice_deps_installed.stamp + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/voice_to_text/requirements.txt + COMMENT "Installing Python dependencies for voice to text (${CLICK_ARCH})" + ) +endif() +add_custom_target(install_voice_deps ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/voice_deps_installed.stamp) +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/voice_to_text/lib DESTINATION voice_to_text) # Translations file(GLOB_RECURSE I18N_SRC_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/po qml/*.qml qml/*.js) diff --git a/README.md b/README.md index 635ea878..57404ca9 100644 --- a/README.md +++ b/README.md @@ -1,102 +1,42 @@ -# Time Management +# TimeManagement -Time Management +TimeManagement is a desktop and Ubuntu Touch project for task, timesheet, dashboard, and sync-oriented workflows. -This guide explains how to install `clickable`, build the `TimeManagement` project, and run it on both desktop and Ubuntu Touch devices. +## Documentation site -## Prerequisites +The project now includes a Docusaurus website in `website/` that is intended to become the main home for: -- Ubuntu or Debian-based system -- Git -- Python 3 -- Docker (for cross-compilation and device builds) +- product-facing overview content +- user and setup documentation +- technical architecture and repository guidance +- contributor workflow documentation -## Install Clickable +Planned published URL: -Follow the official steps to install `clickable`: +- `https://citopenrep.github.io/timemanagement/` -```bash -# Install required dependencies -sudo apt update -sudo apt install git python3 python3-pip - -# Install Clickable using pip -pip3 install --user clickable-ut - -# Add Clickable to your PATH -echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc -source ~/.bashrc -``` - -Verify installation: +## Local docs development ```bash -clickable --version +cd website +npm install +npm run start ``` +## App build and run -## Build the project -To build the project, clone this repo and then you can run - -```bash -clickable desktop -``` - -The above command will run the project on desktop +For the current application workflow: ```bash +clickable desktop clickable install ``` -to install the app on the connected device. - -## Refactor guardrails - -Phase 1 refactor guardrails and naming contract are documented here: - -- docs/refactor/phase-1-architecture-contract.md -- docs/refactor/phase-1-naming-map.md -- docs/refactor/phase-1-smoke-checklist.md - -Migration check helper: - -```bash -./scripts/refactor_phase1_checks.sh report -``` - - -## License - -/* - * MIT License - * - * Copyright (c) 2025 CIT-Services - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -## Contributing +## Existing source docs -- [Pull Request Guidelines](docs/PR-GUIDELINES.md) -- [High Level Architecture](docs/HLD.drawio) -- [Phase 1 Refactor Docs](docs/refactor/) +The legacy Markdown docs in `docs/` remain available during the migration into the Docusaurus site. -## References -* https://clickable-ut.dev/en/latest/ -* Location of DB : ~/.clickable/home/.local/share/ubtms/Databases +## Repository references +- [Technical file organization](docs/TECHNICAL-FILE-ORGANIZATION.md) +- [Pull request guidelines](docs/PR-GUIDELINES.md) diff --git a/clickable.yaml b/clickable.yaml index 34297d33..e121c029 100644 --- a/clickable.yaml +++ b/clickable.yaml @@ -2,3 +2,7 @@ clickable_minimum_required: 8.0.0 builder: cmake kill: qmlscene skip_review: true +dependencies_target: + - libatomic1 +dependencies_host: + - python3-pip \ No newline at end of file diff --git a/docs/HLD.drawio b/docs/HLD.drawio deleted file mode 100644 index 70aba329..00000000 --- a/docs/HLD.drawio +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/TECHNICAL-FILE-ORGANIZATION.md b/docs/TECHNICAL-FILE-ORGANIZATION.md new file mode 100644 index 00000000..79340fea --- /dev/null +++ b/docs/TECHNICAL-FILE-ORGANIZATION.md @@ -0,0 +1,315 @@ +# Technical File Organization + +This document explains how files are currently stored in the `timemanagement` project and how new files should be placed going forward. + +Its goal is to make the repository easier to navigate, reduce misplaced files, and keep imports, packaging, and maintenance predictable. + +## 1. Storage Principles + +The repository is organized by responsibility: + +- `qml/` contains the UI layer. +- `models/` contains JavaScript data and state helpers used by QML. +- `src/` contains Python backend, sync, daemon, and utility logic. +- `assets/` contains package-level branding assets. +- `docs/` contains project documentation. +- `scripts/` contains local maintenance and validation scripts. + +Within each area, files should be grouped by feature first and by technical role second. + +## 2. Current Repository Layout + +### Root-Level Infrastructure + +The repository root contains build, packaging, and launcher files such as: + +- `CMakeLists.txt` +- `clickable.yaml` +- `manifest.json.in` +- `ubtms.desktop.in` +- AppArmor and push-helper configuration files +- helper entrypoints such as `start-daemon.sh` and `push-helper.py` + +These should remain at the root unless the build system is changed. + +### QML UI Layer + +`qml/` is the main frontend tree. It is already split into several stable areas: + +- `qml/app/` + - application shell, startup, navigation, drawer, and top-level pages +- `qml/components/` + - reusable shared UI components +- `qml/features/` + - feature-specific pages, feature widgets, and feature-local JavaScript +- `qml/images/` + - runtime image assets used directly by the QML UI + +#### `qml/app/` + +Use this folder for application-wide UI infrastructure: + +- `qml/app/AppLayout.qml` +- `qml/app/GlobalWidgets.qml` +- `qml/app/StartupManager.qml` +- `qml/app/SystemIntegrationManager.qml` +- `qml/app/navigation/` +- `qml/app/pages/` + +Files belong here when they are part of the overall app shell rather than a specific business feature. + +Examples: + +- splash screen +- about page +- navigation controller +- route definitions + +#### `qml/components/` + +Use `qml/components/` for reusable building blocks shared across multiple features. + +Current subgroups include: + +- `base/` for low-level reusable primitives +- `cards/` for reusable content cards +- `dialogs/` for shared dialogs and popups +- `feedback/` for notifications, loading states, and status UI +- `navigation/` for shared navigation widgets +- `pickers/` for date/time and selection pickers +- `richtext/` for rich-text editing and preview components +- `selectors/` for entity selection controls +- `system/` for bridge/system-level UI helpers +- `visualization/` for charts and visual widgets +- `workflow/` for multi-step or form-support flows + +Rule: + +- If a QML file is used by more than one feature, it should normally live under `qml/components/`. + +Examples: + +- `qml/components/richtext/ReadMorePage.qml` +- `qml/components/base/UbuntuShape.qml` +- `qml/components/dialogs/CreateUpdateDialog.qml` +- `qml/components/system/ModelDownloadTimerWidget.qml` + +#### `qml/features/` + +Use `qml/features/` for business-domain functionality. + +Current feature folders are: + +- `activities/` +- `dashboard/` +- `projects/` +- `settings/` +- `tasks/` +- `timesheets/` +- `updates/` + +Each feature should keep its own files close together. The current pattern is: + +- `pages/` for top-level screens +- `components/` for feature-local widgets +- `js/` for feature-local JavaScript helpers +- `charts/` where a feature owns custom chart QML + +Rule: + +- If a file is only used inside one feature, keep it inside that feature instead of placing it in `qml/components/`. + +Examples: + +- `qml/features/tasks/pages/Tasks.qml` +- `qml/features/tasks/components/TaskList.qml` +- `qml/features/dashboard/js/chartUtils.js` + +#### `qml/images/` + +Use `qml/images/` for images loaded by the QML interface at runtime. + +This includes: + +- icons +- logos used in pages +- PNG/SVG assets referenced by `Image { source: ... }` + +Example: + +- `qml/images/logo.png` + +Rule: + +- If an asset is referenced by QML during app runtime, prefer `qml/images/`. + +### JavaScript Model Layer + +`models/` contains shared JavaScript modules imported by QML. + +Examples: + +- `models/Main.js` +- `models/global.js` +- `models/task.js` +- `models/timesheet.js` +- `models/database.js` + +Rule: + +- Shared app state, data access helpers, and cross-feature JS modules belong in `models/`. +- Feature-specific JS should stay inside `qml/features//js/` unless it becomes broadly shared. + +Important note: + +- QML files imported from `qml/` often reference `models/` through relative imports. +- When moving a QML file, its `import "../../../models/..."` style paths must be rechecked carefully. + +### Python Backend Layer + +`src/` contains Python code for: + +- backend bridging +- Odoo/CURQ sync +- daemon logic +- configuration +- logging +- helper tools + +Examples: + +- `src/backend.py` +- `src/daemon.py` +- `src/odoo_client.py` +- `src/sync_from_odoo.py` +- `src/sync_to_odoo.py` + +Rule: + +- App runtime Python belongs in `src/`. +- Development-only helper scripts should go in `scripts/` instead of `src/` unless they are intentionally shipped with the app. + +### Assets + +`assets/` contains package-level or source-branding assets that are not primarily organized as QML runtime UI images. + +Examples: + +- `assets/logo.svg` +- `assets/logo.png` +- generated logo variants + +Rule: + +- Keep original branding/source artwork in `assets/`. +- Keep QML-consumed UI copies in `qml/images/` when they are used directly by the frontend. + +### Documentation + +`docs/` stores project documentation such as: + +- contribution process +- architecture notes +- technical conventions +- future refactor notes + +Rule: + +- Add technical repository conventions here instead of only describing them in PRs or commit messages. + +### Scripts + +`scripts/` contains maintenance utilities for developers. + +Examples: + +- unused-code checks +- refactor checks +- validation helpers + +Rule: + +- Scripts that are for developer workflow and not shipped app behavior should live here. + +## 3. Where New Files Should Go + +Use the following placement rules when adding new files. + +### New QML Page + +- App-wide page: `qml/app/pages/` +- Feature page: `qml/features//pages/` +- Shared workflow/editor page used across features: `qml/components//` + +### New Reusable QML Component + +- Put it in the most specific shared subgroup under `qml/components/` +- If no subgroup fits, create one only when there is a clear category with more than one likely component + +### New Feature-Specific QML Component + +- Put it under `qml/features//components/` + +### New JavaScript Helper + +- Shared across features: `models/` +- Used only by one feature: `qml/features//js/` + +### New Image or Icon + +- Used directly by QML: `qml/images/` +- Source artwork or packaging asset: `assets/` + +### New Python Module + +- Runtime/backend logic: `src/` +- Developer utility or validation script: `scripts/` + +### New Documentation + +- Project/process/architecture/reference docs: `docs/` + +## 4. Current State Summary + +The repository is already mostly organized around a good long-term structure: + +- shared UI lives under `qml/components/` +- business screens live under `qml/features/` +- app shell code lives under `qml/app/` +- shared JS models live under `models/` +- backend Python lives under `src/` + +Recent cleanup also moved previously loose QML files into more relevant locations: + +- `ReadMorePage.qml` into `qml/components/richtext/` +- `UbuntuShape.qml` into `qml/components/base/` +- `release_notes.txt` into `qml/app/pages/` +- runtime `logo.png` into `qml/images/` + +This direction should be preserved for future work. + +## 5. Known Conventions and Exceptions + +- `qml/components/qmldir` and similar `qmldir` files must be updated when shared components are added or moved. +- Relative imports in QML are sensitive to file moves, especially imports from `models/`. +- Some assets may exist in both `assets/` and `qml/images/` for different purposes: + - `assets/` as source/package artwork + - `qml/images/` as runtime UI assets +- Top-level build and packaging files should not be moved casually because `CMakeLists.txt`, Clickable, and packaging metadata depend on them. + +## 6. Recommended Rule of Thumb + +Before creating a new file, ask: + +1. Is this app-wide, feature-specific, or shared? +2. Is this runtime UI, shared model logic, backend code, documentation, or developer tooling? +3. Will another feature reuse this file soon? + +If the answer is clear, the correct folder is usually clear as well. + +When in doubt: + +- prefer `qml/features//...` for feature-owned code +- promote to `qml/components/...` only after reuse is real +- keep shared non-UI logic in `models/` +- keep backend/runtime Python in `src/` diff --git a/docs/refactor/phase-1-architecture-contract.md b/docs/refactor/phase-1-architecture-contract.md deleted file mode 100644 index f2cf0238..00000000 --- a/docs/refactor/phase-1-architecture-contract.md +++ /dev/null @@ -1,144 +0,0 @@ -# Refactor Phase 1: Architecture Contract - -Status: Active - -## Purpose - -This document freezes the migration contract before large file moves begin. The contract is intentionally strict to keep refactor chunks mergeable, reviewable, and behavior-safe. - -Core rule for all migration chunks: - -- Move first. -- Keep behavior unchanged. -- Keep old entry paths as compatibility wrappers until explicit removal gates pass. - -## Target Tree - -### QML - -- qml/TSApp.qml remains app entrypoint. -- qml/app/ remains shell/bootstrap only. -- qml/app/navigation/ stores route definitions, menu model, and navigation coordination. -- qml/features//pages/ stores feature pages. -- qml/features//components/ stores feature-owned components. -- qml/shared/components/ stores reusable cross-feature components. -- qml/shared/richtext/ stores shared rich-text stack. -- qml/legacy/ stores quarantined, non-primary artifacts. - -### JS Models - -- models/core/ contains shared low-level modules: - - database.js - - dbinit.js - - utils.js - - constants.js - - global.js -- models/features/ contains feature model modules: - - accounts.js - - tasks.js - - timesheets.js - - projects.js - - activities.js - - notifications.js - - draft_manager.js -- models/services/ contains service modules: - - timer_service.js - -### Python - -- src/ubtms/ is the source-of-truth package. -- src/ubtms/core/ contains config/logging/shared helpers. -- src/ubtms/integrations/ contains Odoo client integration. -- src/ubtms/sync/ contains sync-in and sync-out flows. -- src/ubtms/backend/ contains pyotherside-facing backend API. -- src/ubtms/daemon/ contains daemon/runtime modules. - -Compatibility wrappers remain at: - -- src/backend.py -- src/daemon.py -- src/cli.py - -## Naming Rules - -- QML pages use PascalCase and Page suffix where applicable. -- Feature list/editor split uses ListPage and EditorPage. -- Feature directory names are lowercase plurals where practical: - - tasks - - timesheets - - projects - - activities - - updates -- Shared components use intent-based names, not feature names. -- JS module files are lowercase and pluralized by domain in models/features. - -Canonical rename mapping is frozen in: - -- docs/refactor/phase-1-naming-map.md - -## Wrapper Policy - -### QML wrapper policy - -Old top-level page paths remain importable during migration. Wrapper files must: - -- Instantiate or forward to the new page path only. -- Contain no business logic. -- Contain no data-loading logic. -- Keep existing external properties/signals expected by callers. - -### JS wrapper policy - -Legacy flat model paths remain importable during migration. Wrapper files must: - -- Preserve existing exported function names. -- Forward to new module locations. -- Avoid behavior changes. - -### Python wrapper policy - -Entry modules remain importable during migration: - -- backend -- daemon -- cli - -They must re-export from package modules and preserve current call surface used by QML bridge and scripts. - -## Routing Contract - -- Route and menu definitions must live in qml/app/navigation/. -- App shell may consume route definitions but should not hardcode route registry data. -- During transition, existing pageNum compatibility stays intact. -- Deep-link routing and menu routing must share the same route mapping source. - -## Import Contract During Migration - -- No new feature code should import from deprecated flat roots once a layered path exists. -- Old imports may stay only in wrappers or untouched legacy code until feature chunk migration. -- New moves must be path-stable: update internal imports in same chunk. - -## Chunk Acceptance Gates - -Each migration chunk is mergeable only if all are true: - -1. App starts successfully. -2. Smoke checklist in docs/refactor/phase-1-smoke-checklist.md passes. -3. Legacy wrappers for moved files are thin wrappers only. -4. No unexpected route regressions in drawer/deep-link navigation. -5. No new imports introduced to deprecated module paths for already-migrated layers. - -## Wrapper Removal Gates - -A wrapper family can be removed only when all are true: - -1. Grep shows zero references to old paths. -2. Smoke checklist passes after removal. -3. One additional follow-up check confirms no runtime route/import fallback is used. - -## Non-Goals for Phase 1 - -- No broad runtime refactors. -- No behavior changes to business logic. -- No pyotherside module rename. -- No asset churn. diff --git a/docs/refactor/phase-1-naming-map.md b/docs/refactor/phase-1-naming-map.md deleted file mode 100644 index d9f294f5..00000000 --- a/docs/refactor/phase-1-naming-map.md +++ /dev/null @@ -1,50 +0,0 @@ -# Refactor Phase 1: Frozen Naming Map - -Status: Frozen for migration start - -This mapping is fixed before large moves begin. - -## QML Page Rename Map - -| Legacy path | New page name | Target path | -| --- | --- | --- | -| qml/Task_Page.qml | TaskListPage.qml | qml/features/tasks/pages/TaskListPage.qml | -| qml/Tasks.qml | TaskEditorPage.qml | qml/features/tasks/pages/TaskEditorPage.qml | -| qml/MyTasks.qml | MyTasksPage.qml | qml/features/tasks/pages/MyTasksPage.qml | -| qml/Timesheet_Page.qml | TimesheetListPage.qml | qml/features/timesheets/pages/TimesheetListPage.qml | -| qml/Timesheet.qml | TimesheetEditorPage.qml | qml/features/timesheets/pages/TimesheetEditorPage.qml | -| qml/Project_Page.qml | ProjectListPage.qml | qml/features/projects/pages/ProjectListPage.qml | -| qml/Projects.qml | ProjectEditorPage.qml | qml/features/projects/pages/ProjectEditorPage.qml | -| qml/Activity_Page.qml | ActivityListPage.qml | qml/features/activities/pages/ActivityListPage.qml | -| qml/Activities.qml | ActivityEditorPage.qml | qml/features/activities/pages/ActivityEditorPage.qml | -| qml/Updates_Page.qml | UpdateListPage.qml | qml/features/updates/pages/UpdateListPage.qml | -| qml/Updates.qml | UpdateEditorPage.qml | qml/features/updates/pages/UpdateEditorPage.qml | -| qml/Aboutus.qml | AboutPage.qml | qml/app/pages/AboutPage.qml | -| qml/Splash.qml | SplashPage.qml | qml/app/pages/SplashPage.qml | -| qml/Menu.qml | MenuPage.qml | qml/app/navigation/MenuPage.qml | -| qml/Dashboard.qml | DashboardPage.qml | qml/features/dashboard/pages/DashboardPage.qml | -| qml/Dashboard2.qml | Dashboard2.qml | qml/features/dashboard/pages/Dashboard2.qml | - -## Legacy Dashboard Quarantine Plan - -- qml/Dashboard3.qml -> qml/legacy/dashboard/Dashboard3.qml -- qml/Charts1.qml -> qml/legacy/dashboard/Charts1.qml -- qml/Charts2.qml -> qml/legacy/dashboard/Charts2.qml - -Keep with active dashboard flow until usage is refactored: - -- qml/Charts3.qml -- qml/Charts4.qml - -## Compatibility Wrapper Rule - -For each moved page above: - -- Keep the original legacy file path. -- Convert it into a thin wrapper that forwards to the target path. -- Do not add new logic inside wrapper files. - -## Change Control Rule - -- Do not modify this map within the same chunk that performs broad moves. -- If a rename must change, update this map in a separate guardrail patch first. diff --git a/docs/refactor/phase-1-smoke-checklist.md b/docs/refactor/phase-1-smoke-checklist.md deleted file mode 100644 index 5f146ae0..00000000 --- a/docs/refactor/phase-1-smoke-checklist.md +++ /dev/null @@ -1,65 +0,0 @@ -# Refactor Smoke Checklist - -Run this checklist after each migration chunk. - -## App Startup And Layout - -- App launches on desktop. -- 1-column startup works. -- 2-column startup works. -- 3-column startup works. - -## Navigation - -- Drawer navigation opens every top-level page. -- Menu navigation opens every top-level page. -- Deep-link navigation works for: - - Task - - Activity - - ProjectUpdate - - Project - - Timesheet - -## Data Refresh And Account Switching - -- Account switch triggers visible-page refresh. -- Dashboard refresh still works. -- Timesheet list and editor refresh still work. -- Task list and editor refresh still work. -- Activity list and editor refresh still work. -- Project list and editor refresh still work. -- Update list and editor refresh still work. - -## CRUD Flows - -- Task create/edit/view works. -- Timesheet create/edit/view works. -- Project create/edit/view works. -- Activity create/edit/view works. -- Update create/edit/view works. - -## Drafts, Settings, And Notifications - -- Unsaved draft restore flow works. -- Theme/settings pages work. -- Notification badge still updates. -- Daemon startup and notification initialization still work. - -## Python Import Smoke - -Run: - -- python3 -c "import sys; sys.path.insert(0, 'src'); import backend; print('ok backend')" -- python3 -c "import sys; sys.path.insert(0, 'src'); import daemon; print('ok daemon')" -- python3 -c "import sys; sys.path.insert(0, 'src'); import cli; print('ok cli')" - -When package migration begins, add: - -- python3 -c "import sys; sys.path.insert(0, 'src'); import ubtms; print('ok ubtms')" - -## Reference Audit Gates - -Before removing wrappers, confirm: - -- grep shows zero references to old wrapper paths. -- no new imports were added to deprecated paths in migrated layers. diff --git a/manifest.json.in b/manifest.json.in index fec4e48d..1b86184a 100644 --- a/manifest.json.in +++ b/manifest.json.in @@ -18,7 +18,7 @@ "push-helper": "ubtms-push-helper.json" } }, - "version": "1.2.8", + "version": "1.2.9", "maintainer": "CIT Services ", "framework" : "@CLICK_FRAMEWORK@" } diff --git a/models/constants.js b/models/constants.js index 06710b8b..5ad87b3e 100644 --- a/models/constants.js +++ b/models/constants.js @@ -2,7 +2,7 @@ .pragma library -var version="1.2.7" +var version="1.2.9" //fonts var FontSizes = { diff --git a/po/nl.po b/po/nl.po index 989fd78f..428d545b 100644 --- a/po/nl.po +++ b/po/nl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ubtms\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-11-03 06:19+0000\n" +"POT-Creation-Date: 2026-06-26 13:14+0530\n" "PO-Revision-Date: 2025-10-15 22:45+0200\n" "Last-Translator: Gokul Kartha \n" "Language-Team: Dutch \n" @@ -17,1106 +17,2305 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../qml/Aboutus.qml:35 ../qml/Aboutus.qml:51 ../qml/Dashboard.qml:117 -msgid "About" -msgstr "Over" - -#: ../qml/Aboutus.qml:75 -msgid "Time Management App - Beta" -msgstr "Tijdbeheer-app - Bèta" - -#: ../qml/Aboutus.qml:81 -msgid "Version: " -msgstr "Versie: " - -#: ../qml/Aboutus.qml:86 -msgid "Release Notes: " -msgstr "Release-opmerkingen: " - -#: ../qml/Account_Page.qml:36 -msgid "Create Account" -msgstr "Account aanmaken" - -#: ../qml/Account_Page.qml:64 ../qml/Activities.qml:78 ../qml/Tasks.qml:69 -#: ../qml/Updates.qml:100 ../qml/components/SaveDiscardDialog.qml:64 -msgid "Save" -msgstr "Opslaan" - -#: ../qml/Account_Page.qml:73 ../qml/Activities.qml:86 ../qml/Tasks.qml:77 -#: ../qml/Updates.qml:108 ../qml/components/ActivityDetailsCard.qml:177 -#: ../qml/components/UpdatesDetailsCard.qml:50 -msgid "Edit" -msgstr "Bewerken" - -#: ../qml/Account_Page.qml:133 -msgid "Your account has been saved, Enjoy using the app !" +#: ../qml/components/selectors/StatusSelector.qml:26 +#: ../qml/components/cards/UpdatesDetailsCard.qml:102 +#: ../qml/components/dialogs/CreateUpdateDialog.qml:81 +#: ../qml/components/workflow/CreateUpdatePage.qml:269 +#: ../qml/features/updates/pages/Updates.qml:464 +#: ../qml/features/updates/pages/Updates_Page.qml:270 +msgid "On Track" msgstr "" -#: ../qml/Account_Page.qml:208 ../qml/Account_Page.qml:222 -#, fuzzy -msgid "Account Name" -msgstr "Account" +#: ../qml/components/selectors/StatusSelector.qml:38 +#: ../qml/components/cards/UpdatesDetailsCard.qml:103 +#: ../qml/components/dialogs/CreateUpdateDialog.qml:82 +#: ../qml/components/workflow/CreateUpdatePage.qml:270 +#: ../qml/features/updates/pages/Updates.qml:465 +#: ../qml/features/updates/pages/Updates_Page.qml:271 +msgid "At Risk" +msgstr "" -#: ../qml/Account_Page.qml:255 -msgid "Enter Odoo URL here" -msgstr "Voer hier Odoo URL in" +#: ../qml/components/selectors/StatusSelector.qml:50 +#: ../qml/components/cards/UpdatesDetailsCard.qml:104 +#: ../qml/components/dialogs/CreateUpdateDialog.qml:83 +#: ../qml/components/workflow/CreateUpdatePage.qml:271 +#: ../qml/features/updates/pages/Updates.qml:466 +#: ../qml/features/updates/pages/Updates_Page.qml:272 +msgid "Off Track" +msgstr "" -#: ../qml/Account_Page.qml:266 -msgid "Fetch Databases" -msgstr "Databases ophalen" +#: ../qml/components/selectors/ProjectSelector.qml:55 +#: ../qml/features/updates/pages/Updates.qml:375 +msgid "Account:" +msgstr "Account:" -#: ../qml/Account_Page.qml:318 -msgid "Database" -msgstr "Database" +#: ../qml/components/selectors/ProjectSelector.qml:62 +#: ../qml/components/selectors/ProjectSelector.qml:99 +#: ../qml/components/dialogs/AccountSelectorDialog.qml:21 +msgid "Select Account" +msgstr "Selecteer account" -#: ../qml/Account_Page.qml:379 -msgid "Enter Database Name" -msgstr "Voer databasenaam in" +#: ../qml/components/selectors/ProjectSelector.qml:77 +#: ../qml/features/updates/pages/Updates.qml:395 +#, fuzzy +msgid "Project:" +msgstr "Project" -#: ../qml/Account_Page.qml:397 ../qml/Account_Page.qml:411 -msgid "Username" -msgstr "Gebruikersnaam" +#: ../qml/components/selectors/ProjectSelector.qml:84 +#: ../qml/components/selectors/ProjectSelector.qml:119 +#: ../qml/components/selectors/ProjectSelector.qml:148 +#, fuzzy +msgid "Select Project" +msgstr "Projecten synchroniseren..." -#: ../qml/Account_Page.qml:430 -msgid "Connect With" -msgstr "Verbinden met" +#: ../qml/components/selectors/ProjectSelector.qml:137 +#: ../qml/components/selectors/ProjectSelector.qml:184 +#: ../qml/components/selectors/OptionSelectorPopover.qml:56 +#: ../qml/components/selectors/ProjectStageSelector.qml:228 +#: ../qml/components/dialogs/SaveDiscardDialog.qml:95 +#: ../qml/components/dialogs/AccountSelectorDialog.qml:231 +#: ../qml/components/dialogs/TimePickerPopup.qml:103 +#: ../qml/components/dialogs/CreateUpdateDialog.qml:138 +#: ../qml/components/richtext/FontSizeDialog.qml:72 +#: ../qml/components/richtext/LinkDialog.qml:54 +#: ../qml/components/richtext/ColorPickerDialog.qml:65 +#: ../qml/components/pickers/CustomDatePicker.qml:132 +#: ../qml/components/pickers/CustomDatePicker.qml:160 +#: ../qml/components/workflow/CreateUpdatePage.qml:178 +#: ../qml/components/workflow/AttachmentManager.qml:656 +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:470 +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:520 +#: ../qml/features/settings/pages/Settings_Accounts.qml:109 +msgid "Cancel" +msgstr "Annuleren" -#: ../qml/Account_Page.qml:520 -msgid "Hide" +#: ../qml/components/selectors/InlineOptionSelector.qml:131 +msgid "Tap to select" msgstr "" -#: ../qml/Account_Page.qml:520 -msgid "show" -msgstr "" +#: ../qml/components/selectors/AccountSelector.qml:106 +msgid "Select an account" +msgstr "Selecteer een account" -#: ../qml/Activities.qml:18 ../qml/Dashboard.qml:260 -msgid "Activity" -msgstr "Activiteit" +#: ../qml/components/selectors/StageFilterMenu.qml:180 +#, fuzzy +msgid "Filter by Stage" +msgstr "Filter op toegewezenen" -#: ../qml/Activities.qml:97 ../qml/Tasks.qml:58 ../qml/Updates.qml:118 -#: ../qml/components/CreateUpdatePage.qml:86 -msgid "Back" -msgstr "Terug" +#: ../qml/components/selectors/StageFilterMenu.qml:355 +msgid "Current: " +msgstr "Huidige: " -#: ../qml/Activities.qml:330 -msgid "Connected to" -msgstr "Verbonden met" +#: ../qml/components/selectors/WorkItemSelector.qml:124 +#: ../qml/features/dashboard/pages/Dashboard.qml:83 +#: ../qml/features/dashboard/pages/Dashboard.qml:484 +msgid "Account" +msgstr "Account" -#: ../qml/Activities.qml:340 ../qml/Projects.qml:43 -#: ../qml/components/WorkItemSelector.qml:127 +#: ../qml/components/selectors/WorkItemSelector.qml:125 +#: ../qml/components/feedback/NotificationBell.qml:663 +#: ../qml/features/projects/pages/Projects.qml:44 +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:611 +#: ../qml/features/dashboard/pages/TaskDetailPage.qml:96 +#: ../qml/features/activities/pages/Activities.qml:558 msgid "Project" msgstr "Project" -#: ../qml/Activities.qml:362 ../qml/Dashboard.qml:254 ../qml/Dashboard3.qml:32 -#: ../qml/Task_Page.qml:352 ../qml/Tasks.qml:45 -#: ../qml/components/WorkItemSelector.qml:129 +#: ../qml/components/selectors/WorkItemSelector.qml:126 +#, fuzzy +msgid "Subproject" +msgstr "Subproject" + +#: ../qml/components/selectors/WorkItemSelector.qml:127 +#: ../qml/components/feedback/NotificationBell.qml:661 +#: ../qml/features/tasks/pages/Task_Page.qml:404 +#: ../qml/features/tasks/pages/Tasks.qml:47 +#: ../qml/features/dashboard/pages/Dashboard.qml:217 +#: ../qml/features/dashboard/pages/Dashboard3.qml:32 +#: ../qml/features/activities/pages/Activities.qml:591 msgid "Task" msgstr "Taak" -#: ../qml/Activities.qml:398 -msgid "Summary" -msgstr "Samenvatting" +#: ../qml/components/selectors/WorkItemSelector.qml:128 +msgid "Subtask" +msgstr "Subtaak" -#: ../qml/Activities.qml:498 +#: ../qml/components/selectors/WorkItemSelector.qml:129 +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:609 +#: ../qml/features/dashboard/pages/TaskDetailPage.qml:94 #, fuzzy -msgid "Activity Type" -msgstr "Activiteit" - -#: ../qml/Activity_Page.qml:40 ../qml/Dashboard.qml:142 ../qml/Menu.qml:177 -#: ../qml/Projects.qml:288 ../qml/Tasks.qml:1245 -msgid "Activities" -msgstr "Activiteiten" - -#: ../qml/Activity_Page.qml:504 ../qml/Task_Page.qml:207 -msgid "Today" -msgstr "Vandaag" +msgid "Assignee" +msgstr "Toegewezenen" -#: ../qml/Activity_Page.qml:505 ../qml/Task_Page.qml:208 -msgid "This Week" -msgstr "Deze week" +#: ../qml/components/selectors/ProjectStageSelector.qml:55 +#, fuzzy +msgid "Change Project Stage" +msgstr "Persoonlijke fase wijzigen" -#: ../qml/Activity_Page.qml:506 ../qml/Task_Page.qml:209 -msgid "This Month" -msgstr "Deze maand" +#: ../qml/components/selectors/ProjectStageSelector.qml:108 +#, fuzzy +msgid "Current Stage: " +msgstr "Huidige fase:" -#: ../qml/Activity_Page.qml:507 ../qml/Task_Page.qml:210 -msgid "Later" -msgstr "Later" +#: ../qml/components/selectors/ProjectStageSelector.qml:108 +#: ../qml/components/cards/ProjectDetailsCard.qml:377 +#: ../qml/components/cards/ProjectDetailsCard.qml:385 +#: ../qml/features/tasks/components/TaskStagesDisplayGrid.qml:41 +#: ../qml/features/tasks/components/TaskStagesDisplayGrid.qml:99 +#: ../qml/features/tasks/components/TaskRecordActionsGrid.qml:37 +#: ../qml/features/tasks/components/TaskScheduleFields.qml:143 +#: ../qml/features/tasks/components/TaskDetailsCard.qml:637 +#: ../qml/features/tasks/components/TaskDetailsCard.qml:644 +#: ../qml/features/projects/pages/Projects.qml:658 +msgid "Not set" +msgstr "Niet ingesteld" -#: ../qml/Activity_Page.qml:508 -msgid "OverDue" -msgstr "Achterstallig " +#: ../qml/components/selectors/ProjectStageSelector.qml:115 +#, fuzzy +msgid "Select New Stage:" +msgstr "Deadline selecteren" -#: ../qml/Activity_Page.qml:509 ../qml/Task_Page.qml:212 -#: ../qml/Timesheet_Page.qml:131 -msgid "All" -msgstr "Alle" +#: ../qml/components/selectors/ProjectStageSelector.qml:173 +msgid "(Folded/Closed Stage)" +msgstr "" -#: ../qml/Activity_Page.qml:627 -msgid "No Activities Available" +#: ../qml/components/selectors/ProjectStageSelector.qml:199 +#, fuzzy +msgid "No stages available" msgstr "Geen activiteiten beschikbaar" -#: ../qml/Dashboard.qml:43 -msgid "Time Manager - Time Management Dashboard" -msgstr "Time Manager - Tijdbeheer Dashboard" - -#: ../qml/Dashboard.qml:94 ../qml/Dashboard.qml:434 -#: ../qml/components/WorkItemSelector.qml:126 -msgid "Account" -msgstr "Account" - -#: ../qml/Dashboard.qml:110 ../qml/Menu.qml:81 -msgid "Switch Accounts" -msgstr "Van account wisselen" +#: ../qml/components/selectors/MultiAssigneeSelector.qml:39 +msgid "Assignees" +msgstr "Toegewezenen" -#: ../qml/Dashboard.qml:126 ../qml/Menu.qml:68 -msgid "Dark Mode" -msgstr "Donkere modus" +#: ../qml/components/selectors/MultiAssigneeSelector.qml:123 +#: ../qml/components/selectors/MultiAssigneeSelector.qml:296 +msgid "Select Assignees" +msgstr "Selecteer toegewezenen" -#: ../qml/Dashboard.qml:126 ../qml/Menu.qml:68 -msgid "Light Mode" -msgstr "Lichte modus" +#: ../qml/components/selectors/MultiAssigneeSelector.qml:423 +#: ../qml/components/feedback/NotificationBell.qml:767 +msgid "Clear All" +msgstr "Alles wissen" -#: ../qml/Dashboard.qml:133 ../qml/Dashboard.qml:257 ../qml/Menu.qml:149 -#: ../qml/Timesheet.qml:43 -msgid "Timesheet" -msgstr "Urenstaat" +#: ../qml/components/selectors/MultiAssigneeSelector.qml:436 +#: ../qml/components/system/ImagePreviewer.qml:185 +#: ../qml/features/tasks/pages/Task_Page.qml:263 +#: ../qml/features/activities/pages/Activity_Page.qml:623 +msgid "Done" +msgstr "Klaar" -#: ../qml/Dashboard.qml:151 ../qml/Menu.qml:208 ../qml/MyTasks.qml:41 -msgid "My Tasks" -msgstr "Mijn taken" +#: ../qml/components/selectors/AssigneeFilterMenu.qml:340 +msgid "Filter by Assignees" +msgstr "Filter op toegewezenen" -#: ../qml/Dashboard.qml:160 ../qml/Menu.qml:239 ../qml/Task_Page.qml:41 -msgid "All Tasks" -msgstr "Alle taken" +#: ../qml/components/selectors/AssigneeFilterMenu.qml:367 +msgid "Search assignees..." +msgstr "Zoek toegewezenen..." -#: ../qml/Dashboard.qml:169 ../qml/Menu.qml:270 ../qml/Project_Page.qml:42 -msgid "Projects" -msgstr "Projecten" +#: ../qml/components/selectors/AssigneeFilterMenu.qml:455 +#, fuzzy +msgid "Selected" +msgstr "Selecteren" -#: ../qml/Dashboard.qml:178 ../qml/Menu.qml:301 ../qml/Projects.qml:413 -#: ../qml/Updates_Page.qml:38 -msgid "Project Updates" -msgstr "Projectupdates" +#: ../qml/components/selectors/AssigneeFilterMenu.qml:455 +msgid "Others" +msgstr "" -#: ../qml/Dashboard.qml:187 ../qml/Menu.qml:360 ../qml/Settings_Page.qml:36 -msgid "Settings" -msgstr "Instellingen" +#: ../qml/components/selectors/AssigneeFilterMenu.qml:619 +msgid "Less" +msgstr "" -#: ../qml/Dashboard2.qml:32 -msgid "Charts" -msgstr "Grafieken" +#: ../qml/components/selectors/AssigneeFilterMenu.qml:619 +msgid "More" +msgstr "" -#: ../qml/Dashboard3.qml:45 -msgid "Taskwise Time Spent" -msgstr "Tijdsbesteding per taak" +#: ../qml/components/selectors/AssigneeFilterMenu.qml:680 +msgid "Apply Filter" +msgstr "Filter toepassen" -#: ../qml/Menu.qml:36 -msgid "Menu" -msgstr "Menu" +#: ../qml/components/selectors/AssigneeFilterMenu.qml:699 +msgid "Clear Filter" +msgstr "Filter wissen" -#: ../qml/Menu.qml:118 -msgid "Dashboard" -msgstr "Dashboard" +#: ../qml/components/cards/ProjectDetailsCard.qml:136 +msgid "Stop Timer" +msgstr "Timer stoppen" -#: ../qml/Menu.qml:329 -msgid "About Us" -msgstr "Over ons" +#: ../qml/components/cards/ProjectDetailsCard.qml:341 +#: ../qml/components/cards/ActivityDetailsCard.qml:328 +#: ../qml/components/cards/UpdatesDetailsCard.qml:167 +#: ../qml/features/tasks/components/TaskDetailsCard.qml:622 +#: ../qml/features/timesheets/components/TimeSheetDetailsCard.qml:292 +msgid "DRAFT" +msgstr "CONCEPT" -#: ../qml/MyTasks.qml:302 -msgid "Showing closed/completed tasks" -msgstr "Gesloten/voltooide taken weergeven" +#: ../qml/components/cards/ProjectDetailsCard.qml:369 +#: ../qml/features/tasks/components/TaskDetailsCard.qml:630 +msgid "Planned (H): " +msgstr "Gepland (U): " -#: ../qml/MyTasks.qml:380 -msgid "No Tasks Assigned to You" -msgstr "Geen taken aan jou toegewezen" +#: ../qml/components/cards/ProjectDetailsCard.qml:377 +#: ../qml/features/tasks/components/TaskDetailsCard.qml:637 +msgid "Start Date: " +msgstr "Startdatum: " -#: ../qml/MyTasks.qml:396 ../qml/Projects.qml:307 ../qml/Projects.qml:366 -#: ../qml/Projects.qml:431 ../qml/Tasks.qml:1264 ../qml/Timesheet_Page.qml:272 -#: ../qml/components/CreateUpdatePage.qml:101 -msgid "Create" -msgstr "Aanmaken" +#: ../qml/components/cards/ProjectDetailsCard.qml:385 +#: ../qml/features/tasks/components/TaskDetailsCard.qml:644 +msgid "End Date: " +msgstr "Einddatum: " -#: ../qml/Project_Page.qml:55 ../qml/Updates_Page.qml:61 -msgid "New" -msgstr "Nieuw" +#: ../qml/components/cards/TasksForDayWidget.qml:36 +msgid "Plan for Today" +msgstr "Plan voor vandaag" -#: ../qml/Project_Page.qml:65 -msgid "Search" -msgstr "Zoeken" +#: ../qml/components/cards/ActivityDetailsCard.qml:74 +msgid "OVERDUE" +msgstr "ACHTERSTALLIG" -#: ../qml/Projects.qml:212 -msgid "Project Name" -msgstr "Projectnaam" +#: ../qml/components/cards/ActivityDetailsCard.qml:80 +msgid "TODAY" +msgstr "VANDAAG" -#: ../qml/Projects.qml:333 ../qml/Projects.qml:398 ../qml/Projects.qml:464 -#: ../qml/components/ActivityDetailsCard.qml:182 -#: ../qml/components/UpdatesDetailsCard.qml:55 -msgid "View" -msgstr "Bekijken" +#: ../qml/components/cards/ActivityDetailsCard.qml:86 +msgid "DONE" +msgstr "" -#: ../qml/Projects.qml:348 -msgid "Tasks" -msgstr "Taken" +#: ../qml/components/cards/ActivityDetailsCard.qml:92 +msgid "PLANNED" +msgstr "GEPLAND" -#: ../qml/Projects.qml:489 -msgid "Allocated Hours" -msgstr "Toegewezen uren" +#: ../qml/components/cards/ActivityDetailsCard.qml:190 +#: ../qml/components/cards/UpdatesDetailsCard.qml:52 +#: ../qml/features/updates/pages/Updates.qml:131 +#: ../qml/features/settings/pages/Account_Page.qml:77 +#: ../qml/features/tasks/pages/Tasks.qml:79 +#: ../qml/features/projects/pages/Projects.qml:136 +#: ../qml/features/activities/pages/Activities.qml:101 +msgid "Edit" +msgstr "Bewerken" -#: ../qml/ReadMorePage.qml:23 ../qml/Updates.qml:402 -#: ../qml/components/CreateUpdateDialog.qml:121 -#: ../qml/components/CreateUpdatePage.qml:328 -#: ../qml/components/RichTextPreview.qml:7 -msgid "Description" -msgstr "Beschrijving" +#: ../qml/components/cards/ActivityDetailsCard.qml:201 +#, fuzzy +msgid "Mark Done" +msgstr "Donkere modus" -#: ../qml/Settings_Page.qml:305 -msgid "App Theme Preference" -msgstr "Voorkeur app-thema" +#: ../qml/components/cards/ActivityDetailsCard.qml:206 +msgid "Follow-up" +msgstr "" -#: ../qml/Settings_Page.qml:313 -msgid "Choose your preferred theme for the application" -msgstr "Kies jouw voorkeurthema voor de applicatie" +#: ../qml/components/cards/ActivityDetailsCard.qml:283 +msgid "No Summary" +msgstr "Geen samenvatting" -#: ../qml/Settings_Page.qml:374 -msgid "Light Theme" -msgstr "Licht thema" +#: ../qml/components/cards/ActivityDetailsCard.qml:294 +msgid "No Notes" +msgstr "Geen opmerkingen" -#: ../qml/Settings_Page.qml:439 -msgid "Dark Theme" -msgstr "Donker thema" +#: ../qml/components/cards/ActivityDetailsCard.qml:306 +msgid "Assigned to: " +msgstr "Toegewezen aan: " -#: ../qml/Settings_Page.qml:480 -msgid "Personal Stages Diagnostics" -msgstr "Diagnostiek persoonlijke fasen" +#: ../qml/components/cards/ActivityDetailsCard.qml:306 +#: ../qml/features/dashboard/charts/Charts4.qml:63 +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:609 +#: ../qml/features/dashboard/pages/TaskDetailPage.qml:94 +msgid "Unassigned" +msgstr "Niet toegewezen" -#: ../qml/Settings_Page.qml:488 -msgid "Check personal stage data status and configuration" -msgstr "Controleer status en configuratie van persoonlijke fasegegevens" +#: ../qml/components/cards/ActivityDetailsCard.qml:351 +msgid "Type ID: " +msgstr "Type-ID: " -#: ../qml/Settings_Page.qml:503 -msgid "Check Personal Stage Status" -msgstr "Controleer status persoonlijke fase" +#: ../qml/components/cards/ActivityDetailsCard.qml:392 +msgid "Reschedule Activity Date" +msgstr "Activiteitsdatum opnieuw plannen" -#: ../qml/Settings_Page.qml:541 -msgid "Force Task Re-sync" -msgstr "Taaksynchronisatie forceren" +#: ../qml/components/cards/UpdatesDetailsCard.qml:83 +msgid "Untitled Update" +msgstr "Naamloze update" -#: ../qml/Settings_Page.qml:549 -msgid "Reset task timestamps to force fresh sync from Odoo" +#: ../qml/components/cards/UpdatesDetailsCard.qml:105 +#: ../qml/components/dialogs/CreateUpdateDialog.qml:84 +#: ../qml/components/workflow/CreateUpdatePage.qml:272 +#: ../qml/features/updates/pages/Updates.qml:467 +#: ../qml/features/updates/pages/Updates_Page.qml:273 +msgid "On Hold" msgstr "" -"Reset taaktijdstempels om nieuwe synchronisatie vanuit Odoo te forceren" -#: ../qml/Settings_Page.qml:567 -msgid "Reset Tasks Without Stages" -msgstr "Reset taken zonder fasen" +#: ../qml/components/cards/UpdatesDetailsCard.qml:122 +msgid "By: " +msgstr "Door: " -#: ../qml/Settings_Page.qml:589 -msgid "Reset All Tasks" -msgstr "Alle taken resetten" +#: ../qml/components/cards/UpdatesDetailsCard.qml:122 +msgid "Unknown User" +msgstr "Onbekende gebruiker" -#: ../qml/Settings_Page.qml:623 -msgid "Connected Accounts" -msgstr "Verbonden accounts" +#: ../qml/components/cards/UpdatesDetailsCard.qml:122 +msgid "No Date" +msgstr "Geen datum" -#: ../qml/Settings_Page.qml:687 -msgid "URL : " -msgstr "URL: " +#: ../qml/components/cards/UpdatesDetailsCard.qml:130 +msgid "Details" +msgstr "Details" -#: ../qml/Settings_Page.qml:693 -msgid "Database : " -msgstr "Database: " +#: ../qml/components/cards/UpdatesDetailsCard.qml:147 +#: ../qml/features/updates/pages/Updates.qml:83 +#, fuzzy +msgid "Unknown Project" +msgstr "Onbekende gebruiker" -#: ../qml/Settings_Page.qml:705 -msgid "Default" -msgstr "Standaard" +#: ../qml/components/dialogs/SaveDiscardDialog.qml:49 +#: ../qml/components/workflow/CreateUpdatePage.qml:154 +msgid "Unsaved Changes" +msgstr "Niet-opgeslagen wijzigingen" -#: ../qml/Settings_Page.qml:728 -msgid "Delete" -msgstr "Verwijderen" +#: ../qml/components/dialogs/SaveDiscardDialog.qml:53 +#, fuzzy +msgid "" +"You have unsaved changes. What would you like to do?\n" +"\n" +"Note: If you cancel, you can navigate back to continue editing." +msgstr "Je hebt niet-opgeslagen wijzigingen. Wat wil je doen?\n" -#: ../qml/Settings_Page.qml:739 -msgid "Show Log" -msgstr "Logboeken weergeven" +#: ../qml/components/dialogs/SaveDiscardDialog.qml:65 +#: ../qml/features/updates/pages/Updates.qml:123 +#: ../qml/features/settings/pages/Account_Page.qml:68 +#: ../qml/features/tasks/pages/Tasks.qml:71 +#: ../qml/features/projects/pages/Projects.qml:68 +#: ../qml/features/activities/pages/Activities.qml:93 +msgid "Save" +msgstr "Opslaan" -#: ../qml/Settings_Page.qml:760 -msgid "Sync" -msgstr "Synchroniseren" +#: ../qml/components/dialogs/SaveDiscardDialog.qml:80 +#: ../qml/components/workflow/CreateUpdatePage.qml:168 +msgid "Discard" +msgstr "Verwerpen" -#: ../qml/Settings_Page.qml:837 ../qml/components/AccountDrawer.qml:212 -msgid "Syncing..." -msgstr "Synchroniseren..." +#: ../qml/components/dialogs/AccountSelectorDialog.qml:72 +#: ../qml/components/navigation/AccountDrawer.qml:366 +#: ../qml/components/navigation/AccountDrawer.qml:416 +#: ../qml/components/navigation/AccountDrawer.qml:417 +msgid "All Accounts" +msgstr "Alle accounts" -#: ../qml/SyncLog.qml:7 -msgid "Sync Log" -msgstr "Synchronisatielogboek" +#: ../qml/components/dialogs/AccountSelectorDialog.qml:102 +msgid "Choose an account to use" +msgstr "Kies een account om te gebruiken" -#: ../qml/TSApp.qml:95 -msgid "Switch account" -msgstr "Van account wisselen" +#: ../qml/components/dialogs/AccountSelectorDialog.qml:195 +#, fuzzy +msgid "No accounts available" +msgstr "Geen activiteiten beschikbaar" -#: ../qml/Task_Page.qml:211 ../qml/components/ImagePreviewer.qml:185 -#: ../qml/components/MultiAssigneeSelector.qml:434 -msgid "Done" -msgstr "Klaar" +#: ../qml/components/dialogs/ColorPicker.qml:24 +msgid "Select Color" +msgstr "Kleur selecteren" -#: ../qml/Task_Page.qml:336 -msgid "No tasks found." -msgstr "Geen taken gevonden." +#: ../qml/components/dialogs/TimePickerPopup.qml:44 +msgid "Select Hours" +msgstr "Uren selecteren" -#: ../qml/Tasks.qml:84 ../qml/components/AccountDrawer.qml:72 -#: ../qml/components/CreateUpdatePage.qml:136 -msgid "Close" -msgstr "Sluiten" +#: ../qml/components/dialogs/TimePickerPopup.qml:109 +#: ../qml/components/navigation/AccountDrawer.qml:333 +#: ../qml/components/pickers/CustomDatePicker.qml:167 +msgid "OK" +msgstr "OK" -#: ../qml/Tasks.qml:821 -msgid "Parent Task" -msgstr "Ouder taak" +#: ../qml/components/dialogs/CreateUpdateDialog.qml:44 +#: ../qml/components/workflow/CreateUpdatePage.qml:19 +msgid "New Project Update" +msgstr "Nieuwe projectupdate" -#: ../qml/Tasks.qml:963 -msgid "Name" -msgstr "Naam" +#: ../qml/components/dialogs/CreateUpdateDialog.qml:73 +#: ../qml/components/workflow/CreateUpdatePage.qml:234 +#: ../qml/features/updates/pages/Updates.qml:421 +msgid "Update Title" +msgstr "Titel bijwerken" -#: ../qml/Tasks.qml:1023 ../qml/Timesheet.qml:526 -msgid "Priority" -msgstr "Prioriteit" +#: ../qml/components/dialogs/CreateUpdateDialog.qml:93 +msgid "Progress:" +msgstr "Voortgang:" -#: ../qml/Tasks.qml:1087 -msgid "Initial Stage" -msgstr "Beginfase" +#: ../qml/components/dialogs/CreateUpdateDialog.qml:112 +#: ../qml/components/richtext/RichTextPreview.qml:11 +#: ../qml/components/richtext/ReadMorePage.qml:139 +#: ../qml/components/workflow/CreateUpdatePage.qml:318 +#: ../qml/features/updates/pages/Updates.qml:543 +msgid "Description" +msgstr "Beschrijving" -#: ../qml/Tasks.qml:1187 -msgid "Current Stage:" -msgstr "Huidige fase:" +#: ../qml/components/visualization/EHower.qml:101 +msgid "Time spent based on priorities" +msgstr "Tijdsbesteding op basis van prioriteiten" -#: ../qml/Tasks.qml:1197 ../qml/Tasks.qml:1490 -#: ../qml/components/ProjectDetailsCard.qml:354 -#: ../qml/components/ProjectDetailsCard.qml:362 -#: ../qml/components/TaskDetailsCard.qml:636 -#: ../qml/components/TaskDetailsCard.qml:643 -msgid "Not set" -msgstr "Niet ingesteld" +#: ../qml/components/visualization/EHower.qml:131 +msgid "URGENT" +msgstr "DRINGEND" -#: ../qml/Tasks.qml:1227 -msgid "Change" -msgstr "Wijzigen" +#: ../qml/components/visualization/EHower.qml:141 +msgid "NOT URGENT" +msgstr "NIET DRINGEND" -#: ../qml/Tasks.qml:1368 -msgid "Planned Hours" -msgstr "Geplande uren" +#: ../qml/components/visualization/EHower.qml:165 +msgid "IMPORTANT" +msgstr "BELANGRIJK" -#: ../qml/Tasks.qml:1380 -msgid "e.g., 2:30 or 1.5" -msgstr "bijv. 2:30 of 1,5" +#: ../qml/components/visualization/EHower.qml:182 +msgid "NOT IMPORTANT" +msgstr "NIET BELANGRIJK" -#: ../qml/Tasks.qml:1483 -msgid "Deadline" -msgstr "Deadline" +#: ../qml/components/visualization/EHower.qml:244 +msgid "Do First" +msgstr "Eerst doen" -#: ../qml/Tasks.qml:1498 -msgid "Select" -msgstr "Selecteren" +#: ../qml/components/visualization/EHower.qml:301 +msgid "Do Next" +msgstr "Daarna doen" -#: ../qml/Tasks.qml:1541 -msgid "Select Deadline" -msgstr "Deadline selecteren" +#: ../qml/components/visualization/EHower.qml:359 +msgid "Do Later" +msgstr "Later doen" -#: ../qml/Timesheet.qml:542 -msgid "" -"What Is Important Is Seldom Urgent, and What Is Urgent Is Seldom Important." -"

1. Important & Urgent:
Here you write down important " -"activities, which also have to be done immediately. These are urgent " -"problems or projects with a hard deadline. I.e. If you manage a restaurant " -"and an employee has not shown up, it is a rather urgent and acute problem. " -"All signals are on red, so this is a typical activity for the first quadrant." -"

2. Important & Not Urgent:
If you leave the activities in " -"this quadrant for the coming week, nothing will immediately go wrong. But be " -"careful: These are activities and projects that will help you in the long " -"term. Think of thinking about a strategy, improving work processes in your " -"team, investing in relationships and investing in yourself. i.e. You are a " -"team leader who has just been told during his performance review that more " -"creative input is expected. Such an outcome of a performance review is an " -"assignment that will never feel urgent, but is very important. You can " -"quickly recognize the important & non-urgent activities by answering the " -"question: if I don't do this, will it get me into trouble in the long run? " -"If the answer is yes, then you have an important & non-urgent activity. If " -"the answer is no, then it is a non-important & non-urgent activity." -"

3. Urgent & Not Important:
This quadrant concerns " -"activities that do not help you in the long run, but that are screaming for " -"your attention this week. An adjustment in a presentation that has to be " -"done for a colleague on the spur of the moment or the milk that is almost " -"empty. With tasks in this quadrant it is very important to check whether " -"they are actually urgent. Requests from others in particular often seem very " -"urgent, while they can sometimes wait a day or a week. It is usually fine to " -"postpone this work to a more suitable moment, provided that I communicate " -"well about this. If you have the opportunity to delegate or outsource these " -"tasks in this quadrant, do so. If you work for yourself, this is not always " -"possible. In that case, I advise you to organize your working day in such a " -"way that you are guided as little as possible by these urgent tasks, if " -"necessary by reserving a fixed time block each day for these types of " -"emergencies. That way you keep control over your agenda.

4. Not " -"Important & Not Urgent:
This type of work that you want to have on " -"your plate as little as possible, because it does not help you in any way. " -"Constantly refreshing your mailbox, for example. But meetings without a " -"clear goal also fall into this category. You can undoubtedly point out more " -"of these types of 'busy work' examples yourself: things that you do, but " -"that do not really benefit anyone. Sometimes these activities are a great " -"short break from your work, but usually they are a great excuse to postpone " -"your important work for a while." +#: ../qml/components/visualization/EHower.qml:416 +msgid "Don't do" +msgstr "Niet doen" + +#: ../qml/components/visualization/ProjectList.qml:726 +#, fuzzy +msgid "Search projects" +msgstr "Projecten synchroniseren..." + +#: ../qml/components/visualization/ProjectPieChart.qml:45 +#: ../qml/components/visualization/ProjectPieChart.qml:208 +msgid "Most Time-Consuming Projects" +msgstr "Meest tijdrovende projecten" + +#: ../qml/components/visualization/ProjectPieChart.qml:84 +#: ../qml/features/dashboard/charts/Charts2.qml:69 +#: ../qml/features/dashboard/charts/Charts1.qml:67 +#: ../qml/features/dashboard/charts/Charts3.qml:166 +#: ../qml/features/dashboard/pages/Dashboard3.qml:63 +msgid " hrs" msgstr "" -"\"Wat belangrijk is, is zelden urgent, en wat urgent is, is zelden " -"belangrijk.\"

1. Belangrijk & Urgent:
Hier schrijf je " -"belangrijke activiteiten op die ook onmiddellijk gedaan moeten worden. Dit " -"zijn urgente problemen of projecten met een harde deadline. Stel je voor: " -"als je een restaurant runt en een werknemer is niet komen opdagen, dan is " -"dat een tamelijk urgent en acuut probleem. Alle seinen staan op rood, dus " -"dit is een typische activiteit voor het eerste kwadrant.

2. " -"Belangrijk & Niet Urgent:
Als je de activiteiten in dit kwadrant voor " -"de komende week laat liggen, gaat er niet direct iets mis. Maar wees " -"voorzichtig: dit zijn activiteiten en projecten die je op de lange termijn " -"vooruithelpen. Denk aan nadenken over een strategie, het verbeteren van " -"werkprocessen in je team, investeren in relaties en investeren in jezelf. " -"Bijvoorbeeld: je bent een teamleider die tijdens zijn functioneringsgesprek " -"net te horen heeft gekregen dat er meer creatieve inbreng wordt verwacht. " -"Zo'n uitkomst van een functioneringsgesprek is een opdracht die nooit urgent " -"zal aanvoelen, maar wel zeer belangrijk is. Je kunt de belangrijke & niet-" -"urgente activiteiten snel herkennen door de vraag te beantwoorden: als ik " -"dit niet doe, kom ik dan op de lange termijn in de problemen? Als het " -"antwoord ja is, dan heb je een belangrijke & niet-urgente activiteit. Als " -"het antwoord nee is, dan is het een niet-belangrijke & niet-urgente " -"activiteit.

3. Urgent & Niet Belangrijk:
Dit kwadrant " -"betreft activiteiten die je op de lange termijn niet helpen, maar die deze " -"week wel schreeuwen om je aandacht. Een aanpassing in een presentatie die " -"nog even snel gedaan moet worden voor een collega, of de melk die bijna op " -"is. Bij taken in dit kwadrant is het erg belangrijk om na te gaan of ze " -"daadwerkelijk urgent zijn. Vooral verzoeken van anderen lijken vaak erg " -"dringend, terwijl ze soms best een dag of week kunnen wachten. Het is " -"doorgaans prima om dit werk uit te stellen naar een geschikter moment, mits " -"ik hier goed over communiceer. Als je de mogelijkheid hebt om deze taken in " -"dit kwadrant te delegeren of uit te besteden, doe dat dan. Als je voor " -"jezelf werkt is dit niet altijd mogelijk. In dat geval raad ik aan om je " -"werkdag zo in te richten dat je zo min mogelijk wordt geleid door deze " -"urgente taken, eventueel door elke dag een vast tijdblok te reserveren voor " -"dit soort 'brandjes'. Op die manier behoud je controle over je agenda." -"

4. Niet Belangrijk & Niet Urgent:
Dit soort werk wil je zo " -"min mogelijk op je bord hebben, want het helpt je op geen enkele manier. " -"Constant je mailbox verversen bijvoorbeeld. Maar ook vergaderingen zonder " -"duidelijk doel vallen onder deze categorie. Je kunt ongetwijfeld zelf meer " -"van dit soort 'drukdoenerij' voorbeelden aanwijzen: zaken die je doet, maar " -"waar niemand echt baat bij heeft. Soms zijn deze activiteiten een prima " -"korte onderbreking van je werk, maar meestal zijn ze een uitstekend excuus " -"om je belangrijke werk nog even uit te stellen." -#: ../qml/Timesheet.qml:564 -msgid "Important, Urgent (1)" -msgstr "Belangrijk & Urgent (1)" +#: ../qml/components/visualization/ProjectPieChart.qml:205 +msgid "Most Time-Consuming Projects(No Data)" +msgstr "Meest tijdrovende projecten (geen gegevens)" -#: ../qml/Timesheet.qml:583 -msgid "Important, Not Urgent (2)" -msgstr "Belangrijk & Niet Urgent" +#: ../qml/components/richtext/FontSizeDialog.qml:25 +msgid "Font Size" +msgstr "" -#: ../qml/Timesheet.qml:602 -msgid "Urgent, Not Important (3)" -msgstr "Urgent, Niet Belangrijk (3)" +#: ../qml/components/richtext/LinkDialog.qml:25 +msgid "Insert Link" +msgstr "" -#: ../qml/Timesheet.qml:621 -msgid "Not Urgent, Not Important (4)" -msgstr "Niet Urgent, Niet Belangrijk (4)" +#: ../qml/components/richtext/LinkDialog.qml:39 +msgid "URL (e.g., https://example.com)" +msgstr "" -#: ../qml/Timesheet_Page.qml:39 -msgid "Timesheets" -msgstr "Urenstaten" +#: ../qml/components/richtext/LinkDialog.qml:48 +msgid "Link text (optional)" +msgstr "" -#: ../qml/Timesheet_Page.qml:132 -msgid "Active" -msgstr "Actief" +#: ../qml/components/richtext/LinkDialog.qml:59 +msgid "Insert" +msgstr "" -#: ../qml/Timesheet_Page.qml:133 -msgid "Draft" -msgstr "Concept" +#: ../qml/components/richtext/ColorPickerDialog.qml:30 +msgid "Choose Color" +msgstr "" -#: ../qml/Updates.qml:41 +#: ../qml/components/richtext/RichTextPreview.qml:88 +#: ../qml/components/richtext/ReadMorePage.qml:61 #, fuzzy -msgid "Project Update" -msgstr "Projectupdates" +msgid "Listening..." +msgstr "Synchroniseren..." -#: ../qml/Updates.qml:240 ../qml/components/AccountFilter.qml:68 -#: ../qml/components/ProjectSelector.qml:54 -msgid "Account:" -msgstr "Account:" +#: ../qml/components/richtext/RichTextPreview.qml:163 +#: ../qml/components/richtext/RichTextEditor.qml:191 +#: ../qml/components/richtext/ReadMorePage.qml:112 +msgid "Action Required" +msgstr "" -#: ../qml/Updates.qml:246 +#: ../qml/components/richtext/RichTextPreview.qml:165 +#: ../qml/components/richtext/RichTextEditor.qml:193 +#: ../qml/components/richtext/ReadMorePage.qml:114 +#: ../qml/components/navigation/AccountDrawer.qml:485 +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:484 +msgid "Error" +msgstr "Fout" + +#: ../qml/components/richtext/RichTextPreview.qml:484 +#: ../qml/components/richtext/RichTextPreview.qml:550 +#: ../qml/components/richtext/ReadMorePage.qml:166 +#: ../qml/components/workflow/AttachmentManager.qml:309 #, fuzzy -msgid "Unknown Account" -msgstr "Onbekende gebruiker" +msgid "Processing..." +msgstr "Synchroniseren..." -#: ../qml/Updates.qml:260 ../qml/components/ProjectSelector.qml:76 +#: ../qml/components/richtext/RichTextPreview.qml:495 +#: ../qml/components/richtext/ReadMorePage.qml:175 #, fuzzy -msgid "Project:" -msgstr "Project" +msgid "Starting..." +msgstr "Synchroniseren..." + +#: ../qml/components/richtext/ReadMorePage.qml:161 +msgid "Stop Recording" +msgstr "" -#: ../qml/Updates.qml:266 ../qml/components/UpdatesDetailsCard.qml:127 +#: ../qml/components/richtext/ReadMorePage.qml:161 #, fuzzy -msgid "Unknown Project" -msgstr "Onbekende gebruiker" +msgid "Start Recording" +msgstr "Concept Hersteld" -#: ../qml/Updates.qml:286 ../qml/components/CreateUpdateDialog.qml:87 -#: ../qml/components/CreateUpdatePage.qml:249 -msgid "Update Title" +#: ../qml/components/richtext/ReadMorePage.qml:185 +msgid "Hide Toolbar" +msgstr "" + +#: ../qml/components/richtext/ReadMorePage.qml:185 +#, fuzzy +msgid "Show Toolbar" +msgstr "Logboeken weergeven" + +#: ../qml/components/feedback/NotificationBell.qml:168 +msgid "Just now" +msgstr "" + +#: ../qml/components/feedback/NotificationBell.qml:169 +msgid "m ago" +msgstr "" + +#: ../qml/components/feedback/NotificationBell.qml:170 +msgid "h ago" +msgstr "" + +#: ../qml/components/feedback/NotificationBell.qml:171 +msgid "d ago" +msgstr "" + +#: ../qml/components/feedback/NotificationBell.qml:243 +#: ../qml/components/feedback/NotificationBell.qml:316 +#: ../qml/features/settings/pages/Settings_Notifications.qml:34 +#: ../qml/features/settings/pages/Settings_Page.qml:80 +#: ../qml/features/dashboard/pages/Dashboard.qml:116 +#: ../qml/features/dashboard/pages/Dashboard.qml:117 +msgid "Notifications" +msgstr "" + +#: ../qml/components/feedback/NotificationBell.qml:372 +msgid "Sync" +msgstr "Synchroniseren" + +#: ../qml/components/feedback/NotificationBell.qml:435 +msgid "No sync notifications" +msgstr "" + +#: ../qml/components/feedback/NotificationBell.qml:436 +msgid "No notifications" +msgstr "" + +#: ../qml/components/feedback/NotificationBell.qml:444 +msgid "All syncs are running smoothly!" +msgstr "" + +#: ../qml/components/feedback/NotificationBell.qml:445 +msgid "You're all caught up!" +msgstr "" + +#: ../qml/components/feedback/NotificationBell.qml:484 +#: ../qml/components/workflow/AttachmentManager.qml:214 +#: ../qml/components/workflow/AttachmentManager.qml:661 +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:475 +#: ../qml/features/settings/pages/Settings_Accounts.qml:118 +#: ../qml/features/settings/pages/Settings_Accounts.qml:317 +msgid "Delete" +msgstr "Verwijderen" + +#: ../qml/components/feedback/NotificationBell.qml:662 +#: ../qml/features/dashboard/pages/Dashboard.qml:223 +#: ../qml/features/activities/pages/Activities.qml:20 +msgid "Activity" +msgstr "Activiteit" + +#: ../qml/components/feedback/NotificationBell.qml:664 +#: ../qml/components/feedback/NotificationBell.qml:667 +#: ../qml/features/activities/pages/Activities.qml:630 +#, fuzzy +msgid "Update" msgstr "Titel bijwerken" -#: ../qml/Updates.qml:324 ../qml/components/CreateUpdatePage.qml:276 -msgid "Project Status" -msgstr "Projectstatus" +#: ../qml/components/feedback/NotificationBell.qml:665 +#: ../qml/features/dashboard/pages/Dashboard.qml:220 +#: ../qml/features/timesheets/pages/Timesheet.qml:46 +msgid "Timesheet" +msgstr "Urenstaat" -#: ../qml/Updates.qml:353 ../qml/components/CreateUpdatePage.qml:297 -msgid "Progress" -msgstr "Voortgang" +#: ../qml/components/feedback/NotificationBell.qml:666 +#, fuzzy +msgid "Sync Error" +msgstr "Synchronisatielogboek" + +#: ../qml/components/feedback/NotificationBell.qml:739 +msgid "Clear Sync Errors" +msgstr "" + +#: ../qml/components/feedback/LoadMoreFooter.qml:82 +msgid "Load more..." +msgstr "" -#: ../qml/components/AccountDrawer.qml:28 -#: ../qml/components/AccountDrawer.qml:61 +#: ../qml/components/feedback/LoadMoreFooter.qml:91 +#, fuzzy +msgid "Loading..." +msgstr "Synchroniseren..." + +#: ../qml/components/navigation/AccountDrawer.qml:29 +#: ../qml/components/navigation/AccountDrawer.qml:62 msgid "Account Selection" msgstr "Accountselectie" -#: ../qml/components/AccountDrawer.qml:89 +#: ../qml/components/navigation/AccountDrawer.qml:73 +#: ../qml/components/workflow/CreateUpdatePage.qml:138 +#: ../qml/features/updates/pages/Updates.qml:138 +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:431 +#: ../qml/features/tasks/pages/Tasks.qml:86 +#: ../qml/features/projects/pages/Projects.qml:143 +#: ../qml/features/activities/pages/Activities.qml:108 +msgid "Close" +msgstr "Sluiten" + +#: ../qml/components/navigation/AccountDrawer.qml:90 msgid "Select Account:" msgstr "Selecteer account:" -#: ../qml/components/AccountDrawer.qml:158 +#: ../qml/components/navigation/AccountDrawer.qml:159 msgid "Current Account:" msgstr "Huidig account:" -#: ../qml/components/AccountDrawer.qml:165 -#: ../qml/components/AccountFilter.qml:127 +#: ../qml/components/navigation/AccountDrawer.qml:166 msgid "No account selected" msgstr "Geen account geselecteerd" -#: ../qml/components/AccountDrawer.qml:183 +#: ../qml/components/navigation/AccountDrawer.qml:184 msgid "Last Sync:" msgstr "Laatste synchronisatie:" -#: ../qml/components/AccountDrawer.qml:190 -#: ../qml/components/AccountDrawer.qml:426 +#: ../qml/components/navigation/AccountDrawer.qml:191 +#: ../qml/components/navigation/AccountDrawer.qml:427 msgid "Never" msgstr "Nooit" -#: ../qml/components/AccountDrawer.qml:212 -msgid "Sync Data" -msgstr "Gegevens synchroniseren" +#: ../qml/components/navigation/AccountDrawer.qml:213 +msgid "Syncing..." +msgstr "Synchroniseren..." + +#: ../qml/components/navigation/AccountDrawer.qml:213 +msgid "Sync Data" +msgstr "Gegevens synchroniseren" -#: ../qml/components/AccountDrawer.qml:276 +#: ../qml/components/navigation/AccountDrawer.qml:277 msgid "Note: Sync is not available for 'All Accounts' view" msgstr "" "Opmerking: Synchronisatie is niet beschikbaar voor weergave 'Alle accounts'" -#: ../qml/components/AccountDrawer.qml:285 +#: ../qml/components/navigation/AccountDrawer.qml:286 msgid "Please select a specific account to sync data" msgstr "Selecteer een specifiek account om gegevens te synchroniseren" -#: ../qml/components/AccountDrawer.qml:306 +#: ../qml/components/navigation/AccountDrawer.qml:307 msgid "Syncing data..." msgstr "Gegevens synchroniseren..." -#: ../qml/components/AccountDrawer.qml:332 -#: ../qml/components/AccountSelectorDialog.qml:240 -#: ../qml/components/CustomDatePicker.qml:166 -#: ../qml/components/TimePickerPopup.qml:108 -msgid "OK" -msgstr "OK" +#: ../qml/components/navigation/AccountDrawer.qml:430 +msgid "N/A for All Accounts" +msgstr "N.v.t. voor alle accounts" + +#: ../qml/components/navigation/AccountDrawer.qml:453 +msgid "Account not found" +msgstr "Account niet gevonden" + +#: ../qml/components/navigation/AccountDrawer.qml:461 +#: ../qml/components/navigation/AccountDrawer.qml:463 +msgid "Local account - no sync required" +msgstr "Lokaal account - geen synchronisatie vereist" + +#: ../qml/components/navigation/AccountDrawer.qml:463 +msgid "Info" +msgstr "Info" + +#: ../qml/components/navigation/AccountDrawer.qml:473 +msgid "Connecting to server..." +msgstr "Verbinding maken met server..." + +#: ../qml/components/navigation/AccountDrawer.qml:473 +msgid "Syncing projects..." +msgstr "Projecten synchroniseren..." + +#: ../qml/components/navigation/AccountDrawer.qml:473 +msgid "Syncing tasks..." +msgstr "Taken synchroniseren..." + +#: ../qml/components/navigation/AccountDrawer.qml:473 +msgid "Syncing timesheets..." +msgstr "Urenstaten synchroniseren..." + +#: ../qml/components/navigation/AccountDrawer.qml:473 +msgid "Syncing activities..." +msgstr "Activiteiten synchroniseren..." + +#: ../qml/components/navigation/AccountDrawer.qml:473 +msgid "Updating local data..." +msgstr "Lokale gegevens bijwerken..." + +#: ../qml/components/navigation/AccountDrawer.qml:482 +#: ../qml/components/navigation/AccountDrawer.qml:485 +msgid "Sync failed: " +msgstr "Synchronisatie mislukt: " + +#: ../qml/components/navigation/AccountDrawer.qml:501 +msgid "Sync completed successfully" +msgstr "Synchronisatie succesvol voltooid" + +#: ../qml/components/navigation/AccountDrawer.qml:505 +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:600 +msgid "Success" +msgstr "Succes" + +#: ../qml/components/navigation/AccountDrawer.qml:505 +msgid "Data synchronized successfully!" +msgstr "Gegevens succesvol gesynchroniseerd!" + +#: ../qml/components/navigation/ListHeader.qml:177 +msgid "Search..." +msgstr "Zoeken..." + +#: ../qml/components/pickers/DateRangeSelector.qml:86 +#: ../qml/features/tasks/pages/Task_Page.qml:259 +#: ../qml/features/activities/pages/Activity_Page.qml:617 +msgid "Today" +msgstr "Vandaag" + +#: ../qml/components/pickers/DateRangeSelector.qml:87 +#: ../qml/features/tasks/pages/Task_Page.qml:260 +#: ../qml/features/activities/pages/Activity_Page.qml:618 +msgid "This Week" +msgstr "Deze week" + +#: ../qml/components/pickers/DateRangeSelector.qml:88 +#: ../qml/components/pickers/CustomDatePicker.qml:111 +msgid "Next Week" +msgstr "Volgende week" + +#: ../qml/components/pickers/DateRangeSelector.qml:89 +#: ../qml/features/tasks/pages/Task_Page.qml:261 +#: ../qml/features/activities/pages/Activity_Page.qml:619 +msgid "This Month" +msgstr "Deze maand" + +#: ../qml/components/pickers/DateRangeSelector.qml:90 +#: ../qml/components/pickers/CustomDatePicker.qml:118 +msgid "Next Month" +msgstr "Volgende maand" + +#: ../qml/components/pickers/CustomDatePicker.qml:125 +msgid "Custom" +msgstr "Aangepast" + +#: ../qml/components/workflow/CreateUpdatePage.qml:63 +msgid "Draft Recovered" +msgstr "Concept Hersteld" + +#: ../qml/components/workflow/CreateUpdatePage.qml:64 +msgid "Your unsaved changes have been recovered." +msgstr "Je niet-opgeslagen wijzigingen zijn hersteld." + +#: ../qml/components/workflow/CreateUpdatePage.qml:88 +#: ../qml/features/updates/pages/Updates.qml:151 +#: ../qml/features/tasks/pages/Tasks.qml:60 +#: ../qml/features/projects/pages/Projects.qml:58 +#: ../qml/features/activities/pages/Activities.qml:122 +msgid "Back" +msgstr "Terug" + +#: ../qml/components/workflow/CreateUpdatePage.qml:103 +#: ../qml/features/tasks/components/TaskRecordActionsGrid.qml:91 +#: ../qml/features/tasks/components/TaskRecordActionsGrid.qml:130 +#: ../qml/features/tasks/pages/MyTasksPage.qml:421 +#: ../qml/features/projects/pages/Projects.qml:733 +#: ../qml/features/projects/pages/Projects.qml:792 +#: ../qml/features/projects/pages/Projects.qml:853 +#: ../qml/features/timesheets/pages/Timesheet_Page.qml:359 +msgid "Create" +msgstr "Aanmaken" + +#: ../qml/components/workflow/CreateUpdatePage.qml:107 +msgid "Validation Error" +msgstr "Validatiefout" + +#: ../qml/components/workflow/CreateUpdatePage.qml:108 +msgid "Please fill in all required fields." +msgstr "Vul alle verplichte velden in." + +#: ../qml/components/workflow/CreateUpdatePage.qml:155 +#, fuzzy +msgid "You have unsaved changes. What would you like to do?" +msgstr "Je hebt niet-opgeslagen wijzigingen. Wat wil je doen?\n" + +#: ../qml/components/workflow/CreateUpdatePage.qml:158 +#, fuzzy +msgid "Save Draft" +msgstr "Concept Opslaan" + +#: ../qml/components/workflow/CreateUpdatePage.qml:241 +msgid "Enter update title..." +msgstr "Voer updatetitel in..." + +#: ../qml/components/workflow/CreateUpdatePage.qml:261 +#: ../qml/features/updates/pages/Updates.qml:461 +msgid "Project Status" +msgstr "Projectstatus" + +#: ../qml/components/workflow/CreateUpdatePage.qml:287 +#: ../qml/features/updates/pages/Updates.qml:494 +msgid "Progress" +msgstr "Voortgang" + +#: ../qml/components/workflow/AttachmentManager.qml:33 +msgid "Attachments" +msgstr "Bijlagen" + +#: ../qml/components/workflow/AttachmentManager.qml:53 +#, fuzzy +msgid "Starting upload..." +msgstr "Lokale gegevens bijwerken..." + +#: ../qml/components/workflow/AttachmentManager.qml:224 +#: ../qml/features/tasks/components/TaskRecordActionsGrid.qml:106 +#: ../qml/features/tasks/components/TaskRecordActionsGrid.qml:145 +#: ../qml/features/projects/pages/Projects.qml:759 +#: ../qml/features/projects/pages/Projects.qml:820 +#: ../qml/features/projects/pages/Projects.qml:882 +msgid "View" +msgstr "Bekijken" + +#: ../qml/components/workflow/AttachmentManager.qml:367 +msgid "Failed to upload: Database path unresolved" +msgstr "" + +#: ../qml/components/workflow/AttachmentManager.qml:457 +msgid "Attachment has been processed" +msgstr "" + +#: ../qml/components/workflow/AttachmentManager.qml:460 +#: ../qml/components/workflow/AttachmentManager.qml:462 +msgid "Failed to upload" +msgstr "" + +#: ../qml/components/workflow/AttachmentManager.qml:635 +msgid "Cannot delete: missing Odoo ID" +msgstr "" + +#: ../qml/components/workflow/AttachmentManager.qml:652 +#, fuzzy +msgid "Delete Attachment" +msgstr "Bijlagen" + +#: ../qml/components/workflow/AttachmentManager.qml:653 +msgid "Are you sure you want to delete '%1'?" +msgstr "" + +#: ../qml/components/workflow/AttachmentManager.qml:673 +msgid "Deleting attachment..." +msgstr "" + +#: ../qml/components/workflow/AttachmentManager.qml:678 +#, fuzzy +msgid "Database not found" +msgstr "Database: " + +#: ../qml/components/workflow/AttachmentManager.qml:685 +#, fuzzy +msgid "Attachment deleted" +msgstr "Bijlagen" + +#: ../qml/components/workflow/AttachmentManager.qml:688 +msgid "Failed to delete attachment" +msgstr "" + +#: ../qml/components/system/ModelDownloadTimerWidget.qml:51 +msgid "Initializing download..." +msgstr "" + +#: ../qml/components/system/ModelDownloadTimerWidget.qml:53 +msgid "Downloading model files..." +msgstr "" + +#: ../qml/components/system/ModelDownloadTimerWidget.qml:55 +msgid "Extracting and installing..." +msgstr "" + +#: ../qml/components/system/ModelDownloadTimerWidget.qml:57 +msgid "Installation complete!" +msgstr "" + +#: ../qml/components/system/ImagePreviewer.qml:79 +msgid "Download" +msgstr "Downloaden" + +#: ../qml/components/system/ImagePreviewer.qml:131 +msgid "No image to save" +msgstr "Geen afbeelding om op te slaan" + +#: ../qml/components/system/ImagePreviewer.qml:155 +#, fuzzy +msgid "Saved" +msgstr "Opgeslagen" + +#: ../qml/components/system/ImagePreviewer.qml:158 +msgid "Choose where to save" +msgstr "Kies waar u wilt opslaan" + +#: ../qml/components/system/ImagePreviewer.qml:160 +msgid "Could not open export dialog" +msgstr "Kon exportdialoog niet openen" + +#: ../qml/components/system/ImagePreviewer.qml:164 +#, fuzzy +msgid "Save failed" +msgstr "Synchronisatie mislukt: " + +#: ../qml/components/system/ImagePreviewer.qml:170 +msgid "No image to open" +msgstr "Geen afbeelding om te openen" + +#: ../qml/components/system/ImagePreviewer.qml:188 +msgid "Could not open chooser" +msgstr "Kon kiezer niet openen" + +#: ../qml/components/system/ImagePreviewer.qml:192 +#, fuzzy +msgid "Open failed" +msgstr "Synchronisatie mislukt: " + +#: ../qml/app/GlobalWidgets.qml:59 +msgid "Switch account" +msgstr "Van account wisselen" + +#: ../qml/app/AppDrawer.qml:49 ../qml/app/navigation/MenuPage.qml:39 +#: ../qml/app/pages/AboutPage.qml:63 +#: ../qml/features/updates/pages/Updates_Page.qml:70 +#: ../qml/features/settings/pages/Settings_Page.qml:50 +#: ../qml/features/tasks/pages/Task_Page.qml:57 +#: ../qml/features/tasks/pages/MyTasksPage.qml:62 +#: ../qml/features/projects/pages/Project_Page.qml:56 +#: ../qml/features/dashboard/pages/Dashboard.qml:91 +#: ../qml/features/timesheets/pages/Timesheet_Page.qml:80 +#: ../qml/features/activities/pages/Activity_Page.qml:55 +msgid "Menu" +msgstr "Menu" + +#: ../qml/app/navigation/MenuPage.qml:55 +msgid "Switch Accounts" +msgstr "Van account wisselen" + +#: ../qml/app/navigation/MenuPage.qml:62 +msgid "Light Mode" +msgstr "Lichte modus" + +#: ../qml/app/navigation/MenuPage.qml:62 +msgid "Dark Mode" +msgstr "Donkere modus" + +#: ../qml/app/pages/AboutPage.qml:35 ../qml/app/pages/AboutPage.qml:52 +msgid "About" +msgstr "Over" + +#: ../qml/features/updates/pages/Updates.qml:42 +#, fuzzy +msgid "Project Update" +msgstr "Projectupdates" + +#: ../qml/features/updates/pages/Updates.qml:82 +#, fuzzy +msgid "Unknown Account" +msgstr "Onbekende gebruiker" + +#: ../qml/features/updates/pages/Updates_Page.qml:39 +#: ../qml/features/projects/pages/Projects.qml:835 +msgid "Project Updates" +msgstr "Projectupdates" + +#: ../qml/features/updates/pages/Updates_Page.qml:81 +#: ../qml/features/projects/pages/Project_Page.qml:85 +msgid "Search" +msgstr "Zoeken" + +#: ../qml/features/updates/pages/Updates_Page.qml:88 +#: ../qml/features/projects/pages/Project_Page.qml:68 +msgid "New" +msgstr "Nieuw" + +#: ../qml/features/updates/pages/Updates_Page.qml:269 +#: ../qml/features/tasks/pages/Task_Page.qml:264 +#: ../qml/features/timesheets/pages/Timesheet_Page.qml:165 +#: ../qml/features/activities/pages/Activity_Page.qml:622 +msgid "All" +msgstr "Alle" + +#: ../qml/features/updates/pages/Updates_Page.qml:372 +#, fuzzy +msgid "Loading updates..." +msgstr "Gegevens synchroniseren..." + +#: ../qml/features/settings/pages/SyncLog.qml:7 +msgid "Sync Log" +msgstr "Synchronisatielogboek" + +#: ../qml/features/settings/pages/SyncLog.qml:22 +msgid "Copy Logs" +msgstr "" + +#: ../qml/features/settings/pages/SyncLog.qml:147 +msgid "" +"No errors or warnings found for this account.\n" +"Sync logs will appear here when issues occur." +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:35 +#: ../qml/features/settings/pages/Settings_Page.qml:91 +msgid "Background Sync" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:132 +msgid "Background Sync Settings" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:140 +msgid "Configure automatic synchronization with Odoo" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:156 +msgid "Enable AutoSync" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:176 +#: ../qml/features/settings/pages/Account_Page.qml:645 +#, fuzzy +msgid "Sync Interval" +msgstr "Gegevens synchroniseren" + +#: ../qml/features/settings/pages/Settings_Sync.qml:218 +#: ../qml/features/settings/pages/Account_Page.qml:669 +#, fuzzy +msgid "Sync Direction" +msgstr "Gegevens synchroniseren" + +#: ../qml/features/settings/pages/Settings_Sync.qml:261 +msgid "" +"✨ Recommended: Set sync interval to 5 or 15 minutes for the best balance of " +"performance and battery life." +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:274 +msgid "Restarting..." +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:274 +msgid "Restart Background Daemon" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:295 +msgid "Daemon Restarted" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:296 +msgid "" +"The background sync daemon has been successfully restarted and is running." +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:301 +msgid "Daemon Restart" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:302 +msgid "" +"The daemon restart was initiated. It may take a few moments to fully start. " +"If sync issues persist, try again." +msgstr "" + +#: ../qml/features/settings/pages/Settings_Sync.qml:311 +msgid "" +"Note: These are global defaults. Individual accounts can override these " +"settings from their account edit page. Changes take effect on the next sync " +"cycle." +msgstr "" + +#: ../qml/features/settings/pages/Settings_Theme.qml:33 +#: ../qml/features/settings/pages/Settings_Page.qml:102 +#, fuzzy +msgid "Theme Settings" +msgstr "Instellingen" + +#: ../qml/features/settings/pages/Settings_Theme.qml:106 +msgid "App Theme Preference" +msgstr "Voorkeur app-thema" + +#: ../qml/features/settings/pages/Settings_Theme.qml:114 +msgid "Choose your preferred theme for the application" +msgstr "Kies jouw voorkeurthema voor de applicatie" + +#: ../qml/features/settings/pages/Settings_Theme.qml:175 +msgid "Light Theme" +msgstr "Licht thema" + +#: ../qml/features/settings/pages/Settings_Theme.qml:240 +msgid "Dark Theme" +msgstr "Donker thema" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:191 +msgid "Push Notifications" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:199 +msgid "Receive push notifications for task updates and reminders" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:216 +msgid "Enable Notifications" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:238 +msgid "⚠ Notifications are disabled when Background Sync is set to Upload Only" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:272 +msgid "Notification Schedule" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:280 +msgid "" +"Set your timezone, working days and active hours to receive notifications " +"only during work time" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:296 +msgid "Enable Schedule" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:325 +msgid "Timezone" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:388 +msgid "Working Days" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:397 +msgid "Notifications will only be sent on selected days" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:485 +msgid "Working Hours (notifications allowed)" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:501 +msgid "From" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:539 +msgid "To" +msgstr "" + +#: ../qml/features/settings/pages/Settings_Notifications.qml:579 +msgid "" +"Push notifications will only be sent during working hours on working days. " +"Overnight schedules (e.g., 22:00 to 06:00) are supported." +msgstr "" + +#: ../qml/features/settings/pages/Settings_Page.qml:35 +msgid "Settings" +msgstr "Instellingen" + +#: ../qml/features/settings/pages/Settings_Page.qml:69 +#: ../qml/features/settings/pages/Settings_Accounts.qml:39 +msgid "Connected Accounts" +msgstr "Verbonden accounts" + +#: ../qml/features/settings/pages/Settings_Page.qml:114 +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:36 +msgid "Voice Model (Beta)" +msgstr "Spraakmodel (Bèta)" + +#: ../qml/features/settings/pages/Account_Page.qml:37 +#, fuzzy +msgid "Edit Account" +msgstr "Van account wisselen" + +#: ../qml/features/settings/pages/Account_Page.qml:37 +msgid "Create Account" +msgstr "Account aanmaken" + +#: ../qml/features/settings/pages/Account_Page.qml:141 +msgid "Your account has been updated successfully!" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:169 +msgid "Your account has been saved, Enjoy using the app !" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:379 +#, fuzzy +msgid "Account Details" +msgstr "Accountselectie" + +#: ../qml/features/settings/pages/Account_Page.qml:389 +#, fuzzy +msgid "Account Name" +msgstr "Account" + +#: ../qml/features/settings/pages/Account_Page.qml:413 +msgid "Server Connection" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:423 +#, fuzzy +msgid "URL" +msgstr "URL: " + +#: ../qml/features/settings/pages/Account_Page.qml:430 +msgid "Fetch Databases" +msgstr "Databases ophalen" + +#: ../qml/features/settings/pages/Account_Page.qml:476 +msgid "Database" +msgstr "Database" + +#: ../qml/features/settings/pages/Account_Page.qml:486 +#, fuzzy +msgid "Database Name" +msgstr "Voer databasenaam in" + +#: ../qml/features/settings/pages/Account_Page.qml:510 +msgid "Credentials" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:520 +msgid "Username" +msgstr "Gebruikersnaam" + +#: ../qml/features/settings/pages/Account_Page.qml:526 +msgid "Connect With" +msgstr "Verbinden met" + +#: ../qml/features/settings/pages/Account_Page.qml:529 +#, fuzzy +msgid "Connect With Api Key" +msgstr "Verbinden met" + +#: ../qml/features/settings/pages/Account_Page.qml:530 +#, fuzzy +msgid "Connect With Password" +msgstr "Verbinden met" + +#: ../qml/features/settings/pages/Account_Page.qml:543 +msgid "Password" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:543 +msgid "API Key" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:583 +#, fuzzy +msgid "Sync Preferences" +msgstr "Voorkeur app-thema" + +#: ../qml/features/settings/pages/Account_Page.qml:593 +msgid "Custom Sync Settings" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:612 +msgid "Using global sync defaults (interval: " +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:614 +msgid ", direction: " +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:627 +msgid "Enable Sync" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:648 +msgid "1 minute" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:649 +msgid "5 minutes" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:650 +msgid "15 minutes" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:651 +msgid "30 minutes" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:652 +msgid "1 hour" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:653 +msgid "2 hours" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:654 +msgid "6 hours" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:655 +msgid "12 hours" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:656 +msgid "1 day" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:657 +msgid "3 days" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:658 +msgid "1 week" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:672 +msgid "Both (Up & Down)" +msgstr "" + +#: ../qml/features/settings/pages/Account_Page.qml:673 +#, fuzzy +msgid "Download Only" +msgstr "Downloaden" + +#: ../qml/features/settings/pages/Account_Page.qml:674 +#, fuzzy +msgid "Upload Only" +msgstr "Uploaden" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:256 +msgid "Starting download..." +msgstr "Download starten..." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:259 +msgid "Download Started" +msgstr "Download gestart" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:259 +msgid "Downloading %1..." +msgstr "Bezig met downloaden van %1..." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:267 +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:269 +msgid "Could not start download" +msgstr "Kan download niet starten" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:269 +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:594 +msgid "Download Failed" +msgstr "Download mislukt" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:281 +msgid "Download cancelled" +msgstr "Download geannuleerd" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:283 +msgid "Download Cancelled" +msgstr "Download geannuleerd" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:283 +msgid "Download of %1 was cancelled and partial data deleted." +msgstr "Download van %1 is geannuleerd en de gedeeltelijke gegevens zijn verwijderd." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:348 +msgid "About Voice Models" +msgstr "Over spraakmodellen" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:363 +msgid "" +"Voice models allow you to dictate text using your microphone directly into " +"the app. Because processing happens locally on your device, your voice data " +"remains completely private and no internet connection is required after the " +"initial model download.\n" +"\n" +"Larger models provide higher accuracy but require more device memory and " +"space. Smaller models are faster and use fewer resources but may be less " +"accurate." +msgstr "" +"Spraakmodellen stellen je in staat om tekst te dicteren met je microfoon, " +"rechtstreeks in de app. Omdat de verwerking lokaal op je apparaat " +"plaatsvindt, blijven je spraakgegevens volledig privé en is er na het " +"downloaden van het eerste model geen internetverbinding meer vereist.\n" +"\n" +"Grotere modellen bieden een hogere nauwkeurigheid, maar vereisen meer " +"apparaatgeheugen en -ruimte. Kleinere modellen zijn sneller en verbruiken " +"minder bronnen, maar zijn mogelijk minder nauwkeurig." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:377 +msgid "" +"Voice Feature Stages: When you click the voice icon, it will show " +"Starting, then Preparing. Only start speaking once it shows " +"Listening. When stopped, it will show Processing with a yellow " +"bar." +msgstr "" +"Fases van de spraakfunctie: Wanneer je op het spraakpictogram klikt, " +"wordt eerst Starten en daarna Voorbereiden weergegeven. Begin " +"pas te spreken zodra er Luisteren staat. Wanneer het is gestopt, " +"wordt Verwerken weergegeven met een gele balk." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:387 +msgid "" +"Auto-Stop & Limits: If you do not speak for 7 seconds, the voice icon " +"will automatically stop. The maximum duration for a single recording is 5 " +"minutes." +msgstr "" +"Automatische stop & limieten: Als je gedurende 7 seconden niet " +"spreekt, stopt het spraakpictogram automatisch. De maximale duur voor een " +"enkele opname is 5 minuten." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:397 +msgid "" +"Getting Started: Make sure you have enabled the \"Enable voice " +"input\" feature, under voice model (Beta) settings. " +msgstr "" +"Aan de slag: Zorg ervoor dat je de functie \"Spraakgestuurde invoer " +"inschakelen\" hebt ingeschakeld onder de instellingen voor het spraakmodel " +"(bèta)." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:407 +msgid "" +"Compatibility & Errors: A red warning icon indicates the model is " +"incompatible with your device (usually due to RAM limits), but you can still " +"attempt to download it." +msgstr "" +"Compatibiliteit & fouten: Een rood waarschuwingspictogram geeft aan " +"dat het model incompatibel is met je apparaat (meestal vanwege RAM-" +"limieten), maar je kunt nog steeds proberen het te downloaden." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:417 +msgid "" +"Managing Downloads:Check the internet connectivity before downloading " +"a file. Once the voice model is downloaded, select the model you want from " +"the installed models list. Even if only one model is installed, selecting " +"the model is mandatory. The selected model will be shown in bold text, with " +"a tick mark to its right. During download, you will see Loading " +"(downloading), Pause, and Cancel buttons. Pausing or losing " +"internet will preserve your progress, allowing you to resume later from this " +"page. Cancelling will delete the partial download." +msgstr "" +"Downloads beheren: Controleer de internetverbinding voordat je een " +"bestand downloadt. Zodra het spraakmodel is gedownload, selecteer je het " +"gewenste model in de lijst met geïnstalleerde modellen. Zelfs als er " +"slechts één model is geïnstalleerd, is het selecteren van het model " +"verplicht. Het geselecteerde model wordt vetgedrukt weergegeven, met een " +"vinkje er rechts van. Tijdens het downloaden zie je de knoppen Laden " +"(downloaden), Pauzeren en Annuleren. Als je pauzeert of de " +"internetverbinding verliest, blijft je voortgang behouden, zodat je later " +"vanaf deze pagina kunt hervatten. Annuleren verwijdert de gedeeltelijke " +"download." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:427 +msgid "" +"Deleting Models: To remove an installed model, swipe its name to the " +"left and click the delete icon." +msgstr "" +"Modellen verwijderen: Om een geïnstalleerd model te verwijderen, " +"veeg je de naam naar links en klik je op het verwijderpictogram." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:451 +msgid "Delete Model" +msgstr "Model verwijderen" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:458 +msgid "Are you sure you want to delete the voice model '%1'?" +msgstr "Weet je zeker dat je het spraakmodel '%1' wilt verwijderen?" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:481 +msgid "Deleted" +msgstr "Verwijderd" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:481 +msgid "Model %1 deleted successfully." +msgstr "Model %1 is succesvol verwijderd." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:484 +msgid "Could not delete model" +msgstr "Kon model niet verwijderen" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:501 +msgid "Warning" +msgstr "Waarschuwing" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:508 +msgid "" +"This model is incompatible with your device because it requires more RAM " +"than available. It may cause the app to crash.\n" +"\n" +"But if you want to download it, you can." +msgstr "" +"Dit model is incompatibel met je apparaat omdat het meer RAM-geheugen " +"vereist dan beschikbaar is. Dit kan ertoe leiden dat de app crasht.\n" +"\n" +"Maar als je het toch wilt downloaden, is dat mogelijk." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:525 +msgid "Download Anyway" +msgstr "Toch downloaden" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:572 +msgid "Downloading..." +msgstr "Downloaden..." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:585 +msgid "Download Interrupted" +msgstr "Download onderbroken" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:585 +msgid "Failed to download. You can resume it." +msgstr "Downloaden mislukt. Je kunt de download hervatten." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:587 +msgid "Download Paused" +msgstr "Download gepauzeerd" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:587 +msgid "Download of %1 is paused." +msgstr "Download van %1 is gepauzeerd." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:600 +msgid "%1 installed successfully!" +msgstr "%1 succesvol geïnstalleerd!" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:644 +msgid "Enable Voice Input" +msgstr "Spraakinvoer inschakelen" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:667 +msgid "INSTALLED MODELS" +msgstr "GEÏNSTALLEERDE MODELLEN" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:765 +msgid "Scanning for models..." +msgstr "Scannen naar modellen..." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:765 +msgid "No installed models found." +msgstr "Geen geïnstalleerde modellen gevonden." + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:777 +msgid "AVAILABLE FOR DOWNLOAD" +msgstr "BESCHIKBAAR VOOR DOWNLOAD" + +#: ../qml/features/settings/pages/Settings_VoiceModel.qml:963 +msgid "All available models are installed." +msgstr "Alle beschikbare modellen zijn geïnstalleerd." + +#: ../qml/features/settings/pages/Settings_Accounts.qml:101 +#, fuzzy +msgid "Delete Account" +msgstr "Selecteer account" + +#: ../qml/features/settings/pages/Settings_Accounts.qml:104 +msgid "" +"Are you sure you want to delete this account? This will permanently remove " +"the account and all associated data including projects, tasks, and " +"timesheets." +msgstr "" + +#: ../qml/features/settings/pages/Settings_Accounts.qml:307 +msgid "Log" +msgstr "" -#: ../qml/components/AccountDrawer.qml:365 -#: ../qml/components/AccountDrawer.qml:415 -#: ../qml/components/AccountDrawer.qml:416 -msgid "All Accounts" -msgstr "Alle accounts" +#: ../qml/features/tasks/components/TaskPrioritySelector.qml:28 +#: ../qml/features/timesheets/pages/Timesheet.qml:613 +msgid "Priority" +msgstr "Prioriteit" -#: ../qml/components/AccountDrawer.qml:429 -msgid "N/A for All Accounts" -msgstr "N.v.t. voor alle accounts" +#: ../qml/features/tasks/components/MyTasksClosedIndicator.qml:48 +msgid "Showing closed/completed tasks" +msgstr "Gesloten/voltooide taken weergeven" -#: ../qml/components/AccountDrawer.qml:452 -msgid "Account not found" -msgstr "Account niet gevonden" +#: ../qml/features/tasks/components/TaskStageSelector.qml:55 +msgid "Change Task Stage" +msgstr "Taakfase wijzigen" -#: ../qml/components/AccountDrawer.qml:460 -#: ../qml/components/AccountDrawer.qml:462 -msgid "Local account - no sync required" -msgstr "Lokaal account - geen synchronisatie vereist" +#: ../qml/features/tasks/components/TaskNameField.qml:26 +msgid "Name" +msgstr "Naam" -#: ../qml/components/AccountDrawer.qml:462 -msgid "Info" -msgstr "Info" +#: ../qml/features/tasks/components/TaskStagesDisplayGrid.qml:31 +#: ../qml/features/tasks/components/TaskRecordActionsGrid.qml:27 +#: ../qml/features/projects/pages/Projects.qml:648 +msgid "Current Stage:" +msgstr "Huidige fase:" -#: ../qml/components/AccountDrawer.qml:472 -msgid "Connecting to server..." -msgstr "Verbinding maken met server..." +#: ../qml/features/tasks/components/TaskStagesDisplayGrid.qml:67 +#, fuzzy +msgid "Change Stage" +msgstr "Taakfase wijzigen" -#: ../qml/components/AccountDrawer.qml:472 -msgid "Syncing activities..." -msgstr "Activiteiten synchroniseren..." +#: ../qml/features/tasks/components/TaskStagesDisplayGrid.qml:87 +#, fuzzy +msgid "Current Personal Stage:" +msgstr "Persoonlijke fase wijzigen" -#: ../qml/components/AccountDrawer.qml:472 -msgid "Syncing projects..." -msgstr "Projecten synchroniseren..." +#: ../qml/features/tasks/components/TaskStagesDisplayGrid.qml:128 +#: ../qml/features/tasks/components/PersonalStageSelector.qml:59 +msgid "Change Personal Stage" +msgstr "Persoonlijke fase wijzigen" -#: ../qml/components/AccountDrawer.qml:472 -msgid "Syncing tasks..." -msgstr "Taken synchroniseren..." +#: ../qml/features/tasks/components/TaskRecordActionsGrid.qml:67 +#: ../qml/features/projects/pages/Projects.qml:688 +msgid "Change" +msgstr "Wijzigen" -#: ../qml/components/AccountDrawer.qml:472 -msgid "Syncing timesheets..." -msgstr "Urenstaten synchroniseren..." +#: ../qml/features/tasks/components/TaskRecordActionsGrid.qml:72 +#: ../qml/features/projects/pages/Projects.qml:715 +#: ../qml/features/activities/pages/Activity_Page.qml:41 +msgid "Activities" +msgstr "Activiteiten" -#: ../qml/components/AccountDrawer.qml:472 -msgid "Updating local data..." -msgstr "Lokale gegevens bijwerken..." +#: ../qml/features/tasks/components/TaskRecordActionsGrid.qml:111 +#: ../qml/features/timesheets/pages/Timesheet_Page.qml:41 +#: ../qml/features/timesheets/pages/Timesheet_Page.qml:69 +msgid "Timesheets" +msgstr "Urenstaten" -#: ../qml/components/AccountDrawer.qml:481 -#: ../qml/components/AccountDrawer.qml:484 -msgid "Sync failed: " -msgstr "Synchronisatie mislukt: " +#: ../qml/features/tasks/components/TaskInitialStageSelector.qml:27 +msgid "Initial Stage" +msgstr "Beginfase" -#: ../qml/components/AccountDrawer.qml:484 -msgid "Error" -msgstr "Fout" +#: ../qml/features/tasks/components/TaskScheduleFields.qml:43 +msgid "Planned Hours" +msgstr "Geplande uren" -#: ../qml/components/AccountDrawer.qml:500 -msgid "Sync completed successfully" -msgstr "Synchronisatie succesvol voltooid" +#: ../qml/features/tasks/components/TaskScheduleFields.qml:55 +msgid "e.g., 2:30 or 1.5" +msgstr "bijv. 2:30 of 1,5" -#: ../qml/components/AccountDrawer.qml:504 -msgid "Data synchronized successfully!" -msgstr "Gegevens succesvol gesynchroniseerd!" +#: ../qml/features/tasks/components/TaskScheduleFields.qml:136 +msgid "Deadline" +msgstr "Deadline" -#: ../qml/components/AccountDrawer.qml:504 -msgid "Success" -msgstr "Succes" +#: ../qml/features/tasks/components/TaskScheduleFields.qml:151 +msgid "Select" +msgstr "Selecteren" -#: ../qml/components/AccountSelector.qml:105 -#: ../qml/components/AccountSelectorDialog.qml:153 -msgid "Select an account" -msgstr "Selecteer een account" +#: ../qml/features/tasks/components/TaskScheduleFields.qml:165 +msgid "Select Deadline" +msgstr "Deadline selecteren" -#: ../qml/components/AccountSelectorDialog.qml:18 -#: ../qml/components/ProjectSelector.qml:61 -#: ../qml/components/ProjectSelector.qml:98 -msgid "Select Account" -msgstr "Selecteer account" +#: ../qml/features/tasks/components/TaskDetailsCard.qml:243 +#: ../qml/features/tasks/components/TaskDetailsCard.qml:252 +#: ../qml/features/timesheets/components/TimeSheetDetailsCard.qml:148 +#: ../qml/features/timesheets/components/TimeSheetDetailsCard.qml:157 +msgid "update Timesheet" +msgstr "Urenstaat bijwerken" -#: ../qml/components/AccountSelectorDialog.qml:59 -msgid "Choose an account to use" -msgstr "Kies een account om te gebruiken" +#: ../qml/features/tasks/components/TaskDetailsCard.qml:348 +#, fuzzy +msgid "Unable to track progress – no planned hours" +msgstr "Kan voortgang niet volgen – geen geplande uren" -#: ../qml/components/AccountSelectorDialog.qml:232 -#: ../qml/components/CreateUpdateDialog.qml:146 -#: ../qml/components/CreateUpdatePage.qml:176 -#: ../qml/components/CustomDatePicker.qml:131 -#: ../qml/components/CustomDatePicker.qml:159 -#: ../qml/components/ProjectSelector.qml:136 -#: ../qml/components/ProjectSelector.qml:183 -#: ../qml/components/SaveDiscardDialog.qml:94 -#: ../qml/components/TimePickerPopup.qml:102 -msgid "Cancel" -msgstr "Annuleren" +#: ../qml/features/tasks/components/TaskDetailsCard.qml:359 +msgid "No progress yet" +msgstr "Nog geen voortgang" -#: ../qml/components/ActivityDetailsCard.qml:72 -msgid "OVERDUE" -msgstr "ACHTERSTALLIG" +#: ../qml/features/tasks/components/TaskDetailsCard.qml:630 +msgid "N/A" +msgstr "N.v.t." -#: ../qml/components/ActivityDetailsCard.qml:78 -msgid "TODAY" -msgstr "VANDAAG" +#: ../qml/features/tasks/pages/Task_Page.qml:43 +msgid "All Tasks" +msgstr "Alle taken" -#: ../qml/components/ActivityDetailsCard.qml:84 -msgid "PLANNED" -msgstr "GEPLAND" +#: ../qml/features/tasks/pages/Task_Page.qml:87 +#: ../qml/features/tasks/pages/MyTasksPage.qml:83 +#: ../qml/features/projects/pages/Project_Page.qml:78 +#, fuzzy +msgid "Tree View" +msgstr "Bekijken" -#: ../qml/components/ActivityDetailsCard.qml:187 +#: ../qml/features/tasks/pages/Task_Page.qml:87 +#: ../qml/features/tasks/pages/MyTasksPage.qml:83 +#: ../qml/features/projects/pages/Project_Page.qml:78 #, fuzzy -msgid "Mark Done" -msgstr "Donkere modus" +msgid "Flat View" +msgstr "Bekijken" -#: ../qml/components/ActivityDetailsCard.qml:192 -msgid "Follow-up" -msgstr "" +#: ../qml/features/tasks/pages/Task_Page.qml:262 +#: ../qml/features/activities/pages/Activity_Page.qml:620 +msgid "Later" +msgstr "Later" -#: ../qml/components/ActivityDetailsCard.qml:268 -msgid "No Summary" -msgstr "Geen samenvatting" +#: ../qml/features/tasks/pages/Task_Page.qml:388 +msgid "No tasks found." +msgstr "Geen taken gevonden." -#: ../qml/components/ActivityDetailsCard.qml:279 -msgid "No Notes" -msgstr "Geen opmerkingen" +#: ../qml/features/tasks/pages/Task_Page.qml:565 +#: ../qml/features/tasks/pages/MyTasksPage.qml:490 +#, fuzzy +msgid "Loading tasks..." +msgstr "Taken synchroniseren..." -#: ../qml/components/ActivityDetailsCard.qml:291 -msgid "Assigned to: " -msgstr "Toegewezen aan: " +#: ../qml/features/tasks/pages/Tasks.qml:654 +msgid "Parent Task" +msgstr "Ouder taak" -#: ../qml/components/ActivityDetailsCard.qml:291 -msgid "Unassigned" -msgstr "Niet toegewezen" +#: ../qml/features/tasks/pages/MyTasksPage.qml:47 +msgid "My Tasks" +msgstr "Mijn taken" -#: ../qml/components/ActivityDetailsCard.qml:315 -msgid "Type ID: " -msgstr "Type-ID: " +#: ../qml/features/tasks/pages/MyTasksPage.qml:93 +msgid "Stage Help" +msgstr "" -#: ../qml/components/ActivityDetailsCard.qml:356 -msgid "Reschedule Activity Date" -msgstr "Activiteitsdatum opnieuw plannen" +#: ../qml/features/tasks/pages/MyTasksPage.qml:96 +#, fuzzy +msgid "Personal Stages Help" +msgstr "Persoonlijke fase wijzigen" -#: ../qml/components/AssigneeFilterMenu.qml:156 -msgid "Filter by Assignees" -msgstr "Filter op toegewezenen" +#: ../qml/features/tasks/pages/MyTasksPage.qml:97 +msgid "" +"If personal stages are not visible, please check the following:

1) " +"Ensure stages exist in CURQ:
Ensure the stages are available in the " +"CURQ instance under 'My Tasks'.

2) Verify the app's Default DB:
In the app, confirm that you are checked in to the correct database as " +"Default, as My Tasks displays tasks based on the selected Default DB." +msgstr "" -#: ../qml/components/AssigneeFilterMenu.qml:183 -msgid "Search assignees..." -msgstr "Zoek toegewezenen..." +#: ../qml/features/tasks/pages/MyTasksPage.qml:405 +msgid "No Tasks Assigned to You" +msgstr "Geen taken aan jou toegewezen" -#: ../qml/components/AssigneeFilterMenu.qml:406 -msgid "Apply Filter" -msgstr "Filter toepassen" +#: ../qml/features/projects/pages/Projects.qml:585 +msgid "Project Name" +msgstr "Projectnaam" -#: ../qml/components/AssigneeFilterMenu.qml:425 -msgid "Clear Filter" -msgstr "Filter wissen" +#: ../qml/features/projects/pages/Projects.qml:774 +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:277 +#: ../qml/features/dashboard/pages/Dashboard.qml:360 +msgid "Tasks" +msgstr "Taken" -#: ../qml/components/AttachmentManager.qml:32 -msgid "Attachments" -msgstr "Bijlagen" +#: ../qml/features/projects/pages/Projects.qml:903 +msgid "Allocated Hours" +msgstr "Toegewezen uren" -#: ../qml/components/AttachmentManager.qml:86 -msgid "Upload" -msgstr "Uploaden" +#: ../qml/features/projects/pages/Projects.qml:976 +#, fuzzy +msgid "Planned Dates" +msgstr "Geplande uren" -#: ../qml/components/ColorPicker.qml:23 -msgid "Select Color" -msgstr "Kleur selecteren" +#: ../qml/features/projects/pages/Project_Page.qml:43 +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:166 +#: ../qml/features/dashboard/pages/Dashboard.qml:348 +msgid "Projects" +msgstr "Projecten" -#: ../qml/components/CreateUpdateDialog.qml:42 -#: ../qml/components/CreateUpdatePage.qml:17 -msgid "New Project Update" -msgstr "Nieuwe projectupdate" +#: ../qml/features/projects/pages/Project_Page.qml:137 +#, fuzzy +msgid "Loading projects..." +msgstr "Projecten synchroniseren..." -#: ../qml/components/CreateUpdateDialog.qml:102 -msgid "Progress:" -msgstr "Voortgang:" +#: ../qml/features/dashboard/components/ProjectCard.qml:77 +#, fuzzy +msgid "tasks" +msgstr "Taken" -#: ../qml/components/CreateUpdatePage.qml:61 -msgid "Draft Recovered" -msgstr "Concept Hersteld" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:7 +msgid "Dashboard Charts Guide" +msgstr "" -#: ../qml/components/CreateUpdatePage.qml:62 -msgid "Your unsaved changes have been recovered." -msgstr "Je niet-opgeslagen wijzigingen zijn hersteld." +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:24 +msgid "" +"Welcome to the Dashboard! Here is a quick guide to help you understand your " +"data:" +msgstr "" -#: ../qml/components/CreateUpdatePage.qml:105 -msgid "Validation Error" -msgstr "Validatiefout" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:33 +msgid "Priority Matrix (Chart 1 & 2)" +msgstr "" -#: ../qml/components/CreateUpdatePage.qml:106 -msgid "Please fill in all required fields." -msgstr "Vul alle verplichte velden in." +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:40 +msgid "" +"These charts give you an overview of where your time goes. Check if you are " +"spending time on high-priority tasks or getting bogged down by low-priority " +"ones." +msgstr "" -#: ../qml/components/CreateUpdatePage.qml:152 -#: ../qml/components/SaveDiscardDialog.qml:48 -msgid "Unsaved Changes" -msgstr "Niet-opgeslagen wijzigingen" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:49 +msgid "Projectwise Time Spent (Chart 3)" +msgstr "" -#: ../qml/components/CreateUpdatePage.qml:153 -#, fuzzy -msgid "You have unsaved changes. What would you like to do?" -msgstr "Je hebt niet-opgeslagen wijzigingen. Wat wil je doen?\n" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:56 +msgid "" +"This horizontal bar chart compares the total hours spent across different " +"projects. You can incrementally load more projects using the buttons at the " +"bottom. Hover over any bar to see the exact hours." +msgstr "" -#: ../qml/components/CreateUpdatePage.qml:156 -#, fuzzy -msgid "Save Draft" -msgstr "Concept Opslaan" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:65 +msgid "Task Drilldown (Chart 4)" +msgstr "" -#: ../qml/components/CreateUpdatePage.qml:166 -#: ../qml/components/SaveDiscardDialog.qml:79 -msgid "Discard" -msgstr "Verwerpen" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:72 +msgid "" +"Tap on any project to drill down into its tasks. You can further tap on a " +"task to view the detailed timesheet logs. This is highly useful for auditing " +"exactly where your time was spent." +msgstr "" -#: ../qml/components/CreateUpdatePage.qml:256 -msgid "Enter update title..." -msgstr "Voer updatetitel in..." +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:81 +msgid "What Do The Colors Mean?" +msgstr "" -#: ../qml/components/CustomDatePicker.qml:110 -msgid "Next Week" -msgstr "Volgende week" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:88 +msgid "" +"Projects and tasks are color-coded based on their current stage to give you " +"immediate visual feedback:" +msgstr "" -#: ../qml/components/CustomDatePicker.qml:117 -msgid "Next Month" -msgstr "Volgende maand" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:95 +msgid "Green: Done / Completed" +msgstr "" -#: ../qml/components/CustomDatePicker.qml:124 -msgid "Custom" -msgstr "Aangepast" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:100 +#, fuzzy +msgid "Red: Cancelled" +msgstr "Annuleren" -#: ../qml/components/EHower.qml:99 -msgid "Time spent based on priorities" -msgstr "Tijdsbesteding op basis van prioriteiten" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:105 +msgid "Orange: On Hold / Paused" +msgstr "" -#: ../qml/components/EHower.qml:129 -msgid "URGENT" -msgstr "DRINGEND" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:110 +msgid "Blue / Other: In Progress" +msgstr "" -#: ../qml/components/EHower.qml:139 -msgid "NOT URGENT" -msgstr "NIET DRINGEND" +#: ../qml/features/dashboard/components/ChartInfoPopup.qml:118 +msgid "Got it!" +msgstr "" -#: ../qml/components/EHower.qml:163 -msgid "IMPORTANT" -msgstr "BELANGRIJK" +#: ../qml/features/dashboard/charts/Charts4.qml:32 +#, fuzzy +msgid "Unnamed project" +msgstr "Onbekende gebruiker" -#: ../qml/components/EHower.qml:180 -msgid "NOT IMPORTANT" -msgstr "NIET BELANGRIJK" +#: ../qml/features/dashboard/charts/Charts4.qml:60 +msgid "Unnamed task" +msgstr "" -#: ../qml/components/EHower.qml:242 -msgid "Do First" -msgstr "Eerst doen" +#: ../qml/features/dashboard/charts/Charts4.qml:64 +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:610 +#: ../qml/features/dashboard/pages/TaskDetailPage.qml:95 +#, fuzzy +msgid "Unknown" +msgstr "Onbekende gebruiker" -#: ../qml/components/EHower.qml:299 -msgid "Do Next" -msgstr "Daarna doen" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:248 +#, fuzzy +msgid "Search projects..." +msgstr "Projecten synchroniseren..." -#: ../qml/components/EHower.qml:357 -msgid "Do Later" -msgstr "Later doen" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:276 +msgid "Most time" +msgstr "" -#: ../qml/components/EHower.qml:414 -msgid "Don't do" -msgstr "Niet doen" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:278 +msgid "A-Z" +msgstr "" -#: ../qml/components/ImagePreviewer.qml:78 -msgid "Download" -msgstr "Downloaden" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:329 +#, fuzzy +msgid "No projects found" +msgstr "Geen taken gevonden." -#: ../qml/components/ImagePreviewer.qml:131 -msgid "No image to save" -msgstr "Geen afbeelding om op te slaan" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:390 +msgid "TOTAL" +msgstr "" -#: ../qml/components/ImagePreviewer.qml:155 -#, fuzzy -msgid "Saved" -msgstr "Opgeslagen" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:391 +msgid "TASKS" +msgstr "" -#: ../qml/components/ImagePreviewer.qml:158 -msgid "Choose where to save" -msgstr "Kies waar u wilt opslaan" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:392 +msgid "AVERAGE" +msgstr "" -#: ../qml/components/ImagePreviewer.qml:160 -msgid "Could not open export dialog" -msgstr "Kon exportdialoog niet openen" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:393 +msgid "TOP TASK" +msgstr "" + +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:472 +msgid "Show all %1 tasks ↓" +msgstr "" -#: ../qml/components/ImagePreviewer.qml:164 -#, fuzzy -msgid "Save failed" -msgstr "Synchronisatie mislukt: " +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:488 +msgid "No tasks with tracked time" +msgstr "" -#: ../qml/components/ImagePreviewer.qml:170 -msgid "No image to open" -msgstr "Geen afbeelding om te openen" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:549 +msgid "TIME SPENT" +msgstr "" -#: ../qml/components/ImagePreviewer.qml:188 -msgid "Could not open chooser" -msgstr "Kon kiezer niet openen" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:575 +msgid "% OF PROJECT" +msgstr "" -#: ../qml/components/ImagePreviewer.qml:192 +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:610 +#: ../qml/features/dashboard/pages/TaskDetailPage.qml:95 #, fuzzy -msgid "Open failed" -msgstr "Synchronisatie mislukt: " +msgid "Status" +msgstr "Projectstatus" -#: ../qml/components/ListHeader.qml:155 -msgid "Search..." -msgstr "Zoeken..." +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:612 +msgid "Log entries" +msgstr "" -#: ../qml/components/MultiAssigneeSelector.qml:37 -msgid "Assignees" -msgstr "Toegewezenen" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:646 +#: ../qml/features/dashboard/pages/TaskDetailPage.qml:129 +msgid "Time log" +msgstr "" -#: ../qml/components/MultiAssigneeSelector.qml:121 -#: ../qml/components/MultiAssigneeSelector.qml:294 -msgid "Select Assignees" -msgstr "Selecteer toegewezenen" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:711 +#: ../qml/features/dashboard/pages/TaskDetailPage.qml:159 +msgid "No note" +msgstr "" -#: ../qml/components/MultiAssigneeSelector.qml:421 -msgid "Clear All" -msgstr "Alles wissen" +#: ../qml/features/dashboard/charts/TaskTimeChart.qml:731 +msgid "No log entries" +msgstr "" -#: ../qml/components/PersonalStageSelector.qml:59 -msgid "Change Personal Stage" -msgstr "Persoonlijke fase wijzigen" +#: ../qml/features/dashboard/charts/Charts3.qml:138 +#, fuzzy +msgid "Projectwise Time Spent" +msgstr "Tijdsbesteding per taak" -#: ../qml/components/ProjectDetailsCard.qml:134 -msgid "Stop Timer" -msgstr "Timer stoppen" +#: ../qml/features/dashboard/charts/Charts3.qml:222 +msgid "Show fewer ↑" +msgstr "" -#: ../qml/components/ProjectDetailsCard.qml:346 -#: ../qml/components/TaskDetailsCard.qml:629 -msgid "Planned (H): " -msgstr "Gepland (U): " +#: ../qml/features/dashboard/charts/Charts3.qml:247 +msgid "Show next %1 ↓" +msgstr "" -#: ../qml/components/ProjectDetailsCard.qml:354 -#: ../qml/components/TaskDetailsCard.qml:636 -msgid "Start Date: " -msgstr "Startdatum: " +#: ../qml/features/dashboard/pages/Dashboard.qml:39 +msgid "Time Manager - Time Management Dashboard" +msgstr "Time Manager - Tijdbeheer Dashboard" -#: ../qml/components/ProjectDetailsCard.qml:362 -#: ../qml/components/TaskDetailsCard.qml:643 -msgid "End Date: " -msgstr "Einddatum: " +#: ../qml/features/dashboard/pages/Dashboard.qml:43 +#: ../qml/features/dashboard/pages/Dashboard.qml:169 +msgid "Loading dashboard..." +msgstr "" -#: ../qml/components/ProjectList.qml:595 +#: ../qml/features/dashboard/pages/Dashboard.qml:107 +#: ../qml/features/dashboard/pages/Dashboard2.qml:46 #, fuzzy -msgid "Search projects" -msgstr "Projecten synchroniseren..." +msgid "Chart Info" +msgstr "Grafieken" -#: ../qml/components/ProjectPieChart.qml:42 -#: ../qml/components/ProjectPieChart.qml:140 -msgid "Most Time-Consuming Projects" -msgstr "Meest tijdrovende projecten" +#: ../qml/features/dashboard/pages/Dashboard.qml:129 +#: ../qml/features/dashboard/pages/Dashboard.qml:454 +#, fuzzy +msgid "New Timesheet" +msgstr "Urenstaat" -#: ../qml/components/ProjectPieChart.qml:137 -msgid "Most Time-Consuming Projects(No Data)" -msgstr "Meest tijdrovende projecten (geen gegevens)" +#: ../qml/features/dashboard/pages/Dashboard.qml:157 +msgid "Preparing all-account dashboard..." +msgstr "" -#: ../qml/components/ProjectSelector.qml:83 -#: ../qml/components/ProjectSelector.qml:118 -#: ../qml/components/ProjectSelector.qml:147 +#: ../qml/features/dashboard/pages/Dashboard.qml:158 +msgid "Preparing dashboard..." +msgstr "" + +#: ../qml/features/dashboard/pages/Dashboard.qml:181 #, fuzzy -msgid "Select Project" +msgid "Loading project chart..." msgstr "Projecten synchroniseren..." -#: ../qml/components/SaveDiscardDialog.qml:52 -#, fuzzy -msgid "" -"You have unsaved changes. What would you like to do?\n" -"\n" -"Note: If you cancel, you can navigate back to continue editing." -msgstr "Je hebt niet-opgeslagen wijzigingen. Wat wil je doen?\n" +#: ../qml/features/dashboard/pages/Dashboard.qml:191 +msgid "Loading additional charts..." +msgstr "" -#: ../qml/components/StageFilterMenu.qml:179 +#: ../qml/features/dashboard/pages/Dashboard.qml:336 #, fuzzy -msgid "Filter by Stage" -msgstr "Filter op toegewezenen" - -#: ../qml/components/StageFilterMenu.qml:354 -msgid "Current: " -msgstr "Huidige: " - -#: ../qml/components/StatusSelector.qml:25 -msgid "On Track" -msgstr "" +msgid "Overview" +msgstr "Achterstallig " -#: ../qml/components/StatusSelector.qml:37 -msgid "At Risk" +#: ../qml/features/dashboard/pages/Dashboard.qml:502 +msgid "New Notifications" msgstr "" -#: ../qml/components/StatusSelector.qml:49 -msgid "Off Track" +#: ../qml/features/dashboard/pages/Dashboard.qml:503 +msgid "You have %1 new notification(s)" msgstr "" -#: ../qml/components/TaskDetailsCard.qml:242 -#: ../qml/components/TaskDetailsCard.qml:251 -#: ../qml/components/TimeSheetDetailsCard.qml:147 -#: ../qml/components/TimeSheetDetailsCard.qml:156 -msgid "update Timesheet" -msgstr "Urenstaat bijwerken" +#: ../qml/features/dashboard/pages/Dashboard3.qml:45 +msgid "Taskwise Time Spent" +msgstr "Tijdsbesteding per taak" -#: ../qml/components/TaskDetailsCard.qml:347 +#: ../qml/features/dashboard/pages/Dashboard3.qml:112 #, fuzzy -msgid "Unable to track progress – no planned hours" -msgstr "Kan voortgang niet volgen – geen geplande uren" - -#: ../qml/components/TaskDetailsCard.qml:358 -msgid "No progress yet" -msgstr "Nog geen voortgang" +msgid "Time" +msgstr "Urenstaat" -#: ../qml/components/TaskDetailsCard.qml:621 -#: ../qml/components/TimeSheetDetailsCard.qml:292 -msgid "DRAFT" -msgstr "CONCEPT" +#: ../qml/features/dashboard/pages/TaskDetailPage.qml:42 +#, fuzzy +msgid "Time spent" +msgstr "Urenstaat" -#: ../qml/components/TaskDetailsCard.qml:629 -msgid "N/A" -msgstr "N.v.t." +#: ../qml/features/dashboard/pages/TaskDetailPage.qml:46 +#, fuzzy, javascript-format +msgid "% of project" +msgstr "Subproject" -#: ../qml/components/TaskStageSelector.qml:55 -msgid "Change Task Stage" -msgstr "Taakfase wijzigen" +#: ../qml/features/dashboard/pages/TaskDetailPage.qml:49 +msgid "0.0%" +msgstr "" -#: ../qml/components/TasksForDayWidget.qml:35 -msgid "Plan for Today" -msgstr "Plan voor vandaag" +#: ../qml/features/dashboard/pages/TaskDetailPage.qml:97 +msgid "Log entries count" +msgstr "" -#: ../qml/components/TimePickerPopup.qml:43 -msgid "Select Hours" -msgstr "Uren selecteren" +#: ../qml/features/dashboard/pages/Dashboard2.qml:31 +msgid "Charts" +msgstr "Grafieken" -#: ../qml/components/TimeRecorderWidget.qml:62 +#: ../qml/features/timesheets/components/TimeRecorderWidget.qml:84 msgid "Time Tracking" msgstr "Tijdregistratie" -#: ../qml/components/TimeRecorderWidget.qml:77 +#: ../qml/features/timesheets/components/TimeRecorderWidget.qml:99 msgid "Manual" msgstr "Handmatig" -#: ../qml/components/TimeRecorderWidget.qml:93 +#: ../qml/features/timesheets/components/TimeRecorderWidget.qml:115 msgid "Automated" msgstr "Geautomatiseerd" -#: ../qml/components/TimeSheetDescriptionPopup.qml:54 +#: ../qml/features/timesheets/components/TimeSheetDetailsCard.qml:166 +msgid "Mark Ready for Sync" +msgstr "Markeren als gereed voor synchronisatie" + +#: ../qml/features/timesheets/components/TimeSheetDescriptionPopup.qml:54 msgid "Add Description to Timesheet" msgstr "Beschrijving toevoegen aan urenstaat" -#: ../qml/components/TimeSheetDetailsCard.qml:165 -msgid "Mark Ready for Sync" -msgstr "Markeren als gereed voor synchronisatie" +#: ../qml/features/timesheets/pages/Timesheet.qml:629 +msgid "" +"What Is Important Is Seldom Urgent, and What Is Urgent Is Seldom Important." +"

1. Important & Urgent:
Here you write down important " +"activities, which also have to be done immediately. These are urgent " +"problems or projects with a hard deadline. I.e. If you manage a restaurant " +"and an employee has not shown up, it is a rather urgent and acute problem. " +"All signals are on red, so this is a typical activity for the first quadrant." +"

2. Important & Not Urgent:
If you leave the activities in " +"this quadrant for the coming week, nothing will immediately go wrong. But be " +"careful: These are activities and projects that will help you in the long " +"term. Think of thinking about a strategy, improving work processes in your " +"team, investing in relationships and investing in yourself. i.e. You are a " +"team leader who has just been told during his performance review that more " +"creative input is expected. Such an outcome of a performance review is an " +"assignment that will never feel urgent, but is very important. You can " +"quickly recognize the important & non-urgent activities by answering the " +"question: if I don't do this, will it get me into trouble in the long run? " +"If the answer is yes, then you have an important & non-urgent activity. If " +"the answer is no, then it is a non-important & non-urgent activity." +"

3. Urgent & Not Important:
This quadrant concerns " +"activities that do not help you in the long run, but that are screaming for " +"your attention this week. An adjustment in a presentation that has to be " +"done for a colleague on the spur of the moment or the milk that is almost " +"empty. With tasks in this quadrant it is very important to check whether " +"they are actually urgent. Requests from others in particular often seem very " +"urgent, while they can sometimes wait a day or a week. It is usually fine to " +"postpone this work to a more suitable moment, provided that I communicate " +"well about this. If you have the opportunity to delegate or outsource these " +"tasks in this quadrant, do so. If you work for yourself, this is not always " +"possible. In that case, I advise you to organize your working day in such a " +"way that you are guided as little as possible by these urgent tasks, if " +"necessary by reserving a fixed time block each day for these types of " +"emergencies. That way you keep control over your agenda.

4. Not " +"Important & Not Urgent:
This type of work that you want to have on " +"your plate as little as possible, because it does not help you in any way. " +"Constantly refreshing your mailbox, for example. But meetings without a " +"clear goal also fall into this category. You can undoubtedly point out more " +"of these types of 'busy work' examples yourself: things that you do, but " +"that do not really benefit anyone. Sometimes these activities are a great " +"short break from your work, but usually they are a great excuse to postpone " +"your important work for a while." +msgstr "" +"\"Wat belangrijk is, is zelden urgent, en wat urgent is, is zelden " +"belangrijk.\"

1. Belangrijk & Urgent:
Hier schrijf je " +"belangrijke activiteiten op die ook onmiddellijk gedaan moeten worden. Dit " +"zijn urgente problemen of projecten met een harde deadline. Stel je voor: " +"als je een restaurant runt en een werknemer is niet komen opdagen, dan is " +"dat een tamelijk urgent en acuut probleem. Alle seinen staan op rood, dus " +"dit is een typische activiteit voor het eerste kwadrant.

2. " +"Belangrijk & Niet Urgent:
Als je de activiteiten in dit kwadrant voor " +"de komende week laat liggen, gaat er niet direct iets mis. Maar wees " +"voorzichtig: dit zijn activiteiten en projecten die je op de lange termijn " +"vooruithelpen. Denk aan nadenken over een strategie, het verbeteren van " +"werkprocessen in je team, investeren in relaties en investeren in jezelf. " +"Bijvoorbeeld: je bent een teamleider die tijdens zijn functioneringsgesprek " +"net te horen heeft gekregen dat er meer creatieve inbreng wordt verwacht. " +"Zo'n uitkomst van een functioneringsgesprek is een opdracht die nooit urgent " +"zal aanvoelen, maar wel zeer belangrijk is. Je kunt de belangrijke & niet-" +"urgente activiteiten snel herkennen door de vraag te beantwoorden: als ik " +"dit niet doe, kom ik dan op de lange termijn in de problemen? Als het " +"antwoord ja is, dan heb je een belangrijke & niet-urgente activiteit. Als " +"het antwoord nee is, dan is het een niet-belangrijke & niet-urgente " +"activiteit.

3. Urgent & Niet Belangrijk:
Dit kwadrant " +"betreft activiteiten die je op de lange termijn niet helpen, maar die deze " +"week wel schreeuwen om je aandacht. Een aanpassing in een presentatie die " +"nog even snel gedaan moet worden voor een collega, of de melk die bijna op " +"is. Bij taken in dit kwadrant is het erg belangrijk om na te gaan of ze " +"daadwerkelijk urgent zijn. Vooral verzoeken van anderen lijken vaak erg " +"dringend, terwijl ze soms best een dag of week kunnen wachten. Het is " +"doorgaans prima om dit werk uit te stellen naar een geschikter moment, mits " +"ik hier goed over communiceer. Als je de mogelijkheid hebt om deze taken in " +"dit kwadrant te delegeren of uit te besteden, doe dat dan. Als je voor " +"jezelf werkt is dit niet altijd mogelijk. In dat geval raad ik aan om je " +"werkdag zo in te richten dat je zo min mogelijk wordt geleid door deze " +"urgente taken, eventueel door elke dag een vast tijdblok te reserveren voor " +"dit soort 'brandjes'. Op die manier behoud je controle over je agenda." +"

4. Niet Belangrijk & Niet Urgent:
Dit soort werk wil je zo " +"min mogelijk op je bord hebben, want het helpt je op geen enkele manier. " +"Constant je mailbox verversen bijvoorbeeld. Maar ook vergaderingen zonder " +"duidelijk doel vallen onder deze categorie. Je kunt ongetwijfeld zelf meer " +"van dit soort 'drukdoenerij' voorbeelden aanwijzen: zaken die je doet, maar " +"waar niemand echt baat bij heeft. Soms zijn deze activiteiten een prima " +"korte onderbreking van je werk, maar meestal zijn ze een uitstekend excuus " +"om je belangrijke werk nog even uit te stellen." -#: ../qml/components/UpdatesDetailsCard.qml:80 -msgid "Untitled Update" -msgstr "Naamloze update" +#: ../qml/features/timesheets/pages/Timesheet.qml:651 +msgid "Important, Urgent (1)" +msgstr "Belangrijk & Urgent (1)" -#: ../qml/components/UpdatesDetailsCard.qml:110 -msgid "By: " -msgstr "Door: " +#: ../qml/features/timesheets/pages/Timesheet.qml:670 +msgid "Important, Not Urgent (2)" +msgstr "Belangrijk & Niet Urgent" -#: ../qml/components/UpdatesDetailsCard.qml:110 -msgid "No Date" -msgstr "Geen datum" +#: ../qml/features/timesheets/pages/Timesheet.qml:689 +msgid "Urgent, Not Important (3)" +msgstr "Urgent, Niet Belangrijk (3)" -#: ../qml/components/UpdatesDetailsCard.qml:110 -msgid "Unknown User" -msgstr "Onbekende gebruiker" +#: ../qml/features/timesheets/pages/Timesheet.qml:708 +msgid "Not Urgent, Not Important (4)" +msgstr "Niet Urgent, Niet Belangrijk (4)" -#: ../qml/components/UpdatesDetailsCard.qml:118 -msgid "Details" -msgstr "Details" +#: ../qml/features/timesheets/pages/Timesheet_Page.qml:166 +msgid "Active" +msgstr "Actief" + +#: ../qml/features/timesheets/pages/Timesheet_Page.qml:167 +msgid "Draft" +msgstr "Concept" -#: ../qml/components/WorkItemSelector.qml:128 +#: ../qml/features/timesheets/pages/Timesheet_Page.qml:400 #, fuzzy -msgid "Subproject" -msgstr "Subproject" +msgid "Loading timesheets..." +msgstr "Urenstaten synchroniseren..." -#: ../qml/components/WorkItemSelector.qml:130 -msgid "Subtask" -msgstr "Subtaak" +#: ../qml/features/activities/pages/Activity_Page.qml:621 +msgid "OverDue" +msgstr "Achterstallig " + +#: ../qml/features/activities/pages/Activity_Page.qml:754 +msgid "No Activities Available" +msgstr "Geen activiteiten beschikbaar" -#: ../qml/components/WorkItemSelector.qml:131 +#: ../qml/features/activities/pages/Activity_Page.qml:866 #, fuzzy -msgid "Assignee" -msgstr "Toegewezenen" +msgid "Loading activities..." +msgstr "Activiteiten synchroniseren..." + +#: ../qml/features/activities/pages/Activities.qml:516 +#, fuzzy +msgid "View Task" +msgstr "Taak" -#: ubtms.desktop.in.h:1 -msgid "Time Management" -msgstr "Tijdbeheer" +#: ../qml/features/activities/pages/Activities.qml:518 +#, fuzzy +msgid "View Project" +msgstr "Project" +#: ../qml/features/activities/pages/Activities.qml:520 #, fuzzy -#~ msgid "Connect With Api Key" -#~ msgstr "Verbinden met" +msgid "View Update" +msgstr "Naamloze update" + +#: ../qml/features/activities/pages/Activities.qml:543 +msgid "Connected to" +msgstr "Verbonden met" + +#: ../qml/features/activities/pages/Activities.qml:656 +msgid "Other" +msgstr "" +#: ../qml/features/activities/pages/Activities.qml:697 +msgid "Summary" +msgstr "Samenvatting" + +#: ../qml/features/activities/pages/Activities.qml:798 #, fuzzy -#~ msgid "Connect With Password" -#~ msgstr "Verbinden met" +msgid "Activity Type" +msgstr "Activiteit" + +#~ msgid "Time Management App - Beta" +#~ msgstr "Tijdbeheer-app - Bèta" + +#~ msgid "Version: " +#~ msgstr "Versie: " + +#~ msgid "Release Notes: " +#~ msgstr "Release-opmerkingen: " + +#~ msgid "Enter Odoo URL here" +#~ msgstr "Voer hier Odoo URL in" + +#~ msgid "Dashboard" +#~ msgstr "Dashboard" + +#~ msgid "About Us" +#~ msgstr "Over ons" + +#~ msgid "Personal Stages Diagnostics" +#~ msgstr "Diagnostiek persoonlijke fasen" + +#~ msgid "Check personal stage data status and configuration" +#~ msgstr "Controleer status en configuratie van persoonlijke fasegegevens" + +#~ msgid "Check Personal Stage Status" +#~ msgstr "Controleer status persoonlijke fase" + +#~ msgid "Force Task Re-sync" +#~ msgstr "Taaksynchronisatie forceren" + +#~ msgid "Reset task timestamps to force fresh sync from Odoo" +#~ msgstr "" +#~ "Reset taaktijdstempels om nieuwe synchronisatie vanuit Odoo te forceren" + +#~ msgid "Reset Tasks Without Stages" +#~ msgstr "Reset taken zonder fasen" + +#~ msgid "Reset All Tasks" +#~ msgstr "Alle taken resetten" + +#~ msgid "Default" +#~ msgstr "Standaard" + +#~ msgid "Time Management" +#~ msgstr "Tijdbeheer" diff --git a/po/nl.po~ b/po/nl.po~ index 4d82c5e8..989fd78f 100644 --- a/po/nl.po~ +++ b/po/nl.po~ @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: ubtms\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-31 04:44+0000\n" +"POT-Creation-Date: 2025-11-03 06:19+0000\n" "PO-Revision-Date: 2025-10-15 22:45+0200\n" "Last-Translator: Gokul Kartha \n" "Language-Team: Dutch \n" @@ -37,24 +37,25 @@ msgstr "Release-opmerkingen: " msgid "Create Account" msgstr "Account aanmaken" -#: ../qml/Account_Page.qml:64 ../qml/Activities.qml:71 ../qml/Tasks.qml:69 -#: ../qml/components/SaveDiscardDialog.qml:64 +#: ../qml/Account_Page.qml:64 ../qml/Activities.qml:78 ../qml/Tasks.qml:69 +#: ../qml/Updates.qml:100 ../qml/components/SaveDiscardDialog.qml:64 msgid "Save" msgstr "Opslaan" -#: ../qml/Account_Page.qml:73 ../qml/Tasks.qml:77 +#: ../qml/Account_Page.qml:73 ../qml/Activities.qml:86 ../qml/Tasks.qml:77 +#: ../qml/Updates.qml:108 ../qml/components/ActivityDetailsCard.qml:177 +#: ../qml/components/UpdatesDetailsCard.qml:50 msgid "Edit" msgstr "Bewerken" -#: ../qml/Account_Page.qml:173 -#, fuzzy -msgid "Connect With Api Key" -msgstr "Verbinden met" +#: ../qml/Account_Page.qml:133 +msgid "Your account has been saved, Enjoy using the app !" +msgstr "" -#: ../qml/Account_Page.qml:177 +#: ../qml/Account_Page.qml:208 ../qml/Account_Page.qml:222 #, fuzzy -msgid "Connect With Password" -msgstr "Verbinden met" +msgid "Account Name" +msgstr "Account" #: ../qml/Account_Page.qml:255 msgid "Enter Odoo URL here" @@ -80,35 +81,43 @@ msgstr "Gebruikersnaam" msgid "Connect With" msgstr "Verbinden met" +#: ../qml/Account_Page.qml:520 +msgid "Hide" +msgstr "" + +#: ../qml/Account_Page.qml:520 +msgid "show" +msgstr "" + #: ../qml/Activities.qml:18 ../qml/Dashboard.qml:260 msgid "Activity" msgstr "Activiteit" -#: ../qml/Activities.qml:83 ../qml/Tasks.qml:58 +#: ../qml/Activities.qml:97 ../qml/Tasks.qml:58 ../qml/Updates.qml:118 #: ../qml/components/CreateUpdatePage.qml:86 msgid "Back" msgstr "Terug" -#: ../qml/Activities.qml:179 +#: ../qml/Activities.qml:330 msgid "Connected to" msgstr "Verbonden met" -#: ../qml/Activities.qml:189 ../qml/Projects.qml:43 +#: ../qml/Activities.qml:340 ../qml/Projects.qml:43 #: ../qml/components/WorkItemSelector.qml:127 msgid "Project" msgstr "Project" -#: ../qml/Activities.qml:207 ../qml/Dashboard.qml:254 ../qml/Dashboard3.qml:32 +#: ../qml/Activities.qml:362 ../qml/Dashboard.qml:254 ../qml/Dashboard3.qml:32 #: ../qml/Task_Page.qml:352 ../qml/Tasks.qml:45 #: ../qml/components/WorkItemSelector.qml:129 msgid "Task" msgstr "Taak" -#: ../qml/Activities.qml:239 +#: ../qml/Activities.qml:398 msgid "Summary" msgstr "Samenvatting" -#: ../qml/Activities.qml:329 +#: ../qml/Activities.qml:498 #, fuzzy msgid "Activity Type" msgstr "Activiteit" @@ -143,7 +152,7 @@ msgstr "Achterstallig " msgid "All" msgstr "Alle" -#: ../qml/Activity_Page.qml:613 +#: ../qml/Activity_Page.qml:627 msgid "No Activities Available" msgstr "Geen activiteiten beschikbaar" @@ -228,7 +237,7 @@ msgstr "Geen taken aan jou toegewezen" msgid "Create" msgstr "Aanmaken" -#: ../qml/Project_Page.qml:55 +#: ../qml/Project_Page.qml:55 ../qml/Updates_Page.qml:61 msgid "New" msgstr "Nieuw" @@ -241,6 +250,8 @@ msgid "Project Name" msgstr "Projectnaam" #: ../qml/Projects.qml:333 ../qml/Projects.qml:398 ../qml/Projects.qml:464 +#: ../qml/components/ActivityDetailsCard.qml:182 +#: ../qml/components/UpdatesDetailsCard.qml:55 msgid "View" msgstr "Bekijken" @@ -252,7 +263,8 @@ msgstr "Taken" msgid "Allocated Hours" msgstr "Toegewezen uren" -#: ../qml/ReadMorePage.qml:23 ../qml/components/CreateUpdateDialog.qml:121 +#: ../qml/ReadMorePage.qml:23 ../qml/Updates.qml:402 +#: ../qml/components/CreateUpdateDialog.qml:121 #: ../qml/components/CreateUpdatePage.qml:328 #: ../qml/components/RichTextPreview.qml:7 msgid "Description" @@ -292,7 +304,8 @@ msgstr "Taaksynchronisatie forceren" #: ../qml/Settings_Page.qml:549 msgid "Reset task timestamps to force fresh sync from Odoo" -msgstr "Reset taaktijdstempels om nieuwe synchronisatie vanuit Odoo te forceren" +msgstr "" +"Reset taaktijdstempels om nieuwe synchronisatie vanuit Odoo te forceren" #: ../qml/Settings_Page.qml:567 msgid "Reset Tasks Without Stages" @@ -409,7 +422,8 @@ msgid "Select Deadline" msgstr "Deadline selecteren" #: ../qml/Timesheet.qml:542 -msgid "What Is Important Is Seldom Urgent, and What Is Urgent Is Seldom Important." +msgid "" +"What Is Important Is Seldom Urgent, and What Is Urgent Is Seldom Important." "

1. Important & Urgent:
Here you write down important " "activities, which also have to be done immediately. These are urgent " "problems or projects with a hard deadline. I.e. If you manage a restaurant " @@ -450,11 +464,48 @@ msgid "What Is Important Is Seldom Urgent, and What Is Urgent Is Seldom Importan "short break from your work, but usually they are a great excuse to postpone " "your important work for a while." msgstr "" -"\"Wat belangrijk is, is zelden urgent, en wat urgent is, is zelden belangrijk.\"

" -"1. Belangrijk & Urgent:
Hier schrijf je belangrijke activiteiten op die ook onmiddellijk gedaan moeten worden. Dit zijn urgente problemen of projecten met een harde deadline. Stel je voor: als je een restaurant runt en een werknemer is niet komen opdagen, dan is dat een tamelijk urgent en acuut probleem. Alle seinen staan op rood, dus dit is een typische activiteit voor het eerste kwadrant." -"

2. Belangrijk & Niet Urgent:
Als je de activiteiten in dit kwadrant voor de komende week laat liggen, gaat er niet direct iets mis. Maar wees voorzichtig: dit zijn activiteiten en projecten die je op de lange termijn vooruithelpen. Denk aan nadenken over een strategie, het verbeteren van werkprocessen in je team, investeren in relaties en investeren in jezelf. Bijvoorbeeld: je bent een teamleider die tijdens zijn functioneringsgesprek net te horen heeft gekregen dat er meer creatieve inbreng wordt verwacht. Zo'n uitkomst van een functioneringsgesprek is een opdracht die nooit urgent zal aanvoelen, maar wel zeer belangrijk is. Je kunt de belangrijke & niet-urgente activiteiten snel herkennen door de vraag te beantwoorden: als ik dit niet doe, kom ik dan op de lange termijn in de problemen? Als het antwoord ja is, dan heb je een belangrijke & niet-urgente activiteit. Als het antwoord nee is, dan is het een niet-belangrijke & niet-urgente activiteit." -"

3. Urgent & Niet Belangrijk:
Dit kwadrant betreft activiteiten die je op de lange termijn niet helpen, maar die deze week wel schreeuwen om je aandacht. Een aanpassing in een presentatie die nog even snel gedaan moet worden voor een collega, of de melk die bijna op is. Bij taken in dit kwadrant is het erg belangrijk om na te gaan of ze daadwerkelijk urgent zijn. Vooral verzoeken van anderen lijken vaak erg dringend, terwijl ze soms best een dag of week kunnen wachten. Het is doorgaans prima om dit werk uit te stellen naar een geschikter moment, mits ik hier goed over communiceer. Als je de mogelijkheid hebt om deze taken in dit kwadrant te delegeren of uit te besteden, doe dat dan. Als je voor jezelf werkt is dit niet altijd mogelijk. In dat geval raad ik aan om je werkdag zo in te richten dat je zo min mogelijk wordt geleid door deze urgente taken, eventueel door elke dag een vast tijdblok te reserveren voor dit soort 'brandjes'. Op die manier behoud je controle over je agenda." -"

4. Niet Belangrijk & Niet Urgent:
Dit soort werk wil je zo min mogelijk op je bord hebben, want het helpt je op geen enkele manier. Constant je mailbox verversen bijvoorbeeld. Maar ook vergaderingen zonder duidelijk doel vallen onder deze categorie. Je kunt ongetwijfeld zelf meer van dit soort 'drukdoenerij' voorbeelden aanwijzen: zaken die je doet, maar waar niemand echt baat bij heeft. Soms zijn deze activiteiten een prima korte onderbreking van je werk, maar meestal zijn ze een uitstekend excuus om je belangrijke werk nog even uit te stellen." +"\"Wat belangrijk is, is zelden urgent, en wat urgent is, is zelden " +"belangrijk.\"

1. Belangrijk & Urgent:
Hier schrijf je " +"belangrijke activiteiten op die ook onmiddellijk gedaan moeten worden. Dit " +"zijn urgente problemen of projecten met een harde deadline. Stel je voor: " +"als je een restaurant runt en een werknemer is niet komen opdagen, dan is " +"dat een tamelijk urgent en acuut probleem. Alle seinen staan op rood, dus " +"dit is een typische activiteit voor het eerste kwadrant.

2. " +"Belangrijk & Niet Urgent:
Als je de activiteiten in dit kwadrant voor " +"de komende week laat liggen, gaat er niet direct iets mis. Maar wees " +"voorzichtig: dit zijn activiteiten en projecten die je op de lange termijn " +"vooruithelpen. Denk aan nadenken over een strategie, het verbeteren van " +"werkprocessen in je team, investeren in relaties en investeren in jezelf. " +"Bijvoorbeeld: je bent een teamleider die tijdens zijn functioneringsgesprek " +"net te horen heeft gekregen dat er meer creatieve inbreng wordt verwacht. " +"Zo'n uitkomst van een functioneringsgesprek is een opdracht die nooit urgent " +"zal aanvoelen, maar wel zeer belangrijk is. Je kunt de belangrijke & niet-" +"urgente activiteiten snel herkennen door de vraag te beantwoorden: als ik " +"dit niet doe, kom ik dan op de lange termijn in de problemen? Als het " +"antwoord ja is, dan heb je een belangrijke & niet-urgente activiteit. Als " +"het antwoord nee is, dan is het een niet-belangrijke & niet-urgente " +"activiteit.

3. Urgent & Niet Belangrijk:
Dit kwadrant " +"betreft activiteiten die je op de lange termijn niet helpen, maar die deze " +"week wel schreeuwen om je aandacht. Een aanpassing in een presentatie die " +"nog even snel gedaan moet worden voor een collega, of de melk die bijna op " +"is. Bij taken in dit kwadrant is het erg belangrijk om na te gaan of ze " +"daadwerkelijk urgent zijn. Vooral verzoeken van anderen lijken vaak erg " +"dringend, terwijl ze soms best een dag of week kunnen wachten. Het is " +"doorgaans prima om dit werk uit te stellen naar een geschikter moment, mits " +"ik hier goed over communiceer. Als je de mogelijkheid hebt om deze taken in " +"dit kwadrant te delegeren of uit te besteden, doe dat dan. Als je voor " +"jezelf werkt is dit niet altijd mogelijk. In dat geval raad ik aan om je " +"werkdag zo in te richten dat je zo min mogelijk wordt geleid door deze " +"urgente taken, eventueel door elke dag een vast tijdblok te reserveren voor " +"dit soort 'brandjes'. Op die manier behoud je controle over je agenda." +"

4. Niet Belangrijk & Niet Urgent:
Dit soort werk wil je zo " +"min mogelijk op je bord hebben, want het helpt je op geen enkele manier. " +"Constant je mailbox verversen bijvoorbeeld. Maar ook vergaderingen zonder " +"duidelijk doel vallen onder deze categorie. Je kunt ongetwijfeld zelf meer " +"van dit soort 'drukdoenerij' voorbeelden aanwijzen: zaken die je doet, maar " +"waar niemand echt baat bij heeft. Soms zijn deze activiteiten een prima " +"korte onderbreking van je werk, maar meestal zijn ze een uitstekend excuus " +"om je belangrijke werk nog even uit te stellen." #: ../qml/Timesheet.qml:564 msgid "Important, Urgent (1)" @@ -484,6 +535,44 @@ msgstr "Actief" msgid "Draft" msgstr "Concept" +#: ../qml/Updates.qml:41 +#, fuzzy +msgid "Project Update" +msgstr "Projectupdates" + +#: ../qml/Updates.qml:240 ../qml/components/AccountFilter.qml:68 +#: ../qml/components/ProjectSelector.qml:54 +msgid "Account:" +msgstr "Account:" + +#: ../qml/Updates.qml:246 +#, fuzzy +msgid "Unknown Account" +msgstr "Onbekende gebruiker" + +#: ../qml/Updates.qml:260 ../qml/components/ProjectSelector.qml:76 +#, fuzzy +msgid "Project:" +msgstr "Project" + +#: ../qml/Updates.qml:266 ../qml/components/UpdatesDetailsCard.qml:127 +#, fuzzy +msgid "Unknown Project" +msgstr "Onbekende gebruiker" + +#: ../qml/Updates.qml:286 ../qml/components/CreateUpdateDialog.qml:87 +#: ../qml/components/CreateUpdatePage.qml:249 +msgid "Update Title" +msgstr "Titel bijwerken" + +#: ../qml/Updates.qml:324 ../qml/components/CreateUpdatePage.qml:276 +msgid "Project Status" +msgstr "Projectstatus" + +#: ../qml/Updates.qml:353 ../qml/components/CreateUpdatePage.qml:297 +msgid "Progress" +msgstr "Voortgang" + #: ../qml/components/AccountDrawer.qml:28 #: ../qml/components/AccountDrawer.qml:61 msgid "Account Selection" @@ -517,7 +606,8 @@ msgstr "Gegevens synchroniseren" #: ../qml/components/AccountDrawer.qml:276 msgid "Note: Sync is not available for 'All Accounts' view" -msgstr "Opmerking: Synchronisatie is niet beschikbaar voor weergave 'Alle accounts'" +msgstr "" +"Opmerking: Synchronisatie is niet beschikbaar voor weergave 'Alle accounts'" #: ../qml/components/AccountDrawer.qml:285 msgid "Please select a specific account to sync data" @@ -602,16 +692,14 @@ msgstr "Gegevens succesvol gesynchroniseerd!" msgid "Success" msgstr "Succes" -#: ../qml/components/AccountFilter.qml:68 -msgid "Account:" -msgstr "Account:" - #: ../qml/components/AccountSelector.qml:105 #: ../qml/components/AccountSelectorDialog.qml:153 msgid "Select an account" msgstr "Selecteer een account" #: ../qml/components/AccountSelectorDialog.qml:18 +#: ../qml/components/ProjectSelector.qml:61 +#: ../qml/components/ProjectSelector.qml:98 msgid "Select Account" msgstr "Selecteer account" @@ -624,44 +712,55 @@ msgstr "Kies een account om te gebruiken" #: ../qml/components/CreateUpdatePage.qml:176 #: ../qml/components/CustomDatePicker.qml:131 #: ../qml/components/CustomDatePicker.qml:159 +#: ../qml/components/ProjectSelector.qml:136 +#: ../qml/components/ProjectSelector.qml:183 #: ../qml/components/SaveDiscardDialog.qml:94 #: ../qml/components/TimePickerPopup.qml:102 msgid "Cancel" msgstr "Annuleren" -#: ../qml/components/ActivityDetailsCard.qml:70 +#: ../qml/components/ActivityDetailsCard.qml:72 msgid "OVERDUE" msgstr "ACHTERSTALLIG" -#: ../qml/components/ActivityDetailsCard.qml:76 +#: ../qml/components/ActivityDetailsCard.qml:78 msgid "TODAY" msgstr "VANDAAG" -#: ../qml/components/ActivityDetailsCard.qml:82 +#: ../qml/components/ActivityDetailsCard.qml:84 msgid "PLANNED" msgstr "GEPLAND" -#: ../qml/components/ActivityDetailsCard.qml:255 +#: ../qml/components/ActivityDetailsCard.qml:187 +#, fuzzy +msgid "Mark Done" +msgstr "Donkere modus" + +#: ../qml/components/ActivityDetailsCard.qml:192 +msgid "Follow-up" +msgstr "" + +#: ../qml/components/ActivityDetailsCard.qml:268 msgid "No Summary" msgstr "Geen samenvatting" -#: ../qml/components/ActivityDetailsCard.qml:266 +#: ../qml/components/ActivityDetailsCard.qml:279 msgid "No Notes" msgstr "Geen opmerkingen" -#: ../qml/components/ActivityDetailsCard.qml:278 +#: ../qml/components/ActivityDetailsCard.qml:291 msgid "Assigned to: " msgstr "Toegewezen aan: " -#: ../qml/components/ActivityDetailsCard.qml:278 +#: ../qml/components/ActivityDetailsCard.qml:291 msgid "Unassigned" msgstr "Niet toegewezen" -#: ../qml/components/ActivityDetailsCard.qml:302 +#: ../qml/components/ActivityDetailsCard.qml:315 msgid "Type ID: " msgstr "Type-ID: " -#: ../qml/components/ActivityDetailsCard.qml:344 +#: ../qml/components/ActivityDetailsCard.qml:356 msgid "Reschedule Activity Date" msgstr "Activiteitsdatum opnieuw plannen" @@ -698,11 +797,6 @@ msgstr "Kleur selecteren" msgid "New Project Update" msgstr "Nieuwe projectupdate" -#: ../qml/components/CreateUpdateDialog.qml:87 -#: ../qml/components/CreateUpdatePage.qml:249 -msgid "Update Title" -msgstr "Titel bijwerken" - #: ../qml/components/CreateUpdateDialog.qml:102 msgid "Progress:" msgstr "Voortgang:" @@ -730,10 +824,9 @@ msgstr "Niet-opgeslagen wijzigingen" #: ../qml/components/CreateUpdatePage.qml:153 #, fuzzy -msgid "You have unsaved changes. What would you like to do?\n" +msgid "You have unsaved changes. What would you like to do?" msgstr "Je hebt niet-opgeslagen wijzigingen. Wat wil je doen?\n" - #: ../qml/components/CreateUpdatePage.qml:156 #, fuzzy msgid "Save Draft" @@ -748,14 +841,6 @@ msgstr "Verwerpen" msgid "Enter update title..." msgstr "Voer updatetitel in..." -#: ../qml/components/CreateUpdatePage.qml:276 -msgid "Project Status" -msgstr "Projectstatus" - -#: ../qml/components/CreateUpdatePage.qml:297 -msgid "Progress" -msgstr "Voortgang" - #: ../qml/components/CustomDatePicker.qml:110 msgid "Next Week" msgstr "Volgende week" @@ -897,13 +982,21 @@ msgstr "Meest tijdrovende projecten" msgid "Most Time-Consuming Projects(No Data)" msgstr "Meest tijdrovende projecten (geen gegevens)" +#: ../qml/components/ProjectSelector.qml:83 +#: ../qml/components/ProjectSelector.qml:118 +#: ../qml/components/ProjectSelector.qml:147 +#, fuzzy +msgid "Select Project" +msgstr "Projecten synchroniseren..." + #: ../qml/components/SaveDiscardDialog.qml:52 -msgid "You have unsaved changes. What would you like to do?\n" +#, fuzzy +msgid "" +"You have unsaved changes. What would you like to do?\n" "\n" -"Note: If you cancel, you can navigate back to continue editing.\n" +"Note: If you cancel, you can navigate back to continue editing." msgstr "Je hebt niet-opgeslagen wijzigingen. Wat wil je doen?\n" - #: ../qml/components/StageFilterMenu.qml:179 #, fuzzy msgid "Filter by Stage" @@ -913,6 +1006,18 @@ msgstr "Filter op toegewezenen" msgid "Current: " msgstr "Huidige: " +#: ../qml/components/StatusSelector.qml:25 +msgid "On Track" +msgstr "" + +#: ../qml/components/StatusSelector.qml:37 +msgid "At Risk" +msgstr "" + +#: ../qml/components/StatusSelector.qml:49 +msgid "Off Track" +msgstr "" + #: ../qml/components/TaskDetailsCard.qml:242 #: ../qml/components/TaskDetailsCard.qml:251 #: ../qml/components/TimeSheetDetailsCard.qml:147 @@ -970,31 +1075,26 @@ msgstr "Beschrijving toevoegen aan urenstaat" msgid "Mark Ready for Sync" msgstr "Markeren als gereed voor synchronisatie" -#: ../qml/components/UpdatesDetailsCard.qml:59 +#: ../qml/components/UpdatesDetailsCard.qml:80 msgid "Untitled Update" msgstr "Naamloze update" -#: ../qml/components/UpdatesDetailsCard.qml:89 +#: ../qml/components/UpdatesDetailsCard.qml:110 msgid "By: " msgstr "Door: " -#: ../qml/components/UpdatesDetailsCard.qml:89 +#: ../qml/components/UpdatesDetailsCard.qml:110 msgid "No Date" msgstr "Geen datum" -#: ../qml/components/UpdatesDetailsCard.qml:89 +#: ../qml/components/UpdatesDetailsCard.qml:110 msgid "Unknown User" msgstr "Onbekende gebruiker" -#: ../qml/components/UpdatesDetailsCard.qml:97 +#: ../qml/components/UpdatesDetailsCard.qml:118 msgid "Details" msgstr "Details" -#: ../qml/components/UpdatesDetailsCard.qml:106 -#, fuzzy -msgid "Unknown Project" -msgstr "Onbekende gebruiker" - #: ../qml/components/WorkItemSelector.qml:128 #, fuzzy msgid "Subproject" @@ -1012,3 +1112,11 @@ msgstr "Toegewezenen" #: ubtms.desktop.in.h:1 msgid "Time Management" msgstr "Tijdbeheer" + +#, fuzzy +#~ msgid "Connect With Api Key" +#~ msgstr "Verbinden met" + +#, fuzzy +#~ msgid "Connect With Password" +#~ msgstr "Verbinden met" diff --git a/pulse-socket b/pulse-socket new file mode 120000 index 00000000..f67f038c --- /dev/null +++ b/pulse-socket @@ -0,0 +1 @@ +/run/user/1000/pulse/native \ No newline at end of file diff --git a/qml/DatePicker.qml b/qml/DatePicker.qml deleted file mode 100644 index 92166004..00000000 --- a/qml/DatePicker.qml +++ /dev/null @@ -1,215 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2025 CIT-Services - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import QtQuick 2.0 -import QtQuick.Controls 2.2 -import QtQuick.Window 2.2 - -ListView { - id: root - property int selectedYear: 2024 - - signal clicked(date date) - - property date selectedDate: new Date() - function isDesktop() { - if (Screen.width > 1300) { - return true; - } else { - return false; - } - } - width: isDesktop() ? 450 : 600 - height: isDesktop() ? 450 : 600 - snapMode: ListView.SnapOneItem - orientation: Qt.Horizontal - clip: true - anchors.margins: 0 - - model: 500 * 12 - - function set(year, month) { - selectedYear = year; - selectedDate = new Date(year, month, selectedDate.getDate()); - var index = year * 12 + month; - listView.currentIndex = index; - } - - Item { - width: isDesktop() ? 400 : 600 - height: isDesktop() ? 345 : 600 - anchors.centerIn: parent - Row { - spacing: 10 - anchors { - horizontalCenter: parent.horizontalCenter - top: parent.top - topMargin: isDesktop() ? 0 : 80 - } - - ComboBox { - id: yearSelector - width: isDesktop() ? 200 : 300 - height: isDesktop() ? 30 : 57 - textRole: "yearText" - model: ListModel { - Component.onCompleted: { - var currentYear = new Date().getFullYear(); - for (var i = currentYear; i < currentYear + 10; ++i) { - append({ - "yearText": i.toString() - }); - } - } - } - - onCurrentTextChanged: { - selectedYear = parseInt(currentText); - } - } - - Button { - width: isDesktop() ? 80 : 100 - height: isDesktop() ? 30 : 50 - - background: Rectangle { - color: "#FB634E" - radius: 10 - border.color: "#FB634E" - border.width: 2 - anchors.fill: parent - } - contentItem: Text { - anchors.fill: parent - text: "Go" - color: "#fff" - font.pixelSize: isDesktop() ? 20 : 30 - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - } - - onClicked: { - var selectedYear = parseInt(yearSelector.currentText); - root.set(selectedYear, root.selectedDate.getMonth()); - } - } - } - } - - delegate: Item { - property int month: index % 12 - property int firstDay: new Date(selectedYear, month, 1).getDay() - - width: root.width - height: root.height - - Rectangle { - width: parent.width - height: isDesktop() ? 390 : 600 - color: "#121944" - border.color: "#121944" - } - - y: 10 - - Column { - spacing: isDesktop() ? 40 : 60 - - Item { - width: root.width - height: isDesktop() ? root.height - grid.height - 100 : root.height - grid.height - 70 - - Text { - anchors { - horizontalCenter: parent.horizontalCenter - top: parent.top - centerIn: parent - } - - color: "#fff" - text: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][month] + ' ' + selectedYear - font { - pixelSize: 0.5 * grid.cellHeight - } - } - } - - Grid { - id: grid - - width: root.width - height: (isDesktop() ? 0.675 : 0.745) * root.height - property real cellWidth: width / columns - property real cellHeight: height / rows - - columns: 7 - rows: 7 - - Repeater { - model: grid.columns * grid.rows - - delegate: Rectangle { - property int day: index - 7 - property int date: day - firstDay + 1 - - width: grid.cellWidth - height: grid.cellHeight - border.width: 0.3 * radius - border.color: new Date(selectedYear, month, date).toDateString() == selectedDate.toDateString() && text.text && day >= 0 ? 'black' : 'transparent' - radius: 0.02 * root.height - opacity: !mouseArea.pressed ? 1 : 0.3 - - Text { - id: text - - anchors.centerIn: parent - font.pixelSize: 0.5 * parent.height - font.bold: new Date(selectedYear, month, date).toDateString() == new Date().toDateString() - text: { - if (day < 0) - ['S', 'M', 'T', 'W', 'T', 'F', 'S'][index]; - else if (new Date(selectedYear, month, date).getMonth() == month) - date; - else - ''; - } - } - - MouseArea { - id: mouseArea - - anchors.fill: parent - enabled: text.text && day >= 0 - - onClicked: { - selectedDate = new Date(selectedYear, month, date); - root.clicked(selectedDate); - } - } - } - } - } - } - } -} diff --git a/qml/TSApp.qml b/qml/TSApp.qml index 25f711a8..b187e9ab 100644 --- a/qml/TSApp.qml +++ b/qml/TSApp.qml @@ -34,6 +34,7 @@ MainView { applicationName: "ubtms" property bool init: true property alias globalTimerWidget: globalWidgets.globalTimerWidget + property alias modelDownloadTimerWidget: globalWidgets.modelDownloadTimerWidget property alias backend_bridge: globalWidgets.backend_bridge property alias imagePreviewer: globalWidgets.imagePreviewer property alias accountPicker: globalWidgets.accountPicker diff --git a/qml/UbuntuNumberAnimation.qml b/qml/UbuntuNumberAnimation.qml deleted file mode 100644 index c9959e57..00000000 --- a/qml/UbuntuNumberAnimation.qml +++ /dev/null @@ -1,7 +0,0 @@ -// Fixed-duration animation helper matching the requested UbuntuNumberAnimation behavior. -import QtQuick 2.12 -import Lomiri.Components 1.3 - -NumberAnimation { - duration: 150 -} diff --git a/qml/app/AppLayout.qml b/qml/app/AppLayout.qml index 3581fd3d..0c723699 100644 --- a/qml/app/AppLayout.qml +++ b/qml/app/AppLayout.qml @@ -3,10 +3,15 @@ import Lomiri.Components 1.3 import QtQuick.Window 2.2 import QtQuick.Layouts 1.11 import "../" +import "navigation" as AppNavigation import "pages" as AppPages +import "../features/activities/pages" as ActivityPages import "../features/dashboard/pages" as DashboardPages +import "../features/projects/pages" as ProjectPages import "../features/settings/pages" as SettingsPages import "../features/tasks/pages" as TaskPages +import "../features/timesheets/pages" as TimesheetPages +import "../features/updates/pages" as UpdatePages import "navigation/NavigationRoutes.js" as NavigationRoutes AdaptivePageLayout { @@ -76,7 +81,7 @@ AdaptivePageLayout { id: splash_page } - Menu { + AppNavigation.MenuPage { id: menu_page navigationController: apLayout.navigationController } @@ -108,7 +113,7 @@ AdaptivePageLayout { } } - Timesheet { + TimesheetPages.Timesheet { id: timesheet_page Connections { @@ -122,7 +127,7 @@ AdaptivePageLayout { } } - Activity_Page { + ActivityPages.Activity_Page { id: activity_page Connections { @@ -150,7 +155,21 @@ AdaptivePageLayout { } } - Project_Page { + TaskPages.MyTasksPage { + id: my_tasks_page + + Connections { + target: rootApp + onAccountDataRefreshRequested: function(accountId) { + console.debug("🔄 Refreshing My Tasks data for account:", accountId); + if (my_tasks_page.visible && typeof my_tasks_page.refreshData === "function") { + my_tasks_page.refreshData(); + } + } + } + } + + ProjectPages.Project_Page { id: project_page Connections { @@ -164,11 +183,11 @@ AdaptivePageLayout { } } - Updates_Page { + UpdatePages.Updates_Page { id: updates_page } - Aboutus { + AppPages.AboutPage { id: aboutus_page } @@ -176,7 +195,7 @@ AdaptivePageLayout { id: settings_page } - Timesheet_Page { + TimesheetPages.Timesheet_Page { id: timesheet_list Connections { @@ -232,6 +251,8 @@ AdaptivePageLayout { targetPage = activity_page; else if (pageKey === "task") targetPage = task_page; + else if (pageKey === "my_tasks") + targetPage = my_tasks_page; else if (pageKey === "project") targetPage = project_page; else if (pageKey === "updates") @@ -274,14 +295,14 @@ AdaptivePageLayout { } } - setCurrentPage(pageNum); + setCurrentPage(pageNum, url); if (globalDrawer) { globalDrawer.close(); } } - function setCurrentPage(page) { + function setCurrentPage(page, url) { console.debug("📄 Setting current page to:", page); switch (page) { case 0: @@ -300,7 +321,7 @@ AdaptivePageLayout { thirdPage = null; break; case 3: - currentPage = task_page; + currentPage = String(url || "").indexOf("MyTasks") >= 0 ? my_tasks_page : task_page; thirdPage = null; break; case 4: @@ -400,6 +421,9 @@ AdaptivePageLayout { if (task_page && typeof task_page.getTaskList === "function") { task_page.getTaskList(task_page.currentFilter || "today", ""); } + if (my_tasks_page && typeof my_tasks_page.refreshData === "function") { + my_tasks_page.refreshData(); + } if (project_page && project_page.projectlist && typeof project_page.projectlist.refresh === "function") { project_page.projectlist.refresh(); } diff --git a/qml/app/GlobalWidgets.qml b/qml/app/GlobalWidgets.qml index 227aca33..8eec9c24 100644 --- a/qml/app/GlobalWidgets.qml +++ b/qml/app/GlobalWidgets.qml @@ -8,6 +8,7 @@ Item { property var rootApp property alias globalTimerWidget: globalTimerWidget + property alias modelDownloadTimerWidget: modelDownloadTimerWidget property alias backend_bridge: backend_bridge property alias notifPopup: notifPopup property alias imagePreviewer: imagePreviewer @@ -27,6 +28,17 @@ Item { } } + // Model download progress bar for voice-to-text model - like sync + ModelDownloadTimerWidget { + id: modelDownloadTimerWidget + z: 9999 + anchors.bottom: parent.bottom + visible: false + showNotification: function (title, message, type) { + notifPopup.open(title, message, type); + } + } + BackendBridge { id: backend_bridge onPythonError: function (tb) { diff --git a/qml/Menu.qml b/qml/app/navigation/MenuPage.qml similarity index 89% rename from qml/Menu.qml rename to qml/app/navigation/MenuPage.qml index 3d258d33..7d721da8 100644 --- a/qml/Menu.qml +++ b/qml/app/navigation/MenuPage.qml @@ -27,27 +27,28 @@ import Lomiri.Components 1.3 import QtCharts 2.0 import QtQuick.Layouts 1.11 import Qt.labs.settings 1.0 -import "../models/Main.js" as Model -import "../models/timesheet.js" as TimesheetModel -import "../models/accounts.js" as Account -import "components" -import "app/navigation/NavigationRoutes.js" as NavigationRoutes +import "../../components" +import "NavigationRoutes.js" as NavigationRoutes Page { id: listpage - title: i18n.dtr("ubtms", "Menu") + property bool isMultiColumn: apLayout.columns > 1 property var navigationController + + title: i18n.dtr("ubtms", "Menu") anchors.fill: parent + header: PageHeader { id: header title: listpage.title + StyleHints { foregroundColor: "white" - backgroundColor: LomiriColors.orange dividerColor: LomiriColors.slate } + trailingActionBar.actions: [ Action { iconName: "account" @@ -57,8 +58,8 @@ Page { } }, Action { - iconSource: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "images/daymode.png" : "images/darkmode.png" - text: theme.name === "Ubuntu.Components.Themes.SuruDark" ? i18n.dtr("ubtms", "Light Mode") : i18n.dtr("ubtms","Dark Mode") + iconSource: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "../../images/daymode.png" : "../../images/darkmode.png" + text: theme.name === "Ubuntu.Components.Themes.SuruDark" ? i18n.dtr("ubtms", "Light Mode") : i18n.dtr("ubtms", "Dark Mode") onTriggered: { Theme.name = theme.name === "Ubuntu.Components.Themes.SuruDark" ? "Ubuntu.Components.Themes.Ambiance" : "Ubuntu.Components.Themes.SuruDark"; } @@ -84,10 +85,7 @@ Page { id: menuColumn width: parent.width anchors.top: parent.top - // anchors.topMargin: units.gu(2) - - Rectangle { width: parent.width height: mainSection.height @@ -96,10 +94,12 @@ Page { Column { id: mainSection width: parent.width + NavigationMenuList { width: parent.width menuItems: NavigationRoutes.menuItems() selectedPageUrl: apLayout && apLayout.currentMenuPageUrl ? apLayout.currentMenuPageUrl : "" + onItemSelected: function(item) { if (navigationController && typeof navigationController.navigateMenuItem === "function") { navigationController.navigateMenuItem(item); @@ -108,13 +108,8 @@ Page { } } } - } } - - - - } } } diff --git a/qml/app/navigation/NavigationRoutes.js b/qml/app/navigation/NavigationRoutes.js index 628c1ba2..48efe5f9 100644 --- a/qml/app/navigation/NavigationRoutes.js +++ b/qml/app/navigation/NavigationRoutes.js @@ -2,22 +2,22 @@ var _menuItems = [ { textKey: "Dashboard", iconName: "home", iconColor: "#3498db", pageUrl: "features/dashboard/pages/Dashboard.qml", pageNum: 0 }, - { textKey: "Timesheet", iconName: "alarm-clock", iconColor: "#e67e22", pageUrl: "Timesheet_Page.qml", pageNum: 1 }, - { textKey: "Activities", iconName: "calendar", iconColor: "#e74c3c", pageUrl: "Activity_Page.qml", pageNum: 2 }, - { textKey: "My Tasks", iconName: "scope-manager", iconColor: "#2ecc71", pageUrl: "MyTasks.qml", pageNum: 3 }, + { textKey: "Timesheet", iconName: "alarm-clock", iconColor: "#e67e22", pageUrl: "features/timesheets/pages/Timesheet_Page.qml", pageNum: 1 }, + { textKey: "Activities", iconName: "calendar", iconColor: "#e74c3c", pageUrl: "features/activities/pages/Activity_Page.qml", pageNum: 2 }, + { textKey: "My Tasks", iconName: "scope-manager", iconColor: "#2ecc71", pageUrl: "features/tasks/pages/MyTasksPage.qml", pageNum: 3 }, { textKey: "All Tasks", iconName: "view-list-symbolic", iconColor: "#1abc9c", pageUrl: "features/tasks/pages/Task_Page.qml", pageNum: 3 }, - { textKey: "Projects", iconName: "folder-symbolic", iconColor: "#9b59b6", pageUrl: "Project_Page.qml", pageNum: 4 }, - { textKey: "Project Updates", iconName: "history", iconColor: "#f39c12", pageUrl: "Updates_Page.qml", pageNum: 5 }, - { textKey: "About Us", iconName: "info", iconColor: "#2980b9", pageUrl: "Aboutus.qml", pageNum: 7 }, + { textKey: "Projects", iconName: "folder-symbolic", iconColor: "#9b59b6", pageUrl: "features/projects/pages/Project_Page.qml", pageNum: 4 }, + { textKey: "Project Updates", iconName: "history", iconColor: "#f39c12", pageUrl: "features/updates/pages/Updates_Page.qml", pageNum: 5 }, + { textKey: "About Us", iconName: "info", iconColor: "#2980b9", pageUrl: "app/pages/AboutPage.qml", pageNum: 7 }, { textKey: "Settings", iconName: "settings", iconColor: "#7f8c8d", pageUrl: "features/settings/pages/Settings_Page.qml", pageNum: 6, showDivider: false } ]; var _deepLinkPages = { "Task": "features/tasks/pages/Tasks.qml", - "Activity": "Activities.qml", - "ProjectUpdate": "Updates.qml", - "Project": "Projects.qml", - "Timesheet": "Timesheet.qml" + "Activity": "features/activities/pages/Activities.qml", + "ProjectUpdate": "features/updates/pages/Updates.qml", + "Project": "features/projects/pages/Projects.qml", + "Timesheet": "features/timesheets/pages/Timesheet.qml" }; function menuItems() { @@ -32,7 +32,7 @@ function resolvePageKey(pageNum, pageUrl) { if (pageNum === 2) return "activity"; if (pageNum === 3) - return String(pageUrl || "").indexOf("MyTasks") === -1 ? "task" : "dynamic"; + return String(pageUrl || "").indexOf("MyTasks") === -1 ? "task" : "my_tasks"; if (pageNum === 4) return "project"; if (pageNum === 5) diff --git a/qml/Aboutus.qml b/qml/app/pages/AboutPage.qml similarity index 97% rename from qml/Aboutus.qml rename to qml/app/pages/AboutPage.qml index e5a0824b..259c131f 100644 --- a/qml/Aboutus.qml +++ b/qml/app/pages/AboutPage.qml @@ -27,8 +27,8 @@ import Lomiri.Components 1.3 import QtCharts 2.0 import QtQuick.Layouts 1.11 import Qt.labs.settings 1.0 -import "../models/Main.js" as Model -import "../models/constants.js" as AppConst +import "../../../models/Main.js" as Model +import "../../../models/constants.js" as AppConst Page { id: aboutPage diff --git a/qml/app/pages/Splash.qml b/qml/app/pages/Splash.qml index fd96e41d..34d44379 100644 --- a/qml/app/pages/Splash.qml +++ b/qml/app/pages/Splash.qml @@ -54,7 +54,7 @@ Page { anchors.centerIn: parent width: units.gu(30) height: units.gu(30) - source: "../../logo.png" + source: "../../images/logo.png" opacity: 0.3 // Animate the opacity to fade in diff --git a/qml/release_notes.txt b/qml/app/pages/release_notes.txt similarity index 98% rename from qml/release_notes.txt rename to qml/app/pages/release_notes.txt index d2a9a4dd..521a6087 100644 --- a/qml/release_notes.txt +++ b/qml/app/pages/release_notes.txt @@ -63,7 +63,7 @@

Time Management - Alpha Draft

- +

Time Management is a native time-tracking and productivity application built exclusively for Ubuntu Touch phones. @@ -141,7 +141,7 @@


- Time Management for Ubuntu Touch • Version 1.2.8 • © 2026 CIT Services + Time Management for Ubuntu Touch • Version 1.2.9 • © 2026 CIT Services

diff --git a/qml/components/DaySelector.qml b/qml/components/DaySelector.qml deleted file mode 100644 index e76dd633..00000000 --- a/qml/components/DaySelector.qml +++ /dev/null @@ -1,146 +0,0 @@ -import QtQuick 2.12 -import QtQuick.Controls 2.12 -import QtQuick.Layouts 1.3 -import QtQuick.Dialogs 1.2 -import Lomiri.Components.Pickers 1.3 - -Item { - id: daySelector - width: parent ? parent.width : 400 - property alias labelText: rangeLabel.text - property date selectedDate: new Date() - property bool readOnly: false - signal dateChanged(date selectedDate) - // color: "transparent" - - /** - * Returns the selected date in "yyyy-MM-dd" format (for database/API use). - * @returns {string} - */ - function formattedDate() { - return Qt.formatDate(selectedDate, "yyyy-MM-dd"); - } - - /** - * Sets the selected date from a string or Date object. - * Accepts either a JS Date or a valid string like "2025-06-12". - * @param {string|Date} val - */ - function setSelectedDate(val) { - function toDate(input) { - if (input instanceof Date) - return input; - if (typeof input === "string") { - const d = new Date(input); - return !isNaN(d.getTime()) ? d : null; - } - return null; - } - - const parsed = toDate(val); - - if (parsed) { - dateItem.date = parsed; - selectedDate = parsed; - dateChanged(selectedDate); - } else { - console.warn("❌ Invalid date input for setSelectedDate:", val); - } - } - - ColumnLayout { - anchors.fill: parent - //anchors.margins: units.gu(1) - - // Row for label and combo - RowLayout { - - TSLabel { - id: rangeLabel - enabled: true - text: "Date" - } - - Item { - // Add left margin using Layout.leftMargin for TSCombobox - Layout.preferredWidth: units.gu(20) - Layout.preferredHeight: units.gu(5) - Layout.leftMargin: units.gu(4) - - TSCombobox { - id: dayCombo - anchors.fill: parent - model: ["Today", "Yesterday", "Custom"] - visible: !daySelector.readOnly - currentIndex: 0 - onActivated: updateDate() - onAccepted: updateDate() - } - } - - Item { - id: dateItem - property date date: new Date() - Layout.preferredWidth: parent.width * 0.5 - Layout.preferredHeight: parent.height - Layout.leftMargin: units.gu(1) - - // color: "white" - - TSLabel { - anchors.fill: parent - verticalAlignment: Text.AlignVCenter - enabled: !daySelector.readOnly - //readOnly: true - text: Qt.formatDate(dateItem.date, "dd-MM-yyyy") - } - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - if (daySelector.readOnly) { - return; - } - - let result = PickerPanel.openDatePicker(dateItem, "date", "Years|Months|Days"); - if (result) { - result.closed.connect(() => { - selectedDate = dateItem.date; - dateChanged(selectedDate); - }); - } - } - } - } - } - } - - function updateDate() { - const today = new Date(); - let newDate = new Date(today); - - switch (dayCombo.currentIndex) { - case 0: // Today - break; - case 1: // Yesterday - newDate.setDate(newDate.getDate() - 1); - break; - case 2: // Custom - return; // let user pick manually - } - - dateItem.date = newDate; - selectedDate = newDate; - dateChanged(selectedDate); - } - - Component.onCompleted: { - if (!selectedDate || isNaN(selectedDate.getTime())) { - updateDate(); // fallback to Today/Yesterday/Custom logic - } else { - // If selectedDate already set externally, respect it - dateItem.date = selectedDate; - } - } -} diff --git a/qml/components/OutlinedContainer.qml b/qml/components/base/OutlinedContainer.qml similarity index 99% rename from qml/components/OutlinedContainer.qml rename to qml/components/base/OutlinedContainer.qml index e82ccd9d..5f8afa8c 100644 --- a/qml/components/OutlinedContainer.qml +++ b/qml/components/base/OutlinedContainer.qml @@ -1,6 +1,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 +import ".." Item { id: root diff --git a/qml/components/OutlinedTextField.qml b/qml/components/base/OutlinedTextField.qml similarity index 99% rename from qml/components/OutlinedTextField.qml rename to qml/components/base/OutlinedTextField.qml index 8fe1709e..e8f8e3e8 100644 --- a/qml/components/OutlinedTextField.qml +++ b/qml/components/base/OutlinedTextField.qml @@ -1,6 +1,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 +import ".." Item { id: root diff --git a/qml/components/TSButton.qml b/qml/components/base/TSButton.qml similarity index 98% rename from qml/components/TSButton.qml rename to qml/components/base/TSButton.qml index bda3afa1..089ad3e6 100644 --- a/qml/components/TSButton.qml +++ b/qml/components/base/TSButton.qml @@ -25,7 +25,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Item { id: root diff --git a/qml/components/TSCombobox.qml b/qml/components/base/TSCombobox.qml similarity index 99% rename from qml/components/TSCombobox.qml rename to qml/components/base/TSCombobox.qml index bfd1e8b1..326b1d78 100644 --- a/qml/components/TSCombobox.qml +++ b/qml/components/base/TSCombobox.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.3 +import ".." ComboBox { id: innerCombo diff --git a/qml/components/TSIconButton.qml b/qml/components/base/TSIconButton.qml similarity index 98% rename from qml/components/TSIconButton.qml rename to qml/components/base/TSIconButton.qml index 719627e2..da9672fa 100644 --- a/qml/components/TSIconButton.qml +++ b/qml/components/base/TSIconButton.qml @@ -24,7 +24,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Item { id: root diff --git a/qml/components/TSLabel.qml b/qml/components/base/TSLabel.qml similarity index 98% rename from qml/components/TSLabel.qml rename to qml/components/base/TSLabel.qml index 315db55d..92d0f038 100644 --- a/qml/components/TSLabel.qml +++ b/qml/components/base/TSLabel.qml @@ -1,6 +1,7 @@ // components/ThemedLabel.qml import QtQuick 2.7 import Lomiri.Components 1.3 +import ".." LomiriShape { id: themedLabel diff --git a/qml/components/TSProgressbar.qml b/qml/components/base/TSProgressbar.qml similarity index 98% rename from qml/components/TSProgressbar.qml rename to qml/components/base/TSProgressbar.qml index 5256cc57..8f183a10 100644 --- a/qml/components/TSProgressbar.qml +++ b/qml/components/base/TSProgressbar.qml @@ -1,5 +1,6 @@ import QtQuick 2.7 import Lomiri.Components 1.3 +import ".." Item { id: customProgressBar diff --git a/qml/UbuntuShape.qml b/qml/components/base/UbuntuShape.qml similarity index 100% rename from qml/UbuntuShape.qml rename to qml/components/base/UbuntuShape.qml diff --git a/qml/components/ActivityDetailsCard.qml b/qml/components/cards/ActivityDetailsCard.qml similarity index 98% rename from qml/components/ActivityDetailsCard.qml rename to qml/components/cards/ActivityDetailsCard.qml index 89b6dd2c..7485b21d 100644 --- a/qml/components/ActivityDetailsCard.qml +++ b/qml/components/cards/ActivityDetailsCard.qml @@ -1,7 +1,8 @@ import QtQuick 2.12 import Lomiri.Components 1.3 -import "../../models/utils.js" as Utils -import "../../models/activity.js" as Activity +import "../../../models/utils.js" as Utils +import "../../../models/activity.js" as Activity +import ".." ListItem { id: root @@ -256,7 +257,7 @@ ListItem { width: parent.height / 2 height: parent.height / 2 fillMode: Image.PreserveAspectFit - source: "../images/" + Activity.getActivityIconForType(activity_type_name) + source: "../../images/" + Activity.getActivityIconForType(activity_type_name) anchors.verticalCenter: parent.verticalCenter // anchors.margins: units.gu(2) // anchors.leftMargin: units.gu(3) diff --git a/qml/components/ProjectDetailsCard.qml b/qml/components/cards/ProjectDetailsCard.qml similarity index 96% rename from qml/components/ProjectDetailsCard.qml rename to qml/components/cards/ProjectDetailsCard.qml index e00f47fe..d0f353c1 100644 --- a/qml/components/ProjectDetailsCard.qml +++ b/qml/components/cards/ProjectDetailsCard.qml @@ -24,13 +24,14 @@ import QtQuick 2.12 import QtQuick.Controls 2.2 -import "../../models/constants.js" as AppConst -import "../../models/utils.js" as Utils -import "../../models/timesheet.js" as Timesheet -import "../../models/timer_service.js" as TimerService -import "../../models/project.js" as Project +import "../../../models/constants.js" as AppConst +import "../../../models/utils.js" as Utils +import "../../../models/timesheet.js" as Timesheet +import "../../../models/timer_service.js" as TimerService +import "../../../models/project.js" as Project import Lomiri.Components 1.3 import QtQuick.Layouts 1.1 +import ".." ListItem { id: projectCard @@ -121,7 +122,7 @@ ListItem { }, Action { id: playpauseaction - iconSource: timer_on ? (timer_paused ? "../images/play.png" : "../images/pause.png") : "../images/play.png" + iconSource: timer_on ? (timer_paused ? "../../images/play.png" : "../../images/pause.png") : "../../images/play.png" visible: recordId > 0 text: "Start Timer" onTriggered: { @@ -131,7 +132,7 @@ ListItem { Action { id: startstopaction visible: recordId > 0 - iconSource: "../images/stop.png" + iconSource: "../../images/stop.png" text: i18n.dtr("ubtms", "Stop Timer") onTriggered: { stop_workflow(); @@ -191,7 +192,7 @@ ListItem { anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter anchors.leftMargin: units.gu(0.5) - source: isFavorite ? "../images/star.png" : "../images/star-inactive.png" + source: isFavorite ? "../../images/star.png" : "../../images/star-inactive.png" fillMode: Image.PreserveAspectFit width: units.gu(2) height: units.gu(2) @@ -210,7 +211,7 @@ ListItem { if (result.success) { isFavorite = newFavoriteState; - starIcon.source = isFavorite ? "../images/star.png" : "../images/star-inactive.png"; + starIcon.source = isFavorite ? "../../images/star.png" : "../../images/star-inactive.png"; } else { console.warn("⚠️ Failed to toggle project favorite:", result.message); } diff --git a/qml/components/TasksForDayWidget.qml b/qml/components/cards/TasksForDayWidget.qml similarity index 96% rename from qml/components/TasksForDayWidget.qml rename to qml/components/cards/TasksForDayWidget.qml index 071d9976..966a8323 100644 --- a/qml/components/TasksForDayWidget.qml +++ b/qml/components/cards/TasksForDayWidget.qml @@ -7,9 +7,10 @@ import QtQuick 2.7 import Lomiri.Components 1.3 import QtQuick.Layouts 1.3 import QtQuick.LocalStorage 2.7 as Sql -import "../../models/constants.js" as AppConst -import "../../models/task.js" as Task -import "../../models/utils.js" as Utils +import "../../../models/constants.js" as AppConst +import "../../../models/task.js" as Task +import "../../../models/utils.js" as Utils +import ".." Item { id: todayTasksWidget diff --git a/qml/components/UpdatesDetailsCard.qml b/qml/components/cards/UpdatesDetailsCard.qml similarity index 88% rename from qml/components/UpdatesDetailsCard.qml rename to qml/components/cards/UpdatesDetailsCard.qml index 2a41e98f..481f78ce 100644 --- a/qml/components/UpdatesDetailsCard.qml +++ b/qml/components/cards/UpdatesDetailsCard.qml @@ -8,10 +8,11 @@ import QtQuick 2.12 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import QtQuick.Layouts 1.1 -import "../../models/utils.js" as Utils -import "../../models/constants.js" as AppConst -import "../../models/project.js" as Project -import "../../models/accounts.js" as Accounts +import "../../../models/utils.js" as Utils +import "../../../models/constants.js" as AppConst +import "../../../models/project.js" as Project +import "../../../models/accounts.js" as Accounts +import ".." ListItem { id: updateItem @@ -87,7 +88,7 @@ ListItem { } Rectangle { - height: units.gu(3.5) + height: units.gu(4) width: details_button.width @@ -97,9 +98,15 @@ ListItem { Text { id: statusText - text: status + text: { + if (status === "on_track") return i18n.dtr("ubtms", "On Track"); + if (status === "at_risk") return i18n.dtr("ubtms", "At Risk"); + if (status === "off_track") return i18n.dtr("ubtms", "Off Track"); + if (status === "on_hold") return i18n.dtr("ubtms", "On Hold"); + return status || ""; + } anchors.centerIn: parent - font.pixelSize: units.gu(AppConst.FontSizes.ListHeading) + font.pixelSize: units.gu(AppConst.FontSizes.ListSubHeading) color: "white" } } diff --git a/qml/components/AccountSelectorDialog.qml b/qml/components/dialogs/AccountSelectorDialog.qml similarity index 99% rename from qml/components/AccountSelectorDialog.qml rename to qml/components/dialogs/AccountSelectorDialog.qml index 4478751c..4134c590 100644 --- a/qml/components/AccountSelectorDialog.qml +++ b/qml/components/dialogs/AccountSelectorDialog.qml @@ -9,7 +9,8 @@ import QtQuick 2.7 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts +import ".." Item { id: root diff --git a/qml/components/ColorPicker.qml b/qml/components/dialogs/ColorPicker.qml similarity index 99% rename from qml/components/ColorPicker.qml rename to qml/components/dialogs/ColorPicker.qml index e5f401bd..a0a5cc53 100644 --- a/qml/components/ColorPicker.qml +++ b/qml/components/dialogs/ColorPicker.qml @@ -2,6 +2,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import Lomiri.Components.Popups 1.3 +import ".." Item { id: colorPopupWrapper diff --git a/qml/components/ContentPickerDialog.qml b/qml/components/dialogs/ContentPickerDialog.qml similarity index 99% rename from qml/components/ContentPickerDialog.qml rename to qml/components/dialogs/ContentPickerDialog.qml index 5e1d96e0..82e0e037 100644 --- a/qml/components/ContentPickerDialog.qml +++ b/qml/components/dialogs/ContentPickerDialog.qml @@ -3,6 +3,7 @@ import QtQuick 2.4 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.0 as Popups import Lomiri.Content 1.3 +import ".." Popups.PopupBase { id: picker diff --git a/qml/components/CreateUpdateDialog.qml b/qml/components/dialogs/CreateUpdateDialog.qml similarity index 92% rename from qml/components/CreateUpdateDialog.qml rename to qml/components/dialogs/CreateUpdateDialog.qml index fac484da..cbf76dde 100644 --- a/qml/components/CreateUpdateDialog.qml +++ b/qml/components/dialogs/CreateUpdateDialog.qml @@ -14,10 +14,11 @@ import QtQuick.Controls 2.2 import Lomiri.Components.Popups 1.3 import Lomiri.Components 1.3 import QtQuick.Layouts 1.3 -import "../../models/accounts.js" as Accounts -import "../../models/global.js" as Global -import "../components" as Components -import "richtext" +import "../../../models/accounts.js" as Accounts +import "../../../models/global.js" as Global +import ".." as Components +import "../richtext" +import ".." Item { id: popupWrapper @@ -76,7 +77,12 @@ Item { ComboBox { id: statusSelector width: parent.width - model: popupWrapper.projectUpdateStatus + model: [ + i18n.dtr("ubtms", "On Track"), + i18n.dtr("ubtms", "At Risk"), + i18n.dtr("ubtms", "Off Track"), + i18n.dtr("ubtms", "On Hold") + ] } // Progress Slider @@ -115,7 +121,7 @@ Item { // Access apLayout (global AdaptivePageLayout) and add ReadMorePage // apLayout is the global ID from TSApp.qml if (typeof apLayout !== "undefined" && apLayout) { - apLayout.addPageToNextColumn(popupWrapper.parentPage || createUpdateDialog, Qt.resolvedUrl("../ReadMorePage.qml"), { + apLayout.addPageToNextColumn(popupWrapper.parentPage || createUpdateDialog, Qt.resolvedUrl("../richtext/ReadMorePage.qml"), { isReadOnly: false }); } else { diff --git a/qml/components/SaveDiscardDialog.qml b/qml/components/dialogs/SaveDiscardDialog.qml similarity index 99% rename from qml/components/SaveDiscardDialog.qml rename to qml/components/dialogs/SaveDiscardDialog.qml index a044a090..633e3035 100644 --- a/qml/components/SaveDiscardDialog.qml +++ b/qml/components/dialogs/SaveDiscardDialog.qml @@ -26,6 +26,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components.Popups 1.3 import Lomiri.Components 1.3 +import ".." Item { id: dialogWrapper diff --git a/qml/components/TimePickerPopup.qml b/qml/components/dialogs/TimePickerPopup.qml similarity index 99% rename from qml/components/TimePickerPopup.qml rename to qml/components/dialogs/TimePickerPopup.qml index d5dd9c03..a718dc78 100644 --- a/qml/components/TimePickerPopup.qml +++ b/qml/components/dialogs/TimePickerPopup.qml @@ -24,6 +24,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components.Popups 1.3 +import ".." Item { id: popupWrapper diff --git a/qml/components/InfoBar.qml b/qml/components/feedback/InfoBar.qml similarity index 99% rename from qml/components/InfoBar.qml rename to qml/components/feedback/InfoBar.qml index e4b30977..5aad9ebd 100644 --- a/qml/components/InfoBar.qml +++ b/qml/components/feedback/InfoBar.qml @@ -1,4 +1,5 @@ import QtQuick 2.7 +import ".." Item { id: root diff --git a/qml/components/LoadMoreFooter.qml b/qml/components/feedback/LoadMoreFooter.qml similarity index 99% rename from qml/components/LoadMoreFooter.qml rename to qml/components/feedback/LoadMoreFooter.qml index 79ceb7eb..e56e5e92 100644 --- a/qml/components/LoadMoreFooter.qml +++ b/qml/components/feedback/LoadMoreFooter.qml @@ -24,6 +24,7 @@ import QtQuick 2.7 import Lomiri.Components 1.3 +import ".." /** * LoadMoreFooter - A footer component for infinite scroll ListView diff --git a/qml/components/LoadingIndicator.qml b/qml/components/feedback/LoadingIndicator.qml similarity index 99% rename from qml/components/LoadingIndicator.qml rename to qml/components/feedback/LoadingIndicator.qml index 75ff8204..a73f6eb5 100644 --- a/qml/components/LoadingIndicator.qml +++ b/qml/components/feedback/LoadingIndicator.qml @@ -24,6 +24,7 @@ import QtQuick 2.7 import Lomiri.Components 1.3 +import ".." /** * LoadingIndicator - A reusable loading indicator component diff --git a/qml/components/NotificationBell.qml b/qml/components/feedback/NotificationBell.qml similarity index 98% rename from qml/components/NotificationBell.qml rename to qml/components/feedback/NotificationBell.qml index b7a81c4f..537a39b0 100644 --- a/qml/components/NotificationBell.qml +++ b/qml/components/feedback/NotificationBell.qml @@ -2,9 +2,10 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 as Controls import QtQuick.Layouts 1.3 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst -import "../../models/notifications.js" as Notifications +import "../../../models/constants.js" as AppConst +import "../../../models/notifications.js" as Notifications import Pparent.Notifications 1.0 +import ".." Item { id: bellWidget @@ -587,12 +588,12 @@ Item { source: { var notifType = modelData.type || ""; switch(notifType) { - case "Task": return "../images/task.svg"; - case "Activity": return "../images/activity.svg"; - case "Project": return "../images/project.svg"; - case "ProjectUpdate": return "../images/project.svg"; - case "Timesheet": return "../images/timesheet.svg"; - default: return "../images/notification.png"; + case "Task": return "../../images/task.svg"; + case "Activity": return "../../images/activity.svg"; + case "Project": return "../../images/project.svg"; + case "ProjectUpdate": return "../../images/project.svg"; + case "Timesheet": return "../../images/timesheet.svg"; + default: return "../../images/notification.png"; } } fillMode: Image.PreserveAspectFit @@ -630,12 +631,12 @@ Item { source: { var notifType = modelData.type || ""; switch(notifType) { - case "Task": return "../images/task.svg"; - case "Activity": return "../images/activity.svg"; - case "Project": return "../images/project.svg"; - case "ProjectUpdate": return "../images/project.svg"; - case "Timesheet": return "../images/timesheet.svg"; - default: return "../images/notification.png"; + case "Task": return "../../images/task.svg"; + case "Activity": return "../../images/activity.svg"; + case "Project": return "../../images/project.svg"; + case "ProjectUpdate": return "../../images/project.svg"; + case "Timesheet": return "../../images/timesheet.svg"; + default: return "../../images/notification.png"; } } fillMode: Image.PreserveAspectFit diff --git a/qml/components/NotificationPopup.qml b/qml/components/feedback/NotificationPopup.qml similarity index 99% rename from qml/components/NotificationPopup.qml rename to qml/components/feedback/NotificationPopup.qml index ae0160c1..16b4d70f 100644 --- a/qml/components/NotificationPopup.qml +++ b/qml/components/feedback/NotificationPopup.qml @@ -26,6 +26,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components.Popups 1.3 import Lomiri.Components 1.3 +import ".." Item { id: popupWrapper diff --git a/qml/components/AccountDrawer.qml b/qml/components/navigation/AccountDrawer.qml similarity index 99% rename from qml/components/AccountDrawer.qml rename to qml/components/navigation/AccountDrawer.qml index 1e1eb4c0..5255ccbb 100644 --- a/qml/components/AccountDrawer.qml +++ b/qml/components/navigation/AccountDrawer.qml @@ -3,8 +3,9 @@ import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.11 -import "../../models/accounts.js" as Accounts -import "../../models/utils.js" as Utils +import "../../../models/accounts.js" as Accounts +import "../../../models/utils.js" as Utils +import ".." Item { id: accountDrawer diff --git a/qml/components/DialerMenu.qml b/qml/components/navigation/DialerMenu.qml similarity index 98% rename from qml/components/DialerMenu.qml rename to qml/components/navigation/DialerMenu.qml index beee4c9a..36bdf8bb 100644 --- a/qml/components/DialerMenu.qml +++ b/qml/components/navigation/DialerMenu.qml @@ -27,7 +27,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import QtGraphicalEffects 1.0 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Item { id: dialerMenu diff --git a/qml/components/ListHeader.qml b/qml/components/navigation/ListHeader.qml similarity index 97% rename from qml/components/ListHeader.qml rename to qml/components/navigation/ListHeader.qml index 71c4731b..9b6d5997 100644 --- a/qml/components/ListHeader.qml +++ b/qml/components/navigation/ListHeader.qml @@ -1,11 +1,12 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtGraphicalEffects 1.0 +import ".." Rectangle { id: topFilterBar width: parent ? parent.width : Screen.width - height: showSearchBox ? units.gu(11) : units.gu(6) // Restored height to give proper space + height: (showSearchBox ? units.gu(5) : 0) + (filterModel && filterModel.length > 0 ? units.gu(6) : 0) color: "transparent" // Helper property to check if dark mode is active @@ -207,7 +208,8 @@ Rectangle { // Filter buttons row below search Item { width: parent.width - height: units.gu(6) // Adjusted back + height: topFilterBar.filterModel && topFilterBar.filterModel.length > 0 ? units.gu(6) : 0 + visible: topFilterBar.filterModel && topFilterBar.filterModel.length > 0 Flickable { id: flickable diff --git a/qml/components/NavigationMenuList.qml b/qml/components/navigation/NavigationMenuList.qml similarity index 89% rename from qml/components/NavigationMenuList.qml rename to qml/components/navigation/NavigationMenuList.qml index 5e4bc96b..1da1ed30 100644 --- a/qml/components/NavigationMenuList.qml +++ b/qml/components/navigation/NavigationMenuList.qml @@ -1,6 +1,7 @@ import QtQuick 2.6 import Lomiri.Components 1.3 -import "../features/settings/components" as SettingsComponents +import "../../features/settings/components" as SettingsComponents +import ".." Column { id: root diff --git a/qml/components/CustomDatePicker.qml b/qml/components/pickers/CustomDatePicker.qml similarity index 99% rename from qml/components/CustomDatePicker.qml rename to qml/components/pickers/CustomDatePicker.qml index 9fed5433..46f8f601 100644 --- a/qml/components/CustomDatePicker.qml +++ b/qml/components/pickers/CustomDatePicker.qml @@ -28,7 +28,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import Lomiri.Components.Popups 1.3 import Lomiri.Components.Pickers 1.3 -import "../../models/utils.js" as Utils +import "../../../models/utils.js" as Utils +import ".." Item { id: popupWrapper diff --git a/qml/components/DateRangeSelector.qml b/qml/components/pickers/DateRangeSelector.qml similarity index 77% rename from qml/components/DateRangeSelector.qml rename to qml/components/pickers/DateRangeSelector.qml index 57dfe6e7..3b599923 100644 --- a/qml/components/DateRangeSelector.qml +++ b/qml/components/pickers/DateRangeSelector.qml @@ -3,12 +3,14 @@ import QtQuick.Controls 2.12 import QtQuick.Layouts 1.3 import QtQuick.Dialogs 1.2 import Lomiri.Components.Pickers 1.3 +import ".." Item { id: dateRangeSelector width: parent ? parent.width : units.gu(50) implicitHeight: layout.implicitHeight - property alias labelText: rangeLabel.text + height: layout.implicitHeight + property alias labelText: presetSelector.labelText property date startDate: new Date() property date endDate: new Date() signal rangeChanged(date start, date end) @@ -71,63 +73,37 @@ Item { id: layout width: parent.width - RowLayout { - spacing: units.gu(1.2) + InlineOptionSelector { + id: presetSelector + Layout.fillWidth: true + Layout.preferredHeight: height + labelText: "Date Range" + enabledState: !dateRangeSelector.readOnly + readOnly: dateRangeSelector.readOnly + visible: !dateRangeSelector.readOnly - TSLabel { - id: rangeLabel - text: "Date Range" - } - Item { - Layout.fillWidth: true + modelData: [ + {id: 0, name: i18n.dtr("ubtms", "Today")}, + {id: 1, name: i18n.dtr("ubtms", "This Week")}, + {id: 2, name: i18n.dtr("ubtms", "Next Week")}, + {id: 3, name: i18n.dtr("ubtms", "This Month")}, + {id: 4, name: i18n.dtr("ubtms", "Next Month")} + ] - ComboBox { - id: presetCombo - height: units.gu(5) - width: parent.width / 1.5 - model: ["Today", "This Week", "Next Week", "This Month", "Next Month"] - currentIndex: 1 - visible: !dateRangeSelector.readOnly - background: Rectangle { - color: "transparent" - border.color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#d3d1d1" : "#636161" - border.width: 1 - radius: units.gu ? units.gu(0.5) : units.gu(0.5) - } - contentItem: Text { - text: presetCombo.displayText - color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "white" : "black" - verticalAlignment: Text.AlignVCenter - elide: Text.ElideRight - anchors.verticalCenter: parent.verticalCenter - leftPadding: units.gu ? units.gu(2) : units.gu(1) - } - delegate: ItemDelegate { - width: presetCombo.width - hoverEnabled: true - contentItem: Text { - text: modelData - color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "white" : "black" - leftPadding: units.gu ? units.gu(1) : units.gu(0.5) - elide: Text.ElideRight - } - background: Rectangle { - color: (hovered ? "skyblue" : (theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#444" : "#e2e0da")) - radius: units.gu(0.5) - border.color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#d3d1d1" : "#999" - } - } - onActivated: updateDates() - onAccepted: updateDates() - } + selectedId: 1 // default is "This Week" (id: 1) + + onSelectionMade: { + dateRangeSelector.updateDates(); } } RowLayout { + Layout.fillWidth: true spacing: units.gu(1.2) // Start Date Picker Field ColumnLayout { + Layout.fillWidth: true spacing: units.gu(0.5) TSLabel { text: "Start Date" @@ -138,7 +114,7 @@ Item { Item { id: startDateItem property date date: new Date() - Layout.preferredWidth: units.gu(20) + Layout.fillWidth: true Layout.preferredHeight: units.gu(5) TextField { @@ -171,6 +147,7 @@ Item { // End Date Picker Field ColumnLayout { + Layout.fillWidth: true spacing: units.gu(0.5) TSLabel { text: "End Date" @@ -181,7 +158,7 @@ Item { Item { id: endDateItem property date date: new Date() - Layout.preferredWidth: units.gu(20) + Layout.fillWidth: true Layout.preferredHeight: units.gu(5) TextField { @@ -219,7 +196,7 @@ Item { let newStart = new Date(today); let newEnd = new Date(today); - switch (presetCombo.currentIndex) { + switch (presetSelector.selectedId) { case 0 // Today : break; diff --git a/qml/components/pickers/DaySelector.qml b/qml/components/pickers/DaySelector.qml new file mode 100644 index 00000000..3bba4ca3 --- /dev/null +++ b/qml/components/pickers/DaySelector.qml @@ -0,0 +1,143 @@ +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.3 +import QtQuick.Dialogs 1.2 +import Lomiri.Components.Pickers 1.3 +import ".." + +Item { + id: daySelector + width: parent ? parent.width : 400 + height: dayCombo.height + + property string labelText: "Date" + property date selectedDate: new Date() + property bool readOnly: false + signal dateChanged(date selectedDate) + + function formattedDate() { + return Qt.formatDate(selectedDate, "yyyy-MM-dd"); + } + + function setSelectedDate(val) { + function toDate(input) { + if (input instanceof Date) + return input; + if (typeof input === "string") { + const d = new Date(input); + return !isNaN(d.getTime()) ? d : null; + } + return null; + } + + const parsed = toDate(val); + + if (parsed) { + selectedDate = parsed; + + // Update dayCombo selection + const today = new Date(); + const yesterday = new Date(today); + yesterday.setDate(yesterday.getDate() - 1); + + if (isSameDate(parsed, today)) { + dayCombo.applyDeferredSelection(0, false); + } else if (isSameDate(parsed, yesterday)) { + dayCombo.applyDeferredSelection(1, false); + } else { + dayCombo.applyDeferredSelection(2, false); + } + + updateModelData(); + dateChanged(selectedDate); + } else { + console.warn("❌ Invalid date input for setSelectedDate:", val); + } + } + + function isSameDate(d1, d2) { + return d1.getFullYear() === d2.getFullYear() && + d1.getMonth() === d2.getMonth() && + d1.getDate() === d2.getDate(); + } + + function updateModelData() { + const today = new Date(); + const yesterday = new Date(today); + yesterday.setDate(yesterday.getDate() - 1); + + const todayStr = Qt.formatDate(today, "dd-MM-yyyy"); + const yesterdayStr = Qt.formatDate(yesterday, "dd-MM-yyyy"); + const currentStr = Qt.formatDate(selectedDate, "dd-MM-yyyy"); + + dayCombo.modelData = [ + { id: 0, name: "Today (" + todayStr + ")" }, + { id: 1, name: "Yesterday (" + yesterdayStr + ")" }, + { id: 2, name: "Custom (" + currentStr + ")" } + ]; + } + + function updateDate() { + const today = new Date(); + let newDate = new Date(today); + + switch (dayCombo.selectedId) { + case 0: // Today + break; + case 1: // Yesterday + newDate.setDate(newDate.getDate() - 1); + break; + case 2: // Custom + openCustomDatePicker(); + return; + } + + selectedDate = newDate; + updateModelData(); + dateChanged(selectedDate); + } + + function openCustomDatePicker() { + let result = PickerPanel.openDatePicker(daySelector, "selectedDate", "Years|Months|Days"); + if (result) { + result.closed.connect(() => { + dayCombo.applyDeferredSelection(2, false); + updateModelData(); + dateChanged(selectedDate); + }); + } + } + + InlineOptionSelector { + id: dayCombo + width: parent.width + labelText: daySelector.labelText + selectorType: "date_type" + readOnly: daySelector.readOnly + enabledState: !daySelector.readOnly + + onSelectionMade: function(id, name, selectorType) { + updateDate(); + } + } + + Component.onCompleted: { + const today = new Date(); + const yesterday = new Date(today); + yesterday.setDate(yesterday.getDate() - 1); + + if (!selectedDate || isNaN(selectedDate.getTime())) { + selectedDate = today; + dayCombo.applyDeferredSelection(0, false); + } else { + if (isSameDate(selectedDate, today)) { + dayCombo.applyDeferredSelection(0, false); + } else if (isSameDate(selectedDate, yesterday)) { + dayCombo.applyDeferredSelection(1, false); + } else { + dayCombo.applyDeferredSelection(2, false); + } + } + updateModelData(); + } +} diff --git a/qml/components/QuickDateSelector.qml b/qml/components/pickers/QuickDateSelector.qml similarity index 97% rename from qml/components/QuickDateSelector.qml rename to qml/components/pickers/QuickDateSelector.qml index 4555920b..93686d41 100644 --- a/qml/components/QuickDateSelector.qml +++ b/qml/components/pickers/QuickDateSelector.qml @@ -27,7 +27,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import QtGraphicalEffects 1.0 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." LomiriShape { id: datepicker_tb diff --git a/qml/components/qmldir b/qml/components/qmldir new file mode 100644 index 00000000..a458502c --- /dev/null +++ b/qml/components/qmldir @@ -0,0 +1,57 @@ +AccountDrawer 1.0 navigation/AccountDrawer.qml +AccountSelector 1.0 selectors/AccountSelector.qml +AccountSelectorDialog 1.0 dialogs/AccountSelectorDialog.qml +ActivityDetailsCard 1.0 cards/ActivityDetailsCard.qml +AssigneeFilterMenu 1.0 selectors/AssigneeFilterMenu.qml +AttachmentManager 1.0 workflow/AttachmentManager.qml +BackendBridge 1.0 system/BackendBridge.qml +Bubblemap 1.0 visualization/Bubblemap.qml +ColorPicker 1.0 dialogs/ColorPicker.qml +ContentPickerDialog 1.0 dialogs/ContentPickerDialog.qml +CreateUpdateDialog 1.0 dialogs/CreateUpdateDialog.qml +CreateUpdatePage 1.0 workflow/CreateUpdatePage.qml +CustomDatePicker 1.0 pickers/CustomDatePicker.qml +DateRangeSelector 1.0 pickers/DateRangeSelector.qml +DaySelector 1.0 pickers/DaySelector.qml +DialerMenu 1.0 navigation/DialerMenu.qml +DialogComboSelector 1.0 selectors/DialogComboSelector.qml +EHower 1.0 visualization/EHower.qml +EHowerIndicator 1.0 visualization/EHowerIndicator.qml +FormDraftHandler 1.0 workflow/FormDraftHandler.qml +GlobalTimerWidget 1.0 system/GlobalTimerWidget.qml +ImagePreviewer 1.0 system/ImagePreviewer.qml +InfoBar 1.0 feedback/InfoBar.qml +InlineOptionSelector 1.0 selectors/InlineOptionSelector.qml +ListHeader 1.0 navigation/ListHeader.qml +LoadMoreFooter 1.0 feedback/LoadMoreFooter.qml +LoadingIndicator 1.0 feedback/LoadingIndicator.qml +ModelDownloadTimerWidget 1.0 system/ModelDownloadTimerWidget.qml +MultiAssigneeSelector 1.0 selectors/MultiAssigneeSelector.qml +NavigationMenuList 1.0 navigation/NavigationMenuList.qml +NotificationBell 1.0 feedback/NotificationBell.qml +NotificationPopup 1.0 feedback/NotificationPopup.qml +OptionSelectorPopover 1.0 selectors/OptionSelectorPopover.qml +OutlinedContainer 1.0 base/OutlinedContainer.qml +OutlinedTextField 1.0 base/OutlinedTextField.qml +ProjectDetailsCard 1.0 cards/ProjectDetailsCard.qml +ProjectList 1.0 visualization/ProjectList.qml +ProjectPieChart 1.0 visualization/ProjectPieChart.qml +ProjectSelector 1.0 selectors/ProjectSelector.qml +ProjectStageSelector 1.0 selectors/ProjectStageSelector.qml +QuickDateSelector 1.0 pickers/QuickDateSelector.qml +SaveDiscardDialog 1.0 dialogs/SaveDiscardDialog.qml +SelectionButton 1.0 selectors/SelectionButton.qml +StageFilterMenu 1.0 selectors/StageFilterMenu.qml +StatusSelector 1.0 selectors/StatusSelector.qml +TSButton 1.0 base/TSButton.qml +TSCombobox 1.0 base/TSCombobox.qml +TSIconButton 1.0 base/TSIconButton.qml +TSLabel 1.0 base/TSLabel.qml +TSProgressbar 1.0 base/TSProgressbar.qml +UbuntuShape 1.0 base/UbuntuShape.qml +TasksForDayWidget 1.0 cards/TasksForDayWidget.qml +TimePickerPopup 1.0 dialogs/TimePickerPopup.qml +TreeSelector 1.0 selectors/TreeSelector.qml +UpdatesDetailsCard 1.0 cards/UpdatesDetailsCard.qml +UserSelector 1.0 selectors/UserSelector.qml +WorkItemSelector 1.0 selectors/WorkItemSelector.qml diff --git a/qml/components/richtext/HtmlEditorToolbar.qml b/qml/components/richtext/HtmlEditorToolbar.qml index 08d857cd..0cc2731d 100644 --- a/qml/components/richtext/HtmlEditorToolbar.qml +++ b/qml/components/richtext/HtmlEditorToolbar.qml @@ -62,6 +62,32 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter spacing: units.gu(0.5) + + // Mic / Voice Input + Button { + width: units.gu(5) + height: units.gu(4) + color: (editor && editor.listening) ? LomiriColors.red : (darkMode ? "#555555" : "#F0F0F0") + visible: editor ? editor.isVoiceInputEnabled : false + + Icon { + anchors.centerIn: parent + name: "microphone" + width: units.gu(2) + height: units.gu(2) + opacity: (editor && (editor.listening || editor.processing)) ? 0.5 : 1.0 + } + + onClicked: { + if (editor) { + editor.toggleVoiceRecognition() + } + } + } + + ToolbarSeparator {} + + // Bold Button { width: units.gu(5) diff --git a/qml/ReadMorePage.qml b/qml/components/richtext/ReadMorePage.qml similarity index 55% rename from qml/ReadMorePage.qml rename to qml/components/richtext/ReadMorePage.qml index 3d146995..55c16181 100644 --- a/qml/ReadMorePage.qml +++ b/qml/components/richtext/ReadMorePage.qml @@ -1,8 +1,8 @@ import QtQuick 2.7 import Lomiri.Components 1.3 -import "../models/global.js" as Global -import "components" -import "components/richtext" +import QtQuick.LocalStorage 2.7 as Sql +import "../../../models/global.js" as Global +import "../system" Page { id: readmepage @@ -25,6 +25,115 @@ Page { property string _lastKnownHolder: "" property bool _parentSaveCommitted: false + property bool listening: false + property bool processing: false + property bool ignoreNextResult: false + property string textBeforeRecording: "" + property bool isVoiceInputEnabled: true + property string _partialRecognizedText: "" + property string _currentVoiceStatus: "" + + function checkVoiceInputEnabled() { + try { + var db = Sql.LocalStorage.openDatabaseSync("myDatabase", "1.0", "My Database", 1000000); + var result = true; + db.transaction(function (tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS app_settings (key TEXT PRIMARY KEY, value TEXT)'); + var rs = tx.executeSql('SELECT value FROM app_settings WHERE key = "voice_input_enabled"'); + if (rs.rows.length > 0) { + result = rs.rows.item(0).value === "true"; + } + }); + isVoiceInputEnabled = result; + } catch (e) { + console.warn("Error reading voice_input_enabled:", e); + } + } + + Connections { + target: mainView.backend_bridge + onMessageReceived: { + if (!readmepage.listening && !readmepage.processing) return; + + if (data.event === "voice_recognition_partial") { + var partialText = data.payload + if (partialText) { + readmepage._currentVoiceStatus = i18n.dtr("ubtms", "Listening..."); + + var prefix = ""; + if (readmepage.textBeforeRecording.length > 0) { + var lastChar = readmepage.textBeforeRecording.charAt(readmepage.textBeforeRecording.length - 1); + if (lastChar !== '\n' && lastChar !== '\r') { + prefix = "\n"; + } + } + simpleEditor.text = readmepage.textBeforeRecording + prefix + partialText; + cursorTimer.start(); + } + } else if (data.event === "voice_recognition_status") { + var statusText = data.payload; + if (statusText) { + readmepage._currentVoiceStatus = statusText; + } + } else if (data.event === "voice_recognition_result") { + if (readmepage.ignoreNextResult) { + readmepage.ignoreNextResult = false; + readmepage.listening = false; + readmepage.processing = false; + readmepage._currentVoiceStatus = ""; + readmepage.textBeforeRecording = simpleEditor.text; + cursorTimer.start(); + return; + } + + readmepage.listening = false + readmepage.processing = false + var recognizedText = data.payload + readmepage._currentVoiceStatus = ""; + + if (recognizedText) { + var prefix = ""; + if (readmepage.textBeforeRecording.length > 0) { + var lastChar = readmepage.textBeforeRecording.charAt(readmepage.textBeforeRecording.length - 1); + if (lastChar !== '\n' && lastChar !== '\r') { + prefix = "\n"; + } + } + simpleEditor.text = readmepage.textBeforeRecording + prefix + recognizedText; + readmepage.textBeforeRecording = simpleEditor.text; + cursorTimer.start(); + } + } else if (data.event === "voice_recognition_error") { + readmepage.listening = false + readmepage.processing = false + readmepage._currentVoiceStatus = ""; + readmepage.textBeforeRecording = simpleEditor.text; + if (data.payload && (data.payload.indexOf("Please download one") !== -1 || data.payload.indexOf("No language model") !== -1)) { + if (typeof notifPopup !== "undefined") notifPopup.open(i18n.dtr("ubtms", "Action Required"), data.payload, "warning"); + } else { + if (typeof notifPopup !== "undefined") notifPopup.open(i18n.dtr("ubtms", "Error"), data.payload ? data.payload : "Unknown error", "error"); + } + cursorTimer.start() + } + } + } + + Timer { + id: cursorTimer + interval: 100 + repeat: false + onTriggered: { + if (simpleEditor) { + simpleEditor.cursorPosition = simpleEditor.length; + if (simpleEditor.flickableItem) { + simpleEditor.flickableItem.contentY = Math.max(0, simpleEditor.flickableItem.contentHeight - simpleEditor.flickableItem.height); + } else if (simpleEditor.flickable) { + simpleEditor.flickable.contentY = Math.max(0, simpleEditor.flickable.contentHeight - simpleEditor.flickable.height); + } + } + } + } + header: PageHeader { id: header title: i18n.dtr("ubtms","Description") @@ -37,20 +146,45 @@ Page { dividerColor: LomiriColors.slate } + trailingActionBar.numberOfSlots: 3 trailingActionBar.actions: [ Action { - visible: !isReadOnly && useRichText - iconName: editor.toolbarExpanded ? "view-collapse" : "view-expand" - text: editor.toolbarExpanded ? i18n.dtr("ubtms", "Hide Toolbar") : i18n.dtr("ubtms", "Show Toolbar") + visible: !isReadOnly + iconName: "tick" onTriggered: { - editor.toolbarExpanded = !editor.toolbarExpanded + saveAndClose() } }, Action { - visible: !isReadOnly - iconName: "tick" + visible: !isReadOnly && readmepage.isVoiceInputEnabled && !useRichText + iconName: "microphone" + text: readmepage.listening ? i18n.dtr("ubtms", "Stop Recording") : i18n.dtr("ubtms", "Start Recording") onTriggered: { - saveAndClose() + if (readmepage.listening) { + readmepage.listening = false + readmepage.processing = true + readmepage._currentVoiceStatus = i18n.dtr("ubtms", "Processing..."); + + backend_bridge.call("backend.stop_voice_recognition", []) + return; + } + if (readmepage.processing) return; + + readmepage.textBeforeRecording = simpleEditor.text + readmepage._partialRecognizedText = ""; + readmepage._currentVoiceStatus = i18n.dtr("ubtms", "Starting..."); + + readmepage.listening = true + readmepage.processing = false + backend_bridge.call("backend.run_voice_recognition", []) + } + }, + Action { + visible: !isReadOnly && useRichText && (!readmepage.listening && !readmepage.processing) + iconName: editor.toolbarExpanded ? "view-collapse" : "view-expand" + text: editor.toolbarExpanded ? i18n.dtr("ubtms", "Hide Toolbar") : i18n.dtr("ubtms", "Show Toolbar") + onTriggered: { + editor.toolbarExpanded = !editor.toolbarExpanded } } ] @@ -111,13 +245,28 @@ Page { } function saveAndClose() { + // Auto-stop voice recognition if it's still running + if (readmepage.listening || readmepage.processing) { + readmepage.ignoreNextResult = true; + readmepage.listening = false; + readmepage.processing = false; + readmepage._currentVoiceStatus = ""; + backend_bridge.call("backend.stop_voice_recognition", []); + } + if (useRichText) { + // Finalize voice span in RichTextEditor if needed + if (editor.editor && editor.editor.listening || editor.editor && editor.editor.processing) { + editor.editor.stopAndFinalizeVoice(); + } editor.getText(function (content) { if (commitContent(content)) { closePage(); } }); } else { + // For plain text, textBeforeRecording is already updated + readmepage.textBeforeRecording = simpleEditor.text; if (commitContent(simpleEditor.text)) { closePage(); } @@ -135,8 +284,8 @@ Page { id: editor visible: useRichText text: Global.description_temporary_holder - readOnly: isReadOnly - showToolbar: !isReadOnly + readOnly: isReadOnly || readmepage.listening || readmepage.processing + showToolbar: !isReadOnly && !readmepage.listening && !readmepage.processing anchors.fill: parent onContentChanged: { @@ -167,7 +316,7 @@ Page { id: simpleEditor visible: !useRichText text: Global.description_temporary_holder - readOnly: isReadOnly + readOnly: isReadOnly || readmepage.listening || readmepage.processing textFormat: Text.PlainText font.pixelSize: units.gu(2) wrapMode: TextArea.Wrap @@ -224,6 +373,27 @@ Page { } } + VoiceTimerWidget { + id: voiceTimerWidget + parent: readmepage + + isListening: readmepage.listening + isProcessing: readmepage.processing + partialText: "" // Don't show partial text in the widget anymore + voiceStatus: readmepage._currentVoiceStatus + + onStopClicked: { + readmepage.ignoreNextResult = true; + readmepage.listening = false + readmepage.processing = false + readmepage.textBeforeRecording = simpleEditor.text; + + readmepage._currentVoiceStatus = ""; + + backend_bridge.call("backend.stop_voice_recognition", []) + } + } + // Handle page visibility changes to ensure content is saved onVisibleChanged: { if (!visible && !isReadOnly && !_parentSaveCommitted) { @@ -251,9 +421,15 @@ Page { } } } + + if (!visible && (listening || processing)) { + console.log("[ReadMorePage] visibility changed: Stopping voice recognition...") + mainView.backend_bridge.call("backend.stop_voice_recognition", []) + } } Component.onCompleted: { + checkVoiceInputEnabled(); // Initialize tracking to avoid false external-change detection _lastKnownHolder = Global.description_temporary_holder || ""; @@ -283,5 +459,10 @@ Page { parentDraftHandler.saveDraft(); } } + + if (listening || processing) { + console.log("[ReadMorePage] destruction: Stopping voice recognition...") + mainView.backend_bridge.call("backend.stop_voice_recognition", []) + } } } diff --git a/qml/components/richtext/RichTextEditor.qml b/qml/components/richtext/RichTextEditor.qml index 98716d3e..7abf6956 100644 --- a/qml/components/richtext/RichTextEditor.qml +++ b/qml/components/richtext/RichTextEditor.qml @@ -19,6 +19,8 @@ import QtQuick 2.7 import QtQuick.Window 2.2 import Lomiri.Components 1.3 import QtWebEngine 1.5 +import QtQuick.LocalStorage 2.7 as Sql +import "../system" import "js/html-sanitizer.js" as HtmlSanitizer Item { @@ -65,6 +67,228 @@ Item { /** Emitted when editor has finished loading */ signal contentLoaded() + // ============ VOICE RECOGNITION ============ + + /** Whether the editor is currently listening for voice input */ + property bool listening: false + + /** Whether the editor is processing voice input */ + property bool processing: false + + /** Ignore the final result from the backend if stop was explicitly clicked */ + property bool ignoreNextVoiceResult: false + + /** Partial voice recognition text (for UI feedback) */ + property string _partialVoiceText: "" + property string _currentVoiceStatus: "" + + /** Whether voice input is enabled globally */ + property bool isVoiceInputEnabled: true + + function checkVoiceInputEnabled() { + try { + var db = Sql.LocalStorage.openDatabaseSync("myDatabase", "1.0", "My Database", 1000000); + var result = true; + db.transaction(function (tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS app_settings (key TEXT PRIMARY KEY, value TEXT)'); + var rs = tx.executeSql('SELECT value FROM app_settings WHERE key = "voice_input_enabled"'); + if (rs.rows.length > 0) { + result = rs.rows.item(0).value === "true"; + } + }); + isVoiceInputEnabled = result; + } catch (e) { + console.warn("Error reading voice_input_enabled:", e); + } + } + + Component.onCompleted: { + checkVoiceInputEnabled() + } + + Connections { + target: mainView.backend_bridge + onMessageReceived: { + if (data.event === "voice_recognition_partial") { + // Only handle voice events if this instance is active + if (!listening && !processing) return; + + var partialText = data.payload + if (partialText) { + editor._currentVoiceStatus = "Listening..."; + var script = " + var el = document.getElementById('voice-live-transcription'); + if (el) { + el.innerText = ' ' + " + JSON.stringify(partialText) + "; + } + "; + wv.runJavaScript(script); + } + } else if (data.event === "voice_recognition_result") { + if (editor.ignoreNextVoiceResult) { + editor.ignoreNextVoiceResult = false; + editor.listening = false; + editor.processing = false; + editor._currentVoiceStatus = ""; + + var finalScript = " + var el = document.getElementById('voice-live-transcription'); + if (el) { + var txt = el.innerText.trim(); + var parent = el.parentNode; + if (txt) { + var textNode = document.createTextNode(txt); + parent.replaceChild(textNode, el); + } else { + parent.parentNode.removeChild(parent); + } + } + document.body.contentEditable = " + (!readOnly).toString() + "; + "; + wv.runJavaScript(finalScript); + editor.syncContent(); + return; + } + + editor.listening = false + editor.processing = false + var recognizedText = data.payload + console.log("[RichTextEditor] Received recognition result: " + recognizedText) + + editor._currentVoiceStatus = ""; + + var jsCode = " + var el = document.getElementById('voice-live-transcription'); + var finalTxt = " + JSON.stringify(recognizedText) + "; + if (el) { + var parent = el.parentNode; + if (finalTxt && finalTxt.trim()) { + var textNode = document.createTextNode(finalTxt); + parent.replaceChild(textNode, el); + } else { + parent.parentNode.removeChild(parent); + } + } + document.body.contentEditable = " + (!readOnly).toString() + "; + "; + wv.runJavaScript(jsCode); + + // Force a sync to update the 'text' property and emit contentChanged + editor.syncContent(); + } else if (data.event === "voice_recognition_status") { + if (!listening && !processing) return; + var statusText = data.payload; + if (statusText) { + editor._currentVoiceStatus = statusText; + } + } else if (data.event === "voice_recognition_error") { + editor.listening = false + editor.processing = false + editor._partialVoiceText = ""; + editor._currentVoiceStatus = ""; + console.log("[RichTextEditor] Voice recognition error: " + data.payload) + if (data.payload.indexOf("Please download one") !== -1 || data.payload.indexOf("No language model") !== -1) { + if (typeof notifPopup !== "undefined") notifPopup.open(i18n.dtr("ubtms", "Action Required"), data.payload, "warning"); + } else { + if (typeof notifPopup !== "undefined") notifPopup.open(i18n.dtr("ubtms", "Error"), data.payload, "error"); + } + + wv.runJavaScript("document.body.contentEditable = " + (!readOnly).toString() + ";"); + } + } + } + + Component.onDestruction: { + if (listening || processing) { + console.log("[RichTextEditor] destruction: Stopping voice recognition...") + stopAndFinalizeVoice(); + } + } + + /** + * Stop voice recognition and finalize any in-progress transcription. + * Replaces the live transcription span with its text content so it + * persists correctly in the saved HTML. Call this before saving. + */ + function stopAndFinalizeVoice(callback) { + ignoreNextVoiceResult = true; + listening = false; + processing = false; + _currentVoiceStatus = ""; + + wv.runJavaScript(" + var el = document.getElementById('voice-live-transcription'); + if (el) { + var txt = el.innerText.trim(); + var parent = el.parentNode; + if (txt) { + var textNode = document.createTextNode(txt); + parent.replaceChild(textNode, el); + } else { + parent.parentNode.removeChild(parent); + } + } + document.body.contentEditable = " + (!readOnly).toString() + "; + "); + + mainView.backend_bridge.call("backend.stop_voice_recognition", []); + + // Sync content so the finalized text is captured + syncContent(); + + if (callback && typeof callback === 'function') { + callback(); + } + } + + /** Toggle voice recognition state */ + function toggleVoiceRecognition() { + if (listening) { + console.log("[RichTextEditor] Stopping voice recognition...") + listening = false + processing = true + editor._currentVoiceStatus = "Processing..." + mainView.backend_bridge.call("backend.stop_voice_recognition", []) + } else { + if (processing) return; + console.log("[RichTextEditor] Starting voice recognition...") + listening = true + processing = false + _partialVoiceText = "" + editor._currentVoiceStatus = "Starting..." + + wv.runJavaScript(" + if (window.editor) { + // Clean up any stale span from a previous session + var oldEl = document.getElementById('voice-live-transcription'); + if (oldEl) { + var txt = oldEl.innerText.trim(); + var oldParent = oldEl.parentNode; + if (txt) { + var tn = document.createTextNode(txt); + oldParent.replaceChild(tn, oldEl); + } else { + oldParent.parentNode.removeChild(oldParent); + } + } + + var el = document.createElement('span'); + el.id = 'voice-live-transcription'; + el.innerText = ' '; + + var wrapper = document.createElement('div'); + wrapper.appendChild(el); + document.body.appendChild(wrapper); + + document.body.contentEditable = false; + el.scrollIntoView({behavior: 'smooth', block: 'nearest'}); + } + "); + + mainView.backend_bridge.call("backend.run_voice_recognition", []) + } + } + // ============ PRIVATE PROPERTIES ============ property bool _isLoaded: false @@ -639,4 +863,20 @@ Item { } } } + + VoiceTimerWidget { + id: voiceTimerWidget + parent: mainView + anchors.bottomMargin: editor._oskHeight + units.gu(1) + + isListening: editor.listening + isProcessing: editor.processing + partialText: "" // Don't show partial text in the widget anymore + voiceStatus: editor._currentVoiceStatus + + onStopClicked: { + console.log("[RichTextEditor] Stopping voice recognition from widget...") + editor.stopAndFinalizeVoice(); + } + } } diff --git a/qml/components/richtext/RichTextPreview.qml b/qml/components/richtext/RichTextPreview.qml index 10a1cc80..08d42318 100644 --- a/qml/components/richtext/RichTextPreview.qml +++ b/qml/components/richtext/RichTextPreview.qml @@ -1,7 +1,9 @@ import QtQuick 2.7 import Lomiri.Components 1.3 +import QtQuick.LocalStorage 2.7 as Sql import "js/html-sanitizer.js" as HtmlSanitizer import "../../../models/global.js" as Global +import "../system" Rectangle { id: root @@ -20,6 +22,152 @@ Rectangle { * without manual save. */ property bool liveSyncActive: false + property bool listening: false + property bool processing: false + property bool ignoreNextResult: false + + Component.onDestruction: { + if (listening || processing) { + console.log("[RichTextPreview] destruction: Stopping voice recognition...") + ignoreNextResult = true; + listening = false; + processing = false; + _currentVoiceStatus = ""; + textBeforeRecording = root.text; + _syncVoiceResult(); + backend_bridge.call("backend.stop_voice_recognition", []) + } + } + property string textBeforeRecording: "" + property bool isVoiceInputEnabled: true + + // This is used to sync the voice input with the parent form's draft handler + function _syncVoiceResult() { + var currentContent = root.text; + originalHtmlContent = currentContent; + root.contentChanged(currentContent); + if (root.liveSyncActive) { + Global.description_temporary_holder = currentContent; + root._lastSyncedContent = currentContent; + } + } + + function checkVoiceInputEnabled() { + try { + var db = Sql.LocalStorage.openDatabaseSync("myDatabase", "1.0", "My Database", 1000000); + var result = true; + db.transaction(function (tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS app_settings (key TEXT PRIMARY KEY, value TEXT)'); + var rs = tx.executeSql('SELECT value FROM app_settings WHERE key = "voice_input_enabled"'); + if (rs.rows.length > 0) { + result = rs.rows.item(0).value === "true"; + } + }); + isVoiceInputEnabled = result; + } catch (e) { + console.warn("Error reading voice_input_enabled:", e); + } + } + + Component.onCompleted: { + checkVoiceInputEnabled() + } + property string _partialRecognizedText: "" + property string _currentVoiceStatus: "" + + Connections { + target: mainView.backend_bridge + onMessageReceived: { + // Only handle voice events if this instance is the one listening + if (!root.listening && !root.processing) return; + + // data is the object sent from Python via bus.send() + if (data.event === "voice_recognition_partial") { + var partialText = data.payload + if (partialText) { + root._currentVoiceStatus = i18n.dtr("ubtms", "Listening..."); + + var prefix = ""; + if (root.textBeforeRecording.length > 0) { + var lastChar = root.textBeforeRecording.charAt(root.textBeforeRecording.length - 1); + if (lastChar !== '\n' && lastChar !== '\r') { + prefix = "\n"; + } + } + root._settingContent = true; + root.text = root.textBeforeRecording + prefix + partialText; + // Force update originalHtmlContent so draft listeners get the live text + // without waiting for the mic to stop. + root.originalHtmlContent = root.text; + root._settingContent = false; + + // Keep cursor at end and scroll to bottom immediately + previewText.cursorPosition = previewText.length; + if (previewText.flickableItem) { + previewText.flickableItem.contentY = Math.max(0, previewText.flickableItem.contentHeight - previewText.flickableItem.height); + } else if (previewText.flickable) { + previewText.flickable.contentY = Math.max(0, previewText.flickable.contentHeight - previewText.flickable.height); + } + } + } else if (data.event === "voice_recognition_status") { + var statusText = data.payload; + if (statusText) { + root._currentVoiceStatus = statusText; + } + } else if (data.event === "voice_recognition_result") { + if (root.ignoreNextResult) { + root.ignoreNextResult = false; + root.listening = false; + root.processing = false; + root._currentVoiceStatus = ""; + root.textBeforeRecording = root.text; + root._syncVoiceResult(); + cursorTimer.start(); + return; + } + + root.listening = false + root.processing = false + var recognizedText = data.payload + console.log("[RichTextPreview] Received recognition result: " + recognizedText) + + root._currentVoiceStatus = ""; + + if (recognizedText) { + var prefix = ""; + if (root.textBeforeRecording.length > 0) { + var lastChar = root.textBeforeRecording.charAt(root.textBeforeRecording.length - 1); + if (lastChar !== '\n' && lastChar !== '\r') { + prefix = "\n"; + } + } + root._settingContent = true; + root.text = root.textBeforeRecording + prefix + recognizedText; + root._settingContent = false; + root.textBeforeRecording = root.text; + root._syncVoiceResult(); + cursorTimer.start(); + } else { + root.textBeforeRecording = root.text; + root._syncVoiceResult(); + cursorTimer.start(); + } + } else if (data.event === "voice_recognition_error") { + root.listening = false + root.processing = false + root._currentVoiceStatus = ""; + root.textBeforeRecording = root.text; + root._syncVoiceResult(); + console.log("[RichTextPreview] Voice recognition error: " + data.payload) + if (data.payload.indexOf("Please download one") !== -1 || data.payload.indexOf("No language model") !== -1) { + if (typeof notifPopup !== "undefined") notifPopup.open(i18n.dtr("ubtms", "Action Required"), data.payload, "warning"); + } else { + if (typeof notifPopup !== "undefined") notifPopup.open(i18n.dtr("ubtms", "Error"), data.payload, "error"); + } + cursorTimer.start() + } + } + } // Internal: tracks last synced content to detect external changes property string _lastSyncedContent: "" @@ -190,6 +338,39 @@ Rectangle { } } + Timer { + id: cursorTimer + interval: 100 + repeat: false + onTriggered: { + if (previewText) { + previewText.cursorPosition = previewText.length; + + if (previewText.flickableItem) { + previewText.flickableItem.contentY = Math.max(0, previewText.flickableItem.contentHeight - previewText.flickableItem.height); + } else if (previewText.flickable) { + previewText.flickable.contentY = Math.max(0, previewText.flickable.contentHeight - previewText.flickable.height); + } + } + } + } + + // Separate timer for scrolling during voice input - only scrolls, doesn't move cursor + Timer { + id: scrollToBottomTimer + interval: 50 + repeat: false + onTriggered: { + if (previewText) { + if (previewText.flickableItem) { + previewText.flickableItem.contentY = Math.max(0, previewText.flickableItem.contentHeight - previewText.flickableItem.height); + } else if (previewText.flickable) { + previewText.flickable.contentY = Math.max(0, previewText.flickable.contentHeight - previewText.flickable.height); + } + } + } + } + Column { id: column width: parent.width @@ -215,13 +396,14 @@ Rectangle { id: previewText textFormat: useRichText ? Text.RichText : Text.PlainText - readOnly: is_read_only + readOnly: is_read_only || root.listening || root.processing color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "white" : "black" wrapMode: Text.WordWrap font.pixelSize: units.gu(2) width: parent.width - units.gu(2) anchors.horizontalCenter: parent.horizontalCenter + height: parent.height // Update originalHtmlContent when user types onTextChanged: { @@ -259,37 +441,90 @@ Rectangle { // z: -1 } - Item { + Row { id: floatingActionButton - width: units.gu(3) - height: units.gu(3) + // width: units.gu(3) + // height: units.gu(3) anchors.right: parent.right anchors.bottom: parent.bottom anchors.rightMargin: units.gu(1) anchors.bottomMargin: units.gu(1) + spacing: units.gu(1) z: 10 visible: true Rectangle { + id: voiceButton + visible: root.isVoiceInputEnabled + width: units.gu(3) + height: units.gu(3) + radius: units.gu(.5) + color: root.listening ? LomiriColors.red : LomiriColors.orange + + Icon { + id: voiceIcon + // source: "../../images/mic.svg" + name: "microphone" + width: units.gu(1.5) + height: units.gu(1.5) + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + opacity: (root.listening || root.processing) ? 0.5 : 1.0 + color: "white" + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + if (root.listening) { + console.log("[RichTextPreview] Stopping voice recognition...") + root.listening = false + root.processing = true + root._currentVoiceStatus = i18n.dtr("ubtms", "Processing..."); + + backend_bridge.call("backend.stop_voice_recognition", []) + return; + } + if (root.processing) return; // Prevent double trigger + + console.log("[RichTextPreview] Voice recognition started") + root.textBeforeRecording = root.text + + root._partialRecognizedText = ""; + root._currentVoiceStatus = i18n.dtr("ubtms", "Starting..."); + + root.listening = true + root.processing = false + backend_bridge.call("backend.run_voice_recognition", []) + } + } + } + Rectangle { + id: expansionButton + width: units.gu(3) + height: units.gu(3) radius: units.gu(.5) - color: LomiriColors.orange - anchors.fill: parent + color: (root.listening || root.processing) ? LomiriColors.ash : LomiriColors.orange + opacity: (root.listening || root.processing) ? 0.5 : 1.0 + Image { id: expansionIcon - source: "../../images/expansion.png" width: units.gu(1.5) height: units.gu(1.5) - // anchors.right: parent.right - // anchors.rightMargin: units.gu(2) anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter + } - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: root.clicked() + MouseArea { + anchors.fill: parent + // cursorShape: Qt.PointingHandCursor + onClicked: { + if (!root.listening && !root.processing) { + root.clicked() + } } } } @@ -298,4 +533,23 @@ Rectangle { } } } + + VoiceTimerWidget { + id: voiceTimerWidget + parent: mainView + + isListening: root.listening + isProcessing: root.processing + partialText: "" // Don't show partial text in the widget anymore + voiceStatus: root._currentVoiceStatus + + onStopClicked: { + console.log("[RichTextPreview] Stopping voice recognition from widget...") + root.listening = false + root.processing = true + root._currentVoiceStatus = i18n.dtr("ubtms", "Processing..."); + + backend_bridge.call("backend.stop_voice_recognition", []) + } + } } diff --git a/qml/components/richtext/js/editor.html b/qml/components/richtext/js/editor.html index 16d8916b..506d1974 100644 --- a/qml/components/richtext/js/editor.html +++ b/qml/components/richtext/js/editor.html @@ -1,12 +1,16 @@ + Rich Text Editor + + + - + - + + \ No newline at end of file diff --git a/qml/components/AccountSelector.qml b/qml/components/selectors/AccountSelector.qml similarity index 99% rename from qml/components/AccountSelector.qml rename to qml/components/selectors/AccountSelector.qml index dc979b69..2252e70f 100644 --- a/qml/components/AccountSelector.qml +++ b/qml/components/selectors/AccountSelector.qml @@ -1,6 +1,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts +import ".." ComboBox { id: instanceCombo diff --git a/qml/components/AssigneeFilterMenu.qml b/qml/components/selectors/AssigneeFilterMenu.qml similarity index 99% rename from qml/components/AssigneeFilterMenu.qml rename to qml/components/selectors/AssigneeFilterMenu.qml index 037aa50a..faa6e908 100644 --- a/qml/components/AssigneeFilterMenu.qml +++ b/qml/components/selectors/AssigneeFilterMenu.qml @@ -27,7 +27,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import QtGraphicalEffects 1.0 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Item { id: assigneeFilterMenu diff --git a/qml/components/DialogComboSelector.qml b/qml/components/selectors/DialogComboSelector.qml similarity index 99% rename from qml/components/DialogComboSelector.qml rename to qml/components/selectors/DialogComboSelector.qml index 53583a65..84636613 100644 --- a/qml/components/DialogComboSelector.qml +++ b/qml/components/selectors/DialogComboSelector.qml @@ -2,6 +2,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 +import ".." Item { id: dialogWrapper diff --git a/qml/components/InlineOptionSelector.qml b/qml/components/selectors/InlineOptionSelector.qml similarity index 99% rename from qml/components/InlineOptionSelector.qml rename to qml/components/selectors/InlineOptionSelector.qml index 9755f18c..38d3b5e9 100644 --- a/qml/components/InlineOptionSelector.qml +++ b/qml/components/selectors/InlineOptionSelector.qml @@ -1,7 +1,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." /** * InlineOptionSelector - Displays options directly on the page without popup diff --git a/qml/components/MultiAssigneeSelector.qml b/qml/components/selectors/MultiAssigneeSelector.qml similarity index 99% rename from qml/components/MultiAssigneeSelector.qml rename to qml/components/selectors/MultiAssigneeSelector.qml index 631b312a..b074cea1 100644 --- a/qml/components/MultiAssigneeSelector.qml +++ b/qml/components/selectors/MultiAssigneeSelector.qml @@ -26,7 +26,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.3 import Lomiri.Components 1.3 -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts +import ".." Item { id: multiAssigneeSelector diff --git a/qml/components/OptionSelectorPopover.qml b/qml/components/selectors/OptionSelectorPopover.qml similarity index 97% rename from qml/components/OptionSelectorPopover.qml rename to qml/components/selectors/OptionSelectorPopover.qml index 1d2b7a86..ba11d713 100644 --- a/qml/components/OptionSelectorPopover.qml +++ b/qml/components/selectors/OptionSelectorPopover.qml @@ -2,7 +2,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." /** * OptionSelectorPopover - Direct list selection without intermediate ComboBox diff --git a/qml/components/ProjectSelector.qml b/qml/components/selectors/ProjectSelector.qml similarity index 98% rename from qml/components/ProjectSelector.qml rename to qml/components/selectors/ProjectSelector.qml index 56c6a587..8843d8db 100644 --- a/qml/components/ProjectSelector.qml +++ b/qml/components/selectors/ProjectSelector.qml @@ -8,8 +8,9 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 -import "../../models/project.js" as Project -import "../../models/accounts.js" as Accounts +import "../../../models/project.js" as Project +import "../../../models/accounts.js" as Accounts +import ".." Item { id: root diff --git a/qml/components/ProjectStageSelector.qml b/qml/components/selectors/ProjectStageSelector.qml similarity index 99% rename from qml/components/ProjectStageSelector.qml rename to qml/components/selectors/ProjectStageSelector.qml index a12fe1eb..e7004e05 100644 --- a/qml/components/ProjectStageSelector.qml +++ b/qml/components/selectors/ProjectStageSelector.qml @@ -26,7 +26,8 @@ import QtQuick 2.12 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 -import "../../models/project.js" as Project +import "../../../models/project.js" as Project +import ".." /** * ProjectStageSelector - A popup dialog for selecting and changing project stages diff --git a/qml/components/SelectionButton.qml b/qml/components/selectors/SelectionButton.qml similarity index 97% rename from qml/components/SelectionButton.qml rename to qml/components/selectors/SelectionButton.qml index 30f1bdf1..9426aa01 100644 --- a/qml/components/SelectionButton.qml +++ b/qml/components/selectors/SelectionButton.qml @@ -1,7 +1,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." /** * SelectionButton - Inline option selector wrapper diff --git a/qml/components/StageFilterMenu.qml b/qml/components/selectors/StageFilterMenu.qml similarity index 99% rename from qml/components/StageFilterMenu.qml rename to qml/components/selectors/StageFilterMenu.qml index 779941f6..25dc223a 100644 --- a/qml/components/StageFilterMenu.qml +++ b/qml/components/selectors/StageFilterMenu.qml @@ -27,7 +27,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import QtGraphicalEffects 1.0 import Lomiri.Components 1.3 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Item { id: stageFilterMenu diff --git a/qml/components/StatusSelector.qml b/qml/components/selectors/StatusSelector.qml similarity index 99% rename from qml/components/StatusSelector.qml rename to qml/components/selectors/StatusSelector.qml index c871ee7b..a37be96d 100644 --- a/qml/components/StatusSelector.qml +++ b/qml/components/selectors/StatusSelector.qml @@ -7,6 +7,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 +import ".." Item { id: root diff --git a/qml/components/TreeSelector.qml b/qml/components/selectors/TreeSelector.qml similarity index 99% rename from qml/components/TreeSelector.qml rename to qml/components/selectors/TreeSelector.qml index bf9bda20..4a0fcf4d 100644 --- a/qml/components/TreeSelector.qml +++ b/qml/components/selectors/TreeSelector.qml @@ -2,6 +2,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.3 import Lomiri.Components 1.3 +import ".." Item { id: treeSelector diff --git a/qml/components/UserSelector.qml b/qml/components/selectors/UserSelector.qml similarity index 98% rename from qml/components/UserSelector.qml rename to qml/components/selectors/UserSelector.qml index f567163a..633fc052 100644 --- a/qml/components/UserSelector.qml +++ b/qml/components/selectors/UserSelector.qml @@ -24,7 +24,8 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts +import ".." ComboBox { id: userCombo diff --git a/qml/components/WorkItemSelector.qml b/qml/components/selectors/WorkItemSelector.qml similarity index 99% rename from qml/components/WorkItemSelector.qml rename to qml/components/selectors/WorkItemSelector.qml index 73baa77e..5863b86a 100644 --- a/qml/components/WorkItemSelector.qml +++ b/qml/components/selectors/WorkItemSelector.qml @@ -1,10 +1,11 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/accounts.js" as Accounts -import "../../models/project.js" as Project -import "../../models/task.js" as Task +import "../../../models/accounts.js" as Accounts +import "../../../models/project.js" as Project +import "../../../models/task.js" as Task import QtQml 2.7 +import ".." Rectangle { id: workItemSelector diff --git a/qml/components/BackendBridge.qml b/qml/components/system/BackendBridge.qml similarity index 93% rename from qml/components/BackendBridge.qml rename to qml/components/system/BackendBridge.qml index 214c5314..8337d06a 100644 --- a/qml/components/BackendBridge.qml +++ b/qml/components/system/BackendBridge.qml @@ -26,13 +26,14 @@ import QtQuick 2.7 import io.thp.pyotherside 1.4 +import ".." Item { id: bridge // --- Configuration --- - // Path where Python modules live. Default points to ../../src/ - property url pythonImportPath: Qt.resolvedUrl("../../src/") + // Path where Python modules live. + property url pythonImportPath: Qt.resolvedUrl("../../../src/") // True once the Python module is imported and ready property bool ready: false @@ -82,6 +83,7 @@ Item { // Forward Python errors to QML onError: function (traceback) { + console.error("PyOtherSide error:", traceback); bridge.pythonError(traceback); } diff --git a/qml/components/GlobalTimerWidget.qml b/qml/components/system/GlobalTimerWidget.qml similarity index 97% rename from qml/components/GlobalTimerWidget.qml rename to qml/components/system/GlobalTimerWidget.qml index b81775f2..b63199ce 100644 --- a/qml/components/GlobalTimerWidget.qml +++ b/qml/components/system/GlobalTimerWidget.qml @@ -1,8 +1,10 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import "../../models/timer_service.js" as TimerService -import "../../models/utils.js" as Utils +import "../../../models/timer_service.js" as TimerService +import "../../../models/utils.js" as Utils +import "../../features/timesheets/components" as TimesheetComponents +import ".." Rectangle { id: globalTimer @@ -215,10 +217,10 @@ Rectangle { // Emit paused/resumed signals if (currentlyPaused && !globalTimer.previousPausedState) { globalTimer.timerPaused(); - pausebutton.source = "../images/play.png"; + pausebutton.source = "../../images/play.png"; } else if (!currentlyPaused && globalTimer.previousPausedState) { globalTimer.timerResumed(); - pausebutton.source = "../images/pause.png"; + pausebutton.source = "../../images/pause.png"; } // Update previous states @@ -313,7 +315,7 @@ Rectangle { anchors.margins: units.gu(1) width: units.gu(5) height: units.gu(5) - source: "../images/pause.png" + source: "../../images/pause.png" fillMode: Image.PreserveAspectFit visible: !isSyncing || TimerService.isRunning() @@ -342,7 +344,7 @@ Rectangle { anchors.margins: units.gu(1) width: units.gu(5) height: units.gu(5) - source: "../images/stop.png" + source: "../../images/stop.png" fillMode: Image.PreserveAspectFit visible: !isSyncing || TimerService.isRunning() @@ -472,7 +474,7 @@ Rectangle { property var showNotification: null // Description popup for when timer is stopped - TimeSheetDescriptionPopup { + TimesheetComponents.TimeSheetDescriptionPopup { id: descriptionPopup onSaved: function (description, status) { diff --git a/qml/components/ImagePreviewer.qml b/qml/components/system/ImagePreviewer.qml similarity index 98% rename from qml/components/ImagePreviewer.qml rename to qml/components/system/ImagePreviewer.qml index 6bb30c84..90dc19c3 100644 --- a/qml/components/ImagePreviewer.qml +++ b/qml/components/system/ImagePreviewer.qml @@ -6,9 +6,10 @@ import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import Lomiri.Content 1.3 import io.thp.pyotherside 1.4 +import ".." // DB helpers -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts // --- Fullscreen Image Previewer (Download → Open in…) --- Rectangle { @@ -45,7 +46,7 @@ Rectangle { Python { id: python Component.onCompleted: { - addImportPath(Qt.resolvedUrl("../src/")); + addImportPath(Qt.resolvedUrl("../../../src/")); importModule("backend", function () { console.log("[ImagePreviewer] backend imported"); }); } onError: function (name, msg, tb) { console.error("[ImagePreviewer][py] " + name + ": " + msg + "\n" + tb); } diff --git a/qml/components/system/ModelDownloadTimerWidget.qml b/qml/components/system/ModelDownloadTimerWidget.qml new file mode 100644 index 00000000..a570910d --- /dev/null +++ b/qml/components/system/ModelDownloadTimerWidget.qml @@ -0,0 +1,63 @@ +import QtQuick 2.7 +import Lomiri.Components 1.3 + +GlobalTimerWidget { + id: downloadWidget + + // Override completion logic to connect to our specific download events + Component.onCompleted: { + var root = downloadWidget; + while (root.parent) { + root = root.parent; + if (root.backend_bridge) { + backendBridge = root.backend_bridge; + // Connect our specialized handler for download-specific events + backendBridge.messageReceived.connect(handleDownloadEvent); + break; + } + } + } + + // Specialized handler for voice model downloads + function handleDownloadEvent(data) { + if (!data || !data.event || !isSyncing) + return; + + // This widget only handles download_* events + switch(data.event) { + case "download_progress": + syncProgress = data.payload / 100.0; + break; + case "download_message": + syncStatusMessage = data.payload; + break; + case "download_completed": + completeSyncSuccessfully(); + break; + case "download_error": + failSync(data.payload); + break; + } + } + + // Custom naming logic for downloads (overriding conceptual logic) + function updateSyncMessage() { + if (!isSyncing) + return; + + var progressPercent = Math.round(syncProgress * 100); + + if (progressPercent < 15) { + syncStatusMessage = i18n.dtr("ubtms", "Initializing download..."); + } else if (progressPercent < 80) { + syncStatusMessage = i18n.dtr("ubtms", "Downloading model files..."); + } else if (progressPercent < 95) { + syncStatusMessage = i18n.dtr("ubtms", "Extracting and installing..."); + } else { + syncStatusMessage = i18n.dtr("ubtms", "Installation complete!"); + } + } + + // Ensure naming logic runs when progress changes + onSyncProgressChanged: updateSyncMessage() +} diff --git a/qml/components/system/VoiceTimerWidget.qml b/qml/components/system/VoiceTimerWidget.qml new file mode 100644 index 00000000..f3db7fec --- /dev/null +++ b/qml/components/system/VoiceTimerWidget.qml @@ -0,0 +1,123 @@ +import QtQuick 2.7 +import Lomiri.Components 1.3 + +Rectangle { + id: voiceTimerWidget + + // Properties to control the widget state + property bool isListening: false + property bool isProcessing: false + property string partialText: "" + property string voiceStatus: "" + + // Signal emitted when the user clicks the stop button + signal stopClicked() + + width: units.gu(47) + height: units.gu(8) + color: "#2d2d2d" + radius: units.gu(1) + + // Default positioning logic that can be overridden by instantiators + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottomMargin: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height + units.gu(1) : units.gu(1) + z: 999 + + visible: isListening || isProcessing + + Rectangle { + id: indicator + width: units.gu(1.5) + height: units.gu(1.5) + radius: units.gu(.75) + color: voiceTimerWidget.isProcessing ? "#ffa500" : "#0078d4" + anchors.left: parent.left + anchors.margins: units.gu(2) + anchors.verticalCenter: parent.verticalCenter + + SequentialAnimation on opacity { + loops: Animation.Infinite + running: voiceTimerWidget.visible + NumberAnimation { from: 0.3; to: 1; duration: 800; easing.type: Easing.InOutQuad } + NumberAnimation { from: 1; to: 0.3; duration: 800; easing.type: Easing.InOutQuad } + } + } + + Flickable { + id: textFlickable + anchors.left: indicator.right + anchors.leftMargin: units.gu(1) + anchors.right: stopbutton.left + anchors.rightMargin: units.gu(1) + anchors.verticalCenter: parent.verticalCenter + height: units.gu(4) + contentWidth: voiceLabel.paintedWidth + contentHeight: height + clip: true + interactive: false + + Label { + id: voiceLabel + text: voiceTimerWidget.voiceStatus + (voiceTimerWidget.partialText ? " - " + voiceTimerWidget.partialText : "") + color: "white" + font.pixelSize: units.gu(2) + anchors.verticalCenter: parent.verticalCenter + verticalAlignment: Text.AlignVCenter + + onTextChanged: { + if (paintedWidth > textFlickable.width) { + textFlickable.contentX = paintedWidth - textFlickable.width; + } else { + textFlickable.contentX = 0; + } + } + } + } + + Image { + id: stopbutton + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.margins: units.gu(1) + width: units.gu(4) + height: units.gu(4) + // Image path assumes we are in components/system/ + source: "../../images/stop.png" + fillMode: Image.PreserveAspectFit + visible: voiceTimerWidget.isListening + + MouseArea { + anchors.fill: parent + onPressed: stopbutton.opacity = 0.5 + onReleased: stopbutton.opacity = 1.0 + onCanceled: stopbutton.opacity = 1.0 + onClicked: { + voiceTimerWidget.stopClicked() + } + } + } + + Rectangle { + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + height: units.gu(0.5) + color: "#333333" + opacity: 0.7 + + Rectangle { + id: progressIndicator + anchors.top: parent.top + anchors.bottom: parent.bottom + width: parent.width * 0.3 + color: voiceTimerWidget.isProcessing ? "#ffa500" : "#0078d4" + + SequentialAnimation on x { + running: voiceTimerWidget.visible && voiceTimerWidget.isProcessing + loops: Animation.Infinite + NumberAnimation { from: -progressIndicator.width; to: voiceTimerWidget.width; duration: 2000; easing.type: Easing.InOutQuad } + } + } + } +} diff --git a/qml/components/Bubblemap.qml b/qml/components/visualization/Bubblemap.qml similarity index 99% rename from qml/components/Bubblemap.qml rename to qml/components/visualization/Bubblemap.qml index 46692c0e..31faeeab 100644 --- a/qml/components/Bubblemap.qml +++ b/qml/components/visualization/Bubblemap.qml @@ -25,6 +25,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtGraphicalEffects 1.0 +import ".." Item { id: bubbleMap diff --git a/qml/components/EHower.qml b/qml/components/visualization/EHower.qml similarity index 98% rename from qml/components/EHower.qml rename to qml/components/visualization/EHower.qml index 6b589029..02485664 100644 --- a/qml/components/EHower.qml +++ b/qml/components/visualization/EHower.qml @@ -27,9 +27,10 @@ import Lomiri.Components 1.3 import QtCharts 2.0 import QtQuick.Layouts 1.11 import Qt.labs.settings 1.0 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst import QtQuick.LocalStorage 2.7 as Sql -import "../../models/accounts.js" as Accounts +import "../../../models/accounts.js" as Accounts +import ".." Item { id: ehoverMatrix @@ -232,7 +233,7 @@ Item { anchors.centerIn: parent spacing: units.gu(1) Image { - source: "../images/q1.png" + source: "../../images/q1.png" width: units.gu(4) height: units.gu(4) fillMode: Image.PreserveAspectFit @@ -290,7 +291,7 @@ Item { anchors.centerIn: parent spacing: units.gu(1) Image { - source: "../images/q2.png" + source: "../../images/q2.png" width: units.gu(4) height: units.gu(4) fillMode: Image.PreserveAspectFit @@ -347,7 +348,7 @@ Item { anchors.centerIn: parent spacing: units.gu(1) Image { - source: "../images/q3.png" + source: "../../images/q3.png" width: units.gu(4) height: units.gu(4) fillMode: Image.PreserveAspectFit @@ -405,7 +406,7 @@ Item { anchors.centerIn: parent spacing: units.gu(1) Image { - source: "../images/q4.png" + source: "../../images/q4.png" width: units.gu(4) height: units.gu(4) fillMode: Image.PreserveAspectFit diff --git a/qml/components/EHowerIndicator.qml b/qml/components/visualization/EHowerIndicator.qml similarity index 94% rename from qml/components/EHowerIndicator.qml rename to qml/components/visualization/EHowerIndicator.qml index 20854349..3ad4baf9 100644 --- a/qml/components/EHowerIndicator.qml +++ b/qml/components/visualization/EHowerIndicator.qml @@ -1,6 +1,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 -import "../../models/constants.js" as AppConst +import "../../../models/constants.js" as AppConst +import ".." Text { id: quadrantLabel diff --git a/qml/components/ProjectList.qml b/qml/components/visualization/ProjectList.qml similarity index 99% rename from qml/components/ProjectList.qml rename to qml/components/visualization/ProjectList.qml index 2792a5bb..c68099f2 100644 --- a/qml/components/ProjectList.qml +++ b/qml/components/visualization/ProjectList.qml @@ -26,10 +26,11 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import Lomiri.Components 1.3 -import "./" as Components +import ".." as Components import QtQuick.LocalStorage 2.7 as Sql -import "../../models/accounts.js" as Accounts -import "../../models/project.js" as Project +import "../../../models/accounts.js" as Accounts +import "../../../models/project.js" as Project +import ".." /* ProjectNavigator.qml - Logic Overview diff --git a/qml/components/ProjectPieChart.qml b/qml/components/visualization/ProjectPieChart.qml similarity index 98% rename from qml/components/ProjectPieChart.qml rename to qml/components/visualization/ProjectPieChart.qml index 43fab283..5aa11129 100644 --- a/qml/components/ProjectPieChart.qml +++ b/qml/components/visualization/ProjectPieChart.qml @@ -25,9 +25,10 @@ import QtQuick 2.7 import QtCharts 2.0 import QtQuick.Controls 2.2 -import "../../models/utils.js" as Utils -import "../../models/project.js" as Project -import "../../models/accounts.js" as Account +import "../../../models/utils.js" as Utils +import "../../../models/project.js" as Project +import "../../../models/accounts.js" as Account +import ".." Item { id: root diff --git a/qml/components/AttachmentManager.qml b/qml/components/workflow/AttachmentManager.qml similarity index 87% rename from qml/components/AttachmentManager.qml rename to qml/components/workflow/AttachmentManager.qml index f2f5db2e..b4212e3a 100644 --- a/qml/components/AttachmentManager.qml +++ b/qml/components/workflow/AttachmentManager.qml @@ -11,6 +11,7 @@ import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import Lomiri.Content 1.3 import io.thp.pyotherside 1.4 +import ".." Item { id: attachmentManager @@ -46,6 +47,20 @@ Item { // ----------- Internal state ----------- property list _importItems property bool _busy: false + property string _statusMessage: "" + + onUploadStarted: { + _statusMessage = i18n.dtr("ubtms", "Starting upload..."); + _busy = true; + } + onUploadCompleted: { + _busy = false; + _statusMessage = ""; + } + onUploadFailed: { + _busy = false; + _statusMessage = ""; + } // Fallback ListModel ListModel { @@ -118,7 +133,7 @@ Item { anchors.centerIn: parent spacing: units.gu(1) Icon { - source: "../images/upload-svgrepo-com.svg" + source: "../../images/upload-svgrepo-com.svg" width: units.gu(3) height: units.gu(3) color: "white" @@ -192,20 +207,20 @@ Item { _raw: rawData }) - // leadingActions: ListItemActions { - // actions: [ - // Action { - // iconName: "delete" - // text: i18n.dtr("ubtms", "Delete") - // onTriggered: attachmentManager._deleteAttachment(attachmentListItem.rec) - // } - // ] - // } + leadingActions: ListItemActions { + actions: [ + Action { + iconName: "delete" + text: i18n.dtr("ubtms", "Delete") + onTriggered: attachmentManager._deleteAttachment(attachmentListItem.rec) + } + ] + } trailingActions: ListItemActions { actions: [ Action { - iconSource: "../images/show.png" + iconSource: "../../images/show.png" text: i18n.dtr("ubtms", "View") onTriggered: attachmentManager._downloadAndOpen(attachmentListItem.rec) } @@ -268,12 +283,36 @@ Item { // Busy overlay (optional) Rectangle { anchors.fill: parent - color: '#00d3d3e3' + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#cc111111" : "#ccffffff" visible: attachmentManager._busy - BusyIndicator { + + MouseArea { + anchors.fill: parent + preventStealing: true + propagateComposedEvents: false + } + + Column { anchors.centerIn: parent - running: parent.visible - visible: running + spacing: units.gu(2) + width: parent.width - units.gu(4) + + BusyIndicator { + anchors.horizontalCenter: parent.horizontalCenter + running: parent.parent.visible + visible: running + } + + Label { + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width + text: attachmentManager._statusMessage || i18n.dtr("ubtms", "Processing...") + font.pixelSize: units.gu(2) + font.bold: true + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "white" : "#333333" + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.Wrap + } } } } @@ -292,12 +331,15 @@ Item { Python { id: python Component.onCompleted: { - addImportPath(Qt.resolvedUrl("../src/")); + addImportPath(Qt.resolvedUrl("../../../src/")); importModule("backend", function () { console.log("backend imported"); }); } - onError: console.log("python error: " + traceback) + onError: { + console.log("python error: " + traceback); + attachmentManager._busy = false; + } } // ----------- IMPORT dialog (ContentPickerDialog) ----------- @@ -321,18 +363,20 @@ Item { python.call("backend.resolve_qml_db_path", ["ubtms"], function (path) { if (!path) { - host ? host._notify("Failed to upload", 2000) : console.log("[AttachmentManager] Failed to upload"); - host && host.uploadFailed(); + if (host) { + host._notify(i18n.dtr("ubtms", "Failed to upload: Database path unresolved"), 3000); + host.uploadFailed(); + } return; } python.call("backend.attachment_upload", [path, attachmentManager.account_id, filePath, attachmentManager.resource_type, attachmentManager.resource_id], function (res) { if (!res) { console.warn("No response from attachment_upload"); - host ? host._notify("Failed to upload", 2000) : console.log("[AttachmentManager] Failed to upload"); - host && host.uploadFailed(); + if (host) { + host.uploadFailed(); + } return; } - // Success via backend_bridge }); }); } @@ -355,7 +399,9 @@ Item { function openContentPicker() { try { - PopupUtils.open(contentPickerComponent); + PopupUtils.open(contentPickerComponent, attachmentManager, { + host: attachmentManager + }); console.log("[AttachmentManager] ContentPickerDialog (import) opened"); } catch (e) { console.error("[AttachmentManager] Failed to open import dialog:", e); @@ -403,14 +449,19 @@ Item { switch (data.event) { case "ondemand_upload_message": - attachmentManager._notify(data.payload, 2000); + attachmentManager._statusMessage = data.payload; + attachmentManager._notify(data.payload, 2500); break; case "ondemand_upload_completed": if (data.payload === true) { - attachmentManager._notify("Attachment has been processed", 2000); + attachmentManager._notify(i18n.dtr("ubtms", "Attachment has been processed"), 3000); attachmentManager.uploadCompleted(); } else { - attachmentManager._notify("Failed to upload", 2000); + var errMsg = attachmentManager._statusMessage ? attachmentManager._statusMessage : i18n.dtr("ubtms", "Failed to upload"); + if (errMsg.indexOf("Error") === -1 && errMsg.indexOf("failed") === -1 && errMsg.indexOf("Failed") === -1) { + errMsg = i18n.dtr("ubtms", "Failed to upload") + ": " + errMsg; + } + attachmentManager._notify(errMsg, 4000); attachmentManager.uploadFailed(); } break; @@ -619,19 +670,23 @@ Item { function _executeDelete(rec) { _busy = true; + _statusMessage = i18n.dtr("ubtms", "Deleting attachment..."); python.call("backend.resolve_qml_db_path", ["ubtms"], function (path) { if (!path) { _busy = false; + _statusMessage = ""; _notify(i18n.dtr("ubtms", "Database not found"), 2500); return; } python.call("backend.attachment_delete", [path, rec.account_id || attachmentManager.account_id, rec.odoo_record_id], function (res) { _busy = false; - if (res) { + _statusMessage = ""; + if (res && res.success) { _notify(i18n.dtr("ubtms", "Attachment deleted"), 2000); attachmentManager.uploadCompleted(); // Refresh } else { - _notify(i18n.dtr("ubtms", "Failed to delete attachment"), 2500); + var errMsg = (res && res.error) ? res.error : i18n.dtr("ubtms", "Failed to delete attachment"); + _notify(errMsg, 3500); } }); }); @@ -725,6 +780,11 @@ Item { return; } + if (res.success === false) { + attachmentManager._notify(res.error || "Attachment could not be downloaded", 3500); + return; + } + if (res.type === "binary" && res.data) { var dlName = (res.name && res.name.length) ? res.name : fname; var dlMime = res.mimetype || mime; diff --git a/qml/components/CreateUpdatePage.qml b/qml/components/workflow/CreateUpdatePage.qml similarity index 96% rename from qml/components/CreateUpdatePage.qml rename to qml/components/workflow/CreateUpdatePage.qml index 0f4c103b..4d976e72 100644 --- a/qml/components/CreateUpdatePage.qml +++ b/qml/components/workflow/CreateUpdatePage.qml @@ -9,9 +9,10 @@ import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import QtQuick.Layouts 1.3 -import "../../models/accounts.js" as Accounts -import "../../models/global.js" as Global -import "richtext" +import "../../../models/accounts.js" as Accounts +import "../../../models/global.js" as Global +import "../richtext" +import ".." Page { id: createUpdatePage @@ -264,7 +265,12 @@ Page { ComboBox { id: statusSelector width: parent.width - units.gu(2) - model: createUpdatePage.projectUpdateStatus + model: [ + i18n.dtr("ubtms", "On Track"), + i18n.dtr("ubtms", "At Risk"), + i18n.dtr("ubtms", "Off Track"), + i18n.dtr("ubtms", "On Hold") + ] currentIndex: 0 onCurrentIndexChanged: { @@ -333,7 +339,7 @@ Page { descriptionField.liveSyncActive = true; if (typeof apLayout !== "undefined" && apLayout) { - apLayout.addPageToNextColumn(createUpdatePage, Qt.resolvedUrl("../ReadMorePage.qml"), { + apLayout.addPageToNextColumn(createUpdatePage, Qt.resolvedUrl("../richtext/ReadMorePage.qml"), { isReadOnly: false, parentDraftHandler: draftHandler }); diff --git a/qml/components/FormDraftHandler.qml b/qml/components/workflow/FormDraftHandler.qml similarity index 99% rename from qml/components/FormDraftHandler.qml rename to qml/components/workflow/FormDraftHandler.qml index 17c703c0..e123a8fc 100644 --- a/qml/components/FormDraftHandler.qml +++ b/qml/components/workflow/FormDraftHandler.qml @@ -23,7 +23,8 @@ */ import QtQuick 2.7 -import "../../models/draft_manager.js" as DraftManager +import "../../../models/draft_manager.js" as DraftManager +import ".." /** * FormDraftHandler - Reusable component for form draft management diff --git a/qml/Activities.qml b/qml/features/activities/pages/Activities.qml similarity index 97% rename from qml/Activities.qml rename to qml/features/activities/pages/Activities.qml index 1e7b242a..b68724c9 100644 --- a/qml/Activities.qml +++ b/qml/features/activities/pages/Activities.qml @@ -6,14 +6,14 @@ import Qt.labs.settings 1.0 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import Lomiri.Components.Pickers 1.3 -import "../models/utils.js" as Utils -import "../models/activity.js" as Activity -import "../models/accounts.js" as Accounts -import "../models/task.js" as Task -import "../models/project.js" as Project -import "../models/global.js" as Global -import "components" -import "components/richtext" +import "../../../../models/utils.js" as Utils +import "../../../../models/activity.js" as Activity +import "../../../../models/accounts.js" as Accounts +import "../../../../models/task.js" as Task +import "../../../../models/project.js" as Project +import "../../../../models/global.js" as Global +import "../../../components" +import "../../../components/richtext" Page { id: activityDetailsPage @@ -88,7 +88,7 @@ Page { } trailingActionBar.actions: [ Action { - iconSource: "images/save.svg" + iconSource: "../../../images/save.svg" visible: !isReadOnly text: i18n.dtr("ubtms", "Save") onTriggered: { @@ -338,7 +338,7 @@ Page { // Get the local task id from odoo_record_id var taskLocalId = Task.getLocalIdFromOdooId(taskOdooRecordId, currentActivity.account_id); if (taskLocalId > 0) { - apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { + apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("../../tasks/pages/Tasks.qml"), { "recordid": taskLocalId, "isReadOnly": true, "editVisible": false @@ -362,7 +362,7 @@ Page { // Get the local project id from odoo_record_id var projectLocalId = Project.getLocalIdFromOdooId(projectOdooRecordId, currentActivity.account_id); if (projectLocalId > 0) { - apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("Projects.qml"), { + apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("../../projects/pages/Projects.qml"), { "recordid": projectLocalId, "isReadOnly": true }); @@ -380,7 +380,7 @@ Page { // Get the local update id from odoo_record_id var updateLocalId = Project.getUpdateLocalIdFromOdooId(updateOdooRecordId, currentActivity.account_id); if (updateLocalId > 0) { - apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("Updates.qml"), { + apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("../../updates/pages/Updates.qml"), { "recordid": updateLocalId, "accountid": currentActivity.account_id, "isReadOnly": true @@ -764,7 +764,7 @@ Page { Global.description_context = "activity_notes"; navigatingToReadMore = true; notes.liveSyncActive = true; - apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("ReadMorePage.qml"), { + apLayout.addPageToNextColumn(activityDetailsPage, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { isReadOnly: isReadOnly, parentDraftHandler: draftHandler //useRichText: false @@ -787,21 +787,21 @@ Page { anchors.top: myRow9.bottom anchors.left: parent.left topPadding: units.gu(1) - height: units.gu(5) anchors.topMargin: units.gu(3) - Item { - width: parent.width * 0.75 - height: units.gu(5) - TreeSelector { + + Column { + leftPadding: units.gu(1) + + InlineOptionSelector { id: activityTypeSelector - enabled: !isReadOnly - labelText: i18n.dtr("ubtms","Activity Type") width: flickable.width - units.gu(2) - height: units.gu(29) - onItemSelected: function(id, name) { - // Track changes in draft handler (only after initialization and when not read-only) - // Exception: allow tracking during draft restoration to preserve changes - if ((!isInitializing || isRestoringFromDraft) && !isReadOnly) { + labelText: i18n.dtr("ubtms", "Activity Type") + selectorType: "activity_type" + readOnly: isReadOnly + enabledState: !isReadOnly + + onSelectionMade: function(id, name, selectorType) { + if (!isInitializing && id !== undefined) { draftHandler.markFieldChanged("activity_type_id", id); } } @@ -813,14 +813,15 @@ Page { id: row5 anchors.top: row4.bottom anchors.left: parent.left + anchors.topMargin: units.gu(1.5) + Column { leftPadding: units.gu(1) + DaySelector { id: date_widget readOnly: isReadOnly width: flickable.width - units.gu(2) - height: units.gu(5) - anchors.centerIn: parent.centerIn onDateChanged: function(selectedDate) { // Track changes in draft handler (only after initialization and when not read-only) // Exception: allow tracking during draft restoration to preserve changes @@ -1050,7 +1051,6 @@ Page { parent_id: null }); - let selectedText = "No Type"; let selectedFound = (selectedTypeId === -1); for (let i = 0; i < rawTypes.length; i++) { @@ -1064,18 +1064,15 @@ Page { }); if (selectedTypeId !== undefined && selectedTypeId !== null && selectedTypeId === id) { - selectedText = name; selectedFound = true; } } - // Push to the model and reload selector - activityTypeSelector.dataList = flatModel; - activityTypeSelector.reload(); + // Push to the model + activityTypeSelector.modelData = flatModel; // Update selected item - activityTypeSelector.selectedId = selectedFound ? selectedTypeId : -1; - activityTypeSelector.currentText = selectedFound ? selectedText : "Select Type"; + activityTypeSelector.applyDeferredSelection(selectedFound ? selectedTypeId : -1, false); // Track the activity type change in draft handler (only when not initializing and not read-only) // Exception: allow tracking during draft restoration to preserve changes diff --git a/qml/Activity_Page.qml b/qml/features/activities/pages/Activity_Page.qml similarity index 98% rename from qml/Activity_Page.qml rename to qml/features/activities/pages/Activity_Page.qml index 9776f5bb..d4bf5d7e 100644 --- a/qml/Activity_Page.qml +++ b/qml/features/activities/pages/Activity_Page.qml @@ -26,14 +26,14 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import QtQuick.Window 2.2 -import "../models/timesheet.js" as Model -import "../models/project.js" as Project -import "../models/task.js" as Task -import "../models/activity.js" as Activity -import "../models/utils.js" as Utils -import "../models/accounts.js" as Accounts -import "../models/global.js" as Global -import "components" +import "../../../../models/timesheet.js" as Model +import "../../../../models/project.js" as Project +import "../../../../models/task.js" as Task +import "../../../../models/activity.js" as Activity +import "../../../../models/utils.js" as Utils +import "../../../../models/accounts.js" as Accounts +import "../../../../models/global.js" as Global +import "../../../components" Page { property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false diff --git a/qml/features/dashboard/pages/Dashboard.qml b/qml/features/dashboard/pages/Dashboard.qml index f490e0ef..e87ec552 100644 --- a/qml/features/dashboard/pages/Dashboard.qml +++ b/qml/features/dashboard/pages/Dashboard.qml @@ -131,7 +131,7 @@ Page { const defaultAccountId = Account.getDefaultAccountId(); const result = TimesheetModel.createTimesheet(defaultAccountId, Account.getCurrentUserOdooId(defaultAccountId)); if (result.success) { - apLayout.addPageToCurrentColumn(mainPage, Qt.resolvedUrl("../../../Timesheet.qml"), { + apLayout.addPageToCurrentColumn(mainPage, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); @@ -233,7 +233,7 @@ Page { if (index === 1) { const result = TimesheetModel.createTimesheet(Account.getDefaultAccountId(), Account.getCurrentUserOdooId(Account.getDefaultAccountId())); if (result.success) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Timesheet.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); @@ -242,7 +242,7 @@ Page { } } if (index === 2) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Activities.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../activities/pages/Activities.qml"), { "isReadOnly": false }); } @@ -467,7 +467,7 @@ Page { onCommitCompleted: { const result = TimesheetModel.createTimesheet(Account.getDefaultAccountId(), Account.getCurrentUserOdooId(Account.getDefaultAccountId())); if (result.success) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Timesheet.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); @@ -515,25 +515,25 @@ Page { "isReadOnly": true }); } else if (navType === "Activity" && recordId > 0) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Activities.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../activities/pages/Activities.qml"), { "recordid": recordId, "accountid": accountId, "isReadOnly": true }); } else if (navType === "ProjectUpdate" && recordId > 0) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Updates.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../updates/pages/Updates.qml"), { "recordid": recordId, "accountid": accountId, "isOdooRecordId": true, "isReadOnly": true }); } else if (navType === "Project" && recordId > 0) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Projects.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../projects/pages/Projects.qml"), { "recordid": recordId, "isReadOnly": true }); } else if (navType === "Timesheet" && recordId > 0) { - apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../../Timesheet.qml"), { + apLayout.addPageToNextColumn(mainPage, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": recordId, "isReadOnly": true }); diff --git a/qml/features/dashboard/pages/TaskDetailPage.qml b/qml/features/dashboard/pages/TaskDetailPage.qml index b8f87169..56e6fdbd 100644 --- a/qml/features/dashboard/pages/TaskDetailPage.qml +++ b/qml/features/dashboard/pages/TaskDetailPage.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import Lomiri.Components 1.3 import QtQuick.Layouts 1.12 +import "../../../components/base" import "../js/chartUtils.js" as ChartUtils Page { diff --git a/qml/Project_Page.qml b/qml/features/projects/pages/Project_Page.qml similarity index 94% rename from qml/Project_Page.qml rename to qml/features/projects/pages/Project_Page.qml index 0d9d1347..ff0682ca 100644 --- a/qml/Project_Page.qml +++ b/qml/features/projects/pages/Project_Page.qml @@ -30,12 +30,12 @@ import Ubuntu.Components 1.3 as Ubuntu import QtQuick.LocalStorage 2.7 import Lomiri.Components.ListItems 1.3 as ListItem -import "../models/project.js" as Project -import "../models/utils.js" as Utils -import "../models/accounts.js" as Account -import "../models/global.js" as Global +import "../../../../models/project.js" as Project +import "../../../../models/utils.js" as Utils +import "../../../../models/accounts.js" as Account +import "../../../../models/global.js" as Global -import "components" +import "../../../components" Page { property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false @@ -109,7 +109,7 @@ Page { onProjectTimesheetRequested: localId => { let result = Timesheet.createTimesheetFromProject(localId); if (result.success) { - apLayout.addPageToNextColumn(project, Qt.resolvedUrl("Timesheet.qml"), { + apLayout.addPageToNextColumn(project, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); diff --git a/qml/Projects.qml b/qml/features/projects/pages/Projects.qml similarity index 98% rename from qml/Projects.qml rename to qml/features/projects/pages/Projects.qml index 57be5860..4a18d0c7 100644 --- a/qml/Projects.qml +++ b/qml/features/projects/pages/Projects.qml @@ -30,14 +30,14 @@ import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import Lomiri.Components.Pickers 1.3 import QtCharts 2.0 -import "../models/task.js" as Task -import "../models/utils.js" as Utils -import "../models/accounts.js" as Accounts -import "../models/activity.js" as Activity -import "../models/project.js" as Project -import "../models/global.js" as Global -import "components" -import "components/richtext" +import "../../../../models/task.js" as Task +import "../../../../models/utils.js" as Utils +import "../../../../models/accounts.js" as Accounts +import "../../../../models/activity.js" as Activity +import "../../../../models/project.js" as Project +import "../../../../models/global.js" as Global +import "../../../components" +import "../../../components/richtext" Page { id: projectCreate @@ -64,7 +64,7 @@ Page { trailingActionBar.actions: [ Action { - iconSource: "images/save.svg" + iconSource: "../../../images/save.svg" text: i18n.dtr("ubtms", "Save") visible: !isReadOnly onTriggered: { @@ -625,7 +625,7 @@ Page { Global.richTextSaveCallback = saveProjectDescriptionFromEditor; navigatingToReadMore = true; description_text.liveSyncActive = true; - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("ReadMorePage.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { isReadOnly: isReadOnly, parentDraftHandler: draftHandler, parentFormPage: projectCreate, @@ -735,7 +735,7 @@ Page { let project = Project.getProjectDetails(recordid); let result = Activity.createActivityFromProjectOrTask(true, project.account_id, project.odoo_record_id); if (result.success) { - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("Activities.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../activities/pages/Activities.qml"), { "recordid": result.record_id, "accountid": project.account_id, "isReadOnly": false @@ -759,7 +759,7 @@ Page { text: i18n.dtr("ubtms","View") onClicked: { let project = Project.getProjectDetails(recordid); - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("Activity_Page.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../activities/pages/Activity_Page.qml"), { "filterByProject": true, "projectOdooRecordId": project.odoo_record_id, "projectAccountId": project.account_id, @@ -795,7 +795,7 @@ Page { let isSubProject = project.parent_id && project.parent_id > 0; let parentProjectId = isSubProject ? project.parent_id : -1; - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../tasks/pages/Tasks.qml"), { "recordid": 0, "isReadOnly": false, "prefilledAccountId": project.account_id, @@ -820,7 +820,7 @@ Page { text: i18n.dtr("ubtms","View") onClicked: { let project = Project.getProjectDetails(recordid); - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("features/tasks/pages/Task_Page.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../tasks/pages/Task_Page.qml"), { "filterByProject": true, "projectOdooRecordId": project.odoo_record_id, "projectAccountId": project.account_id, @@ -862,7 +862,7 @@ Page { } Global.createUpdateCallback = null; }; - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("components/CreateUpdatePage.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../../components/CreateUpdatePage.qml"), { "projectId": project.odoo_record_id, "accountId": project.account_id }); @@ -882,7 +882,7 @@ Page { text: i18n.dtr("ubtms","View") onClicked: { let project = Project.getProjectDetails(recordid); - apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("Updates_Page.qml"), { + apLayout.addPageToNextColumn(projectCreate, Qt.resolvedUrl("../../updates/pages/Updates_Page.qml"), { "filterByProject": true, "projectOdooRecordId": project.odoo_record_id, "projectAccountId": project.account_id, diff --git a/qml/Account_Page.qml b/qml/features/settings/pages/Account_Page.qml similarity index 99% rename from qml/Account_Page.qml rename to qml/features/settings/pages/Account_Page.qml index 8127f684..7e711cc0 100644 --- a/qml/Account_Page.qml +++ b/qml/features/settings/pages/Account_Page.qml @@ -28,9 +28,9 @@ import Lomiri.Components 1.3 import QtQuick.Window 2.2 import QtQuick.LocalStorage 2.7 as Sql import io.thp.pyotherside 1.4 -import "../models/accounts.js" as Accounts -import "../models/utils.js" as Utils -import "components" +import "../../../../models/accounts.js" as Accounts +import "../../../../models/utils.js" as Utils +import "../../../components" Page { id: createAccountPage @@ -63,7 +63,7 @@ Page { } trailingActionBar.actions: [ Action { - iconSource: "images/save.svg" + iconSource: "../../../images/save.svg" visible: !isReadOnly text: i18n.dtr("ubtms","Save") @@ -326,7 +326,7 @@ Page { id: python Component.onCompleted: { - addImportPath(Qt.resolvedUrl('../src/')); + addImportPath(Qt.resolvedUrl('../../../../src/')); importModule_sync("backend"); } diff --git a/qml/features/settings/pages/Settings_Accounts.qml b/qml/features/settings/pages/Settings_Accounts.qml index b351a6fa..79d0e6ea 100644 --- a/qml/features/settings/pages/Settings_Accounts.qml +++ b/qml/features/settings/pages/Settings_Accounts.qml @@ -45,7 +45,7 @@ Page { Action { iconName: "add" onTriggered: { - apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('../../../Account_Page.qml')); + apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('Account_Page.qml')); } } ] @@ -277,7 +277,7 @@ Page { onClicked: { if (model.id !== 0) { - apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('../../../Account_Page.qml'), { + apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('Account_Page.qml'), { "accountId": model.id }); } @@ -290,7 +290,7 @@ Page { iconName: "edit" enabled: model.id !== 0 onTriggered: { - apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('../../../Account_Page.qml'), { + apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl('Account_Page.qml'), { "accountId": model.id, "openInEditMode": true }); @@ -307,7 +307,7 @@ Page { text: i18n.dtr("ubtms", "Log") enabled: model.id !== 0 onTriggered: { - apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl("../../../SyncLog.qml"), { + apLayout.addPageToNextColumn(accountsSettingsPage, Qt.resolvedUrl("SyncLog.qml"), { "recordid": model.id }); } diff --git a/qml/features/settings/pages/Settings_Page.qml b/qml/features/settings/pages/Settings_Page.qml index 07f34cd8..d56ed61b 100644 --- a/qml/features/settings/pages/Settings_Page.qml +++ b/qml/features/settings/pages/Settings_Page.qml @@ -101,13 +101,26 @@ Page { iconColor: "#8e44ad" text: i18n.dtr("ubtms", "Theme Settings") active: settings.selectedSettingsPageUrl === "Settings_Theme.qml" - showDivider: false onClicked: { settings.selectedSettingsPageUrl = "Settings_Theme.qml"; apLayout.addPageToNextColumn(settings, Qt.resolvedUrl('Settings_Theme.qml')); } } + // select voice model + SettingsListItem { + iconName: "audio-input-microphone-symbolic" + iconColor: "#8e44ad" + text: i18n.dtr("ubtms", "Voice Model (Beta)") + active: settings.selectedSettingsPageUrl === "Settings_VoiceModel.qml" + showDivider: false + onClicked: { + settings.selectedSettingsPageUrl = "Settings_VoiceModel.qml"; + apLayout.addPageToNextColumn(settings, Qt.resolvedUrl('Settings_VoiceModel.qml')); + } + } + + // Bottom spacer Item { width: parent.width; height: units.gu(1) } } diff --git a/qml/features/settings/pages/Settings_VoiceModel.qml b/qml/features/settings/pages/Settings_VoiceModel.qml new file mode 100644 index 00000000..18a49b78 --- /dev/null +++ b/qml/features/settings/pages/Settings_VoiceModel.qml @@ -0,0 +1,974 @@ +/* +* MIT License +* +* Copyright (c) 2025 CIT-Services +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.LocalStorage 2.7 as Sql +import Lomiri.Components 1.3 +import Lomiri.Components.Popups 1.3 +import QtGraphicalEffects 1.0 +import "../components" +import "../../../components" +import "../../../components/navigation" as Nav +Page { + id: voiceModelSettingsPage + title: i18n.dtr("ubtms", "Voice Model (Beta)") + + header: SettingsHeader { + id: pageHeader + title: voiceModelSettingsPage.title + trailingActions: [ + Action { + iconName: "info" + onTriggered: PopupUtils.open(infoDialogComponent, voiceModelSettingsPage) + }, + Action { + iconName: "search" + onTriggered: { + myTaskListHeader.toggleSearchVisibility() + } + }, + Action { + iconName: "reload" + onTriggered: refreshModels() + enabled: !isDownloading + } + ] + } + + property string activeModelPath: "" + property bool isLoading: false + property bool isDownloading: false + property string downloadingModelId: "" + property string downloadingModelName: "" + property string failedModelId: "" + property var downloadStatus: { "in_progress": false, "progress": 0, "message": "", "error": "" } + property int deviceRamMB: 2048 + property bool isVoiceInputEnabled: true + property string searchQuery: "" + property var allInstalledModels: [] + property var allAvailableModels: [] + + Timer { + id: searchDebounceTimer + interval: 300 + onTriggered: { + filterModels(); + } + } + + onSearchQueryChanged: { + searchDebounceTimer.restart(); + } + + function getVoiceInputEnabledSetting() { + try { + var db = Sql.LocalStorage.openDatabaseSync("myDatabase", "1.0", "My Database", 1000000); + var result = true; + db.transaction(function (tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS app_settings (key TEXT PRIMARY KEY, value TEXT)'); + var rs = tx.executeSql('SELECT value FROM app_settings WHERE key = "voice_input_enabled"'); + if (rs.rows.length > 0) { + result = rs.rows.item(0).value === "true"; + } + }); + return result; + } catch (e) { + console.warn("Error reading voice_input_enabled setting:", e); + return true; + } + } + + function saveVoiceInputEnabledSetting(value) { + try { + var db = Sql.LocalStorage.openDatabaseSync("myDatabase", "1.0", "My Database", 1000000); + db.transaction(function (tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS app_settings (key TEXT PRIMARY KEY, value TEXT)'); + tx.executeSql('INSERT OR REPLACE INTO app_settings (key, value) VALUES ("voice_input_enabled", ?)', [value ? "true" : "false"]); + }); + isVoiceInputEnabled = value; + } catch (e) { + console.warn("Error saving voice_input_enabled setting:", e); + } + } + + function isModelCompatible(sizeStr) { + if (!sizeStr) return true; + var upperSize = sizeStr.toUpperCase(); + var isG = upperSize.indexOf("G") !== -1; + if (isG) { + var val = parseFloat(upperSize.replace("G", "")); + // Assume 1G requires ~2500MB RAM, 1.8G requires ~4000MB RAM. + var reqRam = val * 2500; + return deviceRamMB >= reqRam; + } + return true; // MB sizes are usually compatible with any device + } + + function getActiveModelSetting() { + try { + var db = Sql.LocalStorage.openDatabaseSync("myDatabase", "1.0", "My Database", 1000000); + var result = "voice_to_text/model"; // Default + + db.transaction(function (tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS app_settings (key TEXT PRIMARY KEY, value TEXT)'); + var rs = tx.executeSql('SELECT value FROM app_settings WHERE key = "active_voice_model"'); + if (rs.rows.length > 0) { + result = rs.rows.item(0).value; + } + }); + return result; + } catch (e) { + console.warn("Error reading active_voice_model setting:", e); + return "voice_to_text/model"; + } + } + + function saveActiveModelSetting(value) { + try { + var db = Sql.LocalStorage.openDatabaseSync("myDatabase", "1.0", "My Database", 1000000); + db.transaction(function (tx) { + tx.executeSql('CREATE TABLE IF NOT EXISTS app_settings (key TEXT PRIMARY KEY, value TEXT)'); + tx.executeSql('INSERT OR REPLACE INTO app_settings (key, value) VALUES ("active_voice_model", ?)', [value]); + }); + activeModelPath = value; + console.log("Setting saved: active_voice_model =", value); + } catch (e) { + console.warn("Error saving active_voice_model setting:", e); + } + } + + function refreshModels() { + if (!mainView.backend_bridge.ready) return; + + isLoading = true; + + mainView.backend_bridge.call("backend.list_installed_models", [], function(models) { + isLoading = false; + var arr = []; + if (models) { + for (var i = 0; i < models.length; i++) { + arr.push(models[i]); + } + } + allInstalledModels = arr; + filterModels(); + // After refreshing installed models, refresh available ones + refreshAvailableModels(); + }); + } + + function filterModels() { + modelList.clear(); + availableModelList.clear(); + + var query = searchQuery.toLowerCase(); + + // Installed models + for (var i = 0; i < allInstalledModels.length; i++) { + var m = allInstalledModels[i]; + if (query === "" || (m.m_name && m.m_name.toLowerCase().indexOf(query) !== -1) || (m.m_path && m.m_path.toLowerCase().indexOf(query) !== -1)) { + modelList.append({ + "name": m.m_name, + "path": m.m_path, + "m_source": m.m_source, + "size": m.m_size || "" + }); + } + } + + // Available models + var installedPaths = []; + for (var idx = 0; idx < allInstalledModels.length; idx++) { + installedPaths.push(allInstalledModels[idx].m_path); + } + + for (var j = 0; j < allAvailableModels.length; j++) { + var modelId = allAvailableModels[j].id; + var alreadyInstalled = false; + for (var k = 0; k < installedPaths.length; k++) { + if (installedPaths[k].indexOf(modelId) !== -1) { + alreadyInstalled = true; + break; + } + } + + if (!alreadyInstalled) { + var avM = allAvailableModels[j]; + if (query === "" || (avM.name && avM.name.toLowerCase().indexOf(query) !== -1) || (avM.id && avM.id.toLowerCase().indexOf(query) !== -1)) { + availableModelList.append({ + "id": avM.id, + "name": avM.name, + "size": avM.size, + "url": avM.url + }); + } + } + } + } + + function refreshAvailableModels() { + if (!mainView.backend_bridge.ready) return; + + mainView.backend_bridge.call("backend.list_available_models", [], function(models) { + var arr = []; + if (models) { + for (var i = 0; i < models.length; i++) { + arr.push(models[i]); + } + } + allAvailableModels = arr; + filterModels(); + }); + } + + function downloadModel(modelId, url, modelName) { + if (!mainView.backend_bridge.ready) return; + + downloadingModelId = modelId; + downloadingModelName = modelName; + isDownloading = true; + + // Start global timer widget indication at the bottom + if (mainView.modelDownloadTimerWidget) { + mainView.modelDownloadTimerWidget.startSync(0, modelName); + mainView.modelDownloadTimerWidget.syncStatusMessage = i18n.dtr("ubtms", "Starting download..."); + } + + notifPopup.open(i18n.dtr("ubtms", "Download Started"), i18n.dtr("ubtms", "Downloading %1...").arg(modelName), "info"); + mainView.backend_bridge.call("backend.download_voice_model", [modelId, url], function(res) { + if (res.status === "started") { + downloadStatusTimer.start(); + } else { + isDownloading = false; + console.error("Download failed to start:", res.message); + if (mainView.modelDownloadTimerWidget) { + mainView.modelDownloadTimerWidget.failSync(res.message || i18n.dtr("ubtms", "Could not start download")); + } + notifPopup.open(i18n.dtr("ubtms", "Download Failed"), res.message || i18n.dtr("ubtms", "Could not start download"), "error"); + } + }); + } + + function cancelDownload() { + if (!mainView.backend_bridge.ready) return; + mainView.backend_bridge.call("backend.cancel_voice_model_download", [], function(res) { + isDownloading = false; + failedModelId = ""; + downloadStatusTimer.stop(); + if (mainView.modelDownloadTimerWidget) { + mainView.modelDownloadTimerWidget.failSync(i18n.dtr("ubtms", "Download cancelled")); + } + notifPopup.open(i18n.dtr("ubtms", "Download Cancelled"), i18n.dtr("ubtms", "Download of %1 was cancelled and partial data deleted.").arg(downloadingModelName), "info"); + refreshModels(); + }); + } + + function pauseDownload() { + if (!mainView.backend_bridge.ready) return; + mainView.backend_bridge.call("backend.pause_voice_model_download", [], function(res) { + // Timer will catch the state change and handle UI updates + }); + } + + Component.onCompleted: { + activeModelPath = getActiveModelSetting(); + isVoiceInputEnabled = getVoiceInputEnabledSetting(); + if (mainView.backend_bridge.ready) { + refreshModels(); + checkInProgressDownload(); + checkPausedDownloads(); + fetchDeviceRam(); + } + } + + function fetchDeviceRam() { + mainView.backend_bridge.call("backend.get_device_total_ram_mb", [], function(ram) { + if (ram) { + deviceRamMB = ram; + console.log("Device RAM detected:", deviceRamMB, "MB"); + } + }); + } + + function checkPausedDownloads() { + mainView.backend_bridge.call("backend.get_paused_voice_models", [], function(paused) { + if (paused && paused.length > 0) { + // If there are partial downloads, mark the first one as paused (failedModelId handles UI for paused state) + failedModelId = paused[0]; + } + }); + } + + function checkInProgressDownload() { + mainView.backend_bridge.call("backend.get_model_download_status", [], function(status) { + if (status.in_progress) { + isDownloading = true; + downloadingModelId = status.model_id || ""; + downloadStatus = status; + downloadStatusTimer.start(); + } + }); + } + + function deleteModel(path, name) { + if (!mainView.backend_bridge.ready) return; + + var dialog = PopupUtils.open(confirmDeleteComponent, voiceModelSettingsPage, { + "modelPath": path, + "modelName": name + }); + } + + Component { + id: infoDialogComponent + Dialog { + id: infoDialog + title: i18n.dtr("ubtms", "About Voice Models") + + Flickable { + width: parent.width + height: Math.min(units.gu(50), infoContentColumn.height) + contentHeight: infoContentColumn.height + clip: true + interactive: contentHeight > height + + Column { + id: infoContentColumn + width: parent.width + spacing: units.gu(2) + + Text { + text: i18n.dtr("ubtms", "Voice models allow you to dictate text using your microphone directly into the app. Because processing happens locally on your device, your voice data remains completely private and no internet connection is required after the initial model download.\n\nLarger models provide higher accuracy but require more device memory and space. Smaller models are faster and use fewer resources but may be less accurate.") + width: parent.width + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignJustify + color: theme.palette.normal.backgroundText + } + + Text { + width: parent.width + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignJustify + color: theme.palette.normal.backgroundText + font.pixelSize: units.gu(1.6) + lineHeight: 1.2 + text: i18n.dtr("ubtms", "Voice Feature Stages: When you click the voice icon, it will show Starting, then Preparing. Only start speaking once it shows Listening. When stopped, it will show Processing with a yellow bar.") + } + + Text { + width: parent.width + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignJustify + color: theme.palette.normal.backgroundText + font.pixelSize: units.gu(1.6) + lineHeight: 1.2 + text: i18n.dtr("ubtms", "Auto-Stop & Limits: If you do not speak for 7 seconds, the voice icon will automatically stop. The maximum duration for a single recording is 5 minutes.") + } + + Text { + width: parent.width + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignJustify + color: theme.palette.normal.backgroundText + font.pixelSize: units.gu(1.6) + lineHeight: 1.2 + text: i18n.dtr("ubtms", "Getting Started: Make sure you have enabled the \"Enable voice input\" feature, under voice model (Beta) settings. ") + } + + Text { + width: parent.width + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignJustify + color: theme.palette.normal.backgroundText + font.pixelSize: units.gu(1.6) + lineHeight: 1.2 + text: i18n.dtr("ubtms", "Compatibility & Errors: A red warning icon indicates the model is incompatible with your device (usually due to RAM limits), but you can still attempt to download it.") + } + + Text { + width: parent.width + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignJustify + color: theme.palette.normal.backgroundText + font.pixelSize: units.gu(1.6) + lineHeight: 1.2 + text: i18n.dtr("ubtms", "Managing Downloads:Check the internet connectivity before downloading a file. Once the voice model is downloaded, select the model you want from the installed models list. Even if only one model is installed, selecting the model is mandatory. The selected model will be shown in bold text, with a tick mark to its right. During download, you will see Loading (downloading), Pause, and Cancel buttons. Pausing or losing internet will preserve your progress, allowing you to resume later from this page. Cancelling will delete the partial download.") + } + + Text { + width: parent.width + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignJustify + color: theme.palette.normal.backgroundText + font.pixelSize: units.gu(1.6) + lineHeight: 1.2 + text: i18n.dtr("ubtms", "Deleting Models: To remove an installed model, swipe its name to the left and click the delete icon.") + } + + Button { + text: i18n.dtr("ubtms", "Close") + anchors.horizontalCenter: parent.horizontalCenter + onClicked: PopupUtils.close(infoDialog) + } + + Item { + width: parent.width + height: units.gu(2) + } + } + } + } + } + + Component { + id: confirmDeleteComponent + Dialog { + id: confirmDeleteDialog + property string modelPath + property string modelName + title: i18n.dtr("ubtms", "Delete Model") + + Column { + spacing: units.gu(2) + width: parent.width + + Text { + text: i18n.dtr("ubtms", "Are you sure you want to delete the voice model '%1'?").arg(confirmDeleteDialog.modelName) + width: parent.width + wrapMode: Text.WordWrap + color: theme.palette.normal.backgroundText + horizontalAlignment: Text.AlignHCenter + } + + Row { + spacing: units.gu(2) + anchors.horizontalCenter: parent.horizontalCenter + + Button { + text: i18n.dtr("ubtms", "Cancel") + onClicked: PopupUtils.close(confirmDeleteDialog) + } + + Button { + text: i18n.dtr("ubtms", "Delete") + color: LomiriColors.red + onClicked: { + mainView.backend_bridge.call("backend.delete_voice_model", [confirmDeleteDialog.modelPath], function(res) { + PopupUtils.close(confirmDeleteDialog); + if (res.status === "success") { + notifPopup.open(i18n.dtr("ubtms", "Deleted"), i18n.dtr("ubtms", "Model %1 deleted successfully.").arg(confirmDeleteDialog.modelName), "success"); + refreshModels(); + } else { + notifPopup.open(i18n.dtr("ubtms", "Error"), res.message || i18n.dtr("ubtms", "Could not delete model"), "error"); + } + }); + } + } + } + } + } + } + + Component { + id: warningComponent + Dialog { + id: warningDialog + property string modelId + property string modelUrl + property string modelName + title: i18n.dtr("ubtms", "Warning") + + Column { + spacing: units.gu(2) + width: parent.width + + Text { + text: i18n.dtr("ubtms", "This model is incompatible with your device because it requires more RAM than available. It may cause the app to crash.\n\nBut if you want to download it, you can.") + width: parent.width + wrapMode: Text.WordWrap + color: theme.palette.normal.backgroundText + horizontalAlignment: Text.AlignHCenter + } + + Row { + spacing: units.gu(2) + anchors.horizontalCenter: parent.horizontalCenter + + Button { + text: i18n.dtr("ubtms", "Cancel") + onClicked: PopupUtils.close(warningDialog) + } + + Button { + text: i18n.dtr("ubtms", "Download Anyway") + color: LomiriColors.orange + onClicked: { + PopupUtils.close(warningDialog); + downloadModel(warningDialog.modelId, warningDialog.modelUrl, warningDialog.modelName); + } + } + } + } + } + } + + Connections { + target: mainView.backend_bridge + onReadyChanged: { + if (mainView.backend_bridge.ready) { + refreshModels(); + checkInProgressDownload(); + checkPausedDownloads(); + fetchDeviceRam(); + } + } + } + + ListModel { + id: modelList + } + + ListModel { + id: availableModelList + } + + Timer { + id: downloadStatusTimer + interval: 1000 + repeat: true + onTriggered: { + if (!isDownloading) return; + mainView.backend_bridge.call("backend.get_model_download_status", [], function(status) { + if (!isDownloading) return; + if (status.model_id && status.model_id !== downloadingModelId) return; + + downloadStatus = status; + + // Update global timer widget at the bottom + if (mainView.modelDownloadTimerWidget) { + mainView.modelDownloadTimerWidget.syncProgress = status.progress / 100.0; + mainView.modelDownloadTimerWidget.syncStatusMessage = status.message || i18n.dtr("ubtms", "Downloading..."); + } + + if (!status.in_progress) { + downloadStatusTimer.stop(); + isDownloading = false; + refreshModels(); // Refresh both lists + + if (status.is_paused) { + failedModelId = downloadingModelId; + if (status.error) { + console.error("Download error:", status.error); + if (mainView.modelDownloadTimerWidget) mainView.modelDownloadTimerWidget.failSync(status.error); + notifPopup.open(i18n.dtr("ubtms", "Download Interrupted"), i18n.dtr("ubtms", "Failed to download. You can resume it.").arg(downloadingModelName).arg(status.error), "warning"); + } else { + notifPopup.open(i18n.dtr("ubtms", "Download Paused"), i18n.dtr("ubtms", "Download of %1 is paused.").arg(downloadingModelName), "info"); + } + } else if (status.message === "Cancelled" || status.message === "Download cancelled") { + failedModelId = ""; + // Already handled by cancelDownload() or just silently reset + } else if (status.error) { + failedModelId = ""; // fallback + notifPopup.open(i18n.dtr("ubtms", "Download Failed"), status.error, "error"); + } else { + failedModelId = ""; + if (mainView.modelDownloadTimerWidget) { + mainView.modelDownloadTimerWidget.completeSyncSuccessfully(); + } + notifPopup.open(i18n.dtr("ubtms", "Success"), i18n.dtr("ubtms", "%1 installed successfully!").arg(downloadingModelName), "success"); + } + } + }); + } + } + + Nav.ListHeader { + id: myTaskListHeader + anchors.top: pageHeader.bottom + anchors.left: parent.left + anchors.right: parent.right + + filterModel: [] + showSearchBox: false + currentFilter: "" + + onCustomSearch: { + searchQuery = query; + } + } + + Flickable { + id: flickable + anchors.top: myTaskListHeader.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + contentHeight: contentColumn.height + clip: true + + Column { + id: contentColumn + width: parent.width + + ListItem { + width: parent.width + height: units.gu(7) + divider.visible: true + + Label { + anchors.left: parent.left + anchors.leftMargin: units.gu(2) + anchors.verticalCenter: parent.verticalCenter + text: i18n.dtr("ubtms", "Enable Voice Input") + font.pixelSize: units.gu(2) + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#f5f5f5" : "#111" + } + + Switch { + anchors.right: parent.right + anchors.rightMargin: units.gu(2) + anchors.verticalCenter: parent.verticalCenter + checked: isVoiceInputEnabled + onCheckedChanged: { + if (checked !== isVoiceInputEnabled) { + saveVoiceInputEnabledSetting(checked); + } + } + } + } + + ListItem { + width: parent.width + // height: units.gu(5) + enabled: false + Label { + text: i18n.dtr("ubtms", "INSTALLED MODELS") + font.bold: true + font.pixelSize: units.gu(1.5) + anchors.left: parent.left + anchors.leftMargin: units.gu(2) + anchors.verticalCenter: parent.verticalCenter + color: LomiriColors.orange + } + } + + Repeater { + model: modelList + delegate: ListItem { + width: parent.width + height: units.gu(9) + divider.visible: true + + trailingActions: ListItemActions { + actions: [ + Action { + iconName: "delete" + enabled: model.m_source === "User" + onTriggered: { + deleteModel(model.path, model.name) + } + } + ] + } + + onClicked: { + saveActiveModelSetting(model.path); + } + + Rectangle { + anchors.fill: parent + color: activeModelPath === model.path ? + (theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#2b241b" : "#fff1de") : + "transparent" + visible: activeModelPath === model.path + + Rectangle { + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + width: units.dp(3) + height: parent.height - units.gu(1.6) + radius: units.dp(2) + color: LomiriColors.orange + visible: activeModelPath === model.path + } + } + + Column { + anchors { + left: parent.left + right: parent.right + verticalCenter: parent.verticalCenter + leftMargin: units.gu(2) + rightMargin: units.gu(6) + } + spacing: units.gu(0.5) + + Text { + text: model.name + font.pixelSize: units.gu(2) + font.bold: activeModelPath === model.path + color: activeModelPath === model.path ? LomiriColors.orange : (theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#f5f5f5" : "#111") + elide: Text.ElideRight + width: parent.width + } + + Text { + text: model.path + (model.size ? " (" + model.size + ")" : "") + font.pixelSize: units.gu(1.3) + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#888" : "#777" + elide: Text.ElideMiddle + width: parent.width + } + } + + Icon { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.rightMargin: units.gu(2) + name: "ok" + width: units.gu(2.5) + height: units.gu(2.5) + color: LomiriColors.orange + visible: activeModelPath === model.path + } + } + } + + // Empty state for installed models + Text { + width: parent.width + height: units.gu(10) + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + text: isLoading ? i18n.dtr("ubtms", "Scanning for models...") : i18n.dtr("ubtms", "No installed models found.") + visible: modelList.count === 0 + color: "#888" + font.italic: true + } + + // Available Models Section + ListItem { + width: parent.width + height: units.gu(5) + enabled: false + Label { + text: i18n.dtr("ubtms", "AVAILABLE FOR DOWNLOAD") + font.bold: true + font.pixelSize: units.gu(1.5) + anchors.left: parent.left + anchors.leftMargin: units.gu(2) + anchors.verticalCenter: parent.verticalCenter + color: LomiriColors.orange + } + } + + + + Repeater { + model: availableModelList + delegate: ListItem { + width: parent.width + height: units.gu(9) + divider.visible: true + enabled: true + opacity: isDownloading ? (downloadingModelId === model.id ? 1.0 : 0.5) : 1.0 + + onClicked: { + if (isDownloading && downloadingModelId === model.id) { + pauseDownload(); + } else if (!isDownloading) { + if (!isModelCompatible(model.size)) { + PopupUtils.open(warningComponent, voiceModelSettingsPage, { + "modelId": model.id, + "modelUrl": model.url, + "modelName": model.name + }); + return; + } + if (failedModelId === model.id) { + failedModelId = ""; + } + downloadModel(model.id, model.url, model.name); + } + } + + Column { + anchors { + left: parent.left + right: parent.right + verticalCenter: parent.verticalCenter + leftMargin: units.gu(2) + rightMargin: units.gu(8) + } + spacing: units.gu(0.5) + + Text { + text: model.name + font.pixelSize: units.gu(2) + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#f5f5f5" : "#111" + elide: Text.ElideRight + width: parent.width + } + + Text { + text: model.size + font.pixelSize: units.gu(1.3) + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#888" : "#777" + elide: Text.ElideMiddle + width: parent.width + } + } + + Item { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.rightMargin: units.gu(2) + width: units.gu(9) + height: units.gu(2.5) + + Row { + anchors.fill: parent + spacing: units.gu(1) + layoutDirection: Qt.RightToLeft + + // Warning icon + Icon { + name: "dialog-warning" + width: units.gu(2.5) + height: units.gu(2.5) + color: LomiriColors.red + visible: !isModelCompatible(model.size) && (!isDownloading || downloadingModelId !== model.id) && failedModelId !== model.id + + MouseArea { + anchors.fill: parent + onClicked: { + PopupUtils.open(warningComponent, voiceModelSettingsPage, { + "modelId": model.id, + "modelUrl": model.url, + "modelName": model.name + }); + } + } + } + + // Default Download icon + Item { + width: units.gu(2.5) + height: units.gu(2.5) + visible: isModelCompatible(model.size) && (!isDownloading || downloadingModelId !== model.id) && failedModelId !== model.id + + Image { + id: downloadImg + anchors.fill: parent + source: Qt.resolvedUrl("../../../images/download.svg") + sourceSize: Qt.size(parent.width, parent.height) + visible: false + } + + ColorOverlay { + anchors.fill: downloadImg + source: downloadImg + color: LomiriColors.orange + } + } + + // Cancel icon (when paused or downloading) + Icon { + name: "close" + width: units.gu(2.5) + height: units.gu(2.5) + color: LomiriColors.red + visible: ((!isDownloading || downloadingModelId !== model.id) && failedModelId === model.id) || (isDownloading && downloadingModelId === model.id) + + MouseArea { + anchors.fill: parent + onClicked: { + cancelDownload(); + } + } + } + + // Play/Resume icon (when paused) + Icon { + name: "media-playback-start" + width: units.gu(2.5) + height: units.gu(2.5) + color: LomiriColors.green + visible: (!isDownloading || downloadingModelId !== model.id) && failedModelId === model.id + + MouseArea { + anchors.fill: parent + onClicked: { + failedModelId = ""; + downloadModel(model.id, model.url, model.name); + } + } + } + + // Pause icon (when downloading) + Icon { + name: "media-playback-pause" + width: units.gu(2.5) + height: units.gu(2.5) + color: LomiriColors.orange + visible: isDownloading && downloadingModelId === model.id + + MouseArea { + anchors.fill: parent + onClicked: { + pauseDownload(); + } + } + } + + BusyIndicator { + width: units.gu(2.5) + height: units.gu(2.5) + running: isDownloading && downloadingModelId === model.id + visible: isDownloading && downloadingModelId === model.id + } + } + } + } + } + + // Empty state for available models + Text { + width: parent.width + height: units.gu(10) + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + text: i18n.dtr("ubtms", "All available models are installed.") + visible: availableModelList.count === 0 && !isLoading + color: "#888" + font.italic: true + }} + + + } + NotificationPopup { + id: notifPopup + } +} diff --git a/qml/SyncLog.qml b/qml/features/settings/pages/SyncLog.qml similarity index 99% rename from qml/SyncLog.qml rename to qml/features/settings/pages/SyncLog.qml index dec3b928..ea83b3a1 100644 --- a/qml/SyncLog.qml +++ b/qml/features/settings/pages/SyncLog.qml @@ -1,6 +1,6 @@ import QtQuick 2.7 import Lomiri.Components 1.3 -import "../models/accounts.js" as Accounts +import "../../../../models/accounts.js" as Accounts Page { id: syncLogPage diff --git a/qml/features/tasks/components/MyTasksClosedIndicator.qml b/qml/features/tasks/components/MyTasksClosedIndicator.qml new file mode 100644 index 00000000..44f833b1 --- /dev/null +++ b/qml/features/tasks/components/MyTasksClosedIndicator.qml @@ -0,0 +1,55 @@ +/* + * MIT License + * + * Copyright (c) 2025 CIT-Services + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import QtQuick 2.9 +import Lomiri.Components 1.3 + +Rectangle { + id: root + + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#2d5016" : "#dff0d8" + border.color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#5cb85c" + border.width: 1 + + Row { + anchors.centerIn: parent + spacing: units.gu(1) + + Icon { + name: "info" + width: units.gu(2) + height: units.gu(2) + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#3c763d" + anchors.verticalCenter: parent.verticalCenter + } + + Text { + text: i18n.dtr("ubtms", "Showing closed/completed tasks") + color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#3c763d" + font.pixelSize: units.gu(1.5) + font.bold: true + anchors.verticalCenter: parent.verticalCenter + } + } +} diff --git a/qml/features/tasks/components/TaskInitialStageSelector.qml b/qml/features/tasks/components/TaskInitialStageSelector.qml index 44e8e022..6290c2ab 100644 --- a/qml/features/tasks/components/TaskInitialStageSelector.qml +++ b/qml/features/tasks/components/TaskInitialStageSelector.qml @@ -7,55 +7,63 @@ import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import "../../../components" -Row { +Item { id: root - property alias currentIndex: stageComboBox.currentIndex + property int currentIndex: -1 property alias model: stageListModel property bool isReadOnly: false signal stageSelected(int odooRecordId) width: parent ? parent.width : 0 - height: units.gu(6) - spacing: units.gu(2) - topPadding: units.gu(1) - - TSLabel { - text: i18n.dtr("ubtms", "Initial Stage") - width: parent.width * 0.25 - anchors.verticalCenter: parent.verticalCenter - } + height: inlineSelector.height - ComboBox { - id: stageComboBox - width: parent.width * 0.65 - height: units.gu(5) - anchors.verticalCenter: parent.verticalCenter - enabled: !root.isReadOnly - displayText: currentIndex >= 0 ? stageListModel.get(currentIndex).name : "Select Stage" + InlineOptionSelector { + id: inlineSelector + anchors.left: parent.left + anchors.right: parent.right + + labelText: i18n.dtr("ubtms", "Initial Stage") + enabledState: !root.isReadOnly + readOnly: root.isReadOnly - model: ListModel { - id: stageListModel + onSelectionMade: { + for (var i = 0; i < stageListModel.count; i++) { + if (stageListModel.get(i).odoo_record_id === id) { + currentIndex = i; + break; + } + } } + } - delegate: ItemDelegate { - width: stageComboBox.width - contentItem: Text { - text: model.name - color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "white" : "black" - font: stageComboBox.font - elide: Text.ElideRight - verticalAlignment: Text.AlignVCenter - } - highlighted: stageComboBox.highlightedIndex === index + ListModel { + id: stageListModel + onCountChanged: { + updateModelData(); } + } - onCurrentIndexChanged: { - if (currentIndex >= 0) { - var stage = stageListModel.get(currentIndex); - root.stageSelected(stage.odoo_record_id); - } + function updateModelData() { + var arr = []; + for (var i = 0; i < stageListModel.count; i++) { + var item = stageListModel.get(i); + arr.push({ + id: item.odoo_record_id, + name: item.name + }); + } + inlineSelector.modelData = arr; + } + + onCurrentIndexChanged: { + if (currentIndex >= 0 && currentIndex < stageListModel.count) { + var stage = stageListModel.get(currentIndex); + inlineSelector.selectedId = stage.odoo_record_id; + root.stageSelected(stage.odoo_record_id); + } else { + inlineSelector.selectedId = -1; } } } diff --git a/qml/features/tasks/components/TaskScheduleFields.qml b/qml/features/tasks/components/TaskScheduleFields.qml index 536513e2..5e2150e0 100644 --- a/qml/features/tasks/components/TaskScheduleFields.qml +++ b/qml/features/tasks/components/TaskScheduleFields.qml @@ -111,17 +111,14 @@ Column { // ── Date Range Row ── Row { width: root.availableWidth - height: units.gu(30) + height: date_range_widget.height - Column { - leftPadding: units.gu(1) - DateRangeSelector { - id: date_range_widget - readOnly: root.isReadOnly - width: root.availableWidth < units.gu(361) ? root.availableWidth - units.gu(35) : root.availableWidth - units.gu(30) + DateRangeSelector { + id: date_range_widget + readOnly: root.isReadOnly + width: parent.width - onRangeChanged: root.dateRangeChanged() - } + onRangeChanged: root.dateRangeChanged() } } diff --git a/qml/MyTasks.qml b/qml/features/tasks/pages/MyTasksPage.qml similarity index 57% rename from qml/MyTasks.qml rename to qml/features/tasks/pages/MyTasksPage.qml index 842ddb36..59b01c5b 100644 --- a/qml/MyTasks.qml +++ b/qml/features/tasks/pages/MyTasksPage.qml @@ -1,49 +1,54 @@ /* -* MIT License -* -* Copyright (c) 2025 CIT-Services -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in all -* copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ + * MIT License + * + * Copyright (c) 2025 CIT-Services + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ import QtQuick 2.9 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 -import QtQuick.Window 2.2 -import QtQml.Models 2.3 -import "../models/timesheet.js" as Model -import "../models/timesheet.js" as Timesheet -import "../models/project.js" as Project -import "../models/task.js" as Task -import "../models/utils.js" as Utils -import "../models/accounts.js" as Account -import "../models/global.js" as Global -import "components" -import "features/tasks/components" +import "../../../../models/timesheet.js" as Timesheet +import "../../../../models/task.js" as Task +import "../../../../models/accounts.js" as Account +import "../../../../models/global.js" as Global +import "../../../components" +import "../components" Page { - property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false id: myTasksPage + + property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false + property var personalStages: [] + property var currentPersonalStageId: undefined + property string currentSearchQuery: "" + property bool showFoldedTasks: false + property int currentUserOdooId: -1 + property int selectedAccountId: -1 + property bool isLoading: false + title: i18n.dtr("ubtms", "My Tasks") header: PageHeader { id: myTasksHeader + StyleHints { foregroundColor: "white" backgroundColor: LomiriColors.orange @@ -56,39 +61,32 @@ Page { iconName: "navigation-menu" text: i18n.dtr("ubtms", "Menu") visible: !isMultiColumn - onTriggered: { - apLayout.openGlobalDrawer() - } + onTriggered: apLayout.openGlobalDrawer() } ] - title: myTasksPage.title + title: myTasksPage.title trailingActionBar.numberOfSlots: 5 - trailingActionBar.actions: [ Action { iconName: "add" text: "New" onTriggered: { - apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { + apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("Tasks.qml"), { "recordid": 0, "isReadOnly": false }); } }, - Action { + Action { iconName: myTasksList.flatViewMode ? "view-list-symbolic" : "view-grid-symbolic" text: myTasksList.flatViewMode ? i18n.dtr("ubtms", "Tree View") : i18n.dtr("ubtms", "Flat View") - onTriggered: { - myTasksList.toggleFlatView(); - } + onTriggered: myTasksList.toggleFlatView() }, Action { iconName: "search" text: "Search" - onTriggered: { - myTaskListHeader.toggleSearchVisibility(); - } + onTriggered: myTaskListHeader.toggleSearchVisibility() }, Action { iconName: "help" @@ -106,7 +104,6 @@ Page { text: showFoldedTasks ? "Hide Closed" : "Show Closed" onTriggered: { showFoldedTasks = !showFoldedTasks; - // Refresh the task list with the new filter (paginated) if (currentUserOdooId > 0) { startPaginatedLoad(); } @@ -115,25 +112,13 @@ Page { ] } - // Properties for filter and search state - property var personalStages: [] - property var currentPersonalStageId: undefined // undefined = not initialized, null = "All", 0 = "No Stage", >0 = specific stage - property string currentSearchQuery: "" - property bool showFoldedTasks: false // Toggle for showing closed/folded tasks - - // Properties for current user filtering - property int currentUserOdooId: -1 - property int selectedAccountId: -1 // Tracks the currently selected account, -1 means use default - - // Loading state property - property bool isLoading: false - - // Timer for deferred loading - gives UI time to render loading indicator Timer { id: loadingTimer - interval: 50 // 50ms delay to ensure UI renders + interval: 50 repeat: false + property var loadingCallback: null + onTriggered: { if (loadingCallback) { loadingCallback(); @@ -143,14 +128,12 @@ Page { } } - // Helper function to load tasks with loading indicator function loadTasksWithIndicator(callback) { isLoading = true; loadingTimer.loadingCallback = callback; loadingTimer.start(); } - // Paginated loading function: fetches a page of tasks from DB function loadPersonalStagesDelegate(limit, offset) { var effectiveAccountId = getEffectiveAccountId(); if (currentUserOdooId <= 0) { @@ -170,16 +153,12 @@ Page { offset ); - var tasks = result.tasks; myTasksList.hasMoreItems = result.hasMore; - - var isAppend = (offset > 0); - myTasksList.updateDisplayedTasks(tasks, isAppend); + myTasksList.updateDisplayedTasks(result.tasks, offset > 0); myTasksList.isLoadingMore = false; myTasksList.isLoading = false; } - // Convenience function to reset pagination and load the first page function startPaginatedLoad() { myTasksList.currentOffset = 0; myTasksList.hasMoreItems = true; @@ -187,17 +166,13 @@ Page { loadPersonalStagesDelegate(myTasksList.pageSize, 0); } - // Function to get the effective account ID (handles -1 for "All Accounts") function getEffectiveAccountId() { if (selectedAccountId === -1 || selectedAccountId < 0) { - var defaultId = Account.getDefaultAccountId(); - //console.log("MyTasks: selectedAccountId is", selectedAccountId, "- falling back to default account:", defaultId); - return defaultId; + return Account.getDefaultAccountId(); } return selectedAccountId; } - // Function to load personal stages for the current user function loadPersonalStages() { var effectiveAccountId = getEffectiveAccountId(); if (currentUserOdooId <= 0 || effectiveAccountId < 0) { @@ -205,13 +180,12 @@ Page { return; } - var stages = Task.getPersonalStagesForUser(currentUserOdooId, effectiveAccountId); // Start with loaded stages + var stages = Task.getPersonalStagesForUser(currentUserOdooId, effectiveAccountId); var allStages = []; for (var i = 0; i < stages.length; i++) { allStages.push(stages[i]); } - // Add "All" option at the end allStages.push({ odoo_record_id: null, name: "All", @@ -219,29 +193,18 @@ Page { }); personalStages = allStages; - - // console.log("loadPersonalStages: personalStages.length =", personalStages.length); - // for (var i = 0; i < personalStages.length; i++) { - // console.log(" Stage", i, ":", personalStages[i].name, "ID:", personalStages[i].odoo_record_id); - // } - - // Update the ListHeader with dynamic labels (preserves current filter) updateListHeaderWithStages(); - // Only set initial filter on first load (when currentPersonalStageId is undefined) if (currentPersonalStageId === undefined && personalStages.length > 0) { currentPersonalStageId = personalStages[0].odoo_record_id; - // console.log("loadPersonalStages: Initial currentPersonalStageId set to", currentPersonalStageId, "(first stage)"); } } - // Function to update ListHeader with personal stage names function updateListHeaderWithStages() { if (personalStages.length === 0) { return; } - // Build dynamic filter model for all stages var filterModel = []; for (var i = 0; i < personalStages.length; i++) { var stage = personalStages[i]; @@ -251,10 +214,8 @@ Page { }); } - // Update the filter model without resetting the current filter myTaskListHeader.filterModel = filterModel; - // Only set currentFilter if it hasn't been set yet or if the current stage is valid if (currentPersonalStageId !== null && currentPersonalStageId !== undefined) { myTaskListHeader.currentFilter = String(currentPersonalStageId); } else if (myTaskListHeader.currentFilter === "" && filterModel.length > 0) { @@ -262,14 +223,9 @@ Page { } } - // Function to get current user's odoo_record_id for the selected account function updateCurrentUser() { var effectiveAccountId = getEffectiveAccountId(); - if (effectiveAccountId >= 0) { - currentUserOdooId = Account.getCurrentUserOdooId(effectiveAccountId); - } else { - currentUserOdooId = -1; - } + currentUserOdooId = effectiveAccountId >= 0 ? Account.getCurrentUserOdooId(effectiveAccountId) : -1; } function clearCurrentTasks() { @@ -284,11 +240,7 @@ Page { myTasksList.updateDisplayedTasks([], false); } - // Function to handle account selection changes function handleAccountChange(accountId) { - //console.log("MyTasks: Account changed to", accountId); - - // Normalize account ID to number var idNum = -1; try { if (typeof accountId !== "undefined" && accountId !== null) { @@ -300,11 +252,7 @@ Page { } selectedAccountId = idNum; - - // Reset the personal stage selection currentPersonalStageId = undefined; - - // Update current user for the new account updateCurrentUser(); if (currentUserOdooId <= 0) { @@ -312,10 +260,8 @@ Page { return; } - // Reload personal stages for the new account loadPersonalStages(); - // Refresh the task list with the first personal stage (paginated) if (currentUserOdooId > 0 && personalStages.length > 0 && currentPersonalStageId !== undefined) { loadTasksWithIndicator(function() { startPaginatedLoad(); @@ -325,38 +271,43 @@ Page { } } - // Add the ListHeader component + function refreshData() { + if (typeof mainView !== "undefined" && mainView !== null && typeof mainView.currentAccountId !== "undefined") { + var acctId = mainView.currentAccountId; + if (acctId !== selectedAccountId && acctId >= -1) { + handleAccountChange(acctId); + return; + } + } + + updateCurrentUser(); + loadPersonalStages(); + + if (currentUserOdooId > 0) { + startPaginatedLoad(); + } else { + clearCurrentTasks(); + } + } + ListHeader { id: myTaskListHeader anchors.top: myTasksHeader.bottom anchors.left: parent.left anchors.right: parent.right - // Dynamic filter model will be set by updateListHeaderWithStages() filterModel: [] - showSearchBox: false currentFilter: "" onFilterSelected: { - // Update the ListHeader's currentFilter so the UI highlight moves myTaskListHeader.currentFilter = filterKey; - // Parse filterKey to get personal stage ID - // filterKey is string: "null" for All, "0" for No Stage, or actual stage ID - var stageId; - if (filterKey === "null") { - stageId = null; // Show all tasks - } else { - stageId = parseInt(filterKey); - } - + var stageId = filterKey === "null" ? null : parseInt(filterKey); myTasksPage.currentPersonalStageId = stageId; myTasksPage.currentSearchQuery = ""; - // Update current user before applying filter updateCurrentUser(); - if (currentUserOdooId > 0) { loadTasksWithIndicator(function() { startPaginatedLoad(); @@ -366,12 +317,9 @@ Page { onCustomSearch: { myTasksPage.currentSearchQuery = query; - - // Update current user before applying search updateCurrentUser(); if (currentUserOdooId > 0) { - // Search uses the paginated function with search query pushed to SQL loadTasksWithIndicator(function() { startPaginatedLoad(); }); @@ -379,38 +327,13 @@ Page { } } - // Visual indicator when showing folded tasks - Rectangle { + MyTasksClosedIndicator { id: foldedTasksIndicator visible: showFoldedTasks anchors.top: myTaskListHeader.bottom anchors.left: parent.left anchors.right: parent.right height: units.gu(4) - color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#2d5016" : "#dff0d8" - border.color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#5cb85c" - border.width: 1 - - Row { - anchors.centerIn: parent - spacing: units.gu(1) - - Icon { - name: "info" - width: units.gu(2) - height: units.gu(2) - color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#3c763d" - anchors.verticalCenter: parent.verticalCenter - } - - Text { - text: i18n.dtr("ubtms", "Showing closed/completed tasks") - color: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "#4caf50" : "#3c763d" - font.pixelSize: units.gu(1.5) - font.bold: true - anchors.verticalCenter: parent.verticalCenter - } - } } LomiriShape { @@ -425,37 +348,30 @@ Page { id: myTasksList anchors.fill: parent clip: true - - // Delegate for pagination loadDelegate: loadPersonalStagesDelegate - - // MyTasks does NOT filter by account selection - // It ALWAYS uses the default account set in Settings filterByAccount: false - - // Enable assignee filtering to show only current user's tasks filterByAssignees: true selectedAssigneeIds: [] - - // Set context flag so TaskDetailsCard knows we're in MyTasks isMyTasksContext: true onTaskEditRequested: { - apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { + apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("Tasks.qml"), { "recordid": recordId, "isReadOnly": false }); } + onTaskSelected: { - apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { + apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("Tasks.qml"), { "recordid": recordId, "isReadOnly": true }); } + onTaskTimesheetRequested: { - let result = Timesheet.createTimesheetFromTask(localId); + var result = Timesheet.createTimesheetFromTask(localId); if (result.success) { - apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("Timesheet.qml"), { + apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); @@ -463,6 +379,7 @@ Page { notifPopup.open("Error", "Unable to create timesheet", "error"); } } + onTaskDeleteRequested: { var check = Task.checkTaskHasChildren(recordId); if (check.hasChildren) { @@ -474,7 +391,7 @@ Page { } else { notifPopup.open("Deleted", result.message, "success"); pageStack.removePages(myTasksPage); - apLayout.addPageToCurrentColumn(myTasksPage, Qt.resolvedUrl("MyTasks.qml")); + apLayout.addPageToCurrentColumn(myTasksPage, Qt.resolvedUrl("MyTasksPage.qml")); } } } @@ -485,7 +402,7 @@ Page { anchors.centerIn: parent font.pixelSize: units.gu(2) visible: false - text:i18n.dtr("ubtms", "No Tasks Assigned to You") + text: i18n.dtr("ubtms", "No Tasks Assigned to You") } } @@ -502,11 +419,12 @@ Page { menuModel: [ { label: i18n.dtr("ubtms", "Create") - }, + } ] + onMenuItemSelected: { if (index === 0) { - apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("features/tasks/pages/Tasks.qml"), { + apLayout.addPageToNextColumn(myTasksPage, Qt.resolvedUrl("Tasks.qml"), { "recordid": 0, "isReadOnly": false }); @@ -514,30 +432,24 @@ Page { } } - - - // Listen directly to the picker as well, because MyTasks is often opened - // as a dynamic page and should react immediately to account changes. Connections { target: accountPicker - onAccepted: function (id, name) { + onAccepted: function(id, name) { handleAccountChange(id); } } Connections { - target: typeof mainView !== 'undefined' ? mainView : null + target: typeof mainView !== "undefined" ? mainView : null function onAccountDataRefreshRequested(accountId) { - // console.log("🔄 MyTasks: Refreshing data for account:", accountId); if (accountId >= -1 && accountId !== selectedAccountId) { handleAccountChange(accountId); } } function onGlobalAccountChanged(accountId, accountName) { - // console.log("🔄 MyTasks: Global account changed to:", accountId, accountName); if (accountId >= -1 && accountId !== selectedAccountId) { handleAccountChange(accountId); } @@ -546,58 +458,24 @@ Page { onVisibleChanged: { if (visible) { - // Update navigation tracking Global.setLastVisitedPage("MyTasks"); - - // Sync with mainView's current account (primary source of truth) - if (typeof mainView !== 'undefined' && mainView !== null) { - if (typeof mainView.currentAccountId !== 'undefined') { - var acctId = mainView.currentAccountId; - if (acctId !== selectedAccountId && acctId >= -1) { - //console.log("MyTasks: Syncing with mainView.currentAccountId on visible:", acctId); - handleAccountChange(acctId); - return; // handleAccountChange will refresh everything - } - } - } - - // Refresh user data and personal stages when page becomes visible - updateCurrentUser(); - loadPersonalStages(); - - // Apply current personal stage filter (paginated) - if (currentUserOdooId > 0) { - startPaginatedLoad(); - } + refreshData(); } } Component.onCompleted: { - // Sync with mainView's current account (this persists across page loads) - if (typeof mainView !== 'undefined' && mainView !== null) { - if (typeof mainView.currentAccountId !== 'undefined') { - selectedAccountId = mainView.currentAccountId; - //console.log("MyTasks: Initialized with mainView.currentAccountId:", selectedAccountId); - } + if (typeof mainView !== "undefined" && mainView !== null && typeof mainView.currentAccountId !== "undefined") { + selectedAccountId = mainView.currentAccountId; } - - - // Final fallback: use default account if (selectedAccountId === -1) { selectedAccountId = Account.getDefaultAccountId(); - //console.log("MyTasks: No account selection found, using default account:", selectedAccountId); } - // Get current user from selected account updateCurrentUser(); - // Load personal stages for the current user if (currentUserOdooId > 0) { loadPersonalStages(); - - // Apply initial personal stage filter (first stage in the list) - // Note: "All" is now at the end, so first stage is a specific personal stage if (personalStages.length > 0 && currentPersonalStageId !== undefined) { loadTasksWithIndicator(function() { startPaginatedLoad(); @@ -606,7 +484,6 @@ Page { } } - // Loading indicator LoadingIndicator { anchors.fill: parent visible: isLoading diff --git a/qml/features/tasks/pages/Task_Page.qml b/qml/features/tasks/pages/Task_Page.qml index b9168e53..0722a5a5 100644 --- a/qml/features/tasks/pages/Task_Page.qml +++ b/qml/features/tasks/pages/Task_Page.qml @@ -355,7 +355,7 @@ Page { onTaskTimesheetRequested: { let result = Timesheet.createTimesheetFromTask(localId); if (result.success) { - apLayout.addPageToNextColumn(task, Qt.resolvedUrl("Timesheet.qml"), { + apLayout.addPageToNextColumn(task, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); diff --git a/qml/features/tasks/pages/Tasks.qml b/qml/features/tasks/pages/Tasks.qml index ce50741f..43722c97 100644 --- a/qml/features/tasks/pages/Tasks.qml +++ b/qml/features/tasks/pages/Tasks.qml @@ -638,6 +638,7 @@ Page { id: contentColumn width: parent.width spacing: units.gu(1) + topPadding: units.gu(2) Row { id: myRow1a @@ -778,7 +779,7 @@ Page { var contentToPass = getFormattedText(); Global.description_temporary_holder = contentToPass; description_text.liveSyncActive = true; - apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../ReadMorePage.qml"), { + apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { isReadOnly: isReadOnly, parentDraftHandler: draftHandler // Pass draft handler reference }); @@ -819,7 +820,7 @@ Page { onCreateActivityRequested: { let result = Activity.createActivityFromProjectOrTask(false, currentTask.account_id, currentTask.odoo_record_id); if (result.success) { - apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../Activities.qml"), { + apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../activities/pages/Activities.qml"), { "recordid": result.record_id, "accountid": currentTask.account_id, "isReadOnly": false @@ -830,7 +831,7 @@ Page { } onViewActivitiesRequested: { console.log("Viewing activities for task:", currentTask.id, "odoo_record_id:", currentTask.odoo_record_id); - apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../Activity_Page.qml"), { + apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../activities/pages/Activity_Page.qml"), { "filterByTasks": true, "taskOdooRecordId": currentTask.odoo_record_id, "projectAccountId": currentTask.account_id, @@ -840,7 +841,7 @@ Page { onCreateTimesheetRequested: { const result = Timesheet.createTimesheetFromTask(currentTask.odoo_record_id); if (result.success) { - apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../Timesheet.qml"), { + apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../timesheets/pages/Timesheet.qml"), { "recordid": result.id, "isReadOnly": false }); @@ -851,7 +852,7 @@ Page { } onViewTimesheetsRequested: { console.log("Viewing timesheets for task:", currentTask.id, "odoo_record_id:", currentTask.odoo_record_id); - apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../../Timesheet_Page.qml"), { + apLayout.addPageToNextColumn(taskCreate, Qt.resolvedUrl("../../timesheets/pages/Timesheet_Page.qml"), { "filterByTask": true, "taskOdooRecordId": currentTask.odoo_record_id, "taskAccountId": currentTask.account_id, diff --git a/qml/components/TimeRecorderWidget.qml b/qml/features/timesheets/components/TimeRecorderWidget.qml similarity index 94% rename from qml/components/TimeRecorderWidget.qml rename to qml/features/timesheets/components/TimeRecorderWidget.qml index c7193ee4..7ced382d 100644 --- a/qml/components/TimeRecorderWidget.qml +++ b/qml/features/timesheets/components/TimeRecorderWidget.qml @@ -7,10 +7,11 @@ import QtQuick 2.7 import Lomiri.Components 1.3 import QtQuick.Layouts 1.11 import QtQuick.Controls 2.2 -import "../../models/constants.js" as AppConst -import "../../models/timer_service.js" as TimerService -import "../../models/timesheet.js" as TimeSheet -import "../../models/utils.js" as Utils +import "../../../../models/constants.js" as AppConst +import "../../../../models/timer_service.js" as TimerService +import "../../../../models/timesheet.js" as TimeSheet +import "../../../../models/utils.js" as Utils +import "../../../components" Item { id: autoRecorder @@ -151,12 +152,12 @@ Item { source: { if (!autoMode) - return "../images/play (1).png"; + return "../../../images/play (1).png"; if (isRecording) { - return "../images/pause.png"; + return "../../../images/pause.png"; } else { - return "../images/play (1).png"; + return "../../../images/play (1).png"; } } @@ -200,7 +201,7 @@ Item { id: finalizeIcon anchors.fill: parent anchors.margins: units.gu(0.3) - source: "../images/stop.png" + source: "../../../images/stop.png" fillMode: Image.PreserveAspectFit } diff --git a/qml/components/TimeSheetDescriptionPopup.qml b/qml/features/timesheets/components/TimeSheetDescriptionPopup.qml similarity index 98% rename from qml/components/TimeSheetDescriptionPopup.qml rename to qml/features/timesheets/components/TimeSheetDescriptionPopup.qml index a8997673..11c32b88 100644 --- a/qml/components/TimeSheetDescriptionPopup.qml +++ b/qml/features/timesheets/components/TimeSheetDescriptionPopup.qml @@ -26,9 +26,9 @@ import QtQuick 2.7 import QtQuick.Controls 2.2 import Lomiri.Components.Popups 1.3 import Lomiri.Components 1.3 -import "../../models/timesheet.js" as Model -import "../../models/accounts.js" as Accounts -import "../../models/utils.js" as Utils +import "../../../../models/timesheet.js" as Model +import "../../../../models/accounts.js" as Accounts +import "../../../../models/utils.js" as Utils Item { id: popupWrapper diff --git a/qml/components/TimeSheetDetailsCard.qml b/qml/features/timesheets/components/TimeSheetDetailsCard.qml similarity index 95% rename from qml/components/TimeSheetDetailsCard.qml rename to qml/features/timesheets/components/TimeSheetDetailsCard.qml index 39173961..d5e4733d 100644 --- a/qml/components/TimeSheetDetailsCard.qml +++ b/qml/features/timesheets/components/TimeSheetDetailsCard.qml @@ -25,10 +25,11 @@ import QtQuick 2.12 import QtQuick.Controls 2.2 import Lomiri.Components 1.3 import QtQuick.Layouts 1.1 -import "../../models/utils.js" as Utils -import "../../models/constants.js" as AppConst -import "../../models/timer_service.js" as TimerService -import "../../models/timesheet.js" as Timesheet +import "../../../../models/utils.js" as Utils +import "../../../../models/constants.js" as AppConst +import "../../../../models/timer_service.js" as TimerService +import "../../../../models/timesheet.js" as Timesheet +import "../../../components" ListItem { id: timesheetItem @@ -135,12 +136,12 @@ ListItem { iconSource: { if (recordId === TimerService.getActiveTimesheetId()) { if (TimerService.isPaused()) { - return "../images/play.png"; + return "../../../images/play.png"; } else { - return "../images/pause.png"; + return "../../../images/pause.png"; } } else { - return "../images/play.png"; + return "../../../images/play.png"; } } visible: recordId > 0 @@ -151,7 +152,7 @@ ListItem { }, Action { id: startstopaction - iconSource: "../images/stop.png" + iconSource: "../../../images/stop.png" visible: ((recordId === TimerService.getActiveTimesheetId()) && (TimerService.isRunning())) text: i18n.dtr("ubtms", "update Timesheet") onTriggered: { @@ -161,7 +162,7 @@ ListItem { Action { id: readyAction visible: (recordId !== TimerService.getActiveTimesheetId()) //Dont show this for the active running entry - iconSource: "../images/save.svg" + iconSource: "../../../images/save.svg" text: i18n.dtr("ubtms", "Mark Ready for Sync") onTriggered: { save_workflow(); diff --git a/qml/components/TimeSheetGrid.qml b/qml/features/timesheets/components/TimeSheetGrid.qml similarity index 98% rename from qml/components/TimeSheetGrid.qml rename to qml/features/timesheets/components/TimeSheetGrid.qml index 3034a09e..44f89f53 100644 --- a/qml/components/TimeSheetGrid.qml +++ b/qml/features/timesheets/components/TimeSheetGrid.qml @@ -27,7 +27,8 @@ import QtQuick.Controls 2.2 import QtQuick.Layouts 1.1 import QtQuick.Window 2.2 import QtGraphicalEffects 1.0 -import "../../models/constants.js" as AppConst +import "../../../../models/constants.js" as AppConst +import "../../../../models/timesheet.js" as Model Item { id: timesheetGrid diff --git a/qml/Timesheet.qml b/qml/features/timesheets/pages/Timesheet.qml similarity index 96% rename from qml/Timesheet.qml rename to qml/features/timesheets/pages/Timesheet.qml index 22719a12..e2146ead 100644 --- a/qml/Timesheet.qml +++ b/qml/features/timesheets/pages/Timesheet.qml @@ -31,13 +31,15 @@ import Lomiri.Components.Pickers 1.3 import QtCharts 2.0 import QtQuick.Window 2.2 import Qt.labs.settings 1.0 -import "../models/timesheet.js" as Model -import "../models/accounts.js" as Accounts -import "../models/timer_service.js" as TimerService -import "../models/utils.js" as Utils -import "../models/global.js" as Global -import "components" -import "components/richtext" +import "../../../../models/timesheet.js" as Model +import "../../../../models/accounts.js" as Accounts +import "../../../../models/timer_service.js" as TimerService +import "../../../../models/utils.js" as Utils +import "../../../../models/global.js" as Global +import "../../../../models/task.js" as Task +import "../../../components" +import "../../../components/richtext" +import "../components" Page { id: timeSheet @@ -75,7 +77,7 @@ Page { trailingActionBar.actions: [ Action { - iconSource: "images/save.svg" + iconSource: "../../../images/save.svg" visible: !isReadOnly text: "Save" onTriggered: { @@ -394,6 +396,17 @@ Page { let subProjectId = (currentTimesheet.sub_project_id !== undefined && currentTimesheet.sub_project_id !== null) ? currentTimesheet.sub_project_id : -1; let subTaskId = (currentTimesheet.sub_task_id !== undefined && currentTimesheet.sub_task_id !== null) ? currentTimesheet.sub_task_id : -1; + // If a timesheet was saved with a subtask, the subtask ID was saved to the task_id column + // and the sub_task_id column was set to null. We need to check if the loaded taskId has a parent + // task to restore the visual distinction between task and subtask in the selector. + if (taskId !== -1) { + var taskDetails = (instanceId === 0) ? Task.getTaskDetails(taskId) : Task.getTaskDetailsByOdooId(taskId, instanceId); + if (taskDetails && taskDetails.parent_id !== undefined && taskDetails.parent_id !== null && taskDetails.parent_id > 0) { + subTaskId = taskId; + taskId = taskDetails.parent_id; + } + } + // Check if this is a newly created timesheet (has recordid but no project/task data) if (projectId === -1 && taskId === -1) { // For new timesheets, load with account but no project/task data @@ -754,8 +767,6 @@ Page { id: date_widget readOnly: isReadOnly width: timesheetsDetailsPageFlickable.width - units.gu(2) - height: units.gu(5) - anchors.centerIn: parent.centerIn onDateChanged: { if (draftHandler.enabled && draftHandler._initialized) { @@ -795,7 +806,7 @@ Page { //set the data to a global store and pass the key to the page Global.description_temporary_holder = getFormattedText(); description_text.liveSyncActive = true; - apLayout.addPageToNextColumn(timeSheet, Qt.resolvedUrl("ReadMorePage.qml"), { + apLayout.addPageToNextColumn(timeSheet, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { isReadOnly: isReadOnly, useRichText: false, parentDraftHandler: draftHandler // Pass draft handler reference diff --git a/qml/Timesheet_Page.qml b/qml/features/timesheets/pages/Timesheet_Page.qml similarity index 97% rename from qml/Timesheet_Page.qml rename to qml/features/timesheets/pages/Timesheet_Page.qml index bfe58245..575569b7 100644 --- a/qml/Timesheet_Page.qml +++ b/qml/features/timesheets/pages/Timesheet_Page.qml @@ -27,12 +27,13 @@ import Lomiri.Components 1.3 import QtQuick.Window 2.2 import Ubuntu.Components 1.3 as Ubuntu import QtQuick.LocalStorage 2.7 -import "../models/timesheet.js" as Model -import "../models/project.js" as Project -import "../models/accounts.js" as Account -import "../models/global.js" as Global -import "components" -import "../models/timer_service.js" as TimerService +import "../../../../models/timesheet.js" as Model +import "../../../../models/project.js" as Project +import "../../../../models/accounts.js" as Account +import "../../../../models/global.js" as Global +import "../../../../models/timer_service.js" as TimerService +import "../../../components" +import "../components" Page { property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false diff --git a/qml/Updates.qml b/qml/features/updates/pages/Updates.qml similarity index 93% rename from qml/Updates.qml rename to qml/features/updates/pages/Updates.qml index ae00ddc1..571b12d0 100644 --- a/qml/Updates.qml +++ b/qml/features/updates/pages/Updates.qml @@ -30,12 +30,12 @@ import Qt.labs.settings 1.0 import Lomiri.Components 1.3 import Lomiri.Components.Popups 1.3 import Lomiri.Components.Pickers 1.3 -import "../models/utils.js" as Utils -import "../models/project.js" as Project -import "../models/accounts.js" as Accounts -import "../models/global.js" as Global -import "components" -import "components/richtext" +import "../../../../models/utils.js" as Utils +import "../../../../models/project.js" as Project +import "../../../../models/accounts.js" as Accounts +import "../../../../models/global.js" as Global +import "../../../components" +import "../../../components/richtext" Page { id: updateDetailsPage @@ -118,7 +118,7 @@ Page { } trailingActionBar.actions: [ Action { - iconSource: "images/save.svg" + iconSource: "../../../images/save.svg" visible: !isReadOnly text: i18n.dtr("ubtms", "Save") onTriggered: { @@ -240,7 +240,7 @@ Page { if (draftData.project_status !== undefined) { var statusIndex = updateDetailsPage.projectUpdateStatus.indexOf(draftData.project_status); if (statusIndex !== -1) { - statusSelector.currentIndex = statusIndex; + statusSelector.applyDeferredSelection(statusIndex, false); } } if (draftData.progress !== undefined) { @@ -262,7 +262,7 @@ Page { if (originalData.project_status !== undefined) { var statusIndex = updateDetailsPage.projectUpdateStatus.indexOf(originalData.project_status); if (statusIndex !== -1) { - statusSelector.currentIndex = statusIndex; + statusSelector.applyDeferredSelection(statusIndex, false); } } if (originalData.progress !== undefined) progressSlider.value = originalData.progress; @@ -455,21 +455,24 @@ Page { Column { width: parent.width - units.gu(2) - TSLabel { - text: i18n.dtr("ubtms", "Project Status") - width: parent.width - } - - ComboBox { + InlineOptionSelector { id: statusSelector width: parent.width - model: updateDetailsPage.projectUpdateStatus - currentIndex: updateDetailsPage.projectUpdateStatus.indexOf(currentUpdate.project_status) >= 0 ? updateDetailsPage.projectUpdateStatus.indexOf(currentUpdate.project_status) : 0 - enabled: !isReadOnly + labelText: i18n.dtr("ubtms", "Project Status") + selectorType: "project_status" + modelData: [ + {id: 0, name: i18n.dtr("ubtms", "On Track")}, + {id: 1, name: i18n.dtr("ubtms", "At Risk")}, + {id: 2, name: i18n.dtr("ubtms", "Off Track")}, + {id: 3, name: i18n.dtr("ubtms", "On Hold")} + ] + selectedId: updateDetailsPage.projectUpdateStatus.indexOf(currentUpdate.project_status) >= 0 ? updateDetailsPage.projectUpdateStatus.indexOf(currentUpdate.project_status) : 0 + readOnly: isReadOnly + enabledState: !isReadOnly - onCurrentIndexChanged: { - if (!isInitializing && currentIndex >= 0) { - draftHandler.markFieldChanged("project_status", updateDetailsPage.projectUpdateStatus[currentIndex]); + onSelectionMade: { + if (!isInitializing && id >= 0) { + draftHandler.markFieldChanged("project_status", updateDetailsPage.projectUpdateStatus[id]); } } } @@ -545,7 +548,7 @@ Page { Global.description_context = "update_description"; navigatingToReadMore = true; description_text.liveSyncActive = true; - apLayout.addPageToNextColumn(updateDetailsPage, Qt.resolvedUrl("ReadMorePage.qml"), { + apLayout.addPageToNextColumn(updateDetailsPage, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { isReadOnly: isReadOnly, parentDraftHandler: draftHandler }); @@ -587,7 +590,7 @@ Page { var formData = { name: name_text.text || "", description: description_text.getFormattedText() || "", - project_status: updateDetailsPage.projectUpdateStatus[statusSelector.currentIndex] || "", + project_status: (statusSelector.selectedId >= 0 && statusSelector.selectedId < updateDetailsPage.projectUpdateStatus.length) ? updateDetailsPage.projectUpdateStatus[statusSelector.selectedId] : "", progress: progressSlider.value || 0, account_id: currentUpdate.account_id || 0, project_id: currentUpdate.project_id || -1, @@ -649,7 +652,7 @@ Page { return; } - if (!updateDetailsPage.projectUpdateStatus[statusSelector.currentIndex]) { + if (statusSelector.selectedId < 0 || statusSelector.selectedId >= updateDetailsPage.projectUpdateStatus.length) { notifPopup.open("Error", "Please select a project status", "error"); return; } @@ -658,7 +661,7 @@ Page { account_id: accountId, project_id: projectId, name: Utils.cleanText(name_text.text), - project_status: updateDetailsPage.projectUpdateStatus[statusSelector.currentIndex], + project_status: updateDetailsPage.projectUpdateStatus[statusSelector.selectedId], progress: progressSlider.value, description: Utils.cleanText(description_text.getFormattedText()), user_id: currentUpdate.user_id || Accounts.getCurrentUserOdooId(accountId) @@ -729,7 +732,7 @@ Page { name_text.text = currentUpdate.name || ""; description_text.setContent(currentUpdate.description || ""); var statusIndex = updateDetailsPage.projectUpdateStatus.indexOf(currentUpdate.project_status || ""); - statusSelector.currentIndex = statusIndex >= 0 ? statusIndex : 0; + statusSelector.applyDeferredSelection(statusIndex >= 0 ? statusIndex : 0, false); progressSlider.value = currentUpdate.progress || 0; // Update display names for existing update @@ -767,7 +770,7 @@ Page { // Set initial values FIRST name_text.text = ""; description_text.setContent(""); - statusSelector.currentIndex = 0; // "on_track" is at index 0 + statusSelector.applyDeferredSelection(0, false); progressSlider.value = 0; // Mark form as fully initialized diff --git a/qml/Updates_Page.qml b/qml/features/updates/pages/Updates_Page.qml similarity index 97% rename from qml/Updates_Page.qml rename to qml/features/updates/pages/Updates_Page.qml index ea3429a1..8db8a2f0 100644 --- a/qml/Updates_Page.qml +++ b/qml/features/updates/pages/Updates_Page.qml @@ -27,11 +27,11 @@ import Lomiri.Components 1.3 import QtQuick.Window 2.2 import Ubuntu.Components 1.3 as Ubuntu import QtQuick.LocalStorage 2.7 -import "../models/project.js" as Project -import "../models/accounts.js" as Account -import "../models/global.js" as Global -import "components" -import "../models/timer_service.js" as TimerService +import "../../../../models/project.js" as Project +import "../../../../models/accounts.js" as Account +import "../../../../models/global.js" as Global +import "../../../components" +import "../../../../models/timer_service.js" as TimerService Page { property bool isMultiColumn: typeof apLayout !== "undefined" ? apLayout.columns > 1 : false @@ -336,7 +336,7 @@ Page { onShowDescription: { Global.description_temporary_holder = description; Global.description_context = "update_description"; - apLayout.addPageToNextColumn(updates, Qt.resolvedUrl("ReadMorePage.qml"), { + apLayout.addPageToNextColumn(updates, Qt.resolvedUrl("../../../components/richtext/ReadMorePage.qml"), { "isReadOnly": true }); } diff --git a/qml/images/download.svg b/qml/images/download.svg new file mode 100644 index 00000000..e906eba0 --- /dev/null +++ b/qml/images/download.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/qml/logo.png b/qml/images/logo.png similarity index 100% rename from qml/logo.png rename to qml/images/logo.png diff --git a/qml/images/mic.svg b/qml/images/mic.svg new file mode 100644 index 00000000..88825783 --- /dev/null +++ b/qml/images/mic.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/scripts/refactor_phase1_checks.sh b/scripts/refactor_phase1_checks.sh deleted file mode 100755 index 68d63639..00000000 --- a/scripts/refactor_phase1_checks.sh +++ /dev/null @@ -1,136 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Phase-1 migration checks -# Modes: -# report (default): print findings and warnings only -# strict: fail on defined gate violations - -MODE="${1:-report}" -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" - -if command -v rg >/dev/null 2>&1; then - SEARCH_TOOL="rg" -else - SEARCH_TOOL="grep" -fi - -if [[ "$MODE" != "report" && "$MODE" != "strict" ]]; then - echo "Usage: $0 [report|strict]" - exit 2 -fi - -fail_count=0 -warn_count=0 - -say() { - printf '%s\n' "$*" -} - -warn() { - warn_count=$((warn_count + 1)) - say "[WARN] $*" -} - -fail() { - fail_count=$((fail_count + 1)) - say "[FAIL] $*" -} - -pass() { - say "[PASS] $*" -} - -search_count_qml() { - local pattern="$1" - if [[ "$SEARCH_TOOL" == "rg" ]]; then - (rg -n --no-heading "$pattern" "$ROOT_DIR/qml" || true) | wc -l | tr -d ' ' - else - (grep -R -n -E "$pattern" "$ROOT_DIR/qml" || true) | wc -l | tr -d ' ' - fi -} - -search_count_qml_excluding_app() { - local pattern="$1" - if [[ "$SEARCH_TOOL" == "rg" ]]; then - ((rg -n --no-heading "$pattern" "$ROOT_DIR/qml" || true) | (rg -v "/qml/app/" || true)) | wc -l | tr -d ' ' - else - ((grep -R -n -E "$pattern" "$ROOT_DIR/qml" || true) | (grep -v "/qml/app/" || true)) | wc -l | tr -d ' ' - fi -} - -say "Running Phase-1 checks in mode: $MODE" - -# 1) Guardrail docs exist -for f in \ - "$ROOT_DIR/docs/refactor/phase-1-architecture-contract.md" \ - "$ROOT_DIR/docs/refactor/phase-1-naming-map.md" \ - "$ROOT_DIR/docs/refactor/phase-1-smoke-checklist.md"; do - if [[ -f "$f" ]]; then - pass "Found $(realpath --relative-to="$ROOT_DIR" "$f")" - else - fail "Missing $(realpath --relative-to="$ROOT_DIR" "$f")" - fi -done - -# 2) Detect direct AppLayout routing calls outside app shell (report baseline) -route_calls=$(search_count_qml_excluding_app "apLayout\\.(setPageGlobal|addPageToNextColumn|removePages)\\(") - -if [[ "$route_calls" -gt 0 ]]; then - if [[ "$MODE" == "strict" ]]; then - fail "Found $route_calls direct AppLayout routing calls outside qml/app" - else - warn "Found $route_calls direct AppLayout routing calls outside qml/app (expected before extraction)" - fi -else - pass "No direct AppLayout routing calls outside qml/app" -fi - -# 3) Legacy model imports baseline -legacy_imports=$(search_count_qml 'import[[:space:]]+"[^"]*/models/(task|timesheet|project|activity)\.js"') -if [[ "$legacy_imports" -gt 0 ]]; then - if [[ "$MODE" == "strict" ]]; then - fail "Found $legacy_imports legacy flat model imports" - else - warn "Found $legacy_imports legacy flat model imports (expected before model split)" - fi -else - pass "No legacy flat model imports found" -fi - -# 4) Python compatibility entrypoints present -for py in "$ROOT_DIR/src/backend.py" "$ROOT_DIR/src/daemon.py" "$ROOT_DIR/src/cli.py"; do - if [[ -f "$py" ]]; then - pass "Found $(realpath --relative-to="$ROOT_DIR" "$py")" - else - fail "Missing $(realpath --relative-to="$ROOT_DIR" "$py")" - fi -done - -# 5) Optional import smoke (non-fatal in report mode) -run_import_smoke() { - local module="$1" - local strict_fail="${2:-yes}" - if python3 -c "import sys; sys.path.insert(0, '$ROOT_DIR/src'); import $module" >/dev/null 2>&1; then - pass "Python import ok: $module" - else - if [[ "$MODE" == "strict" && "$strict_fail" == "yes" ]]; then - fail "Python import failed: $module" - else - warn "Python import failed: $module" - fi - fi -} - -run_import_smoke backend -run_import_smoke daemon -run_import_smoke cli no - -say "" -say "Summary: fails=$fail_count warnings=$warn_count" - -if [[ "$MODE" == "strict" && "$fail_count" -gt 0 ]]; then - exit 1 -fi - -exit 0 diff --git a/src/backend.py b/src/backend.py index 54a34015..fc1081ef 100755 --- a/src/backend.py +++ b/src/backend.py @@ -22,7 +22,7 @@ # SOFTWARE. -from config import get_all_accounts, initialize_app_settings_db, update_last_synced_at +from config import get_all_accounts, initialize_app_settings_db, update_last_synced_at, get_setting from odoo_client import OdooClient from sync_from_odoo import sync_all_from_odoo,sync_ondemand_tables_from_odoo from sync_to_odoo import sync_all_to_odoo @@ -31,7 +31,18 @@ log = setup_logger() import os +import sys from pathlib import Path +import ctypes + +# Add root directory and voice_to_text/lib to sys.path +root_dir = Path(__file__).parent.parent.resolve() +if str(root_dir) not in sys.path: + sys.path.insert(0, str(root_dir)) + +voice_lib = root_dir / "voice_to_text" / "lib" +if voice_lib.exists() and str(voice_lib) not in sys.path: + sys.path.insert(0, str(voice_lib)) import platform import urllib3 import json @@ -48,6 +59,46 @@ http = urllib3.PoolManager(cert_reqs="CERT_NONE") +# Voice model download state +download_status = { + "in_progress": False, + "progress": 0, + "message": "", + "error": "" +} + + +from urllib.parse import urlparse, unquote +import socket + +def check_server_reachability(url, timeout=3): + """ + Check if the Odoo server is reachable using a lightweight HTTP request. + This uses the same HTTP pool manager as the rest of the application + to ensure compatibility with Ubuntu Touch AppArmor sandbox rules. + """ + try: + normalized = (url or "").strip().rstrip("/") + if not normalized: + return False + + if "://" not in normalized: + normalized = f"https://{normalized}" + + # Try a HEAD request first (fast and lightweight) + response = http.request('HEAD', normalized, timeout=timeout, redirect=True) + # Any response (even error status codes like 404 or 403) means the server is reachable + return True + except Exception as e: + log.warning(f"[REACHABILITY] HTTP HEAD failed for {url}: {e}") + # Fallback to GET in case HEAD is blocked by the server + try: + response = http.request('GET', normalized, timeout=timeout, redirect=True) + return True + except Exception as e2: + log.warning(f"[REACHABILITY] HTTP GET fallback also failed: {e2}") + return False + def is_file_present(file_path): """ @@ -282,7 +333,7 @@ def ensure_export_file_from_base64(suggested_name, b64_data, mime): return None -def attachment_ondemand_download(settings_db,account_id, remote_record_id): +def attachment_ondemand_download(settings_db, account_id, remote_record_id): accounts = get_all_accounts(settings_db) selected = None for acc in accounts: @@ -291,19 +342,146 @@ def attachment_ondemand_download(settings_db,account_id, remote_record_id): break if not selected: - return None + return { + "success": False, + "error": "Account not found", + } - client = OdooClient( - selected["link"], - selected["database"], - selected["username"], - selected["api_key"], - ) - return client.ondemanddownload(remote_record_id,selected["username"],selected["api_key"],False) + try: + client = OdooClient( + selected["link"], + selected["database"], + selected["username"], + selected["api_key"], + ) + result = client.ondemanddownload( + remote_record_id, + selected["username"], + selected["api_key"], + False, + ) + if isinstance(result, dict): + result["success"] = True + return result + except Exception as e: + log.exception( + "[ATTACHMENT] Failed to download attachment %s for account %s", + remote_record_id, + account_id, + ) + return { + "success": False, + "error": str(e), + } + +def attachment_upload(settings_db, account_id, filepath, res_type, res_id): + try: + filepath = unquote(filepath) + send("ondemand_upload_message", "Initiating upload...") + log.debug(f"[SYNC] Starting attachment_upload to {account_id} : {filepath} , {res_type} ,{res_id}") + accounts = get_all_accounts(settings_db) + selected = None + for acc in accounts: + if acc.get("id") == account_id: + selected = acc + break + + if not selected: + send("ondemand_upload_message", "Error: Account not found") + send("ondemand_upload_completed", False) + return None + + # Check server reachability before proceeding + send("ondemand_upload_message", "Checking server connection...") + if not check_server_reachability(selected["link"]): + send("ondemand_upload_message", "Error: No internet connection or server unreachable") + send("ondemand_upload_completed", False) + return None -def attachment_upload(settings_db,account_id, filepath,res_type,res_id): - send("ondemand_upload_message","Initiating upload") - log.debug(f"[SYNC] Starting attachment_upload to {account_id} : {filepath} , {res_type} ,{res_id}") + send("ondemand_upload_message", "Checking file...") + if not os.path.exists(filepath): + send("ondemand_upload_message", "Error: File does not exist") + send("ondemand_upload_completed", False) + return None + + # 25 MB limit to prevent memory exhaustion and large payload failures + file_size = os.path.getsize(filepath) + if file_size > 25 * 1024 * 1024: + send("ondemand_upload_message", "Error: File exceeds 25MB limit") + send("ondemand_upload_completed", False) + return None + + filename = os.path.basename(filepath) + EXT_TO_MIME = { + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.png': 'image/png', + '.gif': 'image/gif', + '.pdf': 'application/pdf', + '.txt': 'text/plain', + '.csv': 'text/csv', + '.mp3': 'audio/mpeg', + '.mp4': 'video/mp4', + '.zip': 'application/zip' + } + send("ondemand_upload_message", "Reading file...") + ext = os.path.splitext(filename)[1].lower() + mimetype = EXT_TO_MIME.get(ext, 'application/octet-stream') + + file_bytes = None + with open(filepath, 'rb') as f: + file_bytes = f.read() + + client = OdooClient( + selected["link"], + selected["database"], + selected["username"], + selected["api_key"], + ) + + vals = { + 'name': filename, + 'type': 'binary', + 'res_model': res_type, + 'res_id': res_id, + 'datas': base64.b64encode(file_bytes).decode('utf-8'), + 'mimetype': mimetype + } + send("ondemand_upload_message", "Uploading file to server...") + attachment_id = client.call('ir.attachment', 'create', [vals]) + if not attachment_id or attachment_id <= 0: + send("ondemand_upload_message", "Error: Server failed to save attachment") + send("ondemand_upload_completed", False) + return None + + send("ondemand_upload_message", "Syncing to local device...") + sync_ondemand_tables_from_odoo(client, selected["id"], settings_db, account_name=selected.get("name", "")) + send("ondemand_upload_completed", True) + return attachment_id + + except Exception as e: + error_msg = str(e) + log.exception(f"[ATTACHMENT] Failed to upload attachment: {error_msg}") + + # User-friendly error message + friendly_error = "Upload failed" + if "connection" in error_msg.lower() or "refused" in error_msg.lower(): + friendly_error = "Connection failed: Check network/server" + elif "timeout" in error_msg.lower(): + friendly_error = "Request timed out" + elif "authentication" in error_msg.lower() or "access denied" in error_msg.lower() or "uid" in error_msg.lower(): + friendly_error = "Authentication failed: Check credentials" + elif "xmlrpc" in error_msg.lower() or "fault" in error_msg.lower(): + friendly_error = f"Server error: {error_msg[:60]}" + else: + friendly_error = f"Error: {error_msg[:60]}" + + send("ondemand_upload_message", friendly_error) + send("ondemand_upload_completed", False) + return None + +def attachment_delete(settings_db, account_id, remote_record_id): + log.debug(f"[SYNC] Starting attachment_delete for account {account_id}, attachment {remote_record_id}") accounts = get_all_accounts(settings_db) selected = None for acc in accounts: @@ -312,55 +490,43 @@ def attachment_upload(settings_db,account_id, filepath,res_type,res_id): break if not selected: - return None - send("ondemand_upload_message","Finding Account") - filename = os.path.basename(filepath) - EXT_TO_MIME = { - '.jpg': 'image/jpeg', - '.jpeg': 'image/jpeg', - '.png': 'image/png', - '.gif': 'image/gif', - '.pdf': 'application/pdf', - '.txt': 'text/plain', - '.csv': 'text/csv', - '.mp3': 'audio/mpeg', - '.mp4': 'video/mp4', - '.zip': 'application/zip' - # add more extensions as needed - } - send("ondemand_upload_message","Reading file ...") - ext = os.path.splitext(filename)[1].lower() # get extension including dot - mimetype = EXT_TO_MIME.get(ext, 'application/octet-stream') + return {"success": False, "error": "Account not found"} - file_bytes=None - # Read file content as binary - with open(filepath, 'rb') as f: - file_bytes = f.read() + try: + # Check server reachability before proceeding + if not check_server_reachability(selected["link"]): + return {"success": False, "error": "No internet connection or server unreachable"} - client = OdooClient( - selected["link"], - selected["database"], - selected["username"], - selected["api_key"], - ) + client = OdooClient( + selected["link"], + selected["database"], + selected["username"], + selected["api_key"], + ) + res = client.call('ir.attachment', 'unlink', [[remote_record_id]]) + if not res: + log.warning(f"Unlink returned false or empty response for attachment {remote_record_id}") + return {"success": False, "error": "Server failed to delete attachment"} - # Attach a file to the newly created partner - vals = { - 'name': filename, - 'type': 'binary', - 'res_model':res_type, - 'res_id':res_id, - 'datas': base64.b64encode(file_bytes).decode('utf-8'), - 'mimetype': mimetype - } - send("ondemand_upload_message","Uploading file .. ") - attachment_id = client.call('ir.attachment', 'create', [vals]) - if attachment_id <=0: - send("ondemand_upload_completed",False) - send("ondemand_upload_message","Syncing to local device .. ") - sync_ondemand_tables_from_odoo(client, selected["id"], settings_db, account_name=selected.get("name", "")) - send("ondemand_upload_completed",True) - return attachment_id + sync_ondemand_tables_from_odoo(client, selected["id"], settings_db, account_name=selected.get("name", "")) + return {"success": True} + except Exception as e: + error_msg = str(e) + log.exception(f"[ATTACHMENT] Failed to delete attachment {remote_record_id} for account {account_id}") + + friendly_error = "Delete failed" + if "connection" in error_msg.lower() or "refused" in error_msg.lower(): + friendly_error = "Connection failed: Check network/server" + elif "timeout" in error_msg.lower(): + friendly_error = "Request timed out" + elif "authentication" in error_msg.lower() or "access denied" in error_msg.lower() or "uid" in error_msg.lower(): + friendly_error = "Authentication failed: Check credentials" + elif "xmlrpc" in error_msg.lower() or "fault" in error_msg.lower(): + friendly_error = f"Server error: {error_msg[:60]}" + else: + friendly_error = f"Error: {error_msg[:60]}" + + return {"success": False, "error": friendly_error} def sync(settings_db, account_id): """ @@ -505,3 +671,703 @@ def start_sync_in_background(settings_db, account_id): Wrapper function for sync_background to provide a cleaner interface. """ return sync_background(settings_db, account_id) + +# Voice to Text STarts Here +_voice_stop_event = threading.Event() + +def stop_voice_recognition(): + """Signals the voice recognition thread to stop recording.""" + log.info("[VOICE] stop_voice_recognition called") + _voice_stop_event.set() + return True + +def get_voice_models_dir(): + """ + Returns the writable directory for voice models. + On Ubuntu Touch, this is in ~/.local/share/ubtms/voice_models + """ + data_home = os.environ.get('XDG_DATA_HOME') + if data_home: + base_dir = Path(data_home) / "ubtms" + else: + base_dir = Path.home() / ".local" / "share" / "ubtms" + + models_dir = base_dir / "voice_models" + models_dir.mkdir(parents=True, exist_ok=True) + return models_dir + + +def list_installed_models(): + """ + Scans for installed Vosk models in both the app directory and writable data directory. + Returns a list of dictionaries with model names, paths, and sizes. + """ + # 1. App directory models (Read-only on device) + app_models_dir = root_dir / "voice_to_text" + + # 2. User data directory models (Writable) + user_models_dir = get_voice_models_dir() + + search_paths = [ + (app_models_dir, "App"), + (user_models_dir, "User") + ] + + models = [] + seen_paths = set() + + for root_dir_to_scan, source_label in search_paths: + if not root_dir_to_scan.exists(): + continue + + # Standard Vosk models are directories containing 'am' and 'graph' subdirectories + for item in root_dir_to_scan.iterdir(): + if item.is_dir() and item not in seen_paths: + am_dir = item / "am" + graph_dir = item / "graph" + + if am_dir.exists() and graph_dir.exists(): + available_models = list_available_models() + known_names = {m["id"]: m["name"] for m in available_models if "id" in m} + known_names["model"] = "Indian English" # The bundled one is usually named 'model' + + if item.name in known_names: + model_name = known_names[item.name] + else: + # Fallback to cleaning README or using folder name + model_name = item.name + readme_path = item / "README" + if readme_path.exists(): + try: + with open(readme_path, 'r') as f: + first_line = f.readline().strip() + if first_line: + clean_name = first_line + noise_phrases = [ + "for mobile Vosk applications", + "for Android and iOS", + "Vosk mobile model", + "Vosk model", + "Vosk", + "model" + ] + for phrase in noise_phrases: + clean_name = clean_name.replace(phrase, "").strip() + + if clean_name: + model_name = clean_name + except Exception as e: + log.error(f"[VOICE] Error reading README for {item.name}: {e}") + + # Add (Default) suffix for bundled models + display_name = model_name + if source_label == "App": + display_name = f"{model_name} (Default)" + + # Calculate directory size + total_size = 0 + try: + for f in item.rglob('*'): + if f.is_file(): + total_size += f.stat().st_size + size_mb = total_size / (1024 * 1024) + model_size = f"{size_mb:.1f} MB" + except Exception: + model_size = "Unknown" + + try: + if source_label == "App": + rel_path = item.relative_to(root_dir) + else: + rel_path = item + + models.append({ + "m_name": display_name, + "m_path": str(rel_path), + "m_size": model_size, + "m_source": source_label + }) + except ValueError: + models.append({ + "m_name": display_name, + "m_path": str(item), + "m_size": model_size, + "m_source": source_label + }) + seen_paths.add(item) + + models.sort(key=lambda x: x["m_name"].lower()) + log.info(f"[VOICE] Found {len(models)} installed models") + return models + +def get_installed_voice_models(): + """Returns a list of installed voice model IDs.""" + models_dir = get_voice_models_dir() + if not models_dir.exists(): + return [] + # Any directory in models_dir is considered an installed model + installed = [d.name for d in models_dir.iterdir() if d.is_dir()] + log.info(f"[VOICE] Found {len(installed)} installed models") + return installed + +def get_device_total_ram_mb(): + """Returns total device RAM in MB to check model compatibility.""" + try: + with open('/proc/meminfo', 'r') as f: + for line in f: + if line.startswith('MemTotal:'): + parts = line.split() + return int(parts[1]) // 1024 + except Exception: + pass + # Fallback using sysconf if /proc/meminfo is not available + try: + import os + pagesize = os.sysconf('SC_PAGE_SIZE') + pages = os.sysconf('SC_PHYS_PAGES') + return (pagesize * pages) // (1024 * 1024) + except Exception: + pass + return 2048 # Fallback to 2048MB + + +def get_paused_voice_models(): + """Returns a list of model IDs that have a partial download file.""" + models_dir = get_voice_models_dir() + if not models_dir.exists(): + return [] + paused = [] + for f in models_dir.glob("*.zip.tmp"): + paused.append(f.name.replace(".zip.tmp", "")) + return paused + + +def list_available_models(): + """ + Returns a list of models available for download. + """ + models = [ + {"id": "vosk-model-small-en-us-0.15", "name": "English (US, Small)", "size": "40M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-en-us-0.15.zip"}, + {"id": "vosk-model-en-us-0.22", "name": "English (US)", "size": "1.8G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-0.22.zip"}, + {"id": "vosk-model-en-us-0.22-lgraph", "name": "English (US, LGraph)", "size": "128M", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-0.22-lgraph.zip"}, + {"id": "vosk-model-en-us-0.42-gigaspeech", "name": "English (US, Gigaspeech)", "size": "2.3G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-0.42-gigaspeech.zip"}, + {"id": "vosk-model-en-us-daanzu-20200905", "name": "English (US, Daanzu)", "size": "1.0G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-daanzu-20200905.zip"}, + {"id": "vosk-model-en-us-daanzu-20200905-lgraph", "name": "English (US, Daanzu LGraph)", "size": "129M", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-daanzu-20200905-lgraph.zip"}, + {"id": "vosk-model-en-us-librispeech-0.2", "name": "English (US, Librispeech)", "size": "845M", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-librispeech-0.2.zip"}, + {"id": "vosk-model-small-en-us-zamia-0.5", "name": "English (US, Zamia Small)", "size": "49M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-en-us-zamia-0.5.zip"}, + {"id": "vosk-model-en-us-aspire-0.2", "name": "English (US, Aspire)", "size": "1.4G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-aspire-0.2.zip"}, + {"id": "vosk-model-en-us-0.21", "name": "English (US, 0.21)", "size": "1.6G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-us-0.21.zip"}, + {"id": "vosk-model-en-in-0.5", "name": "English (Indian)", "size": "1G", "url": "https://alphacephei.com/vosk/models/vosk-model-en-in-0.5.zip"}, + {"id": "vosk-model-small-en-in-0.4", "name": "English (Indian, Small)", "size": "36M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-en-in-0.4.zip"}, + {"id": "vosk-model-small-cn-0.22", "name": "Chinese (Small)", "size": "42M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-cn-0.22.zip"}, + {"id": "vosk-model-cn-0.22", "name": "Chinese", "size": "1.3G", "url": "https://alphacephei.com/vosk/models/vosk-model-cn-0.22.zip"}, + {"id": "vosk-model-cn-kaldi-multicn-0.15", "name": "Chinese (Multi-cn)", "size": "1.5G", "url": "https://alphacephei.com/vosk/models/vosk-model-cn-kaldi-multicn-0.15.zip"}, + {"id": "vosk-model-ru-0.42", "name": "Russian", "size": "1.8G", "url": "https://alphacephei.com/vosk/models/vosk-model-ru-0.42.zip"}, + {"id": "vosk-model-small-ru-0.22", "name": "Russian (Small)", "size": "45M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ru-0.22.zip"}, + {"id": "vosk-model-ru-0.22", "name": "Russian (0.22)", "size": "1.5G", "url": "https://alphacephei.com/vosk/models/vosk-model-ru-0.22.zip"}, + {"id": "vosk-model-ru-0.10", "name": "Russian (0.10)", "size": "2.5G", "url": "https://alphacephei.com/vosk/models/vosk-model-ru-0.10.zip"}, + {"id": "vosk-model-small-fr-0.22", "name": "French (Small)", "size": "41M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-fr-0.22.zip"}, + {"id": "vosk-model-fr-0.22", "name": "French", "size": "1.4G", "url": "https://alphacephei.com/vosk/models/vosk-model-fr-0.22.zip"}, + {"id": "vosk-model-small-fr-pguyot-0.3", "name": "French (pguyot Small)", "size": "39M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-fr-pguyot-0.3.zip"}, + {"id": "vosk-model-fr-0.6-linto-2.2.0", "name": "French (Linto)", "size": "1.5G", "url": "https://alphacephei.com/vosk/models/vosk-model-fr-0.6-linto-2.2.0.zip"}, + {"id": "vosk-model-de-0.21", "name": "German", "size": "1.9G", "url": "https://alphacephei.com/vosk/models/vosk-model-de-0.21.zip"}, + {"id": "vosk-model-de-tuda-0.6-900k", "name": "German (Tuda)", "size": "4.4G", "url": "https://alphacephei.com/vosk/models/vosk-model-de-tuda-0.6-900k.zip"}, + {"id": "vosk-model-small-de-zamia-0.3", "name": "German (Zamia Small)", "size": "49M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-de-zamia-0.3.zip"}, + {"id": "vosk-model-small-de-0.15", "name": "German (Small)", "size": "45M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-de-0.15.zip"}, + {"id": "vosk-model-small-es-0.42", "name": "Spanish (Small)", "size": "39M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-es-0.42.zip"}, + {"id": "vosk-model-es-0.42", "name": "Spanish", "size": "1.4G", "url": "https://alphacephei.com/vosk/models/vosk-model-es-0.42.zip"}, + {"id": "vosk-model-small-pt-0.3", "name": "Portuguese (Small)", "size": "31M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-pt-0.3.zip"}, + {"id": "vosk-model-pt-fb-v0.1.1-20220516_2113", "name": "Portuguese", "size": "1.6G", "url": "https://alphacephei.com/vosk/models/vosk-model-pt-fb-v0.1.1-20220516_2113.zip"}, + {"id": "vosk-model-el-gr-0.7", "name": "Greek", "size": "1.1G", "url": "https://alphacephei.com/vosk/models/vosk-model-el-gr-0.7.zip"}, + {"id": "vosk-model-small-tr-0.3", "name": "Turkish (Small)", "size": "35M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-tr-0.3.zip"}, + {"id": "vosk-model-small-vn-0.4", "name": "Vietnamese (Small)", "size": "32M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-vn-0.4.zip"}, + {"id": "vosk-model-vn-0.4", "name": "Vietnamese", "size": "78M", "url": "https://alphacephei.com/vosk/models/vosk-model-vn-0.4.zip"}, + {"id": "vosk-model-small-it-0.22", "name": "Italian (Small)", "size": "48M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-it-0.22.zip"}, + {"id": "vosk-model-it-0.22", "name": "Italian", "size": "1.2G", "url": "https://alphacephei.com/vosk/models/vosk-model-it-0.22.zip"}, + {"id": "vosk-model-small-nl-0.22", "name": "Dutch (Small)", "size": "39M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-nl-0.22.zip"}, + {"id": "vosk-model-nl-spraakherkenning-0.6", "name": "Dutch", "size": "860M", "url": "https://alphacephei.com/vosk/models/vosk-model-nl-spraakherkenning-0.6.zip"}, + {"id": "vosk-model-nl-spraakherkenning-0.6-lgraph", "name": "Dutch (LGraph)", "size": "100M", "url": "https://alphacephei.com/vosk/models/vosk-model-nl-spraakherkenning-0.6-lgraph.zip"}, + {"id": "vosk-model-small-ca-0.4", "name": "Catalan (Small)", "size": "42M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ca-0.4.zip"}, + {"id": "vosk-model-ar-mgb2-0.4", "name": "Arabic (mgb2)", "size": "318M", "url": "https://alphacephei.com/vosk/models/vosk-model-ar-mgb2-0.4.zip"}, + {"id": "vosk-model-ar-0.22-linto-1.1.0", "name": "Arabic (Linto)", "size": "1.3G", "url": "https://alphacephei.com/vosk/models/vosk-model-ar-0.22-linto-1.1.0.zip"}, + {"id": "vosk-model-small-ar-tn-0.1-linto", "name": "Arabic Tunisian (Small)", "size": "158M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ar-tn-0.1-linto.zip"}, + {"id": "vosk-model-ar-tn-0.1-linto", "name": "Arabic Tunisian", "size": "517M", "url": "https://alphacephei.com/vosk/models/vosk-model-ar-tn-0.1-linto.zip"}, + {"id": "vosk-model-fa-0.42", "name": "Farsi", "size": "1.6G", "url": "https://alphacephei.com/vosk/models/vosk-model-fa-0.42.zip"}, + {"id": "vosk-model-small-fa-0.42", "name": "Farsi (Small)", "size": "53M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-fa-0.42.zip"}, + {"id": "vosk-model-fa-0.5", "name": "Farsi (0.5)", "size": "1G", "url": "https://alphacephei.com/vosk/models/vosk-model-fa-0.5.zip"}, + {"id": "vosk-model-small-fa-0.5", "name": "Farsi (Small 0.5)", "size": "60M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-fa-0.5.zip"}, + {"id": "vosk-model-tl-ph-generic-0.6", "name": "Filipino", "size": "320M", "url": "https://alphacephei.com/vosk/models/vosk-model-tl-ph-generic-0.6.zip"}, + {"id": "vosk-model-small-uk-v3-nano", "name": "Ukrainian (Nano)", "size": "73M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-uk-v3-nano.zip"}, + {"id": "vosk-model-small-uk-v3-small", "name": "Ukrainian (Small)", "size": "133M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-uk-v3-small.zip"}, + {"id": "vosk-model-uk-v3", "name": "Ukrainian", "size": "343M", "url": "https://alphacephei.com/vosk/models/vosk-model-uk-v3.zip"}, + {"id": "vosk-model-uk-v3-lgraph", "name": "Ukrainian (LGraph)", "size": "325M", "url": "https://alphacephei.com/vosk/models/vosk-model-uk-v3-lgraph.zip"}, + {"id": "vosk-model-small-kz-0.42", "name": "Kazakh (Small)", "size": "58M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-kz-0.42.zip"}, + {"id": "vosk-model-kz-0.42", "name": "Kazakh", "size": "1.3G", "url": "https://alphacephei.com/vosk/models/vosk-model-kz-0.42.zip"}, + {"id": "vosk-model-small-sv-rhasspy-0.15", "name": "Swedish (Small)", "size": "289M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-sv-rhasspy-0.15.zip"}, + {"id": "vosk-model-small-ja-0.22", "name": "Japanese (Small)", "size": "48M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ja-0.22.zip"}, + {"id": "vosk-model-ja-0.22", "name": "Japanese", "size": "1Gb", "url": "https://alphacephei.com/vosk/models/vosk-model-ja-0.22.zip"}, + {"id": "vosk-model-small-eo-0.42", "name": "Esperanto (Small)", "size": "42M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-eo-0.42.zip"}, + {"id": "vosk-model-small-hi-0.22", "name": "Hindi (Small)", "size": "42M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-hi-0.22.zip"}, + {"id": "vosk-model-hi-0.22", "name": "Hindi", "size": "1.5Gb", "url": "https://alphacephei.com/vosk/models/vosk-model-hi-0.22.zip"}, + {"id": "vosk-model-small-cs-0.4-rhasspy", "name": "Czech (Small)", "size": "44M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-cs-0.4-rhasspy.zip"}, + {"id": "vosk-model-small-pl-0.22", "name": "Polish (Small)", "size": "50M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-pl-0.22.zip"}, + {"id": "vosk-model-small-uz-0.22", "name": "Uzbek (Small)", "size": "49M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-uz-0.22.zip"}, + {"id": "vosk-model-small-ko-0.22", "name": "Korean (Small)", "size": "82M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ko-0.22.zip"}, + {"id": "vosk-model-br-0.8", "name": "Breton", "size": "70M", "url": "https://alphacephei.com/vosk/models/vosk-model-br-0.8.zip"}, + {"id": "vosk-model-gu-0.42", "name": "Gujarati", "size": "700M", "url": "https://alphacephei.com/vosk/models/vosk-model-gu-0.42.zip"}, + {"id": "vosk-model-small-gu-0.42", "name": "Gujarati (Small)", "size": "100M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-gu-0.42.zip"}, + {"id": "vosk-model-tg-0.22", "name": "Tajik", "size": "327M", "url": "https://alphacephei.com/vosk/models/vosk-model-tg-0.22.zip"}, + {"id": "vosk-model-small-tg-0.22", "name": "Tajik (Small)", "size": "50M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-tg-0.22.zip"}, + {"id": "vosk-model-small-te-0.42", "name": "Telugu (Small)", "size": "58M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-te-0.42.zip"}, + {"id": "vosk-model-small-ky-0.42", "name": "Kyrgyz (Small)", "size": "49M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ky-0.42.zip"}, + {"id": "vosk-model-ky-0.42", "name": "Kyrgyz", "size": "1.1G", "url": "https://alphacephei.com/vosk/models/vosk-model-ky-0.42.zip"}, + {"id": "vosk-model-small-ka-0.42", "name": "Georgian (Small)", "size": "45M", "url": "https://alphacephei.com/vosk/models/vosk-model-small-ka-0.42.zip"}, + {"id": "vosk-model-ka-0.42", "name": "Georgian", "size": "700M", "url": "https://alphacephei.com/vosk/models/vosk-model-ka-0.42.zip"} + ] + models.sort(key=lambda x: x["name"].lower()) + return models + + +def get_model_download_status(): + """Returns the current download status for UI polling.""" + return download_status + + +_voice_download_cancel_event = threading.Event() +_voice_download_action = None + +def cancel_voice_model_download(): + """Cancels an ongoing voice model download and deletes partial data.""" + global download_status, _voice_download_action + _voice_download_action = "cancel" + _voice_download_cancel_event.set() + download_status["in_progress"] = False + download_status["is_paused"] = False + download_status["message"] = "Download cancelled" + + # Clean up any partial download files immediately to prevent them from showing up on restart + models_dir = get_voice_models_dir() + if models_dir.exists(): + for f in models_dir.glob("*.zip.tmp"): + try: + f.unlink() + except Exception: + pass + + return {"status": "cancelled"} + +def pause_voice_model_download(): + """Pauses an ongoing voice model download, keeping partial data.""" + global download_status, _voice_download_action + _voice_download_action = "pause" + _voice_download_cancel_event.set() + download_status["in_progress"] = False + download_status["is_paused"] = True + download_status["message"] = "Download paused" + return {"status": "paused"} + +def download_voice_model(model_id, url): + """ + Initiates a background thread to download and extract a voice model. + """ + global download_status + _voice_download_cancel_event.clear() + if download_status["in_progress"]: + return {"status": "error", "message": "Download already in progress"} + + download_status = { + "in_progress": True, + "progress": download_status.get("progress", 0), + "message": "Starting download...", + "error": "", + "model_id": model_id, + "is_paused": False + } + + def do_download(): + import zipfile + import shutil + temp_zip = None + temp_extract_dir = None + try: + models_dir = get_voice_models_dir() + target_path = models_dir / model_id + + if target_path.exists(): + download_status["in_progress"] = False + download_status["message"] = "Model already installed" + download_status["progress"] = 100 + return + + temp_zip = models_dir / f"{model_id}.zip.tmp" + existing_size = 0 + if temp_zip.exists(): + existing_size = temp_zip.stat().st_size + + headers = {} + if existing_size > 0: + headers['Range'] = f'bytes={existing_size}-' + log.info(f"[VOICE] Resuming {model_id} from {existing_size} bytes") + download_status["message"] = "Resuming..." + else: + log.info(f"[VOICE] Downloading model from {url}") + download_status["message"] = "Downloading..." + + # Using urllib3 for download with a timeout to handle sudden internet disconnection + response = http.request('GET', url, headers=headers, preload_content=False, timeout=urllib3.Timeout(connect=5.0, read=10.0)) + if response.status not in (200, 206, 416): + raise Exception(f"Server returned status {response.status}") + + if response.status == 200 and existing_size > 0: + # Server ignored Range header, restart from scratch + log.info(f"[VOICE] Server ignored Range, restarting download") + existing_size = 0 + temp_zip.unlink() + + content_length = response.getheader('Content-Length') + total_size = (int(content_length) + existing_size) if content_length else None + + if total_size and existing_size == 0: + # Check available disk space only on new downloads + try: + _, _, free = shutil.disk_usage(str(models_dir)) + free_mb = free / (1024 * 1024) + required_mb = (total_size * 2.5) / (1024 * 1024) + if free < total_size * 2.5: + raise Exception(f"Insufficient storage. Have {free_mb:.1f} MB, need at least {required_mb:.1f} MB available.") + except Exception as disk_err: + if isinstance(disk_err, Exception) and "Insufficient storage" in str(disk_err): + raise disk_err + log.warning(f"[VOICE] Could not check disk space: {disk_err}") + + downloaded = existing_size + mode = 'ab' if existing_size > 0 else 'wb' + with open(temp_zip, mode) as f: + for chunk in response.stream(1024 * 64): + if _voice_download_cancel_event.is_set(): + action = _voice_download_action + if action == "pause": + raise Exception("PAUSED_BY_USER") + else: + raise Exception("CANCELLED_BY_USER") + f.write(chunk) + downloaded += len(chunk) + if total_size: + progress = int((downloaded / total_size) * 80) # 80% for download + download_status["progress"] = progress + send("download_progress", progress) + + download_status["message"] = "Extracting..." + send("download_message", "Extracting...") + download_status["progress"] = 85 + send("download_progress", 85) + + # Extract to a temporary directory to ensure atomic installation + temp_extract_dir = models_dir / f"{model_id}.extract.tmp" + if temp_extract_dir.exists(): + shutil.rmtree(temp_extract_dir) + temp_extract_dir.mkdir(parents=True, exist_ok=True) + + with zipfile.ZipFile(temp_zip) as z: + z.extractall(temp_extract_dir) + + # Vosk models usually have a single folder inside the zip + # We want to find the directory containing the actual model files ('am' and 'graph') + model_folder = None + for root, dirs, files in os.walk(temp_extract_dir): + if 'am' in dirs and 'graph' in dirs: + model_folder = Path(root) + break + + if not model_folder: + # Fallback: look for any subdirectory + subdirs = [d for d in temp_extract_dir.iterdir() if d.is_dir()] + if len(subdirs) == 1: + model_folder = subdirs[0] + else: + model_folder = temp_extract_dir + + # Move to final location (atomic move on same filesystem) + if target_path.exists(): + shutil.rmtree(target_path) + shutil.move(str(model_folder), str(target_path)) + + download_status["progress"] = 100 + download_status["message"] = "Installation complete" + download_status["in_progress"] = False + send("download_progress", 100) + send("download_completed", True) + log.info(f"[VOICE] Successfully installed model {model_id}") + + except Exception as e: + err_str = str(e) + log.exception(f"[VOICE] Download interrupted: {err_str}") + download_status["in_progress"] = False + + if err_str == "PAUSED_BY_USER": + download_status["is_paused"] = True + download_status["message"] = "Paused" + # Do not unlink temp_zip + elif err_str == "CANCELLED_BY_USER": + download_status["is_paused"] = False + download_status["message"] = "Cancelled" + if temp_zip and temp_zip.exists(): + try: + temp_zip.unlink() + except: + pass + else: + # Network error or other failure + download_status["error"] = err_str + download_status["message"] = "Failed" + download_status["is_paused"] = True # Keep partial file for resume + send("download_error", err_str) + + finally: + if temp_extract_dir and temp_extract_dir.exists(): + try: + shutil.rmtree(temp_extract_dir) + except Exception: + pass + + threading.Thread(target=do_download, daemon=True).start() + return {"status": "started"} + + +def delete_voice_model(model_path): + """ + Deletes a voice model from the user data directory. + Cannot delete bundled models in the app directory. + """ + try: + path = Path(model_path) + + # If relative, it might be a bundled model or a legacy relative path + if not path.is_absolute(): + # Check if it's relative to user models dir + user_models_dir = get_voice_models_dir() + potential_path = user_models_dir / model_path + if potential_path.exists(): + path = potential_path + else: + # Check if it's relative to root (bundled models) + potential_path = root_dir / model_path + if potential_path.exists(): + path = potential_path + + if not path.exists(): + return {"status": "error", "message": "Model path not found"} + + # Security check: only allow deleting from the user models directory + user_models_dir = get_voice_models_dir() + if user_models_dir in path.parents: + import shutil + if path.is_dir(): + shutil.rmtree(path) + else: + path.unlink() + log.info(f"[VOICE] Deleted user model: {model_path}") + return {"status": "success"} + + # Check if it's in the app dir + app_models_dir = root_dir / "voice_to_text" + if app_models_dir in path.parents or path == app_models_dir: + log.warning(f"[VOICE] Attempted to delete bundled model: {model_path}") + return {"status": "error", "message": "Cannot delete bundled system models"} + + return {"status": "error", "message": "Permission denied"} + except Exception as e: + log.exception(f"[VOICE] Failed to delete model {model_path}: {e}") + return {"status": "error", "message": str(e)} + + +def resolve_settings_db_path(db_name="myDatabase", app_id="ubtms"): + """Finds a specific QML database by its name (hash).""" + import hashlib + db_hash = hashlib.md5(db_name.encode()).hexdigest() + target_filename = f"{db_hash}.sqlite" + + user_home = Path.home() + db_paths = [ + user_home / ".local" / "share" / app_id / "Databases", + user_home / ".clickable" / "home" / ".local" / "share" / app_id / "Databases" + ] + + for db_dir in db_paths: + target = db_dir / target_filename + if target.exists(): + return str(target) + return None + + +def _subprocess_recognize(model_path, pipe, timeout): + """Runs voice recognition in a separate process to avoid blocking the GIL.""" + import signal + def sigterm_handler(signum, frame): + raise SystemExit(0) + signal.signal(signal.SIGTERM, sigterm_handler) + + try: + from voice_to_text.voice2text import recognize_from_mic + + class PipeStopEvent: + def is_set(self): + if pipe.poll(): + msg = pipe.recv() + if msg == "stop": + return True + return False + + def _partial(txt): + pipe.send(("partial", txt)) + + def _status(txt): + pipe.send(("status", txt)) + + text, err = recognize_from_mic(verbose=False, stop_event=PipeStopEvent(), timeout=timeout, partial_callback=_partial, status_callback=_status, model_path=model_path) + pipe.send(("final", text, err)) + except Exception as e: + import traceback + pipe.send(("final", None, f"Subprocess Error: {e}")) + + +def run_voice_recognition(): + """ + Runs voice recognition in a background thread to avoid blocking the UI. + Uses the offline Vosk engine. + """ + def do_recognition(): + import multiprocessing + try: + log.info("[VOICE] Starting offline voice recognition thread") + + # Fetch the active model path from settings + # First try the specific settings DB + db_path = resolve_settings_db_path("myDatabase") + if not db_path: + # Fallback to main app DB + db_path = resolve_qml_db_path() + + active_model_rel_path = "" + if db_path: + active_model_rel_path = get_setting(db_path, "active_voice_model", "") + + # Resolve relative path if necessary + root_dir = Path(__file__).parent.parent.resolve() + + model_path = None + if active_model_rel_path: + if not os.path.isabs(active_model_rel_path): + model_path = root_dir / active_model_rel_path + else: + model_path = Path(active_model_rel_path) + + if not model_path or not model_path.exists(): + installed_models = list_installed_models() + if installed_models: + active_model_rel_path = installed_models[0]["m_path"] + if not os.path.isabs(active_model_rel_path): + model_path = root_dir / active_model_rel_path + else: + model_path = Path(active_model_rel_path) + + if db_path: + try: + from config import set_setting + set_setting(db_path, "active_voice_model", active_model_rel_path) + except Exception as e: + log.warning(f"[VOICE] Could not auto-save active model to db: {e}") + else: + log.error("[VOICE] No language model downloaded") + send("voice_recognition_error", "No language model downloaded. Please download one in Voice Model Settings.") + return + + # Paths to search for bundled libraries + base_voice_path = Path(__file__).parent.parent / "voice_to_text" + lib_path = base_voice_path / "lib" + + # Pre-load libatomic if it exists in our bundle (fixes arm64 dependency issue) + atomic_lib = lib_path / "libatomic.so.1" + if atomic_lib.exists(): + try: + ctypes.CDLL(str(atomic_lib)) + log.info(f"[VOICE] Pre-loaded {atomic_lib}") + except Exception as e: + log.warning(f"[VOICE] Could not pre-load libatomic: {e}") + + # Add bundled libs to environment for nested dependencies + env_path = str(lib_path) + if "LD_LIBRARY_PATH" in os.environ: + os.environ["LD_LIBRARY_PATH"] = f"{env_path}:{os.environ['LD_LIBRARY_PATH']}" + else: + os.environ["LD_LIBRARY_PATH"] = env_path + + from voice_to_text.voice2text import list_microphones + + # Reset the stop event + _voice_stop_event.clear() + + # Log available mics for debug + log.info(f"[VOICE] mics: {list_microphones()}") + + # Run recognition in a separate process to avoid GIL blocking and UI freezing + parent_conn, child_conn = multiprocessing.Pipe() + ctx = multiprocessing.get_context("spawn") + p = ctx.Process(target=_subprocess_recognize, args=(str(model_path), child_conn, 30)) + p.start() + + import time + received_final = False + stop_sent_time = None + while p.is_alive(): + if _voice_stop_event.is_set(): + parent_conn.send("stop") + _voice_stop_event.clear() + if stop_sent_time is None: + stop_sent_time = time.time() + + # Watchdog: terminate if process ignores stop signal for > 5 seconds + if stop_sent_time is not None and (time.time() - stop_sent_time > 5.0): + log.warning("[VOICE] Watchdog triggered: Process failed to stop cleanly. Terminating.") + p.terminate() + break + + if parent_conn.poll(0.5): + msg = parent_conn.recv() + if msg[0] == "partial": + send("voice_recognition_partial", msg[1]) + elif msg[0] == "status": + send("voice_recognition_status", msg[1]) + elif msg[0] == "final": + received_final = True + text, error = msg[1], msg[2] + if text: + log.info(f"[VOICE] Recognized text: {text}") + send("voice_recognition_result", text) + else: + log.warning(f"[VOICE] Recognition failed: {error or 'No speech detected'}") + send("voice_recognition_error", error or "No speech detected") + break + + # Ensure process cleanup + p.join(timeout=1) + if p.is_alive(): + p.terminate() + p.join() + + # Handle unexpected crash (like OOM kill) + if not received_final: + exit_code = p.exitcode + if exit_code is not None and exit_code != 0: + err_msg = f"Voice recognition crashed unexpectedly (possibly Out of Memory). Exit code: {exit_code}" + log.error(f"[VOICE] {err_msg}") + send("voice_recognition_error", err_msg) + + except Exception as e: + log.exception(f"[VOICE] Error during voice recognition: {e}") + send("voice_recognition_error", f"System Error: {str(e)}") + + thread = threading.Thread(target=do_recognition) + thread.daemon = True + thread.start() + return True diff --git a/src/daemon.py b/src/daemon.py index 1d6c5563..ef44b03d 100644 --- a/src/daemon.py +++ b/src/daemon.py @@ -149,7 +149,7 @@ def get_app_version(): if Path(MANIFEST_PATH).exists(): with open(MANIFEST_PATH, 'r') as f: manifest = json.load(f) - return manifest.get('version', '1.2.7') + return manifest.get('version', '1.2.9') # Fallback to development path dev_manifest = Path(__file__).parent.parent / "manifest.json.in" if dev_manifest.exists(): @@ -162,7 +162,7 @@ def get_app_version(): return match.group(1) except Exception as e: log.error(f"[DAEMON] Failed to read app version: {e}") - return "1.2.8" # Fallback version + return "1.2.9" # Fallback version APP_VERSION = get_app_version() diff --git a/ubtms.apparmor b/ubtms.apparmor index aa1477b4..bf976a61 100644 --- a/ubtms.apparmor +++ b/ubtms.apparmor @@ -1,5 +1,5 @@ { - "policy_groups": ["networking","content_exchange","content_exchange_source","webview", "push-notification-client"], + "policy_groups": ["networking","content_exchange","content_exchange_source","webview", "push-notification-client", "audio"], "policy_version": 20.04, "template": "unconfined" } diff --git a/voice_to_text/__init__.py b/voice_to_text/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/voice_to_text/requirements.txt b/voice_to_text/requirements.txt new file mode 100644 index 00000000..19f2a86d --- /dev/null +++ b/voice_to_text/requirements.txt @@ -0,0 +1,10 @@ +certifi==2024.2.2 +cffi==1.17.1 +charset-normalizer==3.4.7 +idna==3.13 +requests==2.31.0 +srt==3.5.3 +tqdm==4.67.3 +urllib3==1.26.18 +vosk==0.3.45 +websockets==13.1 diff --git a/voice_to_text/voice2text.py b/voice_to_text/voice2text.py new file mode 100644 index 00000000..0ae7d383 --- /dev/null +++ b/voice_to_text/voice2text.py @@ -0,0 +1,165 @@ +import os +import sys +import subprocess +import json +import wave +import logging +import shutil +from pathlib import Path + +# Use the app's logger +logger = logging.getLogger("odoo_sync") + +# Attempt to import vosk. It will be in sys.path if added by backend.py +try: + # pyrefly: ignore [missing-import] + from vosk import Model, KaldiRecognizer +except ImportError: + pass + +def recognize_from_mic(verbose=True, stop_event=None, timeout=30, partial_callback=None, status_callback=None, model_path=None): + """ + Records audio using arecord and recognizes it using Vosk (offline). + Returns (text, error_message). + + If stop_event is provided, it will stop recording when the event is set. + """ + audio_path = None + try: + # Paths + base_path = Path(__file__).parent.resolve() + + if model_path: + model_path = Path(model_path) + else: + model_path = base_path / "model" + + if not model_path.exists(): + return None, f"Vosk model not found at {model_path}" + + if status_callback: + status_callback("Preparing...~$") + + # Load the model and initialize recognizer + if verbose: logger.info(f"Loading Vosk model from {model_path} for live processing...") + model = Model(str(model_path)) + rec = KaldiRecognizer(model, 16000) + rec.SetWords(True) + + if status_callback: + status_callback("Listening...~$") + + try: + arecord_cmd = "arecord" + use_ffmpeg = False + + for p in ["/usr/bin/arecord", "/bin/arecord", "/usr/local/bin/arecord"]: + if os.path.exists(p): + arecord_cmd = p + break + else: + if shutil.which("ffmpeg"): + arecord_cmd = "ffmpeg" + use_ffmpeg = True + + logger.info(f"[VOICE] Executing live recording: {arecord_cmd}") + + if use_ffmpeg: + # Output as s16le raw PCM to stdout ("-") + cmd = [arecord_cmd, "-y", "-f", "alsa", "-i", "default", "-ac", "1", "-ar", "16000", "-f", "s16le", "-"] + else: + cmd = [arecord_cmd, "-f", "S16_LE", "-r", "16000", "-c", "1", "-"] + + import time + process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) + + try: + start_time = time.time() + last_speech_time = start_time + hard_max_duration = 300 # 5 minutes absolute max + silence_timeout = 7.0 # Stop after 7 seconds of silence + + results = [] + last_partial = "" + + # Read from stdout in chunks + # `read(4000)` might block until 4000 bytes are available, which is fine for live streams. + while process.poll() is None: + current_time = time.time() + + if stop_event and stop_event.is_set(): + logger.info("[VOICE] Stop signal received, terminating record process.") + break + + if (current_time - start_time) > hard_max_duration: + logger.info("[VOICE] Absolute max duration reached, stopping.") + break + + if (current_time - last_speech_time) > silence_timeout: + logger.info("[VOICE] Silence timeout reached, stopping auto-record.") + break + + # We use a non-blocking-ish approach or just read. + # read 4000 bytes (125ms of 16kHz 16-bit mono) + data = process.stdout.read(4000) + if len(data) == 0: + break + + if rec.AcceptWaveform(data): + res = json.loads(rec.Result()) + if res.get("text"): + results.append(res["text"]) + last_speech_time = time.time() # Just finished a phrase + last_partial = "" + if partial_callback: + combined = " ".join(results).strip() + partial_callback(combined) + else: + res = json.loads(rec.PartialResult()) + current_partial = res.get("partial", "") + if current_partial: + # User is actively speaking if partial result changes + if current_partial != last_partial: + last_speech_time = time.time() + last_partial = current_partial + + if partial_callback: + combined = " ".join(results + [current_partial]).strip() + partial_callback(combined) + finally: + if process.stdout: + process.stdout.close() + if process.poll() is None: + try: + process.terminate() + process.wait(timeout=1) + except Exception: + try: + process.kill() + except Exception: + pass + else: + process.wait() + + except (FileNotFoundError, Exception) as e: + logger.exception(f"[VOICE] System error running {arecord_cmd}: {e}") + return None, f"Recording tool error: {str(e)}" + + # Capture final bit of speech + res = json.loads(rec.FinalResult()) + if res.get("text"): + results.append(res["text"]) + + text = " ".join(results).strip() + if text: + return text, None + else: + return None, "No speech detected" + + except Exception as e: + return None, f"Deep Error: {str(e)}" + +def list_microphones(): + """Returns a list of available microphone names.""" + # Since we use arecord's default, we just return a placeholder. + return ["System Default (via arecord)"] diff --git a/website/README.md b/website/README.md new file mode 100644 index 00000000..0b678334 --- /dev/null +++ b/website/README.md @@ -0,0 +1,18 @@ +# TimeManagement Website + +This directory contains the Docusaurus-based product website and documentation portal for the project. + +## Local development + +```bash +cd website +npm install +npm run start +``` + +## Production build + +```bash +cd website +npm run build +``` diff --git a/website/docs/contributing/documentation-governance.md b/website/docs/contributing/documentation-governance.md new file mode 100644 index 00000000..f00a0942 --- /dev/null +++ b/website/docs/contributing/documentation-governance.md @@ -0,0 +1,31 @@ +--- +title: Documentation Governance +sidebar_label: Documentation Governance +--- + +# Documentation Governance + +The Docusaurus site becomes the primary public documentation surface for the project. + +## Rules of thumb + +- update user docs when behavior visible to users changes +- update technical docs when code ownership, architecture, or build flow changes +- update contributor docs when workflow or review expectations change +- keep the homepage focused on product narrative, not deep implementation detail + +## Ownership model + +Recommended lightweight ownership: + +- one maintainer owns information architecture and homepage consistency +- feature authors own correctness of feature-specific pages +- reviewers check documentation impact as part of PR review + +## Content lifecycle + +During the migration period: + +- the root `README.md` stays short and points to the site +- legacy files under `docs/` remain as source material +- curated, audience-oriented guidance lives in `website/docs/` diff --git a/website/docs/contributing/getting-started.md b/website/docs/contributing/getting-started.md new file mode 100644 index 00000000..0a72c0dc --- /dev/null +++ b/website/docs/contributing/getting-started.md @@ -0,0 +1,34 @@ +--- +title: Contributor Getting Started +sidebar_label: Getting Started +--- + +# Contributor Getting Started + +This section is for engineers and collaborators who need local setup guidance plus the project rules for shipping changes safely. + +## First steps + +1. Clone the repository. +2. Verify the app build path with `clickable desktop`. +3. Review the technical docs to understand the QML, JavaScript, and Python split. +4. Review the PR guidance before opening changes. + +## Working on the docs site + +The docs site is now part of the repository: + +```bash +cd website +npm install +npm run start +``` + +## Contribution expectations + +Contributors should update documentation when changes are: + +- user-visible +- architecture-visible +- setup-related +- release-impacting diff --git a/website/docs/contributing/pull-request-guidelines.md b/website/docs/contributing/pull-request-guidelines.md new file mode 100644 index 00000000..a085e35c --- /dev/null +++ b/website/docs/contributing/pull-request-guidelines.md @@ -0,0 +1,50 @@ +--- +title: Pull Request Guidelines +sidebar_label: Pull Request Guidelines +--- + +# Pull Request Guidelines + +This page migrates the current repository PR guidance into the site. + +## Branch strategy + +- branch from `main` +- use branch names such as `feature/add-timesheet-export` +- keep work scoped to one logical change where possible + +## Before opening a PR + +### Code quality + +- code should pass the relevant app build and review steps +- no hardcoded credentials, URLs, or API keys +- no debug logging left in production code +- follow existing code style and conventions + +### Testing + +- test on desktop with `clickable desktop` +- test on device when possible with `clickable install` +- for CLI-oriented Python changes, verify with `python3 -m py_compile ` + +### Documentation + +- update relevant docs when adding or changing functionality +- add inline comments only where code is non-obvious +- update naming or architecture contracts when applicable + +## PR description + +Every PR should include: + +- summary +- change type +- testing notes +- screenshots for UI changes + +## Current source + +The original project source remains in the repository during migration: + +- [Pull Request Guidelines Source](https://github.com/CITOpenRep/timemanagement/blob/main/docs/PR-GUIDELINES.md) diff --git a/website/docs/technical/activities.md b/website/docs/technical/activities.md new file mode 100644 index 00000000..877ae6d1 --- /dev/null +++ b/website/docs/technical/activities.md @@ -0,0 +1,71 @@ +--- +title: Activities Module Technical Reference +sidebar_label: Activities Module +--- + +# Activities Module Technical Reference + +The Activities Module implements localized activity planning, Odoo activity synchronization, and follow-up creation. + +## Codebase Map + +| Layer | Path | Purpose | +|---|---|---| +| **Frontend UI** | `qml/features/activities/` | UI pages and components for activities | +| **State & Logic** | `models/activity.js` | JS database bindings and UI state management | +| **Backend Service** | `src/daemon.py` | Python activity manager and sync worker | +| **D-Bus Interface** | `src/backend.py` | D-Bus methods exposing activity status | + +## Database Schema + +Activities are stored locally in the following SQLite tables: + +### `mail_activity_app` +Stores activity instances synced with Odoo or created locally. +* `id` (INTEGER, Primary Key): Local unique ID. +* `res_id` (INTEGER): ID of the linked document (e.g. Project or Task ID). +* `res_model` (TEXT): Name of the linked model (e.g. `project.project` or `project.task`). +* `activity_type_id` (INTEGER): References the activity type. +* `summary` (TEXT): Single-line overview. +* `note` (TEXT): Rich/Plain multiline text. +* `date_deadline` (TEXT): Due date in YYYY-MM-DD. +* `user_id` (INTEGER): Assignee reference. +* `done` (INTEGER): Binary status (0 = Open, 1 = Completed). + +### `mail_activity_type_app` +Stores types of activities (e.g., Email, Call, Meeting, To-Do). +* `id` (INTEGER, Primary Key): Unique Odoo activity type ID. +* `name` (TEXT): Type label. +* `icon` (TEXT): Icon identifier corresponding to Lomiri style. + +--- + +## Sync Mechanism & Network Protocol + +### Odoo XML-RPC Model Mapping +* **Remote Model**: `mail.activity` +* **Sync Direction**: Bidirectional (local modifications -> server; server modifications -> local). + +```mermaid +sequenceDiagram + participant UI as QML Client + participant DB as SQLite DB + participant DN as Python Daemon + participant OD as Odoo Server + + UI->>DB: Save Activity (Done status / New entry) + DN->>DB: Read unsynced local changes + DN->>OD: XML-RPC (mail.activity create/write/unlink) + OD-->>DN: Success & Remote ID + DN->>DB: Update local state & clear dirty flags +``` + +--- + +## D-Bus Call Interface + +The frontend communicates with the background service daemon using the following D-Bus methods declared in `src/backend.py`: + +* `CreateActivity(activity_data_json)`: Invoked to spawn a new activity. +* `CompleteActivity(activity_id)`: Marks an activity as done locally and queues it for the sync process. +* `DeleteActivity(activity_id)`: Deletes an activity locally and queues removal on Odoo. diff --git a/website/docs/technical/architecture.md b/website/docs/technical/architecture.md new file mode 100644 index 00000000..a72f56ab --- /dev/null +++ b/website/docs/technical/architecture.md @@ -0,0 +1,61 @@ +--- +title: Architecture Overview +sidebar_label: Architecture +--- + +# Architecture Overview + +TimeManagement is a desktop and Ubuntu Touch application composed from three main layers: + +- QML for interface and app shell behavior +- JavaScript modules in `models/` for shared client-side state and helpers +- Python services in `src/` for backend, sync, daemon, configuration, and utility logic + +## High-level flow + +At a high level: + +1. QML pages and components render the product interface. +2. Shared JavaScript modules support client-side state and feature logic. +3. Python modules handle backend operations, sync routines, and system-facing behavior. + +## Key technical directories + +- `qml/`: application UI, shared components, images, and feature pages +- `models/`: JavaScript modules imported into QML +- `src/`: Python backend and sync logic +- `assets/`: branding and package-level artwork +- `docs/`: source documentation kept in the main repository +- `website/`: Docusaurus-based website and documentation portal + +## System Architecture Model + +Here is the high-level representation of the TimeManagement three-layer architecture and component integration. + +### Architectural Diagram +```mermaid +graph TD + subgraph UI ["QML Client Layer"] + A[QML Pages] --> B[Shared QML Components] + end + + subgraph State ["JavaScript Logic Layer"] + C[Shared State Models] --> D[API Helpers] + end + + subgraph Service ["Python Service Layer"] + E[Sync Daemon] --> F[Odoo API Client] + E --> G[Local SQLite DB] + end + + UI -->|Import / Call| State + State -->|D-Bus / Sync Commands| Service +``` +## Documentation intent + +This technical section should answer: + +- where code belongs +- how features are split across the stack +- how the project is built and packaged +- how contributors should reason about changes that span QML, JS, and Python diff --git a/website/docs/technical/build-and-packaging.md b/website/docs/technical/build-and-packaging.md new file mode 100644 index 00000000..3a70abbf --- /dev/null +++ b/website/docs/technical/build-and-packaging.md @@ -0,0 +1,52 @@ +--- +title: Build and Packaging +sidebar_label: Build and Packaging +--- + +# Build and Packaging + +The app build and the Docusaurus site build are intentionally separate. + +## Application build + +The current app build is driven by project files such as: + +- `clickable.yaml` +- `CMakeLists.txt` +- `manifest.json.in` +- desktop and device launcher metadata at the repository root + +For application testing, the contributor workflow still centers on: + +```bash +clickable desktop +clickable build +clickable review +``` + +## Website build + +The documentation site lives in `website/` and uses Docusaurus. + +Typical local workflow: + +```bash +cd website +npm install +npm run start +``` + +Production build: + +```bash +cd website +npm run build +``` + +## Separation of concerns + +This separation keeps: + +- documentation deployment independent from app packaging +- website dependencies out of the runtime app stack +- docs iteration fast without affecting Clickable or CMake behavior diff --git a/website/docs/technical/dashboard.md b/website/docs/technical/dashboard.md new file mode 100644 index 00000000..87961c01 --- /dev/null +++ b/website/docs/technical/dashboard.md @@ -0,0 +1,54 @@ +--- +title: Dashboard Module Technical Reference +sidebar_label: Dashboard Module +--- + +# Dashboard Module Technical Reference + +The Dashboard Module provides consolidated, query-based analytical insights regarding productivity, logged work hours, active tasks, and prioritization metrics. + +## Codebase Map + +| Layer | Path | Purpose | +|---|---|---| +| **Frontend UI** | `qml/features/dashboard/` | Analytics panels, charts, and priority widgets | +| **State & Logic** | `models/Main.js` | Database query projections, aggregations, and charts bindings | + +## Metrics & SQL Projections + +The dashboard renders visual stats using SQLite analytical queries (using standard QML LocalStorage bindings) rather than computing them on a backend. + +### 1. Eisenhower Matrix Categorization +Classifies active tasks and activities based on urgency and importance: +```sql +SELECT id, summary, res_model, res_id, date_deadline +FROM mail_activity_app +WHERE done = 0 AND eisenhower_priority = ?; +``` + +### 2. Project-Wise Logged Time (Top 10 Projects) +Aggregates total logged hours from `account_analytic_line_app` grouped by project name: +```sql +SELECT p.name AS project_name, SUM(t.unit_amount) AS total_hours +FROM account_analytic_line_app t +JOIN project_project_app p ON t.project_id = p.id +GROUP BY t.project_id +ORDER BY total_hours DESC +LIMIT 10; +``` + +### 3. Task Completion Progress +Computes overall progress of tasks associated with a project: +```sql +SELECT + COUNT(CASE WHEN stage_id = ? THEN 1 END) AS completed_tasks, + COUNT(id) AS total_tasks +FROM project_task_app +WHERE project_id = ?; +``` + +--- + +## Sync Mechanism & Network Protocol + +The dashboard runs entirely client-side on the local SQLite replica database. It does not initiate external HTTP/XML-RPC requests itself. Data updates naturally propagate to the dashboard when background sync tasks update the underlying SQL tables. diff --git a/website/docs/technical/notifications.md b/website/docs/technical/notifications.md new file mode 100644 index 00000000..472df7b7 --- /dev/null +++ b/website/docs/technical/notifications.md @@ -0,0 +1,52 @@ +--- +title: Notifications Module Technical Reference +sidebar_label: Notifications +--- + +# Notifications Module Technical Reference + +This page describes local database notification structures, the Ubuntu Touch Notification Server integration, background notification helper scripts, and scheduling logic. + +## Codebase Map + +| Layer | Path | Purpose | +|---|---|---| +| **Push Helper** | `push-helper.py` | Standalone script triggered by OS push service | +| **Notification UI** | `qml-notify-module/` | QML notify alerts and dropdown banner components | +| **Local Store** | `models/notifications.js` | JS bindings to query and update local notification states | +| **Daemon Logic** | `src/daemon.py` | Local alarm scheduler and smart working-hours filters | + +## SQLite Table: `notification` + +Notifications are managed locally using the following SQLite schema: + +* `id` (INTEGER, Primary Key): Unique database identifier. +* `title` (TEXT): Headline label of the notification. +* `message` (TEXT): Full body message. +* `notif_type` (TEXT): Category (`ACTIVITY`, `TASK_ASSIGN`, `SYNC_CONFLICT`). +* `timestamp` (TEXT): Received timestamp (ISO 8601). +* `read_status` (INTEGER): Status indicator (0 = Unread, 1 = Read). +* `payload` (TEXT): JSON dump of additional action fields. + +--- + +## Push Notification Mechanism + +The TimeManagement application integrates with the Ubuntu Touch push notifications system using the `push-helper.py` script. + +### Incoming Push Architecture + +```mermaid +graph TD + A[OS Push Server] -->|Triggers helper| B(push-helper.py) + B -->|Parse payload| C{Working Hours Filter?} + C -->|No: Queue Alert| D[Store in SQLite Database] + C -->|Yes: Suppress Alert| E[Silently write to DB] + D -->|Notify via D-Bus| F[Ubuntu Touch Notification Server] + F -->|Displays| G[OS Desktop Banner] +``` + +### Working Hours Filter +To prevent user fatigue, the `push-helper.py` evaluates system configurations before alerting: +* Checks the current system local time against `start_hour` and `end_hour` values in `app_settings`. +* If a push is received outside these hours, the alert is logged silently in the SQLite database (`notification` table) with `read_status = 0`, but the system desktop banner is bypassed. diff --git a/website/docs/technical/onboarding.md b/website/docs/technical/onboarding.md new file mode 100644 index 00000000..7f0a45d2 --- /dev/null +++ b/website/docs/technical/onboarding.md @@ -0,0 +1,39 @@ +--- +title: Onboarding Technical Reference +sidebar_label: Onboarding +--- + +# Onboarding Technical Reference + +This page describes the onboarding flow sequence presented during the first execution of the application, including persistence state flags and quick skip triggers. + +## Codebase Map + +| Layer | Path | Purpose | +|---|---|---| +| **Flow Coordinator** | `qml/TSApp.qml` | Detects onboarding status and renders overlay | +| **Onboarding UI** | `qml/features/settings/Onboarding.qml` | Carousel slider, guides, and initial config form | +| **State Storage** | `models/database.js` | Database initialization setting verification | + +## Onboarding Execution Flow + +```mermaid +graph TD + A[Launch Application] --> B{Query app_settings: first_launch_done?} + B -->|0 / NULL| C[Render Onboarding.qml Overlay] + B -->|1| D[Directly Load Dashboard.qml] + C -->|Skip / Finish| E[Update app_settings SET first_launch_done = 1] + E --> D +``` + +## Settings Schema Flag + +The onboarding state persists in `app_settings`: + +```sql +SELECT value FROM app_settings WHERE key = 'first_launch_done'; +``` + +* If `value` is not `1`, the application locks general navigation and redirects the active viewport to the onboarding carousel. +* Completing the onboarding screens automatically updates this key to `1` so subsequent launches bypass the sequence. +* Users can manually reset this setting via the System Settings page to re-trigger onboarding. diff --git a/website/docs/technical/profiles.md b/website/docs/technical/profiles.md new file mode 100644 index 00000000..fdaa34f6 --- /dev/null +++ b/website/docs/technical/profiles.md @@ -0,0 +1,29 @@ +--- +title: Profiles & Account Isolation Technical Reference +sidebar_label: Profiles & Account Isolation +--- + +# Profiles & Account Isolation Technical Reference + +The Profiles module handles user profile setups and provides local data isolation across multiple Odoo instances. + +## Codebase Map + +| Layer | Path | Purpose | +|---|---|---| +| **UI Components** | `qml/features/settings/Profiles.qml` | Profile selection and instance switching interface | +| **Logic & State** | `models/accounts.js` | Session validation and active instance token switching | + +## Database Multi-Instance Isolation + +The SQLite schema isolation uses a relational key `user_id` mapping to the active row in the `users` (accounts) table. + +### SQL Filter Strategy +Every data retrieval query executed by JavaScript models checks the current active user context from the global settings: + +```sql +SELECT * FROM project_task_app +WHERE user_id = (SELECT value FROM app_settings WHERE key = 'active_user_id'); +``` + +This structure ensures that data from separate accounts/instances (e.g., Work vs Personal) is segregated, avoiding data leaks between environments. diff --git a/website/docs/technical/projects.md b/website/docs/technical/projects.md new file mode 100644 index 00000000..30586702 --- /dev/null +++ b/website/docs/technical/projects.md @@ -0,0 +1,67 @@ +--- +title: Projects Module Technical Reference +sidebar_label: Projects Module +--- + +# Projects Module Technical Reference + +The Projects Module manages high-level project metadata, sub-project hierarchies, stage-based mapping, and Favorite status. + +## Codebase Map + +| Layer | Path | Purpose | +|---|---|---| +| **Frontend UI** | `qml/features/projects/` | Views and detailed components for projects | +| **State & Logic** | `models/project.js` | JS helper modules, stage queries, and favorite state | +| **Backend Service** | `src/sync_from_odoo.py` | Sync worker pulling projects and stages | +| **D-Bus Interface** | `src/backend.py` | D-Bus methods exposing project listings | + +## Database Schema + +Projects and stages are stored locally in the following SQLite tables: + +### `project_project_app` +* `id` (INTEGER, Primary Key): Unique Project ID (Odoo remote ID). +* `name` (TEXT): Project title. +* `parent_id` (INTEGER): References parent project (self-relation for sub-projects). +* `date_start` (TEXT): Project start date. +* `date` (TEXT): Project end date / deadline. +* `description` (TEXT): Detailed description of project scope. +* `user_id` (INTEGER): Assigned owner/manager. +* `allocated_hours` (REAL): Budgeted hour allocation. +* `color` (INTEGER): Accent color index. +* `favorite` (INTEGER): Favorite status flag (0 = No, 1 = Yes). +* `stage_id` (INTEGER): References the current project stage. + +### `project_project_stage_app` +* `id` (INTEGER, Primary Key): Stage ID. +* `name` (TEXT): Stage name (e.g. In Progress, Cancelled, On Hold, Done). +* `sequence` (INTEGER): Ordering sequence. + +--- + +## Sync Mechanism & Network Protocol + +### Odoo XML-RPC Model Mapping +* **Remote Model**: `project.project` (Project entity), `project.project.stage` (Stages) +* **Sync Direction**: Pull-oriented (read-only mapping for structure, local favorites toggling). + +```mermaid +sequenceDiagram + participant UI as QML Client + participant DB as SQLite DB + participant DN as Python Daemon + participant OD as Odoo Server + + DN->>OD: XML-RPC search_read (project.project, project.project.stage) + OD-->>DN: Return projects schema details + DN->>DB: Bulk insert/update local project tables + UI->>DB: Query project list (filtering out "Done" stage) +``` + +--- + +## D-Bus Call Interface + +* `GetProjects()`: Returns a JSON array of all active projects. +* `ToggleProjectFavorite(project_id, state)`: Marks a project as favorite locally. diff --git a/website/docs/technical/release-process.md b/website/docs/technical/release-process.md new file mode 100644 index 00000000..b06f14b3 --- /dev/null +++ b/website/docs/technical/release-process.md @@ -0,0 +1,33 @@ +--- +title: Release Process +sidebar_label: Release Process +--- + +# Release Process + +The documentation site should now be part of the release conversation, even though it does not ship inside the app binary. + +## Release expectations + +Each release should verify: + +- install and setup steps still match reality +- feature documentation reflects user-visible changes +- technical docs reflect architecture-visible changes +- release notes or changelog entries are updated + +## Recommended release checklist additions + +- confirm the Docusaurus site builds cleanly +- review broken links before publishing +- update homepage messaging when a release changes the product story +- make sure GitHub Pages deployment succeeds after merge + +## Future evolution + +As the project matures, this section can expand to include: + +- tagged release notes +- docs versioning strategy +- deprecation guidance +- upgrade notes between app releases diff --git a/website/docs/technical/repository-organization.md b/website/docs/technical/repository-organization.md new file mode 100644 index 00000000..14df17ac --- /dev/null +++ b/website/docs/technical/repository-organization.md @@ -0,0 +1,52 @@ +--- +title: Repository Organization +sidebar_label: Repository Organization +--- + +# Repository Organization + +This page is the Docusaurus migration of the repository organization guidance. + +## Storage principles + +The repository is organized by responsibility: + +- `qml/` contains the UI layer +- `models/` contains JavaScript data and state helpers used by QML +- `src/` contains Python backend, sync, daemon, and utility logic +- `assets/` contains package-level branding assets +- `docs/` contains source documentation +- `scripts/` contains local maintenance and validation scripts + +Within each area, files should be grouped by feature first and by technical role second. + +## QML UI layer + +The `qml/` tree is already split into stable areas: + +- `qml/app/` for shell, startup, navigation, and app-level pages +- `qml/components/` for shared UI building blocks +- `qml/features/` for business-domain features with local pages and components +- `qml/images/` for runtime UI image assets + +## JavaScript model layer + +The `models/` directory contains reusable JavaScript modules imported by QML. + +Use `models/` for cross-feature helpers and shared app state. Keep feature-specific JavaScript inside feature folders unless it becomes broadly shared. + +## Python backend layer + +The `src/` directory contains runtime Python for: + +- backend bridging +- daemon logic +- remote sync behavior +- configuration and logging +- helper tools that ship with the app + +## Documentation note + +The original longer source for this guidance remains in the repository during migration: + +- [Technical File Organization Source](https://github.com/CITOpenRep/timemanagement/blob/main/docs/TECHNICAL-FILE-ORGANIZATION.md) diff --git a/website/docs/technical/sync-settings.md b/website/docs/technical/sync-settings.md new file mode 100644 index 00000000..6a55b828 --- /dev/null +++ b/website/docs/technical/sync-settings.md @@ -0,0 +1,72 @@ +--- +title: Sync & Accounts Technical Reference +sidebar_label: Sync & Accounts +--- + +# Sync & Accounts Technical Reference + +This module oversees multi-instance Odoo configuration, manual and scheduler-driven background synchronization, success/failure status messaging, and schema integrity constraints. + +## Codebase Map + +| Layer | Path | Purpose | +|---|---|---| +| **Frontend UI** | `qml/features/settings/` | Account configuration, sync status status indicators, and logs | +| **State & Logic** | `models/accounts.js` | Account creation, verification, and credentials checking | +| **Sync Manager** | `src/daemon.py` | Main event loops scheduling synchronization | +| **Pull Sync Engine** | `src/sync_from_odoo.py` | Sync worker querying Odoo XML-RPC endpoints | +| **Push Sync Engine** | `src/sync_to_odoo.py` | Sync worker pushing dirty records back | +| **Network Client** | `src/odoo_client.py` | XML-RPC client connection wrapper | + +## Database Schema + +Local account configurations and synchronization logs are stored in: + +### `users` +* `id` (INTEGER, Primary Key): Local user account sequence. +* `name` (TEXT): Unique instance name identifier. +* `url` (TEXT): Server URL. +* `db` (TEXT): Odoo database identifier. +* `username` (TEXT): Username / Email. +* `password` (TEXT): Encrypted user token / password. + +### `sync_report` +* `id` (INTEGER, Primary Key): Log identifier. +* `sync_time` (TEXT): Timestamp of the synchronization execution. +* `status` (TEXT): Status message (`SUCCESS`, `FAILED`). +* `details` (TEXT): Exception trace or syncing summary details. + +--- + +## Detailed Sync Mechanism + +The synchronization engine implements a robust timeline-aware conflict resolution pattern. + +```mermaid +sequenceDiagram + participant DB as Local SQLite + participant SY as Sync Engine + participant OD as Odoo Server + + Note over SY: Trigger (Manual / Scheduler) + SY->>DB: Fetch last successful sync timestamp + SY->>OD: XML-RPC search_read (records updated > last_sync) + OD-->>SY: Return modified records + SY->>DB: Resolve conflicts using write_date comparison + SY->>DB: Scan local tables for sync_dirty = 1 + SY->>OD: XML-RPC push (create / write) + OD-->>SY: Return success status + SY->>DB: Mark local records clean +``` + +### Conflict Resolution Strategy +* If a record was modified both locally and on the server since the last sync, timestamps (`write_date` from Odoo vs local `update_time`) are evaluated. +* The newer timestamp wins by default. If timestamps are identical or ambiguous, the user is prompted with a conflict resolution dialog to choose which version to retain. + +--- + +## D-Bus Call Interface + +* `TriggerSync()`: Manually fires the background sync worker. +* `GetSyncStatus()`: Returns JSON containing the last execution timestamp, state, and logs. +* `VerifyConnection(url, username, password)`: Queries Odoo via XML-RPC to validate DB parameters before registration. diff --git a/website/docs/technical/tasks.md b/website/docs/technical/tasks.md new file mode 100644 index 00000000..e4d970b9 --- /dev/null +++ b/website/docs/technical/tasks.md @@ -0,0 +1,74 @@ +--- +title: Tasks Module Technical Reference +sidebar_label: Tasks Module +--- + +# Tasks Module Technical Reference + +The Tasks Module manages work tasks, parent-child task relations, stage/Kanban state alignment, assignees, deadlines, and scheduling. + +## Codebase Map + +| Layer | Path | Purpose | +|---|---|---| +| **Frontend UI** | `qml/features/tasks/` | Task lists, details, editing, and kanban views | +| **State & Logic** | `models/task.js` | JS task model, stage transition logic, and filters | +| **Backend Service** | `src/sync_to_odoo.py` | Sync worker pushing task updates and scheduling changes | +| **D-Bus Interface** | `src/backend.py` | D-Bus methods for task mutations and retrieval | + +## Database Schema + +Tasks and assignees are stored locally in the following SQLite tables: + +### `project_task_app` +* `id` (INTEGER, Primary Key): Unique Task ID. +* `name` (TEXT): Task name. +* `project_id` (INTEGER): References parent project. +* `parent_id` (INTEGER): References parent task (for nested sub-tasks). +* `date_deadline` (TEXT): Task deadline date (YYYY-MM-DD). +* `description` (TEXT): Detailed task descriptions (supports HTML). +* `stage_id` (INTEGER): References `project_task_type_app`. +* `favorite` (INTEGER): Favorite status indicator. +* `planned_hours` (REAL): Estimated hours. +* `user_ids` (TEXT): JSON array of assignee user IDs. + +### `project_task_assignee_app` +Maps task assignees to res_users. +* `task_id` (INTEGER): References task. +* `user_id` (INTEGER): References instance user. + +### `project_task_type_app` +Stores task stages (Kanban stages). +* `id` (INTEGER, Primary Key): Task stage ID. +* `name` (TEXT): Stage name (e.g. To Do, In Progress, Done). + +--- + +## Sync Mechanism & Network Protocol + +### Odoo XML-RPC Model Mapping +* **Remote Model**: `project.task` (Task entity), `project.task.type` (Task stages) +* **Sync Direction**: Bidirectional. + +```mermaid +sequenceDiagram + participant UI as QML Client + participant DB as SQLite DB + participant DN as Python Daemon + participant OD as Odoo Server + + UI->>DB: Update Task Stage (e.g., drag and drop to Done) + DN->>DB: Fetch dirty task status + DN->>OD: XML-RPC write (project.task, stage_id) + OD-->>DN: Confirm synchronization + DN->>DB: Clear dirty tag +``` + +--- + +## D-Bus Call Interface + +* `GetTasks()`: Returns JSON containing all tasks. +* `UpdateTaskStage(task_id, stage_id)`: Transitions a task to a different Kanban stage. +* `CreateTask(task_data_json)`: Instantiates a new task locally and queues sync. +* `RescheduleTask(task_id, new_deadline)`: Updates deadline dates. diff --git a/website/docs/technical/timesheets.md b/website/docs/technical/timesheets.md new file mode 100644 index 00000000..1fb97fd7 --- /dev/null +++ b/website/docs/technical/timesheets.md @@ -0,0 +1,71 @@ +--- +title: Timesheets Module Technical Reference +sidebar_label: Timesheets Module +--- + +# Timesheets Module Technical Reference + +The Timesheets Module governs work hour registration, running task timers, background timer persistence, and Odoo timesheet entry syncing. + +## Codebase Map + +| Layer | Path | Purpose | +|---|---|---| +| **Frontend UI** | `qml/features/timesheets/` | Logs list, manual entry forms, and timer overlays | +| **State & Logic** | `models/timesheet.js` | JS timesheet database bindings and manual logging logic | +| **Timer Service** | `models/timer_service.js` | JS timer worker coordinating state, notifications, and ticks | +| **Backend Service** | `src/sync_to_odoo.py` | Sync worker pushing timesheet entries | +| **D-Bus Interface** | `src/backend.py` | D-Bus methods exposing timesheet logging and active timer state | + +## Database Schema + +Timesheet entries are stored locally in the following SQLite table: + +### `account_analytic_line_app` +* `id` (INTEGER, Primary Key): Unique analytic line ID. +* `name` (TEXT): Description/Notes logged by the user. +* `date` (TEXT): Date of work registration (YYYY-MM-DD). +* `unit_amount` (REAL): Hours spent (represented as decimal, e.g. 1.5 hours = 1h 30m). +* `project_id` (INTEGER): References the parent project. +* `task_id` (INTEGER): References the parent task. +* `user_id` (INTEGER): References the user entering the timesheet. +* `eisenhower_priority` (TEXT): Priority scale (Urgent/Important matrix). +* `sync_dirty` (INTEGER): Flag for pending remote synchronization (0 = Clean, 1 = Dirty). + +--- + +## Sync Mechanism & Network Protocol + +### Odoo XML-RPC Model Mapping +* **Remote Model**: `account.analytic.line` (Odoo Timesheets) +* **Sync Direction**: Bidirectional. + +```mermaid +sequenceDiagram + participant UI as QML Client + participant DB as SQLite DB + participant DN as Python Daemon + participant OD as Odoo Server + + UI->>DB: Log hours manually or via stopped Timer + DN->>DB: Scan for sync_dirty = 1 records + DN->>OD: XML-RPC create (account.analytic.line) + OD-->>DN: Return remote database ID + DN->>DB: Update local record ID and set sync_dirty = 0 +``` + +--- + +## Timer Service & Persistence + +The active timer state is governed by `models/timer_service.js` and persists across app closures. +* When a timer starts, the timestamp `start_time` is written to local storage. +* Even if the UI crashes or closes, the Python daemon checks the running timer state on boot and calculates elapsed time using system clock diffs. + +--- + +## D-Bus Call Interface + +* `LogTime(timesheet_data_json)`: Pushes a new timesheet record. +* `GetActiveTimer()`: Retrieves details of the running timer if active. +* `StopActiveTimer()`: Stops the timer and formats the elapsed time into a new timesheet entry. diff --git a/website/docs/technical/ui-ux-navigation.md b/website/docs/technical/ui-ux-navigation.md new file mode 100644 index 00000000..d820bf77 --- /dev/null +++ b/website/docs/technical/ui-ux-navigation.md @@ -0,0 +1,75 @@ +--- +title: UI/UX & Navigation Technical Reference +sidebar_label: UI/UX & Navigation +--- + +# UI/UX & Navigation Technical Reference + +This page describes the user interface framework, navigation routing patterns, dark/light theme switching, and the Content Hub attachment management system. + +## Codebase Map + +| Layer | Path | Purpose | +|---|---|---| +| **Root Shell** | `qml/TSApp.qml` | Application entry point and layout shell | +| **Hamburger Menu**| `qml/components/NavigationMenu.qml` | Desktop/mobile navigation drawer | +| **Shared Layouts** | `qml/components/` | Custom grids, text widgets, and icons | +| **Attachment UI** | `qml/features/updates/Attachments.qml` | Attachments grid and browser screens | +| **Helper Utils** | `models/utils.js` | UI formats and theme helpers | + +## Interface Design and Navigation Layout + +The application utilizes QML (Qt Quick Controls 2 - Suru Theme layout) optimized for convergent platforms: + +### 1. Multi-Pane Responsive Design (Convergence) +* **Mobile Mode**: Single active page. Left edge swipes trigger a drawer menu. +* **Desktop/Tablet Mode**: Employs a split-pane layout. Navigation menu is pinned permanently to the left side while sub-menus and detail screens open in side-by-side viewports. + +### 2. Navigation Routing +Navigation handles sequential hierarchy (e.g. Projects -> Tasks -> Timesheets) using a central stack model: +```qml +StackView { + id: pageStack + anchors.fill: parent + initialItem: Qt.resolvedUrl("features/dashboard/Dashboard.qml") +} +``` + +--- + +## Content Hub Attachment System + +Ubuntu Touch uses the **Content Hub** portal mechanism to share files across application boundaries securely. + +### Local Schema Mappings + +#### `ir_attachment_app` +Caches attachment metadata. +* `id` (INTEGER, Primary Key): Odoo attachment ID. +* `name` (TEXT): File name. +* `datas` (TEXT): Base64 encoded file data (if stored locally). +* `res_model` (TEXT): Linked model name (e.g., `project.task`). +* `res_id` (INTEGER): Linked record ID. + +#### `attachment_download_app` +Tracks download status of large attachments. +* `attachment_id` (INTEGER): References the attachment record. +* `local_path` (TEXT): Absolute path to file on disk. +* `status` (TEXT): State (`NOT_DOWNLOADED`, `DOWNLOADING`, `DOWNLOADED`). + +### Attachment Synchronization Flow + +```mermaid +sequenceDiagram + participant UI as QML UI + participant CH as Content Hub (OS) + participant SY as Sync Daemon + participant OD as Odoo Server + + UI->>CH: Request file import / export + CH-->>UI: Return sandbox file URI + UI->>SY: Request upload payload + SY->>OD: XML-RPC create (ir.attachment, base64 payload) + OD-->>SY: Success & attachment_id + SY->>UI: Refresh attachments grid +``` diff --git a/website/docs/user/all-features.md b/website/docs/user/all-features.md new file mode 100644 index 00000000..1a79e475 --- /dev/null +++ b/website/docs/user/all-features.md @@ -0,0 +1,429 @@ +--- +title: Feature Catalog +sidebar_label: All Features +--- + +# Feature Catalog + +This page provides a comprehensive catalog of all features in the TimeManagement application. Use the links under each module to navigate to their respective functional guides or technical implementation details. + +--- + +## 1. Activities Module + +The Activities module helps users schedule, manage, and track follow-up tasks and actions. + +### Features +* Search activities. +* Sort activities by latest updated (descending). +* Mark activities or tasks as Completed. +* Display Days Remaining (shows "Overdue" status if past due). +* "Read More" truncation for long Notes. +* Tabs to filter by Open / Closed / All. +* Add a remark before completing an activity [Upcoming]. +* Attach files/documents to Activities [Upcoming]. +* Create follow-up activities directly from the same screen. +* Shortcut to create an activity directly from a Project or Task detail page. +* Swipe left to enter Edit mode. +* Swipe left to Cancel/Delete an activity. +* Cancel confirmation prompt before deletion [Upcoming]. +* **Tabbed View Filters:** Quickly filter activities by schedule/state: **Today**, **This Week**, **This Month**, **Later**, **Overdue**, **All**, and **Done**. +* **Reschedule Activity:** Easily modify due dates through swipe actions or the detailed view date picker. + +### Form Fields +* **Required Fields:** Instance, Activity Type, Assignee, Summary (single line), Notes (multi-line), Due Date, Linked Entity (Project/Task/Contact). +* **Default Values:** Date defaults to Today. + +### Technical Architecture Map (For Contributors) + +| Layer | Path / Files | Implementation Details | +| :--- | :--- | :--- | +| **Frontend UI** | `qml/features/activities/pages/Activity_Page.qml`
`qml/components/cards/ActivityDetailsCard.qml` | Renders list views, handles tab clicks (Today/Week/Month/etc.), triggers date pickers, and binds swipe interactions. | +| **Logic & State** | `models/activity.js` | JavaScript backend model containing `getFilteredActivities()`, `updateActivityDate()`, `markAsDone()`, and `createFollowupActivity()`. | +| **Database Schema** | SQLite table: `mail_activity_app` | Stores activity properties: `summary`, `due_date`, `notes`, `state` (planned/done), `user_id`, and `resModel`/`resId` (linkage to tasks or projects). | +| **Backend & Sync** | `src/daemon.py` | Syncs local activity states bidirectionally with Odoo's `mail.activity` via XML-RPC. | + +:::tip Functional Guide +Learn how to use activities in the [Activities User Manual](./user-manual/activities.md). +::: + +:::info Technical Reference +For schema definitions and sync sequence flows, see the [Activities Module Technical Reference](../technical/activities.md). +::: + +--- + +## 2. Projects Module + +The Projects module organizes high-level work items and links them to instances. + +### Features +* View sub-projects with collapsible/next pane view. +* Search action with enhanced search (includes sub-projects). +* Sort projects by latest updated. +* Swipe right to add to Favorites. +* Filter projects based on their respective Stages in Odoo (Kanban mapping). +* Filter project list to exclude the "Done" stage. +* View all project updates in one place (sorted by date). +* Link from the project screen to a filtered list of updates related to that specific project. +* Role-based access controls for project creation. +* Display hours spent on projects. +* Project progress indicator bar. +* Show only relevant underlying projects based on the user's current context. +* Quick "+ button" for new entry. +* Create a task directly from the project detailed view. +* Create Task button for quicker task creation. +* Logical arrangement of current options (View Tasks, Create Activity). + +### Form Fields +* **Required Fields:** Instance, Parent Project, From/To Date, Description (Rich text), User entered by, Allocated Hours, Color selector, Favorite Star. +* **Mandatory Fields:** Assignee. +* **Default Values:** Instance (based on settings), Date range (This week). + +### Overview Page Fields +* Favorite indicator, Instance, Start & End Dates, Number of Sub-projects, View details link, Remaining days and proximity to deadlines. +* Project progress bar. + +### Technical Architecture Map (For Contributors) + +| Layer | Path / Files | Implementation Details | +| :--- | :--- | :--- | +| **Frontend UI** | `qml/features/projects/` | Projects directory pages, sub-project panels, progress bars, and detail cards. | +| **Logic & State** | `models/project.js` | Exposes SQLite queries for listing, detail loading, and favorite toggles. | +| **Database Schema** | SQLite table: `project_project_app` | Stores project metadata, parent-child project relationships, and color palette indicators. | +| **Backend & Sync** | `src/sync_to_odoo.py` | Pulls remote projects and publishes locally created project entries. | + +:::tip Functional Guide +For details on updates and lists, read the [Projects User Manual](./user-manual/projects.md) and the [Project Updates Guide](./user-manual/project-updates.md). +::: + +:::info Technical Reference +Understand the query mappings in the [Projects Module Technical Reference](../technical/projects.md). +::: + +--- + +## 3. Tasks Module + +The Tasks module manages task execution, tracking, and parent-child hierarchies. + +### Features +* View sub-tasks with expand/collapse hierarchy. +* Search button. +* Sort by latest updated. +* Tabs to organize by time frame: Today / Week / Month / Later. +* Filter by Open tasks (default), and filter by Assignee. +* Swipe to Favorite, Swipe to Delete, Swipe to View/Edit. +* Context menu for quick task creation. +* Smart play button to start timer for the task. +* Progress tracking bar. +* Show Days Remaining and calculated proximity to deadlines. +* Task color inherited from the parent project. +* Description "Read More" button. +* Multiple assignees for tasks. +* View "My Tasks" via personal stages. +* Task stage management based on state (In-progress or completed) – UI & Backend. +* Display only relevant subtasks to reduce clutter. +* Delete confirmation prompt. +* Reschedule button for tasks and activities. +* **Tabbed Date Filters:** Segment task lists using tabs: **Today**, **Week**, **Month**, and **Later**. +* **Reschedule Task:** A quick reschedule button updates task deadline ranges in the database. +* **Two-Fold Stage System:** + * *Global Kanban Stages:* Standard workflow stages (e.g. To Do, In Progress, Done) synced with Odoo's global project configuration. + * *Personal Stages ("My Tasks"):* Custom, user-specific stages to organize personal work progress independently. +* **Priority Stars:** High-priority tasks display visual star badges (0 to 3 levels) mapped to the Odoo priority schema. + +### Form Fields +* **Required Fields:** Instance, Parent Project/Subproject/Parent Task, Period (Today/This Week/Next Week/This Month/Next Month), Date (auto-fill), Description (multi-line), Assignee, Hours (HH), Favorite Star. +* **Mandatory Fields:** Task Name. +* **Default Values:** Instance, Date range (This week), Time (1 hour or configurable from settings). +* **Limits:** 24-hour limit for daily time registration (timesheets); estimate limits. + +### Overview List Fields +* Task Name, Stage, Instance, Project, Sub-project, Parent task, Deadline, Assignee, Favorite, Hours, Dates (start & end), Number of Subtasks, Details link. + +### Technical Architecture Map (For Contributors) + +| Layer | Path / Files | Implementation Details | +| :--- | :--- | :--- | +| **Frontend UI** | `qml/features/tasks/pages/Tasks.qml`
`qml/features/tasks/pages/MyTasksPage.qml`
`qml/features/tasks/components/TaskDetailsCard.qml`
`qml/features/tasks/components/TaskDateRangeDialog.qml` | Manages list layouts, swipe menus, personal stage popup triggers, and date rescheduling selectors. | +| **Logic & State** | `models/task.js` | Implements database CRUD functions including `saveOrUpdateTask()`, `updateTaskPersonalStage()`, and `setTaskPriority()`. Handles multiple assignee arrays. | +| **Database Schema** | SQLite tables: `project_task_app`
`project_task_type_app` | `project_task_app` tracks fields like `stage_id` and `personal_stage`. `project_task_type_app` stores global stages and personal stages (where `is_global = '[]'`). | +| **Backend & Sync** | `src/sync_to_odoo.py` / `src/backend.py` | Daemon handlers for pushing task deadlines and D-Bus interfaces for task mutations. | + +:::tip Functional Guide +Explore detailed task manuals in the [All Tasks Guide](./user-manual/all-tasks.md) and [My Tasks Guide](./user-manual/my-tasks.md). +::: + +:::info Technical Reference +See sequence diagrams and DBUS interfaces in the [Tasks Module Technical Reference](../technical/tasks.md). +::: + +--- + +## 4. Timesheets Module + +The Timesheets module handles work hour registration, automated timers, and logging. + +### Tracking & Logging +* Swipe up from the home screen to create a Timesheet. +* Add via "+" button on the timesheet list. +* Smart play button to start timer (available in task list, project list, and form views). +* Timer continues running in the background. +* Only one timer can be active at a time. +* Time Spent entry (manual or auto via timer). +* Time format: 00:00 HH:MM. +* Pop-up to add description/notes immediately after recording time. +* Search option for timesheets. +* Optional default project selection. +* **Eisenhower Priority Matrix:** Classify timesheet tasks to support urgent vs. important sorting on dashboard quadrants. +* **Decimal Formats:** Time spent is saved in standard decimal format (e.g. 1.5 equals 1 hour 30 minutes). + +### Form Fields +* **Required Fields:** Instance (Odoo or Local), Project, Subproject, Task, Sub Tasks, Date, Description (multi-line), Priority (Eisenhower Matrix). +* **Mandatory Fields:** Project. +* **Default Values:** Date (Today), User, Time. +* **Edit Fields:** User (entered by), Eisenhower Priority, Project Color. + +### Overview Fields +* Description, Date, Hours Spent, User, Project, Task, Instance, Eisenhower Priority. + +### Gestures +* Leading swipe (left to right) for Delete. +* Trailing swipe for Edit / Delete. +* Delete confirmation prompt. + +### Technical Architecture Map (For Contributors) + +| Layer | Path / Files | Implementation Details | +| :--- | :--- | :--- | +| **Frontend UI** | `qml/features/timesheets/` | Logs, timesheet input forms, and overlay timers. | +| **Logic & State** | `models/timesheet.js`
`models/timer_service.js` | Coordinates active timers, local storage timer persistence, and stopwatch actions. | +| **Database Schema** | SQLite table: `account_analytic_line_app` | Stores logged duration `unit_amount`, date, linked task/project, description, and sync status. | +| **Backend & Sync** | `src/sync_to_odoo.py` | Sync worker identifying local timesheets marked as "dirty" to sync remotely via XML-RPC. | + +:::tip Functional Guide +Read how to log timesheets in the [Timesheets User Manual](./user-manual/timesheets.md). +::: + +:::info Technical Reference +Review timer persistence rules in the [Timesheets Module Technical Reference](../technical/timesheets.md). +::: + +--- + +## 5. Dashboard + +The Dashboard provides visual analytics, charts, and priority management. + +### Features +* Eisenhower Matrix (with tooltip/info icon). +* Project-wise time spent chart (Top 10 projects). +* Activity menu in the FAB (Floating Action Button). +* Radio button for Eisenhower Priority selection. +* Task-wise time spent chart (Top 10 tasks). +* Filters: This Week (default), Month, Year. +* Default filter: Show only My Timesheets, My tasks. +* Export dashboard data to CSV. +* Swipe left/right to switch/paging between charts. +* Set default chart in settings/user profile. +* Summary of activities and tasks completed based on user. + +### Technical Architecture Map (For Contributors) + +| Layer | Path / Files | Implementation Details | +| :--- | :--- | :--- | +| **Frontend UI** | `qml/features/dashboard/pages/Dashboard.qml` | Eisenhower grid, chart selectors, swipe container pagination. | +| **Logic & State** | `models/Main.js` | Performs LocalStorage SQLite query projections (e.g. Top 10 project SUM groupings and Urgency status counts). | + +:::tip Functional Guide +For details on matrix items and chart reports, see the [Dashboard User Manual](./user-manual/dashboard.md). +::: + +:::info Technical Reference +Check metrics queries in the [Dashboard Module Technical Reference](../technical/dashboard.md). +::: + +--- + +## 6. Sync & Account Settings + +This module configures Odoo/Local accounts, manual/auto synchronization, and conflict resolution. + +### Syncing +* Sync on account creation. +* Manual Sync button. +* Integration with Multi-instance Odoo. +* Syncing notification popup and scheduler. +* Notify user if automatic sync fails. +* Error logs. +* Success/failed message once sync is initiated. +* Status synchronization with instances, moving tasks to correct Kanban stages. +* Conflict resolution based on timestamps with user prompts for manual resolution. +* Integration with non-Odoo instances (e.g., Nextcloud). + +### Account Management +* Add/Delete accounts. +* Allow only unique account names across instances. +* Account creation interface transitions to View Mode after saving. +* Set Default Project. +* Set default Report/Dashboard view. + +### Mandatory Fields +* Name, URL, DB (Auto-fetched), Username, Password. + +### Technical Architecture Map (For Contributors) + +| Layer | Path / Files | Implementation Details | +| :--- | :--- | :--- | +| **Frontend UI** | `qml/features/settings/` | Account list editor, URL inputs, and synchronization status indicator bars. | +| **Logic & State** | `models/accounts.js`
`models/dbinit.js` | Manages credentials, tokens, session checks, and database table creation. | +| **Backend & Sync** | `src/daemon.py`
`src/backend.py` | Implements network sync routines, connection testing, and multi-threaded sync managers. | + +:::tip Functional Guide +Read how to configure Odoo instances in the [Settings User Manual](./user-manual/settings.md). +::: + +:::info Technical Reference +Review the sync routines in the [Sync Settings Technical Reference](../technical/sync-settings.md). +::: + +--- + +## 7. General UI/UX & Navigation + +Layout guidelines, theme configuration, and content hub integrations. + +### Navigation & Layout +* UT Hamburger menu (styled like Dekko app with left pane separation). +* Support swipe/touch gestures. +* Full-screen on mobile. +* Context menu or swipe actions for quick Timesheet/Task/Activity creation. +* Transactional menu clearly separated from settings. +* Click-through (drill-down) navigation (e.g., Projects → Tasks → Timesheets). +* Faster, more intuitive drill-down navigation. +* Convergence support (Responsive design for desktop mode/Multi-Pane support). +* Slider from left edge to open navigation menu. +* Menu divided into main activities and Admin Section. + +### Design & Theming +* Lomiri style icons. +* Dark theme toggle inside the application. +* Ubuntu OS multi-theme support. +* Suru design philosophy implementation. +* Upgrade from Lomiri to QQC2-Suru-Style. +* Intuitive UI with standard UT gestures, readable fonts, and consistent grid layouts. +* Implement new theme based on design consultant. + +### Content Hub & Attachments +* Attach files using Content Hub to make them available on the Odoo server. +* On-demand download of attachments from server to device (UI & Backend). +* Adding attachments from the app. +* Enhanced attachment screen: List view, disabled download button if local, "Open with" integration. +* Download CSVs from any list view. + +### General App Features +* Read More truncation for long descriptions across the app. +* Expand button (+) to maximize description boxes. +* Alerts when the app is closed. +* Touch and keyboard/mouse inputs supported. +* Overview tab: "Task For Today". +* Favorites for Tasks and Projects (segregated in list view). +* Filter entries based on Instance across Projects, Tasks, Timesheets, and Activities. +* Language translation using Weblate. +* Auto-save for entire form views. +* Motivational Project Activation. +* Create local account stages for Projects and Tasks. +* App pinning to Homescreen. +* Snap install support. + +### Technical Architecture Map (For Contributors) + +| Layer | Path / Files | Implementation Details | +| :--- | :--- | :--- | +| **Frontend UI** | `qml/TSApp.qml`
`qml/app/` | Root app window layout, page routing, and theme switching context. | +| **Logic & Utilities** | `models/utils.js`
`models/global.js` | Shared QML helpers (date formatting, color generation, navigation history). | + +:::tip Functional Guide +For navigation guidelines, refer to the [Introduction Guide](./user-manual/introduction.md) and the [Kebab Menu Navigation Guide](./user-manual/kebab-menu.md). +::: + +:::info Technical Reference +For details on layout convergence, check the [UI-UX Navigation Technical Reference](../technical/ui-ux-navigation.md). +::: + +--- + +## 8. Notifications + +Automated and smart push notifications for time and work management. + +### Features +* Push notifications for new activities, task assignments, project updates, and timesheet conflicts. +* Smart Notifications: Tasks/Activities notifications delivered only during defined working hours. +* Integration with Ubuntu Touch Notification Server for activities. + +### Technical Architecture Map (For Contributors) + +| Layer | Path / Files | Implementation Details | +| :--- | :--- | :--- | +| **Logic** | `models/notifications.js` | Orchestrates scheduler timers and trigger thresholds. | +| **Daemon** | `qml-notify-module/` | Native notifications interface bindings. | + +:::info Technical Reference +See details in the [Notifications Technical Reference](../technical/notifications.md). +::: + +--- + +## 9. Onboarding + +First-launch interactive guidance for new users. + +### Features +* Onboard new users to introduce app features. +* Skip button to bypass onboarding. +* Progress indicator (dots or progress bar). +* "Get Started" option. +* Onboarding persistence (completed/skipped state). + +### Technical Architecture Map (For Contributors) + +| Layer | Path / Files | Implementation Details | +| :--- | :--- | :--- | +| **Frontend UI** | `qml/features/settings/Onboarding.qml` (or similar tutorial slides) | Renders onboarding screens and skip selectors. | + +:::tip Functional Guide +Review first-launch instructions in the [Introduction Guide](./user-manual/introduction.md). +::: + +:::info Technical Reference +Check properties in the [Onboarding Technical Reference](../technical/onboarding.md). +::: + +--- + +## 10. Profiles + +User profile and work/personal scope switching. + +### Features +* Switch between Work and Personal profiles. +* Toggle or dropdown to switch modes. +* **Relational Account Isolation:** Multi-account database isolation prevents cross-profile data leakage. + +### Technical Architecture Map (For Contributors) + +| Layer | Path / Files | Implementation Details | +| :--- | :--- | :--- | +| **Frontend UI** | `qml/features/settings/Profiles.qml` | Renders user picker list and switches active context. | +| **Logic & State** | `models/accounts.js` | Session validation and active instance token switching. | +| **Database Schema** | SQLite relational mapping | Enforces `user_id = (SELECT value FROM app_settings WHERE key = 'active_user_id')` to filter Task and Timesheet replica tables. | + +:::tip Functional Guide +Review profile configurations in the [Settings User Manual](./user-manual/settings.md). +::: + +:::info Technical Reference +For details on context isolation, read the [Profiles Technical Reference](../technical/profiles.md). +::: diff --git a/website/docs/user/features.md b/website/docs/user/features.md new file mode 100644 index 00000000..86fc7df7 --- /dev/null +++ b/website/docs/user/features.md @@ -0,0 +1,47 @@ +--- +title: Features and Workflows +sidebar_label: Features +--- + +# Features and Workflows + +The QML interface is organized by feature area. That makes it possible to describe the product in the same language the repository uses. + +## Main feature groups + +- `timesheets`: work logging and time entry screens +- `tasks`: task-oriented views and editing flows +- `dashboard`: charts, summaries, and overview screens +- `projects`: project-focused pages +- `activities`: activity views +- `updates`: change and update surfaces +- `settings`: accounts, sync, notifications, theme, and voice-model settings + +## Why this matters to users + +This feature organization helps with: + +- onboarding and training material +- screenshot-based guides +- issue reporting with more precise page references +- future release notes grouped by product area + +## App Visual Gallery (Snapshots) + +Here are placeholders for visual guides across the main application views: + +### Timesheets & Logging +![Timesheet Recording Snapshot](/img/snapshots/timesheets.png) +*Figure 1: Interface for logging work hours, tracking entries, and editing timesheets.* + +### Task Management +![Task Management Snapshot](/img/snapshots/tasks.png) +*Figure 2: Kanban/list layouts showing active tasks, stages, and project assignments.* + +### Dashboard & Analytics +![Dashboard Snapshot](/img/snapshots/dashboard.png) +*Figure 3: Dynamic charts showing project time breakdown and weekly summaries.* + +### Settings & Configurations +![Settings Snapshot](/img/snapshots/settings.png) +*Figure 4: Settings page including sync options, server connection settings, and device properties.* diff --git a/website/docs/user/install-and-run.md b/website/docs/user/install-and-run.md new file mode 100644 index 00000000..cbc5cede --- /dev/null +++ b/website/docs/user/install-and-run.md @@ -0,0 +1,49 @@ +--- +title: Install and Run +sidebar_label: Install and Run +--- + +# Install and Run + +This guide explains the current developer-friendly path for building and running TimeManagement. + +## Prerequisites + +- Ubuntu or another Debian-based environment +- Git +- Python 3 +- Docker for Clickable-driven device and cross-build workflows + +## Install Clickable + +Follow the current project prerequisites: + +```bash +sudo apt update +sudo apt install git python3 python3-pip +pip3 install --user clickable-ut +echo 'export PATH=$PATH:~/.local/bin' >> ~/.bashrc +source ~/.bashrc +clickable --version +``` + +## Run on desktop + +Clone the repository and start the desktop app with: + +```bash +clickable desktop +``` + +## Install on a connected device + +Use: + +```bash +clickable install +``` + +## Notes + +- The current repository is desktop and Ubuntu Touch oriented rather than a web app. +- Local database files are typically stored under `~/.clickable/home/.local/share/ubtms/Databases`. diff --git a/website/docs/user/overview.md b/website/docs/user/overview.md new file mode 100644 index 00000000..83d5a68a --- /dev/null +++ b/website/docs/user/overview.md @@ -0,0 +1,37 @@ +--- +title: User Documentation Overview +sidebar_label: Overview +--- + +# User Documentation Overview + +TimeManagement is organized to help end users, project leads, and support teams find the right information quickly. + +Use this section when you want to: + +- understand what the app does +- install or run it on desktop or Ubuntu Touch +- configure accounts and sync behavior +- learn where key workflows live in the app +- learn how to navigate and use specific app features (refer to the [User Manual](./user-manual/introduction.md)) +- troubleshoot common setup and runtime issues + +## What the product covers + +The current project combines several work-management flows: + +- task-oriented work tracking +- timesheet capture +- project and activity views +- dashboard and reporting-style screens +- background services and sync behavior for remote systems such as Odoo + +## Recommended reading path + +If you are new to the project, read these pages in order: + +1. [Install and run](./install-and-run.md) +2. [Setup and sync](./setup-and-sync.md) +3. [Features and workflows](./features.md) +4. [Troubleshooting](./troubleshooting.md) +5. [User Manual](./user-manual/introduction.md) for detailed step-by-step guides on each feature. diff --git a/website/docs/user/setup-and-sync.md b/website/docs/user/setup-and-sync.md new file mode 100644 index 00000000..294ba6bf --- /dev/null +++ b/website/docs/user/setup-and-sync.md @@ -0,0 +1,38 @@ +--- +title: Setup and Sync +sidebar_label: Setup and Sync +--- + +# Setup and Sync + +TimeManagement includes Python backend services and sync-related modules that support account-driven workflows. + +## Setup areas to expect + +Users and maintainers should expect setup work around: + +- account configuration +- remote service credentials +- background daemon behavior +- field mapping and synchronization + +## Relevant code areas + +The current implementation spreads sync responsibilities across the Python backend: + +- `src/odoo_client.py` +- `src/sync_from_odoo.py` +- `src/sync_to_odoo.py` +- `src/tool_field_sync.py` +- `src/config.py` + +## Documentation expectations + +As the product documentation expands, this page should become the stable entry point for: + +- account onboarding +- sync prerequisites +- remote system troubleshooting +- known limits and operational notes + +For now, pair this page with [Troubleshooting](./troubleshooting.md) and the technical architecture docs. diff --git a/website/docs/user/troubleshooting.md b/website/docs/user/troubleshooting.md new file mode 100644 index 00000000..c25e29e6 --- /dev/null +++ b/website/docs/user/troubleshooting.md @@ -0,0 +1,41 @@ +--- +title: Troubleshooting +sidebar_label: Troubleshooting +--- + +# Troubleshooting + +Use this page as the first stop for common issues until dedicated support runbooks are added. + +## Build and startup + +Check these first: + +- `clickable --version` returns successfully +- Docker is available when your build flow depends on it +- `clickable desktop` runs from the repository root + +## Sync-related issues + +If sync behavior is failing: + +- review account and endpoint settings +- inspect Python sync modules under `src/` +- review daemon-related code paths such as `src/daemon.py` and `src/daemon_bootstrap.py` + +## Database notes + +The repository references a local application database path under: + +```text +~/.clickable/home/.local/share/ubtms/Databases +``` + +## When to escalate + +Open a GitHub issue when: + +- the app no longer starts on desktop +- device installation fails consistently +- sync behavior regresses after an upgrade +- a feature-specific screen breaks in one of the known QML feature areas diff --git a/website/docs/user/user-manual/about-us.md b/website/docs/user/user-manual/about-us.md new file mode 100644 index 00000000..c699fb3d --- /dev/null +++ b/website/docs/user/user-manual/about-us.md @@ -0,0 +1,9 @@ +# About Us + +The **About Us** section provides essential information about the Time Management application, including its purpose, version details, and key capabilities. It can be accessed from the **Main Navigation Menu**. + +This section helps users understand: +* What the application does. +* Who it is intended for. +* The main features and benefits. +* System and integration information. \ No newline at end of file diff --git a/website/docs/user/user-manual/activities.md b/website/docs/user/user-manual/activities.md new file mode 100644 index 00000000..2c61fd1e --- /dev/null +++ b/website/docs/user/user-manual/activities.md @@ -0,0 +1,77 @@ +# Activities + +The **Activities** module is used to create, manage, track, and monitor daily activities within the Time Management App. + +Activities help users: +* Organize day-to-day work efficiently. +* Track meetings, follow-ups, and personal work items. +* Maintain activity history and monitor overdue activities. +* Improve productivity and work planning. +* Link activities with projects, tasks, and subprojects. + +--- + +## Accessing the Activities Module +To open the **Activities** section: +1. Click the **Menu (☰)** icon from the top-left corner. +2. Select **Activities** from the sidebar navigation. + +--- + +## Activities Screen Overview +The screen is divided into the following sections: +1. Header Section (Assignee Filter, Add Icon, Search Icon, Back Navigation). +2. Activity Filter Tabs (Today, This Week, This Month, Later, OverDue, All, Done). +3. Activities Overview Panel. +4. Activity Details Panel. +5. Quick Action Icons. + +--- + +### Activities Overview Panel +Displays all activities in a list format. Each card summarizes the Activity Name, Notes, Assigned User, Activity Type, Planned Date, and Overdue Status. + +* **Activity Types**: Meeting, To-Do, Follow-Up, Reminder, Call. +* **Overdue Indicator**: If an activity exceeds its planned date and is not completed, it displays an **Overdue** label in red. + +--- + +## Creating a New Activity +1. Click the **➕ Add Icon** from the top-right corner. +2. Fill in the required information. +3. Click the **✔ Save Button**. + +### Activity Creation Fields +* **Account**: The connected environment. +* **Project & Subproject**: Link to a specific project to enable tracking. +* **Task & Subtask**: Associate with specific work items. +* **Assignee**: The user responsible for the activity. +* **Connected To**: Defines whether the activity is linked to a Project or a Task. +* **Summary**: Primary title (e.g., Client Meeting, Follow-up Call). +* **Notes**: Discussion points, outcomes, reminders, follow-up actions. +* **Activity Type**: Category of activity (Meeting, To-Do, Reminder, Call, Discussion). +* **Date**: Planned scheduled date. + +--- + +## Viewing and Editing Activities +Select the required activity from the overview list to display complete information (Summary, Notes, Project/Task Info, Assignee, Date). + +To edit, click the **Edit Icon** (or swipe left), update fields, and click Save. + +--- + +## Searching Activities +Click the **Search Icon** and enter text to locate activities instantly. + +--- + +## Activity Swipe Actions + +**Swipe Right Action (Delete):** +* Reveals a **Delete Icon** to remove the selected activity from the system. + +**Swipe Left Actions:** +* **Edit**: Opens the activity editing screen. +* **Mark as Done**: Changes the activity status to **Completed** and refreshes the list instantly. +* **Follow-Up**: Creates a new activity form with prefilled details (Summary, Notes, Project Info, Assignee, Type) from the original activity. Users can modify details and select a new date before saving, leaving the original unchanged. \ No newline at end of file diff --git a/website/docs/user/user-manual/all-tasks.md b/website/docs/user/user-manual/all-tasks.md new file mode 100644 index 00000000..c2cd73fe --- /dev/null +++ b/website/docs/user/user-manual/all-tasks.md @@ -0,0 +1,128 @@ +# Tasks + +The **Tasks** module helps users create, organize, assign, and track individual or all work items within the Time Management App. + +Tasks are the core working units of the application and can be linked to projects, assignees, stages, priorities, and planned schedules. + +This module enables users to: +* Create and manage daily work items. +* Assign responsibilities to team members. +* Track deadlines and overdue tasks. +* Organize tasks by stage and priority. +* Monitor workload efficiently and improve productivity. + +--- + +## Accessing the Tasks Module +To open the **Tasks** section: +1. Click the **Menu (☰)** icon from the top-left corner. +2. Select **All Tasks** from the sidebar navigation. + +The Tasks screen will open and display all available tasks. + +--- + +## Tasks Screen Overview +The Tasks screen is divided into two main sections: +1. Tasks Overview Panel +2. Task Details Panel or create new task page + +--- + +### Tasks Overview Panel +Each task card provides a quick summary including: Task Name, Related Project Name, Task Stage, Priority Indicator, Planned Hours, Start Date, End Date, and Overdue Status. + +**Example Task Stages:** Analysis, Design, Development, Testing, Completed. + +**Overdue Indicator:** If a task exceeds its planned end date and is not completed, the system displays an **Overdue** label in red. + +**Date Tabs:** Tasks can be filtered using quick date categories (Today, This Week, This Month, Later, Done, All). + +--- + +### Task Details Panel +To create a new task, click on the `+` icon to open the new task entry form. +In order to view the task details of an already created task, click on the corresponding task to display detailed information. + +Users can create new tasks, edit existing tasks, assign users, set priorities, define stages, add descriptions, configure dates, and upload attachments. + +--- + +## Creating a New Task +To create a task: +1. Open the **All Tasks** module. +2. Click the **➕ Add Icon** from the top-right corner. +3. Fill in the required task details. +4. Click the **✔ Save Button**. + +### Task Creation Fields +* **Account**: Defines the connected account/environment. +* **Project & Subproject**: Associates the task with specific operational projects. +* **Parent Task**: Used to create child tasks under a larger task to improve workflow. +* **Assignees**: Defines the users responsible. You can select multiple users from the list and use the cross icon to unselect. +* **Task Name**: The primary, descriptive title of the work item. +* **Priority**: Importance level represented by a star rating system (e.g., ★☆☆ = Low, ★★★ = High). +* **Initial Stage**: Current workflow stage (Analysis, Design, etc.). +* **Description**: Detailed information, objectives, and scope of work. +* **Planned Hours**: Estimated time required (e.g., `01:00` = 1 Hour). + +### Planned Dates Section +* **Date Range**: Quick scheduling presets (Today, This Week, Custom Range). +* **Start & End Date**: Selected using the date picker for scheduling and deadline tracking. +* **Deadline Section**: Define a final expected completion date to prioritize urgent work. + +### Attachments Section +Upload files to centralize task-related resources and improve collaboration. + +--- + +## Viewing and Editing Task Details +Selecting a task from the overview displays complete information (status, assignees, planned hours, priority, attachments). + +To edit an existing task: +1. Select the task from the task list and click the edit icon (or swipe the task to the left and click the edit icon). +2. Update the required fields. +3. Click the **✔ Save Button**. + +--- + +## Task Stage Management +Tasks move through stages (Analysis, Design, Development, Testing, Completed) to improve workflow tracking and progress monitoring. + +--- + +## Searching and Filtering Tasks +* **Searching**: Click the **Search Icon** and enter the Task Name to find tasks instantly. +* **Filtering by Assignee**: Helps managers review team workloads. + 1. Click the **Assignee Filter Icon** from the top bar. + 2. The "Filter by Assignees" popup appears (by default, the logged-in user is selected). + 3. Select available users using the checkbox (multiple can be selected) and click **Apply Filter**. + +--- + +## Task Status Indicators +Visual indicators include: +* **Red Overdue Text**: Task deadline exceeded. +* **Star Rating**: Task priority level. +* **Stage Label**: Current workflow stage. +* **Planned Hours**: Estimated effort. + +--- + +## Floating Action Button (FAB) +Located at the bottom-right corner of the Tasks Overview screen, it provides quick access to create tasks. Click the FAB, select **Task**, fill in the information, and click **Save**. + +--- + +## Task Swipe Actions +Swipe gestures allow quick management directly from the list. + +### Swipe Right Actions (Reschedule & Delete) +* **Reschedule Icon**: Quickly change planned dates using shortcuts (Tomorrow, Next Week, Next Month) or define a Custom Date Range. +* **Delete Icon**: Removes the selected task from the system. + +### Swipe Left Actions (View, Edit, Start & Pause) +* **View**: Opens detailed task information. +* **Edit**: Opens the task editing screen. +* **Start**: Starts the task timer automatically, potentially creating a timesheet entry. +* **Pause**: Stops or pauses the running task timer to prevent incorrect logging. \ No newline at end of file diff --git a/website/docs/user/user-manual/dashboard.md b/website/docs/user/user-manual/dashboard.md new file mode 100644 index 00000000..8d277dee --- /dev/null +++ b/website/docs/user/user-manual/dashboard.md @@ -0,0 +1,91 @@ +# Dashboard + +## Introduction +The **Dashboard** is the main screen of the Time Management App. It provides a quick overview of tasks, projects, and time distribution based on priority. + +This screen enables users to: +* Identify tasks requiring immediate attention. +* Organize work efficiently. +* Monitor time spent across activities and projects. + +--- + +## Dashboard Overview +The Dashboard consists of the following sections: +1. Header (Top Bar) +2. Priority Matrix +3. Charts +4. Projects Section +5. Quick Action Button + +--- + +## Header Section +Located at the top of the screen. + +### Features: +* **Account Name**: Displays the active user account. +* **Menu Icon (☰)**: Opens the side navigation menu. +* **Notification Icon (🔔)**: Displays alerts and updates. +* **Add Icon (➕)**: Used to create a new timesheet entry. +* **Kebab Menu Icon (⋮)**: Opens the overflow menu with additional navigation options. + +--- + +## Priority Matrix +The Priority Matrix categorizes tasks based on **urgency** and **importance**. + +### Categories: +**Do First (Urgent & Important)** +* Tasks that require immediate attention. + +**Do Next (Not Urgent & Important)** +* Important tasks that can be scheduled. + +**Do Later (Urgent & Not Important)** +* Tasks that can be postponed or delegated. + +**Don’t Do (Not Urgent & Not Important)** +* Tasks that are unnecessary. + +### Time Display: +Each category displays total time spent (e.g., `0H`), helping users evaluate productivity and time allocation. + +--- + +## Charts + +**Most Time-Consuming Projects (Donut Chart)** +* Visual representation of time distribution across projects. +* Larger segments indicate higher time usage. + +**Project-wise Time Spent (Bar Chart)** +* Displays time spent per project. +* X-axis: Project names. +* Y-axis: Time (in hours). +* Bars allow visual comparison of effort across projects. + +--- + +## Projects Section +Displays detailed information about user projects. + +### Features: +* **Total Time Spent** (e.g., `0.0 h`). +* **Progress Indicator**: Visual bar showing time utilization. +* **Search Bar ("Search projects…")**: Enables quick project lookup. + +### Sorting and Filtering Options: +* **Most Time**: Sort by highest time spent. +* **Tasks**: Sort by number of tasks. +* **A–Z**: Alphabetical sorting. + +--- + +## Quick Action Button +A floating action button located at the bottom-right corner. + +### Functions: +* Add a new task. +* Create a timesheet entry. +* Log activity. \ No newline at end of file diff --git a/website/docs/user/user-manual/introduction.md b/website/docs/user/user-manual/introduction.md new file mode 100644 index 00000000..3b0cbdf7 --- /dev/null +++ b/website/docs/user/user-manual/introduction.md @@ -0,0 +1,14 @@ +# Introduction + +Welcome to the Time Management App documentation. This application is a comprehensive tool designed to help users organize work efficiently, monitor time spent across activities, and manage ongoing projects. + +## Core Capabilities + +The application is divided into several interconnected modules to provide a seamless workflow: + +- **Dashboard**: Acts as the main screen, providing a quick overview of tasks, projects, and time distribution based on priority. +- **Projects & Updates**: Create, organize, and monitor all project-related activities, group related tasks, and maintain historical update records for stakeholder visibility. +- **Task Management**: Create, assign, and track individual work items. The app features a dedicated "My Tasks" workspace to help individual users focus specifically on their assigned workload. +- **Activities**: Organize day-to-day work, track meetings, follow-ups, and personal work items, and link them to broader projects and tasks. +- **Timesheets**: Record daily working hours, manage manual or automated time tracking, and support reporting and billing processes. +- **System Settings**: Configure the application to your preferences, including theme settings, push notifications, and background synchronization with external servers like Odoo. \ No newline at end of file diff --git a/website/docs/user/user-manual/kebab-menu.md b/website/docs/user/user-manual/kebab-menu.md new file mode 100644 index 00000000..6b1a8b8a --- /dev/null +++ b/website/docs/user/user-manual/kebab-menu.md @@ -0,0 +1,20 @@ +# Kebab Menu (Overflow Menu) + +The Kebab Menu (⋮) is located in the **top-right corner of the Header Section** and provides quick access to key navigation items. + +### Purpose: +* Offers an alternative navigation method to the sidebar. +* Improves usability on smaller screens and compact layouts. +* Enables quick access without opening the full menu. + +### Menu Items: +The following options are available in the Kebab Menu: +* Dashboard +* Timesheet +* Activities +* My Tasks +* All Tasks +* Projects +* Project Updates +* About Us +* Settings \ No newline at end of file diff --git a/website/docs/user/user-manual/my-tasks.md b/website/docs/user/user-manual/my-tasks.md new file mode 100644 index 00000000..f637a103 --- /dev/null +++ b/website/docs/user/user-manual/my-tasks.md @@ -0,0 +1,101 @@ +# My Tasks + +The **My Tasks** module is a personalized workspace that displays tasks assigned specifically to the logged-in user. + +This section helps users: +* Focus on their assigned work. +* Monitor upcoming and overdue tasks. +* Track daily and weekly workload. +* Start and pause task timers quickly. +* Manage priorities efficiently. + +Unlike the **All Tasks** module, which displays tasks for all users, the **My Tasks** module only shows tasks relevant to the current user. + +--- + +## Accessing the My Tasks Module +To open the **My Tasks** section: +1. Click the **Menu (☰)** icon from the top-left corner. +2. Select **My Tasks** from the sidebar navigation. + +--- + +## My Tasks Screen Overview +The screen contains the following sections: +1. Header Section +2. Task Category Tabs +3. My Tasks Overview Panel +4. Task Information Area +5. Quick Action Button (FAB) + +--- + +### Header Section +* **Filter Icon**: Used to filter tasks based on criteria such as closed or completed tasks. +* **Help Icon**: Provides quick guidance or support information. +* **Search Icon**: Allows users to search tasks instantly. +* **Grid/List View Icon**: Switch between different task display layouts. +* **Add Icon (➕)**: Used to create a new task. + +--- + +### Task Category Tabs +Quick-access tabs to organize tasks based on timeline and completion status. +* **Inbox**: Newly assigned or pending tasks. +* **Today**: Tasks planned for the current day. +* **This Week**: Tasks scheduled within the current week. +* **This Month**: Tasks planned for the current month. +* **Later**: Tasks planned for future dates. +* **Done**: Completed tasks. +* **Cancelled**: Cancelled or closed tasks. +* **All**: Displays all assigned tasks. + +--- + +### My Tasks Overview Panel +Displays all assigned task cards in a structured list format. Each card includes: Task Name, Related Project Name, Task Stage, Priority Rating, Planned Hours, Start Date, End Date, and Overdue Status. + +* **Priority Indicator**: Represented using star ratings (e.g., ★☆☆ for Low). +* **Overdue Indicator**: Displays the overdue duration in red if the task exceeds its planned end date. + +--- + +### Task Information Display +Each task item provides scheduling information (Planned Hours, Start Date, End Date, Stage Name) to help users track deadlines and improve schedule awareness. + +--- + +## Managing Tasks from My Tasks + +**Creating a New Task:** +1. Click the **➕ Add Icon** or Floating Action Button. +2. Enter required task information and click **Save**. + +**Viewing and Editing:** +* Click on a task card to open the detailed view. +* Click the **Edit Icon**, update fields, and click **Save**. + +**Searching:** +* Click the **Search Icon** and enter the task name to quickly locate assigned work. + +--- + +## Task Timer Management +The module supports built-in time tracking directly from the overview screen. + +* **Starting a Timer**: Swipe the task item to the left and click the **Start Icon**. Active work duration begins recording, and a timesheet entry may be created automatically. +* **Pausing a Timer**: Swipe the task item to the left and click the **Pause Icon**. This stops active tracking temporarily. + +--- + +## Swipe Actions in My Tasks +Quick swipe gestures reduce navigation steps. + +**Swipe Left Actions:** +* **View**: Opens complete task details. +* **Edit**: Opens task editing screen. +* **Start / Pause**: Controls the active task timer. + +**Swipe Right Actions:** +* **Reschedule**: Quickly change planned task dates (Tomorrow, Next Week, Next Month, or Custom). +* **Delete**: Remove the task from the system. \ No newline at end of file diff --git a/website/docs/user/user-manual/project-updates.md b/website/docs/user/user-manual/project-updates.md new file mode 100644 index 00000000..17861e5a --- /dev/null +++ b/website/docs/user/user-manual/project-updates.md @@ -0,0 +1,90 @@ +# Project Updates + +The Project Updates module is used to create, track, monitor, and communicate the latest progress of projects within the Time Management App. + +This module helps teams and stakeholders: +* Share current project progress. +* Monitor project health and status. +* Communicate blockers or risks. +* Maintain historical update records. +* Improve project visibility across teams. + +Project Updates act as progress checkpoints and provide a centralized place to document activities, achievements, delays, and important notes. + +--- + +## Accessing the Project Updates Module +To open the Project Updates section: +1. Click the **Menu (☰)** icon from the top-left corner. +2. Select **Project Updates** from the sidebar navigation. + +--- + +## Project Updates Screen Overview +The screen is divided into the following sections: +* Header Section (Add Icon, Search Icon, Back Navigation) +* Status Filter Tabs +* Project Updates List Panel +* Project Update Details Panel +* Quick Action Icons + +--- + +### Status Filter Tabs +Provides quick filters to organize updates based on project status. +* **All**: Displays all project updates. +* **On Track**: Updates for healthy progressing projects. +* **At Risk**: Projects with identified risks or delays. +* **Off Track**: Projects facing major issues or delays. +* **On Hold**: Temporarily paused projects. + +--- + +### Project Updates List Panel +Displays all updates in list format. Each card provides a summary: Update Title, Created By User, Update Date, Related Project Name, Project Status, Progress Indicator, and a Details Button. + +* **Progress Indicator**: A visual progress bar representing overall completion percentage to improve reporting clarity. + +--- + +## Creating a New Project Update +1. Open the **Project Updates** module and click the **➕ Add Icon**. +2. Fill in the required update information. +3. Click the **✔ Save Button**. + +### Project Update Fields +* **Account**: Defines the connected environment. +* **Project**: The associated project to maintain history. +* **Update Title**: Short and meaningful subject (e.g., Sprint Progress Update). +* **Project Status**: Defines current health (On Track, At Risk, Off Track, On Hold). +* **Progress**: Configured using a progress slider (e.g., 50% = Midway completed). +* **Description**: Detailed information (completed activities, upcoming work, blockers, dependencies). + +### Saving a Project Update +After clicking the **✔ Save Button**, the update is validated, saved automatically, and becomes visible to users. + +--- + +## Viewing and Editing Details +Click the **Details** button on the overview list to open the detailed view screen. + +### Rich Text Editor +When details are opened, the description uses a **Rich Text Editor**. It supports formatting options like Bold, Italic, Underline, Bullet/Numbered Lists, Headings, Text Alignment, and Hyperlinks to structure long content professionally. + +To edit an update, select it, click the edit icon, update fields, and click Save. + +--- + +## Searching and Status Indicators +* **Searching**: Click the Search Icon and enter text to instantly display matching updates. +* **Status Indicators**: + * Green: On Track. + * Orange: At Risk. + * Red: Off Track. + * Gray: On Hold. + +--- + +## Project Update Swipe Actions +* **Swipe Right (Delete)**: Reveals a Delete Icon to remove the selected project update and refresh the list. +* **Swipe Left (Edit)**: Reveals an Edit Icon to quickly modify the Title, Status, Percentage, and Description without opening the full details screen. \ No newline at end of file diff --git a/website/docs/user/user-manual/projects.md b/website/docs/user/user-manual/projects.md new file mode 100644 index 00000000..05e91d85 --- /dev/null +++ b/website/docs/user/user-manual/projects.md @@ -0,0 +1,140 @@ +# Projects + +The **Projects** module is used to create, organize, monitor, and manage all project-related activities within the Time Management App. + +Projects help users: +* Group related tasks and activities. +* Track project timelines and allocated effort. +* Monitor progress and status. +* Manage assignments and ownership. +* Organize work efficiently across teams or departments. + +The Projects section acts as a centralized workspace for all ongoing and completed projects. + +--- + +## Accessing the Projects Module +To open the **Projects** section: +1. Click the **Menu (☰)** icon from the top-left corner. +2. Select **Projects** from the sidebar navigation. + +--- + +## Projects Screen Overview +The Projects screen contains the following components: +1. Header Section +2. Projects List +3. Project Information Panel +4. Search and Filter Options +5. Quick Action Buttons + +--- + +### Header Section +Located at the top of the Projects screen. + +**Features:** +* **Search Icon**: Used to search projects quickly. +* **Grid/List View Icon**: Switch between available project display layouts. +* **Add Icon**: Create a new project. +* **Save Icon**: Save newly created or edited project details. + +--- + +### Projects List Panel +The left-side panel displays all available projects. + +Each project item provides a quick summary including: Project Name, Instance Name, Current Status, Planned Hours, Start Date, End Date, and Overdue Indicator (if applicable). + +**Example Statuses:** To Do, In Progress, Completed, On Hold. + +**Additional Indicators:** +* **Star Icon**: Marks favorite or important projects. +* **Overdue Label**: Highlights projects that exceeded their planned completion date. + +--- + +### Project Information Panel +Clicking on any project from the project overview list will display detailed information about the selected project. + +--- + +## Creating a New Project +To create a project: +1. Open the **Projects** module. +2. Click the **➕ Add Icon**. +3. Fill in the required project information. +4. Click the **✔ Save Button**. + +The project will then appear in the Projects List. + +### Project Creation Fields +* **Account**: Defines which connected account or environment the project belongs to, ensuring data is stored in the correct server. Displays the currently active account and can be changed via dropdown. +* **Parent Project**: Used to create sub-projects under a larger project to improve hierarchy and structure (e.g., Website Migration -> UI Design). +* **Assignee**: Defines the user responsible for the project, clarifying ownership. +* **Project Name**: The primary title of the project (e.g., Mobile App Development, Website Redesign). +* **Description**: Detailed information including objectives, scope of work, and expected outcomes. +* **Allocated Hours**: Estimated time planned for the project (e.g., `01:00` = 1 Hour) to help with workload planning. +* **Color Indicator**: Allows assigning a color to make projects easier to identify. + +### Planned Dates Section +Defines the expected project timeline. +* **Date Range**: Provides quick date selection presets (Today, This Week, This Month, Custom Range). +* **Start Date**: Defines when the project is expected to begin. +* **End Date**: Defines the planned completion date. *Note: If the current date exceeds the End Date and the project is incomplete, the system may display an **Overdue** indicator.* + +### Attachments Section +Allows users to upload and manage project-related files. + +**How to Upload:** Click the **Upload Icon**, select a file, and wait for completion. +**Benefits:** Keeps files centralized, improves collaboration, and syncs automatically with the server and vice versa. + +--- + +## Viewing and Editing Project Details +Selecting a project from the Projects List displays its details in the right-side panel. Users can review project status, timeline, allocated hours, description, assigned user, and attachments. + +To edit an existing project: +1. Select the project from the list. +2. Click on the edit icon from the top right. +3. Update the required fields. +4. Click the **✔ Save Button**. + +--- + +## Project Status Management +Projects move through different statuses during their lifecycle. + +| Status | Description | +| --- | --- | +| To Do | Project has not started | +| In Progress | Work is currently ongoing | +| Completed | Project work is finished | +| On Hold | Temporarily paused | + +--- + +## Searching and Favoriting Projects +* **Searching**: Click the **Search Icon** and enter the Project Name. Matching projects are displayed instantly. +* **Favorites**: Projects can be marked as favorites using the **Star Icon** for faster access and easier navigation. + +--- + +## Project Overview Swipe Actions +From the Projects List overview, swipe any project item to the **left** to reveal three action icons: +1. **View**: Opens the detailed page of the selected project. +2. **Start**: Starts the project timer, records time automatically, and creates a timesheet entry. +3. **Pause**: Stops the active timer and pauses time tracking. + +--- + +## Filter Projects by Stage +The **Filter by Stage** feature allows users to quickly view projects based on their current status. + +**Accessing the Filter:** +1. Navigate to the **Projects** module. +2. Click the **Floating Action Button (FAB)** at the bottom-right corner. +3. A filter panel titled **“Filter by Stage”** will appear displaying available options (Open Projects, All Stages, To Do, In Progress, Done, Cancelled). + +**How it Works:** +When a stage is selected, the Projects List refreshes automatically to display only matching projects (e.g., selecting **In Progress** will display only projects currently under active development). By default, all stages will be displayed when opening a project list overview. Users can change or clear the filter by opening the panel again and selecting **All Stages**. \ No newline at end of file diff --git a/website/docs/user/user-manual/settings.md b/website/docs/user/user-manual/settings.md new file mode 100644 index 00000000..6612dca3 --- /dev/null +++ b/website/docs/user/user-manual/settings.md @@ -0,0 +1,259 @@ +# Settings + +The **Settings** section allows users to configure the application according to their preferences and manage system-level features such as connected accounts, notifications, synchronization, and appearance. + +This section is especially useful for first-time users to personalize their experience and ensure the app works seamlessly with external systems. + +--- + +## Accessing Settings +To open **Settings**: +1. Click on the **Menu (☰)** icon in the top-left corner. +2. Select **Settings** from the sidebar navigation. + +The Settings screen is divided into multiple configurable sections. + +--- + +## Settings Overview +The Settings module includes the following options: +1. Connected Accounts +2. Notifications +3. Background Sync +4. Theme Settings + +Each option is explained in detail below. + +--- + +## Connected Accounts +The **Connected Accounts** section allows users to link and manage multiple environments or instances (such as local, test, or production systems). + +### Purpose: +* Enable integration with different servers or environments. +* Allow switching between multiple accounts. +* Manage synchronization across systems. + +### Key Elements: +* **Account List**: Displays all configured accounts. +* **Account Type Indicator**: Shows whether it is Local or Server Instance. +* **Instance URL**: Displays the connected server link. +* **Status Indicator**: + * *In Progress*: Sync or connection is ongoing. + * *Successful*: Connection is active and working. +* **Sync Icon (🔄)**: Manually refresh or sync the account. +* **Checkbox Selector**: Activate or select a specific account. +* **Add Button (➕)**: Add a new account. + +--- + +## Adding a New Account +Click on the **(➕)** icon to add a new account. + +### Sections in “Create Account” Screen: +1. Account Details +2. Server Connection +3. Credentials +4. Sync Preferences + +Each section must be completed carefully to ensure a successful connection. + +### Account Details +This section defines how the account will appear inside the application. + +**Fields:** +* **Account Name**: Enter a recognizable name (e.g., *Work Account*, *Test Server*). This name helps identify the account when switching between multiple accounts. + +### Server Connection +This section is used to connect the app to your server. + +**Fields:** +* **URL**: Enter the server URL. Example: `https://tma.onestein.eu/`. + +After entering the URL, click **Fetch Databases**. + +### Fetch Databases +Clicking **Fetch Databases** initiates a process to retrieve available databases from the provided server. + +**System Behavior:** +* The app connects to the server. +* A new screen or dialog opens. +* A list of available databases is displayed. + +**User Actions Required:** +On the database selection screen: +* Review the list of available databases. +* Select the appropriate database. +* If required, manually enter the **Database Name**. + +**Notes:** +* If no databases appear: Verify the server URL, check internet connectivity, and ensure the server is accessible. +* If multiple databases are listed: Choose the correct one based on your environment. + +Once selected, confirm and return to the account setup screen. + +### Database Name +After fetching databases: +* The selected database name will be auto-filled or manually entered. +* Ensure the correct database is selected before proceeding. + +### Credentials +This section is used to authenticate your account. + +**Fields:** +* **Username**: Enter your login username. +* **Connect With**: Connect With Password or API Key. +* **Password**: Enter your account password. Use the visibility toggle (👁) to view or hide the password. + +### Sync Preferences +This section allows you to control how data synchronization works. + +**Options:** +* **Custom Sync Settings (Toggle Switch)** + * When enabled: You can define custom sync behavior. + * When disabled: The system uses default settings (Sync Interval: ~15 minutes; Direction: Two-way sync where data is both sent and received). + +### Completing Account Setup +After filling all required fields: +1. Click the **✔ (Save/Confirm)** button at the top-right corner. +2. The system will: Validate credentials, establish connection, and add the account to the Connected Accounts list. + +### Post-Setup Behavior +Once the account is successfully created: +* It appears under **Connected Accounts**. +* You can activate it using the checkbox and sync it manually using the 🔄 icon. +* Initial synchronization may begin automatically. + +--- + +## Managing and Syncing Accounts + +### Switching Between Accounts +* Use the **checkbox** next to an account to activate it. +* Only one account should be active at a time. +* The active account determines where your data is synced and stored. + +### Syncing an Account +* Click the **Sync (🔄)** icon next to an account. +* The system will fetch the latest data and update tasks, projects, timesheets, etc. +* Status will update automatically (e.g., *In Progress → Successful*). + +### Managing Accounts (Swipe Actions) +The **Connected Accounts** list supports quick actions using swipe gestures, allowing users to efficiently manage accounts without opening additional screens. + +**Purpose:** Provide faster access to common actions, improve usability (especially on touch devices), and reduce navigation steps. + +**Available Actions:** +* **Swipe Right (→): Edit Account** + * Swipe an account item to the **right** to reveal the **Edit** option. + * Use this to update instance URL, modify login credentials, and change account configuration. +* **Swipe Left (←): View & Delete Options** + * Swipe an account item to the **left** to reveal two action icons: + 1. **View**: Opens account details and displays configuration and connection information. + 2. **Delete**: Removes the account from the app. + +--- + +## Notifications +The **Notifications** section controls how and when the application alerts you. + +### Push Notifications +Allows you to control whether the application can send alerts directly to your device. + +**Key Option:** +* **Enable Notifications (Toggle Switch)** + * **ON**: The app will send real-time notifications for updates such as task changes, project updates, and activity logs. + * **OFF**: All push notifications will be disabled. + +**When to Enable:** If you want to stay informed about updates instantly, or if you rely on reminders for task/project updates and activities. +**When to Disable:** If you prefer fewer interruptions or if you only check updates manually within the app. + +### Notification Schedule +Allows you to control *when* notifications are delivered, ensuring they only arrive during your preferred working hours. This is especially useful for maintaining work-life balance and avoiding notifications outside office hours. + +**Enable Schedule:** +* **ON**: Notifications will only be sent during configured days and hours. +* **OFF**: Notifications can be sent at any time. + +**Timezone:** +* Select your **Timezone** to ensure notifications are aligned with your local time. The default value is usually set to **System Default**. + +**Working Days:** +* Options include Monday through Sunday. +* Only selected days will allow notifications, while unselected days will block all notifications. + +**Working Hours:** +* **From**: Start time (e.g., 09:00). +* **To**: End time (e.g., 18:00). +* Notifications will only be sent within the selected time range. + +**Example Configuration (Standard Work Schedule):** +* Enable Notifications: ON +* Enable Schedule: ON +* Working Days: Monday to Friday +* Working Hours: 09:00 to 18:00 +* *Result:* You will only receive notifications during office hours on weekdays. + +--- + +## Background Sync +The **Background Sync** feature ensures your data stays updated automatically. + +**Features:** +* Enable automatic synchronization. +* Set sync frequency. +* Sync tasks, timesheets, projects, project updates, etc., in the background. + +**Benefits:** Reduces manual effort, keeps data consistent across devices and accounts, and ensures real-time updates. + +### Background Sync Settings Overview +This screen allows you to configure how and when your data is synchronized with the server. This feature works in the background without requiring manual intervention. + +**Key Configuration Options:** +1. **Enable AutoSync (Toggle Switch)** + * **ON**: Automatic synchronization is enabled, and the app will sync data at defined intervals. + * **OFF**: Background sync is disabled, and data must be synced manually. +2. **Sync Interval** + * Defines how often the application performs automatic synchronization. + * Example Options: 5 minutes, 15 minutes, 30 minutes or more. + * Recommendation: Use **5–15 minutes** for active users; use longer intervals to conserve battery and data usage. +3. **Sync Direction** + * **Both (Up & Down)** *(Default)*: Uploads local changes to the server and downloads updates from the server. + * **Upload Only (Up)**: Sends local data to the server but does not fetch updates. + * **Download Only (Down)**: Retrieves updates from the server but does not upload local changes. +4. **Restart Background Daemon** + * Allows you to restart the background synchronization service. Use this if sync appears stuck, after changing sync settings, or after reconnecting an account. + +### How Background Sync Works +When AutoSync is enabled: +1. The app runs a background service. +2. At each interval, it connects to the configured account/server, uploads new or modified data (tasks, timesheets, etc.), and downloads updates from the server. +3. Updates are applied automatically without user action. + +**Best Practices:** +* Keep AutoSync enabled for a seamless experience. +* Use a 15-minute interval for balanced performance and battery usage. +* Keep Sync Direction = Both unless you have a specific need. +* Restart the daemon if syncing issues occur. + +--- + +## Theme Settings +The **Theme Settings** section allows users to customize the visual appearance of the application. + +**Benefits:** Improves readability, enhances user comfort during extended usage, and supports accessibility preferences. + +### Available Theme Options +1. **Light Theme**: Bright and clean interface that uses light backgrounds with dark text. Suitable for well-lit environments and daytime use. +2. **Dark Theme**: Dark background with lighter text. Reduces screen brightness and glare. + +### How to Change the Theme +1. Select **Theme Settings**. +2. Choose one of the available options: Light Theme or Dark Theme. +3. The selected theme will be applied immediately. + +**System Behavior:** +* The currently selected theme is marked with a **check indicator (✔)**. +* Only one theme can be active at a time. +* Theme changes are applied **instantly** across all screens (no restart or refresh is required). +* The selected theme is **saved automatically** and persists across sessions. \ No newline at end of file diff --git a/website/docs/user/user-manual/timesheets.md b/website/docs/user/user-manual/timesheets.md new file mode 100644 index 00000000..75de4db8 --- /dev/null +++ b/website/docs/user/user-manual/timesheets.md @@ -0,0 +1,93 @@ +# Timesheet + +The **Timesheet** module is used to record, manage, and monitor the time spent on projects, tasks, and daily work activities within the Time Management App. + +This module helps users: +* Track daily working hours. +* Record effort spent on tasks and projects. +* Maintain accurate work logs to improve productivity tracking. +* Support reporting and billing processes. +* Monitor time utilization across teams and projects. + +--- + +## Accessing the Timesheet Module +To open the **Timesheet** section: +1. Click the **Menu (☰)** icon from the top-left corner. +2. Select **Timesheet** from the sidebar navigation. + +--- + +## Timesheet Screen Overview +The screen is divided into the following sections: +1. Header Section (Add Icon, Back Navigation, Search Icon). +2. Timesheet Filter Tabs. +3. Timesheet Overview Panel. +4. Timesheet Details Panel. +5. Swipe Actions. +6. Floating Action Button (FAB). + +### Timesheet Filter Tabs +* **All**: Displays all timesheet entries. +* **Active**: Displays currently active or ongoing timesheets. +* **Draft**: Displays saved draft timesheets awaiting completion. + +### Timesheet Overview Panel +Displays records in a list format, summarizing: Timesheet Title, Project Name, Task Info, Logged Hours, Entry Date, Assigned User, and Priority. + +--- + +## Creating a New Timesheet Entry +Click the **➕ Add Icon** or tap the **Floating Action Button (FAB)** and select **Create**. Fill in the information and click the **✔ Save Button**. + +### Timesheet Creation Fields +* **Account, Project, Subproject, Task, Subtask**: Link the entry to specific organizational and work items to support accurate reporting. +* **Priority**: Importance level (Important/Urgent (1), Important/Not Urgent (2), Urgent/Not Important (3), Not Urgent/Not Important (4)). +* **Time Tracking Mode**: + * **Manual**: Users manually enter working hours. + * **Automated**: The system timer automatically tracks time. +* **Timer**: Features Start, Pause, and Stop buttons. Updates automatically while running and adds duration to the entry. +* **Date**: Working date for chronological tracking. +* **Description**: Detailed info about work completed, updates, resolved issues, and meetings attended. + +--- + +## Viewing and Editing Timesheets +Select a timesheet from the overview list to display complete information in the Details Panel. To edit, open the entry in edit mode, update fields, and click Save. + +--- + +## Timesheet Status Management +* **Active**: Currently ongoing or recently updated. +* **Draft**: Saved temporarily before final submission. +* **Completed**: Finished and finalized entries ready for synchronization. + +--- + +## Automated Timer Save as Draft Process +When using **Automated** tracking, clicking the **Stop Button** automatically opens the **Add Description to Timesheet** dialog box. + +**Dialog Box Actions:** +* Displays total tracked time and allows users to enter work details. +* **Save as Draft Button**: Saves the tracked duration and description in **Draft** status. It is not finalized, but becomes visible under the Draft tab for future editing. +* **Cancel Button**: Closes the dialog without saving and discards the timer data. + +### Completing a Draft Timesheet +Draft entries can be finalized directly from the overview screen: +1. Open the **Draft** tab. +2. Swipe the required entry toward the left. +3. Tap the **✔ Mark as Done** icon. + +A success message appears: *"Timesheet is now ready to be synced to Odoo."* The entry moves from the Draft tab to the All tab, changes to **Completed** status, and becomes available for Odoo synchronization. + +--- + +## Timesheet Swipe Actions + +**Right Swipe Action (Delete):** +* Reveals the **Delete** option to quickly remove unwanted or incorrect entries. + +**Left Swipe Actions (Quick Controls):** +* **Edit**: Opens the timesheet in edit mode. +* **Start Timer**: Begins automated time tracking directly from the list; the entry may appear under the Active tab while running. +* **Mark as Done**: Finalizes a draft timesheet for synchronization. \ No newline at end of file diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js new file mode 100644 index 00000000..4a8802af --- /dev/null +++ b/website/docusaurus.config.js @@ -0,0 +1,137 @@ +const config = { + title: "TimeManagement", + tagline: "A practical time, task, and sync workspace for Ubuntu Touch and desktop users", + favicon: "img/logo.png", + url: "https://citopenrep.github.io", + baseUrl: "/timemanagement/", + organizationName: "CITOpenRep", + projectName: "timemanagement", + trailingSlash: false, + onBrokenLinks: "throw", + stylesheets: [ + { + href: "https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&display=swap", + type: "text/css" + } + ], + markdown: { + mermaid: true, + hooks: { + onBrokenMarkdownLinks: "warn" + } + }, + i18n: { + defaultLocale: "en", + locales: ["en"] + }, + presets: [ + [ + "classic", + { + docs: { + path: "docs", + routeBasePath: "docs", + sidebarPath: require.resolve("./sidebars.js"), + editUrl: "https://github.com/CITOpenRep/timemanagement/tree/main/website/" + }, + blog: false, + theme: { + customCss: require.resolve("./src/css/custom.css") + } + } + ] + ], + themeConfig: { + image: "img/social-card.png", + navbar: { + title: "TimeManagement", + logo: { + alt: "TimeManagement logo", + src: "img/logo.png" + }, + items: [ + { + to: "/docs/user/overview", + label: "Docs", + position: "left" + }, + { + to: "/docs/technical/architecture", + label: "Technical", + position: "left" + }, + { + to: "/docs/contributing/getting-started", + label: "Contributing", + position: "left" + }, + { + href: "https://github.com/CITOpenRep/timemanagement", + label: "GitHub", + position: "right" + } + ] + }, + footer: { + style: "dark", + links: [ + { + title: "Docs", + items: [ + { + label: "User Docs", + to: "/docs/user/overview" + }, + { + label: "Technical Docs", + to: "/docs/technical/architecture" + }, + { + label: "Contributing", + to: "/docs/contributing/getting-started" + } + ] + }, + { + title: "Project", + items: [ + { + label: "Repository", + href: "https://github.com/CITOpenRep/timemanagement" + }, + { + label: "Issues", + href: "https://github.com/CITOpenRep/timemanagement/issues" + } + ] + } + ], + copyright: `Made with ❤️ by CIT Services · Copyright ${new Date().getFullYear()} CIT-Services` + }, + prism: { + theme: require("prism-react-renderer").themes.github, + darkTheme: require("prism-react-renderer").themes.vsDark + } + }, + themes: [ + "@docusaurus/theme-mermaid", + [ + require.resolve("@easyops-cn/docusaurus-search-local"), + /** @type {import("@easyops-cn/docusaurus-search-local").Options} */ + ({ + hashed: true, + language: ["en"], + docsRouteBasePath: "docs", + docsDir: "docs", + indexBlog: false, + indexDocs: true, + indexPages: true, + highlightSearchTermsOnTargetPage: true, + searchResultLimits: 8, + searchResultContextMaxLength: 50 + }) + ] + ] +}; + +module.exports = config; diff --git a/website/package-lock.json b/website/package-lock.json new file mode 100644 index 00000000..80115f3f --- /dev/null +++ b/website/package-lock.json @@ -0,0 +1,20070 @@ +{ + "name": "timemanagement-website", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "timemanagement-website", + "version": "0.1.0", + "dependencies": { + "@docusaurus/core": "^3.9.2", + "@docusaurus/preset-classic": "^3.9.2", + "@docusaurus/theme-mermaid": "^3.10.1", + "@easyops-cn/docusaurus-search-local": "^0.55.2", + "@mdx-js/react": "^3.1.0", + "@mermaid-js/layout-elk": "^0.1.9", + "clsx": "^2.1.1", + "prism-react-renderer": "^2.4.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.19.0.tgz", + "integrity": "sha512-Lhnez3hhXHk25lfxLAMxvkP4fmN3+1RgADhD2ssMDBYuAsDVReeyP+3SGRx+ntq8ijMrLqUyfvO72TB6jsTteQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.8.tgz", + "integrity": "sha512-3YEorYg44niXcm7gkft3nXYItHd44e8tmh4D33CTszPgP0QWkaLEaFywiNyJBo7UL/mqObA/G9RYuU7R8tN1IA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.8", + "@algolia/autocomplete-shared": "1.19.8" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz", + "integrity": "sha512-ZvJWO8ZZJDpc1LNM2TTBdmQsZBLMR4rU5iNR2OYvEeFBiaf/0ESnRSSLQbryarJY4SVxtoz6A2ZtDMNM+iQEAA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.8" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz", + "integrity": "sha512-h5hf2t8ejF6vlOgvLaZzQbWs5SyH2z4PAWygNAvvD/2RI29hdQ54ldUGwqVuj9Srs+n8XUKTPUqb7fvhBhQrnQ==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.53.0.tgz", + "integrity": "sha512-0ZjA5Hcmaoz5Lj6OG0zhfIyeqzJZnLW2CRJA1W17UwMFGRtZAJ9yJKRvPEDA6gkpsIoQxORTSW6sWFiuYncPNQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.53.0.tgz", + "integrity": "sha512-kWNodP75iiEaOtemC9F/hlxNBG5E2QUjN1BusnE6m2b4l7Qh/BUO3fGCVsmKJI65VO4VKGGmT43ICvHtTcJ2JQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.53.0.tgz", + "integrity": "sha512-YPN45TXD9Wrse185t/Ta7nktZsqpv97oOjCzp2sblHnCL6rBc9TDeJAg1IGl2UpdwnSD05Zu/5wLB4watOUMyg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.53.0.tgz", + "integrity": "sha512-qAcYTDJE6m924FDDUQvdD6vh7DYaqOeSpFS74IP37/JRV0v4cGBauyxTF2WzDnokUylQDbqreoFIJZfg0Fitmw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.53.0.tgz", + "integrity": "sha512-fQaY+DkSJOpuUVUe8MQTwrdiKAqkJGhpDarB08duBn/sUv7Bkib6MDRQauCcWTWTe4HIW+EbwQP9R4kci1V/Yw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.53.0.tgz", + "integrity": "sha512-o72tsiEZGfeS/dxL9IADfzcZWGEwKDEe5CvtrBuT//3JR+SHuTtHRI2ZTf7D7bcKagcbojvO8hnkHdfoakSlYg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.53.0.tgz", + "integrity": "sha512-Ds16IyPm/dNJPCU8OzApo2gwGrgWT5BYHhE3NFwZbpCveqyvPDB9sZDDkJ5DsdOGT2aC+R3i0/M1OVXF2qdgPg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/ingestion": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.53.0.tgz", + "integrity": "sha512-oNbT6z4NwD8Pou9VPINGlN/tlG1afESh2EbxqnP6rwl95xKVD/Zlciis1PpNeO/9U/rrajc1+7DcfKi03tX1KQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.53.0.tgz", + "integrity": "sha512-G+KZb/yd+qAOFn/cEvTGeLxQm8aP3a0od50l3z/ylccY+/o4YG3TNcjU1tFQHW4mXC137GPyR7W70R0kRQDLnA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.53.0.tgz", + "integrity": "sha512-6aVfYd55Un6IUgPLbo84WfgFZlS3L0vA1ttzXL5vahHewUJ8jYgd89TzlWRTeej7w70mb9RWsVlFYGmJ/diQww==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.53.0.tgz", + "integrity": "sha512-ke27DqgzCOlt+RbeEdCxtXxMQOnAOi8ujr2wid0DmDKzR95Kw/f9sBsuhBxtjevCqJRJszfRTLY0B1pbO6IhkA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.53.0.tgz", + "integrity": "sha512-GngiOqt2Gq4oLno6yXQVj9om+qSO9SWAoduoTOEg79dKZ62brB8OOIvSJG/vDNoanYi6a7Al9uDZwXvi+bcVTg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.53.0.tgz", + "integrity": "sha512-6mF9LZMUk0QqWvrnxkxBqhswwz6Xfiwy6/gmTzL5HrlhdVG3ITAqGV2k3XmVThP1h0Ulc3VQwiNCD7/Nr4JNlQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "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/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@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-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", + "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.29.7.tgz", + "integrity": "sha512-J0wGhKan+rIiE2OhfhRptySLrJ6SjQYM6b6N1FMlhyhCcw1Mig8vQjWchyB+bgHGDvaWo6Diu6CLRMra2uMtmg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz", + "integrity": "sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz", + "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz", + "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz", + "integrity": "sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", + "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz", + "integrity": "sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", + "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.29.7.tgz", + "integrity": "sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-transform-react-display-name": "^7.29.7", + "@babel/plugin-transform-react-jsx": "^7.29.7", + "@babel/plugin-transform-react-jsx-development": "^7.29.7", + "@babel/plugin-transform-react-pure-annotations": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", + "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", + "license": "MIT" + }, + "node_modules/@chevrotain/types": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", + "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", + "license": "Apache-2.0" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", + "integrity": "sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-position-area-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz", + "integrity": "sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-property-rule-prelude-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz", + "integrity": "sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-syntax-descriptor-syntax-production": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz", + "integrity": "sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-system-ui-font-family": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz", + "integrity": "sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/core": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/core/-/core-4.6.3.tgz", + "integrity": "sha512-rUOujwIpxJRgD7+kicVsI3D5sqBvdiRTquzWBpTEXZs8ZXfGbfzpus5HqumaNYTppN2HvH8E2yNuRwYdHJeOlA==", + "license": "MIT", + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docsearch/css": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.6.3.tgz", + "integrity": "sha512-nlOwcXcsNAptQl4vlL4MA78qNJKO0Qlds5GuBjCoePgkebTXLSf8Qt1oyZ3YBshYupKXG9VRGEsk1zr23d+bzQ==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.6.3.tgz", + "integrity": "sha512-Bg2wdDsoQVlNCcEKuEJAU04tvHCqgx8rIu+uIoM4pRtcx3TBKJuXutJik3LTA8LRc9YEyHkrYUrmcC0D7BYf+g==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/core": "4.6.3", + "@docsearch/css": "4.6.3" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.10.1.tgz", + "integrity": "sha512-DZzFO1K3v/GoEt1fx1DiYHF4en+PuhtQf1AkQJa5zu3CoeKSpr5cpQRUlz3jr0m44wyzmSXu9bVpfir+N4+8bg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.10.1.tgz", + "integrity": "sha512-HIqQPvbqnnQRe4NsBd1774KRarjXqS6wHsWELtyuSs1gCfvixJO2jUGH/OEBtr1Gvzpw+ze5CjGMvSJ8UE1KUw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.10.1", + "@docusaurus/cssnano-preset": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^7.0.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.1.tgz", + "integrity": "sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.10.1", + "@docusaurus/bundler": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "^5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.3", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.7", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*", + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.1.tgz", + "integrity": "sha512-eNfHGcTKCSq6xmcavAkX3RRclHaE2xRCMParlDXLdXVP01/a2e/jKXMj/0ULnLFQSNwwuI62L0Ge8J+nZsR7UQ==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.10.1.tgz", + "integrity": "sha512-oPjNFnfJsRCkePVjkGrxWGq4MvJKRQT0r9jOP0eRBTZ7Wr9FAbzdP/Gjs0I2Ss6YRkPoEgygKG112OkE6skvJw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.10.1.tgz", + "integrity": "sha512-GRmeb/wQ+iXRrFwcHBfgQhrJxGElgCsoTWZYDhccjsZVne1p8MK/EpQVIloXttz76TCe78kKD5AEG9n1xc1oxQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.1.tgz", + "integrity": "sha512-YoOZKUdGlp8xSYhuAkGdSo5Ydkbq4V4eK3sD8v0a2hloxCWdQbNBhkc+Ko9QyjpESc0BYcIGM5iHVAy5hdFV6w==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.1.tgz", + "integrity": "sha512-mmkgE6Q2+K74tnkou7tXlpDLvoCU/qkSa2GSQ3XUiHWvcebCoDQzS670RR3tO8PmaWlIyWWISYWzZLuMfxunRA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "cheerio": "1.0.0-rc.12", + "combine-promises": "^1.1.0", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz", + "integrity": "sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.1.tgz", + "integrity": "sha512-huJpaRPMl42nsFwuCXvV8bVDj2MazuwRJIUylI/RSlmZeJssVoZXeCjVf1y+1Drtpa9SKcdGn8yoJ76IRJijtw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.1.tgz", + "integrity": "sha512-r//fn+MNHkE1wCof8T29VAQezt1enGCpsFxoziBbvLgBM4JfXN2P3rxrBaavHmvLvm7lYkpJeitcDthwnmWCTw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.10.1.tgz", + "integrity": "sha512-9KqOpKNfAyqGZykRb9LhIT/vyRF6sm/ykhjj/39JvaJahDS+jZJE0Z1Wfz9q3DUNDTMNN0Q7u/kk4rKKU+IJuA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.1.tgz", + "integrity": "sha512-8o0P1KtmgdYQHH+oInitPpRWI0Of5XednAX4+DMhQNSmGSRNrsEEHg1ebv35m9AgRClfAytCJ5jA9KvcASTyuA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.1.tgz", + "integrity": "sha512-pu3xIUo5o/zCMLfUY9BO5KOwSH0zIsAGyFRPvXHayFSA5XIhCU/SFuB0g0ZNjFn9niZLCaNvoeAuOGFJZq0fdw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@types/gtag.js": "^0.0.20", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.1.tgz", + "integrity": "sha512-f6fyGHiCm7kJHBtAisGQS5oNBnpnMTYQZxDXeVrnw/3zWU+LMA22pr6UHGYkBKDbN+qPC5QHG3NuOfzQLq3+Lw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.1.tgz", + "integrity": "sha512-C26MbmmqgdjkDq1htaZ3aD7LzEDKFWXfpyQpt0EOUThuq5nV77zDaedV20yHcVo9p+3ey9aZ4pbHA0D3QcZTzg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.1.tgz", + "integrity": "sha512-6SFxsmjWFkVLDmBUvFK6i72QjUwqyQFe4Ovz+SUJophJjOyVG3ZZG5IQpBC/kX/Gfv1yWeU9nWauH6F6Q7QX/Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.10.1.tgz", + "integrity": "sha512-YO/FL8v1zmbxoTso6mjMz/RDjhaTJxb1UpFFTDdY5847LLDCeyYiYlrhyTbgN1RIN3xnkLKZ9Lj1x8hUzI4JOg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/plugin-content-blog": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/plugin-content-pages": "3.10.1", + "@docusaurus/plugin-css-cascade-layers": "3.10.1", + "@docusaurus/plugin-debug": "3.10.1", + "@docusaurus/plugin-google-analytics": "3.10.1", + "@docusaurus/plugin-google-gtag": "3.10.1", + "@docusaurus/plugin-google-tag-manager": "3.10.1", + "@docusaurus/plugin-sitemap": "3.10.1", + "@docusaurus/plugin-svgr": "3.10.1", + "@docusaurus/theme-classic": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-search-algolia": "3.10.1", + "@docusaurus/types": "3.10.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.10.1.tgz", + "integrity": "sha512-VU1RK0qb2pab0si4r7HFK37cYco8VzqLj3u1PspVipSr/z/GPVKHO4/HXbnePqHoWDk8urjyGSeatH0NIMBM1A==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/plugin-content-blog": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/plugin-content-pages": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-translations": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.10.1.tgz", + "integrity": "sha512-0YtmIeoNo1fIw65LO8+/1dPgmDV86UmhMkow37gzjytuiCSQm9xob6PJy0L4kuQEMTLfUOGvkXvZr7GPrHquMA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@docusaurus/mdx-loader": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-mermaid": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-mermaid/-/theme-mermaid-3.10.1.tgz", + "integrity": "sha512-2gxpmln8Pc4EN1oWzshQEx2HTs67jk14v7MmgqGs8ZU7Nm8oihg+fTouof2u4vN8DtB3Fln4cDJu4UprSX1S3Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.10.1", + "@docusaurus/module-type-aliases": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "mermaid": ">=11.6.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "@mermaid-js/layout-elk": "^0.1.9", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@mermaid-js/layout-elk": { + "optional": true + } + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.1.tgz", + "integrity": "sha512-OTaARARVZj2GvkJQjB+1jOIxntRaXea+G+fMsNqrZBAU1O1vJKDW22R7kECOHW27oJCLFN9HKaZeRrfAUyviug==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "^1.19.2", + "@docsearch/react": "^3.9.0 || ^4.3.2", + "@docusaurus/core": "3.10.1", + "@docusaurus/logger": "3.10.1", + "@docusaurus/plugin-content-docs": "3.10.1", + "@docusaurus/theme-common": "3.10.1", + "@docusaurus/theme-translations": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-validation": "3.10.1", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.10.1.tgz", + "integrity": "sha512-cLMyaKivjBVWKMJuWqyFVVgtqe8DPJNPkog0bn8W1MDVAKcPdxRFycBfC1We1RaNp7Rdk513bmtW78RR6OBxBw==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.10.1.tgz", + "integrity": "sha512-XYMK8k1szDCFMw2V+Xyen0g7Kee1sP3dtFnl7vkGkZOkeAJ/oPDQPL8iz4HBKOo/cwU8QeV6onVjMqtP+tFzsw==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.10.1.tgz", + "integrity": "sha512-3ojeJry9xBYdJO6qoyyzqeJFSJBVx2mXhyDzSdjwL2+URFQMf+h25gG38iswGImicK0ELjTd1EL2xzk8hf3QPw==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/types": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "escape-string-regexp": "^4.0.0", + "execa": "^5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.10.1.tgz", + "integrity": "sha512-5mFSgEADtnFxFH7RLw02QA5MpU5JVUCj0MPeIvi/aF4Fi45tQRIuTwXoXDqJ+1VfQJuYJGz3SI63wmGz4HvXzA==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.10.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.10.1.tgz", + "integrity": "sha512-cRv1X69jwaWv47waglllgZVWzeBFLhl53XT/XED/83BerVBTC5FTP8WTcVl8Z6sZOegDSwitu/wpCSPCDOT6lg==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.10.1", + "@docusaurus/utils": "3.10.1", + "@docusaurus/utils-common": "3.10.1", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@easyops-cn/autocomplete.js": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz", + "integrity": "sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "immediate": "^3.2.3" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local": { + "version": "0.55.2", + "resolved": "https://registry.npmjs.org/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.55.2.tgz", + "integrity": "sha512-dI/riu+MbDxkAjAHAdc0uahjXRaWKvbIPe9IAmA6AGcUfnVb9xd8s2I/6wEPTOXsAd6eFqn4Yis3WBWh3KUd3g==", + "license": "MIT", + "dependencies": { + "@docusaurus/plugin-content-docs": "^2 || ^3", + "@docusaurus/theme-translations": "^2 || ^3", + "@docusaurus/utils": "^2 || ^3", + "@docusaurus/utils-common": "^2 || ^3", + "@docusaurus/utils-validation": "^2 || ^3", + "@easyops-cn/autocomplete.js": "^0.38.1", + "@node-rs/jieba": "^1.6.0", + "cheerio": "^1.0.0", + "clsx": "^2.1.1", + "comlink": "^4.4.2", + "debug": "^4.2.0", + "fs-extra": "^10.0.0", + "klaw-sync": "^6.0.0", + "lunr": "^2.3.9", + "lunr-languages": "^1.4.0", + "mark.js": "^8.11.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@docusaurus/theme-common": "^2 || ^3", + "open-ask-ai": "^0.7.3", + "react": "^16.14.0 || ^17 || ^18 || ^19", + "react-dom": "^16.14.0 || 17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "open-ask-ai": { + "optional": true + } + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@easyops-cn/docusaurus-search-local/node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/@emnapi/core": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.0.tgz", + "integrity": "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.0.tgz", + "integrity": "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.3.tgz", + "integrity": "sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.6.tgz", + "integrity": "sha512-uI++Wx6VkBJqVmkb4ZeExwAVpZiA2Do5NrEtXoDk0Pdvce3ytFXJoviT1sLOj16+qDIMnD5nWPfOhVpnDmRJKg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.6.tgz", + "integrity": "sha512-pKkw/yC5CzSZKhIIUIsH1przOa+K5jGmZIg1sWaSF24JojyrUFbjcQv7QrcGAudriei6HQ6R0BFj+V8NbQinJw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.6.tgz", + "integrity": "sha512-Kbn1jdkvDN4F2+BhoB6mMu7NCbhP0bgA5NcI1aJj/Q5UcU+I1JLLW+dEQean33iV4tXv35AzBVKPICnDltBpxw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "@jsonjoy.com/fs-print": "4.57.6", + "@jsonjoy.com/fs-snapshot": "4.57.6", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.6.tgz", + "integrity": "sha512-V4DgEFT3Cg5S9fCMOZSCVdTxdJWWLBO0WnAazV7hnCM96u5zXHyW/ubDAfcSVwqjkMJ50W1Y44IXtxRoIwaCVg==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.6.tgz", + "integrity": "sha512-+JptNw3iifihxH2rEXrninDzX4FFVW8JD/wPR8GbJPAeL9CQUSblrlumOPB5gZuS7tYRX+PJPLtT7XzKoRhv/Q==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.6.tgz", + "integrity": "sha512-foyUrfS7WmYEUzqYXSNxmJBcSj04TABrkpFabwO9SCDCpVCfJ+qG+2sk5FjfiflG2n0SDFZDCJ6vYlJAEpxJFg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-builtins": "4.57.6" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.6.tgz", + "integrity": "sha512-96eAn4Dudtt67LTeuU47yUD+pg9/G/oKpI10zei9ljk3X3WK4lYKc+n3cpaPCAbKPzoyfxl0mXm8f8Y7BOSFXw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-node-utils": "4.57.6", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.6.tgz", + "integrity": "sha512-V57CMzbOgTzUWGOWQ8GzHQdpJP6JnrYVNCtTBNxVYEnlVRvo4uEJqHhtAT8vhDFrIuJOXLrTL1Fki4h5oI7xxg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/util": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@mermaid-js/layout-elk": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@mermaid-js/layout-elk/-/layout-elk-0.1.9.tgz", + "integrity": "sha512-HuvaqFZBr6yT9PpWYockvKAZPJVd89yn/UjOYPxhzbZxlybL2v+2BjVCg7MVH6vRs1irUohb/s42HEdec1CCZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "d3": "^7.9.0", + "elkjs": "^0.9.3" + }, + "peerDependencies": { + "mermaid": "^11.0.2" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.1.1.tgz", + "integrity": "sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==", + "license": "MIT", + "dependencies": { + "@chevrotain/types": "~11.1.1" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@node-rs/jieba": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba/-/jieba-1.10.4.tgz", + "integrity": "sha512-GvDgi8MnBiyWd6tksojej8anIx18244NmIOc1ovEw8WKNUejcccLfyu8vj66LWSuoZuKILVtNsOy4jvg3aoxIw==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/jieba-android-arm-eabi": "1.10.4", + "@node-rs/jieba-android-arm64": "1.10.4", + "@node-rs/jieba-darwin-arm64": "1.10.4", + "@node-rs/jieba-darwin-x64": "1.10.4", + "@node-rs/jieba-freebsd-x64": "1.10.4", + "@node-rs/jieba-linux-arm-gnueabihf": "1.10.4", + "@node-rs/jieba-linux-arm64-gnu": "1.10.4", + "@node-rs/jieba-linux-arm64-musl": "1.10.4", + "@node-rs/jieba-linux-x64-gnu": "1.10.4", + "@node-rs/jieba-linux-x64-musl": "1.10.4", + "@node-rs/jieba-wasm32-wasi": "1.10.4", + "@node-rs/jieba-win32-arm64-msvc": "1.10.4", + "@node-rs/jieba-win32-ia32-msvc": "1.10.4", + "@node-rs/jieba-win32-x64-msvc": "1.10.4" + } + }, + "node_modules/@node-rs/jieba-android-arm-eabi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm-eabi/-/jieba-android-arm-eabi-1.10.4.tgz", + "integrity": "sha512-MhyvW5N3Fwcp385d0rxbCWH42kqDBatQTyP8XbnYbju2+0BO/eTeCCLYj7Agws4pwxn2LtdldXRSKavT7WdzNA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-android-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-android-arm64/-/jieba-android-arm64-1.10.4.tgz", + "integrity": "sha512-XyDwq5+rQ+Tk55A+FGi6PtJbzf974oqnpyCcCPzwU3QVXJCa2Rr4Lci+fx8oOpU4plT3GuD+chXMYLsXipMgJA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-arm64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-arm64/-/jieba-darwin-arm64-1.10.4.tgz", + "integrity": "sha512-G++RYEJ2jo0rxF9626KUy90wp06TRUjAsvY/BrIzEOX/ingQYV/HjwQzNPRR1P1o32a6/U8RGo7zEBhfdybL6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-darwin-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-darwin-x64/-/jieba-darwin-x64-1.10.4.tgz", + "integrity": "sha512-MmDNeOb2TXIZCPyWCi2upQnZpPjAxw5ZGEj6R8kNsPXVFALHIKMa6ZZ15LCOkSTsKXVC17j2t4h+hSuyYb6qfQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-freebsd-x64": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-freebsd-x64/-/jieba-freebsd-x64-1.10.4.tgz", + "integrity": "sha512-/x7aVQ8nqUWhpXU92RZqd333cq639i/olNpd9Z5hdlyyV5/B65LLy+Je2B2bfs62PVVm5QXRpeBcZqaHelp/bg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm-gnueabihf": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm-gnueabihf/-/jieba-linux-arm-gnueabihf-1.10.4.tgz", + "integrity": "sha512-crd2M35oJBRLkoESs0O6QO3BBbhpv+tqXuKsqhIG94B1d02RVxtRIvSDwO33QurxqSdvN9IeSnVpHbDGkuXm3g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-gnu": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-gnu/-/jieba-linux-arm64-gnu-1.10.4.tgz", + "integrity": "sha512-omIzNX1psUzPcsdnUhGU6oHeOaTCuCjUgOA/v/DGkvWC1jLcnfXe4vdYbtXMh4XOCuIgS1UCcvZEc8vQLXFbXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-arm64-musl": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-arm64-musl/-/jieba-linux-arm64-musl-1.10.4.tgz", + "integrity": "sha512-Y/tiJ1+HeS5nnmLbZOE+66LbsPOHZ/PUckAYVeLlQfpygLEpLYdlh0aPpS5uiaWMjAXYZYdFkpZHhxDmSLpwpw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-gnu": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-gnu/-/jieba-linux-x64-gnu-1.10.4.tgz", + "integrity": "sha512-WZO8ykRJpWGE9MHuZpy1lu3nJluPoeB+fIJJn5CWZ9YTVhNDWoCF4i/7nxz1ntulINYGQ8VVuCU9LD86Mek97g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-linux-x64-musl": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-linux-x64-musl/-/jieba-linux-x64-musl-1.10.4.tgz", + "integrity": "sha512-uBBD4S1rGKcgCyAk6VCKatEVQb6EDD5I40v/DxODi5CuZVCANi9m5oee/MQbAoaX7RydA2f0OSCE9/tcwXEwUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-wasm32-wasi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-wasm32-wasi/-/jieba-wasm32-wasi-1.10.4.tgz", + "integrity": "sha512-Y2umiKHjuIJy0uulNDz9SDYHdfq5Hmy7jY5nORO99B4pySKkcrMjpeVrmWXJLIsEKLJwcCXHxz8tjwU5/uhz0A==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@node-rs/jieba-win32-arm64-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-arm64-msvc/-/jieba-win32-arm64-msvc-1.10.4.tgz", + "integrity": "sha512-nwMtViFm4hjqhz1it/juQnxpXgqlGltCuWJ02bw70YUDMDlbyTy3grCJPpQQpueeETcALUnTxda8pZuVrLRcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-ia32-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-ia32-msvc/-/jieba-win32-ia32-msvc-1.10.4.tgz", + "integrity": "sha512-DCAvLx7Z+W4z5oKS+7vUowAJr0uw9JBw8x1Y23Xs/xMA4Em+OOSiaF5/tCJqZUCJ8uC4QeImmgDFiBqGNwxlyA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/jieba-win32-x64-msvc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@node-rs/jieba-win32-x64-msvc/-/jieba-win32-x64-msvc-1.10.4.tgz", + "integrity": "sha512-+sqemSfS1jjb+Tt7InNbNzrRh1Ua3vProVvC4BZRPg010/leCbGFFiQHpzcPRfpxAXZrzG5Y0YBTsPzN/I4yHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.7.0.tgz", + "integrity": "sha512-hew63shtzzvBcSHbhm+cyAmKe6AIfinT9hzEqSPjDC6opTTMKmTkQ0gHuN2KsWlvqiKw1S/fS94fhag/FJkioQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.7.0.tgz", + "integrity": "sha512-VVsAyGqErT9D1SY4aEqozThXMVI+ssVRiv2DDeYuvpBKLIgZ3hYs3Ay3u/VSoKq6ESFi9cf6rf3IOOzfwh7oMA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.7.0.tgz", + "integrity": "sha512-n7KEs/Q/wrB415cxy4fHOBhegp4NdJ15fkJPwcB/3/8iNBQC2L/N7SChJPKDJPZGYH0jD4Tg4/0vnHmwghnbKw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.7.0.tgz", + "integrity": "sha512-V/nrlQVmhg7lYAsM7E13UDL5erAwFv6kCIVFqNaMIHSVi7dngcT839JkRTkQBqznMG98l2XjxYk74ZztAohZzA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-rsa": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.7.0.tgz", + "integrity": "sha512-9GTl1nE8Mx1kTZ+7QyYatDyKsm34QcWRBFkY1iPvWC3X4Dona5s/tlLiQsx5WzVdZqiMBZNYT0buyw4/vbhnjw==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.7.0.tgz", + "integrity": "sha512-Bh7m+OuIaSEllPQcSd9OSp93F4ROWH7sbITWV8MI+8dwsjE5111/87VxiWVvYFKyww3vp39geLv9ENqhwWHcew==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pfx": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.7.0.tgz", + "integrity": "sha512-/qvENQrXyTZURjMqSeofHul0JJt2sNSzSwk36pl2olkHbaioMQgrASDZAlHXl0xUlnVbHj0uGgOrBMTb5x2aJQ==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz", + "integrity": "sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==", + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.7.0.tgz", + "integrity": "sha512-mUn9RRrkGDnG4ALfunDmzyRW5dg+sWCj/pfnCCqEHYbkGxEpvUt6iVJv8Yw1cyp6SWZ26ZE5oSmI5SqEaen15g==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.7.0.tgz", + "integrity": "sha512-NS8e7SOgXipkzUPLF/sce7ukpMpWjhxYsH0n6Y+bHYo4TTxOb95Zv7hqwSuL212mj5YxovjdOKQOgH1As3E94w==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "asn1js": "^3.0.6", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", + "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "license": "MIT", + "dependencies": { + "@peculiar/asn1-cms": "^2.6.0", + "@peculiar/asn1-csr": "^2.6.0", + "@peculiar/asn1-ecc": "^2.6.0", + "@peculiar/asn1-pkcs9": "^2.6.0", + "@peculiar/asn1-rsa": "^2.6.0", + "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-x509": "^2.6.0", + "pvtsutils": "^1.3.6", + "reflect-metadata": "^0.2.2", + "tslib": "^2.8.1", + "tsyringe": "^4.10.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", + "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/gtag.js": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.20.tgz", + "integrity": "sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.16", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.16.tgz", + "integrity": "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==", + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "license": "ISC" + }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", + "license": "MIT", + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.53.0.tgz", + "integrity": "sha512-OGW1q6b91CRSSeiOnM8LxuR5NYJ2esvw66jUZ4IIvdv+ItNkx3pwLuyR+jaCdbGee4ov5WgUnyPryyh11xvByQ==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.19.0", + "@algolia/client-abtesting": "5.53.0", + "@algolia/client-analytics": "5.53.0", + "@algolia/client-common": "5.53.0", + "@algolia/client-insights": "5.53.0", + "@algolia/client-personalization": "5.53.0", + "@algolia/client-query-suggestions": "5.53.0", + "@algolia/client-search": "5.53.0", + "@algolia/ingestion": "1.53.0", + "@algolia/monitoring": "1.53.0", + "@algolia/recommend": "5.53.0", + "@algolia/requester-browser-xhr": "5.53.0", + "@algolia/requester-fetch": "5.53.0", + "@algolia/requester-node-http": "5.53.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.29.1.tgz", + "integrity": "sha512-6ck2YFudF2Pje7szQoPBiRFTGfd+1I+0I/WfLPGn0bj1kvrFoOQmNyedNiDxTk3/r4IfSLDYk+RA4G7u8H6+yA==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/autoprefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.33", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", + "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.0.tgz", + "integrity": "sha512-fGQtj1qdR9vIKjFiWPQd52qIqwjaYqhcI40JEiDuvlZ86E7ZBPBwY9fPgHy9r2rYGIjiRfctNPYz6OQU73ww2w==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "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/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz", + "integrity": "sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", + "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssdb": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.9.0.tgz", + "integrity": "sha512-J8jOU/hLjaXcO1LldOLraJSQpfLXRKof0I7mtbRyOy2AAXgqst0x9rlgi2qXeD6d0ou3ZLqcPAMqYVbpCbrxEw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.0.tgz", + "integrity": "sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", + "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.4.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.8.tgz", + "integrity": "sha512-yb1cEmaOum7wFvOCSQxyfgVlv5D47Rc30iZWoMpbDIWTnJ6grDDQyu2KFJzB2k7u0pMuJcQ1zphH//fFnw2tjQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.367", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.367.tgz", + "integrity": "sha512-4Mk/mrynCNQ+atY40D3UpmhLWB6AHMbYMlIrPhHcMF6x0L7O0b052FCAsxw1LlaR++UFuNg3D/A6XCuGDa0guQ==", + "license": "ISC" + }, + "node_modules/elkjs": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz", + "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==", + "license": "EPL-2.0" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.22.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.22.2.tgz", + "integrity": "sha512-0rxICaFZ7NQho/sHely2bvOPRP0Eu2B0NZ9zM54YvRvWMn7jfz3DmnOZDR9LlXDdDcqntAVc6Hfy4gr/tdH/Ag==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-toolkit": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.47.0.tgz", + "integrity": "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz", + "integrity": "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.5", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.15.1", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "license": "MIT", + "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, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.7", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", + "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", + "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/katex": { + "version": "0.16.47", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", + "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", + "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.4" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "license": "MIT" + }, + "node_modules/lunr-languages": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.20.0.tgz", + "integrity": "sha512-3LVgE7ekWXt04NBci/hjm+NXJxXZeRXuyClL0kA0HONyBOjxhP3ZQkuWIM4Ok3pbeptUW/rj3XcJcJuJVPwPYA==", + "license": "MPL-1.1" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "license": "MIT" + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.6.tgz", + "integrity": "sha512-WQK+DGjKCnPdpSyJUXphz+COF2uEhhsxQ3VIWBSbzpbbXuch3h4FePMqXrXGdLjsTgo4JFzBFsP6AWd9pVazGw==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/fs-core": "4.57.6", + "@jsonjoy.com/fs-fsa": "4.57.6", + "@jsonjoy.com/fs-node": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-to-fsa": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "@jsonjoy.com/fs-print": "4.57.6", + "@jsonjoy.com/fs-snapshot": "4.57.6", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.15.0.tgz", + "integrity": "sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.2", + "@mermaid-js/parser": "^1.1.1", + "@types/d3": "^7.4.3", + "@upsetjs/venn.js": "^2.0.0", + "cytoscape": "^3.33.1", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.14", + "dayjs": "^1.11.19", + "dompurify": "^3.3.1", + "es-toolkit": "^1.45.1", + "katex": "^0.16.25", + "khroma": "^2.1.0", + "marked": "^16.3.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" + } + }, + "node_modules/mermaid/node_modules/uuid": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", + "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", + "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.6.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz", + "integrity": "sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.1", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-position-area-property": "^1.0.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-property-rule-prelude-list": "^1.0.0", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-syntax-descriptor-syntax-production": "^1.0.1", + "@csstools/postcss-system-ui-font-family": "^1.0.0", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.23", + "browserslist": "^4.28.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.6.0", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", + "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz", + "integrity": "sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^3.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", + "license": "Unlicense" + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", + "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", + "license": "MIT", + "dependencies": { + "@peculiar/x509": "^1.14.2", + "pkijs": "^3.3.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.7.tgz", + "integrity": "sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.5", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.8.0", + "mime-types": "~2.1.35", + "parseurl": "~1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", + "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.3.tgz", + "integrity": "sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", + "license": "MIT", + "dependencies": { + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0", + "sax": "^1.5.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/thingies": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", + "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "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==", + "license": "0BSD" + }, + "node_modules/tsyringe": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", + "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", + "license": "MIT", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/undici": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.2.tgz", + "integrity": "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.107.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.107.2.tgz", + "integrity": "sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.22.0", + "es-module-lexer": "^2.1.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.2", + "mime-db": "^1.54.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.5.0", + "watchpack": "^2.5.1", + "webpack-sources": "^3.5.0" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.4.tgz", + "integrity": "sha512-GqDPGZN9bRqKBTkp4aWkobDDHMsrXKoGSdOH56smIri8qR0JG8gfL8/v/f/OZR3/OKXjG8uwJbFVhKm/FNU/UA==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.25", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.8.1", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.22.1", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^5.5.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", + "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpackbar": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-7.0.0.tgz", + "integrity": "sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q==", + "license": "MIT", + "dependencies": { + "ansis": "^3.2.0", + "consola": "^3.2.3", + "pretty-time": "^1.1.0", + "std-env": "^3.7.0" + }, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@rspack/core": "*", + "webpack": "3 || 4 || 5" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", + "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/website/package.json b/website/package.json new file mode 100644 index 00000000..721d345b --- /dev/null +++ b/website/package.json @@ -0,0 +1,23 @@ +{ + "name": "timemanagement-website", + "version": "0.1.0", + "private": true, + "scripts": { + "start": "docusaurus start", + "build": "docusaurus build", + "serve": "docusaurus serve", + "clear": "docusaurus clear" + }, + "dependencies": { + "@docusaurus/core": "^3.9.2", + "@docusaurus/preset-classic": "^3.9.2", + "@docusaurus/theme-mermaid": "^3.10.1", + "@easyops-cn/docusaurus-search-local": "^0.55.2", + "@mdx-js/react": "^3.1.0", + "@mermaid-js/layout-elk": "^0.1.9", + "clsx": "^2.1.1", + "prism-react-renderer": "^2.4.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" + } +} diff --git a/website/sidebars.js b/website/sidebars.js new file mode 100644 index 00000000..dc9a322e --- /dev/null +++ b/website/sidebars.js @@ -0,0 +1,74 @@ +const sidebars = { + docs: [ + { + type: "category", + label: "Functional", + items: [ + "user/overview", + "user/install-and-run", + "user/setup-and-sync", + // "user/features", + // "user/all-features", + "user/troubleshooting", + { + type: "category", + label: "User Manual", + // Uncomment the line below if 'user/user-manual' is an actual Markdown file you want to link to when clicking the category title + // link: { type: 'doc', id: 'user/user-manual' }, + items: [ + "user/user-manual/introduction", + "user/user-manual/dashboard", + "user/user-manual/kebab-menu", + "user/user-manual/about-us", + "user/user-manual/settings", + "user/user-manual/projects", + "user/user-manual/all-tasks", + "user/user-manual/my-tasks", + "user/user-manual/project-updates", + "user/user-manual/activities", + "user/user-manual/timesheets" + ], + } + ] + }, + + + { + type: "category", + label: "Technical", + items: [ + "technical/architecture", + "technical/repository-organization", + { + type: "category", + label: "Module Implementations", + items: [ + "technical/activities", + "technical/projects", + "technical/tasks", + "technical/timesheets", + "technical/dashboard", + "technical/sync-settings", + "technical/ui-ux-navigation", + "technical/notifications", + "technical/onboarding", + "technical/profiles" + ] + }, + "technical/build-and-packaging", + "technical/release-process" + ] + }, + { + type: "category", + label: "Contributor", + items: [ + "contributing/getting-started", + "contributing/pull-request-guidelines", + "contributing/documentation-governance" + ] + } + ] +}; + +module.exports = sidebars; diff --git a/website/src/css/custom.css b/website/src/css/custom.css new file mode 100644 index 00000000..dade2d57 --- /dev/null +++ b/website/src/css/custom.css @@ -0,0 +1,57 @@ +:root { + --ifm-color-primary: #b35a16; + --ifm-color-primary-dark: #a45214; + --ifm-color-primary-darker: #9b4d13; + --ifm-color-primary-darkest: #80400f; + --ifm-color-primary-light: #c7661c; + --ifm-color-primary-lighter: #d56f1f; + --ifm-color-primary-lightest: #de8742; + --ifm-background-color: #fffef9; + --ifm-navbar-background-color: rgba(255, 254, 249, 0.92); + --ifm-footer-background-color: #243125; + --ifm-code-font-size: 95%; + --ifm-heading-color: #1f2a1f; + --ifm-font-family-base: "Fira Sans", "Segoe UI", sans-serif; + --ifm-font-family-monospace: "Fira Code", "SFMono-Regular", monospace; +} + +html[data-theme="dark"] { + --ifm-background-color: #152019; + --ifm-navbar-background-color: rgba(21, 32, 25, 0.92); + --ifm-heading-color: #f6f2e8; + --ifm-color-content: #e8e1d2; + --ifm-color-primary: #de8742; +} + +.navbar { + backdrop-filter: blur(14px); +} + +.footer { + transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease; +} + +/* Light theme footer (default) */ +.footer--dark, +.footer { + --ifm-footer-background-color: #faf8f2; + --ifm-footer-color: #5a6b5a; + --ifm-footer-link-color: #1f2a1f; + --ifm-footer-link-hover-color: #b35a16; + border-top: 1px solid rgba(0, 0, 0, 0.05); +} + +/* Dark theme footer */ +html[data-theme="dark"] .footer--dark, +html[data-theme="dark"] .footer { + --ifm-footer-background-color: #111d16; + --ifm-footer-color: #9aa89c; + --ifm-footer-link-color: #c8bfa8; + --ifm-footer-link-hover-color: #de8742; + border-top: none; +} + +.footer__link-item { + transition: color 0.2s ease; +} + diff --git a/website/src/pages/index.js b/website/src/pages/index.js new file mode 100644 index 00000000..7b8d44b0 --- /dev/null +++ b/website/src/pages/index.js @@ -0,0 +1,2005 @@ +import clsx from "clsx"; +import Layout from "@theme/Layout"; +import Link from "@docusaurus/Link"; +import { useEffect, useRef, useState } from "react"; +import styles from "./index.module.css"; + +const features = [ + { + icon: "⏱", + title: "Timesheet Recording", + description: + "Log hours, track work entries, and maintain clear records across projects and activities.", + tag: "Core" + }, + { + icon: "☑", + title: "Task Management", + description: + "Organize tasks by project, track progress through stages, and manage work from a single view.", + tag: "Core" + }, + { + icon: "📊", + title: "Dashboard & Charts", + description: + "Visual summaries, project timelines, and charts that show where time is actually going.", + tag: "Analytics" + }, + { + icon: "🔄", + title: "Odoo Sync", + description: + "Background daemon syncs with Odoo instances — local data and remote systems stay aligned.", + tag: "Integration" + }, + { + icon: "📱", + title: "Ubuntu Touch & Desktop", + description: + "Convergent design for phones and desktops. One codebase, two form factors.", + tag: "Platform" + }, + { + icon: "🔔", + title: "Live Notifications", + description: + "System-level alerts for project updates, task changes, and sync events.", + tag: "UX" + } +]; + +const techStack = [ + { + layer: "Interface", + tech: "QML", + description: + "Application UI, pages, shared components, and user interaction layer.", + path: "qml/" + }, + { + layer: "Logic", + tech: "JavaScript", + description: + "Shared state, data models, and cross-feature helper modules.", + path: "models/" + }, + { + layer: "Services", + tech: "Python", + description: + "Backend bridging, daemon process, sync routines, and system integration.", + path: "src/" + } +]; + +const docPaths = [ + { + audience: "Users", + description: + "Installation, setup, sync configuration, and troubleshooting guides.", + link: "/docs/user/overview", + cta: "User Docs", + pages: ["Overview", "Install & Run", "Setup & Sync", "Features", "Troubleshooting"] + }, + { + audience: "Contributors", + description: + "PR workflow, local development setup, and documentation governance.", + link: "/docs/contributing/getting-started", + cta: "Contributing Guide", + pages: ["Getting Started", "PR Guidelines", "Doc Governance"] + }, + { + audience: "Maintainers", + description: + "Architecture decisions, repository layout, build system, and release process.", + link: "/docs/technical/architecture", + cta: "Technical Docs", + pages: ["Architecture", "Repo Organization", "Build & Packaging", "Release Process"] + } +]; + +function useScrollReveal() { + const ref = useRef(null); + + useEffect(() => { + const prefersReduced = window.matchMedia( + "(prefers-reduced-motion: reduce)" + ).matches; + if (prefersReduced) { + ref.current + ?.querySelectorAll("[data-reveal]") + .forEach((el) => el.setAttribute("data-visible", "true")); + return; + } + + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + entry.target.setAttribute("data-visible", "true"); + observer.unobserve(entry.target); + } + }); + }, + { threshold: 0.08, rootMargin: "0px 0px -40px 0px" } + ); + + ref.current + ?.querySelectorAll("[data-reveal]") + .forEach((el) => observer.observe(el)); + + return () => observer.disconnect(); + }, []); + + return ref; +} + +function TerminalPreview() { + const [copied, setCopied] = useState(false); + + const handleCopy = () => { + const textToCopy = "git clone https://github.com/CITOpenRep/timemanagement.git\ncd timemanagement\nclickable build && clickable install"; + navigator.clipboard.writeText(textToCopy).then(() => { + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }); + }; + + return ( +
+
+ +
+
+        $ 
+        git clone https://github.com/CITOpenRep/timemanagement.git
+        {"\n"}
+        $ 
+        cd timemanagement
+        {"\n"}
+        $ 
+        clickable build && clickable install
+      
+
+ ); +} + +function DeviceSimulator() { + const [orientation, setOrientation] = useState("portrait"); + const [menuOpen, setMenuOpen] = useState(false); + const [activeScreen, setActiveScreen] = useState("Dashboard"); + const [searchQuery, setSearchQuery] = useState(""); + const [filterType, setFilterType] = useState("most-time"); + const [themeMode, setThemeMode] = useState("light"); // Forced light mode by default + const [portraitWidth, setPortraitWidth] = useState(360); + const [portraitHeight, setPortraitHeight] = useState(720); + const [landscapeWidth, setLandscapeWidth] = useState(900); + const [landscapeHeight, setLandscapeHeight] = useState(520); + + const containerRef = useRef(null); + const [scale, setScale] = useState(1); + + useEffect(() => { + if (typeof window === "undefined" || !containerRef.current) return; + + const handleResize = () => { + if (!containerRef.current) return; + const containerWidth = containerRef.current.getBoundingClientRect().width; + const frameWidth = (orientation === "portrait" ? portraitWidth : landscapeWidth) + 28; + const buffer = 16; // breathing room gutter (8px on each side) + const targetWidth = frameWidth + buffer; + + if (containerWidth < targetWidth) { + setScale(containerWidth / targetWidth); + } else { + setScale(1); + } + }; + + handleResize(); + + const observer = new ResizeObserver(() => { + handleResize(); + }); + + observer.observe(containerRef.current); + + return () => { + observer.disconnect(); + }; + }, [orientation, portraitWidth, landscapeWidth, portraitHeight, landscapeHeight]); + + const menuItems = [ + { name: "Dashboard", icon: "🏠", target: "Dashboard" }, + { name: "Timesheet", icon: "⏱", target: "Timesheets" }, + { name: "Activities", icon: "📅", target: "Activities" }, + { name: "My Tasks", icon: "⭐", target: "My Tasks" }, + { name: "All Tasks", icon: "☑", target: "All Tasks" }, + { name: "Projects", icon: "📁", target: "Projects" }, + { name: "Project Updates", icon: "🕒", target: "Project Updates" }, + { name: "About Us", icon: "ℹ", target: "About Us" }, + { name: "Settings", icon: "⚙", target: "Settings" } + ]; + + const projectsData = [ + { name: "Project Alpha - Phase 1", time: "4507.0 h", percent: 92, color: "#e07a24", tasks: 6 }, + { name: "Core Productivity Suite", time: "2187.6 h", percent: 75, color: "#e53935", tasks: 124 }, + { name: "Database Migration v18", time: "1240.0 h", percent: 55, color: "#1e88e5", tasks: 28 }, + { name: "Mobile Client App", time: "680.0 h", percent: 40, color: "#43a047", tasks: 15 }, + { name: "Collaborative Editor", time: "420.0 h", percent: 28, color: "#ffb300", tasks: 10 }, + { name: "OS Platform Layer", time: "280.0 h", percent: 18, color: "#00acc1", tasks: 8 }, + { name: "Technical Support Queue", time: "230.0 h", percent: 12, color: "#8e24aa", tasks: 5 }, + { name: "API Documentation", time: "150.0 h", percent: 8, color: "#d81b60", tasks: 2 } + ]; + + const timesheetsData = [ + { + title: "test timesheet this thing this...", + project: "Project Alpha / Child A (Demo)", + task: "User manual", + author: "Alex Mercer", + hours: "5:00 H", + date: "2026-04-24", + action: "Do", + borderColor: "#e07a24" + }, + { + title: "Test", + project: "Project Alpha / Child A (Demo)", + task: "This is a Notification Test.", + author: "Sarah Connor", + hours: "4500:00 H", + date: "2026-05-05", + action: "Unknown", + borderColor: "#999999" + }, + { + title: "sub taSK 2 TIMESHEETY", + project: "Project Alpha / Child A (Demo)", + task: "HR Bundle", + author: "Sarah Connor", + hours: "2:00 H", + date: "2026-04-24", + action: "Unknown", + borderColor: "#e07a24" + }, + { + title: "test", + project: "Mobile Client App / Email module (Demo)", + task: "Coordination", + author: "Sarah Connor", + hours: "3:00 H", + date: "2026-04-24", + action: "Unknown", + borderColor: "#e07a24" + }, + { + title: "Time Off (1/1)", + project: "Internal (Demo)", + task: "Time Off", + author: "Alex Mercer", + hours: "8:00 H", + date: "2026-05-01", + action: "Unknown", + borderColor: "#999999" + }, + { + title: "Time Off (1/1)", + project: "Internal (Demo)", + task: "Time Off", + author: "David Miller", + hours: "8:00 H", + date: "2026-05-01", + action: "Unknown", + borderColor: "#999999" + } + ]; + + const tasksData = [ + { + title: "[Req] Content hub", + project: "Core Productivity Suite", + stage: "Analysis", + stars: [false, false, false], + planned: "N/A", + start: "2025-08-08", + end: "2025-08-22", + overdue: "299 days overdue" + }, + { + title: "[IMP - Weblates improvements]", + project: "Core Productivity Suite", + stage: "Analysis", + stars: [true, false, false], + planned: "N/A", + start: "2025-11-17", + end: "2026-01-16", + overdue: "152 days overdue" + }, + { + title: "Activity Retention", + project: "Core Productivity Suite", + stage: "Design", + stars: [false, false, false], + planned: "N/A", + start: "2026-01-20", + end: "Not set", + overdue: null + }, + { + title: "Parent task", + project: "Project Alpha - Phase 1", + stage: "Analysis", + stars: [false, false, false], + planned: "N/A", + start: "2026-04-24", + end: "2026-06-08", + overdue: "9 days overdue", + locked: true, + hasTasks: true, + borderColor: "#e07a24" + }, + { + title: "UI Improvements And Bug Fixes", + project: "Core Productivity Suite", + stage: "Development", + stars: [false, false, false], + planned: "N/A", + start: "2026-01-21", + end: "Not set", + overdue: null, + borderColor: "#999999" + } + ]; + + const allTasksData = [ + { + title: "Design app launch icon", + project: "Mobile App Core", + stage: "Completed", + stars: [true, true, true], + planned: "8.0 H", + start: "2026-06-01", + end: "2026-06-03", + overdue: null, + status: "complete", + borderColor: "#43a047" + }, + { + title: "Implement Docusaurus Search Option", + project: "Docs Integration", + stage: "Active", + stars: [true, true, false], + planned: "12.0 H", + start: "2026-06-10", + end: "2026-06-15", + overdue: "2 days overdue", + status: "active", + borderColor: "#1e88e5" + }, + { + title: "Refactor navigation drawer layout", + project: "QML Layout Refactoring", + stage: "Draft", + stars: [true, false, false], + planned: "4.0 H", + start: "2026-06-15", + end: "Not set", + overdue: null, + status: "draft", + borderColor: "#e07a24" + }, + { + title: "Write unit tests for Timesheet model", + project: "Mobile App Core", + stage: "Active", + stars: [true, true, true], + planned: "16.0 H", + start: "2026-06-11", + end: "2026-06-18", + overdue: null, + status: "active", + borderColor: "#43a047" + } + ]; + + const projectUpdatesData = [ + { + title: "New Project Update.", + author: "Alex Mercer", + date: "2026-06-04", + project: "25-00005 - Mobile Client App", + status: "on_track", + completion: 40 + }, + { + title: "New Update.", + author: "Alex Mercer", + date: "2026-05-14", + project: "25-00005 - Mobile Client App", + status: "at_risk", + completion: 90 + }, + { + title: "project update edit after notificat...", + author: "Alex Mercer", + date: "2026-04-28", + project: "Project Alpha - Phase 1...", + status: "at_risk", + completion: 15 + }, + { + title: "project update edit after notificat...", + author: "Alex Mercer", + date: "2026-04-27", + project: "Project Alpha - Phase 1...", + status: "on_hold", + completion: 30 + }, + { + title: "New project Update", + author: "Alex Mercer", + date: "2026-04-27", + project: "Project Alpha - Phase 1...", + status: "on_track", + completion: 10 + } + ]; + + const activitiesData = [ + { + title: "Activity test for Al...", + notes: "No Notes", + assigned: "Assigned to: Alex Mercer", + type: "To Do", + date: "08 May", + status: "overdue", + iconType: "ellipsis", + hasDraft: true + }, + { + title: "This is a Activity- ...", + notes: "Hello World.", + assigned: "Assigned to: Alex Mercer", + type: "Meeting", + date: "14 May", + status: "overdue", + iconType: "meeting", + hasDraft: false + }, + { + title: "Activity assigned to...", + notes: "No Notes", + assigned: "Assigned to: Alex Mercer", + type: "Call", + date: "17 May", + status: "overdue", + iconType: "call", + hasDraft: false + }, + { + title: "New Activity", + notes: "Hello World.", + assigned: "Assigned to: Alex Mercer", + type: "Call", + date: "18 Jun", + status: "today", + iconType: "call", + hasDraft: false + } + ]; + + const filteredProjects = projectsData.filter(p => + p.name.toLowerCase().includes(searchQuery.toLowerCase()) + ); + + // Reusable Left Menu Content + const renderMenuList = () => ( +
    + {menuItems.map((item) => ( +
  • { + setActiveScreen(item.target); + setMenuOpen(false); + }} + > + {item.icon} + {item.name} +
  • + ))} +
+ ); + + // Reusable Eisenhower Matrix Content + const renderDashboardMatrix = () => ( +
+
Time spent based on priorities
+ +
+
+
+
URGENT
+
NOT URGENT
+
+ +
+
+ IMPORTANT +
+ +
+
+
Do First
+
{themeMode === "dark" ? "100H" : "9521H"}
+
+ +
+
🕒
+
Do Next
+
0H
+
+
+ +
+
+ NOT IMPORTANT +
+ +
+
+
Do Later
+
0H
+
+ +
+
🗑
+
Don't do
+
{themeMode === "dark" ? "0H" : "13H"}
+
+
+
+
+ ); + + // Reusable Project Overview Pie & Bar Chart Content + const renderProjectOverview = () => ( + <> +
+ + + +
+ +
Most Time-Consuming Projects
+ +
+ + + + {/* Segment 1: Orange (Child Project) */} + + + {/* Segment 2: Red (UT TimeManagement) */} + + + {/* Segment 3: Blue (CURQ Migration) */} + + + {/* Segment 4: Green (UT App Dev) */} + + + {/* Segment 5: Cyan (Notes App Dev) */} + + + + +
+ +
+ +
+ + ); + + // Render Timesheets List Screen + const renderTimesheetsList = () => ( +
+
+ + + +
+ + {timesheetsData.map((t, idx) => ( +
+
+
+

{t.title}

+ {t.project} + {t.task} + {t.author} +
+
+ {t.hours} + {t.date} + {t.action} +
+
+ ))} +
+ ); + + // Render My Tasks Screen + const renderMyTasksList = () => ( +
+
+ + + + +
+ +
+ {tasksData.map((task, idx) => ( +
+ {task.borderColor && ( +
+ )} +
+

{task.title}

+ + {task.project} {task.locked && "🔒"} + +
+ {task.stars.map((filled, sIdx) => ( + + ★ + + ))} +
+ {task.hasTasks && ( + [+1] Tasks + )} + {task.stage} +
+
+ Planned (H): {task.planned} + Start Date: {task.start} + End Date: {task.end} + {task.overdue && ( + {task.overdue} + )} +
+
+ ))} +
+
+ ); + + // Render Timesheet Entry Form + const renderTimesheetEntryForm = () => ( +
+
+ Account + {themeMode === "dark" ? "demo" : "demo_db"} +
+ +
+ Project + + {themeMode === "dark" ? "Project Alpha - Phase 1..." : "Project Alpha - Phase 1"} + +
+ +
+ Subproject + Tap to select +
+ +
+ Task + {themeMode === "dark" ? "Database Migration" : "sub task1"} +
+ +
+ Subtask + Tap to select +
+ +
+ Priority + +
+ +
+
+
+
+
+ Important, Urgent (1) +
+
+
+ Important, Not Urgent (2) +
+
+
+ Urgent, Not Important (3) +
+
+
+ Not Urgent, Not Important (4) +
+
+ +
+ Time Tracking +
+ +
+
+
+
+
+ Manual +
+
+
+ Automated +
+
+ +
+ +
+ +
+ Date + {themeMode === "dark" ? ( + 10-03-2026 + ) : ( + + )} +
+ +
+ Description +
+