diff --git a/requirements.txt b/requirements.txt index c8da5ad..4c82c23 100755 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ waitress==3.0.2 celery==5.5.3 Flask==3.1.1 flask_cors==6.0.0 -deezspot-spotizerr==1.10.0 \ No newline at end of file +deezspot-spotizerr==2.0.3 \ No newline at end of file diff --git a/routes/prgs.py b/routes/prgs.py index 23ae233..33467f2 100755 --- a/routes/prgs.py +++ b/routes/prgs.py @@ -116,10 +116,16 @@ def delete_task(task_id): def list_tasks(): """ Retrieve a list of all tasks in the system. - Returns a detailed list of task objects including status and metadata. + Returns a detailed list of task objects including status and metadata, + formatted according to the callback documentation. + By default, it returns active tasks. Use ?include_finished=true to include completed tasks. """ try: - tasks = get_all_tasks() # This already gets summary data + # Check for 'include_finished' query parameter + include_finished_str = request.args.get("include_finished", "false") + include_finished = include_finished_str.lower() in ["true", "1", "yes"] + + tasks = get_all_tasks(include_finished=include_finished) detailed_tasks = [] for task_summary in tasks: task_id = task_summary.get("task_id") @@ -130,33 +136,29 @@ def list_tasks(): last_status = get_last_task_status(task_id) if task_info and last_status: - task_details = { - "task_id": task_id, - "type": task_info.get( - "type", task_summary.get("type", "unknown") - ), - "name": task_info.get( - "name", task_summary.get("name", "Unknown") - ), - "artist": task_info.get( - "artist", task_summary.get("artist", "") - ), - "download_type": task_info.get( - "download_type", - task_summary.get("download_type", "unknown"), - ), - "status": last_status.get( - "status", "unknown" - ), # Keep summary status for quick access - "last_status_obj": last_status, # Full last status object - "original_request": task_info.get("original_request", {}), - "created_at": task_info.get("created_at", 0), - "timestamp": last_status.get( - "timestamp", task_info.get("created_at", 0) - ), - } - if last_status.get("summary"): - task_details["summary"] = last_status["summary"] + # Start with the last status object as the base. + # This object should conform to one of the callback types. + task_details = last_status.copy() + + # Add essential metadata to the task details + task_details["task_id"] = task_id + task_details["original_request"] = task_info.get( + "original_request", {} + ) + task_details["created_at"] = task_info.get("created_at", 0) + + # Ensure core properties from task_info are present if not in status + if "type" not in task_details: + task_details["type"] = task_info.get("type", "unknown") + if "name" not in task_details: + task_details["name"] = task_info.get("name", "Unknown") + if "artist" not in task_details: + task_details["artist"] = task_info.get("artist", "") + if "download_type" not in task_details: + task_details["download_type"] = task_info.get( + "download_type", "unknown" + ) + detailed_tasks.append(task_details) elif ( task_info @@ -169,7 +171,6 @@ def list_tasks(): "artist": task_info.get("artist", ""), "download_type": task_info.get("download_type", "unknown"), "status": "unknown", - "last_status_obj": None, "original_request": task_info.get("original_request", {}), "created_at": task_info.get("created_at", 0), "timestamp": task_info.get("created_at", 0), diff --git a/routes/utils/celery_tasks.py b/routes/utils/celery_tasks.py index 26d5e8d..2d2b9e4 100644 --- a/routes/utils/celery_tasks.py +++ b/routes/utils/celery_tasks.py @@ -513,37 +513,59 @@ def retry_task(task_id): return {"status": "error", "error": str(e)} -def get_all_tasks(): - """Get all active task IDs""" +def get_all_tasks(include_finished=False): + """Get all active task IDs, with an option to include finished tasks.""" try: - # Get all keys matching the task info pattern - task_keys = redis_client.keys("task:*:info") - - # Extract task IDs from the keys - task_ids = [key.decode("utf-8").split(":")[1] for key in task_keys] - - # Get info for each task + task_keys = redis_client.scan_iter("task:*:info") tasks = [] - for task_id in task_ids: - task_info = get_task_info(task_id) - last_status = get_last_task_status(task_id) - if task_info and last_status: - tasks.append( - { - "task_id": task_id, - "type": task_info.get("type", "unknown"), - "name": task_info.get("name", "Unknown"), - "artist": task_info.get("artist", ""), - "download_type": task_info.get("download_type", "unknown"), - "status": last_status.get("status", "unknown"), - "timestamp": last_status.get("timestamp", 0), - } - ) + TERMINAL_STATES = { + ProgressState.COMPLETE, + ProgressState.DONE, + ProgressState.CANCELLED, + ProgressState.ERROR, + ProgressState.ERROR_AUTO_CLEANED, + ProgressState.ERROR_RETRIED, + } + + for key in task_keys: + task_id = key.decode("utf-8").split(":")[1] + last_status = get_last_task_status(task_id) + current_status = None + + if last_status: + # Accommodate for status being nested inside 'status_info' or at the top level + if "status" in last_status: + current_status = last_status.get("status") + elif isinstance(last_status.get("status_info"), dict): + current_status = last_status.get("status_info", {}).get("status") + + is_terminal = current_status in TERMINAL_STATES + if not include_finished and is_terminal: + continue # Skip terminal tasks if not requested + + task_info = get_task_info(task_id) + if task_info: + task_summary = { + "task_id": task_id, + "type": task_info.get("type", "unknown"), + "name": task_info.get("name", "Unknown"), + "artist": task_info.get("artist", ""), + "download_type": task_info.get("download_type", "unknown"), + "created_at": task_info.get("created_at", 0), + } + if last_status: + task_summary["status"] = current_status if current_status else "unknown" + task_summary["summary"] = last_status.get("summary") + else: + task_summary["status"] = "unknown" + task_summary["summary"] = None + + tasks.append(task_summary) return tasks except Exception as e: - logger.error(f"Error getting all tasks: {e}") + logger.error(f"Error getting all tasks: {e}", exc_info=True) return [] @@ -564,7 +586,7 @@ class ProgressTrackingTask(Task): task_id = self.request.id # Ensure ./logs/tasks directory exists - logs_tasks_dir = Path("./logs/tasks") # Using relative path as per your update + logs_tasks_dir = Path("./logs/tasks") try: logs_tasks_dir.mkdir(parents=True, exist_ok=True) except Exception as e: @@ -578,235 +600,118 @@ class ProgressTrackingTask(Task): # Log progress_data to the task-specific file try: with open(log_file_path, "a") as log_file: - # Add a timestamp to the log entry if not present, for consistency in the file log_entry = progress_data.copy() if "timestamp" not in log_entry: log_entry["timestamp"] = time.time() - print(json.dumps(log_entry), file=log_file) # Use print to file + print(json.dumps(log_entry), file=log_file) except Exception as e: logger.error( f"Task {task_id}: Could not write to task log file {log_file_path}: {e}" ) - # Add timestamp if not present if "timestamp" not in progress_data: progress_data["timestamp"] = time.time() - # Get status type status = progress_data.get("status", "unknown") - - # Get task info for context task_info = get_task_info(task_id) - # Log raw progress data at debug level if logger.isEnabledFor(logging.DEBUG): logger.debug( f"Task {task_id}: Raw progress data: {json.dumps(progress_data)}" ) - # Process based on status type using a more streamlined approach if status == "initializing": - # --- INITIALIZING: Start of a download operation --- self._handle_initializing(task_id, progress_data, task_info) - elif status == "downloading": - # --- DOWNLOADING: Track download started --- self._handle_downloading(task_id, progress_data, task_info) - elif status == "progress": - # --- PROGRESS: Album/playlist track progress --- self._handle_progress(task_id, progress_data, task_info) - - elif status == "real_time" or status == "track_progress": - # --- REAL_TIME/TRACK_PROGRESS: Track download real-time progress --- + elif status in ["real_time", "track_progress"]: self._handle_real_time(task_id, progress_data) - elif status == "skipped": - # --- SKIPPED: Track was skipped --- self._handle_skipped(task_id, progress_data, task_info) - elif status == "retrying": - # --- RETRYING: Download failed and being retried --- self._handle_retrying(task_id, progress_data, task_info) - elif status == "error": - # --- ERROR: Error occurred during download --- self._handle_error(task_id, progress_data, task_info) - elif status == "done": - # --- DONE: Download operation completed --- self._handle_done(task_id, progress_data, task_info) - else: - # --- UNKNOWN: Unrecognized status --- logger.info( f"Task {task_id} {status}: {progress_data.get('message', 'No details')}" ) - # Embed the raw callback data into the status object before storing progress_data["raw_callback"] = raw_callback_data - - # Store the processed status update store_task_status(task_id, progress_data) def _handle_initializing(self, task_id, data, task_info): """Handle initializing status from deezspot""" - # Extract relevant fields - content_type = data.get("type", "").upper() - name = data.get("name", "") - album_name = data.get("album", "") - artist = data.get("artist", "") - total_tracks = data.get("total_tracks", 0) - - # Use album name as name if name is empty - if not name and album_name: - data["name"] = album_name - - # Log initialization with appropriate detail level - if album_name and artist: - logger.info( - f"Task {task_id} initializing: {content_type} '{album_name}' by {artist} with {total_tracks} tracks" - ) - elif album_name: - logger.info( - f"Task {task_id} initializing: {content_type} '{album_name}' with {total_tracks} tracks" - ) - elif name: - logger.info( - f"Task {task_id} initializing: {content_type} '{name}' with {total_tracks} tracks" - ) - else: - logger.info( - f"Task {task_id} initializing: {content_type} with {total_tracks} tracks" - ) - - # Update task info with total tracks count - if total_tracks > 0: - task_info["total_tracks"] = total_tracks - task_info["completed_tracks"] = task_info.get("completed_tracks", 0) - task_info["skipped_tracks"] = task_info.get("skipped_tracks", 0) - store_task_info(task_id, task_info) - - # Update status in data - # data["status"] = ProgressState.INITIALIZING + logger.info(f"Task {task_id} initializing...") + # Initializing object is now very basic, mainly for acknowledging the start. + # More detailed info comes with 'progress' or 'downloading' states. + data["status"] = ProgressState.INITIALIZING def _handle_downloading(self, task_id, data, task_info): """Handle downloading status from deezspot""" - # Extract relevant fields - track_name = data.get("song", "Unknown") - artist = data.get("artist", "") - album = data.get("album", "") - download_type = data.get("type", "") + track_obj = data.get("track", {}) + track_name = track_obj.get("title", "Unknown") + + artists = track_obj.get("artists", []) + artist_name = artists[0].get("name", "") if artists else "" + + album_obj = track_obj.get("album", {}) + album_name = album_obj.get("title", "") - # Get parent task context - parent_type = task_info.get("type", "").lower() + logger.info(f"Task {task_id}: Starting download for track '{track_name}' by {artist_name}") - # If this is a track within an album/playlist, update progress - if parent_type in ["album", "playlist"] and download_type == "track": - total_tracks = task_info.get("total_tracks", 0) - current_track = task_info.get("current_track_num", 0) + 1 - - # Update task info - task_info["current_track_num"] = current_track - task_info["current_track"] = track_name - task_info["current_artist"] = artist - store_task_info(task_id, task_info) - - # Only calculate progress if we have total tracks - if total_tracks > 0: - overall_progress = min(int((current_track / total_tracks) * 100), 100) - data["overall_progress"] = overall_progress - data["parsed_current_track"] = current_track - data["parsed_total_tracks"] = total_tracks - - # Create a progress update for the album/playlist - progress_update = { - "status": ProgressState.DOWNLOADING, - "type": parent_type, - "track": track_name, - "current_track": f"{current_track}/{total_tracks}", - "album": album, - "artist": artist, - "timestamp": data["timestamp"], - "parent_task": True, - } - - # Store separate progress update - store_task_status(task_id, progress_update) - - # Log with appropriate detail level - if artist and album: - logger.info( - f"Task {task_id} downloading: '{track_name}' by {artist} from {album}" - ) - elif artist: - logger.info(f"Task {task_id} downloading: '{track_name}' by {artist}") - else: - logger.info(f"Task {task_id} downloading: '{track_name}'") - - # Update status - # data["status"] = ProgressState.DOWNLOADING + data["status"] = ProgressState.DOWNLOADING + data["song"] = track_name + data["artist"] = artist_name + data["album"] = album_name def _handle_progress(self, task_id, data, task_info): - """Handle progress status from deezspot""" - # Extract track info - track_name = data.get("track", data.get("song", "Unknown track")) - current_track_raw = data.get("current_track", "0") - album = data.get("album", "") - artist = data.get("artist", "") + """Handle progress status for albums/playlists from deezspot""" + item = data.get("playlist") or data.get("album", {}) + track = data.get("track", {}) + + item_name = item.get("title", "Unknown Item") + total_tracks = item.get("total_tracks", 0) + + track_name = track.get("title", "Unknown Track") + artists = track.get("artists", []) + artist_name = artists[0].get("name", "") if artists else "" + + # The 'progress' field in the callback is the track number being processed + current_track_num = data.get("progress", 0) - # Process artist if it's a list - if isinstance(artist, list) and len(artist) > 0: - data["artist_name"] = artist[0] - elif isinstance(artist, str): - data["artist_name"] = artist + if total_tracks > 0: + task_info["total_tracks"] = total_tracks + task_info["completed_tracks"] = current_track_num - 1 + task_info["current_track_num"] = current_track_num + store_task_info(task_id, task_info) + + overall_progress = min(int(((current_track_num -1) / total_tracks) * 100), 100) + data["overall_progress"] = overall_progress + data["parsed_current_track"] = current_track_num + data["parsed_total_tracks"] = total_tracks - # Parse track numbers from "current/total" format - if isinstance(current_track_raw, str) and "/" in current_track_raw: - try: - parts = current_track_raw.split("/") - current_track = int(parts[0]) - total_tracks = int(parts[1]) + logger.info(f"Task {task_id}: Progress on '{item_name}': Processing track {current_track_num}/{total_tracks} - '{track_name}'") - # Update with parsed values - data["parsed_current_track"] = current_track - data["parsed_total_tracks"] = total_tracks - - # Calculate percentage - overall_progress = min(int((current_track / total_tracks) * 100), 100) - data["overall_progress"] = overall_progress - - # Update task info - task_info["current_track_num"] = current_track - task_info["total_tracks"] = total_tracks - task_info["current_track"] = track_name - store_task_info(task_id, task_info) - - # Log progress with appropriate detail - artist_name = data.get("artist_name", artist) - if album and artist_name: - logger.info( - f"Task {task_id} progress: [{current_track}/{total_tracks}] {overall_progress}% - {track_name} by {artist_name} from {album}" - ) - elif album: - logger.info( - f"Task {task_id} progress: [{current_track}/{total_tracks}] {overall_progress}% - {track_name} from {album}" - ) - else: - logger.info( - f"Task {task_id} progress: [{current_track}/{total_tracks}] {overall_progress}% - {track_name}" - ) - - except (ValueError, IndexError) as e: - logger.error(f"Error parsing track numbers '{current_track_raw}': {e}") - - # Ensure correct status - # data["status"] = ProgressState.PROGRESS + data["status"] = ProgressState.PROGRESS + data["song"] = track_name + data["artist"] = artist_name + data["current_track"] = f"{current_track_num}/{total_tracks}" def _handle_real_time(self, task_id, data): """Handle real-time progress status from deezspot""" - # Extract track info - title = data.get("title", data.get("song", "Unknown")) + track_obj = data.get("track", {}) + track_name = track_obj.get("title", "Unknown Track") + percentage = data.get("percentage", 0) + + logger.debug(f"Task {task_id}: Real-time progress for '{track_name}': {percentage}%") + + data["status"] = ProgressState.TRACK_PROGRESS + data["song"] = track_name artist = data.get("artist", "Unknown") # Handle percent formatting diff --git a/spotizerr-ui/package.json b/spotizerr-ui/package.json index f2d0260..f40b2d6 100644 --- a/spotizerr-ui/package.json +++ b/spotizerr-ui/package.json @@ -19,6 +19,7 @@ "@tanstack/router-devtools": "^1.120.18", "@types/uuid": "^10.0.0", "axios": "^1.9.0", + "lucide-react": "^0.515.0", "react": "^19.1.0", "react-dom": "^19.1.0", "react-hook-form": "^7.57.0", @@ -44,5 +45,6 @@ "typescript": "~5.8.3", "typescript-eslint": "^8.30.1", "vite": "^6.3.5" - } + }, + "packageManager": "pnpm@10.12.1+sha512.f0dda8580f0ee9481c5c79a1d927b9164f2c478e90992ad268bbb2465a736984391d6333d2c327913578b2804af33474ca554ba29c04a8b13060a717675ae3ac" } diff --git a/spotizerr-ui/pnpm-lock.yaml b/spotizerr-ui/pnpm-lock.yaml index 2e4b915..bdad168 100644 --- a/spotizerr-ui/pnpm-lock.yaml +++ b/spotizerr-ui/pnpm-lock.yaml @@ -1,36 +1,40 @@ -lockfileVersion: "9.0" +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: + .: dependencies: - "@tailwindcss/postcss": + '@tailwindcss/postcss': specifier: ^4.1.8 version: 4.1.8 - "@tailwindcss/vite": + '@tailwindcss/vite': specifier: ^4.1.8 version: 4.1.8(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)) - "@tanstack/react-query": + '@tanstack/react-query': specifier: ^5.80.6 version: 5.80.6(react@19.1.0) - "@tanstack/react-router": + '@tanstack/react-router': specifier: ^1.120.18 version: 1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@tanstack/react-table": + '@tanstack/react-table': specifier: ^8.21.3 version: 8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@tanstack/router-devtools": + '@tanstack/router-devtools': specifier: ^1.120.18 version: 1.120.18(@tanstack/react-router@1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.120.17)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3) - "@types/uuid": + '@types/uuid': specifier: ^10.0.0 version: 10.0.0 axios: specifier: ^1.9.0 version: 1.9.0 + lucide-react: + specifier: ^0.515.0 + version: 0.515.0(react@19.1.0) react: specifier: ^19.1.0 version: 19.1.0 @@ -56,19 +60,19 @@ importers: specifier: ^11.1.0 version: 11.1.0 devDependencies: - "@eslint/js": + '@eslint/js': specifier: ^9.25.0 version: 9.28.0 - "@types/node": + '@types/node': specifier: ^22.15.30 version: 22.15.30 - "@types/react": + '@types/react': specifier: ^19.1.2 version: 19.1.6 - "@types/react-dom": + '@types/react-dom': specifier: ^19.1.2 version: 19.1.6(@types/react@19.1.6) - "@vitejs/plugin-react": + '@vitejs/plugin-react': specifier: ^4.4.1 version: 4.5.1(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1)) eslint: @@ -103,1154 +107,956 @@ importers: version: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1) packages: - "@alloc/quick-lru@5.2.0": - resolution: - { integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== } - engines: { node: ">=10" } - "@ampproject/remapping@2.3.0": - resolution: - { integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== } - engines: { node: ">=6.0.0" } + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} - "@babel/code-frame@7.27.1": - resolution: - { integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== } - engines: { node: ">=6.9.0" } + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} - "@babel/compat-data@7.27.5": - resolution: - { integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg== } - engines: { node: ">=6.9.0" } + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} - "@babel/core@7.27.4": - resolution: - { integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g== } - engines: { node: ">=6.9.0" } + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + engines: {node: '>=6.9.0'} - "@babel/generator@7.27.5": - resolution: - { integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw== } - engines: { node: ">=6.9.0" } + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} + engines: {node: '>=6.9.0'} - "@babel/helper-compilation-targets@7.27.2": - resolution: - { integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== } - engines: { node: ">=6.9.0" } + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + engines: {node: '>=6.9.0'} - "@babel/helper-module-imports@7.27.1": - resolution: - { integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== } - engines: { node: ">=6.9.0" } + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} - "@babel/helper-module-transforms@7.27.3": - resolution: - { integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== } - engines: { node: ">=6.9.0" } + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0 + '@babel/core': ^7.0.0 - "@babel/helper-plugin-utils@7.27.1": - resolution: - { integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== } - engines: { node: ">=6.9.0" } + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} - "@babel/helper-string-parser@7.27.1": - resolution: - { integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== } - engines: { node: ">=6.9.0" } + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} - "@babel/helper-validator-identifier@7.27.1": - resolution: - { integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== } - engines: { node: ">=6.9.0" } + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} - "@babel/helper-validator-option@7.27.1": - resolution: - { integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== } - engines: { node: ">=6.9.0" } + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} - "@babel/helpers@7.27.6": - resolution: - { integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== } - engines: { node: ">=6.9.0" } + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} - "@babel/parser@7.27.5": - resolution: - { integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg== } - engines: { node: ">=6.0.0" } + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + engines: {node: '>=6.0.0'} hasBin: true - "@babel/plugin-transform-react-jsx-self@7.27.1": - resolution: - { integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== } - engines: { node: ">=6.9.0" } + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/plugin-transform-react-jsx-source@7.27.1": - resolution: - { integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== } - engines: { node: ">=6.9.0" } + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 + '@babel/core': ^7.0.0-0 - "@babel/template@7.27.2": - resolution: - { integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== } - engines: { node: ">=6.9.0" } + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} - "@babel/traverse@7.27.4": - resolution: - { integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA== } - engines: { node: ">=6.9.0" } + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} + engines: {node: '>=6.9.0'} - "@babel/types@7.27.6": - resolution: - { integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q== } - engines: { node: ">=6.9.0" } + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + engines: {node: '>=6.9.0'} - "@esbuild/aix-ppc64@0.25.5": - resolution: - { integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA== } - engines: { node: ">=18" } + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - "@esbuild/android-arm64@0.25.5": - resolution: - { integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg== } - engines: { node: ">=18" } + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - "@esbuild/android-arm@0.25.5": - resolution: - { integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA== } - engines: { node: ">=18" } + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + engines: {node: '>=18'} cpu: [arm] os: [android] - "@esbuild/android-x64@0.25.5": - resolution: - { integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw== } - engines: { node: ">=18" } + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + engines: {node: '>=18'} cpu: [x64] os: [android] - "@esbuild/darwin-arm64@0.25.5": - resolution: - { integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ== } - engines: { node: ">=18" } + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-x64@0.25.5": - resolution: - { integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ== } - engines: { node: ">=18" } + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - "@esbuild/freebsd-arm64@0.25.5": - resolution: - { integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw== } - engines: { node: ">=18" } + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-x64@0.25.5": - resolution: - { integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw== } - engines: { node: ">=18" } + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - "@esbuild/linux-arm64@0.25.5": - resolution: - { integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg== } - engines: { node: ">=18" } + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm@0.25.5": - resolution: - { integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw== } - engines: { node: ">=18" } + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - "@esbuild/linux-ia32@0.25.5": - resolution: - { integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA== } - engines: { node: ">=18" } + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - "@esbuild/linux-loong64@0.25.5": - resolution: - { integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg== } - engines: { node: ">=18" } + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - "@esbuild/linux-mips64el@0.25.5": - resolution: - { integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg== } - engines: { node: ">=18" } + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - "@esbuild/linux-ppc64@0.25.5": - resolution: - { integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ== } - engines: { node: ">=18" } + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - "@esbuild/linux-riscv64@0.25.5": - resolution: - { integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA== } - engines: { node: ">=18" } + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - "@esbuild/linux-s390x@0.25.5": - resolution: - { integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ== } - engines: { node: ">=18" } + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - "@esbuild/linux-x64@0.25.5": - resolution: - { integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw== } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - "@esbuild/netbsd-arm64@0.25.5": - resolution: - { integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw== } - engines: { node: ">=18" } + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-x64@0.25.5": - resolution: - { integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ== } - engines: { node: ">=18" } + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - "@esbuild/openbsd-arm64@0.25.5": - resolution: - { integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw== } - engines: { node: ">=18" } + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-x64@0.25.5": - resolution: - { integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg== } - engines: { node: ">=18" } + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - "@esbuild/sunos-x64@0.25.5": - resolution: - { integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA== } - engines: { node: ">=18" } + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - "@esbuild/win32-arm64@0.25.5": - resolution: - { integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw== } - engines: { node: ">=18" } + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - "@esbuild/win32-ia32@0.25.5": - resolution: - { integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ== } - engines: { node: ">=18" } + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - "@esbuild/win32-x64@0.25.5": - resolution: - { integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g== } - engines: { node: ">=18" } + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - "@eslint-community/eslint-utils@4.7.0": - resolution: - { integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - "@eslint-community/regexpp@4.12.1": - resolution: - { integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - "@eslint/config-array@0.20.0": - resolution: - { integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - "@eslint/config-helpers@0.2.2": - resolution: - { integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/config-helpers@0.2.2': + resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - "@eslint/core@0.14.0": - resolution: - { integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - "@eslint/eslintrc@3.3.1": - resolution: - { integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - "@eslint/js@9.28.0": - resolution: - { integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/js@9.28.0': + resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - "@eslint/object-schema@2.1.6": - resolution: - { integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - "@eslint/plugin-kit@0.3.1": - resolution: - { integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/plugin-kit@0.3.1': + resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - "@humanfs/core@0.19.1": - resolution: - { integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== } - engines: { node: ">=18.18.0" } + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} - "@humanfs/node@0.16.6": - resolution: - { integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== } - engines: { node: ">=18.18.0" } + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} - "@humanwhocodes/module-importer@1.0.1": - resolution: - { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } - engines: { node: ">=12.22" } + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} - "@humanwhocodes/retry@0.3.1": - resolution: - { integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== } - engines: { node: ">=18.18" } + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} - "@humanwhocodes/retry@0.4.3": - resolution: - { integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== } - engines: { node: ">=18.18" } + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} - "@isaacs/fs-minipass@4.0.1": - resolution: - { integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== } - engines: { node: ">=18.0.0" } + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} - "@jridgewell/gen-mapping@0.3.8": - resolution: - { integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== } - engines: { node: ">=6.0.0" } + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} - "@jridgewell/resolve-uri@3.1.2": - resolution: - { integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== } - engines: { node: ">=6.0.0" } + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} - "@jridgewell/set-array@1.2.1": - resolution: - { integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== } - engines: { node: ">=6.0.0" } + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} - "@jridgewell/sourcemap-codec@1.5.0": - resolution: - { integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== } + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - "@jridgewell/trace-mapping@0.3.25": - resolution: - { integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== } + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - "@nodelib/fs.scandir@2.1.5": - resolution: - { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } - engines: { node: ">= 8" } + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} - "@nodelib/fs.stat@2.0.5": - resolution: - { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } - engines: { node: ">= 8" } + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} - "@nodelib/fs.walk@1.2.8": - resolution: - { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } - engines: { node: ">= 8" } + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} - "@pkgr/core@0.2.7": - resolution: - { integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg== } - engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - "@rolldown/pluginutils@1.0.0-beta.9": - resolution: - { integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w== } + '@rolldown/pluginutils@1.0.0-beta.9': + resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} - "@rollup/rollup-android-arm-eabi@4.42.0": - resolution: - { integrity: sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ== } + '@rollup/rollup-android-arm-eabi@4.42.0': + resolution: {integrity: sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==} cpu: [arm] os: [android] - "@rollup/rollup-android-arm64@4.42.0": - resolution: - { integrity: sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw== } + '@rollup/rollup-android-arm64@4.42.0': + resolution: {integrity: sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==} cpu: [arm64] os: [android] - "@rollup/rollup-darwin-arm64@4.42.0": - resolution: - { integrity: sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA== } + '@rollup/rollup-darwin-arm64@4.42.0': + resolution: {integrity: sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==} cpu: [arm64] os: [darwin] - "@rollup/rollup-darwin-x64@4.42.0": - resolution: - { integrity: sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA== } + '@rollup/rollup-darwin-x64@4.42.0': + resolution: {integrity: sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==} cpu: [x64] os: [darwin] - "@rollup/rollup-freebsd-arm64@4.42.0": - resolution: - { integrity: sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ== } + '@rollup/rollup-freebsd-arm64@4.42.0': + resolution: {integrity: sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==} cpu: [arm64] os: [freebsd] - "@rollup/rollup-freebsd-x64@4.42.0": - resolution: - { integrity: sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ== } + '@rollup/rollup-freebsd-x64@4.42.0': + resolution: {integrity: sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==} cpu: [x64] os: [freebsd] - "@rollup/rollup-linux-arm-gnueabihf@4.42.0": - resolution: - { integrity: sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A== } + '@rollup/rollup-linux-arm-gnueabihf@4.42.0': + resolution: {integrity: sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm-musleabihf@4.42.0": - resolution: - { integrity: sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ== } + '@rollup/rollup-linux-arm-musleabihf@4.42.0': + resolution: {integrity: sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm64-gnu@4.42.0": - resolution: - { integrity: sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q== } + '@rollup/rollup-linux-arm64-gnu@4.42.0': + resolution: {integrity: sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-arm64-musl@4.42.0": - resolution: - { integrity: sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g== } + '@rollup/rollup-linux-arm64-musl@4.42.0': + resolution: {integrity: sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-loongarch64-gnu@4.42.0": - resolution: - { integrity: sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg== } + '@rollup/rollup-linux-loongarch64-gnu@4.42.0': + resolution: {integrity: sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==} cpu: [loong64] os: [linux] - "@rollup/rollup-linux-powerpc64le-gnu@4.42.0": - resolution: - { integrity: sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA== } + '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': + resolution: {integrity: sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==} cpu: [ppc64] os: [linux] - "@rollup/rollup-linux-riscv64-gnu@4.42.0": - resolution: - { integrity: sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA== } + '@rollup/rollup-linux-riscv64-gnu@4.42.0': + resolution: {integrity: sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==} cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-riscv64-musl@4.42.0": - resolution: - { integrity: sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw== } + '@rollup/rollup-linux-riscv64-musl@4.42.0': + resolution: {integrity: sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==} cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-s390x-gnu@4.42.0": - resolution: - { integrity: sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw== } + '@rollup/rollup-linux-s390x-gnu@4.42.0': + resolution: {integrity: sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==} cpu: [s390x] os: [linux] - "@rollup/rollup-linux-x64-gnu@4.42.0": - resolution: - { integrity: sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw== } + '@rollup/rollup-linux-x64-gnu@4.42.0': + resolution: {integrity: sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==} cpu: [x64] os: [linux] - "@rollup/rollup-linux-x64-musl@4.42.0": - resolution: - { integrity: sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w== } + '@rollup/rollup-linux-x64-musl@4.42.0': + resolution: {integrity: sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==} cpu: [x64] os: [linux] - "@rollup/rollup-win32-arm64-msvc@4.42.0": - resolution: - { integrity: sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A== } + '@rollup/rollup-win32-arm64-msvc@4.42.0': + resolution: {integrity: sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==} cpu: [arm64] os: [win32] - "@rollup/rollup-win32-ia32-msvc@4.42.0": - resolution: - { integrity: sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g== } + '@rollup/rollup-win32-ia32-msvc@4.42.0': + resolution: {integrity: sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==} cpu: [ia32] os: [win32] - "@rollup/rollup-win32-x64-msvc@4.42.0": - resolution: - { integrity: sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA== } + '@rollup/rollup-win32-x64-msvc@4.42.0': + resolution: {integrity: sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==} cpu: [x64] os: [win32] - "@tailwindcss/node@4.1.8": - resolution: - { integrity: sha512-OWwBsbC9BFAJelmnNcrKuf+bka2ZxCE2A4Ft53Tkg4uoiE67r/PMEYwCsourC26E+kmxfwE0hVzMdxqeW+xu7Q== } + '@tailwindcss/node@4.1.8': + resolution: {integrity: sha512-OWwBsbC9BFAJelmnNcrKuf+bka2ZxCE2A4Ft53Tkg4uoiE67r/PMEYwCsourC26E+kmxfwE0hVzMdxqeW+xu7Q==} - "@tailwindcss/oxide-android-arm64@4.1.8": - resolution: - { integrity: sha512-Fbz7qni62uKYceWYvUjRqhGfZKwhZDQhlrJKGtnZfuNtHFqa8wmr+Wn74CTWERiW2hn3mN5gTpOoxWKk0jRxjg== } - engines: { node: ">= 10" } + '@tailwindcss/oxide-android-arm64@4.1.8': + resolution: {integrity: sha512-Fbz7qni62uKYceWYvUjRqhGfZKwhZDQhlrJKGtnZfuNtHFqa8wmr+Wn74CTWERiW2hn3mN5gTpOoxWKk0jRxjg==} + engines: {node: '>= 10'} cpu: [arm64] os: [android] - "@tailwindcss/oxide-darwin-arm64@4.1.8": - resolution: - { integrity: sha512-RdRvedGsT0vwVVDztvyXhKpsU2ark/BjgG0huo4+2BluxdXo8NDgzl77qh0T1nUxmM11eXwR8jA39ibvSTbi7A== } - engines: { node: ">= 10" } + '@tailwindcss/oxide-darwin-arm64@4.1.8': + resolution: {integrity: sha512-RdRvedGsT0vwVVDztvyXhKpsU2ark/BjgG0huo4+2BluxdXo8NDgzl77qh0T1nUxmM11eXwR8jA39ibvSTbi7A==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - "@tailwindcss/oxide-darwin-x64@4.1.8": - resolution: - { integrity: sha512-t6PgxjEMLp5Ovf7uMb2OFmb3kqzVTPPakWpBIFzppk4JE4ix0yEtbtSjPbU8+PZETpaYMtXvss2Sdkx8Vs4XRw== } - engines: { node: ">= 10" } + '@tailwindcss/oxide-darwin-x64@4.1.8': + resolution: {integrity: sha512-t6PgxjEMLp5Ovf7uMb2OFmb3kqzVTPPakWpBIFzppk4JE4ix0yEtbtSjPbU8+PZETpaYMtXvss2Sdkx8Vs4XRw==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] - "@tailwindcss/oxide-freebsd-x64@4.1.8": - resolution: - { integrity: sha512-g8C8eGEyhHTqwPStSwZNSrOlyx0bhK/V/+zX0Y+n7DoRUzyS8eMbVshVOLJTDDC+Qn9IJnilYbIKzpB9n4aBsg== } - engines: { node: ">= 10" } + '@tailwindcss/oxide-freebsd-x64@4.1.8': + resolution: {integrity: sha512-g8C8eGEyhHTqwPStSwZNSrOlyx0bhK/V/+zX0Y+n7DoRUzyS8eMbVshVOLJTDDC+Qn9IJnilYbIKzpB9n4aBsg==} + engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.8": - resolution: - { integrity: sha512-Jmzr3FA4S2tHhaC6yCjac3rGf7hG9R6Gf2z9i9JFcuyy0u79HfQsh/thifbYTF2ic82KJovKKkIB6Z9TdNhCXQ== } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.8': + resolution: {integrity: sha512-Jmzr3FA4S2tHhaC6yCjac3rGf7hG9R6Gf2z9i9JFcuyy0u79HfQsh/thifbYTF2ic82KJovKKkIB6Z9TdNhCXQ==} + engines: {node: '>= 10'} cpu: [arm] os: [linux] - "@tailwindcss/oxide-linux-arm64-gnu@4.1.8": - resolution: - { integrity: sha512-qq7jXtO1+UEtCmCeBBIRDrPFIVI4ilEQ97qgBGdwXAARrUqSn/L9fUrkb1XP/mvVtoVeR2bt/0L77xx53bPZ/Q== } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-arm64-gnu@4.1.8': + resolution: {integrity: sha512-qq7jXtO1+UEtCmCeBBIRDrPFIVI4ilEQ97qgBGdwXAARrUqSn/L9fUrkb1XP/mvVtoVeR2bt/0L77xx53bPZ/Q==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] - "@tailwindcss/oxide-linux-arm64-musl@4.1.8": - resolution: - { integrity: sha512-O6b8QesPbJCRshsNApsOIpzKt3ztG35gfX9tEf4arD7mwNinsoCKxkj8TgEE0YRjmjtO3r9FlJnT/ENd9EVefQ== } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-arm64-musl@4.1.8': + resolution: {integrity: sha512-O6b8QesPbJCRshsNApsOIpzKt3ztG35gfX9tEf4arD7mwNinsoCKxkj8TgEE0YRjmjtO3r9FlJnT/ENd9EVefQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] - "@tailwindcss/oxide-linux-x64-gnu@4.1.8": - resolution: - { integrity: sha512-32iEXX/pXwikshNOGnERAFwFSfiltmijMIAbUhnNyjFr3tmWmMJWQKU2vNcFX0DACSXJ3ZWcSkzNbaKTdngH6g== } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-x64-gnu@4.1.8': + resolution: {integrity: sha512-32iEXX/pXwikshNOGnERAFwFSfiltmijMIAbUhnNyjFr3tmWmMJWQKU2vNcFX0DACSXJ3ZWcSkzNbaKTdngH6g==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] - "@tailwindcss/oxide-linux-x64-musl@4.1.8": - resolution: - { integrity: sha512-s+VSSD+TfZeMEsCaFaHTaY5YNj3Dri8rST09gMvYQKwPphacRG7wbuQ5ZJMIJXN/puxPcg/nU+ucvWguPpvBDg== } - engines: { node: ">= 10" } + '@tailwindcss/oxide-linux-x64-musl@4.1.8': + resolution: {integrity: sha512-s+VSSD+TfZeMEsCaFaHTaY5YNj3Dri8rST09gMvYQKwPphacRG7wbuQ5ZJMIJXN/puxPcg/nU+ucvWguPpvBDg==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] - "@tailwindcss/oxide-wasm32-wasi@4.1.8": - resolution: - { integrity: sha512-CXBPVFkpDjM67sS1psWohZ6g/2/cd+cq56vPxK4JeawelxwK4YECgl9Y9TjkE2qfF+9/s1tHHJqrC4SS6cVvSg== } - engines: { node: ">=14.0.0" } + '@tailwindcss/oxide-wasm32-wasi@4.1.8': + resolution: {integrity: sha512-CXBPVFkpDjM67sS1psWohZ6g/2/cd+cq56vPxK4JeawelxwK4YECgl9Y9TjkE2qfF+9/s1tHHJqrC4SS6cVvSg==} + engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: - - "@napi-rs/wasm-runtime" - - "@emnapi/core" - - "@emnapi/runtime" - - "@tybys/wasm-util" - - "@emnapi/wasi-threads" + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' - tslib - "@tailwindcss/oxide-win32-arm64-msvc@4.1.8": - resolution: - { integrity: sha512-7GmYk1n28teDHUjPlIx4Z6Z4hHEgvP5ZW2QS9ygnDAdI/myh3HTHjDqtSqgu1BpRoI4OiLx+fThAyA1JePoENA== } - engines: { node: ">= 10" } + '@tailwindcss/oxide-win32-arm64-msvc@4.1.8': + resolution: {integrity: sha512-7GmYk1n28teDHUjPlIx4Z6Z4hHEgvP5ZW2QS9ygnDAdI/myh3HTHjDqtSqgu1BpRoI4OiLx+fThAyA1JePoENA==} + engines: {node: '>= 10'} cpu: [arm64] os: [win32] - "@tailwindcss/oxide-win32-x64-msvc@4.1.8": - resolution: - { integrity: sha512-fou+U20j+Jl0EHwK92spoWISON2OBnCazIc038Xj2TdweYV33ZRkS9nwqiUi2d/Wba5xg5UoHfvynnb/UB49cQ== } - engines: { node: ">= 10" } + '@tailwindcss/oxide-win32-x64-msvc@4.1.8': + resolution: {integrity: sha512-fou+U20j+Jl0EHwK92spoWISON2OBnCazIc038Xj2TdweYV33ZRkS9nwqiUi2d/Wba5xg5UoHfvynnb/UB49cQ==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] - "@tailwindcss/oxide@4.1.8": - resolution: - { integrity: sha512-d7qvv9PsM5N3VNKhwVUhpK6r4h9wtLkJ6lz9ZY9aeZgrUWk1Z8VPyqyDT9MZlem7GTGseRQHkeB1j3tC7W1P+A== } - engines: { node: ">= 10" } + '@tailwindcss/oxide@4.1.8': + resolution: {integrity: sha512-d7qvv9PsM5N3VNKhwVUhpK6r4h9wtLkJ6lz9ZY9aeZgrUWk1Z8VPyqyDT9MZlem7GTGseRQHkeB1j3tC7W1P+A==} + engines: {node: '>= 10'} - "@tailwindcss/postcss@4.1.8": - resolution: - { integrity: sha512-vB/vlf7rIky+w94aWMw34bWW1ka6g6C3xIOdICKX2GC0VcLtL6fhlLiafF0DVIwa9V6EHz8kbWMkS2s2QvvNlw== } + '@tailwindcss/postcss@4.1.8': + resolution: {integrity: sha512-vB/vlf7rIky+w94aWMw34bWW1ka6g6C3xIOdICKX2GC0VcLtL6fhlLiafF0DVIwa9V6EHz8kbWMkS2s2QvvNlw==} - "@tailwindcss/vite@4.1.8": - resolution: - { integrity: sha512-CQ+I8yxNV5/6uGaJjiuymgw0kEQiNKRinYbZXPdx1fk5WgiyReG0VaUx/Xq6aVNSUNJFzxm6o8FNKS5aMaim5A== } + '@tailwindcss/vite@4.1.8': + resolution: {integrity: sha512-CQ+I8yxNV5/6uGaJjiuymgw0kEQiNKRinYbZXPdx1fk5WgiyReG0VaUx/Xq6aVNSUNJFzxm6o8FNKS5aMaim5A==} peerDependencies: vite: ^5.2.0 || ^6 - "@tanstack/history@1.120.17": - resolution: - { integrity: sha512-k07LFI4Qo074IIaWzT/XjD0KlkGx2w1V3fnNtclKx0oAl8z4O9kCh6za+FPEIRe98xLgNFEiddDbJeAYGSlPtw== } - engines: { node: ">=12" } + '@tanstack/history@1.120.17': + resolution: {integrity: sha512-k07LFI4Qo074IIaWzT/XjD0KlkGx2w1V3fnNtclKx0oAl8z4O9kCh6za+FPEIRe98xLgNFEiddDbJeAYGSlPtw==} + engines: {node: '>=12'} - "@tanstack/query-core@5.80.6": - resolution: - { integrity: sha512-nl7YxT/TAU+VTf+e2zTkObGTyY8YZBMnbgeA1ee66lIVqzKlYursAII6z5t0e6rXgwUMJSV4dshBTNacNpZHbQ== } + '@tanstack/query-core@5.80.6': + resolution: {integrity: sha512-nl7YxT/TAU+VTf+e2zTkObGTyY8YZBMnbgeA1ee66lIVqzKlYursAII6z5t0e6rXgwUMJSV4dshBTNacNpZHbQ==} - "@tanstack/react-query@5.80.6": - resolution: - { integrity: sha512-izX+5CnkpON3NQGcEm3/d7LfFQNo9ZpFtX2QsINgCYK9LT2VCIdi8D3bMaMSNhrAJCznRoAkFic76uvLroALBw== } + '@tanstack/react-query@5.80.6': + resolution: {integrity: sha512-izX+5CnkpON3NQGcEm3/d7LfFQNo9ZpFtX2QsINgCYK9LT2VCIdi8D3bMaMSNhrAJCznRoAkFic76uvLroALBw==} peerDependencies: react: ^18 || ^19 - "@tanstack/react-router-devtools@1.120.18": - resolution: - { integrity: sha512-iYz1jp2AJG0a+FiyxKqpg44RM9KiVzChD57RsZTQylbwjPBF+dpP1GHhSwKPS99JgA10VhsB2moo3wc7wAsmvg== } - engines: { node: ">=12" } + '@tanstack/react-router-devtools@1.120.18': + resolution: {integrity: sha512-iYz1jp2AJG0a+FiyxKqpg44RM9KiVzChD57RsZTQylbwjPBF+dpP1GHhSwKPS99JgA10VhsB2moo3wc7wAsmvg==} + engines: {node: '>=12'} peerDependencies: - "@tanstack/react-router": ^1.120.18 - react: ">=18.0.0 || >=19.0.0" - react-dom: ">=18.0.0 || >=19.0.0" + '@tanstack/react-router': ^1.120.18 + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' - "@tanstack/react-router@1.120.18": - resolution: - { integrity: sha512-VXEP4L7We0XGKv1zRmttTbjPZfDXma6y9IV5Jo2yTrz4V4mhL4cPb7Do+shgW08dW16nJ0Yiy7VlxFd5P8LLeA== } - engines: { node: ">=12" } + '@tanstack/react-router@1.120.18': + resolution: {integrity: sha512-VXEP4L7We0XGKv1zRmttTbjPZfDXma6y9IV5Jo2yTrz4V4mhL4cPb7Do+shgW08dW16nJ0Yiy7VlxFd5P8LLeA==} + engines: {node: '>=12'} peerDependencies: - react: ">=18.0.0 || >=19.0.0" - react-dom: ">=18.0.0 || >=19.0.0" + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' - "@tanstack/react-store@0.7.1": - resolution: - { integrity: sha512-qUTEKdId6QPWGiWyKAPf/gkN29scEsz6EUSJ0C3HgLMgaqTAyBsQ2sMCfGVcqb+kkhEXAdjleCgH6LAPD6f2sA== } + '@tanstack/react-store@0.7.1': + resolution: {integrity: sha512-qUTEKdId6QPWGiWyKAPf/gkN29scEsz6EUSJ0C3HgLMgaqTAyBsQ2sMCfGVcqb+kkhEXAdjleCgH6LAPD6f2sA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - "@tanstack/react-table@8.21.3": - resolution: - { integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww== } - engines: { node: ">=12" } + '@tanstack/react-table@8.21.3': + resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} + engines: {node: '>=12'} peerDependencies: - react: ">=16.8" - react-dom: ">=16.8" + react: '>=16.8' + react-dom: '>=16.8' - "@tanstack/router-core@1.120.17": - resolution: - { integrity: sha512-AqNr/rJKua/q/BFcUJTFH1YNUWcLF7dzsRVlN+EdRyvGT4Vpz0wip2wroO5N/9A3463NIuLSacjiZI9UKO/4XQ== } - engines: { node: ">=12" } + '@tanstack/router-core@1.120.17': + resolution: {integrity: sha512-AqNr/rJKua/q/BFcUJTFH1YNUWcLF7dzsRVlN+EdRyvGT4Vpz0wip2wroO5N/9A3463NIuLSacjiZI9UKO/4XQ==} + engines: {node: '>=12'} - "@tanstack/router-devtools-core@1.120.17": - resolution: - { integrity: sha512-Ci2OV/hecsKy/ZXqK3gLS/h1Qg7OEl2Gy9c76iSYWIzroQ9nhKgsQ+qj+LxucImztWujNINXf23wkq5fVlR0EQ== } - engines: { node: ">=12" } + '@tanstack/router-devtools-core@1.120.17': + resolution: {integrity: sha512-Ci2OV/hecsKy/ZXqK3gLS/h1Qg7OEl2Gy9c76iSYWIzroQ9nhKgsQ+qj+LxucImztWujNINXf23wkq5fVlR0EQ==} + engines: {node: '>=12'} peerDependencies: - "@tanstack/router-core": ^1.120.17 + '@tanstack/router-core': ^1.120.17 csstype: ^3.0.10 - solid-js: ">=1.9.5" + solid-js: '>=1.9.5' tiny-invariant: ^1.3.3 peerDependenciesMeta: csstype: optional: true - "@tanstack/router-devtools@1.120.18": - resolution: - { integrity: sha512-9P74erkZQprhMIJftzein35WS0Fi2J+jOvNaaylX59k+2wjahYdSImIkICAEGmj2K5C51QsPFUrikYVTT591LA== } - engines: { node: ">=12" } + '@tanstack/router-devtools@1.120.18': + resolution: {integrity: sha512-9P74erkZQprhMIJftzein35WS0Fi2J+jOvNaaylX59k+2wjahYdSImIkICAEGmj2K5C51QsPFUrikYVTT591LA==} + engines: {node: '>=12'} peerDependencies: - "@tanstack/react-router": ^1.120.18 + '@tanstack/react-router': ^1.120.18 csstype: ^3.0.10 - react: ">=18.0.0 || >=19.0.0" - react-dom: ">=18.0.0 || >=19.0.0" + react: '>=18.0.0 || >=19.0.0' + react-dom: '>=18.0.0 || >=19.0.0' peerDependenciesMeta: csstype: optional: true - "@tanstack/store@0.7.1": - resolution: - { integrity: sha512-PjUQKXEXhLYj2X5/6c1Xn/0/qKY0IVFxTJweopRfF26xfjVyb14yALydJrHupDh3/d+1WKmfEgZPBVCmDkzzwg== } + '@tanstack/store@0.7.1': + resolution: {integrity: sha512-PjUQKXEXhLYj2X5/6c1Xn/0/qKY0IVFxTJweopRfF26xfjVyb14yALydJrHupDh3/d+1WKmfEgZPBVCmDkzzwg==} - "@tanstack/table-core@8.21.3": - resolution: - { integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg== } - engines: { node: ">=12" } + '@tanstack/table-core@8.21.3': + resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} + engines: {node: '>=12'} - "@types/babel__core@7.20.5": - resolution: - { integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== } + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - "@types/babel__generator@7.27.0": - resolution: - { integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== } + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - "@types/babel__template@7.4.4": - resolution: - { integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== } + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - "@types/babel__traverse@7.20.7": - resolution: - { integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng== } + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - "@types/estree@1.0.7": - resolution: - { integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== } + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - "@types/estree@1.0.8": - resolution: - { integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== } + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - "@types/json-schema@7.0.15": - resolution: - { integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== } + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - "@types/node@22.15.30": - resolution: - { integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA== } + '@types/node@22.15.30': + resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} - "@types/react-dom@19.1.6": - resolution: - { integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw== } + '@types/react-dom@19.1.6': + resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} peerDependencies: - "@types/react": ^19.0.0 + '@types/react': ^19.0.0 - "@types/react@19.1.6": - resolution: - { integrity: sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q== } + '@types/react@19.1.6': + resolution: {integrity: sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q==} - "@types/uuid@10.0.0": - resolution: - { integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== } + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - "@typescript-eslint/eslint-plugin@8.33.1": - resolution: - { integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/eslint-plugin@8.33.1': + resolution: {integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - "@typescript-eslint/parser": ^8.33.1 + '@typescript-eslint/parser': ^8.33.1 eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" + typescript: '>=4.8.4 <5.9.0' - "@typescript-eslint/parser@8.33.1": - resolution: - { integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/parser@8.33.1': + resolution: {integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" + typescript: '>=4.8.4 <5.9.0' - "@typescript-eslint/project-service@8.33.1": - resolution: - { integrity: sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/project-service@8.33.1': + resolution: {integrity: sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ">=4.8.4 <5.9.0" + typescript: '>=4.8.4 <5.9.0' - "@typescript-eslint/scope-manager@8.33.1": - resolution: - { integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/scope-manager@8.33.1': + resolution: {integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - "@typescript-eslint/tsconfig-utils@8.33.1": - resolution: - { integrity: sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/tsconfig-utils@8.33.1': + resolution: {integrity: sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ">=4.8.4 <5.9.0" + typescript: '>=4.8.4 <5.9.0' - "@typescript-eslint/type-utils@8.33.1": - resolution: - { integrity: sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/type-utils@8.33.1': + resolution: {integrity: sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" + typescript: '>=4.8.4 <5.9.0' - "@typescript-eslint/types@8.33.1": - resolution: - { integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/types@8.33.1': + resolution: {integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - "@typescript-eslint/typescript-estree@8.33.1": - resolution: - { integrity: sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/typescript-estree@8.33.1': + resolution: {integrity: sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: ">=4.8.4 <5.9.0" + typescript: '>=4.8.4 <5.9.0' - "@typescript-eslint/utils@8.33.1": - resolution: - { integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/utils@8.33.1': + resolution: {integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" + typescript: '>=4.8.4 <5.9.0' - "@typescript-eslint/visitor-keys@8.33.1": - resolution: - { integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/visitor-keys@8.33.1': + resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - "@vitejs/plugin-react@4.5.1": - resolution: - { integrity: sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A== } - engines: { node: ^14.18.0 || >=16.0.0 } + '@vitejs/plugin-react@4.5.1': + resolution: {integrity: sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 acorn-jsx@5.3.2: - resolution: - { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.14.1: - resolution: - { integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} hasBin: true ajv@6.12.6: - resolution: - { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ansi-styles@4.3.0: - resolution: - { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } - engines: { node: ">=8" } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} argparse@2.0.1: - resolution: - { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} asynckit@0.4.0: - resolution: - { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== } + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} axios@1.9.0: - resolution: - { integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg== } + resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} balanced-match@1.0.2: - resolution: - { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} brace-expansion@1.1.11: - resolution: - { integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== } + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: - resolution: - { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== } + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: - resolution: - { integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== } - engines: { node: ">=8" } + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} browserslist@4.25.0: - resolution: - { integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA== } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true call-bind-apply-helpers@1.0.2: - resolution: - { integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} callsites@3.1.0: - resolution: - { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } - engines: { node: ">=6" } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} caniuse-lite@1.0.30001721: - resolution: - { integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ== } + resolution: {integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==} chalk@4.1.2: - resolution: - { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } - engines: { node: ">=10" } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} chownr@3.0.0: - resolution: - { integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== } - engines: { node: ">=18" } + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} clsx@2.1.1: - resolution: - { integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== } - engines: { node: ">=6" } + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} color-convert@2.0.1: - resolution: - { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } - engines: { node: ">=7.0.0" } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} color-name@1.1.4: - resolution: - { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} combined-stream@1.0.8: - resolution: - { integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== } - engines: { node: ">= 0.8" } + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} concat-map@0.0.1: - resolution: - { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} convert-source-map@2.0.0: - resolution: - { integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== } + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cross-spawn@7.0.6: - resolution: - { integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== } - engines: { node: ">= 8" } + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} csstype@3.1.3: - resolution: - { integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== } + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} debug@4.4.1: - resolution: - { integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true deep-is@0.1.4: - resolution: - { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} delayed-stream@1.0.0: - resolution: - { integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} detect-libc@2.0.4: - resolution: - { integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA== } - engines: { node: ">=8" } + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} dunder-proto@1.0.1: - resolution: - { integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} electron-to-chromium@1.5.165: - resolution: - { integrity: sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw== } + resolution: {integrity: sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==} enhanced-resolve@5.18.1: - resolution: - { integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} es-define-property@1.0.1: - resolution: - { integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} es-errors@1.3.0: - resolution: - { integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} es-object-atoms@1.1.1: - resolution: - { integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: - resolution: - { integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} esbuild@0.25.5: - resolution: - { integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ== } - engines: { node: ">=18" } + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: - resolution: - { integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== } - engines: { node: ">=6" } + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} escape-string-regexp@4.0.0: - resolution: - { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } - engines: { node: ">=10" } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} eslint-config-prettier@10.1.5: - resolution: - { integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw== } + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} hasBin: true peerDependencies: - eslint: ">=7.0.0" + eslint: '>=7.0.0' eslint-plugin-prettier@5.4.1: - resolution: - { integrity: sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg== } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - "@types/eslint": ">=8.0.0" - eslint: ">=8.0.0" - eslint-config-prettier: ">= 7.0.0 <10.0.0 || >=10.1.0" - prettier: ">=3.0.0" + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' peerDependenciesMeta: - "@types/eslint": + '@types/eslint': optional: true eslint-config-prettier: optional: true eslint-plugin-react-hooks@5.2.0: - resolution: - { integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg== } - engines: { node: ">=10" } + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint-plugin-react-refresh@0.4.20: - resolution: - { integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA== } + resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} peerDependencies: - eslint: ">=8.40" + eslint: '>=8.40' eslint-scope@8.3.0: - resolution: - { integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: - resolution: - { integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@4.2.0: - resolution: - { integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@9.28.0: - resolution: - { integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: - jiti: "*" + jiti: '*' peerDependenciesMeta: jiti: optional: true espree@10.3.0: - resolution: - { integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: - resolution: - { integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== } - engines: { node: ">=0.10" } + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} esrecurse@4.3.0: - resolution: - { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} estraverse@5.3.0: - resolution: - { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} esutils@2.0.3: - resolution: - { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} fast-deep-equal@3.1.3: - resolution: - { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-diff@1.3.0: - resolution: - { integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== } + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} fast-glob@3.3.3: - resolution: - { integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== } - engines: { node: ">=8.6.0" } + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: - resolution: - { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: - resolution: - { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fastq@1.19.1: - resolution: - { integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== } + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fdir@6.4.5: - resolution: - { integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw== } + resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1258,684 +1064,561 @@ packages: optional: true file-entry-cache@8.0.0: - resolution: - { integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== } - engines: { node: ">=16.0.0" } + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} fill-range@7.1.1: - resolution: - { integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== } - engines: { node: ">=8" } + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} find-up@5.0.0: - resolution: - { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } - engines: { node: ">=10" } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} flat-cache@4.0.1: - resolution: - { integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== } - engines: { node: ">=16" } + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.3: - resolution: - { integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== } + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} follow-redirects@1.15.9: - resolution: - { integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} peerDependencies: - debug: "*" + debug: '*' peerDependenciesMeta: debug: optional: true form-data@4.0.3: - resolution: - { integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA== } - engines: { node: ">= 6" } + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + engines: {node: '>= 6'} fsevents@2.3.3: - resolution: - { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] function-bind@1.1.2: - resolution: - { integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} gensync@1.0.0-beta.2: - resolution: - { integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== } - engines: { node: ">=6.9.0" } + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} get-intrinsic@1.3.0: - resolution: - { integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} get-proto@1.0.1: - resolution: - { integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} glob-parent@5.1.2: - resolution: - { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } - engines: { node: ">= 6" } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} glob-parent@6.0.2: - resolution: - { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} globals@11.12.0: - resolution: - { integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== } - engines: { node: ">=4" } + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} globals@14.0.0: - resolution: - { integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== } - engines: { node: ">=18" } + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} globals@16.2.0: - resolution: - { integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg== } - engines: { node: ">=18" } + resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} + engines: {node: '>=18'} goober@2.1.16: - resolution: - { integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g== } + resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==} peerDependencies: csstype: ^3.0.10 gopd@1.2.0: - resolution: - { integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: - resolution: - { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: - resolution: - { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== } + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} has-flag@4.0.0: - resolution: - { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } - engines: { node: ">=8" } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} has-symbols@1.1.0: - resolution: - { integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} has-tostringtag@1.0.2: - resolution: - { integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} hasown@2.0.2: - resolution: - { integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} ignore@5.3.2: - resolution: - { integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== } - engines: { node: ">= 4" } + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} ignore@7.0.5: - resolution: - { integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== } - engines: { node: ">= 4" } + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} import-fresh@3.3.1: - resolution: - { integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== } - engines: { node: ">=6" } + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} imurmurhash@0.1.4: - resolution: - { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } - engines: { node: ">=0.8.19" } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} is-extglob@2.1.1: - resolution: - { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-glob@4.0.3: - resolution: - { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-number@7.0.0: - resolution: - { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } - engines: { node: ">=0.12.0" } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} isexe@2.0.0: - resolution: - { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} jiti@2.4.2: - resolution: - { integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== } + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true js-tokens@4.0.0: - resolution: - { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@4.1.0: - resolution: - { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true jsesc@3.1.0: - resolution: - { integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== } - engines: { node: ">=6" } + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: - resolution: - { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-schema-traverse@0.4.1: - resolution: - { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: - resolution: - { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} json5@2.2.3: - resolution: - { integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== } - engines: { node: ">=6" } + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true keyv@4.5.4: - resolution: - { integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== } + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} levn@0.4.1: - resolution: - { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} lightningcss-darwin-arm64@1.30.1: - resolution: - { integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.30.1: - resolution: - { integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.30.1: - resolution: - { integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.30.1: - resolution: - { integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.30.1: - resolution: - { integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] lightningcss-linux-arm64-musl@1.30.1: - resolution: - { integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] lightningcss-linux-x64-gnu@1.30.1: - resolution: - { integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] lightningcss-linux-x64-musl@1.30.1: - resolution: - { integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] lightningcss-win32-arm64-msvc@1.30.1: - resolution: - { integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.30.1: - resolution: - { integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] lightningcss@1.30.1: - resolution: - { integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} locate-path@6.0.0: - resolution: - { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } - engines: { node: ">=10" } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} lodash.merge@4.6.2: - resolution: - { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lru-cache@5.1.1: - resolution: - { integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== } + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lucide-react@0.515.0: + resolution: {integrity: sha512-Sy7bY0MeicRm2pzrnoHm2h6C1iVoeHyBU2fjdQDsXGP51fhkhau1/ZV/dzrcxEmAKsxYb6bGaIsMnGHuQ5s0dw==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 magic-string@0.30.17: - resolution: - { integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== } + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} math-intrinsics@1.1.0: - resolution: - { integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} merge2@1.4.1: - resolution: - { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } - engines: { node: ">= 8" } + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} micromatch@4.0.8: - resolution: - { integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} mime-db@1.52.0: - resolution: - { integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} mime-types@2.1.35: - resolution: - { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== } - engines: { node: ">= 0.6" } + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} minimatch@3.1.2: - resolution: - { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@9.0.5: - resolution: - { integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minipass@7.1.2: - resolution: - { integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} minizlib@3.0.2: - resolution: - { integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA== } - engines: { node: ">= 18" } + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} mkdirp@3.0.1: - resolution: - { integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== } - engines: { node: ">=10" } + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} hasBin: true ms@2.1.3: - resolution: - { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} nanoid@3.3.11: - resolution: - { integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: - resolution: - { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} node-releases@2.0.19: - resolution: - { integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== } + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} optionator@0.9.4: - resolution: - { integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} p-limit@3.1.0: - resolution: - { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } - engines: { node: ">=10" } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-locate@5.0.0: - resolution: - { integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== } - engines: { node: ">=10" } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} parent-module@1.0.1: - resolution: - { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } - engines: { node: ">=6" } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} path-exists@4.0.0: - resolution: - { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } - engines: { node: ">=8" } + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-key@3.1.1: - resolution: - { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } - engines: { node: ">=8" } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} picocolors@1.1.1: - resolution: - { integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: - resolution: - { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} picomatch@4.0.2: - resolution: - { integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== } - engines: { node: ">=12" } + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} postcss@8.5.4: - resolution: - { integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w== } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} + engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: - resolution: - { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} prettier-linter-helpers@1.0.0: - resolution: - { integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== } - engines: { node: ">=6.0.0" } + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} prettier@3.5.3: - resolution: - { integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== } - engines: { node: ">=14" } + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} hasBin: true proxy-from-env@1.1.0: - resolution: - { integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== } + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} punycode@2.3.1: - resolution: - { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } - engines: { node: ">=6" } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} queue-microtask@1.2.3: - resolution: - { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} react-dom@19.1.0: - resolution: - { integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== } + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: react: ^19.1.0 react-hook-form@7.57.0: - resolution: - { integrity: sha512-RbEks3+cbvTP84l/VXGUZ+JMrKOS8ykQCRYdm5aYsxnDquL0vspsyNhGRO7pcH6hsZqWlPOjLye7rJqdtdAmlg== } - engines: { node: ">=18.0.0" } + resolution: {integrity: sha512-RbEks3+cbvTP84l/VXGUZ+JMrKOS8ykQCRYdm5aYsxnDquL0vspsyNhGRO7pcH6hsZqWlPOjLye7rJqdtdAmlg==} + engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 react-icons@5.5.0: - resolution: - { integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw== } + resolution: {integrity: sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==} peerDependencies: - react: "*" + react: '*' react-refresh@0.17.0: - resolution: - { integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} react@19.1.0: - resolution: - { integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} resolve-from@4.0.0: - resolution: - { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } - engines: { node: ">=4" } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} reusify@1.1.0: - resolution: - { integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rollup@4.42.0: - resolution: - { integrity: sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw== } - engines: { node: ">=18.0.0", npm: ">=8.0.0" } + resolution: {integrity: sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-parallel@1.2.0: - resolution: - { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} scheduler@0.26.0: - resolution: - { integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== } + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} semver@6.3.1: - resolution: - { integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true semver@7.7.2: - resolution: - { integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== } - engines: { node: ">=10" } + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} hasBin: true seroval-plugins@1.3.2: - resolution: - { integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ== } - engines: { node: ">=10" } + resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} + engines: {node: '>=10'} peerDependencies: seroval: ^1.0 seroval@1.3.2: - resolution: - { integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ== } - engines: { node: ">=10" } + resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} + engines: {node: '>=10'} shebang-command@2.0.0: - resolution: - { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } - engines: { node: ">=8" } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} shebang-regex@3.0.0: - resolution: - { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } - engines: { node: ">=8" } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} solid-js@1.9.7: - resolution: - { integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw== } + resolution: {integrity: sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==} sonner@2.0.5: - resolution: - { integrity: sha512-YwbHQO6cSso3HBXlbCkgrgzDNIhws14r4MO87Ofy+cV2X7ES4pOoAK3+veSmVTvqNx1BWUxlhPmZzP00Crk2aQ== } + resolution: {integrity: sha512-YwbHQO6cSso3HBXlbCkgrgzDNIhws14r4MO87Ofy+cV2X7ES4pOoAK3+veSmVTvqNx1BWUxlhPmZzP00Crk2aQ==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc source-map-js@1.2.1: - resolution: - { integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} strip-json-comments@3.1.1: - resolution: - { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } - engines: { node: ">=8" } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} supports-color@7.2.0: - resolution: - { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } - engines: { node: ">=8" } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} synckit@0.11.8: - resolution: - { integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A== } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + engines: {node: ^14.18.0 || >=16.0.0} tailwindcss@4.1.8: - resolution: - { integrity: sha512-kjeW8gjdxasbmFKpVGrGd5T4i40mV5J2Rasw48QARfYeQ8YS9x02ON9SFWax3Qf616rt4Cp3nVNIj6Hd1mP3og== } + resolution: {integrity: sha512-kjeW8gjdxasbmFKpVGrGd5T4i40mV5J2Rasw48QARfYeQ8YS9x02ON9SFWax3Qf616rt4Cp3nVNIj6Hd1mP3og==} tapable@2.2.2: - resolution: - { integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== } - engines: { node: ">=6" } + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} tar@7.4.3: - resolution: - { integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== } - engines: { node: ">=18" } + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} tiny-invariant@1.3.3: - resolution: - { integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== } + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} tiny-warning@1.0.3: - resolution: - { integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== } + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} tinyglobby@0.2.14: - resolution: - { integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} to-regex-range@5.0.1: - resolution: - { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } - engines: { node: ">=8.0" } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} ts-api-utils@2.1.0: - resolution: - { integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== } - engines: { node: ">=18.12" } + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} peerDependencies: - typescript: ">=4.8.4" + typescript: '>=4.8.4' type-check@0.4.0: - resolution: - { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} typescript-eslint@8.33.1: - resolution: - { integrity: sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A== } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" + typescript: '>=4.8.4 <5.9.0' typescript@5.8.3: - resolution: - { integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== } - engines: { node: ">=14.17" } + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} hasBin: true undici-types@6.21.0: - resolution: - { integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== } + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} update-browserslist-db@1.1.3: - resolution: - { integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== } + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: - browserslist: ">= 4.21.0" + browserslist: '>= 4.21.0' uri-js@4.4.1: - resolution: - { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} use-debounce@10.0.5: - resolution: - { integrity: sha512-Q76E3lnIV+4YT9AHcrHEHYmAd9LKwUAbPXDm7FlqVGDHiSOhX3RDjT8dm0AxbJup6WgOb1YEcKyCr11kBJR5KQ== } - engines: { node: ">= 16.0.0" } + resolution: {integrity: sha512-Q76E3lnIV+4YT9AHcrHEHYmAd9LKwUAbPXDm7FlqVGDHiSOhX3RDjT8dm0AxbJup6WgOb1YEcKyCr11kBJR5KQ==} + engines: {node: '>= 16.0.0'} peerDependencies: - react: "*" + react: '*' use-sync-external-store@1.5.0: - resolution: - { integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A== } + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 uuid@11.1.0: - resolution: - { integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== } + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true vite@6.3.5: - resolution: - { integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ== } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: ">=1.21.0" - less: "*" + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - "@types/node": + '@types/node': optional: true jiti: optional: true @@ -1959,58 +1642,54 @@ packages: optional: true which@2.0.2: - resolution: - { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } - engines: { node: ">= 8" } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true word-wrap@1.2.5: - resolution: - { integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} yallist@3.1.1: - resolution: - { integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== } + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yallist@5.0.0: - resolution: - { integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== } - engines: { node: ">=18" } + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} yocto-queue@0.1.0: - resolution: - { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } - engines: { node: ">=10" } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} snapshots: - "@alloc/quick-lru@5.2.0": {} - "@ampproject/remapping@2.3.0": - dependencies: - "@jridgewell/gen-mapping": 0.3.8 - "@jridgewell/trace-mapping": 0.3.25 + '@alloc/quick-lru@5.2.0': {} - "@babel/code-frame@7.27.1": + '@ampproject/remapping@2.3.0': dependencies: - "@babel/helper-validator-identifier": 7.27.1 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - "@babel/compat-data@7.27.5": {} + '@babel/compat-data@7.27.5': {} - "@babel/core@7.27.4": + '@babel/core@7.27.4': dependencies: - "@ampproject/remapping": 2.3.0 - "@babel/code-frame": 7.27.1 - "@babel/generator": 7.27.5 - "@babel/helper-compilation-targets": 7.27.2 - "@babel/helper-module-transforms": 7.27.3(@babel/core@7.27.4) - "@babel/helpers": 7.27.6 - "@babel/parser": 7.27.5 - "@babel/template": 7.27.2 - "@babel/traverse": 7.27.4 - "@babel/types": 7.27.6 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -2019,185 +1698,185 @@ snapshots: transitivePeerDependencies: - supports-color - "@babel/generator@7.27.5": + '@babel/generator@7.27.5': dependencies: - "@babel/parser": 7.27.5 - "@babel/types": 7.27.6 - "@jridgewell/gen-mapping": 0.3.8 - "@jridgewell/trace-mapping": 0.3.25 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - "@babel/helper-compilation-targets@7.27.2": + '@babel/helper-compilation-targets@7.27.2': dependencies: - "@babel/compat-data": 7.27.5 - "@babel/helper-validator-option": 7.27.1 + '@babel/compat-data': 7.27.5 + '@babel/helper-validator-option': 7.27.1 browserslist: 4.25.0 lru-cache: 5.1.1 semver: 6.3.1 - "@babel/helper-module-imports@7.27.1": + '@babel/helper-module-imports@7.27.1': dependencies: - "@babel/traverse": 7.27.4 - "@babel/types": 7.27.6 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - "@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)": + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': dependencies: - "@babel/core": 7.27.4 - "@babel/helper-module-imports": 7.27.1 - "@babel/helper-validator-identifier": 7.27.1 - "@babel/traverse": 7.27.4 + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 transitivePeerDependencies: - supports-color - "@babel/helper-plugin-utils@7.27.1": {} + '@babel/helper-plugin-utils@7.27.1': {} - "@babel/helper-string-parser@7.27.1": {} + '@babel/helper-string-parser@7.27.1': {} - "@babel/helper-validator-identifier@7.27.1": {} + '@babel/helper-validator-identifier@7.27.1': {} - "@babel/helper-validator-option@7.27.1": {} + '@babel/helper-validator-option@7.27.1': {} - "@babel/helpers@7.27.6": + '@babel/helpers@7.27.6': dependencies: - "@babel/template": 7.27.2 - "@babel/types": 7.27.6 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 - "@babel/parser@7.27.5": + '@babel/parser@7.27.5': dependencies: - "@babel/types": 7.27.6 + '@babel/types': 7.27.6 - "@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)": + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)': dependencies: - "@babel/core": 7.27.4 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)": + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)': dependencies: - "@babel/core": 7.27.4 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/template@7.27.2": + '@babel/template@7.27.2': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/parser": 7.27.5 - "@babel/types": 7.27.6 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 - "@babel/traverse@7.27.4": + '@babel/traverse@7.27.4': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/generator": 7.27.5 - "@babel/parser": 7.27.5 - "@babel/template": 7.27.2 - "@babel/types": 7.27.6 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - "@babel/types@7.27.6": + '@babel/types@7.27.6': dependencies: - "@babel/helper-string-parser": 7.27.1 - "@babel/helper-validator-identifier": 7.27.1 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 - "@esbuild/aix-ppc64@0.25.5": + '@esbuild/aix-ppc64@0.25.5': optional: true - "@esbuild/android-arm64@0.25.5": + '@esbuild/android-arm64@0.25.5': optional: true - "@esbuild/android-arm@0.25.5": + '@esbuild/android-arm@0.25.5': optional: true - "@esbuild/android-x64@0.25.5": + '@esbuild/android-x64@0.25.5': optional: true - "@esbuild/darwin-arm64@0.25.5": + '@esbuild/darwin-arm64@0.25.5': optional: true - "@esbuild/darwin-x64@0.25.5": + '@esbuild/darwin-x64@0.25.5': optional: true - "@esbuild/freebsd-arm64@0.25.5": + '@esbuild/freebsd-arm64@0.25.5': optional: true - "@esbuild/freebsd-x64@0.25.5": + '@esbuild/freebsd-x64@0.25.5': optional: true - "@esbuild/linux-arm64@0.25.5": + '@esbuild/linux-arm64@0.25.5': optional: true - "@esbuild/linux-arm@0.25.5": + '@esbuild/linux-arm@0.25.5': optional: true - "@esbuild/linux-ia32@0.25.5": + '@esbuild/linux-ia32@0.25.5': optional: true - "@esbuild/linux-loong64@0.25.5": + '@esbuild/linux-loong64@0.25.5': optional: true - "@esbuild/linux-mips64el@0.25.5": + '@esbuild/linux-mips64el@0.25.5': optional: true - "@esbuild/linux-ppc64@0.25.5": + '@esbuild/linux-ppc64@0.25.5': optional: true - "@esbuild/linux-riscv64@0.25.5": + '@esbuild/linux-riscv64@0.25.5': optional: true - "@esbuild/linux-s390x@0.25.5": + '@esbuild/linux-s390x@0.25.5': optional: true - "@esbuild/linux-x64@0.25.5": + '@esbuild/linux-x64@0.25.5': optional: true - "@esbuild/netbsd-arm64@0.25.5": + '@esbuild/netbsd-arm64@0.25.5': optional: true - "@esbuild/netbsd-x64@0.25.5": + '@esbuild/netbsd-x64@0.25.5': optional: true - "@esbuild/openbsd-arm64@0.25.5": + '@esbuild/openbsd-arm64@0.25.5': optional: true - "@esbuild/openbsd-x64@0.25.5": + '@esbuild/openbsd-x64@0.25.5': optional: true - "@esbuild/sunos-x64@0.25.5": + '@esbuild/sunos-x64@0.25.5': optional: true - "@esbuild/win32-arm64@0.25.5": + '@esbuild/win32-arm64@0.25.5': optional: true - "@esbuild/win32-ia32@0.25.5": + '@esbuild/win32-ia32@0.25.5': optional: true - "@esbuild/win32-x64@0.25.5": + '@esbuild/win32-x64@0.25.5': optional: true - "@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))": + '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))': dependencies: eslint: 9.28.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - "@eslint-community/regexpp@4.12.1": {} + '@eslint-community/regexpp@4.12.1': {} - "@eslint/config-array@0.20.0": + '@eslint/config-array@0.20.0': dependencies: - "@eslint/object-schema": 2.1.6 + '@eslint/object-schema': 2.1.6 debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - "@eslint/config-helpers@0.2.2": {} + '@eslint/config-helpers@0.2.2': {} - "@eslint/core@0.14.0": + '@eslint/core@0.14.0': dependencies: - "@types/json-schema": 7.0.15 + '@types/json-schema': 7.0.15 - "@eslint/eslintrc@3.3.1": + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.1 @@ -2211,128 +1890,128 @@ snapshots: transitivePeerDependencies: - supports-color - "@eslint/js@9.28.0": {} + '@eslint/js@9.28.0': {} - "@eslint/object-schema@2.1.6": {} + '@eslint/object-schema@2.1.6': {} - "@eslint/plugin-kit@0.3.1": + '@eslint/plugin-kit@0.3.1': dependencies: - "@eslint/core": 0.14.0 + '@eslint/core': 0.14.0 levn: 0.4.1 - "@humanfs/core@0.19.1": {} + '@humanfs/core@0.19.1': {} - "@humanfs/node@0.16.6": + '@humanfs/node@0.16.6': dependencies: - "@humanfs/core": 0.19.1 - "@humanwhocodes/retry": 0.3.1 + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 - "@humanwhocodes/module-importer@1.0.1": {} + '@humanwhocodes/module-importer@1.0.1': {} - "@humanwhocodes/retry@0.3.1": {} + '@humanwhocodes/retry@0.3.1': {} - "@humanwhocodes/retry@0.4.3": {} + '@humanwhocodes/retry@0.4.3': {} - "@isaacs/fs-minipass@4.0.1": + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.2 - "@jridgewell/gen-mapping@0.3.8": + '@jridgewell/gen-mapping@0.3.8': dependencies: - "@jridgewell/set-array": 1.2.1 - "@jridgewell/sourcemap-codec": 1.5.0 - "@jridgewell/trace-mapping": 0.3.25 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 - "@jridgewell/resolve-uri@3.1.2": {} + '@jridgewell/resolve-uri@3.1.2': {} - "@jridgewell/set-array@1.2.1": {} + '@jridgewell/set-array@1.2.1': {} - "@jridgewell/sourcemap-codec@1.5.0": {} + '@jridgewell/sourcemap-codec@1.5.0': {} - "@jridgewell/trace-mapping@0.3.25": + '@jridgewell/trace-mapping@0.3.25': dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.5.0 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - "@nodelib/fs.scandir@2.1.5": + '@nodelib/fs.scandir@2.1.5': dependencies: - "@nodelib/fs.stat": 2.0.5 + '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - "@nodelib/fs.stat@2.0.5": {} + '@nodelib/fs.stat@2.0.5': {} - "@nodelib/fs.walk@1.2.8": + '@nodelib/fs.walk@1.2.8': dependencies: - "@nodelib/fs.scandir": 2.1.5 + '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - "@pkgr/core@0.2.7": {} + '@pkgr/core@0.2.7': {} - "@rolldown/pluginutils@1.0.0-beta.9": {} + '@rolldown/pluginutils@1.0.0-beta.9': {} - "@rollup/rollup-android-arm-eabi@4.42.0": + '@rollup/rollup-android-arm-eabi@4.42.0': optional: true - "@rollup/rollup-android-arm64@4.42.0": + '@rollup/rollup-android-arm64@4.42.0': optional: true - "@rollup/rollup-darwin-arm64@4.42.0": + '@rollup/rollup-darwin-arm64@4.42.0': optional: true - "@rollup/rollup-darwin-x64@4.42.0": + '@rollup/rollup-darwin-x64@4.42.0': optional: true - "@rollup/rollup-freebsd-arm64@4.42.0": + '@rollup/rollup-freebsd-arm64@4.42.0': optional: true - "@rollup/rollup-freebsd-x64@4.42.0": + '@rollup/rollup-freebsd-x64@4.42.0': optional: true - "@rollup/rollup-linux-arm-gnueabihf@4.42.0": + '@rollup/rollup-linux-arm-gnueabihf@4.42.0': optional: true - "@rollup/rollup-linux-arm-musleabihf@4.42.0": + '@rollup/rollup-linux-arm-musleabihf@4.42.0': optional: true - "@rollup/rollup-linux-arm64-gnu@4.42.0": + '@rollup/rollup-linux-arm64-gnu@4.42.0': optional: true - "@rollup/rollup-linux-arm64-musl@4.42.0": + '@rollup/rollup-linux-arm64-musl@4.42.0': optional: true - "@rollup/rollup-linux-loongarch64-gnu@4.42.0": + '@rollup/rollup-linux-loongarch64-gnu@4.42.0': optional: true - "@rollup/rollup-linux-powerpc64le-gnu@4.42.0": + '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': optional: true - "@rollup/rollup-linux-riscv64-gnu@4.42.0": + '@rollup/rollup-linux-riscv64-gnu@4.42.0': optional: true - "@rollup/rollup-linux-riscv64-musl@4.42.0": + '@rollup/rollup-linux-riscv64-musl@4.42.0': optional: true - "@rollup/rollup-linux-s390x-gnu@4.42.0": + '@rollup/rollup-linux-s390x-gnu@4.42.0': optional: true - "@rollup/rollup-linux-x64-gnu@4.42.0": + '@rollup/rollup-linux-x64-gnu@4.42.0': optional: true - "@rollup/rollup-linux-x64-musl@4.42.0": + '@rollup/rollup-linux-x64-musl@4.42.0': optional: true - "@rollup/rollup-win32-arm64-msvc@4.42.0": + '@rollup/rollup-win32-arm64-msvc@4.42.0': optional: true - "@rollup/rollup-win32-ia32-msvc@4.42.0": + '@rollup/rollup-win32-ia32-msvc@4.42.0': optional: true - "@rollup/rollup-win32-x64-msvc@4.42.0": + '@rollup/rollup-win32-x64-msvc@4.42.0': optional: true - "@tailwindcss/node@4.1.8": + '@tailwindcss/node@4.1.8': dependencies: - "@ampproject/remapping": 2.3.0 + '@ampproject/remapping': 2.3.0 enhanced-resolve: 5.18.1 jiti: 2.4.2 lightningcss: 1.30.1 @@ -2340,129 +2019,129 @@ snapshots: source-map-js: 1.2.1 tailwindcss: 4.1.8 - "@tailwindcss/oxide-android-arm64@4.1.8": + '@tailwindcss/oxide-android-arm64@4.1.8': optional: true - "@tailwindcss/oxide-darwin-arm64@4.1.8": + '@tailwindcss/oxide-darwin-arm64@4.1.8': optional: true - "@tailwindcss/oxide-darwin-x64@4.1.8": + '@tailwindcss/oxide-darwin-x64@4.1.8': optional: true - "@tailwindcss/oxide-freebsd-x64@4.1.8": + '@tailwindcss/oxide-freebsd-x64@4.1.8': optional: true - "@tailwindcss/oxide-linux-arm-gnueabihf@4.1.8": + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.8': optional: true - "@tailwindcss/oxide-linux-arm64-gnu@4.1.8": + '@tailwindcss/oxide-linux-arm64-gnu@4.1.8': optional: true - "@tailwindcss/oxide-linux-arm64-musl@4.1.8": + '@tailwindcss/oxide-linux-arm64-musl@4.1.8': optional: true - "@tailwindcss/oxide-linux-x64-gnu@4.1.8": + '@tailwindcss/oxide-linux-x64-gnu@4.1.8': optional: true - "@tailwindcss/oxide-linux-x64-musl@4.1.8": + '@tailwindcss/oxide-linux-x64-musl@4.1.8': optional: true - "@tailwindcss/oxide-wasm32-wasi@4.1.8": + '@tailwindcss/oxide-wasm32-wasi@4.1.8': optional: true - "@tailwindcss/oxide-win32-arm64-msvc@4.1.8": + '@tailwindcss/oxide-win32-arm64-msvc@4.1.8': optional: true - "@tailwindcss/oxide-win32-x64-msvc@4.1.8": + '@tailwindcss/oxide-win32-x64-msvc@4.1.8': optional: true - "@tailwindcss/oxide@4.1.8": + '@tailwindcss/oxide@4.1.8': dependencies: detect-libc: 2.0.4 tar: 7.4.3 optionalDependencies: - "@tailwindcss/oxide-android-arm64": 4.1.8 - "@tailwindcss/oxide-darwin-arm64": 4.1.8 - "@tailwindcss/oxide-darwin-x64": 4.1.8 - "@tailwindcss/oxide-freebsd-x64": 4.1.8 - "@tailwindcss/oxide-linux-arm-gnueabihf": 4.1.8 - "@tailwindcss/oxide-linux-arm64-gnu": 4.1.8 - "@tailwindcss/oxide-linux-arm64-musl": 4.1.8 - "@tailwindcss/oxide-linux-x64-gnu": 4.1.8 - "@tailwindcss/oxide-linux-x64-musl": 4.1.8 - "@tailwindcss/oxide-wasm32-wasi": 4.1.8 - "@tailwindcss/oxide-win32-arm64-msvc": 4.1.8 - "@tailwindcss/oxide-win32-x64-msvc": 4.1.8 + '@tailwindcss/oxide-android-arm64': 4.1.8 + '@tailwindcss/oxide-darwin-arm64': 4.1.8 + '@tailwindcss/oxide-darwin-x64': 4.1.8 + '@tailwindcss/oxide-freebsd-x64': 4.1.8 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.8 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.8 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.8 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.8 + '@tailwindcss/oxide-linux-x64-musl': 4.1.8 + '@tailwindcss/oxide-wasm32-wasi': 4.1.8 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.8 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.8 - "@tailwindcss/postcss@4.1.8": + '@tailwindcss/postcss@4.1.8': dependencies: - "@alloc/quick-lru": 5.2.0 - "@tailwindcss/node": 4.1.8 - "@tailwindcss/oxide": 4.1.8 + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.8 + '@tailwindcss/oxide': 4.1.8 postcss: 8.5.4 tailwindcss: 4.1.8 - "@tailwindcss/vite@4.1.8(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1))": + '@tailwindcss/vite@4.1.8(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1))': dependencies: - "@tailwindcss/node": 4.1.8 - "@tailwindcss/oxide": 4.1.8 + '@tailwindcss/node': 4.1.8 + '@tailwindcss/oxide': 4.1.8 tailwindcss: 4.1.8 vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1) - "@tanstack/history@1.120.17": {} + '@tanstack/history@1.120.17': {} - "@tanstack/query-core@5.80.6": {} + '@tanstack/query-core@5.80.6': {} - "@tanstack/react-query@5.80.6(react@19.1.0)": + '@tanstack/react-query@5.80.6(react@19.1.0)': dependencies: - "@tanstack/query-core": 5.80.6 + '@tanstack/query-core': 5.80.6 react: 19.1.0 - "@tanstack/react-router-devtools@1.120.18(@tanstack/react-router@1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.120.17)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3)": + '@tanstack/react-router-devtools@1.120.18(@tanstack/react-router@1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.120.17)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3)': dependencies: - "@tanstack/react-router": 1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@tanstack/router-devtools-core": 1.120.17(@tanstack/router-core@1.120.17)(csstype@3.1.3)(solid-js@1.9.7)(tiny-invariant@1.3.3) + '@tanstack/react-router': 1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-devtools-core': 1.120.17(@tanstack/router-core@1.120.17)(csstype@3.1.3)(solid-js@1.9.7)(tiny-invariant@1.3.3) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) solid-js: 1.9.7 transitivePeerDependencies: - - "@tanstack/router-core" + - '@tanstack/router-core' - csstype - tiny-invariant - "@tanstack/react-router@1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@tanstack/react-router@1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@tanstack/history": 1.120.17 - "@tanstack/react-store": 0.7.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@tanstack/router-core": 1.120.17 + '@tanstack/history': 1.120.17 + '@tanstack/react-store': 0.7.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/router-core': 1.120.17 jsesc: 3.1.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - "@tanstack/react-store@0.7.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@tanstack/react-store@0.7.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@tanstack/store": 0.7.1 + '@tanstack/store': 0.7.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) use-sync-external-store: 1.5.0(react@19.1.0) - "@tanstack/react-table@8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)": + '@tanstack/react-table@8.21.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - "@tanstack/table-core": 8.21.3 + '@tanstack/table-core': 8.21.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - "@tanstack/router-core@1.120.17": + '@tanstack/router-core@1.120.17': dependencies: - "@tanstack/history": 1.120.17 - "@tanstack/store": 0.7.1 + '@tanstack/history': 1.120.17 + '@tanstack/store': 0.7.1 tiny-invariant: 1.3.3 - "@tanstack/router-devtools-core@1.120.17(@tanstack/router-core@1.120.17)(csstype@3.1.3)(solid-js@1.9.7)(tiny-invariant@1.3.3)": + '@tanstack/router-devtools-core@1.120.17(@tanstack/router-core@1.120.17)(csstype@3.1.3)(solid-js@1.9.7)(tiny-invariant@1.3.3)': dependencies: - "@tanstack/router-core": 1.120.17 + '@tanstack/router-core': 1.120.17 clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) solid-js: 1.9.7 @@ -2470,10 +2149,10 @@ snapshots: optionalDependencies: csstype: 3.1.3 - "@tanstack/router-devtools@1.120.18(@tanstack/react-router@1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.120.17)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3)": + '@tanstack/router-devtools@1.120.18(@tanstack/react-router@1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.120.17)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3)': dependencies: - "@tanstack/react-router": 1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - "@tanstack/react-router-devtools": 1.120.18(@tanstack/react-router@1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.120.17)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3) + '@tanstack/react-router': 1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-router-devtools': 1.120.18(@tanstack/react-router@1.120.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(@tanstack/router-core@1.120.17)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(tiny-invariant@1.3.3) clsx: 2.1.1 goober: 2.1.16(csstype@3.1.3) react: 19.1.0 @@ -2481,62 +2160,62 @@ snapshots: optionalDependencies: csstype: 3.1.3 transitivePeerDependencies: - - "@tanstack/router-core" + - '@tanstack/router-core' - tiny-invariant - "@tanstack/store@0.7.1": {} + '@tanstack/store@0.7.1': {} - "@tanstack/table-core@8.21.3": {} + '@tanstack/table-core@8.21.3': {} - "@types/babel__core@7.20.5": + '@types/babel__core@7.20.5': dependencies: - "@babel/parser": 7.27.5 - "@babel/types": 7.27.6 - "@types/babel__generator": 7.27.0 - "@types/babel__template": 7.4.4 - "@types/babel__traverse": 7.20.7 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 - "@types/babel__generator@7.27.0": + '@types/babel__generator@7.27.0': dependencies: - "@babel/types": 7.27.6 + '@babel/types': 7.27.6 - "@types/babel__template@7.4.4": + '@types/babel__template@7.4.4': dependencies: - "@babel/parser": 7.27.5 - "@babel/types": 7.27.6 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 - "@types/babel__traverse@7.20.7": + '@types/babel__traverse@7.20.7': dependencies: - "@babel/types": 7.27.6 + '@babel/types': 7.27.6 - "@types/estree@1.0.7": {} + '@types/estree@1.0.7': {} - "@types/estree@1.0.8": {} + '@types/estree@1.0.8': {} - "@types/json-schema@7.0.15": {} + '@types/json-schema@7.0.15': {} - "@types/node@22.15.30": + '@types/node@22.15.30': dependencies: undici-types: 6.21.0 - "@types/react-dom@19.1.6(@types/react@19.1.6)": + '@types/react-dom@19.1.6(@types/react@19.1.6)': dependencies: - "@types/react": 19.1.6 + '@types/react': 19.1.6 - "@types/react@19.1.6": + '@types/react@19.1.6': dependencies: csstype: 3.1.3 - "@types/uuid@10.0.0": {} + '@types/uuid@10.0.0': {} - "@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)": + '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - "@eslint-community/regexpp": 4.12.1 - "@typescript-eslint/parser": 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/scope-manager": 8.33.1 - "@typescript-eslint/type-utils": 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/utils": 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/visitor-keys": 8.33.1 + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.33.1 + '@typescript-eslint/type-utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.33.1 eslint: 9.28.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.5 @@ -2546,40 +2225,40 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)": + '@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - "@typescript-eslint/scope-manager": 8.33.1 - "@typescript-eslint/types": 8.33.1 - "@typescript-eslint/typescript-estree": 8.33.1(typescript@5.8.3) - "@typescript-eslint/visitor-keys": 8.33.1 + '@typescript-eslint/scope-manager': 8.33.1 + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.33.1 debug: 4.4.1 eslint: 9.28.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/project-service@8.33.1(typescript@5.8.3)": + '@typescript-eslint/project-service@8.33.1(typescript@5.8.3)': dependencies: - "@typescript-eslint/tsconfig-utils": 8.33.1(typescript@5.8.3) - "@typescript-eslint/types": 8.33.1 + '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) + '@typescript-eslint/types': 8.33.1 debug: 4.4.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/scope-manager@8.33.1": + '@typescript-eslint/scope-manager@8.33.1': dependencies: - "@typescript-eslint/types": 8.33.1 - "@typescript-eslint/visitor-keys": 8.33.1 + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/visitor-keys': 8.33.1 - "@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)": + '@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)': dependencies: typescript: 5.8.3 - "@typescript-eslint/type-utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)": + '@typescript-eslint/type-utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - "@typescript-eslint/typescript-estree": 8.33.1(typescript@5.8.3) - "@typescript-eslint/utils": 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.1 eslint: 9.28.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) @@ -2587,14 +2266,14 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/types@8.33.1": {} + '@typescript-eslint/types@8.33.1': {} - "@typescript-eslint/typescript-estree@8.33.1(typescript@5.8.3)": + '@typescript-eslint/typescript-estree@8.33.1(typescript@5.8.3)': dependencies: - "@typescript-eslint/project-service": 8.33.1(typescript@5.8.3) - "@typescript-eslint/tsconfig-utils": 8.33.1(typescript@5.8.3) - "@typescript-eslint/types": 8.33.1 - "@typescript-eslint/visitor-keys": 8.33.1 + '@typescript-eslint/project-service': 8.33.1(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/visitor-keys': 8.33.1 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -2605,29 +2284,29 @@ snapshots: transitivePeerDependencies: - supports-color - "@typescript-eslint/utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)": + '@typescript-eslint/utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - "@eslint-community/eslint-utils": 4.7.0(eslint@9.28.0(jiti@2.4.2)) - "@typescript-eslint/scope-manager": 8.33.1 - "@typescript-eslint/types": 8.33.1 - "@typescript-eslint/typescript-estree": 8.33.1(typescript@5.8.3) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.33.1 + '@typescript-eslint/types': 8.33.1 + '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) eslint: 9.28.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - "@typescript-eslint/visitor-keys@8.33.1": + '@typescript-eslint/visitor-keys@8.33.1': dependencies: - "@typescript-eslint/types": 8.33.1 + '@typescript-eslint/types': 8.33.1 eslint-visitor-keys: 4.2.0 - "@vitejs/plugin-react@4.5.1(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1))": + '@vitejs/plugin-react@4.5.1(vite@6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1))': dependencies: - "@babel/core": 7.27.4 - "@babel/plugin-transform-react-jsx-self": 7.27.1(@babel/core@7.27.4) - "@babel/plugin-transform-react-jsx-source": 7.27.1(@babel/core@7.27.4) - "@rolldown/pluginutils": 1.0.0-beta.9 - "@types/babel__core": 7.20.5 + '@babel/core': 7.27.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) + '@rolldown/pluginutils': 1.0.0-beta.9 + '@types/babel__core': 7.20.5 react-refresh: 0.17.0 vite: 6.3.5(@types/node@22.15.30)(jiti@2.4.2)(lightningcss@1.30.1) transitivePeerDependencies: @@ -2764,31 +2443,31 @@ snapshots: esbuild@0.25.5: optionalDependencies: - "@esbuild/aix-ppc64": 0.25.5 - "@esbuild/android-arm": 0.25.5 - "@esbuild/android-arm64": 0.25.5 - "@esbuild/android-x64": 0.25.5 - "@esbuild/darwin-arm64": 0.25.5 - "@esbuild/darwin-x64": 0.25.5 - "@esbuild/freebsd-arm64": 0.25.5 - "@esbuild/freebsd-x64": 0.25.5 - "@esbuild/linux-arm": 0.25.5 - "@esbuild/linux-arm64": 0.25.5 - "@esbuild/linux-ia32": 0.25.5 - "@esbuild/linux-loong64": 0.25.5 - "@esbuild/linux-mips64el": 0.25.5 - "@esbuild/linux-ppc64": 0.25.5 - "@esbuild/linux-riscv64": 0.25.5 - "@esbuild/linux-s390x": 0.25.5 - "@esbuild/linux-x64": 0.25.5 - "@esbuild/netbsd-arm64": 0.25.5 - "@esbuild/netbsd-x64": 0.25.5 - "@esbuild/openbsd-arm64": 0.25.5 - "@esbuild/openbsd-x64": 0.25.5 - "@esbuild/sunos-x64": 0.25.5 - "@esbuild/win32-arm64": 0.25.5 - "@esbuild/win32-ia32": 0.25.5 - "@esbuild/win32-x64": 0.25.5 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 escalade@3.2.0: {} @@ -2826,19 +2505,19 @@ snapshots: eslint@9.28.0(jiti@2.4.2): dependencies: - "@eslint-community/eslint-utils": 4.7.0(eslint@9.28.0(jiti@2.4.2)) - "@eslint-community/regexpp": 4.12.1 - "@eslint/config-array": 0.20.0 - "@eslint/config-helpers": 0.2.2 - "@eslint/core": 0.14.0 - "@eslint/eslintrc": 3.3.1 - "@eslint/js": 9.28.0 - "@eslint/plugin-kit": 0.3.1 - "@humanfs/node": 0.16.6 - "@humanwhocodes/module-importer": 1.0.1 - "@humanwhocodes/retry": 0.4.3 - "@types/estree": 1.0.8 - "@types/json-schema": 7.0.15 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.2 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.28.0 + '@eslint/plugin-kit': 0.3.1 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -2890,8 +2569,8 @@ snapshots: fast-glob@3.3.3: dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 @@ -3102,9 +2781,13 @@ snapshots: dependencies: yallist: 3.1.1 + lucide-react@0.515.0(react@19.1.0): + dependencies: + react: 19.1.0 + magic-string@0.30.17: dependencies: - "@jridgewell/sourcemap-codec": 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.0 math-intrinsics@1.1.0: {} @@ -3219,28 +2902,28 @@ snapshots: rollup@4.42.0: dependencies: - "@types/estree": 1.0.7 + '@types/estree': 1.0.7 optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.42.0 - "@rollup/rollup-android-arm64": 4.42.0 - "@rollup/rollup-darwin-arm64": 4.42.0 - "@rollup/rollup-darwin-x64": 4.42.0 - "@rollup/rollup-freebsd-arm64": 4.42.0 - "@rollup/rollup-freebsd-x64": 4.42.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.42.0 - "@rollup/rollup-linux-arm-musleabihf": 4.42.0 - "@rollup/rollup-linux-arm64-gnu": 4.42.0 - "@rollup/rollup-linux-arm64-musl": 4.42.0 - "@rollup/rollup-linux-loongarch64-gnu": 4.42.0 - "@rollup/rollup-linux-powerpc64le-gnu": 4.42.0 - "@rollup/rollup-linux-riscv64-gnu": 4.42.0 - "@rollup/rollup-linux-riscv64-musl": 4.42.0 - "@rollup/rollup-linux-s390x-gnu": 4.42.0 - "@rollup/rollup-linux-x64-gnu": 4.42.0 - "@rollup/rollup-linux-x64-musl": 4.42.0 - "@rollup/rollup-win32-arm64-msvc": 4.42.0 - "@rollup/rollup-win32-ia32-msvc": 4.42.0 - "@rollup/rollup-win32-x64-msvc": 4.42.0 + '@rollup/rollup-android-arm-eabi': 4.42.0 + '@rollup/rollup-android-arm64': 4.42.0 + '@rollup/rollup-darwin-arm64': 4.42.0 + '@rollup/rollup-darwin-x64': 4.42.0 + '@rollup/rollup-freebsd-arm64': 4.42.0 + '@rollup/rollup-freebsd-x64': 4.42.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.42.0 + '@rollup/rollup-linux-arm-musleabihf': 4.42.0 + '@rollup/rollup-linux-arm64-gnu': 4.42.0 + '@rollup/rollup-linux-arm64-musl': 4.42.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.42.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.42.0 + '@rollup/rollup-linux-riscv64-gnu': 4.42.0 + '@rollup/rollup-linux-riscv64-musl': 4.42.0 + '@rollup/rollup-linux-s390x-gnu': 4.42.0 + '@rollup/rollup-linux-x64-gnu': 4.42.0 + '@rollup/rollup-linux-x64-musl': 4.42.0 + '@rollup/rollup-win32-arm64-msvc': 4.42.0 + '@rollup/rollup-win32-ia32-msvc': 4.42.0 + '@rollup/rollup-win32-x64-msvc': 4.42.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -3286,7 +2969,7 @@ snapshots: synckit@0.11.8: dependencies: - "@pkgr/core": 0.2.7 + '@pkgr/core': 0.2.7 tailwindcss@4.1.8: {} @@ -3294,7 +2977,7 @@ snapshots: tar@7.4.3: dependencies: - "@isaacs/fs-minipass": 4.0.1 + '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 minipass: 7.1.2 minizlib: 3.0.2 @@ -3324,9 +3007,9 @@ snapshots: typescript-eslint@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - "@typescript-eslint/eslint-plugin": 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/parser": 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) - "@typescript-eslint/utils": 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.28.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: @@ -3365,7 +3048,7 @@ snapshots: rollup: 4.42.0 tinyglobby: 0.2.14 optionalDependencies: - "@types/node": 22.15.30 + '@types/node': 22.15.30 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 diff --git a/spotizerr-ui/src/components/Queue.tsx b/spotizerr-ui/src/components/Queue.tsx index d461c9c..8dc64c0 100644 --- a/spotizerr-ui/src/components/Queue.tsx +++ b/spotizerr-ui/src/components/Queue.tsx @@ -13,7 +13,10 @@ import { QueueContext, type QueueItem, type QueueStatus } from "@/contexts/queue const isTerminalStatus = (status: QueueStatus) => ["completed", "error", "cancelled", "skipped", "done"].includes(status); -const statusStyles: Record = { +const statusStyles: Record< + QueueStatus, + { icon: React.ReactNode; color: string; bgColor: string; name: string } +> = { queued: { icon: , color: "text-gray-500", @@ -38,6 +41,12 @@ const statusStyles: Record, + color: "text-orange-500", + bgColor: "bg-orange-100", + name: "Retrying", + }, completed: { icon: , color: "text-green-500", @@ -79,16 +88,32 @@ const statusStyles: Record { const { removeItem, retryItem, cancelItem } = useContext(QueueContext) || {}; const statusInfo = statusStyles[item.status] || statusStyles.queued; - const isTerminal = isTerminalStatus(item.status); - const currentCount = isTerminal ? (item.summary?.successful?.length ?? item.totalTracks) : item.currentTrackNumber; - const progressText = - item.type === "album" || item.type === "playlist" - ? `${currentCount || 0}/${item.totalTracks || "?"}` - : item.progress - ? `${item.progress.toFixed(0)}%` - : ""; + const getProgressText = () => { + const { status, type, progress, totalTracks, summary } = item; + + if (status === "downloading" || status === "processing") { + if (type === "track") { + return progress !== undefined ? `${progress.toFixed(0)}%` : null; + } + // For albums/playlists, detailed progress is in the main body + return null; + } + + if ((status === "completed" || status === "done") && summary) { + if (type === "track") { + if (summary.total_successful > 0) return "Completed"; + if (summary.total_failed > 0) return "Failed"; + return "Finished"; + } + return `${summary.total_successful}/${totalTracks} tracks`; + } + + return null; + }; + + const progressText = getProgressText(); return (
@@ -96,20 +121,60 @@ const QueueItemCard = ({ item }: { item: QueueItem }) => {
{statusInfo.icon}
-
- {item.type === "track" ? ( - - ) : ( - - )} -

- {item.name} -

-
- -

- {item.artist} -

+ {item.type === "track" && ( + <> +
+ +

+ {item.name} +

+
+

+ {item.artist} +

+ {item.albumName && ( +

+ {item.albumName} +

+ )} + + )} + {item.type === "album" && ( + <> +
+ +

+ {item.name} +

+
+

+ {item.artist} +

+ {item.currentTrackTitle && ( +

+ {item.currentTrackNumber}/{item.totalTracks}: {item.currentTrackTitle} +

+ )} + + )} + {item.type === "playlist" && ( + <> +
+ +

+ {item.name} +

+
+

+ {item.playlistOwner} +

+ {item.currentTrackTitle && ( +

+ {item.currentTrackNumber}/{item.totalTracks}: {item.currentTrackTitle} +

+ )} + + )}
@@ -145,15 +210,29 @@ const QueueItemCard = ({ item }: { item: QueueItem }) => { )}
- {item.error &&

Error: {item.error}

} - {(item.status === "downloading" || item.status === "processing") && item.progress !== undefined && ( -
-
+ {(item.status === "error" || item.status === "retrying") && item.error && ( +

Error: {item.error}

+ )} + {isTerminal && item.summary && (item.summary.total_failed > 0 || item.summary.total_skipped > 0) && ( +
+ {item.summary.total_failed > 0 && ( +

{item.summary.total_failed} track(s) failed.

+ )} + {item.summary.total_skipped > 0 && ( +

{item.summary.total_skipped} track(s) skipped.

+ )}
)} + {(item.status === "downloading" || item.status === "processing") && + item.type === "track" && + item.progress !== undefined && ( +
+
+
+ )}
); }; diff --git a/spotizerr-ui/src/contexts/QueueProvider.tsx b/spotizerr-ui/src/contexts/QueueProvider.tsx index 3c89a11..29aea5f 100644 --- a/spotizerr-ui/src/contexts/QueueProvider.tsx +++ b/spotizerr-ui/src/contexts/QueueProvider.tsx @@ -1,65 +1,40 @@ import { useState, useCallback, type ReactNode, useEffect, useRef } from "react"; import apiClient from "../lib/api-client"; -import { QueueContext, type QueueItem, type DownloadType, type QueueStatus } from "./queue-context"; +import { + QueueContext, + type QueueItem, + type DownloadType, + type QueueStatus, +} from "./queue-context"; import { toast } from "sonner"; import { v4 as uuidv4 } from "uuid"; - -// --- Helper Types --- -// This represents the raw status object from the backend polling endpoint -interface TaskStatusDTO { - status: QueueStatus; - message?: string; - can_retry?: boolean; - - // Progress indicators - progress?: number; - speed?: string; - size?: string; - eta?: string; - - // Multi-track progress - current_track?: number; - total_tracks?: number; - summary?: { - successful_tracks: string[]; - skipped_tracks: string[]; - failed_tracks: number; - failed_track_details: { name: string; reason: string }[]; - }; -} - -// Task from prgs/list endpoint -interface TaskDTO { - task_id: string; - name?: string; - type?: string; - download_type?: string; - status?: string; - last_status_obj?: { - status?: string; - progress?: number; - speed?: string; - size?: string; - eta?: string; - current_track?: number; - total_tracks?: number; - error?: string; - can_retry?: boolean; - }; - original_request?: { - url?: string; - [key: string]: unknown; - }; - summary?: { - successful_tracks: string[]; - skipped_tracks: string[]; - failed_tracks: number; - failed_track_details?: { name: string; reason: string }[]; - }; -} +import type { + CallbackObject, + SummaryObject, + ProcessingCallbackObject, + TrackCallbackObject, + AlbumCallbackObject, + PlaylistCallbackObject, +} from "@/types/callbacks"; const isTerminalStatus = (status: QueueStatus) => - ["completed", "error", "cancelled", "skipped", "done"].includes(status); + ["completed", "error", "cancelled", "skipped", "done"].includes(status); + +function isProcessingCallback(obj: CallbackObject): obj is ProcessingCallbackObject { + return obj && "status" in obj && obj.status === "processing"; +} + +function isTrackCallback(obj: any): obj is TrackCallbackObject { + return obj && "track" in obj && "status_info" in obj; +} + +function isAlbumCallback(obj: any): obj is AlbumCallbackObject { + return obj && "album" in obj && "status_info" in obj; +} + +function isPlaylistCallback(obj: any): obj is PlaylistCallbackObject { + return obj && "playlist" in obj && "status_info" in obj; +} export function QueueProvider({ children }: { children: ReactNode }) { const [items, setItems] = useState(() => { @@ -73,11 +48,26 @@ export function QueueProvider({ children }: { children: ReactNode }) { const [isVisible, setIsVisible] = useState(false); const pollingIntervals = useRef>({}); - // --- Persistence --- useEffect(() => { localStorage.setItem("queueItems", JSON.stringify(items)); }, [items]); + // Effect to resume polling for active tasks on component mount + useEffect(() => { + if (items.length > 0) { + items.forEach((item) => { + // If a task has an ID and is not in a finished state, restart polling. + if (item.taskId && !isTerminalStatus(item.status)) { + console.log(`Resuming polling for ${item.name} (Task ID: ${item.taskId})`); + startPolling(item.id, item.taskId); + } + }); + } + // This effect should only run once on mount to avoid re-triggering polling unnecessarily. + // We are disabling the dependency warning because we intentionally want to use the initial `items` state. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const stopPolling = useCallback((internalId: string) => { if (pollingIntervals.current[internalId]) { clearInterval(pollingIntervals.current[internalId]); @@ -85,101 +75,125 @@ export function QueueProvider({ children }: { children: ReactNode }) { } }, []); - // --- Polling Logic --- const startPolling = useCallback( (internalId: string, taskId: string) => { - if (pollingIntervals.current[internalId]) return; + if (pollingIntervals.current[internalId]) return; - const intervalId = window.setInterval(async () => { - try { - // Use the prgs endpoint instead of download/status - interface PrgsResponse { - status?: string; - summary?: TaskStatusDTO["summary"]; - last_line?: { - status?: string; - message?: string; - error?: string; - can_retry?: boolean; - progress?: number; - speed?: string; - size?: string; - eta?: string; - current_track?: number; - total_tracks?: number; - }; - } - - const response = await apiClient.get(`/prgs/${taskId}`); - const lastStatus = response.data.last_line || {}; - const statusUpdate = { - status: response.data.status || lastStatus.status || "pending", - message: lastStatus.message || lastStatus.error, - can_retry: lastStatus.can_retry, - progress: lastStatus.progress, - speed: lastStatus.speed, - size: lastStatus.size, - eta: lastStatus.eta, - current_track: lastStatus.current_track, - total_tracks: lastStatus.total_tracks, - summary: response.data.summary, - }; - - setItems((prev) => - prev.map((item) => { - if (item.id === internalId) { - const updatedItem: QueueItem = { - ...item, - status: statusUpdate.status as QueueStatus, - progress: statusUpdate.progress, - speed: statusUpdate.speed, - size: statusUpdate.size, - eta: statusUpdate.eta, - error: statusUpdate.status === "error" ? statusUpdate.message : undefined, - canRetry: statusUpdate.can_retry, - currentTrackNumber: statusUpdate.current_track, - totalTracks: statusUpdate.total_tracks, - summary: statusUpdate.summary - ? { - successful: statusUpdate.summary.successful_tracks, - skipped: statusUpdate.summary.skipped_tracks, - failed: statusUpdate.summary.failed_tracks, - failedTracks: statusUpdate.summary.failed_track_details || [], - } - : item.summary, - }; - - if (isTerminalStatus(statusUpdate.status as QueueStatus)) { - stopPolling(internalId); + const intervalId = window.setInterval(async () => { + try { + interface PrgsResponse { + status?: string; + summary?: SummaryObject; + last_line?: CallbackObject; } - return updatedItem; - } - return item; - }), - ); - } catch (error) { - console.error(`Polling failed for task ${taskId}:`, error); - stopPolling(internalId); - setItems((prev) => - prev.map((i) => - i.id === internalId - ? { - ...i, - status: "error", - error: "Connection lost", - } - : i, - ), - ); - } - }, 2000); // Poll every 2 seconds - pollingIntervals.current[internalId] = intervalId; + const response = await apiClient.get(`/prgs/${taskId}`); + const { last_line, summary, status } = response.data; + + setItems(prev => + prev.map(item => { + if (item.id !== internalId) return item; + + const updatedItem: QueueItem = { ...item }; + + if (status) { + updatedItem.status = status as QueueStatus; + } + + if (summary) { + updatedItem.summary = summary; + } + + if (last_line) { + if (isProcessingCallback(last_line)) { + updatedItem.status = "processing"; + } else if (isTrackCallback(last_line)) { + const { status_info, track, current_track, total_tracks, parent } = last_line; + + updatedItem.currentTrackTitle = track.title; + if (current_track) updatedItem.currentTrackNumber = current_track; + if (total_tracks) updatedItem.totalTracks = total_tracks; + + // A child track being "done" doesn't mean the whole download is done. + // The final "done" status comes from the parent (album/playlist) callback. + if (parent && status_info.status === "done") { + updatedItem.status = "downloading"; // Or keep current status if not 'error' + } else { + updatedItem.status = status_info.status as QueueStatus; + } + + if (status_info.status === "error" || status_info.status === "retrying") { + updatedItem.error = status_info.error; + } + + // For single tracks, the "done" status is final. + if (!parent && status_info.status === "done") { + if (status_info.summary) updatedItem.summary = status_info.summary; + } + } else if (isAlbumCallback(last_line)) { + const { status_info, album } = last_line; + updatedItem.status = status_info.status as QueueStatus; + updatedItem.name = album.title; + updatedItem.artist = album.artists.map(a => a.name).join(", "); + if (status_info.status === "done" && status_info.summary) { + updatedItem.summary = status_info.summary; + } + if (status_info.status === "error") { + updatedItem.error = status_info.error; + } + } else if (isPlaylistCallback(last_line)) { + const { status_info, playlist } = last_line; + updatedItem.status = status_info.status as QueueStatus; + updatedItem.name = playlist.title; + updatedItem.playlistOwner = playlist.owner.name; + if (status_info.status === "done" && status_info.summary) { + updatedItem.summary = status_info.summary; + } + if (status_info.status === "error") { + updatedItem.error = status_info.error; + } + } + } + + if (isTerminalStatus(updatedItem.status as QueueStatus)) { + stopPolling(internalId); + } + + return updatedItem; + }), + ); + } catch (error) { + console.error(`Polling failed for task ${taskId}:`, error); + stopPolling(internalId); + setItems(prev => + prev.map(i => + i.id === internalId + ? { + ...i, + status: "error", + error: "Connection lost", + } + : i, + ), + ); + } + }, 2000); + + pollingIntervals.current[internalId] = intervalId; }, [stopPolling], ); - // --- Core Action: Add Item --- + useEffect(() => { + items.forEach((item) => { + if (item.taskId && !isTerminalStatus(item.status)) { + startPolling(item.id, item.taskId); + } + }); + // We only want to run this on mount, so we disable the exhaustive-deps warning. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const addItem = useCallback( async (item: { name: string; type: DownloadType; spotifyId: string; artist?: string }) => { const internalId = uuidv4(); @@ -193,7 +207,6 @@ export function QueueProvider({ children }: { children: ReactNode }) { try { let endpoint = ""; - if (item.type === "track") { endpoint = `/track/download/${item.spotifyId}`; } else if (item.type === "album") { @@ -230,36 +243,142 @@ export function QueueProvider({ children }: { children: ReactNode }) { [isVisible, startPolling], ); + const removeItem = useCallback( + (id: string) => { + const item = items.find((i) => i.id === id); + if (item?.taskId) { + stopPolling(item.id); + } + setItems((prev) => prev.filter((item) => item.id !== id)); + }, + [items, stopPolling], + ); + + const cancelItem = useCallback( + async (id: string) => { + const item = items.find((i) => i.id === id); + if (!item || !item.taskId) return; + + try { + await apiClient.post(`/prgs/cancel/${item.taskId}`); + stopPolling(id); + setItems((prev) => + prev.map((i) => + i.id === id + ? { + ...i, + status: "cancelled", + } + : i, + ), + ); + toast.info(`Cancelled download: ${item.name}`); + } catch (error) { + console.error(`Failed to cancel task ${item.taskId}:`, error); + toast.error(`Failed to cancel download: ${item.name}`); + } + }, + [items, stopPolling], + ); + + const retryItem = useCallback( + (id: string) => { + const item = items.find((i) => i.id === id); + if (item && item.taskId) { + setItems((prev) => + prev.map((i) => + i.id === id + ? { + ...i, + status: "pending", + error: undefined, + } + : i, + ), + ); + startPolling(id, item.taskId); + toast.info(`Retrying download: ${item.name}`); + } + }, + [items, startPolling], + ); + + const toggleVisibility = useCallback(() => { + setIsVisible((prev) => !prev); + }, []); + + const clearCompleted = useCallback(() => { + setItems((prev) => prev.filter((item) => !isTerminalStatus(item.status) || item.status === "error")); + }, []); + + const cancelAll = useCallback(async () => { + const activeItems = items.filter((item) => item.taskId && !isTerminalStatus(item.status)); + if (activeItems.length === 0) { + toast.info("No active downloads to cancel."); + return; + } + + try { + const taskIds = activeItems.map((item) => item.taskId!); + await apiClient.post("/prgs/cancel/many", { task_ids: taskIds }); + + activeItems.forEach((item) => stopPolling(item.id)); + + setItems((prev) => + prev.map((item) => + taskIds.includes(item.taskId!) + ? { + ...item, + status: "cancelled", + } + : item, + ), + ); + toast.info("Cancelled all active downloads."); + } catch (error) { + console.error("Failed to cancel all tasks:", error); + toast.error("Failed to cancel all downloads."); + } + }, [items, stopPolling]); + const clearAllPolls = useCallback(() => { Object.values(pollingIntervals.current).forEach(clearInterval); }, []); - // --- Load existing tasks on startup --- useEffect(() => { + interface PrgsListEntry { + task_id: string; + name?: string; + download_type?: string; + status?: string; + original_request?: { url?: string }; + last_status_obj?: { + progress?: number; + current_track?: number; + total_tracks?: number; + error?: string; + can_retry?: boolean; + }; + summary?: SummaryObject; + } + const syncActiveTasks = async () => { try { - // Use the prgs/list endpoint instead of download/active - const response = await apiClient.get("/prgs/list"); - - // Map the prgs response to the expected QueueItem format - const activeTasks = response.data + const response = await apiClient.get("/prgs/list"); + const activeTasks: QueueItem[] = response.data .filter((task) => { - // Only include non-terminal tasks const status = task.status?.toLowerCase(); return status && !isTerminalStatus(status as QueueStatus); }) .map((task) => { - // Extract Spotify ID from URL if available const url = task.original_request?.url || ""; const spotifyId = url.includes("spotify.com") ? url.split("/").pop() || "" : ""; - - // Map download_type to UI type let type: DownloadType = "track"; if (task.download_type === "album") type = "album"; if (task.download_type === "playlist") type = "playlist"; if (task.download_type === "artist") type = "artist"; - return { + const queueItem: QueueItem = { id: task.task_id, taskId: task.task_id, name: task.name || "Unknown", @@ -267,138 +386,36 @@ export function QueueProvider({ children }: { children: ReactNode }) { spotifyId, status: (task.status?.toLowerCase() || "pending") as QueueStatus, progress: task.last_status_obj?.progress, - speed: task.last_status_obj?.speed, - size: task.last_status_obj?.size, - eta: task.last_status_obj?.eta, currentTrackNumber: task.last_status_obj?.current_track, totalTracks: task.last_status_obj?.total_tracks, error: task.last_status_obj?.error, canRetry: task.last_status_obj?.can_retry, - summary: task.summary - ? { - successful: task.summary.successful_tracks, - skipped: task.summary.skipped_tracks, - failed: task.summary.failed_tracks, - failedTracks: task.summary.failed_track_details || [], - } - : undefined, + summary: task.summary, }; + return queueItem; }); - // Basic reconciliation setItems((prevItems) => { const newItems = [...prevItems]; activeTasks.forEach((task) => { - if (!newItems.some((item) => item.taskId === task.taskId)) { + const existingIndex = newItems.findIndex((item) => item.id === task.id); + if (existingIndex === -1) { newItems.push(task); + } else { + newItems[existingIndex] = { ...newItems[existingIndex], ...task }; } + startPolling(task.id, task.taskId!); }); return newItems; }); - - activeTasks.forEach((item) => { - if (item.id && item.taskId && !isTerminalStatus(item.status)) { - startPolling(item.id, item.taskId); - } - }); } catch (error) { console.error("Failed to sync active tasks:", error); } }; + syncActiveTasks(); - - // restart polling for any non-terminal items from localStorage - items.forEach((item) => { - if (item.id && item.taskId && !isTerminalStatus(item.status)) { - startPolling(item.id, item.taskId); - } - }); - - return clearAllPolls; - // This effect should only run once on mount to initialize the queue. - // We are intentionally omitting 'items' as a dependency to prevent re-runs. - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [clearAllPolls, startPolling]); - - // --- Other Actions --- - const removeItem = useCallback((id: string) => { - setItems((prev) => prev.filter((item) => item.id !== id)); - }, []); - - const cancelItem = useCallback( - async (id: string) => { - const itemToCancel = items.find((i) => i.id === id); - if (itemToCancel && itemToCancel.taskId && !isTerminalStatus(itemToCancel.status)) { - stopPolling(id); - try { - await apiClient.post(`/prgs/cancel/${itemToCancel.taskId}`); - toast.success(`Cancelled download: ${itemToCancel.name}`); - setItems((prev) => prev.map((i) => (i.id === id ? { ...i, status: "cancelled" } : i))); - } catch (err) { - console.error(`Failed to cancel task ${itemToCancel.taskId}`, err); - toast.error(`Failed to cancel: ${itemToCancel.name}`); - } - } - }, - [items, stopPolling], - ); - - const retryItem = useCallback( - async (id: string) => { - const itemToRetry = items.find((i) => i.id === id); - if (!itemToRetry || !itemToRetry.taskId) return; - - try { - // Use the prgs/retry endpoint - await apiClient.post(`/prgs/retry/${itemToRetry.taskId}`); - toast.info(`Retrying download: ${itemToRetry.name}`); - - // Update the item status in the UI - setItems((prev) => - prev.map((item) => - item.id === id - ? { - ...item, - status: "initializing", - error: undefined, - } - : item, - ), - ); - - // Start polling again - startPolling(id, itemToRetry.taskId); - } catch (error) { - console.error(`Failed to retry download for ${itemToRetry.name}:`, error); - toast.error(`Failed to retry download: ${itemToRetry.name}`); - } - }, - [items, startPolling], - ); - - const cancelAll = useCallback(async () => { - toast.info("Cancelling all active downloads..."); - for (const item of items) { - if (item.taskId && !isTerminalStatus(item.status)) { - stopPolling(item.id); - try { - await apiClient.post(`/prgs/cancel/${item.taskId}`); - // Visually update the item to "cancelled" immediately - setItems((prev) => prev.map((i) => (i.id === item.id ? { ...i, status: "cancelled" } : i))); - } catch (err) { - console.error(`Failed to cancel task ${item.taskId}`, err); - toast.error(`Failed to cancel: ${item.name}`); - } - } - } - }, [items, stopPolling]); - - const clearCompleted = useCallback(() => { - setItems((prev) => prev.filter((item) => !isTerminalStatus(item.status))); - toast.info("Cleared finished downloads."); - }, []); - - const toggleVisibility = useCallback(() => setIsVisible((prev) => !prev), []); + return () => clearAllPolls(); + }, [startPolling, clearAllPolls]); const value = { items, diff --git a/spotizerr-ui/src/contexts/queue-context.ts b/spotizerr-ui/src/contexts/queue-context.ts index 8d4e134..7b57737 100644 --- a/spotizerr-ui/src/contexts/queue-context.ts +++ b/spotizerr-ui/src/contexts/queue-context.ts @@ -1,4 +1,5 @@ import { createContext, useContext } from "react"; +import type { SummaryObject } from "@/types/callbacks"; export type DownloadType = "track" | "album" | "artist" | "playlist"; export type QueueStatus = @@ -11,36 +12,33 @@ export type QueueStatus = | "skipped" | "cancelled" | "done" - | "queued"; + | "queued" + | "retrying"; export interface QueueItem { - id: string; // Unique ID for the queue item (can be task_id from backend) - name: string; - artist?: string; - type: DownloadType; - spotifyId: string; // Original Spotify ID + id: string; + name: string; + type: DownloadType; + spotifyId: string; - // --- Status and Progress --- - status: QueueStatus; - taskId?: string; // The backend task ID for polling - error?: string; - canRetry?: boolean; + // Display Info + artist?: string; + albumName?: string; + playlistOwner?: string; + currentTrackTitle?: string; - // --- Single Track Progress --- - progress?: number; // 0-100 - speed?: string; - size?: string; - eta?: string; - - // --- Multi-Track (Album/Playlist) Progress --- - currentTrackNumber?: number; - totalTracks?: number; - summary?: { - successful: string[]; - skipped: string[]; - failed: number; - failedTracks: { name: string; reason: string }[]; - }; + // Status and Progress + status: QueueStatus; + taskId?: string; + error?: string; + canRetry?: boolean; + progress?: number; + speed?: string; + size?: string; + eta?: string; + currentTrackNumber?: number; + totalTracks?: number; + summary?: SummaryObject; } export interface QueueContextType { diff --git a/spotizerr-ui/src/types/callbacks.ts b/spotizerr-ui/src/types/callbacks.ts new file mode 100644 index 0000000..5e88286 --- /dev/null +++ b/spotizerr-ui/src/types/callbacks.ts @@ -0,0 +1,270 @@ +// Common Interfaces +export interface IDs { + spotify?: string; + deezer?: string; + isrc?: string; + upc?: string; +} + +export interface ReleaseDate { + year: number; + month?: number; + day?: number; +} + +// User Model +export interface UserObject { + name: string; + type: "user"; + ids: IDs; +} + +// Track Module Models + +export interface ArtistAlbumTrackObject { + type: "artistAlbumTrack"; + name: string; + ids: IDs; +} + +export interface ArtistTrackObject { + type: "artistTrack"; + name: string; + ids: IDs; +} + +export interface AlbumTrackObject { + type: "albumTrack"; + album_type: "album" | "single" | "compilation"; + title: string; + release_date: { [key: string]: any }; + total_tracks: number; + genres: string[]; + images: { [key: string]: any }[]; + ids: IDs; + artists: ArtistAlbumTrackObject[]; +} + +export interface PlaylistTrackObject { + type: "playlistTrack"; + title: string; + description?: string; + owner: UserObject; + ids: IDs; +} + +export interface TrackObject { + type: "track"; + title: string; + disc_number: number; + track_number: number; + duration_ms: number; + explicit: boolean; + genres: string[]; + album: AlbumTrackObject; + artists: ArtistTrackObject[]; + ids: IDs; +} + +// Playlist Module Models + +export interface ArtistAlbumTrackPlaylistObject { + type: "artistAlbumTrackPlaylist"; + name: string; + ids: IDs; +} + +export interface AlbumTrackPlaylistObject { + type: "albumTrackPlaylist"; + album_type: string; + title: string; + release_date: { [key: string]: any }; + total_tracks: number; + images: { [key: string]: any }[]; + ids: IDs; + artists: ArtistAlbumTrackPlaylistObject[]; +} + +export interface ArtistTrackPlaylistObject { + type: "artistTrackPlaylist"; + name: string; + ids: IDs; +} + +export interface TrackPlaylistObject { + type: "trackPlaylist"; + title: string; + position: number; + duration_ms: number; + artists: ArtistTrackPlaylistObject[]; + album: AlbumTrackPlaylistObject; + ids: IDs; + disc_number: number; + track_number: number; + explicit: boolean; +} + +export interface PlaylistObject { + type: "playlist"; + title: string; + description?: string; + owner: UserObject; + tracks: TrackPlaylistObject[]; + images: { [key: string]: any }[]; + ids: IDs; +} + +// Artist Module Models + +export interface AlbumArtistObject { + type: "albumArtist"; + album_type: string; + title: string; + release_date: { [key: string]: any }; + total_tracks: number; + ids: IDs; +} + +export interface ArtistObject { + type: "artist"; + name: string; + genres: string[]; + images: { [key: string]: any }[]; + ids: IDs; + albums: AlbumArtistObject[]; +} + +// Album Module Models + +export interface ArtistTrackAlbumObject { + type: "artistTrackAlbum"; + name: string; + ids: IDs; +} + +export interface ArtistAlbumObject { + type: "artistAlbum"; + name: string; + genres: string[]; + ids: IDs; +} + +export interface TrackAlbumObject { + type: "trackAlbum"; + title: string; + disc_number: number; + track_number: number; + duration_ms: number; + explicit: boolean; + genres: string[]; + ids: IDs; + artists: ArtistTrackAlbumObject[]; +} + +export interface AlbumObject { + type: "album"; + album_type: string; + title: string; + release_date: { [key: string]: any }; + total_tracks: number; + genres: string[]; + images: { [key: string]: any }[]; + copyrights: { [key: string]: string }[]; + ids: IDs; + tracks: TrackAlbumObject[]; + artists: ArtistAlbumObject[]; +} + +// Callback Module Models + +export interface BaseStatusObject { + ids?: IDs; + convert_to?: string; + bitrate?: string; +} + +export interface InitializingObject extends BaseStatusObject { + status: "initializing"; +} + +export interface SkippedObject extends BaseStatusObject { + status: "skipped"; + reason: string; +} + +export interface RetryingObject extends BaseStatusObject { + status: "retrying"; + retry_count: number; + seconds_left: number; + error: string; +} + +export interface RealTimeObject extends BaseStatusObject { + status: "real-time"; + time_elapsed: number; + progress: number; +} + +export interface ErrorObject extends BaseStatusObject { + status: "error"; + error: string; +} + +export interface FailedTrackObject { + track: TrackObject; + reason: string; +} + +export interface SummaryObject { + successful_tracks: TrackObject[]; + skipped_tracks: TrackObject[]; + failed_tracks: FailedTrackObject[]; + total_successful: number; + total_skipped: number; + total_failed: number; +} + +export interface DoneObject extends BaseStatusObject { + status: "done"; + summary?: SummaryObject; +} + +export type StatusInfo = + | InitializingObject + | SkippedObject + | RetryingObject + | RealTimeObject + | ErrorObject + | DoneObject; + +export interface TrackCallbackObject { + track: TrackObject; + status_info: StatusInfo; + current_track?: number; + total_tracks?: number; + parent?: AlbumTrackObject | PlaylistTrackObject; +} + +export interface AlbumCallbackObject { + album: AlbumObject; + status_info: StatusInfo; +} + +export interface PlaylistCallbackObject { + playlist: PlaylistObject; + status_info: StatusInfo; +} + +export interface ProcessingCallbackObject { + status: "processing"; + timestamp: number; + type: "track" | "album" | "playlist"; + name: string; + artist: string; +} + +export type CallbackObject = + | TrackCallbackObject + | AlbumCallbackObject + | PlaylistCallbackObject + | ProcessingCallbackObject; \ No newline at end of file