├── .gitignore ├── backend ├── api │ ├── __init__.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── admin.py │ ├── apps.py │ ├── urls.py │ ├── serializer.py │ └── views.py ├── backend │ ├── __init__.py │ ├── urls.py │ ├── asgi.py │ ├── wsgi.py │ └── settings.py ├── requirements.txt ├── manage.py └── .gitignore ├── frontend ├── src │ ├── utils │ │ ├── constants.js │ │ ├── axios.js │ │ ├── useAxios.js │ │ └── auth.js │ ├── main.jsx │ ├── views │ │ ├── logout.jsx │ │ ├── home.jsx │ │ ├── private.jsx │ │ ├── login.jsx │ │ └── register.jsx │ ├── layouts │ │ ├── PrivateRoute.jsx │ │ └── MainWrapper.jsx │ ├── store │ │ └── auth.js │ ├── App.css │ ├── App.jsx │ ├── index.css │ └── assets │ │ └── react.svg ├── .prettierrc.json ├── vite.config.js ├── .gitignore ├── index.html ├── .editorconfig ├── package.json ├── public │ └── vite.svg ├── eslint.config.js └── pnpm-lock.yaml ├── README.md └── UPGRADE_PLAN.md /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode -------------------------------------------------------------------------------- /backend/api/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/backend/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/api/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/api/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /backend/api/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /frontend/src/utils/constants.js: -------------------------------------------------------------------------------- 1 | export const API_BASE_URL = 'http://localhost:8000/api/'; 2 | -------------------------------------------------------------------------------- /backend/api/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /frontend/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 4, 4 | "semi": true, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /backend/api/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ApiConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'api' 7 | -------------------------------------------------------------------------------- /frontend/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | -------------------------------------------------------------------------------- /backend/backend/urls.py: -------------------------------------------------------------------------------- 1 | # backend/urls.py 2 | 3 | from django.contrib import admin 4 | from django.urls import path 5 | from django.urls import path, include 6 | 7 | urlpatterns = [ 8 | path('admin/', admin.site.urls), 9 | path('api/', include("api.urls")) 10 | ] 11 | -------------------------------------------------------------------------------- /frontend/src/main.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import App from './App.jsx'; 4 | import './index.css'; 5 | 6 | ReactDOM.createRoot(document.getElementById('root')).render( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /backend/requirements.txt: -------------------------------------------------------------------------------- 1 | asgiref==3.8.1 2 | autopep8==2.3.1 3 | Django==5.1.4 4 | django-cors-headers==4.5.0 5 | djangorestframework==3.15.2 6 | djangorestframework-simplejwt==5.3.0 7 | setuptools>=75.0.0 8 | pycodestyle==2.12.1 9 | PyJWT==2.10.1 10 | pytz==2024.2 11 | sqlparse==0.5.2 12 | toml==0.10.2 13 | tomli==2.1.0 14 | tzdata==2024.2 15 | -------------------------------------------------------------------------------- /frontend/src/views/logout.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { LoggedOutView } from './home'; 3 | import { logout } from '../utils/auth'; 4 | 5 | const Logout = () => { 6 | useEffect(() => { 7 | logout(); 8 | }, []); 9 | return ; 10 | }; 11 | 12 | export default Logout; 13 | -------------------------------------------------------------------------------- /frontend/src/utils/axios.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | const apiInstance = axios.create({ 4 | baseURL: 'http://localhost:8000/api/', 5 | timeout: 5000, // timeout after 5 seconds 6 | headers: { 7 | 'Content-Type': 'application/json', 8 | Accept: 'application/json', 9 | }, 10 | }); 11 | 12 | export default apiInstance; 13 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /frontend/src/layouts/PrivateRoute.jsx: -------------------------------------------------------------------------------- 1 | import { Navigate } from 'react-router-dom'; 2 | import { useAuthStore } from '../store/auth'; 3 | 4 | const PrivateRoute = ({ children }) => { 5 | const allUserData = useAuthStore((state) => state.allUserData); 6 | const loggedIn = allUserData !== null; 7 | return loggedIn ? <>{children} : ; 8 | }; 9 | 10 | export default PrivateRoute; 11 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /backend/backend/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for backend project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /backend/backend/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for backend project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /frontend/src/store/auth.js: -------------------------------------------------------------------------------- 1 | import { create } from 'zustand'; 2 | import { mountStoreDevtool } from 'simple-zustand-devtools'; 3 | 4 | const useAuthStore = create((set) => ({ 5 | allUserData: null, // Use this to store all user data 6 | loading: false, 7 | setUser: (user) => set({ allUserData: user }), 8 | setLoading: (loading) => set({ loading }), 9 | })); 10 | 11 | if (import.meta.env.DEV) { 12 | mountStoreDevtool('Store', useAuthStore); 13 | } 14 | 15 | export { useAuthStore }; 16 | -------------------------------------------------------------------------------- /backend/api/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | from rest_framework_simplejwt.views import ( 5 | TokenRefreshView, 6 | ) 7 | 8 | urlpatterns = [ 9 | path('token/', views.MyTokenObtainPairView.as_view(), name='token_obtain_pair'), 10 | path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), 11 | path('register/', views.RegisterView.as_view(), name='auth_register'), 12 | path('test/', views.testEndPoint, name='test'), 13 | path('', views.getRoutes) 14 | ] 15 | -------------------------------------------------------------------------------- /frontend/src/layouts/MainWrapper.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import { setUser } from '../utils/auth'; 3 | 4 | const MainWrapper = ({ children }) => { 5 | const [loading, setLoading] = useState(true); 6 | useEffect(() => { 7 | const handler = async () => { 8 | setLoading(true); 9 | await setUser(); 10 | setLoading(false); 11 | }; 12 | handler(); 13 | }, []); 14 | 15 | return <>{loading ? null : children}; 16 | }; 17 | 18 | export default MainWrapper; 19 | -------------------------------------------------------------------------------- /backend/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /frontend/src/App.css: -------------------------------------------------------------------------------- 1 | #root { 2 | max-width: 1280px; 3 | margin: 0 auto; 4 | padding: 2rem; 5 | text-align: center; 6 | } 7 | 8 | .logo { 9 | height: 6em; 10 | padding: 1.5em; 11 | will-change: filter; 12 | transition: filter 300ms; 13 | } 14 | .logo:hover { 15 | filter: drop-shadow(0 0 2em #646cffaa); 16 | } 17 | .logo.react:hover { 18 | filter: drop-shadow(0 0 2em #61dafbaa); 19 | } 20 | 21 | @keyframes logo-spin { 22 | from { 23 | transform: rotate(0deg); 24 | } 25 | to { 26 | transform: rotate(360deg); 27 | } 28 | } 29 | 30 | @media (prefers-reduced-motion: no-preference) { 31 | a:nth-of-type(2) .logo { 32 | animation: logo-spin infinite 20s linear; 33 | } 34 | } 35 | 36 | .card { 37 | padding: 2em; 38 | } 39 | 40 | .read-the-docs { 41 | color: #888; 42 | } 43 | -------------------------------------------------------------------------------- /frontend/.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Unix-style newlines with a newline ending every file 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | 11 | # Matches multiple files with brace expansion notation 12 | # Set default charset 13 | [*.{js,py}] 14 | charset = utf-8 15 | indent_size = 4 16 | 17 | # 4 space indentation 18 | [*.py] 19 | indent_style = space 20 | indent_size = 4 21 | 22 | # Tab indentation (no size specified) 23 | [Makefile] 24 | indent_style = tab 25 | 26 | # Indentation override for all JS under lib directory 27 | [lib/**.js] 28 | indent_style = space 29 | indent_size = 2 30 | 31 | # Matches the exact files either package.json or .travis.yml 32 | [{package.json,.travis.yml}] 33 | indent_style = space 34 | indent_size = 2 -------------------------------------------------------------------------------- /frontend/src/utils/useAxios.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import { getRefreshToken, isAccessTokenExpired, setAuthUser } from './auth'; 3 | import { API_BASE_URL } from './constants'; 4 | import Cookies from 'js-cookie'; 5 | 6 | const useAxios = () => { 7 | const accessToken = Cookies.get('access_token'); 8 | const refreshToken = Cookies.get('refresh_token'); 9 | 10 | const axiosInstance = axios.create({ 11 | baseURL: API_BASE_URL, 12 | headers: { Authorization: `Bearer ${accessToken}` }, 13 | }); 14 | 15 | axiosInstance.interceptors.request.use(async (req) => { 16 | if (!isAccessTokenExpired(accessToken)) return req; 17 | 18 | const response = await getRefreshToken(refreshToken); 19 | 20 | setAuthUser(response.access, response.refresh); 21 | 22 | req.headers.Authorization = `Bearer ${response.data.access}`; 23 | return req; 24 | }); 25 | 26 | return axiosInstance; 27 | }; 28 | 29 | export default useAxios; 30 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fast-frontend", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint src --report-unused-disable-directives --max-warnings 0", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "axios": "^1.7.8", 14 | "dayjs": "^1.11.13", 15 | "js-cookie": "^3.0.5", 16 | "jwt-decode": "^4.0.0", 17 | "react": "^18.3.1", 18 | "react-dom": "^18.3.1", 19 | "react-router-dom": "^6.28.0", 20 | "zustand": "^5.0.1" 21 | }, 22 | "devDependencies": { 23 | "@babel/core": "^7.27.1", 24 | "@babel/eslint-parser": "^7.27.1", 25 | "@babel/preset-react": "^7.27.1", 26 | "@types/react": "^18.3.12", 27 | "@types/react-dom": "^18.3.1", 28 | "@vitejs/plugin-react": "^4.3.4", 29 | "eslint": "^9.15.0", 30 | "eslint-plugin-react": "^7.37.2", 31 | "eslint-plugin-react-hooks": "^5.0.0", 32 | "eslint-plugin-react-refresh": "^0.4.14", 33 | "globals": "^16.1.0", 34 | "prettier": "^3.3.3", 35 | "simple-zustand-devtools": "^1.1.0", 36 | "vite": "^6.0.1" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /frontend/src/views/home.jsx: -------------------------------------------------------------------------------- 1 | import { Link } from 'react-router-dom'; 2 | import { useAuthStore } from '../store/auth'; 3 | 4 | const Home = () => { 5 | const allUserData = useAuthStore((state) => state.allUserData); 6 | 7 | const isLoggedIn = allUserData !== null; 8 | const user = allUserData ? { 9 | user_id: allUserData.user_id, 10 | username: allUserData.username, 11 | } : null; 12 | 13 | return ( 14 |
15 | {isLoggedIn ? : } 16 |
17 | ); 18 | }; 19 | 20 | const LoggedInView = ({ user }) => { 21 | return ( 22 |
23 |

Welcome {user.username}

24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | ); 32 | }; 33 | 34 | export const LoggedOutView = ({ title = 'Home' }) => { 35 | return ( 36 |
37 |

{title}

38 | 39 | 40 | 41 | 42 | 43 | 44 |
45 | ); 46 | }; 47 | 48 | export default Home; 49 | -------------------------------------------------------------------------------- /frontend/src/App.jsx: -------------------------------------------------------------------------------- 1 | import './App.css'; 2 | import { Route, Routes, BrowserRouter } from 'react-router-dom'; 3 | import Home from './views/home'; 4 | import MainWrapper from './layouts/MainWrapper'; 5 | import Login from './views/login'; 6 | import PrivateRoute from './layouts/PrivateRoute'; 7 | import Logout from './views/logout'; 8 | import Private from './views/private'; 9 | import Register from './views/register'; 10 | 11 | function App() { 12 | return ( 13 | 19 | 20 | 21 | 25 | 26 | 27 | } 28 | /> 29 | } /> 30 | } /> 31 | } /> 32 | } /> 33 | 34 | 35 | 36 | ); 37 | } 38 | 39 | export default App; 40 | -------------------------------------------------------------------------------- /frontend/src/views/private.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import useAxios from '../utils/useAxios'; 3 | 4 | const Private = () => { 5 | const [res, setRes] = useState(''); 6 | const [posRes, setPostRes] = useState(''); 7 | const api = useAxios(); 8 | useEffect(() => { 9 | const fetchData = async () => { 10 | try { 11 | const response = await api.get('/test/'); 12 | setRes(response.data.response); 13 | } catch (error) { 14 | setPostRes(error.response.data); 15 | } 16 | }; 17 | fetchData(); 18 | }, [api]); 19 | const handleSubmit = async (e) => { 20 | e.preventDefault(); 21 | try { 22 | const response = await api.post('/test/', { 23 | text: e.target[0].value, 24 | }); 25 | setPostRes(response.data.response); 26 | } catch (error) { 27 | setPostRes(error.response.data); 28 | } 29 | }; 30 | return ( 31 |
32 |

Private

33 |

{res}

34 |
35 | 36 | 37 |
38 | {posRes &&

{posRes}

} 39 |
40 | ); 41 | }; 42 | 43 | export default Private; 44 | -------------------------------------------------------------------------------- /frontend/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/index.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 3 | line-height: 1.5; 4 | font-weight: 400; 5 | 6 | color-scheme: light dark; 7 | color: rgba(255, 255, 255, 0.87); 8 | background-color: #242424; 9 | 10 | font-synthesis: none; 11 | text-rendering: optimizeLegibility; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | -webkit-text-size-adjust: 100%; 15 | } 16 | 17 | a { 18 | font-weight: 500; 19 | color: #646cff; 20 | text-decoration: inherit; 21 | } 22 | a:hover { 23 | color: #535bf2; 24 | } 25 | 26 | body { 27 | margin: 0; 28 | display: flex; 29 | place-items: center; 30 | min-width: 320px; 31 | min-height: 100vh; 32 | } 33 | 34 | h1 { 35 | font-size: 3.2em; 36 | line-height: 1.1; 37 | } 38 | 39 | button { 40 | border-radius: 8px; 41 | border: 1px solid transparent; 42 | padding: 0.6em 1.2em; 43 | font-size: 1em; 44 | font-weight: 500; 45 | font-family: inherit; 46 | background-color: #1a1a1a; 47 | cursor: pointer; 48 | transition: border-color 0.25s; 49 | } 50 | button:hover { 51 | border-color: #646cff; 52 | } 53 | button:focus, 54 | button:focus-visible { 55 | outline: 4px auto -webkit-focus-ring-color; 56 | } 57 | 58 | @media (prefers-color-scheme: light) { 59 | :root { 60 | color: #213547; 61 | background-color: #ffffff; 62 | } 63 | a:hover { 64 | color: #747bff; 65 | } 66 | button { 67 | background-color: #f9f9f9; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /frontend/eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js'; 2 | import react from 'eslint-plugin-react'; 3 | import reactHooks from 'eslint-plugin-react-hooks'; 4 | import reactRefresh from 'eslint-plugin-react-refresh'; 5 | import globals from 'globals'; 6 | import babelParser from '@babel/eslint-parser'; 7 | 8 | export default [ 9 | js.configs.recommended, 10 | { 11 | files: ['**/*.{js,jsx}'], 12 | languageOptions: { 13 | parser: babelParser, 14 | ecmaVersion: 'latest', 15 | sourceType: 'module', 16 | globals: { 17 | ...globals.browser, 18 | }, 19 | parserOptions: { 20 | requireConfigFile: false, 21 | babelOptions: { 22 | presets: ['@babel/preset-react'], 23 | }, 24 | ecmaFeatures: { 25 | jsx: true, 26 | }, 27 | }, 28 | }, 29 | plugins: { 30 | react, 31 | 'react-hooks': reactHooks, 32 | 'react-refresh': reactRefresh, 33 | }, 34 | rules: { 35 | ...react.configs.recommended.rules, 36 | ...react.configs['jsx-runtime'].rules, 37 | ...reactHooks.configs.recommended.rules, 38 | 'react-refresh/only-export-components': 'warn', 39 | 'react/prop-types': 'off', 40 | }, 41 | settings: { 42 | react: { 43 | version: '18.3', 44 | }, 45 | }, 46 | }, 47 | ]; 48 | -------------------------------------------------------------------------------- /backend/api/serializer.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import User 2 | from django.contrib.auth.password_validation import validate_password 3 | from rest_framework_simplejwt.serializers import TokenObtainPairSerializer 4 | from rest_framework import serializers 5 | from rest_framework.validators import UniqueValidator 6 | from rest_framework_simplejwt.serializers import TokenObtainPairSerializer 7 | 8 | 9 | class MyTokenObtainPairSerializer(TokenObtainPairSerializer): 10 | @classmethod 11 | def get_token(cls, user): 12 | token = super().get_token(user) 13 | 14 | # Add custom claims 15 | token['username'] = user.username 16 | token['email'] = user.email 17 | # ... 18 | 19 | return token 20 | 21 | 22 | class RegisterSerializer(serializers.ModelSerializer): 23 | password = serializers.CharField( 24 | write_only=True, required=True, validators=[validate_password]) 25 | password2 = serializers.CharField(write_only=True, required=True) 26 | 27 | class Meta: 28 | model = User 29 | fields = ('username', 'password', 'password2') 30 | 31 | def validate(self, attrs): 32 | if attrs['password'] != attrs['password2']: 33 | raise serializers.ValidationError( 34 | {"password": "Password fields didn't match."}) 35 | 36 | return attrs 37 | 38 | def create(self, validated_data): 39 | user = User.objects.create( 40 | username=validated_data['username'] 41 | ) 42 | 43 | user.set_password(validated_data['password']) 44 | user.save() 45 | 46 | return user 47 | -------------------------------------------------------------------------------- /frontend/src/views/login.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import { login } from '../utils/auth'; 3 | import { useNavigate } from 'react-router-dom'; 4 | import { useAuthStore } from '../store/auth'; 5 | 6 | const Login = () => { 7 | const navigate = useNavigate(); 8 | const [username, setUsername] = useState(''); 9 | const [password, setPassword] = useState(''); 10 | const allUserData = useAuthStore((state) => state.allUserData); 11 | 12 | useEffect(() => { 13 | if (allUserData !== null) { 14 | navigate('/'); 15 | } 16 | }, [allUserData, navigate]); 17 | 18 | const resetForm = () => { 19 | setUsername(''); 20 | setPassword(''); 21 | }; 22 | 23 | const handleLogin = async (e) => { 24 | e.preventDefault(); 25 | const { error } = await login(username, password); 26 | if (error) { 27 | alert(error); 28 | } else { 29 | navigate('/'); 30 | resetForm(); 31 | } 32 | }; 33 | return ( 34 |
35 |

Login

