jichao commited on
Commit
03c8563
·
1 Parent(s): 34a57e4

First working demo

Browse files
Files changed (33) hide show
  1. .dockerignore +9 -0
  2. backend/.dockerignore +9 -0
  3. backend/Dockerfile +17 -0
  4. backend/app/__init__.py +1 -0
  5. backend/app/main.py +152 -12
  6. backend/app/model.py +0 -12
  7. backend/requirements.txt +10 -6
  8. backend/run.py +4 -0
  9. docker-compose.yml +17 -13
  10. frontend/Dockerfile +12 -10
  11. frontend/index.html +12 -0
  12. frontend/package-lock.json +2486 -0
  13. frontend/package.json +19 -24
  14. frontend/public/sample_image/size_2048_E-096_N-12_x19968_y7680.png +0 -0
  15. frontend/public/sample_image/size_2048_E-108_N24_x15360_y27648.png +0 -0
  16. frontend/public/sample_image/size_2048_E-128_N12_x15360_y36864.png +0 -0
  17. frontend/public/sample_image/size_2048_E-152_N-32_x13824_y30720.png +0 -0
  18. frontend/public/sample_image/size_2048_E-164_N-04_x0_y18432.png +0 -0
  19. frontend/public/sample_image/size_2048_E-180_N08_x35328_y38400.png +0 -0
  20. frontend/public/sample_image/size_2048_E172_N-08_x38400_y39936.png +0 -0
  21. frontend/public/sample_image/size_256_E048_N-12_x19712_y22784.png +0 -0
  22. frontend/public/sample_image/size_4096_E-024_N04_x39936_y39936.png +0 -0
  23. frontend/public/sample_image/size_4096_E-024_N08_x3072_y0.png +0 -0
  24. frontend/public/sample_image/size_4096_E-036_N-04_x3072_y3072.png +0 -0
  25. frontend/public/sample_image/size_4096_E-040_N-28_x15360_y39936.png +0 -0
  26. frontend/public/sample_image/size_4096_E-044_N-16_x21504_y30720.png +0 -0
  27. frontend/public/sample_image/size_4096_E040_N28_x33792_y24576.png +0 -0
  28. frontend/src/App.jsx +98 -18
  29. frontend/src/components/EmbeddingViz.jsx +23 -0
  30. frontend/src/components/RetrievalDemo.jsx +246 -0
  31. frontend/src/index.jsx +12 -3
  32. frontend/src/sampleImages.js +16 -0
  33. frontend/vite.config.js +10 -0
.dockerignore ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ **/data/models/*
2
+ **/data/embeddings/*
3
+ **/__pycache__
4
+ **/*.pyc
5
+ **/*.pyo
6
+ **/*.pyd
7
+ **/.Python
8
+ **/.env
9
+ **/*.log
backend/.dockerignore ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ data/models/*
2
+ data/embeddings/*
3
+ **/__pycache__
4
+ *.pyc
5
+ *.pyo
6
+ *.pyd
7
+ .Python
8
+ .env
9
+ *.log
backend/Dockerfile CHANGED
@@ -1,10 +1,27 @@
1
  FROM python:3.9-slim
2
 
 
 
 
3
  WORKDIR /app
4
 
 
5
  COPY requirements.txt .
6
  RUN pip install --no-cache-dir -r requirements.txt
7
 
 
8
  COPY . .
9
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
 
1
  FROM python:3.9-slim
2
 
3
+ # Create non-root user
4
+ RUN useradd -m -u 1000 appuser
5
+
6
  WORKDIR /app
7
 
8
+ # Install dependencies first for better caching
9
  COPY requirements.txt .
10
  RUN pip install --no-cache-dir -r requirements.txt
11
 
12
+ # Copy application code
13
  COPY . .
14
 
15
+ # Change ownership to appuser
16
+ RUN chown -R appuser:appuser /app
17
+
18
+ # Switch to non-root user
19
+ USER appuser
20
+
21
+ # Add healthcheck
22
+ HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
23
+ CMD curl -f http://localhost:8000/health || exit 1
24
+
25
+ EXPOSE 8000
26
+
27
  CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
backend/app/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ # Empty file to mark directory as Python package
backend/app/main.py CHANGED
@@ -1,6 +1,29 @@
 
 
 
 
 
1
  from fastapi import FastAPI, UploadFile, File
2
  from fastapi.middleware.cors import CORSMiddleware
3
- from .model import EmbeddingModel
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
 
5
  app = FastAPI()
6
 
@@ -13,18 +36,135 @@ app.add_middleware(
13
  allow_headers=["*"],
14
  )
15
 
16
- model = EmbeddingModel()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
- @app.get("/")
19
- async def read_root():
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  return {"status": "healthy"}
21
 
22
- @app.post("/embed")
23
- async def create_embedding(file: UploadFile = File(...)):
24
- # TODO: Implement embedding generation
25
- return {"message": "Embedding created"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
- @app.get("/similar/{image_id}")
28
- async def find_similar(image_id: str):
29
- # TODO: Implement similar image search
30
- return {"similar_images": []}
 
1
+ import io
2
+ import torch
3
+ import timm
4
+ import numpy as np
5
+ from PIL import Image
6
  from fastapi import FastAPI, UploadFile, File
7
  from fastapi.middleware.cors import CORSMiddleware
8
+ import faiss
9
+ import sqlite3
10
+ from typing import List
11
+ import os
12
+ from pathlib import Path
13
+ import json
14
+ import base64
15
+ import cv2
16
+ import logging
17
+ from torchvision import transforms
18
+ import time
19
+
20
+ # Set up logging
21
+ logging.basicConfig(level=logging.INFO)
22
+ logger = logging.getLogger(__name__)
23
+
24
+ # Make sure the model and data paths are absolute
25
+ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
26
+ DATA_DIR = os.path.join(BASE_DIR, "data")
27
 
28
  app = FastAPI()
29
 
 
36
  allow_headers=["*"],
37
  )
38
 
39
+ # Global variables
40
+ model = None
41
+ index = None
42
+ model_name = "mars-mae-vit-b-2m"
43
+
44
+ @app.on_event("startup")
45
+ async def startup_event():
46
+ logger.info("Application starting up...")
47
+ global model, index
48
+ try:
49
+ # Load model
50
+ model = timm.create_model(
51
+ 'vit_base_patch16_224',
52
+ in_chans=1,
53
+ num_classes=0,
54
+ global_pool='',
55
+ pretrained=False,
56
+ checkpoint_path=f"data/models/{model_name}.pth")
57
+
58
+ model.eval()
59
+
60
+ # Load FAISS index
61
+ index_path = Path(f"data/embeddings/{model_name}/embeddings.index")
62
+ index = faiss.read_index(str(index_path))
63
+ if isinstance(index, faiss.IndexIVFFlat):
64
+ index.nprobe = 16 # Increase for better recall
65
+ except Exception as e:
66
+ print(f"Error during startup: {str(e)}")
67
+ raise e
68
 
69
+ def process_image(image_bytes):
70
+ # Open image
71
+ image = Image.open(io.BytesIO(image_bytes))
72
+
73
+ # Create transform pipeline matching the training transform
74
+ transform = transforms.Compose([
75
+ transforms.ToTensor(), # Convert to tensor first (scales to [0,1])
76
+ transforms.Resize((224, 224)), # Resize after tensor conversion
77
+ transforms.Grayscale(num_output_channels=1), # Convert to grayscale
78
+ transforms.Normalize(mean=[0.5], std=[0.5]) # Normalize to [-1,1]
79
+ ])
80
+
81
+ # Apply transforms
82
+ image_tensor = transform(image)
83
+ # Add batch dimension
84
+ image_tensor = image_tensor.unsqueeze(0)
85
+ return image_tensor
86
+
87
+ def get_embedding(image):
88
+ with torch.no_grad():
89
+ # Forward pass through the model
90
+ features = model.forward_features(image) # [1, n_patches, dim]
91
+ # Use CLS token (first token) instead of mean pooling
92
+ embedding = features[:, 0] # [1, dim]
93
+ return embedding.cpu().numpy()
94
+
95
+ @app.get("/health")
96
+ async def health_check():
97
+ logger.info("Health check endpoint called")
98
  return {"status": "healthy"}
99
 
100
+ @app.post("/search")
101
+ async def search_similar(file: UploadFile = File(...), k: int = 5):
102
+ try:
103
+ # Validate k parameter
104
+ k = max(1, min(k, 35)) # Limit k between 1 and 20
105
+ logger.info(f"Searching for {k} similar images")
106
+
107
+ # Log the reception of the image file
108
+ logger.info(f"Received image file: {file.filename}")
109
+ contents = await file.read()
110
+ logger.debug(f"Image content read successfully, size: {len(contents)} bytes")
111
+
112
+ # Process the image
113
+ image_tensor = process_image(contents)
114
+ logger.debug(f"Image processed successfully, tensor shape: {image_tensor.shape}")
115
+
116
+ # Extract embedding from the image
117
+ embedding = get_embedding(image_tensor)
118
+ logger.debug("Embedding extracted successfully.")
119
+
120
+ # Search using the FAISS index with timing
121
+ start_time = time.time()
122
+ distances, indices = index.search(embedding, k)
123
+ search_time = (time.time() - start_time) * 1000 # Convert to milliseconds
124
+ logger.debug(f"FAISS search completed in {search_time:.2f}ms. Indices: {indices}, Distances: {distances}")
125
+
126
+ results = []
127
+ found_count = 0
128
+ db_path = Path(f"data/embeddings/{model_name}/samples.db")
129
+ with sqlite3.connect(str(db_path)) as conn:
130
+ cursor = conn.cursor()
131
+ for i, (idx, dist) in enumerate(zip(indices[0], distances[0])):
132
+ if idx != -1:
133
+ cursor.execute('''
134
+ SELECT filename, label, thumbnail
135
+ FROM samples
136
+ WHERE id = ?
137
+ ''', (int(idx) + 1,)) # Adjust index to match SQLite (1-indexed)
138
+ row = cursor.fetchone()
139
+ if row:
140
+ found_count += 1
141
+ filename, label, thumbnail_bytes = row
142
+ thumbnail_base64 = base64.b64encode(thumbnail_bytes).decode('utf-8')
143
+
144
+ results.append({
145
+ "filename": filename,
146
+ "label": label,
147
+ "distance": float(dist),
148
+ "thumbnail": thumbnail_base64
149
+ })
150
+ logger.info(
151
+ f"Found image {found_count}: ID {int(idx)+1}, "
152
+ f"Filename: {filename}, Label: {label}, Distance: {dist:.2f}"
153
+ )
154
+ else:
155
+ logger.debug(f"No record found in DB for index {int(idx)+1}")
156
+ else:
157
+ logger.debug("Encountered index -1 in FAISS results; skipping this entry.")
158
+
159
+ logger.info(f"Search completed successfully. Total images found: {found_count}")
160
+ return {
161
+ "results": results,
162
+ "search_time_ms": round(search_time, 2) # Round to 2 decimal places
163
+ }
164
+ except Exception as e:
165
+ logger.error(f"Error in search_similar: {str(e)}")
166
+ return {"error": str(e)}
167
 
168
+ @app.on_event("shutdown")
169
+ async def shutdown_event():
170
+ logger.info("Application shutting down...")
 
backend/app/model.py DELETED
@@ -1,12 +0,0 @@
1
- class EmbeddingModel:
2
- def __init__(self):
3
- # TODO: Initialize your model here
4
- pass
5
-
6
- def generate_embedding(self, image):
7
- # TODO: Implement embedding generation
8
- pass
9
-
10
- def find_similar(self, embedding):
11
- # TODO: Implement similar image search
12
- pass
 
 
 
 
 
 
 
 
 
 
 
 
 
backend/requirements.txt CHANGED
@@ -1,6 +1,10 @@
1
- fastapi==0.68.1
2
- uvicorn==0.15.0
3
- python-multipart==0.0.5
4
- pillow==8.3.2
5
- torch==2.0.0
6
- transformers==4.30.2
 
 
 
 
 
1
+ fastapi
2
+ uvicorn
3
+ python-multipart
4
+ torch
5
+ timm
6
+ faiss-cpu
7
+ Pillow
8
+ numpy
9
+ opencv-python-headless
10
+ torchvision
backend/run.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ import uvicorn
2
+
3
+ if __name__ == "__main__":
4
+ uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True)
docker-compose.yml CHANGED
@@ -2,28 +2,32 @@ version: '3.8'
2
 
3
  services:
4
  backend:
5
- build:
6
- context: ./backend
7
- dockerfile: Dockerfile
8
  ports:
9
  - "8000:8000"
10
  volumes:
11
- - ./backend:/app
12
- environment:
13
- - ENVIRONMENT=development
14
- command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  frontend:
17
- build:
18
- context: ./frontend
19
- dockerfile: Dockerfile
20
  ports:
21
  - "3000:3000"
22
  volumes:
23
  - ./frontend:/app
24
  - /app/node_modules
25
- environment:
26
- - ENVIRONMENT=development
27
- command: npm run dev
28
  depends_on:
29
  - backend
 
2
 
3
  services:
4
  backend:
5
+ build: ./backend
 
 
6
  ports:
7
  - "8000:8000"
8
  volumes:
9
+ # - ./backend:/app
10
+ - ./backend/data/models:/app/data/models
11
+ - ./backend/data/embeddings:/app/data/embeddings
12
+ command: uvicorn app.main:app --host 0.0.0.0 --reload --workers 4
13
+ healthcheck:
14
+ test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
15
+ interval: 30s
16
+ timeout: 10s
17
+ retries: 3
18
+ restart: unless-stopped
19
+ deploy:
20
+ resources:
21
+ limits:
22
+ cpus: '4'
23
+ memory: 8G
24
 
25
  frontend:
26
+ build: ./frontend
 
 
27
  ports:
28
  - "3000:3000"
29
  volumes:
30
  - ./frontend:/app
31
  - /app/node_modules
 
 
 
32
  depends_on:
33
  - backend
frontend/Dockerfile CHANGED
@@ -1,21 +1,23 @@
1
- FROM node:16-alpine
 
2
 
3
  WORKDIR /app
4
 
 
 
 
5
  # Copy package files
