From 4bbb496724280764cb67f570d5cd160d3a9a1543 Mon Sep 17 00:00:00 2001 From: caadiq Date: Tue, 7 Apr 2026 18:55:06 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B4=88=EA=B8=B0=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - React + Vite + Tailwind 프론트엔드 - Express + Sequelize + MariaDB 백엔드 - 넥슨 OAuth 2.0 인증 (캐릭터 목록 조회) - 주간 보스 결정석 수익 계산기 UI (리스트형) - Docker Compose + Caddy 리버스 프록시 설정 - 보스/난이도 이미지 에셋 포함 Co-Authored-By: Claude Opus 4.6 (1M context) --- .env | 32 + .gitignore | 20 + PLAN.md | 509 ++++ backend/lib/db.js | 13 + backend/lib/redis.js | 6 + backend/middleware/auth.js | 6 + backend/middleware/session.js | 16 + backend/models/User.js | 10 + backend/models/UserCharacter.js | 19 + backend/models/boss/Boss.js | 12 + backend/models/boss/BossDifficulty.js | 18 + backend/models/boss/UserBossSelection.js | 17 + backend/models/index.js | 21 + backend/package-lock.json | 3169 ++++++++++++++++++++++ backend/package.json | 23 + backend/routes/auth.js | 66 + backend/routes/boss/bosses.js | 23 + backend/routes/boss/calculate.js | 31 + backend/routes/boss/selections.js | 58 + backend/routes/characters.js | 63 + backend/server.js | 49 + backend/services/boss/calculator.js | 60 + backend/services/nexon.js | 62 + docker-compose.yml | 49 + frontend/.gitignore | 25 + frontend/README.md | 16 + frontend/eslint.config.js | 29 + frontend/index.html | 13 + frontend/package-lock.json | 2995 ++++++++++++++++++++ frontend/package.json | 30 + frontend/public/favicon.svg | 1 + frontend/src/App.jsx | 15 + frontend/src/api/client.js | 15 + frontend/src/components/Layout.jsx | 21 + frontend/src/components/LoginButton.jsx | 27 + frontend/src/features/boss/BossPage.jsx | 128 + frontend/src/hooks/useAuth.js | 21 + frontend/src/hooks/useCharacters.js | 35 + frontend/src/index.css | 1 + frontend/src/main.jsx | 13 + frontend/src/pages/Home.jsx | 22 + frontend/vite.config.js | 18 + images/boss/가디언엔젤슬라임.png | Bin 0 -> 4964 bytes images/boss/검은마법사.png | Bin 0 -> 11940 bytes images/boss/더스크.png | Bin 0 -> 5516 bytes images/boss/데미안.png | Bin 0 -> 5679 bytes images/boss/듄켈.png | Bin 0 -> 4677 bytes images/boss/루시드.png | Bin 0 -> 5597 bytes images/boss/림보.png | Bin 0 -> 12780 bytes images/boss/매그너스.png | Bin 0 -> 5119 bytes images/boss/반반.png | Bin 0 -> 4944 bytes images/boss/발드릭스.png | Bin 0 -> 10704 bytes images/boss/벨룸.png | Bin 0 -> 4828 bytes images/boss/블러디퀸.png | Bin 0 -> 5188 bytes images/boss/세렌.png | Bin 0 -> 5386 bytes images/boss/스우.png | Bin 0 -> 11686 bytes images/boss/시그너스.png | Bin 0 -> 5576 bytes images/boss/윌.png | Bin 0 -> 5141 bytes images/boss/유피테르.png | Bin 0 -> 11924 bytes images/boss/자쿰.png | Bin 0 -> 5895 bytes images/boss/진힐라.png | Bin 0 -> 4852 bytes images/boss/찬란한용성.png | Bin 0 -> 12164 bytes images/boss/카링.png | Bin 0 -> 5142 bytes images/boss/칼로스.png | Bin 0 -> 4650 bytes images/boss/파풀라투스.png | Bin 0 -> 5993 bytes images/boss/피에르.png | Bin 0 -> 6082 bytes images/boss/핑크빈.png | Bin 0 -> 4715 bytes images/boss/힐라.png | Bin 0 -> 6331 bytes images/difficulty/chaos.png | Bin 0 -> 1009 bytes images/difficulty/easy.png | Bin 0 -> 826 bytes images/difficulty/extreme.png | Bin 0 -> 1032 bytes images/difficulty/hard.png | Bin 0 -> 842 bytes images/difficulty/normal.png | Bin 0 -> 986 bytes 73 files changed, 7777 insertions(+) create mode 100644 .env create mode 100644 .gitignore create mode 100644 PLAN.md create mode 100644 backend/lib/db.js create mode 100644 backend/lib/redis.js create mode 100644 backend/middleware/auth.js create mode 100644 backend/middleware/session.js create mode 100644 backend/models/User.js create mode 100644 backend/models/UserCharacter.js create mode 100644 backend/models/boss/Boss.js create mode 100644 backend/models/boss/BossDifficulty.js create mode 100644 backend/models/boss/UserBossSelection.js create mode 100644 backend/models/index.js create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/routes/auth.js create mode 100644 backend/routes/boss/bosses.js create mode 100644 backend/routes/boss/calculate.js create mode 100644 backend/routes/boss/selections.js create mode 100644 backend/routes/characters.js create mode 100644 backend/server.js create mode 100644 backend/services/boss/calculator.js create mode 100644 backend/services/nexon.js create mode 100644 docker-compose.yml create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/eslint.config.js create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/favicon.svg create mode 100644 frontend/src/App.jsx create mode 100644 frontend/src/api/client.js create mode 100644 frontend/src/components/Layout.jsx create mode 100644 frontend/src/components/LoginButton.jsx create mode 100644 frontend/src/features/boss/BossPage.jsx create mode 100644 frontend/src/hooks/useAuth.js create mode 100644 frontend/src/hooks/useCharacters.js create mode 100644 frontend/src/index.css create mode 100644 frontend/src/main.jsx create mode 100644 frontend/src/pages/Home.jsx create mode 100644 frontend/vite.config.js create mode 100644 images/boss/가디언엔젤슬라임.png create mode 100644 images/boss/검은마법사.png create mode 100644 images/boss/더스크.png create mode 100644 images/boss/데미안.png create mode 100644 images/boss/듄켈.png create mode 100644 images/boss/루시드.png create mode 100644 images/boss/림보.png create mode 100644 images/boss/매그너스.png create mode 100644 images/boss/반반.png create mode 100644 images/boss/발드릭스.png create mode 100644 images/boss/벨룸.png create mode 100644 images/boss/블러디퀸.png create mode 100644 images/boss/세렌.png create mode 100644 images/boss/스우.png create mode 100644 images/boss/시그너스.png create mode 100644 images/boss/윌.png create mode 100644 images/boss/유피테르.png create mode 100644 images/boss/자쿰.png create mode 100644 images/boss/진힐라.png create mode 100644 images/boss/찬란한용성.png create mode 100644 images/boss/카링.png create mode 100644 images/boss/칼로스.png create mode 100644 images/boss/파풀라투스.png create mode 100644 images/boss/피에르.png create mode 100644 images/boss/핑크빈.png create mode 100644 images/boss/힐라.png create mode 100644 images/difficulty/chaos.png create mode 100644 images/difficulty/easy.png create mode 100644 images/difficulty/extreme.png create mode 100644 images/difficulty/hard.png create mode 100644 images/difficulty/normal.png diff --git a/.env b/.env new file mode 100644 index 0000000..dc00469 --- /dev/null +++ b/.env @@ -0,0 +1,32 @@ +# DB (기존 MariaDB 활용) +DB_HOST=mariadb +DB_PORT=3306 +DB_USER=maplestory +DB_PASSWORD=xSMK3sG9DG9Vn2dQ +DB_NAME=maplestory + +# Redis (세션 저장) +REDIS_HOST=redis +REDIS_PORT=6379 + +# RustFS (S3 호환 스토리지) +S3_ENDPOINT=http://rustfs:9000 +S3_PUBLIC_URL=https://s3.caadiq.co.kr +S3_ACCESS_KEY= +S3_SECRET_KEY= +S3_BUCKET=maplestory + +# 넥슨 OAuth +NEXON_CLIENT_ID= +NEXON_CLIENT_SECRET= +NEXON_REDIRECT_URI=https://maple.caadiq.co.kr/api/auth/callback + +# 넥슨 API (캐릭터 상세 조회용) +NEXON_API_KEY= + +# 세션 +SESSION_SECRET= + +# 앱 +NODE_ENV=development +PORT=3000 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0755fe --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +node_modules/ + +# Logs +*.log +npm-debug.log* + +# OS +.DS_Store +Thumbs.db + +# IDE +.idea/ +.vscode/ +*.swp +*.swo + +# Build +dist/ +build/ diff --git a/PLAN.md b/PLAN.md new file mode 100644 index 0000000..58303be --- /dev/null +++ b/PLAN.md @@ -0,0 +1,509 @@ +# 메이플스토리 도우미 (maple.caadiq.co.kr) - 최종 계획서 + +> 첫 번째 기능: 주간 보스 수익 계산기. 추후 다른 기능 확장 가능. + +## 1. 프로젝트 개요 + +넥슨 OAuth 로그인으로 내 캐릭터 목록을 자동으로 불러온 뒤, 각 캐릭터별로 클리어 가능한 주간 보스를 선택하면 **주간 결정석 수익(메소)**을 자동 계산해주는 웹 애플리케이션. + +## 2. 기술 스택 + +| 구분 | 기술 | 선택 이유 | +|---|---|---| +| Frontend | React + Vite + Tailwind CSS | 기존 레포 프로젝트들과 동일 스택 | +| Backend | Express (Node.js) | OAuth 토큰 관리, API 프록시 | +| DB | MariaDB | 기존 인프라 활용 (`db` 네트워크) | +| ORM | Sequelize | 기존 mailbox 프로젝트와 동일 | +| 세션 | express-session + Redis | 토큰 서버사이드 관리 | +| 배포 | Docker Compose + Caddy | 기존 인프라와 일관성 | + +## 3. 넥슨 OAuth 2.0 인증 흐름 + +### 3.1 사전 준비 + +1. [openapi.nexon.com](https://openapi.nexon.com) 에서 Friends Application 등록 +2. 플랫폼: Web, Redirect URI 설정 (예: `https://maple.caadiq.co.kr/api/auth/callback`) +3. 활용 데이터 항목: `maplestory.characterlist` 선택 +4. Client ID, Client Secret 발급 + +### 3.2 인증 흐름 + +``` +[프론트엔드] [백엔드] [넥슨] + │ │ │ + │ 1. 로그인 버튼 클릭 │ │ + │ ──────────────────────────> │ │ + │ │ 2. state 생성 + 세션 저장 │ + │ 3. 넥슨 로그인 페이지 리다이렉트 │ + │ ─────────────────────────────────────────────────────> │ + │ │ │ + │ │ 4. redirect_uri?code=XXX │ + │ │ <───────────────────────── │ + │ │ │ + │ │ 5. POST /oauth2/token │ + │ │ (code + client_secret) │ + │ │ ────────────────────────> │ + │ │ │ + │ │ 6. access_token 응답 │ + │ │ <───────────────────────── │ + │ │ │ + │ │ 7. 토큰을 세션에 저장 │ + │ 8. 로그인 완료 리다이렉트 │ │ + │ <────────────────────────── │ │ +``` + +### 3.3 OAuth 엔드포인트 정리 + +| 용도 | Method | URL | +|---|---|---| +| 인가 코드 발급 | GET | `https://openid.nexon.com/oauth2/authorize` | +| 토큰 발급 | POST | `https://openid.nexon.com/oauth2/token` | +| 토큰 갱신 | POST | `https://openid.nexon.com/oauth2/token` (grant_type=refresh_token) | +| 사용자 정보 | GET | `https://openid.nexon.com/api/v1/user/info` | + +### 3.4 인가 코드 요청 파라미터 + +| 파라미터 | 값 | +|---|---| +| response_type | `code` | +| client_id | 발급받은 Client ID | +| redirect_uri | `https://{도메인}/api/auth/callback` | +| scope | `maplestory.characterlist` | +| state | CSRF 방지용 랜덤 문자열 | + +### 3.5 토큰 정보 + +| 토큰 | 유효기간 | 용도 | +|---|---|---| +| access_token | 30분 | API 호출 시 `Authorization: Bearer {token}` | +| refresh_token | 14일 | access_token 만료 시 갱신 | + +### 3.6 보안 요구사항 + +- `client_secret`은 백엔드에서만 관리, 프론트엔드 노출 금지 +- `access_token`은 서버 세션(Redis)에 저장, 클라이언트에 노출 금지 +- `state` 파라미터로 CSRF 공격 방지 +- 모든 통신 HTTPS 필수 + +## 4. 넥슨 API 활용 + +### 4.1 캐릭터 목록 조회 (OAuth 필요) + +``` +GET https://open.api.nexon.com/maplestory/v1/character/list +Authorization: Bearer {access_token} +``` + +### 4.2 캐릭터 상세 조회 (API 키 사용) + +``` +GET https://open.api.nexon.com/maplestory/v1/id?character_name={name} +→ ocid 획득 + +GET https://open.api.nexon.com/maplestory/v1/character/basic?ocid={ocid} +→ 레벨, 직업, 월드, 캐릭터 이미지 +``` + +> 캐릭터 목록은 OAuth, 상세 정보는 API 키로 조회하는 하이브리드 방식. + +## 5. DB 스키마 + +### `bosses` - 보스 기본 정보 + +```sql +CREATE TABLE bosses ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + sort_order INT DEFAULT 0, + image_url VARCHAR(255), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); +``` + +### `boss_difficulties` - 보스 난이도별 정보 + +```sql +CREATE TABLE boss_difficulties ( + id INT AUTO_INCREMENT PRIMARY KEY, + boss_id INT NOT NULL, + difficulty ENUM('easy','normal','hard','chaos','extreme') NOT NULL, + crystal_price BIGINT NOT NULL, + required_level INT DEFAULT 0, + default_party_size TINYINT DEFAULT 1, + FOREIGN KEY (boss_id) REFERENCES bosses(id) ON DELETE CASCADE, + UNIQUE KEY uq_boss_diff (boss_id, difficulty) +); +``` + +### `users` - 로그인 사용자 + +```sql +CREATE TABLE users ( + id INT AUTO_INCREMENT PRIMARY KEY, + nexon_uid VARCHAR(50) NOT NULL UNIQUE, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); +``` + +### `user_characters` - 사용자 캐릭터 목록 (캐시) + +```sql +CREATE TABLE user_characters ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL, + character_name VARCHAR(50) NOT NULL, + ocid VARCHAR(100), + world_name VARCHAR(20), + job_name VARCHAR(50), + character_level INT, + character_image VARCHAR(255), + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, + UNIQUE KEY uq_user_char (user_id, character_name) +); +``` + +### `user_boss_selections` - 캐릭터별 보스 선택 + +```sql +CREATE TABLE user_boss_selections ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL, + user_character_id INT NOT NULL, + boss_difficulty_id INT NOT NULL, + party_size TINYINT NOT NULL DEFAULT 1, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, + FOREIGN KEY (user_character_id) REFERENCES user_characters(id) ON DELETE CASCADE, + FOREIGN KEY (boss_difficulty_id) REFERENCES boss_difficulties(id) ON DELETE CASCADE, + UNIQUE KEY uq_selection (user_character_id, boss_difficulty_id) +); +``` + +## 6. 수익 계산 로직 + +### 6.1 제한 조건 + +| 제한 | 값 | +|---|---| +| 캐릭터당 결정석 | 최대 **12개**/주 | +| 계정 전체 결정석 | 최대 **90개**/주 | + +### 6.2 계산 알고리즘 + +``` +입력: 각 캐릭터별 선택된 보스 목록 + 파티 인원 + +1. 각 보스의 실수익 계산: crystal_price ÷ party_size +2. 캐릭터별로 실수익 내림차순 정렬 +3. 캐릭터별 상위 12개만 유효 (캐릭터 한도 적용) +4. 모든 캐릭터의 유효 결정석을 실수익 기준으로 병합 정렬 +5. 상위 90개 선택 (계정 한도 적용) +6. 선택된 결정석의 실수익 합산 = 주간 총 수익 + +부가 정보: +- 캐릭터별 수익 소계 +- 한도 초과로 제외된 결정석 표시 +- 수익 극대화를 위한 추천 (낮은 수익 보스 → 제외 제안) +``` + +### 6.3 예시 + +``` +캐릭터A: 검마하드(500M÷6=83M), 스우하드(256M÷6=42M), ... → 12개 선택 +캐릭터B: 루시드하드(175M÷6=29M), 윌하드(140M÷6=23M), ... → 10개 선택 +캐릭터C: 노말자쿰(10M÷1=10M), ... → 8개 선택 + +합계: 30/90개, 총 수익: 약 2,400,000,000 메소 +``` + +## 7. API 엔드포인트 설계 + +### 7.1 인증 + +| Method | Path | 설명 | +|---|---|---| +| GET | `/api/auth/login` | 넥슨 OAuth 로그인 리다이렉트 | +| GET | `/api/auth/callback` | OAuth 콜백 (토큰 교환) | +| POST | `/api/auth/logout` | 로그아웃 (세션 삭제) | +| GET | `/api/auth/me` | 현재 로그인 상태 확인 | + +### 7.2 캐릭터 + +| Method | Path | 설명 | +|---|---|---| +| GET | `/api/characters` | 내 캐릭터 목록 (넥슨 API → DB 캐시) | +| POST | `/api/characters/refresh` | 캐릭터 목록 갱신 | + +### 7.3 보스 + +| Method | Path | 설명 | +|---|---|---| +| GET | `/api/bosses` | 보스 목록 + 난이도별 결정석 가격 | + +### 7.4 보스 선택 & 계산 + +| Method | Path | 설명 | +|---|---|---| +| GET | `/api/selections` | 내 캐릭터별 보스 선택 현황 | +| PUT | `/api/selections/:characterId` | 캐릭터별 보스 선택 저장 | +| GET | `/api/calculate` | 주간 수익 계산 결과 | + +## 8. 프로젝트 구조 + +``` +maplestory/ +├── docker-compose.yml +├── .env # DB, Redis, OAuth, S3 설정 +├── frontend/ +│ ├── Dockerfile +│ ├── package.json +│ ├── vite.config.js +│ ├── tailwind.config.js +│ ├── index.html +│ └── src/ +│ ├── main.jsx +│ ├── App.jsx +│ ├── components/ +│ │ ├── Layout.jsx # 공통 레이아웃 (네비게이션 포함) +│ │ └── LoginButton.jsx # 넥슨 로그인 버튼 +│ ├── features/ +│ │ └── boss/ # 보스 수익 계산기 기능 +│ │ ├── components/ +│ │ │ ├── CharacterList.jsx # 캐릭터 목록 (카드형) +│ │ │ ├── CharacterCard.jsx # 캐릭터 정보 카드 +│ │ │ ├── BossSelector.jsx # 캐릭터별 보스 선택 체크리스트 +│ │ │ ├── PartySize.jsx # 파티 인원 입력 +│ │ │ └── RevenueSummary.jsx # 수익 요약 대시보드 +│ │ ├── hooks/ +│ │ │ ├── useBosses.js # 보스 데이터 조회 +│ │ │ └── useCalculator.js # 수익 계산 +│ │ ├── utils/ +│ │ │ └── calculator.js # 수익 계산 로직 (12개/90개 제한) +│ │ └── BossPage.jsx # 보스 계산기 페이지 +│ ├── hooks/ +│ │ ├── useAuth.js # 로그인 상태 관리 +│ │ └── useCharacters.js # 캐릭터 목록 조회 +│ ├── api/ +│ │ └── client.js # API 클라이언트 (fetch wrapper) +│ └── pages/ +│ └── Home.jsx # 홈 (기능 목록) +│ +├── backend/ +│ ├── Dockerfile +│ ├── package.json +│ ├── server.js # Express 엔트리포인트 +│ ├── lib/ +│ │ ├── db.js # Sequelize 연결 +│ │ └── redis.js # Redis 연결 +│ ├── middleware/ +│ │ ├── auth.js # 세션 인증 미들웨어 +│ │ └── session.js # express-session + Redis 설정 +│ ├── routes/ +│ │ ├── auth.js # OAuth 로그인/콜백/로그아웃 +│ │ ├── characters.js # 캐릭터 목록 조회/갱신 +│ │ └── boss/ # 보스 관련 라우트 +│ │ ├── bosses.js # 보스 데이터 조회 +│ │ ├── selections.js # 보스 선택 저장/조회 +│ │ └── calculate.js # 수익 계산 +│ ├── models/ +│ │ ├── index.js # Sequelize 모델 연결 +│ │ ├── User.js +│ │ ├── UserCharacter.js +│ │ └── boss/ # 보스 관련 모델 +│ │ ├── Boss.js +│ │ ├── BossDifficulty.js +│ │ └── UserBossSelection.js +│ ├── services/ +│ │ ├── nexon.js # 넥슨 API 호출 서비스 +│ │ └── boss/ +│ │ └── calculator.js # 수익 계산 서비스 +│ └── seeders/ +│ └── boss-data.js # 초기 보스 + 결정석 데이터 시드 +│ +└── scripts/ + └── upload-boss-images.js # 보스 이미지 RustFS 업로드 스크립트 +``` + +## 9. 보스 이미지 + +### 추출 경로 (WzComparerR2) + +### 추출 경로 (WzComparerR2) + +``` +UI.wz > UIBoss.img +``` + +초상화+배경+텍스트가 하나로 합쳐진 통합 이미지 사용. + +### 저장 위치 + +기존 RustFS(S3 호환 스토리지)에 저장: + +``` +버킷: maplestory +경로: boss/images/{boss-slug}.png + +예시: + s3://maplestory/boss/images/black-mage.png + s3://maplestory/boss/images/seren.png + s3://maplestory/boss/images/lucid.png +``` + +- 내부 접근: `http://rustfs:9000/maplestory/boss/images/...` +- 외부 URL: `https://s3.caadiq.co.kr/maplestory/boss/images/...` +- DB `bosses.image_url` 컬럼에 `boss/images/{slug}.png` 경로 저장 +- 프론트엔드에서 `S3_PUBLIC_URL + image_url`로 이미지 표시 +- `scripts/upload-boss-images.js`로 로컬 PNG → RustFS 일괄 업로드 + +## 10. UI 화면 구성 + +``` +┌─────────────────────────────────────────────────────┐ +│ 메이플스토리 주간 보스 수익 계산기 │ +│ [넥슨 로그인] / [로그아웃] │ +├─────────────────────────────────────────────────────┤ +│ │ +│ 내 캐릭터 [새로고침] │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ [캐릭IMG] │ │ [캐릭IMG] │ │ [캐릭IMG] │ │ +│ │ Lv.285 │ │ Lv.275 │ │ Lv.260 │ │ +│ │ 아크메이지│ │ 나이트로드│ │ 아델 │ │ +│ │ 4/12개 │ │ 6/12개 │ │ 0/12개 │ │ +│ │ [선택] │ │ [선택] │ │ [선택] │ │ +│ └──────────┘ └──────────┘ └──────────┘ │ +│ │ +├─────────────────────────────────────────────────────┤ +│ │ +│ 아크메이지 (리부트) - 보스 선택 4/12개 사용중 │ +│ ┌───────────────────────────────────────────────┐ │ +│ │ ☑ [IMG] 검은 마법사 하드 500,000,000 ÷[6] │ │ +│ │ ☑ [IMG] 스우 하드 256,000,000 ÷[6] │ │ +│ │ ☑ [IMG] 루시드 하드 175,000,000 ÷[6] │ │ +│ │ ☑ [IMG] 윌 하드 140,000,000 ÷[6] │ │ +│ │ ☐ [IMG] 가엔슬 노말 42,000,000 ÷[1] │ │ +│ │ ☐ [IMG] 듄켈 하드 70,000,000 ÷[6] │ │ +│ │ ... │ │ +│ └───────────────────────────────────────────────┘ │ +│ │ +├─────────────────────────────────────────────────────┤ +│ │ +│ 주간 수익 요약 │ +│ ┌───────────────────────────────────────────────┐ │ +│ │ 캐릭터 결정석 수익 │ │ +│ │ ───────────────────────────────────────────── │ │ +│ │ 아크메이지 12/12 1,200,000,000 메소 │ │ +│ │ 나이트로드 10/12 800,000,000 메소 │ │ +│ │ 아델 8/12 400,000,000 메소 │ │ +│ │ ───────────────────────────────────────────── │ │ +│ │ 합계 30/90 2,400,000,000 메소 │ │ +│ │ │ │ +│ │ ⚠ 수익 최적화 팁: │ │ +│ │ 아델의 자쿰(10M)을 제외하면 다른 캐릭터에서 │ │ +│ │ 더 높은 수익 보스를 추가할 수 있습니다. │ │ +│ └───────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────┘ +``` + +## 11. Docker Compose 구성 + +```yaml +services: + frontend: + build: ./frontend + labels: + - "com.centurylinklabs.watchtower.enable=false" + networks: + - caddy + + backend: + build: ./backend + env_file: .env + depends_on: + - redis + labels: + - "com.centurylinklabs.watchtower.enable=false" + networks: + - caddy + - db + - app + + redis: + image: redis:7-alpine + volumes: + - redis-data:/data + networks: + - app + +volumes: + redis-data: + +networks: + caddy: + external: true + db: + external: true + app: + external: true +``` + +## 12. 환경 변수 (.env) + +```env +# DB (기존 MariaDB 활용) +DB_HOST=mariadb +DB_PORT=3306 +DB_USER=maplestory +DB_PASSWORD= +DB_NAME=maplestory + +# Redis (세션 저장) +REDIS_HOST=redis +REDIS_PORT=6379 + +# RustFS (S3 호환 스토리지) +S3_ENDPOINT=http://rustfs:9000 +S3_PUBLIC_URL=https://s3.caadiq.co.kr +S3_ACCESS_KEY= +S3_SECRET_KEY= +S3_BUCKET=maplestory + +# 넥슨 OAuth +NEXON_CLIENT_ID= +NEXON_CLIENT_SECRET= +NEXON_REDIRECT_URI=https://maple.caadiq.co.kr/api/auth/callback + +# 넥슨 API (캐릭터 상세 조회용) +NEXON_API_KEY= + +# 세션 +SESSION_SECRET= + +# 앱 +NODE_ENV=production +PORT=3000 +``` + +## 13. 구현 단계 + +| 단계 | 내용 | 상세 | +|---|---|---| +| **1** | 프로젝트 초기 설정 | Vite + Express 스캐폴딩, Docker, MariaDB/Redis 연결 | +| **2** | DB 스키마 + 시드 | 테이블 생성, 전체 주간 보스 결정석 데이터 시딩 | +| **3** | 넥슨 OAuth 구현 | 로그인/콜백/로그아웃, 세션 관리 | +| **4** | 캐릭터 목록 연동 | OAuth 토큰으로 캐릭터 목록 조회 + ocid로 상세 조회 | +| **5** | 보스 목록 UI | 보스 데이터 API + 프론트엔드 보스 목록 표시 | +| **6** | 캐릭터별 보스 선택 | 체크박스 UI, 파티 인원 설정, 선택 저장 | +| **7** | 수익 계산 엔진 | 12개/90개 제한 적용, 최적 조합 계산, 요약 대시보드 | +| **8** | 보스 이미지 적용 | WZ 추출 이미지 적용 | +| **9** | Docker 배포 | Dockerfile, docker-compose, Caddy 리버스 프록시 | + +## 14. 고려사항 + +- **Friends 앱 등록**: 넥슨 Open API에서 Friends Application 등록 및 검수 필요 (초기 테스트 단계에서는 5명까지 사용 가능) +- **결정석 가격 업데이트**: 패치 시 DB의 `boss_difficulties` 테이블만 업데이트 +- **토큰 갱신**: access_token 만료(30분) 시 refresh_token으로 자동 갱신 미들웨어 구현 +- **데이터 갱신 의무**: 넥슨 정책상 30일 내 데이터 갱신 필요 +- **보스 이미지 저작권**: 넥슨 게임 리소스 사용 시 저작권 고려 필요 diff --git a/backend/lib/db.js b/backend/lib/db.js new file mode 100644 index 0000000..9f439ce --- /dev/null +++ b/backend/lib/db.js @@ -0,0 +1,13 @@ +import { Sequelize } from 'sequelize'; + +export const sequelize = new Sequelize( + process.env.DB_NAME || 'maplestory', + process.env.DB_USER || 'maplestory', + process.env.DB_PASSWORD || '', + { + host: process.env.DB_HOST || 'mariadb', + port: parseInt(process.env.DB_PORT || '3306'), + dialect: 'mariadb', + logging: false, + } +); diff --git a/backend/lib/redis.js b/backend/lib/redis.js new file mode 100644 index 0000000..b113099 --- /dev/null +++ b/backend/lib/redis.js @@ -0,0 +1,6 @@ +import Redis from 'ioredis'; + +export const redis = new Redis({ + host: process.env.REDIS_HOST || 'redis', + port: parseInt(process.env.REDIS_PORT || '6379'), +}); diff --git a/backend/middleware/auth.js b/backend/middleware/auth.js new file mode 100644 index 0000000..ac81d9c --- /dev/null +++ b/backend/middleware/auth.js @@ -0,0 +1,6 @@ +export function requireAuth(req, res, next) { + if (!req.session?.userId) { + return res.status(401).json({ error: '로그인이 필요합니다' }); + } + next(); +} diff --git a/backend/middleware/session.js b/backend/middleware/session.js new file mode 100644 index 0000000..46d07dc --- /dev/null +++ b/backend/middleware/session.js @@ -0,0 +1,16 @@ +import session from 'express-session'; +import { RedisStore } from 'connect-redis'; +import { redis } from '../lib/redis.js'; + +export const sessionMiddleware = session({ + store: new RedisStore({ client: redis, prefix: 'maple:sess:' }), + secret: process.env.SESSION_SECRET || 'dev-secret', + resave: false, + saveUninitialized: false, + cookie: { + secure: process.env.NODE_ENV === 'production', + httpOnly: true, + maxAge: 14 * 24 * 60 * 60 * 1000, // 14일 + sameSite: 'lax', + }, +}); diff --git a/backend/models/User.js b/backend/models/User.js new file mode 100644 index 0000000..633b72e --- /dev/null +++ b/backend/models/User.js @@ -0,0 +1,10 @@ +import { DataTypes } from 'sequelize'; +import { sequelize } from '../lib/db.js'; + +export const User = sequelize.define('User', { + id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true }, + nexon_uid: { type: DataTypes.STRING(50), allowNull: false, unique: true }, +}, { + tableName: 'users', + underscored: true, +}); diff --git a/backend/models/UserCharacter.js b/backend/models/UserCharacter.js new file mode 100644 index 0000000..ab94701 --- /dev/null +++ b/backend/models/UserCharacter.js @@ -0,0 +1,19 @@ +import { DataTypes } from 'sequelize'; +import { sequelize } from '../lib/db.js'; + +export const UserCharacter = sequelize.define('UserCharacter', { + id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true }, + user_id: { type: DataTypes.INTEGER, allowNull: false }, + character_name: { type: DataTypes.STRING(50), allowNull: false }, + ocid: { type: DataTypes.STRING(100) }, + world_name: { type: DataTypes.STRING(20) }, + job_name: { type: DataTypes.STRING(50) }, + character_level: { type: DataTypes.INTEGER }, + character_image: { type: DataTypes.STRING(255) }, +}, { + tableName: 'user_characters', + underscored: true, + indexes: [ + { unique: true, fields: ['user_id', 'character_name'] }, + ], +}); diff --git a/backend/models/boss/Boss.js b/backend/models/boss/Boss.js new file mode 100644 index 0000000..95f1338 --- /dev/null +++ b/backend/models/boss/Boss.js @@ -0,0 +1,12 @@ +import { DataTypes } from 'sequelize'; +import { sequelize } from '../../lib/db.js'; + +export const Boss = sequelize.define('Boss', { + id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true }, + name: { type: DataTypes.STRING(50), allowNull: false }, + sort_order: { type: DataTypes.INTEGER, defaultValue: 0 }, + image_url: { type: DataTypes.STRING(255) }, +}, { + tableName: 'bosses', + underscored: true, +}); diff --git a/backend/models/boss/BossDifficulty.js b/backend/models/boss/BossDifficulty.js new file mode 100644 index 0000000..3556b2f --- /dev/null +++ b/backend/models/boss/BossDifficulty.js @@ -0,0 +1,18 @@ +import { DataTypes } from 'sequelize'; +import { sequelize } from '../../lib/db.js'; + +export const BossDifficulty = sequelize.define('BossDifficulty', { + id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true }, + boss_id: { type: DataTypes.INTEGER, allowNull: false }, + difficulty: { type: DataTypes.ENUM('easy', 'normal', 'hard', 'chaos', 'extreme'), allowNull: false }, + crystal_price: { type: DataTypes.BIGINT, allowNull: false }, + required_level: { type: DataTypes.INTEGER, defaultValue: 0 }, + max_party_size: { type: DataTypes.TINYINT, defaultValue: 1 }, +}, { + tableName: 'boss_difficulties', + underscored: true, + timestamps: false, + indexes: [ + { unique: true, fields: ['boss_id', 'difficulty'] }, + ], +}); diff --git a/backend/models/boss/UserBossSelection.js b/backend/models/boss/UserBossSelection.js new file mode 100644 index 0000000..352b3c1 --- /dev/null +++ b/backend/models/boss/UserBossSelection.js @@ -0,0 +1,17 @@ +import { DataTypes } from 'sequelize'; +import { sequelize } from '../../lib/db.js'; + +export const UserBossSelection = sequelize.define('UserBossSelection', { + id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true }, + user_id: { type: DataTypes.INTEGER, allowNull: false }, + user_character_id: { type: DataTypes.INTEGER, allowNull: false }, + boss_difficulty_id: { type: DataTypes.INTEGER, allowNull: false }, + party_size: { type: DataTypes.TINYINT, allowNull: false, defaultValue: 1 }, +}, { + tableName: 'user_boss_selections', + underscored: true, + timestamps: false, + indexes: [ + { unique: true, fields: ['user_character_id', 'boss_difficulty_id'] }, + ], +}); diff --git a/backend/models/index.js b/backend/models/index.js new file mode 100644 index 0000000..7dd5b9e --- /dev/null +++ b/backend/models/index.js @@ -0,0 +1,21 @@ +import { User } from './User.js'; +import { UserCharacter } from './UserCharacter.js'; +import { Boss } from './boss/Boss.js'; +import { BossDifficulty } from './boss/BossDifficulty.js'; +import { UserBossSelection } from './boss/UserBossSelection.js'; + +// User <-> UserCharacter +User.hasMany(UserCharacter, { foreignKey: 'user_id', as: 'characters' }); +UserCharacter.belongsTo(User, { foreignKey: 'user_id' }); + +// Boss <-> BossDifficulty +Boss.hasMany(BossDifficulty, { foreignKey: 'boss_id', as: 'difficulties' }); +BossDifficulty.belongsTo(Boss, { foreignKey: 'boss_id' }); + +// UserBossSelection 관계 +UserBossSelection.belongsTo(User, { foreignKey: 'user_id' }); +UserBossSelection.belongsTo(UserCharacter, { foreignKey: 'user_character_id', as: 'character' }); +UserBossSelection.belongsTo(BossDifficulty, { foreignKey: 'boss_difficulty_id', as: 'difficulty' }); +UserCharacter.hasMany(UserBossSelection, { foreignKey: 'user_character_id', as: 'selections' }); + +export { User, UserCharacter, Boss, BossDifficulty, UserBossSelection }; diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..a099360 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,3169 @@ +{ + "name": "maplestory-backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "maplestory-backend", + "version": "1.0.0", + "dependencies": { + "@aws-sdk/client-s3": "^3.800.0", + "axios": "^1.9.0", + "connect-redis": "^8.0.1", + "cors": "^2.8.5", + "crypto": "^1.0.1", + "express": "^5.1.0", + "express-session": "^1.18.1", + "ioredis": "^5.6.1", + "mariadb": "^3.4.0", + "mysql2": "^3.14.1", + "sequelize": "^6.37.5" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.1025.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1025.0.tgz", + "integrity": "sha512-9Byz2fPnuGRRL8DTTD5bYPl1Iwm+ysLiCMgptffa3lNkVLCiUZc5e5TAaOjk0MvyeXieq+jn35AmQL6cgN2KHQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/credential-provider-node": "^3.972.29", + "@aws-sdk/middleware-bucket-endpoint": "^3.972.8", + "@aws-sdk/middleware-expect-continue": "^3.972.8", + "@aws-sdk/middleware-flexible-checksums": "^3.974.6", + "@aws-sdk/middleware-host-header": "^3.972.8", + "@aws-sdk/middleware-location-constraint": "^3.972.8", + "@aws-sdk/middleware-logger": "^3.972.8", + "@aws-sdk/middleware-recursion-detection": "^3.972.9", + "@aws-sdk/middleware-sdk-s3": "^3.972.27", + "@aws-sdk/middleware-ssec": "^3.972.8", + "@aws-sdk/middleware-user-agent": "^3.972.28", + "@aws-sdk/region-config-resolver": "^3.972.10", + "@aws-sdk/signature-v4-multi-region": "^3.996.15", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@aws-sdk/util-user-agent-browser": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.973.14", + "@smithy/config-resolver": "^4.4.13", + "@smithy/core": "^3.23.13", + "@smithy/eventstream-serde-browser": "^4.2.12", + "@smithy/eventstream-serde-config-resolver": "^4.3.12", + "@smithy/eventstream-serde-node": "^4.2.12", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/hash-blob-browser": "^4.2.13", + "@smithy/hash-node": "^4.2.12", + "@smithy/hash-stream-node": "^4.2.12", + "@smithy/invalid-dependency": "^4.2.12", + "@smithy/md5-js": "^4.2.12", + "@smithy/middleware-content-length": "^4.2.12", + "@smithy/middleware-endpoint": "^4.4.28", + "@smithy/middleware-retry": "^4.4.46", + "@smithy/middleware-serde": "^4.2.16", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/node-http-handler": "^4.5.1", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.8", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.44", + "@smithy/util-defaults-mode-node": "^4.2.48", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.13", + "@smithy/util-stream": "^4.5.21", + "@smithy/util-utf8": "^4.2.2", + "@smithy/util-waiter": "^4.2.14", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.973.26", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.26.tgz", + "integrity": "sha512-A/E6n2W42ruU+sfWk+mMUOyVXbsSgGrY3MJ9/0Az5qUdG67y8I6HYzzoAa+e/lzxxl1uCYmEL6BTMi9ZiZnplQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/xml-builder": "^3.972.16", + "@smithy/core": "^3.23.13", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/signature-v4": "^5.3.12", + "@smithy/smithy-client": "^4.12.8", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/crc64-nvme": { + "version": "3.972.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.5.tgz", + "integrity": "sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.24", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.24.tgz", + "integrity": "sha512-FWg8uFmT6vQM7VuzELzwVo5bzExGaKHdubn0StjgrcU5FvuLExUe+k06kn/40uKv59rYzhez8eFNM4yYE/Yb/w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.26", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.26.tgz", + "integrity": "sha512-CY4ppZ+qHYqcXqBVi//sdHST1QK3KzOEiLtpLsc9W2k2vfZPKExGaQIsOwcyvjpjUEolotitmd3mUNY56IwDEA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/types": "^3.973.6", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.5.1", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.8", + "@smithy/types": "^4.13.1", + "@smithy/util-stream": "^4.5.21", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.28", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.28.tgz", + "integrity": "sha512-wXYvq3+uQcZV7k+bE4yDXCTBdzWTU9x/nMiKBfzInmv6yYK1veMK0AKvRfRBd72nGWYKcL6AxwiPg9z/pYlgpw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/credential-provider-env": "^3.972.24", + "@aws-sdk/credential-provider-http": "^3.972.26", + "@aws-sdk/credential-provider-login": "^3.972.28", + "@aws-sdk/credential-provider-process": "^3.972.24", + "@aws-sdk/credential-provider-sso": "^3.972.28", + "@aws-sdk/credential-provider-web-identity": "^3.972.28", + "@aws-sdk/nested-clients": "^3.996.18", + "@aws-sdk/types": "^3.973.6", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.28", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.28.tgz", + "integrity": "sha512-ZSTfO6jqUTCysbdBPtEX5OUR//3rbD0lN7jO3sQeS2Gjr/Y+DT6SbIJ0oT2cemNw3UzKu97sNONd1CwNMthuZQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/nested-clients": "^3.996.18", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.29", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.29.tgz", + "integrity": "sha512-clSzDcvndpFJAggLDnDb36sPdlZYyEs5Zm6zgZjjUhwsJgSWiWKwFIXUVBcbruidNyBdbpOv2tNDL9sX8y3/0g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.24", + "@aws-sdk/credential-provider-http": "^3.972.26", + "@aws-sdk/credential-provider-ini": "^3.972.28", + "@aws-sdk/credential-provider-process": "^3.972.24", + "@aws-sdk/credential-provider-sso": "^3.972.28", + "@aws-sdk/credential-provider-web-identity": "^3.972.28", + "@aws-sdk/types": "^3.973.6", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.24", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.24.tgz", + "integrity": "sha512-Q2k/XLrFXhEztPHqj4SLCNID3hEPdlhh1CDLBpNnM+1L8fq7P+yON9/9M1IGN/dA5W45v44ylERfXtDAlmMNmw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.28", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.28.tgz", + "integrity": "sha512-IoUlmKMLEITFn1SiCTjPfR6KrE799FBo5baWyk/5Ppar2yXZoUdaRqZzJzK6TcJxx450M8m8DbpddRVYlp5R/A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/nested-clients": "^3.996.18", + "@aws-sdk/token-providers": "3.1021.0", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.28", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.28.tgz", + "integrity": "sha512-d+6h0SD8GGERzKe27v5rOzNGKOl0D+l0bWJdqrxH8WSQzHzjsQFIAPgIeOTUwBHVsKKwtSxc91K/SWax6XgswQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/nested-clients": "^3.996.18", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.8.tgz", + "integrity": "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-arn-parser": "^3.972.3", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.8.tgz", + "integrity": "sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.974.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.6.tgz", + "integrity": "sha512-YckB8k1ejbyCg/g36gUMFLNzE4W5cERIa4MtsdO+wpTmJEP0+TB7okWIt7d8TDOvnb7SwvxJ21E4TGOBxFpSWQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/crc64-nvme": "^3.972.5", + "@aws-sdk/types": "^3.973.6", + "@smithy/is-array-buffer": "^4.2.2", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-stream": "^4.5.21", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.8.tgz", + "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.8.tgz", + "integrity": "sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.8.tgz", + "integrity": "sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.972.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.9.tgz", + "integrity": "sha512-/Wt5+CT8dpTFQxEJ9iGy/UGrXr7p2wlIOEHvIr/YcHYByzoLjrqkYqXdJjd9UIgWjv7eqV2HnFJen93UTuwfTQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.972.27", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.27.tgz", + "integrity": "sha512-gomO6DZwx+1D/9mbCpcqO5tPBqYBK7DtdgjTIjZ4yvfh/S7ETwAPS0XbJgP2JD8Ycr5CwVrEkV1sFtu3ShXeOw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-arn-parser": "^3.972.3", + "@smithy/core": "^3.23.13", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/signature-v4": "^5.3.12", + "@smithy/smithy-client": "^4.12.8", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-stream": "^4.5.21", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.8.tgz", + "integrity": "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.28", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.28.tgz", + "integrity": "sha512-cfWZFlVh7Va9lRay4PN2A9ARFzaBYcA097InT5M2CdRS05ECF5yaz86jET8Wsl2WcyKYEvVr/QNmKtYtafUHtQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@smithy/core": "^3.23.13", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-retry": "^4.2.13", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.996.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.18.tgz", + "integrity": "sha512-c7ZSIXrESxHKx2Mcopgd8AlzZgoXMr20fkx5ViPWPOLBvmyhw9VwJx/Govg8Ef/IhEon5R9l53Z8fdYSEmp6VA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/middleware-host-header": "^3.972.8", + "@aws-sdk/middleware-logger": "^3.972.8", + "@aws-sdk/middleware-recursion-detection": "^3.972.9", + "@aws-sdk/middleware-user-agent": "^3.972.28", + "@aws-sdk/region-config-resolver": "^3.972.10", + "@aws-sdk/types": "^3.973.6", + "@aws-sdk/util-endpoints": "^3.996.5", + "@aws-sdk/util-user-agent-browser": "^3.972.8", + "@aws-sdk/util-user-agent-node": "^3.973.14", + "@smithy/config-resolver": "^4.4.13", + "@smithy/core": "^3.23.13", + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/hash-node": "^4.2.12", + "@smithy/invalid-dependency": "^4.2.12", + "@smithy/middleware-content-length": "^4.2.12", + "@smithy/middleware-endpoint": "^4.4.28", + "@smithy/middleware-retry": "^4.4.46", + "@smithy/middleware-serde": "^4.2.16", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/node-http-handler": "^4.5.1", + "@smithy/protocol-http": "^5.3.12", + "@smithy/smithy-client": "^4.12.8", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.44", + "@smithy/util-defaults-mode-node": "^4.2.48", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.13", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.10.tgz", + "integrity": "sha512-1dq9ToC6e070QvnVhhbAs3bb5r6cQ10gTVc6cyRV5uvQe7P138TV2uG2i6+Yok4bAkVAcx5AqkTEBUvWEtBlsQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/config-resolver": "^4.4.13", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.15", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.15.tgz", + "integrity": "sha512-Ukw2RpqvaL96CjfH/FgfBmy/ZosHBqoHBCFsN61qGg99F33vpntIVii8aNeh65XuOja73arSduskoa4OJea9RQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "^3.972.27", + "@aws-sdk/types": "^3.973.6", + "@smithy/protocol-http": "^5.3.12", + "@smithy/signature-v4": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.1021.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1021.0.tgz", + "integrity": "sha512-TKY6h9spUk3OLs5v1oAgW9mAeBE3LAGNBwJokLy96wwmd4W2v/tYlXseProyed9ValDj2u1jK/4Rg1T+1NXyJA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.26", + "@aws-sdk/nested-clients": "^3.996.18", + "@aws-sdk/types": "^3.973.6", + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.6.tgz", + "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", + "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.996.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.5.tgz", + "integrity": "sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-endpoints": "^3.3.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", + "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.972.8", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz", + "integrity": "sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.6", + "@smithy/types": "^4.13.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.973.14", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.14.tgz", + "integrity": "sha512-vNSB/DYaPOyujVZBg/zUznH9QC142MaTHVmaFlF7uzzfg3CgT9f/l4C0Yi+vU/tbBhxVcXVB90Oohk5+o+ZbWw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "^3.972.28", + "@aws-sdk/types": "^3.973.6", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.16", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.16.tgz", + "integrity": "sha512-iu2pyvaqmeatIJLURLqx9D+4jKAdTH20ntzB6BFwjyN7V960r4jK32mx0Zf7YbtOYAbmbtQfDNuL60ONinyw7A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "fast-xml-parser": "5.5.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.1.tgz", + "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==", + "license": "MIT" + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.2.tgz", + "integrity": "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.3.tgz", + "integrity": "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-base64": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.14", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.14.tgz", + "integrity": "sha512-N55f8mPEccpzKetUagdvmAy8oohf0J5cuj9jLI1TaSceRlq0pJsIZepY3kmAXAhyxqXPV6hDerDQhqQPKWgAoQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.13", + "@smithy/types": "^4.14.0", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-endpoints": "^3.3.4", + "@smithy/util-middleware": "^4.2.13", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.23.14", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.14.tgz", + "integrity": "sha512-vJ0IhpZxZAkFYOegMKSrxw7ujhhT2pass/1UEcZ4kfl5srTAqtPU5I7MdYQoreVas3204ykCiNhY1o7Xlz6Yyg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-stream": "^4.5.22", + "@smithy/util-utf8": "^4.2.2", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.13.tgz", + "integrity": "sha512-wboCPijzf6RJKLOvnjDAiBxGSmSnGXj35o5ZAWKDaHa/cvQ5U3ZJ13D4tMCE8JG4dxVAZFy/P0x/V9CwwdfULQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.13.tgz", + "integrity": "sha512-vYahwBAtRaAcFbOmE9aLr12z7RiHYDSLcnogSdxfm7kKfsNa3wH+NU5r7vTeB5rKvLsWyPjVX8iH94brP7umiQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.14.0", + "@smithy/util-hex-encoding": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.13.tgz", + "integrity": "sha512-wwybfcOX0tLqCcBP378TIU9IqrDuZq/tDV48LlZNydMpCnqnYr+hWBAYbRE+rFFf/p7IkDJySM3bgiMKP2ihPg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.13", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.13.tgz", + "integrity": "sha512-ied1lO559PtAsMJzg2TKRlctLnEi1PfkNeMMpdwXDImk1zV9uvS/Oxoy/vcy9uv1GKZAjDAB5xT6ziE9fzm5wA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.13.tgz", + "integrity": "sha512-hFyK+ORJrxAN3RYoaD6+gsGDQjeix8HOEkosoajvXYZ4VeqonM3G4jd9IIRm/sWGXUKmudkY9KdYjzosUqdM8A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.13", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.13.tgz", + "integrity": "sha512-kRrq4EKLGeOxhC2CBEhRNcu1KSzNJzYY7RK3S7CxMPgB5dRrv55WqQOtRwQxQLC04xqORFLUgnDlc6xrNUULaA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.13", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.16.tgz", + "integrity": "sha512-nYDRUIvNd4mFmuXraRWt6w5UsZTNqtj4hXJA/iiOD4tuseIdLP9Lq38teH/SZTcIFCa2f+27o7hYpIsWktJKEQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.13", + "@smithy/querystring-builder": "^4.2.13", + "@smithy/types": "^4.14.0", + "@smithy/util-base64": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.14.tgz", + "integrity": "sha512-rtQ5es8r/5v4rav7q5QTsfx9CtCyzrz/g7ZZZBH2xtMmd6G/KQrLOWfSHTvFOUPlVy59RQvxeBYJaLRoybMEyA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/chunked-blob-reader": "^5.2.2", + "@smithy/chunked-blob-reader-native": "^4.2.3", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.13.tgz", + "integrity": "sha512-4/oy9h0jjmY80a2gOIo75iLl8TOPhmtx4E2Hz+PfMjvx/vLtGY4TMU/35WRyH2JHPfT5CVB38u4JRow7gnmzJA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.13.tgz", + "integrity": "sha512-WdQ7HwUjINXETeh6dqUeob1UHIYx8kAn9PSp1HhM2WWegiZBYVy2WXIs1lB07SZLan/udys9SBnQGt9MQbDpdg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.13.tgz", + "integrity": "sha512-jvC0RB/8BLj2SMIkY0Npl425IdnxZJxInpZJbu563zIRnVjpDMXevU3VMCRSabaLB0kf/eFIOusdGstrLJ8IDg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", + "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.13.tgz", + "integrity": "sha512-cNm7I9NXolFxtS20ojROddOEpSAeI1Obq6pd1Kj5HtHws3s9Fkk8DdHDfQSs5KuxCewZuVK6UqrJnfJmiMzDuQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.13.tgz", + "integrity": "sha512-IPMLm/LE4AZwu6qiE8Rr8vJsWhs9AtOdySRXrOM7xnvclp77Tyh7hMs/FRrMf26kgIe67vFJXXOSmVxS7oKeig==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.4.29", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.29.tgz", + "integrity": "sha512-R9Q/58U+qBiSARGWbAbFLczECg/RmysRksX6Q8BaQEpt75I7LI6WGDZnjuC9GXSGKljEbA7N118LhGaMbfrTXw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.23.14", + "@smithy/middleware-serde": "^4.2.17", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", + "@smithy/url-parser": "^4.2.13", + "@smithy/util-middleware": "^4.2.13", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.5.0.tgz", + "integrity": "sha512-/NzISn4grj/BRFVua/xnQwF+7fakYZgimpw2dfmlPgcqecBMKxpB9g5mLYRrmBD5OrPoODokw4Vi1hrSR4zRyw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.23.14", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/service-error-classification": "^4.2.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-retry": "^4.3.0", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.17.tgz", + "integrity": "sha512-0T2mcaM6v9W1xku86Dk0bEW7aEseG6KenFkPK98XNw0ZhOqOiD1MrMsdnQw9QsL3/Oa85T53iSMlm0SZdSuIEQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.23.14", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.13.tgz", + "integrity": "sha512-g72jN/sGDLyTanrCLH9fhg3oysO3f7tQa6eWWsMyn2BiYNCgjF24n4/I9wff/5XidFvjj9ilipAoQrurTUrLvw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.13.tgz", + "integrity": "sha512-iGxQ04DsKXLckbgnX4ipElrOTk+IHgTyu0q0WssZfYhDm9CQWHmu6cOeI5wmWRxpXbBDhIIfXMWz5tPEtcVqbw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.13", + "@smithy/shared-ini-file-loader": "^4.4.8", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.2.tgz", + "integrity": "sha512-/oD7u8M0oj2ZTFw7GkuuHWpIxtWdLlnyNkbrWcyVYhd5RJNDuczdkb0wfnQICyNFrVPlr8YHOhamjNy3zidhmA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.13", + "@smithy/querystring-builder": "^4.2.13", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.13.tgz", + "integrity": "sha512-bGzUCthxRmezuxkbu9wD33wWg9KX3hJpCXpQ93vVkPrHn9ZW6KNNdY5xAUWNuRCwQ+VyboFuWirG1lZhhkcyRQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.13.tgz", + "integrity": "sha512-+HsmuJUF4u8POo6s8/a2Yb/AQ5t/YgLovCuHF9oxbocqv+SZ6gd8lC2duBFiCA/vFHoHQhoq7QjqJqZC6xOxxg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.13.tgz", + "integrity": "sha512-tG4aOYFCZdPMjbgfhnIQ322H//ojujldp1SrHPHpBSb3NqgUp3dwiUGRJzie87hS1DYwWGqDuPaowoDF+rYCbQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "@smithy/util-uri-escape": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.13.tgz", + "integrity": "sha512-hqW3Q4P+CDzUyQ87GrboGMeD7XYNMOF+CuTwu936UQRB/zeYn3jys8C3w+wMkDfY7CyyyVwZQ5cNFoG0x1pYmA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.13.tgz", + "integrity": "sha512-a0s8XZMfOC/qpqq7RCPvJlk93rWFrElH6O++8WJKz0FqnA4Y7fkNi/0mnGgSH1C4x6MFsuBA8VKu4zxFrMe5Vw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.8.tgz", + "integrity": "sha512-VZCZx2bZasxdqxVgEAhREvDSlkatTPnkdWy1+Kiy8w7kYPBosW0V5IeDwzDUMvWBt56zpK658rx1cOBFOYaPaw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.13", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.13.tgz", + "integrity": "sha512-YpYSyM0vMDwKbHD/JA7bVOF6kToVRpa+FM5ateEVRpsTNu564g1muBlkTubXhSKKYXInhpADF46FPyrZcTLpXg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.2", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-middleware": "^4.2.13", + "@smithy/util-uri-escape": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.12.9", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.9.tgz", + "integrity": "sha512-ovaLEcTU5olSeHcRXcxV6viaKtpkHZumn6Ps0yn7dRf2rRSfy794vpjOtrWDO0d1auDSvAqxO+lyhERSXQ03EQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.23.14", + "@smithy/middleware-endpoint": "^4.4.29", + "@smithy/middleware-stack": "^4.2.13", + "@smithy/protocol-http": "^5.3.13", + "@smithy/types": "^4.14.0", + "@smithy/util-stream": "^4.5.22", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.14.0.tgz", + "integrity": "sha512-OWgntFLW88kx2qvf/c/67Vno1yuXm/f9M7QFAtVkkO29IJXGBIg0ycEaBTH0kvCtwmvZxRujrgP5a86RvsXJAQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.13.tgz", + "integrity": "sha512-2G03yoboIRZlZze2+PT4GZEjgwQsJjUgn6iTsvxA02bVceHR6vp4Cuk7TUnPFWKF+ffNUk3kj4COwkENS2K3vw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.13", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", + "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", + "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", + "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", + "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", + "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.45", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.45.tgz", + "integrity": "sha512-ag9sWc6/nWZAuK3Wm9KlFJUnRkXLrXn33RFjIAmCTFThqLHY+7wCst10BGq56FxslsDrjhSie46c8OULS+BiIw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.49", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.49.tgz", + "integrity": "sha512-jlN6vHwE8gY5AfiFBavtD3QtCX2f7lM3BKkz7nFKSNfFR5nXLXLg6sqXTJEEyDwtxbztIDBQCfjsGVXlIru2lQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.14", + "@smithy/credential-provider-imds": "^4.2.13", + "@smithy/node-config-provider": "^4.3.13", + "@smithy/property-provider": "^4.2.13", + "@smithy/smithy-client": "^4.12.9", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.4.tgz", + "integrity": "sha512-BKoR/ubPp9KNKFxPpg1J28N1+bgu8NGAtJblBP7yHy8yQPBWhIAv9+l92SlQLpolGm71CVO+btB60gTgzT0wog==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.13", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", + "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.13.tgz", + "integrity": "sha512-GTooyrlmRTqvUen4eK7/K1p6kryF7bnDfq6XsAbIsf2mo51B/utaH+XThY6dKgNCWzMAaH/+OLmqaBuLhLWRow==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.3.0.tgz", + "integrity": "sha512-tSOPQNT/4KfbvqeMovWC3g23KSYy8czHd3tlN+tOYVNIDLSfxIsrPJihYi5TpNcoV789KWtgChUVedh2y6dDPg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.13", + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.22", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.22.tgz", + "integrity": "sha512-3H8iq/0BfQjUs2/4fbHZ9aG9yNzcuZs24LPkcX1Q7Z+qpqaGM8+qbGmE8zo9m2nCRgamyvS98cHdcWvR6YUsew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.16", + "@smithy/node-http-handler": "^4.5.2", + "@smithy/types": "^4.14.0", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", + "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", + "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.15", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.15.tgz", + "integrity": "sha512-oUt9o7n8hBv3BL56sLSneL0XeigZSuem0Hr78JaoK33D9oKieyCvVP8eTSe3j7g2mm/S1DvzxKieG7JEWNJUNg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.14.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", + "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.2.tgz", + "integrity": "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/validator": { + "version": "13.15.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", + "license": "MIT" + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz", + "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect-redis": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-8.1.0.tgz", + "integrity": "sha512-Km0EYLDlmExF52UCss5gLGTtrukGC57G6WCC2aqEMft5Vr4xNWuM4tL+T97kWrw+vp40SXFteb6Xk/7MxgpwdA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "express-session": ">=1" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.", + "license": "ISC" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dottie": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.7.tgz", + "integrity": "sha512-7lAK2A0b3zZr3UC5aE69CPdCFR4RHW1o2Dr74TqFykxkUCBXSRJum/yPc7g8zRHJqWKomPLHwFLLoUnn8PXXRg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-session": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.19.0.tgz", + "integrity": "sha512-0csaMkGq+vaiZTmSMMGkfdCOabYv192VbytFypcvI0MANrp+4i/7yEkJ0sbAEhycQjntaKGzYfjfXQyVb7BHMA==", + "license": "MIT", + "dependencies": { + "cookie": "~0.7.2", + "cookie-signature": "~1.0.7", + "debug": "~2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.1.0", + "parseurl": "~1.3.3", + "safe-buffer": "~5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-session/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/express-session/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express-session/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fast-xml-builder": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", + "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.1.3" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.5.8", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz", + "integrity": "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "fast-xml-builder": "^1.1.4", + "path-expression-matcher": "^1.2.0", + "strnum": "^2.2.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ], + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ioredis": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.10.1.tgz", + "integrity": "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA==", + "license": "MIT", + "dependencies": { + "@ioredis/commands": "1.5.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/lru.min": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.4.tgz", + "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, + "node_modules/mariadb": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.5.2.tgz", + "integrity": "sha512-9rztrI4nouxAY/82a+RlzzZ5ie2vxu2eYclkBvTy1ATXH1B9cnvZ0O71Pzsy/mlfDb5P3HhOg0JzQKkDRhctyA==", + "license": "LGPL-2.1-or-later", + "dependencies": { + "@types/geojson": "^7946.0.16", + "@types/node": ">=18", + "denque": "^2.1.0", + "iconv-lite": "^0.7.2", + "lru-cache": "^10.4.3" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz", + "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mysql2": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.20.0.tgz", + "integrity": "sha512-eCLUs7BNbgA6nf/MZXsaBO1SfGs0LtLVrJD3WeWq+jPLDWkSufTD+aGMwykfUVPdZnblaUK1a8G/P63cl9FkKg==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.2", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.2", + "long": "^5.3.2", + "lru.min": "^1.1.4", + "named-placeholders": "^1.1.6", + "sql-escaper": "^1.3.3" + }, + "engines": { + "node": ">= 8.0" + }, + "peerDependencies": { + "@types/node": ">= 8" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz", + "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", + "license": "MIT", + "dependencies": { + "lru.min": "^1.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-expression-matcher": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.4.0.tgz", + "integrity": "sha512-s4DQMxIdhj3jLFWd9LxHOplj4p9yQ4ffMGowFf3cpEgrrJjEhN0V5nxw4Ye1EViAGDoL4/1AeO6qHpqYPOzE4Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pg-connection-string": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.12.0.tgz", + "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/retry-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.1.1.tgz", + "integrity": "sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==", + "license": "MIT" + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/sequelize": { + "version": "6.37.8", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.8.tgz", + "integrity": "sha512-HJ0IQFqcTsTiqbEgiuioYFMSD00TP6Cz7zoTti+zVVBwVe9fEhev9cH6WnM3XU31+ABS356durAb99ZuOthnKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sql-escaper": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/sql-escaper/-/sql-escaper-1.3.3.tgz", + "integrity": "sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=2.0.0", + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strnum": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz", + "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "license": "MIT", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.15.35", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.35.tgz", + "integrity": "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..b578895 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,23 @@ +{ + "name": "maplestory-backend", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "start": "node server.js", + "dev": "node --watch server.js" + }, + "dependencies": { + "express": "^5.1.0", + "cors": "^2.8.5", + "sequelize": "^6.37.5", + "mysql2": "^3.14.1", + "mariadb": "^3.4.0", + "express-session": "^1.18.1", + "connect-redis": "^8.0.1", + "ioredis": "^5.6.1", + "@aws-sdk/client-s3": "^3.800.0", + "axios": "^1.9.0", + "crypto": "^1.0.1" + } +} diff --git a/backend/routes/auth.js b/backend/routes/auth.js new file mode 100644 index 0000000..d842754 --- /dev/null +++ b/backend/routes/auth.js @@ -0,0 +1,66 @@ +import { Router } from 'express'; +import crypto from 'crypto'; +import { exchangeToken, getUserInfo, refreshToken } from '../services/nexon.js'; +import { User } from '../models/index.js'; + +const router = Router(); + +router.get('/login', (req, res) => { + const state = crypto.randomBytes(16).toString('hex'); + req.session.oauthState = state; + + const params = new URLSearchParams({ + response_type: 'code', + client_id: process.env.NEXON_CLIENT_ID, + redirect_uri: process.env.NEXON_REDIRECT_URI, + scope: 'maplestory.characterlist', + state, + }); + + res.redirect(`https://openid.nexon.com/oauth2/authorize?${params}`); +}); + +router.get('/callback', async (req, res) => { + const { code, state } = req.query; + + if (!code || state !== req.session.oauthState) { + return res.status(400).json({ error: '잘못된 요청입니다' }); + } + delete req.session.oauthState; + + try { + const tokens = await exchangeToken(code); + const userInfo = await getUserInfo(tokens.access_token); + + const [user] = await User.findOrCreate({ + where: { nexon_uid: userInfo.uid }, + }); + + req.session.userId = user.id; + req.session.accessToken = tokens.access_token; + req.session.refreshToken = tokens.refresh_token; + req.session.tokenExpiresAt = Date.now() + tokens.expires_in * 1000; + + res.redirect('/'); + } catch (err) { + console.error('OAuth 콜백 오류:', err.message); + res.status(500).json({ error: '로그인 처리 중 오류가 발생했습니다' }); + } +}); + +router.post('/logout', (req, res) => { + req.session.destroy((err) => { + if (err) return res.status(500).json({ error: '로그아웃 실패' }); + res.clearCookie('connect.sid'); + res.json({ success: true }); + }); +}); + +router.get('/me', (req, res) => { + if (!req.session?.userId) { + return res.json({ authenticated: false }); + } + res.json({ authenticated: true, userId: req.session.userId }); +}); + +export default router; diff --git a/backend/routes/boss/bosses.js b/backend/routes/boss/bosses.js new file mode 100644 index 0000000..f3e440d --- /dev/null +++ b/backend/routes/boss/bosses.js @@ -0,0 +1,23 @@ +import { Router } from 'express'; +import { Boss, BossDifficulty } from '../../models/index.js'; + +const router = Router(); + +// 보스 목록 + 난이도별 결정석 가격 +router.get('/', async (_req, res) => { + try { + const bosses = await Boss.findAll({ + include: [{ model: BossDifficulty, as: 'difficulties' }], + order: [ + ['sort_order', 'ASC'], + [{ model: BossDifficulty, as: 'difficulties' }, 'crystal_price', 'DESC'], + ], + }); + res.json(bosses); + } catch (err) { + console.error('보스 목록 조회 오류:', err.message); + res.status(500).json({ error: '보스 목록 조회 실패' }); + } +}); + +export default router; diff --git a/backend/routes/boss/calculate.js b/backend/routes/boss/calculate.js new file mode 100644 index 0000000..72c5ffc --- /dev/null +++ b/backend/routes/boss/calculate.js @@ -0,0 +1,31 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth.js'; +import { UserCharacter, UserBossSelection, BossDifficulty, Boss } from '../../models/index.js'; +import { calculateRevenue } from '../../services/boss/calculator.js'; + +const router = Router(); + +router.get('/', requireAuth, async (req, res) => { + try { + const characters = await UserCharacter.findAll({ + where: { user_id: req.session.userId }, + include: [{ + model: UserBossSelection, + as: 'selections', + include: [{ + model: BossDifficulty, + as: 'difficulty', + include: [{ model: Boss }], + }], + }], + }); + + const result = calculateRevenue(characters); + res.json(result); + } catch (err) { + console.error('수익 계산 오류:', err.message); + res.status(500).json({ error: '수익 계산 실패' }); + } +}); + +export default router; diff --git a/backend/routes/boss/selections.js b/backend/routes/boss/selections.js new file mode 100644 index 0000000..f44f049 --- /dev/null +++ b/backend/routes/boss/selections.js @@ -0,0 +1,58 @@ +import { Router } from 'express'; +import { requireAuth } from '../../middleware/auth.js'; +import { UserBossSelection, BossDifficulty, Boss } from '../../models/index.js'; + +const router = Router(); + +// 내 캐릭터별 보스 선택 현황 +router.get('/', requireAuth, async (req, res) => { + try { + const selections = await UserBossSelection.findAll({ + where: { user_id: req.session.userId }, + include: [{ + model: BossDifficulty, + as: 'difficulty', + include: [{ model: Boss }], + }], + }); + res.json(selections); + } catch (err) { + console.error('선택 조회 오류:', err.message); + res.status(500).json({ error: '보스 선택 조회 실패' }); + } +}); + +// 캐릭터별 보스 선택 저장 +router.put('/:characterId', requireAuth, async (req, res) => { + const { characterId } = req.params; + const { selections } = req.body; // [{ boss_difficulty_id, party_size }] + + try { + // 기존 선택 삭제 + await UserBossSelection.destroy({ + where: { + user_id: req.session.userId, + user_character_id: characterId, + }, + }); + + // 새 선택 생성 + if (selections?.length) { + await UserBossSelection.bulkCreate( + selections.map((s) => ({ + user_id: req.session.userId, + user_character_id: characterId, + boss_difficulty_id: s.boss_difficulty_id, + party_size: s.party_size || 1, + })) + ); + } + + res.json({ success: true }); + } catch (err) { + console.error('선택 저장 오류:', err.message); + res.status(500).json({ error: '보스 선택 저장 실패' }); + } +}); + +export default router; diff --git a/backend/routes/characters.js b/backend/routes/characters.js new file mode 100644 index 0000000..3d3a646 --- /dev/null +++ b/backend/routes/characters.js @@ -0,0 +1,63 @@ +import { Router } from 'express'; +import { requireAuth } from '../middleware/auth.js'; +import { getCharacterList, getCharacterOcid, getCharacterBasic } from '../services/nexon.js'; +import { UserCharacter } from '../models/index.js'; + +const router = Router(); + +// 내 캐릭터 목록 조회 +router.get('/', requireAuth, async (req, res) => { + try { + const characters = await UserCharacter.findAll({ + where: { user_id: req.session.userId }, + order: [['character_level', 'DESC']], + }); + res.json(characters); + } catch (err) { + console.error('캐릭터 목록 조회 오류:', err.message); + res.status(500).json({ error: '캐릭터 목록 조회 실패' }); + } +}); + +// 캐릭터 목록 갱신 (넥슨 API에서 다시 가져오기) +router.post('/refresh', requireAuth, async (req, res) => { + try { + const charList = await getCharacterList(req.session.accessToken); + + if (!charList?.account_list) { + return res.status(400).json({ error: '캐릭터 목록을 가져올 수 없습니다' }); + } + + const results = []; + + for (const account of charList.account_list) { + for (const char of account.character_list || []) { + try { + const ocid = await getCharacterOcid(char.character_name); + const basic = await getCharacterBasic(ocid); + + const [userChar] = await UserCharacter.upsert({ + user_id: req.session.userId, + character_name: char.character_name, + ocid, + world_name: basic.world_name, + job_name: basic.character_class, + character_level: basic.character_level, + character_image: basic.character_image, + }); + + results.push(userChar); + } catch (err) { + console.error(`캐릭터 조회 실패: ${char.character_name}`, err.message); + } + } + } + + res.json(results); + } catch (err) { + console.error('캐릭터 갱신 오류:', err.message); + res.status(500).json({ error: '캐릭터 목록 갱신 실패' }); + } +}); + +export default router; diff --git a/backend/server.js b/backend/server.js new file mode 100644 index 0000000..f9287b8 --- /dev/null +++ b/backend/server.js @@ -0,0 +1,49 @@ +import express from 'express'; +import cors from 'cors'; +import { sessionMiddleware } from './middleware/session.js'; +import authRoutes from './routes/auth.js'; +import characterRoutes from './routes/characters.js'; +import bossRoutes from './routes/boss/bosses.js'; +import selectionRoutes from './routes/boss/selections.js'; +import calculateRoutes from './routes/boss/calculate.js'; +import { sequelize } from './lib/db.js'; + +const app = express(); +const PORT = process.env.PORT || 3000; + +app.use(cors({ + origin: process.env.NODE_ENV === 'production' + ? 'https://maple.caadiq.co.kr' + : 'http://localhost:5173', + credentials: true, +})); +app.use(express.json()); +app.use(sessionMiddleware); + +app.use('/api/auth', authRoutes); +app.use('/api/characters', characterRoutes); +app.use('/api/boss', bossRoutes); +app.use('/api/boss/selections', selectionRoutes); +app.use('/api/boss/calculate', calculateRoutes); + +app.get('/api/health', (_req, res) => { + res.json({ status: 'ok' }); +}); + +async function start() { + try { + await sequelize.authenticate(); + console.log('DB 연결 성공'); + await sequelize.sync(); + console.log('테이블 동기화 완료'); + + app.listen(PORT, () => { + console.log(`서버 시작: http://localhost:${PORT}`); + }); + } catch (err) { + console.error('서버 시작 실패:', err); + process.exit(1); + } +} + +start(); diff --git a/backend/services/boss/calculator.js b/backend/services/boss/calculator.js new file mode 100644 index 0000000..edf9a1f --- /dev/null +++ b/backend/services/boss/calculator.js @@ -0,0 +1,60 @@ +const MAX_CRYSTALS_PER_CHARACTER = 12; +const MAX_CRYSTALS_PER_ACCOUNT = 90; + +/** + * 주간 보스 수익 계산 + * @param {Array} characterSelections - 캐릭터별 보스 선택 데이터 + * @returns {Object} 계산 결과 + */ +export function calculateRevenue(characterSelections) { + const characterResults = []; + const allCrystals = []; + + for (const char of characterSelections) { + const crystals = char.selections + .map((s) => ({ + characterId: char.id, + characterName: char.character_name, + bossName: s.difficulty.Boss?.name || '', + difficulty: s.difficulty.difficulty, + crystalPrice: Number(s.difficulty.crystal_price), + partySize: s.party_size, + revenue: Math.floor(Number(s.difficulty.crystal_price) / s.party_size), + })) + .sort((a, b) => b.revenue - a.revenue) + .slice(0, MAX_CRYSTALS_PER_CHARACTER); + + characterResults.push({ + id: char.id, + characterName: char.character_name, + crystalCount: crystals.length, + maxCrystals: MAX_CRYSTALS_PER_CHARACTER, + crystals, + }); + + allCrystals.push(...crystals); + } + + // 계정 한도 적용: 전체에서 수익 높은 순으로 90개 + allCrystals.sort((a, b) => b.revenue - a.revenue); + const activeCrystals = allCrystals.slice(0, MAX_CRYSTALS_PER_ACCOUNT); + const excludedCrystals = allCrystals.slice(MAX_CRYSTALS_PER_ACCOUNT); + + const totalRevenue = activeCrystals.reduce((sum, c) => sum + c.revenue, 0); + + // 캐릭터별 소계 재계산 (계정 한도 반영) + const activeSet = new Set(activeCrystals); + for (const charResult of characterResults) { + const active = charResult.crystals.filter((c) => activeSet.has(c)); + charResult.activeCount = active.length; + charResult.revenue = active.reduce((sum, c) => sum + c.revenue, 0); + } + + return { + characters: characterResults, + totalCrystals: activeCrystals.length, + maxCrystals: MAX_CRYSTALS_PER_ACCOUNT, + totalRevenue, + excludedCrystals, + }; +} diff --git a/backend/services/nexon.js b/backend/services/nexon.js new file mode 100644 index 0000000..4d8b47b --- /dev/null +++ b/backend/services/nexon.js @@ -0,0 +1,62 @@ +import axios from 'axios'; + +const NEXON_API_BASE = 'https://open.api.nexon.com'; +const NEXON_OPENID_BASE = 'https://openid.nexon.com'; + +export async function exchangeToken(code) { + const { data } = await axios.post( + `${NEXON_OPENID_BASE}/oauth2/token`, + new URLSearchParams({ + grant_type: 'authorization_code', + client_id: process.env.NEXON_CLIENT_ID, + client_secret: process.env.NEXON_CLIENT_SECRET, + code, + }), + { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } + ); + return data; +} + +export async function refreshToken(refreshToken) { + const { data } = await axios.post( + `${NEXON_OPENID_BASE}/oauth2/token`, + new URLSearchParams({ + grant_type: 'refresh_token', + client_id: process.env.NEXON_CLIENT_ID, + client_secret: process.env.NEXON_CLIENT_SECRET, + refresh_token: refreshToken, + }), + { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } + ); + return data; +} + +export async function getUserInfo(accessToken) { + const { data } = await axios.get(`${NEXON_OPENID_BASE}/api/v1/user/info`, { + headers: { Authorization: `Bearer ${accessToken}` }, + }); + return data.result; +} + +export async function getCharacterList(accessToken) { + const { data } = await axios.get(`${NEXON_API_BASE}/maplestory/v1/character/list`, { + headers: { Authorization: `Bearer ${accessToken}` }, + }); + return data; +} + +export async function getCharacterOcid(characterName) { + const { data } = await axios.get(`${NEXON_API_BASE}/maplestory/v1/id`, { + params: { character_name: characterName }, + headers: { 'x-nxopen-api-key': process.env.NEXON_API_KEY }, + }); + return data.ocid; +} + +export async function getCharacterBasic(ocid) { + const { data } = await axios.get(`${NEXON_API_BASE}/maplestory/v1/character/basic`, { + params: { ocid }, + headers: { 'x-nxopen-api-key': process.env.NEXON_API_KEY }, + }); + return data; +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..70d0130 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,49 @@ +services: + frontend: + container_name: maplestory-frontend + image: node:22-alpine + working_dir: /app + volumes: + - ./frontend:/app + - frontend_modules:/app/node_modules + command: sh -c "npm install && npm run dev" + labels: + - "com.centurylinklabs.watchtower.enable=false" + networks: + - caddy + + backend: + container_name: maplestory-backend + image: node:22-alpine + working_dir: /app + volumes: + - ./backend:/app + - backend_modules:/app/node_modules + command: sh -c "npm install && npm run dev" + env_file: .env + labels: + - "com.centurylinklabs.watchtower.enable=false" + networks: + - caddy + - db + - app + + redis: + image: redis:7-alpine + volumes: + - redis-data:/data + networks: + - app + +volumes: + frontend_modules: + backend_modules: + redis-data: + +networks: + caddy: + external: true + db: + external: true + app: + external: true diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..32900ed --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +boss-images/ diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..a36934d --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,16 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..4fa125d --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,29 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + rules: { + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + }, + }, +]) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..e663c8b --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + 메이플스토리 도우미 + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..9317ab8 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,2995 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router-dom": "^7.14.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@tailwindcss/vite": "^4.2.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "tailwindcss": "^4.2.2", + "vite": "^8.0.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", + "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.7", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz", + "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", + "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.7" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.16.tgz", + "integrity": "sha512-Lyf3aK28zpsD1yQMiiHD4RvVb6UdMoo8xzG2XzFIfR9luPzOpcBlAsT/qfB1XWS1bxWT+UtE4WmQgsp297FYOA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001786", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001786.tgz", + "integrity": "sha512-4oxTZEvqmLLrERwxO76yfKM7acZo310U+v4kqexI2TL1DkkUEMT8UijrxxcnVdxR3qkVf5awGRX+4Z6aPHVKrA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.332", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.332.tgz", + "integrity": "sha512-7OOtytmh/rINMLwaFTbcMVvYXO3AUm029X0LcyfYk0B557RlPkdpTpnH9+htMlfu5dKwOmT0+Zs2Aw+lnn6TeQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-router": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.0.tgz", + "integrity": "sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.0.tgz", + "integrity": "sha512-2G3ajSVSZMEtmTjIklRWlNvo8wICEpLihfD/0YMDxbWK2UyP5EGfnoIn9AIQGnF3G/FX0MRbHXdFcD+rL1ZreQ==", + "license": "MIT", + "dependencies": { + "react-router": "7.14.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.12" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.5.tgz", + "integrity": "sha512-nmu43Qvq9UopTRfMx2jOYW5l16pb3iDC1JH6yMuPkpVbzK0k+L7dfsEDH4jRgYFmsg0sTAqkojoZgzLMlwHsCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..55e58ba --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,30 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-router-dom": "^7.14.0" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@tailwindcss/vite": "^4.2.2", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "tailwindcss": "^4.2.2", + "vite": "^8.0.4" + } +} diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx new file mode 100644 index 0000000..093529e --- /dev/null +++ b/frontend/src/App.jsx @@ -0,0 +1,15 @@ +import { Routes, Route } from 'react-router-dom' +import Layout from './components/Layout' +import Home from './pages/Home' +import BossPage from './features/boss/BossPage' + +export default function App() { + return ( + + }> + } /> + } /> + + + ) +} diff --git a/frontend/src/api/client.js b/frontend/src/api/client.js new file mode 100644 index 0000000..b19011b --- /dev/null +++ b/frontend/src/api/client.js @@ -0,0 +1,15 @@ +export async function api(url, options = {}) { + const res = await fetch(url, { + credentials: 'include', + headers: { 'Content-Type': 'application/json', ...options.headers }, + ...options, + body: options.body ? JSON.stringify(options.body) : undefined, + }) + + if (!res.ok) { + const error = await res.json().catch(() => ({})) + throw new Error(error.error || `HTTP ${res.status}`) + } + + return res.json() +} diff --git a/frontend/src/components/Layout.jsx b/frontend/src/components/Layout.jsx new file mode 100644 index 0000000..1ce87f3 --- /dev/null +++ b/frontend/src/components/Layout.jsx @@ -0,0 +1,21 @@ +import { Outlet, Link } from 'react-router-dom' +import LoginButton from './LoginButton' + +export default function Layout() { + return ( +
+
+
+ 메이플스토리 도우미 + +
+
+
+ +
+
+ ) +} diff --git a/frontend/src/components/LoginButton.jsx b/frontend/src/components/LoginButton.jsx new file mode 100644 index 0000000..15ddeae --- /dev/null +++ b/frontend/src/components/LoginButton.jsx @@ -0,0 +1,27 @@ +import { useAuth } from '../hooks/useAuth' + +export default function LoginButton() { + const { authenticated, loading, logout } = useAuth() + + if (loading) return null + + if (authenticated) { + return ( + + ) + } + + return ( + + 넥슨 로그인 + + ) +} diff --git a/frontend/src/features/boss/BossPage.jsx b/frontend/src/features/boss/BossPage.jsx new file mode 100644 index 0000000..6287140 --- /dev/null +++ b/frontend/src/features/boss/BossPage.jsx @@ -0,0 +1,128 @@ +import { useState } from 'react' + +const DIFF_KEYS = { '이지': 'easy', '노말': 'normal', '하드': 'hard', '카오스': 'chaos', '익스트림': 'extreme' } + +const DUMMY_BOSSES = [ + { + id: 1, name: '자쿰', imgId: 1, + difficulties: [ + { name: '이지', crystal: 6_612_500, defaultParty: 1 }, + { name: '노말', crystal: 16_200_000, defaultParty: 1 }, + { name: '카오스', crystal: 81_000_000, defaultParty: 1 }, + ], + }, + { + id: 2, name: '힐라', imgId: 3, + difficulties: [ + { name: '노말', crystal: 6_612_500, defaultParty: 1 }, + { name: '하드', crystal: 56_250_000, defaultParty: 1 }, + ], + }, + { + id: 3, name: '매그너스', imgId: 10, + difficulties: [ + { name: '이지', crystal: 7_200_000, defaultParty: 1 }, + { name: '노말', crystal: 19_012_500, defaultParty: 1 }, + { name: '하드', crystal: 95_062_500, defaultParty: 1 }, + ], + }, + { + id: 4, name: '파풀라투스', imgId: 22, + difficulties: [ + { name: '이지', crystal: 4_012_500, defaultParty: 1 }, + { name: '노말', crystal: 13_012_500, defaultParty: 1 }, + { name: '카오스', crystal: 79_012_500, defaultParty: 1 }, + ], + }, + { + id: 5, name: '듄켈', imgId: 27, + difficulties: [ + { name: '노말', crystal: 92_450_000, defaultParty: 1 }, + { name: '하드', crystal: 231_125_000, defaultParty: 6 }, + ], + }, + { + id: 6, name: '림보', imgId: 33, + difficulties: [ + { name: '노말', crystal: 140_000_000, defaultParty: 1 }, + { name: '하드', crystal: 350_000_000, defaultParty: 6 }, + ], + }, +] + +function formatMeso(n) { + if (n >= 100_000_000) { + const uk = Math.floor(n / 100_000_000) + const man = Math.floor((n % 100_000_000) / 10_000) + return man > 0 ? `${uk}억 ${man.toLocaleString()}만` : `${uk}억` + } + if (n >= 10_000) return `${Math.floor(n / 10_000).toLocaleString()}만` + return n.toLocaleString() +} + +function BossRowList({ boss, selections, onChange }) { + return ( +
+
+ {boss.name} + {boss.name} +
+
+ {boss.difficulties.map((diff, i) => { + const key = `${boss.id}-${i}` + const sel = selections[key] || { enabled: false, party: diff.defaultParty } + return ( + + ) + })} +
+
+ ) +} + +export default function BossPage() { + const [selections, setSelections] = useState({}) + + const handleChange = (key, sel) => setSelections((prev) => ({ ...prev, [key]: sel })) + + const entries = Object.entries(selections).filter(([, s]) => s.enabled) + const totalCrystals = entries.length + const totalRevenue = entries.reduce((sum, [key, sel]) => { + const [bossId, diffIdx] = key.split('-').map(Number) + const boss = DUMMY_BOSSES.find((b) => b.id === bossId) + return sum + Math.floor(boss.difficulties[diffIdx].crystal / sel.party) + }, 0) + + return ( +
+

주간 보스 수익 계산기

+ +
+
+
결정석
+
{totalCrystals}/12
+
+
+
예상 수익
+
{formatMeso(totalRevenue)} 메소
+
+
+ +
+ {DUMMY_BOSSES.map((boss) => ( + + ))} +
+
+ ) +} diff --git a/frontend/src/hooks/useAuth.js b/frontend/src/hooks/useAuth.js new file mode 100644 index 0000000..187654e --- /dev/null +++ b/frontend/src/hooks/useAuth.js @@ -0,0 +1,21 @@ +import { useState, useEffect } from 'react' +import { api } from '../api/client' + +export function useAuth() { + const [authenticated, setAuthenticated] = useState(false) + const [loading, setLoading] = useState(true) + + useEffect(() => { + api('/api/auth/me') + .then((data) => setAuthenticated(data.authenticated)) + .catch(() => setAuthenticated(false)) + .finally(() => setLoading(false)) + }, []) + + const logout = async () => { + await api('/api/auth/logout', { method: 'POST' }) + setAuthenticated(false) + } + + return { authenticated, loading, logout } +} diff --git a/frontend/src/hooks/useCharacters.js b/frontend/src/hooks/useCharacters.js new file mode 100644 index 0000000..bef7c7b --- /dev/null +++ b/frontend/src/hooks/useCharacters.js @@ -0,0 +1,35 @@ +import { useState, useEffect, useCallback } from 'react' +import { api } from '../api/client' + +export function useCharacters() { + const [characters, setCharacters] = useState([]) + const [loading, setLoading] = useState(true) + + const fetchCharacters = useCallback(async () => { + setLoading(true) + try { + const data = await api('/api/characters') + setCharacters(data) + } catch { + setCharacters([]) + } finally { + setLoading(false) + } + }, []) + + const refreshCharacters = async () => { + setLoading(true) + try { + const data = await api('/api/characters/refresh', { method: 'POST' }) + setCharacters(data) + } catch { + // 무시 + } finally { + setLoading(false) + } + } + + useEffect(() => { fetchCharacters() }, [fetchCharacters]) + + return { characters, loading, refreshCharacters } +} diff --git a/frontend/src/index.css b/frontend/src/index.css new file mode 100644 index 0000000..f1d8c73 --- /dev/null +++ b/frontend/src/index.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx new file mode 100644 index 0000000..2898346 --- /dev/null +++ b/frontend/src/main.jsx @@ -0,0 +1,13 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import { BrowserRouter } from 'react-router-dom' +import './index.css' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + + + , +) diff --git a/frontend/src/pages/Home.jsx b/frontend/src/pages/Home.jsx new file mode 100644 index 0000000..6249cb8 --- /dev/null +++ b/frontend/src/pages/Home.jsx @@ -0,0 +1,22 @@ +import { Link } from 'react-router-dom' + +export default function Home() { + return ( +
+

메이플스토리 도우미

+

메이플스토리 유틸리티 모음

+
+ + 💎 +
+

주간 보스 수익 계산기

+

캐릭터별 보스 결정석 수익을 계산합니다

+
+ +
+
+ ) +} diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..3709956 --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,18 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' + +export default defineConfig({ + plugins: [react(), tailwindcss()], + server: { + host: '0.0.0.0', + port: 5173, + allowedHosts: ['maple.caadiq.co.kr', 'maplestory-frontend'], + proxy: { + '/api': { + target: 'http://backend:3000', + changeOrigin: true, + }, + }, + }, +}) diff --git a/images/boss/가디언엔젤슬라임.png b/images/boss/가디언엔젤슬라임.png new file mode 100644 index 0000000000000000000000000000000000000000..d2f2a60aa409144c83c305ce9c8ac2242aa8b9e3 GIT binary patch literal 4964 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 lN7K>-2|45CO!5sNB*ODhS%N7s3Tjr_{q*8X2VA zA}YlUeOX~@W@P*sGknVppuOpTmIDS%rK}taj8YE37@o=ywy*X@bB2 z92@TOE(f$9PYoT9KIVEp6DY5@q6`c{IHe~q_7T&_GzWknv;5Ks=Mlf!;C;IapCu4! zxT?ztn-z#ipd?7)W-gwx5K0hIA3Qs${$j&Ogec{jN_pl|o~4v~!f+eUVAf%gz>qru zAQ9$jQD!hGXo$2TauOwFUzugNhO5E^K_mMBF^Cqb4Z`SN8x%I{K0u^0Tb&ytY`9Zu zZ{-5aU_=Mp0TAw~l=oK3dp8heFXcTGIi7Nj@A6Cr=LWFxUC!wdD4PH=t6-8{gEZVx zB}4NzRUkS>M3<-s0#Q_$T;1fdW&j32Q0QI18leP8IfI)a>J6yv z7R6K~Os+**A*C=Gp*6KbY{>dwiIN*D34~Z6qwkt0tkW5TS$&HMG8!;~6&z#yJJ=zH ztfdsj=`A1u+A&=M12;)A-2}*8W;JfG@sklQ!0y?{ZCV8weOV5(vgoO1Z=M9vnbh%obRJ3lVx9 zjuB#V6DMPG!@n4z4l}L$=qViRN1o6^WAq#aM7TzRJeuM5JgVZ4{DACLjVhA zC|Q!<$BaV#&NV6+0C1I3-ldc$z+i9=0P-5X7p`(eScVx+(a|DjoySDa@~a&&I|;}*Y(2)*BU1;Q)1=`hd-^kF3s+{-OxW;sqV>-*VJl2OE2xk7vC3K#V?veln5HJj;*-adN zaX(ySn=24q^+{7DbfBiy2}U$o_$&odrFSj6gArVZJ^)15EX~lFY*0a^C}C{?1lVxE z293L1>tm6G6-0<+M1sIzA8^>u&pWorwTL*2?@LZ1P^L)J=lfS9Ts^k8O={PDgwoh{ zOsVd|ew=gENFd_yd{51nm1_gj}O9qd!{uojW8D=@Qz{_Z>C0Hef2hBcbY(D2pZKHLW_rB?^8j zVxSGm66Zs%k&&PZWrC4fk*)y{5k9M+W^~y~xzUQblxsFC(4%?60{}u|`OS#%{m2n& zu%hYYdI5z#`86&fsR++Jmwtme4JK@^!z>qD;*$%38{2@Ifw z(cjGB9+yDy01*DpPQEg~e>K7xVH8_+*8f2;D`2idGojL`>A8)s<##Xw5Yjc2OiieF zl-MZyM8$cRYjG|iAkc_3IDtuVOhEo(&cXK`feZx3KV=X1Kzn|ohF;wAwyJ;k*+qvc zhH*X(*ZHa)EwilME`h;*bf@w~&eU83f5kPjpaKm1_q`eni6zG2`)M>_WSHzh$dC#f zqDHxKiTPcQ`4SKZpdg%oF@j`@)|(BoSXRnc>U$(x5}*{=4~^)U&~h{n=RjYsAt)Aqm)!B%9tUJFwA&pMD2w8JQeIF5CVw#7BhApI6|AZesC(vJA{+u zNVA_apT+|WBi#g-KpUt`qlCvT&iSo6WSbw0V0^$lrq*kB}1_D47 zK?KxO&IM-Nra4*S?1U>rWG&5e_U8adZUN9mB8gk@cMJrXWy>RK^EPL(cB(pKcyJbM zStJccu0=9H5ix2enl2Lkiv$CA2p|#!X-4!X=u_e%Vg{~4mPtvyT;%|a<+cDKeCt#0 z?UCWCE94H3KF@;9y$RB3M<&v0?hP1!GD7Q{G^@n=N53FHuDuwuqX z(bZ*^l-;Li9beXRoi8x__WM#qF%TI>`|fr0Dnf5`K9&%sYY;IK0KXL{v2qWQu$G-F zweF)dM>rh{oex+<0fRc?2_OK>k*0=8GD!>%rjNhS^X{_vm3-C(=ElXA#?s9Mxr_M+!5ttL-8z-gfgEP>o%*BYGE+ zigOHTnrSh>ASpDGF{;Goyg^zOodDn}`{MmIQiS2V)~GLWxAtCBtvWq$MuN6TL`#FU zYR(NEF(4W?JuqHs*oE6*iGT=KafqfG?O0Mf+w?2k;Z|BKrUW;$&MKlG?8x&DwKfpIVT-F->%vvfi4{@T zc-s;>i{&40!_WOF_qvq=E0(pKfC32o=Hh+=jIIMUJEzc#Al{2on04!^+~`3&Sb!2~ zcDl?LOX>{8L+Zg35J1Shqn7Vnm)Ce0jI3&Hcm*h2A@!&V_4>I!LauQir$Bg9WB|%fGcCg7i8;9HvCqbq9%7(~KNhlcZ*(u<|35W2L10gL7K0!SNp|FCaW3*1 zA@1t4aH--xT7r-uliSN)N0aj21#VhA7!rZhuYsC%Ayp8H+h&!x~D+)-de z!gdBA#C!viOh~q*!7;QpBgHi%PFLL3Flv|ni5mC1monoTOIb57$hQ8r`!`&tA68L> zHlB(xR^2`V!!ztsy|OA@L@Y7gd-w785{S>=k?C`Ra#k=rqs<*sRA+@?3uY5o7QeJ8 zB%NYOJ}Y+&Srx?J}S^+p?-MLX}lO3g3a+3H=51t->x29Dh- zf$-n(*4LmJZNW-zl@s)OP$P_Ujs$?Me*)F2>5ODd%8y1oLD{8di3vmlM9~0N^x395 zS=I^+$4J1ahDV5%Vc`xo(m**)2MltT4v;FIF%ea3S_tel!@7}?fk(M>`}N{^KI)9bZgJ;Jg=wZ z=1#7%BW_lh?iRsdTZkb>`)82!2fAd72v)CY;HmpntK9agKyE6Ac1xhr4L;b=jrEV8 zGCg-G&r{sGuhF6bW0pkv4J*Pu^dcvlzWG8&EB8Iy%0B{(WJBK9jPp5w&>D>hlV)N9 z(7vaxdiPc?4b5<#&*Pt3G(Z|q?T0zs^CxO>65r-my1diSAC((K^_Y}RwnRAm=z8an zfSMJ6t816|sZ;1ko#8GE1q}90=}3NJKLK%0)1pj*1bAY}$E1HqWcc6zjsY4V~M*Q|w`Q{JU^|s78kPmS%VcqjeWAc?1ME5)gf#B0`h=vRhaJ zGXVE?vb9pk9R|EIV6`th`RYQp)?ei8wz57yb8?n0W-ZgQ=>Gc={o1(}5U_b1#-{=? z48sO8<1_^`OluaH`SqU%&0WyE^h5P%=Zk*Pc!_3*M;vd|Be#Iyhw_RNs$V$AJ%gtD z&3Knk#jNRAiCm1sktkiu>3TbE+VfQ^Xy2a!pgBc@*Tgwp6Zdc5jq7y&@6rBN|Gj?v(|JA5nL?TWKx7(*f&WI}{{F)M z+Zcx74kk=J8+tH6hYy$kam@dM;~d!f1493g4|C+j|84*K+`nb}@$Wz6(2xP34W$$S O00001^@s6CPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D6~swIK~#8N<(qA> zw6L;;#{w3xfCVhX0v51<1uS3z3s}Gc7IN!Zt2<<7zo+i~eeSNx=5rvuvidXO^Z9%} z<2ZiiX=XbQ<9LkYP{(nsY=_wT*lig4VDL7Kk9Xy_55iE*R+4secS7!s&B3(q_C?8yLa;}~G@ZyW~DsrP==d)w-@x&g|$ zZFO5W3A$};x4P@t=h$+6UE{vkp4(op?WpI<*85yr*R`(8T9>lad7SDrOlE?%Q=P`C zem+Cp=Th&o)om^VmO4*!ou-mt z%snfvWm)UBS@>&R0}O8^YzVB@??>bJ2zso0J@ngMAPA6kZ}$KgKs3R>1oHmpGuCw~ zwQhTTmQ6ye=90m@c`4K<>NP@D*C?*JPUqX3w#fBwW zkYM;2mLyv^MxQ^!sE#p$Y(Jk*org)I&b4I4RTc?XVbo+GxKGBqV-H*I;a;u-B+LLj zo}cO`;5v20<^&K!5Ms1mqaLj-+HL~EdTjuF+(0Nr+jB7hhqgS+U@T?TxjU{U2v9a# zvVqZq;*6+te4OevuWA;^%t;nWEk1+P2*ClC=i4rnW;Ec_WD zu$5l_wgjYL#fyIn0MQWmf-%XIV2gwqUxOyvj;Y5>eacp^pte-!Gt@Fb@kNZ_7_|a4 zgh@dedDI|n2ghFk1c)$+XN=<{)w#+Z;gzgyI;t1cL?(?hsUJl%67l%I9g6n-{_$z5pa} z0KoHT^zjcP&hru@#ENJdakhX^3HXm{CEU4 z86c&K(76;eDJ(DsDBK%2kE+0m`#8r4!?p&1?24b2HYI<@b>7VY0N^hpq#DO=AWp!* z00scGDOoT9KyIhH3J8z-J}>eN_p)oh2f=FKCf$@u*k;IGV*I+1&SP?wbeG8tjp*kE zhiCM5!4ai{tH05xJr;&l9&7%#5gj9DtHuoVi^E{pFwJ$H=1MM-AaHJ*7qt|c_7Ftj zF`7Df<@XzU$1do zX2gVL4?F~KmdUN=@bZyn1EfV`zhc5dWUZ|&=7bDHL>2NEqDb@9nTQD zo#USLD(yNTyxa6Hc$?l1VU+0)gK;m1veGZF0T4S`UjRX3QgD@chH26R07HO`&IMi| z7OMdanTl8e7~~1W1>0bnGCGWspJ7)D7+g#0=ZL4lOW}Hfwe9zRuLqL=m3Qz?-jS@J zAE>6|h##-9pLYXdo2EL!3gQTuq0rR&Sw^U9ceX@JMo3k{J=T@9mpp;QX}9|fMqmip zrlA8E=N(D?v62l-MU)|WD+UBOdEfumaLo$H1i0U2JK+@mkB!*Rt8UX=?`f)=UOXv= zz{Tvrf&>G$00hSk2tws_jZkl1>%D9S;~+*cMY*m~DqGXnj0wJk2;t@WFme$!zD$YY z%g$qePZ-t*WUNV+Mn1B-<01z3wx%X1P1U5JHW&7v&*uz^Rr5H7)nOgu8CAOa|QG;gQhf+$FwRdeAYuiD79X889$}Y z%k~<;7}-}PTw;^Zajggtv*cBkZ(#VH)R<^;nCd}4#v*poG$6}X>-Fe2-(DktICw}{ zZR`Yj1=XAr8Uqk6Gz=dv#ptDrlotr<^I}Dj7)6+|opP%-pqs3^iZ9FF1X0E4M=f&1 z-OLPufh+8U=REzE`iM!R*almPZDhc=Q)&tb#60!9z8GPzao!r;9VTRlc;T{2Jy4fh z@j2Pw3&a>K$ap^~Xhyv8g94bcs)opj$k#{lh0&9h?~EhD&Y!7HF0 zUl2gSh%Z1gmf&2tSVj-wuo>7URi2UwqBIsCpFcIb;5vl?p^pg9HU}*m_ekw_kAAvy zj%j4K+dy*n9Y+X=W!>vcMY#)V00LxJfKUcG)hYutsbUN(xK6&Gj6gl48XY6J52M9B znF71M;0^=S%ZOxy>HkoPW)O&L!T_qKK;Obvq-ym*IIz1^O29tJo#V=>Tn%RNy)@N$ zy~Y|q$W3CrVyn?FF2@m5pdNS@JO`?Ty~vt?V*-PcMl*%yzGO;<-w1DG=14OQBy7P$ zSnmmy=UOAoX8>GSNw&aT>YtgB+Ga=%wo~_A1bq=tTqFJAw@a-j<0_VQj9`wTFhAgM z_ccKF9x#Hu zF9MufeeiG1mXGeQ#dS{P00bDC$rkTAr=!-p{qA>Bnk0W`R7%@f$p_xQMb;4)@ z1|2IAu?# z2V74~Ff!eaLh3j**9t>8*9t8RL;#oo^l?G%+fWjJ%(5K`1c@NPoJt6}wkp=)o%t@_ z3lPY%j%%$~RUGk$5!539V%rYcgfY-;)>*75o*|-U0V|*;5n`6cGO-Dx$GI$zS=}6r zIUROFl)?iB`wHQ|zz9I%nG8^R6l@2ERE!f-%m!>w<|^15Vi`b4Z*?uV)PndTfauEk z+aWgz80&i20>?`op`jvVrA4gJs7M#dKAq-Dg&G)98x+mmNzuN6<~+cx2-*jDX(Qx4 z(u*k)wfDeoaJ*8ci`-`zo&V5Ugei6U$TqkR8f-Xft>>dauV;i*gZT%02d4B63#^Hk zH&_uXpd83X*o}%*ek*};0>y$`O%fm**90qb345K_W6+WfshWh;-i}g*8y19n_skbL zkKK9JBOC$@I#=gI>H!x{NDGkmSFhU{m6#lMR1<$ds6VskYmdX*t{v!#`|qBV}T9TLDdf< z0tf`jnPMA8w%7{LZ$>jmmS|9hD1cygOtgF%V1beujMgXgJ@bmL=I~=2VPYm$TyF+5 zC@&*TO*L4SAY?fXaBLuV_Z_bV8>AMuB1^f~-&}(j0ybDkUJ!;cBE4jVBDoMuK0Uk# z>H!$&G4m6I>#7n*VkX@WKd-roR#uCN7>wH&3wm%~V3iEgpK$A{q`_k4KsLgFz-VI^ z6#dH6kXtha@FC*x9`sf^S3BtCihCvbfaW5mJ1cwRRWv!LD0tD8Gd5S(u zWO{b!u_tN_ih&8X<%*myKzd_3wbeKoTPWpLbsg|+H1BCs;6$Hc&pA^utMV2kUDzG+ zo0oCEu! zfF{78%~Y}Cx8VuWcmi$;{hYVz0>{Gi;asO+3Jt*&-e;_l(PftKLfB?Rib6BRpz4tN zs!G5(?~=ej>Jhzam=y-(RRQlaO6f%yA-oGf;BHX`I!Xb!GVMYQz>^~BE~bt_(EmJ7@@2|YUlZcLDijDm6ikt|T=J5!o_Y6XbhM)DZ4OyFsV zzh0wPjXp~J0R-b><7rzVMqqrXViB6l z2#?Taf?MndAn7R_!Y2U4Hj|bh+~umzdYcKft*Qugc9TrqlwZe)0OFSwzrdIkRuShQ zxL(&Qae?OATcIhhEO2{YyJA8f=o3;qQR&EYS;+VuiD0T7-!w+mC~`!Nd)0BT}TU;nWo*F~Rg&e7`syn>VA^W!W>DoN%sVV|Q3@}(QtpOiErdz~)v*n!bp*+Vk z(l!t{ZQpi+S#be@N;LKOjw~HeG2^WV{{_Jed3|@X#o(Crf9@v z?Ws)|m}Cqp!!dTFsozh7iA1mr!nIrtglE5H9FrNiP!(>24FW;)v;W97GW1o*8j+hp z;amquj;xxO7G>}S7&3sFxJ5)Lp~J2?6O3oZHt*@dPE}HtnZjq>(6V7qLlQzme+5p* zqa{p=9U2f<7+|m2Oh#P)a-S-7b)9kN0}!=$-=psPZM8!UqP(9~BS)hzBa&e-2jSW~ zI<*lHN%JG9KZc>9Vj;S6AMA(R~FcSfZk!QqB{T#KdDI@?kh-QThpw?ruD3k{eFBn~oApuD> zfEi?gnJK=Rd~o27f>}I zl8VuhG@_mG2}ldV!oU(0@<{{hFLS-5Eqn_34FwUo#% zJD11vdR0kaFrKJMPAa#-$UgiusUzX?ata8u0T+qTtmwyR+DNi6TBB1p^@dQK3p3@rMy#Y7#4PbD>wGEaco1Vg;?Q* zWq?BNL4D#Ms^N|__4u(DqG$)eYb+f>CMd7fe@9spE^(Y-=W{dfATVNmXNx8^+aAT1 zZpM4Z@F8rf#CB=YS8E_tq&+((cycH01NjEQ6%}sI0mdKIXp7Ff&YBr78wjCOU;z=U z_jO+Gvn!+JGdk61!I4HcbYDXD%m~5bJzna}*8;5W-L%T(-k+*kCugID*s0{3_|+zU_f>{M?X|R`;lifw;MtMMz2l{$gkrteDN$?E_Q``G>56L z1H87|00gxQ-=#kF*<+$+yEUa};Sku=SM8zq6aoRjV8f~c4XX5%f2^T02qAQDz2&nL zh^Q0hezGA9CxR*^|MEa)!uK}TLtsx>(8{u;7zCK175_Z|0fN5hB|bO|L|xDNO!f+y zW($-bwEzGXj_H~{i=u!7psbjA*I8OMV$F3HKznBN!gF5(AsK?#h$Vdn>lciUWuX?$ z4#aygoY)GL+ErV0nw%D2pGT8Pq7t#lqr#9J@ic(R5QWjNN=St`9;jP566N#lP>q&! z-MB$!iE;^!W}C?wWVHB(i^8cFp??XhPZ**uL7Lrk+xDVoMOuEgX&17{A`o)5ZY)xj zE;BDNQ<3%vViz0rSg zu|jmdHM|At!bk9I`3N3{l)Y>546bW|DZ$pG@7DqZY9wm{Av-Y)!^wsJPYs#VKI9*W zOv5m2!!X>xKlpEJ!!TUPip)J5dN4p|{(L^=zq}zMvi<>~|Knn|y!pRn+qbX3{{cmJ V>AX0i1^NI0002ovPDHLkV1fatXHNhC literal 0 HcmV?d00001 diff --git a/images/boss/듄켈.png b/images/boss/듄켈.png new file mode 100644 index 0000000000000000000000000000000000000000..d5ee851718cb46aca245fdf60a037c6b760be0d6 GIT binary patch literal 4677 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 literal 0 HcmV?d00001 diff --git a/images/boss/림보.png b/images/boss/림보.png new file mode 100644 index 0000000000000000000000000000000000000000..1a22205ef61dc68663f5220549fff7453868ef19 GIT binary patch literal 12780 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 literal 0 HcmV?d00001 diff --git a/images/boss/반반.png b/images/boss/반반.png new file mode 100644 index 0000000000000000000000000000000000000000..af2a54aea5b4a3293cc4930365d5959142a54fbe GIT binary patch literal 4944 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 literal 0 HcmV?d00001 diff --git a/images/boss/스우.png b/images/boss/스우.png new file mode 100644 index 0000000000000000000000000000000000000000..0cbc6f1033731f8a924d436aee6fde1e8f7a323a GIT binary patch literal 11686 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 literal 0 HcmV?d00001 diff --git a/images/boss/시그너스.png b/images/boss/시그너스.png new file mode 100644 index 0000000000000000000000000000000000000000..e25ff132fc0b8bcd9a1c5b1745da704949c2ae1e GIT binary patch literal 5576 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 D#}lKR literal 0 HcmV?d00001 diff --git a/images/boss/유피테르.png b/images/boss/유피테르.png new file mode 100644 index 0000000000000000000000000000000000000000..ea82b06a99f4d0ea18513937510cd21eccd9832e GIT binary patch literal 11924 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

80a0g+=m9lHYsA48Am1;cmJs_L z9g03EH=r~uH||4m6L*Ws#BCrqs?|k1bkc~C>b__IjltgQIjuC$!Xntj@&>W4>KZqz z;8=sNdukc24`1bEQ<(RDflw?WU}%GMLf1ssEvgysdQcWF!0|i{viPuGmj-<=18c95 zwXlY3UvwK0b0G$yic2kk`dJQw(i-_(1h(CBl?6nxq6L(VIyYVH1wvUJulGjSb|H5e z-767mqfgNWdxqectp{WwHTiRuWA{a8-vM{JD*%A_v~z#luu{|@`~XqMqiVhOb6bF> z%{+S@qfRm-V~!*TO6Dy9KS1cNRyLjCIzK?5pzci=WoKSP=SXo!>uHS#v>~Tzt6|P< zkv+{Sx??80;12+`E9CRVDrv`W5T7&Hw>C08Ae2?{8b$%Z_Cnmm$*aU-@u>9%8&nCx z%yLl`GQV-A4k0Xzibv!5Cqf2E?cvTEIfF!z^5bKlOaFmZkE8i_WY4#TZ=^%07;I+>X&+e zR;Sw>Xj|(D2-!7kHxJt+Um#*q#uj&~^^E&em&gDrqO|}4<#p>Zr8idL8_G}$2<*FL zXTFVT*qLM25V2w37Txit^Nj4I_t>#*Noy8Hxw^{c*R%357eTD30yD?iIs!s$kxc0a z2z)ixKJy&qCi}u}S-bhev??K>>9`{$mjVN^ji(l9QHX&Z5V(d_0D*u>hKMBstl-#J z9o2?#OgjuzGlciW->rbk*3d$5GgAlvSd;I|HV7!Zv0ZsJlLmyo<9`L0RLAwujD{wPeRaEe3tfPk3rYHmpNn-8;u5Yx;Is)IU>O7xpr{F>bgm+O zPlZ31_=MtsBG8g*$wEx!u{}uVL_J=VLd~`|yg(c@lp(IBPKM;3DclWmiV6tvGltk^ z>>JWKk2Qqy`nQ8&S(HF?y|1@#=~~i+x~CMOa>flqUQ~O z))`uG*=&_6-45v7YHY;ZfWTa=n6c3v$GC-2t02VIWABA1tpi4#HB|HmEJT0qYrhFI z00w~`N8w*`DhT#{n;V*?nUB-!C{K)0Q~!tZt$c#e5|{FJOZK~p93Y*brXCwt)CE*6 z3c}+=2oSIc4U!j@X8XML_hYA7fyD*044Wx)IHXwp8*5FuvP6<^L&j>u)T5{4y_Ocj zPY{vL=J6RI#+yhYXyZ7Ld!`P)EsPe*CkP51db9+_ax&qF; zC|U1hFhnW6XgN-FM|mLe;21$>^BRL~6_(e(wP gesS^tgFIgU1L|2~W)t^_pa1{>07*qoM6N<$f(8AYVgLXD literal 0 HcmV?d00001 diff --git a/images/boss/파풀라투스.png b/images/boss/파풀라투스.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f3518d772f1498a87891ab43d3038964256bfa GIT binary patch literal 5993 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 X7z=DlO3Oma00000NkvXXu0mjfUg$iL literal 0 HcmV?d00001 diff --git a/images/boss/피에르.png b/images/boss/피에르.png new file mode 100644 index 0000000000000000000000000000000000000000..73981d39d58f04cf9153598608385576ceff9504 GIT binary patch literal 6082 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 literal 0 HcmV?d00001 diff --git a/images/boss/힐라.png b/images/boss/힐라.png new file mode 100644 index 0000000000000000000000000000000000000000..5c884509aea5073c05424120f62005c310c96386 GIT binary patch literal 6331 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 literal 0 HcmV?d00001 diff --git a/images/difficulty/chaos.png b/images/difficulty/chaos.png new file mode 100644 index 0000000000000000000000000000000000000000..cf336a6be2fee30e72dc20597260722f3ad835ec GIT binary patch literal 1009 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1BOXNK~z{r-Iwc6 z(_j?F`v>sBe~W0ML{MOeCR_v*VR8|e1VIH<1a*^++d!}bCRiqvg<&h8(Rj&>3SnUV zK=gweR18Lmi5&C1p`~lNjBku4PkP?xocFx%Z{50<qvm zj0tjG1+i$SMpz;W}6ducCSS+nvoZ8WdAmsN$|$IZzt zMV^LIOVM_!ue8(0mqSFKp3vOmeyTW|!+eZyU#ZaR5W_Rh4F$WIcPcAA!oTCZNQ=_} zmP3s#IWZ#lTa_*AMJq6d<(3j|=3(2cJvVaU?NoQZkp3-9Qb4%L;wjNhuDWuTgWq+l zTCYV6&p7|r+&I%f`xV{8eAK~1&xPlMOvshnPwIWO^^9voBQS!M3(GAl$w>*8f~_ZvGejd`Z*IIsi!fbhq-61qkzrB8FLVq6=qx3i&jSy6L5uB zxc7>C^}vDsmV&MH{mn29cQsgi=+E33%Uv$dXF?25%Paj(dK>IwIrzC5X`A*$zMsFu zV$8uy?&uw-Xq_%FW8HtDrX*Y^ATS?vvl}bu?=E-N=SA&n?Z*WPaOK$EH1z z_d09zaZ_~>h2?JMj|)wfwYL%&!ODe#ohv*24Zrfcnan=)BP3EweVIN+3=eTlNgj)h z()yTtYPC3<*SLGLO79u13Uksa6!ffclL7DSPVdsy#W}S2!bbzmH7p+W)Uy~l_w=!kKAsX$-+ZZ9@2T`O zQ1aSO4d;>eT3UG2t*?i<<~?nuyo^-buxQZlFX04HiVI4StD~zuy00000NkvXXu0mjf;Y01r literal 0 HcmV?d00001 diff --git a/images/difficulty/easy.png b/images/difficulty/easy.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7ba6d311d4d3f9020ba714e7ef7d7568e02e2c GIT binary patch literal 826 zcmV-A1I7G_P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0?$cAK~z{r-IiNV z+F%&R`vJJ{^Qrp~#(3@h4$e)*3XPPuFG6Xph@Gg&QSme-6DMRc-ORFhV`AcsSH8>t z8SM)7X4D&L^5bovL;L*R27(}Tj;Lk`5;H+aV&<5{%#y^+TZx(cg@KtdI~?FbZe0fg z9fqTtaTC=HJ|MsaPXDAMYTA*Ve4=4cfE&5eM?_5zN7OVQa7Ia3RP>Oj=y#%`^M3jH z>$eYYK40CV7*=n5y-?-fe_T_pe%9owk)^fOzH)0!dyDePm37~9|C4)B(T5;BJ|9o< zAYh=wdV>VO>PE3EUvD%?tku4BW9Hf>^_6Q!)PtIQWsiChN8af@YhC!B*$<+kPe8aC zmXkaP7;vjn^Th#vIg#Hzs?!?RGZaTXu95HU!Ny<%QHz>PuHdWb2e=AhIr%UbTjD_= z;d0Fv2btV9<>k~$S6yP+rt3!Y8`XGwKIJQvE7cB3zW1K}0#{*XG4VLFnBYOca9%dc zyKe5_&aZbBthjUVWNi@OD$L2rhv}%sgMh&{iaWkIep!3p zK3KN%JS?XOr?$`$bgpqf@AY#4S0SPq&G!+N2LXfaAAjN5&5{e^)%|12&B;l(7H<-@ zpm}l0bHyF1$NBN;SGNvv^!7e02ocR_396YLhyB!o(l@KNwnlNcMUWa1?0bJk&H^-9>kMxMPymqsorTGU*<8NP}JZ8r1aDWT5 z?9nb+=kQ2}m}QSK%Pup^zGaq;9ePP%=2FK2E?u&J0P>^?rNUobP5=M^07*qoM6N<$ Ef(A;2SO5S3 literal 0 HcmV?d00001 diff --git a/images/difficulty/extreme.png b/images/difficulty/extreme.png new file mode 100644 index 0000000000000000000000000000000000000000..6ceb8cf30347af039d0674510fbe2beb9fbef1c2 GIT binary patch literal 1032 zcmV+j1o!)iP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1D#1kK~z{r-Iq;I z6JZpE=LfLx&uF4i5#_7XDWxp~v{0Y|p@~{Pi^c@OvLb2-E{uR16NdN^9Mm*XH$v0} z5nZX6khn2{5*z{9u;QBY4tMBGr*&(Y;TW=cDiq=Umy5=@DqBzg@cv0x|( z!%z}bWMF2@jts~ma@mfoun|K^WM;fA)F%f?^(f@=c!~>5hqn3M_j z^*{2qA$S67m9D96D389GVxU1c;Ht`NinRU+ud^;0z4 zeqLzsKnFO79~$rBKJddc-F88o52}?`&0h9%-_N~gtXbY)DHR&__t4j90Rj+?JP}2%^|YUV&#-cmeQvyW%Q=Y9Dsoz`wI2pb2l$YHB<^6-~t2G_?z6v z*|QK~kB>5;{ypheP4~XfBj*^HoxXCKZ>yw~S}m{|C?3l6l#BJa|4;{0O;tj7_JNLi zywO}A3|3oS?hg$f)X=|Ost|sFI=fH4+1x-zWR=#` zvQZX#p+0)lyvXcjmfKA|6*Bdih)nNdGQDnpC~ zspejgSCJZ8ZmG4%UV|U|oPA~*eAZejU|tY6FTgtVxKF0F_5l637@(xz)OenJv$=tc zs~sbI($dhxN}*5bt=2|*rUoeG_X*;PR{)(gu6fU7&@VJ+ALyu;!*%qvNws;o7YKW0 zt1mo1n(GD5K5nx)=Vy>{X=viRG^fq=ud4&po#%V_cO+`#RY;{pwShj?9|l7Gr6Fvc z-|^Q9ud@$y)LmYM*22wnzcyfbv$ z*wi+jMvm%})^l%+7RRP`H9dU{fkD&Kjl1FzEZ?0jMsR153E4C~9Yt0S42Iv{et=Ih z@k^uk2>eFH)$ zSU$2smuPyrSJTsrnw~Z^J&h|=Okn1PgAB-G3;P$sq4<3!r42#=0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0^dnQK~z{r-I7^P z6Hyq3=LhtHf2J{pC|igjwYE(R5)u~_1SANBv<+>-Vl2X-LSzIwfM}qopjHjCn06># zrtF0hgd48-%zI=eGZaiZcl0Dr^DXC_bDo)U+{uz{9xiG30#nlNEl=9Lfu!A=PTIY6 z!N8qycR0X>x#?EI+Qy2q%~K%TJX^BOLpcIm;KUr+idoz&Nm$#e6V^7$QQ*d0*-y;k zE{Iv&l;adJ;i%bZidbCxQL~eBnTW-87&SZdxbQ7!MWn2ijB;>rK&xFNYK|B+?VeO{ ziPd6N&oX8e{-kzkLzq6Zx3`?oone%a)m6zY*j*v%hJ%d4g!y-Bju-|d9rgj>nrjK%Txw=9p;`7(N7_06R2xki91H&@nlyjavgM!_Y{Lh0k{u8n>ssrEUmCti%6 zJBxkVo^~&Kc-HCjvjMK$>}}`Kd_g@K1s98Vi)xM-HN?w~z6`1D`LJ$Q9{8ZnVE=i~ z-Ie0HStG!eo2csy&0VV{qu^rEZoir%Mh$UN{6u@nb+wlmc>nKZn42?Zw||9cM~ds7 zi+QQJm)0hOEJu9${A`%0>kMf7un^h}u)wkz%?tj1VlYr~aP7N{$yq(}=^j|NZJC%4Pfx-ytuEc@PGLV~^V@ zc%>>Qfg3M~#c)-GLG@6Jk7lmd(AUfNa{{;wxA-7it$4DfkuH4MKfL9y@1QAjBhBPL zq%W85T_|wpshf=i2e|NpSfrCxmPXpd3t~Ahh||0vrg=fc8@fo~&VdsLxaeg60@I4P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D18+%0K~z{r-Be3Y z6JZpcAHc%DqA^BeNQ}`KO>Lzy@yW`CZj7R`L6qo96CWGjMi6j>Hqe3A;Z?9jD3x~F zDh3Mj5K)8@5CR)kUUP1_lW9Z3Z0VOAzWX@$alQ;yl#Ns3Hxzdu0Tj6di86N}5q1X> zOYT5|wi&Q9c83ONVQo3b)oO6C#BZD}@f-6ceuD}G&;m`Yk&m+_&W@|qsB*O$RG@%1 z*2;gJE%CF?mN*qS&a+^L7AtaTgDVa#MuiNgHn`@{VmlO9bM*Sr=FemYtE;QjH9C{y zKORW4ea0WB{>fR6O)o6b>)2QhPmuY$Oz%?@W*jxv8Ofh>92Z}DUTRO8G0e1b?BYao zv|Ksa6iFXxijp13(ihtjrvEB7#&&vkfpItdjnw1>=N?5yOdevW10Q~Q@Qc~+bZd-x z$V*IS;(-9vOH6v?@3$48RXOgBtRMCckR4#ibY_vXp()dUIXFspLPKod=t`N~#Pl4) z%Cq)?j~ikn_bxfkKH~5n_7Ag?e9OZim!8eAExkI^KiRMPn0?R-AL1NGul#v- z0IkZg#!vqaH1v@jV94`mn)=3nk?-rI>DL?I*|u_#&nzvQbygrJajCuCll{c4y-*Ks zS$p81ghS%r=HweObCPn4;Qv_D2Qw zW_936+{(Wn9%3HsrY{rxdm*!hf7_p4yL8$f)pktf`v51A>8bmm4~1cTG=00@_qfFNIbS z3{+Km+Nt<$kaksf7X+ZC($fL4RicxRMfABEpFV%Bp@WXscG14-Zrb@~djUH;Yr6;< zphea6^EqPWSVR}8nqH=AdatVKORA>hg|-v0b9h4owB(5W4@6tp0AJ2HumAu607*qo IM6N<$g6@aTivR!s literal 0 HcmV?d00001