36 |
37 |
38 | 39 | setUsername(e.target.value)} 45 | /> 46 |
47 |
48 | 49 | setPassword(e.target.value)} 55 | /> 56 |
57 | 58 |
59 |
60 | ); 61 | }; 62 | 63 | export default Login; 64 | -------------------------------------------------------------------------------- /backend/api/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from rest_framework import status 3 | from rest_framework.decorators import api_view 4 | from rest_framework.response import Response 5 | from django.http import JsonResponse 6 | from api.serializer import MyTokenObtainPairSerializer, RegisterSerializer 7 | from rest_framework_simplejwt.views import TokenObtainPairView 8 | from rest_framework import generics 9 | from django.contrib.auth.models import User 10 | from rest_framework.permissions import AllowAny, IsAuthenticated 11 | from rest_framework.decorators import api_view, permission_classes 12 | import json 13 | 14 | # Create your views here. 15 | 16 | 17 | class MyTokenObtainPairView(TokenObtainPairView): 18 | serializer_class = MyTokenObtainPairSerializer 19 | 20 | 21 | class RegisterView(generics.CreateAPIView): 22 | queryset = User.objects.all() 23 | permission_classes = (AllowAny,) 24 | serializer_class = RegisterSerializer 25 | 26 | 27 | @api_view(['GET']) 28 | def getRoutes(request): 29 | routes = [ 30 | '/api/token/', 31 | '/api/register/', 32 | '/api/token/refresh/', 33 | '/api/test/' 34 | ] 35 | return Response(routes) 36 | 37 | 38 | @api_view(['GET', 'POST']) 39 | @permission_classes([IsAuthenticated]) 40 | def testEndPoint(request): 41 | if request.method == 'GET': 42 | data = f"Congratulation {request.user}, your API just responded to GET request" 43 | return Response({'response': data}, status=status.HTTP_200_OK) 44 | elif request.method == 'POST': 45 | try: 46 | body = request.body.decode('utf-8') 47 | data = json.loads(body) 48 | if 'text' not in data: 49 | return Response("Invalid JSON data", status.HTTP_400_BAD_REQUEST) 50 | text = data.get('text') 51 | data = f'Congratulation your API just responded to POST request with text: {text}' 52 | return Response({'response': data}, status=status.HTTP_200_OK) 53 | except json.JSONDecodeError: 54 | return Response("Invalid JSON data", status.HTTP_400_BAD_REQUEST) 55 | return Response("Invalid JSON data", status.HTTP_400_BAD_REQUEST) 56 | -------------------------------------------------------------------------------- /frontend/src/views/register.jsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import { register } from '../utils/auth'; 3 | import { useNavigate } from 'react-router-dom'; 4 | import { useAuthStore } from '../store/auth'; 5 | 6 | function Register() { 7 | const [username, setUsername] = useState(''); 8 | const [password, setPassword] = useState(''); 9 | const [password2, setPassword2] = useState(''); 10 | const allUserData = useAuthStore((state) => state.allUserData); 11 | const navigate = useNavigate(); 12 | 13 | useEffect(() => { 14 | if (allUserData !== null) { 15 | navigate('/'); 16 | } 17 | }, [allUserData, navigate]); 18 | 19 | const resetForm = () => { 20 | setUsername(''); 21 | setPassword(''); 22 | setPassword2(''); 23 | }; 24 | 25 | const handleSubmit = async (e) => { 26 | e.preventDefault(); 27 | const { error } = await register(username, password, password2); 28 | if (error) { 29 | alert(JSON.stringify(error)); 30 | } else { 31 | navigate('/'); 32 | resetForm(); 33 | } 34 | }; 35 | 36 | return ( 37 |
38 |
39 |

Register

40 |
41 |
42 | 43 | setUsername(e.target.value)} 47 | placeholder="Username" 48 | required 49 | /> 50 |
51 |
52 | 53 | setPassword(e.target.value)} 57 | placeholder="Password" 58 | required 59 | /> 60 |
61 |
62 | 63 | setPassword2(e.target.value)} 67 | placeholder="Confirm Password" 68 | required 69 | /> 70 |

71 | {password2 !== password ? 'Passwords do not match' : ''} 72 |