6
  COPY package*.json ./
7
 
8
- # Install dependencies and react-scripts globally
9
- RUN npm install -g react-scripts && npm install
10
-
11
- # Copy the rest of the application
12
- COPY . .
13
 
14
- # Add this environment variable to handle hot reloading in Docker
 
 
15
  ENV WATCHPACK_POLLING=true
16
- ENV PATH /app/node_modules/.bin:$PATH
17
 
18
  EXPOSE 3000
19
 
20
- # Start the development server with the correct host
21
- CMD ["react-scripts", "start"]
 
1
+ # Use node with debian instead of alpine
2
+ FROM node:20-alpine
3
 
4
  WORKDIR /app
5
 
6
+ # Install required dependencies including git for shadcn-ui CLI
7
+ RUN apk add --no-cache python3 make g++ git
8
+
9
  # Copy package files
10
  COPY package*.json ./
11
 
12
+ # Clean up and install dependencies
13
+ RUN rm -f package-lock.json && rm -rf node_modules && npm install
 
 
 
14
 
15
+ # Add environment variables for better hot reloading
16
+ ENV VITE_BACKEND_URL=http://backend:8000
17
+ ENV CHOKIDAR_USEPOLLING=true
18
  ENV WATCHPACK_POLLING=true
 
19
 
20
  EXPOSE 3000
21
 
