diff --git a/CHANGELOG.md b/CHANGELOG.md index c5b0a0578..456c3b283 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ All notable changes to Bambuddy will be documented in this file. - **Usage Tracking Wrong Spool on Dual-Nozzle / Multi-AMS Printers** ([#364](https://github.com/maziggy/bambuddy/issues/364)) — On H2C, H2D Pro, and other dual-nozzle printers with multiple AMS units, the usage tracker attributed filament consumption to the wrong spools. The MQTT `mapping` field — a per-print array that maps slicer filament slots to physical AMS trays — was preserved in state but never parsed or used. The tracker fell back to `slot_id - 1` as the global tray ID, which is incorrect when AMS hardware IDs differ from sequential indices (e.g., AMS-HT units with ID 128). Now decodes the MQTT mapping field from its snow encoding (`ams_hw_id * 256 + local_slot`) into bambuddy global tray IDs and uses it as a universal mapping source — working for all printer models and all print sources (slicer, queue, reprint) without relying on `tray_now` disambiguation. - **npm audit: suppress moderate ajv ReDoS finding** — Added `audit-level=high` to `frontend/.npmrc` so `npm audit` exits cleanly. The ajv@6 ReDoS (GHSA-2g4f-4pwh-qvx6) is a transitive dependency of eslint@9 with no patched v6 release; ajv@8 override breaks eslint. The vulnerability requires crafted `$data` schema input — not an attack vector in a linting config. - **Spool Form Allows Empty Brand & Subtype** ([#417](https://github.com/maziggy/bambuddy/issues/417)) — The spool add/edit modal did not require Brand or Subtype fields, allowing spools to be saved without them. When such a spool was assigned to an AMS slot, the `tray_sub_brands` sent to the printer was incomplete (e.g., just "PETG" instead of "PETG Basic"), causing BambuStudio to not recognize the filament profile. Brand and Subtype are now mandatory fields with validation errors shown on submit. +- **Open in Slicer Fails When Authentication Enabled** ([#433](https://github.com/maziggy/bambuddy/issues/433)) — The "Open in Slicer" buttons for BambuStudio and OrcaSlicer failed with "importing failed" when authentication was enabled. Slicer protocol handlers (`bambustudio://`, `orcaslicer://`) launch the slicer app which fetches the file via HTTP — but cannot send authentication headers, so the global auth middleware returned 401. Additionally, the URL format was wrong on Linux (used the macOS-only `bambustudioopen://` scheme instead of `bambustudio://open?file=`). Fixed with short-lived, single-use download tokens: the frontend fetches a token via an authenticated POST endpoint, then builds a `/dl/{token}/{filename}` URL that the slicer can access without auth headers. The token is validated server-side (5-minute expiry, single-use). Platform-specific URL formats now match the actual slicer source code: macOS uses `bambustudioopen://` with URL encoding, Windows/Linux use `bambustudio://open?file=`, and OrcaSlicer uses `orcaslicer://open?file=`. ### Changed - **Filament Catalog API Renamed** ([#427](https://github.com/maziggy/bambuddy/issues/427)) — Renamed `/api/v1/filaments/` to `/api/v1/filament-catalog/` to avoid confusion with the inventory spools page (labeled "Filament" in the UI). The old endpoint managed material type definitions (cost, temperature, density), not physical spools — the shared name caused users to expect the API to return their spool inventory. diff --git a/backend/app/api/routes/archives.py b/backend/app/api/routes/archives.py index e1094b93c..4cf82d67d 100644 --- a/backend/app/api/routes/archives.py +++ b/backend/app/api/routes/archives.py @@ -1074,7 +1074,63 @@ async def download_archive_with_filename( db: AsyncSession = Depends(get_db), _: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_READ), ): - """Download the 3MF file with filename in URL (for Bambu Studio protocol).""" + """Download the 3MF file with filename in URL.""" + service = ArchiveService(db) + archive = await service.get_archive(archive_id) + if not archive: + raise HTTPException(404, "Archive not found") + + file_path = settings.base_dir / archive.file_path + if not file_path.exists(): + raise HTTPException(404, "File not found") + + return FileResponse( + path=file_path, + filename=archive.filename, + media_type="application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + ) + + +@router.post("/{archive_id}/slicer-token") +async def create_archive_slicer_token( + archive_id: int, + db: AsyncSession = Depends(get_db), + _: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_READ), +): + """Create a short-lived download token for opening files in slicer applications. + + Slicer protocol handlers (bambustudioopen://, orcaslicer://) cannot send + auth headers, so they use this token in the URL path instead. + """ + from backend.app.core.auth import create_slicer_download_token + + service = ArchiveService(db) + archive = await service.get_archive(archive_id) + if not archive: + raise HTTPException(404, "Archive not found") + + token = create_slicer_download_token("archive", archive_id) + return {"token": token} + + +@router.get("/{archive_id}/dl/{token}/{filename}") +async def download_archive_for_slicer( + archive_id: int, + token: str, + filename: str, + db: AsyncSession = Depends(get_db), +): + """Download 3MF file using a slicer download token. + + Token-authenticated (no auth headers needed). The token is short-lived + and single-use, created by POST /{archive_id}/slicer-token. + Filename is at the end of the URL so slicers can detect the file format. + """ + from backend.app.core.auth import verify_slicer_download_token + + if not verify_slicer_download_token(token, "archive", archive_id): + raise HTTPException(403, "Invalid or expired download token") + service = ArchiveService(db) archive = await service.get_archive(archive_id) if not archive: @@ -3093,7 +3149,63 @@ async def download_source_3mf_for_slicer( db: AsyncSession = Depends(get_db), _: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_READ), ): - """Download source 3MF with filename in URL (for Bambu Studio compatibility).""" + """Download source 3MF with filename in URL.""" + result = await db.execute(select(PrintArchive).where(PrintArchive.id == archive_id)) + archive = result.scalar_one_or_none() + if not archive: + raise HTTPException(404, "Archive not found") + + if not archive.source_3mf_path: + raise HTTPException(404, "No source 3MF attached to this archive") + + source_path = settings.base_dir / archive.source_3mf_path + if not source_path.exists(): + raise HTTPException(404, "Source 3MF file not found on disk") + + return FileResponse( + path=source_path, + filename=filename if filename.endswith(".3mf") else f"{filename}.3mf", + media_type="application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + ) + + +@router.post("/{archive_id}/source-slicer-token") +async def create_source_slicer_token( + archive_id: int, + db: AsyncSession = Depends(get_db), + _: User | None = RequirePermissionIfAuthEnabled(Permission.ARCHIVES_READ), +): + """Create a short-lived download token for opening source 3MF in slicer.""" + from backend.app.core.auth import create_slicer_download_token + + result = await db.execute(select(PrintArchive).where(PrintArchive.id == archive_id)) + archive = result.scalar_one_or_none() + if not archive: + raise HTTPException(404, "Archive not found") + if not archive.source_3mf_path: + raise HTTPException(404, "No source 3MF attached to this archive") + + token = create_slicer_download_token("source", archive_id) + return {"token": token} + + +@router.get("/{archive_id}/source-dl/{token}/{filename}") +async def download_source_3mf_for_slicer_with_token( + archive_id: int, + token: str, + filename: str, + db: AsyncSession = Depends(get_db), +): + """Download source 3MF using a slicer download token. + + Token-authenticated (no auth headers needed). The token is short-lived + and single-use, created by POST /{archive_id}/source-slicer-token. + """ + from backend.app.core.auth import verify_slicer_download_token + + if not verify_slicer_download_token(token, "source", archive_id): + raise HTTPException(403, "Invalid or expired download token") + result = await db.execute(select(PrintArchive).where(PrintArchive.id == archive_id)) archive = result.scalar_one_or_none() if not archive: diff --git a/backend/app/api/routes/library.py b/backend/app/api/routes/library.py index 11222d22a..dac910fcc 100644 --- a/backend/app/api/routes/library.py +++ b/backend/app/api/routes/library.py @@ -2138,6 +2138,62 @@ async def download_file( ) +@router.post("/files/{file_id}/slicer-token") +async def create_library_slicer_token( + file_id: int, + db: AsyncSession = Depends(get_db), + _: User | None = Depends(require_permission_if_auth_enabled(Permission.LIBRARY_READ)), +): + """Create a short-lived download token for opening files in slicer applications. + + Slicer protocol handlers (bambustudioopen://, orcaslicer://) cannot send + auth headers, so they use this token in the URL path instead. + """ + from backend.app.core.auth import create_slicer_download_token + + result = await db.execute(select(LibraryFile).where(LibraryFile.id == file_id)) + file = result.scalar_one_or_none() + if not file: + raise HTTPException(status_code=404, detail="File not found") + + token = create_slicer_download_token("library", file_id) + return {"token": token} + + +@router.get("/files/{file_id}/dl/{token}/{filename}") +async def download_library_file_for_slicer( + file_id: int, + token: str, + filename: str, + db: AsyncSession = Depends(get_db), +): + """Download a library file using a slicer download token. + + Token-authenticated (no auth headers needed). The token is short-lived + and single-use, created by POST /files/{file_id}/slicer-token. + Filename is at the end of the URL so slicers can detect the file format. + """ + from backend.app.core.auth import verify_slicer_download_token + + if not verify_slicer_download_token(token, "library", file_id): + raise HTTPException(status_code=403, detail="Invalid or expired download token") + + result = await db.execute(select(LibraryFile).where(LibraryFile.id == file_id)) + file = result.scalar_one_or_none() + if not file: + raise HTTPException(status_code=404, detail="File not found") + + abs_path = to_absolute_path(file.file_path) + if not abs_path or not abs_path.exists(): + raise HTTPException(status_code=404, detail="File not found on disk") + + return FastAPIFileResponse( + str(abs_path), + filename=file.filename, + media_type="application/octet-stream", + ) + + @router.get("/files/{file_id}/thumbnail") async def get_thumbnail(file_id: int, db: AsyncSession = Depends(get_db)): """Get a file's thumbnail.""" diff --git a/backend/app/core/auth.py b/backend/app/core/auth.py index 0f1d546a0..a24323b14 100644 --- a/backend/app/core/auth.py +++ b/backend/app/core/auth.py @@ -98,6 +98,43 @@ ACCESS_TOKEN_EXPIRE_MINUTES = 60 * 24 * 7 # 7 days # HTTP Bearer token security = HTTPBearer(auto_error=False) +# --- Slicer download tokens --- +# Short-lived tokens for slicer protocol handlers that can't send auth headers. +# Maps token → (resource_key, expiry). resource_key = "archive:{id}" or "library:{id}". +_slicer_tokens: dict[str, tuple[str, datetime]] = {} +SLICER_TOKEN_EXPIRE_MINUTES = 5 + + +def create_slicer_download_token(resource_type: str, resource_id: int) -> str: + """Create a short-lived download token for slicer protocol handlers.""" + # Cleanup expired tokens + now = datetime.utcnow() + expired = [k for k, (_, exp) in _slicer_tokens.items() if exp < now] + for k in expired: + del _slicer_tokens[k] + + token = secrets.token_urlsafe(24) + resource_key = f"{resource_type}:{resource_id}" + _slicer_tokens[token] = (resource_key, now + timedelta(minutes=SLICER_TOKEN_EXPIRE_MINUTES)) + return token + + +def verify_slicer_download_token(token: str, resource_type: str, resource_id: int) -> bool: + """Verify a slicer download token is valid for the given resource.""" + entry = _slicer_tokens.get(token) + if not entry: + return False + resource_key, expiry = entry + if datetime.utcnow() > expiry: + del _slicer_tokens[token] + return False + expected_key = f"{resource_type}:{resource_id}" + if resource_key != expected_key: + return False + # Token is single-use + del _slicer_tokens[token] + return True + def verify_password(plain_password: str, hashed_password: str) -> bool: """Verify a password against a hash. diff --git a/backend/app/main.py b/backend/app/main.py index 9e395ec87..01513f860 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -3356,6 +3356,10 @@ PUBLIC_API_PATTERNS = [ # Camera (streams loaded via tag) "/camera/stream", # /printers/{id}/camera/stream "/camera/snapshot", # /printers/{id}/camera/snapshot + # Slicer token-authenticated downloads — protocol handlers (bambustudioopen://, + # orcaslicer://) cannot send auth headers. These endpoints validate a short-lived + # download token in the URL path instead. + "/dl/", # /archives/{id}/dl/{token}/{filename}, /library/files/{id}/dl/{token}/{filename} ] diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index 9c95a260a..18f4526a1 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -2786,6 +2786,10 @@ export const api = { }, getSource3mfForSlicer: (archiveId: number, filename: string) => `${API_BASE}/archives/${archiveId}/source/${encodeURIComponent(filename.endsWith('.3mf') ? filename : filename + '.3mf')}`, + createSourceSlicerToken: (archiveId: number) => + request<{ token: string }>(`/archives/${archiveId}/source-slicer-token`, { method: 'POST' }), + getSourceSlicerDownloadUrl: (archiveId: number, token: string, filename: string) => + `${API_BASE}/archives/${archiveId}/source-dl/${token}/${encodeURIComponent(filename.endsWith('.3mf') ? filename : filename + '.3mf')}`, uploadSource3mf: async (archiveId: number, file: File): Promise<{ status: string; filename: string }> => { const formData = new FormData(); formData.append('file', file); @@ -2908,6 +2912,10 @@ export const api = { `${API_BASE}/archives/${archiveId}/project-image/${encodeURIComponent(imagePath)}`, getArchiveForSlicer: (id: number, filename: string) => `${API_BASE}/archives/${id}/file/${encodeURIComponent(filename.endsWith('.3mf') ? filename : filename + '.3mf')}`, + createArchiveSlicerToken: (archiveId: number) => + request<{ token: string }>(`/archives/${archiveId}/slicer-token`, { method: 'POST' }), + getArchiveSlicerDownloadUrl: (archiveId: number, token: string, filename: string) => + `${API_BASE}/archives/${archiveId}/dl/${token}/${encodeURIComponent(filename.endsWith('.3mf') ? filename : filename + '.3mf')}`, getArchivePlates: (archiveId: number) => request(`/archives/${archiveId}/plates`), getArchiveFilamentRequirements: (archiveId: number, plateId?: number) => @@ -3938,6 +3946,10 @@ export const api = { deleteLibraryFile: (id: number) => request<{ status: string; message: string }>(`/library/files/${id}`, { method: 'DELETE' }), getLibraryFileDownloadUrl: (id: number) => `${API_BASE}/library/files/${id}/download`, + createLibrarySlicerToken: (fileId: number) => + request<{ token: string }>(`/library/files/${fileId}/slicer-token`, { method: 'POST' }), + getLibrarySlicerDownloadUrl: (fileId: number, token: string, filename: string) => + `${API_BASE}/library/files/${fileId}/dl/${token}/${encodeURIComponent(filename)}`, downloadLibraryFile: async (id: number, filename?: string): Promise => { const headers: Record = {}; if (authToken) { diff --git a/frontend/src/components/ModelViewerModal.tsx b/frontend/src/components/ModelViewerModal.tsx index 29968331f..95af1a41b 100644 --- a/frontend/src/components/ModelViewerModal.tsx +++ b/frontend/src/components/ModelViewerModal.tsx @@ -263,17 +263,29 @@ export function ModelViewerModal({ archiveId, libraryFileId, title, fileType, on const canOpenInSlicer = isLibrary ? (fileType || '').toLowerCase() === '3mf' : true; - const handleOpenInSlicer = () => { + const handleOpenInSlicer = async () => { if (!canOpenInSlicer) return; - // URL must include .3mf filename for Bambu Studio to recognize the format const filename = title || 'model'; - if (isLibrary) { - const downloadUrl = `${window.location.origin}${api.getLibraryFileDownloadUrl(libraryFileId!)}`; - openInSlicer(downloadUrl, preferredSlicer); - return; + try { + if (isLibrary) { + const { token } = await api.createLibrarySlicerToken(libraryFileId!); + const path = api.getLibrarySlicerDownloadUrl(libraryFileId!, token, filename); + openInSlicer(`${window.location.origin}${path}`, preferredSlicer); + } else { + const { token } = await api.createArchiveSlicerToken(archiveId!); + const path = api.getArchiveSlicerDownloadUrl(archiveId!, token, filename); + openInSlicer(`${window.location.origin}${path}`, preferredSlicer); + } + } catch { + // Fallback to direct URL (works when auth is disabled) + if (isLibrary) { + const downloadUrl = `${window.location.origin}${api.getLibraryFileDownloadUrl(libraryFileId!)}`; + openInSlicer(downloadUrl, preferredSlicer); + } else { + const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archiveId!, filename)}`; + openInSlicer(downloadUrl, preferredSlicer); + } } - const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archiveId!, filename)}`; - openInSlicer(downloadUrl, preferredSlicer); }; return ( diff --git a/frontend/src/pages/ArchivesPage.tsx b/frontend/src/pages/ArchivesPage.tsx index 661720c67..6f2b59d9c 100644 --- a/frontend/src/pages/ArchivesPage.tsx +++ b/frontend/src/pages/ArchivesPage.tsx @@ -105,6 +105,36 @@ function getArchiveFileType(filename: string | null | undefined): string | undef // formatDate imported from '../utils/date' - handles UTC conversion +/** + * Open an archive file in the slicer. + * Fetches a short-lived download token, then builds a token-authenticated URL + * that bypasses auth middleware (slicer protocol handlers can't send auth headers). + */ +async function openInSlicerWithToken( + archiveId: number, + filename: string, + resourceType: 'file' | 'source', + slicer: SlicerType, +): Promise { + try { + if (resourceType === 'source') { + const { token } = await api.createSourceSlicerToken(archiveId); + const path = api.getSourceSlicerDownloadUrl(archiveId, token, filename); + openInSlicer(`${window.location.origin}${path}`, slicer); + } else { + const { token } = await api.createArchiveSlicerToken(archiveId); + const path = api.getArchiveSlicerDownloadUrl(archiveId, token, filename); + openInSlicer(`${window.location.origin}${path}`, slicer); + } + } catch { + // Fallback to direct URL (works when auth is disabled) + const path = resourceType === 'source' + ? api.getSource3mfForSlicer(archiveId, filename) + : api.getArchiveForSlicer(archiveId, filename); + openInSlicer(`${window.location.origin}${path}`, slicer); + } +} + function ArchiveCard({ archive, printerName, @@ -337,8 +367,7 @@ function ArchiveCard({ icon: , onClick: () => { const filename = archive.print_name || archive.filename || 'model'; - const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archive.id, filename)}`; - openInSlicer(downloadUrl, preferredSlicer); + openInSlicerWithToken(archive.id, filename, 'file', preferredSlicer); }, disabled: !archive.file_path, title: !archive.file_path ? t('archives.card.noFileForReprint') : undefined, @@ -349,8 +378,7 @@ function ArchiveCard({ icon: , onClick: () => { const filename = archive.print_name || archive.filename || 'model'; - const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archive.id, filename)}`; - openInSlicer(downloadUrl, preferredSlicer); + openInSlicerWithToken(archive.id, filename, 'file', preferredSlicer); }, }, ]), @@ -738,8 +766,7 @@ function ArchiveCard({ e.stopPropagation(); // Open source 3MF in Bambu Studio - use filename in URL for slicer compatibility const sourceName = (archive.print_name || archive.filename || 'source').replace(/\.gcode\.3mf$/i, '') + '_source'; - const downloadUrl = `${window.location.origin}${api.getSource3mfForSlicer(archive.id, sourceName)}`; - openInSlicer(downloadUrl, preferredSlicer); + openInSlicerWithToken(archive.id, sourceName, 'source', preferredSlicer); }} title={t('archives.card.openSource3mf')} > @@ -1008,8 +1035,7 @@ function ArchiveCard({ className="min-w-0 p-1 sm:p-1.5" onClick={() => { const filename = archive.print_name || archive.filename || 'model'; - const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archive.id, filename)}`; - openInSlicer(downloadUrl, preferredSlicer); + openInSlicerWithToken(archive.id, filename, 'file', preferredSlicer); }} title={t('archives.card.openInBambuStudio')} > @@ -1024,8 +1050,7 @@ function ArchiveCard({ className="flex-1 min-w-0" onClick={() => { const filename = archive.print_name || archive.filename || 'model'; - const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archive.id, filename)}`; - openInSlicer(downloadUrl, preferredSlicer); + openInSlicerWithToken(archive.id, filename, 'file', preferredSlicer); }} title={t('archives.card.openInBambuStudioToSlice')} > @@ -1546,8 +1571,7 @@ function ArchiveListRow({ icon: , onClick: () => { const filename = archive.print_name || archive.filename || 'model'; - const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archive.id, filename)}`; - openInSlicer(downloadUrl, preferredSlicer); + openInSlicerWithToken(archive.id, filename, 'file', preferredSlicer); }, disabled: !archive.file_path, title: !archive.file_path ? t('archives.card.noFileForReprint') : undefined, @@ -1558,8 +1582,7 @@ function ArchiveListRow({ icon: , onClick: () => { const filename = archive.print_name || archive.filename || 'model'; - const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archive.id, filename)}`; - openInSlicer(downloadUrl, preferredSlicer); + openInSlicerWithToken(archive.id, filename, 'file', preferredSlicer); }, }, ]), @@ -1900,8 +1923,7 @@ function ArchiveListRow({ size="sm" onClick={() => { const filename = archive.print_name || archive.filename || 'model'; - const downloadUrl = `${window.location.origin}${api.getArchiveForSlicer(archive.id, filename)}`; - openInSlicer(downloadUrl, preferredSlicer); + openInSlicerWithToken(archive.id, filename, 'file', preferredSlicer); }} title={t('archives.card.openInBambuStudio')} > diff --git a/frontend/src/utils/slicer.ts b/frontend/src/utils/slicer.ts index b6f376fcc..c2f21ebb5 100644 --- a/frontend/src/utils/slicer.ts +++ b/frontend/src/utils/slicer.ts @@ -1,12 +1,23 @@ /** * Utility for opening files in slicer applications * - * Bambu Studio URL protocol is OS-specific: - * - Windows: bambustudio:// - * - macOS/Linux: bambustudioopen:// + * Protocol handler URL formats (from BambuStudio/OrcaSlicer source code): * - * OrcaSlicer uses the same protocol on all platforms: - * - orcaslicer://open?file= + * Bambu Studio has TWO separate URL handlers: + * 1. post_init() [Windows/Linux CLI args]: bambustudio://open?file= + * - Checks: starts_with("bambustudio://open") + * - Calls url_decode(), then split_str(url, "file=") + * 2. MacOpenURL() [macOS Apple Events]: bambustudioopen:// + * - Checks: starts_with("bambustudioopen://") + * - Strips prefix, then url_decode() + * + * OrcaSlicer Downloader accepts both formats via regex: + * - (orcaslicer|bambustudio|...)://open?file= + * - bambustudioopen:// + * + * Key insight: Using ?file= query format, the browser's URL parser preserves + * http:// in the query string without any encoding. Only the macOS-specific + * bambustudioopen:// format needs encodeURIComponent (BS calls url_decode). */ export type SlicerType = 'bambu_studio' | 'orcaslicer'; @@ -34,8 +45,6 @@ export function detectPlatform(): Platform { /** * Open a URL in the specified slicer application. - * Uses a temporary link element to trigger the protocol handler, - * which avoids browser "unknown protocol" blocks on window.location.href. * @param downloadUrl - The URL to the file to open * @param slicer - Which slicer to use (defaults to bambu_studio) */ @@ -43,15 +52,26 @@ export function openInSlicer(downloadUrl: string, slicer: SlicerType = 'bambu_st let url: string; if (slicer === 'orcaslicer') { + // OrcaSlicer: ?file= query format — http:// preserved in query string url = `orcaslicer://open?file=${downloadUrl}`; } else { const platform = detectPlatform(); - const protocol = platform === 'windows' ? 'bambustudio' : 'bambustudioopen'; - url = `${protocol}://${encodeURIComponent(downloadUrl)}`; + if (platform === 'macos') { + // macOS only: bambustudioopen scheme via MacOpenURL() callback. + // Must encode because bare http:// in authority gets mangled by browser. + // BS calls url_decode() after stripping "bambustudioopen://" prefix. + url = `bambustudioopen://${encodeURIComponent(downloadUrl)}`; + } else { + // Windows/Linux: bambustudio://open?file= via post_init() CLI args. + // The ?file= query format preserves http:// without encoding. + // IMPORTANT: On Linux, BS only handles "bambustudio://open" prefix — + // it does NOT process "bambustudioopen://" (that's macOS-only). + url = `bambustudio://open?file=${downloadUrl}`; + } } // Use a temporary element to trigger the protocol handler. - // This works more reliably than window.location.href for custom protocols. + // This avoids navigating away from the page (unlike window.location.href). const link = document.createElement('a'); link.href = url; link.style.display = 'none'; diff --git a/static/assets/index-BLcYYvbZ.js b/static/assets/index-BPE9r2Ne.js similarity index 67% rename from static/assets/index-BLcYYvbZ.js rename to static/assets/index-BPE9r2Ne.js index b6f3945b1..669cc55f9 100644 --- a/static/assets/index-BLcYYvbZ.js +++ b/static/assets/index-BPE9r2Ne.js @@ -1,18 +1,18 @@ -function Doe(t,e){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();var l_=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ec(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var zT={exports:{}},ry={};var GU;function Roe(){if(GU)return ry;GU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var l in i)l!=="key"&&(s[l]=i[l])}else s=i;return i=s.ref,{$$typeof:t,type:r,key:o,ref:i!==void 0?i:null,props:s}}return ry.Fragment=e,ry.jsx=n,ry.jsxs=n,ry}var qU;function Foe(){return qU||(qU=1,zT.exports=Roe()),zT.exports}var a=Foe(),UT={exports:{}},kn={};var WU;function Loe(){if(WU)return kn;WU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),o=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),f=Symbol.iterator;function p($){return $===null||typeof $!="object"?null:($=f&&$[f]||$["@@iterator"],typeof $=="function"?$:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},y=Object.assign,b={};function v($,X,ee){this.props=$,this.context=X,this.refs=b,this.updater=ee||x}v.prototype.isReactComponent={},v.prototype.setState=function($,X){if(typeof $!="object"&&typeof $!="function"&&$!=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,$,X,"setState")},v.prototype.forceUpdate=function($){this.updater.enqueueForceUpdate(this,$,"forceUpdate")};function S(){}S.prototype=v.prototype;function N($,X,ee){this.props=$,this.context=X,this.refs=b,this.updater=ee||x}var A=N.prototype=new S;A.constructor=N,y(A,v.prototype),A.isPureReactComponent=!0;var C=Array.isArray;function T(){}var k={H:null,A:null,T:null,S:null},j=Object.prototype.hasOwnProperty;function E($,X,ee){var J=ee.ref;return{$$typeof:t,type:$,key:X,ref:J!==void 0?J:null,props:ee}}function P($,X){return E($.type,X,$.props)}function U($){return typeof $=="object"&&$!==null&&$.$$typeof===t}function O($){var X={"=":"=0",":":"=2"};return"$"+$.replace(/[=:]/g,function(ee){return X[ee]})}var B=/\/+/g;function R($,X){return typeof $=="object"&&$!==null&&$.key!=null?O(""+$.key):X.toString(36)}function G($){switch($.status){case"fulfilled":return $.value;case"rejected":throw $.reason;default:switch(typeof $.status=="string"?$.then(T,T):($.status="pending",$.then(function(X){$.status==="pending"&&($.status="fulfilled",$.value=X)},function(X){$.status==="pending"&&($.status="rejected",$.reason=X)})),$.status){case"fulfilled":return $.value;case"rejected":throw $.reason}}throw $}function q($,X,ee,J,_e){var pe=typeof $;(pe==="undefined"||pe==="boolean")&&($=null);var me=!1;if($===null)me=!0;else switch(pe){case"bigint":case"string":case"number":me=!0;break;case"object":switch($.$$typeof){case t:case e:me=!0;break;case d:return me=$._init,q(me($._payload),X,ee,J,_e)}}if(me)return _e=_e($),me=J===""?"."+R($,0):J,C(_e)?(ee="",me!=null&&(ee=me.replace(B,"$&/")+"/"),q(_e,X,ee,"",function(ce){return ce})):_e!=null&&(U(_e)&&(_e=P(_e,ee+(_e.key==null||$&&$.key===_e.key?"":(""+_e.key).replace(B,"$&/")+"/")+me)),X.push(_e)),1;me=0;var je=J===""?".":J+":";if(C($))for(var de=0;de<$.length;de++)J=$[de],pe=je+R(J,de),me+=q(J,X,ee,pe,_e);else if(de=p($),typeof de=="function")for($=de.call($),de=0;!(J=$.next()).done;)J=J.value,pe=je+R(J,de++),me+=q(J,X,ee,pe,_e);else if(pe==="object"){if(typeof $.then=="function")return q(G($),X,ee,J,_e);throw X=String($),Error("Objects are not valid as a React child (found: "+(X==="[object Object]"?"object with keys {"+Object.keys($).join(", ")+"}":X)+"). If you meant to render a collection of children, use an array instead.")}return me}function z($,X,ee){if($==null)return $;var J=[],_e=0;return q($,J,"","",function(pe){return X.call(ee,pe,_e++)}),J}function K($){if($._status===-1){var X=$._result;X=X(),X.then(function(ee){($._status===0||$._status===-1)&&($._status=1,$._result=ee)},function(ee){($._status===0||$._status===-1)&&($._status=2,$._result=ee)}),$._status===-1&&($._status=0,$._result=X)}if($._status===1)return $._result.default;throw $._result}var Y=typeof reportError=="function"?reportError:function($){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var X=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof $=="object"&&$!==null&&typeof $.message=="string"?String($.message):String($),error:$});if(!window.dispatchEvent(X))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",$);return}console.error($)},oe={map:z,forEach:function($,X,ee){z($,function(){X.apply(this,arguments)},ee)},count:function($){var X=0;return z($,function(){X++}),X},toArray:function($){return z($,function(X){return X})||[]},only:function($){if(!U($))throw Error("React.Children.only expected to receive a single React element child.");return $}};return kn.Activity=h,kn.Children=oe,kn.Component=v,kn.Fragment=n,kn.Profiler=i,kn.PureComponent=N,kn.StrictMode=r,kn.Suspense=c,kn.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=k,kn.__COMPILER_RUNTIME={__proto__:null,c:function($){return k.H.useMemoCache($)}},kn.cache=function($){return function(){return $.apply(null,arguments)}},kn.cacheSignal=function(){return null},kn.cloneElement=function($,X,ee){if($==null)throw Error("The argument must be a React element, but you passed "+$+".");var J=y({},$.props),_e=$.key;if(X!=null)for(pe in X.key!==void 0&&(_e=""+X.key),X)!j.call(X,pe)||pe==="key"||pe==="__self"||pe==="__source"||pe==="ref"&&X.ref===void 0||(J[pe]=X[pe]);var pe=arguments.length-2;if(pe===1)J.children=ee;else if(1>>1,oe=q[Y];if(0>>1;Y<$;){var X=2*(Y+1)-1,ee=q[X],J=X+1,_e=q[J];if(0>i(ee,K))Ji(_e,ee)?(q[Y]=_e,q[J]=K,Y=J):(q[Y]=ee,q[X]=K,Y=X);else if(Ji(_e,K))q[Y]=_e,q[J]=K,Y=J;else break e}}return z}function i(q,z){var K=q.sortIndex-z.sortIndex;return K!==0?K:q.id-z.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var o=Date,l=o.now();t.unstable_now=function(){return o.now()-l}}var c=[],u=[],d=1,h=null,f=3,p=!1,x=!1,y=!1,b=!1,v=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,N=typeof setImmediate<"u"?setImmediate:null;function A(q){for(var z=n(u);z!==null;){if(z.callback===null)r(u);else if(z.startTime<=q)r(u),z.sortIndex=z.expirationTime,e(c,z);else break;z=n(u)}}function C(q){if(y=!1,A(q),!x)if(n(c)!==null)x=!0,T||(T=!0,O());else{var z=n(u);z!==null&&G(C,z.startTime-q)}}var T=!1,k=-1,j=5,E=-1;function P(){return b?!0:!(t.unstable_now()-Eq&&P());){var Y=h.callback;if(typeof Y=="function"){h.callback=null,f=h.priorityLevel;var oe=Y(h.expirationTime<=q);if(q=t.unstable_now(),typeof oe=="function"){h.callback=oe,A(q),z=!0;break t}h===n(c)&&r(c),A(q)}else r(c);h=n(c)}if(h!==null)z=!0;else{var $=n(u);$!==null&&G(C,$.startTime-q),z=!1}}break e}finally{h=null,f=K,p=!1}z=void 0}}finally{z?O():T=!1}}}var O;if(typeof N=="function")O=function(){N(U)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,R=B.port2;B.port1.onmessage=U,O=function(){R.postMessage(null)}}else O=function(){v(U,0)};function G(q,z){k=v(function(){q(t.unstable_now())},z)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(q){q.callback=null},t.unstable_forceFrameRate=function(q){0>q||125Y?(q.sortIndex=K,e(u,q),n(c)===null&&q===n(u)&&(y?(S(k),k=-1):y=!0,G(C,K-Y))):(q.sortIndex=oe,e(c,q),x||p||(x=!0,T||(T=!0,O()))),q},t.unstable_shouldYield=P,t.unstable_wrapCallback=function(q){var z=f;return function(){var K=f;f=z;try{return q.apply(this,arguments)}finally{f=K}}}})($T)),$T}var YU;function zoe(){return YU||(YU=1,HT.exports=Ioe()),HT.exports}var VT={exports:{}},ss={};var QU;function Uoe(){if(QU)return ss;QU=1;var t=Bb();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),VT.exports=Uoe(),VT.exports}var JU;function Boe(){if(JU)return iy;JU=1;var t=zoe(),e=Bb(),n=bK();function r(m){var g="https://react.dev/errors/"+m;if(1oe||(m.current=Y[oe],Y[oe]=null,oe--)}function ee(m,g){oe++,Y[oe]=m.current,m.current=g}var J=$(null),_e=$(null),pe=$(null),me=$(null);function je(m,g){switch(ee(pe,g),ee(_e,m),ee(J,null),g.nodeType){case 9:case 11:m=(m=g.documentElement)&&(m=m.namespaceURI)?fU(m):0;break;default:if(m=g.tagName,g=g.namespaceURI)g=fU(g),m=pU(g,m);else switch(m){case"svg":m=1;break;case"math":m=2;break;default:m=0}}X(J),ee(J,m)}function de(){X(J),X(_e),X(pe)}function ce(m){m.memoizedState!==null&&ee(me,m);var g=J.current,_=pU(g,m.type);g!==_&&(ee(_e,m),ee(J,_))}function Se(m){_e.current===m&&(X(J),X(_e)),me.current===m&&(X(me),Jx._currentValue=K)}var ie,Fe;function V(m){if(ie===void 0)try{throw Error()}catch(_){var g=_.stack.trim().match(/\n( *(at )?)/);ie=g&&g[1]||"",Fe=-1<_.stack.indexOf(` +function Roe(t,e){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();var c_=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ec(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var UT={exports:{}},iy={};var qU;function Foe(){if(qU)return iy;qU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var l in i)l!=="key"&&(s[l]=i[l])}else s=i;return i=s.ref,{$$typeof:t,type:r,key:o,ref:i!==void 0?i:null,props:s}}return iy.Fragment=e,iy.jsx=n,iy.jsxs=n,iy}var WU;function Loe(){return WU||(WU=1,UT.exports=Foe()),UT.exports}var a=Loe(),BT={exports:{}},kn={};var KU;function Ooe(){if(KU)return kn;KU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),o=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),f=Symbol.iterator;function p($){return $===null||typeof $!="object"?null:($=f&&$[f]||$["@@iterator"],typeof $=="function"?$:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},y=Object.assign,b={};function v($,X,ee){this.props=$,this.context=X,this.refs=b,this.updater=ee||x}v.prototype.isReactComponent={},v.prototype.setState=function($,X){if(typeof $!="object"&&typeof $!="function"&&$!=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,$,X,"setState")},v.prototype.forceUpdate=function($){this.updater.enqueueForceUpdate(this,$,"forceUpdate")};function S(){}S.prototype=v.prototype;function N($,X,ee){this.props=$,this.context=X,this.refs=b,this.updater=ee||x}var A=N.prototype=new S;A.constructor=N,y(A,v.prototype),A.isPureReactComponent=!0;var C=Array.isArray;function T(){}var k={H:null,A:null,T:null,S:null},j=Object.prototype.hasOwnProperty;function E($,X,ee){var J=ee.ref;return{$$typeof:t,type:$,key:X,ref:J!==void 0?J:null,props:ee}}function P($,X){return E($.type,X,$.props)}function U($){return typeof $=="object"&&$!==null&&$.$$typeof===t}function O($){var X={"=":"=0",":":"=2"};return"$"+$.replace(/[=:]/g,function(ee){return X[ee]})}var B=/\/+/g;function R($,X){return typeof $=="object"&&$!==null&&$.key!=null?O(""+$.key):X.toString(36)}function G($){switch($.status){case"fulfilled":return $.value;case"rejected":throw $.reason;default:switch(typeof $.status=="string"?$.then(T,T):($.status="pending",$.then(function(X){$.status==="pending"&&($.status="fulfilled",$.value=X)},function(X){$.status==="pending"&&($.status="rejected",$.reason=X)})),$.status){case"fulfilled":return $.value;case"rejected":throw $.reason}}throw $}function q($,X,ee,J,_e){var pe=typeof $;(pe==="undefined"||pe==="boolean")&&($=null);var he=!1;if($===null)he=!0;else switch(pe){case"bigint":case"string":case"number":he=!0;break;case"object":switch($.$$typeof){case t:case e:he=!0;break;case d:return he=$._init,q(he($._payload),X,ee,J,_e)}}if(he)return _e=_e($),he=J===""?"."+R($,0):J,C(_e)?(ee="",he!=null&&(ee=he.replace(B,"$&/")+"/"),q(_e,X,ee,"",function(ce){return ce})):_e!=null&&(U(_e)&&(_e=P(_e,ee+(_e.key==null||$&&$.key===_e.key?"":(""+_e.key).replace(B,"$&/")+"/")+he)),X.push(_e)),1;he=0;var je=J===""?".":J+":";if(C($))for(var de=0;de<$.length;de++)J=$[de],pe=je+R(J,de),he+=q(J,X,ee,pe,_e);else if(de=p($),typeof de=="function")for($=de.call($),de=0;!(J=$.next()).done;)J=J.value,pe=je+R(J,de++),he+=q(J,X,ee,pe,_e);else if(pe==="object"){if(typeof $.then=="function")return q(G($),X,ee,J,_e);throw X=String($),Error("Objects are not valid as a React child (found: "+(X==="[object Object]"?"object with keys {"+Object.keys($).join(", ")+"}":X)+"). If you meant to render a collection of children, use an array instead.")}return he}function z($,X,ee){if($==null)return $;var J=[],_e=0;return q($,J,"","",function(pe){return X.call(ee,pe,_e++)}),J}function K($){if($._status===-1){var X=$._result;X=X(),X.then(function(ee){($._status===0||$._status===-1)&&($._status=1,$._result=ee)},function(ee){($._status===0||$._status===-1)&&($._status=2,$._result=ee)}),$._status===-1&&($._status=0,$._result=X)}if($._status===1)return $._result.default;throw $._result}var Y=typeof reportError=="function"?reportError:function($){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var X=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof $=="object"&&$!==null&&typeof $.message=="string"?String($.message):String($),error:$});if(!window.dispatchEvent(X))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",$);return}console.error($)},oe={map:z,forEach:function($,X,ee){z($,function(){X.apply(this,arguments)},ee)},count:function($){var X=0;return z($,function(){X++}),X},toArray:function($){return z($,function(X){return X})||[]},only:function($){if(!U($))throw Error("React.Children.only expected to receive a single React element child.");return $}};return kn.Activity=h,kn.Children=oe,kn.Component=v,kn.Fragment=n,kn.Profiler=i,kn.PureComponent=N,kn.StrictMode=r,kn.Suspense=c,kn.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=k,kn.__COMPILER_RUNTIME={__proto__:null,c:function($){return k.H.useMemoCache($)}},kn.cache=function($){return function(){return $.apply(null,arguments)}},kn.cacheSignal=function(){return null},kn.cloneElement=function($,X,ee){if($==null)throw Error("The argument must be a React element, but you passed "+$+".");var J=y({},$.props),_e=$.key;if(X!=null)for(pe in X.key!==void 0&&(_e=""+X.key),X)!j.call(X,pe)||pe==="key"||pe==="__self"||pe==="__source"||pe==="ref"&&X.ref===void 0||(J[pe]=X[pe]);var pe=arguments.length-2;if(pe===1)J.children=ee;else if(1>>1,oe=q[Y];if(0>>1;Y<$;){var X=2*(Y+1)-1,ee=q[X],J=X+1,_e=q[J];if(0>i(ee,K))Ji(_e,ee)?(q[Y]=_e,q[J]=K,Y=J):(q[Y]=ee,q[X]=K,Y=X);else if(Ji(_e,K))q[Y]=_e,q[J]=K,Y=J;else break e}}return z}function i(q,z){var K=q.sortIndex-z.sortIndex;return K!==0?K:q.id-z.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var o=Date,l=o.now();t.unstable_now=function(){return o.now()-l}}var c=[],u=[],d=1,h=null,f=3,p=!1,x=!1,y=!1,b=!1,v=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,N=typeof setImmediate<"u"?setImmediate:null;function A(q){for(var z=n(u);z!==null;){if(z.callback===null)r(u);else if(z.startTime<=q)r(u),z.sortIndex=z.expirationTime,e(c,z);else break;z=n(u)}}function C(q){if(y=!1,A(q),!x)if(n(c)!==null)x=!0,T||(T=!0,O());else{var z=n(u);z!==null&&G(C,z.startTime-q)}}var T=!1,k=-1,j=5,E=-1;function P(){return b?!0:!(t.unstable_now()-Eq&&P());){var Y=h.callback;if(typeof Y=="function"){h.callback=null,f=h.priorityLevel;var oe=Y(h.expirationTime<=q);if(q=t.unstable_now(),typeof oe=="function"){h.callback=oe,A(q),z=!0;break t}h===n(c)&&r(c),A(q)}else r(c);h=n(c)}if(h!==null)z=!0;else{var $=n(u);$!==null&&G(C,$.startTime-q),z=!1}}break e}finally{h=null,f=K,p=!1}z=void 0}}finally{z?O():T=!1}}}var O;if(typeof N=="function")O=function(){N(U)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,R=B.port2;B.port1.onmessage=U,O=function(){R.postMessage(null)}}else O=function(){v(U,0)};function G(q,z){k=v(function(){q(t.unstable_now())},z)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(q){q.callback=null},t.unstable_forceFrameRate=function(q){0>q||125Y?(q.sortIndex=K,e(u,q),n(c)===null&&q===n(u)&&(y?(S(k),k=-1):y=!0,G(C,K-Y))):(q.sortIndex=oe,e(c,q),x||p||(x=!0,T||(T=!0,O()))),q},t.unstable_shouldYield=P,t.unstable_wrapCallback=function(q){var z=f;return function(){var K=f;f=z;try{return q.apply(this,arguments)}finally{f=K}}}})(VT)),VT}var QU;function Uoe(){return QU||(QU=1,$T.exports=zoe()),$T.exports}var GT={exports:{}},ss={};var ZU;function Boe(){if(ZU)return ss;ZU=1;var t=Hb();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),GT.exports=Boe(),GT.exports}var eB;function Hoe(){if(eB)return ay;eB=1;var t=Uoe(),e=Hb(),n=xK();function r(m){var g="https://react.dev/errors/"+m;if(1oe||(m.current=Y[oe],Y[oe]=null,oe--)}function ee(m,g){oe++,Y[oe]=m.current,m.current=g}var J=$(null),_e=$(null),pe=$(null),he=$(null);function je(m,g){switch(ee(pe,g),ee(_e,m),ee(J,null),g.nodeType){case 9:case 11:m=(m=g.documentElement)&&(m=m.namespaceURI)?pU(m):0;break;default:if(m=g.tagName,g=g.namespaceURI)g=pU(g),m=gU(g,m);else switch(m){case"svg":m=1;break;case"math":m=2;break;default:m=0}}X(J),ee(J,m)}function de(){X(J),X(_e),X(pe)}function ce(m){m.memoizedState!==null&&ee(he,m);var g=J.current,_=gU(g,m.type);g!==_&&(ee(_e,m),ee(J,_))}function Se(m){_e.current===m&&(X(J),X(_e)),he.current===m&&(X(he),ey._currentValue=K)}var ie,Fe;function V(m){if(ie===void 0)try{throw Error()}catch(_){var g=_.stack.trim().match(/\n( *(at )?)/);ie=g&&g[1]||"",Fe=-1<_.stack.indexOf(` at`)?" ()":-1<_.stack.indexOf("@")?"@unknown:0:0":""}return` `+ie+m+Fe}var W=!1;function ue(m,g){if(!m||W)return"";W=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var M={DetermineComponentFrameRoot:function(){try{if(g){var Ct=function(){throw Error()};if(Object.defineProperty(Ct.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(Ct,[])}catch(gt){var mt=gt}Reflect.construct(m,[],Ct)}else{try{Ct.call()}catch(gt){mt=gt}m.call(Ct.prototype)}}else{try{throw Error()}catch(gt){mt=gt}(Ct=m())&&typeof Ct.catch=="function"&&Ct.catch(function(){})}}catch(gt){if(gt&&mt&&typeof gt.stack=="string")return[gt.stack,mt.stack]}return[null,null]}};M.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var F=Object.getOwnPropertyDescriptor(M.DetermineComponentFrameRoot,"name");F&&F.configurable&&Object.defineProperty(M.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var I=M.DetermineComponentFrameRoot(),te=I[0],ke=I[1];if(te&&ke){var Be=te.split(` `),ht=ke.split(` `);for(F=M=0;MF||Be[M]!==ht[F]){var yt=` `+Be[M].replace(" at new "," at ");return m.displayName&&yt.includes("")&&(yt=yt.replace("",m.displayName)),yt}while(1<=M&&0<=F);break}}}finally{W=!1,Error.prepareStackTrace=_}return(_=m?m.displayName||m.name:"")?V(_):""}function Q(m,g){switch(m.tag){case 26:case 27:case 5:return V(m.type);case 16:return V("Lazy");case 13:return m.child!==g&&g!==null?V("Suspense Fallback"):V("Suspense");case 19:return V("SuspenseList");case 0:case 15:return ue(m.type,!1);case 11:return ue(m.type.render,!1);case 1:return ue(m.type,!0);case 31:return V("Activity");default:return""}}function se(m){try{var g="",_=null;do g+=Q(m,_),_=m,m=m.return;while(m);return g}catch(M){return` Error generating stack: `+M.message+` -`+M.stack}}var Z=Object.prototype.hasOwnProperty,Ne=t.unstable_scheduleCallback,ve=t.unstable_cancelCallback,fe=t.unstable_shouldYield,L=t.unstable_requestPaint,D=t.unstable_now,H=t.unstable_getCurrentPriorityLevel,he=t.unstable_ImmediatePriority,xe=t.unstable_UserBlockingPriority,be=t.unstable_NormalPriority,Ue=t.unstable_LowPriority,Oe=t.unstable_IdlePriority,Qe=t.log,rt=t.unstable_setDisableYieldValue,we=null,ye=null;function le(m){if(typeof Qe=="function"&&rt(m),ye&&typeof ye.setStrictMode=="function")try{ye.setStrictMode(we,m)}catch{}}var Le=Math.clz32?Math.clz32:Ae,Me=Math.log,$e=Math.LN2;function Ae(m){return m>>>=0,m===0?32:31-(Me(m)/$e|0)|0}var Je=256,Pe=262144,Xe=4194304;function De(m){var g=m&42;if(g!==0)return g;switch(m&-m){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 m&261888;case 262144:case 524288:case 1048576:case 2097152:return m&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return m&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return m}}function Re(m,g,_){var M=m.pendingLanes;if(M===0)return 0;var F=0,I=m.suspendedLanes,te=m.pingedLanes;m=m.warmLanes;var ke=M&134217727;return ke!==0?(M=ke&~I,M!==0?F=De(M):(te&=ke,te!==0?F=De(te):_||(_=ke&~m,_!==0&&(F=De(_))))):(ke=M&~I,ke!==0?F=De(ke):te!==0?F=De(te):_||(_=M&~m,_!==0&&(F=De(_)))),F===0?0:g!==0&&g!==F&&(g&I)===0&&(I=F&-F,_=g&-g,I>=_||I===32&&(_&4194048)!==0)?g:F}function qe(m,g){return(m.pendingLanes&~(m.suspendedLanes&~m.pingedLanes)&g)===0}function pt(m,g){switch(m){case 1:case 2:case 4:case 8:case 64:return g+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 g+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 At(){var m=Xe;return Xe<<=1,(Xe&62914560)===0&&(Xe=4194304),m}function Rt(m){for(var g=[],_=0;31>_;_++)g.push(m);return g}function Wt(m,g){m.pendingLanes|=g,g!==268435456&&(m.suspendedLanes=0,m.pingedLanes=0,m.warmLanes=0)}function Tt(m,g,_,M,F,I){var te=m.pendingLanes;m.pendingLanes=_,m.suspendedLanes=0,m.pingedLanes=0,m.warmLanes=0,m.expiredLanes&=_,m.entangledLanes&=_,m.errorRecoveryDisabledLanes&=_,m.shellSuspendCounter=0;var ke=m.entanglements,Be=m.expirationTimes,ht=m.hiddenUpdates;for(_=te&~_;0<_;){var yt=31-Le(_),Ct=1<"u")return null;try{return m.activeElement||m.body}catch{return m.body}}var Qr=/[\n"\\]/g;function gn(m){return m.replace(Qr,function(g){return"\\"+g.charCodeAt(0).toString(16)+" "})}function Zr(m,g,_,M,F,I,te,ke){m.name="",te!=null&&typeof te!="function"&&typeof te!="symbol"&&typeof te!="boolean"?m.type=te:m.removeAttribute("type"),g!=null?te==="number"?(g===0&&m.value===""||m.value!=g)&&(m.value=""+Mn(g)):m.value!==""+Mn(g)&&(m.value=""+Mn(g)):te!=="submit"&&te!=="reset"||m.removeAttribute("value"),g!=null?vi(m,te,Mn(g)):_!=null?vi(m,te,Mn(_)):M!=null&&m.removeAttribute("value"),F==null&&I!=null&&(m.defaultChecked=!!I),F!=null&&(m.checked=F&&typeof F!="function"&&typeof F!="symbol"),ke!=null&&typeof ke!="function"&&typeof ke!="symbol"&&typeof ke!="boolean"?m.name=""+Mn(ke):m.removeAttribute("name")}function Kn(m,g,_,M,F,I,te,ke){if(I!=null&&typeof I!="function"&&typeof I!="symbol"&&typeof I!="boolean"&&(m.type=I),g!=null||_!=null){if(!(I!=="submit"&&I!=="reset"||g!=null)){sn(m);return}_=_!=null?""+Mn(_):"",g=g!=null?""+Mn(g):_,ke||g===m.value||(m.value=g),m.defaultValue=g}M=M??F,M=typeof M!="function"&&typeof M!="symbol"&&!!M,m.checked=ke?m.checked:!!M,m.defaultChecked=!!M,te!=null&&typeof te!="function"&&typeof te!="symbol"&&typeof te!="boolean"&&(m.name=te),sn(m)}function vi(m,g,_){g==="number"&&Mr(m.ownerDocument)===m||m.defaultValue===""+_||(m.defaultValue=""+_)}function mi(m,g,_,M){if(m=m.options,g){g={};for(var F=0;F<_.length;F++)g["$"+_[F]]=!0;for(_=0;_"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),vr=!1;if(Ur)try{var Cl={};Object.defineProperty(Cl,"passive",{get:function(){vr=!0}}),window.addEventListener("test",Cl,Cl),window.removeEventListener("test",Cl,Cl)}catch{vr=!1}var Ma=null,oa=null,ic=null;function Br(){if(ic)return ic;var m,g=oa,_=g.length,M,F="value"in Ma?Ma.value:Ma.textContent,I=F.length;for(m=0;m<_&&g[m]===F[m];m++);var te=_-m;for(M=1;M<=te&&g[_-M]===F[I-M];M++);return ic=F.slice(m,1=vx),wI=" ",_I=!1;function SI(m,g){switch(m){case"keyup":return tse.indexOf(g.keyCode)!==-1;case"keydown":return g.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function NI(m){return m=m.detail,typeof m=="object"&&"data"in m?m.data:null}var fp=!1;function rse(m,g){switch(m){case"compositionend":return NI(g);case"keypress":return g.which!==32?null:(_I=!0,wI);case"textInput":return m=g.data,m===wI&&_I?null:m;default:return null}}function ise(m,g){if(fp)return m==="compositionend"||!GM&&SI(m,g)?(m=Br(),ic=oa=Ma=null,fp=!1,m):null;switch(m){case"paste":return null;case"keypress":if(!(g.ctrlKey||g.altKey||g.metaKey)||g.ctrlKey&&g.altKey){if(g.char&&1=g)return{node:_,offset:g-m};m=M}e:{for(;_;){if(_.nextSibling){_=_.nextSibling;break e}_=_.parentNode}_=void 0}_=jI(_)}}function RI(m,g){return m&&g?m===g?!0:m&&m.nodeType===3?!1:g&&g.nodeType===3?RI(m,g.parentNode):"contains"in m?m.contains(g):m.compareDocumentPosition?!!(m.compareDocumentPosition(g)&16):!1:!1}function FI(m){m=m!=null&&m.ownerDocument!=null&&m.ownerDocument.defaultView!=null?m.ownerDocument.defaultView:window;for(var g=Mr(m.document);g instanceof m.HTMLIFrameElement;){try{var _=typeof g.contentWindow.location.href=="string"}catch{_=!1}if(_)m=g.contentWindow;else break;g=Mr(m.document)}return g}function KM(m){var g=m&&m.nodeName&&m.nodeName.toLowerCase();return g&&(g==="input"&&(m.type==="text"||m.type==="search"||m.type==="tel"||m.type==="url"||m.type==="password")||g==="textarea"||m.contentEditable==="true")}var hse=Ur&&"documentMode"in document&&11>=document.documentMode,pp=null,XM=null,Nx=null,YM=!1;function LI(m,g,_){var M=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;YM||pp==null||pp!==Mr(M)||(M=pp,"selectionStart"in M&&KM(M)?M={start:M.selectionStart,end:M.selectionEnd}:(M=(M.ownerDocument&&M.ownerDocument.defaultView||window).getSelection(),M={anchorNode:M.anchorNode,anchorOffset:M.anchorOffset,focusNode:M.focusNode,focusOffset:M.focusOffset}),Nx&&Sx(Nx,M)||(Nx=M,M=Ww(XM,"onSelect"),0>=te,F-=te,ac=1<<32-Le(g)+F|_<Rn?(tr=en,en=null):tr=en.sibling;var dr=mt(nt,en,ut[Rn],St);if(dr===null){en===null&&(en=tr);break}m&&en&&dr.alternate===null&&g(nt,en),We=I(dr,We,Rn),ur===null?an=dr:ur.sibling=dr,ur=dr,en=tr}if(Rn===ut.length)return _(nt,en),rr&&Zc(nt,Rn),an;if(en===null){for(;RnRn?(tr=en,en=null):tr=en.sibling;var Vd=mt(nt,en,dr.value,St);if(Vd===null){en===null&&(en=tr);break}m&&en&&Vd.alternate===null&&g(nt,en),We=I(Vd,We,Rn),ur===null?an=Vd:ur.sibling=Vd,ur=Vd,en=tr}if(dr.done)return _(nt,en),rr&&Zc(nt,Rn),an;if(en===null){for(;!dr.done;Rn++,dr=ut.next())dr=Ct(nt,dr.value,St),dr!==null&&(We=I(dr,We,Rn),ur===null?an=dr:ur.sibling=dr,ur=dr);return rr&&Zc(nt,Rn),an}for(en=M(en);!dr.done;Rn++,dr=ut.next())dr=gt(en,nt,Rn,dr.value,St),dr!==null&&(m&&dr.alternate!==null&&en.delete(dr.key===null?Rn:dr.key),We=I(dr,We,Rn),ur===null?an=dr:ur.sibling=dr,ur=dr);return m&&en.forEach(function(joe){return g(nt,joe)}),rr&&Zc(nt,Rn),an}function Er(nt,We,ut,St){if(typeof ut=="object"&&ut!==null&&ut.type===y&&ut.key===null&&(ut=ut.props.children),typeof ut=="object"&&ut!==null){switch(ut.$$typeof){case p:e:{for(var an=ut.key;We!==null;){if(We.key===an){if(an=ut.type,an===y){if(We.tag===7){_(nt,We.sibling),St=F(We,ut.props.children),St.return=nt,nt=St;break e}}else if(We.elementType===an||typeof an=="object"&&an!==null&&an.$$typeof===j&&Nm(an)===We.type){_(nt,We.sibling),St=F(We,ut.props),Ex(St,ut),St.return=nt,nt=St;break e}_(nt,We);break}else g(nt,We);We=We.sibling}ut.type===y?(St=ym(ut.props.children,nt.mode,St,ut.key),St.return=nt,nt=St):(St=uw(ut.type,ut.key,ut.props,null,nt.mode,St),Ex(St,ut),St.return=nt,nt=St)}return te(nt);case x:e:{for(an=ut.key;We!==null;){if(We.key===an)if(We.tag===4&&We.stateNode.containerInfo===ut.containerInfo&&We.stateNode.implementation===ut.implementation){_(nt,We.sibling),St=F(We,ut.children||[]),St.return=nt,nt=St;break e}else{_(nt,We);break}else g(nt,We);We=We.sibling}St=rA(ut,nt.mode,St),St.return=nt,nt=St}return te(nt);case j:return ut=Nm(ut),Er(nt,We,ut,St)}if(G(ut))return Qt(nt,We,ut,St);if(O(ut)){if(an=O(ut),typeof an!="function")throw Error(r(150));return ut=an.call(ut),mn(nt,We,ut,St)}if(typeof ut.then=="function")return Er(nt,We,bw(ut),St);if(ut.$$typeof===N)return Er(nt,We,mw(nt,ut),St);xw(nt,ut)}return typeof ut=="string"&&ut!==""||typeof ut=="number"||typeof ut=="bigint"?(ut=""+ut,We!==null&&We.tag===6?(_(nt,We.sibling),St=F(We,ut),St.return=nt,nt=St):(_(nt,We),St=nA(ut,nt.mode,St),St.return=nt,nt=St),te(nt)):_(nt,We)}return function(nt,We,ut,St){try{Tx=0;var an=Er(nt,We,ut,St);return Cp=null,an}catch(en){if(en===kp||en===pw)throw en;var ur=fo(29,en,null,nt.mode);return ur.lanes=St,ur.return=nt,ur}}}var Cm=a5(!0),s5=a5(!1),Md=!1;function pA(m){m.updateQueue={baseState:m.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function gA(m,g){m=m.updateQueue,g.updateQueue===m&&(g.updateQueue={baseState:m.baseState,firstBaseUpdate:m.firstBaseUpdate,lastBaseUpdate:m.lastBaseUpdate,shared:m.shared,callbacks:null})}function Ad(m){return{lane:m,tag:0,payload:null,callback:null,next:null}}function Td(m,g,_){var M=m.updateQueue;if(M===null)return null;if(M=M.shared,(pr&2)!==0){var F=M.pending;return F===null?g.next=g:(g.next=F.next,F.next=g),M.pending=g,g=cw(m),$I(m,null,_),g}return lw(m,M,g,_),cw(m)}function Px(m,g,_){if(g=g.updateQueue,g!==null&&(g=g.shared,(_&4194048)!==0)){var M=g.lanes;M&=m.pendingLanes,_|=M,g.lanes=_,xt(m,_)}}function bA(m,g){var _=m.updateQueue,M=m.alternate;if(M!==null&&(M=M.updateQueue,_===M)){var F=null,I=null;if(_=_.firstBaseUpdate,_!==null){do{var te={lane:_.lane,tag:_.tag,payload:_.payload,callback:null,next:null};I===null?F=I=te:I=I.next=te,_=_.next}while(_!==null);I===null?F=I=g:I=I.next=g}else F=I=g;_={baseState:M.baseState,firstBaseUpdate:F,lastBaseUpdate:I,shared:M.shared,callbacks:M.callbacks},m.updateQueue=_;return}m=_.lastBaseUpdate,m===null?_.firstBaseUpdate=g:m.next=g,_.lastBaseUpdate=g}var xA=!1;function jx(){if(xA){var m=Np;if(m!==null)throw m}}function Dx(m,g,_,M){xA=!1;var F=m.updateQueue;Md=!1;var I=F.firstBaseUpdate,te=F.lastBaseUpdate,ke=F.shared.pending;if(ke!==null){F.shared.pending=null;var Be=ke,ht=Be.next;Be.next=null,te===null?I=ht:te.next=ht,te=Be;var yt=m.alternate;yt!==null&&(yt=yt.updateQueue,ke=yt.lastBaseUpdate,ke!==te&&(ke===null?yt.firstBaseUpdate=ht:ke.next=ht,yt.lastBaseUpdate=Be))}if(I!==null){var Ct=F.baseState;te=0,yt=ht=Be=null,ke=I;do{var mt=ke.lane&-536870913,gt=mt!==ke.lane;if(gt?(er&mt)===mt:(M&mt)===mt){mt!==0&&mt===Sp&&(xA=!0),yt!==null&&(yt=yt.next={lane:0,tag:ke.tag,payload:ke.payload,callback:null,next:null});e:{var Qt=m,mn=ke;mt=g;var Er=_;switch(mn.tag){case 1:if(Qt=mn.payload,typeof Qt=="function"){Ct=Qt.call(Er,Ct,mt);break e}Ct=Qt;break e;case 3:Qt.flags=Qt.flags&-65537|128;case 0:if(Qt=mn.payload,mt=typeof Qt=="function"?Qt.call(Er,Ct,mt):Qt,mt==null)break e;Ct=h({},Ct,mt);break e;case 2:Md=!0}}mt=ke.callback,mt!==null&&(m.flags|=64,gt&&(m.flags|=8192),gt=F.callbacks,gt===null?F.callbacks=[mt]:gt.push(mt))}else gt={lane:mt,tag:ke.tag,payload:ke.payload,callback:ke.callback,next:null},yt===null?(ht=yt=gt,Be=Ct):yt=yt.next=gt,te|=mt;if(ke=ke.next,ke===null){if(ke=F.shared.pending,ke===null)break;gt=ke,ke=gt.next,gt.next=null,F.lastBaseUpdate=gt,F.shared.pending=null}}while(!0);yt===null&&(Be=Ct),F.baseState=Be,F.firstBaseUpdate=ht,F.lastBaseUpdate=yt,I===null&&(F.shared.lanes=0),Rd|=te,m.lanes=te,m.memoizedState=Ct}}function o5(m,g){if(typeof m!="function")throw Error(r(191,m));m.call(g)}function l5(m,g){var _=m.callbacks;if(_!==null)for(m.callbacks=null,m=0;m<_.length;m++)o5(_[m],g)}var Mp=$(null),yw=$(0);function c5(m,g){m=cu,ee(yw,m),ee(Mp,g),cu=m|g.baseLanes}function yA(){ee(yw,cu),ee(Mp,Mp.current)}function vA(){cu=yw.current,X(Mp),X(yw)}var po=$(null),Vo=null;function Ed(m){var g=m.alternate;ee(Ii,Ii.current&1),ee(po,m),Vo===null&&(g===null||Mp.current!==null||g.memoizedState!==null)&&(Vo=m)}function wA(m){ee(Ii,Ii.current),ee(po,m),Vo===null&&(Vo=m)}function u5(m){m.tag===22?(ee(Ii,Ii.current),ee(po,m),Vo===null&&(Vo=m)):Pd()}function Pd(){ee(Ii,Ii.current),ee(po,po.current)}function go(m){X(po),Vo===m&&(Vo=null),X(Ii)}var Ii=$(0);function vw(m){for(var g=m;g!==null;){if(g.tag===13){var _=g.memoizedState;if(_!==null&&(_=_.dehydrated,_===null||MT(_)||AT(_)))return g}else if(g.tag===19&&(g.memoizedProps.revealOrder==="forwards"||g.memoizedProps.revealOrder==="backwards"||g.memoizedProps.revealOrder==="unstable_legacy-backwards"||g.memoizedProps.revealOrder==="together")){if((g.flags&128)!==0)return g}else if(g.child!==null){g.child.return=g,g=g.child;continue}if(g===m)break;for(;g.sibling===null;){if(g.return===null||g.return===m)return null;g=g.return}g.sibling.return=g.return,g=g.sibling}return null}var tu=0,En=null,Ar=null,Wi=null,ww=!1,Ap=!1,Mm=!1,_w=0,Rx=0,Tp=null,_se=0;function Ni(){throw Error(r(321))}function _A(m,g){if(g===null)return!1;for(var _=0;_I?I:8;var te=q.T,ke={};q.T=ke,OA(m,!1,g,_);try{var Be=F(),ht=q.S;if(ht!==null&&ht(ke,Be),Be!==null&&typeof Be=="object"&&typeof Be.then=="function"){var yt=wse(Be,M);Lx(m,g,yt,yo(m))}else Lx(m,g,M,yo(m))}catch(Ct){Lx(m,g,{then:function(){},status:"rejected",reason:Ct},yo())}finally{z.p=I,te!==null&&ke.types!==null&&(te.types=ke.types),q.T=te}}function Mse(){}function FA(m,g,_,M){if(m.tag!==5)throw Error(r(476));var F=U5(m).queue;z5(m,F,g,K,_===null?Mse:function(){return B5(m),_(M)})}function U5(m){var g=m.memoizedState;if(g!==null)return g;g={memoizedState:K,baseState:K,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:nu,lastRenderedState:K},next:null};var _={};return g.next={memoizedState:_,baseState:_,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:nu,lastRenderedState:_},next:null},m.memoizedState=g,m=m.alternate,m!==null&&(m.memoizedState=g),g}function B5(m){var g=U5(m);g.next===null&&(g=m.alternate.memoizedState),Lx(m,g.next.queue,{},yo())}function LA(){return $a(Jx)}function H5(){return zi().memoizedState}function $5(){return zi().memoizedState}function Ase(m){for(var g=m.return;g!==null;){switch(g.tag){case 24:case 3:var _=yo();m=Ad(_);var M=Td(g,m,_);M!==null&&(qs(M,g,_),Px(M,g,_)),g={cache:dA()},m.payload=g;return}g=g.return}}function Tse(m,g,_){var M=yo();_={lane:M,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null},Aw(m)?G5(g,_):(_=eA(m,g,_,M),_!==null&&(qs(_,m,M),q5(_,g,M)))}function V5(m,g,_){var M=yo();Lx(m,g,_,M)}function Lx(m,g,_,M){var F={lane:M,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null};if(Aw(m))G5(g,F);else{var I=m.alternate;if(m.lanes===0&&(I===null||I.lanes===0)&&(I=g.lastRenderedReducer,I!==null))try{var te=g.lastRenderedState,ke=I(te,_);if(F.hasEagerState=!0,F.eagerState=ke,mo(ke,te))return lw(m,g,F,0),Hr===null&&ow(),!1}catch{}if(_=eA(m,g,F,M),_!==null)return qs(_,m,M),q5(_,g,M),!0}return!1}function OA(m,g,_,M){if(M={lane:2,revertLane:pT(),gesture:null,action:M,hasEagerState:!1,eagerState:null,next:null},Aw(m)){if(g)throw Error(r(479))}else g=eA(m,_,M,2),g!==null&&qs(g,m,2)}function Aw(m){var g=m.alternate;return m===En||g!==null&&g===En}function G5(m,g){Ap=ww=!0;var _=m.pending;_===null?g.next=g:(g.next=_.next,_.next=g),m.pending=g}function q5(m,g,_){if((_&4194048)!==0){var M=g.lanes;M&=m.pendingLanes,_|=M,g.lanes=_,xt(m,_)}}var Ox={readContext:$a,use:Nw,useCallback:Ni,useContext:Ni,useEffect:Ni,useImperativeHandle:Ni,useLayoutEffect:Ni,useInsertionEffect:Ni,useMemo:Ni,useReducer:Ni,useRef:Ni,useState:Ni,useDebugValue:Ni,useDeferredValue:Ni,useTransition:Ni,useSyncExternalStore:Ni,useId:Ni,useHostTransitionStatus:Ni,useFormState:Ni,useActionState:Ni,useOptimistic:Ni,useMemoCache:Ni,useCacheRefresh:Ni};Ox.useEffectEvent=Ni;var W5={readContext:$a,use:Nw,useCallback:function(m,g){return Cs().memoizedState=[m,g===void 0?null:g],m},useContext:$a,useEffect:E5,useImperativeHandle:function(m,g,_){_=_!=null?_.concat([m]):null,Cw(4194308,4,R5.bind(null,g,m),_)},useLayoutEffect:function(m,g){return Cw(4194308,4,m,g)},useInsertionEffect:function(m,g){Cw(4,2,m,g)},useMemo:function(m,g){var _=Cs();g=g===void 0?null:g;var M=m();if(Mm){le(!0);try{m()}finally{le(!1)}}return _.memoizedState=[M,g],M},useReducer:function(m,g,_){var M=Cs();if(_!==void 0){var F=_(g);if(Mm){le(!0);try{_(g)}finally{le(!1)}}}else F=g;return M.memoizedState=M.baseState=F,m={pending:null,lanes:0,dispatch:null,lastRenderedReducer:m,lastRenderedState:F},M.queue=m,m=m.dispatch=Tse.bind(null,En,m),[M.memoizedState,m]},useRef:function(m){var g=Cs();return m={current:m},g.memoizedState=m},useState:function(m){m=EA(m);var g=m.queue,_=V5.bind(null,En,g);return g.dispatch=_,[m.memoizedState,_]},useDebugValue:DA,useDeferredValue:function(m,g){var _=Cs();return RA(_,m,g)},useTransition:function(){var m=EA(!1);return m=z5.bind(null,En,m.queue,!0,!1),Cs().memoizedState=m,[!1,m]},useSyncExternalStore:function(m,g,_){var M=En,F=Cs();if(rr){if(_===void 0)throw Error(r(407));_=_()}else{if(_=g(),Hr===null)throw Error(r(349));(er&127)!==0||f5(M,g,_)}F.memoizedState=_;var I={value:_,getSnapshot:g};return F.queue=I,E5(g5.bind(null,M,I,m),[m]),M.flags|=2048,Ep(9,{destroy:void 0},p5.bind(null,M,I,_,g),null),_},useId:function(){var m=Cs(),g=Hr.identifierPrefix;if(rr){var _=sc,M=ac;_=(M&~(1<<32-Le(M)-1)).toString(32)+_,g="_"+g+"R_"+_,_=_w++,0<_&&(g+="H"+_.toString(32)),g+="_"}else _=_se++,g="_"+g+"r_"+_.toString(32)+"_";return m.memoizedState=g},useHostTransitionStatus:LA,useFormState:k5,useActionState:k5,useOptimistic:function(m){var g=Cs();g.memoizedState=g.baseState=m;var _={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return g.queue=_,g=OA.bind(null,En,!0,_),_.dispatch=g,[m,g]},useMemoCache:MA,useCacheRefresh:function(){return Cs().memoizedState=Ase.bind(null,En)},useEffectEvent:function(m){var g=Cs(),_={impl:m};return g.memoizedState=_,function(){if((pr&2)!==0)throw Error(r(440));return _.impl.apply(void 0,arguments)}}},IA={readContext:$a,use:Nw,useCallback:L5,useContext:$a,useEffect:jA,useImperativeHandle:F5,useInsertionEffect:j5,useLayoutEffect:D5,useMemo:O5,useReducer:kw,useRef:T5,useState:function(){return kw(nu)},useDebugValue:DA,useDeferredValue:function(m,g){var _=zi();return I5(_,Ar.memoizedState,m,g)},useTransition:function(){var m=kw(nu)[0],g=zi().memoizedState;return[typeof m=="boolean"?m:Fx(m),g]},useSyncExternalStore:m5,useId:H5,useHostTransitionStatus:LA,useFormState:C5,useActionState:C5,useOptimistic:function(m,g){var _=zi();return y5(_,Ar,m,g)},useMemoCache:MA,useCacheRefresh:$5};IA.useEffectEvent=P5;var K5={readContext:$a,use:Nw,useCallback:L5,useContext:$a,useEffect:jA,useImperativeHandle:F5,useInsertionEffect:j5,useLayoutEffect:D5,useMemo:O5,useReducer:TA,useRef:T5,useState:function(){return TA(nu)},useDebugValue:DA,useDeferredValue:function(m,g){var _=zi();return Ar===null?RA(_,m,g):I5(_,Ar.memoizedState,m,g)},useTransition:function(){var m=TA(nu)[0],g=zi().memoizedState;return[typeof m=="boolean"?m:Fx(m),g]},useSyncExternalStore:m5,useId:H5,useHostTransitionStatus:LA,useFormState:A5,useActionState:A5,useOptimistic:function(m,g){var _=zi();return Ar!==null?y5(_,Ar,m,g):(_.baseState=m,[m,_.queue.dispatch])},useMemoCache:MA,useCacheRefresh:$5};K5.useEffectEvent=P5;function zA(m,g,_,M){g=m.memoizedState,_=_(M,g),_=_==null?g:h({},g,_),m.memoizedState=_,m.lanes===0&&(m.updateQueue.baseState=_)}var UA={enqueueSetState:function(m,g,_){m=m._reactInternals;var M=yo(),F=Ad(M);F.payload=g,_!=null&&(F.callback=_),g=Td(m,F,M),g!==null&&(qs(g,m,M),Px(g,m,M))},enqueueReplaceState:function(m,g,_){m=m._reactInternals;var M=yo(),F=Ad(M);F.tag=1,F.payload=g,_!=null&&(F.callback=_),g=Td(m,F,M),g!==null&&(qs(g,m,M),Px(g,m,M))},enqueueForceUpdate:function(m,g){m=m._reactInternals;var _=yo(),M=Ad(_);M.tag=2,g!=null&&(M.callback=g),g=Td(m,M,_),g!==null&&(qs(g,m,_),Px(g,m,_))}};function X5(m,g,_,M,F,I,te){return m=m.stateNode,typeof m.shouldComponentUpdate=="function"?m.shouldComponentUpdate(M,I,te):g.prototype&&g.prototype.isPureReactComponent?!Sx(_,M)||!Sx(F,I):!0}function Y5(m,g,_,M){m=g.state,typeof g.componentWillReceiveProps=="function"&&g.componentWillReceiveProps(_,M),typeof g.UNSAFE_componentWillReceiveProps=="function"&&g.UNSAFE_componentWillReceiveProps(_,M),g.state!==m&&UA.enqueueReplaceState(g,g.state,null)}function Am(m,g){var _=g;if("ref"in g){_={};for(var M in g)M!=="ref"&&(_[M]=g[M])}if(m=m.defaultProps){_===g&&(_=h({},_));for(var F in m)_[F]===void 0&&(_[F]=m[F])}return _}function Q5(m){sw(m)}function Z5(m){console.error(m)}function J5(m){sw(m)}function Tw(m,g){try{var _=m.onUncaughtError;_(g.value,{componentStack:g.stack})}catch(M){setTimeout(function(){throw M})}}function ez(m,g,_){try{var M=m.onCaughtError;M(_.value,{componentStack:_.stack,errorBoundary:g.tag===1?g.stateNode:null})}catch(F){setTimeout(function(){throw F})}}function BA(m,g,_){return _=Ad(_),_.tag=3,_.payload={element:null},_.callback=function(){Tw(m,g)},_}function tz(m){return m=Ad(m),m.tag=3,m}function nz(m,g,_,M){var F=_.type.getDerivedStateFromError;if(typeof F=="function"){var I=M.value;m.payload=function(){return F(I)},m.callback=function(){ez(g,_,M)}}var te=_.stateNode;te!==null&&typeof te.componentDidCatch=="function"&&(m.callback=function(){ez(g,_,M),typeof F!="function"&&(Fd===null?Fd=new Set([this]):Fd.add(this));var ke=M.stack;this.componentDidCatch(M.value,{componentStack:ke!==null?ke:""})})}function Ese(m,g,_,M,F){if(_.flags|=32768,M!==null&&typeof M=="object"&&typeof M.then=="function"){if(g=_.alternate,g!==null&&_p(g,_,F,!0),_=po.current,_!==null){switch(_.tag){case 31:case 13:return Vo===null?Bw():_.alternate===null&&ki===0&&(ki=3),_.flags&=-257,_.flags|=65536,_.lanes=F,M===gw?_.flags|=16384:(g=_.updateQueue,g===null?_.updateQueue=new Set([M]):g.add(M),hT(m,M,F)),!1;case 22:return _.flags|=65536,M===gw?_.flags|=16384:(g=_.updateQueue,g===null?(g={transitions:null,markerInstances:null,retryQueue:new Set([M])},_.updateQueue=g):(_=g.retryQueue,_===null?g.retryQueue=new Set([M]):_.add(M)),hT(m,M,F)),!1}throw Error(r(435,_.tag))}return hT(m,M,F),Bw(),!1}if(rr)return g=po.current,g!==null?((g.flags&65536)===0&&(g.flags|=256),g.flags|=65536,g.lanes=F,M!==sA&&(m=Error(r(422),{cause:M}),Cx(Uo(m,_)))):(M!==sA&&(g=Error(r(423),{cause:M}),Cx(Uo(g,_))),m=m.current.alternate,m.flags|=65536,F&=-F,m.lanes|=F,M=Uo(M,_),F=BA(m.stateNode,M,F),bA(m,F),ki!==4&&(ki=2)),!1;var I=Error(r(520),{cause:M});if(I=Uo(I,_),Gx===null?Gx=[I]:Gx.push(I),ki!==4&&(ki=2),g===null)return!0;M=Uo(M,_),_=g;do{switch(_.tag){case 3:return _.flags|=65536,m=F&-F,_.lanes|=m,m=BA(_.stateNode,M,m),bA(_,m),!1;case 1:if(g=_.type,I=_.stateNode,(_.flags&128)===0&&(typeof g.getDerivedStateFromError=="function"||I!==null&&typeof I.componentDidCatch=="function"&&(Fd===null||!Fd.has(I))))return _.flags|=65536,F&=-F,_.lanes|=F,F=tz(F),nz(F,m,_,M),bA(_,F),!1}_=_.return}while(_!==null);return!1}var HA=Error(r(461)),Ki=!1;function Va(m,g,_,M){g.child=m===null?s5(g,null,_,M):Cm(g,m.child,_,M)}function rz(m,g,_,M,F){_=_.render;var I=g.ref;if("ref"in M){var te={};for(var ke in M)ke!=="ref"&&(te[ke]=M[ke])}else te=M;return _m(g),M=SA(m,g,_,te,I,F),ke=NA(),m!==null&&!Ki?(kA(m,g,F),ru(m,g,F)):(rr&&ke&&iA(g),g.flags|=1,Va(m,g,M,F),g.child)}function iz(m,g,_,M,F){if(m===null){var I=_.type;return typeof I=="function"&&!tA(I)&&I.defaultProps===void 0&&_.compare===null?(g.tag=15,g.type=I,az(m,g,I,M,F)):(m=uw(_.type,null,M,g,g.mode,F),m.ref=g.ref,m.return=g,g.child=m)}if(I=m.child,!YA(m,F)){var te=I.memoizedProps;if(_=_.compare,_=_!==null?_:Sx,_(te,M)&&m.ref===g.ref)return ru(m,g,F)}return g.flags|=1,m=Qc(I,M),m.ref=g.ref,m.return=g,g.child=m}function az(m,g,_,M,F){if(m!==null){var I=m.memoizedProps;if(Sx(I,M)&&m.ref===g.ref)if(Ki=!1,g.pendingProps=M=I,YA(m,F))(m.flags&131072)!==0&&(Ki=!0);else return g.lanes=m.lanes,ru(m,g,F)}return $A(m,g,_,M,F)}function sz(m,g,_,M){var F=M.children,I=m!==null?m.memoizedState:null;if(m===null&&g.stateNode===null&&(g.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),M.mode==="hidden"){if((g.flags&128)!==0){if(I=I!==null?I.baseLanes|_:_,m!==null){for(M=g.child=m.child,F=0;M!==null;)F=F|M.lanes|M.childLanes,M=M.sibling;M=F&~I}else M=0,g.child=null;return oz(m,g,I,_,M)}if((_&536870912)!==0)g.memoizedState={baseLanes:0,cachePool:null},m!==null&&fw(g,I!==null?I.cachePool:null),I!==null?c5(g,I):yA(),u5(g);else return M=g.lanes=536870912,oz(m,g,I!==null?I.baseLanes|_:_,_,M)}else I!==null?(fw(g,I.cachePool),c5(g,I),Pd(),g.memoizedState=null):(m!==null&&fw(g,null),yA(),Pd());return Va(m,g,F,_),g.child}function Ix(m,g){return m!==null&&m.tag===22||g.stateNode!==null||(g.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),g.sibling}function oz(m,g,_,M,F){var I=mA();return I=I===null?null:{parent:qi._currentValue,pool:I},g.memoizedState={baseLanes:_,cachePool:I},m!==null&&fw(g,null),yA(),u5(g),m!==null&&_p(m,g,M,!0),g.childLanes=F,null}function Ew(m,g){return g=jw({mode:g.mode,children:g.children},m.mode),g.ref=m.ref,m.child=g,g.return=m,g}function lz(m,g,_){return Cm(g,m.child,null,_),m=Ew(g,g.pendingProps),m.flags|=2,go(g),g.memoizedState=null,m}function Pse(m,g,_){var M=g.pendingProps,F=(g.flags&128)!==0;if(g.flags&=-129,m===null){if(rr){if(M.mode==="hidden")return m=Ew(g,M),g.lanes=536870912,Ix(null,m);if(wA(g),(m=Jr)?(m=vU(m,$o),m=m!==null&&m.data==="&"?m:null,m!==null&&(g.memoizedState={dehydrated:m,treeContext:Sd!==null?{id:ac,overflow:sc}:null,retryLane:536870912,hydrationErrors:null},_=GI(m),_.return=g,g.child=_,Ha=g,Jr=null)):m=null,m===null)throw kd(g);return g.lanes=536870912,null}return Ew(g,M)}var I=m.memoizedState;if(I!==null){var te=I.dehydrated;if(wA(g),F)if(g.flags&256)g.flags&=-257,g=lz(m,g,_);else if(g.memoizedState!==null)g.child=m.child,g.flags|=128,g=null;else throw Error(r(558));else if(Ki||_p(m,g,_,!1),F=(_&m.childLanes)!==0,Ki||F){if(M=Hr,M!==null&&(te=wt(M,_),te!==0&&te!==I.retryLane))throw I.retryLane=te,xm(m,te),qs(M,m,te),HA;Bw(),g=lz(m,g,_)}else m=I.treeContext,Jr=Go(te.nextSibling),Ha=g,rr=!0,Nd=null,$o=!1,m!==null&&KI(g,m),g=Ew(g,M),g.flags|=4096;return g}return m=Qc(m.child,{mode:M.mode,children:M.children}),m.ref=g.ref,g.child=m,m.return=g,m}function Pw(m,g){var _=g.ref;if(_===null)m!==null&&m.ref!==null&&(g.flags|=4194816);else{if(typeof _!="function"&&typeof _!="object")throw Error(r(284));(m===null||m.ref!==_)&&(g.flags|=4194816)}}function $A(m,g,_,M,F){return _m(g),_=SA(m,g,_,M,void 0,F),M=NA(),m!==null&&!Ki?(kA(m,g,F),ru(m,g,F)):(rr&&M&&iA(g),g.flags|=1,Va(m,g,_,F),g.child)}function cz(m,g,_,M,F,I){return _m(g),g.updateQueue=null,_=h5(g,M,_,F),d5(m),M=NA(),m!==null&&!Ki?(kA(m,g,I),ru(m,g,I)):(rr&&M&&iA(g),g.flags|=1,Va(m,g,_,I),g.child)}function uz(m,g,_,M,F){if(_m(g),g.stateNode===null){var I=xp,te=_.contextType;typeof te=="object"&&te!==null&&(I=$a(te)),I=new _(M,I),g.memoizedState=I.state!==null&&I.state!==void 0?I.state:null,I.updater=UA,g.stateNode=I,I._reactInternals=g,I=g.stateNode,I.props=M,I.state=g.memoizedState,I.refs={},pA(g),te=_.contextType,I.context=typeof te=="object"&&te!==null?$a(te):xp,I.state=g.memoizedState,te=_.getDerivedStateFromProps,typeof te=="function"&&(zA(g,_,te,M),I.state=g.memoizedState),typeof _.getDerivedStateFromProps=="function"||typeof I.getSnapshotBeforeUpdate=="function"||typeof I.UNSAFE_componentWillMount!="function"&&typeof I.componentWillMount!="function"||(te=I.state,typeof I.componentWillMount=="function"&&I.componentWillMount(),typeof I.UNSAFE_componentWillMount=="function"&&I.UNSAFE_componentWillMount(),te!==I.state&&UA.enqueueReplaceState(I,I.state,null),Dx(g,M,I,F),jx(),I.state=g.memoizedState),typeof I.componentDidMount=="function"&&(g.flags|=4194308),M=!0}else if(m===null){I=g.stateNode;var ke=g.memoizedProps,Be=Am(_,ke);I.props=Be;var ht=I.context,yt=_.contextType;te=xp,typeof yt=="object"&&yt!==null&&(te=$a(yt));var Ct=_.getDerivedStateFromProps;yt=typeof Ct=="function"||typeof I.getSnapshotBeforeUpdate=="function",ke=g.pendingProps!==ke,yt||typeof I.UNSAFE_componentWillReceiveProps!="function"&&typeof I.componentWillReceiveProps!="function"||(ke||ht!==te)&&Y5(g,I,M,te),Md=!1;var mt=g.memoizedState;I.state=mt,Dx(g,M,I,F),jx(),ht=g.memoizedState,ke||mt!==ht||Md?(typeof Ct=="function"&&(zA(g,_,Ct,M),ht=g.memoizedState),(Be=Md||X5(g,_,Be,M,mt,ht,te))?(yt||typeof I.UNSAFE_componentWillMount!="function"&&typeof I.componentWillMount!="function"||(typeof I.componentWillMount=="function"&&I.componentWillMount(),typeof I.UNSAFE_componentWillMount=="function"&&I.UNSAFE_componentWillMount()),typeof I.componentDidMount=="function"&&(g.flags|=4194308)):(typeof I.componentDidMount=="function"&&(g.flags|=4194308),g.memoizedProps=M,g.memoizedState=ht),I.props=M,I.state=ht,I.context=te,M=Be):(typeof I.componentDidMount=="function"&&(g.flags|=4194308),M=!1)}else{I=g.stateNode,gA(m,g),te=g.memoizedProps,yt=Am(_,te),I.props=yt,Ct=g.pendingProps,mt=I.context,ht=_.contextType,Be=xp,typeof ht=="object"&&ht!==null&&(Be=$a(ht)),ke=_.getDerivedStateFromProps,(ht=typeof ke=="function"||typeof I.getSnapshotBeforeUpdate=="function")||typeof I.UNSAFE_componentWillReceiveProps!="function"&&typeof I.componentWillReceiveProps!="function"||(te!==Ct||mt!==Be)&&Y5(g,I,M,Be),Md=!1,mt=g.memoizedState,I.state=mt,Dx(g,M,I,F),jx();var gt=g.memoizedState;te!==Ct||mt!==gt||Md||m!==null&&m.dependencies!==null&&hw(m.dependencies)?(typeof ke=="function"&&(zA(g,_,ke,M),gt=g.memoizedState),(yt=Md||X5(g,_,yt,M,mt,gt,Be)||m!==null&&m.dependencies!==null&&hw(m.dependencies))?(ht||typeof I.UNSAFE_componentWillUpdate!="function"&&typeof I.componentWillUpdate!="function"||(typeof I.componentWillUpdate=="function"&&I.componentWillUpdate(M,gt,Be),typeof I.UNSAFE_componentWillUpdate=="function"&&I.UNSAFE_componentWillUpdate(M,gt,Be)),typeof I.componentDidUpdate=="function"&&(g.flags|=4),typeof I.getSnapshotBeforeUpdate=="function"&&(g.flags|=1024)):(typeof I.componentDidUpdate!="function"||te===m.memoizedProps&&mt===m.memoizedState||(g.flags|=4),typeof I.getSnapshotBeforeUpdate!="function"||te===m.memoizedProps&&mt===m.memoizedState||(g.flags|=1024),g.memoizedProps=M,g.memoizedState=gt),I.props=M,I.state=gt,I.context=Be,M=yt):(typeof I.componentDidUpdate!="function"||te===m.memoizedProps&&mt===m.memoizedState||(g.flags|=4),typeof I.getSnapshotBeforeUpdate!="function"||te===m.memoizedProps&&mt===m.memoizedState||(g.flags|=1024),M=!1)}return I=M,Pw(m,g),M=(g.flags&128)!==0,I||M?(I=g.stateNode,_=M&&typeof _.getDerivedStateFromError!="function"?null:I.render(),g.flags|=1,m!==null&&M?(g.child=Cm(g,m.child,null,F),g.child=Cm(g,null,_,F)):Va(m,g,_,F),g.memoizedState=I.state,m=g.child):m=ru(m,g,F),m}function dz(m,g,_,M){return vm(),g.flags|=256,Va(m,g,_,M),g.child}var VA={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function GA(m){return{baseLanes:m,cachePool:e5()}}function qA(m,g,_){return m=m!==null?m.childLanes&~_:0,g&&(m|=xo),m}function hz(m,g,_){var M=g.pendingProps,F=!1,I=(g.flags&128)!==0,te;if((te=I)||(te=m!==null&&m.memoizedState===null?!1:(Ii.current&2)!==0),te&&(F=!0,g.flags&=-129),te=(g.flags&32)!==0,g.flags&=-33,m===null){if(rr){if(F?Ed(g):Pd(),(m=Jr)?(m=vU(m,$o),m=m!==null&&m.data!=="&"?m:null,m!==null&&(g.memoizedState={dehydrated:m,treeContext:Sd!==null?{id:ac,overflow:sc}:null,retryLane:536870912,hydrationErrors:null},_=GI(m),_.return=g,g.child=_,Ha=g,Jr=null)):m=null,m===null)throw kd(g);return AT(m)?g.lanes=32:g.lanes=536870912,null}var ke=M.children;return M=M.fallback,F?(Pd(),F=g.mode,ke=jw({mode:"hidden",children:ke},F),M=ym(M,F,_,null),ke.return=g,M.return=g,ke.sibling=M,g.child=ke,M=g.child,M.memoizedState=GA(_),M.childLanes=qA(m,te,_),g.memoizedState=VA,Ix(null,M)):(Ed(g),WA(g,ke))}var Be=m.memoizedState;if(Be!==null&&(ke=Be.dehydrated,ke!==null)){if(I)g.flags&256?(Ed(g),g.flags&=-257,g=KA(m,g,_)):g.memoizedState!==null?(Pd(),g.child=m.child,g.flags|=128,g=null):(Pd(),ke=M.fallback,F=g.mode,M=jw({mode:"visible",children:M.children},F),ke=ym(ke,F,_,null),ke.flags|=2,M.return=g,ke.return=g,M.sibling=ke,g.child=M,Cm(g,m.child,null,_),M=g.child,M.memoizedState=GA(_),M.childLanes=qA(m,te,_),g.memoizedState=VA,g=Ix(null,M));else if(Ed(g),AT(ke)){if(te=ke.nextSibling&&ke.nextSibling.dataset,te)var ht=te.dgst;te=ht,M=Error(r(419)),M.stack="",M.digest=te,Cx({value:M,source:null,stack:null}),g=KA(m,g,_)}else if(Ki||_p(m,g,_,!1),te=(_&m.childLanes)!==0,Ki||te){if(te=Hr,te!==null&&(M=wt(te,_),M!==0&&M!==Be.retryLane))throw Be.retryLane=M,xm(m,M),qs(te,m,M),HA;MT(ke)||Bw(),g=KA(m,g,_)}else MT(ke)?(g.flags|=192,g.child=m.child,g=null):(m=Be.treeContext,Jr=Go(ke.nextSibling),Ha=g,rr=!0,Nd=null,$o=!1,m!==null&&KI(g,m),g=WA(g,M.children),g.flags|=4096);return g}return F?(Pd(),ke=M.fallback,F=g.mode,Be=m.child,ht=Be.sibling,M=Qc(Be,{mode:"hidden",children:M.children}),M.subtreeFlags=Be.subtreeFlags&65011712,ht!==null?ke=Qc(ht,ke):(ke=ym(ke,F,_,null),ke.flags|=2),ke.return=g,M.return=g,M.sibling=ke,g.child=M,Ix(null,M),M=g.child,ke=m.child.memoizedState,ke===null?ke=GA(_):(F=ke.cachePool,F!==null?(Be=qi._currentValue,F=F.parent!==Be?{parent:Be,pool:Be}:F):F=e5(),ke={baseLanes:ke.baseLanes|_,cachePool:F}),M.memoizedState=ke,M.childLanes=qA(m,te,_),g.memoizedState=VA,Ix(m.child,M)):(Ed(g),_=m.child,m=_.sibling,_=Qc(_,{mode:"visible",children:M.children}),_.return=g,_.sibling=null,m!==null&&(te=g.deletions,te===null?(g.deletions=[m],g.flags|=16):te.push(m)),g.child=_,g.memoizedState=null,_)}function WA(m,g){return g=jw({mode:"visible",children:g},m.mode),g.return=m,m.child=g}function jw(m,g){return m=fo(22,m,null,g),m.lanes=0,m}function KA(m,g,_){return Cm(g,m.child,null,_),m=WA(g,g.pendingProps.children),m.flags|=2,g.memoizedState=null,m}function mz(m,g,_){m.lanes|=g;var M=m.alternate;M!==null&&(M.lanes|=g),cA(m.return,g,_)}function XA(m,g,_,M,F,I){var te=m.memoizedState;te===null?m.memoizedState={isBackwards:g,rendering:null,renderingStartTime:0,last:M,tail:_,tailMode:F,treeForkCount:I}:(te.isBackwards=g,te.rendering=null,te.renderingStartTime=0,te.last=M,te.tail=_,te.tailMode=F,te.treeForkCount=I)}function fz(m,g,_){var M=g.pendingProps,F=M.revealOrder,I=M.tail;M=M.children;var te=Ii.current,ke=(te&2)!==0;if(ke?(te=te&1|2,g.flags|=128):te&=1,ee(Ii,te),Va(m,g,M,_),M=rr?kx:0,!ke&&m!==null&&(m.flags&128)!==0)e:for(m=g.child;m!==null;){if(m.tag===13)m.memoizedState!==null&&mz(m,_,g);else if(m.tag===19)mz(m,_,g);else if(m.child!==null){m.child.return=m,m=m.child;continue}if(m===g)break e;for(;m.sibling===null;){if(m.return===null||m.return===g)break e;m=m.return}m.sibling.return=m.return,m=m.sibling}switch(F){case"forwards":for(_=g.child,F=null;_!==null;)m=_.alternate,m!==null&&vw(m)===null&&(F=_),_=_.sibling;_=F,_===null?(F=g.child,g.child=null):(F=_.sibling,_.sibling=null),XA(g,!1,F,_,I,M);break;case"backwards":case"unstable_legacy-backwards":for(_=null,F=g.child,g.child=null;F!==null;){if(m=F.alternate,m!==null&&vw(m)===null){g.child=F;break}m=F.sibling,F.sibling=_,_=F,F=m}XA(g,!0,_,null,I,M);break;case"together":XA(g,!1,null,null,void 0,M);break;default:g.memoizedState=null}return g.child}function ru(m,g,_){if(m!==null&&(g.dependencies=m.dependencies),Rd|=g.lanes,(_&g.childLanes)===0)if(m!==null){if(_p(m,g,_,!1),(_&g.childLanes)===0)return null}else return null;if(m!==null&&g.child!==m.child)throw Error(r(153));if(g.child!==null){for(m=g.child,_=Qc(m,m.pendingProps),g.child=_,_.return=g;m.sibling!==null;)m=m.sibling,_=_.sibling=Qc(m,m.pendingProps),_.return=g;_.sibling=null}return g.child}function YA(m,g){return(m.lanes&g)!==0?!0:(m=m.dependencies,!!(m!==null&&hw(m)))}function jse(m,g,_){switch(g.tag){case 3:je(g,g.stateNode.containerInfo),Cd(g,qi,m.memoizedState.cache),vm();break;case 27:case 5:ce(g);break;case 4:je(g,g.stateNode.containerInfo);break;case 10:Cd(g,g.type,g.memoizedProps.value);break;case 31:if(g.memoizedState!==null)return g.flags|=128,wA(g),null;break;case 13:var M=g.memoizedState;if(M!==null)return M.dehydrated!==null?(Ed(g),g.flags|=128,null):(_&g.child.childLanes)!==0?hz(m,g,_):(Ed(g),m=ru(m,g,_),m!==null?m.sibling:null);Ed(g);break;case 19:var F=(m.flags&128)!==0;if(M=(_&g.childLanes)!==0,M||(_p(m,g,_,!1),M=(_&g.childLanes)!==0),F){if(M)return fz(m,g,_);g.flags|=128}if(F=g.memoizedState,F!==null&&(F.rendering=null,F.tail=null,F.lastEffect=null),ee(Ii,Ii.current),M)break;return null;case 22:return g.lanes=0,sz(m,g,_,g.pendingProps);case 24:Cd(g,qi,m.memoizedState.cache)}return ru(m,g,_)}function pz(m,g,_){if(m!==null)if(m.memoizedProps!==g.pendingProps)Ki=!0;else{if(!YA(m,_)&&(g.flags&128)===0)return Ki=!1,jse(m,g,_);Ki=(m.flags&131072)!==0}else Ki=!1,rr&&(g.flags&1048576)!==0&&WI(g,kx,g.index);switch(g.lanes=0,g.tag){case 16:e:{var M=g.pendingProps;if(m=Nm(g.elementType),g.type=m,typeof m=="function")tA(m)?(M=Am(m,M),g.tag=1,g=uz(null,g,m,M,_)):(g.tag=0,g=$A(null,g,m,M,_));else{if(m!=null){var F=m.$$typeof;if(F===A){g.tag=11,g=rz(null,g,m,M,_);break e}else if(F===k){g.tag=14,g=iz(null,g,m,M,_);break e}}throw g=R(m)||m,Error(r(306,g,""))}}return g;case 0:return $A(m,g,g.type,g.pendingProps,_);case 1:return M=g.type,F=Am(M,g.pendingProps),uz(m,g,M,F,_);case 3:e:{if(je(g,g.stateNode.containerInfo),m===null)throw Error(r(387));M=g.pendingProps;var I=g.memoizedState;F=I.element,gA(m,g),Dx(g,M,null,_);var te=g.memoizedState;if(M=te.cache,Cd(g,qi,M),M!==I.cache&&uA(g,[qi],_,!0),jx(),M=te.element,I.isDehydrated)if(I={element:M,isDehydrated:!1,cache:te.cache},g.updateQueue.baseState=I,g.memoizedState=I,g.flags&256){g=dz(m,g,M,_);break e}else if(M!==F){F=Uo(Error(r(424)),g),Cx(F),g=dz(m,g,M,_);break e}else for(m=g.stateNode.containerInfo,m.nodeType===9?m=m.body:m=m.nodeName==="HTML"?m.ownerDocument.body:m,Jr=Go(m.firstChild),Ha=g,rr=!0,Nd=null,$o=!0,_=s5(g,null,M,_),g.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling;else{if(vm(),M===F){g=ru(m,g,_);break e}Va(m,g,M,_)}g=g.child}return g;case 26:return Pw(m,g),m===null?(_=CU(g.type,null,g.pendingProps,null))?g.memoizedState=_:rr||(_=g.type,m=g.pendingProps,M=Kw(pe.current).createElement(_),M[Pn]=g,M[cr]=m,Ga(M,_,m),Ve(M),g.stateNode=M):g.memoizedState=CU(g.type,m.memoizedProps,g.pendingProps,m.memoizedState),null;case 27:return ce(g),m===null&&rr&&(M=g.stateNode=SU(g.type,g.pendingProps,pe.current),Ha=g,$o=!0,F=Jr,zd(g.type)?(TT=F,Jr=Go(M.firstChild)):Jr=F),Va(m,g,g.pendingProps.children,_),Pw(m,g),m===null&&(g.flags|=4194304),g.child;case 5:return m===null&&rr&&((F=M=Jr)&&(M=loe(M,g.type,g.pendingProps,$o),M!==null?(g.stateNode=M,Ha=g,Jr=Go(M.firstChild),$o=!1,F=!0):F=!1),F||kd(g)),ce(g),F=g.type,I=g.pendingProps,te=m!==null?m.memoizedProps:null,M=I.children,NT(F,I)?M=null:te!==null&&NT(F,te)&&(g.flags|=32),g.memoizedState!==null&&(F=SA(m,g,Sse,null,null,_),Jx._currentValue=F),Pw(m,g),Va(m,g,M,_),g.child;case 6:return m===null&&rr&&((m=_=Jr)&&(_=coe(_,g.pendingProps,$o),_!==null?(g.stateNode=_,Ha=g,Jr=null,m=!0):m=!1),m||kd(g)),null;case 13:return hz(m,g,_);case 4:return je(g,g.stateNode.containerInfo),M=g.pendingProps,m===null?g.child=Cm(g,null,M,_):Va(m,g,M,_),g.child;case 11:return rz(m,g,g.type,g.pendingProps,_);case 7:return Va(m,g,g.pendingProps,_),g.child;case 8:return Va(m,g,g.pendingProps.children,_),g.child;case 12:return Va(m,g,g.pendingProps.children,_),g.child;case 10:return M=g.pendingProps,Cd(g,g.type,M.value),Va(m,g,M.children,_),g.child;case 9:return F=g.type._context,M=g.pendingProps.children,_m(g),F=$a(F),M=M(F),g.flags|=1,Va(m,g,M,_),g.child;case 14:return iz(m,g,g.type,g.pendingProps,_);case 15:return az(m,g,g.type,g.pendingProps,_);case 19:return fz(m,g,_);case 31:return Pse(m,g,_);case 22:return sz(m,g,_,g.pendingProps);case 24:return _m(g),M=$a(qi),m===null?(F=mA(),F===null&&(F=Hr,I=dA(),F.pooledCache=I,I.refCount++,I!==null&&(F.pooledCacheLanes|=_),F=I),g.memoizedState={parent:M,cache:F},pA(g),Cd(g,qi,F)):((m.lanes&_)!==0&&(gA(m,g),Dx(g,null,null,_),jx()),F=m.memoizedState,I=g.memoizedState,F.parent!==M?(F={parent:M,cache:M},g.memoizedState=F,g.lanes===0&&(g.memoizedState=g.updateQueue.baseState=F),Cd(g,qi,M)):(M=I.cache,Cd(g,qi,M),M!==F.cache&&uA(g,[qi],_,!0))),Va(m,g,g.pendingProps.children,_),g.child;case 29:throw g.pendingProps}throw Error(r(156,g.tag))}function iu(m){m.flags|=4}function QA(m,g,_,M,F){if((g=(m.mode&32)!==0)&&(g=!1),g){if(m.flags|=16777216,(F&335544128)===F)if(m.stateNode.complete)m.flags|=8192;else if(Hz())m.flags|=8192;else throw km=gw,fA}else m.flags&=-16777217}function gz(m,g){if(g.type!=="stylesheet"||(g.state.loading&4)!==0)m.flags&=-16777217;else if(m.flags|=16777216,!PU(g))if(Hz())m.flags|=8192;else throw km=gw,fA}function Dw(m,g){g!==null&&(m.flags|=4),m.flags&16384&&(g=m.tag!==22?At():536870912,m.lanes|=g,Rp|=g)}function zx(m,g){if(!rr)switch(m.tailMode){case"hidden":g=m.tail;for(var _=null;g!==null;)g.alternate!==null&&(_=g),g=g.sibling;_===null?m.tail=null:_.sibling=null;break;case"collapsed":_=m.tail;for(var M=null;_!==null;)_.alternate!==null&&(M=_),_=_.sibling;M===null?g||m.tail===null?m.tail=null:m.tail.sibling=null:M.sibling=null}}function ei(m){var g=m.alternate!==null&&m.alternate.child===m.child,_=0,M=0;if(g)for(var F=m.child;F!==null;)_|=F.lanes|F.childLanes,M|=F.subtreeFlags&65011712,M|=F.flags&65011712,F.return=m,F=F.sibling;else for(F=m.child;F!==null;)_|=F.lanes|F.childLanes,M|=F.subtreeFlags,M|=F.flags,F.return=m,F=F.sibling;return m.subtreeFlags|=M,m.childLanes=_,g}function Dse(m,g,_){var M=g.pendingProps;switch(aA(g),g.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return ei(g),null;case 1:return ei(g),null;case 3:return _=g.stateNode,M=null,m!==null&&(M=m.memoizedState.cache),g.memoizedState.cache!==M&&(g.flags|=2048),eu(qi),de(),_.pendingContext&&(_.context=_.pendingContext,_.pendingContext=null),(m===null||m.child===null)&&(wp(g)?iu(g):m===null||m.memoizedState.isDehydrated&&(g.flags&256)===0||(g.flags|=1024,oA())),ei(g),null;case 26:var F=g.type,I=g.memoizedState;return m===null?(iu(g),I!==null?(ei(g),gz(g,I)):(ei(g),QA(g,F,null,M,_))):I?I!==m.memoizedState?(iu(g),ei(g),gz(g,I)):(ei(g),g.flags&=-16777217):(m=m.memoizedProps,m!==M&&iu(g),ei(g),QA(g,F,m,M,_)),null;case 27:if(Se(g),_=pe.current,F=g.type,m!==null&&g.stateNode!=null)m.memoizedProps!==M&&iu(g);else{if(!M){if(g.stateNode===null)throw Error(r(166));return ei(g),null}m=J.current,wp(g)?XI(g):(m=SU(F,M,_),g.stateNode=m,iu(g))}return ei(g),null;case 5:if(Se(g),F=g.type,m!==null&&g.stateNode!=null)m.memoizedProps!==M&&iu(g);else{if(!M){if(g.stateNode===null)throw Error(r(166));return ei(g),null}if(I=J.current,wp(g))XI(g);else{var te=Kw(pe.current);switch(I){case 1:I=te.createElementNS("http://www.w3.org/2000/svg",F);break;case 2:I=te.createElementNS("http://www.w3.org/1998/Math/MathML",F);break;default:switch(F){case"svg":I=te.createElementNS("http://www.w3.org/2000/svg",F);break;case"math":I=te.createElementNS("http://www.w3.org/1998/Math/MathML",F);break;case"script":I=te.createElement("div"),I.innerHTML=" +