From 22fd71cbb1ca60ed77ea87006cab76d71970fe21 Mon Sep 17 00:00:00 2001 From: Rain Mark Date: Fri, 17 Apr 2026 16:32:08 +0800 Subject: [PATCH] add openlist/webdav backend --- .gitignore | 3 + README.md | 30 +- .../20260413_0002_file_recycle_bin.py | 34 -- .../versions/20260413_0003_auth_sessions.py | 42 -- .../20260414_0004_placement_policies.py | 43 -- ...ma.py => 20260417_0007_baseline_schema.py} | 52 +- app/adapters/storage/base.py | 18 + app/adapters/storage/local.py | 10 +- app/adapters/storage/registry.py | 18 + app/adapters/storage/s3.py | 27 +- app/adapters/storage/webdav.py | 145 ++++++ app/api/routes/backends.py | 55 +- app/api/routes/files.py | 34 +- app/api/routes/policies.py | 7 +- app/core/backend_config.py | 130 +++++ app/core/config.py | 2 + app/core/secret_codec.py | 50 ++ app/core/storage_layout.py | 42 ++ app/models/entities.py | 3 +- app/repositories/backend_repository.py | 25 +- app/repositories/blob_replica_repository.py | 17 +- app/schemas/backend.py | 12 +- app/schemas/file.py | 33 ++ app/schemas/policy.py | 1 + app/services/backend_service.py | 142 ++++- app/services/file_service.py | 14 +- app/services/local_storage_service.py | 16 +- app/services/policy_service.py | 6 +- app/services/storage_service.py | 30 +- app/web/dist/assets/app.css | 2 +- app/web/dist/assets/app.js | 30 +- deploy/iron/iron.env.example | 10 + deploy/iron/start_iron.sh | 29 ++ deploy/openlist/.env.example | 3 + deploy/openlist/docker-compose.yml | 9 + deploy/systemd/iron.service.example | 17 + docs/README.md | 1 + docs/api.md | 24 + docs/architecture.md | 42 +- docs/assets/iron-demo.gif | Bin 0 -> 955497 bytes docs/development.md | 25 +- docs/openlist-local-deployment-sop.md | 487 ++++++++++++++++++ docs/product.md | 11 +- frontend/src/app/router.tsx | 5 + frontend/src/components/layout/AppLayout.tsx | 4 + frontend/src/lib/api.ts | 129 +++++ frontend/src/lib/format.ts | 13 + frontend/src/routes/FilesPage.tsx | 126 ++++- frontend/src/routes/PoliciesPage.tsx | 290 +++++++++++ frontend/src/routes/StoragePage.tsx | 441 +++++++++++++++- frontend/src/styles/app.css | 186 ++++++- pyproject.toml | 2 + scripts/generate_readme_demo.py | 155 ++++++ scripts/real_openlist_acceptance.py | 320 ++++++++++++ scripts/real_openlist_chaos_acceptance.py | 173 +++++++ .../real_openlist_multi_backend_acceptance.py | 208 ++++++++ scripts/real_openlist_multi_backend_chaos.py | 154 ++++++ scripts/real_openlist_suite.py | 40 ++ scripts/ui_playwright_smoke.py | 15 + tests/conftest.py | 99 +++- tests/test_backend_routes.py | 203 +++++++- tests/test_config.py | 2 +- tests/test_file_routes.py | 13 + tests/test_job_routes.py | 55 ++ tests/test_migrations.py | 2 + tests/test_policy_routes.py | 7 +- tests/test_storage_layout.py | 56 ++ tests/test_upload_routes.py | 2 + tests/test_webdav_adapter.py | 63 +++ 69 files changed, 4254 insertions(+), 240 deletions(-) delete mode 100644 alembic/versions/20260413_0002_file_recycle_bin.py delete mode 100644 alembic/versions/20260413_0003_auth_sessions.py delete mode 100644 alembic/versions/20260414_0004_placement_policies.py rename alembic/versions/{20260413_0001_initial_schema.py => 20260417_0007_baseline_schema.py} (83%) create mode 100644 app/adapters/storage/base.py create mode 100644 app/adapters/storage/registry.py create mode 100644 app/adapters/storage/webdav.py create mode 100644 app/core/backend_config.py create mode 100644 app/core/secret_codec.py create mode 100644 app/core/storage_layout.py create mode 100644 deploy/iron/iron.env.example create mode 100755 deploy/iron/start_iron.sh create mode 100644 deploy/openlist/.env.example create mode 100644 deploy/openlist/docker-compose.yml create mode 100644 deploy/systemd/iron.service.example create mode 100644 docs/assets/iron-demo.gif create mode 100644 docs/openlist-local-deployment-sop.md create mode 100644 frontend/src/routes/PoliciesPage.tsx create mode 100644 scripts/generate_readme_demo.py create mode 100644 scripts/real_openlist_acceptance.py create mode 100644 scripts/real_openlist_chaos_acceptance.py create mode 100644 scripts/real_openlist_multi_backend_acceptance.py create mode 100644 scripts/real_openlist_multi_backend_chaos.py create mode 100644 scripts/real_openlist_suite.py create mode 100644 tests/test_storage_layout.py create mode 100644 tests/test_webdav_adapter.py diff --git a/.gitignore b/.gitignore index 28a0ad2..45ac47d 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ node_modules/ output/ .iron-storage/ .iron-temp/ +.iron-cache/ +deploy/openlist/.env +deploy/iron/iron.env diff --git a/README.md b/README.md index e5f384e..c5a3484 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ The project is currently a **Product MVP Candidate**: the core backend and Web app exist, but the release still needs hardening, broader browser regression coverage, and more real-world usage. +![Iron demo](docs/assets/iron-demo.gif) + ## Features - FastAPI backend with SQLite, SQLAlchemy, and Alembic migrations @@ -16,10 +18,12 @@ coverage, and more real-world usage. restore, download, and preview - `tus` upload flow with local object persistence - Desktop-first React Web app at `/app` -- Storage backend management for local storage and S3 runtime paths +- Storage backend management for local directories, S3 storage, and + OpenList/WebDAV runtime paths - Placement policies, reconcile jobs, health checks, and retryable background jobs - Metadata export, validation, integrity checks, restore plans, and guarded import - Python Playwright end-to-end coverage for core browser flows +- Real-environment OpenList acceptance scripts for deployment validation ## Quick Start @@ -46,6 +50,9 @@ username: admin password: changeme-iron ``` +For a practical local deployment with OpenList and Aliyun Drive, start with +[docs/openlist-local-deployment-sop.md](docs/openlist-local-deployment-sop.md). + ## Configuration Common environment variables: @@ -53,6 +60,7 @@ Common environment variables: - `IRON_DATABASE_URL` - `IRON_BOOTSTRAP_USERNAME` - `IRON_BOOTSTRAP_PASSWORD` +- `IRON_SECRET_KEY` - `IRON_AUTH_SESSION_TTL_HOURS` - `IRON_UPLOAD_TEMP_DIR` - `IRON_LOCAL_STORAGE_DIR` @@ -63,6 +71,10 @@ Common environment variables: Runtime data is intentionally ignored by Git. By default, local development may create `.iron-storage/`, `.iron-temp/`, `iron.db`, and `output/`. +`IRON_SECRET_KEY` encrypts stored backend credentials such as S3 keys and +WebDAV passwords. Override the development default before using real storage +credentials. + ## Development Build the frontend: @@ -80,7 +92,13 @@ Run the full test suite: Current expected result: ```text -66 passed +78 passed +``` + +Run the real OpenList acceptance suite against a live local deployment: + +```bash +.venv/bin/python scripts/real_openlist_suite.py ``` Run the browser E2E flow directly: @@ -89,6 +107,12 @@ Run the browser E2E flow directly: .venv/bin/python scripts/ui_playwright_smoke.py ``` +Regenerate the README demo GIF: + +```bash +.venv/bin/python scripts/generate_readme_demo.py +``` + Or through pytest: ```bash @@ -105,6 +129,7 @@ alembic/ Database migrations frontend/ Vite + React + TypeScript source app/web/dist/ Built frontend assets served by FastAPI scripts/ Local automation and E2E scripts +deploy/ OpenList compose, Iron env templates, and systemd examples tests/ Backend, API, and browser E2E tests docs/ Product, architecture, API, and maintenance docs ``` @@ -118,6 +143,7 @@ Start with: - [Architecture](docs/architecture.md) - [API](docs/api.md) - [Development](docs/development.md) +- [OpenList + Iron Local Deployment SOP](docs/openlist-local-deployment-sop.md) For contribution workflow, see [CONTRIBUTING.md](CONTRIBUTING.md). For AI/coding-agent guidance, see [AGENTS.md](AGENTS.md). diff --git a/alembic/versions/20260413_0002_file_recycle_bin.py b/alembic/versions/20260413_0002_file_recycle_bin.py deleted file mode 100644 index a94ebef..0000000 --- a/alembic/versions/20260413_0002_file_recycle_bin.py +++ /dev/null @@ -1,34 +0,0 @@ -"""add file recycle bin fields - -Revision ID: 20260413_0002 -Revises: 20260413_0001 -Create Date: 2026-04-13 00:20:00.000000 -""" - -from alembic import op -import sqlalchemy as sa - - -revision = "20260413_0002" -down_revision = "20260413_0001" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.drop_index("idx_file_entries_directory_name", table_name="file_entries") - op.create_index( - "idx_file_entries_directory_name", - "file_entries", - ["directory_id", "name", "is_deleted"], - unique=True, - ) - op.add_column("file_entries", sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True)) - op.create_index("idx_file_entries_deleted_at", "file_entries", ["deleted_at"]) - - -def downgrade() -> None: - op.drop_index("idx_file_entries_deleted_at", table_name="file_entries") - op.drop_column("file_entries", "deleted_at") - op.drop_index("idx_file_entries_directory_name", table_name="file_entries") - op.create_index("idx_file_entries_directory_name", "file_entries", ["directory_id", "name"], unique=True) diff --git a/alembic/versions/20260413_0003_auth_sessions.py b/alembic/versions/20260413_0003_auth_sessions.py deleted file mode 100644 index 2d57c84..0000000 --- a/alembic/versions/20260413_0003_auth_sessions.py +++ /dev/null @@ -1,42 +0,0 @@ -"""add auth sessions - -Revision ID: 20260413_0003 -Revises: 20260413_0002 -Create Date: 2026-04-13 20:10:00.000000 -""" - -from alembic import op -import sqlalchemy as sa - - -revision = "20260413_0003" -down_revision = "20260413_0002" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.create_table( - "auth_sessions", - sa.Column("id", sa.String(), nullable=False), - sa.Column("user_id", sa.String(), nullable=False), - sa.Column("token_hash", sa.String(), nullable=False), - sa.Column("expires_at", sa.DateTime(timezone=True), nullable=False), - sa.Column("revoked_at", sa.DateTime(timezone=True), nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), - sa.ForeignKeyConstraint(["user_id"], ["users.id"]), - sa.PrimaryKeyConstraint("id"), - ) - op.create_index( - "idx_auth_sessions_user_status", - "auth_sessions", - ["user_id", "revoked_at", "expires_at"], - ) - op.create_index("idx_auth_sessions_token_hash", "auth_sessions", ["token_hash"], unique=True) - - -def downgrade() -> None: - op.drop_index("idx_auth_sessions_token_hash", table_name="auth_sessions") - op.drop_index("idx_auth_sessions_user_status", table_name="auth_sessions") - op.drop_table("auth_sessions") diff --git a/alembic/versions/20260414_0004_placement_policies.py b/alembic/versions/20260414_0004_placement_policies.py deleted file mode 100644 index c618e3f..0000000 --- a/alembic/versions/20260414_0004_placement_policies.py +++ /dev/null @@ -1,43 +0,0 @@ -"""add placement policies - -Revision ID: 20260414_0004 -Revises: 20260413_0003 -Create Date: 2026-04-14 10:00:00.000000 -""" - -from alembic import op -import sqlalchemy as sa - - -revision = "20260414_0004" -down_revision = "20260413_0003" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.create_table( - "placement_policies", - sa.Column("id", sa.String(), nullable=False), - sa.Column("file_class", sa.String(), nullable=False), - sa.Column("require_local", sa.Boolean(), server_default="1", nullable=False), - sa.Column("stable_replica_count", sa.Integer(), server_default="1", nullable=False), - sa.Column("opportunistic_replica_count", sa.Integer(), server_default="0", nullable=False), - sa.Column("preferred_backend_ids_json", sa.Text(), server_default="[]", nullable=False), - sa.Column("excluded_backend_ids_json", sa.Text(), server_default="[]", nullable=False), - sa.Column("max_non_local_size_bytes", sa.Integer(), nullable=True), - sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), - sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), - sa.PrimaryKeyConstraint("id"), - ) - op.create_index( - "idx_placement_policies_file_class", - "placement_policies", - ["file_class"], - unique=True, - ) - - -def downgrade() -> None: - op.drop_index("idx_placement_policies_file_class", table_name="placement_policies") - op.drop_table("placement_policies") diff --git a/alembic/versions/20260413_0001_initial_schema.py b/alembic/versions/20260417_0007_baseline_schema.py similarity index 83% rename from alembic/versions/20260413_0001_initial_schema.py rename to alembic/versions/20260417_0007_baseline_schema.py index 8dc229c..a0fb663 100644 --- a/alembic/versions/20260413_0001_initial_schema.py +++ b/alembic/versions/20260417_0007_baseline_schema.py @@ -1,8 +1,8 @@ -"""initial schema +"""baseline schema -Revision ID: 20260413_0001 +Revision ID: 20260417_0007 Revises: -Create Date: 2026-04-13 00:00:00.000000 +Create Date: 2026-04-17 10:30:00.000000 """ from alembic import op @@ -10,7 +10,7 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = "20260413_0001" +revision = "20260417_0007" down_revision = None branch_labels = None depends_on = None @@ -28,6 +28,21 @@ def upgrade() -> None: sa.UniqueConstraint("username"), ) + op.create_table( + "auth_sessions", + sa.Column("id", sa.String(), nullable=False), + sa.Column("user_id", sa.String(), nullable=False), + sa.Column("token_hash", sa.String(), nullable=False), + sa.Column("expires_at", sa.DateTime(timezone=True), nullable=False), + sa.Column("revoked_at", sa.DateTime(timezone=True), nullable=True), + sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), + sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), + sa.ForeignKeyConstraint(["user_id"], ["users.id"]), + sa.PrimaryKeyConstraint("id"), + ) + op.create_index("idx_auth_sessions_user_status", "auth_sessions", ["user_id", "revoked_at", "expires_at"]) + op.create_index("idx_auth_sessions_token_hash", "auth_sessions", ["token_hash"], unique=True) + op.create_table( "directories", sa.Column("id", sa.String(), nullable=False), @@ -53,7 +68,8 @@ def upgrade() -> None: sa.Column("read_priority", sa.Integer(), nullable=False), sa.Column("write_priority", sa.Integer(), nullable=False), sa.Column("is_enabled", sa.Boolean(), server_default="1", nullable=False), - sa.Column("config_json", sa.Text(), nullable=False), + sa.Column("public_config_json", sa.Text(), nullable=False), + sa.Column("secret_config_json", sa.Text(), nullable=False), sa.Column("capacity_hint_bytes", sa.Integer(), nullable=True), sa.Column("last_health_status", sa.String(), nullable=True), sa.Column("last_health_checked_at", sa.DateTime(timezone=True), nullable=True), @@ -65,6 +81,22 @@ def upgrade() -> None: op.create_index("idx_backends_enabled", "backends", ["is_enabled"]) op.create_index("idx_backends_priority", "backends", ["write_priority", "read_priority"]) + op.create_table( + "placement_policies", + sa.Column("id", sa.String(), nullable=False), + sa.Column("file_class", sa.String(), nullable=False), + sa.Column("require_local", sa.Boolean(), server_default="1", nullable=False), + sa.Column("stable_replica_count", sa.Integer(), server_default="1", nullable=False), + sa.Column("opportunistic_replica_count", sa.Integer(), server_default="0", nullable=False), + sa.Column("preferred_backend_ids_json", sa.Text(), server_default="[]", nullable=False), + sa.Column("excluded_backend_ids_json", sa.Text(), server_default="[]", nullable=False), + sa.Column("max_non_local_size_bytes", sa.Integer(), nullable=True), + sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), + sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), + sa.PrimaryKeyConstraint("id"), + ) + op.create_index("idx_placement_policies_file_class", "placement_policies", ["file_class"], unique=True) + op.create_table( "upload_sessions", sa.Column("id", sa.String(), nullable=False), @@ -93,12 +125,14 @@ def upgrade() -> None: sa.Column("size_bytes", sa.Integer(), nullable=False), sa.Column("current_version_id", sa.String(), nullable=True), sa.Column("is_deleted", sa.Boolean(), server_default="0", nullable=False), + sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True), sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False), sa.ForeignKeyConstraint(["directory_id"], ["directories.id"]), sa.PrimaryKeyConstraint("id"), ) op.create_index("idx_file_entries_current_version_id", "file_entries", ["current_version_id"]) + op.create_index("idx_file_entries_deleted_at", "file_entries", ["deleted_at"]) op.create_index( "idx_file_entries_directory_name", "file_entries", @@ -258,6 +292,9 @@ def downgrade() -> None: op.drop_index("idx_blob_replicas_backend_status", table_name="blob_replicas") op.drop_table("blob_replicas") + op.drop_index("idx_placement_policies_file_class", table_name="placement_policies") + op.drop_table("placement_policies") + op.drop_index("idx_blobs_file_version_index", table_name="blobs") op.drop_index("idx_blobs_content_hash", table_name="blobs") op.drop_table("blobs") @@ -266,6 +303,7 @@ def downgrade() -> None: op.drop_index("idx_file_versions_content_hash", table_name="file_versions") op.drop_table("file_versions") + op.drop_index("idx_file_entries_deleted_at", table_name="file_entries") op.drop_index("idx_file_entries_directory_name", table_name="file_entries") op.drop_index("idx_file_entries_current_version_id", table_name="file_entries") op.drop_table("file_entries") @@ -282,4 +320,8 @@ def downgrade() -> None: op.drop_index("idx_directories_parent_id", table_name="directories") op.drop_table("directories") + op.drop_index("idx_auth_sessions_token_hash", table_name="auth_sessions") + op.drop_index("idx_auth_sessions_user_status", table_name="auth_sessions") + op.drop_table("auth_sessions") + op.drop_table("users") diff --git a/app/adapters/storage/base.py b/app/adapters/storage/base.py new file mode 100644 index 0000000..eaaf210 --- /dev/null +++ b/app/adapters/storage/base.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +from pathlib import Path +from typing import Protocol + + +class StorageAdapter(Protocol): + async def check(self) -> dict[str, str]: + ... + + async def put_file(self, source_path: str, storage_key: str) -> dict[str, str | None]: + ... + + async def download_file(self, storage_key: str, destination_path: Path) -> Path: + ... + + async def object_exists(self, storage_key: str) -> bool: + ... diff --git a/app/adapters/storage/local.py b/app/adapters/storage/local.py index bcb8fc9..a0fca98 100644 --- a/app/adapters/storage/local.py +++ b/app/adapters/storage/local.py @@ -21,7 +21,7 @@ class LocalStorageAdapter: raise NotADirectoryError(str(path)) return {"status": "healthy", "detail": str(path)} - async def put_file(self, source_path: str, storage_key: str) -> str: + async def put_file(self, source_path: str, storage_key: str) -> dict[str, str | None]: destination = self.base_path / storage_key await anyio.to_thread.run_sync(lambda: destination.parent.mkdir(parents=True, exist_ok=True)) @@ -30,7 +30,13 @@ class LocalStorageAdapter: shutil.copyfile(source_path, destination) await anyio.to_thread.run_sync(_copy_if_needed) - return str(destination) + return {"etag": None, "storage_key": storage_key} + + async def download_file(self, storage_key: str, destination_path: Path) -> Path: + source = await self.resolve_path(storage_key) + await anyio.to_thread.run_sync(lambda: destination_path.parent.mkdir(parents=True, exist_ok=True)) + await anyio.to_thread.run_sync(lambda: shutil.copyfile(source, destination_path)) + return destination_path async def resolve_path(self, storage_key: str) -> Path: destination = self.base_path / storage_key diff --git a/app/adapters/storage/registry.py b/app/adapters/storage/registry.py new file mode 100644 index 0000000..f07f48f --- /dev/null +++ b/app/adapters/storage/registry.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +from typing import Any + +from app.adapters.storage.base import StorageAdapter +from app.adapters.storage.local import LocalStorageAdapter +from app.adapters.storage.s3 import S3StorageAdapter +from app.adapters.storage.webdav import WebDAVStorageAdapter + + +def build_storage_adapter(backend_type: str, config: dict[str, Any]) -> StorageAdapter: + if backend_type == "local_directory": + return LocalStorageAdapter(config["base_path"]) + if backend_type == "s3": + return S3StorageAdapter(config) + if backend_type == "webdav": + return WebDAVStorageAdapter(config) + raise ValueError(f"Unsupported backend type: {backend_type}") diff --git a/app/adapters/storage/s3.py b/app/adapters/storage/s3.py index ba2e410..78c6c4a 100644 --- a/app/adapters/storage/s3.py +++ b/app/adapters/storage/s3.py @@ -5,6 +5,7 @@ from typing import Any import anyio import boto3 +from botocore.config import Config from botocore.exceptions import ClientError @@ -23,31 +24,38 @@ class S3StorageAdapter: async def put_file(self, source_path: str, storage_key: str) -> dict[str, str | None]: client = self._create_client() + object_key = self._object_key(storage_key) def _put() -> dict[str, str | None]: extra_args: dict[str, Any] = {} - client.upload_file(source_path, self.config["bucket"], storage_key, ExtraArgs=extra_args) - metadata = client.head_object(Bucket=self.config["bucket"], Key=storage_key) + if self.config.get("storage_class"): + extra_args["StorageClass"] = self.config["storage_class"] + if self.config.get("server_side_encryption"): + extra_args["ServerSideEncryption"] = self.config["server_side_encryption"] + client.upload_file(source_path, self.config["bucket"], object_key, ExtraArgs=extra_args) + metadata = client.head_object(Bucket=self.config["bucket"], Key=object_key) return {"etag": metadata.get("ETag"), "storage_key": storage_key} return await anyio.to_thread.run_sync(_put) async def download_file(self, storage_key: str, destination_path: Path) -> Path: client = self._create_client() + object_key = self._object_key(storage_key) def _download() -> Path: destination_path.parent.mkdir(parents=True, exist_ok=True) - client.download_file(self.config["bucket"], storage_key, str(destination_path)) + client.download_file(self.config["bucket"], object_key, str(destination_path)) return destination_path return await anyio.to_thread.run_sync(_download) async def object_exists(self, storage_key: str) -> bool: client = self._create_client() + object_key = self._object_key(storage_key) def _exists() -> bool: try: - client.head_object(Bucket=self.config["bucket"], Key=storage_key) + client.head_object(Bucket=self.config["bucket"], Key=object_key) return True except ClientError as exc: error_code = exc.response.get("Error", {}).get("Code") @@ -58,12 +66,23 @@ class S3StorageAdapter: return await anyio.to_thread.run_sync(_exists) def _create_client(self): + client_config = None + if self.config.get("force_path_style"): + client_config = Config(s3={"addressing_style": "path"}) client_kwargs = { "service_name": "s3", "region_name": self.config.get("region"), "endpoint_url": self.config.get("endpoint_url"), "aws_access_key_id": self.config.get("access_key_id"), "aws_secret_access_key": self.config.get("secret_access_key"), + "verify": self.config.get("verify_ssl", True), + "config": client_config, } cleaned_kwargs = {key: value for key, value in client_kwargs.items() if value is not None} return boto3.client(**cleaned_kwargs) + + def _object_key(self, storage_key: str) -> str: + prefix = (self.config.get("prefix") or "").strip("/") + if not prefix: + return storage_key + return f"{prefix}/{storage_key}" diff --git a/app/adapters/storage/webdav.py b/app/adapters/storage/webdav.py new file mode 100644 index 0000000..a065ee1 --- /dev/null +++ b/app/adapters/storage/webdav.py @@ -0,0 +1,145 @@ +from __future__ import annotations + +import base64 +import ssl +import urllib.error +import urllib.parse +import urllib.request +import xml.etree.ElementTree as ET +from pathlib import Path +from typing import Any + +import anyio + + +DAV_NAMESPACE = {"d": "DAV:"} + + +class WebDAVStorageAdapter: + def __init__(self, config: dict[str, Any]) -> None: + self.config = config + self.base_url = config["endpoint_url"].rstrip("/") + self.root_path = self._normalize_relative_path(config.get("root_path") or "iron") + self._ssl_context = None if config.get("verify_ssl", True) else ssl._create_unverified_context() + + async def check(self) -> dict[str, str]: + def _check() -> dict[str, str]: + self._ensure_directory(self.root_path) + return {"status": "healthy", "detail": self.root_path} + + return await anyio.to_thread.run_sync(_check) + + async def put_file(self, source_path: str, storage_key: str) -> dict[str, str | None]: + def _put() -> dict[str, str | None]: + source = Path(source_path) + if not source.exists(): + raise FileNotFoundError(source_path) + normalized_key = self._normalize_relative_path(storage_key) + segments = normalized_key.split("/") + if len(segments) > 1: + self._ensure_directory(f"{self.root_path}/{'/'.join(segments[:-1])}") + request = urllib.request.Request( + self._build_url(f"{self.root_path}/{normalized_key}"), + data=source.read_bytes(), + method="PUT", + headers=self._auth_headers(), + ) + with urllib.request.urlopen(request, timeout=60, context=self._ssl_context) as response: + etag = response.headers.get("ETag") + return {"etag": etag, "storage_key": normalized_key} + + return await anyio.to_thread.run_sync(_put) + + async def download_file(self, storage_key: str, destination_path: Path) -> Path: + def _download() -> Path: + normalized_key = self._normalize_relative_path(storage_key) + request = urllib.request.Request( + self._build_url(f"{self.root_path}/{normalized_key}"), + method="GET", + headers=self._auth_headers(), + ) + try: + with urllib.request.urlopen(request, timeout=60, context=self._ssl_context) as response: + body = response.read() + except urllib.error.HTTPError as exc: + if exc.code == 404: + raise FileNotFoundError(storage_key) from exc + raise + destination_path.parent.mkdir(parents=True, exist_ok=True) + destination_path.write_bytes(body) + return destination_path + + return await anyio.to_thread.run_sync(_download) + + async def object_exists(self, storage_key: str) -> bool: + def _exists() -> bool: + normalized_key = self._normalize_relative_path(storage_key) + request = urllib.request.Request( + self._build_url(f"{self.root_path}/{normalized_key}"), + method="HEAD", + headers=self._auth_headers(), + ) + try: + with urllib.request.urlopen(request, timeout=20, context=self._ssl_context): + return True + except urllib.error.HTTPError as exc: + if exc.code == 404: + return False + if exc.code in {403, 405}: + return self._path_exists(f"{self.root_path}/{normalized_key}") + raise + + return await anyio.to_thread.run_sync(_exists) + + def _ensure_directory(self, relative_path: str) -> None: + current = "" + for segment in self._normalize_relative_path(relative_path).split("/"): + current = f"{current}/{segment}".strip("/") + if self._path_exists(current): + continue + request = urllib.request.Request( + self._build_url(current), + method="MKCOL", + headers=self._auth_headers(), + ) + try: + with urllib.request.urlopen(request, timeout=20, context=self._ssl_context): + pass + except urllib.error.HTTPError as exc: + if exc.code not in {201, 405}: + raise RuntimeError(f"WebDAV MKCOL failed with {exc.code} for {current}") from exc + + def _path_exists(self, relative_path: str) -> bool: + request = urllib.request.Request( + self._build_url(relative_path), + method="PROPFIND", + headers={**self._auth_headers(), "Depth": "0"}, + ) + try: + with urllib.request.urlopen(request, timeout=20, context=self._ssl_context) as response: + body = response.read() + except urllib.error.HTTPError as exc: + if exc.code == 404: + return False + raise RuntimeError(f"WebDAV PROPFIND failed with {exc.code} for {relative_path}") from exc + if not body: + return True + root = ET.fromstring(body) + return root.find("d:response", DAV_NAMESPACE) is not None + + def _build_url(self, relative_path: str) -> str: + safe_path = "/".join(urllib.parse.quote(part, safe="") for part in relative_path.strip("/").split("/") if part) + return f"{self.base_url}/{safe_path}" + + def _auth_headers(self) -> dict[str, str]: + username = str(self.config.get("username") or "") + password = str(self.config.get("password") or "") + token = base64.b64encode(f"{username}:{password}".encode("utf-8")).decode("ascii") + return {"Authorization": f"Basic {token}"} + + @staticmethod + def _normalize_relative_path(value: str) -> str: + normalized = "/".join(part for part in value.strip().strip("/").split("/") if part) + if not normalized: + raise ValueError("path must not be empty") + return normalized diff --git a/app/api/routes/backends.py b/app/api/routes/backends.py index 80e16ad..f1a92ee 100644 --- a/app/api/routes/backends.py +++ b/app/api/routes/backends.py @@ -1,6 +1,11 @@ +import json + from fastapi import APIRouter, Depends +from fastapi import Response from app.api.dependencies import get_backend_service +from app.core.secret_codec import list_secret_fields +from app.models.entities import Backend from app.schemas.backend import ( BackendCheckResponse, BackendListResponse, @@ -8,19 +13,28 @@ from app.schemas.backend import ( BackendSummary, CreateBackendRequest, CreateBackendResponse, + UpdateBackendRequest, ) from app.services.backend_service import BackendService router = APIRouter() +def summarize_backend(backend: Backend) -> BackendSummary: + summary = BackendSummary.model_validate(backend, from_attributes=True) + public_config = json.loads(backend.public_config_json) + summary.config = public_config + summary.secret_fields = list_secret_fields(backend.secret_config_json) + return summary + + @router.get("", response_model=BackendListResponse) async def list_backends( service: BackendService = Depends(get_backend_service), ) -> BackendListResponse: items = await service.list_backends() return BackendListResponse( - items=[BackendSummary.model_validate(item, from_attributes=True) for item in items] + items=[summarize_backend(item) for item in items] ) @@ -37,7 +51,7 @@ async def create_backend( write_priority=payload.write_priority, config=payload.config, ) - return CreateBackendResponse(backend=BackendSummary.model_validate(backend, from_attributes=True)) + return CreateBackendResponse(backend=summarize_backend(backend)) @router.post("/{backend_id}/check", response_model=BackendCheckResponse) @@ -54,10 +68,45 @@ async def check_backend( ) +@router.patch("/{backend_id}", response_model=BackendMutationResponse) +async def update_backend( + backend_id: str, + payload: UpdateBackendRequest, + service: BackendService = Depends(get_backend_service), +) -> BackendMutationResponse: + backend = await service.update_backend( + backend_id, + name=payload.name, + stability_class=payload.stability_class, + read_priority=payload.read_priority, + write_priority=payload.write_priority, + config=payload.config, + ) + return BackendMutationResponse(backend=summarize_backend(backend)) + + @router.post("/{backend_id}/disable", response_model=BackendMutationResponse) async def disable_backend( backend_id: str, service: BackendService = Depends(get_backend_service), ) -> BackendMutationResponse: backend = await service.disable_backend(backend_id) - return BackendMutationResponse(backend=BackendSummary.model_validate(backend, from_attributes=True)) + return BackendMutationResponse(backend=summarize_backend(backend)) + + +@router.post("/{backend_id}/enable", response_model=BackendMutationResponse) +async def enable_backend( + backend_id: str, + service: BackendService = Depends(get_backend_service), +) -> BackendMutationResponse: + backend = await service.enable_backend(backend_id) + return BackendMutationResponse(backend=summarize_backend(backend)) + + +@router.delete("/{backend_id}", status_code=204) +async def delete_backend( + backend_id: str, + service: BackendService = Depends(get_backend_service), +) -> Response: + await service.delete_backend(backend_id) + return Response(status_code=204) diff --git a/app/api/routes/files.py b/app/api/routes/files.py index 48d1e57..d66db03 100644 --- a/app/api/routes/files.py +++ b/app/api/routes/files.py @@ -8,7 +8,9 @@ from app.api.dependencies import get_file_service, get_repair_service from app.schemas.file import ( DeletedFileSummary, FileDetailResponse, + FilePlacementBackendSummary, FileMutationResponse, + FileReplicaSummary, FileSummary, MoveFileRequest, PreviewArtifactSummary, @@ -84,12 +86,42 @@ async def get_file_detail( file_id: str, service: FileService = Depends(get_file_service), ) -> FileDetailResponse: - file_entry, artifacts = await service.get_file_detail(file_id) + file_entry, artifacts, replicas, decision = await service.get_file_detail(file_id) + replica_items = [ + FileReplicaSummary( + id=replica.id, + blob_id=replica.blob_id, + backend_id=backend.id, + backend_name=backend.name, + backend_type=backend.type, + backend_stability_class=backend.stability_class, + backend_enabled=backend.is_enabled, + storage_key=replica.storage_key, + status=replica.status, + size_bytes=replica.size_bytes, + checksum=replica.checksum, + etag=replica.etag, + last_verified_at=replica.last_verified_at, + created_at=replica.created_at, + updated_at=replica.updated_at, + ) + for replica, backend in replicas + ] + ready_replica_backend_ids = sorted({item.backend_id for item in replica_items if item.status == "ready"}) + desired_backend_ids = [backend.id for backend in (decision.backends if decision is not None else [])] return FileDetailResponse( file=FileSummary.model_validate(file_entry, from_attributes=True), preview_artifacts=[ PreviewArtifactSummary.model_validate(artifact, from_attributes=True) for artifact in artifacts ], + replicas=replica_items, + placement_file_class=decision.file_class if decision is not None else None, + desired_backends=[ + FilePlacementBackendSummary.model_validate(backend, from_attributes=True) + for backend in (decision.backends if decision is not None else []) + ], + ready_replica_backend_ids=ready_replica_backend_ids, + missing_backend_ids=[backend_id for backend_id in desired_backend_ids if backend_id not in ready_replica_backend_ids], ) diff --git a/app/api/routes/policies.py b/app/api/routes/policies.py index 468cb3c..49d167b 100644 --- a/app/api/routes/policies.py +++ b/app/api/routes/policies.py @@ -3,7 +3,7 @@ from __future__ import annotations from fastapi import APIRouter, Depends from fastapi import Query -from app.api.dependencies import get_policy_service +from app.api.dependencies import get_policy_service, get_repair_service from app.schemas.policy import ( PlacementDecisionBackendSummary, PlacementDecisionResponse, @@ -13,6 +13,7 @@ from app.schemas.policy import ( UpsertPlacementPolicyRequest, ) from app.services.policy_service import PolicyService +from app.services.repair_service import RepairService router = APIRouter() @@ -65,6 +66,7 @@ async def upsert_placement_policy( file_class: str, payload: UpsertPlacementPolicyRequest, service: PolicyService = Depends(get_policy_service), + repair_service: RepairService = Depends(get_repair_service), ) -> PlacementPolicyMutationResponse: policy = await service.upsert_policy( file_class=file_class, @@ -75,4 +77,5 @@ async def upsert_placement_policy( excluded_backend_ids=payload.excluded_backend_ids, max_non_local_size_bytes=payload.max_non_local_size_bytes, ) - return PlacementPolicyMutationResponse(policy=_policy_to_summary(policy)) + enqueued_jobs = await repair_service.enqueue_full_reconcile() + return PlacementPolicyMutationResponse(policy=_policy_to_summary(policy), reconcile_enqueued_jobs=enqueued_jobs) diff --git a/app/core/backend_config.py b/app/core/backend_config.py new file mode 100644 index 0000000..066ca0b --- /dev/null +++ b/app/core/backend_config.py @@ -0,0 +1,130 @@ +from __future__ import annotations + +from typing import Any, Literal + +from pydantic import BaseModel, Field, ValidationError as PydanticValidationError, field_validator + +from app.core.exceptions import ValidationError + +BackendType = Literal["local_directory", "s3", "webdav"] + + +class BackendConfigError(ValidationError): + code = "backend_config_invalid" + message = "Backend configuration is invalid." + + +class LocalDirectoryConfig(BaseModel): + base_path: str = Field(min_length=1) + + @field_validator("base_path") + @classmethod + def clean_base_path(cls, value: str) -> str: + cleaned = value.strip() + if not cleaned: + raise ValueError("base_path must not be empty") + return cleaned + + +class S3CompatibleConfig(BaseModel): + bucket: str = Field(min_length=1) + region: str | None = None + endpoint_url: str | None = None + access_key_id: str | None = None + secret_access_key: str | None = None + prefix: str = "" + force_path_style: bool = False + verify_ssl: bool = True + storage_class: str | None = None + server_side_encryption: str | None = None + + @field_validator("bucket") + @classmethod + def clean_bucket(cls, value: str) -> str: + cleaned = value.strip() + if not cleaned: + raise ValueError("bucket must not be empty") + return cleaned + + @field_validator("prefix") + @classmethod + def clean_prefix(cls, value: str) -> str: + return value.strip().strip("/") + + +class WebDAVConfig(BaseModel): + endpoint_url: str = Field(min_length=1) + username: str = Field(min_length=1) + password: str | None = None + root_path: str = Field(default="iron", min_length=1) + verify_ssl: bool = True + + @field_validator("endpoint_url", "username") + @classmethod + def clean_required_text(cls, value: str) -> str: + cleaned = value.strip() + if not cleaned: + raise ValueError("value must not be empty") + return cleaned + + @field_validator("endpoint_url") + @classmethod + def clean_endpoint_url(cls, value: str) -> str: + return value.strip().rstrip("/") + + @field_validator("root_path") + @classmethod + def clean_root_path(cls, value: str) -> str: + cleaned = "/".join(part for part in value.strip().strip("/").split("/") if part) + if not cleaned: + raise ValueError("root_path must not be empty") + return cleaned + + +CONFIG_MODELS: dict[str, type[BaseModel]] = { + "local_directory": LocalDirectoryConfig, + "s3": S3CompatibleConfig, + "webdav": WebDAVConfig, +} + +SECRET_CONFIG_KEYS = { + "access_key_id", + "secret_access_key", + "password", +} + + +def supported_backend_types() -> set[str]: + return set(CONFIG_MODELS) + + +def validate_backend_config(backend_type: str, config: dict[str, Any]) -> dict[str, Any]: + model = CONFIG_MODELS.get(backend_type) + if model is None: + raise BackendConfigError(f"Unsupported backend type: {backend_type}.") + + try: + return model.model_validate(config).model_dump() + except PydanticValidationError as exc: + first_error = exc.errors()[0] if exc.errors() else {} + location = ".".join(str(part) for part in first_error.get("loc", [])) + message = first_error.get("msg", "Invalid backend configuration.") + prefix = f"{location}: " if location else "" + raise BackendConfigError(prefix + message) from exc + + +def split_backend_config(backend_type: str, config: dict[str, Any]) -> tuple[dict[str, Any], dict[str, Any]]: + normalized = validate_backend_config(backend_type, config) + public_config: dict[str, Any] = {} + secret_config: dict[str, Any] = {} + for key, value in normalized.items(): + if key in SECRET_CONFIG_KEYS: + if value: + secret_config[key] = value + else: + public_config[key] = value + return public_config, secret_config + + +def merge_backend_config(public_config: dict[str, Any], secret_config: dict[str, Any]) -> dict[str, Any]: + return {**public_config, **secret_config} diff --git a/app/core/config.py b/app/core/config.py index fe3c8cd..a3477d2 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -21,6 +21,7 @@ class Settings: cache_dir: str = "./.iron-cache" bootstrap_username: str = "admin" bootstrap_password: str = "changeme-iron" + secret_key: str = "iron-local-development-secret-key" auth_session_ttl_hours: int = 24 * 7 job_poll_interval_seconds: float = 2.0 job_batch_size: int = 10 @@ -37,6 +38,7 @@ class Settings: cache_dir=os.getenv("IRON_CACHE_DIR", cls.cache_dir), bootstrap_username=os.getenv("IRON_BOOTSTRAP_USERNAME", cls.bootstrap_username), bootstrap_password=os.getenv("IRON_BOOTSTRAP_PASSWORD", cls.bootstrap_password), + secret_key=os.getenv("IRON_SECRET_KEY", cls.secret_key), auth_session_ttl_hours=int( os.getenv("IRON_AUTH_SESSION_TTL_HOURS", str(cls.auth_session_ttl_hours)) ), diff --git a/app/core/secret_codec.py b/app/core/secret_codec.py new file mode 100644 index 0000000..9b531d9 --- /dev/null +++ b/app/core/secret_codec.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +import base64 +import hashlib +import json +from typing import Any + +from cryptography.fernet import Fernet, InvalidToken + +from app.core.config import get_settings +from app.core.exceptions import ValidationError + +SECRET_PREFIX = "fernet:v1:" + + +class SecretConfigError(ValidationError): + code = "secret_config_invalid" + message = "Secret configuration cannot be decrypted." + + +def encrypt_secret_config(secret_config: dict[str, Any]) -> str: + payload = json.dumps(secret_config, sort_keys=True, separators=(",", ":"), ensure_ascii=True).encode("utf-8") + token = _fernet().encrypt(payload).decode("utf-8") + return SECRET_PREFIX + token + + +def decrypt_secret_config(raw_value: str) -> dict[str, Any]: + if not raw_value: + return {} + if not raw_value.startswith(SECRET_PREFIX): + value = json.loads(raw_value) + return value if isinstance(value, dict) else {} + + token = raw_value.removeprefix(SECRET_PREFIX).encode("utf-8") + try: + payload = _fernet().decrypt(token) + except InvalidToken as exc: + raise SecretConfigError() from exc + value = json.loads(payload.decode("utf-8")) + return value if isinstance(value, dict) else {} + + +def list_secret_fields(raw_value: str) -> list[str]: + return sorted(decrypt_secret_config(raw_value)) + + +def _fernet() -> Fernet: + digest = hashlib.sha256(get_settings().secret_key.encode("utf-8")).digest() + key = base64.urlsafe_b64encode(digest) + return Fernet(key) diff --git a/app/core/storage_layout.py b/app/core/storage_layout.py new file mode 100644 index 0000000..781d914 --- /dev/null +++ b/app/core/storage_layout.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from datetime import datetime + +from app.models.entities import Blob + + +def build_blob_storage_key(blob: Blob) -> str: + content_hash = blob.content_hash + prefix_one = content_hash[:2] if len(content_hash) >= 2 else "xx" + prefix_two = content_hash[2:4] if len(content_hash) >= 4 else "xx" + kind = blob.kind or "blob" + return f"objects/{kind}/sha256/{prefix_one}/{prefix_two}/{content_hash}.blob" + + +def build_preview_artifact_storage_key(*, artifact_type: str, blob: Blob) -> str: + content_hash = blob.content_hash + prefix_one = content_hash[:2] if len(content_hash) >= 2 else "xx" + prefix_two = content_hash[2:4] if len(content_hash) >= 4 else "xx" + artifact_segment = _normalize_segment(artifact_type) + return f"objects/preview/{artifact_segment}/sha256/{prefix_one}/{prefix_two}/{content_hash}.blob" + + +def build_export_snapshot_storage_key(*, exported_at: datetime, digest: str) -> str: + year = f"{exported_at.year:04d}" + month = f"{exported_at.month:02d}" + day = f"{exported_at.day:02d}" + normalized_digest = _normalize_segment(digest) or "snapshot" + return f"objects/export/metadata/{year}/{month}/{day}/{normalized_digest}.json" + + +def build_manifest_storage_key(*, scope: str, identifier: str) -> str: + normalized_scope = _normalize_segment(scope) or "general" + normalized_identifier = _normalize_segment(identifier) or "manifest" + return f"objects/manifest/{normalized_scope}/{normalized_identifier}.json" + + +def _normalize_segment(value: str) -> str: + cleaned = "".join(char if char.isalnum() or char in {"-", "_"} else "-" for char in value.strip().lower()) + while "--" in cleaned: + cleaned = cleaned.replace("--", "-") + return cleaned.strip("-_") diff --git a/app/models/entities.py b/app/models/entities.py index eafa7d0..0534036 100644 --- a/app/models/entities.py +++ b/app/models/entities.py @@ -147,7 +147,8 @@ class Backend(TimestampMixin, Base): read_priority: Mapped[int] = mapped_column(Integer, nullable=False) write_priority: Mapped[int] = mapped_column(Integer, nullable=False) is_enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True, server_default="1") - config_json: Mapped[str] = mapped_column(Text, nullable=False) + public_config_json: Mapped[str] = mapped_column(Text, nullable=False) + secret_config_json: Mapped[str] = mapped_column(Text, nullable=False) capacity_hint_bytes: Mapped[Optional[int]] = mapped_column(Integer, nullable=True) last_health_status: Mapped[Optional[str]] = mapped_column(String, nullable=True) last_health_checked_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True) diff --git a/app/repositories/backend_repository.py b/app/repositories/backend_repository.py index abf39db..c3be2ef 100644 --- a/app/repositories/backend_repository.py +++ b/app/repositories/backend_repository.py @@ -1,9 +1,11 @@ from __future__ import annotations +import json + from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from app.models.entities import Backend +from app.models.entities import Backend, PlacementPolicy class BackendRepository: @@ -39,3 +41,24 @@ class BackendRepository: await self.session.flush() await self.session.refresh(backend) return backend + + async def delete(self, backend: Backend) -> None: + await self.session.delete(backend) + await self.session.flush() + + async def is_referenced_by_policy(self, backend_id: str) -> bool: + result = await self.session.execute(select(PlacementPolicy)) + for policy in result.scalars().all(): + preferred = json.loads(policy.preferred_backend_ids_json or "[]") + excluded = json.loads(policy.excluded_backend_ids_json or "[]") + if backend_id in preferred or backend_id in excluded: + return True + return False + + async def list_enabled_by_type(self, backend_type: str) -> list[Backend]: + result = await self.session.execute( + select(Backend) + .where(Backend.is_enabled.is_(True), Backend.type == backend_type) + .order_by(Backend.write_priority.desc(), Backend.read_priority.desc(), Backend.name.asc()) + ) + return list(result.scalars().all()) diff --git a/app/repositories/blob_replica_repository.py b/app/repositories/blob_replica_repository.py index faec22e..f0dd8f7 100644 --- a/app/repositories/blob_replica_repository.py +++ b/app/repositories/blob_replica_repository.py @@ -1,6 +1,6 @@ from __future__ import annotations -from sqlalchemy import select +from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from app.models.entities import Backend @@ -50,6 +50,15 @@ class BlobReplicaRepository: ) return list(result.all()) + async def list_replicas_with_backends(self, blob_id: str) -> list[tuple[BlobReplica, Backend]]: + result = await self.session.execute( + select(BlobReplica, Backend) + .join(Backend, BlobReplica.backend_id == Backend.id) + .where(BlobReplica.blob_id == blob_id) + .order_by(Backend.read_priority.desc(), BlobReplica.created_at.asc()) + ) + return list(result.all()) + async def list_by_blob(self, blob_id: str) -> list[BlobReplica]: result = await self.session.execute(select(BlobReplica).where(BlobReplica.blob_id == blob_id)) return list(result.scalars().all()) @@ -58,3 +67,9 @@ class BlobReplicaRepository: await self.session.flush() await self.session.refresh(replica) return replica + + async def count_by_backend(self, backend_id: str) -> int: + result = await self.session.execute( + select(func.count()).select_from(BlobReplica).where(BlobReplica.backend_id == backend_id) + ) + return int(result.scalar_one()) diff --git a/app/schemas/backend.py b/app/schemas/backend.py index 75a35e3..6947897 100644 --- a/app/schemas/backend.py +++ b/app/schemas/backend.py @@ -1,6 +1,6 @@ from datetime import datetime -from pydantic import BaseModel +from pydantic import BaseModel, Field class BackendSummary(BaseModel): @@ -13,6 +13,8 @@ class BackendSummary(BaseModel): is_enabled: bool last_health_status: str | None last_health_checked_at: datetime | None + config: dict | None = None + secret_fields: list[str] = Field(default_factory=list) created_at: datetime updated_at: datetime @@ -30,6 +32,14 @@ class CreateBackendRequest(BaseModel): config: dict +class UpdateBackendRequest(BaseModel): + name: str | None = None + stability_class: str | None = None + read_priority: int | None = None + write_priority: int | None = None + config: dict | None = None + + class CreateBackendResponse(BaseModel): backend: BackendSummary diff --git a/app/schemas/file.py b/app/schemas/file.py index 1d309ac..ce9d45b 100644 --- a/app/schemas/file.py +++ b/app/schemas/file.py @@ -25,9 +25,42 @@ class PreviewArtifactSummary(BaseModel): updated_at: datetime +class FileReplicaSummary(BaseModel): + id: str + blob_id: str + backend_id: str + backend_name: str + backend_type: str + backend_stability_class: str + backend_enabled: bool + storage_key: str + status: str + size_bytes: int + checksum: str | None + etag: str | None + last_verified_at: datetime | None + created_at: datetime + updated_at: datetime + + +class FilePlacementBackendSummary(BaseModel): + id: str + name: str + type: str + stability_class: str + read_priority: int + write_priority: int + is_enabled: bool + + class FileDetailResponse(BaseModel): file: FileSummary preview_artifacts: list[PreviewArtifactSummary] = [] + replicas: list[FileReplicaSummary] = [] + placement_file_class: str | None = None + desired_backends: list[FilePlacementBackendSummary] = [] + ready_replica_backend_ids: list[str] = [] + missing_backend_ids: list[str] = [] class DeletedFileSummary(FileSummary): diff --git a/app/schemas/policy.py b/app/schemas/policy.py index 2e3dda9..c1afe41 100644 --- a/app/schemas/policy.py +++ b/app/schemas/policy.py @@ -35,6 +35,7 @@ class UpsertPlacementPolicyRequest(BaseModel): class PlacementPolicyMutationResponse(BaseModel): ok: bool = True policy: PlacementPolicySummary + reconcile_enqueued_jobs: int = 0 class PlacementDecisionBackendSummary(BaseModel): diff --git a/app/services/backend_service.py b/app/services/backend_service.py index ae70c9f..bef9938 100644 --- a/app/services/backend_service.py +++ b/app/services/backend_service.py @@ -5,10 +5,21 @@ from datetime import UTC, datetime from sqlalchemy.ext.asyncio import AsyncSession -from app.core.exceptions import ConflictError, NotFoundError, ValidationError +from app.core.backend_config import ( + SECRET_CONFIG_KEYS, + BackendConfigError, + merge_backend_config, + split_backend_config, + supported_backend_types, + validate_backend_config, +) +from app.core.exceptions import ConflictError, NotFoundError from app.core.ids import new_id +from app.core.secret_codec import decrypt_secret_config, encrypt_secret_config from app.models.entities import Backend from app.repositories.backend_repository import BackendRepository +from app.repositories.blob_replica_repository import BlobReplicaRepository +from app.services.local_storage_service import DEFAULT_LOCAL_BACKEND_ID from app.services.storage_service import StorageService @@ -17,12 +28,17 @@ class BackendNotFoundError(NotFoundError): message = "Backend does not exist." -class BackendConfigError(ValidationError): - code = "backend_config_invalid" - message = "Backend configuration is invalid." +class BackendDeleteConflictError(ConflictError): + code = "backend_delete_conflict" + message = "Backend cannot be deleted." -SUPPORTED_BACKEND_TYPES = {"local", "s3"} +class BackendDisableConflictError(ConflictError): + code = "backend_disable_conflict" + message = "Backend cannot be disabled." + + +SUPPORTED_BACKEND_TYPES = supported_backend_types() SUPPORTED_STABILITY_CLASSES = {"local", "stable", "opportunistic"} @@ -30,6 +46,7 @@ class BackendService: def __init__(self, session: AsyncSession) -> None: self.session = session self.repository = BackendRepository(session) + self.blob_replica_repository = BlobReplicaRepository(session) self.storage_service = StorageService(session) async def list_backends(self) -> list[Backend]: @@ -55,7 +72,7 @@ class BackendService: if await self.repository.get_by_name(cleaned_name) is not None: raise ConflictError("A backend with this name already exists.") - normalized_config = self._validate_backend_config(backend_type, config) + public_config, secret_config = self._validate_backend_config(backend_type, config) backend = Backend( id=new_id("bkd"), name=cleaned_name, @@ -64,7 +81,8 @@ class BackendService: read_priority=read_priority, write_priority=write_priority, is_enabled=True, - config_json=json.dumps(normalized_config), + public_config_json=json.dumps(public_config), + secret_config_json=encrypt_secret_config(secret_config), ) created = await self.repository.create(backend) await self.session.commit() @@ -89,11 +107,84 @@ class BackendService: async def disable_backend(self, backend_id: str) -> Backend: backend = await self._get_backend(backend_id) + if backend.type == "local_directory": + enabled_local_backends = await self.repository.list_enabled_by_type("local_directory") + if backend.is_enabled and len(enabled_local_backends) <= 1: + raise BackendDisableConflictError("At least one enabled local_directory backend is required.") backend.is_enabled = False saved = await self.repository.save(backend) await self.session.commit() return saved + async def enable_backend(self, backend_id: str) -> Backend: + backend = await self._get_backend(backend_id) + backend.is_enabled = True + saved = await self.repository.save(backend) + await self.session.commit() + return saved + + async def delete_backend(self, backend_id: str) -> None: + backend = await self._get_backend(backend_id) + if backend.id == DEFAULT_LOCAL_BACKEND_ID: + raise BackendDeleteConflictError("The default local backend cannot be deleted.") + if backend.is_enabled: + raise BackendDeleteConflictError("Disable the backend before deleting it.") + if await self.repository.is_referenced_by_policy(backend.id): + raise BackendDeleteConflictError("Backend is still referenced by a placement policy.") + replica_count = await self.blob_replica_repository.count_by_backend(backend.id) + if replica_count > 0: + raise BackendDeleteConflictError("Backend still has stored blob replicas.") + await self.repository.delete(backend) + await self.session.commit() + + async def update_backend( + self, + backend_id: str, + *, + name: str | None = None, + stability_class: str | None = None, + read_priority: int | None = None, + write_priority: int | None = None, + config: dict | None = None, + ) -> Backend: + backend = await self._get_backend(backend_id) + + if name is not None: + cleaned_name = name.strip() + if not cleaned_name: + raise BackendConfigError("Backend name must not be empty.") + existing = await self.repository.get_by_name(cleaned_name) + if existing is not None and existing.id != backend.id: + raise ConflictError("A backend with this name already exists.") + backend.name = cleaned_name + + if stability_class is not None: + if stability_class not in SUPPORTED_STABILITY_CLASSES: + raise BackendConfigError(f"Unsupported stability class: {stability_class}.") + backend.stability_class = stability_class + + if read_priority is not None: + backend.read_priority = read_priority + if write_priority is not None: + backend.write_priority = write_priority + + if config is not None: + public_config = json.loads(backend.public_config_json) + secret_config = decrypt_secret_config(backend.secret_config_json) + next_config = self._merge_config_update( + backend.type, + public_config=public_config, + secret_config=secret_config, + config_patch=config, + ) + next_public_config, next_secret_config = self._validate_backend_config(backend.type, next_config) + backend.public_config_json = json.dumps(next_public_config) + backend.secret_config_json = encrypt_secret_config(next_secret_config) + + saved = await self.repository.save(backend) + await self.session.commit() + return saved + async def _get_backend(self, backend_id: str) -> Backend: backend = await self.repository.get_by_id(backend_id) if backend is None: @@ -101,22 +192,21 @@ class BackendService: return backend @staticmethod - def _validate_backend_config(backend_type: str, config: dict) -> dict: - if backend_type == "local": - base_path = config.get("base_path") - if not isinstance(base_path, str) or not base_path.strip(): - raise BackendConfigError("Local backend config requires a non-empty base_path.") - return {"base_path": base_path} - - if backend_type == "s3": - bucket = config.get("bucket") - if not isinstance(bucket, str) or not bucket.strip(): - raise BackendConfigError("S3 backend config requires a non-empty bucket.") - normalized = {"bucket": bucket} - for key in ("region", "endpoint_url", "access_key_id", "secret_access_key"): - value = config.get(key) - if value is not None: - normalized[key] = value - return normalized - - raise BackendConfigError(f"Unsupported backend type: {backend_type}.") + def _validate_backend_config(backend_type: str, config: dict) -> tuple[dict, dict]: + return split_backend_config(backend_type, config) + + @staticmethod + def _merge_config_update( + backend_type: str, + *, + public_config: dict, + secret_config: dict, + config_patch: dict, + ) -> dict: + merged = merge_backend_config(public_config, secret_config) + normalized_patch = dict(config_patch) + for key in list(normalized_patch): + if key in SECRET_CONFIG_KEYS and not normalized_patch[key]: + normalized_patch.pop(key) + merged.update(normalized_patch) + return validate_backend_config(backend_type, merged) diff --git a/app/services/file_service.py b/app/services/file_service.py index a404d3a..26328b9 100644 --- a/app/services/file_service.py +++ b/app/services/file_service.py @@ -60,12 +60,20 @@ class FileService: raise FileNotFoundError() return file_entry - async def get_file_detail(self, file_id: str) -> tuple[FileEntry, list]: + async def get_file_detail(self, file_id: str) -> tuple[FileEntry, list, list, object | None]: file_entry = await self.get_file(file_id) if file_entry.current_version_id is None: - return file_entry, [] + return file_entry, [], [], None artifacts = await self.preview_artifact_repository.list_by_file_version(file_entry.current_version_id) - return file_entry, artifacts + blob = await self.file_repository.get_primary_blob_for_file(file_entry.id) + if blob is None: + return file_entry, artifacts, [], None + replicas = await self.blob_replica_repository.list_replicas_with_backends(blob.id) + decision = await self.storage_service.get_replication_targets_for_mime_type( + file_entry.mime_type, + size_bytes=blob.size_bytes, + ) + return file_entry, artifacts, replicas, decision async def list_deleted_files(self) -> list[FileEntry]: return await self.file_repository.list_deleted() diff --git a/app/services/local_storage_service.py b/app/services/local_storage_service.py index a29e03a..b3f300e 100644 --- a/app/services/local_storage_service.py +++ b/app/services/local_storage_service.py @@ -9,6 +9,8 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.adapters.storage.local import LocalStorageAdapter from app.core.config import get_settings from app.core.ids import new_id +from app.core.secret_codec import encrypt_secret_config +from app.core.storage_layout import build_blob_storage_key from app.models.entities import Backend, Blob, BlobReplica from app.repositories.backend_repository import BackendRepository from app.repositories.blob_replica_repository import BlobReplicaRepository @@ -35,12 +37,13 @@ class LocalStorageService: backend = Backend( id=DEFAULT_LOCAL_BACKEND_ID, name=DEFAULT_LOCAL_BACKEND_NAME, - type="local", + type="local_directory", stability_class="local", read_priority=100, write_priority=100, is_enabled=True, - config_json=json.dumps({"base_path": self.settings.local_storage_dir}), + public_config_json=json.dumps({"base_path": self.settings.local_storage_dir}), + secret_config_json=encrypt_secret_config({}), ) await self.backend_repository.create(backend) await self.session.commit() @@ -53,7 +56,7 @@ class LocalStorageService: return existing storage_key = self._build_storage_key(blob) - stored_path = await self.adapter.put_file(temp_path, storage_key) + await self.adapter.put_file(temp_path, storage_key) replica = BlobReplica( id=new_id("rep"), blob_id=blob.id, @@ -66,7 +69,8 @@ class LocalStorageService: created = await self.blob_replica_repository.create(replica) await self.session.commit() - await anyio.to_thread.run_sync(lambda: Path(stored_path).exists()) + stored_path = await self.adapter.resolve_path(storage_key) + await anyio.to_thread.run_sync(stored_path.exists) return created async def resolve_replica_path(self, replica: BlobReplica) -> Path: @@ -75,6 +79,4 @@ class LocalStorageService: @staticmethod def _build_storage_key(blob: Blob) -> str: - content_hash = blob.content_hash - prefix = content_hash[:2] if len(content_hash) >= 2 else "xx" - return f"blobs/{prefix}/{content_hash}" + return build_blob_storage_key(blob) diff --git a/app/services/policy_service.py b/app/services/policy_service.py index 1e3e535..1a1d595 100644 --- a/app/services/policy_service.py +++ b/app/services/policy_service.py @@ -146,18 +146,18 @@ class PolicyService: backends = await self.backend_repository.list_enabled() eligible_backends = [backend for backend in backends if backend.id not in excluded_backend_ids] local_backends = self._sort_backends( - [backend for backend in eligible_backends if backend.type == "local"], + [backend for backend in eligible_backends if backend.type == "local_directory"], preferred_backend_ids, ) stable_backends = [ backend for backend in eligible_backends - if backend.type != "local" and backend.stability_class == "stable" + if backend.type != "local_directory" and backend.stability_class == "stable" ] opportunistic_backends = [ backend for backend in eligible_backends - if backend.type != "local" and backend.stability_class == "opportunistic" + if backend.type != "local_directory" and backend.stability_class == "opportunistic" ] stable_backends = self._sort_backends(stable_backends, preferred_backend_ids) opportunistic_backends = self._sort_backends(opportunistic_backends, preferred_backend_ids) diff --git a/app/services/storage_service.py b/app/services/storage_service.py index 5ae487a..4814af4 100644 --- a/app/services/storage_service.py +++ b/app/services/storage_service.py @@ -8,10 +8,12 @@ from pathlib import Path import anyio from sqlalchemy.ext.asyncio import AsyncSession -from app.adapters.storage.local import LocalStorageAdapter -from app.adapters.storage.s3 import S3StorageAdapter +from app.adapters.storage.registry import build_storage_adapter +from app.core.backend_config import merge_backend_config from app.core.config import get_settings from app.core.ids import new_id +from app.core.secret_codec import decrypt_secret_config +from app.core.storage_layout import build_blob_storage_key from app.models.entities import Backend, Blob, BlobReplica, CacheEntry from app.repositories.backend_repository import BackendRepository from app.repositories.blob_replica_repository import BlobReplicaRepository @@ -53,12 +55,8 @@ class StorageService: if existing_is_usable: return existing - if backend.type == "local": - await adapter.put_file(source_path, storage_key) - etag = None - else: - result = await adapter.put_file(source_path, storage_key) - etag = result.get("etag") + result = await adapter.put_file(source_path, storage_key) + etag = result.get("etag") replica = existing or BlobReplica( id=new_id("rep"), @@ -86,7 +84,7 @@ class StorageService: return created async def materialize_replica_to_local_cache(self, blob: Blob, replica: BlobReplica, backend: Backend) -> Path: - if backend.type == "local": + if backend.type == "local_directory": adapter = self._build_adapter(backend) return await adapter.resolve_path(replica.storage_key) @@ -144,15 +142,11 @@ class StorageService: return result["status"], result.get("detail") def _build_adapter(self, backend: Backend): - config = json.loads(backend.config_json) - if backend.type == "local": - return LocalStorageAdapter(config["base_path"]) - if backend.type == "s3": - return S3StorageAdapter(config) - raise ValueError(f"Unsupported backend type: {backend.type}") + public_config = json.loads(backend.public_config_json) + secret_config = decrypt_secret_config(backend.secret_config_json) + config = merge_backend_config(public_config, secret_config) + return build_storage_adapter(backend.type, config) @staticmethod def _build_storage_key(blob: Blob) -> str: - content_hash = blob.content_hash - prefix = content_hash[:2] if len(content_hash) >= 2 else "xx" - return f"blobs/{prefix}/{content_hash}" + return build_blob_storage_key(blob) diff --git a/app/web/dist/assets/app.css b/app/web/dist/assets/app.css index 564ac14..b7b282a 100644 --- a/app/web/dist/assets/app.css +++ b/app/web/dist/assets/app.css @@ -1 +1 @@ -:root{--bg: #f6f8fb;--bg-deep: #eef2f6;--surface: rgba(255, 255, 255, .84);--surface-strong: rgba(255, 255, 255, .98);--surface-soft: rgba(248, 250, 252, .94);--ink: #111827;--muted: #6b7280;--accent: #2563eb;--accent-strong: #1e40af;--success: #0f9f6e;--warning: #d97706;--danger: #dc2626;--border: rgba(17, 24, 39, .08);--border-strong: rgba(17, 24, 39, .12);--shadow: 0 20px 48px rgba(15, 23, 42, .08);--shadow-soft: 0 8px 24px rgba(15, 23, 42, .05)}*{box-sizing:border-box}html,body,#root{min-height:100%}body{margin:0;color:var(--ink);background:radial-gradient(circle at top left,rgba(37,99,235,.06),transparent 20%),linear-gradient(180deg,#f8fafc,#f4f7fb 52%,#eef2f6);font-family:Manrope,Segoe UI,Helvetica Neue,Arial,sans-serif;line-height:1.45}button,input,select,iframe,video{font:inherit}a{color:inherit;text-decoration:none}button{border:1px solid transparent;border-radius:12px;padding:.72rem .95rem;cursor:pointer;color:#f8fbff;background:linear-gradient(180deg,#2d6df6 0%,var(--accent-strong) 100%);box-shadow:0 8px 18px #2563eb24;transition:transform .14s ease,opacity .14s ease,box-shadow .14s ease}button:hover{transform:translateY(-1px);box-shadow:0 10px 20px #2563eb2e}button:disabled{opacity:.6;cursor:wait}input,select{width:100%;border:1px solid var(--border);border-radius:12px;padding:.78rem .92rem;background:var(--surface-strong);color:var(--ink)}.ghost-button,.crumb-button,.tree-toggle,.tree-label{color:var(--ink);background:#fffc;border:1px solid var(--border);box-shadow:none}.danger-button{background:linear-gradient(180deg,#ef4444 0%,var(--danger) 100%);box-shadow:0 10px 22px #dc262624}.eyebrow,.metric-label{display:block;text-transform:uppercase;letter-spacing:.12em;font-size:.68rem;font-weight:700;color:var(--muted)}.app-shell{min-height:100vh;display:grid;grid-template-columns:208px minmax(0,1fr);gap:12px;padding:14px;max-width:1480px;margin:0 auto}.sidebar{display:grid;align-content:start;gap:.65rem;padding:.85rem;border:1px solid var(--border);border-radius:20px;background:#ffffffad;-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);box-shadow:var(--shadow-soft)}.brand-block{display:grid;gap:.68rem}.brand-block-compact{gap:.2rem}.brand-block h1,.topbar h2,.section-heading h2,.section-heading h3,.panel-toolbar h3{margin:.3rem 0 0}.brand-block h1{font-size:clamp(1.2rem,1.8vw,1.8rem);line-height:1.06;max-width:none;overflow-wrap:anywhere}.brand-block p,.sidebar-card p,.login-hero p,.detail-empty p,.preview-fallback p,.dropzone p{color:var(--muted);line-height:1.5;margin:0}.main-nav{display:grid;gap:.22rem;margin:.1rem 0 .45rem}.nav-link{padding:.6rem .72rem;border-radius:10px;color:var(--ink);font-weight:600;font-size:.95rem}.nav-link.active{background:linear-gradient(180deg,#2563eb1f,#2563eb0a);border:1px solid rgba(37,99,235,.14);color:#0f3ca7}.sidebar-card,.panel,.login-card,.login-hero,.summary-card{border:1px solid var(--border);background:var(--surface);box-shadow:var(--shadow-soft);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.sidebar-card{padding:.8rem .86rem .9rem;border-radius:16px;margin-top:auto}.workspace{padding:.1rem 0}.topbar{display:flex;align-items:center;justify-content:space-between;gap:.8rem;padding:.1rem .15rem}.topbar h2{font-size:1.35rem;line-height:1.05}.topbar-title{display:grid;gap:.1rem}.topbar-actions,.toolbar-group{display:flex;gap:.55rem;flex-wrap:wrap}.topbar-actions .ghost-button{border-radius:999px;background:#ffffffeb}.workspace-content{margin-top:.9rem;padding-bottom:1.5rem}.login-page{min-height:100vh;display:grid;grid-template-columns:1.15fr minmax(320px,460px);gap:1.5rem;padding:1.5rem}.login-hero,.login-card{border-radius:28px;padding:2rem}.hero-metrics{margin-top:2rem;display:grid;gap:1rem}.hero-metrics article{padding:1rem 1.1rem;border-radius:18px;background:#ffffff85;border:1px solid var(--border)}.stack-form,.stack-page,.uploads-main{display:grid;gap:1rem}.uploads-main{align-content:start}.section-heading{display:grid;gap:.12rem}.panel-toolbar h3,.section-heading h2,.section-heading h3,.files-header h3{line-height:1.15}.content-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:10px}.uploads-page-grid{display:grid;grid-template-columns:minmax(0,1.58fr) minmax(280px,.68fr);gap:12px;align-items:start}.dashboard-page-grid{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:12px;align-items:start}.compact-page-shell{width:min(100%,1040px);display:grid;gap:.9rem;margin-right:auto}.compact-page-shell-wide{width:min(100%,1180px)}.summary-strip{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem}.summary-strip-two-up{grid-template-columns:repeat(2,minmax(0,1fr))}.summary-strip-four-up{grid-template-columns:repeat(4,minmax(0,1fr))}.summary-card{padding:.8rem .9rem;border-radius:16px}.uploads-summary-strip{grid-template-columns:repeat(3,minmax(0,1fr))}.dashboard-main-column,.dashboard-side-column,.summary-stack{display:grid;gap:.9rem}.dashboard-main-panel,.dashboard-side-panel{align-content:start}.panel{border-radius:18px;padding:.88rem}.main-panel,.detail-panel,.explorer-panel{background:#ffffffb8}.files-page-layout{display:grid;grid-template-columns:minmax(0,1fr) 290px;gap:10px;align-items:stretch;min-height:calc(100vh - 132px)}.files-main-shell{display:grid;grid-template-columns:176px minmax(0,1fr);gap:0;padding:0;overflow:hidden;min-height:100%}.files-local-nav{display:grid;align-content:start;gap:.9rem;padding:.88rem;border-right:1px solid var(--border);background:#f9fafbe6;min-height:100%}.files-local-nav-list{display:grid;gap:.28rem}.files-sidebar-section{display:grid;gap:.45rem}.files-sidebar-label{color:var(--muted);font-size:.76rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.files-local-link{color:var(--ink);background:transparent;border:1px solid transparent;box-shadow:none;justify-content:flex-start;text-align:left;padding:.5rem .62rem;font-weight:600;border-radius:8px}.files-local-link.active,.files-local-link:hover{background:#2563eb14;border-color:#2563eb1a}.files-tree-card{padding:0;border:0;border-radius:0;background:transparent}.files-content-shell{padding:.88rem;min-height:100%;display:grid;align-content:start}.explorer-panel,.detail-panel{min-height:520px}.explorer-panel{padding:.9rem}.uploads-primary-panel{display:grid;gap:1rem}.uploads-dropzone{grid-template-columns:minmax(0,1fr) minmax(260px,320px);align-items:start}.uploads-dropzone-copy,.uploads-target-inline{display:grid;gap:.45rem}.uploads-queue-section{display:grid;gap:.7rem}.uploads-side-panel{position:sticky;top:16px;align-self:start}.jobs-list-shell{display:grid;gap:0}.jobs-list-header{margin-top:0}.jobs-row-meta{min-width:220px;grid-template-columns:88px 52px auto;align-items:center;gap:.7rem}.status-chip{display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:.24rem .5rem;border-radius:999px;border:1px solid rgba(15,23,42,.08);background:#f8fafceb;color:var(--muted);font-size:.76rem;font-weight:700}.status-chip-success{color:var(--success);border-color:#0f9f6e29;background:#ecfdf5eb}.storage-status-row{display:flex;flex-wrap:wrap;gap:.45rem;margin-top:.5rem}.storage-actions{margin-top:auto}.detail-panel{position:sticky;top:16px;align-self:start;padding:.75rem;min-height:100%;display:grid;align-content:start}.panel-toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:.85rem}.compact-toolbar{align-items:center}.files-header{display:grid;gap:.18rem}.files-command-bar{align-items:center;justify-content:flex-end}.files-toolbar{display:grid;gap:.7rem;margin:.72rem 0 .82rem}.files-toolbar-top{align-items:start}.list-surface{border:1px solid var(--border);border-radius:12px;background:#fff;padding:.25rem .35rem .35rem}.list-header{display:grid;grid-template-columns:minmax(0,1fr) 140px 90px 88px;gap:1rem;padding:.2rem .6rem .45rem;color:var(--muted);font-size:.74rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;border-bottom:1px solid rgba(17,24,39,.06)}.list-header-actions{text-align:right}.pagination-bar{display:flex;align-items:center;justify-content:space-between;gap:.8rem;padding-top:.7rem}.pagination-copy{color:var(--muted);font-size:.88rem;font-weight:600}.drive-list-tight{gap:.55rem}.drive-list,.drive-grid,.list-table{display:grid;gap:0}.drive-grid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.card-grid,.page-card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px;align-items:start}.storage-card{display:grid;align-content:start;gap:.7rem}.drive-item,.table-row{width:100%;text-align:left;color:var(--ink);border:0;border-bottom:1px solid rgba(17,24,39,.06);border-radius:0;padding:.78rem .6rem;background:#fff;display:flex;align-items:center;justify-content:space-between;gap:1rem;box-shadow:none}.drive-item{cursor:pointer;transition:background .12s ease}.drive-item:hover{background:#f8fafce0}.drive-item.active{background:#eff6ffd1;box-shadow:inset 2px 0 #2563ebe6}.drive-item-main,.drive-item-meta,.table-row>div,.table-meta,.meta-list,.action-stack{display:grid;gap:.28rem}.drive-item-meta,.table-meta{justify-items:end;color:var(--muted)}.drive-item-meta{min-width:220px;grid-template-columns:112px 72px auto;align-items:center;gap:.6rem}.drive-item-meta>span{white-space:nowrap;text-align:right}.row-actions{position:relative;display:flex;align-items:center;justify-content:flex-end;gap:.25rem}.row-action-button{opacity:0;pointer-events:none;transition:opacity .12s ease;padding:.24rem .48rem;min-height:30px}.drive-item:hover .row-action-button,.drive-item.active .row-action-button{opacity:1;pointer-events:auto}.item-badge{display:inline-flex;width:fit-content;padding:.18rem .5rem;border-radius:999px;background:#2563eb12;color:var(--accent-strong);font-size:.7rem;font-weight:700}.item-muted{color:var(--muted);font-size:.92rem}.meta-list{margin:.85rem 0}.compact-meta-list{margin:0}.meta-list>div{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;padding:.7rem 0;border-bottom:1px solid rgba(15,23,42,.06)}.meta-list>div>span{min-width:0;flex:0 0 auto}.meta-list>div>strong{min-width:0;max-width:58%;text-align:right;overflow-wrap:anywhere;word-break:break-word}.preview-frame{width:100%;min-height:210px;border:1px solid var(--border);border-radius:14px;background:var(--bg-deep);object-fit:cover}.preview-fallback,.detail-empty,.empty-state,.page-loading,.dropzone{display:grid;gap:.8rem;border:1px dashed rgba(15,23,42,.1);border-radius:14px;padding:1rem;background:#f8fafceb}.empty-state-rich{justify-items:start}.empty-state-actions{display:flex;flex-wrap:wrap;gap:.7rem}.detail-panel .section-heading p{margin-top:.2rem}.inspector-hero{display:flex;align-items:flex-start;justify-content:space-between;gap:.8rem;padding:.78rem;border:1px solid rgba(17,24,39,.06);border-radius:10px;background:#fff;margin:.8rem 0 .7rem}.inspector-tabs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.25rem;margin-top:.75rem;padding-bottom:.55rem;border-bottom:1px solid rgba(17,24,39,.06)}.inspector-tab{color:var(--muted);background:transparent;border:1px solid transparent;box-shadow:none;font-weight:600;padding:.48rem .42rem}.inspector-tab.active{color:var(--ink);background:#2563eb14;border-color:#2563eb1a}.detail-tab-panel{margin-top:.75rem}.inspector-hero-main{display:grid;gap:.32rem}.inspector-status-block{min-width:96px;display:grid;gap:.22rem;justify-items:end}.inspector-section{display:grid;gap:.7rem;margin-top:1rem}.inspector-card,.inspector-meta-card{padding:.12rem .72rem;border:1px solid rgba(15,23,42,.06);border-radius:10px;background:#fff}.inspector-chip-row{display:flex;flex-wrap:wrap;gap:.5rem;padding-top:.75rem;padding-bottom:.75rem}.inspector-chip{display:inline-flex;align-items:center;padding:.34rem .58rem;border-radius:999px;border:1px solid var(--border);background:#f8fafceb;color:var(--muted);font-size:.78rem;font-weight:600}.action-stack{margin-top:1rem;gap:.4rem}.action-stack button,.action-stack .ghost-button,.action-stack .danger-button{width:100%;justify-content:center}.detail-actions{gap:.2rem}.detail-action-secondary{background:transparent;color:var(--ink);border:1px solid transparent;box-shadow:none}.detail-action-secondary:hover{background:#f8fafceb;box-shadow:none}.artifact-list{margin-top:1.1rem}.artifact-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.66rem 0;border-bottom:1px solid rgba(15,23,42,.06)}.notice-text{color:var(--success)}.error-text{color:var(--danger)}.inline-link{color:var(--accent-strong);font-weight:600}.breadcrumbs{display:flex;align-items:center;gap:.45rem;flex-wrap:wrap;margin-top:.45rem}.inline-metrics{display:flex;flex-wrap:wrap;gap:.45rem;margin-top:.25rem}.inline-metrics span{display:inline-flex;align-items:center;padding:.22rem .48rem;border:1px solid rgba(15,23,42,.06);border-radius:999px;background:#f8fafce0;color:var(--muted);font-size:.74rem;font-weight:600}.crumb-button,.compact-button{padding:.34rem .58rem;font-size:.84rem}.crumb-button{border-radius:6px}.upload-strip{display:grid;gap:.65rem;margin-bottom:1rem}.upload-pill{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.78rem .95rem;border:1px solid var(--border);border-radius:14px;background:#fffc}.dialog-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;padding:1.5rem;display:grid;place-items:center;background:#0f172a38;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.dialog-card{width:min(520px,100%);padding:1.2rem;border-radius:18px;border:1px solid var(--border);background:var(--surface-strong);box-shadow:var(--shadow)}.dialog-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.dialog-actions{display:flex;justify-content:flex-end;gap:.75rem}.filter-bar{display:grid;grid-template-columns:minmax(0,1fr) 220px;gap:.8rem}.search-shell{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:.6rem}.toast-stack{position:fixed;left:50%;bottom:1rem;transform:translate(-50%);display:grid;gap:.65rem;z-index:40;justify-items:center}.toast-item{min-width:220px;max-width:360px;padding:.74rem .88rem;border-radius:14px;box-shadow:var(--shadow-soft);border:1px solid var(--border);background:var(--surface-strong)}.menu-popover{position:absolute;top:calc(100% + 8px);right:0;min-width:170px;padding:.35rem;border:1px solid var(--border);border-radius:14px;background:#fffffff5;box-shadow:var(--shadow-soft);display:grid;gap:.25rem;z-index:30}.menu-item{justify-content:flex-start;color:var(--ink);background:transparent;border:0;box-shadow:none;padding:.54rem .66rem}.menu-item:hover{background:#2563eb0f;box-shadow:none}.menu-item.danger{color:var(--danger)}.mono-text{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;display:block;font-size:.78rem;line-height:1.4;overflow-wrap:anywhere;word-break:break-all}.toast-success{border-color:#0f9f6e38}.toast-error{border-color:#dc262638}.tree-root,.tree-children{display:grid;gap:.28rem}.tree-node{display:grid;gap:.14rem}.tree-row{display:flex;align-items:center;gap:.35rem;padding:.12rem 0;border-radius:8px}.tree-row.active{background:#2563eb14}.tree-toggle,.tree-label{padding:.18rem .34rem}.tree-toggle{min-width:28px;border-radius:7px;background:#f8fafcf5}.tree-label{flex:1;text-align:left;background:transparent;font-size:.92rem}.move-picker{display:grid;gap:1rem}.move-tree{border:1px solid var(--border);border-radius:14px;padding:.9rem;background:#f8fafceb}@media(max-width:1100px){.app-shell,.login-page,.uploads-page-grid,.dashboard-page-grid,.files-page-layout,.files-main-shell,.content-grid,.uploads-dropzone{grid-template-columns:1fr}}@media(max-width:720px){.app-shell,.login-page{padding:1rem}.topbar,.panel-toolbar,.summary-strip,.summary-strip-two-up,.summary-strip-four-up,.drive-item,.table-row{flex-direction:column;align-items:stretch}.drive-item-meta,.table-meta{justify-items:start}.filter-bar{grid-template-columns:1fr}.search-shell,.selection-bar{grid-template-columns:1fr;flex-direction:column;align-items:stretch}.list-header{display:none}.drive-item-meta{grid-template-columns:1fr}} +:root{--bg: #f6f8fb;--bg-deep: #eef2f6;--surface: rgba(255, 255, 255, .84);--surface-strong: rgba(255, 255, 255, .98);--surface-soft: rgba(248, 250, 252, .94);--ink: #111827;--muted: #6b7280;--accent: #2563eb;--accent-strong: #1e40af;--success: #0f9f6e;--warning: #d97706;--danger: #dc2626;--border: rgba(17, 24, 39, .08);--border-strong: rgba(17, 24, 39, .12);--shadow: 0 20px 48px rgba(15, 23, 42, .08);--shadow-soft: 0 8px 24px rgba(15, 23, 42, .05)}*{box-sizing:border-box}html,body,#root{min-height:100%}body{margin:0;color:var(--ink);background:radial-gradient(circle at top left,rgba(37,99,235,.06),transparent 20%),linear-gradient(180deg,#f8fafc,#f4f7fb 52%,#eef2f6);font-family:Manrope,Segoe UI,Helvetica Neue,Arial,sans-serif;line-height:1.45}button,input,select,textarea,iframe,video{font:inherit}a{color:inherit;text-decoration:none}button{border:1px solid transparent;border-radius:12px;padding:.72rem .95rem;cursor:pointer;color:#f8fbff;background:linear-gradient(180deg,#2d6df6 0%,var(--accent-strong) 100%);box-shadow:0 8px 18px #2563eb24;transition:transform .14s ease,opacity .14s ease,box-shadow .14s ease}button:hover{transform:translateY(-1px);box-shadow:0 10px 20px #2563eb2e}button:disabled{opacity:.6;cursor:wait}input,select,textarea{width:100%;border:1px solid var(--border);border-radius:12px;padding:.78rem .92rem;background:var(--surface-strong);color:var(--ink)}textarea{resize:vertical;min-height:180px;font-family:SFMono-Regular,Consolas,Liberation Mono,monospace;font-size:.88rem}.ghost-button,.crumb-button,.tree-toggle,.tree-label{color:var(--ink);background:#fffc;border:1px solid var(--border);box-shadow:none}.danger-button{background:linear-gradient(180deg,#ef4444 0%,var(--danger) 100%);box-shadow:0 10px 22px #dc262624}.eyebrow,.metric-label{display:block;text-transform:uppercase;letter-spacing:.12em;font-size:.68rem;font-weight:700;color:var(--muted)}.app-shell{min-height:100vh;display:grid;grid-template-columns:208px minmax(0,1fr);gap:12px;padding:14px;max-width:1480px;margin:0 auto}.sidebar{display:grid;align-content:start;gap:.65rem;padding:.85rem;border:1px solid var(--border);border-radius:20px;background:#ffffffad;-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);box-shadow:var(--shadow-soft)}.brand-block{display:grid;gap:.68rem}.brand-block-compact{gap:.2rem}.brand-block h1,.topbar h2,.section-heading h2,.section-heading h3,.panel-toolbar h3{margin:.3rem 0 0}.brand-block h1{font-size:clamp(1.2rem,1.8vw,1.8rem);line-height:1.06;max-width:none;overflow-wrap:anywhere}.brand-block p,.sidebar-card p,.login-hero p,.detail-empty p,.preview-fallback p,.dropzone p{color:var(--muted);line-height:1.5;margin:0}.main-nav{display:grid;gap:.22rem;margin:.1rem 0 .45rem}.nav-link{padding:.6rem .72rem;border-radius:10px;color:var(--ink);font-weight:600;font-size:.95rem}.nav-link.active{background:linear-gradient(180deg,#2563eb1f,#2563eb0a);border:1px solid rgba(37,99,235,.14);color:#0f3ca7}.sidebar-card,.panel,.login-card,.login-hero,.summary-card{border:1px solid var(--border);background:var(--surface);box-shadow:var(--shadow-soft);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.sidebar-card{padding:.8rem .86rem .9rem;border-radius:16px;margin-top:auto}.workspace{padding:.1rem 0}.topbar{display:flex;align-items:center;justify-content:space-between;gap:.8rem;padding:.1rem .15rem}.topbar h2{font-size:1.35rem;line-height:1.05}.topbar-title{display:grid;gap:.1rem}.topbar-actions,.toolbar-group{display:flex;gap:.55rem;flex-wrap:wrap}.topbar-actions .ghost-button{border-radius:999px;background:#ffffffeb}.workspace-content{margin-top:.9rem;padding-bottom:1.5rem}.login-page{min-height:100vh;display:grid;grid-template-columns:1.15fr minmax(320px,460px);gap:1.5rem;padding:1.5rem}.login-hero,.login-card{border-radius:28px;padding:2rem}.hero-metrics{margin-top:2rem;display:grid;gap:1rem}.hero-metrics article{padding:1rem 1.1rem;border-radius:18px;background:#ffffff85;border:1px solid var(--border)}.stack-form,.stack-page,.uploads-main{display:grid;gap:1rem}.uploads-main{align-content:start}.section-heading{display:grid;gap:.12rem}.panel-toolbar h3,.section-heading h2,.section-heading h3,.files-header h3{line-height:1.15}.content-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:10px}.uploads-page-grid{display:grid;grid-template-columns:minmax(0,1.58fr) minmax(280px,.68fr);gap:12px;align-items:start}.dashboard-page-grid{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:12px;align-items:start}.compact-page-shell{width:min(100%,1040px);display:grid;gap:.9rem;margin-right:auto}.compact-page-shell-wide{width:min(100%,1180px)}.summary-strip{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem}.summary-strip-two-up{grid-template-columns:repeat(2,minmax(0,1fr))}.summary-strip-four-up{grid-template-columns:repeat(4,minmax(0,1fr))}.summary-card{padding:.8rem .9rem;border-radius:16px}.uploads-summary-strip{grid-template-columns:repeat(3,minmax(0,1fr))}.dashboard-main-column,.dashboard-side-column,.summary-stack{display:grid;gap:.9rem}.dashboard-main-panel,.dashboard-side-panel{align-content:start}.panel{border-radius:18px;padding:.88rem}.main-panel,.detail-panel,.explorer-panel{background:#ffffffb8}.files-page-layout{display:grid;grid-template-columns:minmax(0,1fr) 290px;gap:10px;align-items:stretch;min-height:calc(100vh - 132px)}.files-main-shell{display:grid;grid-template-columns:176px minmax(0,1fr);gap:0;padding:0;overflow:hidden;min-height:100%}.files-local-nav{display:grid;align-content:start;gap:.9rem;padding:.88rem;border-right:1px solid var(--border);background:#f9fafbe6;min-height:100%}.files-local-nav-list{display:grid;gap:.28rem}.files-sidebar-section{display:grid;gap:.45rem}.files-sidebar-label{color:var(--muted);font-size:.76rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em}.files-local-link{color:var(--ink);background:transparent;border:1px solid transparent;box-shadow:none;justify-content:flex-start;text-align:left;padding:.5rem .62rem;font-weight:600;border-radius:8px}.files-local-link.active,.files-local-link:hover{background:#2563eb14;border-color:#2563eb1a}.files-tree-card{padding:0;border:0;border-radius:0;background:transparent}.files-content-shell{padding:.88rem;min-height:100%;display:grid;align-content:start}.explorer-panel,.detail-panel{min-height:520px}.explorer-panel{padding:.9rem}.uploads-primary-panel{display:grid;gap:1rem}.uploads-dropzone{grid-template-columns:minmax(0,1fr) minmax(260px,320px);align-items:start}.uploads-dropzone-copy,.uploads-target-inline{display:grid;gap:.45rem}.uploads-queue-section{display:grid;gap:.7rem}.uploads-side-panel{position:sticky;top:16px;align-self:start}.jobs-list-shell{display:grid;gap:0}.jobs-list-header{margin-top:0}.jobs-row-meta{min-width:220px;grid-template-columns:88px 52px auto;align-items:center;gap:.7rem}.status-chip{display:inline-flex;align-items:center;justify-content:center;width:fit-content;padding:.24rem .5rem;border-radius:999px;border:1px solid rgba(15,23,42,.08);background:#f8fafceb;color:var(--muted);font-size:.76rem;font-weight:700}.status-chip-success{color:var(--success);border-color:#0f9f6e29;background:#ecfdf5eb}.storage-status-row{display:flex;flex-wrap:wrap;gap:.45rem;margin-top:.5rem}.storage-actions{margin-top:auto}.detail-panel{position:sticky;top:16px;align-self:start;padding:.75rem;min-height:100%;display:grid;align-content:start}.panel-toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:.85rem}.compact-toolbar{align-items:center}.files-header{display:grid;gap:.18rem}.files-command-bar{align-items:center;justify-content:flex-end}.files-toolbar{display:grid;gap:.7rem;margin:.72rem 0 .82rem}.files-toolbar-top{align-items:start}.list-surface{border:1px solid var(--border);border-radius:12px;background:#fff;padding:.25rem .35rem .35rem}.list-header{display:grid;grid-template-columns:minmax(0,1fr) 140px 90px 88px;gap:1rem;padding:.2rem .6rem .45rem;color:var(--muted);font-size:.74rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;border-bottom:1px solid rgba(17,24,39,.06)}.list-header-actions{text-align:right}.pagination-bar{display:flex;align-items:center;justify-content:space-between;gap:.8rem;padding-top:.7rem}.pagination-copy{color:var(--muted);font-size:.88rem;font-weight:600}.drive-list-tight{gap:.55rem}.drive-list,.drive-grid,.list-table{display:grid;gap:0}.drive-grid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.card-grid,.page-card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px;align-items:start}.storage-card{display:grid;align-content:start;gap:.7rem}.drive-item,.table-row{width:100%;text-align:left;color:var(--ink);border:0;border-bottom:1px solid rgba(17,24,39,.06);border-radius:0;padding:.78rem .6rem;background:#fff;display:flex;align-items:center;justify-content:space-between;gap:1rem;box-shadow:none}.drive-item{cursor:pointer;transition:background .12s ease}.drive-item:hover{background:#f8fafce0}.drive-item.active{background:#eff6ffd1;box-shadow:inset 2px 0 #2563ebe6}.drive-item-main,.drive-item-meta,.table-row>div,.table-meta,.meta-list,.action-stack{display:grid;gap:.28rem}.drive-item-meta,.table-meta{justify-items:end;color:var(--muted)}.drive-item-meta{min-width:220px;grid-template-columns:112px 72px auto;align-items:center;gap:.6rem}.drive-item-meta>span{white-space:nowrap;text-align:right}.row-actions{position:relative;display:flex;align-items:center;justify-content:flex-end;gap:.25rem}.row-action-button{opacity:0;pointer-events:none;transition:opacity .12s ease;padding:.24rem .48rem;min-height:30px}.drive-item:hover .row-action-button,.drive-item.active .row-action-button{opacity:1;pointer-events:auto}.item-badge{display:inline-flex;width:fit-content;padding:.18rem .5rem;border-radius:999px;background:#2563eb12;color:var(--accent-strong);font-size:.7rem;font-weight:700}.item-muted{color:var(--muted);font-size:.92rem}.meta-list{margin:.85rem 0}.compact-meta-list{margin:0}.meta-list>div{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;padding:.7rem 0;border-bottom:1px solid rgba(15,23,42,.06)}.meta-list>div>span{min-width:0;flex:0 0 auto}.meta-list>div>strong{min-width:0;max-width:58%;text-align:right;overflow-wrap:anywhere;word-break:break-word}.preview-frame{width:100%;min-height:210px;border:1px solid var(--border);border-radius:14px;background:var(--bg-deep);object-fit:cover}.preview-fallback,.detail-empty,.empty-state,.page-loading,.dropzone{display:grid;gap:.8rem;border:1px dashed rgba(15,23,42,.1);border-radius:14px;padding:1rem;background:#f8fafceb}.empty-state-rich{justify-items:start}.empty-state-actions{display:flex;flex-wrap:wrap;gap:.7rem}.detail-panel .section-heading p{margin-top:.2rem}.inspector-hero{display:flex;align-items:flex-start;justify-content:space-between;gap:.8rem;padding:.78rem;border:1px solid rgba(17,24,39,.06);border-radius:10px;background:#fff;margin:.8rem 0 .7rem}.inspector-tabs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.25rem;margin-top:.75rem;padding-bottom:.55rem;border-bottom:1px solid rgba(17,24,39,.06)}.inspector-tab{color:var(--muted);background:transparent;border:1px solid transparent;box-shadow:none;font-weight:600;padding:.48rem .42rem}.inspector-tab.active{color:var(--ink);background:#2563eb14;border-color:#2563eb1a}.detail-tab-panel{margin-top:.75rem}.inspector-hero-main{display:grid;gap:.32rem}.inspector-status-block{min-width:96px;display:grid;gap:.22rem;justify-items:end}.inspector-section{display:grid;gap:.7rem;margin-top:1rem}.inspector-card,.inspector-meta-card{padding:.12rem .72rem;border:1px solid rgba(15,23,42,.06);border-radius:10px;background:#fff}.inspector-chip-row{display:flex;flex-wrap:wrap;gap:.5rem;padding-top:.75rem;padding-bottom:.75rem}.inspector-chip{display:inline-flex;align-items:center;padding:.34rem .58rem;border-radius:999px;border:1px solid var(--border);background:#f8fafceb;color:var(--muted);font-size:.78rem;font-weight:600}.action-stack{margin-top:1rem;gap:.4rem}.action-stack button,.action-stack .ghost-button,.action-stack .danger-button{width:100%;justify-content:center}.detail-actions{gap:.2rem}.detail-action-secondary{background:transparent;color:var(--ink);border:1px solid transparent;box-shadow:none}.detail-action-secondary:hover{background:#f8fafceb;box-shadow:none}.artifact-list{margin-top:1.1rem}.artifact-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.66rem 0;border-bottom:1px solid rgba(15,23,42,.06)}.storage-summary-card{display:grid;gap:0}.storage-summary-card>div,.replica-row{display:flex;align-items:flex-start;justify-content:space-between;gap:.8rem;padding:.66rem 0;border-bottom:1px solid rgba(15,23,42,.06)}.storage-summary-card>div>span{color:var(--muted);font-size:.82rem;font-weight:700}.storage-summary-card>div>strong{text-align:right}.replica-list{display:grid;gap:0}.replica-row>div{min-width:0;display:grid;gap:.18rem}.replica-row strong{overflow-wrap:anywhere}.replica-warning-card{border-color:#d977062e;background:#fffbebfa}.replica-warning-card strong{display:block;margin-top:.72rem}.replica-warning-card p{margin:.18rem 0 .72rem}.notice-text{color:var(--success)}.error-text{color:var(--danger)}.inline-link{color:var(--accent-strong);font-weight:600}.breadcrumbs{display:flex;align-items:center;gap:.45rem;flex-wrap:wrap;margin-top:.45rem}.inline-metrics{display:flex;flex-wrap:wrap;gap:.45rem;margin-top:.25rem}.inline-metrics span{display:inline-flex;align-items:center;padding:.22rem .48rem;border:1px solid rgba(15,23,42,.06);border-radius:999px;background:#f8fafce0;color:var(--muted);font-size:.74rem;font-weight:600}.crumb-button,.compact-button{padding:.34rem .58rem;font-size:.84rem}.crumb-button{border-radius:6px}.upload-strip{display:grid;gap:.65rem;margin-bottom:1rem}.upload-pill{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.78rem .95rem;border:1px solid var(--border);border-radius:14px;background:#fffc}.dialog-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;padding:1.5rem;display:grid;place-items:center;background:#0f172a38;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.dialog-card{width:min(520px,100%);padding:1.2rem;border-radius:18px;border:1px solid var(--border);background:var(--surface-strong);box-shadow:var(--shadow)}.dialog-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.dialog-actions{display:flex;justify-content:flex-end;gap:.75rem}.dialog-form{display:grid;gap:.85rem}.dialog-form label{display:grid;gap:.35rem;color:var(--muted);font-size:.82rem;font-weight:700}.split-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.8rem}.storage-toolbar{margin-bottom:1rem;flex-wrap:wrap}.policy-tabs{display:flex;flex-wrap:wrap;gap:.5rem;margin:0 0 1rem}.policy-tab{color:var(--ink);background:#fffc;border:1px solid var(--border);box-shadow:none}.policy-tab.active{color:#f8fbff;background:linear-gradient(180deg,#2d6df6 0%,var(--accent-strong) 100%);box-shadow:0 8px 18px #2563eb24}.policy-editor{display:grid;gap:1rem}.policy-editor-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.8rem}.policy-editor-grid label{display:grid;gap:.35rem;color:var(--muted);font-size:.82rem;font-weight:700}.checkbox-field{display:inline-flex!important;align-items:center;gap:.55rem!important;color:var(--ink)!important}.checkbox-field input{width:18px;height:18px;flex:0 0 auto}.backend-policy-list,.decision-list{display:grid;gap:.65rem}.backend-policy-row,.decision-backend{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.72rem 0;border-bottom:1px solid rgba(15,23,42,.06)}.backend-policy-row>div:first-child,.decision-backend{min-width:0}.backend-policy-row strong,.decision-backend strong{display:block;overflow-wrap:anywhere}.backend-policy-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.7rem}.compact-checkbox{font-size:.82rem;font-weight:700}.decision-backend span{color:var(--muted);font-size:.82rem;font-weight:700}.filter-bar{display:grid;grid-template-columns:minmax(0,1fr) 220px;gap:.8rem}.search-shell{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:.6rem}.toast-stack{position:fixed;left:50%;bottom:1rem;transform:translate(-50%);display:grid;gap:.65rem;z-index:40;justify-items:center}.toast-item{min-width:220px;max-width:360px;padding:.74rem .88rem;border-radius:14px;box-shadow:var(--shadow-soft);border:1px solid var(--border);background:var(--surface-strong)}.menu-popover{position:absolute;top:calc(100% + 8px);right:0;min-width:170px;padding:.35rem;border:1px solid var(--border);border-radius:14px;background:#fffffff5;box-shadow:var(--shadow-soft);display:grid;gap:.25rem;z-index:30}.menu-item{justify-content:flex-start;color:var(--ink);background:transparent;border:0;box-shadow:none;padding:.54rem .66rem}.menu-item:hover{background:#2563eb0f;box-shadow:none}.menu-item.danger{color:var(--danger)}.mono-text{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;display:block;font-size:.78rem;line-height:1.4;overflow-wrap:anywhere;word-break:break-all}.toast-success{border-color:#0f9f6e38}.toast-error{border-color:#dc262638}.tree-root,.tree-children{display:grid;gap:.28rem}.tree-node{display:grid;gap:.14rem}.tree-row{display:flex;align-items:center;gap:.35rem;padding:.12rem 0;border-radius:8px}.tree-row.active{background:#2563eb14}.tree-toggle,.tree-label{padding:.18rem .34rem}.tree-toggle{min-width:28px;border-radius:7px;background:#f8fafcf5}.tree-label{flex:1;text-align:left;background:transparent;font-size:.92rem}.move-picker{display:grid;gap:1rem}.move-tree{border:1px solid var(--border);border-radius:14px;padding:.9rem;background:#f8fafceb}@media(max-width:1100px){.app-shell,.login-page,.uploads-page-grid,.dashboard-page-grid,.files-page-layout,.files-main-shell,.content-grid,.uploads-dropzone{grid-template-columns:1fr}}@media(max-width:720px){.app-shell,.login-page{padding:1rem}.topbar,.panel-toolbar,.summary-strip,.summary-strip-two-up,.summary-strip-four-up,.drive-item,.table-row{flex-direction:column;align-items:stretch}.drive-item-meta,.table-meta{justify-items:start}.filter-bar{grid-template-columns:1fr}.search-shell,.selection-bar{grid-template-columns:1fr;flex-direction:column;align-items:stretch}.list-header{display:none}.drive-item-meta{grid-template-columns:1fr}} diff --git a/app/web/dist/assets/app.js b/app/web/dist/assets/app.js index 0b77462..f0c1c6d 100644 --- a/app/web/dist/assets/app.js +++ b/app/web/dist/assets/app.js @@ -1,4 +1,4 @@ -var d0=Object.defineProperty;var Wy=n=>{throw TypeError(n)};var h0=(n,i,r)=>i in n?d0(n,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):n[i]=r;var Py=(n,i,r)=>h0(n,typeof i!="symbol"?i+"":i,r),hf=(n,i,r)=>i.has(n)||Wy("Cannot "+r);var j=(n,i,r)=>(hf(n,i,"read from private field"),r?r.call(n):i.get(n)),ge=(n,i,r)=>i.has(n)?Wy("Cannot add the same private member more than once"):i instanceof WeakSet?i.add(n):i.set(n,r),ue=(n,i,r,c)=>(hf(n,i,"write to private field"),c?c.call(n,r):i.set(n,r),r),we=(n,i,r)=>(hf(n,i,"access private method"),r);var Hs=(n,i,r,c)=>({set _(o){ue(n,i,o,r)},get _(){return j(n,i,c)}});function m0(n,i){for(var r=0;rc[o]})}}}return Object.freeze(Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}))}(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))c(o);new MutationObserver(o=>{for(const f of o)if(f.type==="childList")for(const m of f.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&c(m)}).observe(document,{childList:!0,subtree:!0});function r(o){const f={};return o.integrity&&(f.integrity=o.integrity),o.referrerPolicy&&(f.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?f.credentials="include":o.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function c(o){if(o.ep)return;o.ep=!0;const f=r(o);fetch(o.href,f)}})();function sp(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var mf={exports:{}},Ju={};/** +var b0=Object.defineProperty;var Iy=n=>{throw TypeError(n)};var S0=(n,i,s)=>i in n?b0(n,i,{enumerable:!0,configurable:!0,writable:!0,value:s}):n[i]=s;var ep=(n,i,s)=>S0(n,typeof i!="symbol"?i+"":i,s),pf=(n,i,s)=>i.has(n)||Iy("Cannot "+s);var N=(n,i,s)=>(pf(n,i,"read from private field"),s?s.call(n):i.get(n)),Ee=(n,i,s)=>i.has(n)?Iy("Cannot add the same private member more than once"):i instanceof WeakSet?i.add(n):i.set(n,s),oe=(n,i,s,c)=>(pf(n,i,"write to private field"),c?c.call(n,s):i.set(n,s),s),Ue=(n,i,s)=>(pf(n,i,"access private method"),s);var qu=(n,i,s,c)=>({set _(f){oe(n,i,f,s)},get _(){return N(n,i,c)}});function x0(n,i){for(var s=0;sc[f]})}}}return Object.freeze(Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}))}(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))c(f);new MutationObserver(f=>{for(const d of f)if(d.type==="childList")for(const m of d.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&c(m)}).observe(document,{childList:!0,subtree:!0});function s(f){const d={};return f.integrity&&(d.integrity=f.integrity),f.referrerPolicy&&(d.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?d.credentials="include":f.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function c(f){if(f.ep)return;f.ep=!0;const d=s(f);fetch(f.href,d)}})();function yv(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var vf={exports:{}},Wr={};/** * @license React * react-jsx-runtime.production.js * @@ -6,7 +6,7 @@ var d0=Object.defineProperty;var Wy=n=>{throw TypeError(n)};var h0=(n,i,r)=>i in * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Iy;function y0(){if(Iy)return Ju;Iy=1;var n=Symbol.for("react.transitional.element"),i=Symbol.for("react.fragment");function r(c,o,f){var m=null;if(f!==void 0&&(m=""+f),o.key!==void 0&&(m=""+o.key),"key"in o){f={};for(var y in o)y!=="key"&&(f[y]=o[y])}else f=o;return o=f.ref,{$$typeof:n,type:c,key:m,ref:o!==void 0?o:null,props:f}}return Ju.Fragment=i,Ju.jsx=r,Ju.jsxs=r,Ju}var ev;function v0(){return ev||(ev=1,mf.exports=y0()),mf.exports}var h=v0(),yf={exports:{}},Me={};/** + */var tp;function j0(){if(tp)return Wr;tp=1;var n=Symbol.for("react.transitional.element"),i=Symbol.for("react.fragment");function s(c,f,d){var m=null;if(d!==void 0&&(m=""+d),f.key!==void 0&&(m=""+f.key),"key"in f){d={};for(var y in f)y!=="key"&&(d[y]=f[y])}else d=f;return f=d.ref,{$$typeof:n,type:c,key:m,ref:f!==void 0?f:null,props:d}}return Wr.Fragment=i,Wr.jsx=s,Wr.jsxs=s,Wr}var ap;function E0(){return ap||(ap=1,vf.exports=j0()),vf.exports}var o=E0(),gf={exports:{}},we={};/** * @license React * react.production.js * @@ -14,7 +14,7 @@ var d0=Object.defineProperty;var Wy=n=>{throw TypeError(n)};var h0=(n,i,r)=>i in * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var tv;function p0(){if(tv)return Me;tv=1;var n=Symbol.for("react.transitional.element"),i=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),c=Symbol.for("react.strict_mode"),o=Symbol.for("react.profiler"),f=Symbol.for("react.consumer"),m=Symbol.for("react.context"),y=Symbol.for("react.forward_ref"),g=Symbol.for("react.suspense"),v=Symbol.for("react.memo"),S=Symbol.for("react.lazy"),b=Symbol.for("react.activity"),C=Symbol.iterator;function M(T){return T===null||typeof T!="object"?null:(T=C&&T[C]||T["@@iterator"],typeof T=="function"?T:null)}var H={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},w=Object.assign,q={};function X(T,Y,P){this.props=T,this.context=Y,this.refs=q,this.updater=P||H}X.prototype.isReactComponent={},X.prototype.setState=function(T,Y){if(typeof T!="object"&&typeof T!="function"&&T!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,T,Y,"setState")},X.prototype.forceUpdate=function(T){this.updater.enqueueForceUpdate(this,T,"forceUpdate")};function J(){}J.prototype=X.prototype;function F(T,Y,P){this.props=T,this.context=Y,this.refs=q,this.updater=P||H}var W=F.prototype=new J;W.constructor=F,w(W,X.prototype),W.isPureReactComponent=!0;var ae=Array.isArray;function oe(){}var ne={H:null,A:null,T:null,S:null},D=Object.prototype.hasOwnProperty;function ie(T,Y,P){var ee=P.ref;return{$$typeof:n,type:T,key:Y,ref:ee!==void 0?ee:null,props:P}}function ye(T,Y){return ie(T.type,Y,T.props)}function Re(T){return typeof T=="object"&&T!==null&&T.$$typeof===n}function Ee(T){var Y={"=":"=0",":":"=2"};return"$"+T.replace(/[=:]/g,function(P){return Y[P]})}var Ae=/\/+/g;function qe(T,Y){return typeof T=="object"&&T!==null&&T.key!=null?Ee(""+T.key):Y.toString(36)}function xe(T){switch(T.status){case"fulfilled":return T.value;case"rejected":throw T.reason;default:switch(typeof T.status=="string"?T.then(oe,oe):(T.status="pending",T.then(function(Y){T.status==="pending"&&(T.status="fulfilled",T.value=Y)},function(Y){T.status==="pending"&&(T.status="rejected",T.reason=Y)})),T.status){case"fulfilled":return T.value;case"rejected":throw T.reason}}throw T}function A(T,Y,P,ee,pe){var Se=typeof T;(Se==="undefined"||Se==="boolean")&&(T=null);var Oe=!1;if(T===null)Oe=!0;else switch(Se){case"bigint":case"string":case"number":Oe=!0;break;case"object":switch(T.$$typeof){case n:case i:Oe=!0;break;case S:return Oe=T._init,A(Oe(T._payload),Y,P,ee,pe)}}if(Oe)return pe=pe(T),Oe=ee===""?"."+qe(T,0):ee,ae(pe)?(P="",Oe!=null&&(P=Oe.replace(Ae,"$&/")+"/"),A(pe,Y,P,"",function(nl){return nl})):pe!=null&&(Re(pe)&&(pe=ye(pe,P+(pe.key==null||T&&T.key===pe.key?"":(""+pe.key).replace(Ae,"$&/")+"/")+Oe)),Y.push(pe)),1;Oe=0;var dt=ee===""?".":ee+":";if(ae(T))for(var Ze=0;Ze{throw TypeError(n)};var h0=(n,i,r)=>i in * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var lv;function b0(){return lv||(lv=1,(function(n){function i(A,k){var ce=A.length;A.push(k);e:for(;0>>1,Te=A[re];if(0>>1;reo(P,ce))eeo(pe,P)?(A[re]=pe,A[ee]=ce,re=ee):(A[re]=P,A[Y]=ce,re=Y);else if(eeo(pe,ce))A[re]=pe,A[ee]=ce,re=ee;else break e}}return k}function o(A,k){var ce=A.sortIndex-k.sortIndex;return ce!==0?ce:A.id-k.id}if(n.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var f=performance;n.unstable_now=function(){return f.now()}}else{var m=Date,y=m.now();n.unstable_now=function(){return m.now()-y}}var g=[],v=[],S=1,b=null,C=3,M=!1,H=!1,w=!1,q=!1,X=typeof setTimeout=="function"?setTimeout:null,J=typeof clearTimeout=="function"?clearTimeout:null,F=typeof setImmediate<"u"?setImmediate:null;function W(A){for(var k=r(v);k!==null;){if(k.callback===null)c(v);else if(k.startTime<=A)c(v),k.sortIndex=k.expirationTime,i(g,k);else break;k=r(v)}}function ae(A){if(w=!1,W(A),!H)if(r(g)!==null)H=!0,oe||(oe=!0,Ee());else{var k=r(v);k!==null&&xe(ae,k.startTime-A)}}var oe=!1,ne=-1,D=5,ie=-1;function ye(){return q?!0:!(n.unstable_now()-ieA&&ye());){var re=b.callback;if(typeof re=="function"){b.callback=null,C=b.priorityLevel;var Te=re(b.expirationTime<=A);if(A=n.unstable_now(),typeof Te=="function"){b.callback=Te,W(A),k=!0;break t}b===r(g)&&c(g),W(A)}else c(g);b=r(g)}if(b!==null)k=!0;else{var T=r(v);T!==null&&xe(ae,T.startTime-A),k=!1}}break e}finally{b=null,C=ce,M=!1}k=void 0}}finally{k?Ee():oe=!1}}}var Ee;if(typeof F=="function")Ee=function(){F(Re)};else if(typeof MessageChannel<"u"){var Ae=new MessageChannel,qe=Ae.port2;Ae.port1.onmessage=Re,Ee=function(){qe.postMessage(null)}}else Ee=function(){X(Re,0)};function xe(A,k){ne=X(function(){A(n.unstable_now())},k)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(A){A.callback=null},n.unstable_forceFrameRate=function(A){0>A||125re?(A.sortIndex=ce,i(v,A),r(g)===null&&A===r(v)&&(w?(J(ne),ne=-1):w=!0,xe(ae,ce-re))):(A.sortIndex=Te,i(g,A),H||M||(H=!0,oe||(oe=!0,Ee()))),A},n.unstable_shouldYield=ye,n.unstable_wrapCallback=function(A){var k=C;return function(){var ce=C;C=k;try{return A.apply(this,arguments)}finally{C=ce}}}})(gf)),gf}var nv;function S0(){return nv||(nv=1,pf.exports=b0()),pf.exports}var bf={exports:{}},Vt={};/** + */var ip;function C0(){return ip||(ip=1,(function(n){function i(z,V){var re=z.length;z.push(V);e:for(;0>>1,Ne=z[se];if(0>>1;sef(q,re))eef(he,q)?(z[se]=he,z[ee]=re,se=ee):(z[se]=q,z[K]=re,se=K);else if(eef(he,re))z[se]=he,z[ee]=re,se=ee;else break e}}return V}function f(z,V){var re=z.sortIndex-V.sortIndex;return re!==0?re:z.id-V.id}if(n.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;n.unstable_now=function(){return d.now()}}else{var m=Date,y=m.now();n.unstable_now=function(){return m.now()-y}}var g=[],p=[],x=1,b=null,_=3,C=!1,A=!1,D=!1,L=!1,X=typeof setTimeout=="function"?setTimeout:null,W=typeof clearTimeout=="function"?clearTimeout:null,F=typeof setImmediate<"u"?setImmediate:null;function P(z){for(var V=s(p);V!==null;){if(V.callback===null)c(p);else if(V.startTime<=z)c(p),V.sortIndex=V.expirationTime,i(g,V);else break;V=s(p)}}function ae(z){if(D=!1,P(z),!A)if(s(g)!==null)A=!0,fe||(fe=!0,xe());else{var V=s(p);V!==null&&je(ae,V.startTime-z)}}var fe=!1,ne=-1,O=5,le=-1;function ie(){return L?!0:!(n.unstable_now()-lez&&ie());){var se=b.callback;if(typeof se=="function"){b.callback=null,_=b.priorityLevel;var Ne=se(b.expirationTime<=z);if(z=n.unstable_now(),typeof Ne=="function"){b.callback=Ne,P(z),V=!0;break t}b===s(g)&&c(g),P(z)}else c(g);b=s(g)}if(b!==null)V=!0;else{var R=s(p);R!==null&&je(ae,R.startTime-z),V=!1}}break e}finally{b=null,_=re,C=!1}V=void 0}}finally{V?xe():fe=!1}}}var xe;if(typeof F=="function")xe=function(){F(Se)};else if(typeof MessageChannel<"u"){var _e=new MessageChannel,De=_e.port2;_e.port1.onmessage=Se,xe=function(){De.postMessage(null)}}else xe=function(){X(Se,0)};function je(z,V){ne=X(function(){z(n.unstable_now())},V)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(z){z.callback=null},n.unstable_forceFrameRate=function(z){0>z||125se?(z.sortIndex=re,i(p,z),s(g)===null&&z===s(p)&&(D?(W(ne),ne=-1):D=!0,je(ae,re-se))):(z.sortIndex=Ne,i(g,z),A||C||(A=!0,fe||(fe=!0,xe()))),z},n.unstable_shouldYield=ie,n.unstable_wrapCallback=function(z){var V=_;return function(){var re=_;_=V;try{return z.apply(this,arguments)}finally{_=re}}}})(xf)),xf}var rp;function T0(){return rp||(rp=1,Sf.exports=C0()),Sf.exports}var jf={exports:{}},Zt={};/** * @license React * react-dom.production.js * @@ -30,7 +30,7 @@ var d0=Object.defineProperty;var Wy=n=>{throw TypeError(n)};var h0=(n,i,r)=>i in * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var iv;function x0(){if(iv)return Vt;iv=1;var n=Vf();function i(g){var v="https://react.dev/errors/"+g;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(i){console.error(i)}}return n(),bf.exports=x0(),bf.exports}/** + */var sp;function _0(){if(sp)return Zt;sp=1;var n=Ff();function i(g){var p="https://react.dev/errors/"+g;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(i){console.error(i)}}return n(),jf.exports=_0(),jf.exports}/** * @license React * react-dom-client.production.js * @@ -38,15 +38,15 @@ var d0=Object.defineProperty;var Wy=n=>{throw TypeError(n)};var h0=(n,i,r)=>i in * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var rv;function E0(){if(rv)return ku;rv=1;var n=S0(),i=Vf(),r=op();function c(e){var t="https://react.dev/errors/"+e;if(1Te||(e.current=re[Te],re[Te]=null,Te--)}function P(e,t){Te++,re[Te]=e.current,e.current=t}var ee=T(null),pe=T(null),Se=T(null),Oe=T(null);function dt(e,t){switch(P(Se,t),P(pe,e),P(ee,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Sy(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Sy(t),e=xy(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}Y(ee),P(ee,e)}function Ze(){Y(ee),Y(pe),Y(Se)}function nl(e){e.memoizedState!==null&&P(Oe,e);var t=ee.current,a=xy(t,e.type);t!==a&&(P(pe,e),P(ee,a))}function ba(e){pe.current===e&&(Y(ee),Y(pe)),Oe.current===e&&(Y(Oe),Ku._currentValue=ce)}var Yt,gt;function Gt(e){if(Yt===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);Yt=t&&t[1]||"",gt=-1Ne||(e.current=se[Ne],se[Ne]=null,Ne--)}function q(e,t){Ne++,se[Ne]=e.current,e.current=t}var ee=R(null),he=R(null),ge=R(null),Me=R(null);function ot(e,t){switch(q(ge,t),q(he,e),q(ee,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?jy(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=jy(t),e=Ey(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}K(ee),q(ee,e)}function He(){K(ee),K(he),K(ge)}function fa(e){e.memoizedState!==null&&q(Me,e);var t=ee.current,a=Ey(t,e.type);t!==a&&(q(he,e),q(ee,a))}function Ja(e){he.current===e&&(K(ee),K(he)),Me.current===e&&(K(Me),Zr._currentValue=re)}var ea,Je;function At(e){if(ea===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);ea=t&&t[1]||"",Je=-1)":-1u||x[l]!==U[u]){var K=` -`+x[l].replace(" at new "," at ");return e.displayName&&K.includes("")&&(K=K.replace("",e.displayName)),K}while(1<=l&&0<=u);break}}}finally{il=!1,Error.prepareStackTrace=a}return(a=e?e.displayName||e.name:"")?Gt(a):""}function Sa(e,t){switch(e.tag){case 26:case 27:case 5:return Gt(e.type);case 16:return Gt("Lazy");case 13:return e.child!==t&&t!==null?Gt("Suspense Fallback"):Gt("Suspense");case 19:return Gt("SuspenseList");case 0:case 15:return Al(e.type,!1);case 11:return Al(e.type.render,!1);case 1:return Al(e.type,!0);case 31:return Gt("Activity");default:return""}}function jn(e){try{var t="",a=null;do t+=Sa(e,a),a=e,e=e.return;while(e);return t}catch(l){return` +`+ea+e+Je}var $a=!1;function Ya(e,t){if(!e||$a)return"";$a=!0;var a=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var l={DetermineComponentFrameRoot:function(){try{if(t){var $=function(){throw Error()};if(Object.defineProperty($.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct($,[])}catch(G){var Y=G}Reflect.construct(e,[],$)}else{try{$.call()}catch(G){Y=G}e.call($.prototype)}}else{try{throw Error()}catch(G){Y=G}($=e())&&typeof $.catch=="function"&&$.catch(function(){})}}catch(G){if(G&&Y&&typeof G.stack=="string")return[G.stack,Y.stack]}return[null,null]}};l.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var r=Object.getOwnPropertyDescriptor(l.DetermineComponentFrameRoot,"name");r&&r.configurable&&Object.defineProperty(l.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var u=l.DetermineComponentFrameRoot(),h=u[0],v=u[1];if(h&&v){var j=h.split(` +`),H=v.split(` +`);for(r=l=0;lr||j[l]!==H[r]){var k=` +`+j[l].replace(" at new "," at ");return e.displayName&&k.includes("")&&(k=k.replace("",e.displayName)),k}while(1<=l&&0<=r);break}}}finally{$a=!1,Error.prepareStackTrace=a}return(a=e?e.displayName||e.name:"")?At(a):""}function J(e,t){switch(e.tag){case 26:case 27:case 5:return At(e.type);case 16:return At("Lazy");case 13:return e.child!==t&&t!==null?At("Suspense Fallback"):At("Suspense");case 19:return At("SuspenseList");case 0:case 15:return Ya(e.type,!1);case 11:return Ya(e.type.render,!1);case 1:return Ya(e.type,!0);case 31:return At("Activity");default:return""}}function da(e){try{var t="",a=null;do t+=J(e,a),a=e,e=e.return;while(e);return t}catch(l){return` Error generating stack: `+l.message+` -`+l.stack}}var G=Object.prototype.hasOwnProperty,Ke=n.unstable_scheduleCallback,nt=n.unstable_cancelCallback,ht=n.unstable_shouldYield,It=n.unstable_requestPaint,zt=n.unstable_now,Jt=n.unstable_getCurrentPriorityLevel,xa=n.unstable_ImmediatePriority,iu=n.unstable_UserBlockingPriority,_l=n.unstable_NormalPriority,Ba=n.unstable_LowPriority,Ea=n.unstable_IdlePriority,Sr=n.log,ac=n.unstable_setDisableYieldValue,ul=null,kt=null;function At(e){if(typeof Sr=="function"&&ac(e),kt&&typeof kt.setStrictMode=="function")try{kt.setStrictMode(ul,e)}catch{}}var Xt=Math.clz32?Math.clz32:lc,xr=Math.log,Er=Math.LN2;function lc(e){return e>>>=0,e===0?32:31-(xr(e)/Er|0)|0}var Rn=256,rl=262144,Tn=4194304;function qa(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ni(e,t,a){var l=e.pendingLanes;if(l===0)return 0;var u=0,s=e.suspendedLanes,d=e.pingedLanes;e=e.warmLanes;var p=l&134217727;return p!==0?(l=p&~s,l!==0?u=qa(l):(d&=p,d!==0?u=qa(d):a||(a=p&~e,a!==0&&(u=qa(a))))):(p=l&~s,p!==0?u=qa(p):d!==0?u=qa(d):a||(a=l&~e,a!==0&&(u=qa(a)))),u===0?0:t!==0&&t!==u&&(t&s)===0&&(s=u&-u,a=t&-t,s>=a||s===32&&(a&4194048)!==0)?t:u}function Ul(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function nc(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function uu(){var e=Tn;return Tn<<=1,(Tn&62914560)===0&&(Tn=4194304),e}function Ll(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function Za(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function jr(e,t,a,l,u,s){var d=e.pendingLanes;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=a,e.entangledLanes&=a,e.errorRecoveryDisabledLanes&=a,e.shellSuspendCounter=0;var p=e.entanglements,x=e.expirationTimes,U=e.hiddenUpdates;for(a=d&~a;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var ug=/[\n"\\]/g;function ja(e){return e.replace(ug,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function ic(e,t,a,l,u,s,d,p){e.name="",d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"?e.type=d:e.removeAttribute("type"),t!=null?d==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Tt(t)):e.value!==""+Tt(t)&&(e.value=""+Tt(t)):d!=="submit"&&d!=="reset"||e.removeAttribute("value"),t!=null?uc(e,d,Tt(t)):a!=null?uc(e,d,Tt(a)):l!=null&&e.removeAttribute("value"),u==null&&s!=null&&(e.defaultChecked=!!s),u!=null&&(e.checked=u&&typeof u!="function"&&typeof u!="symbol"),p!=null&&typeof p!="function"&&typeof p!="symbol"&&typeof p!="boolean"?e.name=""+Tt(p):e.removeAttribute("name")}function md(e,t,a,l,u,s,d,p){if(s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"&&(e.type=s),t!=null||a!=null){if(!(s!=="submit"&&s!=="reset"||t!=null)){ri(e);return}a=a!=null?""+Tt(a):"",t=t!=null?""+Tt(t):a,p||t===e.value||(e.value=t),e.defaultValue=t}l=l??u,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=p?e.checked:!!l,e.defaultChecked=!!l,d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"&&(e.name=d),ri(e)}function uc(e,t,a){t==="number"&&Mr(e.ownerDocument)===e||e.defaultValue===""+a||(e.defaultValue=""+a)}function si(e,t,a,l){if(e=e.options,t){t={};for(var u=0;u"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),fc=!1;if(cl)try{var su={};Object.defineProperty(su,"passive",{get:function(){fc=!0}}),window.addEventListener("test",su,su),window.removeEventListener("test",su,su)}catch{fc=!1}var Bl=null,dc=null,Or=null;function xd(){if(Or)return Or;var e,t=dc,a=t.length,l,u="value"in Bl?Bl.value:Bl.textContent,s=u.length;for(e=0;e=fu),Md=" ",Cd=!1;function Od(e,t){switch(e){case"keyup":return _g.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function zd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var di=!1;function Lg(e,t){switch(e){case"compositionend":return zd(t);case"keypress":return t.which!==32?null:(Cd=!0,Md);case"textInput":return e=t.data,e===Md&&Cd?null:e;default:return null}}function Hg(e,t){if(di)return e==="compositionend"||!pc&&Od(e,t)?(e=xd(),Or=dc=Bl=null,di=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:a,offset:t-e};e=l}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=Bd(a)}}function Qd(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Qd(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Yd(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Mr(e.document);t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=Mr(e.document)}return t}function Sc(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var Vg=cl&&"documentMode"in document&&11>=document.documentMode,hi=null,xc=null,yu=null,Ec=!1;function Gd(e,t,a){var l=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Ec||hi==null||hi!==Mr(l)||(l=hi,"selectionStart"in l&&Sc(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),yu&&mu(yu,l)||(yu=l,l=Es(xc,"onSelect"),0>=d,u-=d,ka=1<<32-Xt(t)+u|a<De?(Ye=me,me=null):Ye=me.sibling;var Je=B(z,me,_[De],V);if(Je===null){me===null&&(me=Ye);break}e&&me&&Je.alternate===null&&t(z,me),N=s(Je,N,De),Fe===null?be=Je:Fe.sibling=Je,Fe=Je,me=Ye}if(De===_.length)return a(z,me),Ge&&fl(z,De),be;if(me===null){for(;De<_.length;De++)me=Z(z,_[De],V),me!==null&&(N=s(me,N,De),Fe===null?be=me:Fe.sibling=me,Fe=me);return Ge&&fl(z,De),be}for(me=l(me);De<_.length;De++)Ye=Q(me,z,De,_[De],V),Ye!==null&&(e&&Ye.alternate!==null&&me.delete(Ye.key===null?De:Ye.key),N=s(Ye,N,De),Fe===null?be=Ye:Fe.sibling=Ye,Fe=Ye);return e&&me.forEach(function(rn){return t(z,rn)}),Ge&&fl(z,De),be}function je(z,N,_,V){if(_==null)throw Error(c(151));for(var be=null,Fe=null,me=N,De=N=0,Ye=null,Je=_.next();me!==null&&!Je.done;De++,Je=_.next()){me.index>De?(Ye=me,me=null):Ye=me.sibling;var rn=B(z,me,Je.value,V);if(rn===null){me===null&&(me=Ye);break}e&&me&&rn.alternate===null&&t(z,me),N=s(rn,N,De),Fe===null?be=rn:Fe.sibling=rn,Fe=rn,me=Ye}if(Je.done)return a(z,me),Ge&&fl(z,De),be;if(me===null){for(;!Je.done;De++,Je=_.next())Je=Z(z,Je.value,V),Je!==null&&(N=s(Je,N,De),Fe===null?be=Je:Fe.sibling=Je,Fe=Je);return Ge&&fl(z,De),be}for(me=l(me);!Je.done;De++,Je=_.next())Je=Q(me,z,De,Je.value,V),Je!==null&&(e&&Je.alternate!==null&&me.delete(Je.key===null?De:Je.key),N=s(Je,N,De),Fe===null?be=Je:Fe.sibling=Je,Fe=Je);return e&&me.forEach(function(f0){return t(z,f0)}),Ge&&fl(z,De),be}function tt(z,N,_,V){if(typeof _=="object"&&_!==null&&_.type===w&&_.key===null&&(_=_.props.children),typeof _=="object"&&_!==null){switch(_.$$typeof){case M:e:{for(var be=_.key;N!==null;){if(N.key===be){if(be=_.type,be===w){if(N.tag===7){a(z,N.sibling),V=u(N,_.props.children),V.return=z,z=V;break e}}else if(N.elementType===be||typeof be=="object"&&be!==null&&be.$$typeof===D&&Hn(be)===N.type){a(z,N.sibling),V=u(N,_.props),xu(V,_),V.return=z,z=V;break e}a(z,N);break}else t(z,N);N=N.sibling}_.type===w?(V=wn(_.props.children,z.mode,V,_.key),V.return=z,z=V):(V=qr(_.type,_.key,_.props,null,z.mode,V),xu(V,_),V.return=z,z=V)}return d(z);case H:e:{for(be=_.key;N!==null;){if(N.key===be)if(N.tag===4&&N.stateNode.containerInfo===_.containerInfo&&N.stateNode.implementation===_.implementation){a(z,N.sibling),V=u(N,_.children||[]),V.return=z,z=V;break e}else{a(z,N);break}else t(z,N);N=N.sibling}V=Oc(_,z.mode,V),V.return=z,z=V}return d(z);case D:return _=Hn(_),tt(z,N,_,V)}if(xe(_))return fe(z,N,_,V);if(Ee(_)){if(be=Ee(_),typeof be!="function")throw Error(c(150));return _=be.call(_),je(z,N,_,V)}if(typeof _.then=="function")return tt(z,N,Zr(_),V);if(_.$$typeof===F)return tt(z,N,Gr(z,_),V);Fr(z,_)}return typeof _=="string"&&_!==""||typeof _=="number"||typeof _=="bigint"?(_=""+_,N!==null&&N.tag===6?(a(z,N.sibling),V=u(N,_),V.return=z,z=V):(a(z,N),V=Cc(_,z.mode,V),V.return=z,z=V),d(z)):a(z,N)}return function(z,N,_,V){try{Su=0;var be=tt(z,N,_,V);return Ri=null,be}catch(me){if(me===ji||me===Kr)throw me;var Fe=oa(29,me,null,z.mode);return Fe.lanes=V,Fe.return=z,Fe}finally{}}}var qn=fh(!0),dh=fh(!1),Xl=!1;function Yc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Gc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Kl(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Vl(e,t,a){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(ke&2)!==0){var u=l.pending;return u===null?t.next=t:(t.next=u.next,u.next=t),l.pending=t,t=Br(e),kd(e,null,a),t}return Hr(e,l,t,a),Br(e)}function Eu(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,Tr(e,a)}}function Xc(e,t){var a=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,a===l)){var u=null,s=null;if(a=a.firstBaseUpdate,a!==null){do{var d={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};s===null?u=s=d:s=s.next=d,a=a.next}while(a!==null);s===null?u=s=t:s=s.next=t}else u=s=t;a={baseState:l.baseState,firstBaseUpdate:u,lastBaseUpdate:s,shared:l.shared,callbacks:l.callbacks},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}var Kc=!1;function ju(){if(Kc){var e=Ei;if(e!==null)throw e}}function Ru(e,t,a,l){Kc=!1;var u=e.updateQueue;Xl=!1;var s=u.firstBaseUpdate,d=u.lastBaseUpdate,p=u.shared.pending;if(p!==null){u.shared.pending=null;var x=p,U=x.next;x.next=null,d===null?s=U:d.next=U,d=x;var K=e.alternate;K!==null&&(K=K.updateQueue,p=K.lastBaseUpdate,p!==d&&(p===null?K.firstBaseUpdate=U:p.next=U,K.lastBaseUpdate=x))}if(s!==null){var Z=u.baseState;d=0,K=U=x=null,p=s;do{var B=p.lane&-536870913,Q=B!==p.lane;if(Q?(Qe&B)===B:(l&B)===B){B!==0&&B===xi&&(Kc=!0),K!==null&&(K=K.next={lane:0,tag:p.tag,payload:p.payload,callback:null,next:null});e:{var fe=e,je=p;B=t;var tt=a;switch(je.tag){case 1:if(fe=je.payload,typeof fe=="function"){Z=fe.call(tt,Z,B);break e}Z=fe;break e;case 3:fe.flags=fe.flags&-65537|128;case 0:if(fe=je.payload,B=typeof fe=="function"?fe.call(tt,Z,B):fe,B==null)break e;Z=b({},Z,B);break e;case 2:Xl=!0}}B=p.callback,B!==null&&(e.flags|=64,Q&&(e.flags|=8192),Q=u.callbacks,Q===null?u.callbacks=[B]:Q.push(B))}else Q={lane:B,tag:p.tag,payload:p.payload,callback:p.callback,next:null},K===null?(U=K=Q,x=Z):K=K.next=Q,d|=B;if(p=p.next,p===null){if(p=u.shared.pending,p===null)break;Q=p,p=Q.next,Q.next=null,u.lastBaseUpdate=Q,u.shared.pending=null}}while(!0);K===null&&(x=Z),u.baseState=x,u.firstBaseUpdate=U,u.lastBaseUpdate=K,s===null&&(u.shared.lanes=0),$l|=d,e.lanes=d,e.memoizedState=Z}}function hh(e,t){if(typeof e!="function")throw Error(c(191,e));e.call(t)}function mh(e,t){var a=e.callbacks;if(a!==null)for(e.callbacks=null,e=0;es?s:8;var d=A.T,p={};A.T=p,co(e,!1,t,a);try{var x=u(),U=A.S;if(U!==null&&U(p,x),x!==null&&typeof x=="object"&&typeof x.then=="function"){var K=eb(x,l);Mu(e,t,K,ya(e))}else Mu(e,t,l,ya(e))}catch(Z){Mu(e,t,{then:function(){},status:"rejected",reason:Z},ya())}finally{k.p=s,d!==null&&p.types!==null&&(d.types=p.types),A.T=d}}function ub(){}function ro(e,t,a,l){if(e.tag!==5)throw Error(c(476));var u=Zh(e).queue;Vh(e,u,t,ce,a===null?ub:function(){return Fh(e),a(l)})}function Zh(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:ce,baseState:ce,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:yl,lastRenderedState:ce},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:yl,lastRenderedState:a},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Fh(e){var t=Zh(e);t.next===null&&(t=e.alternate.memoizedState),Mu(e,t.next.queue,{},ya())}function so(){return Bt(Ku)}function Jh(){return xt().memoizedState}function kh(){return xt().memoizedState}function rb(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var a=ya();e=Kl(a);var l=Vl(t,e,a);l!==null&&(ia(l,t,a),Eu(l,t,a)),t={cache:Hc()},e.payload=t;return}t=t.return}}function sb(e,t,a){var l=ya();a={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},ls(e)?Wh(t,a):(a=Nc(e,t,a,l),a!==null&&(ia(a,e,l),Ph(a,t,l)))}function $h(e,t,a){var l=ya();Mu(e,t,a,l)}function Mu(e,t,a,l){var u={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(ls(e))Wh(t,u);else{var s=e.alternate;if(e.lanes===0&&(s===null||s.lanes===0)&&(s=t.lastRenderedReducer,s!==null))try{var d=t.lastRenderedState,p=s(d,a);if(u.hasEagerState=!0,u.eagerState=p,ca(p,d))return Hr(e,t,u,0),lt===null&&Lr(),!1}catch{}finally{}if(a=Nc(e,t,u,l),a!==null)return ia(a,e,l),Ph(a,t,l),!0}return!1}function co(e,t,a,l){if(l={lane:2,revertLane:Go(),gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},ls(e)){if(t)throw Error(c(479))}else t=Nc(e,a,l,2),t!==null&&ia(t,e,2)}function ls(e){var t=e.alternate;return e===Ce||t!==null&&t===Ce}function Wh(e,t){Ni=$r=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function Ph(e,t,a){if((a&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,Tr(e,a)}}var Cu={readContext:Bt,use:Ir,useCallback:yt,useContext:yt,useEffect:yt,useImperativeHandle:yt,useLayoutEffect:yt,useInsertionEffect:yt,useMemo:yt,useReducer:yt,useRef:yt,useState:yt,useDebugValue:yt,useDeferredValue:yt,useTransition:yt,useSyncExternalStore:yt,useId:yt,useHostTransitionStatus:yt,useFormState:yt,useActionState:yt,useOptimistic:yt,useMemoCache:yt,useCacheRefresh:yt};Cu.useEffectEvent=yt;var Ih={readContext:Bt,use:Ir,useCallback:function(e,t){return $t().memoizedState=[e,t===void 0?null:t],e},useContext:Bt,useEffect:Lh,useImperativeHandle:function(e,t,a){a=a!=null?a.concat([e]):null,ts(4194308,4,Qh.bind(null,t,e),a)},useLayoutEffect:function(e,t){return ts(4194308,4,e,t)},useInsertionEffect:function(e,t){ts(4,2,e,t)},useMemo:function(e,t){var a=$t();t=t===void 0?null:t;var l=e();if(Qn){At(!0);try{e()}finally{At(!1)}}return a.memoizedState=[l,t],l},useReducer:function(e,t,a){var l=$t();if(a!==void 0){var u=a(t);if(Qn){At(!0);try{a(t)}finally{At(!1)}}}else u=t;return l.memoizedState=l.baseState=u,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:u},l.queue=e,e=e.dispatch=sb.bind(null,Ce,e),[l.memoizedState,e]},useRef:function(e){var t=$t();return e={current:e},t.memoizedState=e},useState:function(e){e=ao(e);var t=e.queue,a=$h.bind(null,Ce,t);return t.dispatch=a,[e.memoizedState,a]},useDebugValue:io,useDeferredValue:function(e,t){var a=$t();return uo(a,e,t)},useTransition:function(){var e=ao(!1);return e=Vh.bind(null,Ce,e.queue,!0,!1),$t().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,a){var l=Ce,u=$t();if(Ge){if(a===void 0)throw Error(c(407));a=a()}else{if(a=t(),lt===null)throw Error(c(349));(Qe&127)!==0||Sh(l,t,a)}u.memoizedState=a;var s={value:a,getSnapshot:t};return u.queue=s,Lh(Eh.bind(null,l,s,e),[e]),l.flags|=2048,Ci(9,{destroy:void 0},xh.bind(null,l,s,a,t),null),a},useId:function(){var e=$t(),t=lt.identifierPrefix;if(Ge){var a=$a,l=ka;a=(l&~(1<<32-Xt(l)-1)).toString(32)+a,t="_"+t+"R_"+a,a=Wr++,0<\/script>",s=s.removeChild(s.firstChild);break;case"select":s=typeof l.is=="string"?d.createElement("select",{is:l.is}):d.createElement("select"),l.multiple?s.multiple=!0:l.size&&(s.size=l.size);break;default:s=typeof l.is=="string"?d.createElement(u,{is:l.is}):d.createElement(u)}}s[te]=t,s[he]=l;e:for(d=t.child;d!==null;){if(d.tag===5||d.tag===6)s.appendChild(d.stateNode);else if(d.tag!==4&&d.tag!==27&&d.child!==null){d.child.return=d,d=d.child;continue}if(d===t)break e;for(;d.sibling===null;){if(d.return===null||d.return===t)break e;d=d.return}d.sibling.return=d.return,d=d.sibling}t.stateNode=s;e:switch(Qt(s,u,l),u){case"button":case"input":case"select":case"textarea":l=!!l.autoFocus;break e;case"img":l=!0;break e;default:l=!1}l&&pl(t)}}return ct(t),Ro(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,a),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==l&&pl(t);else{if(typeof l!="string"&&t.stateNode===null)throw Error(c(166));if(e=Se.current,bi(t)){if(e=t.stateNode,a=t.memoizedProps,l=null,u=Ht,u!==null)switch(u.tag){case 27:case 5:l=u.memoizedProps}e[te]=t,e=!!(e.nodeValue===a||l!==null&&l.suppressHydrationWarning===!0||gy(e.nodeValue,a)),e||Yl(t,!0)}else e=js(e).createTextNode(l),e[te]=t,t.stateNode=e}return ct(t),null;case 31:if(a=t.memoizedState,e===null||e.memoizedState!==null){if(l=bi(t),a!==null){if(e===null){if(!l)throw Error(c(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(c(557));e[te]=t}else An(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;ct(t),e=!1}else a=Ac(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),e=!0;if(!e)return t.flags&256?(da(t),t):(da(t),null);if((t.flags&128)!==0)throw Error(c(558))}return ct(t),null;case 13:if(l=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(u=bi(t),l!==null&&l.dehydrated!==null){if(e===null){if(!u)throw Error(c(318));if(u=t.memoizedState,u=u!==null?u.dehydrated:null,!u)throw Error(c(317));u[te]=t}else An(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;ct(t),u=!1}else u=Ac(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=u),u=!0;if(!u)return t.flags&256?(da(t),t):(da(t),null)}return da(t),(t.flags&128)!==0?(t.lanes=a,t):(a=l!==null,e=e!==null&&e.memoizedState!==null,a&&(l=t.child,u=null,l.alternate!==null&&l.alternate.memoizedState!==null&&l.alternate.memoizedState.cachePool!==null&&(u=l.alternate.memoizedState.cachePool.pool),s=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(s=l.memoizedState.cachePool.pool),s!==u&&(l.flags|=2048)),a!==e&&a&&(t.child.flags|=8192),ss(t,t.updateQueue),ct(t),null);case 4:return Ze(),e===null&&Zo(t.stateNode.containerInfo),ct(t),null;case 10:return hl(t.type),ct(t),null;case 19:if(Y(St),l=t.memoizedState,l===null)return ct(t),null;if(u=(t.flags&128)!==0,s=l.rendering,s===null)if(u)zu(l,!1);else{if(vt!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(s=kr(e),s!==null){for(t.flags|=128,zu(l,!1),e=s.updateQueue,t.updateQueue=e,ss(t,e),t.subtreeFlags=0,e=a,a=t.child;a!==null;)$d(a,e),a=a.sibling;return P(St,St.current&1|2),Ge&&fl(t,l.treeForkCount),t.child}e=e.sibling}l.tail!==null&&zt()>hs&&(t.flags|=128,u=!0,zu(l,!1),t.lanes=4194304)}else{if(!u)if(e=kr(s),e!==null){if(t.flags|=128,u=!0,e=e.updateQueue,t.updateQueue=e,ss(t,e),zu(l,!0),l.tail===null&&l.tailMode==="hidden"&&!s.alternate&&!Ge)return ct(t),null}else 2*zt()-l.renderingStartTime>hs&&a!==536870912&&(t.flags|=128,u=!0,zu(l,!1),t.lanes=4194304);l.isBackwards?(s.sibling=t.child,t.child=s):(e=l.last,e!==null?e.sibling=s:t.child=s,l.last=s)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=zt(),e.sibling=null,a=St.current,P(St,u?a&1|2:a&1),Ge&&fl(t,l.treeForkCount),e):(ct(t),null);case 22:case 23:return da(t),Zc(),l=t.memoizedState!==null,e!==null?e.memoizedState!==null!==l&&(t.flags|=8192):l&&(t.flags|=8192),l?(a&536870912)!==0&&(t.flags&128)===0&&(ct(t),t.subtreeFlags&6&&(t.flags|=8192)):ct(t),a=t.updateQueue,a!==null&&ss(t,a.retryQueue),a=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),l=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),l!==a&&(t.flags|=2048),e!==null&&Y(Ln),null;case 24:return a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),hl(Nt),ct(t),null;case 25:return null;case 30:return null}throw Error(c(156,t.tag))}function hb(e,t){switch(Dc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return hl(Nt),Ze(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ba(t),null;case 31:if(t.memoizedState!==null){if(da(t),t.alternate===null)throw Error(c(340));An()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(da(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(c(340));An()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Y(St),null;case 4:return Ze(),null;case 10:return hl(t.type),null;case 22:case 23:return da(t),Zc(),e!==null&&Y(Ln),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return hl(Nt),null;case 25:return null;default:return null}}function jm(e,t){switch(Dc(t),t.tag){case 3:hl(Nt),Ze();break;case 26:case 27:case 5:ba(t);break;case 4:Ze();break;case 31:t.memoizedState!==null&&da(t);break;case 13:da(t);break;case 19:Y(St);break;case 10:hl(t.type);break;case 22:case 23:da(t),Zc(),e!==null&&Y(Ln);break;case 24:hl(Nt)}}function Du(e,t){try{var a=t.updateQueue,l=a!==null?a.lastEffect:null;if(l!==null){var u=l.next;a=u;do{if((a.tag&e)===e){l=void 0;var s=a.create,d=a.inst;l=s(),d.destroy=l}a=a.next}while(a!==u)}}catch(p){Pe(t,t.return,p)}}function Jl(e,t,a){try{var l=t.updateQueue,u=l!==null?l.lastEffect:null;if(u!==null){var s=u.next;l=s;do{if((l.tag&e)===e){var d=l.inst,p=d.destroy;if(p!==void 0){d.destroy=void 0,u=t;var x=a,U=p;try{U()}catch(K){Pe(u,x,K)}}}l=l.next}while(l!==s)}}catch(K){Pe(t,t.return,K)}}function Rm(e){var t=e.updateQueue;if(t!==null){var a=e.stateNode;try{mh(t,a)}catch(l){Pe(e,e.return,l)}}}function Tm(e,t,a){a.props=Yn(e.type,e.memoizedProps),a.state=e.memoizedState;try{a.componentWillUnmount()}catch(l){Pe(e,t,l)}}function wu(e,t){try{var a=e.ref;if(a!==null){switch(e.tag){case 26:case 27:case 5:var l=e.stateNode;break;case 30:l=e.stateNode;break;default:l=e.stateNode}typeof a=="function"?e.refCleanup=a(l):a.current=l}}catch(u){Pe(e,t,u)}}function Wa(e,t){var a=e.ref,l=e.refCleanup;if(a!==null)if(typeof l=="function")try{l()}catch(u){Pe(e,t,u)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(u){Pe(e,t,u)}else a.current=null}function Nm(e){var t=e.type,a=e.memoizedProps,l=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&l.focus();break e;case"img":a.src?l.src=a.src:a.srcSet&&(l.srcset=a.srcSet)}}catch(u){Pe(e,e.return,u)}}function To(e,t,a){try{var l=e.stateNode;Ub(l,e.type,a,t),l[he]=t}catch(u){Pe(e,e.return,u)}}function Mm(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&tn(e.type)||e.tag===4}function No(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Mm(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&tn(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Mo(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(e,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(e),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=sl));else if(l!==4&&(l===27&&tn(e.type)&&(a=e.stateNode,t=null),e=e.child,e!==null))for(Mo(e,t,a),e=e.sibling;e!==null;)Mo(e,t,a),e=e.sibling}function cs(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(l!==4&&(l===27&&tn(e.type)&&(a=e.stateNode),e=e.child,e!==null))for(cs(e,t,a),e=e.sibling;e!==null;)cs(e,t,a),e=e.sibling}function Cm(e){var t=e.stateNode,a=e.memoizedProps;try{for(var l=e.type,u=t.attributes;u.length;)t.removeAttributeNode(u[0]);Qt(t,l,a),t[te]=e,t[he]=a}catch(s){Pe(e,e.return,s)}}var gl=!1,Ot=!1,Co=!1,Om=typeof WeakSet=="function"?WeakSet:Set,Ut=null;function mb(e,t){if(e=e.containerInfo,ko=zs,e=Yd(e),Sc(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var l=a.getSelection&&a.getSelection();if(l&&l.rangeCount!==0){a=l.anchorNode;var u=l.anchorOffset,s=l.focusNode;l=l.focusOffset;try{a.nodeType,s.nodeType}catch{a=null;break e}var d=0,p=-1,x=-1,U=0,K=0,Z=e,B=null;t:for(;;){for(var Q;Z!==a||u!==0&&Z.nodeType!==3||(p=d+u),Z!==s||l!==0&&Z.nodeType!==3||(x=d+l),Z.nodeType===3&&(d+=Z.nodeValue.length),(Q=Z.firstChild)!==null;)B=Z,Z=Q;for(;;){if(Z===e)break t;if(B===a&&++U===u&&(p=d),B===s&&++K===l&&(x=d),(Q=Z.nextSibling)!==null)break;Z=B,B=Z.parentNode}Z=Q}a=p===-1||x===-1?null:{start:p,end:x}}else a=null}a=a||{start:0,end:0}}else a=null;for($o={focusedElem:e,selectionRange:a},zs=!1,Ut=t;Ut!==null;)if(t=Ut,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Ut=e;else for(;Ut!==null;){switch(t=Ut,s=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(a=0;a title"))),Qt(s,l,a),s[te]=e,it(s),l=s;break e;case"link":var d=Uy("link","href",u).get(l+(a.href||""));if(d){for(var p=0;ptt&&(d=tt,tt=je,je=d);var z=qd(p,je),N=qd(p,tt);if(z&&N&&(Q.rangeCount!==1||Q.anchorNode!==z.node||Q.anchorOffset!==z.offset||Q.focusNode!==N.node||Q.focusOffset!==N.offset)){var _=Z.createRange();_.setStart(z.node,z.offset),Q.removeAllRanges(),je>tt?(Q.addRange(_),Q.extend(N.node,N.offset)):(_.setEnd(N.node,N.offset),Q.addRange(_))}}}}for(Z=[],Q=p;Q=Q.parentNode;)Q.nodeType===1&&Z.push({element:Q,left:Q.scrollLeft,top:Q.scrollTop});for(typeof p.focus=="function"&&p.focus(),p=0;pa?32:a,A.T=null,a=Uo,Uo=null;var s=Pl,d=jl;if(Dt=0,Ai=Pl=null,jl=0,(ke&6)!==0)throw Error(c(331));var p=ke;if(ke|=4,Qm(s.current),Hm(s,s.current,d,a),ke=p,Bu(0,!1),kt&&typeof kt.onPostCommitFiberRoot=="function")try{kt.onPostCommitFiberRoot(ul,s)}catch{}return!0}finally{k.p=u,A.T=l,ny(e,t)}}function uy(e,t,a){t=Ta(a,t),t=mo(e.stateNode,t,2),e=Vl(e,t,2),e!==null&&(Za(e,2),Pa(e))}function Pe(e,t,a){if(e.tag===3)uy(e,e,a);else for(;t!==null;){if(t.tag===3){uy(t,e,a);break}else if(t.tag===1){var l=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof l.componentDidCatch=="function"&&(Wl===null||!Wl.has(l))){e=Ta(a,e),a=rm(2),l=Vl(t,a,2),l!==null&&(sm(a,l,t,e),Za(l,2),Pa(l));break}}t=t.return}}function qo(e,t,a){var l=e.pingCache;if(l===null){l=e.pingCache=new pb;var u=new Set;l.set(t,u)}else u=l.get(t),u===void 0&&(u=new Set,l.set(t,u));u.has(a)||(Do=!0,u.add(a),e=Eb.bind(null,e,t,a),t.then(e,e))}function Eb(e,t,a){var l=e.pingCache;l!==null&&l.delete(t),e.pingedLanes|=e.suspendedLanes&a,e.warmLanes&=~a,lt===e&&(Qe&a)===a&&(vt===4||vt===3&&(Qe&62914560)===Qe&&300>zt()-ds?(ke&2)===0&&_i(e,0):wo|=a,wi===Qe&&(wi=0)),Pa(e)}function ry(e,t){t===0&&(t=uu()),e=Dn(e,t),e!==null&&(Za(e,t),Pa(e))}function jb(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),ry(e,a)}function Rb(e,t){var a=0;switch(e.tag){case 31:case 13:var l=e.stateNode,u=e.memoizedState;u!==null&&(a=u.retryLane);break;case 19:l=e.stateNode;break;case 22:l=e.stateNode._retryCache;break;default:throw Error(c(314))}l!==null&&l.delete(t),ry(e,a)}function Tb(e,t){return Ke(e,t)}var bs=null,Li=null,Qo=!1,Ss=!1,Yo=!1,en=0;function Pa(e){e!==Li&&e.next===null&&(Li===null?bs=Li=e:Li=Li.next=e),Ss=!0,Qo||(Qo=!0,Mb())}function Bu(e,t){if(!Yo&&Ss){Yo=!0;do for(var a=!1,l=bs;l!==null;){if(e!==0){var u=l.pendingLanes;if(u===0)var s=0;else{var d=l.suspendedLanes,p=l.pingedLanes;s=(1<<31-Xt(42|e)+1)-1,s&=u&~(d&~p),s=s&201326741?s&201326741|1:s?s|2:0}s!==0&&(a=!0,fy(l,s))}else s=Qe,s=ni(l,l===lt?s:0,l.cancelPendingCommit!==null||l.timeoutHandle!==-1),(s&3)===0||Ul(l,s)||(a=!0,fy(l,s));l=l.next}while(a);Yo=!1}}function Nb(){sy()}function sy(){Ss=Qo=!1;var e=0;en!==0&&Hb()&&(e=en);for(var t=zt(),a=null,l=bs;l!==null;){var u=l.next,s=cy(l,t);s===0?(l.next=null,a===null?bs=u:a.next=u,u===null&&(Li=a)):(a=l,(e!==0||(s&3)!==0)&&(Ss=!0)),l=u}Dt!==0&&Dt!==5||Bu(e),en!==0&&(en=0)}function cy(e,t){for(var a=e.suspendedLanes,l=e.pingedLanes,u=e.expirationTimes,s=e.pendingLanes&-62914561;0p)break;var K=x.transferSize,Z=x.initiatorType;K&&by(Z)&&(x=x.responseEnd,d+=K*(x"u"?null:document;function Dy(e,t,a){var l=Hi;if(l&&typeof t=="string"&&t){var u=ja(t);u='link[rel="'+e+'"][href="'+u+'"]',typeof a=="string"&&(u+='[crossorigin="'+a+'"]'),zy.has(u)||(zy.add(u),e={rel:e,crossOrigin:a,href:t},l.querySelector(u)===null&&(t=l.createElement("link"),Qt(t,"link",e),it(t),l.head.appendChild(t)))}}function Zb(e){Rl.D(e),Dy("dns-prefetch",e,null)}function Fb(e,t){Rl.C(e,t),Dy("preconnect",e,t)}function Jb(e,t,a){Rl.L(e,t,a);var l=Hi;if(l&&e&&t){var u='link[rel="preload"][as="'+ja(t)+'"]';t==="image"&&a&&a.imageSrcSet?(u+='[imagesrcset="'+ja(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(u+='[imagesizes="'+ja(a.imageSizes)+'"]')):u+='[href="'+ja(e)+'"]';var s=u;switch(t){case"style":s=Bi(e);break;case"script":s=qi(e)}Da.has(s)||(e=b({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:e,as:t},a),Da.set(s,e),l.querySelector(u)!==null||t==="style"&&l.querySelector(Gu(s))||t==="script"&&l.querySelector(Xu(s))||(t=l.createElement("link"),Qt(t,"link",e),it(t),l.head.appendChild(t)))}}function kb(e,t){Rl.m(e,t);var a=Hi;if(a&&e){var l=t&&typeof t.as=="string"?t.as:"script",u='link[rel="modulepreload"][as="'+ja(l)+'"][href="'+ja(e)+'"]',s=u;switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":s=qi(e)}if(!Da.has(s)&&(e=b({rel:"modulepreload",href:e},t),Da.set(s,e),a.querySelector(u)===null)){switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(Xu(s)))return}l=a.createElement("link"),Qt(l,"link",e),it(l),a.head.appendChild(l)}}}function $b(e,t,a){Rl.S(e,t,a);var l=Hi;if(l&&e){var u=Rt(l).hoistableStyles,s=Bi(e);t=t||"default";var d=u.get(s);if(!d){var p={loading:0,preload:null};if(d=l.querySelector(Gu(s)))p.loading=5;else{e=b({rel:"stylesheet",href:e,"data-precedence":t},a),(a=Da.get(s))&&lf(e,a);var x=d=l.createElement("link");it(x),Qt(x,"link",e),x._p=new Promise(function(U,K){x.onload=U,x.onerror=K}),x.addEventListener("load",function(){p.loading|=1}),x.addEventListener("error",function(){p.loading|=2}),p.loading|=4,Ts(d,t,l)}d={type:"stylesheet",instance:d,count:1,state:p},u.set(s,d)}}}function Wb(e,t){Rl.X(e,t);var a=Hi;if(a&&e){var l=Rt(a).hoistableScripts,u=qi(e),s=l.get(u);s||(s=a.querySelector(Xu(u)),s||(e=b({src:e,async:!0},t),(t=Da.get(u))&&nf(e,t),s=a.createElement("script"),it(s),Qt(s,"link",e),a.head.appendChild(s)),s={type:"script",instance:s,count:1,state:null},l.set(u,s))}}function Pb(e,t){Rl.M(e,t);var a=Hi;if(a&&e){var l=Rt(a).hoistableScripts,u=qi(e),s=l.get(u);s||(s=a.querySelector(Xu(u)),s||(e=b({src:e,async:!0,type:"module"},t),(t=Da.get(u))&&nf(e,t),s=a.createElement("script"),it(s),Qt(s,"link",e),a.head.appendChild(s)),s={type:"script",instance:s,count:1,state:null},l.set(u,s))}}function wy(e,t,a,l){var u=(u=Se.current)?Rs(u):null;if(!u)throw Error(c(446));switch(e){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Bi(a.href),a=Rt(u).hoistableStyles,l=a.get(t),l||(l={type:"style",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){e=Bi(a.href);var s=Rt(u).hoistableStyles,d=s.get(e);if(d||(u=u.ownerDocument||u,d={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},s.set(e,d),(s=u.querySelector(Gu(e)))&&!s._p&&(d.instance=s,d.state.loading=5),Da.has(e)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},Da.set(e,a),s||Ib(u,e,a,d.state))),t&&l===null)throw Error(c(528,""));return d}if(t&&l!==null)throw Error(c(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=qi(a),a=Rt(u).hoistableScripts,l=a.get(t),l||(l={type:"script",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};default:throw Error(c(444,e))}}function Bi(e){return'href="'+ja(e)+'"'}function Gu(e){return'link[rel="stylesheet"]['+e+"]"}function Ay(e){return b({},e,{"data-precedence":e.precedence,precedence:null})}function Ib(e,t,a,l){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?l.loading=1:(t=e.createElement("link"),l.preload=t,t.addEventListener("load",function(){return l.loading|=1}),t.addEventListener("error",function(){return l.loading|=2}),Qt(t,"link",a),it(t),e.head.appendChild(t))}function qi(e){return'[src="'+ja(e)+'"]'}function Xu(e){return"script[async]"+e}function _y(e,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var l=e.querySelector('style[data-href~="'+ja(a.href)+'"]');if(l)return t.instance=l,it(l),l;var u=b({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return l=(e.ownerDocument||e).createElement("style"),it(l),Qt(l,"style",u),Ts(l,a.precedence,e),t.instance=l;case"stylesheet":u=Bi(a.href);var s=e.querySelector(Gu(u));if(s)return t.state.loading|=4,t.instance=s,it(s),s;l=Ay(a),(u=Da.get(u))&&lf(l,u),s=(e.ownerDocument||e).createElement("link"),it(s);var d=s;return d._p=new Promise(function(p,x){d.onload=p,d.onerror=x}),Qt(s,"link",l),t.state.loading|=4,Ts(s,a.precedence,e),t.instance=s;case"script":return s=qi(a.src),(u=e.querySelector(Xu(s)))?(t.instance=u,it(u),u):(l=a,(u=Da.get(s))&&(l=b({},a),nf(l,u)),e=e.ownerDocument||e,u=e.createElement("script"),it(u),Qt(u,"link",l),e.head.appendChild(u),t.instance=u);case"void":return null;default:throw Error(c(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(l=t.instance,t.state.loading|=4,Ts(l,a.precedence,e));return t.instance}function Ts(e,t,a){for(var l=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),u=l.length?l[l.length-1]:null,s=u,d=0;d title"):null)}function e0(e,t,a){if(a===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function Hy(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function t0(e,t,a,l){if(a.type==="stylesheet"&&(typeof l.media!="string"||matchMedia(l.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var u=Bi(l.href),s=t.querySelector(Gu(u));if(s){t=s._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Ms.bind(e),t.then(e,e)),a.state.loading|=4,a.instance=s,it(s);return}s=t.ownerDocument||t,l=Ay(l),(u=Da.get(u))&&lf(l,u),s=s.createElement("link"),it(s);var d=s;d._p=new Promise(function(p,x){d.onload=p,d.onerror=x}),Qt(s,"link",l),a.instance=s}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(e.count++,a=Ms.bind(e),t.addEventListener("load",a),t.addEventListener("error",a))}}var uf=0;function a0(e,t){return e.stylesheets&&e.count===0&&Os(e,e.stylesheets),0uf?50:800)+t);return e.unsuspend=a,function(){e.unsuspend=null,clearTimeout(l),clearTimeout(u)}}:null}function Ms(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Os(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Cs=null;function Os(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Cs=new Map,t.forEach(l0,e),Cs=null,Ms.call(e))}function l0(e,t){if(!(t.state.loading&4)){var a=Cs.get(e);if(a)var l=a.get(null);else{a=new Map,Cs.set(e,a);for(var u=e.querySelectorAll("link[data-precedence],style[data-precedence]"),s=0;s"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(i){console.error(i)}}return n(),vf.exports=E0(),vf.exports}var R0=j0();const T0=sp(R0);var au=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(n){return this.listeners.add(n),this.onSubscribe(),()=>{this.listeners.delete(n),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Zn,fn,Ki,Wv,N0=(Wv=class extends au{constructor(){super();ge(this,Zn);ge(this,fn);ge(this,Ki);ue(this,Ki,i=>{if(typeof window<"u"&&window.addEventListener){const r=()=>i();return window.addEventListener("visibilitychange",r,!1),()=>{window.removeEventListener("visibilitychange",r)}}})}onSubscribe(){j(this,fn)||this.setEventListener(j(this,Ki))}onUnsubscribe(){var i;this.hasListeners()||((i=j(this,fn))==null||i.call(this),ue(this,fn,void 0))}setEventListener(i){var r;ue(this,Ki,i),(r=j(this,fn))==null||r.call(this),ue(this,fn,i(c=>{typeof c=="boolean"?this.setFocused(c):this.onFocus()}))}setFocused(i){j(this,Zn)!==i&&(ue(this,Zn,i),this.onFocus())}onFocus(){const i=this.isFocused();this.listeners.forEach(r=>{r(i)})}isFocused(){var i;return typeof j(this,Zn)=="boolean"?j(this,Zn):((i=globalThis.document)==null?void 0:i.visibilityState)!=="hidden"}},Zn=new WeakMap,fn=new WeakMap,Ki=new WeakMap,Wv),Zf=new N0,M0={setTimeout:(n,i)=>setTimeout(n,i),clearTimeout:n=>clearTimeout(n),setInterval:(n,i)=>setInterval(n,i),clearInterval:n=>clearInterval(n)},dn,Kf,Pv,C0=(Pv=class{constructor(){ge(this,dn,M0);ge(this,Kf,!1)}setTimeoutProvider(n){ue(this,dn,n)}setTimeout(n,i){return j(this,dn).setTimeout(n,i)}clearTimeout(n){j(this,dn).clearTimeout(n)}setInterval(n,i){return j(this,dn).setInterval(n,i)}clearInterval(n){j(this,dn).clearInterval(n)}},dn=new WeakMap,Kf=new WeakMap,Pv),Kn=new C0;function O0(n){setTimeout(n,0)}var z0=typeof window>"u"||"Deno"in globalThis;function Pt(){}function D0(n,i){return typeof n=="function"?n(i):n}function Nf(n){return typeof n=="number"&&n>=0&&n!==1/0}function fp(n,i){return Math.max(n+(i||0)-Date.now(),0)}function xn(n,i){return typeof n=="function"?n(i):n}function _a(n,i){return typeof n=="function"?n(i):n}function cv(n,i){const{type:r="all",exact:c,fetchStatus:o,predicate:f,queryKey:m,stale:y}=n;if(m){if(c){if(i.queryHash!==Ff(m,i.options))return!1}else if(!lr(i.queryKey,m))return!1}if(r!=="all"){const g=i.isActive();if(r==="active"&&!g||r==="inactive"&&g)return!1}return!(typeof y=="boolean"&&i.isStale()!==y||o&&o!==i.state.fetchStatus||f&&!f(i))}function ov(n,i){const{exact:r,status:c,predicate:o,mutationKey:f}=n;if(f){if(!i.options.mutationKey)return!1;if(r){if(ai(i.options.mutationKey)!==ai(f))return!1}else if(!lr(i.options.mutationKey,f))return!1}return!(c&&i.state.status!==c||o&&!o(i))}function Ff(n,i){return((i==null?void 0:i.queryKeyHashFn)||ai)(n)}function ai(n){return JSON.stringify(n,(i,r)=>Mf(r)?Object.keys(r).sort().reduce((c,o)=>(c[o]=r[o],c),{}):r)}function lr(n,i){return n===i?!0:typeof n!=typeof i?!1:n&&i&&typeof n=="object"&&typeof i=="object"?Object.keys(i).every(r=>lr(n[r],i[r])):!1}var w0=Object.prototype.hasOwnProperty;function dp(n,i,r=0){if(n===i)return n;if(r>500)return i;const c=fv(n)&&fv(i);if(!c&&!(Mf(n)&&Mf(i)))return i;const f=(c?n:Object.keys(n)).length,m=c?i:Object.keys(i),y=m.length,g=c?new Array(y):{};let v=0;for(let S=0;S{Kn.setTimeout(i,n)})}function Cf(n,i,r){return typeof r.structuralSharing=="function"?r.structuralSharing(n,i):r.structuralSharing!==!1?dp(n,i):i}function _0(n,i,r=0){const c=[...n,i];return r&&c.length>r?c.slice(1):c}function U0(n,i,r=0){const c=[i,...n];return r&&c.length>r?c.slice(0,-1):c}var Jf=Symbol();function hp(n,i){return!n.queryFn&&(i!=null&&i.initialPromise)?()=>i.initialPromise:!n.queryFn||n.queryFn===Jf?()=>Promise.reject(new Error(`Missing queryFn: '${n.queryHash}'`)):n.queryFn}function kf(n,i){return typeof n=="function"?n(...i):!!n}function L0(n,i,r){let c=!1,o;return Object.defineProperty(n,"signal",{enumerable:!0,get:()=>(o??(o=i()),c||(c=!0,o.aborted?r():o.addEventListener("abort",r,{once:!0})),o)}),n}var nr=(()=>{let n=()=>z0;return{isServer(){return n()},setIsServer(i){n=i}}})();function Of(){let n,i;const r=new Promise((o,f)=>{n=o,i=f});r.status="pending",r.catch(()=>{});function c(o){Object.assign(r,o),delete r.resolve,delete r.reject}return r.resolve=o=>{c({status:"fulfilled",value:o}),n(o)},r.reject=o=>{c({status:"rejected",reason:o}),i(o)},r}var H0=O0;function B0(){let n=[],i=0,r=y=>{y()},c=y=>{y()},o=H0;const f=y=>{i?n.push(y):o(()=>{r(y)})},m=()=>{const y=n;n=[],y.length&&o(()=>{c(()=>{y.forEach(g=>{r(g)})})})};return{batch:y=>{let g;i++;try{g=y()}finally{i--,i||m()}return g},batchCalls:y=>(...g)=>{f(()=>{y(...g)})},schedule:f,setNotifyFunction:y=>{r=y},setBatchNotifyFunction:y=>{c=y},setScheduler:y=>{o=y}}}var wt=B0(),Vi,hn,Zi,Iv,q0=(Iv=class extends au{constructor(){super();ge(this,Vi,!0);ge(this,hn);ge(this,Zi);ue(this,Zi,i=>{if(typeof window<"u"&&window.addEventListener){const r=()=>i(!0),c=()=>i(!1);return window.addEventListener("online",r,!1),window.addEventListener("offline",c,!1),()=>{window.removeEventListener("online",r),window.removeEventListener("offline",c)}}})}onSubscribe(){j(this,hn)||this.setEventListener(j(this,Zi))}onUnsubscribe(){var i;this.hasListeners()||((i=j(this,hn))==null||i.call(this),ue(this,hn,void 0))}setEventListener(i){var r;ue(this,Zi,i),(r=j(this,hn))==null||r.call(this),ue(this,hn,i(this.setOnline.bind(this)))}setOnline(i){j(this,Vi)!==i&&(ue(this,Vi,i),this.listeners.forEach(c=>{c(i)}))}isOnline(){return j(this,Vi)}},Vi=new WeakMap,hn=new WeakMap,Zi=new WeakMap,Iv),Js=new q0;function Q0(n){return Math.min(1e3*2**n,3e4)}function mp(n){return(n??"online")==="online"?Js.isOnline():!0}var zf=class extends Error{constructor(n){super("CancelledError"),this.revert=n==null?void 0:n.revert,this.silent=n==null?void 0:n.silent}};function yp(n){let i=!1,r=0,c;const o=Of(),f=()=>o.status!=="pending",m=w=>{var q;if(!f()){const X=new zf(w);C(X),(q=n.onCancel)==null||q.call(n,X)}},y=()=>{i=!0},g=()=>{i=!1},v=()=>Zf.isFocused()&&(n.networkMode==="always"||Js.isOnline())&&n.canRun(),S=()=>mp(n.networkMode)&&n.canRun(),b=w=>{f()||(c==null||c(),o.resolve(w))},C=w=>{f()||(c==null||c(),o.reject(w))},M=()=>new Promise(w=>{var q;c=X=>{(f()||v())&&w(X)},(q=n.onPause)==null||q.call(n)}).then(()=>{var w;c=void 0,f()||(w=n.onContinue)==null||w.call(n)}),H=()=>{if(f())return;let w;const q=r===0?n.initialPromise:void 0;try{w=q??n.fn()}catch(X){w=Promise.reject(X)}Promise.resolve(w).then(b).catch(X=>{var oe;if(f())return;const J=n.retry??(nr.isServer()?0:3),F=n.retryDelay??Q0,W=typeof F=="function"?F(r,X):F,ae=J===!0||typeof J=="number"&&rv()?void 0:M()).then(()=>{i?C(X):H()})})};return{promise:o,status:()=>o.status,cancel:m,continue:()=>(c==null||c(),o),cancelRetry:y,continueRetry:g,canStart:S,start:()=>(S()?H():M().then(H),o)}}var Fn,ep,vp=(ep=class{constructor(){ge(this,Fn)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Nf(this.gcTime)&&ue(this,Fn,Kn.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(n){this.gcTime=Math.max(this.gcTime||0,n??(nr.isServer()?1/0:300*1e3))}clearGcTimeout(){j(this,Fn)!==void 0&&(Kn.clearTimeout(j(this,Fn)),ue(this,Fn,void 0))}},Fn=new WeakMap,ep),Jn,Fi,wa,kn,Lt,cr,$n,va,pp,Tl,tp,Y0=(tp=class extends vp{constructor(i){super();ge(this,va);ge(this,Jn);ge(this,Fi);ge(this,wa);ge(this,kn);ge(this,Lt);ge(this,cr);ge(this,$n);ue(this,$n,!1),ue(this,cr,i.defaultOptions),this.setOptions(i.options),this.observers=[],ue(this,kn,i.client),ue(this,wa,j(this,kn).getQueryCache()),this.queryKey=i.queryKey,this.queryHash=i.queryHash,ue(this,Jn,mv(this.options)),this.state=i.state??j(this,Jn),this.scheduleGc()}get meta(){return this.options.meta}get promise(){var i;return(i=j(this,Lt))==null?void 0:i.promise}setOptions(i){if(this.options={...j(this,cr),...i},this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const r=mv(this.options);r.data!==void 0&&(this.setState(hv(r.data,r.dataUpdatedAt)),ue(this,Jn,r))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&j(this,wa).remove(this)}setData(i,r){const c=Cf(this.state.data,i,this.options);return we(this,va,Tl).call(this,{data:c,type:"success",dataUpdatedAt:r==null?void 0:r.updatedAt,manual:r==null?void 0:r.manual}),c}setState(i,r){we(this,va,Tl).call(this,{type:"setState",state:i,setStateOptions:r})}cancel(i){var c,o;const r=(c=j(this,Lt))==null?void 0:c.promise;return(o=j(this,Lt))==null||o.cancel(i),r?r.then(Pt).catch(Pt):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return j(this,Jn)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(i=>_a(i.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===Jf||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(i=>xn(i.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(i=>i.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(i=0){return this.state.data===void 0?!0:i==="static"?!1:this.state.isInvalidated?!0:!fp(this.state.dataUpdatedAt,i)}onFocus(){var r;const i=this.observers.find(c=>c.shouldFetchOnWindowFocus());i==null||i.refetch({cancelRefetch:!1}),(r=j(this,Lt))==null||r.continue()}onOnline(){var r;const i=this.observers.find(c=>c.shouldFetchOnReconnect());i==null||i.refetch({cancelRefetch:!1}),(r=j(this,Lt))==null||r.continue()}addObserver(i){this.observers.includes(i)||(this.observers.push(i),this.clearGcTimeout(),j(this,wa).notify({type:"observerAdded",query:this,observer:i}))}removeObserver(i){this.observers.includes(i)&&(this.observers=this.observers.filter(r=>r!==i),this.observers.length||(j(this,Lt)&&(j(this,$n)||we(this,va,pp).call(this)?j(this,Lt).cancel({revert:!0}):j(this,Lt).cancelRetry()),this.scheduleGc()),j(this,wa).notify({type:"observerRemoved",query:this,observer:i}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||we(this,va,Tl).call(this,{type:"invalidate"})}async fetch(i,r){var g,v,S,b,C,M,H,w,q,X,J,F;if(this.state.fetchStatus!=="idle"&&((g=j(this,Lt))==null?void 0:g.status())!=="rejected"){if(this.state.data!==void 0&&(r!=null&&r.cancelRefetch))this.cancel({silent:!0});else if(j(this,Lt))return j(this,Lt).continueRetry(),j(this,Lt).promise}if(i&&this.setOptions(i),!this.options.queryFn){const W=this.observers.find(ae=>ae.options.queryFn);W&&this.setOptions(W.options)}const c=new AbortController,o=W=>{Object.defineProperty(W,"signal",{enumerable:!0,get:()=>(ue(this,$n,!0),c.signal)})},f=()=>{const W=hp(this.options,r),oe=(()=>{const ne={client:j(this,kn),queryKey:this.queryKey,meta:this.meta};return o(ne),ne})();return ue(this,$n,!1),this.options.persister?this.options.persister(W,oe,this):W(oe)},y=(()=>{const W={fetchOptions:r,options:this.options,queryKey:this.queryKey,client:j(this,kn),state:this.state,fetchFn:f};return o(W),W})();(v=this.options.behavior)==null||v.onFetch(y,this),ue(this,Fi,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((S=y.fetchOptions)==null?void 0:S.meta))&&we(this,va,Tl).call(this,{type:"fetch",meta:(b=y.fetchOptions)==null?void 0:b.meta}),ue(this,Lt,yp({initialPromise:r==null?void 0:r.initialPromise,fn:y.fetchFn,onCancel:W=>{W instanceof zf&&W.revert&&this.setState({...j(this,Fi),fetchStatus:"idle"}),c.abort()},onFail:(W,ae)=>{we(this,va,Tl).call(this,{type:"failed",failureCount:W,error:ae})},onPause:()=>{we(this,va,Tl).call(this,{type:"pause"})},onContinue:()=>{we(this,va,Tl).call(this,{type:"continue"})},retry:y.options.retry,retryDelay:y.options.retryDelay,networkMode:y.options.networkMode,canRun:()=>!0}));try{const W=await j(this,Lt).start();if(W===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(W),(M=(C=j(this,wa).config).onSuccess)==null||M.call(C,W,this),(w=(H=j(this,wa).config).onSettled)==null||w.call(H,W,this.state.error,this),W}catch(W){if(W instanceof zf){if(W.silent)return j(this,Lt).promise;if(W.revert){if(this.state.data===void 0)throw W;return this.state.data}}throw we(this,va,Tl).call(this,{type:"error",error:W}),(X=(q=j(this,wa).config).onError)==null||X.call(q,W,this),(F=(J=j(this,wa).config).onSettled)==null||F.call(J,this.state.data,W,this),W}finally{this.scheduleGc()}}},Jn=new WeakMap,Fi=new WeakMap,wa=new WeakMap,kn=new WeakMap,Lt=new WeakMap,cr=new WeakMap,$n=new WeakMap,va=new WeakSet,pp=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},Tl=function(i){const r=c=>{switch(i.type){case"failed":return{...c,fetchFailureCount:i.failureCount,fetchFailureReason:i.error};case"pause":return{...c,fetchStatus:"paused"};case"continue":return{...c,fetchStatus:"fetching"};case"fetch":return{...c,...gp(c.data,this.options),fetchMeta:i.meta??null};case"success":const o={...c,...hv(i.data,i.dataUpdatedAt),dataUpdateCount:c.dataUpdateCount+1,...!i.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return ue(this,Fi,i.manual?o:void 0),o;case"error":const f=i.error;return{...c,error:f,errorUpdateCount:c.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:c.fetchFailureCount+1,fetchFailureReason:f,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...c,isInvalidated:!0};case"setState":return{...c,...i.state}}};this.state=r(this.state),wt.batch(()=>{this.observers.forEach(c=>{c.onQueryUpdate()}),j(this,wa).notify({query:this,type:"updated",action:i})})},tp);function gp(n,i){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:mp(i.networkMode)?"fetching":"paused",...n===void 0&&{error:null,status:"pending"}}}function hv(n,i){return{data:n,dataUpdatedAt:i??Date.now(),error:null,isInvalidated:!1,status:"success"}}function mv(n){const i=typeof n.initialData=="function"?n.initialData():n.initialData,r=i!==void 0,c=r?typeof n.initialDataUpdatedAt=="function"?n.initialDataUpdatedAt():n.initialDataUpdatedAt:0;return{data:i,dataUpdateCount:0,dataUpdatedAt:r?c??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:r?"success":"pending",fetchStatus:"idle"}}var ua,Xe,or,Wt,Wn,Ji,Ml,mn,fr,ki,$i,Pn,In,yn,Wi,$e,Iu,Df,wf,Af,_f,Uf,Lf,Hf,bp,ap,G0=(ap=class extends au{constructor(i,r){super();ge(this,$e);ge(this,ua);ge(this,Xe);ge(this,or);ge(this,Wt);ge(this,Wn);ge(this,Ji);ge(this,Ml);ge(this,mn);ge(this,fr);ge(this,ki);ge(this,$i);ge(this,Pn);ge(this,In);ge(this,yn);ge(this,Wi,new Set);this.options=r,ue(this,ua,i),ue(this,mn,null),ue(this,Ml,Of()),this.bindMethods(),this.setOptions(r)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(j(this,Xe).addObserver(this),yv(j(this,Xe),this.options)?we(this,$e,Iu).call(this):this.updateResult(),we(this,$e,_f).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Bf(j(this,Xe),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Bf(j(this,Xe),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,we(this,$e,Uf).call(this),we(this,$e,Lf).call(this),j(this,Xe).removeObserver(this)}setOptions(i){const r=this.options,c=j(this,Xe);if(this.options=j(this,ua).defaultQueryOptions(i),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof _a(this.options.enabled,j(this,Xe))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");we(this,$e,Hf).call(this),j(this,Xe).setOptions(this.options),r._defaulted&&!Fs(this.options,r)&&j(this,ua).getQueryCache().notify({type:"observerOptionsUpdated",query:j(this,Xe),observer:this});const o=this.hasListeners();o&&vv(j(this,Xe),c,this.options,r)&&we(this,$e,Iu).call(this),this.updateResult(),o&&(j(this,Xe)!==c||_a(this.options.enabled,j(this,Xe))!==_a(r.enabled,j(this,Xe))||xn(this.options.staleTime,j(this,Xe))!==xn(r.staleTime,j(this,Xe)))&&we(this,$e,Df).call(this);const f=we(this,$e,wf).call(this);o&&(j(this,Xe)!==c||_a(this.options.enabled,j(this,Xe))!==_a(r.enabled,j(this,Xe))||f!==j(this,yn))&&we(this,$e,Af).call(this,f)}getOptimisticResult(i){const r=j(this,ua).getQueryCache().build(j(this,ua),i),c=this.createResult(r,i);return K0(this,c)&&(ue(this,Wt,c),ue(this,Ji,this.options),ue(this,Wn,j(this,Xe).state)),c}getCurrentResult(){return j(this,Wt)}trackResult(i,r){return new Proxy(i,{get:(c,o)=>(this.trackProp(o),r==null||r(o),o==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&j(this,Ml).status==="pending"&&j(this,Ml).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(c,o))})}trackProp(i){j(this,Wi).add(i)}getCurrentQuery(){return j(this,Xe)}refetch({...i}={}){return this.fetch({...i})}fetchOptimistic(i){const r=j(this,ua).defaultQueryOptions(i),c=j(this,ua).getQueryCache().build(j(this,ua),r);return c.fetch().then(()=>this.createResult(c,r))}fetch(i){return we(this,$e,Iu).call(this,{...i,cancelRefetch:i.cancelRefetch??!0}).then(()=>(this.updateResult(),j(this,Wt)))}createResult(i,r){var ie;const c=j(this,Xe),o=this.options,f=j(this,Wt),m=j(this,Wn),y=j(this,Ji),v=i!==c?i.state:j(this,or),{state:S}=i;let b={...S},C=!1,M;if(r._optimisticResults){const ye=this.hasListeners(),Re=!ye&&yv(i,r),Ee=ye&&vv(i,c,r,o);(Re||Ee)&&(b={...b,...gp(S.data,i.options)}),r._optimisticResults==="isRestoring"&&(b.fetchStatus="idle")}let{error:H,errorUpdatedAt:w,status:q}=b;M=b.data;let X=!1;if(r.placeholderData!==void 0&&M===void 0&&q==="pending"){let ye;f!=null&&f.isPlaceholderData&&r.placeholderData===(y==null?void 0:y.placeholderData)?(ye=f.data,X=!0):ye=typeof r.placeholderData=="function"?r.placeholderData((ie=j(this,$i))==null?void 0:ie.state.data,j(this,$i)):r.placeholderData,ye!==void 0&&(q="success",M=Cf(f==null?void 0:f.data,ye,r),C=!0)}if(r.select&&M!==void 0&&!X)if(f&&M===(m==null?void 0:m.data)&&r.select===j(this,fr))M=j(this,ki);else try{ue(this,fr,r.select),M=r.select(M),M=Cf(f==null?void 0:f.data,M,r),ue(this,ki,M),ue(this,mn,null)}catch(ye){ue(this,mn,ye)}j(this,mn)&&(H=j(this,mn),M=j(this,ki),w=Date.now(),q="error");const J=b.fetchStatus==="fetching",F=q==="pending",W=q==="error",ae=F&&J,oe=M!==void 0,D={status:q,fetchStatus:b.fetchStatus,isPending:F,isSuccess:q==="success",isError:W,isInitialLoading:ae,isLoading:ae,data:M,dataUpdatedAt:b.dataUpdatedAt,error:H,errorUpdatedAt:w,failureCount:b.fetchFailureCount,failureReason:b.fetchFailureReason,errorUpdateCount:b.errorUpdateCount,isFetched:i.isFetched(),isFetchedAfterMount:b.dataUpdateCount>v.dataUpdateCount||b.errorUpdateCount>v.errorUpdateCount,isFetching:J,isRefetching:J&&!F,isLoadingError:W&&!oe,isPaused:b.fetchStatus==="paused",isPlaceholderData:C,isRefetchError:W&&oe,isStale:$f(i,r),refetch:this.refetch,promise:j(this,Ml),isEnabled:_a(r.enabled,i)!==!1};if(this.options.experimental_prefetchInRender){const ye=D.data!==void 0,Re=D.status==="error"&&!ye,Ee=xe=>{Re?xe.reject(D.error):ye&&xe.resolve(D.data)},Ae=()=>{const xe=ue(this,Ml,D.promise=Of());Ee(xe)},qe=j(this,Ml);switch(qe.status){case"pending":i.queryHash===c.queryHash&&Ee(qe);break;case"fulfilled":(Re||D.data!==qe.value)&&Ae();break;case"rejected":(!Re||D.error!==qe.reason)&&Ae();break}}return D}updateResult(){const i=j(this,Wt),r=this.createResult(j(this,Xe),this.options);if(ue(this,Wn,j(this,Xe).state),ue(this,Ji,this.options),j(this,Wn).data!==void 0&&ue(this,$i,j(this,Xe)),Fs(r,i))return;ue(this,Wt,r);const c=()=>{if(!i)return!0;const{notifyOnChangeProps:o}=this.options,f=typeof o=="function"?o():o;if(f==="all"||!f&&!j(this,Wi).size)return!0;const m=new Set(f??j(this,Wi));return this.options.throwOnError&&m.add("error"),Object.keys(j(this,Wt)).some(y=>{const g=y;return j(this,Wt)[g]!==i[g]&&m.has(g)})};we(this,$e,bp).call(this,{listeners:c()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&we(this,$e,_f).call(this)}},ua=new WeakMap,Xe=new WeakMap,or=new WeakMap,Wt=new WeakMap,Wn=new WeakMap,Ji=new WeakMap,Ml=new WeakMap,mn=new WeakMap,fr=new WeakMap,ki=new WeakMap,$i=new WeakMap,Pn=new WeakMap,In=new WeakMap,yn=new WeakMap,Wi=new WeakMap,$e=new WeakSet,Iu=function(i){we(this,$e,Hf).call(this);let r=j(this,Xe).fetch(this.options,i);return i!=null&&i.throwOnError||(r=r.catch(Pt)),r},Df=function(){we(this,$e,Uf).call(this);const i=xn(this.options.staleTime,j(this,Xe));if(nr.isServer()||j(this,Wt).isStale||!Nf(i))return;const c=fp(j(this,Wt).dataUpdatedAt,i)+1;ue(this,Pn,Kn.setTimeout(()=>{j(this,Wt).isStale||this.updateResult()},c))},wf=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(j(this,Xe)):this.options.refetchInterval)??!1},Af=function(i){we(this,$e,Lf).call(this),ue(this,yn,i),!(nr.isServer()||_a(this.options.enabled,j(this,Xe))===!1||!Nf(j(this,yn))||j(this,yn)===0)&&ue(this,In,Kn.setInterval(()=>{(this.options.refetchIntervalInBackground||Zf.isFocused())&&we(this,$e,Iu).call(this)},j(this,yn)))},_f=function(){we(this,$e,Df).call(this),we(this,$e,Af).call(this,we(this,$e,wf).call(this))},Uf=function(){j(this,Pn)!==void 0&&(Kn.clearTimeout(j(this,Pn)),ue(this,Pn,void 0))},Lf=function(){j(this,In)!==void 0&&(Kn.clearInterval(j(this,In)),ue(this,In,void 0))},Hf=function(){const i=j(this,ua).getQueryCache().build(j(this,ua),this.options);if(i===j(this,Xe))return;const r=j(this,Xe);ue(this,Xe,i),ue(this,or,i.state),this.hasListeners()&&(r==null||r.removeObserver(this),i.addObserver(this))},bp=function(i){wt.batch(()=>{i.listeners&&this.listeners.forEach(r=>{r(j(this,Wt))}),j(this,ua).getQueryCache().notify({query:j(this,Xe),type:"observerResultsUpdated"})})},ap);function X0(n,i){return _a(i.enabled,n)!==!1&&n.state.data===void 0&&!(n.state.status==="error"&&i.retryOnMount===!1)}function yv(n,i){return X0(n,i)||n.state.data!==void 0&&Bf(n,i,i.refetchOnMount)}function Bf(n,i,r){if(_a(i.enabled,n)!==!1&&xn(i.staleTime,n)!=="static"){const c=typeof r=="function"?r(n):r;return c==="always"||c!==!1&&$f(n,i)}return!1}function vv(n,i,r,c){return(n!==i||_a(c.enabled,n)===!1)&&(!r.suspense||n.state.status!=="error")&&$f(n,r)}function $f(n,i){return _a(i.enabled,n)!==!1&&n.isStaleByTime(xn(i.staleTime,n))}function K0(n,i){return!Fs(n.getCurrentResult(),i)}function pv(n){return{onFetch:(i,r)=>{var S,b,C,M,H;const c=i.options,o=(C=(b=(S=i.fetchOptions)==null?void 0:S.meta)==null?void 0:b.fetchMore)==null?void 0:C.direction,f=((M=i.state.data)==null?void 0:M.pages)||[],m=((H=i.state.data)==null?void 0:H.pageParams)||[];let y={pages:[],pageParams:[]},g=0;const v=async()=>{let w=!1;const q=F=>{L0(F,()=>i.signal,()=>w=!0)},X=hp(i.options,i.fetchOptions),J=async(F,W,ae)=>{if(w)return Promise.reject();if(W==null&&F.pages.length)return Promise.resolve(F);const ne=(()=>{const Re={client:i.client,queryKey:i.queryKey,pageParam:W,direction:ae?"backward":"forward",meta:i.options.meta};return q(Re),Re})(),D=await X(ne),{maxPages:ie}=i.options,ye=ae?U0:_0;return{pages:ye(F.pages,D,ie),pageParams:ye(F.pageParams,W,ie)}};if(o&&f.length){const F=o==="backward",W=F?V0:gv,ae={pages:f,pageParams:m},oe=W(c,ae);y=await J(ae,oe,F)}else{const F=n??f.length;do{const W=g===0?m[0]??c.initialPageParam:gv(c,y);if(g>0&&W==null)break;y=await J(y,W),g++}while(g{var w,q;return(q=(w=i.options).persister)==null?void 0:q.call(w,v,{client:i.client,queryKey:i.queryKey,meta:i.options.meta,signal:i.signal},r)}:i.fetchFn=v}}}function gv(n,{pages:i,pageParams:r}){const c=i.length-1;return i.length>0?n.getNextPageParam(i[c],i,r[c],r):void 0}function V0(n,{pages:i,pageParams:r}){var c;return i.length>0?(c=n.getPreviousPageParam)==null?void 0:c.call(n,i[0],i,r[0],r):void 0}var dr,Ia,Zt,ei,el,sn,lp,Z0=(lp=class extends vp{constructor(i){super();ge(this,el);ge(this,dr);ge(this,Ia);ge(this,Zt);ge(this,ei);ue(this,dr,i.client),this.mutationId=i.mutationId,ue(this,Zt,i.mutationCache),ue(this,Ia,[]),this.state=i.state||Sp(),this.setOptions(i.options),this.scheduleGc()}setOptions(i){this.options=i,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(i){j(this,Ia).includes(i)||(j(this,Ia).push(i),this.clearGcTimeout(),j(this,Zt).notify({type:"observerAdded",mutation:this,observer:i}))}removeObserver(i){ue(this,Ia,j(this,Ia).filter(r=>r!==i)),this.scheduleGc(),j(this,Zt).notify({type:"observerRemoved",mutation:this,observer:i})}optionalRemove(){j(this,Ia).length||(this.state.status==="pending"?this.scheduleGc():j(this,Zt).remove(this))}continue(){var i;return((i=j(this,ei))==null?void 0:i.continue())??this.execute(this.state.variables)}async execute(i){var m,y,g,v,S,b,C,M,H,w,q,X,J,F,W,ae,oe,ne;const r=()=>{we(this,el,sn).call(this,{type:"continue"})},c={client:j(this,dr),meta:this.options.meta,mutationKey:this.options.mutationKey};ue(this,ei,yp({fn:()=>this.options.mutationFn?this.options.mutationFn(i,c):Promise.reject(new Error("No mutationFn found")),onFail:(D,ie)=>{we(this,el,sn).call(this,{type:"failed",failureCount:D,error:ie})},onPause:()=>{we(this,el,sn).call(this,{type:"pause"})},onContinue:r,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>j(this,Zt).canRun(this)}));const o=this.state.status==="pending",f=!j(this,ei).canStart();try{if(o)r();else{we(this,el,sn).call(this,{type:"pending",variables:i,isPaused:f}),j(this,Zt).config.onMutate&&await j(this,Zt).config.onMutate(i,this,c);const ie=await((y=(m=this.options).onMutate)==null?void 0:y.call(m,i,c));ie!==this.state.context&&we(this,el,sn).call(this,{type:"pending",context:ie,variables:i,isPaused:f})}const D=await j(this,ei).start();return await((v=(g=j(this,Zt).config).onSuccess)==null?void 0:v.call(g,D,i,this.state.context,this,c)),await((b=(S=this.options).onSuccess)==null?void 0:b.call(S,D,i,this.state.context,c)),await((M=(C=j(this,Zt).config).onSettled)==null?void 0:M.call(C,D,null,this.state.variables,this.state.context,this,c)),await((w=(H=this.options).onSettled)==null?void 0:w.call(H,D,null,i,this.state.context,c)),we(this,el,sn).call(this,{type:"success",data:D}),D}catch(D){try{await((X=(q=j(this,Zt).config).onError)==null?void 0:X.call(q,D,i,this.state.context,this,c))}catch(ie){Promise.reject(ie)}try{await((F=(J=this.options).onError)==null?void 0:F.call(J,D,i,this.state.context,c))}catch(ie){Promise.reject(ie)}try{await((ae=(W=j(this,Zt).config).onSettled)==null?void 0:ae.call(W,void 0,D,this.state.variables,this.state.context,this,c))}catch(ie){Promise.reject(ie)}try{await((ne=(oe=this.options).onSettled)==null?void 0:ne.call(oe,void 0,D,i,this.state.context,c))}catch(ie){Promise.reject(ie)}throw we(this,el,sn).call(this,{type:"error",error:D}),D}finally{j(this,Zt).runNext(this)}}},dr=new WeakMap,Ia=new WeakMap,Zt=new WeakMap,ei=new WeakMap,el=new WeakSet,sn=function(i){const r=c=>{switch(i.type){case"failed":return{...c,failureCount:i.failureCount,failureReason:i.error};case"pause":return{...c,isPaused:!0};case"continue":return{...c,isPaused:!1};case"pending":return{...c,context:i.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:i.isPaused,status:"pending",variables:i.variables,submittedAt:Date.now()};case"success":return{...c,data:i.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...c,data:void 0,error:i.error,failureCount:c.failureCount+1,failureReason:i.error,isPaused:!1,status:"error"}}};this.state=r(this.state),wt.batch(()=>{j(this,Ia).forEach(c=>{c.onMutationUpdate(i)}),j(this,Zt).notify({mutation:this,type:"updated",action:i})})},lp);function Sp(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var Cl,Ka,hr,np,F0=(np=class extends au{constructor(i={}){super();ge(this,Cl);ge(this,Ka);ge(this,hr);this.config=i,ue(this,Cl,new Set),ue(this,Ka,new Map),ue(this,hr,0)}build(i,r,c){const o=new Z0({client:i,mutationCache:this,mutationId:++Hs(this,hr)._,options:i.defaultMutationOptions(r),state:c});return this.add(o),o}add(i){j(this,Cl).add(i);const r=Bs(i);if(typeof r=="string"){const c=j(this,Ka).get(r);c?c.push(i):j(this,Ka).set(r,[i])}this.notify({type:"added",mutation:i})}remove(i){if(j(this,Cl).delete(i)){const r=Bs(i);if(typeof r=="string"){const c=j(this,Ka).get(r);if(c)if(c.length>1){const o=c.indexOf(i);o!==-1&&c.splice(o,1)}else c[0]===i&&j(this,Ka).delete(r)}}this.notify({type:"removed",mutation:i})}canRun(i){const r=Bs(i);if(typeof r=="string"){const c=j(this,Ka).get(r),o=c==null?void 0:c.find(f=>f.state.status==="pending");return!o||o===i}else return!0}runNext(i){var c;const r=Bs(i);if(typeof r=="string"){const o=(c=j(this,Ka).get(r))==null?void 0:c.find(f=>f!==i&&f.state.isPaused);return(o==null?void 0:o.continue())??Promise.resolve()}else return Promise.resolve()}clear(){wt.batch(()=>{j(this,Cl).forEach(i=>{this.notify({type:"removed",mutation:i})}),j(this,Cl).clear(),j(this,Ka).clear()})}getAll(){return Array.from(j(this,Cl))}find(i){const r={exact:!0,...i};return this.getAll().find(c=>ov(r,c))}findAll(i={}){return this.getAll().filter(r=>ov(i,r))}notify(i){wt.batch(()=>{this.listeners.forEach(r=>{r(i)})})}resumePausedMutations(){const i=this.getAll().filter(r=>r.state.isPaused);return wt.batch(()=>Promise.all(i.map(r=>r.continue().catch(Pt))))}},Cl=new WeakMap,Ka=new WeakMap,hr=new WeakMap,np);function Bs(n){var i;return(i=n.options.scope)==null?void 0:i.id}var Ol,vn,ra,zl,Dl,Xs,qf,ip,J0=(ip=class extends au{constructor(r,c){super();ge(this,Dl);ge(this,Ol);ge(this,vn);ge(this,ra);ge(this,zl);ue(this,Ol,r),this.setOptions(c),this.bindMethods(),we(this,Dl,Xs).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(r){var o;const c=this.options;this.options=j(this,Ol).defaultMutationOptions(r),Fs(this.options,c)||j(this,Ol).getMutationCache().notify({type:"observerOptionsUpdated",mutation:j(this,ra),observer:this}),c!=null&&c.mutationKey&&this.options.mutationKey&&ai(c.mutationKey)!==ai(this.options.mutationKey)?this.reset():((o=j(this,ra))==null?void 0:o.state.status)==="pending"&&j(this,ra).setOptions(this.options)}onUnsubscribe(){var r;this.hasListeners()||(r=j(this,ra))==null||r.removeObserver(this)}onMutationUpdate(r){we(this,Dl,Xs).call(this),we(this,Dl,qf).call(this,r)}getCurrentResult(){return j(this,vn)}reset(){var r;(r=j(this,ra))==null||r.removeObserver(this),ue(this,ra,void 0),we(this,Dl,Xs).call(this),we(this,Dl,qf).call(this)}mutate(r,c){var o;return ue(this,zl,c),(o=j(this,ra))==null||o.removeObserver(this),ue(this,ra,j(this,Ol).getMutationCache().build(j(this,Ol),this.options)),j(this,ra).addObserver(this),j(this,ra).execute(r)}},Ol=new WeakMap,vn=new WeakMap,ra=new WeakMap,zl=new WeakMap,Dl=new WeakSet,Xs=function(){var c;const r=((c=j(this,ra))==null?void 0:c.state)??Sp();ue(this,vn,{...r,isPending:r.status==="pending",isSuccess:r.status==="success",isError:r.status==="error",isIdle:r.status==="idle",mutate:this.mutate,reset:this.reset})},qf=function(r){wt.batch(()=>{var c,o,f,m,y,g,v,S;if(j(this,zl)&&this.hasListeners()){const b=j(this,vn).variables,C=j(this,vn).context,M={client:j(this,Ol),meta:this.options.meta,mutationKey:this.options.mutationKey};if((r==null?void 0:r.type)==="success"){try{(o=(c=j(this,zl)).onSuccess)==null||o.call(c,r.data,b,C,M)}catch(H){Promise.reject(H)}try{(m=(f=j(this,zl)).onSettled)==null||m.call(f,r.data,null,b,C,M)}catch(H){Promise.reject(H)}}else if((r==null?void 0:r.type)==="error"){try{(g=(y=j(this,zl)).onError)==null||g.call(y,r.error,b,C,M)}catch(H){Promise.reject(H)}try{(S=(v=j(this,zl)).onSettled)==null||S.call(v,void 0,r.error,b,C,M)}catch(H){Promise.reject(H)}}}this.listeners.forEach(b=>{b(j(this,vn))})})},ip),tl,up,k0=(up=class extends au{constructor(i={}){super();ge(this,tl);this.config=i,ue(this,tl,new Map)}build(i,r,c){const o=r.queryKey,f=r.queryHash??Ff(o,r);let m=this.get(f);return m||(m=new Y0({client:i,queryKey:o,queryHash:f,options:i.defaultQueryOptions(r),state:c,defaultOptions:i.getQueryDefaults(o)}),this.add(m)),m}add(i){j(this,tl).has(i.queryHash)||(j(this,tl).set(i.queryHash,i),this.notify({type:"added",query:i}))}remove(i){const r=j(this,tl).get(i.queryHash);r&&(i.destroy(),r===i&&j(this,tl).delete(i.queryHash),this.notify({type:"removed",query:i}))}clear(){wt.batch(()=>{this.getAll().forEach(i=>{this.remove(i)})})}get(i){return j(this,tl).get(i)}getAll(){return[...j(this,tl).values()]}find(i){const r={exact:!0,...i};return this.getAll().find(c=>cv(r,c))}findAll(i={}){const r=this.getAll();return Object.keys(i).length>0?r.filter(c=>cv(i,c)):r}notify(i){wt.batch(()=>{this.listeners.forEach(r=>{r(i)})})}onFocus(){wt.batch(()=>{this.getAll().forEach(i=>{i.onFocus()})})}onOnline(){wt.batch(()=>{this.getAll().forEach(i=>{i.onOnline()})})}},tl=new WeakMap,up),pt,pn,gn,Pi,Ii,bn,eu,tu,rp,$0=(rp=class{constructor(n={}){ge(this,pt);ge(this,pn);ge(this,gn);ge(this,Pi);ge(this,Ii);ge(this,bn);ge(this,eu);ge(this,tu);ue(this,pt,n.queryCache||new k0),ue(this,pn,n.mutationCache||new F0),ue(this,gn,n.defaultOptions||{}),ue(this,Pi,new Map),ue(this,Ii,new Map),ue(this,bn,0)}mount(){Hs(this,bn)._++,j(this,bn)===1&&(ue(this,eu,Zf.subscribe(async n=>{n&&(await this.resumePausedMutations(),j(this,pt).onFocus())})),ue(this,tu,Js.subscribe(async n=>{n&&(await this.resumePausedMutations(),j(this,pt).onOnline())})))}unmount(){var n,i;Hs(this,bn)._--,j(this,bn)===0&&((n=j(this,eu))==null||n.call(this),ue(this,eu,void 0),(i=j(this,tu))==null||i.call(this),ue(this,tu,void 0))}isFetching(n){return j(this,pt).findAll({...n,fetchStatus:"fetching"}).length}isMutating(n){return j(this,pn).findAll({...n,status:"pending"}).length}getQueryData(n){var r;const i=this.defaultQueryOptions({queryKey:n});return(r=j(this,pt).get(i.queryHash))==null?void 0:r.state.data}ensureQueryData(n){const i=this.defaultQueryOptions(n),r=j(this,pt).build(this,i),c=r.state.data;return c===void 0?this.fetchQuery(n):(n.revalidateIfStale&&r.isStaleByTime(xn(i.staleTime,r))&&this.prefetchQuery(i),Promise.resolve(c))}getQueriesData(n){return j(this,pt).findAll(n).map(({queryKey:i,state:r})=>{const c=r.data;return[i,c]})}setQueryData(n,i,r){const c=this.defaultQueryOptions({queryKey:n}),o=j(this,pt).get(c.queryHash),f=o==null?void 0:o.state.data,m=D0(i,f);if(m!==void 0)return j(this,pt).build(this,c).setData(m,{...r,manual:!0})}setQueriesData(n,i,r){return wt.batch(()=>j(this,pt).findAll(n).map(({queryKey:c})=>[c,this.setQueryData(c,i,r)]))}getQueryState(n){var r;const i=this.defaultQueryOptions({queryKey:n});return(r=j(this,pt).get(i.queryHash))==null?void 0:r.state}removeQueries(n){const i=j(this,pt);wt.batch(()=>{i.findAll(n).forEach(r=>{i.remove(r)})})}resetQueries(n,i){const r=j(this,pt);return wt.batch(()=>(r.findAll(n).forEach(c=>{c.reset()}),this.refetchQueries({type:"active",...n},i)))}cancelQueries(n,i={}){const r={revert:!0,...i},c=wt.batch(()=>j(this,pt).findAll(n).map(o=>o.cancel(r)));return Promise.all(c).then(Pt).catch(Pt)}invalidateQueries(n,i={}){return wt.batch(()=>(j(this,pt).findAll(n).forEach(r=>{r.invalidate()}),(n==null?void 0:n.refetchType)==="none"?Promise.resolve():this.refetchQueries({...n,type:(n==null?void 0:n.refetchType)??(n==null?void 0:n.type)??"active"},i)))}refetchQueries(n,i={}){const r={...i,cancelRefetch:i.cancelRefetch??!0},c=wt.batch(()=>j(this,pt).findAll(n).filter(o=>!o.isDisabled()&&!o.isStatic()).map(o=>{let f=o.fetch(void 0,r);return r.throwOnError||(f=f.catch(Pt)),o.state.fetchStatus==="paused"?Promise.resolve():f}));return Promise.all(c).then(Pt)}fetchQuery(n){const i=this.defaultQueryOptions(n);i.retry===void 0&&(i.retry=!1);const r=j(this,pt).build(this,i);return r.isStaleByTime(xn(i.staleTime,r))?r.fetch(i):Promise.resolve(r.state.data)}prefetchQuery(n){return this.fetchQuery(n).then(Pt).catch(Pt)}fetchInfiniteQuery(n){return n.behavior=pv(n.pages),this.fetchQuery(n)}prefetchInfiniteQuery(n){return this.fetchInfiniteQuery(n).then(Pt).catch(Pt)}ensureInfiniteQueryData(n){return n.behavior=pv(n.pages),this.ensureQueryData(n)}resumePausedMutations(){return Js.isOnline()?j(this,pn).resumePausedMutations():Promise.resolve()}getQueryCache(){return j(this,pt)}getMutationCache(){return j(this,pn)}getDefaultOptions(){return j(this,gn)}setDefaultOptions(n){ue(this,gn,n)}setQueryDefaults(n,i){j(this,Pi).set(ai(n),{queryKey:n,defaultOptions:i})}getQueryDefaults(n){const i=[...j(this,Pi).values()],r={};return i.forEach(c=>{lr(n,c.queryKey)&&Object.assign(r,c.defaultOptions)}),r}setMutationDefaults(n,i){j(this,Ii).set(ai(n),{mutationKey:n,defaultOptions:i})}getMutationDefaults(n){const i=[...j(this,Ii).values()],r={};return i.forEach(c=>{lr(n,c.mutationKey)&&Object.assign(r,c.defaultOptions)}),r}defaultQueryOptions(n){if(n._defaulted)return n;const i={...j(this,gn).queries,...this.getQueryDefaults(n.queryKey),...n,_defaulted:!0};return i.queryHash||(i.queryHash=Ff(i.queryKey,i)),i.refetchOnReconnect===void 0&&(i.refetchOnReconnect=i.networkMode!=="always"),i.throwOnError===void 0&&(i.throwOnError=!!i.suspense),!i.networkMode&&i.persister&&(i.networkMode="offlineFirst"),i.queryFn===Jf&&(i.enabled=!1),i}defaultMutationOptions(n){return n!=null&&n._defaulted?n:{...j(this,gn).mutations,...(n==null?void 0:n.mutationKey)&&this.getMutationDefaults(n.mutationKey),...n,_defaulted:!0}}clear(){j(this,pt).clear(),j(this,pn).clear()}},pt=new WeakMap,pn=new WeakMap,gn=new WeakMap,Pi=new WeakMap,Ii=new WeakMap,bn=new WeakMap,eu=new WeakMap,tu=new WeakMap,rp),xp=R.createContext(void 0),lu=n=>{const i=R.useContext(xp);if(!i)throw new Error("No QueryClient set, use QueryClientProvider to set one");return i},W0=({client:n,children:i})=>(R.useEffect(()=>(n.mount(),()=>{n.unmount()}),[n]),h.jsx(xp.Provider,{value:n,children:i})),Ep=R.createContext(!1),P0=()=>R.useContext(Ep);Ep.Provider;function I0(){let n=!1;return{clearReset:()=>{n=!1},reset:()=>{n=!0},isReset:()=>n}}var eS=R.createContext(I0()),tS=()=>R.useContext(eS),aS=(n,i,r)=>{const c=r!=null&&r.state.error&&typeof n.throwOnError=="function"?kf(n.throwOnError,[r.state.error,r]):n.throwOnError;(n.suspense||n.experimental_prefetchInRender||c)&&(i.isReset()||(n.retryOnMount=!1))},lS=n=>{R.useEffect(()=>{n.clearReset()},[n])},nS=({result:n,errorResetBoundary:i,throwOnError:r,query:c,suspense:o})=>n.isError&&!i.isReset()&&!n.isFetching&&c&&(o&&n.data===void 0||kf(r,[n.error,c])),iS=n=>{if(n.suspense){const r=o=>o==="static"?o:Math.max(o??1e3,1e3),c=n.staleTime;n.staleTime=typeof c=="function"?(...o)=>r(c(...o)):r(c),typeof n.gcTime=="number"&&(n.gcTime=Math.max(n.gcTime,1e3))}},uS=(n,i)=>n.isLoading&&n.isFetching&&!i,rS=(n,i)=>(n==null?void 0:n.suspense)&&i.isPending,bv=(n,i,r)=>i.fetchOptimistic(n).catch(()=>{r.clearReset()});function sS(n,i,r){var C,M,H,w;const c=P0(),o=tS(),f=lu(),m=f.defaultQueryOptions(n);(M=(C=f.getDefaultOptions().queries)==null?void 0:C._experimental_beforeQuery)==null||M.call(C,m);const y=f.getQueryCache().get(m.queryHash);m._optimisticResults=c?"isRestoring":"optimistic",iS(m),aS(m,o,y),lS(o);const g=!f.getQueryCache().get(m.queryHash),[v]=R.useState(()=>new i(f,m)),S=v.getOptimisticResult(m),b=!c&&n.subscribed!==!1;if(R.useSyncExternalStore(R.useCallback(q=>{const X=b?v.subscribe(wt.batchCalls(q)):Pt;return v.updateResult(),X},[v,b]),()=>v.getCurrentResult(),()=>v.getCurrentResult()),R.useEffect(()=>{v.setOptions(m)},[m,v]),rS(m,S))throw bv(m,v,o);if(nS({result:S,errorResetBoundary:o,throwOnError:m.throwOnError,query:y,suspense:m.suspense}))throw S.error;if((w=(H=f.getDefaultOptions().queries)==null?void 0:H._experimental_afterQuery)==null||w.call(H,m,S),m.experimental_prefetchInRender&&!nr.isServer()&&uS(S,c)){const q=g?bv(m,v,o):y==null?void 0:y.promise;q==null||q.catch(Pt).finally(()=>{v.updateResult()})}return m.notifyOnChangeProps?S:v.trackResult(S)}function wl(n,i){return sS(n,G0)}function Va(n,i){const r=lu(),[c]=R.useState(()=>new J0(r,n));R.useEffect(()=>{c.setOptions(n)},[c,n]);const o=R.useSyncExternalStore(R.useCallback(m=>c.subscribe(wt.batchCalls(m)),[c]),()=>c.getCurrentResult(),()=>c.getCurrentResult()),f=R.useCallback((m,y)=>{c.mutate(m,y).catch(Pt)},[c]);if(o.error&&kf(c.options.throwOnError,[o.error]))throw o.error;return{...o,mutate:f,mutateAsync:o.mutate}}/** +`+l.stack}}var Ga=Object.prototype.hasOwnProperty,cl=n.unstable_scheduleCallback,Hl=n.unstable_cancelCallback,ri=n.unstable_shouldYield,si=n.unstable_requestPaint,Ut=n.unstable_now,Na=n.unstable_getCurrentPriorityLevel,Q=n.unstable_ImmediatePriority,Fe=n.unstable_UserBlockingPriority,tt=n.unstable_NormalPriority,Pe=n.unstable_LowPriority,vt=n.unstable_IdlePriority,Bl=n.log,ol=n.unstable_setDisableYieldValue,ha=null,$t=null;function Lt(e){if(typeof Bl=="function"&&ol(e),$t&&typeof $t.setStrictMode=="function")try{$t.setStrictMode(ha,e)}catch{}}var kt=Math.clz32?Math.clz32:rc,Es=Math.log,Ns=Math.LN2;function rc(e){return e>>>=0,e===0?32:31-(Es(e)/Ns|0)|0}var Cn=256,fl=262144,Tn=4194304;function Ka(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ui(e,t,a){var l=e.pendingLanes;if(l===0)return 0;var r=0,u=e.suspendedLanes,h=e.pingedLanes;e=e.warmLanes;var v=l&134217727;return v!==0?(l=v&~u,l!==0?r=Ka(l):(h&=v,h!==0?r=Ka(h):a||(a=v&~e,a!==0&&(r=Ka(a))))):(v=l&~u,v!==0?r=Ka(v):h!==0?r=Ka(h):a||(a=l&~e,a!==0&&(r=Ka(a)))),r===0?0:t!==0&&t!==r&&(t&u)===0&&(u=r&-r,a=t&-t,u>=a||u===32&&(a&4194048)!==0)?t:r}function ql(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function sc(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function cr(){var e=Tn;return Tn<<=1,(Tn&62914560)===0&&(Tn=4194304),e}function Ql(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function Wa(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Rs(e,t,a,l,r,u){var h=e.pendingLanes;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=a,e.entangledLanes&=a,e.errorRecoveryDisabledLanes&=a,e.shellSuspendCounter=0;var v=e.entanglements,j=e.expirationTimes,H=e.hiddenUpdates;for(a=h&~a;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var hg=/[\n"\\]/g;function Ra(e){return e.replace(hg,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function uc(e,t,a,l,r,u,h,v){e.name="",h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"?e.type=h:e.removeAttribute("type"),t!=null?h==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Tt(t)):e.value!==""+Tt(t)&&(e.value=""+Tt(t)):h!=="submit"&&h!=="reset"||e.removeAttribute("value"),t!=null?cc(e,h,Tt(t)):a!=null?cc(e,h,Tt(a)):l!=null&&e.removeAttribute("value"),r==null&&u!=null&&(e.defaultChecked=!!u),r!=null&&(e.checked=r&&typeof r!="function"&&typeof r!="symbol"),v!=null&&typeof v!="function"&&typeof v!="symbol"&&typeof v!="boolean"?e.name=""+Tt(v):e.removeAttribute("name")}function pd(e,t,a,l,r,u,h,v){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(e.type=u),t!=null||a!=null){if(!(u!=="submit"&&u!=="reset"||t!=null)){fi(e);return}a=a!=null?""+Tt(a):"",t=t!=null?""+Tt(t):a,v||t===e.value||(e.value=t),e.defaultValue=t}l=l??r,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=v?e.checked:!!l,e.defaultChecked=!!l,h!=null&&typeof h!="function"&&typeof h!="symbol"&&typeof h!="boolean"&&(e.name=h),fi(e)}function cc(e,t,a){t==="number"&&Ms(e.ownerDocument)===e||e.defaultValue===""+a||(e.defaultValue=""+a)}function di(e,t,a,l){if(e=e.options,t){t={};for(var r=0;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),mc=!1;if(hl)try{var fr={};Object.defineProperty(fr,"passive",{get:function(){mc=!0}}),window.addEventListener("test",fr,fr),window.removeEventListener("test",fr,fr)}catch{mc=!1}var Gl=null,yc=null,Os=null;function Ed(){if(Os)return Os;var e,t=yc,a=t.length,l,r="value"in Gl?Gl.value:Gl.textContent,u=r.length;for(e=0;e=mr),Md=" ",wd=!1;function Od(e,t){switch(e){case"keyup":return Yg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Dd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var pi=!1;function Kg(e,t){switch(e){case"compositionend":return Dd(t);case"keypress":return t.which!==32?null:(wd=!0,Md);case"textInput":return e=t.data,e===Md&&wd?null:e;default:return null}}function Xg(e,t){if(pi)return e==="compositionend"||!Sc&&Od(e,t)?(e=Ed(),Os=yc=Gl=null,pi=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:a,offset:t-e};e=l}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=Qd(a)}}function Gd(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Gd(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Kd(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Ms(e.document);t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=Ms(e.document)}return t}function Ec(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var Pg=hl&&"documentMode"in document&&11>=document.documentMode,vi=null,Nc=null,gr=null,Rc=!1;function Xd(e,t,a){var l=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Rc||vi==null||vi!==Ms(l)||(l=vi,"selectionStart"in l&&Ec(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),gr&&vr(gr,l)||(gr=l,l=Nu(Nc,"onSelect"),0>=h,r-=h,el=1<<32-kt(t)+r|a<Ae?(Ke=ve,ve=null):Ke=ve.sibling;var We=Y(w,ve,U[Ae],Z);if(We===null){ve===null&&(ve=Ke);break}e&&ve&&We.alternate===null&&t(w,ve),T=u(We,T,Ae),$e===null?Re=We:$e.sibling=We,$e=We,ve=Ke}if(Ae===U.length)return a(w,ve),Xe&&yl(w,Ae),Re;if(ve===null){for(;AeAe?(Ke=ve,ve=null):Ke=ve.sibling;var fn=Y(w,ve,We.value,Z);if(fn===null){ve===null&&(ve=Ke);break}e&&ve&&fn.alternate===null&&t(w,ve),T=u(fn,T,Ae),$e===null?Re=fn:$e.sibling=fn,$e=fn,ve=Ke}if(We.done)return a(w,ve),Xe&&yl(w,Ae),Re;if(ve===null){for(;!We.done;Ae++,We=U.next())We=$(w,We.value,Z),We!==null&&(T=u(We,T,Ae),$e===null?Re=We:$e.sibling=We,$e=We);return Xe&&yl(w,Ae),Re}for(ve=l(ve);!We.done;Ae++,We=U.next())We=G(ve,w,Ae,We.value,Z),We!==null&&(e&&We.alternate!==null&&ve.delete(We.key===null?Ae:We.key),T=u(We,T,Ae),$e===null?Re=We:$e.sibling=We,$e=We);return e&&ve.forEach(function(g0){return t(w,g0)}),Xe&&yl(w,Ae),Re}function st(w,T,U,Z){if(typeof U=="object"&&U!==null&&U.type===D&&U.key===null&&(U=U.props.children),typeof U=="object"&&U!==null){switch(U.$$typeof){case C:e:{for(var Re=U.key;T!==null;){if(T.key===Re){if(Re=U.type,Re===D){if(T.tag===7){a(w,T.sibling),Z=r(T,U.props.children),Z.return=w,w=Z;break e}}else if(T.elementType===Re||typeof Re=="object"&&Re!==null&&Re.$$typeof===O&&qn(Re)===T.type){a(w,T.sibling),Z=r(T,U.props),Nr(Z,U),Z.return=w,w=Z;break e}a(w,T);break}else t(w,T);T=T.sibling}U.type===D?(Z=An(U.props.children,w.mode,Z,U.key),Z.return=w,w=Z):(Z=Ys(U.type,U.key,U.props,null,w.mode,Z),Nr(Z,U),Z.return=w,w=Z)}return h(w);case A:e:{for(Re=U.key;T!==null;){if(T.key===Re)if(T.tag===4&&T.stateNode.containerInfo===U.containerInfo&&T.stateNode.implementation===U.implementation){a(w,T.sibling),Z=r(T,U.children||[]),Z.return=w,w=Z;break e}else{a(w,T);break}else t(w,T);T=T.sibling}Z=Dc(U,w.mode,Z),Z.return=w,w=Z}return h(w);case O:return U=qn(U),st(w,T,U,Z)}if(je(U))return me(w,T,U,Z);if(xe(U)){if(Re=xe(U),typeof Re!="function")throw Error(c(150));return U=Re.call(U),Ce(w,T,U,Z)}if(typeof U.then=="function")return st(w,T,Fs(U),Z);if(U.$$typeof===F)return st(w,T,Xs(w,U),Z);Js(w,U)}return typeof U=="string"&&U!==""||typeof U=="number"||typeof U=="bigint"?(U=""+U,T!==null&&T.tag===6?(a(w,T.sibling),Z=r(T,U),Z.return=w,w=Z):(a(w,T),Z=Oc(U,w.mode,Z),Z.return=w,w=Z),h(w)):a(w,T)}return function(w,T,U,Z){try{Er=0;var Re=st(w,T,U,Z);return _i=null,Re}catch(ve){if(ve===Ti||ve===Vs)throw ve;var $e=ya(29,ve,null,w.mode);return $e.lanes=Z,$e.return=w,$e}finally{}}}var Yn=hh(!0),mh=hh(!1),Zl=!1;function Xc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function kc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Fl(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Jl(e,t,a){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(Ie&2)!==0){var r=l.pending;return r===null?t.next=t:(t.next=r.next,r.next=t),l.pending=t,t=Qs(e),Wd(e,null,a),t}return qs(e,l,t,a),Qs(e)}function Rr(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,Ts(e,a)}}function Vc(e,t){var a=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,a===l)){var r=null,u=null;if(a=a.firstBaseUpdate,a!==null){do{var h={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};u===null?r=u=h:u=u.next=h,a=a.next}while(a!==null);u===null?r=u=t:u=u.next=t}else r=u=t;a={baseState:l.baseState,firstBaseUpdate:r,lastBaseUpdate:u,shared:l.shared,callbacks:l.callbacks},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}var Zc=!1;function Cr(){if(Zc){var e=Ci;if(e!==null)throw e}}function Tr(e,t,a,l){Zc=!1;var r=e.updateQueue;Zl=!1;var u=r.firstBaseUpdate,h=r.lastBaseUpdate,v=r.shared.pending;if(v!==null){r.shared.pending=null;var j=v,H=j.next;j.next=null,h===null?u=H:h.next=H,h=j;var k=e.alternate;k!==null&&(k=k.updateQueue,v=k.lastBaseUpdate,v!==h&&(v===null?k.firstBaseUpdate=H:v.next=H,k.lastBaseUpdate=j))}if(u!==null){var $=r.baseState;h=0,k=H=j=null,v=u;do{var Y=v.lane&-536870913,G=Y!==v.lane;if(G?(Ge&Y)===Y:(l&Y)===Y){Y!==0&&Y===Ri&&(Zc=!0),k!==null&&(k=k.next={lane:0,tag:v.tag,payload:v.payload,callback:null,next:null});e:{var me=e,Ce=v;Y=t;var st=a;switch(Ce.tag){case 1:if(me=Ce.payload,typeof me=="function"){$=me.call(st,$,Y);break e}$=me;break e;case 3:me.flags=me.flags&-65537|128;case 0:if(me=Ce.payload,Y=typeof me=="function"?me.call(st,$,Y):me,Y==null)break e;$=b({},$,Y);break e;case 2:Zl=!0}}Y=v.callback,Y!==null&&(e.flags|=64,G&&(e.flags|=8192),G=r.callbacks,G===null?r.callbacks=[Y]:G.push(Y))}else G={lane:Y,tag:v.tag,payload:v.payload,callback:v.callback,next:null},k===null?(H=k=G,j=$):k=k.next=G,h|=Y;if(v=v.next,v===null){if(v=r.shared.pending,v===null)break;G=v,v=G.next,G.next=null,r.lastBaseUpdate=G,r.shared.pending=null}}while(!0);k===null&&(j=$),r.baseState=j,r.firstBaseUpdate=H,r.lastBaseUpdate=k,u===null&&(r.shared.lanes=0),en|=h,e.lanes=h,e.memoizedState=$}}function yh(e,t){if(typeof e!="function")throw Error(c(191,e));e.call(t)}function ph(e,t){var a=e.callbacks;if(a!==null)for(e.callbacks=null,e=0;eu?u:8;var h=z.T,v={};z.T=v,ho(e,!1,t,a);try{var j=r(),H=z.S;if(H!==null&&H(v,j),j!==null&&typeof j=="object"&&typeof j.then=="function"){var k=sb(j,l);wr(e,t,k,Sa(e))}else wr(e,t,l,Sa(e))}catch($){wr(e,t,{then:function(){},status:"rejected",reason:$},Sa())}finally{V.p=u,h!==null&&v.types!==null&&(h.types=v.types),z.T=h}}function hb(){}function oo(e,t,a,l){if(e.tag!==5)throw Error(c(476));var r=Fh(e).queue;Zh(e,r,t,re,a===null?hb:function(){return Jh(e),a(l)})}function Fh(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:re,baseState:re,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:bl,lastRenderedState:re},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:bl,lastRenderedState:a},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Jh(e){var t=Fh(e);t.next===null&&(t=e.alternate.memoizedState),wr(e,t.next.queue,{},Sa())}function fo(){return Gt(Zr)}function $h(){return Nt().memoizedState}function Wh(){return Nt().memoizedState}function mb(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var a=Sa();e=Fl(a);var l=Jl(t,e,a);l!==null&&(ra(l,t,a),Rr(l,t,a)),t={cache:Qc()},e.payload=t;return}t=t.return}}function yb(e,t,a){var l=Sa();a={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},iu(e)?Ih(t,a):(a=Mc(e,t,a,l),a!==null&&(ra(a,e,l),em(a,t,l)))}function Ph(e,t,a){var l=Sa();wr(e,t,a,l)}function wr(e,t,a,l){var r={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(iu(e))Ih(t,r);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var h=t.lastRenderedState,v=u(h,a);if(r.hasEagerState=!0,r.eagerState=v,ma(v,h))return qs(e,t,r,0),ct===null&&Bs(),!1}catch{}finally{}if(a=Mc(e,t,r,l),a!==null)return ra(a,e,l),em(a,t,l),!0}return!1}function ho(e,t,a,l){if(l={lane:2,revertLane:ko(),gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},iu(e)){if(t)throw Error(c(479))}else t=Mc(e,a,l,2),t!==null&&ra(t,e,2)}function iu(e){var t=e.alternate;return e===Oe||t!==null&&t===Oe}function Ih(e,t){wi=Ps=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function em(e,t,a){if((a&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,Ts(e,a)}}var Or={readContext:Gt,use:tu,useCallback:bt,useContext:bt,useEffect:bt,useImperativeHandle:bt,useLayoutEffect:bt,useInsertionEffect:bt,useMemo:bt,useReducer:bt,useRef:bt,useState:bt,useDebugValue:bt,useDeferredValue:bt,useTransition:bt,useSyncExternalStore:bt,useId:bt,useHostTransitionStatus:bt,useFormState:bt,useActionState:bt,useOptimistic:bt,useMemoCache:bt,useCacheRefresh:bt};Or.useEffectEvent=bt;var tm={readContext:Gt,use:tu,useCallback:function(e,t){return Wt().memoizedState=[e,t===void 0?null:t],e},useContext:Gt,useEffect:Bh,useImperativeHandle:function(e,t,a){a=a!=null?a.concat([e]):null,lu(4194308,4,Gh.bind(null,t,e),a)},useLayoutEffect:function(e,t){return lu(4194308,4,e,t)},useInsertionEffect:function(e,t){lu(4,2,e,t)},useMemo:function(e,t){var a=Wt();t=t===void 0?null:t;var l=e();if(Gn){Lt(!0);try{e()}finally{Lt(!1)}}return a.memoizedState=[l,t],l},useReducer:function(e,t,a){var l=Wt();if(a!==void 0){var r=a(t);if(Gn){Lt(!0);try{a(t)}finally{Lt(!1)}}}else r=t;return l.memoizedState=l.baseState=r,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:r},l.queue=e,e=e.dispatch=yb.bind(null,Oe,e),[l.memoizedState,e]},useRef:function(e){var t=Wt();return e={current:e},t.memoizedState=e},useState:function(e){e=io(e);var t=e.queue,a=Ph.bind(null,Oe,t);return t.dispatch=a,[e.memoizedState,a]},useDebugValue:uo,useDeferredValue:function(e,t){var a=Wt();return co(a,e,t)},useTransition:function(){var e=io(!1);return e=Zh.bind(null,Oe,e.queue,!0,!1),Wt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,a){var l=Oe,r=Wt();if(Xe){if(a===void 0)throw Error(c(407));a=a()}else{if(a=t(),ct===null)throw Error(c(349));(Ge&127)!==0||jh(l,t,a)}r.memoizedState=a;var u={value:a,getSnapshot:t};return r.queue=u,Bh(Nh.bind(null,l,u,e),[e]),l.flags|=2048,Di(9,{destroy:void 0},Eh.bind(null,l,u,a,t),null),a},useId:function(){var e=Wt(),t=ct.identifierPrefix;if(Xe){var a=tl,l=el;a=(l&~(1<<32-kt(l)-1)).toString(32)+a,t="_"+t+"R_"+a,a=Is++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof l.is=="string"?h.createElement("select",{is:l.is}):h.createElement("select"),l.multiple?u.multiple=!0:l.size&&(u.size=l.size);break;default:u=typeof l.is=="string"?h.createElement(r,{is:l.is}):h.createElement(r)}}u[ue]=t,u[pe]=l;e:for(h=t.child;h!==null;){if(h.tag===5||h.tag===6)u.appendChild(h.stateNode);else if(h.tag!==4&&h.tag!==27&&h.child!==null){h.child.return=h,h=h.child;continue}if(h===t)break e;for(;h.sibling===null;){if(h.return===null||h.return===t)break e;h=h.return}h.sibling.return=h.return,h=h.sibling}t.stateNode=u;e:switch(Xt(u,r,l),r){case"button":case"input":case"select":case"textarea":l=!!l.autoFocus;break e;case"img":l=!0;break e;default:l=!1}l&&xl(t)}}return yt(t),To(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,a),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==l&&xl(t);else{if(typeof l!="string"&&t.stateNode===null)throw Error(c(166));if(e=ge.current,Ei(t)){if(e=t.stateNode,a=t.memoizedProps,l=null,r=Yt,r!==null)switch(r.tag){case 27:case 5:l=r.memoizedProps}e[ue]=t,e=!!(e.nodeValue===a||l!==null&&l.suppressHydrationWarning===!0||Sy(e.nodeValue,a)),e||kl(t,!0)}else e=Ru(e).createTextNode(l),e[ue]=t,t.stateNode=e}return yt(t),null;case 31:if(a=t.memoizedState,e===null||e.memoizedState!==null){if(l=Ei(t),a!==null){if(e===null){if(!l)throw Error(c(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(c(557));e[ue]=t}else Un(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;yt(t),e=!1}else a=Lc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),e=!0;if(!e)return t.flags&256?(va(t),t):(va(t),null);if((t.flags&128)!==0)throw Error(c(558))}return yt(t),null;case 13:if(l=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(r=Ei(t),l!==null&&l.dehydrated!==null){if(e===null){if(!r)throw Error(c(318));if(r=t.memoizedState,r=r!==null?r.dehydrated:null,!r)throw Error(c(317));r[ue]=t}else Un(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;yt(t),r=!1}else r=Lc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=r),r=!0;if(!r)return t.flags&256?(va(t),t):(va(t),null)}return va(t),(t.flags&128)!==0?(t.lanes=a,t):(a=l!==null,e=e!==null&&e.memoizedState!==null,a&&(l=t.child,r=null,l.alternate!==null&&l.alternate.memoizedState!==null&&l.alternate.memoizedState.cachePool!==null&&(r=l.alternate.memoizedState.cachePool.pool),u=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(u=l.memoizedState.cachePool.pool),u!==r&&(l.flags|=2048)),a!==e&&a&&(t.child.flags|=8192),ou(t,t.updateQueue),yt(t),null);case 4:return He(),e===null&&Jo(t.stateNode.containerInfo),yt(t),null;case 10:return vl(t.type),yt(t),null;case 19:if(K(Et),l=t.memoizedState,l===null)return yt(t),null;if(r=(t.flags&128)!==0,u=l.rendering,u===null)if(r)zr(l,!1);else{if(St!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(u=Ws(e),u!==null){for(t.flags|=128,zr(l,!1),e=u.updateQueue,t.updateQueue=e,ou(t,e),t.subtreeFlags=0,e=a,a=t.child;a!==null;)Pd(a,e),a=a.sibling;return q(Et,Et.current&1|2),Xe&&yl(t,l.treeForkCount),t.child}e=e.sibling}l.tail!==null&&Ut()>yu&&(t.flags|=128,r=!0,zr(l,!1),t.lanes=4194304)}else{if(!r)if(e=Ws(u),e!==null){if(t.flags|=128,r=!0,e=e.updateQueue,t.updateQueue=e,ou(t,e),zr(l,!0),l.tail===null&&l.tailMode==="hidden"&&!u.alternate&&!Xe)return yt(t),null}else 2*Ut()-l.renderingStartTime>yu&&a!==536870912&&(t.flags|=128,r=!0,zr(l,!1),t.lanes=4194304);l.isBackwards?(u.sibling=t.child,t.child=u):(e=l.last,e!==null?e.sibling=u:t.child=u,l.last=u)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=Ut(),e.sibling=null,a=Et.current,q(Et,r?a&1|2:a&1),Xe&&yl(t,l.treeForkCount),e):(yt(t),null);case 22:case 23:return va(t),Jc(),l=t.memoizedState!==null,e!==null?e.memoizedState!==null!==l&&(t.flags|=8192):l&&(t.flags|=8192),l?(a&536870912)!==0&&(t.flags&128)===0&&(yt(t),t.subtreeFlags&6&&(t.flags|=8192)):yt(t),a=t.updateQueue,a!==null&&ou(t,a.retryQueue),a=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),l=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),l!==a&&(t.flags|=2048),e!==null&&K(Bn),null;case 24:return a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),vl(_t),yt(t),null;case 25:return null;case 30:return null}throw Error(c(156,t.tag))}function Sb(e,t){switch(Ac(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return vl(_t),He(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ja(t),null;case 31:if(t.memoizedState!==null){if(va(t),t.alternate===null)throw Error(c(340));Un()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(va(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(c(340));Un()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return K(Et),null;case 4:return He(),null;case 10:return vl(t.type),null;case 22:case 23:return va(t),Jc(),e!==null&&K(Bn),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return vl(_t),null;case 25:return null;default:return null}}function Rm(e,t){switch(Ac(t),t.tag){case 3:vl(_t),He();break;case 26:case 27:case 5:Ja(t);break;case 4:He();break;case 31:t.memoizedState!==null&&va(t);break;case 13:va(t);break;case 19:K(Et);break;case 10:vl(t.type);break;case 22:case 23:va(t),Jc(),e!==null&&K(Bn);break;case 24:vl(_t)}}function Ar(e,t){try{var a=t.updateQueue,l=a!==null?a.lastEffect:null;if(l!==null){var r=l.next;a=r;do{if((a.tag&e)===e){l=void 0;var u=a.create,h=a.inst;l=u(),h.destroy=l}a=a.next}while(a!==r)}}catch(v){lt(t,t.return,v)}}function Pl(e,t,a){try{var l=t.updateQueue,r=l!==null?l.lastEffect:null;if(r!==null){var u=r.next;l=u;do{if((l.tag&e)===e){var h=l.inst,v=h.destroy;if(v!==void 0){h.destroy=void 0,r=t;var j=a,H=v;try{H()}catch(k){lt(r,j,k)}}}l=l.next}while(l!==u)}}catch(k){lt(t,t.return,k)}}function Cm(e){var t=e.updateQueue;if(t!==null){var a=e.stateNode;try{ph(t,a)}catch(l){lt(e,e.return,l)}}}function Tm(e,t,a){a.props=Kn(e.type,e.memoizedProps),a.state=e.memoizedState;try{a.componentWillUnmount()}catch(l){lt(e,t,l)}}function Ur(e,t){try{var a=e.ref;if(a!==null){switch(e.tag){case 26:case 27:case 5:var l=e.stateNode;break;case 30:l=e.stateNode;break;default:l=e.stateNode}typeof a=="function"?e.refCleanup=a(l):a.current=l}}catch(r){lt(e,t,r)}}function al(e,t){var a=e.ref,l=e.refCleanup;if(a!==null)if(typeof l=="function")try{l()}catch(r){lt(e,t,r)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(r){lt(e,t,r)}else a.current=null}function _m(e){var t=e.type,a=e.memoizedProps,l=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&l.focus();break e;case"img":a.src?l.src=a.src:a.srcSet&&(l.srcset=a.srcSet)}}catch(r){lt(e,e.return,r)}}function _o(e,t,a){try{var l=e.stateNode;Gb(l,e.type,a,t),l[pe]=t}catch(r){lt(e,e.return,r)}}function Mm(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&rn(e.type)||e.tag===4}function Mo(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Mm(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&rn(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function wo(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(e,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(e),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=dl));else if(l!==4&&(l===27&&rn(e.type)&&(a=e.stateNode,t=null),e=e.child,e!==null))for(wo(e,t,a),e=e.sibling;e!==null;)wo(e,t,a),e=e.sibling}function fu(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(l!==4&&(l===27&&rn(e.type)&&(a=e.stateNode),e=e.child,e!==null))for(fu(e,t,a),e=e.sibling;e!==null;)fu(e,t,a),e=e.sibling}function wm(e){var t=e.stateNode,a=e.memoizedProps;try{for(var l=e.type,r=t.attributes;r.length;)t.removeAttributeNode(r[0]);Xt(t,l,a),t[ue]=e,t[pe]=a}catch(u){lt(e,e.return,u)}}var jl=!1,Ot=!1,Oo=!1,Om=typeof WeakSet=="function"?WeakSet:Set,Bt=null;function xb(e,t){if(e=e.containerInfo,Po=Du,e=Kd(e),Ec(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var l=a.getSelection&&a.getSelection();if(l&&l.rangeCount!==0){a=l.anchorNode;var r=l.anchorOffset,u=l.focusNode;l=l.focusOffset;try{a.nodeType,u.nodeType}catch{a=null;break e}var h=0,v=-1,j=-1,H=0,k=0,$=e,Y=null;t:for(;;){for(var G;$!==a||r!==0&&$.nodeType!==3||(v=h+r),$!==u||l!==0&&$.nodeType!==3||(j=h+l),$.nodeType===3&&(h+=$.nodeValue.length),(G=$.firstChild)!==null;)Y=$,$=G;for(;;){if($===e)break t;if(Y===a&&++H===r&&(v=h),Y===u&&++k===l&&(j=h),(G=$.nextSibling)!==null)break;$=Y,Y=$.parentNode}$=G}a=v===-1||j===-1?null:{start:v,end:j}}else a=null}a=a||{start:0,end:0}}else a=null;for(Io={focusedElem:e,selectionRange:a},Du=!1,Bt=t;Bt!==null;)if(t=Bt,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Bt=e;else for(;Bt!==null;){switch(t=Bt,u=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(a=0;a title"))),Xt(u,l,a),u[ue]=e,ft(u),l=u;break e;case"link":var h=Hy("link","href",r).get(l+(a.href||""));if(h){for(var v=0;vst&&(h=st,st=Ce,Ce=h);var w=Yd(v,Ce),T=Yd(v,st);if(w&&T&&(G.rangeCount!==1||G.anchorNode!==w.node||G.anchorOffset!==w.offset||G.focusNode!==T.node||G.focusOffset!==T.offset)){var U=$.createRange();U.setStart(w.node,w.offset),G.removeAllRanges(),Ce>st?(G.addRange(U),G.extend(T.node,T.offset)):(U.setEnd(T.node,T.offset),G.addRange(U))}}}}for($=[],G=v;G=G.parentNode;)G.nodeType===1&&$.push({element:G,left:G.scrollLeft,top:G.scrollTop});for(typeof v.focus=="function"&&v.focus(),v=0;v<$.length;v++){var Z=$[v];Z.element.scrollLeft=Z.left,Z.element.scrollTop=Z.top}}Du=!!Po,Io=Po=null}finally{Ie=r,V.p=l,z.T=a}}e.current=t,Dt=2}}function ny(){if(Dt===2){Dt=0;var e=an,t=Hi,a=(t.flags&8772)!==0;if((t.subtreeFlags&8772)!==0||a){a=z.T,z.T=null;var l=V.p;V.p=2;var r=Ie;Ie|=4;try{Dm(e,t.alternate,t)}finally{Ie=r,V.p=l,z.T=a}}Dt=3}}function iy(){if(Dt===4||Dt===3){Dt=0,si();var e=an,t=Hi,a=Tl,l=km;(t.subtreeFlags&10256)!==0||(t.flags&10256)!==0?Dt=5:(Dt=0,Hi=an=null,ry(e,e.pendingLanes));var r=e.pendingLanes;if(r===0&&(tn=null),B(a),t=t.stateNode,$t&&typeof $t.onCommitFiberRoot=="function")try{$t.onCommitFiberRoot(ha,t,void 0,(t.current.flags&128)===128)}catch{}if(l!==null){t=z.T,r=V.p,V.p=2,z.T=null;try{for(var u=e.onRecoverableError,h=0;ha?32:a,z.T=null,a=Bo,Bo=null;var u=an,h=Tl;if(Dt=0,Hi=an=null,Tl=0,(Ie&6)!==0)throw Error(c(331));var v=Ie;if(Ie|=4,Gm(u.current),qm(u,u.current,h,a),Ie=v,Yr(0,!1),$t&&typeof $t.onPostCommitFiberRoot=="function")try{$t.onPostCommitFiberRoot(ha,u)}catch{}return!0}finally{V.p=r,z.T=l,ry(e,t)}}function uy(e,t,a){t=Ta(a,t),t=vo(e.stateNode,t,2),e=Jl(e,t,2),e!==null&&(Wa(e,2),ll(e))}function lt(e,t,a){if(e.tag===3)uy(e,e,a);else for(;t!==null;){if(t.tag===3){uy(t,e,a);break}else if(t.tag===1){var l=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof l.componentDidCatch=="function"&&(tn===null||!tn.has(l))){e=Ta(a,e),a=cm(2),l=Jl(t,a,2),l!==null&&(om(a,l,t,e),Wa(l,2),ll(l));break}}t=t.return}}function Go(e,t,a){var l=e.pingCache;if(l===null){l=e.pingCache=new Nb;var r=new Set;l.set(t,r)}else r=l.get(t),r===void 0&&(r=new Set,l.set(t,r));r.has(a)||(Ao=!0,r.add(a),e=Mb.bind(null,e,t,a),t.then(e,e))}function Mb(e,t,a){var l=e.pingCache;l!==null&&l.delete(t),e.pingedLanes|=e.suspendedLanes&a,e.warmLanes&=~a,ct===e&&(Ge&a)===a&&(St===4||St===3&&(Ge&62914560)===Ge&&300>Ut()-mu?(Ie&2)===0&&Bi(e,0):Uo|=a,Li===Ge&&(Li=0)),ll(e)}function cy(e,t){t===0&&(t=cr()),e=zn(e,t),e!==null&&(Wa(e,t),ll(e))}function wb(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),cy(e,a)}function Ob(e,t){var a=0;switch(e.tag){case 31:case 13:var l=e.stateNode,r=e.memoizedState;r!==null&&(a=r.retryLane);break;case 19:l=e.stateNode;break;case 22:l=e.stateNode._retryCache;break;default:throw Error(c(314))}l!==null&&l.delete(t),cy(e,a)}function Db(e,t){return cl(e,t)}var xu=null,Qi=null,Ko=!1,ju=!1,Xo=!1,nn=0;function ll(e){e!==Qi&&e.next===null&&(Qi===null?xu=Qi=e:Qi=Qi.next=e),ju=!0,Ko||(Ko=!0,Ab())}function Yr(e,t){if(!Xo&&ju){Xo=!0;do for(var a=!1,l=xu;l!==null;){if(e!==0){var r=l.pendingLanes;if(r===0)var u=0;else{var h=l.suspendedLanes,v=l.pingedLanes;u=(1<<31-kt(42|e)+1)-1,u&=r&~(h&~v),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(a=!0,hy(l,u))}else u=Ge,u=ui(l,l===ct?u:0,l.cancelPendingCommit!==null||l.timeoutHandle!==-1),(u&3)===0||ql(l,u)||(a=!0,hy(l,u));l=l.next}while(a);Xo=!1}}function zb(){oy()}function oy(){ju=Ko=!1;var e=0;nn!==0&&Xb()&&(e=nn);for(var t=Ut(),a=null,l=xu;l!==null;){var r=l.next,u=fy(l,t);u===0?(l.next=null,a===null?xu=r:a.next=r,r===null&&(Qi=a)):(a=l,(e!==0||(u&3)!==0)&&(ju=!0)),l=r}Dt!==0&&Dt!==5||Yr(e),nn!==0&&(nn=0)}function fy(e,t){for(var a=e.suspendedLanes,l=e.pingedLanes,r=e.expirationTimes,u=e.pendingLanes&-62914561;0v)break;var k=j.transferSize,$=j.initiatorType;k&&xy($)&&(j=j.responseEnd,h+=k*(j"u"?null:document;function zy(e,t,a){var l=Yi;if(l&&typeof t=="string"&&t){var r=Ra(t);r='link[rel="'+e+'"][href="'+r+'"]',typeof a=="string"&&(r+='[crossorigin="'+a+'"]'),Dy.has(r)||(Dy.add(r),e={rel:e,crossOrigin:a,href:t},l.querySelector(r)===null&&(t=l.createElement("link"),Xt(t,"link",e),ft(t),l.head.appendChild(t)))}}function Ib(e){_l.D(e),zy("dns-prefetch",e,null)}function e0(e,t){_l.C(e,t),zy("preconnect",e,t)}function t0(e,t,a){_l.L(e,t,a);var l=Yi;if(l&&e&&t){var r='link[rel="preload"][as="'+Ra(t)+'"]';t==="image"&&a&&a.imageSrcSet?(r+='[imagesrcset="'+Ra(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(r+='[imagesizes="'+Ra(a.imageSizes)+'"]')):r+='[href="'+Ra(e)+'"]';var u=r;switch(t){case"style":u=Gi(e);break;case"script":u=Ki(e)}za.has(u)||(e=b({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:e,as:t},a),za.set(u,e),l.querySelector(r)!==null||t==="style"&&l.querySelector(kr(u))||t==="script"&&l.querySelector(Vr(u))||(t=l.createElement("link"),Xt(t,"link",e),ft(t),l.head.appendChild(t)))}}function a0(e,t){_l.m(e,t);var a=Yi;if(a&&e){var l=t&&typeof t.as=="string"?t.as:"script",r='link[rel="modulepreload"][as="'+Ra(l)+'"][href="'+Ra(e)+'"]',u=r;switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=Ki(e)}if(!za.has(u)&&(e=b({rel:"modulepreload",href:e},t),za.set(u,e),a.querySelector(r)===null)){switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(Vr(u)))return}l=a.createElement("link"),Xt(l,"link",e),ft(l),a.head.appendChild(l)}}}function l0(e,t,a){_l.S(e,t,a);var l=Yi;if(l&&e){var r=Ct(l).hoistableStyles,u=Gi(e);t=t||"default";var h=r.get(u);if(!h){var v={loading:0,preload:null};if(h=l.querySelector(kr(u)))v.loading=5;else{e=b({rel:"stylesheet",href:e,"data-precedence":t},a),(a=za.get(u))&&sf(e,a);var j=h=l.createElement("link");ft(j),Xt(j,"link",e),j._p=new Promise(function(H,k){j.onload=H,j.onerror=k}),j.addEventListener("load",function(){v.loading|=1}),j.addEventListener("error",function(){v.loading|=2}),v.loading|=4,Tu(h,t,l)}h={type:"stylesheet",instance:h,count:1,state:v},r.set(u,h)}}}function n0(e,t){_l.X(e,t);var a=Yi;if(a&&e){var l=Ct(a).hoistableScripts,r=Ki(e),u=l.get(r);u||(u=a.querySelector(Vr(r)),u||(e=b({src:e,async:!0},t),(t=za.get(r))&&uf(e,t),u=a.createElement("script"),ft(u),Xt(u,"link",e),a.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},l.set(r,u))}}function i0(e,t){_l.M(e,t);var a=Yi;if(a&&e){var l=Ct(a).hoistableScripts,r=Ki(e),u=l.get(r);u||(u=a.querySelector(Vr(r)),u||(e=b({src:e,async:!0,type:"module"},t),(t=za.get(r))&&uf(e,t),u=a.createElement("script"),ft(u),Xt(u,"link",e),a.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},l.set(r,u))}}function Ay(e,t,a,l){var r=(r=ge.current)?Cu(r):null;if(!r)throw Error(c(446));switch(e){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Gi(a.href),a=Ct(r).hoistableStyles,l=a.get(t),l||(l={type:"style",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){e=Gi(a.href);var u=Ct(r).hoistableStyles,h=u.get(e);if(h||(r=r.ownerDocument||r,h={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,h),(u=r.querySelector(kr(e)))&&!u._p&&(h.instance=u,h.state.loading=5),za.has(e)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},za.set(e,a),u||r0(r,e,a,h.state))),t&&l===null)throw Error(c(528,""));return h}if(t&&l!==null)throw Error(c(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Ki(a),a=Ct(r).hoistableScripts,l=a.get(t),l||(l={type:"script",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};default:throw Error(c(444,e))}}function Gi(e){return'href="'+Ra(e)+'"'}function kr(e){return'link[rel="stylesheet"]['+e+"]"}function Uy(e){return b({},e,{"data-precedence":e.precedence,precedence:null})}function r0(e,t,a,l){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?l.loading=1:(t=e.createElement("link"),l.preload=t,t.addEventListener("load",function(){return l.loading|=1}),t.addEventListener("error",function(){return l.loading|=2}),Xt(t,"link",a),ft(t),e.head.appendChild(t))}function Ki(e){return'[src="'+Ra(e)+'"]'}function Vr(e){return"script[async]"+e}function Ly(e,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var l=e.querySelector('style[data-href~="'+Ra(a.href)+'"]');if(l)return t.instance=l,ft(l),l;var r=b({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return l=(e.ownerDocument||e).createElement("style"),ft(l),Xt(l,"style",r),Tu(l,a.precedence,e),t.instance=l;case"stylesheet":r=Gi(a.href);var u=e.querySelector(kr(r));if(u)return t.state.loading|=4,t.instance=u,ft(u),u;l=Uy(a),(r=za.get(r))&&sf(l,r),u=(e.ownerDocument||e).createElement("link"),ft(u);var h=u;return h._p=new Promise(function(v,j){h.onload=v,h.onerror=j}),Xt(u,"link",l),t.state.loading|=4,Tu(u,a.precedence,e),t.instance=u;case"script":return u=Ki(a.src),(r=e.querySelector(Vr(u)))?(t.instance=r,ft(r),r):(l=a,(r=za.get(u))&&(l=b({},a),uf(l,r)),e=e.ownerDocument||e,r=e.createElement("script"),ft(r),Xt(r,"link",l),e.head.appendChild(r),t.instance=r);case"void":return null;default:throw Error(c(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(l=t.instance,t.state.loading|=4,Tu(l,a.precedence,e));return t.instance}function Tu(e,t,a){for(var l=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),r=l.length?l[l.length-1]:null,u=r,h=0;h title"):null)}function s0(e,t,a){if(a===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function qy(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function u0(e,t,a,l){if(a.type==="stylesheet"&&(typeof l.media!="string"||matchMedia(l.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var r=Gi(l.href),u=t.querySelector(kr(r));if(u){t=u._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Mu.bind(e),t.then(e,e)),a.state.loading|=4,a.instance=u,ft(u);return}u=t.ownerDocument||t,l=Uy(l),(r=za.get(r))&&sf(l,r),u=u.createElement("link"),ft(u);var h=u;h._p=new Promise(function(v,j){h.onload=v,h.onerror=j}),Xt(u,"link",l),a.instance=u}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(e.count++,a=Mu.bind(e),t.addEventListener("load",a),t.addEventListener("error",a))}}var cf=0;function c0(e,t){return e.stylesheets&&e.count===0&&Ou(e,e.stylesheets),0cf?50:800)+t);return e.unsuspend=a,function(){e.unsuspend=null,clearTimeout(l),clearTimeout(r)}}:null}function Mu(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Ou(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var wu=null;function Ou(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,wu=new Map,t.forEach(o0,e),wu=null,Mu.call(e))}function o0(e,t){if(!(t.state.loading&4)){var a=wu.get(e);if(a)var l=a.get(null);else{a=new Map,wu.set(e,a);for(var r=e.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(i){console.error(i)}}return n(),bf.exports=M0(),bf.exports}var O0=w0();const D0=yv(O0);var sr=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(n){return this.listeners.add(n),this.onSubscribe(),()=>{this.listeners.delete(n),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Fn,yn,Fi,nv,z0=(nv=class extends sr{constructor(){super();Ee(this,Fn);Ee(this,yn);Ee(this,Fi);oe(this,Fi,i=>{if(typeof window<"u"&&window.addEventListener){const s=()=>i();return window.addEventListener("visibilitychange",s,!1),()=>{window.removeEventListener("visibilitychange",s)}}})}onSubscribe(){N(this,yn)||this.setEventListener(N(this,Fi))}onUnsubscribe(){var i;this.hasListeners()||((i=N(this,yn))==null||i.call(this),oe(this,yn,void 0))}setEventListener(i){var s;oe(this,Fi,i),(s=N(this,yn))==null||s.call(this),oe(this,yn,i(c=>{typeof c=="boolean"?this.setFocused(c):this.onFocus()}))}setFocused(i){N(this,Fn)!==i&&(oe(this,Fn,i),this.onFocus())}onFocus(){const i=this.isFocused();this.listeners.forEach(s=>{s(i)})}isFocused(){var i;return typeof N(this,Fn)=="boolean"?N(this,Fn):((i=globalThis.document)==null?void 0:i.visibilityState)!=="hidden"}},Fn=new WeakMap,yn=new WeakMap,Fi=new WeakMap,nv),Jf=new z0,A0={setTimeout:(n,i)=>setTimeout(n,i),clearTimeout:n=>clearTimeout(n),setInterval:(n,i)=>setInterval(n,i),clearInterval:n=>clearInterval(n)},pn,Zf,iv,U0=(iv=class{constructor(){Ee(this,pn,A0);Ee(this,Zf,!1)}setTimeoutProvider(n){oe(this,pn,n)}setTimeout(n,i){return N(this,pn).setTimeout(n,i)}clearTimeout(n){N(this,pn).clearTimeout(n)}setInterval(n,i){return N(this,pn).setInterval(n,i)}clearInterval(n){N(this,pn).clearInterval(n)}},pn=new WeakMap,Zf=new WeakMap,iv),Vn=new U0;function L0(n){setTimeout(n,0)}var H0=typeof window>"u"||"Deno"in globalThis;function It(){}function B0(n,i){return typeof n=="function"?n(i):n}function Mf(n){return typeof n=="number"&&n>=0&&n!==1/0}function gv(n,i){return Math.max(n+(i||0)-Date.now(),0)}function Rn(n,i){return typeof n=="function"?n(i):n}function La(n,i){return typeof n=="function"?n(i):n}function fp(n,i){const{type:s="all",exact:c,fetchStatus:f,predicate:d,queryKey:m,stale:y}=n;if(m){if(c){if(i.queryHash!==$f(m,i.options))return!1}else if(!rs(i.queryKey,m))return!1}if(s!=="all"){const g=i.isActive();if(s==="active"&&!g||s==="inactive"&&g)return!1}return!(typeof y=="boolean"&&i.isStale()!==y||f&&f!==i.state.fetchStatus||d&&!d(i))}function dp(n,i){const{exact:s,status:c,predicate:f,mutationKey:d}=n;if(d){if(!i.options.mutationKey)return!1;if(s){if(li(i.options.mutationKey)!==li(d))return!1}else if(!rs(i.options.mutationKey,d))return!1}return!(c&&i.state.status!==c||f&&!f(i))}function $f(n,i){return((i==null?void 0:i.queryKeyHashFn)||li)(n)}function li(n){return JSON.stringify(n,(i,s)=>wf(s)?Object.keys(s).sort().reduce((c,f)=>(c[f]=s[f],c),{}):s)}function rs(n,i){return n===i?!0:typeof n!=typeof i?!1:n&&i&&typeof n=="object"&&typeof i=="object"?Object.keys(i).every(s=>rs(n[s],i[s])):!1}var q0=Object.prototype.hasOwnProperty;function bv(n,i,s=0){if(n===i)return n;if(s>500)return i;const c=hp(n)&&hp(i);if(!c&&!(wf(n)&&wf(i)))return i;const d=(c?n:Object.keys(n)).length,m=c?i:Object.keys(i),y=m.length,g=c?new Array(y):{};let p=0;for(let x=0;x{Vn.setTimeout(i,n)})}function Of(n,i,s){return typeof s.structuralSharing=="function"?s.structuralSharing(n,i):s.structuralSharing!==!1?bv(n,i):i}function Y0(n,i,s=0){const c=[...n,i];return s&&c.length>s?c.slice(1):c}function G0(n,i,s=0){const c=[i,...n];return s&&c.length>s?c.slice(0,-1):c}var Wf=Symbol();function Sv(n,i){return!n.queryFn&&(i!=null&&i.initialPromise)?()=>i.initialPromise:!n.queryFn||n.queryFn===Wf?()=>Promise.reject(new Error(`Missing queryFn: '${n.queryHash}'`)):n.queryFn}function Pf(n,i){return typeof n=="function"?n(...i):!!n}function K0(n,i,s){let c=!1,f;return Object.defineProperty(n,"signal",{enumerable:!0,get:()=>(f??(f=i()),c||(c=!0,f.aborted?s():f.addEventListener("abort",s,{once:!0})),f)}),n}var ss=(()=>{let n=()=>H0;return{isServer(){return n()},setIsServer(i){n=i}}})();function Df(){let n,i;const s=new Promise((f,d)=>{n=f,i=d});s.status="pending",s.catch(()=>{});function c(f){Object.assign(s,f),delete s.resolve,delete s.reject}return s.resolve=f=>{c({status:"fulfilled",value:f}),n(f)},s.reject=f=>{c({status:"rejected",reason:f}),i(f)},s}var X0=L0;function k0(){let n=[],i=0,s=y=>{y()},c=y=>{y()},f=X0;const d=y=>{i?n.push(y):f(()=>{s(y)})},m=()=>{const y=n;n=[],y.length&&f(()=>{c(()=>{y.forEach(g=>{s(g)})})})};return{batch:y=>{let g;i++;try{g=y()}finally{i--,i||m()}return g},batchCalls:y=>(...g)=>{d(()=>{y(...g)})},schedule:d,setNotifyFunction:y=>{s=y},setBatchNotifyFunction:y=>{c=y},setScheduler:y=>{f=y}}}var zt=k0(),Ji,vn,$i,rv,V0=(rv=class extends sr{constructor(){super();Ee(this,Ji,!0);Ee(this,vn);Ee(this,$i);oe(this,$i,i=>{if(typeof window<"u"&&window.addEventListener){const s=()=>i(!0),c=()=>i(!1);return window.addEventListener("online",s,!1),window.addEventListener("offline",c,!1),()=>{window.removeEventListener("online",s),window.removeEventListener("offline",c)}}})}onSubscribe(){N(this,vn)||this.setEventListener(N(this,$i))}onUnsubscribe(){var i;this.hasListeners()||((i=N(this,vn))==null||i.call(this),oe(this,vn,void 0))}setEventListener(i){var s;oe(this,$i,i),(s=N(this,vn))==null||s.call(this),oe(this,vn,i(this.setOnline.bind(this)))}setOnline(i){N(this,Ji)!==i&&(oe(this,Ji,i),this.listeners.forEach(c=>{c(i)}))}isOnline(){return N(this,Ji)}},Ji=new WeakMap,vn=new WeakMap,$i=new WeakMap,rv),Wu=new V0;function Z0(n){return Math.min(1e3*2**n,3e4)}function xv(n){return(n??"online")==="online"?Wu.isOnline():!0}var zf=class extends Error{constructor(n){super("CancelledError"),this.revert=n==null?void 0:n.revert,this.silent=n==null?void 0:n.silent}};function jv(n){let i=!1,s=0,c;const f=Df(),d=()=>f.status!=="pending",m=D=>{var L;if(!d()){const X=new zf(D);_(X),(L=n.onCancel)==null||L.call(n,X)}},y=()=>{i=!0},g=()=>{i=!1},p=()=>Jf.isFocused()&&(n.networkMode==="always"||Wu.isOnline())&&n.canRun(),x=()=>xv(n.networkMode)&&n.canRun(),b=D=>{d()||(c==null||c(),f.resolve(D))},_=D=>{d()||(c==null||c(),f.reject(D))},C=()=>new Promise(D=>{var L;c=X=>{(d()||p())&&D(X)},(L=n.onPause)==null||L.call(n)}).then(()=>{var D;c=void 0,d()||(D=n.onContinue)==null||D.call(n)}),A=()=>{if(d())return;let D;const L=s===0?n.initialPromise:void 0;try{D=L??n.fn()}catch(X){D=Promise.reject(X)}Promise.resolve(D).then(b).catch(X=>{var fe;if(d())return;const W=n.retry??(ss.isServer()?0:3),F=n.retryDelay??Z0,P=typeof F=="function"?F(s,X):F,ae=W===!0||typeof W=="number"&&sp()?void 0:C()).then(()=>{i?_(X):A()})})};return{promise:f,status:()=>f.status,cancel:m,continue:()=>(c==null||c(),f),cancelRetry:y,continueRetry:g,canStart:x,start:()=>(x()?A():C().then(A),f)}}var Jn,sv,Ev=(sv=class{constructor(){Ee(this,Jn)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Mf(this.gcTime)&&oe(this,Jn,Vn.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(n){this.gcTime=Math.max(this.gcTime||0,n??(ss.isServer()?1/0:300*1e3))}clearGcTimeout(){N(this,Jn)!==void 0&&(Vn.clearTimeout(N(this,Jn)),oe(this,Jn,void 0))}},Jn=new WeakMap,sv),$n,Wi,Aa,Wn,qt,fs,Pn,xa,Nv,Ml,uv,F0=(uv=class extends Ev{constructor(i){super();Ee(this,xa);Ee(this,$n);Ee(this,Wi);Ee(this,Aa);Ee(this,Wn);Ee(this,qt);Ee(this,fs);Ee(this,Pn);oe(this,Pn,!1),oe(this,fs,i.defaultOptions),this.setOptions(i.options),this.observers=[],oe(this,Wn,i.client),oe(this,Aa,N(this,Wn).getQueryCache()),this.queryKey=i.queryKey,this.queryHash=i.queryHash,oe(this,$n,pp(this.options)),this.state=i.state??N(this,$n),this.scheduleGc()}get meta(){return this.options.meta}get promise(){var i;return(i=N(this,qt))==null?void 0:i.promise}setOptions(i){if(this.options={...N(this,fs),...i},this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const s=pp(this.options);s.data!==void 0&&(this.setState(yp(s.data,s.dataUpdatedAt)),oe(this,$n,s))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&N(this,Aa).remove(this)}setData(i,s){const c=Of(this.state.data,i,this.options);return Ue(this,xa,Ml).call(this,{data:c,type:"success",dataUpdatedAt:s==null?void 0:s.updatedAt,manual:s==null?void 0:s.manual}),c}setState(i,s){Ue(this,xa,Ml).call(this,{type:"setState",state:i,setStateOptions:s})}cancel(i){var c,f;const s=(c=N(this,qt))==null?void 0:c.promise;return(f=N(this,qt))==null||f.cancel(i),s?s.then(It).catch(It):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return N(this,$n)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(i=>La(i.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===Wf||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(i=>Rn(i.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(i=>i.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(i=0){return this.state.data===void 0?!0:i==="static"?!1:this.state.isInvalidated?!0:!gv(this.state.dataUpdatedAt,i)}onFocus(){var s;const i=this.observers.find(c=>c.shouldFetchOnWindowFocus());i==null||i.refetch({cancelRefetch:!1}),(s=N(this,qt))==null||s.continue()}onOnline(){var s;const i=this.observers.find(c=>c.shouldFetchOnReconnect());i==null||i.refetch({cancelRefetch:!1}),(s=N(this,qt))==null||s.continue()}addObserver(i){this.observers.includes(i)||(this.observers.push(i),this.clearGcTimeout(),N(this,Aa).notify({type:"observerAdded",query:this,observer:i}))}removeObserver(i){this.observers.includes(i)&&(this.observers=this.observers.filter(s=>s!==i),this.observers.length||(N(this,qt)&&(N(this,Pn)||Ue(this,xa,Nv).call(this)?N(this,qt).cancel({revert:!0}):N(this,qt).cancelRetry()),this.scheduleGc()),N(this,Aa).notify({type:"observerRemoved",query:this,observer:i}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||Ue(this,xa,Ml).call(this,{type:"invalidate"})}async fetch(i,s){var g,p,x,b,_,C,A,D,L,X,W,F;if(this.state.fetchStatus!=="idle"&&((g=N(this,qt))==null?void 0:g.status())!=="rejected"){if(this.state.data!==void 0&&(s!=null&&s.cancelRefetch))this.cancel({silent:!0});else if(N(this,qt))return N(this,qt).continueRetry(),N(this,qt).promise}if(i&&this.setOptions(i),!this.options.queryFn){const P=this.observers.find(ae=>ae.options.queryFn);P&&this.setOptions(P.options)}const c=new AbortController,f=P=>{Object.defineProperty(P,"signal",{enumerable:!0,get:()=>(oe(this,Pn,!0),c.signal)})},d=()=>{const P=Sv(this.options,s),fe=(()=>{const ne={client:N(this,Wn),queryKey:this.queryKey,meta:this.meta};return f(ne),ne})();return oe(this,Pn,!1),this.options.persister?this.options.persister(P,fe,this):P(fe)},y=(()=>{const P={fetchOptions:s,options:this.options,queryKey:this.queryKey,client:N(this,Wn),state:this.state,fetchFn:d};return f(P),P})();(p=this.options.behavior)==null||p.onFetch(y,this),oe(this,Wi,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((x=y.fetchOptions)==null?void 0:x.meta))&&Ue(this,xa,Ml).call(this,{type:"fetch",meta:(b=y.fetchOptions)==null?void 0:b.meta}),oe(this,qt,jv({initialPromise:s==null?void 0:s.initialPromise,fn:y.fetchFn,onCancel:P=>{P instanceof zf&&P.revert&&this.setState({...N(this,Wi),fetchStatus:"idle"}),c.abort()},onFail:(P,ae)=>{Ue(this,xa,Ml).call(this,{type:"failed",failureCount:P,error:ae})},onPause:()=>{Ue(this,xa,Ml).call(this,{type:"pause"})},onContinue:()=>{Ue(this,xa,Ml).call(this,{type:"continue"})},retry:y.options.retry,retryDelay:y.options.retryDelay,networkMode:y.options.networkMode,canRun:()=>!0}));try{const P=await N(this,qt).start();if(P===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(P),(C=(_=N(this,Aa).config).onSuccess)==null||C.call(_,P,this),(D=(A=N(this,Aa).config).onSettled)==null||D.call(A,P,this.state.error,this),P}catch(P){if(P instanceof zf){if(P.silent)return N(this,qt).promise;if(P.revert){if(this.state.data===void 0)throw P;return this.state.data}}throw Ue(this,xa,Ml).call(this,{type:"error",error:P}),(X=(L=N(this,Aa).config).onError)==null||X.call(L,P,this),(F=(W=N(this,Aa).config).onSettled)==null||F.call(W,this.state.data,P,this),P}finally{this.scheduleGc()}}},$n=new WeakMap,Wi=new WeakMap,Aa=new WeakMap,Wn=new WeakMap,qt=new WeakMap,fs=new WeakMap,Pn=new WeakMap,xa=new WeakSet,Nv=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},Ml=function(i){const s=c=>{switch(i.type){case"failed":return{...c,fetchFailureCount:i.failureCount,fetchFailureReason:i.error};case"pause":return{...c,fetchStatus:"paused"};case"continue":return{...c,fetchStatus:"fetching"};case"fetch":return{...c,...Rv(c.data,this.options),fetchMeta:i.meta??null};case"success":const f={...c,...yp(i.data,i.dataUpdatedAt),dataUpdateCount:c.dataUpdateCount+1,...!i.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return oe(this,Wi,i.manual?f:void 0),f;case"error":const d=i.error;return{...c,error:d,errorUpdateCount:c.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:c.fetchFailureCount+1,fetchFailureReason:d,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...c,isInvalidated:!0};case"setState":return{...c,...i.state}}};this.state=s(this.state),zt.batch(()=>{this.observers.forEach(c=>{c.onQueryUpdate()}),N(this,Aa).notify({query:this,type:"updated",action:i})})},uv);function Rv(n,i){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:xv(i.networkMode)?"fetching":"paused",...n===void 0&&{error:null,status:"pending"}}}function yp(n,i){return{data:n,dataUpdatedAt:i??Date.now(),error:null,isInvalidated:!1,status:"success"}}function pp(n){const i=typeof n.initialData=="function"?n.initialData():n.initialData,s=i!==void 0,c=s?typeof n.initialDataUpdatedAt=="function"?n.initialDataUpdatedAt():n.initialDataUpdatedAt:0;return{data:i,dataUpdateCount:0,dataUpdatedAt:s?c??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:s?"success":"pending",fetchStatus:"idle"}}var sa,ke,ds,Pt,In,Pi,Ol,gn,hs,Ii,er,ei,ti,bn,tr,et,as,Af,Uf,Lf,Hf,Bf,qf,Qf,Cv,cv,J0=(cv=class extends sr{constructor(i,s){super();Ee(this,et);Ee(this,sa);Ee(this,ke);Ee(this,ds);Ee(this,Pt);Ee(this,In);Ee(this,Pi);Ee(this,Ol);Ee(this,gn);Ee(this,hs);Ee(this,Ii);Ee(this,er);Ee(this,ei);Ee(this,ti);Ee(this,bn);Ee(this,tr,new Set);this.options=s,oe(this,sa,i),oe(this,gn,null),oe(this,Ol,Df()),this.bindMethods(),this.setOptions(s)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(N(this,ke).addObserver(this),vp(N(this,ke),this.options)?Ue(this,et,as).call(this):this.updateResult(),Ue(this,et,Hf).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Yf(N(this,ke),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Yf(N(this,ke),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,Ue(this,et,Bf).call(this),Ue(this,et,qf).call(this),N(this,ke).removeObserver(this)}setOptions(i){const s=this.options,c=N(this,ke);if(this.options=N(this,sa).defaultQueryOptions(i),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof La(this.options.enabled,N(this,ke))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");Ue(this,et,Qf).call(this),N(this,ke).setOptions(this.options),s._defaulted&&!$u(this.options,s)&&N(this,sa).getQueryCache().notify({type:"observerOptionsUpdated",query:N(this,ke),observer:this});const f=this.hasListeners();f&&gp(N(this,ke),c,this.options,s)&&Ue(this,et,as).call(this),this.updateResult(),f&&(N(this,ke)!==c||La(this.options.enabled,N(this,ke))!==La(s.enabled,N(this,ke))||Rn(this.options.staleTime,N(this,ke))!==Rn(s.staleTime,N(this,ke)))&&Ue(this,et,Af).call(this);const d=Ue(this,et,Uf).call(this);f&&(N(this,ke)!==c||La(this.options.enabled,N(this,ke))!==La(s.enabled,N(this,ke))||d!==N(this,bn))&&Ue(this,et,Lf).call(this,d)}getOptimisticResult(i){const s=N(this,sa).getQueryCache().build(N(this,sa),i),c=this.createResult(s,i);return W0(this,c)&&(oe(this,Pt,c),oe(this,Pi,this.options),oe(this,In,N(this,ke).state)),c}getCurrentResult(){return N(this,Pt)}trackResult(i,s){return new Proxy(i,{get:(c,f)=>(this.trackProp(f),s==null||s(f),f==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&N(this,Ol).status==="pending"&&N(this,Ol).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(c,f))})}trackProp(i){N(this,tr).add(i)}getCurrentQuery(){return N(this,ke)}refetch({...i}={}){return this.fetch({...i})}fetchOptimistic(i){const s=N(this,sa).defaultQueryOptions(i),c=N(this,sa).getQueryCache().build(N(this,sa),s);return c.fetch().then(()=>this.createResult(c,s))}fetch(i){return Ue(this,et,as).call(this,{...i,cancelRefetch:i.cancelRefetch??!0}).then(()=>(this.updateResult(),N(this,Pt)))}createResult(i,s){var le;const c=N(this,ke),f=this.options,d=N(this,Pt),m=N(this,In),y=N(this,Pi),p=i!==c?i.state:N(this,ds),{state:x}=i;let b={...x},_=!1,C;if(s._optimisticResults){const ie=this.hasListeners(),Se=!ie&&vp(i,s),xe=ie&&gp(i,c,s,f);(Se||xe)&&(b={...b,...Rv(x.data,i.options)}),s._optimisticResults==="isRestoring"&&(b.fetchStatus="idle")}let{error:A,errorUpdatedAt:D,status:L}=b;C=b.data;let X=!1;if(s.placeholderData!==void 0&&C===void 0&&L==="pending"){let ie;d!=null&&d.isPlaceholderData&&s.placeholderData===(y==null?void 0:y.placeholderData)?(ie=d.data,X=!0):ie=typeof s.placeholderData=="function"?s.placeholderData((le=N(this,er))==null?void 0:le.state.data,N(this,er)):s.placeholderData,ie!==void 0&&(L="success",C=Of(d==null?void 0:d.data,ie,s),_=!0)}if(s.select&&C!==void 0&&!X)if(d&&C===(m==null?void 0:m.data)&&s.select===N(this,hs))C=N(this,Ii);else try{oe(this,hs,s.select),C=s.select(C),C=Of(d==null?void 0:d.data,C,s),oe(this,Ii,C),oe(this,gn,null)}catch(ie){oe(this,gn,ie)}N(this,gn)&&(A=N(this,gn),C=N(this,Ii),D=Date.now(),L="error");const W=b.fetchStatus==="fetching",F=L==="pending",P=L==="error",ae=F&&W,fe=C!==void 0,O={status:L,fetchStatus:b.fetchStatus,isPending:F,isSuccess:L==="success",isError:P,isInitialLoading:ae,isLoading:ae,data:C,dataUpdatedAt:b.dataUpdatedAt,error:A,errorUpdatedAt:D,failureCount:b.fetchFailureCount,failureReason:b.fetchFailureReason,errorUpdateCount:b.errorUpdateCount,isFetched:i.isFetched(),isFetchedAfterMount:b.dataUpdateCount>p.dataUpdateCount||b.errorUpdateCount>p.errorUpdateCount,isFetching:W,isRefetching:W&&!F,isLoadingError:P&&!fe,isPaused:b.fetchStatus==="paused",isPlaceholderData:_,isRefetchError:P&&fe,isStale:If(i,s),refetch:this.refetch,promise:N(this,Ol),isEnabled:La(s.enabled,i)!==!1};if(this.options.experimental_prefetchInRender){const ie=O.data!==void 0,Se=O.status==="error"&&!ie,xe=je=>{Se?je.reject(O.error):ie&&je.resolve(O.data)},_e=()=>{const je=oe(this,Ol,O.promise=Df());xe(je)},De=N(this,Ol);switch(De.status){case"pending":i.queryHash===c.queryHash&&xe(De);break;case"fulfilled":(Se||O.data!==De.value)&&_e();break;case"rejected":(!Se||O.error!==De.reason)&&_e();break}}return O}updateResult(){const i=N(this,Pt),s=this.createResult(N(this,ke),this.options);if(oe(this,In,N(this,ke).state),oe(this,Pi,this.options),N(this,In).data!==void 0&&oe(this,er,N(this,ke)),$u(s,i))return;oe(this,Pt,s);const c=()=>{if(!i)return!0;const{notifyOnChangeProps:f}=this.options,d=typeof f=="function"?f():f;if(d==="all"||!d&&!N(this,tr).size)return!0;const m=new Set(d??N(this,tr));return this.options.throwOnError&&m.add("error"),Object.keys(N(this,Pt)).some(y=>{const g=y;return N(this,Pt)[g]!==i[g]&&m.has(g)})};Ue(this,et,Cv).call(this,{listeners:c()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&Ue(this,et,Hf).call(this)}},sa=new WeakMap,ke=new WeakMap,ds=new WeakMap,Pt=new WeakMap,In=new WeakMap,Pi=new WeakMap,Ol=new WeakMap,gn=new WeakMap,hs=new WeakMap,Ii=new WeakMap,er=new WeakMap,ei=new WeakMap,ti=new WeakMap,bn=new WeakMap,tr=new WeakMap,et=new WeakSet,as=function(i){Ue(this,et,Qf).call(this);let s=N(this,ke).fetch(this.options,i);return i!=null&&i.throwOnError||(s=s.catch(It)),s},Af=function(){Ue(this,et,Bf).call(this);const i=Rn(this.options.staleTime,N(this,ke));if(ss.isServer()||N(this,Pt).isStale||!Mf(i))return;const c=gv(N(this,Pt).dataUpdatedAt,i)+1;oe(this,ei,Vn.setTimeout(()=>{N(this,Pt).isStale||this.updateResult()},c))},Uf=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(N(this,ke)):this.options.refetchInterval)??!1},Lf=function(i){Ue(this,et,qf).call(this),oe(this,bn,i),!(ss.isServer()||La(this.options.enabled,N(this,ke))===!1||!Mf(N(this,bn))||N(this,bn)===0)&&oe(this,ti,Vn.setInterval(()=>{(this.options.refetchIntervalInBackground||Jf.isFocused())&&Ue(this,et,as).call(this)},N(this,bn)))},Hf=function(){Ue(this,et,Af).call(this),Ue(this,et,Lf).call(this,Ue(this,et,Uf).call(this))},Bf=function(){N(this,ei)!==void 0&&(Vn.clearTimeout(N(this,ei)),oe(this,ei,void 0))},qf=function(){N(this,ti)!==void 0&&(Vn.clearInterval(N(this,ti)),oe(this,ti,void 0))},Qf=function(){const i=N(this,sa).getQueryCache().build(N(this,sa),this.options);if(i===N(this,ke))return;const s=N(this,ke);oe(this,ke,i),oe(this,ds,i.state),this.hasListeners()&&(s==null||s.removeObserver(this),i.addObserver(this))},Cv=function(i){zt.batch(()=>{i.listeners&&this.listeners.forEach(s=>{s(N(this,Pt))}),N(this,sa).getQueryCache().notify({query:N(this,ke),type:"observerResultsUpdated"})})},cv);function $0(n,i){return La(i.enabled,n)!==!1&&n.state.data===void 0&&!(n.state.status==="error"&&i.retryOnMount===!1)}function vp(n,i){return $0(n,i)||n.state.data!==void 0&&Yf(n,i,i.refetchOnMount)}function Yf(n,i,s){if(La(i.enabled,n)!==!1&&Rn(i.staleTime,n)!=="static"){const c=typeof s=="function"?s(n):s;return c==="always"||c!==!1&&If(n,i)}return!1}function gp(n,i,s,c){return(n!==i||La(c.enabled,n)===!1)&&(!s.suspense||n.state.status!=="error")&&If(n,s)}function If(n,i){return La(i.enabled,n)!==!1&&n.isStaleByTime(Rn(i.staleTime,n))}function W0(n,i){return!$u(n.getCurrentResult(),i)}function bp(n){return{onFetch:(i,s)=>{var x,b,_,C,A;const c=i.options,f=(_=(b=(x=i.fetchOptions)==null?void 0:x.meta)==null?void 0:b.fetchMore)==null?void 0:_.direction,d=((C=i.state.data)==null?void 0:C.pages)||[],m=((A=i.state.data)==null?void 0:A.pageParams)||[];let y={pages:[],pageParams:[]},g=0;const p=async()=>{let D=!1;const L=F=>{K0(F,()=>i.signal,()=>D=!0)},X=Sv(i.options,i.fetchOptions),W=async(F,P,ae)=>{if(D)return Promise.reject();if(P==null&&F.pages.length)return Promise.resolve(F);const ne=(()=>{const Se={client:i.client,queryKey:i.queryKey,pageParam:P,direction:ae?"backward":"forward",meta:i.options.meta};return L(Se),Se})(),O=await X(ne),{maxPages:le}=i.options,ie=ae?G0:Y0;return{pages:ie(F.pages,O,le),pageParams:ie(F.pageParams,P,le)}};if(f&&d.length){const F=f==="backward",P=F?P0:Sp,ae={pages:d,pageParams:m},fe=P(c,ae);y=await W(ae,fe,F)}else{const F=n??d.length;do{const P=g===0?m[0]??c.initialPageParam:Sp(c,y);if(g>0&&P==null)break;y=await W(y,P),g++}while(g{var D,L;return(L=(D=i.options).persister)==null?void 0:L.call(D,p,{client:i.client,queryKey:i.queryKey,meta:i.options.meta,signal:i.signal},s)}:i.fetchFn=p}}}function Sp(n,{pages:i,pageParams:s}){const c=i.length-1;return i.length>0?n.getNextPageParam(i[c],i,s[c],s):void 0}function P0(n,{pages:i,pageParams:s}){var c;return i.length>0?(c=n.getPreviousPageParam)==null?void 0:c.call(n,i[0],i,s[0],s):void 0}var ms,nl,Ft,ai,il,dn,ov,I0=(ov=class extends Ev{constructor(i){super();Ee(this,il);Ee(this,ms);Ee(this,nl);Ee(this,Ft);Ee(this,ai);oe(this,ms,i.client),this.mutationId=i.mutationId,oe(this,Ft,i.mutationCache),oe(this,nl,[]),this.state=i.state||Tv(),this.setOptions(i.options),this.scheduleGc()}setOptions(i){this.options=i,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(i){N(this,nl).includes(i)||(N(this,nl).push(i),this.clearGcTimeout(),N(this,Ft).notify({type:"observerAdded",mutation:this,observer:i}))}removeObserver(i){oe(this,nl,N(this,nl).filter(s=>s!==i)),this.scheduleGc(),N(this,Ft).notify({type:"observerRemoved",mutation:this,observer:i})}optionalRemove(){N(this,nl).length||(this.state.status==="pending"?this.scheduleGc():N(this,Ft).remove(this))}continue(){var i;return((i=N(this,ai))==null?void 0:i.continue())??this.execute(this.state.variables)}async execute(i){var m,y,g,p,x,b,_,C,A,D,L,X,W,F,P,ae,fe,ne;const s=()=>{Ue(this,il,dn).call(this,{type:"continue"})},c={client:N(this,ms),meta:this.options.meta,mutationKey:this.options.mutationKey};oe(this,ai,jv({fn:()=>this.options.mutationFn?this.options.mutationFn(i,c):Promise.reject(new Error("No mutationFn found")),onFail:(O,le)=>{Ue(this,il,dn).call(this,{type:"failed",failureCount:O,error:le})},onPause:()=>{Ue(this,il,dn).call(this,{type:"pause"})},onContinue:s,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>N(this,Ft).canRun(this)}));const f=this.state.status==="pending",d=!N(this,ai).canStart();try{if(f)s();else{Ue(this,il,dn).call(this,{type:"pending",variables:i,isPaused:d}),N(this,Ft).config.onMutate&&await N(this,Ft).config.onMutate(i,this,c);const le=await((y=(m=this.options).onMutate)==null?void 0:y.call(m,i,c));le!==this.state.context&&Ue(this,il,dn).call(this,{type:"pending",context:le,variables:i,isPaused:d})}const O=await N(this,ai).start();return await((p=(g=N(this,Ft).config).onSuccess)==null?void 0:p.call(g,O,i,this.state.context,this,c)),await((b=(x=this.options).onSuccess)==null?void 0:b.call(x,O,i,this.state.context,c)),await((C=(_=N(this,Ft).config).onSettled)==null?void 0:C.call(_,O,null,this.state.variables,this.state.context,this,c)),await((D=(A=this.options).onSettled)==null?void 0:D.call(A,O,null,i,this.state.context,c)),Ue(this,il,dn).call(this,{type:"success",data:O}),O}catch(O){try{await((X=(L=N(this,Ft).config).onError)==null?void 0:X.call(L,O,i,this.state.context,this,c))}catch(le){Promise.reject(le)}try{await((F=(W=this.options).onError)==null?void 0:F.call(W,O,i,this.state.context,c))}catch(le){Promise.reject(le)}try{await((ae=(P=N(this,Ft).config).onSettled)==null?void 0:ae.call(P,void 0,O,this.state.variables,this.state.context,this,c))}catch(le){Promise.reject(le)}try{await((ne=(fe=this.options).onSettled)==null?void 0:ne.call(fe,void 0,O,i,this.state.context,c))}catch(le){Promise.reject(le)}throw Ue(this,il,dn).call(this,{type:"error",error:O}),O}finally{N(this,Ft).runNext(this)}}},ms=new WeakMap,nl=new WeakMap,Ft=new WeakMap,ai=new WeakMap,il=new WeakSet,dn=function(i){const s=c=>{switch(i.type){case"failed":return{...c,failureCount:i.failureCount,failureReason:i.error};case"pause":return{...c,isPaused:!0};case"continue":return{...c,isPaused:!1};case"pending":return{...c,context:i.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:i.isPaused,status:"pending",variables:i.variables,submittedAt:Date.now()};case"success":return{...c,data:i.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...c,data:void 0,error:i.error,failureCount:c.failureCount+1,failureReason:i.error,isPaused:!1,status:"error"}}};this.state=s(this.state),zt.batch(()=>{N(this,nl).forEach(c=>{c.onMutationUpdate(i)}),N(this,Ft).notify({mutation:this,type:"updated",action:i})})},ov);function Tv(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var Dl,Fa,ys,fv,eS=(fv=class extends sr{constructor(i={}){super();Ee(this,Dl);Ee(this,Fa);Ee(this,ys);this.config=i,oe(this,Dl,new Set),oe(this,Fa,new Map),oe(this,ys,0)}build(i,s,c){const f=new I0({client:i,mutationCache:this,mutationId:++qu(this,ys)._,options:i.defaultMutationOptions(s),state:c});return this.add(f),f}add(i){N(this,Dl).add(i);const s=Qu(i);if(typeof s=="string"){const c=N(this,Fa).get(s);c?c.push(i):N(this,Fa).set(s,[i])}this.notify({type:"added",mutation:i})}remove(i){if(N(this,Dl).delete(i)){const s=Qu(i);if(typeof s=="string"){const c=N(this,Fa).get(s);if(c)if(c.length>1){const f=c.indexOf(i);f!==-1&&c.splice(f,1)}else c[0]===i&&N(this,Fa).delete(s)}}this.notify({type:"removed",mutation:i})}canRun(i){const s=Qu(i);if(typeof s=="string"){const c=N(this,Fa).get(s),f=c==null?void 0:c.find(d=>d.state.status==="pending");return!f||f===i}else return!0}runNext(i){var c;const s=Qu(i);if(typeof s=="string"){const f=(c=N(this,Fa).get(s))==null?void 0:c.find(d=>d!==i&&d.state.isPaused);return(f==null?void 0:f.continue())??Promise.resolve()}else return Promise.resolve()}clear(){zt.batch(()=>{N(this,Dl).forEach(i=>{this.notify({type:"removed",mutation:i})}),N(this,Dl).clear(),N(this,Fa).clear()})}getAll(){return Array.from(N(this,Dl))}find(i){const s={exact:!0,...i};return this.getAll().find(c=>dp(s,c))}findAll(i={}){return this.getAll().filter(s=>dp(i,s))}notify(i){zt.batch(()=>{this.listeners.forEach(s=>{s(i)})})}resumePausedMutations(){const i=this.getAll().filter(s=>s.state.isPaused);return zt.batch(()=>Promise.all(i.map(s=>s.continue().catch(It))))}},Dl=new WeakMap,Fa=new WeakMap,ys=new WeakMap,fv);function Qu(n){var i;return(i=n.options.scope)==null?void 0:i.id}var zl,Sn,ua,Al,Ll,ku,Gf,dv,tS=(dv=class extends sr{constructor(s,c){super();Ee(this,Ll);Ee(this,zl);Ee(this,Sn);Ee(this,ua);Ee(this,Al);oe(this,zl,s),this.setOptions(c),this.bindMethods(),Ue(this,Ll,ku).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(s){var f;const c=this.options;this.options=N(this,zl).defaultMutationOptions(s),$u(this.options,c)||N(this,zl).getMutationCache().notify({type:"observerOptionsUpdated",mutation:N(this,ua),observer:this}),c!=null&&c.mutationKey&&this.options.mutationKey&&li(c.mutationKey)!==li(this.options.mutationKey)?this.reset():((f=N(this,ua))==null?void 0:f.state.status)==="pending"&&N(this,ua).setOptions(this.options)}onUnsubscribe(){var s;this.hasListeners()||(s=N(this,ua))==null||s.removeObserver(this)}onMutationUpdate(s){Ue(this,Ll,ku).call(this),Ue(this,Ll,Gf).call(this,s)}getCurrentResult(){return N(this,Sn)}reset(){var s;(s=N(this,ua))==null||s.removeObserver(this),oe(this,ua,void 0),Ue(this,Ll,ku).call(this),Ue(this,Ll,Gf).call(this)}mutate(s,c){var f;return oe(this,Al,c),(f=N(this,ua))==null||f.removeObserver(this),oe(this,ua,N(this,zl).getMutationCache().build(N(this,zl),this.options)),N(this,ua).addObserver(this),N(this,ua).execute(s)}},zl=new WeakMap,Sn=new WeakMap,ua=new WeakMap,Al=new WeakMap,Ll=new WeakSet,ku=function(){var c;const s=((c=N(this,ua))==null?void 0:c.state)??Tv();oe(this,Sn,{...s,isPending:s.status==="pending",isSuccess:s.status==="success",isError:s.status==="error",isIdle:s.status==="idle",mutate:this.mutate,reset:this.reset})},Gf=function(s){zt.batch(()=>{var c,f,d,m,y,g,p,x;if(N(this,Al)&&this.hasListeners()){const b=N(this,Sn).variables,_=N(this,Sn).context,C={client:N(this,zl),meta:this.options.meta,mutationKey:this.options.mutationKey};if((s==null?void 0:s.type)==="success"){try{(f=(c=N(this,Al)).onSuccess)==null||f.call(c,s.data,b,_,C)}catch(A){Promise.reject(A)}try{(m=(d=N(this,Al)).onSettled)==null||m.call(d,s.data,null,b,_,C)}catch(A){Promise.reject(A)}}else if((s==null?void 0:s.type)==="error"){try{(g=(y=N(this,Al)).onError)==null||g.call(y,s.error,b,_,C)}catch(A){Promise.reject(A)}try{(x=(p=N(this,Al)).onSettled)==null||x.call(p,void 0,s.error,b,_,C)}catch(A){Promise.reject(A)}}}this.listeners.forEach(b=>{b(N(this,Sn))})})},dv),rl,hv,aS=(hv=class extends sr{constructor(i={}){super();Ee(this,rl);this.config=i,oe(this,rl,new Map)}build(i,s,c){const f=s.queryKey,d=s.queryHash??$f(f,s);let m=this.get(d);return m||(m=new F0({client:i,queryKey:f,queryHash:d,options:i.defaultQueryOptions(s),state:c,defaultOptions:i.getQueryDefaults(f)}),this.add(m)),m}add(i){N(this,rl).has(i.queryHash)||(N(this,rl).set(i.queryHash,i),this.notify({type:"added",query:i}))}remove(i){const s=N(this,rl).get(i.queryHash);s&&(i.destroy(),s===i&&N(this,rl).delete(i.queryHash),this.notify({type:"removed",query:i}))}clear(){zt.batch(()=>{this.getAll().forEach(i=>{this.remove(i)})})}get(i){return N(this,rl).get(i)}getAll(){return[...N(this,rl).values()]}find(i){const s={exact:!0,...i};return this.getAll().find(c=>fp(s,c))}findAll(i={}){const s=this.getAll();return Object.keys(i).length>0?s.filter(c=>fp(i,c)):s}notify(i){zt.batch(()=>{this.listeners.forEach(s=>{s(i)})})}onFocus(){zt.batch(()=>{this.getAll().forEach(i=>{i.onFocus()})})}onOnline(){zt.batch(()=>{this.getAll().forEach(i=>{i.onOnline()})})}},rl=new WeakMap,hv),xt,xn,jn,ar,lr,En,nr,ir,mv,lS=(mv=class{constructor(n={}){Ee(this,xt);Ee(this,xn);Ee(this,jn);Ee(this,ar);Ee(this,lr);Ee(this,En);Ee(this,nr);Ee(this,ir);oe(this,xt,n.queryCache||new aS),oe(this,xn,n.mutationCache||new eS),oe(this,jn,n.defaultOptions||{}),oe(this,ar,new Map),oe(this,lr,new Map),oe(this,En,0)}mount(){qu(this,En)._++,N(this,En)===1&&(oe(this,nr,Jf.subscribe(async n=>{n&&(await this.resumePausedMutations(),N(this,xt).onFocus())})),oe(this,ir,Wu.subscribe(async n=>{n&&(await this.resumePausedMutations(),N(this,xt).onOnline())})))}unmount(){var n,i;qu(this,En)._--,N(this,En)===0&&((n=N(this,nr))==null||n.call(this),oe(this,nr,void 0),(i=N(this,ir))==null||i.call(this),oe(this,ir,void 0))}isFetching(n){return N(this,xt).findAll({...n,fetchStatus:"fetching"}).length}isMutating(n){return N(this,xn).findAll({...n,status:"pending"}).length}getQueryData(n){var s;const i=this.defaultQueryOptions({queryKey:n});return(s=N(this,xt).get(i.queryHash))==null?void 0:s.state.data}ensureQueryData(n){const i=this.defaultQueryOptions(n),s=N(this,xt).build(this,i),c=s.state.data;return c===void 0?this.fetchQuery(n):(n.revalidateIfStale&&s.isStaleByTime(Rn(i.staleTime,s))&&this.prefetchQuery(i),Promise.resolve(c))}getQueriesData(n){return N(this,xt).findAll(n).map(({queryKey:i,state:s})=>{const c=s.data;return[i,c]})}setQueryData(n,i,s){const c=this.defaultQueryOptions({queryKey:n}),f=N(this,xt).get(c.queryHash),d=f==null?void 0:f.state.data,m=B0(i,d);if(m!==void 0)return N(this,xt).build(this,c).setData(m,{...s,manual:!0})}setQueriesData(n,i,s){return zt.batch(()=>N(this,xt).findAll(n).map(({queryKey:c})=>[c,this.setQueryData(c,i,s)]))}getQueryState(n){var s;const i=this.defaultQueryOptions({queryKey:n});return(s=N(this,xt).get(i.queryHash))==null?void 0:s.state}removeQueries(n){const i=N(this,xt);zt.batch(()=>{i.findAll(n).forEach(s=>{i.remove(s)})})}resetQueries(n,i){const s=N(this,xt);return zt.batch(()=>(s.findAll(n).forEach(c=>{c.reset()}),this.refetchQueries({type:"active",...n},i)))}cancelQueries(n,i={}){const s={revert:!0,...i},c=zt.batch(()=>N(this,xt).findAll(n).map(f=>f.cancel(s)));return Promise.all(c).then(It).catch(It)}invalidateQueries(n,i={}){return zt.batch(()=>(N(this,xt).findAll(n).forEach(s=>{s.invalidate()}),(n==null?void 0:n.refetchType)==="none"?Promise.resolve():this.refetchQueries({...n,type:(n==null?void 0:n.refetchType)??(n==null?void 0:n.type)??"active"},i)))}refetchQueries(n,i={}){const s={...i,cancelRefetch:i.cancelRefetch??!0},c=zt.batch(()=>N(this,xt).findAll(n).filter(f=>!f.isDisabled()&&!f.isStatic()).map(f=>{let d=f.fetch(void 0,s);return s.throwOnError||(d=d.catch(It)),f.state.fetchStatus==="paused"?Promise.resolve():d}));return Promise.all(c).then(It)}fetchQuery(n){const i=this.defaultQueryOptions(n);i.retry===void 0&&(i.retry=!1);const s=N(this,xt).build(this,i);return s.isStaleByTime(Rn(i.staleTime,s))?s.fetch(i):Promise.resolve(s.state.data)}prefetchQuery(n){return this.fetchQuery(n).then(It).catch(It)}fetchInfiniteQuery(n){return n.behavior=bp(n.pages),this.fetchQuery(n)}prefetchInfiniteQuery(n){return this.fetchInfiniteQuery(n).then(It).catch(It)}ensureInfiniteQueryData(n){return n.behavior=bp(n.pages),this.ensureQueryData(n)}resumePausedMutations(){return Wu.isOnline()?N(this,xn).resumePausedMutations():Promise.resolve()}getQueryCache(){return N(this,xt)}getMutationCache(){return N(this,xn)}getDefaultOptions(){return N(this,jn)}setDefaultOptions(n){oe(this,jn,n)}setQueryDefaults(n,i){N(this,ar).set(li(n),{queryKey:n,defaultOptions:i})}getQueryDefaults(n){const i=[...N(this,ar).values()],s={};return i.forEach(c=>{rs(n,c.queryKey)&&Object.assign(s,c.defaultOptions)}),s}setMutationDefaults(n,i){N(this,lr).set(li(n),{mutationKey:n,defaultOptions:i})}getMutationDefaults(n){const i=[...N(this,lr).values()],s={};return i.forEach(c=>{rs(n,c.mutationKey)&&Object.assign(s,c.defaultOptions)}),s}defaultQueryOptions(n){if(n._defaulted)return n;const i={...N(this,jn).queries,...this.getQueryDefaults(n.queryKey),...n,_defaulted:!0};return i.queryHash||(i.queryHash=$f(i.queryKey,i)),i.refetchOnReconnect===void 0&&(i.refetchOnReconnect=i.networkMode!=="always"),i.throwOnError===void 0&&(i.throwOnError=!!i.suspense),!i.networkMode&&i.persister&&(i.networkMode="offlineFirst"),i.queryFn===Wf&&(i.enabled=!1),i}defaultMutationOptions(n){return n!=null&&n._defaulted?n:{...N(this,jn).mutations,...(n==null?void 0:n.mutationKey)&&this.getMutationDefaults(n.mutationKey),...n,_defaulted:!0}}clear(){N(this,xt).clear(),N(this,xn).clear()}},xt=new WeakMap,xn=new WeakMap,jn=new WeakMap,ar=new WeakMap,lr=new WeakMap,En=new WeakMap,nr=new WeakMap,ir=new WeakMap,mv),_v=S.createContext(void 0),ni=n=>{const i=S.useContext(_v);if(!i)throw new Error("No QueryClient set, use QueryClientProvider to set one");return i},nS=({client:n,children:i})=>(S.useEffect(()=>(n.mount(),()=>{n.unmount()}),[n]),o.jsx(_v.Provider,{value:n,children:i})),Mv=S.createContext(!1),iS=()=>S.useContext(Mv);Mv.Provider;function rS(){let n=!1;return{clearReset:()=>{n=!1},reset:()=>{n=!0},isReset:()=>n}}var sS=S.createContext(rS()),uS=()=>S.useContext(sS),cS=(n,i,s)=>{const c=s!=null&&s.state.error&&typeof n.throwOnError=="function"?Pf(n.throwOnError,[s.state.error,s]):n.throwOnError;(n.suspense||n.experimental_prefetchInRender||c)&&(i.isReset()||(n.retryOnMount=!1))},oS=n=>{S.useEffect(()=>{n.clearReset()},[n])},fS=({result:n,errorResetBoundary:i,throwOnError:s,query:c,suspense:f})=>n.isError&&!i.isReset()&&!n.isFetching&&c&&(f&&n.data===void 0||Pf(s,[n.error,c])),dS=n=>{if(n.suspense){const s=f=>f==="static"?f:Math.max(f??1e3,1e3),c=n.staleTime;n.staleTime=typeof c=="function"?(...f)=>s(c(...f)):s(c),typeof n.gcTime=="number"&&(n.gcTime=Math.max(n.gcTime,1e3))}},hS=(n,i)=>n.isLoading&&n.isFetching&&!i,mS=(n,i)=>(n==null?void 0:n.suspense)&&i.isPending,xp=(n,i,s)=>i.fetchOptimistic(n).catch(()=>{s.clearReset()});function yS(n,i,s){var _,C,A,D;const c=iS(),f=uS(),d=ni(),m=d.defaultQueryOptions(n);(C=(_=d.getDefaultOptions().queries)==null?void 0:_._experimental_beforeQuery)==null||C.call(_,m);const y=d.getQueryCache().get(m.queryHash);m._optimisticResults=c?"isRestoring":"optimistic",dS(m),cS(m,f,y),oS(f);const g=!d.getQueryCache().get(m.queryHash),[p]=S.useState(()=>new i(d,m)),x=p.getOptimisticResult(m),b=!c&&n.subscribed!==!1;if(S.useSyncExternalStore(S.useCallback(L=>{const X=b?p.subscribe(zt.batchCalls(L)):It;return p.updateResult(),X},[p,b]),()=>p.getCurrentResult(),()=>p.getCurrentResult()),S.useEffect(()=>{p.setOptions(m)},[m,p]),mS(m,x))throw xp(m,p,f);if(fS({result:x,errorResetBoundary:f,throwOnError:m.throwOnError,query:y,suspense:m.suspense}))throw x.error;if((D=(A=d.getDefaultOptions().queries)==null?void 0:A._experimental_afterQuery)==null||D.call(A,m,x),m.experimental_prefetchInRender&&!ss.isServer()&&hS(x,c)){const L=g?xp(m,p,f):y==null?void 0:y.promise;L==null||L.catch(It).finally(()=>{p.updateResult()})}return m.notifyOnChangeProps?x:p.trackResult(x)}function Ha(n,i){return yS(n,J0)}function Qt(n,i){const s=ni(),[c]=S.useState(()=>new tS(s,n));S.useEffect(()=>{c.setOptions(n)},[c,n]);const f=S.useSyncExternalStore(S.useCallback(m=>c.subscribe(zt.batchCalls(m)),[c]),()=>c.getCurrentResult(),()=>c.getCurrentResult()),d=S.useCallback((m,y)=>{c.mutate(m,y).catch(It)},[c]);if(f.error&&Pf(c.options.throwOnError,[f.error]))throw f.error;return{...f,mutate:d,mutateAsync:f.mutate}}/** * react-router v7.14.1 * * Copyright (c) Remix Software Inc. @@ -55,7 +55,7 @@ Error generating stack: `+l.message+` * LICENSE.md file in the root directory of this source tree. * * @license MIT - */var jp=n=>{throw TypeError(n)},cS=(n,i,r)=>i.has(n)||jp("Cannot "+r),Sf=(n,i,r)=>(cS(n,i,"read from private field"),r?r.call(n):i.get(n)),oS=(n,i,r)=>i.has(n)?jp("Cannot add the same private member more than once"):i instanceof WeakSet?i.add(n):i.set(n,r),Sv="popstate";function xv(n){return typeof n=="object"&&n!=null&&"pathname"in n&&"search"in n&&"hash"in n&&"state"in n&&"key"in n}function fS(n={}){function i(c,o){var v;let f=(v=o.state)==null?void 0:v.masked,{pathname:m,search:y,hash:g}=f||c.location;return ir("",{pathname:m,search:y,hash:g},o.state&&o.state.usr||null,o.state&&o.state.key||"default",f?{pathname:c.location.pathname,search:c.location.search,hash:c.location.hash}:void 0)}function r(c,o){return typeof o=="string"?o:al(o)}return hS(i,r,null,n)}function Ue(n,i){if(n===!1||n===null||typeof n>"u")throw new Error(i)}function jt(n,i){if(!n){typeof console<"u"&&console.warn(i);try{throw new Error(i)}catch{}}}function dS(){return Math.random().toString(36).substring(2,10)}function Ev(n,i){return{usr:n.state,key:n.key,idx:i,masked:n.unstable_mask?{pathname:n.pathname,search:n.search,hash:n.hash}:void 0}}function ir(n,i,r=null,c,o){return{pathname:typeof n=="string"?n:n.pathname,search:"",hash:"",...typeof i=="string"?ll(i):i,state:r,key:i&&i.key||c||dS(),unstable_mask:o}}function al({pathname:n="/",search:i="",hash:r=""}){return i&&i!=="?"&&(n+=i.charAt(0)==="?"?i:"?"+i),r&&r!=="#"&&(n+=r.charAt(0)==="#"?r:"#"+r),n}function ll(n){let i={};if(n){let r=n.indexOf("#");r>=0&&(i.hash=n.substring(r),n=n.substring(0,r));let c=n.indexOf("?");c>=0&&(i.search=n.substring(c),n=n.substring(0,c)),n&&(i.pathname=n)}return i}function hS(n,i,r,c={}){let{window:o=document.defaultView,v5Compat:f=!1}=c,m=o.history,y="POP",g=null,v=S();v==null&&(v=0,m.replaceState({...m.state,idx:v},""));function S(){return(m.state||{idx:null}).idx}function b(){y="POP";let q=S(),X=q==null?null:q-v;v=q,g&&g({action:y,location:w.location,delta:X})}function C(q,X){y="PUSH";let J=xv(q)?q:ir(w.location,q,X);v=S()+1;let F=Ev(J,v),W=w.createHref(J.unstable_mask||J);try{m.pushState(F,"",W)}catch(ae){if(ae instanceof DOMException&&ae.name==="DataCloneError")throw ae;o.location.assign(W)}f&&g&&g({action:y,location:w.location,delta:1})}function M(q,X){y="REPLACE";let J=xv(q)?q:ir(w.location,q,X);v=S();let F=Ev(J,v),W=w.createHref(J.unstable_mask||J);m.replaceState(F,"",W),f&&g&&g({action:y,location:w.location,delta:0})}function H(q){return Rp(q)}let w={get action(){return y},get location(){return n(o,m)},listen(q){if(g)throw new Error("A history only accepts one active listener");return o.addEventListener(Sv,b),g=q,()=>{o.removeEventListener(Sv,b),g=null}},createHref(q){return i(o,q)},createURL:H,encodeLocation(q){let X=H(q);return{pathname:X.pathname,search:X.search,hash:X.hash}},push:C,replace:M,go(q){return m.go(q)}};return w}function Rp(n,i=!1){let r="http://localhost";typeof window<"u"&&(r=window.location.origin!=="null"?window.location.origin:window.location.href),Ue(r,"No window.location.(origin|href) available to create URL");let c=typeof n=="string"?n:al(n);return c=c.replace(/ $/,"%20"),!i&&c.startsWith("//")&&(c=r+c),new URL(c,r)}var er,jv=class{constructor(n){if(oS(this,er,new Map),n)for(let[i,r]of n)this.set(i,r)}get(n){if(Sf(this,er).has(n))return Sf(this,er).get(n);if(n.defaultValue!==void 0)return n.defaultValue;throw new Error("No value found for context")}set(n,i){Sf(this,er).set(n,i)}};er=new WeakMap;var mS=new Set(["lazy","caseSensitive","path","id","index","children"]);function yS(n){return mS.has(n)}var vS=new Set(["lazy","caseSensitive","path","id","index","middleware","children"]);function pS(n){return vS.has(n)}function gS(n){return n.index===!0}function ur(n,i,r=[],c={},o=!1){return n.map((f,m)=>{let y=[...r,String(m)],g=typeof f.id=="string"?f.id:y.join("-");if(Ue(f.index!==!0||!f.children,"Cannot specify children on an index route"),Ue(o||!c[g],`Found a route id collision on id "${g}". Route id's must be globally unique within Data Router usages`),gS(f)){let v={...f,id:g};return c[g]=Rv(v,i(v)),v}else{let v={...f,id:g,children:void 0};return c[g]=Rv(v,i(v)),f.children&&(v.children=ur(f.children,i,y,c,o)),v}})}function Rv(n,i){return Object.assign(n,{...i,...typeof i.lazy=="object"&&i.lazy!=null?{lazy:{...n.lazy,...i.lazy}}:{}})}function cn(n,i,r="/"){return tr(n,i,r,!1)}function tr(n,i,r,c){let o=typeof i=="string"?ll(i):i,f=La(o.pathname||"/",r);if(f==null)return null;let m=Tp(n);SS(m);let y=null;for(let g=0;y==null&&g{let S={relativePath:v===void 0?m.path||"":v,caseSensitive:m.caseSensitive===!0,childrenIndex:y,route:m};if(S.relativePath.startsWith("/")){if(!S.relativePath.startsWith(c)&&g)return;Ue(S.relativePath.startsWith(c),`Absolute route path "${S.relativePath}" nested under path "${c}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),S.relativePath=S.relativePath.slice(c.length)}let b=Ua([c,S.relativePath]),C=r.concat(S);m.children&&m.children.length>0&&(Ue(m.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${b}".`),Tp(m.children,i,C,b,g)),!(m.path==null&&!m.index)&&i.push({path:b,score:MS(b,m.index),routesMeta:C})};return n.forEach((m,y)=>{var g;if(m.path===""||!((g=m.path)!=null&&g.includes("?")))f(m,y);else for(let v of Np(m.path))f(m,y,!0,v)}),i}function Np(n){let i=n.split("/");if(i.length===0)return[];let[r,...c]=i,o=r.endsWith("?"),f=r.replace(/\?$/,"");if(c.length===0)return o?[f,""]:[f];let m=Np(c.join("/")),y=[];return y.push(...m.map(g=>g===""?f:[f,g].join("/"))),o&&y.push(...m),y.map(g=>n.startsWith("/")&&g===""?"/":g)}function SS(n){n.sort((i,r)=>i.score!==r.score?r.score-i.score:CS(i.routesMeta.map(c=>c.childrenIndex),r.routesMeta.map(c=>c.childrenIndex)))}var xS=/^:[\w-]+$/,ES=3,jS=2,RS=1,TS=10,NS=-2,Tv=n=>n==="*";function MS(n,i){let r=n.split("/"),c=r.length;return r.some(Tv)&&(c+=NS),i&&(c+=jS),r.filter(o=>!Tv(o)).reduce((o,f)=>o+(xS.test(f)?ES:f===""?RS:TS),c)}function CS(n,i){return n.length===i.length&&n.slice(0,-1).every((c,o)=>c===i[o])?n[n.length-1]-i[i.length-1]:0}function OS(n,i,r=!1){let{routesMeta:c}=n,o={},f="/",m=[];for(let y=0;y{if(S==="*"){let H=y[C]||"";m=f.slice(0,f.length-H.length).replace(/(.)\/+$/,"$1")}const M=y[C];return b&&!M?v[S]=void 0:v[S]=(M||"").replace(/%2F/g,"/"),v},{}),pathname:f,pathnameBase:m,pattern:n}}function zS(n,i=!1,r=!0){jt(n==="*"||!n.endsWith("*")||n.endsWith("/*"),`Route path "${n}" will be treated as if it were "${n.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${n.replace(/\*$/,"/*")}".`);let c=[],o="^"+n.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(m,y,g,v,S)=>{if(c.push({paramName:y,isOptional:g!=null}),g){let b=S.charAt(v+m.length);return b&&b!=="/"?"/([^\\/]*)":"(?:/([^\\/]*))?"}return"/([^\\/]+)"}).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return n.endsWith("*")?(c.push({paramName:"*"}),o+=n==="*"||n==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?o+="\\/*$":n!==""&&n!=="/"&&(o+="(?:(?=\\/|$))"),[new RegExp(o,i?void 0:"i"),c]}function DS(n){try{return n.split("/").map(i=>decodeURIComponent(i).replace(/\//g,"%2F")).join("/")}catch(i){return jt(!1,`The URL path "${n}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${i}).`),n}}function La(n,i){if(i==="/")return n;if(!n.toLowerCase().startsWith(i.toLowerCase()))return null;let r=i.endsWith("/")?i.length-1:i.length,c=n.charAt(r);return c&&c!=="/"?null:n.slice(r)||"/"}function wS({basename:n,pathname:i}){return i==="/"?n:Ua([n,i])}var Mp=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Wf=n=>Mp.test(n);function AS(n,i="/"){let{pathname:r,search:c="",hash:o=""}=typeof n=="string"?ll(n):n,f;return r?(r=Pf(r),r.startsWith("/")?f=Nv(r.substring(1),"/"):f=Nv(r,i)):f=i,{pathname:f,search:US(c),hash:LS(o)}}function Nv(n,i){let r=$s(i).split("/");return n.split("/").forEach(o=>{o===".."?r.length>1&&r.pop():o!=="."&&r.push(o)}),r.length>1?r.join("/"):"/"}function xf(n,i,r,c){return`Cannot include a '${n}' character in a manually specified \`to.${i}\` field [${JSON.stringify(c)}]. Please separate it out to the \`to.${r}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function Cp(n){return n.filter((i,r)=>r===0||i.route.path&&i.route.path.length>0)}function Ps(n){let i=Cp(n);return i.map((r,c)=>c===i.length-1?r.pathname:r.pathnameBase)}function mr(n,i,r,c=!1){let o;typeof n=="string"?o=ll(n):(o={...n},Ue(!o.pathname||!o.pathname.includes("?"),xf("?","pathname","search",o)),Ue(!o.pathname||!o.pathname.includes("#"),xf("#","pathname","hash",o)),Ue(!o.search||!o.search.includes("#"),xf("#","search","hash",o)));let f=n===""||o.pathname==="",m=f?"/":o.pathname,y;if(m==null)y=r;else{let b=i.length-1;if(!c&&m.startsWith("..")){let C=m.split("/");for(;C[0]==="..";)C.shift(),b-=1;o.pathname=C.join("/")}y=b>=0?i[b]:"/"}let g=AS(o,y),v=m&&m!=="/"&&m.endsWith("/"),S=(f||m===".")&&r.endsWith("/");return!g.pathname.endsWith("/")&&(v||S)&&(g.pathname+="/"),g}var Pf=n=>n.replace(/\/\/+/g,"/"),Ua=n=>Pf(n.join("/")),$s=n=>n.replace(/\/+$/,""),_S=n=>$s(n).replace(/^\/*/,"/"),US=n=>!n||n==="?"?"":n.startsWith("?")?n:"?"+n,LS=n=>!n||n==="#"?"":n.startsWith("#")?n:"#"+n,yr=class{constructor(n,i,r,c=!1){this.status=n,this.statusText=i||"",this.internal=c,r instanceof Error?(this.data=r.toString(),this.error=r):this.data=r}};function rr(n){return n!=null&&typeof n.status=="number"&&typeof n.statusText=="string"&&typeof n.internal=="boolean"&&"data"in n}function vr(n){let i=n.map(r=>r.route.path).filter(Boolean);return Ua(i)||"/"}var Op=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function zp(n,i){let r=n;if(typeof r!="string"||!Mp.test(r))return{absoluteURL:void 0,isExternal:!1,to:r};let c=r,o=!1;if(Op)try{let f=new URL(window.location.href),m=r.startsWith("//")?new URL(f.protocol+r):new URL(r),y=La(m.pathname,i);m.origin===f.origin&&y!=null?r=y+m.search+m.hash:o=!0}catch{jt(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:c,isExternal:o,to:r}}var Sn=Symbol("Uninstrumented");function HS(n,i){let r={lazy:[],"lazy.loader":[],"lazy.action":[],"lazy.middleware":[],middleware:[],loader:[],action:[]};n.forEach(o=>o({id:i.id,index:i.index,path:i.path,instrument(f){let m=Object.keys(r);for(let y of m)f[y]&&r[y].push(f[y])}}));let c={};if(typeof i.lazy=="function"&&r.lazy.length>0){let o=Gi(r.lazy,i.lazy,()=>{});o&&(c.lazy=o)}if(typeof i.lazy=="object"){let o=i.lazy;["middleware","loader","action"].forEach(f=>{let m=o[f],y=r[`lazy.${f}`];if(typeof m=="function"&&y.length>0){let g=Gi(y,m,()=>{});g&&(c.lazy=Object.assign(c.lazy||{},{[f]:g}))}})}return["loader","action"].forEach(o=>{let f=i[o];if(typeof f=="function"&&r[o].length>0){let m=f[Sn]??f,y=Gi(r[o],m,(...g)=>Mv(g[0]));y&&(o==="loader"&&m.hydrate===!0&&(y.hydrate=!0),y[Sn]=m,c[o]=y)}}),i.middleware&&i.middleware.length>0&&r.middleware.length>0&&(c.middleware=i.middleware.map(o=>{let f=o[Sn]??o,m=Gi(r.middleware,f,(...y)=>Mv(y[0]));return m?(m[Sn]=f,m):o})),c}function BS(n,i){let r={navigate:[],fetch:[]};if(i.forEach(c=>c({instrument(o){let f=Object.keys(o);for(let m of f)o[m]&&r[m].push(o[m])}})),r.navigate.length>0){let c=n.navigate[Sn]??n.navigate,o=Gi(r.navigate,c,(...f)=>{let[m,y]=f;return{to:typeof m=="number"||typeof m=="string"?m:m?al(m):".",...Cv(n,y??{})}});o&&(o[Sn]=c,n.navigate=o)}if(r.fetch.length>0){let c=n.fetch[Sn]??n.fetch,o=Gi(r.fetch,c,(...f)=>{let[m,,y,g]=f;return{href:y??".",fetcherKey:m,...Cv(n,g??{})}});o&&(o[Sn]=c,n.fetch=o)}return n}function Gi(n,i,r){return n.length===0?null:async(...c)=>{let o=await Dp(n,r(...c),()=>i(...c),n.length-1);if(o.type==="error")throw o.value;return o.value}}async function Dp(n,i,r,c){let o=n[c],f;if(o){let m,y=async()=>(m?console.error("You cannot call instrumented handlers more than once"):m=Dp(n,i,r,c-1),f=await m,Ue(f,"Expected a result"),f.type==="error"&&f.value instanceof Error?{status:"error",error:f.value}:{status:"success",error:void 0});try{await o(y,i)}catch(g){console.error("An instrumentation function threw an error:",g)}m||await y(),await m}else try{f={type:"success",value:await r()}}catch(m){f={type:"error",value:m}}return f||{type:"error",value:new Error("No result assigned in instrumentation chain.")}}function Mv(n){let{request:i,context:r,params:c,unstable_pattern:o}=n;return{request:qS(i),params:{...c},unstable_pattern:o,context:QS(r)}}function Cv(n,i){return{currentUrl:al(n.state.location),..."formMethod"in i?{formMethod:i.formMethod}:{},..."formEncType"in i?{formEncType:i.formEncType}:{},..."formData"in i?{formData:i.formData}:{},..."body"in i?{body:i.body}:{}}}function qS(n){return{method:n.method,url:n.url,headers:{get:(...i)=>n.headers.get(...i)}}}function QS(n){if(GS(n)){let i={...n};return Object.freeze(i),i}else return{get:i=>n.get(i)}}var YS=Object.getOwnPropertyNames(Object.prototype).sort().join("\0");function GS(n){if(n===null||typeof n!="object")return!1;const i=Object.getPrototypeOf(n);return i===Object.prototype||i===null||Object.getOwnPropertyNames(i).sort().join("\0")===YS}var wp=["POST","PUT","PATCH","DELETE"],XS=new Set(wp),KS=["GET",...wp],VS=new Set(KS),Ap=new Set([301,302,303,307,308]),ZS=new Set([307,308]),Ef={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},FS={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},$u={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},JS=n=>({hasErrorBoundary:!!n.hasErrorBoundary}),_p="remix-router-transitions",Up=Symbol("ResetLoaderData");function kS(n){const i=n.window?n.window:typeof window<"u"?window:void 0,r=typeof i<"u"&&typeof i.document<"u"&&typeof i.document.createElement<"u";Ue(n.routes.length>0,"You must provide a non-empty routes array to createRouter");let c=n.hydrationRouteProperties||[],o=n.mapRouteProperties||JS,f=o;if(n.unstable_instrumentations){let E=n.unstable_instrumentations;f=O=>({...o(O),...HS(E.map(L=>L.route).filter(Boolean),O)})}let m={},y=ur(n.routes,f,void 0,m),g,v=n.basename||"/";v.startsWith("/")||(v=`/${v}`);let S=n.dataStrategy||e1,b={unstable_passThroughRequests:!1,...n.future},C=null,M=new Set,H=null,w=null,q=null,X=n.hydrationData!=null,J=cn(y,n.history.location,v),F=!1,W=null,ae,oe;if(J==null&&!n.patchRoutesOnNavigation){let E=Aa(404,{pathname:n.history.location.pathname}),{matches:O,route:L}=qs(y);ae=!0,oe=!ae,J=O,W={[L.id]:E}}else if(J&&!n.hydrationData&&Ll(J,y,n.history.location.pathname).active&&(J=null),J)if(J.some(E=>E.route.lazy))ae=!1,oe=!ae;else if(!J.some(E=>If(E.route)))ae=!0,oe=!ae;else{let E=n.hydrationData?n.hydrationData.loaderData:null,O=n.hydrationData?n.hydrationData.errors:null,L=J;if(O){let $=J.findIndex(I=>O[I.route.id]!==void 0);L=L.slice(0,$+1)}oe=!1,ae=!0,L.forEach($=>{let I=Lp($.route,E,O);oe=oe||I.renderFallback,ae=ae&&!I.shouldLoad})}else{ae=!1,oe=!ae,J=[];let E=Ll(null,y,n.history.location.pathname);E.active&&E.matches&&(F=!0,J=E.matches)}let ne,D={historyAction:n.history.action,location:n.history.location,matches:J,initialized:ae,renderFallback:oe,navigation:Ef,restoreScrollPosition:n.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:n.hydrationData&&n.hydrationData.loaderData||{},actionData:n.hydrationData&&n.hydrationData.actionData||null,errors:n.hydrationData&&n.hydrationData.errors||W,fetchers:new Map,blockers:new Map},ie="POP",ye=null,Re=!1,Ee,Ae=!1,qe=new Map,xe=null,A=!1,k=!1,ce=new Set,re=new Map,Te=0,T=-1,Y=new Map,P=new Set,ee=new Map,pe=new Map,Se=new Set,Oe=new Map,dt,Ze=null;function nl(){if(C=n.history.listen(({action:E,location:O,delta:L})=>{if(dt){dt(),dt=void 0;return}jt(Oe.size===0||L!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let $=Tn({currentLocation:D.location,nextLocation:O,historyAction:E});if($&&L!=null){let I=new Promise(de=>{dt=de});n.history.go(L*-1),rl($,{state:"blocked",location:O,proceed(){rl($,{state:"proceeding",proceed:void 0,reset:void 0,location:O}),I.then(()=>n.history.go(L))},reset(){let de=new Map(D.blockers);de.set($,$u),gt({blockers:de})}}),ye==null||ye.resolve(),ye=null;return}return Sa(E,O)}),r){g1(i,qe);let E=()=>b1(i,qe);i.addEventListener("pagehide",E),xe=()=>i.removeEventListener("pagehide",E)}return D.initialized||Sa("POP",D.location,{initialHydration:!0}),ne}function ba(){C&&C(),xe&&xe(),M.clear(),Ee&&Ee.abort(),D.fetchers.forEach((E,O)=>ul(O)),D.blockers.forEach((E,O)=>Rn(O))}function Yt(E){return M.add(E),()=>M.delete(E)}function gt(E,O={}){E.matches&&(E.matches=E.matches.map(I=>{let de=m[I.route.id],te=I.route;return te.element!==de.element||te.errorElement!==de.errorElement||te.hydrateFallbackElement!==de.hydrateFallbackElement?{...I,route:de}:I})),D={...D,...E};let L=[],$=[];D.fetchers.forEach((I,de)=>{I.state==="idle"&&(Se.has(de)?L.push(de):$.push(de))}),Se.forEach(I=>{!D.fetchers.has(I)&&!re.has(I)&&L.push(I)}),[...M].forEach(I=>I(D,{deletedFetchers:L,newErrors:E.errors??null,viewTransitionOpts:O.viewTransitionOpts,flushSync:O.flushSync===!0})),L.forEach(I=>ul(I)),$.forEach(I=>D.fetchers.delete(I))}function Gt(E,O,{flushSync:L}={}){var Ne,ve;let $=D.actionData!=null&&D.navigation.formMethod!=null&&Ft(D.navigation.formMethod)&&D.navigation.state==="loading"&&((Ne=E.state)==null?void 0:Ne._isRedirect)!==!0,I;O.actionData?Object.keys(O.actionData).length>0?I=O.actionData:I=null:$?I=D.actionData:I=null;let de=O.loaderData?qv(D.loaderData,O.loaderData,O.matches||[],O.errors):D.loaderData,te=D.blockers;te.size>0&&(te=new Map(te),te.forEach((ze,_e)=>te.set(_e,$u)));let he=A?!1:uu(E,O.matches||D.matches),se=Re===!0||D.navigation.formMethod!=null&&Ft(D.navigation.formMethod)&&((ve=E.state)==null?void 0:ve._isRedirect)!==!0;g&&(y=g,g=void 0),A||ie==="POP"||(ie==="PUSH"?n.history.push(E,E.state):ie==="REPLACE"&&n.history.replace(E,E.state));let le;if(ie==="POP"){let ze=qe.get(D.location.pathname);ze&&ze.has(E.pathname)?le={currentLocation:D.location,nextLocation:E}:qe.has(E.pathname)&&(le={currentLocation:E,nextLocation:D.location})}else if(Ae){let ze=qe.get(D.location.pathname);ze?ze.add(E.pathname):(ze=new Set([E.pathname]),qe.set(D.location.pathname,ze)),le={currentLocation:D.location,nextLocation:E}}gt({...O,actionData:I,loaderData:de,historyAction:ie,location:E,initialized:!0,renderFallback:!1,navigation:Ef,revalidation:"idle",restoreScrollPosition:he,preventScrollReset:se,blockers:te},{viewTransitionOpts:le,flushSync:L===!0}),ie="POP",Re=!1,Ae=!1,A=!1,k=!1,ye==null||ye.resolve(),ye=null,Ze==null||Ze.resolve(),Ze=null}async function il(E,O){if(ye==null||ye.resolve(),ye=null,typeof E=="number"){ye||(ye=Xv());let at=ye.promise;return n.history.go(E),at}let L=Qf(D.location,D.matches,v,E,O==null?void 0:O.fromRouteId,O==null?void 0:O.relative),{path:$,submission:I,error:de}=Ov(!1,L,O),te;O!=null&&O.unstable_mask&&(te={pathname:"",search:"",hash:"",...typeof O.unstable_mask=="string"?ll(O.unstable_mask):{...D.location.unstable_mask,...O.unstable_mask}});let he=D.location,se=ir(he,$,O&&O.state,void 0,te);se={...se,...n.history.encodeLocation(se)};let le=O&&O.replace!=null?O.replace:void 0,Ne="PUSH";le===!0?Ne="REPLACE":le===!1||I!=null&&Ft(I.formMethod)&&I.formAction===D.location.pathname+D.location.search&&(Ne="REPLACE");let ve=O&&"preventScrollReset"in O?O.preventScrollReset===!0:void 0,ze=(O&&O.flushSync)===!0,_e=Tn({currentLocation:he,nextLocation:se,historyAction:Ne});if(_e){rl(_e,{state:"blocked",location:se,proceed(){rl(_e,{state:"proceeding",proceed:void 0,reset:void 0,location:se}),il(E,O)},reset(){let at=new Map(D.blockers);at.set(_e,$u),gt({blockers:at})}});return}await Sa(Ne,se,{submission:I,pendingError:de,preventScrollReset:ve,replace:O&&O.replace,enableViewTransition:O&&O.viewTransition,flushSync:ze,callSiteDefaultShouldRevalidate:O&&O.unstable_defaultShouldRevalidate})}function Al(){Ze||(Ze=Xv()),_l(),gt({revalidation:"loading"});let E=Ze.promise;return D.navigation.state==="submitting"?E:D.navigation.state==="idle"?(Sa(D.historyAction,D.location,{startUninterruptedRevalidation:!0}),E):(Sa(ie||D.historyAction,D.navigation.location,{overrideNavigation:D.navigation,enableViewTransition:Ae===!0}),E)}async function Sa(E,O,L){Ee&&Ee.abort(),Ee=null,ie=E,A=(L&&L.startUninterruptedRevalidation)===!0,nc(D.location,D.matches),Re=(L&&L.preventScrollReset)===!0,Ae=(L&&L.enableViewTransition)===!0;let $=g||y,I=L&&L.overrideNavigation,de=L!=null&&L.initialHydration&&D.matches&&D.matches.length>0&&!F?D.matches:cn($,O,v),te=(L&&L.flushSync)===!0;if(de&&D.initialized&&!k&&s1(D.location,O)&&!(L&&L.submission&&Ft(L.submission.formMethod))){Gt(O,{matches:de},{flushSync:te});return}let he=Ll(de,$,O.pathname);if(he.active&&he.matches&&(de=he.matches),!de){let{error:ut,notFoundMatches:mt,route:Ve}=qa(O.pathname);Gt(O,{matches:mt,loaderData:{},errors:{[Ve.id]:ut}},{flushSync:te});return}Ee=new AbortController;let se=Yi(n.history,O,Ee.signal,L&&L.submission),le=n.getContext?await n.getContext():new jv,Ne;if(L&&L.pendingError)Ne=[on(de).route.id,{type:"error",error:L.pendingError}];else if(L&&L.submission&&Ft(L.submission.formMethod)){let ut=await jn(se,O,L.submission,de,le,he.active,L&&L.initialHydration===!0,{replace:L.replace,flushSync:te});if(ut.shortCircuited)return;if(ut.pendingActionResult){let[mt,Ve]=ut.pendingActionResult;if(pa(Ve)&&rr(Ve.error)&&Ve.error.status===404){Ee=null,Gt(O,{matches:ut.matches,loaderData:{},errors:{[mt]:Ve.error}});return}}de=ut.matches||de,Ne=ut.pendingActionResult,I=jf(O,L.submission),te=!1,he.active=!1,se=Yi(n.history,se.url,se.signal)}let{shortCircuited:ve,matches:ze,loaderData:_e,errors:at}=await G(se,O,de,le,he.active,I,L&&L.submission,L&&L.fetcherSubmission,L&&L.replace,L&&L.initialHydration===!0,te,Ne,L&&L.callSiteDefaultShouldRevalidate);ve||(Ee=null,Gt(O,{matches:ze||de,...Qv(Ne),loaderData:_e,errors:at}))}async function jn(E,O,L,$,I,de,te,he={}){_l();let se=v1(O,L);if(gt({navigation:se},{flushSync:he.flushSync===!0}),de){let ve=await Za($,O.pathname,E.signal);if(ve.type==="aborted")return{shortCircuited:!0};if(ve.type==="error"){if(ve.partialMatches.length===0){let{matches:_e,route:at}=qs(y);return{matches:_e,pendingActionResult:[at.id,{type:"error",error:ve.error}]}}let ze=on(ve.partialMatches).route.id;return{matches:ve.partialMatches,pendingActionResult:[ze,{type:"error",error:ve.error}]}}else if(ve.matches)$=ve.matches;else{let{notFoundMatches:ze,error:_e,route:at}=qa(O.pathname);return{matches:ze,pendingActionResult:[at.id,{type:"error",error:_e}]}}}let le,Ne=Ks($,O);if(!Ne.route.action&&!Ne.route.lazy)le={type:"error",error:Aa(405,{method:E.method,pathname:O.pathname,routeId:Ne.route.id})};else{let ve=Xi(f,m,E,O,$,Ne,te?[]:c,I),ze=await xa(E,O,ve,I,null);if(le=ze[Ne.route.id],!le){for(let _e of $)if(ze[_e.route.id]){le=ze[_e.route.id];break}}if(E.signal.aborted)return{shortCircuited:!0}}if(Vn(le)){let ve;return he&&he.replace!=null?ve=he.replace:ve=Lv(le.response.headers.get("Location"),new URL(E.url),v,n.history)===D.location.pathname+D.location.search,await Jt(E,le,!0,{submission:L,replace:ve}),{shortCircuited:!0}}if(pa(le)){let ve=on($,Ne.route.id);return(he&&he.replace)!==!0&&(ie="PUSH"),{matches:$,pendingActionResult:[ve.route.id,le,Ne.route.id]}}return{matches:$,pendingActionResult:[Ne.route.id,le]}}async function G(E,O,L,$,I,de,te,he,se,le,Ne,ve,ze){let _e=de||jf(O,te),at=te||he||Gv(_e),ut=!A&&!le;if(I){if(ut){let bt=Ke(ve);gt({navigation:_e,...bt!==void 0?{actionData:bt}:{}},{flushSync:Ne})}let Le=await Za(L,O.pathname,E.signal);if(Le.type==="aborted")return{shortCircuited:!0};if(Le.type==="error"){if(Le.partialMatches.length===0){let{matches:Kt,route:Tt}=qs(y);return{matches:Kt,loaderData:{},errors:{[Tt.id]:Le.error}}}let bt=on(Le.partialMatches).route.id;return{matches:Le.partialMatches,loaderData:{},errors:{[bt]:Le.error}}}else if(Le.matches)L=Le.matches;else{let{error:bt,notFoundMatches:Kt,route:Tt}=qa(O.pathname);return{matches:Kt,loaderData:{},errors:{[Tt.id]:bt}}}}let mt=g||y,{dsMatches:Ve,revalidatingFetchers:Rt}=zv(E,$,f,m,n.history,D,L,at,O,le?[]:c,le===!0,k,ce,Se,ee,P,mt,v,n.patchRoutesOnNavigation!=null,ve,ze);if(T=++Te,!n.dataStrategy&&!Ve.some(Le=>Le.shouldLoad)&&!Ve.some(Le=>Le.route.middleware&&Le.route.middleware.length>0)&&Rt.length===0){let Le=xr();return Gt(O,{matches:L,loaderData:{},errors:ve&&pa(ve[1])?{[ve[0]]:ve[1].error}:null,...Qv(ve),...Le?{fetchers:new Map(D.fetchers)}:{}},{flushSync:Ne}),{shortCircuited:!0}}if(ut){let Le={};if(!I){Le.navigation=_e;let bt=Ke(ve);bt!==void 0&&(Le.actionData=bt)}Rt.length>0&&(Le.fetchers=nt(Rt)),gt(Le,{flushSync:Ne})}Rt.forEach(Le=>{At(Le.key),Le.controller&&re.set(Le.key,Le.controller)});let it=()=>Rt.forEach(Le=>At(Le.key));Ee&&Ee.signal.addEventListener("abort",it);let{loaderResults:Hl,fetcherResults:Qa}=await iu(Ve,Rt,E,O,$);if(E.signal.aborted)return{shortCircuited:!0};Ee&&Ee.signal.removeEventListener("abort",it),Rt.forEach(Le=>re.delete(Le.key));let _t=Qs(Hl);if(_t)return await Jt(E,_t.result,!0,{replace:se}),{shortCircuited:!0};if(_t=Qs(Qa),_t)return P.add(_t.key),await Jt(E,_t.result,!0,{replace:se}),{shortCircuited:!0};let{loaderData:Fa,errors:Nn}=Bv(D,L,Hl,ve,Rt,Qa);le&&D.errors&&(Nn={...D.errors,...Nn});let Ja=xr(),Mn=Er(T),ii=Ja||Mn||Rt.length>0;return{matches:L,loaderData:Fa,errors:Nn,...ii?{fetchers:new Map(D.fetchers)}:{}}}function Ke(E){if(E&&!pa(E[1]))return{[E[0]]:E[1].data};if(D.actionData)return Object.keys(D.actionData).length===0?null:D.actionData}function nt(E){return E.forEach(O=>{let L=D.fetchers.get(O.key),$=Wu(void 0,L?L.data:void 0);D.fetchers.set(O.key,$)}),new Map(D.fetchers)}async function ht(E,O,L,$){At(E);let I=($&&$.flushSync)===!0,de=g||y,te=Qf(D.location,D.matches,v,L,O,$==null?void 0:$.relative),he=cn(de,te,v),se=Ll(he,de,te);if(se.active&&se.matches&&(he=se.matches),!he){Ea(E,O,Aa(404,{pathname:te}),{flushSync:I});return}let{path:le,submission:Ne,error:ve}=Ov(!0,te,$);if(ve){Ea(E,O,ve,{flushSync:I});return}let ze=n.getContext?await n.getContext():new jv,_e=($&&$.preventScrollReset)===!0;if(Ne&&Ft(Ne.formMethod)){await It(E,O,le,he,ze,se.active,I,_e,Ne,$&&$.unstable_defaultShouldRevalidate);return}ee.set(E,{routeId:O,path:le}),await zt(E,O,le,he,ze,se.active,I,_e,Ne)}async function It(E,O,L,$,I,de,te,he,se,le){_l(),ee.delete(E);let Ne=D.fetchers.get(E);Ba(E,p1(se,Ne),{flushSync:te});let ve=new AbortController,ze=Yi(n.history,L,ve.signal,se);if(de){let rt=await Za($,new URL(ze.url).pathname,ze.signal,E);if(rt.type==="aborted")return;if(rt.type==="error"){Ea(E,O,rt.error,{flushSync:te});return}else if(rt.matches)$=rt.matches;else{Ea(E,O,Aa(404,{pathname:L}),{flushSync:te});return}}let _e=Ks($,L);if(!_e.route.action&&!_e.route.lazy){let rt=Aa(405,{method:se.formMethod,pathname:L,routeId:O});Ea(E,O,rt,{flushSync:te});return}re.set(E,ve);let at=Te,ut=Xi(f,m,ze,L,$,_e,c,I),mt=await xa(ze,L,ut,I,E),Ve=mt[_e.route.id];if(!Ve){for(let rt of ut)if(mt[rt.route.id]){Ve=mt[rt.route.id];break}}if(ze.signal.aborted){re.get(E)===ve&&re.delete(E);return}if(Se.has(E)){if(Vn(Ve)||pa(Ve)){Ba(E,Nl(void 0));return}}else{if(Vn(Ve))if(re.delete(E),T>at){Ba(E,Nl(void 0));return}else return P.add(E),Ba(E,Wu(se)),Jt(ze,Ve,!1,{fetcherSubmission:se,preventScrollReset:he});if(pa(Ve)){Ea(E,O,Ve.error);return}}let Rt=D.navigation.location||D.location,it=Yi(n.history,Rt,ve.signal),Hl=g||y,Qa=D.navigation.state!=="idle"?cn(Hl,D.navigation.location,v):D.matches;Ue(Qa,"Didn't find any matches after fetcher action");let _t=++Te;Y.set(E,_t);let Fa=Wu(se,Ve.data);D.fetchers.set(E,Fa);let{dsMatches:Nn,revalidatingFetchers:Ja}=zv(it,I,f,m,n.history,D,Qa,se,Rt,c,!1,k,ce,Se,ee,P,Hl,v,n.patchRoutesOnNavigation!=null,[_e.route.id,Ve],le);Ja.filter(rt=>rt.key!==E).forEach(rt=>{let ui=rt.key,ri=D.fetchers.get(ui),Nr=Wu(void 0,ri?ri.data:void 0);D.fetchers.set(ui,Nr),At(ui),rt.controller&&re.set(ui,rt.controller)}),gt({fetchers:new Map(D.fetchers)});let Mn=()=>Ja.forEach(rt=>At(rt.key));ve.signal.addEventListener("abort",Mn);let{loaderResults:ii,fetcherResults:Le}=await iu(Nn,Ja,it,Rt,I);if(ve.signal.aborted)return;if(ve.signal.removeEventListener("abort",Mn),Y.delete(E),re.delete(E),Ja.forEach(rt=>re.delete(rt.key)),D.fetchers.has(E)){let rt=Nl(Ve.data);D.fetchers.set(E,rt)}let bt=Qs(ii);if(bt)return Jt(it,bt.result,!1,{preventScrollReset:he});if(bt=Qs(Le),bt)return P.add(bt.key),Jt(it,bt.result,!1,{preventScrollReset:he});let{loaderData:Kt,errors:Tt}=Bv(D,Qa,ii,void 0,Ja,Le);Er(_t),D.navigation.state==="loading"&&_t>T?(Ue(ie,"Expected pending action"),Ee&&Ee.abort(),Gt(D.navigation.location,{matches:Qa,loaderData:Kt,errors:Tt,fetchers:new Map(D.fetchers)})):(gt({errors:Tt,loaderData:qv(D.loaderData,Kt,Qa,Tt),fetchers:new Map(D.fetchers)}),k=!1)}async function zt(E,O,L,$,I,de,te,he,se){let le=D.fetchers.get(E);Ba(E,Wu(se,le?le.data:void 0),{flushSync:te});let Ne=new AbortController,ve=Yi(n.history,L,Ne.signal);if(de){let Ve=await Za($,new URL(ve.url).pathname,ve.signal,E);if(Ve.type==="aborted")return;if(Ve.type==="error"){Ea(E,O,Ve.error,{flushSync:te});return}else if(Ve.matches)$=Ve.matches;else{Ea(E,O,Aa(404,{pathname:L}),{flushSync:te});return}}let ze=Ks($,L);re.set(E,Ne);let _e=Te,at=Xi(f,m,ve,L,$,ze,c,I),mt=(await xa(ve,L,at,I,E))[ze.route.id];if(re.get(E)===Ne&&re.delete(E),!ve.signal.aborted){if(Se.has(E)){Ba(E,Nl(void 0));return}if(Vn(mt))if(T>_e){Ba(E,Nl(void 0));return}else{P.add(E),await Jt(ve,mt,!1,{preventScrollReset:he});return}if(pa(mt)){Ea(E,O,mt.error);return}Ba(E,Nl(mt.data))}}async function Jt(E,O,L,{submission:$,fetcherSubmission:I,preventScrollReset:de,replace:te}={}){L||(ye==null||ye.resolve(),ye=null),O.response.headers.has("X-Remix-Revalidate")&&(k=!0);let he=O.response.headers.get("Location");Ue(he,"Expected a Location header on the redirect Response"),he=Lv(he,new URL(E.url),v,n.history);let se=ir(D.location,he,{_isRedirect:!0});if(r){let at=!1;if(O.response.headers.has("X-Remix-Reload-Document"))at=!0;else if(Wf(he)){const ut=Rp(he,!0);at=ut.origin!==i.location.origin||La(ut.pathname,v)==null}if(at){te?i.location.replace(he):i.location.assign(he);return}}Ee=null;let le=te===!0||O.response.headers.has("X-Remix-Replace")?"REPLACE":"PUSH",{formMethod:Ne,formAction:ve,formEncType:ze}=D.navigation;!$&&!I&&Ne&&ve&&ze&&($=Gv(D.navigation));let _e=$||I;if(ZS.has(O.response.status)&&_e&&Ft(_e.formMethod))await Sa(le,se,{submission:{..._e,formAction:he},preventScrollReset:de||Re,enableViewTransition:L?Ae:void 0});else{let at=jf(se,$);await Sa(le,se,{overrideNavigation:at,fetcherSubmission:I,preventScrollReset:de||Re,enableViewTransition:L?Ae:void 0})}}async function xa(E,O,L,$,I){var he;let de,te={};try{de=await a1(S,E,O,L,I,$,!1)}catch(se){return L.filter(le=>le.shouldLoad).forEach(le=>{te[le.route.id]={type:"error",error:se}}),te}if(E.signal.aborted)return te;if(!Ft(E.method))for(let se of L){if(((he=de[se.route.id])==null?void 0:he.type)==="error")break;!de.hasOwnProperty(se.route.id)&&!D.loaderData.hasOwnProperty(se.route.id)&&(!D.errors||!D.errors.hasOwnProperty(se.route.id))&&se.shouldCallHandler()&&(de[se.route.id]={type:"error",result:new Error(`No result returned from dataStrategy for route ${se.route.id}`)})}for(let[se,le]of Object.entries(de))if(d1(le)){let Ne=le.result;te[se]={type:"redirect",response:u1(Ne,E,se,L,v)}}else te[se]=await i1(le);return te}async function iu(E,O,L,$,I){let de=xa(L,$,E,I,null),te=Promise.all(O.map(async le=>{if(le.matches&&le.match&&le.request&&le.controller){let ve=(await xa(le.request,le.path,le.matches,I,le.key))[le.match.route.id];return{[le.key]:ve}}else return Promise.resolve({[le.key]:{type:"error",error:Aa(404,{pathname:le.path})}})})),he=await de,se=(await te).reduce((le,Ne)=>Object.assign(le,Ne),{});return{loaderResults:he,fetcherResults:se}}function _l(){k=!0,ee.forEach((E,O)=>{re.has(O)&&ce.add(O),At(O)})}function Ba(E,O,L={}){D.fetchers.set(E,O),gt({fetchers:new Map(D.fetchers)},{flushSync:(L&&L.flushSync)===!0})}function Ea(E,O,L,$={}){let I=on(D.matches,O);ul(E),gt({errors:{[I.route.id]:L},fetchers:new Map(D.fetchers)},{flushSync:($&&$.flushSync)===!0})}function Sr(E){return pe.set(E,(pe.get(E)||0)+1),Se.has(E)&&Se.delete(E),D.fetchers.get(E)||FS}function ac(E,O){At(E,O==null?void 0:O.reason),Ba(E,Nl(null))}function ul(E){let O=D.fetchers.get(E);re.has(E)&&!(O&&O.state==="loading"&&Y.has(E))&&At(E),ee.delete(E),Y.delete(E),P.delete(E),Se.delete(E),ce.delete(E),D.fetchers.delete(E)}function kt(E){let O=(pe.get(E)||0)-1;O<=0?(pe.delete(E),Se.add(E)):pe.set(E,O),gt({fetchers:new Map(D.fetchers)})}function At(E,O){let L=re.get(E);L&&(L.abort(O),re.delete(E))}function Xt(E){for(let O of E){let L=Sr(O),$=Nl(L.data);D.fetchers.set(O,$)}}function xr(){let E=[],O=!1;for(let L of P){let $=D.fetchers.get(L);Ue($,`Expected fetcher: ${L}`),$.state==="loading"&&(P.delete(L),E.push(L),O=!0)}return Xt(E),O}function Er(E){let O=[];for(let[L,$]of Y)if($0}function lc(E,O){let L=D.blockers.get(E)||$u;return Oe.get(E)!==O&&Oe.set(E,O),L}function Rn(E){D.blockers.delete(E),Oe.delete(E)}function rl(E,O){let L=D.blockers.get(E)||$u;Ue(L.state==="unblocked"&&O.state==="blocked"||L.state==="blocked"&&O.state==="blocked"||L.state==="blocked"&&O.state==="proceeding"||L.state==="blocked"&&O.state==="unblocked"||L.state==="proceeding"&&O.state==="unblocked",`Invalid blocker state transition: ${L.state} -> ${O.state}`);let $=new Map(D.blockers);$.set(E,O),gt({blockers:$})}function Tn({currentLocation:E,nextLocation:O,historyAction:L}){if(Oe.size===0)return;Oe.size>1&&jt(!1,"A router only supports one blocker at a time");let $=Array.from(Oe.entries()),[I,de]=$[$.length-1],te=D.blockers.get(I);if(!(te&&te.state==="proceeding")&&de({currentLocation:E,nextLocation:O,historyAction:L}))return I}function qa(E){let O=Aa(404,{pathname:E}),L=g||y,{matches:$,route:I}=qs(L);return{notFoundMatches:$,route:I,error:O}}function ni(E,O,L){if(H=E,q=O,w=L||null,!X&&D.navigation===Ef){X=!0;let $=uu(D.location,D.matches);$!=null&>({restoreScrollPosition:$})}return()=>{H=null,q=null,w=null}}function Ul(E,O){return w&&w(E,O.map($=>bS($,D.loaderData)))||E.key}function nc(E,O){if(H&&q){let L=Ul(E,O);H[L]=q()}}function uu(E,O){if(H){let L=Ul(E,O),$=H[L];if(typeof $=="number")return $}return null}function Ll(E,O,L){if(n.patchRoutesOnNavigation)if(E){if(Object.keys(E[0].params).length>0)return{active:!0,matches:tr(O,L,v,!0)}}else return{active:!0,matches:tr(O,L,v,!0)||[]};return{active:!1,matches:null}}async function Za(E,O,L,$){if(!n.patchRoutesOnNavigation)return{type:"success",matches:E};let I=E;for(;;){let de=g==null,te=g||y,he=m;try{await n.patchRoutesOnNavigation({signal:L,path:O,matches:I,fetcherKey:$,patch:(Ne,ve)=>{L.aborted||Dv(Ne,ve,te,he,f,!1)}})}catch(Ne){return{type:"error",error:Ne,partialMatches:I}}finally{de&&!L.aborted&&(y=[...y])}if(L.aborted)return{type:"aborted"};let se=cn(te,O,v),le=null;if(se){if(Object.keys(se[0].params).length===0)return{type:"success",matches:se};if(le=tr(te,O,v,!0),!(le&&I.lengthL.route.id===O[$].route.id)}function Rr(E){m={},g=ur(E,f,void 0,m)}function Tr(E,O,L=!1){let $=g==null;Dv(E,O,g||y,m,f,L),$&&(y=[...y],gt({}))}return ne={get basename(){return v},get future(){return b},get state(){return D},get routes(){return y},get window(){return i},initialize:nl,subscribe:Yt,enableScrollRestoration:ni,navigate:il,fetch:ht,revalidate:Al,createHref:E=>n.history.createHref(E),encodeLocation:E=>n.history.encodeLocation(E),getFetcher:Sr,resetFetcher:ac,deleteFetcher:kt,dispose:ba,getBlocker:lc,deleteBlocker:Rn,patchRoutes:Tr,_internalFetchControllers:re,_internalSetRoutes:Rr,_internalSetStateDoNotUseOrYouWillBreakYourApp(E){gt(E)}},n.unstable_instrumentations&&(ne=BS(ne,n.unstable_instrumentations.map(E=>E.router).filter(Boolean))),ne}function $S(n){return n!=null&&("formData"in n&&n.formData!=null||"body"in n&&n.body!==void 0)}function Qf(n,i,r,c,o,f){let m,y;if(o){m=[];for(let v of i)if(m.push(v),v.route.id===o){y=v;break}}else m=i,y=i[i.length-1];let g=mr(c||".",Ps(m),La(n.pathname,r)||n.pathname,f==="path");if(c==null&&(g.search=n.search,g.hash=n.hash),(c==null||c===""||c===".")&&y){let v=td(g.search);if(y.route.index&&!v)g.search=g.search?g.search.replace(/^\?/,"?index&"):"?index";else if(!y.route.index&&v){let S=new URLSearchParams(g.search),b=S.getAll("index");S.delete("index"),b.filter(M=>M).forEach(M=>S.append("index",M));let C=S.toString();g.search=C?`?${C}`:""}}return r!=="/"&&(g.pathname=wS({basename:r,pathname:g.pathname})),al(g)}function Ov(n,i,r){if(!r||!$S(r))return{path:i};if(r.formMethod&&!y1(r.formMethod))return{path:i,error:Aa(405,{method:r.formMethod})};let c=()=>({path:i,error:Aa(400,{type:"invalid-body"})}),f=(r.formMethod||"get").toUpperCase(),m=Xp(i);if(r.body!==void 0){if(r.formEncType==="text/plain"){if(!Ft(f))return c();let b=typeof r.body=="string"?r.body:r.body instanceof FormData||r.body instanceof URLSearchParams?Array.from(r.body.entries()).reduce((C,[M,H])=>`${C}${M}=${H} -`,""):String(r.body);return{path:i,submission:{formMethod:f,formAction:m,formEncType:r.formEncType,formData:void 0,json:void 0,text:b}}}else if(r.formEncType==="application/json"){if(!Ft(f))return c();try{let b=typeof r.body=="string"?JSON.parse(r.body):r.body;return{path:i,submission:{formMethod:f,formAction:m,formEncType:r.formEncType,formData:void 0,json:b,text:void 0}}}catch{return c()}}}Ue(typeof FormData=="function","FormData is not available in this environment");let y,g;if(r.formData)y=Gf(r.formData),g=r.formData;else if(r.body instanceof FormData)y=Gf(r.body),g=r.body;else if(r.body instanceof URLSearchParams)y=r.body,g=Hv(y);else if(r.body==null)y=new URLSearchParams,g=new FormData;else try{y=new URLSearchParams(r.body),g=Hv(y)}catch{return c()}let v={formMethod:f,formAction:m,formEncType:r&&r.formEncType||"application/x-www-form-urlencoded",formData:g,json:void 0,text:void 0};if(Ft(v.formMethod))return{path:i,submission:v};let S=ll(i);return n&&S.search&&td(S.search)&&y.append("index",""),S.search=`?${y}`,{path:al(S),submission:v}}function zv(n,i,r,c,o,f,m,y,g,v,S,b,C,M,H,w,q,X,J,F,W){var xe;let ae=F?pa(F[1])?F[1].error:F[1].data:void 0,oe=o.createURL(f.location),ne=o.createURL(g),D;if(S&&f.errors){let A=Object.keys(f.errors)[0];D=m.findIndex(k=>k.route.id===A)}else if(F&&pa(F[1])){let A=F[0];D=m.findIndex(k=>k.route.id===A)-1}let ie=F?F[1].statusCode:void 0,ye=ie&&ie>=400,Re={currentUrl:oe,currentParams:((xe=f.matches[0])==null?void 0:xe.params)||{},nextUrl:ne,nextParams:m[0].params,...y,actionResult:ae,actionStatus:ie},Ee=vr(m),Ae=m.map((A,k)=>{let{route:ce}=A,re=null;if(D!=null&&k>D)re=!1;else if(ce.lazy)re=!0;else if(!If(ce))re=!1;else if(S){let{shouldLoad:P}=Lp(ce,f.loaderData,f.errors);re=P}else WS(f.loaderData,f.matches[k],A)&&(re=!0);if(re!==null)return Yf(r,c,n,g,Ee,A,v,i,re);let Te=!1;typeof W=="boolean"?Te=W:ye?Te=!1:(b||oe.pathname+oe.search===ne.pathname+ne.search||oe.search!==ne.search||PS(f.matches[k],A))&&(Te=!0);let T={...Re,defaultShouldRevalidate:Te},Y=ar(A,T);return Yf(r,c,n,g,Ee,A,v,i,Y,T,W)}),qe=[];return H.forEach((A,k)=>{if(S||!m.some(pe=>pe.route.id===A.routeId)||M.has(k))return;let ce=f.fetchers.get(k),re=ce&&ce.state!=="idle"&&ce.data===void 0,Te=cn(q,A.path,X);if(!Te){if(J&&re)return;qe.push({key:k,routeId:A.routeId,path:A.path,matches:null,match:null,request:null,controller:null});return}if(w.has(k))return;let T=Ks(Te,A.path),Y=new AbortController,P=Yi(o,A.path,Y.signal),ee=null;if(C.has(k))C.delete(k),ee=Xi(r,c,P,A.path,Te,T,v,i);else if(re)b&&(ee=Xi(r,c,P,A.path,Te,T,v,i));else{let pe;typeof W=="boolean"?pe=W:ye?pe=!1:pe=b;let Se={...Re,defaultShouldRevalidate:pe};ar(T,Se)&&(ee=Xi(r,c,P,A.path,Te,T,v,i,Se))}ee&&qe.push({key:k,routeId:A.routeId,path:A.path,matches:ee,match:T,request:P,controller:Y})}),{dsMatches:Ae,revalidatingFetchers:qe}}function If(n){return n.loader!=null||n.middleware!=null&&n.middleware.length>0}function Lp(n,i,r){if(n.lazy)return{shouldLoad:!0,renderFallback:!0};if(!If(n))return{shouldLoad:!1,renderFallback:!1};let c=i!=null&&n.id in i,o=r!=null&&r[n.id]!==void 0;if(!c&&o)return{shouldLoad:!1,renderFallback:!1};if(typeof n.loader=="function"&&n.loader.hydrate===!0)return{shouldLoad:!0,renderFallback:!c};let f=!c&&!o;return{shouldLoad:f,renderFallback:f}}function WS(n,i,r){let c=!i||r.route.id!==i.route.id,o=!n.hasOwnProperty(r.route.id);return c||o}function PS(n,i){let r=n.route.path;return n.pathname!==i.pathname||r!=null&&r.endsWith("*")&&n.params["*"]!==i.params["*"]}function ar(n,i){if(n.route.shouldRevalidate){let r=n.route.shouldRevalidate(i);if(typeof r=="boolean")return r}return i.defaultShouldRevalidate}function Dv(n,i,r,c,o,f){let m;if(n){let v=c[n];Ue(v,`No route found to patch children into: routeId = ${n}`),v.children||(v.children=[]),m=v.children}else m=r;let y=[],g=[];if(i.forEach(v=>{let S=m.find(b=>Hp(v,b));S?g.push({existingRoute:S,newRoute:v}):y.push(v)}),y.length>0){let v=ur(y,o,[n||"_","patch",String((m==null?void 0:m.length)||"0")],c);m.push(...v)}if(f&&g.length>0)for(let v=0;v{var f;return(f=i.children)==null?void 0:f.some(m=>Hp(c,m))}))??!1:!1}var wv=new WeakMap,Bp=({key:n,route:i,manifest:r,mapRouteProperties:c})=>{let o=r[i.id];if(Ue(o,"No route found in manifest"),!o.lazy||typeof o.lazy!="object")return;let f=o.lazy[n];if(!f)return;let m=wv.get(o);m||(m={},wv.set(o,m));let y=m[n];if(y)return y;let g=(async()=>{let v=yS(n),b=o[n]!==void 0&&n!=="hasErrorBoundary";if(v)jt(!v,"Route property "+n+" is not a supported lazy route property. This property will be ignored."),m[n]=Promise.resolve();else if(b)jt(!1,`Route "${o.id}" has a static property "${n}" defined. The lazy property will be ignored.`);else{let C=await f();C!=null&&(Object.assign(o,{[n]:C}),Object.assign(o,c(o)))}typeof o.lazy=="object"&&(o.lazy[n]=void 0,Object.values(o.lazy).every(C=>C===void 0)&&(o.lazy=void 0))})();return m[n]=g,g},Av=new WeakMap;function IS(n,i,r,c,o){let f=r[n.id];if(Ue(f,"No route found in manifest"),!n.lazy)return{lazyRoutePromise:void 0,lazyHandlerPromise:void 0};if(typeof n.lazy=="function"){let S=Av.get(f);if(S)return{lazyRoutePromise:S,lazyHandlerPromise:S};let b=(async()=>{Ue(typeof n.lazy=="function","No lazy route function found");let C=await n.lazy(),M={};for(let H in C){let w=C[H];if(w===void 0)continue;let q=pS(H),J=f[H]!==void 0&&H!=="hasErrorBoundary";q?jt(!q,"Route property "+H+" is not a supported property to be returned from a lazy route function. This property will be ignored."):J?jt(!J,`Route "${f.id}" has a static property "${H}" defined but its lazy function is also returning a value for this property. The lazy route property "${H}" will be ignored.`):M[H]=w}Object.assign(f,M),Object.assign(f,{...c(f),lazy:void 0})})();return Av.set(f,b),b.catch(()=>{}),{lazyRoutePromise:b,lazyHandlerPromise:b}}let m=Object.keys(n.lazy),y=[],g;for(let S of m){if(o&&o.includes(S))continue;let b=Bp({key:S,route:n,manifest:r,mapRouteProperties:c});b&&(y.push(b),S===i&&(g=b))}let v=y.length>0?Promise.all(y).then(()=>{}):void 0;return v==null||v.catch(()=>{}),g==null||g.catch(()=>{}),{lazyRoutePromise:v,lazyHandlerPromise:g}}async function _v(n){let i=n.matches.filter(o=>o.shouldLoad),r={};return(await Promise.all(i.map(o=>o.resolve()))).forEach((o,f)=>{r[i[f].route.id]=o}),r}async function e1(n){return n.matches.some(i=>i.route.middleware)?qp(n,()=>_v(n)):_v(n)}function qp(n,i){return t1(n,i,c=>{if(m1(c))throw c;return c},o1,r);function r(c,o,f){if(f)return Promise.resolve(Object.assign(f.value,{[o]:{type:"error",result:c}}));{let{matches:m}=n,y=Math.min(Math.max(m.findIndex(v=>v.route.id===o),0),Math.max(m.findIndex(v=>v.shouldCallHandler()),0)),g=on(m,m[y].route.id).route.id;return Promise.resolve({[g]:{type:"error",result:c}})}}}async function t1(n,i,r,c,o){let{matches:f,...m}=n,y=f.flatMap(v=>v.route.middleware?v.route.middleware.map(S=>[v.route.id,S]):[]);return await Qp(m,y,i,r,c,o)}async function Qp(n,i,r,c,o,f,m=0){let{request:y}=n;if(y.signal.aborted)throw y.signal.reason??new Error(`Request aborted: ${y.method} ${y.url}`);let g=i[m];if(!g)return await r();let[v,S]=g,b,C=async()=>{if(b)throw new Error("You may only call `next()` once per middleware");try{return b={value:await Qp(n,i,r,c,o,f,m+1)},b.value}catch(M){return b={value:await f(M,v,b)},b.value}};try{let M=await S(n,C),H=M!=null?c(M):void 0;return o(H)?H:b?H??b.value:(b={value:await C()},b.value)}catch(M){return await f(M,v,b)}}function Yp(n,i,r,c,o){let f=Bp({key:"middleware",route:c.route,manifest:i,mapRouteProperties:n}),m=IS(c.route,Ft(r.method)?"action":"loader",i,n,o);return{middleware:f,route:m.lazyRoutePromise,handler:m.lazyHandlerPromise}}function Yf(n,i,r,c,o,f,m,y,g,v=null,S){let b=!1,C=Yp(n,i,r,f,m);return{...f,_lazyPromises:C,shouldLoad:g,shouldRevalidateArgs:v,shouldCallHandler(M){return b=!0,v?typeof S=="boolean"?ar(f,{...v,defaultShouldRevalidate:S}):typeof M=="boolean"?ar(f,{...v,defaultShouldRevalidate:M}):ar(f,v):g},resolve(M){let{lazy:H,loader:w,middleware:q}=f.route,X=b||g||M&&!Ft(r.method)&&(H||w),J=q&&q.length>0&&!w&&!H;return X&&(Ft(r.method)||!J)?l1({request:r,path:c,unstable_pattern:o,match:f,lazyHandlerPromise:C==null?void 0:C.handler,lazyRoutePromise:C==null?void 0:C.route,handlerOverride:M,scopedContext:y}):Promise.resolve({type:"data",result:void 0})}}}function Xi(n,i,r,c,o,f,m,y,g=null){return o.map(v=>v.route.id!==f.route.id?{...v,shouldLoad:!1,shouldRevalidateArgs:g,shouldCallHandler:()=>!1,_lazyPromises:Yp(n,i,r,v,m),resolve:()=>Promise.resolve({type:"data",result:void 0})}:Yf(n,i,r,c,vr(o),v,m,y,!0,g))}async function a1(n,i,r,c,o,f,m){c.some(S=>{var b;return(b=S._lazyPromises)==null?void 0:b.middleware})&&await Promise.all(c.map(S=>{var b;return(b=S._lazyPromises)==null?void 0:b.middleware}));let y={request:i,unstable_url:Gp(i,r),unstable_pattern:vr(c),params:c[0].params,context:f,matches:c},v=await n({...y,fetcherKey:o,runClientMiddleware:S=>{let b=y;return qp(b,()=>S({...b,fetcherKey:o,runClientMiddleware:()=>{throw new Error("Cannot call `runClientMiddleware()` from within an `runClientMiddleware` handler")}}))}});try{await Promise.all(c.flatMap(S=>{var b,C;return[(b=S._lazyPromises)==null?void 0:b.handler,(C=S._lazyPromises)==null?void 0:C.route]}))}catch{}return v}async function l1({request:n,path:i,unstable_pattern:r,match:c,lazyHandlerPromise:o,lazyRoutePromise:f,handlerOverride:m,scopedContext:y}){let g,v,S=Ft(n.method),b=S?"action":"loader",C=M=>{let H,w=new Promise((J,F)=>H=F);v=()=>H(),n.signal.addEventListener("abort",v);let q=J=>typeof M!="function"?Promise.reject(new Error(`You cannot call the handler for a route which defines a boolean "${b}" [routeId: ${c.route.id}]`)):M({request:n,unstable_url:Gp(n,i),unstable_pattern:r,params:c.params,context:y},...J!==void 0?[J]:[]),X=(async()=>{try{return{type:"data",result:await(m?m(F=>q(F)):q())}}catch(J){return{type:"error",result:J}}})();return Promise.race([X,w])};try{let M=S?c.route.action:c.route.loader;if(o||f)if(M){let H,[w]=await Promise.all([C(M).catch(q=>{H=q}),o,f]);if(H!==void 0)throw H;g=w}else{await o;let H=S?c.route.action:c.route.loader;if(H)[g]=await Promise.all([C(H),f]);else if(b==="action"){let w=new URL(n.url),q=w.pathname+w.search;throw Aa(405,{method:n.method,pathname:q,routeId:c.route.id})}else return{type:"data",result:void 0}}else if(M)g=await C(M);else{let H=new URL(n.url),w=H.pathname+H.search;throw Aa(404,{pathname:w})}}catch(M){return{type:"error",result:M}}finally{v&&n.signal.removeEventListener("abort",v)}return g}async function n1(n){let i=n.headers.get("Content-Type");return i&&/\bapplication\/json\b/.test(i)?n.body==null?null:n.json():n.text()}async function i1(n){var c,o,f,m,y;let{result:i,type:r}=n;if(ed(i)){let g;try{g=await n1(i)}catch(v){return{type:"error",error:v}}return r==="error"?{type:"error",error:new yr(i.status,i.statusText,g),statusCode:i.status,headers:i.headers}:{type:"data",data:g,statusCode:i.status,headers:i.headers}}return r==="error"?Yv(i)?i.data instanceof Error?{type:"error",error:i.data,statusCode:(c=i.init)==null?void 0:c.status,headers:(o=i.init)!=null&&o.headers?new Headers(i.init.headers):void 0}:{type:"error",error:c1(i),statusCode:rr(i)?i.status:void 0,headers:(f=i.init)!=null&&f.headers?new Headers(i.init.headers):void 0}:{type:"error",error:i,statusCode:rr(i)?i.status:void 0}:Yv(i)?{type:"data",data:i.data,statusCode:(m=i.init)==null?void 0:m.status,headers:(y=i.init)!=null&&y.headers?new Headers(i.init.headers):void 0}:{type:"data",data:i}}function u1(n,i,r,c,o){let f=n.headers.get("Location");if(Ue(f,"Redirects returned/thrown from loaders/actions must have a Location header"),!Wf(f)){let m=c.slice(0,c.findIndex(y=>y.route.id===r)+1);f=Qf(new URL(i.url),m,o,f),n.headers.set("Location",f)}return n}var Uv=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];function Lv(n,i,r,c){if(Wf(n)){let o=n,f=o.startsWith("//")?new URL(i.protocol+o):new URL(o);if(Uv.includes(f.protocol))throw new Error("Invalid redirect location");let m=La(f.pathname,r)!=null;if(f.origin===i.origin&&m)return Pf(f.pathname)+f.search+f.hash}try{let o=c.createURL(n);if(Uv.includes(o.protocol))throw new Error("Invalid redirect location")}catch{}return n}function Yi(n,i,r,c){let o=n.createURL(Xp(i)).toString(),f={signal:r};if(c&&Ft(c.formMethod)){let{formMethod:m,formEncType:y}=c;f.method=m.toUpperCase(),y==="application/json"?(f.headers=new Headers({"Content-Type":y}),f.body=JSON.stringify(c.json)):y==="text/plain"?f.body=c.text:y==="application/x-www-form-urlencoded"&&c.formData?f.body=Gf(c.formData):f.body=c.formData}return new Request(o,f)}function Gp(n,i){let r=new URL(n.url),c=typeof i=="string"?ll(i):i;if(r.pathname=c.pathname||"/",c.search){let o=new URLSearchParams(c.search),f=o.getAll("index");o.delete("index");for(let m of f.filter(Boolean))o.append("index",m);r.search=o.size?`?${o.toString()}`:""}else r.search="";return r.hash=c.hash||"",r}function Gf(n){let i=new URLSearchParams;for(let[r,c]of n.entries())i.append(r,typeof c=="string"?c:c.name);return i}function Hv(n){let i=new FormData;for(let[r,c]of n.entries())i.append(r,c);return i}function r1(n,i,r,c=!1,o=!1){let f={},m=null,y,g=!1,v={},S=r&&pa(r[1])?r[1].error:void 0;return n.forEach(b=>{if(!(b.route.id in i))return;let C=b.route.id,M=i[C];if(Ue(!Vn(M),"Cannot handle redirect results in processLoaderData"),pa(M)){let H=M.error;if(S!==void 0&&(H=S,S=void 0),m=m||{},o)m[C]=H;else{let w=on(n,C);m[w.route.id]==null&&(m[w.route.id]=H)}c||(f[C]=Up),g||(g=!0,y=rr(M.error)?M.error.status:500),M.headers&&(v[C]=M.headers)}else f[C]=M.data,M.statusCode&&M.statusCode!==200&&!g&&(y=M.statusCode),M.headers&&(v[C]=M.headers)}),S!==void 0&&r&&(m={[r[0]]:S},r[2]&&(f[r[2]]=void 0)),{loaderData:f,errors:m,statusCode:y||200,loaderHeaders:v}}function Bv(n,i,r,c,o,f){let{loaderData:m,errors:y}=r1(i,r,c);return o.filter(g=>!g.matches||g.matches.some(v=>v.shouldLoad)).forEach(g=>{let{key:v,match:S,controller:b}=g;if(b&&b.signal.aborted)return;let C=f[v];if(Ue(C,"Did not find corresponding fetcher result"),pa(C)){let M=on(n.matches,S==null?void 0:S.route.id);y&&y[M.route.id]||(y={...y,[M.route.id]:C.error}),n.fetchers.delete(v)}else if(Vn(C))Ue(!1,"Unhandled fetcher revalidation redirect");else{let M=Nl(C.data);n.fetchers.set(v,M)}}),{loaderData:m,errors:y}}function qv(n,i,r,c){let o=Object.entries(i).filter(([,f])=>f!==Up).reduce((f,[m,y])=>(f[m]=y,f),{});for(let f of r){let m=f.route.id;if(!i.hasOwnProperty(m)&&n.hasOwnProperty(m)&&f.route.loader&&(o[m]=n[m]),c&&c.hasOwnProperty(m))break}return o}function Qv(n){return n?pa(n[1])?{actionData:{}}:{actionData:{[n[0]]:n[1].data}}:{}}function on(n,i){return(i?n.slice(0,n.findIndex(c=>c.route.id===i)+1):[...n]).reverse().find(c=>c.route.hasErrorBoundary===!0)||n[0]}function qs(n){let i=n.length===1?n[0]:n.find(r=>r.index||!r.path||r.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:i}],route:i}}function Aa(n,{pathname:i,routeId:r,method:c,type:o,message:f}={}){let m="Unknown Server Error",y="Unknown @remix-run/router error";return n===400?(m="Bad Request",c&&i&&r?y=`You made a ${c} request to "${i}" but did not provide a \`loader\` for route "${r}", so there is no way to handle the request.`:o==="invalid-body"&&(y="Unable to encode submission body")):n===403?(m="Forbidden",y=`Route "${r}" does not match URL "${i}"`):n===404?(m="Not Found",y=`No route matches URL "${i}"`):n===405&&(m="Method Not Allowed",c&&i&&r?y=`You made a ${c.toUpperCase()} request to "${i}" but did not provide an \`action\` for route "${r}", so there is no way to handle the request.`:c&&(y=`Invalid request method "${c.toUpperCase()}"`)),new yr(n||500,m,new Error(y),!0)}function Qs(n){let i=Object.entries(n);for(let r=i.length-1;r>=0;r--){let[c,o]=i[r];if(Vn(o))return{key:c,result:o}}}function Xp(n){let i=typeof n=="string"?ll(n):n;return al({...i,hash:""})}function s1(n,i){return n.pathname!==i.pathname||n.search!==i.search?!1:n.hash===""?i.hash!=="":n.hash===i.hash?!0:i.hash!==""}function c1(n){var i,r;return new yr(((i=n.init)==null?void 0:i.status)??500,((r=n.init)==null?void 0:r.statusText)??"Internal Server Error",n.data)}function o1(n){return n!=null&&typeof n=="object"&&Object.entries(n).every(([i,r])=>typeof i=="string"&&f1(r))}function f1(n){return n!=null&&typeof n=="object"&&"type"in n&&"result"in n&&(n.type==="data"||n.type==="error")}function d1(n){return ed(n.result)&&Ap.has(n.result.status)}function pa(n){return n.type==="error"}function Vn(n){return(n&&n.type)==="redirect"}function Yv(n){return typeof n=="object"&&n!=null&&"type"in n&&"data"in n&&"init"in n&&n.type==="DataWithResponseInit"}function ed(n){return n!=null&&typeof n.status=="number"&&typeof n.statusText=="string"&&typeof n.headers=="object"&&typeof n.body<"u"}function h1(n){return Ap.has(n)}function m1(n){return ed(n)&&h1(n.status)&&n.headers.has("Location")}function y1(n){return VS.has(n.toUpperCase())}function Ft(n){return XS.has(n.toUpperCase())}function td(n){return new URLSearchParams(n).getAll("index").some(i=>i==="")}function Ks(n,i){let r=typeof i=="string"?ll(i).search:i.search;if(n[n.length-1].route.index&&td(r||""))return n[n.length-1];let c=Cp(n);return c[c.length-1]}function Gv(n){let{formMethod:i,formAction:r,formEncType:c,text:o,formData:f,json:m}=n;if(!(!i||!r||!c)){if(o!=null)return{formMethod:i,formAction:r,formEncType:c,formData:void 0,json:void 0,text:o};if(f!=null)return{formMethod:i,formAction:r,formEncType:c,formData:f,json:void 0,text:void 0};if(m!==void 0)return{formMethod:i,formAction:r,formEncType:c,formData:void 0,json:m,text:void 0}}}function jf(n,i){return i?{state:"loading",location:n,formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text}:{state:"loading",location:n,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function v1(n,i){return{state:"submitting",location:n,formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text}}function Wu(n,i){return n?{state:"loading",formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text,data:i}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:i}}function p1(n,i){return{state:"submitting",formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text,data:i?i.data:void 0}}function Nl(n){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:n}}function g1(n,i){try{let r=n.sessionStorage.getItem(_p);if(r){let c=JSON.parse(r);for(let[o,f]of Object.entries(c||{}))f&&Array.isArray(f)&&i.set(o,new Set(f||[]))}}catch{}}function b1(n,i){if(i.size>0){let r={};for(let[c,o]of i)r[c]=[...o];try{n.sessionStorage.setItem(_p,JSON.stringify(r))}catch(c){jt(!1,`Failed to save applied view transitions in sessionStorage (${c}).`)}}}function Xv(){let n,i,r=new Promise((c,o)=>{n=async f=>{c(f);try{await r}catch{}},i=async f=>{o(f);try{await r}catch{}}});return{promise:r,resolve:n,reject:i}}var li=R.createContext(null);li.displayName="DataRouter";var pr=R.createContext(null);pr.displayName="DataRouterState";var Kp=R.createContext(!1);function Vp(){return R.useContext(Kp)}var ad=R.createContext({isTransitioning:!1});ad.displayName="ViewTransition";var Zp=R.createContext(new Map);Zp.displayName="Fetchers";var S1=R.createContext(null);S1.displayName="Await";var ga=R.createContext(null);ga.displayName="Navigation";var Is=R.createContext(null);Is.displayName="Location";var Ha=R.createContext({outlet:null,matches:[],isDataRoute:!1});Ha.displayName="Route";var ld=R.createContext(null);ld.displayName="RouteError";var Fp="REACT_ROUTER_ERROR",x1="REDIRECT",E1="ROUTE_ERROR_RESPONSE";function j1(n){if(n.startsWith(`${Fp}:${x1}:{`))try{let i=JSON.parse(n.slice(28));if(typeof i=="object"&&i&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.location=="string"&&typeof i.reloadDocument=="boolean"&&typeof i.replace=="boolean")return i}catch{}}function R1(n){if(n.startsWith(`${Fp}:${E1}:{`))try{let i=JSON.parse(n.slice(40));if(typeof i=="object"&&i&&typeof i.status=="number"&&typeof i.statusText=="string")return new yr(i.status,i.statusText,i.data)}catch{}}function T1(n,{relative:i}={}){Ue(nu(),"useHref() may be used only in the context of a component.");let{basename:r,navigator:c}=R.useContext(ga),{hash:o,pathname:f,search:m}=br(n,{relative:i}),y=f;return r!=="/"&&(y=f==="/"?r:Ua([r,f])),c.createHref({pathname:y,search:m,hash:o})}function nu(){return R.useContext(Is)!=null}function sa(){return Ue(nu(),"useLocation() may be used only in the context of a component."),R.useContext(Is).location}var Jp="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function kp(n){R.useContext(ga).static||R.useLayoutEffect(n)}function gr(){let{isDataRoute:n}=R.useContext(Ha);return n?Y1():N1()}function N1(){Ue(nu(),"useNavigate() may be used only in the context of a component.");let n=R.useContext(li),{basename:i,navigator:r}=R.useContext(ga),{matches:c}=R.useContext(Ha),{pathname:o}=sa(),f=JSON.stringify(Ps(c)),m=R.useRef(!1);return kp(()=>{m.current=!0}),R.useCallback((g,v={})=>{if(jt(m.current,Jp),!m.current)return;if(typeof g=="number"){r.go(g);return}let S=mr(g,JSON.parse(f),o,v.relative==="path");n==null&&i!=="/"&&(S.pathname=S.pathname==="/"?i:Ua([i,S.pathname])),(v.replace?r.replace:r.push)(S,v.state,v)},[i,r,f,o,n])}var M1=R.createContext(null);function C1(n){let i=R.useContext(Ha).outlet;return R.useMemo(()=>i&&R.createElement(M1.Provider,{value:n},i),[i,n])}function O1(){let{matches:n}=R.useContext(Ha),i=n[n.length-1];return i?i.params:{}}function br(n,{relative:i}={}){let{matches:r}=R.useContext(Ha),{pathname:c}=sa(),o=JSON.stringify(Ps(r));return R.useMemo(()=>mr(n,JSON.parse(o),c,i==="path"),[n,o,c,i])}function z1(n,i,r){Ue(nu(),"useRoutes() may be used only in the context of a component.");let{navigator:c}=R.useContext(ga),{matches:o}=R.useContext(Ha),f=o[o.length-1],m=f?f.params:{},y=f?f.pathname:"/",g=f?f.pathnameBase:"/",v=f&&f.route;{let q=v&&v.path||"";Wp(y,!v||q.endsWith("*")||q.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${y}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. + */var wv=n=>{throw TypeError(n)},pS=(n,i,s)=>i.has(n)||wv("Cannot "+s),Ef=(n,i,s)=>(pS(n,i,"read from private field"),s?s.call(n):i.get(n)),vS=(n,i,s)=>i.has(n)?wv("Cannot add the same private member more than once"):i instanceof WeakSet?i.add(n):i.set(n,s),jp="popstate";function Ep(n){return typeof n=="object"&&n!=null&&"pathname"in n&&"search"in n&&"hash"in n&&"state"in n&&"key"in n}function gS(n={}){function i(c,f){var p;let d=(p=f.state)==null?void 0:p.masked,{pathname:m,search:y,hash:g}=d||c.location;return us("",{pathname:m,search:y,hash:g},f.state&&f.state.usr||null,f.state&&f.state.key||"default",d?{pathname:c.location.pathname,search:c.location.search,hash:c.location.hash}:void 0)}function s(c,f){return typeof f=="string"?f:sl(f)}return SS(i,s,null,n)}function Be(n,i){if(n===!1||n===null||typeof n>"u")throw new Error(i)}function Rt(n,i){if(!n){typeof console<"u"&&console.warn(i);try{throw new Error(i)}catch{}}}function bS(){return Math.random().toString(36).substring(2,10)}function Np(n,i){return{usr:n.state,key:n.key,idx:i,masked:n.unstable_mask?{pathname:n.pathname,search:n.search,hash:n.hash}:void 0}}function us(n,i,s=null,c,f){return{pathname:typeof n=="string"?n:n.pathname,search:"",hash:"",...typeof i=="string"?ul(i):i,state:s,key:i&&i.key||c||bS(),unstable_mask:f}}function sl({pathname:n="/",search:i="",hash:s=""}){return i&&i!=="?"&&(n+=i.charAt(0)==="?"?i:"?"+i),s&&s!=="#"&&(n+=s.charAt(0)==="#"?s:"#"+s),n}function ul(n){let i={};if(n){let s=n.indexOf("#");s>=0&&(i.hash=n.substring(s),n=n.substring(0,s));let c=n.indexOf("?");c>=0&&(i.search=n.substring(c),n=n.substring(0,c)),n&&(i.pathname=n)}return i}function SS(n,i,s,c={}){let{window:f=document.defaultView,v5Compat:d=!1}=c,m=f.history,y="POP",g=null,p=x();p==null&&(p=0,m.replaceState({...m.state,idx:p},""));function x(){return(m.state||{idx:null}).idx}function b(){y="POP";let L=x(),X=L==null?null:L-p;p=L,g&&g({action:y,location:D.location,delta:X})}function _(L,X){y="PUSH";let W=Ep(L)?L:us(D.location,L,X);p=x()+1;let F=Np(W,p),P=D.createHref(W.unstable_mask||W);try{m.pushState(F,"",P)}catch(ae){if(ae instanceof DOMException&&ae.name==="DataCloneError")throw ae;f.location.assign(P)}d&&g&&g({action:y,location:D.location,delta:1})}function C(L,X){y="REPLACE";let W=Ep(L)?L:us(D.location,L,X);p=x();let F=Np(W,p),P=D.createHref(W.unstable_mask||W);m.replaceState(F,"",P),d&&g&&g({action:y,location:D.location,delta:0})}function A(L){return Ov(L)}let D={get action(){return y},get location(){return n(f,m)},listen(L){if(g)throw new Error("A history only accepts one active listener");return f.addEventListener(jp,b),g=L,()=>{f.removeEventListener(jp,b),g=null}},createHref(L){return i(f,L)},createURL:A,encodeLocation(L){let X=A(L);return{pathname:X.pathname,search:X.search,hash:X.hash}},push:_,replace:C,go(L){return m.go(L)}};return D}function Ov(n,i=!1){let s="http://localhost";typeof window<"u"&&(s=window.location.origin!=="null"?window.location.origin:window.location.href),Be(s,"No window.location.(origin|href) available to create URL");let c=typeof n=="string"?n:sl(n);return c=c.replace(/ $/,"%20"),!i&&c.startsWith("//")&&(c=s+c),new URL(c,s)}var ls,Rp=class{constructor(n){if(vS(this,ls,new Map),n)for(let[i,s]of n)this.set(i,s)}get(n){if(Ef(this,ls).has(n))return Ef(this,ls).get(n);if(n.defaultValue!==void 0)return n.defaultValue;throw new Error("No value found for context")}set(n,i){Ef(this,ls).set(n,i)}};ls=new WeakMap;var xS=new Set(["lazy","caseSensitive","path","id","index","children"]);function jS(n){return xS.has(n)}var ES=new Set(["lazy","caseSensitive","path","id","index","middleware","children"]);function NS(n){return ES.has(n)}function RS(n){return n.index===!0}function cs(n,i,s=[],c={},f=!1){return n.map((d,m)=>{let y=[...s,String(m)],g=typeof d.id=="string"?d.id:y.join("-");if(Be(d.index!==!0||!d.children,"Cannot specify children on an index route"),Be(f||!c[g],`Found a route id collision on id "${g}". Route id's must be globally unique within Data Router usages`),RS(d)){let p={...d,id:g};return c[g]=Cp(p,i(p)),p}else{let p={...d,id:g,children:void 0};return c[g]=Cp(p,i(p)),d.children&&(p.children=cs(d.children,i,y,c,f)),p}})}function Cp(n,i){return Object.assign(n,{...i,...typeof i.lazy=="object"&&i.lazy!=null?{lazy:{...n.lazy,...i.lazy}}:{}})}function hn(n,i,s="/"){return ns(n,i,s,!1)}function ns(n,i,s,c){let f=typeof i=="string"?ul(i):i,d=qa(f.pathname||"/",s);if(d==null)return null;let m=Dv(n);TS(m);let y=null;for(let g=0;y==null&&g{let x={relativePath:p===void 0?m.path||"":p,caseSensitive:m.caseSensitive===!0,childrenIndex:y,route:m};if(x.relativePath.startsWith("/")){if(!x.relativePath.startsWith(c)&&g)return;Be(x.relativePath.startsWith(c),`Absolute route path "${x.relativePath}" nested under path "${c}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),x.relativePath=x.relativePath.slice(c.length)}let b=Ba([c,x.relativePath]),_=s.concat(x);m.children&&m.children.length>0&&(Be(m.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${b}".`),Dv(m.children,i,_,b,g)),!(m.path==null&&!m.index)&&i.push({path:b,score:AS(b,m.index),routesMeta:_})};return n.forEach((m,y)=>{var g;if(m.path===""||!((g=m.path)!=null&&g.includes("?")))d(m,y);else for(let p of zv(m.path))d(m,y,!0,p)}),i}function zv(n){let i=n.split("/");if(i.length===0)return[];let[s,...c]=i,f=s.endsWith("?"),d=s.replace(/\?$/,"");if(c.length===0)return f?[d,""]:[d];let m=zv(c.join("/")),y=[];return y.push(...m.map(g=>g===""?d:[d,g].join("/"))),f&&y.push(...m),y.map(g=>n.startsWith("/")&&g===""?"/":g)}function TS(n){n.sort((i,s)=>i.score!==s.score?s.score-i.score:US(i.routesMeta.map(c=>c.childrenIndex),s.routesMeta.map(c=>c.childrenIndex)))}var _S=/^:[\w-]+$/,MS=3,wS=2,OS=1,DS=10,zS=-2,Tp=n=>n==="*";function AS(n,i){let s=n.split("/"),c=s.length;return s.some(Tp)&&(c+=zS),i&&(c+=wS),s.filter(f=>!Tp(f)).reduce((f,d)=>f+(_S.test(d)?MS:d===""?OS:DS),c)}function US(n,i){return n.length===i.length&&n.slice(0,-1).every((c,f)=>c===i[f])?n[n.length-1]-i[i.length-1]:0}function LS(n,i,s=!1){let{routesMeta:c}=n,f={},d="/",m=[];for(let y=0;y{if(x==="*"){let A=y[_]||"";m=d.slice(0,d.length-A.length).replace(/(.)\/+$/,"$1")}const C=y[_];return b&&!C?p[x]=void 0:p[x]=(C||"").replace(/%2F/g,"/"),p},{}),pathname:d,pathnameBase:m,pattern:n}}function HS(n,i=!1,s=!0){Rt(n==="*"||!n.endsWith("*")||n.endsWith("/*"),`Route path "${n}" will be treated as if it were "${n.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${n.replace(/\*$/,"/*")}".`);let c=[],f="^"+n.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(m,y,g,p,x)=>{if(c.push({paramName:y,isOptional:g!=null}),g){let b=x.charAt(p+m.length);return b&&b!=="/"?"/([^\\/]*)":"(?:/([^\\/]*))?"}return"/([^\\/]+)"}).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return n.endsWith("*")?(c.push({paramName:"*"}),f+=n==="*"||n==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):s?f+="\\/*$":n!==""&&n!=="/"&&(f+="(?:(?=\\/|$))"),[new RegExp(f,i?void 0:"i"),c]}function BS(n){try{return n.split("/").map(i=>decodeURIComponent(i).replace(/\//g,"%2F")).join("/")}catch(i){return Rt(!1,`The URL path "${n}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${i}).`),n}}function qa(n,i){if(i==="/")return n;if(!n.toLowerCase().startsWith(i.toLowerCase()))return null;let s=i.endsWith("/")?i.length-1:i.length,c=n.charAt(s);return c&&c!=="/"?null:n.slice(s)||"/"}function qS({basename:n,pathname:i}){return i==="/"?n:Ba([n,i])}var Av=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,ed=n=>Av.test(n);function QS(n,i="/"){let{pathname:s,search:c="",hash:f=""}=typeof n=="string"?ul(n):n,d;return s?(s=td(s),s.startsWith("/")?d=_p(s.substring(1),"/"):d=_p(s,i)):d=i,{pathname:d,search:GS(c),hash:KS(f)}}function _p(n,i){let s=Iu(i).split("/");return n.split("/").forEach(f=>{f===".."?s.length>1&&s.pop():f!=="."&&s.push(f)}),s.length>1?s.join("/"):"/"}function Nf(n,i,s,c){return`Cannot include a '${n}' character in a manually specified \`to.${i}\` field [${JSON.stringify(c)}]. Please separate it out to the \`to.${s}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function Uv(n){return n.filter((i,s)=>s===0||i.route.path&&i.route.path.length>0)}function ac(n){let i=Uv(n);return i.map((s,c)=>c===i.length-1?s.pathname:s.pathnameBase)}function ps(n,i,s,c=!1){let f;typeof n=="string"?f=ul(n):(f={...n},Be(!f.pathname||!f.pathname.includes("?"),Nf("?","pathname","search",f)),Be(!f.pathname||!f.pathname.includes("#"),Nf("#","pathname","hash",f)),Be(!f.search||!f.search.includes("#"),Nf("#","search","hash",f)));let d=n===""||f.pathname==="",m=d?"/":f.pathname,y;if(m==null)y=s;else{let b=i.length-1;if(!c&&m.startsWith("..")){let _=m.split("/");for(;_[0]==="..";)_.shift(),b-=1;f.pathname=_.join("/")}y=b>=0?i[b]:"/"}let g=QS(f,y),p=m&&m!=="/"&&m.endsWith("/"),x=(d||m===".")&&s.endsWith("/");return!g.pathname.endsWith("/")&&(p||x)&&(g.pathname+="/"),g}var td=n=>n.replace(/\/\/+/g,"/"),Ba=n=>td(n.join("/")),Iu=n=>n.replace(/\/+$/,""),YS=n=>Iu(n).replace(/^\/*/,"/"),GS=n=>!n||n==="?"?"":n.startsWith("?")?n:"?"+n,KS=n=>!n||n==="#"?"":n.startsWith("#")?n:"#"+n,vs=class{constructor(n,i,s,c=!1){this.status=n,this.statusText=i||"",this.internal=c,s instanceof Error?(this.data=s.toString(),this.error=s):this.data=s}};function os(n){return n!=null&&typeof n.status=="number"&&typeof n.statusText=="string"&&typeof n.internal=="boolean"&&"data"in n}function gs(n){let i=n.map(s=>s.route.path).filter(Boolean);return Ba(i)||"/"}var Lv=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Hv(n,i){let s=n;if(typeof s!="string"||!Av.test(s))return{absoluteURL:void 0,isExternal:!1,to:s};let c=s,f=!1;if(Lv)try{let d=new URL(window.location.href),m=s.startsWith("//")?new URL(d.protocol+s):new URL(s),y=qa(m.pathname,i);m.origin===d.origin&&y!=null?s=y+m.search+m.hash:f=!0}catch{Rt(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:c,isExternal:f,to:s}}var Nn=Symbol("Uninstrumented");function XS(n,i){let s={lazy:[],"lazy.loader":[],"lazy.action":[],"lazy.middleware":[],middleware:[],loader:[],action:[]};n.forEach(f=>f({id:i.id,index:i.index,path:i.path,instrument(d){let m=Object.keys(s);for(let y of m)d[y]&&s[y].push(d[y])}}));let c={};if(typeof i.lazy=="function"&&s.lazy.length>0){let f=Vi(s.lazy,i.lazy,()=>{});f&&(c.lazy=f)}if(typeof i.lazy=="object"){let f=i.lazy;["middleware","loader","action"].forEach(d=>{let m=f[d],y=s[`lazy.${d}`];if(typeof m=="function"&&y.length>0){let g=Vi(y,m,()=>{});g&&(c.lazy=Object.assign(c.lazy||{},{[d]:g}))}})}return["loader","action"].forEach(f=>{let d=i[f];if(typeof d=="function"&&s[f].length>0){let m=d[Nn]??d,y=Vi(s[f],m,(...g)=>Mp(g[0]));y&&(f==="loader"&&m.hydrate===!0&&(y.hydrate=!0),y[Nn]=m,c[f]=y)}}),i.middleware&&i.middleware.length>0&&s.middleware.length>0&&(c.middleware=i.middleware.map(f=>{let d=f[Nn]??f,m=Vi(s.middleware,d,(...y)=>Mp(y[0]));return m?(m[Nn]=d,m):f})),c}function kS(n,i){let s={navigate:[],fetch:[]};if(i.forEach(c=>c({instrument(f){let d=Object.keys(f);for(let m of d)f[m]&&s[m].push(f[m])}})),s.navigate.length>0){let c=n.navigate[Nn]??n.navigate,f=Vi(s.navigate,c,(...d)=>{let[m,y]=d;return{to:typeof m=="number"||typeof m=="string"?m:m?sl(m):".",...wp(n,y??{})}});f&&(f[Nn]=c,n.navigate=f)}if(s.fetch.length>0){let c=n.fetch[Nn]??n.fetch,f=Vi(s.fetch,c,(...d)=>{let[m,,y,g]=d;return{href:y??".",fetcherKey:m,...wp(n,g??{})}});f&&(f[Nn]=c,n.fetch=f)}return n}function Vi(n,i,s){return n.length===0?null:async(...c)=>{let f=await Bv(n,s(...c),()=>i(...c),n.length-1);if(f.type==="error")throw f.value;return f.value}}async function Bv(n,i,s,c){let f=n[c],d;if(f){let m,y=async()=>(m?console.error("You cannot call instrumented handlers more than once"):m=Bv(n,i,s,c-1),d=await m,Be(d,"Expected a result"),d.type==="error"&&d.value instanceof Error?{status:"error",error:d.value}:{status:"success",error:void 0});try{await f(y,i)}catch(g){console.error("An instrumentation function threw an error:",g)}m||await y(),await m}else try{d={type:"success",value:await s()}}catch(m){d={type:"error",value:m}}return d||{type:"error",value:new Error("No result assigned in instrumentation chain.")}}function Mp(n){let{request:i,context:s,params:c,unstable_pattern:f}=n;return{request:VS(i),params:{...c},unstable_pattern:f,context:ZS(s)}}function wp(n,i){return{currentUrl:sl(n.state.location),..."formMethod"in i?{formMethod:i.formMethod}:{},..."formEncType"in i?{formEncType:i.formEncType}:{},..."formData"in i?{formData:i.formData}:{},..."body"in i?{body:i.body}:{}}}function VS(n){return{method:n.method,url:n.url,headers:{get:(...i)=>n.headers.get(...i)}}}function ZS(n){if(JS(n)){let i={...n};return Object.freeze(i),i}else return{get:i=>n.get(i)}}var FS=Object.getOwnPropertyNames(Object.prototype).sort().join("\0");function JS(n){if(n===null||typeof n!="object")return!1;const i=Object.getPrototypeOf(n);return i===Object.prototype||i===null||Object.getOwnPropertyNames(i).sort().join("\0")===FS}var qv=["POST","PUT","PATCH","DELETE"],$S=new Set(qv),WS=["GET",...qv],PS=new Set(WS),Qv=new Set([301,302,303,307,308]),IS=new Set([307,308]),Rf={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},ex={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},Ir={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},tx=n=>({hasErrorBoundary:!!n.hasErrorBoundary}),Yv="remix-router-transitions",Gv=Symbol("ResetLoaderData");function ax(n){const i=n.window?n.window:typeof window<"u"?window:void 0,s=typeof i<"u"&&typeof i.document<"u"&&typeof i.document.createElement<"u";Be(n.routes.length>0,"You must provide a non-empty routes array to createRouter");let c=n.hydrationRouteProperties||[],f=n.mapRouteProperties||tx,d=f;if(n.unstable_instrumentations){let E=n.unstable_instrumentations;d=M=>({...f(M),...XS(E.map(B=>B.route).filter(Boolean),M)})}let m={},y=cs(n.routes,d,void 0,m),g,p=n.basename||"/";p.startsWith("/")||(p=`/${p}`);let x=n.dataStrategy||sx,b={unstable_passThroughRequests:!1,...n.future},_=null,C=new Set,A=null,D=null,L=null,X=n.hydrationData!=null,W=hn(y,n.history.location,p),F=!1,P=null,ae,fe;if(W==null&&!n.patchRoutesOnNavigation){let E=Ua(404,{pathname:n.history.location.pathname}),{matches:M,route:B}=Yu(y);ae=!0,fe=!ae,W=M,P={[B.id]:E}}else if(W&&!n.hydrationData&&Ql(W,y,n.history.location.pathname).active&&(W=null),W)if(W.some(E=>E.route.lazy))ae=!1,fe=!ae;else if(!W.some(E=>ad(E.route)))ae=!0,fe=!ae;else{let E=n.hydrationData?n.hydrationData.loaderData:null,M=n.hydrationData?n.hydrationData.errors:null,B=W;if(M){let I=W.findIndex(te=>M[te.route.id]!==void 0);B=B.slice(0,I+1)}fe=!1,ae=!0,B.forEach(I=>{let te=Kv(I.route,E,M);fe=fe||te.renderFallback,ae=ae&&!te.shouldLoad})}else{ae=!1,fe=!ae,W=[];let E=Ql(null,y,n.history.location.pathname);E.active&&E.matches&&(F=!0,W=E.matches)}let ne,O={historyAction:n.history.action,location:n.history.location,matches:W,initialized:ae,renderFallback:fe,navigation:Rf,restoreScrollPosition:n.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:n.hydrationData&&n.hydrationData.loaderData||{},actionData:n.hydrationData&&n.hydrationData.actionData||null,errors:n.hydrationData&&n.hydrationData.errors||P,fetchers:new Map,blockers:new Map},le="POP",ie=null,Se=!1,xe,_e=!1,De=new Map,je=null,z=!1,V=!1,re=new Set,se=new Map,Ne=0,R=-1,K=new Map,q=new Set,ee=new Map,he=new Map,ge=new Set,Me=new Map,ot,He=null;function fa(){if(_=n.history.listen(({action:E,location:M,delta:B})=>{if(ot){ot(),ot=void 0;return}Rt(Me.size===0||B!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let I=Tn({currentLocation:O.location,nextLocation:M,historyAction:E});if(I&&B!=null){let te=new Promise(ye=>{ot=ye});n.history.go(B*-1),fl(I,{state:"blocked",location:M,proceed(){fl(I,{state:"proceeding",proceed:void 0,reset:void 0,location:M}),te.then(()=>n.history.go(B))},reset(){let ye=new Map(O.blockers);ye.set(I,Ir),Je({blockers:ye})}}),ie==null||ie.resolve(),ie=null;return}return J(E,M)}),s){Rx(i,De);let E=()=>Cx(i,De);i.addEventListener("pagehide",E),je=()=>i.removeEventListener("pagehide",E)}return O.initialized||J("POP",O.location,{initialHydration:!0}),ne}function Ja(){_&&_(),je&&je(),C.clear(),xe&&xe.abort(),O.fetchers.forEach((E,M)=>ha(M)),O.blockers.forEach((E,M)=>Cn(M))}function ea(E){return C.add(E),()=>C.delete(E)}function Je(E,M={}){E.matches&&(E.matches=E.matches.map(te=>{let ye=m[te.route.id],ue=te.route;return ue.element!==ye.element||ue.errorElement!==ye.errorElement||ue.hydrateFallbackElement!==ye.hydrateFallbackElement?{...te,route:ye}:te})),O={...O,...E};let B=[],I=[];O.fetchers.forEach((te,ye)=>{te.state==="idle"&&(ge.has(ye)?B.push(ye):I.push(ye))}),ge.forEach(te=>{!O.fetchers.has(te)&&!se.has(te)&&B.push(te)}),[...C].forEach(te=>te(O,{deletedFetchers:B,newErrors:E.errors??null,viewTransitionOpts:M.viewTransitionOpts,flushSync:M.flushSync===!0})),B.forEach(te=>ha(te)),I.forEach(te=>O.fetchers.delete(te))}function At(E,M,{flushSync:B}={}){var Te,be;let I=O.actionData!=null&&O.navigation.formMethod!=null&&Jt(O.navigation.formMethod)&&O.navigation.state==="loading"&&((Te=E.state)==null?void 0:Te._isRedirect)!==!0,te;M.actionData?Object.keys(M.actionData).length>0?te=M.actionData:te=null:I?te=O.actionData:te=null;let ye=M.loaderData?Yp(O.loaderData,M.loaderData,M.matches||[],M.errors):O.loaderData,ue=O.blockers;ue.size>0&&(ue=new Map(ue),ue.forEach((ze,Le)=>ue.set(Le,Ir)));let pe=z?!1:cr(E,M.matches||O.matches),de=Se===!0||O.navigation.formMethod!=null&&Jt(O.navigation.formMethod)&&((be=E.state)==null?void 0:be._isRedirect)!==!0;g&&(y=g,g=void 0),z||le==="POP"||(le==="PUSH"?n.history.push(E,E.state):le==="REPLACE"&&n.history.replace(E,E.state));let ce;if(le==="POP"){let ze=De.get(O.location.pathname);ze&&ze.has(E.pathname)?ce={currentLocation:O.location,nextLocation:E}:De.has(E.pathname)&&(ce={currentLocation:E,nextLocation:O.location})}else if(_e){let ze=De.get(O.location.pathname);ze?ze.add(E.pathname):(ze=new Set([E.pathname]),De.set(O.location.pathname,ze)),ce={currentLocation:O.location,nextLocation:E}}Je({...M,actionData:te,loaderData:ye,historyAction:le,location:E,initialized:!0,renderFallback:!1,navigation:Rf,revalidation:"idle",restoreScrollPosition:pe,preventScrollReset:de,blockers:ue},{viewTransitionOpts:ce,flushSync:B===!0}),le="POP",Se=!1,_e=!1,z=!1,V=!1,ie==null||ie.resolve(),ie=null,He==null||He.resolve(),He=null}async function $a(E,M){if(ie==null||ie.resolve(),ie=null,typeof E=="number"){ie||(ie=kp());let ut=ie.promise;return n.history.go(E),ut}let B=Kf(O.location,O.matches,p,E,M==null?void 0:M.fromRouteId,M==null?void 0:M.relative),{path:I,submission:te,error:ye}=Op(!1,B,M),ue;M!=null&&M.unstable_mask&&(ue={pathname:"",search:"",hash:"",...typeof M.unstable_mask=="string"?ul(M.unstable_mask):{...O.location.unstable_mask,...M.unstable_mask}});let pe=O.location,de=us(pe,I,M&&M.state,void 0,ue);de={...de,...n.history.encodeLocation(de)};let ce=M&&M.replace!=null?M.replace:void 0,Te="PUSH";ce===!0?Te="REPLACE":ce===!1||te!=null&&Jt(te.formMethod)&&te.formAction===O.location.pathname+O.location.search&&(Te="REPLACE");let be=M&&"preventScrollReset"in M?M.preventScrollReset===!0:void 0,ze=(M&&M.flushSync)===!0,Le=Tn({currentLocation:pe,nextLocation:de,historyAction:Te});if(Le){fl(Le,{state:"blocked",location:de,proceed(){fl(Le,{state:"proceeding",proceed:void 0,reset:void 0,location:de}),$a(E,M)},reset(){let ut=new Map(O.blockers);ut.set(Le,Ir),Je({blockers:ut})}});return}await J(Te,de,{submission:te,pendingError:ye,preventScrollReset:be,replace:M&&M.replace,enableViewTransition:M&&M.viewTransition,flushSync:ze,callSiteDefaultShouldRevalidate:M&&M.unstable_defaultShouldRevalidate})}function Ya(){He||(He=kp()),tt(),Je({revalidation:"loading"});let E=He.promise;return O.navigation.state==="submitting"?E:O.navigation.state==="idle"?(J(O.historyAction,O.location,{startUninterruptedRevalidation:!0}),E):(J(le||O.historyAction,O.navigation.location,{overrideNavigation:O.navigation,enableViewTransition:_e===!0}),E)}async function J(E,M,B){xe&&xe.abort(),xe=null,le=E,z=(B&&B.startUninterruptedRevalidation)===!0,sc(O.location,O.matches),Se=(B&&B.preventScrollReset)===!0,_e=(B&&B.enableViewTransition)===!0;let I=g||y,te=B&&B.overrideNavigation,ye=B!=null&&B.initialHydration&&O.matches&&O.matches.length>0&&!F?O.matches:hn(I,M,p),ue=(B&&B.flushSync)===!0;if(ye&&O.initialized&&!V&&yx(O.location,M)&&!(B&&B.submission&&Jt(B.submission.formMethod))){At(M,{matches:ye},{flushSync:ue});return}let pe=Ql(ye,I,M.pathname);if(pe.active&&pe.matches&&(ye=pe.matches),!ye){let{error:dt,notFoundMatches:gt,route:Ze}=Ka(M.pathname);At(M,{matches:gt,loaderData:{},errors:{[Ze.id]:dt}},{flushSync:ue});return}xe=new AbortController;let de=ki(n.history,M,xe.signal,B&&B.submission),ce=n.getContext?await n.getContext():new Rp,Te;if(B&&B.pendingError)Te=[mn(ye).route.id,{type:"error",error:B.pendingError}];else if(B&&B.submission&&Jt(B.submission.formMethod)){let dt=await da(de,M,B.submission,ye,ce,pe.active,B&&B.initialHydration===!0,{replace:B.replace,flushSync:ue});if(dt.shortCircuited)return;if(dt.pendingActionResult){let[gt,Ze]=dt.pendingActionResult;if(ja(Ze)&&os(Ze.error)&&Ze.error.status===404){xe=null,At(M,{matches:dt.matches,loaderData:{},errors:{[gt]:Ze.error}});return}}ye=dt.matches||ye,Te=dt.pendingActionResult,te=Cf(M,B.submission),ue=!1,pe.active=!1,de=ki(n.history,de.url,de.signal)}let{shortCircuited:be,matches:ze,loaderData:Le,errors:ut}=await Ga(de,M,ye,ce,pe.active,te,B&&B.submission,B&&B.fetcherSubmission,B&&B.replace,B&&B.initialHydration===!0,ue,Te,B&&B.callSiteDefaultShouldRevalidate);be||(xe=null,At(M,{matches:ze||ye,...Gp(Te),loaderData:Le,errors:ut}))}async function da(E,M,B,I,te,ye,ue,pe={}){tt();let de=Ex(M,B);if(Je({navigation:de},{flushSync:pe.flushSync===!0}),ye){let be=await Wa(I,M.pathname,E.signal);if(be.type==="aborted")return{shortCircuited:!0};if(be.type==="error"){if(be.partialMatches.length===0){let{matches:Le,route:ut}=Yu(y);return{matches:Le,pendingActionResult:[ut.id,{type:"error",error:be.error}]}}let ze=mn(be.partialMatches).route.id;return{matches:be.partialMatches,pendingActionResult:[ze,{type:"error",error:be.error}]}}else if(be.matches)I=be.matches;else{let{notFoundMatches:ze,error:Le,route:ut}=Ka(M.pathname);return{matches:ze,pendingActionResult:[ut.id,{type:"error",error:Le}]}}}let ce,Te=Vu(I,M);if(!Te.route.action&&!Te.route.lazy)ce={type:"error",error:Ua(405,{method:E.method,pathname:M.pathname,routeId:Te.route.id})};else{let be=Zi(d,m,E,M,I,Te,ue?[]:c,te),ze=await Q(E,M,be,te,null);if(ce=ze[Te.route.id],!ce){for(let Le of I)if(ze[Le.route.id]){ce=ze[Le.route.id];break}}if(E.signal.aborted)return{shortCircuited:!0}}if(Zn(ce)){let be;return pe&&pe.replace!=null?be=pe.replace:be=Bp(ce.response.headers.get("Location"),new URL(E.url),p,n.history)===O.location.pathname+O.location.search,await Na(E,ce,!0,{submission:B,replace:be}),{shortCircuited:!0}}if(ja(ce)){let be=mn(I,Te.route.id);return(pe&&pe.replace)!==!0&&(le="PUSH"),{matches:I,pendingActionResult:[be.route.id,ce,Te.route.id]}}return{matches:I,pendingActionResult:[Te.route.id,ce]}}async function Ga(E,M,B,I,te,ye,ue,pe,de,ce,Te,be,ze){let Le=ye||Cf(M,ue),ut=ue||pe||Xp(Le),dt=!z&&!ce;if(te){if(dt){let jt=cl(be);Je({navigation:Le,...jt!==void 0?{actionData:jt}:{}},{flushSync:Te})}let qe=await Wa(B,M.pathname,E.signal);if(qe.type==="aborted")return{shortCircuited:!0};if(qe.type==="error"){if(qe.partialMatches.length===0){let{matches:Vt,route:Tt}=Yu(y);return{matches:Vt,loaderData:{},errors:{[Tt.id]:qe.error}}}let jt=mn(qe.partialMatches).route.id;return{matches:qe.partialMatches,loaderData:{},errors:{[jt]:qe.error}}}else if(qe.matches)B=qe.matches;else{let{error:jt,notFoundMatches:Vt,route:Tt}=Ka(M.pathname);return{matches:Vt,loaderData:{},errors:{[Tt.id]:jt}}}}let gt=g||y,{dsMatches:Ze,revalidatingFetchers:Ct}=Dp(E,I,d,m,n.history,O,B,ut,M,ce?[]:c,ce===!0,V,re,ge,ee,q,gt,p,n.patchRoutesOnNavigation!=null,be,ze);if(R=++Ne,!n.dataStrategy&&!Ze.some(qe=>qe.shouldLoad)&&!Ze.some(qe=>qe.route.middleware&&qe.route.middleware.length>0)&&Ct.length===0){let qe=Es();return At(M,{matches:B,loaderData:{},errors:be&&ja(be[1])?{[be[0]]:be[1].error}:null,...Gp(be),...qe?{fetchers:new Map(O.fetchers)}:{}},{flushSync:Te}),{shortCircuited:!0}}if(dt){let qe={};if(!te){qe.navigation=Le;let jt=cl(be);jt!==void 0&&(qe.actionData=jt)}Ct.length>0&&(qe.fetchers=Hl(Ct)),Je(qe,{flushSync:Te})}Ct.forEach(qe=>{Lt(qe.key),qe.controller&&se.set(qe.key,qe.controller)});let ft=()=>Ct.forEach(qe=>Lt(qe.key));xe&&xe.signal.addEventListener("abort",ft);let{loaderResults:Yl,fetcherResults:Xa}=await Fe(Ze,Ct,E,M,I);if(E.signal.aborted)return{shortCircuited:!0};xe&&xe.signal.removeEventListener("abort",ft),Ct.forEach(qe=>se.delete(qe.key));let Ht=Gu(Yl);if(Ht)return await Na(E,Ht.result,!0,{replace:de}),{shortCircuited:!0};if(Ht=Gu(Xa),Ht)return q.add(Ht.key),await Na(E,Ht.result,!0,{replace:de}),{shortCircuited:!0};let{loaderData:Pa,errors:_n}=Qp(O,B,Yl,be,Ct,Xa);ce&&O.errors&&(_n={...O.errors,..._n});let Ia=Es(),Mn=Ns(R),ci=Ia||Mn||Ct.length>0;return{matches:B,loaderData:Pa,errors:_n,...ci?{fetchers:new Map(O.fetchers)}:{}}}function cl(E){if(E&&!ja(E[1]))return{[E[0]]:E[1].data};if(O.actionData)return Object.keys(O.actionData).length===0?null:O.actionData}function Hl(E){return E.forEach(M=>{let B=O.fetchers.get(M.key),I=es(void 0,B?B.data:void 0);O.fetchers.set(M.key,I)}),new Map(O.fetchers)}async function ri(E,M,B,I){Lt(E);let te=(I&&I.flushSync)===!0,ye=g||y,ue=Kf(O.location,O.matches,p,B,M,I==null?void 0:I.relative),pe=hn(ye,ue,p),de=Ql(pe,ye,ue);if(de.active&&de.matches&&(pe=de.matches),!pe){vt(E,M,Ua(404,{pathname:ue}),{flushSync:te});return}let{path:ce,submission:Te,error:be}=Op(!0,ue,I);if(be){vt(E,M,be,{flushSync:te});return}let ze=n.getContext?await n.getContext():new Rp,Le=(I&&I.preventScrollReset)===!0;if(Te&&Jt(Te.formMethod)){await si(E,M,ce,pe,ze,de.active,te,Le,Te,I&&I.unstable_defaultShouldRevalidate);return}ee.set(E,{routeId:M,path:ce}),await Ut(E,M,ce,pe,ze,de.active,te,Le,Te)}async function si(E,M,B,I,te,ye,ue,pe,de,ce){tt(),ee.delete(E);let Te=O.fetchers.get(E);Pe(E,Nx(de,Te),{flushSync:ue});let be=new AbortController,ze=ki(n.history,B,be.signal,de);if(ye){let ht=await Wa(I,new URL(ze.url).pathname,ze.signal,E);if(ht.type==="aborted")return;if(ht.type==="error"){vt(E,M,ht.error,{flushSync:ue});return}else if(ht.matches)I=ht.matches;else{vt(E,M,Ua(404,{pathname:B}),{flushSync:ue});return}}let Le=Vu(I,B);if(!Le.route.action&&!Le.route.lazy){let ht=Ua(405,{method:de.formMethod,pathname:B,routeId:M});vt(E,M,ht,{flushSync:ue});return}se.set(E,be);let ut=Ne,dt=Zi(d,m,ze,B,I,Le,c,te),gt=await Q(ze,B,dt,te,E),Ze=gt[Le.route.id];if(!Ze){for(let ht of dt)if(gt[ht.route.id]){Ze=gt[ht.route.id];break}}if(ze.signal.aborted){se.get(E)===be&&se.delete(E);return}if(ge.has(E)){if(Zn(Ze)||ja(Ze)){Pe(E,wl(void 0));return}}else{if(Zn(Ze))if(se.delete(E),R>ut){Pe(E,wl(void 0));return}else return q.add(E),Pe(E,es(de)),Na(ze,Ze,!1,{fetcherSubmission:de,preventScrollReset:pe});if(ja(Ze)){vt(E,M,Ze.error);return}}let Ct=O.navigation.location||O.location,ft=ki(n.history,Ct,be.signal),Yl=g||y,Xa=O.navigation.state!=="idle"?hn(Yl,O.navigation.location,p):O.matches;Be(Xa,"Didn't find any matches after fetcher action");let Ht=++Ne;K.set(E,Ht);let Pa=es(de,Ze.data);O.fetchers.set(E,Pa);let{dsMatches:_n,revalidatingFetchers:Ia}=Dp(ft,te,d,m,n.history,O,Xa,de,Ct,c,!1,V,re,ge,ee,q,Yl,p,n.patchRoutesOnNavigation!=null,[Le.route.id,Ze],ce);Ia.filter(ht=>ht.key!==E).forEach(ht=>{let oi=ht.key,fi=O.fetchers.get(oi),_s=es(void 0,fi?fi.data:void 0);O.fetchers.set(oi,_s),Lt(oi),ht.controller&&se.set(oi,ht.controller)}),Je({fetchers:new Map(O.fetchers)});let Mn=()=>Ia.forEach(ht=>Lt(ht.key));be.signal.addEventListener("abort",Mn);let{loaderResults:ci,fetcherResults:qe}=await Fe(_n,Ia,ft,Ct,te);if(be.signal.aborted)return;if(be.signal.removeEventListener("abort",Mn),K.delete(E),se.delete(E),Ia.forEach(ht=>se.delete(ht.key)),O.fetchers.has(E)){let ht=wl(Ze.data);O.fetchers.set(E,ht)}let jt=Gu(ci);if(jt)return Na(ft,jt.result,!1,{preventScrollReset:pe});if(jt=Gu(qe),jt)return q.add(jt.key),Na(ft,jt.result,!1,{preventScrollReset:pe});let{loaderData:Vt,errors:Tt}=Qp(O,Xa,ci,void 0,Ia,qe);Ns(Ht),O.navigation.state==="loading"&&Ht>R?(Be(le,"Expected pending action"),xe&&xe.abort(),At(O.navigation.location,{matches:Xa,loaderData:Vt,errors:Tt,fetchers:new Map(O.fetchers)})):(Je({errors:Tt,loaderData:Yp(O.loaderData,Vt,Xa,Tt),fetchers:new Map(O.fetchers)}),V=!1)}async function Ut(E,M,B,I,te,ye,ue,pe,de){let ce=O.fetchers.get(E);Pe(E,es(de,ce?ce.data:void 0),{flushSync:ue});let Te=new AbortController,be=ki(n.history,B,Te.signal);if(ye){let Ze=await Wa(I,new URL(be.url).pathname,be.signal,E);if(Ze.type==="aborted")return;if(Ze.type==="error"){vt(E,M,Ze.error,{flushSync:ue});return}else if(Ze.matches)I=Ze.matches;else{vt(E,M,Ua(404,{pathname:B}),{flushSync:ue});return}}let ze=Vu(I,B);se.set(E,Te);let Le=Ne,ut=Zi(d,m,be,B,I,ze,c,te),gt=(await Q(be,B,ut,te,E))[ze.route.id];if(se.get(E)===Te&&se.delete(E),!be.signal.aborted){if(ge.has(E)){Pe(E,wl(void 0));return}if(Zn(gt))if(R>Le){Pe(E,wl(void 0));return}else{q.add(E),await Na(be,gt,!1,{preventScrollReset:pe});return}if(ja(gt)){vt(E,M,gt.error);return}Pe(E,wl(gt.data))}}async function Na(E,M,B,{submission:I,fetcherSubmission:te,preventScrollReset:ye,replace:ue}={}){B||(ie==null||ie.resolve(),ie=null),M.response.headers.has("X-Remix-Revalidate")&&(V=!0);let pe=M.response.headers.get("Location");Be(pe,"Expected a Location header on the redirect Response"),pe=Bp(pe,new URL(E.url),p,n.history);let de=us(O.location,pe,{_isRedirect:!0});if(s){let ut=!1;if(M.response.headers.has("X-Remix-Reload-Document"))ut=!0;else if(ed(pe)){const dt=Ov(pe,!0);ut=dt.origin!==i.location.origin||qa(dt.pathname,p)==null}if(ut){ue?i.location.replace(pe):i.location.assign(pe);return}}xe=null;let ce=ue===!0||M.response.headers.has("X-Remix-Replace")?"REPLACE":"PUSH",{formMethod:Te,formAction:be,formEncType:ze}=O.navigation;!I&&!te&&Te&&be&&ze&&(I=Xp(O.navigation));let Le=I||te;if(IS.has(M.response.status)&&Le&&Jt(Le.formMethod))await J(ce,de,{submission:{...Le,formAction:pe},preventScrollReset:ye||Se,enableViewTransition:B?_e:void 0});else{let ut=Cf(de,I);await J(ce,de,{overrideNavigation:ut,fetcherSubmission:te,preventScrollReset:ye||Se,enableViewTransition:B?_e:void 0})}}async function Q(E,M,B,I,te){var pe;let ye,ue={};try{ye=await cx(x,E,M,B,te,I,!1)}catch(de){return B.filter(ce=>ce.shouldLoad).forEach(ce=>{ue[ce.route.id]={type:"error",error:de}}),ue}if(E.signal.aborted)return ue;if(!Jt(E.method))for(let de of B){if(((pe=ye[de.route.id])==null?void 0:pe.type)==="error")break;!ye.hasOwnProperty(de.route.id)&&!O.loaderData.hasOwnProperty(de.route.id)&&(!O.errors||!O.errors.hasOwnProperty(de.route.id))&&de.shouldCallHandler()&&(ye[de.route.id]={type:"error",result:new Error(`No result returned from dataStrategy for route ${de.route.id}`)})}for(let[de,ce]of Object.entries(ye))if(bx(ce)){let Te=ce.result;ue[de]={type:"redirect",response:hx(Te,E,de,B,p)}}else ue[de]=await dx(ce);return ue}async function Fe(E,M,B,I,te){let ye=Q(B,I,E,te,null),ue=Promise.all(M.map(async ce=>{if(ce.matches&&ce.match&&ce.request&&ce.controller){let be=(await Q(ce.request,ce.path,ce.matches,te,ce.key))[ce.match.route.id];return{[ce.key]:be}}else return Promise.resolve({[ce.key]:{type:"error",error:Ua(404,{pathname:ce.path})}})})),pe=await ye,de=(await ue).reduce((ce,Te)=>Object.assign(ce,Te),{});return{loaderResults:pe,fetcherResults:de}}function tt(){V=!0,ee.forEach((E,M)=>{se.has(M)&&re.add(M),Lt(M)})}function Pe(E,M,B={}){O.fetchers.set(E,M),Je({fetchers:new Map(O.fetchers)},{flushSync:(B&&B.flushSync)===!0})}function vt(E,M,B,I={}){let te=mn(O.matches,M);ha(E),Je({errors:{[te.route.id]:B},fetchers:new Map(O.fetchers)},{flushSync:(I&&I.flushSync)===!0})}function Bl(E){return he.set(E,(he.get(E)||0)+1),ge.has(E)&&ge.delete(E),O.fetchers.get(E)||ex}function ol(E,M){Lt(E,M==null?void 0:M.reason),Pe(E,wl(null))}function ha(E){let M=O.fetchers.get(E);se.has(E)&&!(M&&M.state==="loading"&&K.has(E))&&Lt(E),ee.delete(E),K.delete(E),q.delete(E),ge.delete(E),re.delete(E),O.fetchers.delete(E)}function $t(E){let M=(he.get(E)||0)-1;M<=0?(he.delete(E),ge.add(E)):he.set(E,M),Je({fetchers:new Map(O.fetchers)})}function Lt(E,M){let B=se.get(E);B&&(B.abort(M),se.delete(E))}function kt(E){for(let M of E){let B=Bl(M),I=wl(B.data);O.fetchers.set(M,I)}}function Es(){let E=[],M=!1;for(let B of q){let I=O.fetchers.get(B);Be(I,`Expected fetcher: ${B}`),I.state==="loading"&&(q.delete(B),E.push(B),M=!0)}return kt(E),M}function Ns(E){let M=[];for(let[B,I]of K)if(I0}function rc(E,M){let B=O.blockers.get(E)||Ir;return Me.get(E)!==M&&Me.set(E,M),B}function Cn(E){O.blockers.delete(E),Me.delete(E)}function fl(E,M){let B=O.blockers.get(E)||Ir;Be(B.state==="unblocked"&&M.state==="blocked"||B.state==="blocked"&&M.state==="blocked"||B.state==="blocked"&&M.state==="proceeding"||B.state==="blocked"&&M.state==="unblocked"||B.state==="proceeding"&&M.state==="unblocked",`Invalid blocker state transition: ${B.state} -> ${M.state}`);let I=new Map(O.blockers);I.set(E,M),Je({blockers:I})}function Tn({currentLocation:E,nextLocation:M,historyAction:B}){if(Me.size===0)return;Me.size>1&&Rt(!1,"A router only supports one blocker at a time");let I=Array.from(Me.entries()),[te,ye]=I[I.length-1],ue=O.blockers.get(te);if(!(ue&&ue.state==="proceeding")&&ye({currentLocation:E,nextLocation:M,historyAction:B}))return te}function Ka(E){let M=Ua(404,{pathname:E}),B=g||y,{matches:I,route:te}=Yu(B);return{notFoundMatches:I,route:te,error:M}}function ui(E,M,B){if(A=E,L=M,D=B||null,!X&&O.navigation===Rf){X=!0;let I=cr(O.location,O.matches);I!=null&&Je({restoreScrollPosition:I})}return()=>{A=null,L=null,D=null}}function ql(E,M){return D&&D(E,M.map(I=>CS(I,O.loaderData)))||E.key}function sc(E,M){if(A&&L){let B=ql(E,M);A[B]=L()}}function cr(E,M){if(A){let B=ql(E,M),I=A[B];if(typeof I=="number")return I}return null}function Ql(E,M,B){if(n.patchRoutesOnNavigation)if(E){if(Object.keys(E[0].params).length>0)return{active:!0,matches:ns(M,B,p,!0)}}else return{active:!0,matches:ns(M,B,p,!0)||[]};return{active:!1,matches:null}}async function Wa(E,M,B,I){if(!n.patchRoutesOnNavigation)return{type:"success",matches:E};let te=E;for(;;){let ye=g==null,ue=g||y,pe=m;try{await n.patchRoutesOnNavigation({signal:B,path:M,matches:te,fetcherKey:I,patch:(Te,be)=>{B.aborted||zp(Te,be,ue,pe,d,!1)}})}catch(Te){return{type:"error",error:Te,partialMatches:te}}finally{ye&&!B.aborted&&(y=[...y])}if(B.aborted)return{type:"aborted"};let de=hn(ue,M,p),ce=null;if(de){if(Object.keys(de[0].params).length===0)return{type:"success",matches:de};if(ce=ns(ue,M,p,!0),!(ce&&te.lengthB.route.id===M[I].route.id)}function Cs(E){m={},g=cs(E,d,void 0,m)}function Ts(E,M,B=!1){let I=g==null;zp(E,M,g||y,m,d,B),I&&(y=[...y],Je({}))}return ne={get basename(){return p},get future(){return b},get state(){return O},get routes(){return y},get window(){return i},initialize:fa,subscribe:ea,enableScrollRestoration:ui,navigate:$a,fetch:ri,revalidate:Ya,createHref:E=>n.history.createHref(E),encodeLocation:E=>n.history.encodeLocation(E),getFetcher:Bl,resetFetcher:ol,deleteFetcher:$t,dispose:Ja,getBlocker:rc,deleteBlocker:Cn,patchRoutes:Ts,_internalFetchControllers:se,_internalSetRoutes:Cs,_internalSetStateDoNotUseOrYouWillBreakYourApp(E){Je(E)}},n.unstable_instrumentations&&(ne=kS(ne,n.unstable_instrumentations.map(E=>E.router).filter(Boolean))),ne}function lx(n){return n!=null&&("formData"in n&&n.formData!=null||"body"in n&&n.body!==void 0)}function Kf(n,i,s,c,f,d){let m,y;if(f){m=[];for(let p of i)if(m.push(p),p.route.id===f){y=p;break}}else m=i,y=i[i.length-1];let g=ps(c||".",ac(m),qa(n.pathname,s)||n.pathname,d==="path");if(c==null&&(g.search=n.search,g.hash=n.hash),(c==null||c===""||c===".")&&y){let p=nd(g.search);if(y.route.index&&!p)g.search=g.search?g.search.replace(/^\?/,"?index&"):"?index";else if(!y.route.index&&p){let x=new URLSearchParams(g.search),b=x.getAll("index");x.delete("index"),b.filter(C=>C).forEach(C=>x.append("index",C));let _=x.toString();g.search=_?`?${_}`:""}}return s!=="/"&&(g.pathname=qS({basename:s,pathname:g.pathname})),sl(g)}function Op(n,i,s){if(!s||!lx(s))return{path:i};if(s.formMethod&&!jx(s.formMethod))return{path:i,error:Ua(405,{method:s.formMethod})};let c=()=>({path:i,error:Ua(400,{type:"invalid-body"})}),d=(s.formMethod||"get").toUpperCase(),m=$v(i);if(s.body!==void 0){if(s.formEncType==="text/plain"){if(!Jt(d))return c();let b=typeof s.body=="string"?s.body:s.body instanceof FormData||s.body instanceof URLSearchParams?Array.from(s.body.entries()).reduce((_,[C,A])=>`${_}${C}=${A} +`,""):String(s.body);return{path:i,submission:{formMethod:d,formAction:m,formEncType:s.formEncType,formData:void 0,json:void 0,text:b}}}else if(s.formEncType==="application/json"){if(!Jt(d))return c();try{let b=typeof s.body=="string"?JSON.parse(s.body):s.body;return{path:i,submission:{formMethod:d,formAction:m,formEncType:s.formEncType,formData:void 0,json:b,text:void 0}}}catch{return c()}}}Be(typeof FormData=="function","FormData is not available in this environment");let y,g;if(s.formData)y=kf(s.formData),g=s.formData;else if(s.body instanceof FormData)y=kf(s.body),g=s.body;else if(s.body instanceof URLSearchParams)y=s.body,g=qp(y);else if(s.body==null)y=new URLSearchParams,g=new FormData;else try{y=new URLSearchParams(s.body),g=qp(y)}catch{return c()}let p={formMethod:d,formAction:m,formEncType:s&&s.formEncType||"application/x-www-form-urlencoded",formData:g,json:void 0,text:void 0};if(Jt(p.formMethod))return{path:i,submission:p};let x=ul(i);return n&&x.search&&nd(x.search)&&y.append("index",""),x.search=`?${y}`,{path:sl(x),submission:p}}function Dp(n,i,s,c,f,d,m,y,g,p,x,b,_,C,A,D,L,X,W,F,P){var je;let ae=F?ja(F[1])?F[1].error:F[1].data:void 0,fe=f.createURL(d.location),ne=f.createURL(g),O;if(x&&d.errors){let z=Object.keys(d.errors)[0];O=m.findIndex(V=>V.route.id===z)}else if(F&&ja(F[1])){let z=F[0];O=m.findIndex(V=>V.route.id===z)-1}let le=F?F[1].statusCode:void 0,ie=le&&le>=400,Se={currentUrl:fe,currentParams:((je=d.matches[0])==null?void 0:je.params)||{},nextUrl:ne,nextParams:m[0].params,...y,actionResult:ae,actionStatus:le},xe=gs(m),_e=m.map((z,V)=>{let{route:re}=z,se=null;if(O!=null&&V>O)se=!1;else if(re.lazy)se=!0;else if(!ad(re))se=!1;else if(x){let{shouldLoad:q}=Kv(re,d.loaderData,d.errors);se=q}else nx(d.loaderData,d.matches[V],z)&&(se=!0);if(se!==null)return Xf(s,c,n,g,xe,z,p,i,se);let Ne=!1;typeof P=="boolean"?Ne=P:ie?Ne=!1:(b||fe.pathname+fe.search===ne.pathname+ne.search||fe.search!==ne.search||ix(d.matches[V],z))&&(Ne=!0);let R={...Se,defaultShouldRevalidate:Ne},K=is(z,R);return Xf(s,c,n,g,xe,z,p,i,K,R,P)}),De=[];return A.forEach((z,V)=>{if(x||!m.some(he=>he.route.id===z.routeId)||C.has(V))return;let re=d.fetchers.get(V),se=re&&re.state!=="idle"&&re.data===void 0,Ne=hn(L,z.path,X);if(!Ne){if(W&&se)return;De.push({key:V,routeId:z.routeId,path:z.path,matches:null,match:null,request:null,controller:null});return}if(D.has(V))return;let R=Vu(Ne,z.path),K=new AbortController,q=ki(f,z.path,K.signal),ee=null;if(_.has(V))_.delete(V),ee=Zi(s,c,q,z.path,Ne,R,p,i);else if(se)b&&(ee=Zi(s,c,q,z.path,Ne,R,p,i));else{let he;typeof P=="boolean"?he=P:ie?he=!1:he=b;let ge={...Se,defaultShouldRevalidate:he};is(R,ge)&&(ee=Zi(s,c,q,z.path,Ne,R,p,i,ge))}ee&&De.push({key:V,routeId:z.routeId,path:z.path,matches:ee,match:R,request:q,controller:K})}),{dsMatches:_e,revalidatingFetchers:De}}function ad(n){return n.loader!=null||n.middleware!=null&&n.middleware.length>0}function Kv(n,i,s){if(n.lazy)return{shouldLoad:!0,renderFallback:!0};if(!ad(n))return{shouldLoad:!1,renderFallback:!1};let c=i!=null&&n.id in i,f=s!=null&&s[n.id]!==void 0;if(!c&&f)return{shouldLoad:!1,renderFallback:!1};if(typeof n.loader=="function"&&n.loader.hydrate===!0)return{shouldLoad:!0,renderFallback:!c};let d=!c&&!f;return{shouldLoad:d,renderFallback:d}}function nx(n,i,s){let c=!i||s.route.id!==i.route.id,f=!n.hasOwnProperty(s.route.id);return c||f}function ix(n,i){let s=n.route.path;return n.pathname!==i.pathname||s!=null&&s.endsWith("*")&&n.params["*"]!==i.params["*"]}function is(n,i){if(n.route.shouldRevalidate){let s=n.route.shouldRevalidate(i);if(typeof s=="boolean")return s}return i.defaultShouldRevalidate}function zp(n,i,s,c,f,d){let m;if(n){let p=c[n];Be(p,`No route found to patch children into: routeId = ${n}`),p.children||(p.children=[]),m=p.children}else m=s;let y=[],g=[];if(i.forEach(p=>{let x=m.find(b=>Xv(p,b));x?g.push({existingRoute:x,newRoute:p}):y.push(p)}),y.length>0){let p=cs(y,f,[n||"_","patch",String((m==null?void 0:m.length)||"0")],c);m.push(...p)}if(d&&g.length>0)for(let p=0;p{var d;return(d=i.children)==null?void 0:d.some(m=>Xv(c,m))}))??!1:!1}var Ap=new WeakMap,kv=({key:n,route:i,manifest:s,mapRouteProperties:c})=>{let f=s[i.id];if(Be(f,"No route found in manifest"),!f.lazy||typeof f.lazy!="object")return;let d=f.lazy[n];if(!d)return;let m=Ap.get(f);m||(m={},Ap.set(f,m));let y=m[n];if(y)return y;let g=(async()=>{let p=jS(n),b=f[n]!==void 0&&n!=="hasErrorBoundary";if(p)Rt(!p,"Route property "+n+" is not a supported lazy route property. This property will be ignored."),m[n]=Promise.resolve();else if(b)Rt(!1,`Route "${f.id}" has a static property "${n}" defined. The lazy property will be ignored.`);else{let _=await d();_!=null&&(Object.assign(f,{[n]:_}),Object.assign(f,c(f)))}typeof f.lazy=="object"&&(f.lazy[n]=void 0,Object.values(f.lazy).every(_=>_===void 0)&&(f.lazy=void 0))})();return m[n]=g,g},Up=new WeakMap;function rx(n,i,s,c,f){let d=s[n.id];if(Be(d,"No route found in manifest"),!n.lazy)return{lazyRoutePromise:void 0,lazyHandlerPromise:void 0};if(typeof n.lazy=="function"){let x=Up.get(d);if(x)return{lazyRoutePromise:x,lazyHandlerPromise:x};let b=(async()=>{Be(typeof n.lazy=="function","No lazy route function found");let _=await n.lazy(),C={};for(let A in _){let D=_[A];if(D===void 0)continue;let L=NS(A),W=d[A]!==void 0&&A!=="hasErrorBoundary";L?Rt(!L,"Route property "+A+" is not a supported property to be returned from a lazy route function. This property will be ignored."):W?Rt(!W,`Route "${d.id}" has a static property "${A}" defined but its lazy function is also returning a value for this property. The lazy route property "${A}" will be ignored.`):C[A]=D}Object.assign(d,C),Object.assign(d,{...c(d),lazy:void 0})})();return Up.set(d,b),b.catch(()=>{}),{lazyRoutePromise:b,lazyHandlerPromise:b}}let m=Object.keys(n.lazy),y=[],g;for(let x of m){if(f&&f.includes(x))continue;let b=kv({key:x,route:n,manifest:s,mapRouteProperties:c});b&&(y.push(b),x===i&&(g=b))}let p=y.length>0?Promise.all(y).then(()=>{}):void 0;return p==null||p.catch(()=>{}),g==null||g.catch(()=>{}),{lazyRoutePromise:p,lazyHandlerPromise:g}}async function Lp(n){let i=n.matches.filter(f=>f.shouldLoad),s={};return(await Promise.all(i.map(f=>f.resolve()))).forEach((f,d)=>{s[i[d].route.id]=f}),s}async function sx(n){return n.matches.some(i=>i.route.middleware)?Vv(n,()=>Lp(n)):Lp(n)}function Vv(n,i){return ux(n,i,c=>{if(xx(c))throw c;return c},vx,s);function s(c,f,d){if(d)return Promise.resolve(Object.assign(d.value,{[f]:{type:"error",result:c}}));{let{matches:m}=n,y=Math.min(Math.max(m.findIndex(p=>p.route.id===f),0),Math.max(m.findIndex(p=>p.shouldCallHandler()),0)),g=mn(m,m[y].route.id).route.id;return Promise.resolve({[g]:{type:"error",result:c}})}}}async function ux(n,i,s,c,f){let{matches:d,...m}=n,y=d.flatMap(p=>p.route.middleware?p.route.middleware.map(x=>[p.route.id,x]):[]);return await Zv(m,y,i,s,c,f)}async function Zv(n,i,s,c,f,d,m=0){let{request:y}=n;if(y.signal.aborted)throw y.signal.reason??new Error(`Request aborted: ${y.method} ${y.url}`);let g=i[m];if(!g)return await s();let[p,x]=g,b,_=async()=>{if(b)throw new Error("You may only call `next()` once per middleware");try{return b={value:await Zv(n,i,s,c,f,d,m+1)},b.value}catch(C){return b={value:await d(C,p,b)},b.value}};try{let C=await x(n,_),A=C!=null?c(C):void 0;return f(A)?A:b?A??b.value:(b={value:await _()},b.value)}catch(C){return await d(C,p,b)}}function Fv(n,i,s,c,f){let d=kv({key:"middleware",route:c.route,manifest:i,mapRouteProperties:n}),m=rx(c.route,Jt(s.method)?"action":"loader",i,n,f);return{middleware:d,route:m.lazyRoutePromise,handler:m.lazyHandlerPromise}}function Xf(n,i,s,c,f,d,m,y,g,p=null,x){let b=!1,_=Fv(n,i,s,d,m);return{...d,_lazyPromises:_,shouldLoad:g,shouldRevalidateArgs:p,shouldCallHandler(C){return b=!0,p?typeof x=="boolean"?is(d,{...p,defaultShouldRevalidate:x}):typeof C=="boolean"?is(d,{...p,defaultShouldRevalidate:C}):is(d,p):g},resolve(C){let{lazy:A,loader:D,middleware:L}=d.route,X=b||g||C&&!Jt(s.method)&&(A||D),W=L&&L.length>0&&!D&&!A;return X&&(Jt(s.method)||!W)?ox({request:s,path:c,unstable_pattern:f,match:d,lazyHandlerPromise:_==null?void 0:_.handler,lazyRoutePromise:_==null?void 0:_.route,handlerOverride:C,scopedContext:y}):Promise.resolve({type:"data",result:void 0})}}}function Zi(n,i,s,c,f,d,m,y,g=null){return f.map(p=>p.route.id!==d.route.id?{...p,shouldLoad:!1,shouldRevalidateArgs:g,shouldCallHandler:()=>!1,_lazyPromises:Fv(n,i,s,p,m),resolve:()=>Promise.resolve({type:"data",result:void 0})}:Xf(n,i,s,c,gs(f),p,m,y,!0,g))}async function cx(n,i,s,c,f,d,m){c.some(x=>{var b;return(b=x._lazyPromises)==null?void 0:b.middleware})&&await Promise.all(c.map(x=>{var b;return(b=x._lazyPromises)==null?void 0:b.middleware}));let y={request:i,unstable_url:Jv(i,s),unstable_pattern:gs(c),params:c[0].params,context:d,matches:c},p=await n({...y,fetcherKey:f,runClientMiddleware:x=>{let b=y;return Vv(b,()=>x({...b,fetcherKey:f,runClientMiddleware:()=>{throw new Error("Cannot call `runClientMiddleware()` from within an `runClientMiddleware` handler")}}))}});try{await Promise.all(c.flatMap(x=>{var b,_;return[(b=x._lazyPromises)==null?void 0:b.handler,(_=x._lazyPromises)==null?void 0:_.route]}))}catch{}return p}async function ox({request:n,path:i,unstable_pattern:s,match:c,lazyHandlerPromise:f,lazyRoutePromise:d,handlerOverride:m,scopedContext:y}){let g,p,x=Jt(n.method),b=x?"action":"loader",_=C=>{let A,D=new Promise((W,F)=>A=F);p=()=>A(),n.signal.addEventListener("abort",p);let L=W=>typeof C!="function"?Promise.reject(new Error(`You cannot call the handler for a route which defines a boolean "${b}" [routeId: ${c.route.id}]`)):C({request:n,unstable_url:Jv(n,i),unstable_pattern:s,params:c.params,context:y},...W!==void 0?[W]:[]),X=(async()=>{try{return{type:"data",result:await(m?m(F=>L(F)):L())}}catch(W){return{type:"error",result:W}}})();return Promise.race([X,D])};try{let C=x?c.route.action:c.route.loader;if(f||d)if(C){let A,[D]=await Promise.all([_(C).catch(L=>{A=L}),f,d]);if(A!==void 0)throw A;g=D}else{await f;let A=x?c.route.action:c.route.loader;if(A)[g]=await Promise.all([_(A),d]);else if(b==="action"){let D=new URL(n.url),L=D.pathname+D.search;throw Ua(405,{method:n.method,pathname:L,routeId:c.route.id})}else return{type:"data",result:void 0}}else if(C)g=await _(C);else{let A=new URL(n.url),D=A.pathname+A.search;throw Ua(404,{pathname:D})}}catch(C){return{type:"error",result:C}}finally{p&&n.signal.removeEventListener("abort",p)}return g}async function fx(n){let i=n.headers.get("Content-Type");return i&&/\bapplication\/json\b/.test(i)?n.body==null?null:n.json():n.text()}async function dx(n){var c,f,d,m,y;let{result:i,type:s}=n;if(ld(i)){let g;try{g=await fx(i)}catch(p){return{type:"error",error:p}}return s==="error"?{type:"error",error:new vs(i.status,i.statusText,g),statusCode:i.status,headers:i.headers}:{type:"data",data:g,statusCode:i.status,headers:i.headers}}return s==="error"?Kp(i)?i.data instanceof Error?{type:"error",error:i.data,statusCode:(c=i.init)==null?void 0:c.status,headers:(f=i.init)!=null&&f.headers?new Headers(i.init.headers):void 0}:{type:"error",error:px(i),statusCode:os(i)?i.status:void 0,headers:(d=i.init)!=null&&d.headers?new Headers(i.init.headers):void 0}:{type:"error",error:i,statusCode:os(i)?i.status:void 0}:Kp(i)?{type:"data",data:i.data,statusCode:(m=i.init)==null?void 0:m.status,headers:(y=i.init)!=null&&y.headers?new Headers(i.init.headers):void 0}:{type:"data",data:i}}function hx(n,i,s,c,f){let d=n.headers.get("Location");if(Be(d,"Redirects returned/thrown from loaders/actions must have a Location header"),!ed(d)){let m=c.slice(0,c.findIndex(y=>y.route.id===s)+1);d=Kf(new URL(i.url),m,f,d),n.headers.set("Location",d)}return n}var Hp=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];function Bp(n,i,s,c){if(ed(n)){let f=n,d=f.startsWith("//")?new URL(i.protocol+f):new URL(f);if(Hp.includes(d.protocol))throw new Error("Invalid redirect location");let m=qa(d.pathname,s)!=null;if(d.origin===i.origin&&m)return td(d.pathname)+d.search+d.hash}try{let f=c.createURL(n);if(Hp.includes(f.protocol))throw new Error("Invalid redirect location")}catch{}return n}function ki(n,i,s,c){let f=n.createURL($v(i)).toString(),d={signal:s};if(c&&Jt(c.formMethod)){let{formMethod:m,formEncType:y}=c;d.method=m.toUpperCase(),y==="application/json"?(d.headers=new Headers({"Content-Type":y}),d.body=JSON.stringify(c.json)):y==="text/plain"?d.body=c.text:y==="application/x-www-form-urlencoded"&&c.formData?d.body=kf(c.formData):d.body=c.formData}return new Request(f,d)}function Jv(n,i){let s=new URL(n.url),c=typeof i=="string"?ul(i):i;if(s.pathname=c.pathname||"/",c.search){let f=new URLSearchParams(c.search),d=f.getAll("index");f.delete("index");for(let m of d.filter(Boolean))f.append("index",m);s.search=f.size?`?${f.toString()}`:""}else s.search="";return s.hash=c.hash||"",s}function kf(n){let i=new URLSearchParams;for(let[s,c]of n.entries())i.append(s,typeof c=="string"?c:c.name);return i}function qp(n){let i=new FormData;for(let[s,c]of n.entries())i.append(s,c);return i}function mx(n,i,s,c=!1,f=!1){let d={},m=null,y,g=!1,p={},x=s&&ja(s[1])?s[1].error:void 0;return n.forEach(b=>{if(!(b.route.id in i))return;let _=b.route.id,C=i[_];if(Be(!Zn(C),"Cannot handle redirect results in processLoaderData"),ja(C)){let A=C.error;if(x!==void 0&&(A=x,x=void 0),m=m||{},f)m[_]=A;else{let D=mn(n,_);m[D.route.id]==null&&(m[D.route.id]=A)}c||(d[_]=Gv),g||(g=!0,y=os(C.error)?C.error.status:500),C.headers&&(p[_]=C.headers)}else d[_]=C.data,C.statusCode&&C.statusCode!==200&&!g&&(y=C.statusCode),C.headers&&(p[_]=C.headers)}),x!==void 0&&s&&(m={[s[0]]:x},s[2]&&(d[s[2]]=void 0)),{loaderData:d,errors:m,statusCode:y||200,loaderHeaders:p}}function Qp(n,i,s,c,f,d){let{loaderData:m,errors:y}=mx(i,s,c);return f.filter(g=>!g.matches||g.matches.some(p=>p.shouldLoad)).forEach(g=>{let{key:p,match:x,controller:b}=g;if(b&&b.signal.aborted)return;let _=d[p];if(Be(_,"Did not find corresponding fetcher result"),ja(_)){let C=mn(n.matches,x==null?void 0:x.route.id);y&&y[C.route.id]||(y={...y,[C.route.id]:_.error}),n.fetchers.delete(p)}else if(Zn(_))Be(!1,"Unhandled fetcher revalidation redirect");else{let C=wl(_.data);n.fetchers.set(p,C)}}),{loaderData:m,errors:y}}function Yp(n,i,s,c){let f=Object.entries(i).filter(([,d])=>d!==Gv).reduce((d,[m,y])=>(d[m]=y,d),{});for(let d of s){let m=d.route.id;if(!i.hasOwnProperty(m)&&n.hasOwnProperty(m)&&d.route.loader&&(f[m]=n[m]),c&&c.hasOwnProperty(m))break}return f}function Gp(n){return n?ja(n[1])?{actionData:{}}:{actionData:{[n[0]]:n[1].data}}:{}}function mn(n,i){return(i?n.slice(0,n.findIndex(c=>c.route.id===i)+1):[...n]).reverse().find(c=>c.route.hasErrorBoundary===!0)||n[0]}function Yu(n){let i=n.length===1?n[0]:n.find(s=>s.index||!s.path||s.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:i}],route:i}}function Ua(n,{pathname:i,routeId:s,method:c,type:f,message:d}={}){let m="Unknown Server Error",y="Unknown @remix-run/router error";return n===400?(m="Bad Request",c&&i&&s?y=`You made a ${c} request to "${i}" but did not provide a \`loader\` for route "${s}", so there is no way to handle the request.`:f==="invalid-body"&&(y="Unable to encode submission body")):n===403?(m="Forbidden",y=`Route "${s}" does not match URL "${i}"`):n===404?(m="Not Found",y=`No route matches URL "${i}"`):n===405&&(m="Method Not Allowed",c&&i&&s?y=`You made a ${c.toUpperCase()} request to "${i}" but did not provide an \`action\` for route "${s}", so there is no way to handle the request.`:c&&(y=`Invalid request method "${c.toUpperCase()}"`)),new vs(n||500,m,new Error(y),!0)}function Gu(n){let i=Object.entries(n);for(let s=i.length-1;s>=0;s--){let[c,f]=i[s];if(Zn(f))return{key:c,result:f}}}function $v(n){let i=typeof n=="string"?ul(n):n;return sl({...i,hash:""})}function yx(n,i){return n.pathname!==i.pathname||n.search!==i.search?!1:n.hash===""?i.hash!=="":n.hash===i.hash?!0:i.hash!==""}function px(n){var i,s;return new vs(((i=n.init)==null?void 0:i.status)??500,((s=n.init)==null?void 0:s.statusText)??"Internal Server Error",n.data)}function vx(n){return n!=null&&typeof n=="object"&&Object.entries(n).every(([i,s])=>typeof i=="string"&&gx(s))}function gx(n){return n!=null&&typeof n=="object"&&"type"in n&&"result"in n&&(n.type==="data"||n.type==="error")}function bx(n){return ld(n.result)&&Qv.has(n.result.status)}function ja(n){return n.type==="error"}function Zn(n){return(n&&n.type)==="redirect"}function Kp(n){return typeof n=="object"&&n!=null&&"type"in n&&"data"in n&&"init"in n&&n.type==="DataWithResponseInit"}function ld(n){return n!=null&&typeof n.status=="number"&&typeof n.statusText=="string"&&typeof n.headers=="object"&&typeof n.body<"u"}function Sx(n){return Qv.has(n)}function xx(n){return ld(n)&&Sx(n.status)&&n.headers.has("Location")}function jx(n){return PS.has(n.toUpperCase())}function Jt(n){return $S.has(n.toUpperCase())}function nd(n){return new URLSearchParams(n).getAll("index").some(i=>i==="")}function Vu(n,i){let s=typeof i=="string"?ul(i).search:i.search;if(n[n.length-1].route.index&&nd(s||""))return n[n.length-1];let c=Uv(n);return c[c.length-1]}function Xp(n){let{formMethod:i,formAction:s,formEncType:c,text:f,formData:d,json:m}=n;if(!(!i||!s||!c)){if(f!=null)return{formMethod:i,formAction:s,formEncType:c,formData:void 0,json:void 0,text:f};if(d!=null)return{formMethod:i,formAction:s,formEncType:c,formData:d,json:void 0,text:void 0};if(m!==void 0)return{formMethod:i,formAction:s,formEncType:c,formData:void 0,json:m,text:void 0}}}function Cf(n,i){return i?{state:"loading",location:n,formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text}:{state:"loading",location:n,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function Ex(n,i){return{state:"submitting",location:n,formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text}}function es(n,i){return n?{state:"loading",formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text,data:i}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:i}}function Nx(n,i){return{state:"submitting",formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text,data:i?i.data:void 0}}function wl(n){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:n}}function Rx(n,i){try{let s=n.sessionStorage.getItem(Yv);if(s){let c=JSON.parse(s);for(let[f,d]of Object.entries(c||{}))d&&Array.isArray(d)&&i.set(f,new Set(d||[]))}}catch{}}function Cx(n,i){if(i.size>0){let s={};for(let[c,f]of i)s[c]=[...f];try{n.sessionStorage.setItem(Yv,JSON.stringify(s))}catch(c){Rt(!1,`Failed to save applied view transitions in sessionStorage (${c}).`)}}}function kp(){let n,i,s=new Promise((c,f)=>{n=async d=>{c(d);try{await s}catch{}},i=async d=>{f(d);try{await s}catch{}}});return{promise:s,resolve:n,reject:i}}var ii=S.createContext(null);ii.displayName="DataRouter";var bs=S.createContext(null);bs.displayName="DataRouterState";var Wv=S.createContext(!1);function Pv(){return S.useContext(Wv)}var id=S.createContext({isTransitioning:!1});id.displayName="ViewTransition";var Iv=S.createContext(new Map);Iv.displayName="Fetchers";var Tx=S.createContext(null);Tx.displayName="Await";var Ea=S.createContext(null);Ea.displayName="Navigation";var lc=S.createContext(null);lc.displayName="Location";var Qa=S.createContext({outlet:null,matches:[],isDataRoute:!1});Qa.displayName="Route";var rd=S.createContext(null);rd.displayName="RouteError";var eg="REACT_ROUTER_ERROR",_x="REDIRECT",Mx="ROUTE_ERROR_RESPONSE";function wx(n){if(n.startsWith(`${eg}:${_x}:{`))try{let i=JSON.parse(n.slice(28));if(typeof i=="object"&&i&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.location=="string"&&typeof i.reloadDocument=="boolean"&&typeof i.replace=="boolean")return i}catch{}}function Ox(n){if(n.startsWith(`${eg}:${Mx}:{`))try{let i=JSON.parse(n.slice(40));if(typeof i=="object"&&i&&typeof i.status=="number"&&typeof i.statusText=="string")return new vs(i.status,i.statusText,i.data)}catch{}}function Dx(n,{relative:i}={}){Be(ur(),"useHref() may be used only in the context of a component.");let{basename:s,navigator:c}=S.useContext(Ea),{hash:f,pathname:d,search:m}=xs(n,{relative:i}),y=d;return s!=="/"&&(y=d==="/"?s:Ba([s,d])),c.createHref({pathname:y,search:m,hash:f})}function ur(){return S.useContext(lc)!=null}function oa(){return Be(ur(),"useLocation() may be used only in the context of a component."),S.useContext(lc).location}var tg="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function ag(n){S.useContext(Ea).static||S.useLayoutEffect(n)}function Ss(){let{isDataRoute:n}=S.useContext(Qa);return n?Fx():zx()}function zx(){Be(ur(),"useNavigate() may be used only in the context of a component.");let n=S.useContext(ii),{basename:i,navigator:s}=S.useContext(Ea),{matches:c}=S.useContext(Qa),{pathname:f}=oa(),d=JSON.stringify(ac(c)),m=S.useRef(!1);return ag(()=>{m.current=!0}),S.useCallback((g,p={})=>{if(Rt(m.current,tg),!m.current)return;if(typeof g=="number"){s.go(g);return}let x=ps(g,JSON.parse(d),f,p.relative==="path");n==null&&i!=="/"&&(x.pathname=x.pathname==="/"?i:Ba([i,x.pathname])),(p.replace?s.replace:s.push)(x,p.state,p)},[i,s,d,f,n])}var Ax=S.createContext(null);function Ux(n){let i=S.useContext(Qa).outlet;return S.useMemo(()=>i&&S.createElement(Ax.Provider,{value:n},i),[i,n])}function Lx(){let{matches:n}=S.useContext(Qa),i=n[n.length-1];return i?i.params:{}}function xs(n,{relative:i}={}){let{matches:s}=S.useContext(Qa),{pathname:c}=oa(),f=JSON.stringify(ac(s));return S.useMemo(()=>ps(n,JSON.parse(f),c,i==="path"),[n,f,c,i])}function Hx(n,i,s){Be(ur(),"useRoutes() may be used only in the context of a component.");let{navigator:c}=S.useContext(Ea),{matches:f}=S.useContext(Qa),d=f[f.length-1],m=d?d.params:{},y=d?d.pathname:"/",g=d?d.pathnameBase:"/",p=d&&d.route;{let L=p&&p.path||"";ng(y,!p||L.endsWith("*")||L.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${y}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. -Please change the parent to .`)}let S=sa(),b;b=S;let C=b.pathname||"/",M=C;if(g!=="/"){let q=g.replace(/^\//,"").split("/");M="/"+C.replace(/^\//,"").split("/").slice(q.length).join("/")}let H=cn(n,{pathname:M});return jt(v||H!=null,`No routes matched location "${b.pathname}${b.search}${b.hash}" `),jt(H==null||H[H.length-1].route.element!==void 0||H[H.length-1].route.Component!==void 0||H[H.length-1].route.lazy!==void 0,`Matched leaf route at location "${b.pathname}${b.search}${b.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`),U1(H&&H.map(q=>Object.assign({},q,{params:Object.assign({},m,q.params),pathname:Ua([g,c.encodeLocation?c.encodeLocation(q.pathname.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:q.pathname]),pathnameBase:q.pathnameBase==="/"?g:Ua([g,c.encodeLocation?c.encodeLocation(q.pathnameBase.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:q.pathnameBase])})),o,r)}function D1(){let n=Q1(),i=rr(n)?`${n.status} ${n.statusText}`:n instanceof Error?n.message:JSON.stringify(n),r=n instanceof Error?n.stack:null,c="rgba(200,200,200, 0.5)",o={padding:"0.5rem",backgroundColor:c},f={padding:"2px 4px",backgroundColor:c},m=null;return console.error("Error handled by React Router default ErrorBoundary:",n),m=R.createElement(R.Fragment,null,R.createElement("p",null,"💿 Hey developer 👋"),R.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",R.createElement("code",{style:f},"ErrorBoundary")," or"," ",R.createElement("code",{style:f},"errorElement")," prop on your route.")),R.createElement(R.Fragment,null,R.createElement("h2",null,"Unexpected Application Error!"),R.createElement("h3",{style:{fontStyle:"italic"}},i),r?R.createElement("pre",{style:o},r):null,m)}var w1=R.createElement(D1,null),$p=class extends R.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,i){return i.location!==n.location||i.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:i.error,location:i.location,revalidation:n.revalidation||i.revalidation}}componentDidCatch(n,i){this.props.onError?this.props.onError(n,i):console.error("React Router caught the following error during render",n)}render(){let n=this.state.error;if(this.context&&typeof n=="object"&&n&&"digest"in n&&typeof n.digest=="string"){const r=R1(n.digest);r&&(n=r)}let i=n!==void 0?R.createElement(Ha.Provider,{value:this.props.routeContext},R.createElement(ld.Provider,{value:n,children:this.props.component})):this.props.children;return this.context?R.createElement(A1,{error:n},i):i}};$p.contextType=Kp;var Rf=new WeakMap;function A1({children:n,error:i}){let{basename:r}=R.useContext(ga);if(typeof i=="object"&&i&&"digest"in i&&typeof i.digest=="string"){let c=j1(i.digest);if(c){let o=Rf.get(i);if(o)throw o;let f=zp(c.location,r);if(Op&&!Rf.get(i))if(f.isExternal||c.reloadDocument)window.location.href=f.absoluteURL||f.to;else{const m=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(f.to,{replace:c.replace}));throw Rf.set(i,m),m}return R.createElement("meta",{httpEquiv:"refresh",content:`0;url=${f.absoluteURL||f.to}`})}}return n}function _1({routeContext:n,match:i,children:r}){let c=R.useContext(li);return c&&c.static&&c.staticContext&&(i.route.errorElement||i.route.ErrorBoundary)&&(c.staticContext._deepestRenderedBoundaryId=i.route.id),R.createElement(Ha.Provider,{value:n},r)}function U1(n,i=[],r){let c=r==null?void 0:r.state;if(n==null){if(!c)return null;if(c.errors)n=c.matches;else if(i.length===0&&!c.initialized&&c.matches.length>0)n=c.matches;else return null}let o=n,f=c==null?void 0:c.errors;if(f!=null){let S=o.findIndex(b=>b.route.id&&(f==null?void 0:f[b.route.id])!==void 0);Ue(S>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(f).join(",")}`),o=o.slice(0,Math.min(o.length,S+1))}let m=!1,y=-1;if(r&&c){m=c.renderFallback;for(let S=0;S=0?o=o.slice(0,y+1):o=[o[0]];break}}}}let g=r==null?void 0:r.onError,v=c&&g?(S,b)=>{var C,M;g(S,{location:c.location,params:((M=(C=c.matches)==null?void 0:C[0])==null?void 0:M.params)??{},unstable_pattern:vr(c.matches),errorInfo:b})}:void 0;return o.reduceRight((S,b,C)=>{let M,H=!1,w=null,q=null;c&&(M=f&&b.route.id?f[b.route.id]:void 0,w=b.route.errorElement||w1,m&&(y<0&&C===0?(Wp("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),H=!0,q=null):y===C&&(H=!0,q=b.route.hydrateFallbackElement||null)));let X=i.concat(o.slice(0,C+1)),J=()=>{let F;return M?F=w:H?F=q:b.route.Component?F=R.createElement(b.route.Component,null):b.route.element?F=b.route.element:F=S,R.createElement(_1,{match:b,routeContext:{outlet:S,matches:X,isDataRoute:c!=null},children:F})};return c&&(b.route.ErrorBoundary||b.route.errorElement||C===0)?R.createElement($p,{location:c.location,revalidation:c.revalidation,component:w,error:M,children:J(),routeContext:{outlet:null,matches:X,isDataRoute:!0},onError:v}):J()},null)}function nd(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function L1(n){let i=R.useContext(li);return Ue(i,nd(n)),i}function H1(n){let i=R.useContext(pr);return Ue(i,nd(n)),i}function B1(n){let i=R.useContext(Ha);return Ue(i,nd(n)),i}function id(n){let i=B1(n),r=i.matches[i.matches.length-1];return Ue(r.route.id,`${n} can only be used on routes that contain a unique "id"`),r.route.id}function q1(){return id("useRouteId")}function Q1(){var c;let n=R.useContext(ld),i=H1("useRouteError"),r=id("useRouteError");return n!==void 0?n:(c=i.errors)==null?void 0:c[r]}function Y1(){let{router:n}=L1("useNavigate"),i=id("useNavigate"),r=R.useRef(!1);return kp(()=>{r.current=!0}),R.useCallback(async(o,f={})=>{jt(r.current,Jp),r.current&&(typeof o=="number"?await n.navigate(o):await n.navigate(o,{fromRouteId:i,...f}))},[n,i])}var Kv={};function Wp(n,i,r){!i&&!Kv[n]&&(Kv[n]=!0,jt(!1,r))}var Vv={};function Zv(n,i){!n&&!Vv[i]&&(Vv[i]=!0,console.warn(i))}var G1="useOptimistic",Fv=g0[G1],X1=()=>{};function K1(n){return Fv?Fv(n):[n,X1]}function V1(n){let i={hasErrorBoundary:n.hasErrorBoundary||n.ErrorBoundary!=null||n.errorElement!=null};return n.Component&&(n.element&&jt(!1,"You should not include both `Component` and `element` on your route - `Component` will be used."),Object.assign(i,{element:R.createElement(n.Component),Component:void 0})),n.HydrateFallback&&(n.hydrateFallbackElement&&jt(!1,"You should not include both `HydrateFallback` and `hydrateFallbackElement` on your route - `HydrateFallback` will be used."),Object.assign(i,{hydrateFallbackElement:R.createElement(n.HydrateFallback),HydrateFallback:void 0})),n.ErrorBoundary&&(n.errorElement&&jt(!1,"You should not include both `ErrorBoundary` and `errorElement` on your route - `ErrorBoundary` will be used."),Object.assign(i,{errorElement:R.createElement(n.ErrorBoundary),ErrorBoundary:void 0})),i}var Z1=["HydrateFallback","hydrateFallbackElement"],F1=class{constructor(){this.status="pending",this.promise=new Promise((n,i)=>{this.resolve=r=>{this.status==="pending"&&(this.status="resolved",n(r))},this.reject=r=>{this.status==="pending"&&(this.status="rejected",i(r))}})}};function J1({router:n,flushSync:i,onError:r,unstable_useTransitions:c}){c=Vp()||c;let[f,m]=R.useState(n.state),[y,g]=K1(f),[v,S]=R.useState(),[b,C]=R.useState({isTransitioning:!1}),[M,H]=R.useState(),[w,q]=R.useState(),[X,J]=R.useState(),F=R.useRef(new Map),W=R.useCallback((ie,{deletedFetchers:ye,newErrors:Re,flushSync:Ee,viewTransitionOpts:Ae})=>{Re&&r&&Object.values(Re).forEach(xe=>{var A;return r(xe,{location:ie.location,params:((A=ie.matches[0])==null?void 0:A.params)??{},unstable_pattern:vr(ie.matches)})}),ie.fetchers.forEach((xe,A)=>{xe.data!==void 0&&F.current.set(A,xe.data)}),ye.forEach(xe=>F.current.delete(xe)),Zv(Ee===!1||i!=null,'You provided the `flushSync` option to a router update, but you are not using the `` from `react-router/dom` so `ReactDOM.flushSync()` is unavailable. Please update your app to `import { RouterProvider } from "react-router/dom"` and ensure you have `react-dom` installed as a dependency to use the `flushSync` option.');let qe=n.window!=null&&n.window.document!=null&&typeof n.window.document.startViewTransition=="function";if(Zv(Ae==null||qe,"You provided the `viewTransition` option to a router update, but you do not appear to be running in a DOM environment as `window.startViewTransition` is not available."),!Ae||!qe){i&&Ee?i(()=>m(ie)):c===!1?m(ie):R.startTransition(()=>{c===!0&&g(xe=>Jv(xe,ie)),m(ie)});return}if(i&&Ee){i(()=>{w&&(M==null||M.resolve(),w.skipTransition()),C({isTransitioning:!0,flushSync:!0,currentLocation:Ae.currentLocation,nextLocation:Ae.nextLocation})});let xe=n.window.document.startViewTransition(()=>{i(()=>m(ie))});xe.finished.finally(()=>{i(()=>{H(void 0),q(void 0),S(void 0),C({isTransitioning:!1})})}),i(()=>q(xe));return}w?(M==null||M.resolve(),w.skipTransition(),J({state:ie,currentLocation:Ae.currentLocation,nextLocation:Ae.nextLocation})):(S(ie),C({isTransitioning:!0,flushSync:!1,currentLocation:Ae.currentLocation,nextLocation:Ae.nextLocation}))},[n.window,i,w,M,c,g,r]);R.useLayoutEffect(()=>n.subscribe(W),[n,W]);let ae=y.initialized;R.useLayoutEffect(()=>{!ae&&n.state.initialized&&W(n.state,{deletedFetchers:[],flushSync:!1,newErrors:null})},[ae,W,n.state]),R.useEffect(()=>{b.isTransitioning&&!b.flushSync&&H(new F1)},[b]),R.useEffect(()=>{if(M&&v&&n.window){let ie=v,ye=M.promise,Re=n.window.document.startViewTransition(async()=>{c===!1?m(ie):R.startTransition(()=>{c===!0&&g(Ee=>Jv(Ee,ie)),m(ie)}),await ye});Re.finished.finally(()=>{H(void 0),q(void 0),S(void 0),C({isTransitioning:!1})}),q(Re)}},[v,M,n.window,c,g]),R.useEffect(()=>{M&&v&&y.location.key===v.location.key&&M.resolve()},[M,w,y.location,v]),R.useEffect(()=>{!b.isTransitioning&&X&&(S(X.state),C({isTransitioning:!0,flushSync:!1,currentLocation:X.currentLocation,nextLocation:X.nextLocation}),J(void 0))},[b.isTransitioning,X]);let oe=R.useMemo(()=>({createHref:n.createHref,encodeLocation:n.encodeLocation,go:ie=>n.navigate(ie),push:(ie,ye,Re)=>n.navigate(ie,{state:ye,preventScrollReset:Re==null?void 0:Re.preventScrollReset}),replace:(ie,ye,Re)=>n.navigate(ie,{replace:!0,state:ye,preventScrollReset:Re==null?void 0:Re.preventScrollReset})}),[n]),ne=n.basename||"/",D=R.useMemo(()=>({router:n,navigator:oe,static:!1,basename:ne,onError:r}),[n,oe,ne,r]);return R.createElement(R.Fragment,null,R.createElement(li.Provider,{value:D},R.createElement(pr.Provider,{value:y},R.createElement(Zp.Provider,{value:F.current},R.createElement(ad.Provider,{value:b},R.createElement(P1,{basename:ne,location:y.location,navigationType:y.historyAction,navigator:oe,unstable_useTransitions:c},R.createElement(k1,{routes:n.routes,future:n.future,state:y,isStatic:!1,onError:r})))))),null)}function Jv(n,i){return{...n,navigation:i.navigation.state!=="idle"?i.navigation:n.navigation,revalidation:i.revalidation!=="idle"?i.revalidation:n.revalidation,actionData:i.navigation.state!=="submitting"?i.actionData:n.actionData,fetchers:i.fetchers}}var k1=R.memo($1);function $1({routes:n,future:i,state:r,isStatic:c,onError:o}){return z1(n,void 0,{state:r,isStatic:c,onError:o})}function Ws({to:n,replace:i,state:r,relative:c}){Ue(nu()," may be used only in the context of a component.");let{static:o}=R.useContext(ga);jt(!o," must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.");let{matches:f}=R.useContext(Ha),{pathname:m}=sa(),y=gr(),g=mr(n,Ps(f),m,c==="path"),v=JSON.stringify(g);return R.useEffect(()=>{y(JSON.parse(v),{replace:i,state:r,relative:c})},[y,v,c,i,r]),null}function W1(n){return C1(n.context)}function P1({basename:n="/",children:i=null,location:r,navigationType:c="POP",navigator:o,static:f=!1,unstable_useTransitions:m}){Ue(!nu(),"You cannot render a inside another . You should never have more than one in your app.");let y=n.replace(/^\/*/,"/"),g=R.useMemo(()=>({basename:y,navigator:o,static:f,unstable_useTransitions:m,future:{}}),[y,o,f,m]);typeof r=="string"&&(r=ll(r));let{pathname:v="/",search:S="",hash:b="",state:C=null,key:M="default",unstable_mask:H}=r,w=R.useMemo(()=>{let q=La(v,y);return q==null?null:{location:{pathname:q,search:S,hash:b,state:C,key:M,unstable_mask:H},navigationType:c}},[y,v,S,b,C,M,c,H]);return jt(w!=null,` is not able to match the URL "${v}${S}${b}" because it does not start with the basename, so the won't render anything.`),w==null?null:R.createElement(ga.Provider,{value:g},R.createElement(Is.Provider,{children:i,value:w}))}var Vs="get",Zs="application/x-www-form-urlencoded";function ec(n){return typeof HTMLElement<"u"&&n instanceof HTMLElement}function I1(n){return ec(n)&&n.tagName.toLowerCase()==="button"}function ex(n){return ec(n)&&n.tagName.toLowerCase()==="form"}function tx(n){return ec(n)&&n.tagName.toLowerCase()==="input"}function ax(n){return!!(n.metaKey||n.altKey||n.ctrlKey||n.shiftKey)}function lx(n,i){return n.button===0&&(!i||i==="_self")&&!ax(n)}var Ys=null;function nx(){if(Ys===null)try{new FormData(document.createElement("form"),0),Ys=!1}catch{Ys=!0}return Ys}var ix=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Tf(n){return n!=null&&!ix.has(n)?(jt(!1,`"${n}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${Zs}"`),null):n}function ux(n,i){let r,c,o,f,m;if(ex(n)){let y=n.getAttribute("action");c=y?La(y,i):null,r=n.getAttribute("method")||Vs,o=Tf(n.getAttribute("enctype"))||Zs,f=new FormData(n)}else if(I1(n)||tx(n)&&(n.type==="submit"||n.type==="image")){let y=n.form;if(y==null)throw new Error('Cannot submit a + + +
+ Desired Backends +
+ {detailQuery.data?.desired_backends.length ? ( + detailQuery.data.desired_backends.map((backend) => ( +
+
+ {backend.name} + + {formatBackendType(backend.type)} · {titleCase(backend.stability_class)} + +
+ + {detailQuery.data.missing_backend_ids.includes(backend.id) ? "Missing" : "Ready"} + +
+ )) + ) : ( +

No placement targets selected.

+ )} +
+
+ +
+ Replicas +
+ {detailQuery.data?.replicas.length ? ( + detailQuery.data.replicas.map((replica) => ( +
+
+ {replica.backend_name} + + {formatBytes(replica.size_bytes)} · {formatReplicaVerification(replica.last_verified_at)} + +
+ + {titleCase(replica.status)} + +
+ )) + ) : ( +

No recorded replicas for this file yet.

+ )} +
+
+ + ) : ( +
+ Storage +

Folder storage

+

Replica placement is tracked for files.

+
+ ) )} )} @@ -1015,3 +1125,7 @@ function dialogDescription(mode: DialogMode, selectedItem: DirectoryItem | null) } return `This will move ${selectedItem?.name ?? "this file"} into the recycle bin.`; } + +function formatReplicaVerification(value: string | null) { + return value ? `verified ${formatDate(value)}` : "Not verified yet"; +} diff --git a/frontend/src/routes/PoliciesPage.tsx b/frontend/src/routes/PoliciesPage.tsx new file mode 100644 index 0000000..4622e33 --- /dev/null +++ b/frontend/src/routes/PoliciesPage.tsx @@ -0,0 +1,290 @@ +import { FormEvent, useEffect, useMemo, useState } from "react"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { api, type PlacementPolicyPayload, type PlacementPolicySummary } from "../lib/api"; +import { useToast } from "../features/toast/ToastProvider"; +import { formatBackendType, formatBytes, titleCase } from "../lib/format"; + +const FILE_CLASSES: PlacementPolicySummary["file_class"][] = ["document", "image", "video", "other"]; + +const MIME_PRESETS: Record = { + document: "application/pdf", + image: "image/png", + video: "video/mp4", + other: "application/octet-stream", +}; + +export function PoliciesPage() { + const queryClient = useQueryClient(); + const { pushToast } = useToast(); + const [selectedClass, setSelectedClass] = useState("document"); + const [requireLocal, setRequireLocal] = useState(true); + const [stableCount, setStableCount] = useState(1); + const [opportunisticCount, setOpportunisticCount] = useState(0); + const [preferredBackendIds, setPreferredBackendIds] = useState([]); + const [excludedBackendIds, setExcludedBackendIds] = useState([]); + const [maxNonLocalSize, setMaxNonLocalSize] = useState(""); + const [mimeType, setMimeType] = useState(MIME_PRESETS.document); + const [previewSize, setPreviewSize] = useState("1048576"); + const [formError, setFormError] = useState(""); + + const policiesQuery = useQuery({ + queryKey: ["placement-policies"], + queryFn: api.listPlacementPolicies, + }); + const backendQuery = useQuery({ + queryKey: ["backends"], + queryFn: api.listBackends, + }); + + const policies = policiesQuery.data?.items ?? []; + const backends = backendQuery.data?.items ?? []; + const selectedPolicy = policies.find((policy) => policy.file_class === selectedClass); + + useEffect(() => { + if (!selectedPolicy) { + return; + } + setRequireLocal(selectedPolicy.require_local); + setStableCount(selectedPolicy.stable_replica_count); + setOpportunisticCount(selectedPolicy.opportunistic_replica_count); + setPreferredBackendIds(selectedPolicy.preferred_backend_ids); + setExcludedBackendIds(selectedPolicy.excluded_backend_ids); + setMaxNonLocalSize( + selectedPolicy.max_non_local_size_bytes === null ? "" : String(selectedPolicy.max_non_local_size_bytes), + ); + }, [selectedPolicy?.id, selectedPolicy?.updated_at]); + + useEffect(() => { + setMimeType(MIME_PRESETS[selectedClass]); + }, [selectedClass]); + + const previewSizeBytes = parseOptionalInt(previewSize); + const previewQuery = useQuery({ + queryKey: ["placement-preview", mimeType, previewSizeBytes], + queryFn: () => api.previewPlacementDecision(mimeType, previewSizeBytes), + }); + + const updateMutation = useMutation({ + mutationFn: (payload: PlacementPolicyPayload) => api.updatePlacementPolicy(selectedClass, payload), + onSuccess: async (result) => { + setFormError(""); + pushToast( + `Policy saved. Full reconcile queued ${result.reconcile_enqueued_jobs} job${result.reconcile_enqueued_jobs === 1 ? "" : "s"}.`, + "success", + ); + await queryClient.invalidateQueries({ queryKey: ["placement-policies"] }); + await queryClient.invalidateQueries({ queryKey: ["placement-preview"] }); + await queryClient.invalidateQueries({ queryKey: ["jobs"] }); + }, + onError: (error) => { + setFormError(error instanceof Error ? error.message : "Policy update failed."); + pushToast(error instanceof Error ? error.message : "Policy update failed.", "error"); + }, + }); + + const localBackendCount = backends.filter((backend) => backend.type === "local_directory" && backend.is_enabled).length; + const stableBackendCount = backends.filter((backend) => backend.stability_class === "stable" && backend.is_enabled).length; + const opportunisticBackendCount = backends.filter( + (backend) => backend.stability_class === "opportunistic" && backend.is_enabled, + ).length; + + function handleSubmit(event: FormEvent) { + event.preventDefault(); + const maxSize = parseOptionalInt(maxNonLocalSize); + if (maxNonLocalSize.trim() && maxSize === null) { + setFormError("Max non-local size must be a whole number."); + return; + } + updateMutation.mutate({ + require_local: requireLocal, + stable_replica_count: Math.max(0, stableCount), + opportunistic_replica_count: Math.max(0, opportunisticCount), + preferred_backend_ids: preferredBackendIds, + excluded_backend_ids: excludedBackendIds, + max_non_local_size_bytes: maxSize, + }); + } + + function toggleBackend(listName: "preferred" | "excluded", backendId: string) { + if (listName === "preferred") { + setPreferredBackendIds((current) => toggleId(current, backendId)); + setExcludedBackendIds((current) => current.filter((id) => id !== backendId)); + return; + } + setExcludedBackendIds((current) => toggleId(current, backendId)); + setPreferredBackendIds((current) => current.filter((id) => id !== backendId)); + } + + return ( +
+
+
+
+
+ Placement +

Replica policies

+
+
+ +
+
+ Policies + {policies.length} +
+
+ Local + {localBackendCount} +
+
+ Stable + {stableBackendCount} +
+
+ Opportunistic + {opportunisticBackendCount} +
+
+ +
+ {FILE_CLASSES.map((fileClass) => ( + + ))} +
+ + +
+ + + + +
+ +
+ {backends.map((backend) => ( +
+
+ {backend.name} + + {formatBackendType(backend.type)} · {titleCase(backend.stability_class)} + +
+
+ + +
+
+ ))} +
+ + {formError ?

{formError}

: null} +
+ +
+ +
+ + +
+
+ ); +} + +function toggleId(values: string[], id: string) { + return values.includes(id) ? values.filter((value) => value !== id) : [...values, id]; +} + +function parseOptionalInt(value: string) { + const cleaned = value.trim(); + if (!cleaned) { + return null; + } + const parsed = Number(cleaned); + if (!Number.isInteger(parsed) || parsed < 0) { + return null; + } + return parsed; +} diff --git a/frontend/src/routes/StoragePage.tsx b/frontend/src/routes/StoragePage.tsx index a40ceb1..7140738 100644 --- a/frontend/src/routes/StoragePage.tsx +++ b/frontend/src/routes/StoragePage.tsx @@ -1,36 +1,241 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { FormEvent, useState } from "react"; +import { Dialog } from "../components/Dialog"; +import { useToast } from "../features/toast/ToastProvider"; import { api } from "../lib/api"; -import { formatDate, titleCase } from "../lib/format"; +import type { BackendSummary } from "../lib/api"; +import { formatBackendType, formatDate, titleCase } from "../lib/format"; + +type BackendType = "local_directory" | "s3" | "webdav"; +type StabilityClass = "local" | "stable" | "opportunistic"; + +const CONFIG_TEMPLATES: Record = { + local_directory: JSON.stringify({ base_path: "./.iron-storage/archive" }, null, 2), + s3: JSON.stringify( + { + bucket: "iron", + region: "us-east-1", + endpoint_url: "http://127.0.0.1:9000", + access_key_id: "", + secret_access_key: "", + prefix: "iron", + force_path_style: true, + }, + null, + 2, + ), + webdav: JSON.stringify( + { + endpoint_url: "http://127.0.0.1:5244/dav", + username: "iron", + password: "", + root_path: "iron", + verify_ssl: true, + }, + null, + 2, + ), +}; export function StoragePage() { const queryClient = useQueryClient(); + const { pushToast } = useToast(); + const [isCreateOpen, setIsCreateOpen] = useState(false); + const [backendType, setBackendType] = useState("s3"); + const [stabilityClass, setStabilityClass] = useState("stable"); + const [name, setName] = useState(""); + const [readPriority, setReadPriority] = useState(80); + const [writePriority, setWritePriority] = useState(80); + const [configText, setConfigText] = useState(CONFIG_TEMPLATES.s3); + const [formError, setFormError] = useState(""); + const [editingBackend, setEditingBackend] = useState(null); + const [editName, setEditName] = useState(""); + const [editStabilityClass, setEditStabilityClass] = useState("stable"); + const [editReadPriority, setEditReadPriority] = useState(80); + const [editWritePriority, setEditWritePriority] = useState(80); + const [editConfigText, setEditConfigText] = useState("{}"); + const [editSecretText, setEditSecretText] = useState("{}"); + const [editError, setEditError] = useState(""); + const [deleteTarget, setDeleteTarget] = useState(null); const backendQuery = useQuery({ queryKey: ["backends"], queryFn: api.listBackends, }); + function handleTypeChange(nextType: BackendType) { + setBackendType(nextType); + setConfigText(CONFIG_TEMPLATES[nextType]); + setStabilityClass(nextType === "local_directory" ? "local" : "stable"); + if (!name.trim()) { + setName( + nextType === "local_directory" + ? "local-archive" + : nextType === "s3" + ? "s3-main" + : "openlist-main", + ); + } + } + + const createMutation = useMutation({ + mutationFn: api.createBackend, + onSuccess: async () => { + setIsCreateOpen(false); + setFormError(""); + await queryClient.invalidateQueries({ queryKey: ["backends"] }); + }, + onError: (error) => { + setFormError(error instanceof Error ? error.message : "Backend creation failed."); + }, + }); + const checkMutation = useMutation({ mutationFn: (backendId: string) => api.checkBackend(backendId), onSuccess: async () => { + pushToast("Backend check finished.", "success"); await queryClient.invalidateQueries({ queryKey: ["backends"] }); }, + onError: (error) => { + pushToast(error instanceof Error ? error.message : "Backend check failed.", "error"); + }, }); const disableMutation = useMutation({ mutationFn: (backendId: string) => api.disableBackend(backendId), onSuccess: async () => { + pushToast("Backend disabled.", "success"); await queryClient.invalidateQueries({ queryKey: ["backends"] }); }, + onError: (error) => { + pushToast(error instanceof Error ? error.message : "Disable failed.", "error"); + }, + }); + + const enableMutation = useMutation({ + mutationFn: (backendId: string) => api.enableBackend(backendId), + onSuccess: async () => { + pushToast("Backend enabled.", "success"); + await queryClient.invalidateQueries({ queryKey: ["backends"] }); + }, + onError: (error) => { + pushToast(error instanceof Error ? error.message : "Enable failed.", "error"); + }, + }); + + const runAllChecksMutation = useMutation({ + mutationFn: api.enqueueHealthChecks, + onSuccess: async (result) => { + pushToast(`Queued ${result.enqueued_jobs} backend health check job${result.enqueued_jobs === 1 ? "" : "s"}.`, "success"); + await queryClient.invalidateQueries({ queryKey: ["jobs"] }); + }, + onError: (error) => { + pushToast(error instanceof Error ? error.message : "Could not queue health checks.", "error"); + }, + }); + + const updateMutation = useMutation({ + mutationFn: (payload: { backendId: string; form: ReturnType }) => + api.updateBackend(payload.backendId, payload.form), + onSuccess: async () => { + setEditingBackend(null); + setEditError(""); + pushToast("Backend updated.", "success"); + await queryClient.invalidateQueries({ queryKey: ["backends"] }); + }, + onError: (error) => { + setEditError(error instanceof Error ? error.message : "Backend update failed."); + }, + }); + + const deleteMutation = useMutation({ + mutationFn: (backendId: string) => api.deleteBackend(backendId), + onSuccess: async () => { + const deletedName = deleteTarget?.name; + setDeleteTarget(null); + pushToast(deletedName ? `Deleted ${deletedName}.` : "Backend deleted.", "success"); + await queryClient.invalidateQueries({ queryKey: ["backends"] }); + await queryClient.invalidateQueries({ queryKey: ["placement-policies"] }); + }, + onError: (error) => { + pushToast(error instanceof Error ? error.message : "Delete failed.", "error"); + }, }); const items = backendQuery.data?.items ?? []; const healthyCount = items.filter((backend) => (backend.last_health_status ?? "unknown") === "healthy").length; const enabledCount = items.filter((backend) => backend.is_enabled).length; const disabledCount = items.filter((backend) => !backend.is_enabled).length; + function handleCreateBackend(event: FormEvent) { + event.preventDefault(); + setFormError(""); + let config: Record; + try { + config = JSON.parse(configText) as Record; + } catch { + setFormError("Config must be valid JSON."); + return; + } + createMutation.mutate({ + name, + type: backendType, + stability_class: stabilityClass, + read_priority: readPriority, + write_priority: writePriority, + config, + }); + } + + function openEditBackend(backend: BackendSummary) { + setEditingBackend(backend); + setEditName(backend.name); + setEditStabilityClass(backend.stability_class as StabilityClass); + setEditReadPriority(backend.read_priority); + setEditWritePriority(backend.write_priority); + setEditConfigText(JSON.stringify(backend.config ?? {}, null, 2)); + setEditSecretText("{}"); + setEditError(""); + } + + function handleUpdateBackend(event: FormEvent) { + event.preventDefault(); + if (!editingBackend) { + return; + } + setEditError(""); + let form; + try { + form = buildEditPayload({ + name: editName, + stabilityClass: editStabilityClass, + readPriority: editReadPriority, + writePriority: editWritePriority, + configText: editConfigText, + secretText: editSecretText, + }); + } catch (error) { + setEditError(error instanceof Error ? error.message : "Config must be valid JSON."); + return; + } + updateMutation.mutate({ backendId: editingBackend.id, form }); + } + return (
+
+
+ Storage +

Backends

+
+ + +
+
Backends @@ -54,7 +259,7 @@ export function StoragePage() { {items.map((backend) => (
- {backend.type} + {formatBackendType(backend.type)}

{backend.name}

@@ -76,16 +281,36 @@ export function StoragePage() { Last checked {formatDate(backend.last_health_checked_at)}
+
+ Config + {formatBackendConfig(backend.config)} +
+
+ Secrets + {backend.secret_fields.length ? `${backend.secret_fields.length} configured` : "None"} +
+ {backend.is_enabled ? ( - ) : null} + ) : ( + <> + + + + )}
))} @@ -126,6 +351,216 @@ export function StoragePage() {
+ {isCreateOpen ? ( + setIsCreateOpen(false)}> +
+ + + +
+ + +
+