22
+ # Start Vite dev server
23
+ CMD ["npm", "run", "dev", "--", "--host"]
frontend/index.html ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Retrieval Demo</title>
7
+ </head>
8
+ <body>
9
+ <div id="root"></div>
10
+ <script type="module" src="/src/index.jsx"></script>
11
+ </body>
12
+ </html>
frontend/package-lock.json ADDED
@@ -0,0 +1,2486 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "retrieval-demo",
3
+ "version": "0.0.1",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "retrieval-demo",
9
+ "version": "0.0.1",
10
+ "dependencies": {
11
+ "@emotion/react": "^11.x",
12
+ "@emotion/styled": "^11.x",
13
+ "@mui/icons-material": "^6.4.2",
14
+ "@mui/material": "^6.4.2",
15
+ "axios": "^1.6.0",
16
+ "react": "^18.x",
17
+ "react-dom": "^18.x",
18
+ "react-router-dom": "^6.22.0"
19
+ },
20
+ "devDependencies": {
21
+ "@vitejs/plugin-react": "^4.2.0",
22
+ "vite": "^5.0.0"
23
+ }
24
+ },
25
+ "node_modules/@ampproject/remapping": {
26
+ "version": "2.3.0",
27
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
28
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
29
+ "dev": true,
30
+ "license": "Apache-2.0",
31
+ "dependencies": {
32
+ "@jridgewell/gen-mapping": "^0.3.5",
33
+ "@jridgewell/trace-mapping": "^0.3.24"
34
+ },
35
+ "engines": {
36
+ "node": ">=6.0.0"
37
+ }
38
+ },
39
+ "node_modules/@babel/code-frame": {
40
+ "version": "7.26.2",
41
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
42
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
43
+ "license": "MIT",
44
+ "dependencies": {
45
+ "@babel/helper-validator-identifier": "^7.25.9",
46
+ "js-tokens": "^4.0.0",
47
+ "picocolors": "^1.0.0"
48
+ },
49
+ "engines": {
50
+ "node": ">=6.9.0"
51
+ }
52
+ },
53
+ "node_modules/@babel/compat-data": {
54
+ "version": "7.26.5",
55
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz",
56
+ "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==",
57
+ "dev": true,
58
+ "license": "MIT",
59
+ "engines": {
60
+ "node": ">=6.9.0"
61
+ }
62
+ },
63
+ "node_modules/@babel/core": {
64
+ "version": "7.26.7",
65
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz",
66
+ "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==",
67
+ "dev": true,
68
+ "license": "MIT",
69
+ "dependencies": {
70
+ "@ampproject/remapping": "^2.2.0",
71
+ "@babel/code-frame": "^7.26.2",
72
+ "@babel/generator": "^7.26.5",
73
+ "@babel/helper-compilation-targets": "^7.26.5",
74
+ "@babel/helper-module-transforms": "^7.26.0",
75
+ "@babel/helpers": "^7.26.7",
76
+ "@babel/parser": "^7.26.7",
77
+ "@babel/template": "^7.25.9",
78
+ "@babel/traverse": "^7.26.7",
79
+ "@babel/types": "^7.26.7",
80
+ "convert-source-map": "^2.0.0",
81
+ "debug": "^4.1.0",
82
+ "gensync": "^1.0.0-beta.2",
83
+ "json5": "^2.2.3",
84
+ "semver": "^6.3.1"
85
+ },
86
+ "engines": {
87
+ "node": ">=6.9.0"
88
+ },
89
+ "funding": {
90
+ "type": "opencollective",
91
+ "url": "https://opencollective.com/babel"
92
+ }
93
+ },
94
+ "node_modules/@babel/core/node_modules/convert-source-map": {
95
+ "version": "2.0.0",
96
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
97
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
98
+ "dev": true,
99
+ "license": "MIT"
100
+ },
101
+ "node_modules/@babel/generator": {
102
+ "version": "7.26.5",
103
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz",
104
+ "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==",
105
+ "license": "MIT",
106
+ "dependencies": {
107
+ "@babel/parser": "^7.26.5",
108
+ "@babel/types": "^7.26.5",
109
+ "@jridgewell/gen-mapping": "^0.3.5",
110
+ "@jridgewell/trace-mapping": "^0.3.25",
111
+ "jsesc": "^3.0.2"
112
+ },
113
+ "engines": {
114
+ "node": ">=6.9.0"
115
+ }
116
+ },
117
+ "node_modules/@babel/helper-compilation-targets": {
118
+ "version": "7.26.5",
119
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
120
+ "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
121
+ "dev": true,
122
+ "license": "MIT",
123
+ "dependencies": {
124
+ "@babel/compat-data": "^7.26.5",
125
+ "@babel/helper-validator-option": "^7.25.9",
126
+ "browserslist": "^4.24.0",
127
+ "lru-cache": "^5.1.1",
128
+ "semver": "^6.3.1"
129
+ },
130
+ "engines": {
131
+ "node": ">=6.9.0"
132
+ }
133
+ },
134
+ "node_modules/@babel/helper-module-imports": {
135
+ "version": "7.25.9",
136
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
137
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
138
+ "license": "MIT",
139
+ "dependencies": {
140
+ "@babel/traverse": "^7.25.9",
141
+ "@babel/types": "^7.25.9"
142
+ },
143
+ "engines": {
144
+ "node": ">=6.9.0"
145
+ }
146
+ },
147
+ "node_modules/@babel/helper-module-transforms": {
148
+ "version": "7.26.0",
149
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
150
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
151
+ "dev": true,
152
+ "license": "MIT",
153
+ "dependencies": {
154
+ "@babel/helper-module-imports": "^7.25.9",
155
+ "@babel/helper-validator-identifier": "^7.25.9",
156
+ "@babel/traverse": "^7.25.9"
157
+ },
158
+ "engines": {
159
+ "node": ">=6.9.0"
160
+ },
161
+ "peerDependencies": {
162
+ "@babel/core": "^7.0.0"
163
+ }
164
+ },
165
+ "node_modules/@babel/helper-plugin-utils": {
166
+ "version": "7.26.5",
167
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
168
+ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
169
+ "dev": true,
170
+ "license": "MIT",
171
+ "engines": {
172
+ "node": ">=6.9.0"
173
+ }
174
+ },
175
+ "node_modules/@babel/helper-string-parser": {
176
+ "version": "7.25.9",
177
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
178
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
179
+ "license": "MIT",
180
+ "engines": {
181
+ "node": ">=6.9.0"
182
+ }
183
+ },
184
+ "node_modules/@babel/helper-validator-identifier": {
185
+ "version": "7.25.9",
186
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
187
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
188
+ "license": "MIT",
189
+ "engines": {
190
+ "node": ">=6.9.0"
191
+ }
192
+ },
193
+ "node_modules/@babel/helper-validator-option": {
194
+ "version": "7.25.9",
195
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
196
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
197
+ "dev": true,
198
+ "license": "MIT",
199
+ "engines": {
200
+ "node": ">=6.9.0"
201
+ }
202
+ },
203
+ "node_modules/@babel/helpers": {
204
+ "version": "7.26.7",
205
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
206
+ "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
207
+ "dev": true,
208
+ "license": "MIT",
209
+ "dependencies": {
210
+ "@babel/template": "^7.25.9",
211
+ "@babel/types": "^7.26.7"
212
+ },
213
+ "engines": {
214
+ "node": ">=6.9.0"
215
+ }
216
+ },
217
+ "node_modules/@babel/parser": {
218
+ "version": "7.26.7",
219
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz",
220
+ "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==",
221
+ "license": "MIT",
222
+ "dependencies": {
223
+ "@babel/types": "^7.26.7"
224
+ },
225
+ "bin": {
226
+ "parser": "bin/babel-parser.js"
227
+ },
228
+ "engines": {
229
+ "node": ">=6.0.0"
230
+ }
231
+ },
232
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
233
+ "version": "7.25.9",
234
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz",
235
+ "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==",
236
+ "dev": true,
237
+ "license": "MIT",
238
+ "dependencies": {
239
+ "@babel/helper-plugin-utils": "^7.25.9"
240
+ },
241
+ "engines": {
242
+ "node": ">=6.9.0"
243
+ },
244
+ "peerDependencies": {
245
+ "@babel/core": "^7.0.0-0"
246
+ }
247
+ },
248
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
249
+ "version": "7.25.9",
250
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz",
251
+ "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==",
252
+ "dev": true,
253
+ "license": "MIT",
254
+ "dependencies": {
255
+ "@babel/helper-plugin-utils": "^7.25.9"
256
+ },
257
+ "engines": {
258
+ "node": ">=6.9.0"
259
+ },
260
+ "peerDependencies": {
261
+ "@babel/core": "^7.0.0-0"
262
+ }
263
+ },
264
+ "node_modules/@babel/runtime": {
265
+ "version": "7.26.7",
266
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz",
267
+ "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==",
268
+ "license": "MIT",
269
+ "dependencies": {
270
+ "regenerator-runtime": "^0.14.0"
271
+ },
272
+ "engines": {
273
+ "node": ">=6.9.0"
274
+ }
275
+ },
276
+ "node_modules/@babel/template": {
277
+ "version": "7.25.9",
278
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
279
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
280
+ "license": "MIT",
281
+ "dependencies": {
282
+ "@babel/code-frame": "^7.25.9",
283
+ "@babel/parser": "^7.25.9",
284
+ "@babel/types": "^7.25.9"
285
+ },
286
+ "engines": {
287
+ "node": ">=6.9.0"
288
+ }
289
+ },
290
+ "node_modules/@babel/traverse": {
291
+ "version": "7.26.7",
292
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz",
293
+ "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==",
294
+ "license": "MIT",
295
+ "dependencies": {
296
+ "@babel/code-frame": "^7.26.2",
297
+ "@babel/generator": "^7.26.5",
298
+ "@babel/parser": "^7.26.7",
299
+ "@babel/template": "^7.25.9",
300
+ "@babel/types": "^7.26.7",
301
+ "debug": "^4.3.1",
302
+ "globals": "^11.1.0"
303
+ },
304
+ "engines": {
305
+ "node": ">=6.9.0"
306
+ }
307
+ },
308
+ "node_modules/@babel/types": {
309
+ "version": "7.26.7",
310
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz",
311
+ "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==",
312
+ "license": "MIT",
313
+ "dependencies": {
314
+ "@babel/helper-string-parser": "^7.25.9",
315
+ "@babel/helper-validator-identifier": "^7.25.9"
316
+ },
317
+ "engines": {
318
+ "node": ">=6.9.0"
319
+ }
320
+ },
321
+ "node_modules/@emotion/babel-plugin": {
322
+ "version": "11.13.5",
323
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz",
324
+ "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==",
325
+ "license": "MIT",
326
+ "dependencies": {
327
+ "@babel/helper-module-imports": "^7.16.7",
328
+ "@babel/runtime": "^7.18.3",
329
+ "@emotion/hash": "^0.9.2",
330
+ "@emotion/memoize": "^0.9.0",
331
+ "@emotion/serialize": "^1.3.3",
332
+ "babel-plugin-macros": "^3.1.0",
333
+ "convert-source-map": "^1.5.0",
334
+ "escape-string-regexp": "^4.0.0",
335
+ "find-root": "^1.1.0",
336
+ "source-map": "^0.5.7",
337
+ "stylis": "4.2.0"
338
+ }
339
+ },
340
+ "node_modules/@emotion/cache": {
341
+ "version": "11.14.0",
342
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
343
+ "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
344
+ "license": "MIT",
345
+ "dependencies": {
346
+ "@emotion/memoize": "^0.9.0",
347
+ "@emotion/sheet": "^1.4.0",
348
+ "@emotion/utils": "^1.4.2",
349
+ "@emotion/weak-memoize": "^0.4.0",
350
+ "stylis": "4.2.0"
351
+ }
352
+ },
353
+ "node_modules/@emotion/hash": {
354
+ "version": "0.9.2",
355
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
356
+ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
357
+ "license": "MIT"
358
+ },
359
+ "node_modules/@emotion/is-prop-valid": {
360
+ "version": "1.3.1",
361
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
362
+ "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
363
+ "license": "MIT",
364
+ "dependencies": {
365
+ "@emotion/memoize": "^0.9.0"
366
+ }
367
+ },
368
+ "node_modules/@emotion/memoize": {
369
+ "version": "0.9.0",
370
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
371
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
372
+ "license": "MIT"
373
+ },
374
+ "node_modules/@emotion/react": {
375
+ "version": "11.14.0",
376
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz",
377
+ "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==",
378
+ "license": "MIT",
379
+ "dependencies": {
380
+ "@babel/runtime": "^7.18.3",
381
+ "@emotion/babel-plugin": "^11.13.5",
382
+ "@emotion/cache": "^11.14.0",
383
+ "@emotion/serialize": "^1.3.3",
384
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
385
+ "@emotion/utils": "^1.4.2",
386
+ "@emotion/weak-memoize": "^0.4.0",
387
+ "hoist-non-react-statics": "^3.3.1"
388
+ },
389
+ "peerDependencies": {
390
+ "react": ">=16.8.0"
391
+ },
392
+ "peerDependenciesMeta": {
393
+ "@types/react": {
394
+ "optional": true
395
+ }
396
+ }
397
+ },
398
+ "node_modules/@emotion/serialize": {
399
+ "version": "1.3.3",
400
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
401
+ "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
402
+ "license": "MIT",
403
+ "dependencies": {
404
+ "@emotion/hash": "^0.9.2",
405
+ "@emotion/memoize": "^0.9.0",
406
+ "@emotion/unitless": "^0.10.0",
407
+ "@emotion/utils": "^1.4.2",
408
+ "csstype": "^3.0.2"
409
+ }
410
+ },
411
+ "node_modules/@emotion/sheet": {
412
+ "version": "1.4.0",
413
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
414
+ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
415
+ "license": "MIT"
416
+ },
417
+ "node_modules/@emotion/styled": {
418
+ "version": "11.14.0",
419
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz",
420
+ "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==",
421
+ "license": "MIT",
422
+ "dependencies": {
423
+ "@babel/runtime": "^7.18.3",
424
+ "@emotion/babel-plugin": "^11.13.5",
425
+ "@emotion/is-prop-valid": "^1.3.0",
426
+ "@emotion/serialize": "^1.3.3",
427
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0",
428
+ "@emotion/utils": "^1.4.2"
429
+ },
430
+ "peerDependencies": {
431
+ "@emotion/react": "^11.0.0-rc.0",
432
+ "react": ">=16.8.0"
433
+ },
434
+ "peerDependenciesMeta": {
435
+ "@types/react": {
436
+ "optional": true
437
+ }
438
+ }
439
+ },
440
+ "node_modules/@emotion/unitless": {
441
+ "version": "0.10.0",
442
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
443
+ "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
444
+ "license": "MIT"
445
+ },
446
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
447
+ "version": "1.2.0",
448
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
449
+ "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
450
+ "license": "MIT",
451
+ "peerDependencies": {
452
+ "react": ">=16.8.0"
453
+ }
454
+ },
455
+ "node_modules/@emotion/utils": {
456
+ "version": "1.4.2",
457
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
458
+ "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
459
+ "license": "MIT"
460
+ },
461
+ "node_modules/@emotion/weak-memoize": {
462
+ "version": "0.4.0",
463
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
464
+ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
465
+ "license": "MIT"
466
+ },
467
+ "node_modules/@esbuild/aix-ppc64": {
468
+ "version": "0.21.5",
469
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
470
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
471
+ "cpu": [
472
+ "ppc64"
473
+ ],
474
+ "dev": true,
475
+ "license": "MIT",
476
+ "optional": true,
477
+ "os": [
478
+ "aix"
479
+ ],
480
+ "engines": {
481
+ "node": ">=12"
482
+ }
483
+ },
484
+ "node_modules/@esbuild/android-arm": {
485
+ "version": "0.21.5",
486
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
487
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
488
+ "cpu": [
489
+ "arm"
490
+ ],
491
+ "dev": true,
492
+ "license": "MIT",
493
+ "optional": true,
494
+ "os": [
495
+ "android"
496
+ ],
497
+ "engines": {
498
+ "node": ">=12"
499
+ }
500
+ },
501
+ "node_modules/@esbuild/android-arm64": {
502
+ "version": "0.21.5",
503
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
504
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
505
+ "cpu": [
506
+ "arm64"
507
+ ],
508
+ "dev": true,
509
+ "license": "MIT",
510
+ "optional": true,
511
+ "os": [
512
+ "android"
513
+ ],
514
+ "engines": {
515
+ "node": ">=12"
516
+ }
517
+ },
518
+ "node_modules/@esbuild/android-x64": {
519
+ "version": "0.21.5",
520
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
521
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
522
+ "cpu": [
523
+ "x64"
524
+ ],
525
+ "dev": true,
526
+ "license": "MIT",
527
+ "optional": true,
528
+ "os": [
529
+ "android"
530
+ ],
531
+ "engines": {
532
+ "node": ">=12"
533
+ }
534
+ },
535
+ "node_modules/@esbuild/darwin-arm64": {
536
+ "version": "0.21.5",
537
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
538
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
539
+ "cpu": [
540
+ "arm64"
541
+ ],
542
+ "dev": true,
543
+ "license": "MIT",
544
+ "optional": true,
545
+ "os": [
546
+ "darwin"
547
+ ],
548
+ "engines": {
549
+ "node": ">=12"
550
+ }
551
+ },
552
+ "node_modules/@esbuild/darwin-x64": {
553
+ "version": "0.21.5",
554
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
555
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
556
+ "cpu": [
557
+ "x64"
558
+ ],
559
+ "dev": true,
560
+ "license": "MIT",
561
+ "optional": true,
562
+ "os": [
563
+ "darwin"
564
+ ],
565
+ "engines": {
566
+ "node": ">=12"
567
+ }
568
+ },
569
+ "node_modules/@esbuild/freebsd-arm64": {
570
+ "version": "0.21.5",
571
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
572
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
573
+ "cpu": [
574
+ "arm64"
575
+ ],
576
+ "dev": true,
577
+ "license": "MIT",
578
+ "optional": true,
579
+ "os": [
580
+ "freebsd"
581
+ ],
582
+ "engines": {
583
+ "node": ">=12"
584
+ }
585
+ },
586
+ "node_modules/@esbuild/freebsd-x64": {
587
+ "version": "0.21.5",
588
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
589
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
590
+ "cpu": [
591
+ "x64"
592
+ ],
593
+ "dev": true,
594
+ "license": "MIT",
595
+ "optional": true,
596
+ "os": [
597
+ "freebsd"
598
+ ],
599
+ "engines": {
600
+ "node": ">=12"
601
+ }
602
+ },
603
+ "node_modules/@esbuild/linux-arm": {
604
+ "version": "0.21.5",
605
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
606
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
607
+ "cpu": [
608
+ "arm"
609
+ ],
610
+ "dev": true,
611
+ "license": "MIT",
612
+ "optional": true,
613
+ "os": [
614
+ "linux"
615
+ ],
616
+ "engines": {
617
+ "node": ">=12"
618
+ }
619
+ },
620
+ "node_modules/@esbuild/linux-arm64": {
621
+ "version": "0.21.5",
622
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
623
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
624
+ "cpu": [
625
+ "arm64"
626
+ ],
627
+ "dev": true,
628
+ "license": "MIT",
629
+ "optional": true,
630
+ "os": [
631
+ "linux"
632
+ ],
633
+ "engines": {
634
+ "node": ">=12"
635
+ }
636
+ },
637
+ "node_modules/@esbuild/linux-ia32": {
638
+ "version": "0.21.5",
639
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
640
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
641
+ "cpu": [
642
+ "ia32"
643
+ ],
644
+ "dev": true,
645
+ "license": "MIT",
646
+ "optional": true,
647
+ "os": [
648
+ "linux"
649
+ ],
650
+ "engines": {
651
+ "node": ">=12"
652
+ }
653
+ },
654
+ "node_modules/@esbuild/linux-loong64": {
655
+ "version": "0.21.5",
656
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
657
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
658
+ "cpu": [
659
+ "loong64"
660
+ ],
661
+ "dev": true,
662
+ "license": "MIT",
663
+ "optional": true,
664
+ "os": [
665
+ "linux"
666
+ ],
667
+ "engines": {
668
+ "node": ">=12"
669
+ }
670
+ },
671
+ "node_modules/@esbuild/linux-mips64el": {
672
+ "version": "0.21.5",
673
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
674
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
675
+ "cpu": [
676
+ "mips64el"
677
+ ],
678
+ "dev": true,
679
+ "license": "MIT",
680
+ "optional": true,
681
+ "os": [
682
+ "linux"
683
+ ],
684
+ "engines": {
685
+ "node": ">=12"
686
+ }
687
+ },
688
+ "node_modules/@esbuild/linux-ppc64": {
689
+ "version": "0.21.5",
690
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
691
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
692
+ "cpu": [
693
+ "ppc64"
694
+ ],
695
+ "dev": true,
696
+ "license": "MIT",
697
+ "optional": true,
698
+ "os": [
699
+ "linux"
700
+ ],
701
+ "engines": {
702
+ "node": ">=12"
703
+ }
704
+ },
705
+ "node_modules/@esbuild/linux-riscv64": {
706
+ "version": "0.21.5",
707
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
708
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
709
+ "cpu": [
710
+ "riscv64"
711
+ ],
712
+ "dev": true,
713
+ "license": "MIT",
714
+ "optional": true,
715
+ "os": [
716
+ "linux"
717
+ ],
718
+ "engines": {
719
+ "node": ">=12"
720
+ }
721
+ },
722
+ "node_modules/@esbuild/linux-s390x": {
723
+ "version": "0.21.5",
724
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
725
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
726
+ "cpu": [
727
+ "s390x"
728
+ ],
729
+ "dev": true,
730
+ "license": "MIT",
731
+ "optional": true,
732
+ "os": [
733
+ "linux"
734
+ ],
735
+ "engines": {
736
+ "node": ">=12"
737
+ }
738
+ },
739
+ "node_modules/@esbuild/linux-x64": {
740
+ "version": "0.21.5",
741
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
742
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
743
+ "cpu": [
744
+ "x64"
745
+ ],
746
+ "dev": true,
747
+ "license": "MIT",
748
+ "optional": true,
749
+ "os": [
750
+ "linux"
751
+ ],
752
+ "engines": {
753
+ "node": ">=12"
754
+ }
755
+ },
756
+ "node_modules/@esbuild/netbsd-x64": {
757
+ "version": "0.21.5",
758
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
759
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
760
+ "cpu": [
761
+ "x64"
762
+ ],
763
+ "dev": true,
764
+ "license": "MIT",
765
+ "optional": true,
766
+ "os": [
767
+ "netbsd"
768
+ ],
769
+ "engines": {
770
+ "node": ">=12"
771
+ }
772
+ },
773
+ "node_modules/@esbuild/openbsd-x64": {
774
+ "version": "0.21.5",
775
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
776
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
777
+ "cpu": [
778
+ "x64"
779
+ ],
780
+ "dev": true,
781
+ "license": "MIT",
782
+ "optional": true,
783
+ "os": [
784
+ "openbsd"
785
+ ],
786
+ "engines": {
787
+ "node": ">=12"
788
+ }
789
+ },
790
+ "node_modules/@esbuild/sunos-x64": {
791
+ "version": "0.21.5",
792
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
793
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
794
+ "cpu": [
795
+ "x64"
796
+ ],
797
+ "dev": true,
798
+ "license": "MIT",
799
+ "optional": true,
800
+ "os": [
801
+ "sunos"
802
+ ],
803
+ "engines": {
804
+ "node": ">=12"
805
+ }
806
+ },
807
+ "node_modules/@esbuild/win32-arm64": {
808
+ "version": "0.21.5",
809
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
810
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
811
+ "cpu": [
812
+ "arm64"
813
+ ],
814
+ "dev": true,
815
+ "license": "MIT",
816
+ "optional": true,
817
+ "os": [
818
+ "win32"
819
+ ],
820
+ "engines": {
821
+ "node": ">=12"
822
+ }
823
+ },
824
+ "node_modules/@esbuild/win32-ia32": {
825
+ "version": "0.21.5",
826
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
827
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
828
+ "cpu": [
829
+ "ia32"
830
+ ],
831
+ "dev": true,
832
+ "license": "MIT",
833
+ "optional": true,
834
+ "os": [
835
+ "win32"
836
+ ],
837
+ "engines": {
838
+ "node": ">=12"
839
+ }
840
+ },
841
+ "node_modules/@esbuild/win32-x64": {
842
+ "version": "0.21.5",
843
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
844
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
845
+ "cpu": [
846
+ "x64"
847
+ ],
848
+ "dev": true,
849
+ "license": "MIT",
850
+ "optional": true,
851
+ "os": [
852
+ "win32"
853
+ ],
854
+ "engines": {
855
+ "node": ">=12"
856
+ }
857
+ },
858
+ "node_modules/@jridgewell/gen-mapping": {
859
+ "version": "0.3.8",
860
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
861
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
862
+ "license": "MIT",
863
+ "dependencies": {
864
+ "@jridgewell/set-array": "^1.2.1",
865
+ "@jridgewell/sourcemap-codec": "^1.4.10",
866
+ "@jridgewell/trace-mapping": "^0.3.24"
867
+ },
868
+ "engines": {
869
+ "node": ">=6.0.0"
870
+ }
871
+ },
872
+ "node_modules/@jridgewell/resolve-uri": {
873
+ "version": "3.1.2",
874
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
875
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
876
+ "license": "MIT",
877
+ "engines": {
878
+ "node": ">=6.0.0"
879
+ }
880
+ },
881
+ "node_modules/@jridgewell/set-array": {
882
+ "version": "1.2.1",
883
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
884
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
885
+ "license": "MIT",
886
+ "engines": {
887
+ "node": ">=6.0.0"
888
+ }
889
+ },
890
+ "node_modules/@jridgewell/sourcemap-codec": {
891
+ "version": "1.5.0",
892
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
893
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
894
+ "license": "MIT"
895
+ },
896
+ "node_modules/@jridgewell/trace-mapping": {
897
+ "version": "0.3.25",
898
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
899
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
900
+ "license": "MIT",
901
+ "dependencies": {
902
+ "@jridgewell/resolve-uri": "^3.1.0",
903
+ "@jridgewell/sourcemap-codec": "^1.4.14"
904
+ }
905
+ },
906
+ "node_modules/@mui/core-downloads-tracker": {
907
+ "version": "6.4.2",
908
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.2.tgz",
909
+ "integrity": "sha512-Qmod9fHsFWrtLxdSkZ4iDLRz2AUKt3C2ZEimuY+qKlQGVKJDNS5DuSlNOAgqfHFDq8mzB17ATN6HFcThwJlvUw==",
910
+ "license": "MIT",
911
+ "funding": {
912
+ "type": "opencollective",
913
+ "url": "https://opencollective.com/mui-org"
914
+ }
915
+ },
916
+ "node_modules/@mui/icons-material": {
917
+ "version": "6.4.2",
918
+ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.2.tgz",
919
+ "integrity": "sha512-uwsH1KRmxkJwK3NZyo1xL9pEduL16ftCnzYBYjd6nPNtm05QAoIc0aqedS9tqDV+Ab3q5C04HHOVsMDDv1EBpg==",
920
+ "license": "MIT",
921
+ "dependencies": {
922
+ "@babel/runtime": "^7.26.0"
923
+ },
924
+ "engines": {
925
+ "node": ">=14.0.0"
926
+ },
927
+ "funding": {
928
+ "type": "opencollective",
929
+ "url": "https://opencollective.com/mui-org"
930
+ },
931
+ "peerDependencies": {
932
+ "@mui/material": "^6.4.2",
933
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
934
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
935
+ },
936
+ "peerDependenciesMeta": {
937
+ "@types/react": {
938
+ "optional": true
939
+ }
940
+ }
941
+ },
942
+ "node_modules/@mui/material": {
943
+ "version": "6.4.2",
944
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.2.tgz",
945
+ "integrity": "sha512-9jKr53KbAJyyBRx8LRmX7ATXHlGtxVQdPgm1uyXMoEPMVkSJW1yO3vFgfYoDbGx4ZHcCNuWa4FkFIPWVt9fghA==",
946
+ "license": "MIT",
947
+ "dependencies": {
948
+ "@babel/runtime": "^7.26.0",
949
+ "@mui/core-downloads-tracker": "^6.4.2",
950
+ "@mui/system": "^6.4.2",
951
+ "@mui/types": "^7.2.21",
952
+ "@mui/utils": "^6.4.2",
953
+ "@popperjs/core": "^2.11.8",
954
+ "@types/react-transition-group": "^4.4.12",
955
+ "clsx": "^2.1.1",
956
+ "csstype": "^3.1.3",
957
+ "prop-types": "^15.8.1",
958
+ "react-is": "^19.0.0",
959
+ "react-transition-group": "^4.4.5"
960
+ },
961
+ "engines": {
962
+ "node": ">=14.0.0"
963
+ },
964
+ "funding": {
965
+ "type": "opencollective",
966
+ "url": "https://opencollective.com/mui-org"
967
+ },
968
+ "peerDependencies": {
969
+ "@emotion/react": "^11.5.0",
970
+ "@emotion/styled": "^11.3.0",
971
+ "@mui/material-pigment-css": "^6.4.2",
972
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
973
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
974
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
975
+ },
976
+ "peerDependenciesMeta": {
977
+ "@emotion/react": {
978
+ "optional": true
979
+ },
980
+ "@emotion/styled": {
981
+ "optional": true
982
+ },
983
+ "@mui/material-pigment-css": {
984
+ "optional": true
985
+ },
986
+ "@types/react": {
987
+ "optional": true
988
+ }
989
+ }
990
+ },
991
+ "node_modules/@mui/private-theming": {
992
+ "version": "6.4.2",
993
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.2.tgz",
994
+ "integrity": "sha512-2CkQT0gNlogM50qGTBJgWA7hPPx4AeH8RE2xJa+PHtIOowiVPX52ZsQ0e7Ho18DAqEbkngQ6Uju037ER+TCY5A==",
995
+ "license": "MIT",
996
+ "dependencies": {
997
+ "@babel/runtime": "^7.26.0",
998
+ "@mui/utils": "^6.4.2",
999
+ "prop-types": "^15.8.1"
1000
+ },
1001
+ "engines": {
1002
+ "node": ">=14.0.0"
1003
+ },
1004
+ "funding": {
1005
+ "type": "opencollective",
1006
+ "url": "https://opencollective.com/mui-org"
1007
+ },
1008
+ "peerDependencies": {
1009
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
1010
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
1011
+ },
1012
+ "peerDependenciesMeta": {
1013
+ "@types/react": {
1014
+ "optional": true
1015
+ }
1016
+ }
1017
+ },
1018
+ "node_modules/@mui/styled-engine": {
1019
+ "version": "6.4.2",
1020
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.2.tgz",
1021
+ "integrity": "sha512-cgjQK2bkllSYoWUBv93ALhCPJ0NhfO3NctsBf13/b4XSeQVfKPBAnR+P9mNpdFMa5a5RWwtWuBD3cZ5vktsN+g==",
1022
+ "license": "MIT",
1023
+ "dependencies": {
1024
+ "@babel/runtime": "^7.26.0",
1025
+ "@emotion/cache": "^11.13.5",
1026
+ "@emotion/serialize": "^1.3.3",
1027
+ "@emotion/sheet": "^1.4.0",
1028
+ "csstype": "^3.1.3",
1029
+ "prop-types": "^15.8.1"
1030
+ },
1031
+ "engines": {
1032
+ "node": ">=14.0.0"
1033
+ },
1034
+ "funding": {
1035
+ "type": "opencollective",
1036
+ "url": "https://opencollective.com/mui-org"
1037
+ },
1038
+ "peerDependencies": {
1039
+ "@emotion/react": "^11.4.1",
1040
+ "@emotion/styled": "^11.3.0",
1041
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
1042
+ },
1043
+ "peerDependenciesMeta": {
1044
+ "@emotion/react": {
1045
+ "optional": true
1046
+ },
1047
+ "@emotion/styled": {
1048
+ "optional": true
1049
+ }
1050
+ }
1051
+ },
1052
+ "node_modules/@mui/system": {
1053
+ "version": "6.4.2",
1054
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.2.tgz",
1055
+ "integrity": "sha512-wQbaPCtsxNsM5nR+NZpkFJBKVKH03GQnAjlkKENM8JQqGdWcRyM3f4fJZgzzNdIFpSQw4wpAQKnhfHkjf3d6yQ==",
1056
+ "license": "MIT",
1057
+ "dependencies": {
1058
+ "@babel/runtime": "^7.26.0",
1059
+ "@mui/private-theming": "^6.4.2",
1060
+ "@mui/styled-engine": "^6.4.2",
1061
+ "@mui/types": "^7.2.21",
1062
+ "@mui/utils": "^6.4.2",
1063
+ "clsx": "^2.1.1",
1064
+ "csstype": "^3.1.3",
1065
+ "prop-types": "^15.8.1"
1066
+ },
1067
+ "engines": {
1068
+ "node": ">=14.0.0"
1069
+ },
1070
+ "funding": {
1071
+ "type": "opencollective",
1072
+ "url": "https://opencollective.com/mui-org"
1073
+ },
1074
+ "peerDependencies": {
1075
+ "@emotion/react": "^11.5.0",
1076
+ "@emotion/styled": "^11.3.0",
1077
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
1078
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
1079
+ },
1080
+ "peerDependenciesMeta": {
1081
+ "@emotion/react": {
1082
+ "optional": true
1083
+ },
1084
+ "@emotion/styled": {
1085
+ "optional": true
1086
+ },
1087
+ "@types/react": {
1088
+ "optional": true
1089
+ }
1090
+ }
1091
+ },
1092
+ "node_modules/@mui/types": {
1093
+ "version": "7.2.21",
1094
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.21.tgz",
1095
+ "integrity": "sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==",
1096
+ "license": "MIT",
1097
+ "peerDependencies": {
1098
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
1099
+ },
1100
+ "peerDependenciesMeta": {
1101
+ "@types/react": {
1102
+ "optional": true
1103
+ }
1104
+ }
1105
+ },
1106
+ "node_modules/@mui/utils": {
1107
+ "version": "6.4.2",
1108
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.2.tgz",
1109
+ "integrity": "sha512-5NkhzlJkmR5+5RSs/Irqin1GPy2Z8vbLk/UzQrH9FEAnm6OA9SvuXjzgklxUs7N65VwEkGpKK1jMZ5K84hRdzQ==",
1110
+ "license": "MIT",
1111
+ "dependencies": {
1112
+ "@babel/runtime": "^7.26.0",
1113
+ "@mui/types": "^7.2.21",
1114
+ "@types/prop-types": "^15.7.14",
1115
+ "clsx": "^2.1.1",
1116
+ "prop-types": "^15.8.1",
1117
+ "react-is": "^19.0.0"
1118
+ },
1119
+ "engines": {
1120
+ "node": ">=14.0.0"
1121
+ },
1122
+ "funding": {
1123
+ "type": "opencollective",
1124
+ "url": "https://opencollective.com/mui-org"
1125
+ },
1126
+ "peerDependencies": {
1127
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
1128
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
1129
+ },
1130
+ "peerDependenciesMeta": {
1131
+ "@types/react": {
1132
+ "optional": true
1133
+ }
1134
+ }
1135
+ },
1136
+ "node_modules/@popperjs/core": {
1137
+ "version": "2.11.8",
1138
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
1139
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
1140
+ "license": "MIT",
1141
+ "funding": {
1142
+ "type": "opencollective",
1143
+ "url": "https://opencollective.com/popperjs"
1144
+ }
1145
+ },
1146
+ "node_modules/@remix-run/router": {
1147
+ "version": "1.21.1",
1148
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.1.tgz",
1149
+ "integrity": "sha512-KeBYSwohb8g4/wCcnksvKTYlg69O62sQeLynn2YE+5z7JWEj95if27kclW9QqbrlsQ2DINI8fjbV3zyuKfwjKg==",
1150
+ "license": "MIT",
1151
+ "engines": {
1152
+ "node": ">=14.0.0"
1153
+ }
1154
+ },
1155
+ "node_modules/@rollup/rollup-android-arm-eabi": {
1156
+ "version": "4.32.1",
1157
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz",
1158
+ "integrity": "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==",
1159
+ "cpu": [
1160
+ "arm"
1161
+ ],
1162
+ "dev": true,
1163
+ "license": "MIT",
1164
+ "optional": true,
1165
+ "os": [
1166
+ "android"
1167
+ ]
1168
+ },
1169
+ "node_modules/@rollup/rollup-android-arm64": {
1170
+ "version": "4.32.1",
1171
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz",
1172
+ "integrity": "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==",
1173
+ "cpu": [
1174
+ "arm64"
1175
+ ],
1176
+ "dev": true,
1177
+ "license": "MIT",
1178
+ "optional": true,
1179
+ "os": [
1180
+ "android"
1181
+ ]
1182
+ },
1183
+ "node_modules/@rollup/rollup-darwin-arm64": {
1184
+ "version": "4.32.1",
1185
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz",
1186
+ "integrity": "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==",
1187
+ "cpu": [
1188
+ "arm64"
1189
+ ],
1190
+ "dev": true,
1191
+ "license": "MIT",
1192
+ "optional": true,
1193
+ "os": [
1194
+ "darwin"
1195
+ ]
1196
+ },
1197
+ "node_modules/@rollup/rollup-darwin-x64": {
1198
+ "version": "4.32.1",
1199
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz",
1200
+ "integrity": "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==",
1201
+ "cpu": [
1202
+ "x64"
1203
+ ],
1204
+ "dev": true,
1205
+ "license": "MIT",
1206
+ "optional": true,
1207
+ "os": [
1208
+ "darwin"
1209
+ ]
1210
+ },
1211
+ "node_modules/@rollup/rollup-freebsd-arm64": {
1212
+ "version": "4.32.1",
1213
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz",
1214
+ "integrity": "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==",
1215
+ "cpu": [
1216
+ "arm64"
1217
+ ],
1218
+ "dev": true,
1219
+ "license": "MIT",
1220
+ "optional": true,
1221
+ "os": [
1222
+ "freebsd"
1223
+ ]
1224
+ },
1225
+ "node_modules/@rollup/rollup-freebsd-x64": {
1226
+ "version": "4.32.1",
1227
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz",
1228
+ "integrity": "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==",
1229
+ "cpu": [
1230
+ "x64"
1231
+ ],
1232
+ "dev": true,
1233
+ "license": "MIT",
1234
+ "optional": true,
1235
+ "os": [
1236
+ "freebsd"
1237
+ ]
1238
+ },
1239
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
1240
+ "version": "4.32.1",
1241
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz",
1242
+ "integrity": "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==",
1243
+ "cpu": [
1244
+ "arm"
1245
+ ],
1246
+ "dev": true,
1247
+ "license": "MIT",
1248
+ "optional": true,
1249
+ "os": [
1250
+ "linux"
1251
+ ]
1252
+ },
1253
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
1254
+ "version": "4.32.1",
1255
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz",
1256
+ "integrity": "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==",
1257
+ "cpu": [
1258
+ "arm"
1259
+ ],
1260
+ "dev": true,
1261
+ "license": "MIT",
1262
+ "optional": true,
1263
+ "os": [
1264
+ "linux"
1265
+ ]
1266
+ },
1267
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
1268
+ "version": "4.32.1",
1269
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz",
1270
+ "integrity": "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==",
1271
+ "cpu": [
1272
+ "arm64"
1273
+ ],
1274
+ "dev": true,
1275
+ "license": "MIT",
1276
+ "optional": true,
1277
+ "os": [
1278
+ "linux"
1279
+ ]
1280
+ },
1281
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
1282
+ "version": "4.32.1",
1283
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz",
1284
+ "integrity": "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==",
1285
+ "cpu": [
1286
+ "arm64"
1287
+ ],
1288
+ "dev": true,
1289
+ "license": "MIT",
1290
+ "optional": true,
1291
+ "os": [
1292
+ "linux"
1293
+ ]
1294
+ },
1295
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
1296
+ "version": "4.32.1",
1297
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz",
1298
+ "integrity": "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==",
1299
+ "cpu": [
1300
+ "loong64"
1301
+ ],
1302
+ "dev": true,
1303
+ "license": "MIT",
1304
+ "optional": true,
1305
+ "os": [
1306
+ "linux"
1307
+ ]
1308
+ },
1309
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
1310
+ "version": "4.32.1",
1311
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz",
1312
+ "integrity": "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==",
1313
+ "cpu": [
1314
+ "ppc64"
1315
+ ],
1316
+ "dev": true,
1317
+ "license": "MIT",
1318
+ "optional": true,
1319
+ "os": [
1320
+ "linux"
1321
+ ]
1322
+ },
1323
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1324
+ "version": "4.32.1",
1325
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz",
1326
+ "integrity": "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==",
1327
+ "cpu": [
1328
+ "riscv64"
1329
+ ],
1330
+ "dev": true,
1331
+ "license": "MIT",
1332
+ "optional": true,
1333
+ "os": [
1334
+ "linux"
1335
+ ]
1336
+ },
1337
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
1338
+ "version": "4.32.1",
1339
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz",
1340
+ "integrity": "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==",
1341
+ "cpu": [
1342
+ "s390x"
1343
+ ],
1344
+ "dev": true,
1345
+ "license": "MIT",
1346
+ "optional": true,
1347
+ "os": [
1348
+ "linux"
1349
+ ]
1350
+ },
1351
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
1352
+ "version": "4.32.1",
1353
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz",
1354
+ "integrity": "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==",
1355
+ "cpu": [
1356
+ "x64"
1357
+ ],
1358
+ "dev": true,
1359
+ "license": "MIT",
1360
+ "optional": true,
1361
+ "os": [
1362
+ "linux"
1363
+ ]
1364
+ },
1365
+ "node_modules/@rollup/rollup-linux-x64-musl": {
1366
+ "version": "4.32.1",
1367
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz",
1368
+ "integrity": "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==",
1369
+ "cpu": [
1370
+ "x64"
1371
+ ],
1372
+ "dev": true,
1373
+ "license": "MIT",
1374
+ "optional": true,
1375
+ "os": [
1376
+ "linux"
1377
+ ]
1378
+ },
1379
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
1380
+ "version": "4.32.1",
1381
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz",
1382
+ "integrity": "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==",
1383
+ "cpu": [
1384
+ "arm64"
1385
+ ],
1386
+ "dev": true,
1387
+ "license": "MIT",
1388
+ "optional": true,
1389
+ "os": [
1390
+ "win32"
1391
+ ]
1392
+ },
1393
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
1394
+ "version": "4.32.1",
1395
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz",
1396
+ "integrity": "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==",
1397
+ "cpu": [
1398
+ "ia32"
1399
+ ],
1400
+ "dev": true,
1401
+ "license": "MIT",
1402
+ "optional": true,
1403
+ "os": [
1404
+ "win32"
1405
+ ]
1406
+ },
1407
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
1408
+ "version": "4.32.1",
1409
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz",
1410
+ "integrity": "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==",
1411
+ "cpu": [
1412
+ "x64"
1413
+ ],
1414
+ "dev": true,
1415
+ "license": "MIT",
1416
+ "optional": true,
1417
+ "os": [
1418
+ "win32"
1419
+ ]
1420
+ },
1421
+ "node_modules/@types/babel__core": {
1422
+ "version": "7.20.5",
1423
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1424
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1425
+ "dev": true,
1426
+ "license": "MIT",
1427
+ "dependencies": {
1428
+ "@babel/parser": "^7.20.7",
1429
+ "@babel/types": "^7.20.7",
1430
+ "@types/babel__generator": "*",
1431
+ "@types/babel__template": "*",
1432
+ "@types/babel__traverse": "*"
1433
+ }
1434
+ },
1435
+ "node_modules/@types/babel__generator": {
1436
+ "version": "7.6.8",
1437
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
1438
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
1439
+ "dev": true,
1440
+ "license": "MIT",
1441
+ "dependencies": {
1442
+ "@babel/types": "^7.0.0"
1443
+ }
1444
+ },
1445
+ "node_modules/@types/babel__template": {
1446
+ "version": "7.4.4",
1447
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1448
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1449
+ "dev": true,
1450
+ "license": "MIT",
1451
+ "dependencies": {
1452
+ "@babel/parser": "^7.1.0",
1453
+ "@babel/types": "^7.0.0"
1454
+ }
1455
+ },
1456
+ "node_modules/@types/babel__traverse": {
1457
+ "version": "7.20.6",
1458
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
1459
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
1460
+ "dev": true,
1461
+ "license": "MIT",
1462
+ "dependencies": {
1463
+ "@babel/types": "^7.20.7"
1464
+ }
1465
+ },
1466
+ "node_modules/@types/estree": {
1467
+ "version": "1.0.6",
1468
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
1469
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
1470
+ "dev": true,
1471
+ "license": "MIT"
1472
+ },
1473
+ "node_modules/@types/parse-json": {
1474
+ "version": "4.0.2",
1475
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
1476
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
1477
+ "license": "MIT"
1478
+ },
1479
+ "node_modules/@types/prop-types": {
1480
+ "version": "15.7.14",
1481
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz",
1482
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
1483
+ "license": "MIT"
1484
+ },
1485
+ "node_modules/@types/react": {
1486
+ "version": "18.3.18",
1487
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz",
1488
+ "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==",
1489
+ "license": "MIT",
1490
+ "peer": true,
1491
+ "dependencies": {
1492
+ "@types/prop-types": "*",
1493
+ "csstype": "^3.0.2"
1494
+ }
1495
+ },
1496
+ "node_modules/@types/react-transition-group": {
1497
+ "version": "4.4.12",
1498
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
1499
+ "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
1500
+ "license": "MIT",
1501
+ "peerDependencies": {
1502
+ "@types/react": "*"
1503
+ }
1504
+ },
1505
+ "node_modules/@vitejs/plugin-react": {
1506
+ "version": "4.3.4",
1507
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz",
1508
+ "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==",
1509
+ "dev": true,
1510
+ "license": "MIT",
1511
+ "dependencies": {
1512
+ "@babel/core": "^7.26.0",
1513
+ "@babel/plugin-transform-react-jsx-self": "^7.25.9",
1514
+ "@babel/plugin-transform-react-jsx-source": "^7.25.9",
1515
+ "@types/babel__core": "^7.20.5",
1516
+ "react-refresh": "^0.14.2"
1517
+ },
1518
+ "engines": {
1519
+ "node": "^14.18.0 || >=16.0.0"
1520
+ },
1521
+ "peerDependencies": {
1522
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0"
1523
+ }
1524
+ },
1525
+ "node_modules/asynckit": {
1526
+ "version": "0.4.0",
1527
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1528
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
1529
+ "license": "MIT"
1530
+ },
1531
+ "node_modules/axios": {
1532
+ "version": "1.7.9",
1533
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
1534
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
1535
+ "license": "MIT",
1536
+ "dependencies": {
1537
+ "follow-redirects": "^1.15.6",
1538
+ "form-data": "^4.0.0",
1539
+ "proxy-from-env": "^1.1.0"
1540
+ }
1541
+ },
1542
+ "node_modules/babel-plugin-macros": {
1543
+ "version": "3.1.0",
1544
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
1545
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
1546
+ "license": "MIT",
1547
+ "dependencies": {
1548
+ "@babel/runtime": "^7.12.5",
1549
+ "cosmiconfig": "^7.0.0",
1550
+ "resolve": "^1.19.0"
1551
+ },
1552
+ "engines": {
1553
+ "node": ">=10",
1554
+ "npm": ">=6"
1555
+ }
1556
+ },
1557
+ "node_modules/browserslist": {
1558
+ "version": "4.24.4",
1559
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
1560
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
1561
+ "dev": true,
1562
+ "funding": [
1563
+ {
1564
+ "type": "opencollective",
1565
+ "url": "https://opencollective.com/browserslist"
1566
+ },
1567
+ {
1568
+ "type": "tidelift",
1569
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1570
+ },
1571
+ {
1572
+ "type": "github",
1573
+ "url": "https://github.com/sponsors/ai"
1574
+ }
1575
+ ],
1576
+ "license": "MIT",
1577
+ "dependencies": {
1578
+ "caniuse-lite": "^1.0.30001688",
1579
+ "electron-to-chromium": "^1.5.73",
1580
+ "node-releases": "^2.0.19",
1581
+ "update-browserslist-db": "^1.1.1"
1582
+ },
1583
+ "bin": {
1584
+ "browserslist": "cli.js"
1585
+ },
1586
+ "engines": {
1587
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1588
+ }
1589
+ },
1590
+ "node_modules/callsites": {
1591
+ "version": "3.1.0",
1592
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
1593
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
1594
+ "license": "MIT",
1595
+ "engines": {
1596
+ "node": ">=6"
1597
+ }
1598
+ },
1599
+ "node_modules/caniuse-lite": {
1600
+ "version": "1.0.30001696",
1601
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz",
1602
+ "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==",
1603
+ "dev": true,
1604
+ "funding": [
1605
+ {
1606
+ "type": "opencollective",
1607
+ "url": "https://opencollective.com/browserslist"
1608
+ },
1609
+ {
1610
+ "type": "tidelift",
1611
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1612
+ },
1613
+ {
1614
+ "type": "github",
1615
+ "url": "https://github.com/sponsors/ai"
1616
+ }
1617
+ ],
1618
+ "license": "CC-BY-4.0"
1619
+ },
1620
+ "node_modules/clsx": {
1621
+ "version": "2.1.1",
1622
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
1623
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
1624
+ "license": "MIT",
1625
+ "engines": {
1626
+ "node": ">=6"
1627
+ }
1628
+ },
1629
+ "node_modules/combined-stream": {
1630
+ "version": "1.0.8",
1631
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1632
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1633
+ "license": "MIT",
1634
+ "dependencies": {
1635
+ "delayed-stream": "~1.0.0"
1636
+ },
1637
+ "engines": {
1638
+ "node": ">= 0.8"
1639
+ }
1640
+ },
1641
+ "node_modules/convert-source-map": {
1642
+ "version": "1.9.0",
1643
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
1644
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
1645
+ "license": "MIT"
1646
+ },
1647
+ "node_modules/cosmiconfig": {
1648
+ "version": "7.1.0",
1649
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
1650
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
1651
+ "license": "MIT",
1652
+ "dependencies": {
1653
+ "@types/parse-json": "^4.0.0",
1654
+ "import-fresh": "^3.2.1",
1655
+ "parse-json": "^5.0.0",
1656
+ "path-type": "^4.0.0",
1657
+ "yaml": "^1.10.0"
1658
+ },
1659
+ "engines": {
1660
+ "node": ">=10"
1661
+ }
1662
+ },
1663
+ "node_modules/csstype": {
1664
+ "version": "3.1.3",
1665
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1666
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
1667
+ "license": "MIT"
1668
+ },
1669
+ "node_modules/debug": {
1670
+ "version": "4.4.0",
1671
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
1672
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
1673
+ "license": "MIT",
1674
+ "dependencies": {
1675
+ "ms": "^2.1.3"
1676
+ },
1677
+ "engines": {
1678
+ "node": ">=6.0"
1679
+ },
1680
+ "peerDependenciesMeta": {
1681
+ "supports-color": {
1682
+ "optional": true
1683
+ }
1684
+ }
1685
+ },
1686
+ "node_modules/delayed-stream": {
1687
+ "version": "1.0.0",
1688
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1689
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
1690
+ "license": "MIT",
1691
+ "engines": {
1692
+ "node": ">=0.4.0"
1693
+ }
1694
+ },
1695
+ "node_modules/dom-helpers": {
1696
+ "version": "5.2.1",
1697
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
1698
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
1699
+ "license": "MIT",
1700
+ "dependencies": {
1701
+ "@babel/runtime": "^7.8.7",
1702
+ "csstype": "^3.0.2"
1703
+ }
1704
+ },
1705
+ "node_modules/electron-to-chromium": {
1706
+ "version": "1.5.90",
1707
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz",
1708
+ "integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==",
1709
+ "dev": true,
1710
+ "license": "ISC"
1711
+ },
1712
+ "node_modules/error-ex": {
1713
+ "version": "1.3.2",
1714
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
1715
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
1716
+ "license": "MIT",
1717
+ "dependencies": {
1718
+ "is-arrayish": "^0.2.1"
1719
+ }
1720
+ },
1721
+ "node_modules/esbuild": {
1722
+ "version": "0.21.5",
1723
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
1724
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
1725
+ "dev": true,
1726
+ "hasInstallScript": true,
1727
+ "license": "MIT",
1728
+ "bin": {
1729
+ "esbuild": "bin/esbuild"
1730
+ },
1731
+ "engines": {
1732
+ "node": ">=12"
1733
+ },
1734
+ "optionalDependencies": {
1735
+ "@esbuild/aix-ppc64": "0.21.5",
1736
+ "@esbuild/android-arm": "0.21.5",
1737
+ "@esbuild/android-arm64": "0.21.5",
1738
+ "@esbuild/android-x64": "0.21.5",
1739
+ "@esbuild/darwin-arm64": "0.21.5",
1740
+ "@esbuild/darwin-x64": "0.21.5",
1741
+ "@esbuild/freebsd-arm64": "0.21.5",
1742
+ "@esbuild/freebsd-x64": "0.21.5",
1743
+ "@esbuild/linux-arm": "0.21.5",
1744
+ "@esbuild/linux-arm64": "0.21.5",
1745
+ "@esbuild/linux-ia32": "0.21.5",
1746
+ "@esbuild/linux-loong64": "0.21.5",
1747
+ "@esbuild/linux-mips64el": "0.21.5",
1748
+ "@esbuild/linux-ppc64": "0.21.5",
1749
+ "@esbuild/linux-riscv64": "0.21.5",
1750
+ "@esbuild/linux-s390x": "0.21.5",
1751
+ "@esbuild/linux-x64": "0.21.5",
1752
+ "@esbuild/netbsd-x64": "0.21.5",
1753
+ "@esbuild/openbsd-x64": "0.21.5",
1754
+ "@esbuild/sunos-x64": "0.21.5",
1755
+ "@esbuild/win32-arm64": "0.21.5",
1756
+ "@esbuild/win32-ia32": "0.21.5",
1757
+ "@esbuild/win32-x64": "0.21.5"
1758
+ }
1759
+ },
1760
+ "node_modules/escalade": {
1761
+ "version": "3.2.0",
1762
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1763
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1764
+ "dev": true,
1765
+ "license": "MIT",
1766
+ "engines": {
1767
+ "node": ">=6"
1768
+ }
1769
+ },
1770
+ "node_modules/escape-string-regexp": {
1771
+ "version": "4.0.0",
1772
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1773
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1774
+ "license": "MIT",
1775
+ "engines": {
1776
+ "node": ">=10"
1777
+ },
1778
+ "funding": {
1779
+ "url": "https://github.com/sponsors/sindresorhus"
1780
+ }
1781
+ },
1782
+ "node_modules/find-root": {
1783
+ "version": "1.1.0",
1784
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
1785
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
1786
+ "license": "MIT"
1787
+ },
1788
+ "node_modules/follow-redirects": {
1789
+ "version": "1.15.9",
1790
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
1791
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
1792
+ "funding": [
1793
+ {
1794
+ "type": "individual",
1795
+ "url": "https://github.com/sponsors/RubenVerborgh"
1796
+ }
1797
+ ],
1798
+ "license": "MIT",
1799
+ "engines": {
1800
+ "node": ">=4.0"
1801
+ },
1802
+ "peerDependenciesMeta": {
1803
+ "debug": {
1804
+ "optional": true
1805
+ }
1806
+ }
1807
+ },
1808
+ "node_modules/form-data": {
1809
+ "version": "4.0.1",
1810
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
1811
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
1812
+ "license": "MIT",
1813
+ "dependencies": {
1814
+ "asynckit": "^0.4.0",
1815
+ "combined-stream": "^1.0.8",
1816
+ "mime-types": "^2.1.12"
1817
+ },
1818
+ "engines": {
1819
+ "node": ">= 6"
1820
+ }
1821
+ },
1822
+ "node_modules/fsevents": {
1823
+ "version": "2.3.3",
1824
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1825
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1826
+ "dev": true,
1827
+ "hasInstallScript": true,
1828
+ "license": "MIT",
1829
+ "optional": true,
1830
+ "os": [
1831
+ "darwin"
1832
+ ],
1833
+ "engines": {
1834
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1835
+ }
1836
+ },
1837
+ "node_modules/function-bind": {
1838
+ "version": "1.1.2",
1839
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1840
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1841
+ "license": "MIT",
1842
+ "funding": {
1843
+ "url": "https://github.com/sponsors/ljharb"
1844
+ }
1845
+ },
1846
+ "node_modules/gensync": {
1847
+ "version": "1.0.0-beta.2",
1848
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1849
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1850
+ "dev": true,
1851
+ "license": "MIT",
1852
+ "engines": {
1853
+ "node": ">=6.9.0"
1854
+ }
1855
+ },
1856
+ "node_modules/globals": {
1857
+ "version": "11.12.0",
1858
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
1859
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
1860
+ "license": "MIT",
1861
+ "engines": {
1862
+ "node": ">=4"
1863
+ }
1864
+ },
1865
+ "node_modules/hasown": {
1866
+ "version": "2.0.2",
1867
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
1868
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1869
+ "license": "MIT",
1870
+ "dependencies": {
1871
+ "function-bind": "^1.1.2"
1872
+ },
1873
+ "engines": {
1874
+ "node": ">= 0.4"
1875
+ }
1876
+ },
1877
+ "node_modules/hoist-non-react-statics": {
1878
+ "version": "3.3.2",
1879
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
1880
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
1881
+ "license": "BSD-3-Clause",
1882
+ "dependencies": {
1883
+ "react-is": "^16.7.0"
1884
+ }
1885
+ },
1886
+ "node_modules/hoist-non-react-statics/node_modules/react-is": {
1887
+ "version": "16.13.1",
1888
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
1889
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
1890
+ "license": "MIT"
1891
+ },
1892
+ "node_modules/import-fresh": {
1893
+ "version": "3.3.0",
1894
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
1895
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
1896
+ "license": "MIT",
1897
+ "dependencies": {
1898
+ "parent-module": "^1.0.0",
1899
+ "resolve-from": "^4.0.0"
1900
+ },
1901
+ "engines": {
1902
+ "node": ">=6"
1903
+ },
1904
+ "funding": {
1905
+ "url": "https://github.com/sponsors/sindresorhus"
1906
+ }
1907
+ },
1908
+ "node_modules/is-arrayish": {
1909
+ "version": "0.2.1",
1910
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1911
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
1912
+ "license": "MIT"
1913
+ },
1914
+ "node_modules/is-core-module": {
1915
+ "version": "2.16.1",
1916
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
1917
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
1918
+ "license": "MIT",
1919
+ "dependencies": {
1920
+ "hasown": "^2.0.2"
1921
+ },
1922
+ "engines": {
1923
+ "node": ">= 0.4"
1924
+ },
1925
+ "funding": {
1926
+ "url": "https://github.com/sponsors/ljharb"
1927
+ }
1928
+ },
1929
+ "node_modules/js-tokens": {
1930
+ "version": "4.0.0",
1931
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1932
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1933
+ "license": "MIT"
1934
+ },
1935
+ "node_modules/jsesc": {
1936
+ "version": "3.1.0",
1937
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1938
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1939
+ "license": "MIT",
1940
+ "bin": {
1941
+ "jsesc": "bin/jsesc"
1942
+ },
1943
+ "engines": {
1944
+ "node": ">=6"
1945
+ }
1946
+ },
1947
+ "node_modules/json-parse-even-better-errors": {
1948
+ "version": "2.3.1",
1949
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
1950
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
1951
+ "license": "MIT"
1952
+ },
1953
+ "node_modules/json5": {
1954
+ "version": "2.2.3",
1955
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1956
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1957
+ "dev": true,
1958
+ "license": "MIT",
1959
+ "bin": {
1960
+ "json5": "lib/cli.js"
1961
+ },
1962
+ "engines": {
1963
+ "node": ">=6"
1964
+ }
1965
+ },
1966
+ "node_modules/lines-and-columns": {
1967
+ "version": "1.2.4",
1968
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1969
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
1970
+ "license": "MIT"
1971
+ },
1972
+ "node_modules/loose-envify": {
1973
+ "version": "1.4.0",
1974
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1975
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1976
+ "license": "MIT",
1977
+ "dependencies": {
1978
+ "js-tokens": "^3.0.0 || ^4.0.0"
1979
+ },
1980
+ "bin": {
1981
+ "loose-envify": "cli.js"
1982
+ }
1983
+ },
1984
+ "node_modules/lru-cache": {
1985
+ "version": "5.1.1",
1986
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1987
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1988
+ "dev": true,
1989
+ "license": "ISC",
1990
+ "dependencies": {
1991
+ "yallist": "^3.0.2"
1992
+ }
1993
+ },
1994
+ "node_modules/mime-db": {
1995
+ "version": "1.52.0",
1996
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1997
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1998
+ "license": "MIT",
1999
+ "engines": {
2000
+ "node": ">= 0.6"
2001
+ }
2002
+ },
2003
+ "node_modules/mime-types": {
2004
+ "version": "2.1.35",
2005
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
2006
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
2007
+ "license": "MIT",
2008
+ "dependencies": {
2009
+ "mime-db": "1.52.0"
2010
+ },
2011
+ "engines": {
2012
+ "node": ">= 0.6"
2013
+ }
2014
+ },
2015
+ "node_modules/ms": {
2016
+ "version": "2.1.3",
2017
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2018
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
2019
+ "license": "MIT"
2020
+ },
2021
+ "node_modules/nanoid": {
2022
+ "version": "3.3.8",
2023
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
2024
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
2025
+ "dev": true,
2026
+ "funding": [
2027
+ {
2028
+ "type": "github",
2029
+ "url": "https://github.com/sponsors/ai"
2030
+ }
2031
+ ],
2032
+ "license": "MIT",
2033
+ "bin": {
2034
+ "nanoid": "bin/nanoid.cjs"
2035
+ },
2036
+ "engines": {
2037
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
2038
+ }
2039
+ },
2040
+ "node_modules/node-releases": {
2041
+ "version": "2.0.19",
2042
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
2043
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
2044
+ "dev": true,
2045
+ "license": "MIT"
2046
+ },
2047
+ "node_modules/object-assign": {
2048
+ "version": "4.1.1",
2049
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2050
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
2051
+ "license": "MIT",
2052
+ "engines": {
2053
+ "node": ">=0.10.0"
2054
+ }
2055
+ },
2056
+ "node_modules/parent-module": {
2057
+ "version": "1.0.1",
2058
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2059
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2060
+ "license": "MIT",
2061
+ "dependencies": {
2062
+ "callsites": "^3.0.0"
2063
+ },
2064
+ "engines": {
2065
+ "node": ">=6"
2066
+ }
2067
+ },
2068
+ "node_modules/parse-json": {
2069
+ "version": "5.2.0",
2070
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
2071
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
2072
+ "license": "MIT",
2073
+ "dependencies": {
2074
+ "@babel/code-frame": "^7.0.0",
2075
+ "error-ex": "^1.3.1",
2076
+ "json-parse-even-better-errors": "^2.3.0",
2077
+ "lines-and-columns": "^1.1.6"
2078
+ },
2079
+ "engines": {
2080
+ "node": ">=8"
2081
+ },
2082
+ "funding": {
2083
+ "url": "https://github.com/sponsors/sindresorhus"
2084
+ }
2085
+ },
2086
+ "node_modules/path-parse": {
2087
+ "version": "1.0.7",
2088
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
2089
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
2090
+ "license": "MIT"
2091
+ },
2092
+ "node_modules/path-type": {
2093
+ "version": "4.0.0",
2094
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
2095
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
2096
+ "license": "MIT",
2097
+ "engines": {
2098
+ "node": ">=8"
2099
+ }
2100
+ },
2101
+ "node_modules/picocolors": {
2102
+ "version": "1.1.1",
2103
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2104
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
2105
+ "license": "ISC"
2106
+ },
2107
+ "node_modules/postcss": {
2108
+ "version": "8.5.1",
2109
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
2110
+ "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
2111
+ "dev": true,
2112
+ "funding": [
2113
+ {
2114
+ "type": "opencollective",
2115
+ "url": "https://opencollective.com/postcss/"
2116
+ },
2117
+ {
2118
+ "type": "tidelift",
2119
+ "url": "https://tidelift.com/funding/github/npm/postcss"
2120
+ },
2121
+ {
2122
+ "type": "github",
2123
+ "url": "https://github.com/sponsors/ai"
2124
+ }
2125
+ ],
2126
+ "license": "MIT",
2127
+ "dependencies": {
2128
+ "nanoid": "^3.3.8",
2129
+ "picocolors": "^1.1.1",
2130
+ "source-map-js": "^1.2.1"
2131
+ },
2132
+ "engines": {
2133
+ "node": "^10 || ^12 || >=14"
2134
+ }
2135
+ },
2136
+ "node_modules/prop-types": {
2137
+ "version": "15.8.1",
2138
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
2139
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
2140
+ "license": "MIT",
2141
+ "dependencies": {
2142
+ "loose-envify": "^1.4.0",
2143
+ "object-assign": "^4.1.1",
2144
+ "react-is": "^16.13.1"
2145
+ }
2146
+ },
2147
+ "node_modules/prop-types/node_modules/react-is": {
2148
+ "version": "16.13.1",
2149
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
2150
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
2151
+ "license": "MIT"
2152
+ },
2153
+ "node_modules/proxy-from-env": {
2154
+ "version": "1.1.0",
2155
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
2156
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
2157
+ "license": "MIT"
2158
+ },
2159
+ "node_modules/react": {
2160
+ "version": "18.3.1",
2161
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
2162
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
2163
+ "license": "MIT",
2164
+ "dependencies": {
2165
+ "loose-envify": "^1.1.0"
2166
+ },
2167
+ "engines": {
2168
+ "node": ">=0.10.0"
2169
+ }
2170
+ },
2171
+ "node_modules/react-dom": {
2172
+ "version": "18.3.1",
2173
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
2174
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
2175
+ "license": "MIT",
2176
+ "dependencies": {
2177
+ "loose-envify": "^1.1.0",
2178
+ "scheduler": "^0.23.2"
2179
+ },
2180
+ "peerDependencies": {
2181
+ "react": "^18.3.1"
2182
+ }
2183
+ },
2184
+ "node_modules/react-is": {
2185
+ "version": "19.0.0",
2186
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz",
2187
+ "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==",
2188
+ "license": "MIT"
2189
+ },
2190
+ "node_modules/react-refresh": {
2191
+ "version": "0.14.2",
2192
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
2193
+ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
2194
+ "dev": true,
2195
+ "license": "MIT",
2196
+ "engines": {
2197
+ "node": ">=0.10.0"
2198
+ }
2199
+ },
2200
+ "node_modules/react-router": {
2201
+ "version": "6.28.2",
2202
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.2.tgz",
2203
+ "integrity": "sha512-BgFY7+wEGVjHCiqaj2XiUBQ1kkzfg6UoKYwEe0wv+FF+HNPCxtS/MVPvLAPH++EsuCMReZl9RYVGqcHLk5ms3A==",
2204
+ "license": "MIT",
2205
+ "dependencies": {
2206
+ "@remix-run/router": "1.21.1"
2207
+ },
2208
+ "engines": {
2209
+ "node": ">=14.0.0"
2210
+ },
2211
+ "peerDependencies": {
2212
+ "react": ">=16.8"
2213
+ }
2214
+ },
2215
+ "node_modules/react-router-dom": {
2216
+ "version": "6.28.2",
2217
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.2.tgz",
2218
+ "integrity": "sha512-O81EWqNJWqvlN/a7eTudAdQm0TbI7hw+WIi7OwwMcTn5JMyZ0ibTFNGz+t+Lju0df4LcqowCegcrK22lB1q9Kw==",
2219
+ "license": "MIT",
2220
+ "dependencies": {
2221
+ "@remix-run/router": "1.21.1",
2222
+ "react-router": "6.28.2"
2223
+ },
2224
+ "engines": {
2225
+ "node": ">=14.0.0"
2226
+ },
2227
+ "peerDependencies": {
2228
+ "react": ">=16.8",
2229
+ "react-dom": ">=16.8"
2230
+ }
2231
+ },
2232
+ "node_modules/react-transition-group": {
2233
+ "version": "4.4.5",
2234
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
2235
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
2236
+ "license": "BSD-3-Clause",
2237
+ "dependencies": {
2238
+ "@babel/runtime": "^7.5.5",
2239
+ "dom-helpers": "^5.0.1",
2240
+ "loose-envify": "^1.4.0",
2241
+ "prop-types": "^15.6.2"
2242
+ },
2243
+ "peerDependencies": {
2244
+ "react": ">=16.6.0",
2245
+ "react-dom": ">=16.6.0"
2246
+ }
2247
+ },
2248
+ "node_modules/regenerator-runtime": {
2249
+ "version": "0.14.1",
2250
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
2251
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
2252
+ "license": "MIT"
2253
+ },
2254
+ "node_modules/resolve": {
2255
+ "version": "1.22.10",
2256
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
2257
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
2258
+ "license": "MIT",
2259
+ "dependencies": {
2260
+ "is-core-module": "^2.16.0",
2261
+ "path-parse": "^1.0.7",
2262
+ "supports-preserve-symlinks-flag": "^1.0.0"
2263
+ },
2264
+ "bin": {
2265
+ "resolve": "bin/resolve"
2266
+ },
2267
+ "engines": {
2268
+ "node": ">= 0.4"
2269
+ },
2270
+ "funding": {
2271
+ "url": "https://github.com/sponsors/ljharb"
2272
+ }
2273
+ },
2274
+ "node_modules/resolve-from": {
2275
+ "version": "4.0.0",
2276
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2277
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2278
+ "license": "MIT",
2279
+ "engines": {
2280
+ "node": ">=4"
2281
+ }
2282
+ },
2283
+ "node_modules/rollup": {
2284
+ "version": "4.32.1",
2285
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz",
2286
+ "integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==",
2287
+ "dev": true,
2288
+ "license": "MIT",
2289
+ "dependencies": {
2290
+ "@types/estree": "1.0.6"
2291
+ },
2292
+ "bin": {
2293
+ "rollup": "dist/bin/rollup"
2294
+ },
2295
+ "engines": {
2296
+ "node": ">=18.0.0",
2297
+ "npm": ">=8.0.0"
2298
+ },
2299
+ "optionalDependencies": {
2300
+ "@rollup/rollup-android-arm-eabi": "4.32.1",
2301
+ "@rollup/rollup-android-arm64": "4.32.1",
2302
+ "@rollup/rollup-darwin-arm64": "4.32.1",
2303
+ "@rollup/rollup-darwin-x64": "4.32.1",
2304
+ "@rollup/rollup-freebsd-arm64": "4.32.1",
2305
+ "@rollup/rollup-freebsd-x64": "4.32.1",
2306
+ "@rollup/rollup-linux-arm-gnueabihf": "4.32.1",
2307
+ "@rollup/rollup-linux-arm-musleabihf": "4.32.1",
2308
+ "@rollup/rollup-linux-arm64-gnu": "4.32.1",
2309
+ "@rollup/rollup-linux-arm64-musl": "4.32.1",
2310
+ "@rollup/rollup-linux-loongarch64-gnu": "4.32.1",
2311
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1",
2312
+ "@rollup/rollup-linux-riscv64-gnu": "4.32.1",
2313
+ "@rollup/rollup-linux-s390x-gnu": "4.32.1",
2314
+ "@rollup/rollup-linux-x64-gnu": "4.32.1",
2315
+ "@rollup/rollup-linux-x64-musl": "4.32.1",
2316
+ "@rollup/rollup-win32-arm64-msvc": "4.32.1",
2317
+ "@rollup/rollup-win32-ia32-msvc": "4.32.1",
2318
+ "@rollup/rollup-win32-x64-msvc": "4.32.1",
2319
+ "fsevents": "~2.3.2"
2320
+ }
2321
+ },
2322
+ "node_modules/scheduler": {
2323
+ "version": "0.23.2",
2324
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
2325
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
2326
+ "license": "MIT",
2327
+ "dependencies": {
2328
+ "loose-envify": "^1.1.0"
2329
+ }
2330
+ },
2331
+ "node_modules/semver": {
2332
+ "version": "6.3.1",
2333
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
2334
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
2335
+ "dev": true,
2336
+ "license": "ISC",
2337
+ "bin": {
2338
+ "semver": "bin/semver.js"
2339
+ }
2340
+ },
2341
+ "node_modules/source-map": {
2342
+ "version": "0.5.7",
2343
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2344
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
2345
+ "license": "BSD-3-Clause",
2346
+ "engines": {
2347
+ "node": ">=0.10.0"
2348
+ }
2349
+ },
2350
+ "node_modules/source-map-js": {
2351
+ "version": "1.2.1",
2352
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2353
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
2354
+ "dev": true,
2355
+ "license": "BSD-3-Clause",
2356
+ "engines": {
2357
+ "node": ">=0.10.0"
2358
+ }
2359
+ },
2360
+ "node_modules/stylis": {
2361
+ "version": "4.2.0",
2362
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
2363
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
2364
+ "license": "MIT"
2365
+ },
2366
+ "node_modules/supports-preserve-symlinks-flag": {
2367
+ "version": "1.0.0",
2368
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2369
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2370
+ "license": "MIT",
2371
+ "engines": {
2372
+ "node": ">= 0.4"
2373
+ },
2374
+ "funding": {
2375
+ "url": "https://github.com/sponsors/ljharb"
2376
+ }
2377
+ },
2378
+ "node_modules/update-browserslist-db": {
2379
+ "version": "1.1.2",
2380
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
2381
+ "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
2382
+ "dev": true,
2383
+ "funding": [
2384
+ {
2385
+ "type": "opencollective",
2386
+ "url": "https://opencollective.com/browserslist"
2387
+ },
2388
+ {
2389
+ "type": "tidelift",
2390
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
2391
+ },
2392
+ {
2393
+ "type": "github",
2394
+ "url": "https://github.com/sponsors/ai"
2395
+ }
2396
+ ],
2397
+ "license": "MIT",
2398
+ "dependencies": {
2399
+ "escalade": "^3.2.0",
2400
+ "picocolors": "^1.1.1"
2401
+ },
2402
+ "bin": {
2403
+ "update-browserslist-db": "cli.js"
2404
+ },
2405
+ "peerDependencies": {
2406
+ "browserslist": ">= 4.21.0"
2407
+ }
2408
+ },
2409
+ "node_modules/vite": {
2410
+ "version": "5.4.14",
2411
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz",
2412
+ "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==",
2413
+ "dev": true,
2414
+ "license": "MIT",
2415
+ "dependencies": {
2416
+ "esbuild": "^0.21.3",
2417
+ "postcss": "^8.4.43",
2418
+ "rollup": "^4.20.0"
2419
+ },
2420
+ "bin": {
2421
+ "vite": "bin/vite.js"
2422
+ },
2423
+ "engines": {
2424
+ "node": "^18.0.0 || >=20.0.0"
2425
+ },
2426
+ "funding": {
2427
+ "url": "https://github.com/vitejs/vite?sponsor=1"
2428
+ },
2429
+ "optionalDependencies": {
2430
+ "fsevents": "~2.3.3"
2431
+ },
2432
+ "peerDependencies": {
2433
+ "@types/node": "^18.0.0 || >=20.0.0",
2434
+ "less": "*",
2435
+ "lightningcss": "^1.21.0",
2436
+ "sass": "*",
2437
+ "sass-embedded": "*",
2438
+ "stylus": "*",
2439
+ "sugarss": "*",
2440
+ "terser": "^5.4.0"
2441
+ },
2442
+ "peerDependenciesMeta": {
2443
+ "@types/node": {
2444
+ "optional": true
2445
+ },
2446
+ "less": {
2447
+ "optional": true
2448
+ },
2449
+ "lightningcss": {
2450
+ "optional": true
2451
+ },
2452
+ "sass": {
2453
+ "optional": true
2454
+ },
2455
+ "sass-embedded": {
2456
+ "optional": true
2457
+ },
2458
+ "stylus": {
2459
+ "optional": true
2460
+ },
2461
+ "sugarss": {
2462
+ "optional": true
2463
+ },
2464
+ "terser": {
2465
+ "optional": true
2466
+ }
2467
+ }
2468
+ },
2469
+ "node_modules/yallist": {
2470
+ "version": "3.1.1",
2471
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2472
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
2473
+ "dev": true,
2474
+ "license": "ISC"
2475
+ },
2476
+ "node_modules/yaml": {
2477
+ "version": "1.10.2",
2478
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
2479
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
2480
+ "license": "ISC",
2481
+ "engines": {
2482
+ "node": ">= 6"
2483
+ }
2484
+ }
2485
+ }
2486
+ }
frontend/package.json CHANGED
@@ -1,30 +1,25 @@
1
  {
2
- "name": "embedding-visualizer",
3
- "version": "0.1.0",
4
  "private": true,
 
 
 
 
 
 
 
5
  "dependencies": {
6
- "react": "^18.2.0",
7
- "react-dom": "^18.2.0",
8
- "react-scripts": "5.0.1",
9
- "axios": "^0.24.0"
 
 
 
 
10
  },
11
  "devDependencies": {
12
- "@babel/plugin-proposal-private-property-in-object": "^7.21.11"
13
- },
14
- "scripts": {
15
- "start": "react-scripts start",
16
- "build": "react-scripts build"
17
- },
18
- "browserslist": {
19
- "production": [
20
- ">0.2%",
21
- "not dead",
22
- "not op_mini all"
23
- ],
24
- "development": [
25
- "last 1 chrome version",
26
- "last 1 firefox version",
27
- "last 1 safari version"
28
- ]
29
  }
30
- }
 