73 |
74 | 75 |
76 |
77 | ); 78 | } 79 | 80 | export default Register; 81 | -------------------------------------------------------------------------------- /frontend/src/utils/auth.js: -------------------------------------------------------------------------------- 1 | import { useAuthStore } from '../store/auth'; 2 | import axios from './axios'; 3 | import { jwtDecode } from 'jwt-decode'; 4 | import Cookies from 'js-cookie'; 5 | 6 | export const login = async (username, password) => { 7 | try { 8 | const { data, status } = await axios.post('token/', { 9 | username, 10 | password, 11 | }); 12 | if (status === 200) { 13 | setAuthUser(data.access, data.refresh); 14 | } 15 | return { data, error: null }; 16 | } catch (error) { 17 | return { 18 | data: null, 19 | error: error.response.data?.detail || 'Something went wrong', 20 | }; 21 | } 22 | }; 23 | 24 | export const register = async (username, password, password2) => { 25 | try { 26 | const { data } = await axios.post('register/', { 27 | username, 28 | password, 29 | password2, 30 | }); 31 | await login(username, password); 32 | return { data, error: null }; 33 | } catch (error) { 34 | return { 35 | data: null, 36 | error: error.response.data || 'Something went wrong', 37 | }; 38 | } 39 | }; 40 | 41 | export const logout = () => { 42 | Cookies.remove('access_token'); 43 | Cookies.remove('refresh_token'); 44 | useAuthStore.getState().setUser(null); 45 | }; 46 | 47 | export const setUser = async () => { 48 | // ON PAGE LOAD 49 | const accessToken = Cookies.get('access_token'); 50 | const refreshToken = Cookies.get('refresh_token'); 51 | if (!accessToken || !refreshToken) { 52 | return; 53 | } 54 | if (isAccessTokenExpired(accessToken)) { 55 | const response = await getRefreshToken(refreshToken); 56 | setAuthUser(response.access, response.refresh); 57 | } else { 58 | setAuthUser(accessToken, refreshToken); 59 | } 60 | }; 61 | 62 | export const setAuthUser = (access_token, refresh_token) => { 63 | Cookies.set('access_token', access_token, { 64 | expires: 1, 65 | secure: true, 66 | }); 67 | 68 | Cookies.set('refresh_token', refresh_token, { 69 | expires: 7, 70 | secure: true, 71 | }); 72 | 73 | const user = jwtDecode(access_token) ?? null; 74 | 75 | if (user) { 76 | useAuthStore.getState().setUser(user); 77 | } 78 | useAuthStore.getState().setLoading(false); 79 | }; 80 | 81 | export const getRefreshToken = async () => { 82 | const refresh_token = Cookies.get('refresh_token'); 83 | const response = await axios.post('token/refresh/', { 84 | refresh: refresh_token, 85 | }); 86 | return response.data; 87 | }; 88 | 89 | export const isAccessTokenExpired = (accessToken) => { 90 | try { 91 | const decodedToken = jwtDecode(accessToken); 92 | return decodedToken.exp < Date.now() / 1000; 93 | } catch { 94 | return true; // Token is invalid or expired 95 | } 96 | }; 97 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Django Rest Auth with React Vite - 2025 2 | 3 | ## Steps for Running Project 4 | 5 | ### Requirements 6 | 7 | - **Python 3.9+** 8 | - **Node.js 18+** 9 | - **pnpm** (install with: `npm install -g pnpm`) 10 | - **git** 11 | 12 | ### Clone the repository: 13 | 14 | - Create a empty folder and `cd` into that folder. 15 | - Type the following command to clone project in same directory. 16 | 17 | ```bash 18 | git clone https://github.com/sushil-kamble/django-react-auth.git . 19 | ``` 20 | 21 | ## Backend 22 | 23 | ### 1. Go to the root folder and perform the following commands: 24 | 25 | `cd backend/` 26 | 27 | ### 2. Create and activate the virtual environment 28 | 29 | ```bash 30 | python -m venv venv 31 | venv\Scripts\activate 32 | ``` 33 | 34 | > If their is any error activating virtual env, please google search it for your system or try `venv\bin\activate` or `source venv/bin/activate` 35 | 36 | ### 3. Install required packages 37 | 38 | ```bash 39 | pip install -r requirements.txt 40 | ``` 41 | 42 | ### 4. Run the server 43 | 44 | ```bash 45 | python manage.py migrate 46 | python manage.py runserver 47 | ``` 48 | 49 | ## Frontend 50 | 51 | - Head back to the root folder 52 | - Enter in `cd frontend/` 53 | 54 | ### 1. Installing packages 55 | 56 | ```bash 57 | pnpm install 58 | ``` 59 | 60 | ### 2. Run the application 61 | 62 | ```bash 63 | pnpm run dev 64 | ``` 65 | 66 | > Make sure both frontend and backend are running. 67 | 68 | > Make sure both frontend and backend are running. 69 | 70 | ## Styling (Recommended) 71 | 72 | For enhanced styling with Tailwind CSS and shadcn/ui components, it is recommended to switch to the `feature/tailwind-shadcn-ui` branch: 73 | 74 | ```bash 75 | git checkout feature/tailwind-shadcn-ui 76 | ``` 77 | 78 | This branch includes modern UI components and better styling architecture for the frontend. 79 | 80 | ## Recent Major Upgrades (2025) 81 | 82 | This project has been upgraded to use the latest stable versions of all dependencies: 83 | 84 | ### Backend Updates 85 | - **Django**: 4.2 → 5.1.4 (latest stable) 86 | - **djangorestframework**: 3.14.0 → 3.15.2 87 | - **django-cors-headers**: 3.14.0 → 4.5.0 88 | - **PyJWT**: 2.6.0 → 2.10.1 89 | - All other Python packages updated to latest compatible versions 90 | 91 | ### Frontend Updates 92 | - **React**: 18.2.0 → 18.3.1 93 | - **Vite**: 4.3.2 → 6.3.5 (major upgrade) 94 | - **ESLint**: 8.x → 9.x (flat config migration) 95 | - **React Router**: 6.10.0 → 6.30.1 96 | - **Zustand**: 4.x → 5.x 97 | - **jwt-decode**: 3.x → 4.x (breaking change handled) 98 | - **Prettier**: 2.x → 3.x 99 | - Package manager standardized to **pnpm** 100 | 101 | ### Key Improvements 102 | - Enhanced build performance with Vite 6 103 | - Modern ESLint flat configuration 104 | - Updated security patches across all dependencies 105 | - Better development experience with latest tooling 106 | - Improved TypeScript support 107 | 108 | ## Reinitailize git repository 109 | 110 | - Delete `.git` folder in project root 111 | > Make sure you turn on the "Show hidden files, folders and disks" option. 112 | - `git init` 113 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 105 | __pypackages__/ 106 | 107 | # Celery stuff 108 | celerybeat-schedule 109 | celerybeat.pid 110 | 111 | # SageMath parsed files 112 | *.sage.py 113 | 114 | # Environments 115 | .env 116 | .venv 117 | env/ 118 | venv/ 119 | ENV/ 120 | env.bak/ 121 | venv.bak/ 122 | 123 | # Spyder project settings 124 | .spyderproject 125 | .spyproject 126 | 127 | # Rope project settings 128 | .ropeproject 129 | 130 | # mkdocs documentation 131 | /site 132 | 133 | # mypy 134 | .mypy_cache/ 135 | .dmypy.json 136 | dmypy.json 137 | 138 | # Pyre type checker 139 | .pyre/ 140 | 141 | # pytype static type analyzer 142 | .pytype/ 143 | 144 | # Cython debug symbols 145 | cython_debug/ 146 | 147 | # PyCharm 148 | # JetBrains specific template is maintainted in a separate JetBrains.gitignore that can 149 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 150 | # and can be added to the global gitignore or merged into this file. For a more nuclear 151 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 152 | .idea/ -------------------------------------------------------------------------------- /frontend/src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/backend/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for backend project. 3 | 4 | Generated by 'django-admin startproject' using Django 4.0.1. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.0/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/4.0/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | from datetime import timedelta 15 | 16 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 17 | BASE_DIR = Path(__file__).resolve().parent.parent 18 | 19 | 20 | # Quick-start development settings - unsuitable for production 21 | # See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ 22 | 23 | # SECURITY WARNING: keep the secret key used in production secret! 24 | SECRET_KEY = 'django-insecure-xmyy56c+#c$!7u^#8#&(egh&2_+or##y4+t)xps)i#zbhlw(5o' 25 | 26 | # SECURITY WARNING: don't run with debug turned on in production! 27 | DEBUG = True 28 | 29 | ALLOWED_HOSTS = [] 30 | 31 | 32 | # Application definition 33 | 34 | INSTALLED_APPS = [ 35 | 'django.contrib.admin', 36 | 'django.contrib.auth', 37 | 'django.contrib.contenttypes', 38 | 'django.contrib.sessions', 39 | 'django.contrib.messages', 40 | 'django.contrib.staticfiles', 41 | 'rest_framework', 42 | 'rest_framework_simplejwt.token_blacklist', 43 | 'corsheaders', 44 | 'api', 45 | ] 46 | 47 | MIDDLEWARE = [ 48 | 'django.middleware.security.SecurityMiddleware', 49 | 'corsheaders.middleware.CorsMiddleware', 50 | 'django.contrib.sessions.middleware.SessionMiddleware', 51 | 'django.middleware.common.CommonMiddleware', 52 | 'django.middleware.csrf.CsrfViewMiddleware', 53 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 54 | 'django.contrib.messages.middleware.MessageMiddleware', 55 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 56 | ] 57 | 58 | ROOT_URLCONF = 'backend.urls' 59 | 60 | TEMPLATES = [ 61 | { 62 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 63 | 'DIRS': [BASE_DIR / 'templates'], 64 | 'APP_DIRS': True, 65 | 'OPTIONS': { 66 | 'context_processors': [ 67 | 'django.template.context_processors.debug', 68 | 'django.template.context_processors.request', 69 | 'django.contrib.auth.context_processors.auth', 70 | 'django.contrib.messages.context_processors.messages', 71 | ], 72 | }, 73 | }, 74 | ] 75 | 76 | WSGI_APPLICATION = 'backend.wsgi.application' 77 | 78 | 79 | # Database 80 | # https://docs.djangoproject.com/en/4.0/ref/settings/#databases 81 | 82 | DATABASES = { 83 | 'default': { 84 | 'ENGINE': 'django.db.backends.sqlite3', 85 | 'NAME': BASE_DIR / 'db.sqlite3', 86 | } 87 | } 88 | 89 | 90 | # Password validation 91 | # https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators 92 | 93 | AUTH_PASSWORD_VALIDATORS = [ 94 | { 95 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 96 | }, 97 | { 98 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 99 | }, 100 | { 101 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 102 | }, 103 | { 104 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 105 | }, 106 | ] 107 | 108 | REST_FRAMEWORK = { 109 | 'DEFAULT_AUTHENTICATION_CLASSES': ( 110 | 'rest_framework_simplejwt.authentication.JWTAuthentication', 111 | ) 112 | } 113 | 114 | SIMPLE_JWT = { 115 | 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), 116 | 'REFRESH_TOKEN_LIFETIME': timedelta(days=50), 117 | 'ROTATE_REFRESH_TOKENS': True, 118 | 'BLACKLIST_AFTER_ROTATION': True, 119 | 'UPDATE_LAST_LOGIN': False, 120 | 121 | 'ALGORITHM': 'HS256', 122 | 123 | 'VERIFYING_KEY': None, 124 | 'AUDIENCE': None, 125 | 'ISSUER': None, 126 | 'JWK_URL': None, 127 | 'LEEWAY': 0, 128 | 129 | 'AUTH_HEADER_TYPES': ('Bearer',), 130 | 'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION', 131 | 'USER_ID_FIELD': 'id', 132 | 'USER_ID_CLAIM': 'user_id', 133 | 'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule', 134 | 135 | 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), 136 | 'TOKEN_TYPE_CLAIM': 'token_type', 137 | 'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser', 138 | 139 | 'JTI_CLAIM': 'jti', 140 | 141 | 'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp', 142 | 'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5), 143 | 'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1), 144 | } 145 | 146 | CORS_ALLOW_ALL_ORIGINS = True 147 | 148 | # Internationalization 149 | # https://docs.djangoproject.com/en/4.0/topics/i18n/ 150 | 151 | LANGUAGE_CODE = 'en-us' 152 | 153 | TIME_ZONE = 'UTC' 154 | 155 | USE_I18N = True 156 | 157 | USE_TZ = True 158 | 159 | 160 | # Static files (CSS, JavaScript, Images) 161 | # https://docs.djangoproject.com/en/4.0/howto/static-files/ 162 | 163 | STATIC_URL = 'static/' 164 | 165 | # Default primary key field type 166 | # https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field 167 | 168 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 169 | -------------------------------------------------------------------------------- /UPGRADE_PLAN.md: -------------------------------------------------------------------------------- 1 | # Django-React Authentication Project - Dependency Upgrade Plan 2 | 3 | ## Project Overview 4 | 5 | This document outlines a comprehensive strategy for upgrading all dependencies in the Django-React authentication project to their latest stable versions, including major version updates where appropriate. 6 | 7 | ## Current State Analysis 8 | 9 | ### Backend (Django) 10 | - **Django**: 4.2 (current LTS) 11 | - **djangorestframework**: 3.14.0 12 | - **django-cors-headers**: 3.14.0 13 | - **djangorestframework-simplejwt**: 5.3.0+ 14 | - **PyJWT**: 2.6.0 15 | - **Database**: SQLite (development) 16 | 17 | ### Frontend (React + Vite) 18 | - **React**: 18.2.0 19 | - **Vite**: 4.3.2 20 | - **React Router**: 6.10.0 21 | - **Axios**: 1.4.0 22 | - **Package Manager**: Mixed (yarn.lock + pnpm-lock.yaml) → **Target: pnpm only** 23 | 24 | ## Upgrade Strategy 25 | 26 | ### Phase 1: Backend Dependency Upgrades 27 | 28 | #### 1.1 Python Package Updates 29 | ```bash 30 | # Target versions for requirements.txt 31 | Django==5.1.* # 4.2 → 5.1 (major upgrade) 32 | djangorestframework==3.15.* # 3.14.0 → 3.15.x 33 | django-cors-headers==4.5.* # 3.14.0 → 4.5.x 34 | djangorestframework-simplejwt==5.3.* # Latest stable 35 | PyJWT==2.10.* # 2.6.0 → 2.10.x 36 | asgiref==3.8.* # 3.6.0 → 3.8.x 37 | pytz==2024.* # 2023.3 → 2024.x 38 | sqlparse==0.5.* # 0.4.3 → 0.5.x 39 | ``` 40 | 41 | #### 1.2 Django 5.1 Breaking Changes to Address 42 | 1. **URL patterns**: Update deprecated `url()` usage to `path()` 43 | 2. **Middleware**: Verify middleware order and compatibility 44 | 3. **Settings**: Review deprecated settings and update 45 | 4. **Database**: Check for migration compatibility 46 | 5. **Security**: Update CORS and security settings 47 | 48 | #### 1.3 Implementation Steps 49 | ```bash 50 | # 1. Create backup 51 | cp requirements.txt requirements.txt.backup 52 | 53 | # 2. Update requirements.txt with new versions 54 | # 3. Create new virtual environment 55 | python -m venv venv_new 56 | source venv_new/bin/activate # or venv_new\Scripts\activate on Windows 57 | 58 | # 4. Install updated dependencies 59 | pip install -r requirements.txt 60 | 61 | # 5. Run Django checks 62 | python manage.py check 63 | python manage.py makemigrations 64 | python manage.py migrate 65 | 66 | # 6. Test API endpoints 67 | python manage.py test 68 | python manage.py runserver 69 | ``` 70 | 71 | ### Phase 2: Frontend Dependency Upgrades 72 | 73 | #### 2.1 Package Manager Cleanup 74 | ```bash 75 | # Remove yarn.lock to standardize on pnpm 76 | rm frontend/yarn.lock 77 | 78 | # Update package.json scripts for pnpm 79 | # Update README.md installation instructions 80 | ``` 81 | 82 | #### 2.2 Major Framework Updates 83 | ```json 84 | { 85 | "dependencies": { 86 | "react": "^18.3.1", // 18.2.0 → 18.3.1 87 | "react-dom": "^18.3.1", // 18.2.0 → 18.3.1 88 | "react-router-dom": "^6.28.0", // 6.10.0 → 6.28.0 89 | "axios": "^1.7.8", // 1.4.0 → 1.7.8 90 | "zustand": "^5.0.1", // 4.3.8 → 5.0.1 91 | "jwt-decode": "^4.0.0", // 3.1.2 → 4.0.0 92 | "dayjs": "^1.11.13", // 1.11.7 → 1.11.13 93 | "js-cookie": "^3.0.5" // Already latest 94 | }, 95 | "devDependencies": { 96 | "vite": "^6.0.1", // 4.3.2 → 6.0.1 (major) 97 | "@vitejs/plugin-react": "^4.3.4", // 4.0.0 → 4.3.4 98 | "eslint": "^9.15.0", // 8.38.0 → 9.15.0 (major) 99 | "prettier": "^3.3.3", // 2.8.8 → 3.3.3 (major) 100 | "@types/react": "^18.3.12", // 18.0.28 → 18.3.12 101 | "@types/react-dom": "^18.3.1" // 18.0.11 → 18.3.1 102 | } 103 | } 104 | ``` 105 | 106 | #### 2.3 Breaking Changes to Handle 107 | 108 | **Vite 6 Changes:** 109 | - Update `vite.config.js` for new plugin format 110 | - Check for deprecated configuration options 111 | - Verify HMR functionality 112 | 113 | **ESLint 9 Changes:** 114 | - Migrate to flat config format (`eslint.config.js`) 115 | - Update plugin configurations 116 | - Remove deprecated rules 117 | 118 | **React 18.3 Changes:** 119 | - Verify concurrent features compatibility 120 | - Check for deprecated lifecycle methods 121 | - Update development tools 122 | 123 | #### 2.4 Implementation Steps 124 | ```bash 125 | # 1. Backup current state 126 | cp package.json package.json.backup 127 | cp pnpm-lock.yaml pnpm-lock.yaml.backup 128 | 129 | # 2. Remove yarn.lock 130 | rm yarn.lock 131 | 132 | # 3. Update package.json with new versions 133 | # 4. Clear node_modules and reinstall 134 | rm -rf node_modules 135 | pnpm install 136 | 137 | # 5. Update configuration files 138 | # - Migrate ESLint to flat config 139 | # - Update Vite config for v6 140 | # - Verify Prettier config 141 | 142 | # 6. Test build and development 143 | pnpm run dev 144 | pnpm run build 145 | pnpm run lint 146 | ``` 147 | 148 | ### Phase 3: Configuration File Updates 149 | 150 | #### 3.1 ESLint Migration (v8 → v9) 151 | Create new `eslint.config.js`: 152 | ```javascript 153 | import js from '@eslint/js' 154 | import react from 'eslint-plugin-react' 155 | import reactHooks from 'eslint-plugin-react-hooks' 156 | import reactRefresh from 'eslint-plugin-react-refresh' 157 | 158 | export default [ 159 | js.configs.recommended, 160 | { 161 | files: ['**/*.{js,jsx}'], 162 | plugins: { 163 | react, 164 | 'react-hooks': reactHooks, 165 | 'react-refresh': reactRefresh, 166 | }, 167 | rules: { 168 | // Migrate existing rules from .eslintrc.cjs 169 | 'react-refresh/only-export-components': 'warn', 170 | }, 171 | }, 172 | ] 173 | ``` 174 | 175 | #### 3.2 Vite Configuration Update 176 | Update `vite.config.js` for Vite 6: 177 | ```javascript 178 | import { defineConfig } from 'vite' 179 | import react from '@vitejs/plugin-react' 180 | 181 | export default defineConfig({ 182 | plugins: [react()], 183 | // Add any new Vite 6 specific configurations 184 | optimizeDeps: { 185 | // Update if needed for new dependencies 186 | }, 187 | }) 188 | ``` 189 | 190 | #### 3.3 Django Settings Updates 191 | Review `backend/settings.py` for Django 5.1: 192 | ```python 193 | # Update deprecated settings 194 | # Verify CORS configuration 195 | # Check middleware order 196 | # Update security settings if needed 197 | ``` 198 | 199 | ### Phase 4: Testing and Validation 200 | 201 | #### 4.1 Backend Testing 202 | ```bash 203 | # 1. Django system checks 204 | python manage.py check --deploy 205 | 206 | # 2. Database migrations 207 | python manage.py showmigrations 208 | python manage.py migrate 209 | 210 | # 3. Run tests 211 | python manage.py test 212 | 213 | # 4. Manual API testing 214 | # - User registration 215 | # - User login 216 | # - Protected routes 217 | # - Token refresh 218 | ``` 219 | 220 | #### 4.2 Frontend Testing 221 | ```bash 222 | # 1. Development server 223 | pnpm run dev 224 | 225 | # 2. Production build 226 | pnpm run build 227 | pnpm run preview 228 | 229 | # 3. Linting 230 | pnpm run lint 231 | 232 | # 4. Manual testing 233 | # - Login/logout flow 234 | # - Protected routes 235 | # - API integration 236 | # - Component rendering 237 | ``` 238 | 239 | #### 4.3 Integration Testing 240 | - Test full authentication flow 241 | - Verify CORS functionality 242 | - Check API endpoint responses 243 | - Validate JWT token handling 244 | 245 | ### Phase 5: Documentation Updates 246 | 247 | #### 5.1 README.md Updates 248 | ```markdown 249 | ## Frontend Installation (Updated) 250 | 251 | ### Prerequisites 252 | - Node.js 18+ 253 | - pnpm (install with: npm install -g pnpm) 254 | 255 | ### Installation 256 | ```bash 257 | cd frontend/ 258 | pnpm install 259 | pnpm run dev 260 | ``` 261 | 262 | #### 5.2 Version Documentation 263 | Create or update version compatibility notes: 264 | - Python 3.9+ required 265 | - Node.js 18+ required 266 | - Django 5.1 features and changes 267 | - React 18.3 concurrent features 268 | 269 | ## Risk Assessment and Mitigation 270 | 271 | ### High Risk Areas 272 | 1. **Vite 4 → 6**: Major version jump with potential breaking changes 273 | 2. **ESLint 8 → 9**: Complete configuration format change 274 | 3. **Django 4.2 → 5.1**: Multiple versions with accumulated changes 275 | 4. **jwt-decode 3 → 4**: API changes in JWT handling 276 | 277 | ### Mitigation Strategies 278 | 1. **Backup Strategy**: Keep backups of all configuration files 279 | 2. **Rollback Plan**: Document rollback steps for each phase 280 | 3. **Incremental Testing**: Test after each major upgrade 281 | 4. **Environment Isolation**: Use new virtual environments 282 | 283 | ### Rollback Procedures 284 | ```bash 285 | # Backend rollback 286 | cp requirements.txt.backup requirements.txt 287 | pip install -r requirements.txt 288 | 289 | # Frontend rollback 290 | cp package.json.backup package.json 291 | cp pnpm-lock.yaml.backup pnpm-lock.yaml 292 | pnpm install 293 | ``` 294 | 295 | ## Expected Benefits 296 | 297 | ### Performance Improvements 298 | - **Vite 6**: Enhanced build performance and HMR 299 | - **React 18.3**: Better concurrent rendering 300 | - **Django 5.1**: Improved ORM and async support 301 | 302 | ### Security Enhancements 303 | - Latest security patches across all dependencies 304 | - Updated authentication libraries 305 | - Modern security best practices 306 | 307 | ### Developer Experience 308 | - Better TypeScript support 309 | - Improved debugging tools 310 | - Enhanced development server features 311 | - Modern tooling configurations 312 | 313 | ## Implementation Timeline 314 | 315 | ### Phase 1-2: Core Upgrades (2-3 hours) 316 | - Backend dependency updates 317 | - Frontend framework upgrades 318 | 319 | ### Phase 3: Configuration (1-2 hours) 320 | - ESLint migration 321 | - Vite configuration 322 | - Django settings review 323 | 324 | ### Phase 4: Testing (2-3 hours) 325 | - Comprehensive testing 326 | - Integration verification 327 | - Performance validation 328 | 329 | ### Phase 5: Documentation (1 hour) 330 | - README updates 331 | - Migration notes 332 | - Version documentation 333 | 334 | **Total Estimated Time: 6-9 hours** 335 | 336 | ## Success Criteria 337 | 338 | ✅ All dependencies updated to latest stable versions 339 | ✅ No breaking functionality in authentication flow 340 | ✅ Build processes working correctly 341 | ✅ All tests passing 342 | ✅ Documentation updated 343 | ✅ Development and production environments functional 344 | 345 | ## Next Steps 346 | 347 | 1. Review and approve this upgrade plan 348 | 2. Switch to Code mode for implementation 349 | 3. Execute upgrades phase by phase 350 | 4. Validate each phase before proceeding 351 | 5. Update documentation and commit changes 352 | 353 | --- 354 | 355 | *This upgrade plan ensures a systematic approach to modernizing the Django-React authentication project while minimizing risks and maintaining functionality.* -------------------------------------------------------------------------------- /frontend/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | axios: 12 | specifier: ^1.7.8 13 | version: 1.9.0 14 | dayjs: 15 | specifier: ^1.11.13 16 | version: 1.11.13 17 | js-cookie: 18 | specifier: ^3.0.5 19 | version: 3.0.5 20 | jwt-decode: 21 | specifier: ^4.0.0 22 | version: 4.0.0 23 | react: 24 | specifier: ^18.3.1 25 | version: 18.3.1 26 | react-dom: 27 | specifier: ^18.3.1 28 | version: 18.3.1(react@18.3.1) 29 | react-router-dom: 30 | specifier: ^6.28.0 31 | version: 6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 32 | zustand: 33 | specifier: ^5.0.1 34 | version: 5.0.5(@types/react@18.3.22)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) 35 | devDependencies: 36 | '@babel/core': 37 | specifier: ^7.27.1 38 | version: 7.27.1 39 | '@babel/eslint-parser': 40 | specifier: ^7.27.1 41 | version: 7.27.1(@babel/core@7.27.1)(eslint@9.27.0) 42 | '@babel/preset-react': 43 | specifier: ^7.27.1 44 | version: 7.27.1(@babel/core@7.27.1) 45 | '@types/react': 46 | specifier: ^18.3.12 47 | version: 18.3.22 48 | '@types/react-dom': 49 | specifier: ^18.3.1 50 | version: 18.3.7(@types/react@18.3.22) 51 | '@vitejs/plugin-react': 52 | specifier: ^4.3.4 53 | version: 4.5.0(vite@6.3.5) 54 | eslint: 55 | specifier: ^9.15.0 56 | version: 9.27.0 57 | eslint-plugin-react: 58 | specifier: ^7.37.2 59 | version: 7.37.5(eslint@9.27.0) 60 | eslint-plugin-react-hooks: 61 | specifier: ^5.0.0 62 | version: 5.2.0(eslint@9.27.0) 63 | eslint-plugin-react-refresh: 64 | specifier: ^0.4.14 65 | version: 0.4.20(eslint@9.27.0) 66 | globals: 67 | specifier: ^16.1.0 68 | version: 16.1.0 69 | prettier: 70 | specifier: ^3.3.3 71 | version: 3.5.3 72 | simple-zustand-devtools: 73 | specifier: ^1.1.0 74 | version: 1.1.0(@types/react-dom@18.3.7(@types/react@18.3.22))(@types/react@18.3.22)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zustand@5.0.5(@types/react@18.3.22)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1))) 75 | vite: 76 | specifier: ^6.0.1 77 | version: 6.3.5 78 | 79 | packages: 80 | 81 | '@ampproject/remapping@2.3.0': 82 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 83 | engines: {node: '>=6.0.0'} 84 | 85 | '@babel/code-frame@7.27.1': 86 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 87 | engines: {node: '>=6.9.0'} 88 | 89 | '@babel/compat-data@7.27.2': 90 | resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} 91 | engines: {node: '>=6.9.0'} 92 | 93 | '@babel/core@7.27.1': 94 | resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} 95 | engines: {node: '>=6.9.0'} 96 | 97 | '@babel/eslint-parser@7.27.1': 98 | resolution: {integrity: sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q==} 99 | engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} 100 | peerDependencies: 101 | '@babel/core': ^7.11.0 102 | eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 103 | 104 | '@babel/generator@7.27.1': 105 | resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} 106 | engines: {node: '>=6.9.0'} 107 | 108 | '@babel/helper-annotate-as-pure@7.27.1': 109 | resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==} 110 | engines: {node: '>=6.9.0'} 111 | 112 | '@babel/helper-compilation-targets@7.27.2': 113 | resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 114 | engines: {node: '>=6.9.0'} 115 | 116 | '@babel/helper-module-imports@7.27.1': 117 | resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 118 | engines: {node: '>=6.9.0'} 119 | 120 | '@babel/helper-module-transforms@7.27.1': 121 | resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} 122 | engines: {node: '>=6.9.0'} 123 | peerDependencies: 124 | '@babel/core': ^7.0.0 125 | 126 | '@babel/helper-plugin-utils@7.27.1': 127 | resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} 128 | engines: {node: '>=6.9.0'} 129 | 130 | '@babel/helper-string-parser@7.27.1': 131 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 132 | engines: {node: '>=6.9.0'} 133 | 134 | '@babel/helper-validator-identifier@7.27.1': 135 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 136 | engines: {node: '>=6.9.0'} 137 | 138 | '@babel/helper-validator-option@7.27.1': 139 | resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 140 | engines: {node: '>=6.9.0'} 141 | 142 | '@babel/helpers@7.27.1': 143 | resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} 144 | engines: {node: '>=6.9.0'} 145 | 146 | '@babel/parser@7.27.2': 147 | resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} 148 | engines: {node: '>=6.0.0'} 149 | hasBin: true 150 | 151 | '@babel/plugin-syntax-jsx@7.27.1': 152 | resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} 153 | engines: {node: '>=6.9.0'} 154 | peerDependencies: 155 | '@babel/core': ^7.0.0-0 156 | 157 | '@babel/plugin-transform-react-display-name@7.27.1': 158 | resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} 159 | engines: {node: '>=6.9.0'} 160 | peerDependencies: 161 | '@babel/core': ^7.0.0-0 162 | 163 | '@babel/plugin-transform-react-jsx-development@7.27.1': 164 | resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} 165 | engines: {node: '>=6.9.0'} 166 | peerDependencies: 167 | '@babel/core': ^7.0.0-0 168 | 169 | '@babel/plugin-transform-react-jsx-self@7.27.1': 170 | resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} 171 | engines: {node: '>=6.9.0'} 172 | peerDependencies: 173 | '@babel/core': ^7.0.0-0 174 | 175 | '@babel/plugin-transform-react-jsx-source@7.27.1': 176 | resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} 177 | engines: {node: '>=6.9.0'} 178 | peerDependencies: 179 | '@babel/core': ^7.0.0-0 180 | 181 | '@babel/plugin-transform-react-jsx@7.27.1': 182 | resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} 183 | engines: {node: '>=6.9.0'} 184 | peerDependencies: 185 | '@babel/core': ^7.0.0-0 186 | 187 | '@babel/plugin-transform-react-pure-annotations@7.27.1': 188 | resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} 189 | engines: {node: '>=6.9.0'} 190 | peerDependencies: 191 | '@babel/core': ^7.0.0-0 192 | 193 | '@babel/preset-react@7.27.1': 194 | resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} 195 | engines: {node: '>=6.9.0'} 196 | peerDependencies: 197 | '@babel/core': ^7.0.0-0 198 | 199 | '@babel/template@7.27.2': 200 | resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 201 | engines: {node: '>=6.9.0'} 202 | 203 | '@babel/traverse@7.27.1': 204 | resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} 205 | engines: {node: '>=6.9.0'} 206 | 207 | '@babel/types@7.27.1': 208 | resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} 209 | engines: {node: '>=6.9.0'} 210 | 211 | '@esbuild/aix-ppc64@0.25.4': 212 | resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} 213 | engines: {node: '>=18'} 214 | cpu: [ppc64] 215 | os: [aix] 216 | 217 | '@esbuild/android-arm64@0.25.4': 218 | resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} 219 | engines: {node: '>=18'} 220 | cpu: [arm64] 221 | os: [android] 222 | 223 | '@esbuild/android-arm@0.25.4': 224 | resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} 225 | engines: {node: '>=18'} 226 | cpu: [arm] 227 | os: [android] 228 | 229 | '@esbuild/android-x64@0.25.4': 230 | resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} 231 | engines: {node: '>=18'} 232 | cpu: [x64] 233 | os: [android] 234 | 235 | '@esbuild/darwin-arm64@0.25.4': 236 | resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} 237 | engines: {node: '>=18'} 238 | cpu: [arm64] 239 | os: [darwin] 240 | 241 | '@esbuild/darwin-x64@0.25.4': 242 | resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} 243 | engines: {node: '>=18'} 244 | cpu: [x64] 245 | os: [darwin] 246 | 247 | '@esbuild/freebsd-arm64@0.25.4': 248 | resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} 249 | engines: {node: '>=18'} 250 | cpu: [arm64] 251 | os: [freebsd] 252 | 253 | '@esbuild/freebsd-x64@0.25.4': 254 | resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} 255 | engines: {node: '>=18'} 256 | cpu: [x64] 257 | os: [freebsd] 258 | 259 | '@esbuild/linux-arm64@0.25.4': 260 | resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} 261 | engines: {node: '>=18'} 262 | cpu: [arm64] 263 | os: [linux] 264 | 265 | '@esbuild/linux-arm@0.25.4': 266 | resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} 267 | engines: {node: '>=18'} 268 | cpu: [arm] 269 | os: [linux] 270 | 271 | '@esbuild/linux-ia32@0.25.4': 272 | resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} 273 | engines: {node: '>=18'} 274 | cpu: [ia32] 275 | os: [linux] 276 | 277 | '@esbuild/linux-loong64@0.25.4': 278 | resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} 279 | engines: {node: '>=18'} 280 | cpu: [loong64] 281 | os: [linux] 282 | 283 | '@esbuild/linux-mips64el@0.25.4': 284 | resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} 285 | engines: {node: '>=18'} 286 | cpu: [mips64el] 287 | os: [linux] 288 | 289 | '@esbuild/linux-ppc64@0.25.4': 290 | resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} 291 | engines: {node: '>=18'} 292 | cpu: [ppc64] 293 | os: [linux] 294 | 295 | '@esbuild/linux-riscv64@0.25.4': 296 | resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} 297 | engines: {node: '>=18'} 298 | cpu: [riscv64] 299 | os: [linux] 300 | 301 | '@esbuild/linux-s390x@0.25.4': 302 | resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} 303 | engines: {node: '>=18'} 304 | cpu: [s390x] 305 | os: [linux] 306 | 307 | '@esbuild/linux-x64@0.25.4': 308 | resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} 309 | engines: {node: '>=18'} 310 | cpu: [x64] 311 | os: [linux] 312 | 313 | '@esbuild/netbsd-arm64@0.25.4': 314 | resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} 315 | engines: {node: '>=18'} 316 | cpu: [arm64] 317 | os: [netbsd] 318 | 319 | '@esbuild/netbsd-x64@0.25.4': 320 | resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} 321 | engines: {node: '>=18'} 322 | cpu: [x64] 323 | os: [netbsd] 324 | 325 | '@esbuild/openbsd-arm64@0.25.4': 326 | resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} 327 | engines: {node: '>=18'} 328 | cpu: [arm64] 329 | os: [openbsd] 330 | 331 | '@esbuild/openbsd-x64@0.25.4': 332 | resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} 333 | engines: {node: '>=18'} 334 | cpu: [x64] 335 | os: [openbsd] 336 | 337 | '@esbuild/sunos-x64@0.25.4': 338 | resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} 339 | engines: {node: '>=18'} 340 | cpu: [x64] 341 | os: [sunos] 342 | 343 | '@esbuild/win32-arm64@0.25.4': 344 | resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} 345 | engines: {node: '>=18'} 346 | cpu: [arm64] 347 | os: [win32] 348 | 349 | '@esbuild/win32-ia32@0.25.4': 350 | resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} 351 | engines: {node: '>=18'} 352 | cpu: [ia32] 353 | os: [win32] 354 | 355 | '@esbuild/win32-x64@0.25.4': 356 | resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} 357 | engines: {node: '>=18'} 358 | cpu: [x64] 359 | os: [win32] 360 | 361 | '@eslint-community/eslint-utils@4.7.0': 362 | resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 363 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 364 | peerDependencies: 365 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 366 | 367 | '@eslint-community/regexpp@4.12.1': 368 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 369 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 370 | 371 | '@eslint/config-array@0.20.0': 372 | resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} 373 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 374 | 375 | '@eslint/config-helpers@0.2.2': 376 | resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} 377 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 378 | 379 | '@eslint/core@0.14.0': 380 | resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 381 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 382 | 383 | '@eslint/eslintrc@3.3.1': 384 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 385 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 386 | 387 | '@eslint/js@9.27.0': 388 | resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} 389 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 390 | 391 | '@eslint/object-schema@2.1.6': 392 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 393 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 394 | 395 | '@eslint/plugin-kit@0.3.1': 396 | resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} 397 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 398 | 399 | '@humanfs/core@0.19.1': 400 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 401 | engines: {node: '>=18.18.0'} 402 | 403 | '@humanfs/node@0.16.6': 404 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 405 | engines: {node: '>=18.18.0'} 406 | 407 | '@humanwhocodes/module-importer@1.0.1': 408 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 409 | engines: {node: '>=12.22'} 410 | 411 | '@humanwhocodes/retry@0.3.1': 412 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 413 | engines: {node: '>=18.18'} 414 | 415 | '@humanwhocodes/retry@0.4.3': 416 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 417 | engines: {node: '>=18.18'} 418 | 419 | '@jridgewell/gen-mapping@0.3.8': 420 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 421 | engines: {node: '>=6.0.0'} 422 | 423 | '@jridgewell/resolve-uri@3.1.2': 424 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 425 | engines: {node: '>=6.0.0'} 426 | 427 | '@jridgewell/set-array@1.2.1': 428 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 429 | engines: {node: '>=6.0.0'} 430 | 431 | '@jridgewell/sourcemap-codec@1.5.0': 432 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 433 | 434 | '@jridgewell/trace-mapping@0.3.25': 435 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 436 | 437 | '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': 438 | resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} 439 | 440 | '@remix-run/router@1.23.0': 441 | resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} 442 | engines: {node: '>=14.0.0'} 443 | 444 | '@rolldown/pluginutils@1.0.0-beta.9': 445 | resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==} 446 | 447 | '@rollup/rollup-android-arm-eabi@4.41.1': 448 | resolution: {integrity: sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==} 449 | cpu: [arm] 450 | os: [android] 451 | 452 | '@rollup/rollup-android-arm64@4.41.1': 453 | resolution: {integrity: sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==} 454 | cpu: [arm64] 455 | os: [android] 456 | 457 | '@rollup/rollup-darwin-arm64@4.41.1': 458 | resolution: {integrity: sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==} 459 | cpu: [arm64] 460 | os: [darwin] 461 | 462 | '@rollup/rollup-darwin-x64@4.41.1': 463 | resolution: {integrity: sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==} 464 | cpu: [x64] 465 | os: [darwin] 466 | 467 | '@rollup/rollup-freebsd-arm64@4.41.1': 468 | resolution: {integrity: sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==} 469 | cpu: [arm64] 470 | os: [freebsd] 471 | 472 | '@rollup/rollup-freebsd-x64@4.41.1': 473 | resolution: {integrity: sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==} 474 | cpu: [x64] 475 | os: [freebsd] 476 | 477 | '@rollup/rollup-linux-arm-gnueabihf@4.41.1': 478 | resolution: {integrity: sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==} 479 | cpu: [arm] 480 | os: [linux] 481 | 482 | '@rollup/rollup-linux-arm-musleabihf@4.41.1': 483 | resolution: {integrity: sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==} 484 | cpu: [arm] 485 | os: [linux] 486 | 487 | '@rollup/rollup-linux-arm64-gnu@4.41.1': 488 | resolution: {integrity: sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==} 489 | cpu: [arm64] 490 | os: [linux] 491 | 492 | '@rollup/rollup-linux-arm64-musl@4.41.1': 493 | resolution: {integrity: sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==} 494 | cpu: [arm64] 495 | os: [linux] 496 | 497 | '@rollup/rollup-linux-loongarch64-gnu@4.41.1': 498 | resolution: {integrity: sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==} 499 | cpu: [loong64] 500 | os: [linux] 501 | 502 | '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': 503 | resolution: {integrity: sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==} 504 | cpu: [ppc64] 505 | os: [linux] 506 | 507 | '@rollup/rollup-linux-riscv64-gnu@4.41.1': 508 | resolution: {integrity: sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==} 509 | cpu: [riscv64] 510 | os: [linux] 511 | 512 | '@rollup/rollup-linux-riscv64-musl@4.41.1': 513 | resolution: {integrity: sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==} 514 | cpu: [riscv64] 515 | os: [linux] 516 | 517 | '@rollup/rollup-linux-s390x-gnu@4.41.1': 518 | resolution: {integrity: sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==} 519 | cpu: [s390x] 520 | os: [linux] 521 | 522 | '@rollup/rollup-linux-x64-gnu@4.41.1': 523 | resolution: {integrity: sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==} 524 | cpu: [x64] 525 | os: [linux] 526 | 527 | '@rollup/rollup-linux-x64-musl@4.41.1': 528 | resolution: {integrity: sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==} 529 | cpu: [x64] 530 | os: [linux] 531 | 532 | '@rollup/rollup-win32-arm64-msvc@4.41.1': 533 | resolution: {integrity: sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==} 534 | cpu: [arm64] 535 | os: [win32] 536 | 537 | '@rollup/rollup-win32-ia32-msvc@4.41.1': 538 | resolution: {integrity: sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==} 539 | cpu: [ia32] 540 | os: [win32] 541 | 542 | '@rollup/rollup-win32-x64-msvc@4.41.1': 543 | resolution: {integrity: sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==} 544 | cpu: [x64] 545 | os: [win32] 546 | 547 | '@types/babel__core@7.20.5': 548 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 549 | 550 | '@types/babel__generator@7.27.0': 551 | resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} 552 | 553 | '@types/babel__template@7.4.4': 554 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 555 | 556 | '@types/babel__traverse@7.20.7': 557 | resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} 558 | 559 | '@types/estree@1.0.7': 560 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 561 | 562 | '@types/json-schema@7.0.15': 563 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 564 | 565 | '@types/prop-types@15.7.14': 566 | resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} 567 | 568 | '@types/react-dom@18.3.7': 569 | resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} 570 | peerDependencies: 571 | '@types/react': ^18.0.0 572 | 573 | '@types/react@18.3.22': 574 | resolution: {integrity: sha512-vUhG0YmQZ7kL/tmKLrD3g5zXbXXreZXB3pmROW8bg3CnLnpjkRVwUlLne7Ufa2r9yJ8+/6B73RzhAek5TBKh2Q==} 575 | 576 | '@vitejs/plugin-react@4.5.0': 577 | resolution: {integrity: sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==} 578 | engines: {node: ^14.18.0 || >=16.0.0} 579 | peerDependencies: 580 | vite: ^4.2.0 || ^5.0.0 || ^6.0.0 581 | 582 | acorn-jsx@5.3.2: 583 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 584 | peerDependencies: 585 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 586 | 587 | acorn@8.14.1: 588 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 589 | engines: {node: '>=0.4.0'} 590 | hasBin: true 591 | 592 | ajv@6.12.6: 593 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 594 | 595 | ansi-styles@4.3.0: 596 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 597 | engines: {node: '>=8'} 598 | 599 | argparse@2.0.1: 600 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 601 | 602 | array-buffer-byte-length@1.0.2: 603 | resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} 604 | engines: {node: '>= 0.4'} 605 | 606 | array-includes@3.1.8: 607 | resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} 608 | engines: {node: '>= 0.4'} 609 | 610 | array.prototype.findlast@1.2.5: 611 | resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} 612 | engines: {node: '>= 0.4'} 613 | 614 | array.prototype.flat@1.3.3: 615 | resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} 616 | engines: {node: '>= 0.4'} 617 | 618 | array.prototype.flatmap@1.3.3: 619 | resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} 620 | engines: {node: '>= 0.4'} 621 | 622 | array.prototype.tosorted@1.1.4: 623 | resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} 624 | engines: {node: '>= 0.4'} 625 | 626 | arraybuffer.prototype.slice@1.0.4: 627 | resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 628 | engines: {node: '>= 0.4'} 629 | 630 | async-function@1.0.0: 631 | resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 632 | engines: {node: '>= 0.4'} 633 | 634 | asynckit@0.4.0: 635 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 636 | 637 | available-typed-arrays@1.0.7: 638 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 639 | engines: {node: '>= 0.4'} 640 | 641 | axios@1.9.0: 642 | resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} 643 | 644 | balanced-match@1.0.2: 645 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 646 | 647 | brace-expansion@1.1.11: 648 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 649 | 650 | browserslist@4.24.5: 651 | resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} 652 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 653 | hasBin: true 654 | 655 | call-bind-apply-helpers@1.0.2: 656 | resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 657 | engines: {node: '>= 0.4'} 658 | 659 | call-bind@1.0.8: 660 | resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} 661 | engines: {node: '>= 0.4'} 662 | 663 | call-bound@1.0.4: 664 | resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 665 | engines: {node: '>= 0.4'} 666 | 667 | callsites@3.1.0: 668 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 669 | engines: {node: '>=6'} 670 | 671 | caniuse-lite@1.0.30001718: 672 | resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} 673 | 674 | chalk@4.1.2: 675 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 676 | engines: {node: '>=10'} 677 | 678 | color-convert@2.0.1: 679 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 680 | engines: {node: '>=7.0.0'} 681 | 682 | color-name@1.1.4: 683 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 684 | 685 | combined-stream@1.0.8: 686 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 687 | engines: {node: '>= 0.8'} 688 | 689 | concat-map@0.0.1: 690 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 691 | 692 | convert-source-map@2.0.0: 693 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 694 | 695 | cross-spawn@7.0.6: 696 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 697 | engines: {node: '>= 8'} 698 | 699 | csstype@3.1.3: 700 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 701 | 702 | data-view-buffer@1.0.2: 703 | resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} 704 | engines: {node: '>= 0.4'} 705 | 706 | data-view-byte-length@1.0.2: 707 | resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} 708 | engines: {node: '>= 0.4'} 709 | 710 | data-view-byte-offset@1.0.1: 711 | resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} 712 | engines: {node: '>= 0.4'} 713 | 714 | dayjs@1.11.13: 715 | resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} 716 | 717 | debug@4.4.1: 718 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 719 | engines: {node: '>=6.0'} 720 | peerDependencies: 721 | supports-color: '*' 722 | peerDependenciesMeta: 723 | supports-color: 724 | optional: true 725 | 726 | deep-is@0.1.4: 727 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 728 | 729 | define-data-property@1.1.4: 730 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 731 | engines: {node: '>= 0.4'} 732 | 733 | define-properties@1.2.1: 734 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 735 | engines: {node: '>= 0.4'} 736 | 737 | delayed-stream@1.0.0: 738 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 739 | engines: {node: '>=0.4.0'} 740 | 741 | doctrine@2.1.0: 742 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 743 | engines: {node: '>=0.10.0'} 744 | 745 | dunder-proto@1.0.1: 746 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 747 | engines: {node: '>= 0.4'} 748 | 749 | electron-to-chromium@1.5.157: 750 | resolution: {integrity: sha512-/0ybgsQd1muo8QlnuTpKwtl0oX5YMlUGbm8xyqgDU00motRkKFFbUJySAQBWcY79rVqNLWIWa87BGVGClwAB2w==} 751 | 752 | es-abstract@1.23.10: 753 | resolution: {integrity: sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==} 754 | engines: {node: '>= 0.4'} 755 | 756 | es-define-property@1.0.1: 757 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 758 | engines: {node: '>= 0.4'} 759 | 760 | es-errors@1.3.0: 761 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 762 | engines: {node: '>= 0.4'} 763 | 764 | es-iterator-helpers@1.2.1: 765 | resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} 766 | engines: {node: '>= 0.4'} 767 | 768 | es-object-atoms@1.1.1: 769 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 770 | engines: {node: '>= 0.4'} 771 | 772 | es-set-tostringtag@2.1.0: 773 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 774 | engines: {node: '>= 0.4'} 775 | 776 | es-shim-unscopables@1.1.0: 777 | resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} 778 | engines: {node: '>= 0.4'} 779 | 780 | es-to-primitive@1.3.0: 781 | resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 782 | engines: {node: '>= 0.4'} 783 | 784 | esbuild@0.25.4: 785 | resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} 786 | engines: {node: '>=18'} 787 | hasBin: true 788 | 789 | escalade@3.2.0: 790 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 791 | engines: {node: '>=6'} 792 | 793 | escape-string-regexp@4.0.0: 794 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 795 | engines: {node: '>=10'} 796 | 797 | eslint-plugin-react-hooks@5.2.0: 798 | resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} 799 | engines: {node: '>=10'} 800 | peerDependencies: 801 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 802 | 803 | eslint-plugin-react-refresh@0.4.20: 804 | resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} 805 | peerDependencies: 806 | eslint: '>=8.40' 807 | 808 | eslint-plugin-react@7.37.5: 809 | resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} 810 | engines: {node: '>=4'} 811 | peerDependencies: 812 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 813 | 814 | eslint-scope@5.1.1: 815 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 816 | engines: {node: '>=8.0.0'} 817 | 818 | eslint-scope@8.3.0: 819 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 820 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 821 | 822 | eslint-visitor-keys@2.1.0: 823 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 824 | engines: {node: '>=10'} 825 | 826 | eslint-visitor-keys@3.4.3: 827 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 828 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 829 | 830 | eslint-visitor-keys@4.2.0: 831 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 832 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 833 | 834 | eslint@9.27.0: 835 | resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} 836 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 837 | hasBin: true 838 | peerDependencies: 839 | jiti: '*' 840 | peerDependenciesMeta: 841 | jiti: 842 | optional: true 843 | 844 | espree@10.3.0: 845 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 846 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 847 | 848 | esquery@1.6.0: 849 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 850 | engines: {node: '>=0.10'} 851 | 852 | esrecurse@4.3.0: 853 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 854 | engines: {node: '>=4.0'} 855 | 856 | estraverse@4.3.0: 857 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 858 | engines: {node: '>=4.0'} 859 | 860 | estraverse@5.3.0: 861 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 862 | engines: {node: '>=4.0'} 863 | 864 | esutils@2.0.3: 865 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 866 | engines: {node: '>=0.10.0'} 867 | 868 | fast-deep-equal@3.1.3: 869 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 870 | 871 | fast-json-stable-stringify@2.1.0: 872 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 873 | 874 | fast-levenshtein@2.0.6: 875 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 876 | 877 | fdir@6.4.4: 878 | resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} 879 | peerDependencies: 880 | picomatch: ^3 || ^4 881 | peerDependenciesMeta: 882 | picomatch: 883 | optional: true 884 | 885 | file-entry-cache@8.0.0: 886 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 887 | engines: {node: '>=16.0.0'} 888 | 889 | find-up@5.0.0: 890 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 891 | engines: {node: '>=10'} 892 | 893 | flat-cache@4.0.1: 894 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 895 | engines: {node: '>=16'} 896 | 897 | flatted@3.3.3: 898 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 899 | 900 | follow-redirects@1.15.9: 901 | resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} 902 | engines: {node: '>=4.0'} 903 | peerDependencies: 904 | debug: '*' 905 | peerDependenciesMeta: 906 | debug: 907 | optional: true 908 | 909 | for-each@0.3.5: 910 | resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} 911 | engines: {node: '>= 0.4'} 912 | 913 | form-data@4.0.2: 914 | resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} 915 | engines: {node: '>= 6'} 916 | 917 | fsevents@2.3.3: 918 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 919 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 920 | os: [darwin] 921 | 922 | function-bind@1.1.2: 923 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 924 | 925 | function.prototype.name@1.1.8: 926 | resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} 927 | engines: {node: '>= 0.4'} 928 | 929 | functions-have-names@1.2.3: 930 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 931 | 932 | gensync@1.0.0-beta.2: 933 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 934 | engines: {node: '>=6.9.0'} 935 | 936 | get-intrinsic@1.3.0: 937 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 938 | engines: {node: '>= 0.4'} 939 | 940 | get-proto@1.0.1: 941 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 942 | engines: {node: '>= 0.4'} 943 | 944 | get-symbol-description@1.1.0: 945 | resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 946 | engines: {node: '>= 0.4'} 947 | 948 | glob-parent@6.0.2: 949 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 950 | engines: {node: '>=10.13.0'} 951 | 952 | globals@11.12.0: 953 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 954 | engines: {node: '>=4'} 955 | 956 | globals@14.0.0: 957 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 958 | engines: {node: '>=18'} 959 | 960 | globals@16.1.0: 961 | resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} 962 | engines: {node: '>=18'} 963 | 964 | globalthis@1.0.4: 965 | resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 966 | engines: {node: '>= 0.4'} 967 | 968 | gopd@1.2.0: 969 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 970 | engines: {node: '>= 0.4'} 971 | 972 | has-bigints@1.1.0: 973 | resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} 974 | engines: {node: '>= 0.4'} 975 | 976 | has-flag@4.0.0: 977 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 978 | engines: {node: '>=8'} 979 | 980 | has-property-descriptors@1.0.2: 981 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 982 | 983 | has-proto@1.2.0: 984 | resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} 985 | engines: {node: '>= 0.4'} 986 | 987 | has-symbols@1.1.0: 988 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 989 | engines: {node: '>= 0.4'} 990 | 991 | has-tostringtag@1.0.2: 992 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 993 | engines: {node: '>= 0.4'} 994 | 995 | hasown@2.0.2: 996 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 997 | engines: {node: '>= 0.4'} 998 | 999 | ignore@5.3.2: 1000 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1001 | engines: {node: '>= 4'} 1002 | 1003 | import-fresh@3.3.1: 1004 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 1005 | engines: {node: '>=6'} 1006 | 1007 | imurmurhash@0.1.4: 1008 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1009 | engines: {node: '>=0.8.19'} 1010 | 1011 | internal-slot@1.1.0: 1012 | resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 1013 | engines: {node: '>= 0.4'} 1014 | 1015 | is-array-buffer@3.0.5: 1016 | resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} 1017 | engines: {node: '>= 0.4'} 1018 | 1019 | is-async-function@2.1.1: 1020 | resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} 1021 | engines: {node: '>= 0.4'} 1022 | 1023 | is-bigint@1.1.0: 1024 | resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} 1025 | engines: {node: '>= 0.4'} 1026 | 1027 | is-boolean-object@1.2.2: 1028 | resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} 1029 | engines: {node: '>= 0.4'} 1030 | 1031 | is-callable@1.2.7: 1032 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1033 | engines: {node: '>= 0.4'} 1034 | 1035 | is-core-module@2.16.1: 1036 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1037 | engines: {node: '>= 0.4'} 1038 | 1039 | is-data-view@1.0.2: 1040 | resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} 1041 | engines: {node: '>= 0.4'} 1042 | 1043 | is-date-object@1.1.0: 1044 | resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} 1045 | engines: {node: '>= 0.4'} 1046 | 1047 | is-extglob@2.1.1: 1048 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1049 | engines: {node: '>=0.10.0'} 1050 | 1051 | is-finalizationregistry@1.1.1: 1052 | resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} 1053 | engines: {node: '>= 0.4'} 1054 | 1055 | is-generator-function@1.1.0: 1056 | resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} 1057 | engines: {node: '>= 0.4'} 1058 | 1059 | is-glob@4.0.3: 1060 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1061 | engines: {node: '>=0.10.0'} 1062 | 1063 | is-map@2.0.3: 1064 | resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 1065 | engines: {node: '>= 0.4'} 1066 | 1067 | is-number-object@1.1.1: 1068 | resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} 1069 | engines: {node: '>= 0.4'} 1070 | 1071 | is-regex@1.2.1: 1072 | resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 1073 | engines: {node: '>= 0.4'} 1074 | 1075 | is-set@2.0.3: 1076 | resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 1077 | engines: {node: '>= 0.4'} 1078 | 1079 | is-shared-array-buffer@1.0.4: 1080 | resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} 1081 | engines: {node: '>= 0.4'} 1082 | 1083 | is-string@1.1.1: 1084 | resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} 1085 | engines: {node: '>= 0.4'} 1086 | 1087 | is-symbol@1.1.1: 1088 | resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} 1089 | engines: {node: '>= 0.4'} 1090 | 1091 | is-typed-array@1.1.15: 1092 | resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} 1093 | engines: {node: '>= 0.4'} 1094 | 1095 | is-weakmap@2.0.2: 1096 | resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 1097 | engines: {node: '>= 0.4'} 1098 | 1099 | is-weakref@1.1.1: 1100 | resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} 1101 | engines: {node: '>= 0.4'} 1102 | 1103 | is-weakset@2.0.4: 1104 | resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} 1105 | engines: {node: '>= 0.4'} 1106 | 1107 | isarray@2.0.5: 1108 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1109 | 1110 | isexe@2.0.0: 1111 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1112 | 1113 | iterator.prototype@1.1.5: 1114 | resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} 1115 | engines: {node: '>= 0.4'} 1116 | 1117 | js-cookie@3.0.5: 1118 | resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} 1119 | engines: {node: '>=14'} 1120 | 1121 | js-tokens@4.0.0: 1122 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1123 | 1124 | js-yaml@4.1.0: 1125 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1126 | hasBin: true 1127 | 1128 | jsesc@3.1.0: 1129 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1130 | engines: {node: '>=6'} 1131 | hasBin: true 1132 | 1133 | json-buffer@3.0.1: 1134 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1135 | 1136 | json-schema-traverse@0.4.1: 1137 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1138 | 1139 | json-stable-stringify-without-jsonify@1.0.1: 1140 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1141 | 1142 | json5@2.2.3: 1143 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1144 | engines: {node: '>=6'} 1145 | hasBin: true 1146 | 1147 | jsx-ast-utils@3.3.5: 1148 | resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} 1149 | engines: {node: '>=4.0'} 1150 | 1151 | jwt-decode@4.0.0: 1152 | resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} 1153 | engines: {node: '>=18'} 1154 | 1155 | keyv@4.5.4: 1156 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1157 | 1158 | levn@0.4.1: 1159 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1160 | engines: {node: '>= 0.8.0'} 1161 | 1162 | locate-path@6.0.0: 1163 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1164 | engines: {node: '>=10'} 1165 | 1166 | lodash.merge@4.6.2: 1167 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1168 | 1169 | loose-envify@1.4.0: 1170 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1171 | hasBin: true 1172 | 1173 | lru-cache@5.1.1: 1174 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1175 | 1176 | math-intrinsics@1.1.0: 1177 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1178 | engines: {node: '>= 0.4'} 1179 | 1180 | mime-db@1.52.0: 1181 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1182 | engines: {node: '>= 0.6'} 1183 | 1184 | mime-types@2.1.35: 1185 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1186 | engines: {node: '>= 0.6'} 1187 | 1188 | minimatch@3.1.2: 1189 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1190 | 1191 | ms@2.1.3: 1192 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1193 | 1194 | nanoid@3.3.11: 1195 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1196 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1197 | hasBin: true 1198 | 1199 | natural-compare@1.4.0: 1200 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1201 | 1202 | node-releases@2.0.19: 1203 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1204 | 1205 | object-assign@4.1.1: 1206 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1207 | engines: {node: '>=0.10.0'} 1208 | 1209 | object-inspect@1.13.4: 1210 | resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 1211 | engines: {node: '>= 0.4'} 1212 | 1213 | object-keys@1.1.1: 1214 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1215 | engines: {node: '>= 0.4'} 1216 | 1217 | object.assign@4.1.7: 1218 | resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} 1219 | engines: {node: '>= 0.4'} 1220 | 1221 | object.entries@1.1.9: 1222 | resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} 1223 | engines: {node: '>= 0.4'} 1224 | 1225 | object.fromentries@2.0.8: 1226 | resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} 1227 | engines: {node: '>= 0.4'} 1228 | 1229 | object.values@1.2.1: 1230 | resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} 1231 | engines: {node: '>= 0.4'} 1232 | 1233 | optionator@0.9.4: 1234 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1235 | engines: {node: '>= 0.8.0'} 1236 | 1237 | own-keys@1.0.1: 1238 | resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} 1239 | engines: {node: '>= 0.4'} 1240 | 1241 | p-limit@3.1.0: 1242 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1243 | engines: {node: '>=10'} 1244 | 1245 | p-locate@5.0.0: 1246 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1247 | engines: {node: '>=10'} 1248 | 1249 | parent-module@1.0.1: 1250 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1251 | engines: {node: '>=6'} 1252 | 1253 | path-exists@4.0.0: 1254 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1255 | engines: {node: '>=8'} 1256 | 1257 | path-key@3.1.1: 1258 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1259 | engines: {node: '>=8'} 1260 | 1261 | path-parse@1.0.7: 1262 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1263 | 1264 | picocolors@1.1.1: 1265 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1266 | 1267 | picomatch@4.0.2: 1268 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1269 | engines: {node: '>=12'} 1270 | 1271 | possible-typed-array-names@1.1.0: 1272 | resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} 1273 | engines: {node: '>= 0.4'} 1274 | 1275 | postcss@8.5.3: 1276 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1277 | engines: {node: ^10 || ^12 || >=14} 1278 | 1279 | prelude-ls@1.2.1: 1280 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1281 | engines: {node: '>= 0.8.0'} 1282 | 1283 | prettier@3.5.3: 1284 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 1285 | engines: {node: '>=14'} 1286 | hasBin: true 1287 | 1288 | prop-types@15.8.1: 1289 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 1290 | 1291 | proxy-from-env@1.1.0: 1292 | resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} 1293 | 1294 | punycode@2.3.1: 1295 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1296 | engines: {node: '>=6'} 1297 | 1298 | react-dom@18.3.1: 1299 | resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 1300 | peerDependencies: 1301 | react: ^18.3.1 1302 | 1303 | react-is@16.13.1: 1304 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 1305 | 1306 | react-refresh@0.17.0: 1307 | resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} 1308 | engines: {node: '>=0.10.0'} 1309 | 1310 | react-router-dom@6.30.1: 1311 | resolution: {integrity: sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==} 1312 | engines: {node: '>=14.0.0'} 1313 | peerDependencies: 1314 | react: '>=16.8' 1315 | react-dom: '>=16.8' 1316 | 1317 | react-router@6.30.1: 1318 | resolution: {integrity: sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==} 1319 | engines: {node: '>=14.0.0'} 1320 | peerDependencies: 1321 | react: '>=16.8' 1322 | 1323 | react@18.3.1: 1324 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 1325 | engines: {node: '>=0.10.0'} 1326 | 1327 | reflect.getprototypeof@1.0.10: 1328 | resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} 1329 | engines: {node: '>= 0.4'} 1330 | 1331 | regexp.prototype.flags@1.5.4: 1332 | resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 1333 | engines: {node: '>= 0.4'} 1334 | 1335 | resolve-from@4.0.0: 1336 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1337 | engines: {node: '>=4'} 1338 | 1339 | resolve@2.0.0-next.5: 1340 | resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} 1341 | hasBin: true 1342 | 1343 | rollup@4.41.1: 1344 | resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==} 1345 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1346 | hasBin: true 1347 | 1348 | safe-array-concat@1.1.3: 1349 | resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} 1350 | engines: {node: '>=0.4'} 1351 | 1352 | safe-push-apply@1.0.0: 1353 | resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} 1354 | engines: {node: '>= 0.4'} 1355 | 1356 | safe-regex-test@1.1.0: 1357 | resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} 1358 | engines: {node: '>= 0.4'} 1359 | 1360 | scheduler@0.23.2: 1361 | resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 1362 | 1363 | semver@6.3.1: 1364 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1365 | hasBin: true 1366 | 1367 | set-function-length@1.2.2: 1368 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1369 | engines: {node: '>= 0.4'} 1370 | 1371 | set-function-name@2.0.2: 1372 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1373 | engines: {node: '>= 0.4'} 1374 | 1375 | set-proto@1.0.0: 1376 | resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} 1377 | engines: {node: '>= 0.4'} 1378 | 1379 | shebang-command@2.0.0: 1380 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1381 | engines: {node: '>=8'} 1382 | 1383 | shebang-regex@3.0.0: 1384 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1385 | engines: {node: '>=8'} 1386 | 1387 | side-channel-list@1.0.0: 1388 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1389 | engines: {node: '>= 0.4'} 1390 | 1391 | side-channel-map@1.0.1: 1392 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1393 | engines: {node: '>= 0.4'} 1394 | 1395 | side-channel-weakmap@1.0.2: 1396 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1397 | engines: {node: '>= 0.4'} 1398 | 1399 | side-channel@1.1.0: 1400 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1401 | engines: {node: '>= 0.4'} 1402 | 1403 | simple-zustand-devtools@1.1.0: 1404 | resolution: {integrity: sha512-Axfcfr9L3YL3kto7aschCQLY2VUlXXMnIVtaTe9Y0qWbNmPsX/y7KsNprmxBZoB0pww5ZGs1u/ohcrvQ3tE6jA==} 1405 | peerDependencies: 1406 | '@types/react': '>=18.0.0' 1407 | '@types/react-dom': '>=18.0.0' 1408 | react: '>=18.0.0' 1409 | react-dom: '>=18.0.0' 1410 | zustand: '>=1.0.2' 1411 | 1412 | source-map-js@1.2.1: 1413 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1414 | engines: {node: '>=0.10.0'} 1415 | 1416 | string.prototype.matchall@4.0.12: 1417 | resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} 1418 | engines: {node: '>= 0.4'} 1419 | 1420 | string.prototype.repeat@1.0.0: 1421 | resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} 1422 | 1423 | string.prototype.trim@1.2.10: 1424 | resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} 1425 | engines: {node: '>= 0.4'} 1426 | 1427 | string.prototype.trimend@1.0.9: 1428 | resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} 1429 | engines: {node: '>= 0.4'} 1430 | 1431 | string.prototype.trimstart@1.0.8: 1432 | resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 1433 | engines: {node: '>= 0.4'} 1434 | 1435 | strip-json-comments@3.1.1: 1436 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1437 | engines: {node: '>=8'} 1438 | 1439 | supports-color@7.2.0: 1440 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1441 | engines: {node: '>=8'} 1442 | 1443 | supports-preserve-symlinks-flag@1.0.0: 1444 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1445 | engines: {node: '>= 0.4'} 1446 | 1447 | tinyglobby@0.2.13: 1448 | resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} 1449 | engines: {node: '>=12.0.0'} 1450 | 1451 | type-check@0.4.0: 1452 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1453 | engines: {node: '>= 0.8.0'} 1454 | 1455 | typed-array-buffer@1.0.3: 1456 | resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} 1457 | engines: {node: '>= 0.4'} 1458 | 1459 | typed-array-byte-length@1.0.3: 1460 | resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} 1461 | engines: {node: '>= 0.4'} 1462 | 1463 | typed-array-byte-offset@1.0.4: 1464 | resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} 1465 | engines: {node: '>= 0.4'} 1466 | 1467 | typed-array-length@1.0.7: 1468 | resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1469 | engines: {node: '>= 0.4'} 1470 | 1471 | unbox-primitive@1.1.0: 1472 | resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1473 | engines: {node: '>= 0.4'} 1474 | 1475 | update-browserslist-db@1.1.3: 1476 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1477 | hasBin: true 1478 | peerDependencies: 1479 | browserslist: '>= 4.21.0' 1480 | 1481 | uri-js@4.4.1: 1482 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1483 | 1484 | use-sync-external-store@1.5.0: 1485 | resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} 1486 | peerDependencies: 1487 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 1488 | 1489 | vite@6.3.5: 1490 | resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} 1491 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1492 | hasBin: true 1493 | peerDependencies: 1494 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1495 | jiti: '>=1.21.0' 1496 | less: '*' 1497 | lightningcss: ^1.21.0 1498 | sass: '*' 1499 | sass-embedded: '*' 1500 | stylus: '*' 1501 | sugarss: '*' 1502 | terser: ^5.16.0 1503 | tsx: ^4.8.1 1504 | yaml: ^2.4.2 1505 | peerDependenciesMeta: 1506 | '@types/node': 1507 | optional: true 1508 | jiti: 1509 | optional: true 1510 | less: 1511 | optional: true 1512 | lightningcss: 1513 | optional: true 1514 | sass: 1515 | optional: true 1516 | sass-embedded: 1517 | optional: true 1518 | stylus: 1519 | optional: true 1520 | sugarss: 1521 | optional: true 1522 | terser: 1523 | optional: true 1524 | tsx: 1525 | optional: true 1526 | yaml: 1527 | optional: true 1528 | 1529 | which-boxed-primitive@1.1.1: 1530 | resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} 1531 | engines: {node: '>= 0.4'} 1532 | 1533 | which-builtin-type@1.2.1: 1534 | resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} 1535 | engines: {node: '>= 0.4'} 1536 | 1537 | which-collection@1.0.2: 1538 | resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 1539 | engines: {node: '>= 0.4'} 1540 | 1541 | which-typed-array@1.1.19: 1542 | resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} 1543 | engines: {node: '>= 0.4'} 1544 | 1545 | which@2.0.2: 1546 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1547 | engines: {node: '>= 8'} 1548 | hasBin: true 1549 | 1550 | word-wrap@1.2.5: 1551 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1552 | engines: {node: '>=0.10.0'} 1553 | 1554 | yallist@3.1.1: 1555 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1556 | 1557 | yocto-queue@0.1.0: 1558 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1559 | engines: {node: '>=10'} 1560 | 1561 | zustand@5.0.5: 1562 | resolution: {integrity: sha512-mILtRfKW9xM47hqxGIxCv12gXusoY/xTSHBYApXozR0HmQv299whhBeeAcRy+KrPPybzosvJBCOmVjq6x12fCg==} 1563 | engines: {node: '>=12.20.0'} 1564 | peerDependencies: 1565 | '@types/react': '>=18.0.0' 1566 | immer: '>=9.0.6' 1567 | react: '>=18.0.0' 1568 | use-sync-external-store: '>=1.2.0' 1569 | peerDependenciesMeta: 1570 | '@types/react': 1571 | optional: true 1572 | immer: 1573 | optional: true 1574 | react: 1575 | optional: true 1576 | use-sync-external-store: 1577 | optional: true 1578 | 1579 | snapshots: 1580 | 1581 | '@ampproject/remapping@2.3.0': 1582 | dependencies: 1583 | '@jridgewell/gen-mapping': 0.3.8 1584 | '@jridgewell/trace-mapping': 0.3.25 1585 | 1586 | '@babel/code-frame@7.27.1': 1587 | dependencies: 1588 | '@babel/helper-validator-identifier': 7.27.1 1589 | js-tokens: 4.0.0 1590 | picocolors: 1.1.1 1591 | 1592 | '@babel/compat-data@7.27.2': {} 1593 | 1594 | '@babel/core@7.27.1': 1595 | dependencies: 1596 | '@ampproject/remapping': 2.3.0 1597 | '@babel/code-frame': 7.27.1 1598 | '@babel/generator': 7.27.1 1599 | '@babel/helper-compilation-targets': 7.27.2 1600 | '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) 1601 | '@babel/helpers': 7.27.1 1602 | '@babel/parser': 7.27.2 1603 | '@babel/template': 7.27.2 1604 | '@babel/traverse': 7.27.1 1605 | '@babel/types': 7.27.1 1606 | convert-source-map: 2.0.0 1607 | debug: 4.4.1 1608 | gensync: 1.0.0-beta.2 1609 | json5: 2.2.3 1610 | semver: 6.3.1 1611 | transitivePeerDependencies: 1612 | - supports-color 1613 | 1614 | '@babel/eslint-parser@7.27.1(@babel/core@7.27.1)(eslint@9.27.0)': 1615 | dependencies: 1616 | '@babel/core': 7.27.1 1617 | '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 1618 | eslint: 9.27.0 1619 | eslint-visitor-keys: 2.1.0 1620 | semver: 6.3.1 1621 | 1622 | '@babel/generator@7.27.1': 1623 | dependencies: 1624 | '@babel/parser': 7.27.2 1625 | '@babel/types': 7.27.1 1626 | '@jridgewell/gen-mapping': 0.3.8 1627 | '@jridgewell/trace-mapping': 0.3.25 1628 | jsesc: 3.1.0 1629 | 1630 | '@babel/helper-annotate-as-pure@7.27.1': 1631 | dependencies: 1632 | '@babel/types': 7.27.1 1633 | 1634 | '@babel/helper-compilation-targets@7.27.2': 1635 | dependencies: 1636 | '@babel/compat-data': 7.27.2 1637 | '@babel/helper-validator-option': 7.27.1 1638 | browserslist: 4.24.5 1639 | lru-cache: 5.1.1 1640 | semver: 6.3.1 1641 | 1642 | '@babel/helper-module-imports@7.27.1': 1643 | dependencies: 1644 | '@babel/traverse': 7.27.1 1645 | '@babel/types': 7.27.1 1646 | transitivePeerDependencies: 1647 | - supports-color 1648 | 1649 | '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': 1650 | dependencies: 1651 | '@babel/core': 7.27.1 1652 | '@babel/helper-module-imports': 7.27.1 1653 | '@babel/helper-validator-identifier': 7.27.1 1654 | '@babel/traverse': 7.27.1 1655 | transitivePeerDependencies: 1656 | - supports-color 1657 | 1658 | '@babel/helper-plugin-utils@7.27.1': {} 1659 | 1660 | '@babel/helper-string-parser@7.27.1': {} 1661 | 1662 | '@babel/helper-validator-identifier@7.27.1': {} 1663 | 1664 | '@babel/helper-validator-option@7.27.1': {} 1665 | 1666 | '@babel/helpers@7.27.1': 1667 | dependencies: 1668 | '@babel/template': 7.27.2 1669 | '@babel/types': 7.27.1 1670 | 1671 | '@babel/parser@7.27.2': 1672 | dependencies: 1673 | '@babel/types': 7.27.1 1674 | 1675 | '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.1)': 1676 | dependencies: 1677 | '@babel/core': 7.27.1 1678 | '@babel/helper-plugin-utils': 7.27.1 1679 | 1680 | '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.1)': 1681 | dependencies: 1682 | '@babel/core': 7.27.1 1683 | '@babel/helper-plugin-utils': 7.27.1 1684 | 1685 | '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.1)': 1686 | dependencies: 1687 | '@babel/core': 7.27.1 1688 | '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.1) 1689 | transitivePeerDependencies: 1690 | - supports-color 1691 | 1692 | '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.1)': 1693 | dependencies: 1694 | '@babel/core': 7.27.1 1695 | '@babel/helper-plugin-utils': 7.27.1 1696 | 1697 | '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.1)': 1698 | dependencies: 1699 | '@babel/core': 7.27.1 1700 | '@babel/helper-plugin-utils': 7.27.1 1701 | 1702 | '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.1)': 1703 | dependencies: 1704 | '@babel/core': 7.27.1 1705 | '@babel/helper-annotate-as-pure': 7.27.1 1706 | '@babel/helper-module-imports': 7.27.1 1707 | '@babel/helper-plugin-utils': 7.27.1 1708 | '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) 1709 | '@babel/types': 7.27.1 1710 | transitivePeerDependencies: 1711 | - supports-color 1712 | 1713 | '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.1)': 1714 | dependencies: 1715 | '@babel/core': 7.27.1 1716 | '@babel/helper-annotate-as-pure': 7.27.1 1717 | '@babel/helper-plugin-utils': 7.27.1 1718 | 1719 | '@babel/preset-react@7.27.1(@babel/core@7.27.1)': 1720 | dependencies: 1721 | '@babel/core': 7.27.1 1722 | '@babel/helper-plugin-utils': 7.27.1 1723 | '@babel/helper-validator-option': 7.27.1 1724 | '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.1) 1725 | '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.1) 1726 | '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.1) 1727 | '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.1) 1728 | transitivePeerDependencies: 1729 | - supports-color 1730 | 1731 | '@babel/template@7.27.2': 1732 | dependencies: 1733 | '@babel/code-frame': 7.27.1 1734 | '@babel/parser': 7.27.2 1735 | '@babel/types': 7.27.1 1736 | 1737 | '@babel/traverse@7.27.1': 1738 | dependencies: 1739 | '@babel/code-frame': 7.27.1 1740 | '@babel/generator': 7.27.1 1741 | '@babel/parser': 7.27.2 1742 | '@babel/template': 7.27.2 1743 | '@babel/types': 7.27.1 1744 | debug: 4.4.1 1745 | globals: 11.12.0 1746 | transitivePeerDependencies: 1747 | - supports-color 1748 | 1749 | '@babel/types@7.27.1': 1750 | dependencies: 1751 | '@babel/helper-string-parser': 7.27.1 1752 | '@babel/helper-validator-identifier': 7.27.1 1753 | 1754 | '@esbuild/aix-ppc64@0.25.4': 1755 | optional: true 1756 | 1757 | '@esbuild/android-arm64@0.25.4': 1758 | optional: true 1759 | 1760 | '@esbuild/android-arm@0.25.4': 1761 | optional: true 1762 | 1763 | '@esbuild/android-x64@0.25.4': 1764 | optional: true 1765 | 1766 | '@esbuild/darwin-arm64@0.25.4': 1767 | optional: true 1768 | 1769 | '@esbuild/darwin-x64@0.25.4': 1770 | optional: true 1771 | 1772 | '@esbuild/freebsd-arm64@0.25.4': 1773 | optional: true 1774 | 1775 | '@esbuild/freebsd-x64@0.25.4': 1776 | optional: true 1777 | 1778 | '@esbuild/linux-arm64@0.25.4': 1779 | optional: true 1780 | 1781 | '@esbuild/linux-arm@0.25.4': 1782 | optional: true 1783 | 1784 | '@esbuild/linux-ia32@0.25.4': 1785 | optional: true 1786 | 1787 | '@esbuild/linux-loong64@0.25.4': 1788 | optional: true 1789 | 1790 | '@esbuild/linux-mips64el@0.25.4': 1791 | optional: true 1792 | 1793 | '@esbuild/linux-ppc64@0.25.4': 1794 | optional: true 1795 | 1796 | '@esbuild/linux-riscv64@0.25.4': 1797 | optional: true 1798 | 1799 | '@esbuild/linux-s390x@0.25.4': 1800 | optional: true 1801 | 1802 | '@esbuild/linux-x64@0.25.4': 1803 | optional: true 1804 | 1805 | '@esbuild/netbsd-arm64@0.25.4': 1806 | optional: true 1807 | 1808 | '@esbuild/netbsd-x64@0.25.4': 1809 | optional: true 1810 | 1811 | '@esbuild/openbsd-arm64@0.25.4': 1812 | optional: true 1813 | 1814 | '@esbuild/openbsd-x64@0.25.4': 1815 | optional: true 1816 | 1817 | '@esbuild/sunos-x64@0.25.4': 1818 | optional: true 1819 | 1820 | '@esbuild/win32-arm64@0.25.4': 1821 | optional: true 1822 | 1823 | '@esbuild/win32-ia32@0.25.4': 1824 | optional: true 1825 | 1826 | '@esbuild/win32-x64@0.25.4': 1827 | optional: true 1828 | 1829 | '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0)': 1830 | dependencies: 1831 | eslint: 9.27.0 1832 | eslint-visitor-keys: 3.4.3 1833 | 1834 | '@eslint-community/regexpp@4.12.1': {} 1835 | 1836 | '@eslint/config-array@0.20.0': 1837 | dependencies: 1838 | '@eslint/object-schema': 2.1.6 1839 | debug: 4.4.1 1840 | minimatch: 3.1.2 1841 | transitivePeerDependencies: 1842 | - supports-color 1843 | 1844 | '@eslint/config-helpers@0.2.2': {} 1845 | 1846 | '@eslint/core@0.14.0': 1847 | dependencies: 1848 | '@types/json-schema': 7.0.15 1849 | 1850 | '@eslint/eslintrc@3.3.1': 1851 | dependencies: 1852 | ajv: 6.12.6 1853 | debug: 4.4.1 1854 | espree: 10.3.0 1855 | globals: 14.0.0 1856 | ignore: 5.3.2 1857 | import-fresh: 3.3.1 1858 | js-yaml: 4.1.0 1859 | minimatch: 3.1.2 1860 | strip-json-comments: 3.1.1 1861 | transitivePeerDependencies: 1862 | - supports-color 1863 | 1864 | '@eslint/js@9.27.0': {} 1865 | 1866 | '@eslint/object-schema@2.1.6': {} 1867 | 1868 | '@eslint/plugin-kit@0.3.1': 1869 | dependencies: 1870 | '@eslint/core': 0.14.0 1871 | levn: 0.4.1 1872 | 1873 | '@humanfs/core@0.19.1': {} 1874 | 1875 | '@humanfs/node@0.16.6': 1876 | dependencies: 1877 | '@humanfs/core': 0.19.1 1878 | '@humanwhocodes/retry': 0.3.1 1879 | 1880 | '@humanwhocodes/module-importer@1.0.1': {} 1881 | 1882 | '@humanwhocodes/retry@0.3.1': {} 1883 | 1884 | '@humanwhocodes/retry@0.4.3': {} 1885 | 1886 | '@jridgewell/gen-mapping@0.3.8': 1887 | dependencies: 1888 | '@jridgewell/set-array': 1.2.1 1889 | '@jridgewell/sourcemap-codec': 1.5.0 1890 | '@jridgewell/trace-mapping': 0.3.25 1891 | 1892 | '@jridgewell/resolve-uri@3.1.2': {} 1893 | 1894 | '@jridgewell/set-array@1.2.1': {} 1895 | 1896 | '@jridgewell/sourcemap-codec@1.5.0': {} 1897 | 1898 | '@jridgewell/trace-mapping@0.3.25': 1899 | dependencies: 1900 | '@jridgewell/resolve-uri': 3.1.2 1901 | '@jridgewell/sourcemap-codec': 1.5.0 1902 | 1903 | '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': 1904 | dependencies: 1905 | eslint-scope: 5.1.1 1906 | 1907 | '@remix-run/router@1.23.0': {} 1908 | 1909 | '@rolldown/pluginutils@1.0.0-beta.9': {} 1910 | 1911 | '@rollup/rollup-android-arm-eabi@4.41.1': 1912 | optional: true 1913 | 1914 | '@rollup/rollup-android-arm64@4.41.1': 1915 | optional: true 1916 | 1917 | '@rollup/rollup-darwin-arm64@4.41.1': 1918 | optional: true 1919 | 1920 | '@rollup/rollup-darwin-x64@4.41.1': 1921 | optional: true 1922 | 1923 | '@rollup/rollup-freebsd-arm64@4.41.1': 1924 | optional: true 1925 | 1926 | '@rollup/rollup-freebsd-x64@4.41.1': 1927 | optional: true 1928 | 1929 | '@rollup/rollup-linux-arm-gnueabihf@4.41.1': 1930 | optional: true 1931 | 1932 | '@rollup/rollup-linux-arm-musleabihf@4.41.1': 1933 | optional: true 1934 | 1935 | '@rollup/rollup-linux-arm64-gnu@4.41.1': 1936 | optional: true 1937 | 1938 | '@rollup/rollup-linux-arm64-musl@4.41.1': 1939 | optional: true 1940 | 1941 | '@rollup/rollup-linux-loongarch64-gnu@4.41.1': 1942 | optional: true 1943 | 1944 | '@rollup/rollup-linux-powerpc64le-gnu@4.41.1': 1945 | optional: true 1946 | 1947 | '@rollup/rollup-linux-riscv64-gnu@4.41.1': 1948 | optional: true 1949 | 1950 | '@rollup/rollup-linux-riscv64-musl@4.41.1': 1951 | optional: true 1952 | 1953 | '@rollup/rollup-linux-s390x-gnu@4.41.1': 1954 | optional: true 1955 | 1956 | '@rollup/rollup-linux-x64-gnu@4.41.1': 1957 | optional: true 1958 | 1959 | '@rollup/rollup-linux-x64-musl@4.41.1': 1960 | optional: true 1961 | 1962 | '@rollup/rollup-win32-arm64-msvc@4.41.1': 1963 | optional: true 1964 | 1965 | '@rollup/rollup-win32-ia32-msvc@4.41.1': 1966 | optional: true 1967 | 1968 | '@rollup/rollup-win32-x64-msvc@4.41.1': 1969 | optional: true 1970 | 1971 | '@types/babel__core@7.20.5': 1972 | dependencies: 1973 | '@babel/parser': 7.27.2 1974 | '@babel/types': 7.27.1 1975 | '@types/babel__generator': 7.27.0 1976 | '@types/babel__template': 7.4.4 1977 | '@types/babel__traverse': 7.20.7 1978 | 1979 | '@types/babel__generator@7.27.0': 1980 | dependencies: 1981 | '@babel/types': 7.27.1 1982 | 1983 | '@types/babel__template@7.4.4': 1984 | dependencies: 1985 | '@babel/parser': 7.27.2 1986 | '@babel/types': 7.27.1 1987 | 1988 | '@types/babel__traverse@7.20.7': 1989 | dependencies: 1990 | '@babel/types': 7.27.1 1991 | 1992 | '@types/estree@1.0.7': {} 1993 | 1994 | '@types/json-schema@7.0.15': {} 1995 | 1996 | '@types/prop-types@15.7.14': {} 1997 | 1998 | '@types/react-dom@18.3.7(@types/react@18.3.22)': 1999 | dependencies: 2000 | '@types/react': 18.3.22 2001 | 2002 | '@types/react@18.3.22': 2003 | dependencies: 2004 | '@types/prop-types': 15.7.14 2005 | csstype: 3.1.3 2006 | 2007 | '@vitejs/plugin-react@4.5.0(vite@6.3.5)': 2008 | dependencies: 2009 | '@babel/core': 7.27.1 2010 | '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1) 2011 | '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.1) 2012 | '@rolldown/pluginutils': 1.0.0-beta.9 2013 | '@types/babel__core': 7.20.5 2014 | react-refresh: 0.17.0 2015 | vite: 6.3.5 2016 | transitivePeerDependencies: 2017 | - supports-color 2018 | 2019 | acorn-jsx@5.3.2(acorn@8.14.1): 2020 | dependencies: 2021 | acorn: 8.14.1 2022 | 2023 | acorn@8.14.1: {} 2024 | 2025 | ajv@6.12.6: 2026 | dependencies: 2027 | fast-deep-equal: 3.1.3 2028 | fast-json-stable-stringify: 2.1.0 2029 | json-schema-traverse: 0.4.1 2030 | uri-js: 4.4.1 2031 | 2032 | ansi-styles@4.3.0: 2033 | dependencies: 2034 | color-convert: 2.0.1 2035 | 2036 | argparse@2.0.1: {} 2037 | 2038 | array-buffer-byte-length@1.0.2: 2039 | dependencies: 2040 | call-bound: 1.0.4 2041 | is-array-buffer: 3.0.5 2042 | 2043 | array-includes@3.1.8: 2044 | dependencies: 2045 | call-bind: 1.0.8 2046 | define-properties: 1.2.1 2047 | es-abstract: 1.23.10 2048 | es-object-atoms: 1.1.1 2049 | get-intrinsic: 1.3.0 2050 | is-string: 1.1.1 2051 | 2052 | array.prototype.findlast@1.2.5: 2053 | dependencies: 2054 | call-bind: 1.0.8 2055 | define-properties: 1.2.1 2056 | es-abstract: 1.23.10 2057 | es-errors: 1.3.0 2058 | es-object-atoms: 1.1.1 2059 | es-shim-unscopables: 1.1.0 2060 | 2061 | array.prototype.flat@1.3.3: 2062 | dependencies: 2063 | call-bind: 1.0.8 2064 | define-properties: 1.2.1 2065 | es-abstract: 1.23.10 2066 | es-shim-unscopables: 1.1.0 2067 | 2068 | array.prototype.flatmap@1.3.3: 2069 | dependencies: 2070 | call-bind: 1.0.8 2071 | define-properties: 1.2.1 2072 | es-abstract: 1.23.10 2073 | es-shim-unscopables: 1.1.0 2074 | 2075 | array.prototype.tosorted@1.1.4: 2076 | dependencies: 2077 | call-bind: 1.0.8 2078 | define-properties: 1.2.1 2079 | es-abstract: 1.23.10 2080 | es-errors: 1.3.0 2081 | es-shim-unscopables: 1.1.0 2082 | 2083 | arraybuffer.prototype.slice@1.0.4: 2084 | dependencies: 2085 | array-buffer-byte-length: 1.0.2 2086 | call-bind: 1.0.8 2087 | define-properties: 1.2.1 2088 | es-abstract: 1.23.10 2089 | es-errors: 1.3.0 2090 | get-intrinsic: 1.3.0 2091 | is-array-buffer: 3.0.5 2092 | 2093 | async-function@1.0.0: {} 2094 | 2095 | asynckit@0.4.0: {} 2096 | 2097 | available-typed-arrays@1.0.7: 2098 | dependencies: 2099 | possible-typed-array-names: 1.1.0 2100 | 2101 | axios@1.9.0: 2102 | dependencies: 2103 | follow-redirects: 1.15.9 2104 | form-data: 4.0.2 2105 | proxy-from-env: 1.1.0 2106 | transitivePeerDependencies: 2107 | - debug 2108 | 2109 | balanced-match@1.0.2: {} 2110 | 2111 | brace-expansion@1.1.11: 2112 | dependencies: 2113 | balanced-match: 1.0.2 2114 | concat-map: 0.0.1 2115 | 2116 | browserslist@4.24.5: 2117 | dependencies: 2118 | caniuse-lite: 1.0.30001718 2119 | electron-to-chromium: 1.5.157 2120 | node-releases: 2.0.19 2121 | update-browserslist-db: 1.1.3(browserslist@4.24.5) 2122 | 2123 | call-bind-apply-helpers@1.0.2: 2124 | dependencies: 2125 | es-errors: 1.3.0 2126 | function-bind: 1.1.2 2127 | 2128 | call-bind@1.0.8: 2129 | dependencies: 2130 | call-bind-apply-helpers: 1.0.2 2131 | es-define-property: 1.0.1 2132 | get-intrinsic: 1.3.0 2133 | set-function-length: 1.2.2 2134 | 2135 | call-bound@1.0.4: 2136 | dependencies: 2137 | call-bind-apply-helpers: 1.0.2 2138 | get-intrinsic: 1.3.0 2139 | 2140 | callsites@3.1.0: {} 2141 | 2142 | caniuse-lite@1.0.30001718: {} 2143 | 2144 | chalk@4.1.2: 2145 | dependencies: 2146 | ansi-styles: 4.3.0 2147 | supports-color: 7.2.0 2148 | 2149 | color-convert@2.0.1: 2150 | dependencies: 2151 | color-name: 1.1.4 2152 | 2153 | color-name@1.1.4: {} 2154 | 2155 | combined-stream@1.0.8: 2156 | dependencies: 2157 | delayed-stream: 1.0.0 2158 | 2159 | concat-map@0.0.1: {} 2160 | 2161 | convert-source-map@2.0.0: {} 2162 | 2163 | cross-spawn@7.0.6: 2164 | dependencies: 2165 | path-key: 3.1.1 2166 | shebang-command: 2.0.0 2167 | which: 2.0.2 2168 | 2169 | csstype@3.1.3: {} 2170 | 2171 | data-view-buffer@1.0.2: 2172 | dependencies: 2173 | call-bound: 1.0.4 2174 | es-errors: 1.3.0 2175 | is-data-view: 1.0.2 2176 | 2177 | data-view-byte-length@1.0.2: 2178 | dependencies: 2179 | call-bound: 1.0.4 2180 | es-errors: 1.3.0 2181 | is-data-view: 1.0.2 2182 | 2183 | data-view-byte-offset@1.0.1: 2184 | dependencies: 2185 | call-bound: 1.0.4 2186 | es-errors: 1.3.0 2187 | is-data-view: 1.0.2 2188 | 2189 | dayjs@1.11.13: {} 2190 | 2191 | debug@4.4.1: 2192 | dependencies: 2193 | ms: 2.1.3 2194 | 2195 | deep-is@0.1.4: {} 2196 | 2197 | define-data-property@1.1.4: 2198 | dependencies: 2199 | es-define-property: 1.0.1 2200 | es-errors: 1.3.0 2201 | gopd: 1.2.0 2202 | 2203 | define-properties@1.2.1: 2204 | dependencies: 2205 | define-data-property: 1.1.4 2206 | has-property-descriptors: 1.0.2 2207 | object-keys: 1.1.1 2208 | 2209 | delayed-stream@1.0.0: {} 2210 | 2211 | doctrine@2.1.0: 2212 | dependencies: 2213 | esutils: 2.0.3 2214 | 2215 | dunder-proto@1.0.1: 2216 | dependencies: 2217 | call-bind-apply-helpers: 1.0.2 2218 | es-errors: 1.3.0 2219 | gopd: 1.2.0 2220 | 2221 | electron-to-chromium@1.5.157: {} 2222 | 2223 | es-abstract@1.23.10: 2224 | dependencies: 2225 | array-buffer-byte-length: 1.0.2 2226 | arraybuffer.prototype.slice: 1.0.4 2227 | available-typed-arrays: 1.0.7 2228 | call-bind: 1.0.8 2229 | call-bound: 1.0.4 2230 | data-view-buffer: 1.0.2 2231 | data-view-byte-length: 1.0.2 2232 | data-view-byte-offset: 1.0.1 2233 | es-define-property: 1.0.1 2234 | es-errors: 1.3.0 2235 | es-object-atoms: 1.1.1 2236 | es-set-tostringtag: 2.1.0 2237 | es-to-primitive: 1.3.0 2238 | function.prototype.name: 1.1.8 2239 | get-intrinsic: 1.3.0 2240 | get-proto: 1.0.1 2241 | get-symbol-description: 1.1.0 2242 | globalthis: 1.0.4 2243 | gopd: 1.2.0 2244 | has-property-descriptors: 1.0.2 2245 | has-proto: 1.2.0 2246 | has-symbols: 1.1.0 2247 | hasown: 2.0.2 2248 | internal-slot: 1.1.0 2249 | is-array-buffer: 3.0.5 2250 | is-callable: 1.2.7 2251 | is-data-view: 1.0.2 2252 | is-regex: 1.2.1 2253 | is-shared-array-buffer: 1.0.4 2254 | is-string: 1.1.1 2255 | is-typed-array: 1.1.15 2256 | is-weakref: 1.1.1 2257 | math-intrinsics: 1.1.0 2258 | object-inspect: 1.13.4 2259 | object-keys: 1.1.1 2260 | object.assign: 4.1.7 2261 | own-keys: 1.0.1 2262 | regexp.prototype.flags: 1.5.4 2263 | safe-array-concat: 1.1.3 2264 | safe-push-apply: 1.0.0 2265 | safe-regex-test: 1.1.0 2266 | set-proto: 1.0.0 2267 | string.prototype.trim: 1.2.10 2268 | string.prototype.trimend: 1.0.9 2269 | string.prototype.trimstart: 1.0.8 2270 | typed-array-buffer: 1.0.3 2271 | typed-array-byte-length: 1.0.3 2272 | typed-array-byte-offset: 1.0.4 2273 | typed-array-length: 1.0.7 2274 | unbox-primitive: 1.1.0 2275 | which-typed-array: 1.1.19 2276 | 2277 | es-define-property@1.0.1: {} 2278 | 2279 | es-errors@1.3.0: {} 2280 | 2281 | es-iterator-helpers@1.2.1: 2282 | dependencies: 2283 | call-bind: 1.0.8 2284 | call-bound: 1.0.4 2285 | define-properties: 1.2.1 2286 | es-abstract: 1.23.10 2287 | es-errors: 1.3.0 2288 | es-set-tostringtag: 2.1.0 2289 | function-bind: 1.1.2 2290 | get-intrinsic: 1.3.0 2291 | globalthis: 1.0.4 2292 | gopd: 1.2.0 2293 | has-property-descriptors: 1.0.2 2294 | has-proto: 1.2.0 2295 | has-symbols: 1.1.0 2296 | internal-slot: 1.1.0 2297 | iterator.prototype: 1.1.5 2298 | safe-array-concat: 1.1.3 2299 | 2300 | es-object-atoms@1.1.1: 2301 | dependencies: 2302 | es-errors: 1.3.0 2303 | 2304 | es-set-tostringtag@2.1.0: 2305 | dependencies: 2306 | es-errors: 1.3.0 2307 | get-intrinsic: 1.3.0 2308 | has-tostringtag: 1.0.2 2309 | hasown: 2.0.2 2310 | 2311 | es-shim-unscopables@1.1.0: 2312 | dependencies: 2313 | hasown: 2.0.2 2314 | 2315 | es-to-primitive@1.3.0: 2316 | dependencies: 2317 | is-callable: 1.2.7 2318 | is-date-object: 1.1.0 2319 | is-symbol: 1.1.1 2320 | 2321 | esbuild@0.25.4: 2322 | optionalDependencies: 2323 | '@esbuild/aix-ppc64': 0.25.4 2324 | '@esbuild/android-arm': 0.25.4 2325 | '@esbuild/android-arm64': 0.25.4 2326 | '@esbuild/android-x64': 0.25.4 2327 | '@esbuild/darwin-arm64': 0.25.4 2328 | '@esbuild/darwin-x64': 0.25.4 2329 | '@esbuild/freebsd-arm64': 0.25.4 2330 | '@esbuild/freebsd-x64': 0.25.4 2331 | '@esbuild/linux-arm': 0.25.4 2332 | '@esbuild/linux-arm64': 0.25.4 2333 | '@esbuild/linux-ia32': 0.25.4 2334 | '@esbuild/linux-loong64': 0.25.4 2335 | '@esbuild/linux-mips64el': 0.25.4 2336 | '@esbuild/linux-ppc64': 0.25.4 2337 | '@esbuild/linux-riscv64': 0.25.4 2338 | '@esbuild/linux-s390x': 0.25.4 2339 | '@esbuild/linux-x64': 0.25.4 2340 | '@esbuild/netbsd-arm64': 0.25.4 2341 | '@esbuild/netbsd-x64': 0.25.4 2342 | '@esbuild/openbsd-arm64': 0.25.4 2343 | '@esbuild/openbsd-x64': 0.25.4 2344 | '@esbuild/sunos-x64': 0.25.4 2345 | '@esbuild/win32-arm64': 0.25.4 2346 | '@esbuild/win32-ia32': 0.25.4 2347 | '@esbuild/win32-x64': 0.25.4 2348 | 2349 | escalade@3.2.0: {} 2350 | 2351 | escape-string-regexp@4.0.0: {} 2352 | 2353 | eslint-plugin-react-hooks@5.2.0(eslint@9.27.0): 2354 | dependencies: 2355 | eslint: 9.27.0 2356 | 2357 | eslint-plugin-react-refresh@0.4.20(eslint@9.27.0): 2358 | dependencies: 2359 | eslint: 9.27.0 2360 | 2361 | eslint-plugin-react@7.37.5(eslint@9.27.0): 2362 | dependencies: 2363 | array-includes: 3.1.8 2364 | array.prototype.findlast: 1.2.5 2365 | array.prototype.flatmap: 1.3.3 2366 | array.prototype.tosorted: 1.1.4 2367 | doctrine: 2.1.0 2368 | es-iterator-helpers: 1.2.1 2369 | eslint: 9.27.0 2370 | estraverse: 5.3.0 2371 | hasown: 2.0.2 2372 | jsx-ast-utils: 3.3.5 2373 | minimatch: 3.1.2 2374 | object.entries: 1.1.9 2375 | object.fromentries: 2.0.8 2376 | object.values: 1.2.1 2377 | prop-types: 15.8.1 2378 | resolve: 2.0.0-next.5 2379 | semver: 6.3.1 2380 | string.prototype.matchall: 4.0.12 2381 | string.prototype.repeat: 1.0.0 2382 | 2383 | eslint-scope@5.1.1: 2384 | dependencies: 2385 | esrecurse: 4.3.0 2386 | estraverse: 4.3.0 2387 | 2388 | eslint-scope@8.3.0: 2389 | dependencies: 2390 | esrecurse: 4.3.0 2391 | estraverse: 5.3.0 2392 | 2393 | eslint-visitor-keys@2.1.0: {} 2394 | 2395 | eslint-visitor-keys@3.4.3: {} 2396 | 2397 | eslint-visitor-keys@4.2.0: {} 2398 | 2399 | eslint@9.27.0: 2400 | dependencies: 2401 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) 2402 | '@eslint-community/regexpp': 4.12.1 2403 | '@eslint/config-array': 0.20.0 2404 | '@eslint/config-helpers': 0.2.2 2405 | '@eslint/core': 0.14.0 2406 | '@eslint/eslintrc': 3.3.1 2407 | '@eslint/js': 9.27.0 2408 | '@eslint/plugin-kit': 0.3.1 2409 | '@humanfs/node': 0.16.6 2410 | '@humanwhocodes/module-importer': 1.0.1 2411 | '@humanwhocodes/retry': 0.4.3 2412 | '@types/estree': 1.0.7 2413 | '@types/json-schema': 7.0.15 2414 | ajv: 6.12.6 2415 | chalk: 4.1.2 2416 | cross-spawn: 7.0.6 2417 | debug: 4.4.1 2418 | escape-string-regexp: 4.0.0 2419 | eslint-scope: 8.3.0 2420 | eslint-visitor-keys: 4.2.0 2421 | espree: 10.3.0 2422 | esquery: 1.6.0 2423 | esutils: 2.0.3 2424 | fast-deep-equal: 3.1.3 2425 | file-entry-cache: 8.0.0 2426 | find-up: 5.0.0 2427 | glob-parent: 6.0.2 2428 | ignore: 5.3.2 2429 | imurmurhash: 0.1.4 2430 | is-glob: 4.0.3 2431 | json-stable-stringify-without-jsonify: 1.0.1 2432 | lodash.merge: 4.6.2 2433 | minimatch: 3.1.2 2434 | natural-compare: 1.4.0 2435 | optionator: 0.9.4 2436 | transitivePeerDependencies: 2437 | - supports-color 2438 | 2439 | espree@10.3.0: 2440 | dependencies: 2441 | acorn: 8.14.1 2442 | acorn-jsx: 5.3.2(acorn@8.14.1) 2443 | eslint-visitor-keys: 4.2.0 2444 | 2445 | esquery@1.6.0: 2446 | dependencies: 2447 | estraverse: 5.3.0 2448 | 2449 | esrecurse@4.3.0: 2450 | dependencies: 2451 | estraverse: 5.3.0 2452 | 2453 | estraverse@4.3.0: {} 2454 | 2455 | estraverse@5.3.0: {} 2456 | 2457 | esutils@2.0.3: {} 2458 | 2459 | fast-deep-equal@3.1.3: {} 2460 | 2461 | fast-json-stable-stringify@2.1.0: {} 2462 | 2463 | fast-levenshtein@2.0.6: {} 2464 | 2465 | fdir@6.4.4(picomatch@4.0.2): 2466 | optionalDependencies: 2467 | picomatch: 4.0.2 2468 | 2469 | file-entry-cache@8.0.0: 2470 | dependencies: 2471 | flat-cache: 4.0.1 2472 | 2473 | find-up@5.0.0: 2474 | dependencies: 2475 | locate-path: 6.0.0 2476 | path-exists: 4.0.0 2477 | 2478 | flat-cache@4.0.1: 2479 | dependencies: 2480 | flatted: 3.3.3 2481 | keyv: 4.5.4 2482 | 2483 | flatted@3.3.3: {} 2484 | 2485 | follow-redirects@1.15.9: {} 2486 | 2487 | for-each@0.3.5: 2488 | dependencies: 2489 | is-callable: 1.2.7 2490 | 2491 | form-data@4.0.2: 2492 | dependencies: 2493 | asynckit: 0.4.0 2494 | combined-stream: 1.0.8 2495 | es-set-tostringtag: 2.1.0 2496 | mime-types: 2.1.35 2497 | 2498 | fsevents@2.3.3: 2499 | optional: true 2500 | 2501 | function-bind@1.1.2: {} 2502 | 2503 | function.prototype.name@1.1.8: 2504 | dependencies: 2505 | call-bind: 1.0.8 2506 | call-bound: 1.0.4 2507 | define-properties: 1.2.1 2508 | functions-have-names: 1.2.3 2509 | hasown: 2.0.2 2510 | is-callable: 1.2.7 2511 | 2512 | functions-have-names@1.2.3: {} 2513 | 2514 | gensync@1.0.0-beta.2: {} 2515 | 2516 | get-intrinsic@1.3.0: 2517 | dependencies: 2518 | call-bind-apply-helpers: 1.0.2 2519 | es-define-property: 1.0.1 2520 | es-errors: 1.3.0 2521 | es-object-atoms: 1.1.1 2522 | function-bind: 1.1.2 2523 | get-proto: 1.0.1 2524 | gopd: 1.2.0 2525 | has-symbols: 1.1.0 2526 | hasown: 2.0.2 2527 | math-intrinsics: 1.1.0 2528 | 2529 | get-proto@1.0.1: 2530 | dependencies: 2531 | dunder-proto: 1.0.1 2532 | es-object-atoms: 1.1.1 2533 | 2534 | get-symbol-description@1.1.0: 2535 | dependencies: 2536 | call-bound: 1.0.4 2537 | es-errors: 1.3.0 2538 | get-intrinsic: 1.3.0 2539 | 2540 | glob-parent@6.0.2: 2541 | dependencies: 2542 | is-glob: 4.0.3 2543 | 2544 | globals@11.12.0: {} 2545 | 2546 | globals@14.0.0: {} 2547 | 2548 | globals@16.1.0: {} 2549 | 2550 | globalthis@1.0.4: 2551 | dependencies: 2552 | define-properties: 1.2.1 2553 | gopd: 1.2.0 2554 | 2555 | gopd@1.2.0: {} 2556 | 2557 | has-bigints@1.1.0: {} 2558 | 2559 | has-flag@4.0.0: {} 2560 | 2561 | has-property-descriptors@1.0.2: 2562 | dependencies: 2563 | es-define-property: 1.0.1 2564 | 2565 | has-proto@1.2.0: 2566 | dependencies: 2567 | dunder-proto: 1.0.1 2568 | 2569 | has-symbols@1.1.0: {} 2570 | 2571 | has-tostringtag@1.0.2: 2572 | dependencies: 2573 | has-symbols: 1.1.0 2574 | 2575 | hasown@2.0.2: 2576 | dependencies: 2577 | function-bind: 1.1.2 2578 | 2579 | ignore@5.3.2: {} 2580 | 2581 | import-fresh@3.3.1: 2582 | dependencies: 2583 | parent-module: 1.0.1 2584 | resolve-from: 4.0.0 2585 | 2586 | imurmurhash@0.1.4: {} 2587 | 2588 | internal-slot@1.1.0: 2589 | dependencies: 2590 | es-errors: 1.3.0 2591 | hasown: 2.0.2 2592 | side-channel: 1.1.0 2593 | 2594 | is-array-buffer@3.0.5: 2595 | dependencies: 2596 | call-bind: 1.0.8 2597 | call-bound: 1.0.4 2598 | get-intrinsic: 1.3.0 2599 | 2600 | is-async-function@2.1.1: 2601 | dependencies: 2602 | async-function: 1.0.0 2603 | call-bound: 1.0.4 2604 | get-proto: 1.0.1 2605 | has-tostringtag: 1.0.2 2606 | safe-regex-test: 1.1.0 2607 | 2608 | is-bigint@1.1.0: 2609 | dependencies: 2610 | has-bigints: 1.1.0 2611 | 2612 | is-boolean-object@1.2.2: 2613 | dependencies: 2614 | call-bound: 1.0.4 2615 | has-tostringtag: 1.0.2 2616 | 2617 | is-callable@1.2.7: {} 2618 | 2619 | is-core-module@2.16.1: 2620 | dependencies: 2621 | hasown: 2.0.2 2622 | 2623 | is-data-view@1.0.2: 2624 | dependencies: 2625 | call-bound: 1.0.4 2626 | get-intrinsic: 1.3.0 2627 | is-typed-array: 1.1.15 2628 | 2629 | is-date-object@1.1.0: 2630 | dependencies: 2631 | call-bound: 1.0.4 2632 | has-tostringtag: 1.0.2 2633 | 2634 | is-extglob@2.1.1: {} 2635 | 2636 | is-finalizationregistry@1.1.1: 2637 | dependencies: 2638 | call-bound: 1.0.4 2639 | 2640 | is-generator-function@1.1.0: 2641 | dependencies: 2642 | call-bound: 1.0.4 2643 | get-proto: 1.0.1 2644 | has-tostringtag: 1.0.2 2645 | safe-regex-test: 1.1.0 2646 | 2647 | is-glob@4.0.3: 2648 | dependencies: 2649 | is-extglob: 2.1.1 2650 | 2651 | is-map@2.0.3: {} 2652 | 2653 | is-number-object@1.1.1: 2654 | dependencies: 2655 | call-bound: 1.0.4 2656 | has-tostringtag: 1.0.2 2657 | 2658 | is-regex@1.2.1: 2659 | dependencies: 2660 | call-bound: 1.0.4 2661 | gopd: 1.2.0 2662 | has-tostringtag: 1.0.2 2663 | hasown: 2.0.2 2664 | 2665 | is-set@2.0.3: {} 2666 | 2667 | is-shared-array-buffer@1.0.4: 2668 | dependencies: 2669 | call-bound: 1.0.4 2670 | 2671 | is-string@1.1.1: 2672 | dependencies: 2673 | call-bound: 1.0.4 2674 | has-tostringtag: 1.0.2 2675 | 2676 | is-symbol@1.1.1: 2677 | dependencies: 2678 | call-bound: 1.0.4 2679 | has-symbols: 1.1.0 2680 | safe-regex-test: 1.1.0 2681 | 2682 | is-typed-array@1.1.15: 2683 | dependencies: 2684 | which-typed-array: 1.1.19 2685 | 2686 | is-weakmap@2.0.2: {} 2687 | 2688 | is-weakref@1.1.1: 2689 | dependencies: 2690 | call-bound: 1.0.4 2691 | 2692 | is-weakset@2.0.4: 2693 | dependencies: 2694 | call-bound: 1.0.4 2695 | get-intrinsic: 1.3.0 2696 | 2697 | isarray@2.0.5: {} 2698 | 2699 | isexe@2.0.0: {} 2700 | 2701 | iterator.prototype@1.1.5: 2702 | dependencies: 2703 | define-data-property: 1.1.4 2704 | es-object-atoms: 1.1.1 2705 | get-intrinsic: 1.3.0 2706 | get-proto: 1.0.1 2707 | has-symbols: 1.1.0 2708 | set-function-name: 2.0.2 2709 | 2710 | js-cookie@3.0.5: {} 2711 | 2712 | js-tokens@4.0.0: {} 2713 | 2714 | js-yaml@4.1.0: 2715 | dependencies: 2716 | argparse: 2.0.1 2717 | 2718 | jsesc@3.1.0: {} 2719 | 2720 | json-buffer@3.0.1: {} 2721 | 2722 | json-schema-traverse@0.4.1: {} 2723 | 2724 | json-stable-stringify-without-jsonify@1.0.1: {} 2725 | 2726 | json5@2.2.3: {} 2727 | 2728 | jsx-ast-utils@3.3.5: 2729 | dependencies: 2730 | array-includes: 3.1.8 2731 | array.prototype.flat: 1.3.3 2732 | object.assign: 4.1.7 2733 | object.values: 1.2.1 2734 | 2735 | jwt-decode@4.0.0: {} 2736 | 2737 | keyv@4.5.4: 2738 | dependencies: 2739 | json-buffer: 3.0.1 2740 | 2741 | levn@0.4.1: 2742 | dependencies: 2743 | prelude-ls: 1.2.1 2744 | type-check: 0.4.0 2745 | 2746 | locate-path@6.0.0: 2747 | dependencies: 2748 | p-locate: 5.0.0 2749 | 2750 | lodash.merge@4.6.2: {} 2751 | 2752 | loose-envify@1.4.0: 2753 | dependencies: 2754 | js-tokens: 4.0.0 2755 | 2756 | lru-cache@5.1.1: 2757 | dependencies: 2758 | yallist: 3.1.1 2759 | 2760 | math-intrinsics@1.1.0: {} 2761 | 2762 | mime-db@1.52.0: {} 2763 | 2764 | mime-types@2.1.35: 2765 | dependencies: 2766 | mime-db: 1.52.0 2767 | 2768 | minimatch@3.1.2: 2769 | dependencies: 2770 | brace-expansion: 1.1.11 2771 | 2772 | ms@2.1.3: {} 2773 | 2774 | nanoid@3.3.11: {} 2775 | 2776 | natural-compare@1.4.0: {} 2777 | 2778 | node-releases@2.0.19: {} 2779 | 2780 | object-assign@4.1.1: {} 2781 | 2782 | object-inspect@1.13.4: {} 2783 | 2784 | object-keys@1.1.1: {} 2785 | 2786 | object.assign@4.1.7: 2787 | dependencies: 2788 | call-bind: 1.0.8 2789 | call-bound: 1.0.4 2790 | define-properties: 1.2.1 2791 | es-object-atoms: 1.1.1 2792 | has-symbols: 1.1.0 2793 | object-keys: 1.1.1 2794 | 2795 | object.entries@1.1.9: 2796 | dependencies: 2797 | call-bind: 1.0.8 2798 | call-bound: 1.0.4 2799 | define-properties: 1.2.1 2800 | es-object-atoms: 1.1.1 2801 | 2802 | object.fromentries@2.0.8: 2803 | dependencies: 2804 | call-bind: 1.0.8 2805 | define-properties: 1.2.1 2806 | es-abstract: 1.23.10 2807 | es-object-atoms: 1.1.1 2808 | 2809 | object.values@1.2.1: 2810 | dependencies: 2811 | call-bind: 1.0.8 2812 | call-bound: 1.0.4 2813 | define-properties: 1.2.1 2814 | es-object-atoms: 1.1.1 2815 | 2816 | optionator@0.9.4: 2817 | dependencies: 2818 | deep-is: 0.1.4 2819 | fast-levenshtein: 2.0.6 2820 | levn: 0.4.1 2821 | prelude-ls: 1.2.1 2822 | type-check: 0.4.0 2823 | word-wrap: 1.2.5 2824 | 2825 | own-keys@1.0.1: 2826 | dependencies: 2827 | get-intrinsic: 1.3.0 2828 | object-keys: 1.1.1 2829 | safe-push-apply: 1.0.0 2830 | 2831 | p-limit@3.1.0: 2832 | dependencies: 2833 | yocto-queue: 0.1.0 2834 | 2835 | p-locate@5.0.0: 2836 | dependencies: 2837 | p-limit: 3.1.0 2838 | 2839 | parent-module@1.0.1: 2840 | dependencies: 2841 | callsites: 3.1.0 2842 | 2843 | path-exists@4.0.0: {} 2844 | 2845 | path-key@3.1.1: {} 2846 | 2847 | path-parse@1.0.7: {} 2848 | 2849 | picocolors@1.1.1: {} 2850 | 2851 | picomatch@4.0.2: {} 2852 | 2853 | possible-typed-array-names@1.1.0: {} 2854 | 2855 | postcss@8.5.3: 2856 | dependencies: 2857 | nanoid: 3.3.11 2858 | picocolors: 1.1.1 2859 | source-map-js: 1.2.1 2860 | 2861 | prelude-ls@1.2.1: {} 2862 | 2863 | prettier@3.5.3: {} 2864 | 2865 | prop-types@15.8.1: 2866 | dependencies: 2867 | loose-envify: 1.4.0 2868 | object-assign: 4.1.1 2869 | react-is: 16.13.1 2870 | 2871 | proxy-from-env@1.1.0: {} 2872 | 2873 | punycode@2.3.1: {} 2874 | 2875 | react-dom@18.3.1(react@18.3.1): 2876 | dependencies: 2877 | loose-envify: 1.4.0 2878 | react: 18.3.1 2879 | scheduler: 0.23.2 2880 | 2881 | react-is@16.13.1: {} 2882 | 2883 | react-refresh@0.17.0: {} 2884 | 2885 | react-router-dom@6.30.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 2886 | dependencies: 2887 | '@remix-run/router': 1.23.0 2888 | react: 18.3.1 2889 | react-dom: 18.3.1(react@18.3.1) 2890 | react-router: 6.30.1(react@18.3.1) 2891 | 2892 | react-router@6.30.1(react@18.3.1): 2893 | dependencies: 2894 | '@remix-run/router': 1.23.0 2895 | react: 18.3.1 2896 | 2897 | react@18.3.1: 2898 | dependencies: 2899 | loose-envify: 1.4.0 2900 | 2901 | reflect.getprototypeof@1.0.10: 2902 | dependencies: 2903 | call-bind: 1.0.8 2904 | define-properties: 1.2.1 2905 | es-abstract: 1.23.10 2906 | es-errors: 1.3.0 2907 | es-object-atoms: 1.1.1 2908 | get-intrinsic: 1.3.0 2909 | get-proto: 1.0.1 2910 | which-builtin-type: 1.2.1 2911 | 2912 | regexp.prototype.flags@1.5.4: 2913 | dependencies: 2914 | call-bind: 1.0.8 2915 | define-properties: 1.2.1 2916 | es-errors: 1.3.0 2917 | get-proto: 1.0.1 2918 | gopd: 1.2.0 2919 | set-function-name: 2.0.2 2920 | 2921 | resolve-from@4.0.0: {} 2922 | 2923 | resolve@2.0.0-next.5: 2924 | dependencies: 2925 | is-core-module: 2.16.1 2926 | path-parse: 1.0.7 2927 | supports-preserve-symlinks-flag: 1.0.0 2928 | 2929 | rollup@4.41.1: 2930 | dependencies: 2931 | '@types/estree': 1.0.7 2932 | optionalDependencies: 2933 | '@rollup/rollup-android-arm-eabi': 4.41.1 2934 | '@rollup/rollup-android-arm64': 4.41.1 2935 | '@rollup/rollup-darwin-arm64': 4.41.1 2936 | '@rollup/rollup-darwin-x64': 4.41.1 2937 | '@rollup/rollup-freebsd-arm64': 4.41.1 2938 | '@rollup/rollup-freebsd-x64': 4.41.1 2939 | '@rollup/rollup-linux-arm-gnueabihf': 4.41.1 2940 | '@rollup/rollup-linux-arm-musleabihf': 4.41.1 2941 | '@rollup/rollup-linux-arm64-gnu': 4.41.1 2942 | '@rollup/rollup-linux-arm64-musl': 4.41.1 2943 | '@rollup/rollup-linux-loongarch64-gnu': 4.41.1 2944 | '@rollup/rollup-linux-powerpc64le-gnu': 4.41.1 2945 | '@rollup/rollup-linux-riscv64-gnu': 4.41.1 2946 | '@rollup/rollup-linux-riscv64-musl': 4.41.1 2947 | '@rollup/rollup-linux-s390x-gnu': 4.41.1 2948 | '@rollup/rollup-linux-x64-gnu': 4.41.1 2949 | '@rollup/rollup-linux-x64-musl': 4.41.1 2950 | '@rollup/rollup-win32-arm64-msvc': 4.41.1 2951 | '@rollup/rollup-win32-ia32-msvc': 4.41.1 2952 | '@rollup/rollup-win32-x64-msvc': 4.41.1 2953 | fsevents: 2.3.3 2954 | 2955 | safe-array-concat@1.1.3: 2956 | dependencies: 2957 | call-bind: 1.0.8 2958 | call-bound: 1.0.4 2959 | get-intrinsic: 1.3.0 2960 | has-symbols: 1.1.0 2961 | isarray: 2.0.5 2962 | 2963 | safe-push-apply@1.0.0: 2964 | dependencies: 2965 | es-errors: 1.3.0 2966 | isarray: 2.0.5 2967 | 2968 | safe-regex-test@1.1.0: 2969 | dependencies: 2970 | call-bound: 1.0.4 2971 | es-errors: 1.3.0 2972 | is-regex: 1.2.1 2973 | 2974 | scheduler@0.23.2: 2975 | dependencies: 2976 | loose-envify: 1.4.0 2977 | 2978 | semver@6.3.1: {} 2979 | 2980 | set-function-length@1.2.2: 2981 | dependencies: 2982 | define-data-property: 1.1.4 2983 | es-errors: 1.3.0 2984 | function-bind: 1.1.2 2985 | get-intrinsic: 1.3.0 2986 | gopd: 1.2.0 2987 | has-property-descriptors: 1.0.2 2988 | 2989 | set-function-name@2.0.2: 2990 | dependencies: 2991 | define-data-property: 1.1.4 2992 | es-errors: 1.3.0 2993 | functions-have-names: 1.2.3 2994 | has-property-descriptors: 1.0.2 2995 | 2996 | set-proto@1.0.0: 2997 | dependencies: 2998 | dunder-proto: 1.0.1 2999 | es-errors: 1.3.0 3000 | es-object-atoms: 1.1.1 3001 | 3002 | shebang-command@2.0.0: 3003 | dependencies: 3004 | shebang-regex: 3.0.0 3005 | 3006 | shebang-regex@3.0.0: {} 3007 | 3008 | side-channel-list@1.0.0: 3009 | dependencies: 3010 | es-errors: 1.3.0 3011 | object-inspect: 1.13.4 3012 | 3013 | side-channel-map@1.0.1: 3014 | dependencies: 3015 | call-bound: 1.0.4 3016 | es-errors: 1.3.0 3017 | get-intrinsic: 1.3.0 3018 | object-inspect: 1.13.4 3019 | 3020 | side-channel-weakmap@1.0.2: 3021 | dependencies: 3022 | call-bound: 1.0.4 3023 | es-errors: 1.3.0 3024 | get-intrinsic: 1.3.0 3025 | object-inspect: 1.13.4 3026 | side-channel-map: 1.0.1 3027 | 3028 | side-channel@1.1.0: 3029 | dependencies: 3030 | es-errors: 1.3.0 3031 | object-inspect: 1.13.4 3032 | side-channel-list: 1.0.0 3033 | side-channel-map: 1.0.1 3034 | side-channel-weakmap: 1.0.2 3035 | 3036 | simple-zustand-devtools@1.1.0(@types/react-dom@18.3.7(@types/react@18.3.22))(@types/react@18.3.22)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zustand@5.0.5(@types/react@18.3.22)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1))): 3037 | dependencies: 3038 | '@types/react': 18.3.22 3039 | '@types/react-dom': 18.3.7(@types/react@18.3.22) 3040 | react: 18.3.1 3041 | react-dom: 18.3.1(react@18.3.1) 3042 | zustand: 5.0.5(@types/react@18.3.22)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) 3043 | 3044 | source-map-js@1.2.1: {} 3045 | 3046 | string.prototype.matchall@4.0.12: 3047 | dependencies: 3048 | call-bind: 1.0.8 3049 | call-bound: 1.0.4 3050 | define-properties: 1.2.1 3051 | es-abstract: 1.23.10 3052 | es-errors: 1.3.0 3053 | es-object-atoms: 1.1.1 3054 | get-intrinsic: 1.3.0 3055 | gopd: 1.2.0 3056 | has-symbols: 1.1.0 3057 | internal-slot: 1.1.0 3058 | regexp.prototype.flags: 1.5.4 3059 | set-function-name: 2.0.2 3060 | side-channel: 1.1.0 3061 | 3062 | string.prototype.repeat@1.0.0: 3063 | dependencies: 3064 | define-properties: 1.2.1 3065 | es-abstract: 1.23.10 3066 | 3067 | string.prototype.trim@1.2.10: 3068 | dependencies: 3069 | call-bind: 1.0.8 3070 | call-bound: 1.0.4 3071 | define-data-property: 1.1.4 3072 | define-properties: 1.2.1 3073 | es-abstract: 1.23.10 3074 | es-object-atoms: 1.1.1 3075 | has-property-descriptors: 1.0.2 3076 | 3077 | string.prototype.trimend@1.0.9: 3078 | dependencies: 3079 | call-bind: 1.0.8 3080 | call-bound: 1.0.4 3081 | define-properties: 1.2.1 3082 | es-object-atoms: 1.1.1 3083 | 3084 | string.prototype.trimstart@1.0.8: 3085 | dependencies: 3086 | call-bind: 1.0.8 3087 | define-properties: 1.2.1 3088 | es-object-atoms: 1.1.1 3089 | 3090 | strip-json-comments@3.1.1: {} 3091 | 3092 | supports-color@7.2.0: 3093 | dependencies: 3094 | has-flag: 4.0.0 3095 | 3096 | supports-preserve-symlinks-flag@1.0.0: {} 3097 | 3098 | tinyglobby@0.2.13: 3099 | dependencies: 3100 | fdir: 6.4.4(picomatch@4.0.2) 3101 | picomatch: 4.0.2 3102 | 3103 | type-check@0.4.0: 3104 | dependencies: 3105 | prelude-ls: 1.2.1 3106 | 3107 | typed-array-buffer@1.0.3: 3108 | dependencies: 3109 | call-bound: 1.0.4 3110 | es-errors: 1.3.0 3111 | is-typed-array: 1.1.15 3112 | 3113 | typed-array-byte-length@1.0.3: 3114 | dependencies: 3115 | call-bind: 1.0.8 3116 | for-each: 0.3.5 3117 | gopd: 1.2.0 3118 | has-proto: 1.2.0 3119 | is-typed-array: 1.1.15 3120 | 3121 | typed-array-byte-offset@1.0.4: 3122 | dependencies: 3123 | available-typed-arrays: 1.0.7 3124 | call-bind: 1.0.8 3125 | for-each: 0.3.5 3126 | gopd: 1.2.0 3127 | has-proto: 1.2.0 3128 | is-typed-array: 1.1.15 3129 | reflect.getprototypeof: 1.0.10 3130 | 3131 | typed-array-length@1.0.7: 3132 | dependencies: 3133 | call-bind: 1.0.8 3134 | for-each: 0.3.5 3135 | gopd: 1.2.0 3136 | is-typed-array: 1.1.15 3137 | possible-typed-array-names: 1.1.0 3138 | reflect.getprototypeof: 1.0.10 3139 | 3140 | unbox-primitive@1.1.0: 3141 | dependencies: 3142 | call-bound: 1.0.4 3143 | has-bigints: 1.1.0 3144 | has-symbols: 1.1.0 3145 | which-boxed-primitive: 1.1.1 3146 | 3147 | update-browserslist-db@1.1.3(browserslist@4.24.5): 3148 | dependencies: 3149 | browserslist: 4.24.5 3150 | escalade: 3.2.0 3151 | picocolors: 1.1.1 3152 | 3153 | uri-js@4.4.1: 3154 | dependencies: 3155 | punycode: 2.3.1 3156 | 3157 | use-sync-external-store@1.5.0(react@18.3.1): 3158 | dependencies: 3159 | react: 18.3.1 3160 | optional: true 3161 | 3162 | vite@6.3.5: 3163 | dependencies: 3164 | esbuild: 0.25.4 3165 | fdir: 6.4.4(picomatch@4.0.2) 3166 | picomatch: 4.0.2 3167 | postcss: 8.5.3 3168 | rollup: 4.41.1 3169 | tinyglobby: 0.2.13 3170 | optionalDependencies: 3171 | fsevents: 2.3.3 3172 | 3173 | which-boxed-primitive@1.1.1: 3174 | dependencies: 3175 | is-bigint: 1.1.0 3176 | is-boolean-object: 1.2.2 3177 | is-number-object: 1.1.1 3178 | is-string: 1.1.1 3179 | is-symbol: 1.1.1 3180 | 3181 | which-builtin-type@1.2.1: 3182 | dependencies: 3183 | call-bound: 1.0.4 3184 | function.prototype.name: 1.1.8 3185 | has-tostringtag: 1.0.2 3186 | is-async-function: 2.1.1 3187 | is-date-object: 1.1.0 3188 | is-finalizationregistry: 1.1.1 3189 | is-generator-function: 1.1.0 3190 | is-regex: 1.2.1 3191 | is-weakref: 1.1.1 3192 | isarray: 2.0.5 3193 | which-boxed-primitive: 1.1.1 3194 | which-collection: 1.0.2 3195 | which-typed-array: 1.1.19 3196 | 3197 | which-collection@1.0.2: 3198 | dependencies: 3199 | is-map: 2.0.3 3200 | is-set: 2.0.3 3201 | is-weakmap: 2.0.2 3202 | is-weakset: 2.0.4 3203 | 3204 | which-typed-array@1.1.19: 3205 | dependencies: 3206 | available-typed-arrays: 1.0.7 3207 | call-bind: 1.0.8 3208 | call-bound: 1.0.4 3209 | for-each: 0.3.5 3210 | get-proto: 1.0.1 3211 | gopd: 1.2.0 3212 | has-tostringtag: 1.0.2 3213 | 3214 | which@2.0.2: 3215 | dependencies: 3216 | isexe: 2.0.0 3217 | 3218 | word-wrap@1.2.5: {} 3219 | 3220 | yallist@3.1.1: {} 3221 | 3222 | yocto-queue@0.1.0: {} 3223 | 3224 | zustand@5.0.5(@types/react@18.3.22)(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)): 3225 | optionalDependencies: 3226 | '@types/react': 18.3.22 3227 | react: 18.3.1 3228 | use-sync-external-store: 1.5.0(react@18.3.1) 3229 | --------------------------------------------------------------------------------