1
  {
2
+ "name": "retrieval-demo",
 
3
  "private": true,
4
+ "version": "0.0.1",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview"
10
+ },
11
  "dependencies": {
12
+ "@emotion/react": "^11.x",
13
+ "@emotion/styled": "^11.x",
14
+ "@mui/icons-material": "^6.4.2",
15
+ "@mui/material": "^6.4.2",
16
+ "axios": "^1.6.0",
17
+ "react": "^18.x",
18
+ "react-dom": "^18.x",
19
+ "react-router-dom": "^6.22.0"
20
  },
21
  "devDependencies": {
22
+ "@vitejs/plugin-react": "^4.2.0",
23
+ "vite": "^5.0.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
+ }
frontend/public/sample_image/size_2048_E-096_N-12_x19968_y7680.png ADDED
frontend/public/sample_image/size_2048_E-108_N24_x15360_y27648.png ADDED
frontend/public/sample_image/size_2048_E-128_N12_x15360_y36864.png ADDED
frontend/public/sample_image/size_2048_E-152_N-32_x13824_y30720.png ADDED
frontend/public/sample_image/size_2048_E-164_N-04_x0_y18432.png ADDED
frontend/public/sample_image/size_2048_E-180_N08_x35328_y38400.png ADDED
frontend/public/sample_image/size_2048_E172_N-08_x38400_y39936.png ADDED
frontend/public/sample_image/size_256_E048_N-12_x19712_y22784.png ADDED
frontend/public/sample_image/size_4096_E-024_N04_x39936_y39936.png ADDED
frontend/public/sample_image/size_4096_E-024_N08_x3072_y0.png ADDED
frontend/public/sample_image/size_4096_E-036_N-04_x3072_y3072.png ADDED
frontend/public/sample_image/size_4096_E-040_N-28_x15360_y39936.png ADDED
frontend/public/sample_image/size_4096_E-044_N-16_x21504_y30720.png ADDED
frontend/public/sample_image/size_4096_E040_N28_x33792_y24576.png ADDED
frontend/src/App.jsx CHANGED
@@ -1,25 +1,105 @@
1
- import React, { useState } from 'react';
 
 
 
 
2
 
3
- function App() {
4
- const [selectedFile, setSelectedFile] = useState(null);
5
- const [similarImages, setSimilarImages] = useState([]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
- const handleFileUpload = async (event) => {
8
- // TODO: Implement file upload and embedding generation
9
- };
10
 
11
  return (
12
- <div className="App">
13
- <h1>Image Embedding Visualizer</h1>
14
- <input
15
- type="file"
16
- accept="image/*"
17
- onChange={handleFileUpload}
18
- />
19
- {/* TODO: Add embedding visualization component */}
20
- {/* TODO: Add similar images display */}
21
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  );
23
  }
24
 
25
- export default App;
 
1
+ import { BrowserRouter as Router, Routes, Route, Link, useLocation } from 'react-router-dom';
2
+ import { Box, AppBar, Toolbar, Button, Container, Typography, ThemeProvider, createTheme } from '@mui/material';
3
+ import { styled } from '@mui/material/styles';
4
+ import RetrievalDemo from './components/RetrievalDemo';
5
+ import EmbeddingViz from './components/EmbeddingViz';
6
 
7
+ const marsTheme = createTheme({
8
+ palette: {
9
+ primary: {
10
+ main: '#c62828', // deep red
11
+ },
12
+ secondary: {
13
+ main: '#ff6f00', // orange
14
+ },
15
+ background: {
16
+ default: '#fafafa',
17
+ paper: '#fff',
18
+ },
19
+ },
20
+ typography: {
21
+ fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',
22
+ h4: {
23
+ fontWeight: 700,
24
+ },
25
+ },
26
+ components: {
27
+ MuiAppBar: {
28
+ styleOverrides: {
29
+ root: {
30
+ backgroundImage: 'linear-gradient(to right, #c62828, #ff6f00)',
31
+ },
32
+ },
33
+ },
34
+ },
35
+ });
36
+
37
+ const StyledButton = styled(Button)(({ theme, active }) => ({
38
+ margin: theme.spacing(0, 1),
39
+ color: theme.palette.common.white,
40
+ '&:hover': {
41
+ backgroundColor: 'rgba(255, 255, 255, 0.1)',
42
+ },
43
+ '&::after': {
44
+ content: '""',
45
+ position: 'absolute',
46
+ width: '100%',
47
+ height: '3px',
48
+ bottom: 0,
49
+ left: 0,
50
+ backgroundColor: active ? theme.palette.common.white : 'transparent',
51
+ transition: 'all 0.3s ease-in-out',
52
+ },
53
+ }));
54
 
55
+ function NavButton({ to, children }) {
56
+ const location = useLocation();
57
+ const active = location.pathname === to;
58
 
59
  return (
60
+ <StyledButton component={Link} to={to} active={active ? 1 : 0}>
61
+ {children}
62
+ </StyledButton>
63
+ );
64
+ }
65
+
66
+ function App() {
67
+ return (
68
+ <ThemeProvider theme={marsTheme}>
69
+ <Router>
70
+ <Box sx={{ flexGrow: 1, minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
71
+ <AppBar position="static" elevation={0}>
72
+ <Container maxWidth="lg">
73
+ <Toolbar disableGutters sx={{ justifyContent: 'space-between' }}>
74
+ <Typography variant="h6" component="div" sx={{ flexGrow: 1, fontWeight: 700 }}>
75
+ Mars Image Explorer
76
+ </Typography>
77
+ <Box>
78
+ <NavButton to="/">Image Retrieval</NavButton>
79
+ <NavButton to="/viz">Embedding Visualization</NavButton>
80
+ </Box>
81
+ </Toolbar>
82
+ </Container>
83
+ </AppBar>
84
+
85
+ <Box component="main" sx={{ flexGrow: 1, bgcolor: 'background.default', py: 4 }}>
86
+ <Container maxWidth="lg">
87
+ <Routes>
88
+ <Route path="/" element={<RetrievalDemo />} />
89
+ <Route path="/viz" element={<EmbeddingViz />} />
90
+ </Routes>
91
+ </Container>
92
+ </Box>
93
+
94
+ <Box component="footer" sx={{ bgcolor: 'background.paper', py: 2, textAlign: 'center' }}>
95
+ <Typography variant="body2" color="text.secondary">
96
+ © {new Date().getFullYear()} Mars Image Explorer. All rights reserved.
97
+ </Typography>
98
+ </Box>
99
+ </Box>
100
+ </Router>
101
+ </ThemeProvider>
102
  );
103
  }
104
 
105
+ export default App;
frontend/src/components/EmbeddingViz.jsx ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Typography, Box, Paper } from "@mui/material"
2
+ import DataObjectIcon from "@mui/icons-material/DataObject"
3
+
4
+ function EmbeddingViz() {
5
+ return (
6
+ <Box>
7
+ <Typography variant="h4" gutterBottom sx={{ display: "flex", alignItems: "center" }}>
8
+ <DataObjectIcon sx={{ mr: 1, fontSize: 40 }} />
9
+ Embedding Visualization
10
+ </Typography>
11
+ <Paper elevation={3} sx={{ p: 3, mt: 3, bgcolor: "background.paper" }}>
12
+ <Typography variant="body1">
13
+ This is a placeholder for the embedding visualization component. Here, you can add interactive visualizations
14
+ of the Mars image embeddings, allowing scientists to explore relationships between different images and
15
+ features.
16
+ </Typography>
17
+ </Paper>
18
+ </Box>
19
+ )
20
+ }
21
+
22
+ export default EmbeddingViz
23
+
frontend/src/components/RetrievalDemo.jsx ADDED
@@ -0,0 +1,246 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useState } from "react"
2
+ import { Box, Button, CircularProgress, Grid, Paper, Typography, Chip, ImageList, ImageListItem } from "@mui/material"
3
+ import { styled } from "@mui/material/styles"
4
+ import CloudUploadIcon from "@mui/icons-material/CloudUpload"
5
+ import SearchIcon from "@mui/icons-material/Search"
6
+ import RocketLaunchIcon from "@mui/icons-material/RocketLaunch"
7
+
8
+ // Import the list of sample images
9
+ import { sampleImages } from "../sampleImages"
10
+
11
+ const Input = styled("input")({
12
+ display: "none",
13
+ })
14
+
15
+ const StyledPaper = styled(Paper)(({ theme }) => ({
16
+ padding: theme.spacing(2),
17
+ display: "flex",
18
+ flexDirection: "column",
19
+ alignItems: "center",
20
+ height: "100%",
21
+ transition: "box-shadow 0.3s ease-in-out",
22
+ "&:hover": {
23
+ boxShadow: theme.shadows[4],
24
+ },
25
+ }))
26
+
27
+ const RetrievalDemo = () => {
28
+ const [selectedFile, setSelectedFile] = useState(null)
29
+ const [results, setResults] = useState([])
30
+ const [loading, setLoading] = useState(false)
31
+ const [error, setError] = useState(null)
32
+ const [searchStats, setSearchStats] = useState(null)
33
+ const [k, setK] = useState(5)
34
+
35
+ const handleFileSelect = (event) => {
36
+ setSelectedFile(event.target.files[0])
37
+ }
38
+
39
+ const handleSampleImageSelect = (imageName) => {
40
+ setSelectedFile(`/sample_image/${imageName}`)
41
+ }
42
+
43
+ const handleUpload = async () => {
44
+ if (!selectedFile) return
45
+
46
+ setLoading(true)
47
+ setError(null)
48
+ setSearchStats(null)
49
+ const formData = new FormData()
50
+
51
+ const fileToUpload =
52
+ typeof selectedFile === "string" ? await fetch(selectedFile).then((r) => r.blob()) : selectedFile
53
+
54
+ formData.append("file", fileToUpload)
55
+ formData.append("k", k)
56
+
57
+ try {
58
+ const response = await fetch("http://localhost:8000/search", {
59
+ method: "POST",
60
+ body: formData,
61
+ })
62
+
63
+ const data = await response.json()
64
+ if (data.error) {
65
+ setError(data.error)
66
+ console.error("Error:", data.error)
67
+ return
68
+ }
69
+
70
+ setResults(data.results || [])
71
+ setSearchStats({
72
+ count: data.results?.length || 0,
73
+ time: data.search_time_ms
74
+ })
75
+ } catch (error) {
76
+ setError(error.message)
77
+ console.error("Error:", error)
78
+ } finally {
79
+ setLoading(false)
80
+ }
81
+ }
82
+
83
+ return (
84
+ <Box>
85
+ <Typography variant="h4" gutterBottom sx={{ display: "flex", alignItems: "center" }}>
86
+ <RocketLaunchIcon sx={{ mr: 1, fontSize: 40 }} />
87
+ Mars Image Retrieval
88
+ </Typography>
89
+ <Paper elevation={3} sx={{ p: 3, mb: 4, bgcolor: "background.paper" }}>
90
+ <Typography variant="h6" gutterBottom>
91
+ Choose a sample image or upload your own
92
+ </Typography>
93
+ <Box sx={{ mb: 3 }}>
94
+ <ImageList sx={{ width: "100%", height: 200 }} cols={6} rowHeight={100}>
95
+ {sampleImages.map((image) => (
96
+ <ImageListItem
97
+ key={image}
98
+ onClick={() => handleSampleImageSelect(image)}
99
+ sx={{ cursor: "pointer", "&:hover": { opacity: 0.8 } }}
100
+ >
101
+ <img
102
+ src={`/sample_image/${image}`}
103
+ alt={image}
104
+ loading="lazy"
105
+ style={{ objectFit: "cover", width: "100%", height: "100%" }}
106
+ />
107
+ </ImageListItem>
108
+ ))}
109
+ </ImageList>
110
+ </Box>
111
+ <Grid container spacing={3} alignItems="center">
112
+ <Grid item xs={12} md={6}>
113
+ <Typography variant="body1" paragraph>
114
+ Select a sample image above or upload your own Mars image to find similar images in our database. This
115
+ tool uses advanced AI to match visual features and help scientists explore Mars imagery more efficiently.
116
+ </Typography>
117
+ <Box sx={{ display: "flex", gap: 2, flexWrap: "wrap", alignItems: "center" }}>
118
+ <label htmlFor="contained-button-file">
119
+ <Input accept="image/*" id="contained-button-file" type="file" onChange={handleFileSelect} />
120
+ <Button variant="outlined" component="span" startIcon={<CloudUploadIcon />} size="large">
121
+ Upload Image
122
+ </Button>
123
+ </label>
124
+ <Button
125
+ variant="contained"
126
+ onClick={handleUpload}
127
+ disabled={!selectedFile || loading}
128
+ color="primary"
129
+ startIcon={<SearchIcon />}
130
+ size="large"
131
+ >
132
+ Find Similar
133
+ </Button>
134
+ <Box sx={{ display: 'flex', alignItems: 'center', ml: 2 }}>
135
+ <Typography variant="body2" sx={{ mr: 1 }}>
136
+ Show top
137
+ </Typography>
138
+ <select
139
+ value={k}
140
+ onChange={(e) => setK(Number(e.target.value))}
141
+ style={{
142
+ padding: '8px',
143
+ borderRadius: '4px',
144
+ border: '1px solid #ccc'
145
+ }}
146
+ >
147
+ {[5, 10, 15, 20].map((value) => (
148
+ <option key={value} value={value}>
149
+ {value}
150
+ </option>
151
+ ))}
152
+ </select>
153
+ <Typography variant="body2" sx={{ ml: 1 }}>
154
+ results
155
+ </Typography>
156
+ </Box>
157
+ </Box>
158
+ </Grid>
159
+ <Grid item xs={12} md={6}>
160
+ {selectedFile && (
161
+ <Box sx={{ display: "flex", justifyContent: "center", alignItems: "center", height: "100%" }}>
162
+ <img
163
+ src={typeof selectedFile === "string" ? selectedFile : URL.createObjectURL(selectedFile)}
164
+ alt="Selected"
165
+ style={{ maxWidth: "128px", maxHeight: "128px", objectFit: "contain" }}
166
+ />
167
+ </Box>
168
+ )}
169
+ </Grid>
170
+ </Grid>
171
+ </Paper>
172
+
173
+ {error && (
174
+ <Box sx={{ color: "error.main", mb: 2 }}>
175
+ <Typography variant="body1">Error: {error}</Typography>
176
+ </Box>
177
+ )}
178
+
179
+ {loading && (
180
+ <Box sx={{ display: "flex", justifyContent: "center", my: 4 }}>
181
+ <CircularProgress size={60} />
182
+ </Box>
183
+ )}
184
+
185
+ {results.length > 0 && (
186
+ <Box sx={{ mt: 4 }}>
187
+ <Typography variant="h5" gutterBottom>
188
+ Similar Mars Images:
189
+ {searchStats && (
190
+ <Typography
191
+ component="span"
192
+ variant="subtitle1"
193
+ color="text.secondary"
194
+ sx={{ ml: 2 }}
195
+ >
196
+ Found {searchStats.count} images in {searchStats.time.toFixed(2)}ms
197
+ </Typography>
198
+ )}
199
+ </Typography>
200
+ <Grid container spacing={3}>
201
+ {results.map((result, index) => (
202
+ <Grid item xs={12} sm={6} md={4} lg={3} key={index}>
203
+ <StyledPaper>
204
+ <img
205
+ src={`data:image/png;base64,${result.thumbnail}`}
206
+ alt={`Result ${index + 1}`}
207
+ style={{
208
+ width: "128px",
209
+ height: "128px",
210
+ objectFit: "contain",
211
+ marginBottom: "16px",
212
+ }}
213
+ />
214
+ <Box
215
+ sx={{
216
+ width: "100%",
217
+ typography: "body2",
218
+ "& > div": { mb: 1 },
219
+ }}
220
+ >
221
+ <Typography variant="subtitle2" noWrap title={result.filename}>
222
+ File: {result.filename}
223
+ </Typography>
224
+ <Chip label={result.label} size="small" color="secondary" />
225
+ <Typography variant="subtitle2">Similarity: {(1 - result.distance).toFixed(4)}</Typography>
226
+ </Box>
227
+ </StyledPaper>
228
+ </Grid>
229
+ ))}
230
+ </Grid>
231
+ </Box>
232
+ )}
233
+
234
+ {results.length === 0 && !loading && !error && (
235
+ <Box sx={{ textAlign: "center", my: 4 }}>
236
+ <Typography variant="h6" color="text.secondary">
237
+ No results found. Please select or upload a Mars image and search.
238
+ </Typography>
239
+ </Box>
240
+ )}
241
+ </Box>
242
+ )
243
+ }
244
+
245
+ export default RetrievalDemo
246
+
frontend/src/index.jsx CHANGED
@@ -1,10 +1,19 @@
1
  import React from 'react';
2
  import ReactDOM from 'react-dom/client';
 
3
  import App from './App';
4
 
5
- const root = ReactDOM.createRoot(document.getElementById('root'));
6
- root.render(
 
 
 
 
 
7
  <React.StrictMode>
8
- <App />
 
 
 
9
  </React.StrictMode>
10
  );
 
1
  import React from 'react';
2
  import ReactDOM from 'react-dom/client';
3
+ import { CssBaseline, ThemeProvider, createTheme } from '@mui/material';
4
  import App from './App';
5
 
6
+ const theme = createTheme({
7
+ palette: {
8
+ mode: 'light',
9
+ },
10
+ });
11
+
12
+ ReactDOM.createRoot(document.getElementById('root')).render(
13
  <React.StrictMode>
14
+ <ThemeProvider theme={theme}>
15
+ <CssBaseline />
16
+ <App />
17
+ </ThemeProvider>
18
  </React.StrictMode>
19
  );
frontend/src/sampleImages.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export const sampleImages = [
2
+ "size_256_E048_N-12_x19712_y22784.png",
3
+ "size_2048_E-096_N-12_x19968_y7680.png",
4
+ "size_2048_E-108_N24_x15360_y27648.png",
5
+ "size_2048_E-128_N12_x15360_y36864.png",
6
+ "size_2048_E-152_N-32_x13824_y30720.png",
7
+ "size_2048_E-164_N-04_x0_y18432.png",
8
+ "size_2048_E-180_N08_x35328_y38400.png",
9
+ "size_2048_E172_N-08_x38400_y39936.png",
10
+ "size_4096_E-024_N04_x39936_y39936.png",
11
+ "size_4096_E-024_N08_x3072_y0.png",
12
+ "size_4096_E-036_N-04_x3072_y3072.png",
13
+ "size_4096_E-040_N-28_x15360_y39936.png",
14
+ "size_4096_E-044_N-16_x21504_y30720.png",
15
+ "size_4096_E040_N28_x33792_y24576.png"
16
+ ]
frontend/vite.config.js ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+
4
+ export default defineConfig({
5
+ plugins: [react()],
6
+ server: {
7
+ host: '0.0.0.0',
8
+ port: 3000
9
+ }
10
+ })