From c82866b58a2b9229f34e1932c9dedd360af681db Mon Sep 17 00:00:00 2001 From: Manchik Date: Fri, 17 Apr 2026 22:22:40 +0300 Subject: [PATCH] v 3.0.3 --- .gitignore | 36 + README.md | 97 + app/__init__.py | 0 app/api/__init__.py | 0 app/api/accounts.py | 348 ++ app/api/actions.py | 86 + app/api/auto_accept.py | 49 + app/api/browser.py | 65 + app/api/logpass.py | 356 ++ app/api/logs.py | 67 + app/api/mafile_tools.py | 275 ++ app/api/proxies.py | 123 + app/api/settings.py | 210 + app/api/tasks.py | 101 + app/api/token_accounts.py | 245 ++ app/config.py | 50 + app/core/__init__.py | 0 app/core/auto_accept.py | 120 + app/core/crypto.py | 20 + app/core/exceptions.py | 35 + app/core/logging.py | 138 + app/core/proxy_manager.py | 78 + app/core/task_manager.py | 249 ++ app/database.py | 200 + app/models.py | 246 ++ app/services/__init__.py | 0 app/services/browser_login.py | 96 + app/services/registry.py | 20 + app/services/steam_auth.py | 192 + app/services/steam_auto_accept.py | 220 + app/services/steam_ban.py | 29 + app/services/steam_checker.py | 297 ++ app/services/steam_email.py | 201 + app/services/steam_guard.py | 83 + app/services/steam_password.py | 122 + app/services/steam_phone.py | 216 + app/services/steam_profile.py | 90 + app/services/steam_token_checker.py | 176 + app/services/steam_wizard.py | 397 ++ app/static.zip | Bin 0 -> 100380 bytes app/static/assets/index-Bxw--tTv.js | 14 + app/static/assets/index-Cm89176E.css | 2 + app/static/favicon.svg | 4 + app/static/index.html | 14 + assets/README_EN.md | 97 + assets/steampanel_en.png | Bin 0 -> 288754 bytes assets/steampanel_ru.png | Bin 0 -> 293342 bytes frontend/.gitignore | 24 + frontend/README.md | 73 + frontend/eslint.config.js | 23 + frontend/index.html | 13 + frontend/package-lock.json | 3619 +++++++++++++++++ frontend/package.json | 35 + frontend/postcss.config.js | 5 + frontend/public/favicon.svg | 4 + frontend/src/App.tsx | 36 + frontend/src/api/client.ts | 182 + frontend/src/api/types.ts | 260 ++ .../src/components/accounts/AccountRow.tsx | 283 ++ .../src/components/accounts/AccountTable.tsx | 183 + .../src/components/accounts/AccountsTab.tsx | 689 ++++ .../src/components/accounts/ActionMenu.tsx | 219 + frontend/src/components/accounts/AddModal.tsx | 41 + frontend/src/components/accounts/Badges.tsx | 37 + .../accounts/ColumnSettingsDropdown.tsx | 59 + .../src/components/accounts/EditModal.tsx | 47 + .../src/components/accounts/ImportModal.tsx | 74 + .../components/accounts/LogpassAddModal.tsx | 43 + .../LogpassColumnSettingsDropdown.tsx | 58 + .../components/accounts/LogpassEditModal.tsx | 70 + .../accounts/LogpassImportModal.tsx | 78 + .../src/components/accounts/LogpassTab.tsx | 658 +++ .../components/accounts/SteamLevelBadge.tsx | 21 + .../src/components/accounts/TokenAddModal.tsx | 53 + .../accounts/TokenColumnSettingsDropdown.tsx | 56 + .../components/accounts/TokenImportModal.tsx | 75 + frontend/src/components/accounts/TokenTab.tsx | 439 ++ frontend/src/components/layout/Header.tsx | 49 + frontend/src/components/layout/TabNav.tsx | 38 + frontend/src/components/layout/Toast.tsx | 22 + frontend/src/components/logs/LogStream.tsx | 75 + frontend/src/components/logs/LogsTab.tsx | 5 + frontend/src/components/logs/TaskPanel.tsx | 72 + frontend/src/components/mafiles/DropZone.tsx | 44 + .../src/components/mafiles/ExportSettings.tsx | 270 ++ frontend/src/components/mafiles/MafileTab.tsx | 67 + frontend/src/components/shared/Icons.tsx | 114 + frontend/src/components/shared/Modals.tsx | 58 + .../components/tools/DisplaySettingsCard.tsx | 3 + .../src/components/tools/ProxyManager.tsx | 377 ++ frontend/src/components/tools/ToolsTab.tsx | 15 + .../src/components/tools/TwoFAGenerator.tsx | 138 + .../components/tools/ValidationSettings.tsx | 149 + frontend/src/hooks/usePolling.ts | 17 + frontend/src/hooks/useSSE.ts | 26 + frontend/src/index.css | 262 ++ frontend/src/lib/clipboard.ts | 8 + frontend/src/lib/escapeHtml.ts | 11 + frontend/src/lib/i18n.ts | 598 +++ frontend/src/main.tsx | 40 + frontend/src/stores/accountStore.ts | 59 + frontend/src/stores/logpassStore.ts | 43 + frontend/src/stores/taskStore.ts | 21 + frontend/src/stores/tokenStore.ts | 43 + frontend/src/stores/uiStore.ts | 115 + frontend/tsconfig.app.json | 29 + frontend/tsconfig.json | 11 + frontend/tsconfig.node.json | 26 + frontend/vite.config.ts | 19 + main.py | 171 + pysteamauth/__init__.py | 2 + pysteamauth/abstract/__init__.py | 8 + pysteamauth/abstract/request.py | 29 + pysteamauth/abstract/storage.py | 16 + pysteamauth/auth/__init__.py | 6 + pysteamauth/auth/schemas.py | 20 + pysteamauth/auth/steam.py | 382 ++ pysteamauth/base/__init__.py | 8 + pysteamauth/base/request.py | 65 + pysteamauth/base/storage.py | 21 + pysteamauth/errors/__init__.py | 16 + pysteamauth/errors/codes.py | 125 + pysteamauth/errors/exceptions.py | 43 + pysteamauth/errors/response.py | 18 + pysteamauth/pb2/__init__.py | 26 + pysteamauth/pb2/enums_pb2.py | 427 ++ pysteamauth/pb2/enums_pb2.pyi | 7 + .../pb2/steammessages_auth/__init__.py | 0 .../pb2/steammessages_auth/steamclient_pb2.py | 744 ++++ .../steammessages_auth/steamclient_pb2.pyi | 139 + pysteamauth/pb2/steammessages_base_pb2.py | 290 ++ .../steammessages_unified_base/__init__.py | 0 .../steamclient_pb2.py | 68 + requirements.txt | 40 + run.bat | 77 + 135 files changed, 18493 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/__init__.py create mode 100644 app/api/__init__.py create mode 100644 app/api/accounts.py create mode 100644 app/api/actions.py create mode 100644 app/api/auto_accept.py create mode 100644 app/api/browser.py create mode 100644 app/api/logpass.py create mode 100644 app/api/logs.py create mode 100644 app/api/mafile_tools.py create mode 100644 app/api/proxies.py create mode 100644 app/api/settings.py create mode 100644 app/api/tasks.py create mode 100644 app/api/token_accounts.py create mode 100644 app/config.py create mode 100644 app/core/__init__.py create mode 100644 app/core/auto_accept.py create mode 100644 app/core/crypto.py create mode 100644 app/core/exceptions.py create mode 100644 app/core/logging.py create mode 100644 app/core/proxy_manager.py create mode 100644 app/core/task_manager.py create mode 100644 app/database.py create mode 100644 app/models.py create mode 100644 app/services/__init__.py create mode 100644 app/services/browser_login.py create mode 100644 app/services/registry.py create mode 100644 app/services/steam_auth.py create mode 100644 app/services/steam_auto_accept.py create mode 100644 app/services/steam_ban.py create mode 100644 app/services/steam_checker.py create mode 100644 app/services/steam_email.py create mode 100644 app/services/steam_guard.py create mode 100644 app/services/steam_password.py create mode 100644 app/services/steam_phone.py create mode 100644 app/services/steam_profile.py create mode 100644 app/services/steam_token_checker.py create mode 100644 app/services/steam_wizard.py create mode 100644 app/static.zip create mode 100644 app/static/assets/index-Bxw--tTv.js create mode 100644 app/static/assets/index-Cm89176E.css create mode 100644 app/static/favicon.svg create mode 100644 app/static/index.html create mode 100644 assets/README_EN.md create mode 100644 assets/steampanel_en.png create mode 100644 assets/steampanel_ru.png 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/postcss.config.js create mode 100644 frontend/public/favicon.svg create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/api/client.ts create mode 100644 frontend/src/api/types.ts create mode 100644 frontend/src/components/accounts/AccountRow.tsx create mode 100644 frontend/src/components/accounts/AccountTable.tsx create mode 100644 frontend/src/components/accounts/AccountsTab.tsx create mode 100644 frontend/src/components/accounts/ActionMenu.tsx create mode 100644 frontend/src/components/accounts/AddModal.tsx create mode 100644 frontend/src/components/accounts/Badges.tsx create mode 100644 frontend/src/components/accounts/ColumnSettingsDropdown.tsx create mode 100644 frontend/src/components/accounts/EditModal.tsx create mode 100644 frontend/src/components/accounts/ImportModal.tsx create mode 100644 frontend/src/components/accounts/LogpassAddModal.tsx create mode 100644 frontend/src/components/accounts/LogpassColumnSettingsDropdown.tsx create mode 100644 frontend/src/components/accounts/LogpassEditModal.tsx create mode 100644 frontend/src/components/accounts/LogpassImportModal.tsx create mode 100644 frontend/src/components/accounts/LogpassTab.tsx create mode 100644 frontend/src/components/accounts/SteamLevelBadge.tsx create mode 100644 frontend/src/components/accounts/TokenAddModal.tsx create mode 100644 frontend/src/components/accounts/TokenColumnSettingsDropdown.tsx create mode 100644 frontend/src/components/accounts/TokenImportModal.tsx create mode 100644 frontend/src/components/accounts/TokenTab.tsx create mode 100644 frontend/src/components/layout/Header.tsx create mode 100644 frontend/src/components/layout/TabNav.tsx create mode 100644 frontend/src/components/layout/Toast.tsx create mode 100644 frontend/src/components/logs/LogStream.tsx create mode 100644 frontend/src/components/logs/LogsTab.tsx create mode 100644 frontend/src/components/logs/TaskPanel.tsx create mode 100644 frontend/src/components/mafiles/DropZone.tsx create mode 100644 frontend/src/components/mafiles/ExportSettings.tsx create mode 100644 frontend/src/components/mafiles/MafileTab.tsx create mode 100644 frontend/src/components/shared/Icons.tsx create mode 100644 frontend/src/components/shared/Modals.tsx create mode 100644 frontend/src/components/tools/DisplaySettingsCard.tsx create mode 100644 frontend/src/components/tools/ProxyManager.tsx create mode 100644 frontend/src/components/tools/ToolsTab.tsx create mode 100644 frontend/src/components/tools/TwoFAGenerator.tsx create mode 100644 frontend/src/components/tools/ValidationSettings.tsx create mode 100644 frontend/src/hooks/usePolling.ts create mode 100644 frontend/src/hooks/useSSE.ts create mode 100644 frontend/src/index.css create mode 100644 frontend/src/lib/clipboard.ts create mode 100644 frontend/src/lib/escapeHtml.ts create mode 100644 frontend/src/lib/i18n.ts create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/stores/accountStore.ts create mode 100644 frontend/src/stores/logpassStore.ts create mode 100644 frontend/src/stores/taskStore.ts create mode 100644 frontend/src/stores/tokenStore.ts create mode 100644 frontend/src/stores/uiStore.ts create mode 100644 frontend/tsconfig.app.json create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts create mode 100644 main.py create mode 100644 pysteamauth/__init__.py create mode 100644 pysteamauth/abstract/__init__.py create mode 100644 pysteamauth/abstract/request.py create mode 100644 pysteamauth/abstract/storage.py create mode 100644 pysteamauth/auth/__init__.py create mode 100644 pysteamauth/auth/schemas.py create mode 100644 pysteamauth/auth/steam.py create mode 100644 pysteamauth/base/__init__.py create mode 100644 pysteamauth/base/request.py create mode 100644 pysteamauth/base/storage.py create mode 100644 pysteamauth/errors/__init__.py create mode 100644 pysteamauth/errors/codes.py create mode 100644 pysteamauth/errors/exceptions.py create mode 100644 pysteamauth/errors/response.py create mode 100644 pysteamauth/pb2/__init__.py create mode 100644 pysteamauth/pb2/enums_pb2.py create mode 100644 pysteamauth/pb2/enums_pb2.pyi create mode 100644 pysteamauth/pb2/steammessages_auth/__init__.py create mode 100644 pysteamauth/pb2/steammessages_auth/steamclient_pb2.py create mode 100644 pysteamauth/pb2/steammessages_auth/steamclient_pb2.pyi create mode 100644 pysteamauth/pb2/steammessages_base_pb2.py create mode 100644 pysteamauth/pb2/steammessages_unified_base/__init__.py create mode 100644 pysteamauth/pb2/steammessages_unified_base/steamclient_pb2.py create mode 100644 requirements.txt create mode 100644 run.bat diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f8f520 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# Python +__pycache__/ +*.py[cod] +*.pyo +*.egg-info/ +*.egg +dist/ +build/ +venv/ +.venv/ +docs/ + +# Frontend +frontend/node_modules/ + +# app/static/assets/ +# app/static/index.html + +# User data — DB, mafiles, logs, settings +data/ + +# IDE / tools +.github/ +.vscode/ +.history/ +.serena/ +.idea/ +*.swp +*.swo +*~ +.DS_Store +Thumbs.db + +# Misc +example/ +*.log \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..6141e5f --- /dev/null +++ b/README.md @@ -0,0 +1,97 @@ +![SteamPanel](assets/steampanel_ru.png) + +# SteamPanel + +> [English version](assets/README_EN.md) | **Автор:** [@lolzdm](https://t.me/lolzdm) + +Self-hosted веб-панель для массового управления Steam-аккаунтами. Backend на FastAPI + SQLite, фронт на React. Все операции выполняются пачками, прокси поддерживаются, прогресс задач в реальном времени через SSE. + +Поддерживает **3 типа аккаунтов**: +- **Mafile** — полные аккаунты с секретами (shared_secret, identity_secret) +- **Log:Pass** — логин + пароль +- **Token** — access/refresh токены *(в разработке, не работает)* + +--- + +## Функционал + +**Аккаунты** +- Импорт из `.txt`: `login:pass`, `login:pass:email:email_pass`, с mafile — любой формат +- Bulk-операции на выбранных или всех аккаунтах +- Поиск по логину, Steam ID, заметкам, уровню (`lvl>10`) +- Настраиваемые колонки для каждой вкладки + +**Действия со Steam** +- Смена пароля (ручной / рандомный) +- Смена email +- Смена / удаление телефона +- Удаление Steam Guard +- Авто-подтверждение входов (accept logins) +- Открытие Steam в браузере через [NoDriver](https://github.com/ultrafunkamsterdam/nodriver) (Chrome автоматизация) + +**Валидация** +- Проверка логина, банов, парсинг профиля (никнейм, аватар, уровень, последний онлайн) +- Настройка кол-ва потоков + +**Прокси** +- HTTP / SOCKS5 +- Форматы: `login:pass@ip:port`, `ip:port:login:pass` и др. + кастомный конструктор +- Проверка (alive/dead), round-robin назначение, очистка + +**Mafile** +- Mafile'ы привязываются к аккаунтам через раздел **Аккаунты** +- Экспорт в ZIP: выбор конкретных полей mafile и Session-блока +- Форматы экспорта: **flat** (все файлы в корне), **per-folder** (папка на аккаунт), **single JSON** (один файл) +- Шаблоны имён файлов с переменными `{username}`, `{steamid}` +- Генерация `.txt`: глобальный `accounts.txt`, отдельный `.txt` в каждой папке, кастомный формат строки + - Доступные переменные: `{login}`, `{password}`, `{email}`, `{email_password}`, `{steam_id}`, `{proxy}`, `{mafile}` +- Опция «не создавать папку для каждого аккаунта» при включённом глобальном `.txt` + +**Инструменты** +- Генератор 2FA кодов по `shared_secret` — результат копируется по клику +- Настройки валидации: включение/отключение парсинга профиля (никнейм/аватар), проверки банов, количество потоков (1–50) +- Режим скрытия паролей (spoiler-режим) + +--- + +## Установка + +### Способ 1 — `run.bat` (Windows, рекомендуется) + +Необходимо скачать архив, распаковать его и запустить `run.bat`. + +Скрипт выполнит следующие действия автоматически: +1. Проверит наличие Python в системе +2. Создаст виртуальное окружение `venv` +3. Установит все необходимые зависимости +4. Запустит main.py + +**Требования:** Python 3.14 — [python.org](https://python.org) + +--- + +### Способ 2 — вручную + +```bash +git clone https://github.com/LOLZ-dev/SteamPanel.git + +cd SteamPanel + +python -m venv venv + +venv\scripts\activate + +pip install -r requirements.txt + +python main.py +``` + +После запуска панель будет доступна по адресу `http://127.0.0.1:8000`. + +> Chrome/Chromium требуется только для функции «Открыть в браузере». + +--- + +## Лицензия + +MIT — **by [@lolzdm](https://t.me/lolzdm)** diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/api/__init__.py b/app/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/api/accounts.py b/app/api/accounts.py new file mode 100644 index 0000000..51de4e6 --- /dev/null +++ b/app/api/accounts.py @@ -0,0 +1,348 @@ +import json +from pathlib import Path + +from fastapi import APIRouter, HTTPException, UploadFile, File +from loguru import logger + +from app.database import get_db +from app.models import ( + AccountCreate, + AccountOut, + AccountUpdate, + BulkImportResult, + MafileData, +) +from app.config import settings + +router = APIRouter(prefix="/api/accounts", tags=["accounts"]) + + +@router.get("", response_model=list[AccountOut]) +async def list_accounts(): + db = await get_db() + cursor = await db.execute("SELECT * FROM accounts ORDER BY id DESC") + rows = await cursor.fetchall() + return [dict(r) for r in rows] + + +@router.get("/{account_id}", response_model=AccountOut) +async def get_account(account_id: int): + db = await get_db() + cursor = await db.execute("SELECT * FROM accounts WHERE id = ?", (account_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(status_code=404, detail="Account not found") + return dict(row) + + +@router.post("", response_model=AccountOut, status_code=201) +async def create_account(account: AccountCreate): + db = await get_db() + cursor = await db.execute( + """INSERT INTO accounts (login, password, steam_id, email, email_password, phone, proxy, notes) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)""", + ( + account.login, + account.password, + account.steam_id, + account.email, + account.email_password, + account.phone, + account.proxy, + account.notes, + ), + ) + await db.commit() + new_cursor = await db.execute( + "SELECT * FROM accounts WHERE id = ?", (cursor.lastrowid,) + ) + return dict(await new_cursor.fetchone()) + + +@router.put("/{account_id}", response_model=AccountOut) +async def update_account(account_id: int, account: AccountUpdate): + db = await get_db() + fields = {k: v for k, v in account.model_dump().items() if v is not None} + # Allow clearing fields by sending empty string → store as NULL + for k, v in account.model_dump().items(): + if v == "" and k not in fields: + fields[k] = None + if not fields: + raise HTTPException(status_code=400, detail="No fields to update") + + fields["updated_at"] = "datetime('now')" + set_clause = ", ".join( + f"{k} = datetime('now')" if k == "updated_at" else f"{k} = ?" + for k in fields + ) + values = [v for k, v in fields.items() if k != "updated_at"] + values.append(account_id) + + await db.execute( + f"UPDATE accounts SET {set_clause} WHERE id = ?", + values, + ) + await db.commit() + + cursor = await db.execute("SELECT * FROM accounts WHERE id = ?", (account_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(status_code=404, detail="Account not found") + return dict(row) + + +@router.delete("/{account_id}", status_code=204) +async def delete_account(account_id: int): + db = await get_db() + cursor = await db.execute("SELECT mafile_path FROM accounts WHERE id = ?", (account_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(status_code=404, detail="Account not found") + if row["mafile_path"]: + mafile = Path(row["mafile_path"]) + if mafile.exists(): + mafile.unlink() + await db.execute("DELETE FROM accounts WHERE id = ?", (account_id,)) + await db.commit() + +@router.post("/delete-bulk", status_code=200) +async def delete_accounts_bulk(request: dict): + """Delete multiple accounts by IDs list, or all if ids is empty.""" + db = await get_db() + ids = request.get("ids", []) + + if ids: + placeholders = ",".join("?" for _ in ids) + cursor = await db.execute( + f"SELECT id, mafile_path FROM accounts WHERE id IN ({placeholders})", ids + ) + else: + cursor = await db.execute("SELECT id, mafile_path FROM accounts") + + rows = await cursor.fetchall() + count = 0 + for row in rows: + if row["mafile_path"]: + mafile = Path(row["mafile_path"]) + if mafile.exists(): + mafile.unlink() + count += 1 + + if ids: + placeholders = ",".join("?" for _ in ids) + await db.execute(f"DELETE FROM accounts WHERE id IN ({placeholders})", ids) + else: + await db.execute("DELETE FROM accounts") + + await db.commit() + return {"deleted": count} + + +@router.post("/assign-proxies") +async def assign_proxies_round_robin(): + """Round-robin assign proxies to accounts that don't have one.""" + db = await get_db() + proxy_cursor = await db.execute("SELECT id, address, protocol FROM proxies ORDER BY id") + proxies = [dict(r) for r in await proxy_cursor.fetchall()] + if not proxies: + raise HTTPException(status_code=400, detail="No proxies available") + + acc_cursor = await db.execute("SELECT id FROM accounts WHERE proxy IS NULL OR proxy = '' ORDER BY id") + account_ids = [r["id"] for r in await acc_cursor.fetchall()] + if not account_ids: + return {"assigned": 0, "proxies_used": 0} + + for i, acc_id in enumerate(account_ids): + proxy = proxies[i % len(proxies)] + await db.execute( + "UPDATE accounts SET proxy = ?, updated_at = datetime('now') WHERE id = ?", + (proxy["address"], acc_id), + ) + await db.commit() + + from app.core.proxy_manager import proxy_manager + await proxy_manager.load() + logger.info(f"Assigned {len(proxies)} proxies to {len(account_ids)} accounts (round-robin)") + return {"assigned": len(account_ids), "proxies_used": len(proxies)} + + +@router.post("/reassign-proxies") +async def reassign_proxies_round_robin(): + """Round-robin reassign proxies to ALL accounts, overwriting existing.""" + db = await get_db() + proxy_cursor = await db.execute("SELECT id, address, protocol FROM proxies ORDER BY id") + proxies = [dict(r) for r in await proxy_cursor.fetchall()] + if not proxies: + raise HTTPException(status_code=400, detail="No proxies available") + + acc_cursor = await db.execute("SELECT id FROM accounts ORDER BY id") + account_ids = [r["id"] for r in await acc_cursor.fetchall()] + if not account_ids: + return {"assigned": 0, "proxies_used": 0} + + for i, acc_id in enumerate(account_ids): + proxy = proxies[i % len(proxies)] + await db.execute( + "UPDATE accounts SET proxy = ?, updated_at = datetime('now') WHERE id = ?", + (proxy["address"], acc_id), + ) + await db.commit() + + from app.core.proxy_manager import proxy_manager + await proxy_manager.load() + logger.info(f"Reassigned {len(proxies)} proxies to {len(account_ids)} accounts (round-robin)") + return {"assigned": len(account_ids), "proxies_used": len(proxies)} + + +@router.post("/clear-proxies") +async def clear_all_proxies(): + """Remove proxy assignment from all accounts.""" + db = await get_db() + cursor = await db.execute("UPDATE accounts SET proxy = NULL, updated_at = datetime('now') WHERE proxy IS NOT NULL AND proxy != ''") + await db.commit() + count = cursor.rowcount + + from app.core.proxy_manager import proxy_manager + await proxy_manager.load() + logger.info(f"Cleared proxies from {count} accounts") + return {"cleared": count} + + +@router.post("/import", response_model=BulkImportResult) +async def import_accounts(file: UploadFile = File(...)): + """Import accounts. + + Supported formats (: or | separator): + login|password|{mafile_json} + login|password|email|email_password|{mafile_json} + login|password|email|email_password + """ + content = (await file.read()).decode("utf-8", errors="ignore") + result = BulkImportResult() + db = await get_db() + + for raw_line in content.strip().splitlines(): + line = raw_line.strip() + if not line: + continue + + # Split off embedded mafile JSON (everything from first '{' onward) + json_start = line.find("{") + if json_start != -1: + mafile_str = line[json_start:] + prefix = line[:json_start].rstrip("|:") + else: + mafile_str = None + prefix = line + + sep = "|" if "|" in prefix else ":" + parts = prefix.split(sep) + + if mafile_str: + # Accepted: 2 fields (login|pass) or 4 fields (login|pass|email|email_pass) + if len(parts) == 2: + login, password = parts + email = email_password = None + elif len(parts) == 4: + login, password, email, email_password = parts + else: + result.errors.append(f"Invalid prefix (need 2 or 4 fields): {line[:50]}") + result.skipped += 1 + continue + + try: + mafile_data = json.loads(mafile_str) + except json.JSONDecodeError as exc: + result.errors.append(f"Bad mafile JSON on line starting '{prefix[:30]}': {exc}") + result.skipped += 1 + continue + + # Fall back to mail fields embedded in the mafile JSON itself + if not email: + email = mafile_data.get("mail") or mafile_data.get("email") or None + email_password = mafile_data.get("mail_password") or mafile_data.get("email_password") or None + else: + # No mafile — must be exactly 4 fields + if len(parts) != 4: + result.errors.append(f"Invalid line (need 4 fields): {line[:50]}") + result.skipped += 1 + continue + login, password, email, email_password = parts + mafile_data = None + + try: + # Check if account with this login already exists + existing = await db.execute( + "SELECT id FROM accounts WHERE login = ?", (login,) + ) + if await existing.fetchone(): + result.errors.append(f"{login}: уже существует") + result.skipped += 1 + continue + + await db.execute( + """INSERT INTO accounts (login, password, email, email_password) + VALUES (?, ?, ?, ?)""", + (login, password, email or None, email_password or None), + ) + result.imported += 1 + except Exception as exc: + result.errors.append(f"{login}: {exc}") + result.skipped += 1 + continue + + if mafile_data: + account_name = mafile_data.get("account_name") or login + shared_secret = mafile_data.get("shared_secret") or "" + identity_secret = mafile_data.get("identity_secret") or "" + steam_id = (mafile_data.get("Session") or {}).get("SteamID") or None + + settings.mafiles_dir.mkdir(parents=True, exist_ok=True) + dest = settings.mafiles_dir / f"{account_name}.mafile" + dest.write_text(json.dumps(mafile_data, ensure_ascii=False), encoding="utf-8") + + await db.execute( + """UPDATE accounts + SET mafile_path = ?, shared_secret = ?, identity_secret = ?, steam_id = ? + WHERE login = ? AND steam_id IS NULL""", + (str(dest), shared_secret, identity_secret, steam_id, login), + ) + + await db.commit() + logger.info(f"Imported {result.imported} accounts, skipped {result.skipped}") + return result + + +@router.post("/{account_id}/mafile") +async def upload_mafile(account_id: int, file: UploadFile = File(...)): + """Bind a .mafile to an account.""" + db = await get_db() + cursor = await db.execute("SELECT * FROM accounts WHERE id = ?", (account_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(status_code=404, detail="Account not found") + + content = (await file.read()).decode("utf-8") + try: + mafile = MafileData.model_validate_json(content) + except Exception: + raise HTTPException(status_code=400, detail="Invalid mafile format") + + settings.mafiles_dir.mkdir(parents=True, exist_ok=True) + steam_id = mafile.Session.SteamID or row["steam_id"] or account_id + mafile_path = settings.mafiles_dir / f"{steam_id}.mafile" + mafile_path.write_text(content, encoding="utf-8") + + await db.execute( + """UPDATE accounts SET mafile_path = ?, shared_secret = ?, identity_secret = ?, + steam_id = COALESCE(steam_id, ?), updated_at = datetime('now') WHERE id = ?""", + ( + str(mafile_path), + mafile.shared_secret, + mafile.identity_secret, + str(mafile.Session.SteamID) if mafile.Session.SteamID else None, + account_id, + ), + ) + await db.commit() + return {"status": "ok", "mafile_path": str(mafile_path)} diff --git a/app/api/actions.py b/app/api/actions.py new file mode 100644 index 0000000..c3eaa63 --- /dev/null +++ b/app/api/actions.py @@ -0,0 +1,86 @@ +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel +from loguru import logger + +from app.database import get_db +from app.models import ActionRequest +from app.core.task_manager import task_manager + +router = APIRouter(prefix="/api/actions", tags=["actions"]) + +VALID_ACTIONS = { + "change_password", + "random_password", + "change_email", + "change_phone", + "remove_guard", + "generate_2fa", + "validate", + "add_friend", + "accept_logins", + "change_language", +} + + +@router.post("") +async def execute_action(request: ActionRequest): + if request.action not in VALID_ACTIONS: + raise HTTPException( + status_code=400, + detail=f"Invalid action. Valid: {', '.join(sorted(VALID_ACTIONS))}", + ) + + db = await get_db() + placeholders = ",".join("?" for _ in request.account_ids) + cursor = await db.execute( + f"SELECT * FROM accounts WHERE id IN ({placeholders})", + request.account_ids, + ) + accounts = [dict(r) for r in await cursor.fetchall()] + + if not accounts: + raise HTTPException(status_code=404, detail="No accounts found") + + task_id = await task_manager.submit( + task_type=request.action, + accounts=accounts, + params=request.params or {}, + ) + + logger.info( + f"Action '{request.action}' submitted for {len(accounts)} accounts → task {task_id}" + ) + return {"task_id": task_id, "accounts_count": len(accounts)} + + +class Generate2FARequest(BaseModel): + shared_secret: str + + +class Generate2FAByAccountRequest(BaseModel): + account_id: int + + +@router.post("/generate-2fa") +async def generate_2fa_code(request: Generate2FARequest): + """Server-side 2FA code generation from shared_secret.""" + from app.services.steam_guard import generate_2fa_code as gen_code + + code = gen_code(request.shared_secret) + return {"code": code} + + +@router.post("/generate-2fa-by-account") +async def generate_2fa_by_account(request: Generate2FAByAccountRequest): + """Generate 2FA code for an account using its stored shared_secret.""" + from app.services.steam_guard import generate_2fa_code as gen_code + + db = await get_db() + cursor = await db.execute( + "SELECT shared_secret FROM accounts WHERE id = ?", + (request.account_id,), + ) + row = await cursor.fetchone() + if not row or not row["shared_secret"]: + raise HTTPException(status_code=404, detail="Account not found or has no shared_secret") + return {"code": gen_code(row["shared_secret"])} diff --git a/app/api/auto_accept.py b/app/api/auto_accept.py new file mode 100644 index 0000000..46679d9 --- /dev/null +++ b/app/api/auto_accept.py @@ -0,0 +1,49 @@ +from fastapi import APIRouter, HTTPException +from pydantic import BaseModel + +from app.database import get_db +from app.core.auto_accept import auto_accept_manager + +router = APIRouter(prefix="/api/auto-accept", tags=["auto-accept"]) + + +class AutoAcceptRequest(BaseModel): + account_ids: list[int] + + +@router.post("/start") +async def start_auto_accept(body: AutoAcceptRequest): + db = await get_db() + started: list[int] = [] + for aid in body.account_ids: + cursor = await db.execute("SELECT * FROM accounts WHERE id = ?", (aid,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(404, f"Account {aid} not found") + account = dict(row) + if not account.get("shared_secret"): + raise HTTPException(400, f"Account {account['login']} has no shared_secret (mafile)") + await auto_accept_manager.start(account) + await db.execute("UPDATE accounts SET auto_accept = 1 WHERE id = ?", (aid,)) + started.append(aid) + await db.commit() + return {"started": started} + + +@router.post("/stop") +async def stop_auto_accept(body: AutoAcceptRequest): + db = await get_db() + stopped: list[int] = [] + for aid in body.account_ids: + auto_accept_manager.stop(aid) + await db.execute("UPDATE accounts SET auto_accept = 0 WHERE id = ?", (aid,)) + stopped.append(aid) + await db.commit() + return {"stopped": stopped} + + +@router.get("/status") +async def auto_accept_status(): + running = auto_accept_manager.running_ids() + errors = auto_accept_manager.pop_errors() + return {"running": list(running), "errors": errors} diff --git a/app/api/browser.py b/app/api/browser.py new file mode 100644 index 0000000..a7f36e1 --- /dev/null +++ b/app/api/browser.py @@ -0,0 +1,65 @@ +import asyncio + +from fastapi import APIRouter, HTTPException +from loguru import logger + +from app.database import get_db +from app.config import read_validation_settings +from app.core.task_manager import task_manager + +router = APIRouter(prefix="/api", tags=["browser"]) + + +@router.post("/accounts/{account_id}/browser") +async def open_browser(account_id: int): + db = await get_db() + cursor = await db.execute("SELECT * FROM accounts WHERE id = ?", (account_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(404, "Account not found") + + account = dict(row) + + from app.services.steam_auth import check_cookies_alive, _resolve_proxy + from app.config import read_validation_settings + + # If account isn't validated or has no cookies — auto-revalidate if enabled + if account["status"] != "valid" or not account.get("session_cookies"): + val_settings = read_validation_settings() + if val_settings.get("auto_revalidate_browser"): + task_id = await task_manager.submit( + task_type="validate", + accounts=[account], + params={}, + ) + logger.info(f"Account {account['login']} not valid/no cookies, auto-revalidating → task {task_id}") + return {"status": "revalidating", "message": "Cookies expired. Re-validating...", "task_id": task_id} + if account["status"] != "valid": + raise HTTPException(400, "Account is not validated") + raise HTTPException(400, "No session cookies. Validate the account first.") + + proxy = await _resolve_proxy(account) + alive = await check_cookies_alive(account["session_cookies"], proxy) + if not alive: + val_settings = read_validation_settings() + if val_settings.get("auto_revalidate_browser"): + task_id = await task_manager.submit( + task_type="validate", + accounts=[account], + params={}, + ) + logger.info(f"Cookies dead for {account['login']}, auto-revalidating → task {task_id}") + return {"status": "revalidating", "message": "Cookies expired. Re-validating...", "task_id": task_id} + raise HTTPException(400, "Session cookies expired. Re-validate the account.") + + from app.services.browser_login import open_browser_with_cookies + + async def _run(): + try: + await open_browser_with_cookies(account) + except Exception as exc: + logger.error(f"Browser open failed for {account['login']}: {exc}") + + asyncio.create_task(_run()) + + return {"status": "ok", "message": "Browser opening..."} diff --git a/app/api/logpass.py b/app/api/logpass.py new file mode 100644 index 0000000..0717498 --- /dev/null +++ b/app/api/logpass.py @@ -0,0 +1,356 @@ +"""CRUD and validate endpoints for log:pass accounts.""" + +import csv +import ctypes +import io +import sys + +csv.field_size_limit(min(sys.maxsize, ctypes.c_ulong(-1).value // 2)) + +from fastapi import APIRouter, HTTPException +from loguru import logger + +from app.database import get_db +from app.models import ( + LogpassAccountCreate, + LogpassAccountOut, + LogpassAccountUpdate, +) +from app.core.task_manager import task_manager + +router = APIRouter(prefix="/api/logpass", tags=["logpass"]) + + +@router.get("", response_model=list[LogpassAccountOut]) +async def list_logpass(): + db = await get_db() + cursor = await db.execute("SELECT * FROM logpass_accounts ORDER BY id DESC") + rows = await cursor.fetchall() + return [dict(r) for r in rows] + + +@router.get("/{account_id}", response_model=LogpassAccountOut) +async def get_logpass(account_id: int): + db = await get_db() + cursor = await db.execute("SELECT * FROM logpass_accounts WHERE id = ?", (account_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(status_code=404, detail="Account not found") + return dict(row) + + +@router.post("", response_model=LogpassAccountOut, status_code=201) +async def create_logpass(account: LogpassAccountCreate): + db = await get_db() + cursor = await db.execute( + "INSERT INTO logpass_accounts (login, password, steam_id, proxy, notes) VALUES (?, ?, ?, ?, ?)", + (account.login, account.password, account.steam_id, account.proxy, account.notes), + ) + await db.commit() + new_cursor = await db.execute( + "SELECT * FROM logpass_accounts WHERE id = ?", (cursor.lastrowid,) + ) + return dict(await new_cursor.fetchone()) + + +@router.put("/{account_id}", response_model=LogpassAccountOut) +async def update_logpass(account_id: int, account: LogpassAccountUpdate): + db = await get_db() + fields = {k: v for k, v in account.model_dump().items() if v is not None} + if not fields: + raise HTTPException(status_code=400, detail="No fields to update") + fields["updated_at"] = "datetime('now')" + set_clause = ", ".join( + f"{k} = datetime('now')" if k == "updated_at" else f"{k} = ?" + for k in fields + ) + values = [v for k, v in fields.items() if k != "updated_at"] + values.append(account_id) + await db.execute( + f"UPDATE logpass_accounts SET {set_clause} WHERE id = ?", values + ) + await db.commit() + cursor = await db.execute("SELECT * FROM logpass_accounts WHERE id = ?", (account_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(status_code=404, detail="Account not found") + return dict(row) + + +@router.delete("/{account_id}", status_code=204) +async def delete_logpass(account_id: int): + db = await get_db() + await db.execute("DELETE FROM logpass_accounts WHERE id = ?", (account_id,)) + await db.commit() + + +@router.post("/delete-bulk") +async def delete_logpass_bulk(data: dict): + ids: list[int] = data.get("ids", []) + if not ids: + return {"deleted": 0} + db = await get_db() + placeholders = ",".join("?" for _ in ids) + await db.execute(f"DELETE FROM logpass_accounts WHERE id IN ({placeholders})", ids) + await db.commit() + return {"deleted": len(ids)} + + +@router.post("/import") +async def import_logpass(data: dict): + """Bulk import from plain text (login:pass / login|pass) or CSV with headers.""" + lines: list[str] = data.get("lines", []) + if not lines: + return {"imported": 0, "skipped": 0, "errors": []} + + imported = 0 + skipped = 0 + errors: list[str] = [] + + db = await get_db() + + async def upsert(login: str, fields: dict): + """Insert or update by login, works with or without UNIQUE index.""" + cursor = await db.execute( + "SELECT id FROM logpass_accounts WHERE login = ?", (login,) + ) + existing = await cursor.fetchone() + if existing: + sets = ", ".join(f"{k} = ?" for k in fields) + vals = list(fields.values()) + [existing["id"]] + await db.execute( + f"UPDATE logpass_accounts SET {sets}, updated_at = datetime('now') WHERE id = ?", + vals, + ) + else: + fields["login"] = login + cols = ", ".join(fields.keys()) + placeholders = ", ".join("?" for _ in fields) + await db.execute( + f"INSERT INTO logpass_accounts ({cols}) VALUES ({placeholders})", + list(fields.values()), + ) + + # Detect CSV: first line looks like a header row + first = lines[0].strip().lower() + is_csv = first.startswith("login,") or first.startswith("login;") + + try: + if is_csv: + text = "\n".join(lines) + reader = csv.DictReader(io.StringIO(text)) + for row in reader: + login = (row.get("login") or "").strip() + password = (row.get("password") or "").strip() + if not login or not password: + skipped += 1 + continue + fields = {"password": password} + _NA = {"n/a", "na", "none", "null", ""} + for csv_col, db_col in [ + ("steam_id", "steam_id"), ("ban", "ban_status"), + ("prime", "prime"), ("trophy", "trophy"), + ("behavior", "behavior"), ("license", "license"), + ]: + val = (row.get(csv_col) or "").strip() + if val: + if db_col in ("prime", "trophy", "behavior") and val.lower() in _NA: + val = "\u2014" + fields[db_col] = val + try: + await upsert(login, fields) + imported += 1 + except Exception as exc: + logger.error(f"Logpass CSV import error for '{login}': {exc}") + errors.append(f"{login}: {exc}") + else: + for raw in lines: + line = raw.strip() + if not line: + skipped += 1 + continue + # Skip JSON/mafile lines + if line.startswith("{") or line.startswith("["): + skipped += 1 + continue + if "|" in line: + parts = line.split("|", 1) + elif ":" in line: + parts = line.split(":", 1) + else: + skipped += 1 + continue + login, password = parts[0].strip(), parts[1].strip() + if not login or not password: + skipped += 1 + continue + # Reject if password looks like JSON (mafile embedded) or is too long + if password.startswith("{") or password.startswith("[") or len(password) > 128: + skipped += 1 + logger.warning(f"Logpass import: skipped '{login}' — password looks like mafile or is too long ({len(password)} chars)") + continue + try: + await upsert(login, {"password": password}) + imported += 1 + except Exception as exc: + logger.error(f"Logpass import error for '{login}': {exc}") + errors.append(f"{login}: {exc}") + + await db.commit() + except Exception as exc: + logger.exception(f"Logpass import failed: {exc}") + raise HTTPException(status_code=500, detail=str(exc)) + + return {"imported": imported, "skipped": skipped, "errors": errors} + + +@router.post("/validate") +async def validate_logpass(data: dict): + """Submit validation task for selected log:pass accounts.""" + ids: list[int] = data.get("account_ids", []) + if not ids: + raise HTTPException(status_code=400, detail="No account IDs provided") + + db = await get_db() + placeholders = ",".join("?" for _ in ids) + cursor = await db.execute( + f"SELECT * FROM logpass_accounts WHERE id IN ({placeholders})", ids + ) + accounts = [dict(r) for r in await cursor.fetchall()] + if not accounts: + raise HTTPException(status_code=404, detail="No accounts found") + + task_id = await task_manager.submit( + task_type="logpass_validate", + accounts=accounts, + params={}, + ) + logger.info(f"logpass_validate submitted for {len(accounts)} accounts → task {task_id}") + return {"task_id": task_id, "accounts_count": len(accounts)} + + +@router.post("/full-parse") +async def full_parse_logpass(data: dict): + """Submit full parse task (prime, trophy, behavior, licenses) for selected accounts.""" + ids: list[int] = data.get("account_ids", []) + if not ids: + raise HTTPException(status_code=400, detail="No account IDs provided") + + db = await get_db() + placeholders = ",".join("?" for _ in ids) + cursor = await db.execute( + f"SELECT * FROM logpass_accounts WHERE id IN ({placeholders})", ids + ) + accounts = [dict(r) for r in await cursor.fetchall()] + if not accounts: + raise HTTPException(status_code=404, detail="No accounts found") + + task_id = await task_manager.submit( + task_type="logpass_full_parse", + accounts=accounts, + params={}, + ) + logger.info(f"logpass_full_parse submitted for {len(accounts)} accounts → task {task_id}") + return {"task_id": task_id, "accounts_count": len(accounts)} + + +@router.post("/assign-proxies") +async def logpass_assign_proxies(): + """Round-robin assign proxies to logpass accounts that don't have one.""" + db = await get_db() + proxy_cursor = await db.execute("SELECT address FROM proxies ORDER BY id") + proxies = [r["address"] for r in await proxy_cursor.fetchall()] + if not proxies: + raise HTTPException(status_code=400, detail="No proxies available") + + acc_cursor = await db.execute( + "SELECT id FROM logpass_accounts WHERE proxy IS NULL OR proxy = '' ORDER BY id" + ) + account_ids = [r["id"] for r in await acc_cursor.fetchall()] + if not account_ids: + return {"assigned": 0, "proxies_used": 0} + + for i, acc_id in enumerate(account_ids): + await db.execute( + "UPDATE logpass_accounts SET proxy = ?, updated_at = datetime('now') WHERE id = ?", + (proxies[i % len(proxies)], acc_id), + ) + await db.commit() + return {"assigned": len(account_ids), "proxies_used": len(proxies)} + + +@router.post("/reassign-proxies") +async def logpass_reassign_proxies(): + """Round-robin reassign proxies to ALL logpass accounts.""" + db = await get_db() + proxy_cursor = await db.execute("SELECT address FROM proxies ORDER BY id") + proxies = [r["address"] for r in await proxy_cursor.fetchall()] + if not proxies: + raise HTTPException(status_code=400, detail="No proxies available") + + acc_cursor = await db.execute("SELECT id FROM logpass_accounts ORDER BY id") + account_ids = [r["id"] for r in await acc_cursor.fetchall()] + if not account_ids: + return {"assigned": 0, "proxies_used": 0} + + for i, acc_id in enumerate(account_ids): + await db.execute( + "UPDATE logpass_accounts SET proxy = ?, updated_at = datetime('now') WHERE id = ?", + (proxies[i % len(proxies)], acc_id), + ) + await db.commit() + return {"assigned": len(account_ids), "proxies_used": len(proxies)} + + +@router.post("/clear-proxies") +async def logpass_clear_proxies(): + """Remove proxy from all logpass accounts.""" + db = await get_db() + cursor = await db.execute( + "UPDATE logpass_accounts SET proxy = NULL, updated_at = datetime('now') WHERE proxy IS NOT NULL AND proxy != ''" + ) + await db.commit() + return {"cleared": cursor.rowcount} + + +@router.post("/{account_id}/browser") +async def open_logpass_browser(account_id: int): + """Open Chrome browser with saved session cookies for a logpass account.""" + import asyncio + db = await get_db() + cursor = await db.execute("SELECT * FROM logpass_accounts WHERE id = ?", (account_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(status_code=404, detail="Account not found") + + account = dict(row) + if not account.get("session_cookies"): + raise HTTPException(status_code=400, detail="No session cookies. Validate the account first.") + + from app.services.steam_auth import check_cookies_alive, _resolve_proxy + from app.config import read_validation_settings + + proxy = await _resolve_proxy(account) + alive = await check_cookies_alive(account["session_cookies"], proxy) + if not alive: + val_settings = read_validation_settings() + if val_settings.get("auto_revalidate_browser"): + task_id = await task_manager.submit( + task_type="logpass_validate", + accounts=[account], + params={}, + ) + logger.info(f"Cookies dead for {account['login']}, auto-revalidating → task {task_id}") + return {"status": "revalidating", "message": "Cookies expired. Re-validating...", "task_id": task_id} + raise HTTPException(status_code=400, detail="Session cookies expired. Re-validate the account.") + + from app.services.browser_login import open_browser_with_cookies + + async def _run(): + try: + await open_browser_with_cookies(account) + except Exception as exc: + logger.error(f"Browser open failed for {account['login']}: {exc}") + + asyncio.create_task(_run()) + return {"status": "ok", "message": "Browser opening..."} diff --git a/app/api/logs.py b/app/api/logs.py new file mode 100644 index 0000000..1dc7452 --- /dev/null +++ b/app/api/logs.py @@ -0,0 +1,67 @@ +import asyncio +import json +from collections import deque +from typing import Any + +from fastapi import APIRouter +from fastapi.responses import StreamingResponse +from loguru import logger + +router = APIRouter(prefix="/api/logs", tags=["logs"]) + +_LOG_BUFFER: deque[dict[str, Any]] = deque(maxlen=500) +_SUBSCRIBERS: list[asyncio.Queue] = [] + +LEVEL_ICONS = { + "TRACE": "~", + "DEBUG": ".", + "INFO": "i", + "SUCCESS": "+", + "WARNING": "!", + "ERROR": "e", + "CRITICAL": "e", +} + + +def _log_sink(message: Any) -> None: + record = message.record + entry = { + "ts": record["time"].strftime("%H:%M:%S"), + "level": record["level"].name.lower(), + "icon": LEVEL_ICONS.get(record["level"].name, "i"), + "msg": record["message"], + } + _LOG_BUFFER.append(entry) + for q in _SUBSCRIBERS[:]: + try: + q.put_nowait(entry) + except asyncio.QueueFull: + pass + + +def install_log_sink() -> None: + logger.add(_log_sink, format="{message}", level="DEBUG", colorize=False) + + +@router.get("") +async def get_logs(): + return list(_LOG_BUFFER) + + +@router.get("/stream") +async def stream_logs(): + queue: asyncio.Queue = asyncio.Queue(maxsize=200) + _SUBSCRIBERS.append(queue) + + async def event_generator(): + try: + while True: + entry = await queue.get() + yield f"data: {json.dumps(entry, ensure_ascii=False)}\n\n" + except asyncio.CancelledError: + pass + finally: + if queue in _SUBSCRIBERS: + _SUBSCRIBERS.remove(queue) + + return StreamingResponse(event_generator(), media_type="text/event-stream") diff --git a/app/api/mafile_tools.py b/app/api/mafile_tools.py new file mode 100644 index 0000000..2b3b768 --- /dev/null +++ b/app/api/mafile_tools.py @@ -0,0 +1,275 @@ +import json +import io +import zipfile +from pathlib import Path + +from fastapi import APIRouter, HTTPException, UploadFile, File +from fastapi.responses import StreamingResponse +from loguru import logger +from pydantic import BaseModel + +from app.config import settings +from app.database import get_db +from app.models import MafileData + +router = APIRouter(prefix="/api/mafiles", tags=["mafile_tools"]) + + +@router.get("") +async def list_mafiles(): + """List all stored mafiles.""" + mafiles_dir = settings.mafiles_dir + if not mafiles_dir.exists(): + return [] + + result = [] + for f in sorted(mafiles_dir.glob("*.mafile")): + try: + data = json.loads(f.read_text(encoding="utf-8")) + result.append({ + "filename": f.name, + "account_name": data.get("account_name", ""), + "steam_id": data.get("Session", {}).get("SteamID", ""), + "has_shared_secret": bool(data.get("shared_secret")), + "has_identity_secret": bool(data.get("identity_secret")), + "fully_enrolled": data.get("fully_enrolled", False), + }) + except (json.JSONDecodeError, OSError): + result.append({"filename": f.name, "error": "Failed to parse"}) + return result + + +@router.post("/upload") +async def upload_mafiles(files: list[UploadFile] = File(...)): + """Upload multiple .mafile files.""" + settings.mafiles_dir.mkdir(parents=True, exist_ok=True) + uploaded = 0 + errors: list[str] = [] + + db = await get_db() + + for file in files: + content = (await file.read()).decode("utf-8", errors="ignore") + try: + mafile = MafileData.model_validate_json(content) + steam_id = mafile.Session.SteamID or mafile.account_name or file.filename + dest = settings.mafiles_dir / f"{steam_id}.mafile" + dest.write_text(content, encoding="utf-8") + uploaded += 1 + + if mafile.account_name: + await db.execute( + """UPDATE accounts + SET mafile_path = ?, shared_secret = ?, identity_secret = ? + WHERE login = ?""", + ( + str(dest), + mafile.shared_secret or "", + mafile.identity_secret or "", + mafile.account_name, + ), + ) + await db.commit() + except Exception as exc: + errors.append(f"{file.filename}: {exc}") + + logger.info(f"Uploaded {uploaded} mafiles, {len(errors)} errors") + return {"uploaded": uploaded, "errors": errors} + + +@router.get("/{filename}") +async def get_mafile(filename: str): + """Get parsed mafile data by filename.""" + safe_name = Path(filename).name + mafile_path = settings.mafiles_dir / safe_name + if not mafile_path.exists() or not mafile_path.suffix == ".mafile": + raise HTTPException(status_code=404, detail="Mafile not found") + + content = mafile_path.read_text(encoding="utf-8") + try: + return json.loads(content) + except json.JSONDecodeError: + raise HTTPException(status_code=500, detail="Failed to parse mafile") + + +@router.delete("/{filename}", status_code=204) +async def delete_mafile(filename: str): + safe_name = Path(filename).name + mafile_path = settings.mafiles_dir / safe_name + if not mafile_path.exists(): + raise HTTPException(status_code=404, detail="Mafile not found") + mafile_path.unlink() + + +@router.get("/export/all") +async def export_all_secrets(): + """Export account_name:shared_secret:identity_secret for all mafiles.""" + mafiles_dir = settings.mafiles_dir + if not mafiles_dir.exists(): + return [] + + result = [] + for f in sorted(mafiles_dir.glob("*.mafile")): + try: + data = json.loads(f.read_text(encoding="utf-8")) + result.append({ + "account_name": data.get("account_name", ""), + "shared_secret": data.get("shared_secret", ""), + "identity_secret": data.get("identity_secret", ""), + "steam_id": data.get("Session", {}).get("SteamID", ""), + }) + except (json.JSONDecodeError, OSError): + pass + return result + + +class ExportRequest(BaseModel): + fields: list[str] = [] + session_fields: list[str] = [] + format: str = "flat_mafiles" # flat_mafiles | per_account_folder | single_file + account_ids: list[int] = [] + # Naming variables: {username} and {steamid} are replaced at export time + folder_name_template: str = "{username}" + mafile_name_template: str = "{steamid}.mafile" + txt_name_template: str = "{username}.txt" + include_txt_per_folder: bool = False + include_global_txt: bool = False + skip_folders: bool = False + # Format for .txt lines: login:password:email:email_password + txt_format: str = "{login}:{password}:{email}:{email_password}" + + +def _filter_mafile(data: dict, fields: list[str], session_fields: list[str]) -> dict: + """Keep only selected top-level + Session fields from mafile JSON.""" + if not fields and not session_fields: + return data + + filtered = {} + for key in fields: + if key in data and key != "Session": + filtered[key] = data[key] + + if session_fields and "Session" in data: + filtered["Session"] = { + k: v for k, v in data["Session"].items() if k in session_fields + } + + return filtered + + +@router.post("/export/zip") +async def export_mafiles_zip(body: ExportRequest): + """Build a .zip with filtered mafile data, optionally limited to account IDs.""" + if not body.account_ids: + raise HTTPException(status_code=400, detail="No account IDs provided for export") + + mafiles_dir = settings.mafiles_dir + if not mafiles_dir.exists(): + raise HTTPException(status_code=404, detail="No mafiles directory") + + db = await get_db() + + # Load account info for naming and .txt generation + account_map: dict[str, dict] = {} # login -> account row + if body.account_ids: + placeholders = ",".join("?" * len(body.account_ids)) + cursor = await db.execute( + f"SELECT * FROM accounts WHERE id IN ({placeholders})", + body.account_ids, + ) + else: + cursor = await db.execute("SELECT * FROM accounts") + for row in await cursor.fetchall(): + account_map[row["login"]] = dict(row) + + account_logins = set(account_map.keys()) if body.account_ids else set() + + def _resolve_template(template: str, username: str, steam_id: str) -> str: + return template.replace("{username}", username).replace("{steamid}", steam_id) + + def _resolve_txt_line(template: str, acc: dict, mafile_data: dict | None = None) -> str: + has_mafile_var = "{mafile}" in template + if has_mafile_var: + before, _, after = template.partition("{mafile}") + else: + before = template + + line = ( + before + .replace("{login}", acc.get("login") or "") + .replace("{password}", acc.get("password") or "") + .replace("{email}", acc.get("email") or "") + .replace("{email_password}", acc.get("email_password") or "") + .replace("{steam_id}", acc.get("steam_id") or "") + .replace("{proxy}", acc.get("proxy") or "") + ) + line = line.rstrip(":") + if has_mafile_var and mafile_data is not None: + line += ":" + json.dumps(mafile_data, ensure_ascii=False, separators=(",", ":")) + return line + + buf = io.BytesIO() + all_data: list[str] = [] + global_txt_lines: list[str] = [] + folder_txt_map: dict[str, list[str]] = {} # folder_name -> lines + + with zipfile.ZipFile(buf, "w", zipfile.ZIP_DEFLATED) as zf: + for f in sorted(mafiles_dir.glob("*.mafile")): + try: + raw = json.loads(f.read_text(encoding="utf-8")) + except (json.JSONDecodeError, OSError): + continue + + acct_name = raw.get("account_name", "") + steam_id = str(raw.get("Session", {}).get("SteamID", "")) + + if account_logins: + if acct_name not in account_logins and steam_id not in {str(a) for a in body.account_ids}: + continue + + filtered = _filter_mafile(raw, body.fields, body.session_fields) + + # Find matching account record for txt + acc = account_map.get(acct_name, {}) + + if body.format == "single_file": + if acc: + all_data.append(_resolve_txt_line(body.txt_format, acc, filtered)) + else: + all_data.append(json.dumps(filtered, ensure_ascii=False, separators=(",", ":"))) + elif body.format == "per_account_folder": + folder_name = _resolve_template(body.folder_name_template, acct_name, steam_id) + mafile_name = _resolve_template(body.mafile_name_template, acct_name, steam_id) + + if body.skip_folders: + zf.writestr(mafile_name, json.dumps(filtered, ensure_ascii=False, separators=(",", ":"))) + else: + zf.writestr(f"{folder_name}/{mafile_name}", json.dumps(filtered, ensure_ascii=False, separators=(",", ":"))) + + if body.include_txt_per_folder and acc: + txt_name = _resolve_template(body.txt_name_template, acct_name, steam_id) + line = _resolve_txt_line(body.txt_format, acc, filtered) + if folder_name not in folder_txt_map: + folder_txt_map[folder_name] = [] + folder_txt_map[folder_name].append(line) + zf.writestr(f"{folder_name}/{txt_name}", line + "\n") + else: + mafile_name = _resolve_template(body.mafile_name_template, acct_name, steam_id) + zf.writestr(mafile_name, json.dumps(filtered, ensure_ascii=False, separators=(",", ":"))) + + # Collect global txt line + if body.include_global_txt and acc: + global_txt_lines.append(_resolve_txt_line(body.txt_format, acc, filtered)) + + if body.format == "single_file" and all_data: + zf.writestr("accounts.txt", "\n".join(all_data) + "\n") + + if body.include_global_txt and global_txt_lines: + zf.writestr("accounts.txt", "\n".join(global_txt_lines) + "\n") + + buf.seek(0) + return StreamingResponse( + buf, + media_type="application/zip", + headers={"Content-Disposition": "attachment; filename=mafiles_export.zip"}, + ) diff --git a/app/api/proxies.py b/app/api/proxies.py new file mode 100644 index 0000000..abe1bc5 --- /dev/null +++ b/app/api/proxies.py @@ -0,0 +1,123 @@ +import asyncio + +from fastapi import APIRouter, HTTPException +from loguru import logger + +from app.database import get_db +from app.models import ProxyCreate, ProxyOut + +router = APIRouter(prefix="/api/proxies", tags=["proxies"]) + + +@router.get("", response_model=list[ProxyOut]) +async def list_proxies(): + db = await get_db() + cursor = await db.execute("SELECT * FROM proxies ORDER BY id") + rows = await cursor.fetchall() + return [dict(r) for r in rows] + + +@router.post("", response_model=ProxyOut, status_code=201) +async def add_proxy(proxy: ProxyCreate): + db = await get_db() + try: + cursor = await db.execute( + "INSERT INTO proxies (address, protocol) VALUES (?, ?)", + (proxy.address, proxy.protocol), + ) + await db.commit() + except Exception: + raise HTTPException(status_code=409, detail="Proxy already exists") + + new_cursor = await db.execute( + "SELECT * FROM proxies WHERE id = ?", (cursor.lastrowid,) + ) + return dict(await new_cursor.fetchone()) + + +@router.delete("/all", status_code=200) +async def delete_all_proxies(): + db = await get_db() + cursor = await db.execute("SELECT COUNT(*) as cnt FROM proxies") + row = await cursor.fetchone() + count = row["cnt"] + await db.execute("DELETE FROM proxies") + await db.commit() + from app.core.proxy_manager import proxy_manager + await proxy_manager.load() + logger.info(f"Deleted all {count} proxies") + return {"deleted": count} + + +@router.delete("/{proxy_id}", status_code=204) +async def delete_proxy(proxy_id: int): + db = await get_db() + result = await db.execute("DELETE FROM proxies WHERE id = ?", (proxy_id,)) + await db.commit() + if result.rowcount == 0: + raise HTTPException(status_code=404, detail="Proxy not found") + + +@router.post("/bulk") +async def bulk_add_proxies(proxies: list[ProxyCreate]): + db = await get_db() + added = 0 + for p in proxies: + try: + await db.execute( + "INSERT OR IGNORE INTO proxies (address, protocol) VALUES (?, ?)", + (p.address, p.protocol), + ) + added += 1 + except Exception: + pass + await db.commit() + logger.info(f"Bulk added {added} proxies") + return {"added": added} + + +async def _check_one_proxy(proxy_id: int, address: str, protocol: str) -> dict: + """Check proxy by making a real HTTP request through it.""" + import aiohttp + from aiohttp_socks import ProxyConnector + from app.core.proxy_manager import build_proxy_url + + try: + proxy_url = build_proxy_url(address, protocol) + connector = ProxyConnector.from_url(proxy_url, ssl=False) + + async with aiohttp.ClientSession(connector=connector) as session: + async with session.get( + "https://steamcommunity.com/robots.txt", + timeout=aiohttp.ClientTimeout(total=3), + ) as resp: + alive = resp.status == 200 + except Exception: + alive = False + + db = await get_db() + await db.execute( + "UPDATE proxies SET is_alive = ?, last_checked = datetime('now') WHERE id = ?", + (int(alive), proxy_id), + ) + await db.commit() + return {"id": proxy_id, "alive": alive} + + +@router.post("/check") +async def check_proxies(): + db = await get_db() + cursor = await db.execute("SELECT id, address, protocol FROM proxies ORDER BY id") + rows = await cursor.fetchall() + if not rows: + return {"total": 0, "alive": 0, "dead": 0} + + sem = asyncio.Semaphore(300) + + async def limited(row): + async with sem: + return await _check_one_proxy(row["id"], row["address"], row["protocol"]) + + results = await asyncio.gather(*(limited(r) for r in rows)) + alive_count = sum(1 for r in results if r["alive"]) + return {"total": len(results), "alive": alive_count, "dead": len(results) - alive_count} diff --git a/app/api/settings.py b/app/api/settings.py new file mode 100644 index 0000000..df5e792 --- /dev/null +++ b/app/api/settings.py @@ -0,0 +1,210 @@ +import json +from pathlib import Path + +from fastapi import APIRouter +from pydantic import BaseModel + +from app.config import settings + +router = APIRouter(prefix="/api/settings", tags=["settings"]) + +SETTINGS_FILE = settings.data_dir / "settings.json" + +DEFAULTS = { + "validation": { + "fetch_profile": True, + "check_ban": True, + "max_threads": 5, + "auto_revalidate_browser": True, + }, + "display": { + "hide_passwords": False, + }, + "columns": { + "browser": True, + "profile": True, + "steam_id": True, + "login": True, + "password": True, + "login_pass": True, + "email": True, + "phone": True, + "status": True, + "ban": True, + "twofa": True, + "mafile": True, + "proxy": True, + "actions": True, + }, + "logpass_columns": { + "browser": True, + "profile": True, + "steam_id": True, + "login": True, + "password": True, + "login_pass": True, + "status": True, + "ban": True, + "prime": True, + "trophy": True, + "behavior": True, + "license": True, + "proxy": True, + "notes": True, + "actions": True, + }, + "token_columns": { + "browser": True, + "profile": True, + "last_online": True, + "steam_id": True, + "login": True, + "token": True, + "status": True, + "proxy": True, + "notes": True, + "actions": True, + }, +} + + +def _read() -> dict: + if SETTINGS_FILE.exists(): + return json.loads(SETTINGS_FILE.read_text("utf-8")) + return DEFAULTS.copy() + + +def _write(data: dict) -> None: + SETTINGS_FILE.parent.mkdir(parents=True, exist_ok=True) + SETTINGS_FILE.write_text(json.dumps(data, indent=2, ensure_ascii=False), "utf-8") + + +class ValidationSettings(BaseModel): + fetch_profile: bool = True + check_ban: bool = True + max_threads: int = 5 + auto_revalidate_browser: bool = True + + +class DisplaySettings(BaseModel): + hide_passwords: bool = False + + +class ColumnSettings(BaseModel): + browser: bool = True + profile: bool = True + steam_id: bool = True + login: bool = True + password: bool = True + login_pass: bool = True + email: bool = True + phone: bool = True + status: bool = True + ban: bool = True + twofa: bool = True + mafile: bool = True + proxy: bool = True + actions: bool = True + last_online: bool = True + + +@router.get("/validation", response_model=ValidationSettings) +async def get_validation_settings(): + data = _read() + return data.get("validation", DEFAULTS["validation"]) + + +@router.put("/validation", response_model=ValidationSettings) +async def update_validation_settings(body: ValidationSettings): + data = _read() + data["validation"] = body.model_dump() + _write(data) + return data["validation"] + + +@router.get("/display", response_model=DisplaySettings) +async def get_display_settings(): + data = _read() + return data.get("display", DEFAULTS["display"]) + + +@router.put("/display", response_model=DisplaySettings) +async def update_display_settings(body: DisplaySettings): + data = _read() + data["display"] = body.model_dump() + _write(data) + return data["display"] + + +@router.get("/columns", response_model=ColumnSettings) +async def get_column_settings(): + data = _read() + return data.get("columns", DEFAULTS["columns"]) + + +@router.put("/columns", response_model=ColumnSettings) +async def update_column_settings(body: ColumnSettings): + data = _read() + data["columns"] = body.model_dump() + _write(data) + return data["columns"] + + +class LogpassColumnSettings(BaseModel): + browser: bool = True + profile: bool = True + steam_id: bool = True + login: bool = True + password: bool = True + login_pass: bool = True + status: bool = True + ban: bool = True + prime: bool = True + trophy: bool = True + behavior: bool = True + license: bool = True + proxy: bool = True + notes: bool = True + actions: bool = True + last_online: bool = True + + +@router.get("/logpass-columns", response_model=LogpassColumnSettings) +async def get_logpass_column_settings(): + data = _read() + return data.get("logpass_columns", DEFAULTS["logpass_columns"]) + + +@router.put("/logpass-columns", response_model=LogpassColumnSettings) +async def update_logpass_column_settings(body: LogpassColumnSettings): + data = _read() + data["logpass_columns"] = body.model_dump() + _write(data) + return data["logpass_columns"] + + +class TokenColumnSettings(BaseModel): + browser: bool = True + profile: bool = True + last_online: bool = True + steam_id: bool = True + login: bool = True + token: bool = True + status: bool = True + proxy: bool = True + notes: bool = True + actions: bool = True + + +@router.get("/token-columns", response_model=TokenColumnSettings) +async def get_token_column_settings(): + data = _read() + return data.get("token_columns", DEFAULTS["token_columns"]) + + +@router.put("/token-columns", response_model=TokenColumnSettings) +async def update_token_column_settings(body: TokenColumnSettings): + data = _read() + data["token_columns"] = body.model_dump() + _write(data) + return data["token_columns"] diff --git a/app/api/tasks.py b/app/api/tasks.py new file mode 100644 index 0000000..995aa46 --- /dev/null +++ b/app/api/tasks.py @@ -0,0 +1,101 @@ +import asyncio +import json + +from fastapi import APIRouter, HTTPException +from fastapi.responses import StreamingResponse +from loguru import logger + +from app.database import get_db +from app.models import TaskOut +from app.core.task_manager import task_manager + +router = APIRouter(prefix="/api/tasks", tags=["tasks"]) + + +@router.get("", response_model=list[TaskOut]) +async def list_tasks(): + db = await get_db() + cursor = await db.execute("SELECT * FROM tasks ORDER BY created_at DESC LIMIT 50") + rows = await cursor.fetchall() + return [dict(r) for r in rows] + + +@router.get("/{task_id}", response_model=TaskOut) +async def get_task(task_id: str): + db = await get_db() + cursor = await db.execute("SELECT * FROM tasks WHERE id = ?", (task_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(status_code=404, detail="Task not found") + return dict(row) + + +@router.get("/{task_id}/stream") +async def stream_task(task_id: str): + """SSE endpoint for real-time task progress.""" + + async def event_generator(): + last_data = None + while True: + db = await get_db() + cursor = await db.execute("SELECT * FROM tasks WHERE id = ?", (task_id,)) + row = await cursor.fetchone() + if not row: + yield f"data: {json.dumps({'error': 'Task not found'})}\n\n" + break + + task = dict(row) + # Parse JSON string fields from DB into dicts for proper serialization + for json_field in ("account_ids", "account_results"): + if isinstance(task.get(json_field), str): + try: + task[json_field] = json.loads(task[json_field]) + except (json.JSONDecodeError, TypeError): + pass + prompt_info = task_manager.get_pending_prompt(task_id) + if prompt_info: + task["prompt"] = prompt_info["message"] + task["prompt_login"] = prompt_info["login"] + step_info = task_manager.get_step_info(task_id) + if step_info: + task["step"] = step_info["step"] + task["total_steps"] = step_info["total_steps"] + task["step_label"] = step_info["label"] + active = task_manager.get_active_count(task_id) + if active > 0: + task["active_count"] = active + acc_results = task_manager.get_account_results(task_id) + if acc_results: + task["account_results"] = {str(k): v for k, v in acc_results.items()} + acc_steps = task_manager.get_account_steps(task_id) + if acc_steps: + task["account_steps"] = {str(k): v for k, v in acc_steps.items()} + + data_str = json.dumps(task) + if data_str != last_data or task["status"] in ("completed", "failed", "cancelled"): + last_data = data_str + yield f"data: {data_str}\n\n" + + if task["status"] in ("completed", "failed", "cancelled"): + break + + await asyncio.sleep(0.5) + + return StreamingResponse(event_generator(), media_type="text/event-stream") + + +@router.post("/{task_id}/respond") +async def respond_to_prompt(task_id: str, body: dict): + """Provide user input for a pending task prompt.""" + value = body.get("value", "") + login = body.get("login", "") + if not task_manager.respond(task_id, value, login): + raise HTTPException(status_code=404, detail="No pending prompt for this task") + return {"status": "ok"} + + +@router.delete("/{task_id}", status_code=204) +async def cancel_task(task_id: str): + cancelled = task_manager.cancel(task_id) + if not cancelled: + raise HTTPException(status_code=404, detail="Task not found or already finished") diff --git a/app/api/token_accounts.py b/app/api/token_accounts.py new file mode 100644 index 0000000..1e5fa8e --- /dev/null +++ b/app/api/token_accounts.py @@ -0,0 +1,245 @@ +"""CRUD and validate endpoints for token accounts.""" + +import asyncio + +from fastapi import APIRouter, HTTPException +from loguru import logger + +from app.database import get_db +from app.core.task_manager import task_manager +from app.models import TokenAccountCreate, TokenAccountOut, TokenAccountUpdate + +router = APIRouter(prefix="/api/token-accounts", tags=["token-accounts"]) + + +@router.get("", response_model=list[TokenAccountOut]) +async def list_tokens(): + db = await get_db() + cursor = await db.execute("SELECT * FROM token_accounts ORDER BY id DESC") + rows = await cursor.fetchall() + return [dict(r) for r in rows] + + +@router.get("/{account_id}", response_model=TokenAccountOut) +async def get_token(account_id: int): + db = await get_db() + cursor = await db.execute("SELECT * FROM token_accounts WHERE id = ?", (account_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(status_code=404, detail="Account not found") + return dict(row) + + +@router.post("", response_model=TokenAccountOut, status_code=201) +async def create_token(account: TokenAccountCreate): + db = await get_db() + cursor = await db.execute( + "INSERT INTO token_accounts (login, token, steam_id, proxy, notes) VALUES (?, ?, ?, ?, ?)", + (account.login, account.token, account.steam_id, account.proxy, account.notes), + ) + await db.commit() + new_cursor = await db.execute( + "SELECT * FROM token_accounts WHERE id = ?", (cursor.lastrowid,) + ) + return dict(await new_cursor.fetchone()) + + +@router.put("/{account_id}", response_model=TokenAccountOut) +async def update_token(account_id: int, account: TokenAccountUpdate): + db = await get_db() + fields = {k: v for k, v in account.model_dump().items() if v is not None} + if not fields: + raise HTTPException(status_code=400, detail="No fields to update") + fields["updated_at"] = "datetime('now')" + set_clause = ", ".join( + f"{k} = datetime('now')" if k == "updated_at" else f"{k} = ?" + for k in fields + ) + values = [v for k, v in fields.items() if k != "updated_at"] + values.append(account_id) + await db.execute(f"UPDATE token_accounts SET {set_clause} WHERE id = ?", values) + await db.commit() + cursor = await db.execute("SELECT * FROM token_accounts WHERE id = ?", (account_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(status_code=404, detail="Account not found") + return dict(row) + + +@router.delete("/{account_id}", status_code=204) +async def delete_token(account_id: int): + db = await get_db() + await db.execute("DELETE FROM token_accounts WHERE id = ?", (account_id,)) + await db.commit() + + +@router.post("/delete-bulk") +async def delete_token_bulk(data: dict): + ids: list[int] = data.get("ids", []) + if not ids: + return {"deleted": 0} + db = await get_db() + placeholders = ",".join("?" for _ in ids) + await db.execute(f"DELETE FROM token_accounts WHERE id IN ({placeholders})", ids) + await db.commit() + return {"deleted": len(ids)} + + +@router.post("/import") +async def import_tokens(data: dict): + """Bulk import: one token per line, optionally 'login:token'.""" + lines: list[str] = data.get("lines", []) + imported = 0 + skipped = 0 + errors: list[str] = [] + + db = await get_db() + for raw in lines: + line = raw.strip() + if not line: + skipped += 1 + continue + login = None + token = line + if ":" in line: + parts = line.split(":", 1) + login, token = parts[0].strip(), parts[1].strip() + if not token: + skipped += 1 + continue + try: + await db.execute( + "INSERT OR IGNORE INTO token_accounts (login, token) VALUES (?, ?)", + (login, token), + ) + imported += 1 + except Exception as exc: + errors.append(f"{token[:20]}: {exc}") + await db.commit() + return {"imported": imported, "skipped": skipped, "errors": errors} + + +@router.post("/validate") +async def validate_tokens(data: dict): + """Submit validation task for selected token accounts.""" + ids: list[int] = data.get("account_ids", []) + if not ids: + raise HTTPException(status_code=400, detail="No account IDs provided") + + db = await get_db() + placeholders = ",".join("?" for _ in ids) + cursor = await db.execute( + f"SELECT * FROM token_accounts WHERE id IN ({placeholders})", ids + ) + accounts = [dict(r) for r in await cursor.fetchall()] + if not accounts: + raise HTTPException(status_code=404, detail="No accounts found") + + task_id = await task_manager.submit( + task_type="token_validate", + accounts=accounts, + params={}, + ) + logger.info(f"token_validate submitted for {len(accounts)} accounts → task {task_id}") + return {"task_id": task_id, "accounts_count": len(accounts)} + + +@router.post("/{account_id}/browser") +async def open_token_browser(account_id: int): + """Open Chrome browser with saved session cookies for a token account.""" + db = await get_db() + cursor = await db.execute("SELECT * FROM token_accounts WHERE id = ?", (account_id,)) + row = await cursor.fetchone() + if not row: + raise HTTPException(status_code=404, detail="Account not found") + + account = dict(row) + if not account.get("session_cookies"): + raise HTTPException(status_code=400, detail="No session cookies. Validate the account first.") + + from app.services.steam_auth import check_cookies_alive, _resolve_proxy + from app.config import read_validation_settings + + proxy = await _resolve_proxy(account) + alive = await check_cookies_alive(account["session_cookies"], proxy) + if not alive: + val_settings = read_validation_settings() + if val_settings.get("auto_revalidate_browser"): + task_id = await task_manager.submit( + task_type="token_validate", + accounts=[account], + params={}, + ) + logger.info(f"Cookies dead for token account {account_id}, auto-revalidating → task {task_id}") + return {"status": "revalidating", "message": "Cookies expired. Re-validating...", "task_id": task_id} + raise HTTPException(status_code=400, detail="Session cookies expired. Re-validate the account.") + + from app.services.browser_login import open_browser_with_cookies + + async def _run(): + try: + await open_browser_with_cookies(account) + except Exception as exc: + logger.error(f"Browser open failed for {account.get('login', account_id)}: {exc}") + + asyncio.create_task(_run()) + return {"status": "ok", "message": "Browser opening..."} + + +@router.post("/assign-proxies") +async def token_assign_proxies(): + """Round-robin assign proxies to token accounts that don't have one.""" + db = await get_db() + proxy_cursor = await db.execute("SELECT address FROM proxies ORDER BY id") + proxies = [r["address"] for r in await proxy_cursor.fetchall()] + if not proxies: + raise HTTPException(status_code=400, detail="No proxies available") + + acc_cursor = await db.execute( + "SELECT id FROM token_accounts WHERE proxy IS NULL OR proxy = '' ORDER BY id" + ) + account_ids = [r["id"] for r in await acc_cursor.fetchall()] + if not account_ids: + return {"assigned": 0, "proxies_used": 0} + + for i, acc_id in enumerate(account_ids): + await db.execute( + "UPDATE token_accounts SET proxy = ?, updated_at = datetime('now') WHERE id = ?", + (proxies[i % len(proxies)], acc_id), + ) + await db.commit() + return {"assigned": len(account_ids), "proxies_used": len(proxies)} + + +@router.post("/reassign-proxies") +async def token_reassign_proxies(): + """Round-robin reassign proxies to ALL token accounts.""" + db = await get_db() + proxy_cursor = await db.execute("SELECT address FROM proxies ORDER BY id") + proxies = [r["address"] for r in await proxy_cursor.fetchall()] + if not proxies: + raise HTTPException(status_code=400, detail="No proxies available") + + acc_cursor = await db.execute("SELECT id FROM token_accounts ORDER BY id") + account_ids = [r["id"] for r in await acc_cursor.fetchall()] + if not account_ids: + return {"assigned": 0, "proxies_used": 0} + + for i, acc_id in enumerate(account_ids): + await db.execute( + "UPDATE token_accounts SET proxy = ?, updated_at = datetime('now') WHERE id = ?", + (proxies[i % len(proxies)], acc_id), + ) + await db.commit() + return {"assigned": len(account_ids), "proxies_used": len(proxies)} + + +@router.post("/clear-proxies") +async def token_clear_proxies(): + """Remove proxy from all token accounts.""" + db = await get_db() + cursor = await db.execute( + "UPDATE token_accounts SET proxy = NULL, updated_at = datetime('now') WHERE proxy IS NOT NULL AND proxy != ''" + ) + await db.commit() + return {"cleared": cursor.rowcount} diff --git a/app/config.py b/app/config.py new file mode 100644 index 0000000..c73f9c4 --- /dev/null +++ b/app/config.py @@ -0,0 +1,50 @@ +from pathlib import Path +from pydantic_settings import BaseSettings + + +class Settings(BaseSettings): + app_name: str = "SteamPanel" + debug: bool = False + host: str = "127.0.0.1" + port: int = 8000 + + base_dir: Path = Path(__file__).resolve().parent.parent + data_dir: Path = base_dir / "data" + db_path: Path = data_dir / "accounts.db" + mafiles_dir: Path = data_dir / "mafiles" + logs_dir: Path = data_dir / "logs" + proxies_path: Path = data_dir / "proxies.json" + + max_concurrent_tasks: int = 5 + request_timeout: int = 30 + proxy_rotation_interval: int = 60 + + model_config = {"env_prefix": "STEAM_PANEL_"} + + +settings = Settings() + + +# Defaults for data/settings.json → "validation" section +_VALIDATION_DEFAULTS: dict = { + "fetch_profile": True, + "check_ban": True, + "max_threads": 10, + "account_timeout": 90, + "auto_revalidate_browser": True, +} + + +def read_validation_settings() -> dict: + """Read the 'validation' section from data/settings.json (sync, for small file).""" + import json as _json + + settings_path = settings.data_dir / "settings.json" + result = _VALIDATION_DEFAULTS.copy() + if settings_path.exists(): + try: + data = _json.loads(settings_path.read_text("utf-8")) + result.update(data.get("validation", {})) + except Exception: + pass + return result diff --git a/app/core/__init__.py b/app/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/core/auto_accept.py b/app/core/auto_accept.py new file mode 100644 index 0000000..b5cf221 --- /dev/null +++ b/app/core/auto_accept.py @@ -0,0 +1,120 @@ +"""AutoAcceptManager — manages per-account background loops for auto-accepting Steam logins.""" + +import asyncio + +import aiohttp +from loguru import logger + +from app.services.steam_auto_accept import mobile_login, get_pending_sessions, confirm_session +from app.database import get_db + +CHECK_INTERVAL = 15 # seconds + + +class AutoAcceptManager: + def __init__(self) -> None: + self._tasks: dict[int, asyncio.Task] = {} + self._tokens: dict[int, str] = {} + self._errors: dict[int, str] = {} + + async def start(self, account: dict) -> None: + account_id = account["id"] + if account_id in self._tasks and not self._tasks[account_id].done(): + return + + self._tasks[account_id] = asyncio.create_task(self._loop(account)) + logger.info(f"[auto-accept] Started monitoring for {account['login']} (id={account_id})") + + def stop(self, account_id: int) -> None: + task = self._tasks.pop(account_id, None) + self._tokens.pop(account_id, None) + self._errors.pop(account_id, None) + if task and not task.done(): + task.cancel() + logger.info(f"[auto-accept] Stopped monitoring for id={account_id}") + + def is_running(self, account_id: int) -> bool: + task = self._tasks.get(account_id) + return task is not None and not task.done() + + def running_ids(self) -> set[int]: + # Cleanup dead tasks + dead = [aid for aid, t in self._tasks.items() if t.done()] + for aid in dead: + self._tasks.pop(aid, None) + self._tokens.pop(aid, None) + return {aid for aid, t in self._tasks.items() if not t.done()} + + def get_errors(self) -> dict[int, str]: + """Return error messages for accounts that stopped unexpectedly.""" + return dict(self._errors) + + def pop_errors(self) -> dict[int, str]: + """Return and clear error messages.""" + errors = dict(self._errors) + self._errors.clear() + return errors + + async def _loop(self, account: dict) -> None: + account_id = account["id"] + login = account["login"] + + async with aiohttp.ClientSession() as session: + # Initial mobile login + token = await mobile_login(session, account) + if not token: + logger.error(f"[auto-accept] Initial login failed for {login}, stopping") + self._errors[account_id] = "Initial login failed" + await self._disable_in_db(account_id) + return + self._tokens[account_id] = token + + while True: + try: + await asyncio.sleep(CHECK_INTERVAL) + + client_ids = await get_pending_sessions(session, self._tokens[account_id]) + + # Token expired — re-login + if client_ids is None: + logger.warning(f"[auto-accept] Token expired for {login}, re-logging...") + new_token = await mobile_login(session, account) + if new_token: + self._tokens[account_id] = new_token + client_ids = await get_pending_sessions(session, new_token) + else: + logger.error(f"[auto-accept] Re-login failed for {login}, stopping") + self._errors[account_id] = "Re-login failed (token expired)" + await self._disable_in_db(account_id) + return + + if not client_ids: + continue + + for cid in client_ids: + await confirm_session(session, self._tokens[account_id], account, cid) + await asyncio.sleep(1) + + except asyncio.CancelledError: + logger.info(f"[auto-accept] Loop cancelled for {login}") + return + except Exception as exc: + logger.error(f"[auto-accept] Loop error for {login}: {exc}") + await asyncio.sleep(CHECK_INTERVAL) + + async def stop_all(self) -> None: + for aid in list(self._tasks): + self.stop(aid) + + async def _disable_in_db(self, account_id: int) -> None: + """Reset auto_accept flag in DB when task fails.""" + try: + db = await get_db() + await db.execute("UPDATE accounts SET auto_accept = 0 WHERE id = ?", (account_id,)) + await db.commit() + logger.info(f"[auto-accept] Disabled auto_accept in DB for id={account_id}") + except Exception as exc: + logger.error(f"[auto-accept] Failed to update DB for id={account_id}: {exc}") + + +auto_accept_manager = AutoAcceptManager() diff --git a/app/core/crypto.py b/app/core/crypto.py new file mode 100644 index 0000000..f109825 --- /dev/null +++ b/app/core/crypto.py @@ -0,0 +1,20 @@ +import base64 + +import rsa + + +def get_rsa_key(response_data: dict) -> tuple[str, str, int]: + """Extract RSA key components from Steam's getrsakey response.""" + mod = response_data["publickey_mod"] + exp = response_data["publickey_exp"] + timestamp = int(response_data["timestamp"]) + return mod, exp, timestamp + + +def encrypt_password(password: str, mod_hex: str, exp_hex: str) -> str: + """RSA-encrypt a password using Steam's public key, return base64.""" + mod = int(mod_hex, 16) + exp = int(exp_hex, 16) + public_key = rsa.PublicKey(mod, exp) + encrypted = rsa.encrypt(password.encode("ascii"), public_key) + return base64.b64encode(encrypted).decode("ascii") diff --git a/app/core/exceptions.py b/app/core/exceptions.py new file mode 100644 index 0000000..cae1f80 --- /dev/null +++ b/app/core/exceptions.py @@ -0,0 +1,35 @@ +class SteamPanelError(Exception): + def __init__(self, message: str, code: str = "unknown_error") -> None: + self.message = message + self.code = code + super().__init__(message) + + +class SteamAuthError(SteamPanelError): + def __init__(self, message: str = "Authentication failed") -> None: + super().__init__(message, code="auth_error") + + +class SteamGuardError(SteamPanelError): + def __init__(self, message: str = "Steam Guard operation failed") -> None: + super().__init__(message, code="guard_error") + + +class ProxyError(SteamPanelError): + def __init__(self, message: str = "Proxy error") -> None: + super().__init__(message, code="proxy_error") + + +class MafileError(SteamPanelError): + def __init__(self, message: str = "Invalid mafile") -> None: + super().__init__(message, code="mafile_error") + + +class TaskError(SteamPanelError): + def __init__(self, message: str = "Task execution failed") -> None: + super().__init__(message, code="task_error") + + +class EmailError(SteamPanelError): + def __init__(self, message: str = "Email operation failed") -> None: + super().__init__(message, code="email_error") diff --git a/app/core/logging.py b/app/core/logging.py new file mode 100644 index 0000000..0da0c0f --- /dev/null +++ b/app/core/logging.py @@ -0,0 +1,138 @@ +import logging +import re +import sys + +from loguru import logger + +from app.config import settings + + +LEVEL_ICONS = { + "TRACE": "[~]", + "DEBUG": "[.]", + "INFO": "[i]", + "SUCCESS": "[+]", + "WARNING": "[!]", + "ERROR": "[e]", + "CRITICAL":"[e]", +} + +LEVEL_COLORS = { + "TRACE": "\033[35m", + "DEBUG": "\033[37m", + "INFO": "\033[34m", + "SUCCESS": "\033[32m", + "WARNING": "\033[33m", + "ERROR": "\033[31m", + "CRITICAL":"\033[31m", +} +RESET = "\033[0m" + + +def _loguru_fmt(record: dict) -> str: + level = record["level"].name + icon = LEVEL_ICONS.get(level, "[i]") + color = LEVEL_COLORS.get(level, "") + ts = record["time"].strftime("%H:%M:%S") + msg = record["message"].replace("<", "\\<").replace("{", "{{").replace("}", "}}") + return f"{RESET}[{ts}] {color}{icon}{RESET} {msg}\n" + + +class _UvicornInterceptHandler(logging.Handler): + """Route all standard logging records (uvicorn, fastapi) into loguru.""" + + def emit(self, record: logging.LogRecord) -> None: + try: + level = logger.level(record.levelname).name + except ValueError: + level = record.levelno + + frame, depth = sys._getframe(6), 6 + while frame and frame.f_code.co_filename == logging.__file__: + frame = frame.f_back + depth += 1 + + logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage()) + + +_logging_configured = False + + +def setup_logging() -> None: + global _logging_configured + if _logging_configured: + return + _logging_configured = True + + logger.remove() + + logger.add( + sys.stderr, + format=_loguru_fmt, + level="DEBUG" if settings.debug else "INFO", + colorize=False, + ) + + settings.logs_dir.mkdir(parents=True, exist_ok=True) + + def _file_fmt(record: dict) -> str: + level = record["level"].name + icon = LEVEL_ICONS.get(level, "[i]") + ts = record["time"].strftime("%Y-%m-%d %H:%M:%S") + msg = record["message"].replace("<", "\\<").replace("{", "{{").replace("}", "}}") + return f"[{ts}] {icon} {msg}\n" + + logger.add( + settings.logs_dir / "steampanel_{time:YYYY-MM-DD}.log", + format=_file_fmt, + level="DEBUG", + rotation="1 day", + retention="7 days", + compression="zip", + ) + + _install_intercept() + + +class _AioSQLiteFilter(logging.Filter): + """Reformats raw aiosqlite debug messages into readable DB operation lines.""" + + _OP_RE = re.compile(r"method (\w+) of sqlite3\.(\w+)") + _SQL_RE = re.compile(r',\s*"(.*?)"(?:,\s*(\(.*?\)))?\s*\)$', re.DOTALL) + + def filter(self, record: logging.LogRecord) -> bool: + msg = record.getMessage() + # Drop the redundant "operation X completed" lines + if " completed" in msg: + return False + if msg.startswith("executing"): + op_m = self._OP_RE.search(msg) + method = op_m.group(1).upper() if op_m else "OP" + sql_m = self._SQL_RE.search(msg) + if sql_m: + sql = sql_m.group(1).strip() + params = sql_m.group(2) or "" + record.msg = f"[DB] {sql}" + (f" {params}" if params else "") + else: + record.msg = f"[DB] {method}" + record.args = () + return True + + +def _install_intercept() -> None: + intercept = _UvicornInterceptHandler() + for name in ("", "uvicorn", "uvicorn.error", "uvicorn.access", "fastapi"): + log = logging.getLogger(name) + log.handlers = [intercept] + log.setLevel(logging.DEBUG) + log.propagate = False + + # Format aiosqlite SQL logs instead of silencing them + aiosqlite_log = logging.getLogger("aiosqlite") + aiosqlite_log.setLevel(logging.DEBUG) + aiosqlite_log.addFilter(_AioSQLiteFilter()) + + logging.getLogger("asyncio").setLevel(logging.WARNING) + + + diff --git a/app/core/proxy_manager.py b/app/core/proxy_manager.py new file mode 100644 index 0000000..d2d4f23 --- /dev/null +++ b/app/core/proxy_manager.py @@ -0,0 +1,78 @@ +import random + +import aiohttp +from aiohttp_socks import ProxyConnector +from loguru import logger + +from app.database import get_db + + +def build_proxy_url(address: str, protocol: str) -> str: + """Convert stored address to standard proxy URL (proto://login:pass@ip:port). + + The frontend always normalizes addresses to login:pass@ip:port (or plain ip:port), + so we just prepend the scheme. + """ + if "://" in address: + return address + scheme = protocol if protocol in ("socks5", "socks4") else "http" + return f"{scheme}://{address}" + + +class ProxyManager: + def __init__(self) -> None: + self._proxies: list[dict] = [] + self._index: int = 0 + + async def load(self) -> None: + db = await get_db() + cursor = await db.execute( + "SELECT * FROM proxies WHERE is_alive = 1 ORDER BY fail_count ASC" + ) + self._proxies = [dict(r) for r in await cursor.fetchall()] + logger.info(f"Loaded {len(self._proxies)} alive proxies") + + def get_next(self) -> dict | None: + if not self._proxies: + return None + proxy = self._proxies[self._index % len(self._proxies)] + self._index += 1 + return proxy + + def get_random(self) -> dict | None: + if not self._proxies: + return None + return random.choice(self._proxies) + + def get_connector(self, proxy: dict | None = None) -> aiohttp.TCPConnector | ProxyConnector: + if proxy is None: + return aiohttp.TCPConnector() + url = build_proxy_url(proxy["address"], proxy.get("protocol", "http")) + return ProxyConnector.from_url(url, ssl=False) + + async def mark_failed(self, proxy_id: int) -> None: + db = await get_db() + await db.execute( + "UPDATE proxies SET fail_count = fail_count + 1, last_checked = datetime('now') WHERE id = ?", + (proxy_id,), + ) + await db.execute( + "UPDATE proxies SET is_alive = 0 WHERE id = ? AND fail_count >= 5", + (proxy_id,), + ) + await db.commit() + + async def mark_alive(self, proxy_id: int) -> None: + db = await get_db() + await db.execute( + "UPDATE proxies SET fail_count = 0, is_alive = 1, last_checked = datetime('now') WHERE id = ?", + (proxy_id,), + ) + await db.commit() + + @property + def count(self) -> int: + return len(self._proxies) + + +proxy_manager = ProxyManager() diff --git a/app/core/task_manager.py b/app/core/task_manager.py new file mode 100644 index 0000000..0edfb6a --- /dev/null +++ b/app/core/task_manager.py @@ -0,0 +1,249 @@ +import asyncio +import json +import uuid +from pathlib import Path +from typing import Any, Protocol + +from loguru import logger + +from app.config import settings + +DEFAULT_MAX_PARALLEL = 10 +DEFAULT_ACCOUNT_TIMEOUT = 90 # fallback for actions not in the map below + +# Per-action timeouts (seconds). Fast read-only actions get 60s; +# write actions that involve SMS/email prompts get 120s. +TASK_TIMEOUTS: dict[str, int] = { + "validate": 60, + "remove_guard": 60, + "change_password": 60, + "random_password": 60, + "change_phone": 120, + "change_email": 120, +} + + +def _read_max_threads() -> int: + from app.config import read_validation_settings + return int(read_validation_settings().get("max_threads", DEFAULT_MAX_PARALLEL)) + + +def _read_account_timeout() -> int: + from app.config import read_validation_settings + return int(read_validation_settings().get("account_timeout", DEFAULT_ACCOUNT_TIMEOUT)) + + +class TaskHandler(Protocol): + async def __call__(self, account: dict, params: dict, *, task_id: str) -> None: ... + + +class TaskManager: + def __init__(self) -> None: + self._running: dict[str, asyncio.Task] = {} + self._handlers: dict[str, TaskHandler] = {} + self._prompts: dict[str, dict[str, Any]] = {} + self._steps: dict[str, dict[str, Any]] = {} + self._active_counts: dict[str, int] = {} + self._account_results: dict[str, dict[int, dict[str, str]]] = {} + self._account_steps: dict[str, dict[int, dict[str, int]]] = {} + + def register_handler(self, action: str, handler: TaskHandler) -> None: + self._handlers[action] = handler + + async def submit( + self, + task_type: str, + accounts: list[dict], + params: dict, + ) -> str: + task_id = uuid.uuid4().hex[:12] + account_ids = [acc.get("id", 0) for acc in accounts] + + from app.database import get_db + + db = await get_db() + await db.execute( + "INSERT INTO tasks (id, type, status, total, account_ids) VALUES (?, ?, 'running', ?, ?)", + (task_id, task_type, len(accounts), json.dumps(account_ids)), + ) + await db.commit() + + async_task = asyncio.create_task( + self._execute(task_id, task_type, accounts, params) + ) + self._running[task_id] = async_task + return task_id + + async def _execute( + self, + task_id: str, + task_type: str, + accounts: list[dict], + params: dict, + ) -> None: + from app.database import get_db + + handler = self._handlers.get(task_type) + if not handler: + db = await get_db() + await db.execute( + "UPDATE tasks SET status = 'failed', error = ? WHERE id = ?", + (f"No handler for action: {task_type}", task_id), + ) + await db.commit() + return + + completed = 0 + errors: list[str] = [] + lock = asyncio.Lock() + max_parallel = _read_max_threads() + account_timeout = TASK_TIMEOUTS.get(task_type, _read_account_timeout()) + sem = asyncio.Semaphore(max_parallel) + self._active_counts[task_id] = 0 + self._account_results[task_id] = {} + total = len(accounts) + + async def process_one(account: dict, idx: int) -> None: + nonlocal completed + login = account.get("login", "?") + acc_id = account.get("id", 0) + logger.debug(f"[{task_type}] ({idx}/{total}) processing {login}...") + + async with sem: + async with lock: + self._active_counts[task_id] = self._active_counts.get(task_id, 0) + 1 + try: + await asyncio.wait_for( + handler(account, params, task_id=task_id), + timeout=account_timeout, + ) + logger.success(f"[{task_type}] ({idx}/{total}) {login} — done") + async with lock: + self._account_results[task_id][acc_id] = {"status": "ok"} + except asyncio.TimeoutError: + async with lock: + errors.append(f"{login}: timed out after {account_timeout}s") + self._account_results[task_id][acc_id] = {"status": "error", "error": f"Timed out after {account_timeout}s"} + logger.error(f"[{task_type}] ({idx}/{total}) {login} — timed out after {account_timeout}s") + except Exception as exc: + err_str = str(exc) + async with lock: + errors.append(f"{login}: {exc}") + self._account_results[task_id][acc_id] = {"status": "error", "error": err_str} + logger.error(f"[{task_type}] ({idx}/{total}) {login} — error: {exc}") + finally: + async with lock: + self._active_counts[task_id] = max(0, self._active_counts.get(task_id, 0) - 1) + + async with lock: + completed += 1 + db = await get_db() + await db.execute( + "UPDATE tasks SET progress = ?, updated_at = datetime('now') WHERE id = ?", + (completed, task_id), + ) + await db.commit() + + try: + tasks = [process_one(acc, i) for i, acc in enumerate(accounts, 1)] + await asyncio.gather(*tasks) + + db = await get_db() + status = "completed" + result = f"Done: {completed - len(errors)} success, {len(errors)} errors" + error_text = "; ".join(errors[:10]) if errors else None + results_json = json.dumps( + {str(k): v for k, v in self._account_results.get(task_id, {}).items()} + ) + await db.execute( + "UPDATE tasks SET status = ?, result = ?, error = ?, account_results = ?, updated_at = datetime('now') WHERE id = ?", + (status, result, error_text, results_json, task_id), + ) + await db.commit() + + except asyncio.CancelledError: + db = await get_db() + results_json = json.dumps( + {str(k): v for k, v in self._account_results.get(task_id, {}).items()} + ) + await db.execute( + "UPDATE tasks SET status = 'cancelled', account_results = ?, updated_at = datetime('now') WHERE id = ?", + (results_json, task_id), + ) + await db.commit() + except Exception as exc: + logger.error(f"Task {task_id} fatal error: {exc}") + db = await get_db() + results_json = json.dumps( + {str(k): v for k, v in self._account_results.get(task_id, {}).items()} + ) + await db.execute( + "UPDATE tasks SET status = 'failed', error = ?, account_results = ?, updated_at = datetime('now') WHERE id = ?", + (str(exc)[:500], results_json, task_id), + ) + await db.commit() + finally: + self._running.pop(task_id, None) + self._steps.pop(task_id, None) + self._active_counts.pop(task_id, None) + self._account_results.pop(task_id, None) + self._account_steps.pop(task_id, None) + + def get_active_count(self, task_id: str) -> int: + return self._active_counts.get(task_id, 0) + + def get_account_results(self, task_id: str) -> dict[int, dict[str, str]]: + return self._account_results.get(task_id, {}) + + def clear_account_results(self, task_id: str) -> None: + self._account_results.pop(task_id, None) + + async def set_step(self, task_id: str, step: int, total_steps: int, label: str = "", acc_id: int = 0) -> None: + self._steps[task_id] = {"step": step, "total_steps": total_steps, "label": label} + if acc_id: + self._account_steps.setdefault(task_id, {})[acc_id] = {"step": step, "total": total_steps} + + def get_step_info(self, task_id: str) -> dict[str, Any] | None: + return self._steps.get(task_id) + + def get_account_steps(self, task_id: str) -> dict[int, dict[str, int]]: + return self._account_steps.get(task_id, {}) + + async def prompt_user(self, task_id: str, message: str, login: str = "") -> str: + """Pause task execution and ask the user for input via SSE prompt.""" + key = f"{task_id}:{login}" if login else task_id + event = asyncio.Event() + self._prompts[key] = {"message": message, "login": login, "event": event, "response": ""} + await event.wait() + response = self._prompts.pop(key, {}).get("response", "") + return response + + def respond(self, task_id: str, value: str, login: str = "") -> bool: + key = f"{task_id}:{login}" if login else task_id + prompt = self._prompts.get(key) + if not prompt: + return False + prompt["response"] = value + prompt["event"].set() + return True + + def get_pending_prompt(self, task_id: str) -> dict[str, str] | None: + """Return first pending prompt for this task (with login info).""" + prefix = f"{task_id}:" + for key, prompt in self._prompts.items(): + if key == task_id or key.startswith(prefix): + return {"message": prompt["message"], "login": prompt.get("login", "")} + return None + + def cancel(self, task_id: str) -> bool: + task = self._running.get(task_id) + if task and not task.done(): + task.cancel() + return True + return False + + def active_count(self) -> int: + return len(self._running) + + +task_manager = TaskManager() diff --git a/app/database.py b/app/database.py new file mode 100644 index 0000000..3dbeba7 --- /dev/null +++ b/app/database.py @@ -0,0 +1,200 @@ +import aiosqlite +from loguru import logger + +from app.config import settings + +import asyncio + +_db: aiosqlite.Connection | None = None +_db_lock = asyncio.Lock() + +SQL_CREATE_ACCOUNTS = """ +CREATE TABLE IF NOT EXISTS accounts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + login TEXT NOT NULL, + password TEXT NOT NULL, + steam_id TEXT UNIQUE, + email TEXT, + email_password TEXT, + phone TEXT, + mafile_path TEXT, + shared_secret TEXT, + identity_secret TEXT, + proxy TEXT, + status TEXT NOT NULL DEFAULT 'unknown', + notes TEXT, + nickname TEXT, + avatar_url TEXT, + steam_level INTEGER, + auto_accept INTEGER NOT NULL DEFAULT 0, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + updated_at TEXT NOT NULL DEFAULT (datetime('now')) +); +""" + +SQL_CREATE_PROXIES = """ +CREATE TABLE IF NOT EXISTS proxies ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + address TEXT NOT NULL UNIQUE, + protocol TEXT NOT NULL DEFAULT 'http', + is_alive INTEGER NOT NULL DEFAULT 1, + last_checked TEXT, + fail_count INTEGER NOT NULL DEFAULT 0 +); +""" + +SQL_CREATE_TASKS = """ +CREATE TABLE IF NOT EXISTS tasks ( + id TEXT PRIMARY KEY, + type TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'pending', + progress INTEGER NOT NULL DEFAULT 0, + total INTEGER NOT NULL DEFAULT 0, + result TEXT, + error TEXT, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + updated_at TEXT NOT NULL DEFAULT (datetime('now')) +); +""" + +SQL_CREATE_LOGPASS_ACCOUNTS = """ +CREATE TABLE IF NOT EXISTS logpass_accounts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + login TEXT NOT NULL UNIQUE, + password TEXT NOT NULL, + steam_id TEXT, + proxy TEXT, + status TEXT NOT NULL DEFAULT 'unknown', + ban_status TEXT, + nickname TEXT, + steam_level INTEGER, + prime TEXT, + trophy TEXT, + behavior TEXT, + license TEXT, + notes TEXT, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + updated_at TEXT NOT NULL DEFAULT (datetime('now')) +); +""" + +SQL_CREATE_TOKEN_ACCOUNTS = """ +CREATE TABLE IF NOT EXISTS token_accounts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + login TEXT, + token TEXT NOT NULL, + steam_id TEXT, + status TEXT NOT NULL DEFAULT 'unknown', + notes TEXT, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + updated_at TEXT NOT NULL DEFAULT (datetime('now')) +); +""" + + +async def get_db() -> aiosqlite.Connection: + global _db + async with _db_lock: + if _db is None: + settings.data_dir.mkdir(parents=True, exist_ok=True) + _db = await aiosqlite.connect(str(settings.db_path)) + _db.row_factory = aiosqlite.Row + await _db.execute("PRAGMA journal_mode=WAL") + await _db.execute("PRAGMA foreign_keys=ON") + await _init_tables(_db) + logger.info(f"Database connected: {settings.db_path}") + return _db + + +async def _init_tables(db: aiosqlite.Connection) -> None: + await db.execute(SQL_CREATE_ACCOUNTS) + await db.execute(SQL_CREATE_PROXIES) + await db.execute(SQL_CREATE_TASKS) + await db.execute(SQL_CREATE_LOGPASS_ACCOUNTS) + await db.execute(SQL_CREATE_TOKEN_ACCOUNTS) + await _migrate(db) + await db.commit() + + +async def _migrate(db: aiosqlite.Connection) -> None: + """Add columns that may not exist in older DBs.""" + cursor = await db.execute("PRAGMA table_info(accounts)") + cols = {row[1] for row in await cursor.fetchall()} + migrations = [ + ("nickname", "ALTER TABLE accounts ADD COLUMN nickname TEXT"), + ("avatar_url", "ALTER TABLE accounts ADD COLUMN avatar_url TEXT"), + ("steam_level", "ALTER TABLE accounts ADD COLUMN steam_level INTEGER"), + ("auto_accept", "ALTER TABLE accounts ADD COLUMN auto_accept INTEGER NOT NULL DEFAULT 0"), + ("ban_status", "ALTER TABLE accounts ADD COLUMN ban_status TEXT"), + ("session_cookies", "ALTER TABLE accounts ADD COLUMN session_cookies TEXT"), + ("last_online", "ALTER TABLE accounts ADD COLUMN last_online TEXT"), + ] + for col, sql in migrations: + if col not in cols: + await db.execute(sql) + logger.info(f"Migration: added column '{col}' to accounts") + + cursor = await db.execute("PRAGMA table_info(tasks)") + task_cols = {row[1] for row in await cursor.fetchall()} + task_migrations = [ + ("account_ids", "ALTER TABLE tasks ADD COLUMN account_ids TEXT"), + ("account_results", "ALTER TABLE tasks ADD COLUMN account_results TEXT"), + ] + for col, sql in task_migrations: + if col not in task_cols: + await db.execute(sql) + logger.info(f"Migration: added column '{col}' to tasks") + + # Logpass accounts migrations + cursor = await db.execute("PRAGMA table_info(logpass_accounts)") + lp_cols = {row[1] for row in await cursor.fetchall()} + lp_migrations = [ + ("prime", "ALTER TABLE logpass_accounts ADD COLUMN prime TEXT"), + ("trophy", "ALTER TABLE logpass_accounts ADD COLUMN trophy TEXT"), + ("behavior", "ALTER TABLE logpass_accounts ADD COLUMN behavior TEXT"), + ("license", "ALTER TABLE logpass_accounts ADD COLUMN license TEXT"), + ("session_cookies", "ALTER TABLE logpass_accounts ADD COLUMN session_cookies TEXT"), + ("steam_level", "ALTER TABLE logpass_accounts ADD COLUMN steam_level INTEGER"), + ("avatar_url", "ALTER TABLE logpass_accounts ADD COLUMN avatar_url TEXT"), + ("last_online", "ALTER TABLE logpass_accounts ADD COLUMN last_online TEXT"), + ] + for col, sql in lp_migrations: + if col not in lp_cols: + await db.execute(sql) + logger.info(f"Migration: added column '{col}' to logpass_accounts") + + # Token accounts migrations + cursor = await db.execute("PRAGMA table_info(token_accounts)") + tk_cols = {row[1] for row in await cursor.fetchall()} + tk_migrations = [ + ("proxy", "ALTER TABLE token_accounts ADD COLUMN proxy TEXT"), + ("session_cookies", "ALTER TABLE token_accounts ADD COLUMN session_cookies TEXT"), + ("ban_status", "ALTER TABLE token_accounts ADD COLUMN ban_status TEXT"), + ("nickname", "ALTER TABLE token_accounts ADD COLUMN nickname TEXT"), + ("steam_level", "ALTER TABLE token_accounts ADD COLUMN steam_level INTEGER"), + ("avatar_url", "ALTER TABLE token_accounts ADD COLUMN avatar_url TEXT"), + ("last_online", "ALTER TABLE token_accounts ADD COLUMN last_online TEXT"), + ] + for col, sql in tk_migrations: + if col not in tk_cols: + await db.execute(sql) + logger.info(f"Migration: added column '{col}' to token_accounts") + + # Add UNIQUE index on login if missing + cursor = await db.execute("PRAGMA index_list(logpass_accounts)") + idx_rows = await cursor.fetchall() + idx_names = {row[1] for row in idx_rows} + if "uq_logpass_login" not in idx_names: + try: + await db.execute("CREATE UNIQUE INDEX uq_logpass_login ON logpass_accounts(login)") + logger.info("Migration: added unique index on logpass_accounts.login") + except Exception: + logger.warning("Could not create unique index on logpass_accounts.login (duplicates may exist)") + + +async def close_db() -> None: + global _db + if _db is not None: + await _db.close() + _db = None + logger.info("Database connection closed") diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..e2a52ee --- /dev/null +++ b/app/models.py @@ -0,0 +1,246 @@ +import json +from datetime import datetime +from pathlib import Path + +from pydantic import BaseModel, Field, model_validator + + +class AccountCreate(BaseModel): + login: str + password: str + steam_id: str | None = None + email: str | None = None + email_password: str | None = None + phone: str | None = None + proxy: str | None = None + notes: str | None = None + + +class AccountUpdate(BaseModel): + login: str | None = None + password: str | None = None + steam_id: str | None = None + email: str | None = None + email_password: str | None = None + phone: str | None = None + proxy: str | None = None + status: str | None = None + notes: str | None = None + + +class AccountOut(BaseModel): + id: int + login: str + password: str + steam_id: str | None = None + email: str | None = None + email_password: str | None = None + phone: str | None = None + mafile_path: str | None = None + shared_secret: str | None = None + identity_secret: str | None = None + proxy: str | None = None + status: str + notes: str | None = None + nickname: str | None = None + avatar_url: str | None = None + steam_level: int | None = None + last_online: str | None = None + auto_accept: int = 0 + ban_status: str | None = None + has_cookies: bool = False + has_revocation_code: bool = False + created_at: str + updated_at: str + + @staticmethod + def _check_revocation_code(mafile_path: str | None) -> bool: + if not mafile_path: + return False + try: + p = Path(mafile_path) + if not p.exists(): + return False + data = json.loads(p.read_text(encoding="utf-8")) + return bool(data.get("revocation_code", "")) + except Exception: + return False + + @model_validator(mode="before") + @classmethod + def _compute_flags(cls, data): + if isinstance(data, dict): + data["has_cookies"] = bool(data.get("session_cookies")) + data["has_revocation_code"] = AccountOut._check_revocation_code(data.get("mafile_path")) + return data + + +class ProxyCreate(BaseModel): + address: str + protocol: str = "http" + + +class ProxyOut(BaseModel): + id: int + address: str + protocol: str + is_alive: bool + last_checked: str | None = None + fail_count: int + + +class MafileSession(BaseModel): + SessionID: str = "" + AccessToken: str = "" + RefreshToken: str = "" + SteamID: int = 0 + SteamLoginSecure: str = "" + + +class MafileData(BaseModel): + shared_secret: str + serial_number: str = "" + revocation_code: str = "" + uri: str = "" + account_name: str = "" + token_gid: str = "" + identity_secret: str = "" + secret_1: str = "" + device_id: str = "" + server_time: str = "" + fully_enrolled: bool = False + Session: MafileSession = Field(default_factory=MafileSession) + + +class TaskOut(BaseModel): + id: str + type: str + status: str + progress: int + total: int + result: str | None = None + error: str | None = None + account_ids: str | None = None + account_results: str | None = None + created_at: str + updated_at: str + + +class ActionRequest(BaseModel): + account_ids: list[int] + action: str + params: dict | None = None + + +class BulkImportResult(BaseModel): + imported: int = 0 + skipped: int = 0 + errors: list[str] = Field(default_factory=list) + + +# --------------------------------------------------------------------------- +# Log:pass accounts +# --------------------------------------------------------------------------- + +class LogpassAccountCreate(BaseModel): + login: str + password: str + steam_id: str | None = None + proxy: str | None = None + ban_status: str | None = None + prime: str | None = None + trophy: str | None = None + behavior: str | None = None + license: str | None = None + notes: str | None = None + + +class LogpassAccountUpdate(BaseModel): + login: str | None = None + password: str | None = None + steam_id: str | None = None + proxy: str | None = None + status: str | None = None + ban_status: str | None = None + nickname: str | None = None + steam_level: int | None = None + prime: str | None = None + trophy: str | None = None + behavior: str | None = None + license: str | None = None + notes: str | None = None + + +class LogpassAccountOut(BaseModel): + id: int + login: str + password: str + steam_id: str | None = None + proxy: str | None = None + status: str + ban_status: str | None = None + nickname: str | None = None + steam_level: int | None = None + prime: str | None = None + trophy: str | None = None + behavior: str | None = None + license: str | None = None + notes: str | None = None + avatar_url: str | None = None + last_online: str | None = None + has_cookies: bool = False + created_at: str + updated_at: str + + @model_validator(mode="before") + @classmethod + def _compute_has_cookies(cls, data): + if isinstance(data, dict): + data["has_cookies"] = bool(data.get("session_cookies")) + return data + + +# --------------------------------------------------------------------------- +# Token accounts +# --------------------------------------------------------------------------- + +class TokenAccountCreate(BaseModel): + login: str | None = None + token: str + steam_id: str | None = None + proxy: str | None = None + notes: str | None = None + + +class TokenAccountUpdate(BaseModel): + login: str | None = None + token: str | None = None + steam_id: str | None = None + proxy: str | None = None + status: str | None = None + notes: str | None = None + + +class TokenAccountOut(BaseModel): + id: int + login: str | None = None + token: str + steam_id: str | None = None + proxy: str | None = None + status: str + ban_status: str | None = None + nickname: str | None = None + steam_level: int | None = None + avatar_url: str | None = None + last_online: str | None = None + has_cookies: bool = False + notes: str | None = None + created_at: str + updated_at: str + + @model_validator(mode="before") + @classmethod + def _compute_has_cookies(cls, data): + if isinstance(data, dict): + data["has_cookies"] = bool(data.get("session_cookies")) + return data diff --git a/app/services/__init__.py b/app/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/services/browser_login.py b/app/services/browser_login.py new file mode 100644 index 0000000..b284c6d --- /dev/null +++ b/app/services/browser_login.py @@ -0,0 +1,96 @@ +import asyncio +import json + +from loguru import logger + +_active_browsers: list = [] + +STEAM_DOMAINS = [ + ".steamcommunity.com", + ".steampowered.com", + ".store.steampowered.com", + ".help.steampowered.com", + ".login.steampowered.com", +] + + +async def open_browser_with_cookies(account: dict) -> None: + """Open a Chrome browser with Steam session cookies using nodriver.""" + import nodriver as uc + + cookies_json = account.get("session_cookies") + if not cookies_json: + raise ValueError("No session cookies saved. Validate the account first.") + + cookies = json.loads(cookies_json) + + browser = await uc.start() + _active_browsers.append(browser) + + tab = await browser.get("about:blank") + + for c in cookies: + domain = c.get("domain") or ".steamcommunity.com" + domains_to_set = [domain] + if "steam" in domain: + domains_to_set = list(set([domain] + STEAM_DOMAINS)) + + for d in domains_to_set: + try: + await tab.send(uc.cdp.network.set_cookie( + name=c["name"], + value=c["value"], + domain=d, + path=c.get("path") or "/", + secure=c.get("secure", True), + http_only=c.get("httpOnly", False), + )) + except Exception: + pass + + steam_id = account.get("steam_id") or "" + if steam_id: + start_url = f"https://steamcommunity.com/profiles/{steam_id}/" + else: + start_url = "https://steamcommunity.com/" + await browser.get(start_url) + logger.info(f"Browser opened for {account['login']}") + + # Wait until browser is closed by user, suppress connection errors + try: + while browser: + await asyncio.sleep(1) + try: + if not browser.connection or browser.connection.closed: + break + except Exception: + break + except Exception: + pass + finally: + if browser in _active_browsers: + _active_browsers.remove(browser) + + # Temporarily suppress nodriver's internal task errors during cleanup + # (Browser.update_targets() raises ConnectionRefusedError after close) + loop = asyncio.get_running_loop() + _original_handler = loop.get_exception_handler() + + def _suppress_nodriver_close_errors(loop, context): + exc = context.get("exception") + if isinstance(exc, (ConnectionRefusedError, ConnectionResetError, OSError)): + return + if _original_handler: + _original_handler(loop, context) + else: + loop.default_exception_handler(context) + + loop.set_exception_handler(_suppress_nodriver_close_errors) + try: + browser.stop() + except Exception: + pass + await asyncio.sleep(0.5) + loop.set_exception_handler(_original_handler) + + logger.debug(f"Browser closed for {account['login']}") diff --git a/app/services/registry.py b/app/services/registry.py new file mode 100644 index 0000000..5a7258a --- /dev/null +++ b/app/services/registry.py @@ -0,0 +1,20 @@ +from app.core.task_manager import task_manager +from app.services.steam_guard import remove_guard, generate_2fa +from app.services.steam_password import change_password, random_password +from app.services.steam_email import change_email, validate_account +from app.services.steam_phone import change_phone +from app.services.steam_checker import check_logpass_account, full_parse_logpass_account +from app.services.steam_token_checker import check_token_account + + +def register_all_handlers() -> None: + task_manager.register_handler("change_password", change_password) + task_manager.register_handler("random_password", random_password) + task_manager.register_handler("change_email", change_email) + task_manager.register_handler("change_phone", change_phone) + task_manager.register_handler("remove_guard", remove_guard) + task_manager.register_handler("generate_2fa", generate_2fa) + task_manager.register_handler("validate", validate_account) + task_manager.register_handler("logpass_validate", check_logpass_account) + task_manager.register_handler("logpass_full_parse", full_parse_logpass_account) + task_manager.register_handler("token_validate", check_token_account) diff --git a/app/services/steam_auth.py b/app/services/steam_auth.py new file mode 100644 index 0000000..78c8a01 --- /dev/null +++ b/app/services/steam_auth.py @@ -0,0 +1,192 @@ +from __future__ import annotations + +import json +from pathlib import Path +from typing import TYPE_CHECKING + +import aiohttp +from aiohttp import ClientSession, ClientTimeout +from loguru import logger + +from app.core.exceptions import SteamAuthError +from app.core.proxy_manager import proxy_manager +from pysteamauth.base.request import BaseRequestStrategy, DEFAULT_REQUEST_TIMEOUT + + +class ProxyRequestStrategy(BaseRequestStrategy): + """Request strategy that routes traffic through a proxy connector.""" + + def __init__(self, connector: aiohttp.BaseConnector): + super().__init__() + self._proxy_connector = connector + + def _create_session(self) -> ClientSession: + return ClientSession( + connector=self._proxy_connector, + timeout=DEFAULT_REQUEST_TIMEOUT, + ) + + +def read_mafile_data(account: dict) -> dict | None: + """Read and parse the account's mafile JSON from disk.""" + mafile_path = account.get("mafile_path") + if not mafile_path: + return None + try: + return json.loads(Path(mafile_path).read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError, ValueError): + return None + + +async def _resolve_proxy(account: dict) -> dict | None: + """Determine proxy dict {address, protocol} for the account.""" + proxy_address = account.get("proxy") + if proxy_address: + from app.database import get_db + db = await get_db() + cursor = await db.execute( + "SELECT protocol FROM proxies WHERE address = ?", (proxy_address,) + ) + row = await cursor.fetchone() + protocol = row["protocol"] if row else "http" + return {"address": proxy_address, "protocol": protocol} + if proxy_manager.count > 0: + return proxy_manager.get_next() + return None + + +async def create_steam_session(account: dict): + """Create an authenticated Steam session for an account.""" + try: + from pysteamauth.auth import Steam + except ImportError: + raise SteamAuthError("pysteamauth not installed: pip install pysteamauth") + + proxy = await _resolve_proxy(account) + request_strategy = None + if proxy: + connector = proxy_manager.get_connector(proxy) + request_strategy = ProxyRequestStrategy(connector) + logger.debug(f"Using proxy {proxy['protocol']}://{proxy['address']} for {account['login']}") + + mafile = read_mafile_data(account) + + shared_secret = account.get("shared_secret", "") + identity_secret = account.get("identity_secret", "") + device_id = None + steamid = None + + if mafile: + shared_secret = mafile.get("shared_secret", shared_secret) + identity_secret = mafile.get("identity_secret", identity_secret) + device_id = mafile.get("device_id") + steamid = int(mafile.get("Session", {}).get("SteamID", 0)) or None + + steam = Steam( + login=account["login"], + password=account["password"], + shared_secret=shared_secret, + identity_secret=identity_secret, + device_id=device_id, + steamid=steamid, + request_strategy=request_strategy, + ) + + try: + await steam.login_to_steam() + except Exception as exc: + await close_steam(steam) + exc_str = str(exc) + # Pydantic ValidationError from pysteamauth = Steam rejected login + if "validation error" in exc_str.lower() and "FinalizeLoginStatus" in exc_str: + # Extract the raw response dict from the error + m = __import__("re").search(r"input_value=(\{[^}]+\})", exc_str) + raw = m.group(1) if m else "" + logger.error(f"Auth failed for {account['login']}: Steam rejected login: {raw}") + raise SteamAuthError(f"Login failed: Steam rejected credentials ({raw})") + logger.error(f"Auth failed for {account['login']}: {exc}") + raise SteamAuthError(f"Login failed: {exc}") + + return steam + + +async def close_steam(steam) -> None: + """Close the underlying aiohttp session and proxy connector of a pysteamauth Steam object.""" + requests = getattr(steam, "_requests", None) + if requests is None: + return + session = getattr(requests, "_session", None) + if session is not None and not getattr(session, "closed", True): + try: + await session.close() + except Exception: + pass + requests._session = None + + connector = getattr(requests, "_proxy_connector", None) + if connector is not None and not getattr(connector, "closed", True): + try: + await connector.close() + except Exception: + pass + + +def extract_session_cookies(steam) -> str | None: + """Extract session cookies from a pysteamauth Steam object as JSON string. + + Returns JSON string of cookies list, or None if extraction fails. + """ + try: + _req = getattr(steam, "_requests", None) + _sess = getattr(_req, "_session", None) if _req else None + if not _sess or not hasattr(_sess, "cookie_jar"): + return None + all_cookies = [] + for c in _sess.cookie_jar: + all_cookies.append({ + "name": c.key, + "value": c.value, + "domain": c.get("domain", ""), + "path": c.get("path", "/"), + "secure": str(c.get("secure", "")).lower() == "true" or c.get("secure") is True, + "httpOnly": str(c.get("httponly", "")).lower() == "true" or c.get("httponly") is True, + }) + return json.dumps(all_cookies) + except Exception: + return None + +async def check_cookies_alive(cookies_json: str, proxy: dict | None = None) -> bool: + """Check if Steam session cookies are still valid. + + Makes a lightweight request to Steam's clientjstoken endpoint. + Returns True if logged in, False otherwise. + """ + try: + cookies = json.loads(cookies_json) + jar = aiohttp.CookieJar(unsafe=True) + for c in cookies: + jar.update_cookies( + {c["name"]: c["value"]}, + response_url=__import__("yarl").URL(f"https://{c.get('domain', '.steamcommunity.com').lstrip('.')}"), + ) + connector = proxy_manager.get_connector(proxy) if proxy else None + async with aiohttp.ClientSession(cookie_jar=jar, connector=connector) as session: + async with session.get( + "https://steamcommunity.com/chat/clientjstoken", + timeout=aiohttp.ClientTimeout(total=10), + ) as resp: + if resp.status != 200: + return False + data = await resp.json(content_type=None) + return bool(data.get("logged_in")) + except Exception: + return False + + +async def raw_request(steam, url: str, method: str = "GET", **kwargs) -> aiohttp.ClientResponse: + """Low-level request returning raw aiohttp.ClientResponse (for redirects, etc.).""" + from yarl import URL + + host = URL(url).host or "" + cookies = await steam.cookies(host) + return await steam._requests.request(url=url, method=method, cookies=cookies, **kwargs) diff --git a/app/services/steam_auto_accept.py b/app/services/steam_auto_accept.py new file mode 100644 index 0000000..649d92a --- /dev/null +++ b/app/services/steam_auto_accept.py @@ -0,0 +1,220 @@ +"""Steam auto-accept login confirmations — ported from legacy/steam_auto_accept_logins.py.""" + +import asyncio +import base64 +import hashlib +import hmac +import struct + +import aiohttp +import rsa +from loguru import logger + +from pysteamauth.pb2.steammessages_auth.steamclient_pb2 import ( + CAuthentication_GetPasswordRSAPublicKey_Request, + CAuthentication_GetPasswordRSAPublicKey_Response, + CAuthentication_BeginAuthSessionViaCredentials_Request, + CAuthentication_BeginAuthSessionViaCredentials_Response, + CAuthentication_UpdateAuthSessionWithSteamGuardCode_Request, + CAuthentication_PollAuthSessionStatus_Request, + CAuthentication_PollAuthSessionStatus_Response, + CAuthentication_GetAuthSessionsForAccount_Response, + CAuthentication_GetAuthSessionInfo_Request, + CAuthentication_GetAuthSessionInfo_Response, + CAuthentication_UpdateAuthSessionWithMobileConfirmation_Request, + CAuthentication_UpdateAuthSessionWithMobileConfirmation_Response, + EAuthTokenPlatformType, + EAuthSessionGuardType, +) + +BASE_URL = "https://api.steampowered.com" +HEADERS = {"User-Agent": "okhttp/4.9.2", "Cookie": "Steam_Language=english"} + + +def _generate_2fa_code(shared_secret: str, server_time: int | None = None) -> str: + """Generate a Steam Guard TOTP code from shared_secret.""" + import time as _time + + if server_time is None: + server_time = int(_time.time()) + key = base64.b64decode(shared_secret) + msg = struct.pack(">Q", server_time // 30) + mac = hmac.new(key, msg, hashlib.sha1).digest() + offset = mac[-1] & 0x0F + code_int = struct.unpack(">I", mac[offset : offset + 4])[0] & 0x7FFFFFFF + chars = "23456789BCDFGHJKMNPQRTVWXY" + code = "" + for _ in range(5): + code += chars[code_int % len(chars)] + code_int //= len(chars) + return code + + +def _confirmation_signature(shared_secret: str, client_id: int, steamid: int) -> bytes: + """HMAC-SHA256 signature for login confirmation (version=1 + client_id + steamid).""" + key = base64.b64decode(shared_secret) + data = struct.pack(" str | None: + """Perform mobile login flow, return access_token or None.""" + login = account["login"] + password = account["password"] + shared_secret = account.get("shared_secret", "") + + try: + # GetPasswordRSAPublicKey + req = CAuthentication_GetPasswordRSAPublicKey_Request() + req.account_name = login + encoded = base64.b64encode(req.SerializeToString()).decode() + + async with session.get( + f"{BASE_URL}/IAuthenticationService/GetPasswordRSAPublicKey/v1", + params={"origin": "SteamMobile", "input_protobuf_encoded": encoded}, + headers=HEADERS, + ) as resp: + if resp.status != 200: + logger.error(f"[auto-accept] RSA key failed for {login}: HTTP {resp.status}") + return None + rsa_resp = CAuthentication_GetPasswordRSAPublicKey_Response.FromString(await resp.read()) + + pub_key = rsa.PublicKey(int(rsa_resp.publickey_mod, 16), int(rsa_resp.publickey_exp, 16)) + encrypted_pw = base64.b64encode(rsa.encrypt(password.encode(), pub_key)).decode() + + # BeginAuthSession + begin = CAuthentication_BeginAuthSessionViaCredentials_Request() + begin.account_name = login + begin.encrypted_password = encrypted_pw + begin.encryption_timestamp = rsa_resp.timestamp + begin.platform_type = EAuthTokenPlatformType.k_EAuthTokenPlatformType_MobileApp + begin.device_friendly_name = "Android Device" + begin.persistence = 1 + + data = aiohttp.FormData() + data.add_field("input_protobuf_encoded", base64.b64encode(begin.SerializeToString()).decode()) + + async with session.post( + f"{BASE_URL}/IAuthenticationService/BeginAuthSessionViaCredentials/v1", + data=data, + headers=HEADERS, + ) as resp: + if resp.status != 200: + logger.error(f"[auto-accept] BeginAuth failed for {login}: HTTP {resp.status}") + return None + begin_resp = CAuthentication_BeginAuthSessionViaCredentials_Response.FromString(await resp.read()) + + # Send 2FA code + if shared_secret: + code = _generate_2fa_code(shared_secret) + upd = CAuthentication_UpdateAuthSessionWithSteamGuardCode_Request() + upd.client_id = begin_resp.client_id + upd.steamid = begin_resp.steamid + upd.code = code + upd.code_type = EAuthSessionGuardType.k_EAuthSessionGuardType_DeviceCode + + data = aiohttp.FormData() + data.add_field("input_protobuf_encoded", base64.b64encode(upd.SerializeToString()).decode()) + + async with session.post( + f"{BASE_URL}/IAuthenticationService/UpdateAuthSessionWithSteamGuardCode/v1", + data=data, + headers=HEADERS, + ) as resp: + if resp.status != 200: + logger.error(f"[auto-accept] 2FA submit failed for {login}: HTTP {resp.status}") + return None + + # PollAuthSessionStatus + poll = CAuthentication_PollAuthSessionStatus_Request() + poll.client_id = begin_resp.client_id + poll.request_id = begin_resp.request_id + + data = aiohttp.FormData() + data.add_field("input_protobuf_encoded", base64.b64encode(poll.SerializeToString()).decode()) + + async with session.post( + f"{BASE_URL}/IAuthenticationService/PollAuthSessionStatus/v1", + data=data, + headers=HEADERS, + ) as resp: + if resp.status != 200: + logger.error(f"[auto-accept] Poll failed for {login}: HTTP {resp.status}") + return None + poll_resp = CAuthentication_PollAuthSessionStatus_Response.FromString(await resp.read()) + + if not poll_resp.access_token: + logger.error(f"[auto-accept] No access_token for {login}") + return None + + logger.success(f"[auto-accept] Mobile login OK for {login}") + return poll_resp.access_token + + except Exception as exc: + logger.error(f"[auto-accept] Login error for {login}: {exc}") + return None + + +async def get_pending_sessions(session: aiohttp.ClientSession, access_token: str) -> list[int] | None: + """Get pending auth session client_ids. Returns None on 401 (token expired).""" + try: + async with session.get( + f"{BASE_URL}/IAuthenticationService/GetAuthSessionsForAccount/v1", + params={ + "access_token": access_token, + "origin": "SteamMobile", + "input_protobuf_encoded": "", + }, + headers=HEADERS, + ) as resp: + if resp.status == 401: + return None + if resp.status != 200: + return [] + data = CAuthentication_GetAuthSessionsForAccount_Response.FromString(await resp.read()) + return list(data.client_ids) + except Exception as exc: + logger.warning(f"[auto-accept] get_pending_sessions error: {exc}") + return [] + + +async def confirm_session( + session: aiohttp.ClientSession, + access_token: str, + account: dict, + client_id: int, +) -> bool: + """Confirm a pending login session.""" + steam_id = int(account.get("steam_id", 0)) + shared_secret = account.get("shared_secret", "") + if not steam_id or not shared_secret: + return False + + try: + signature = _confirmation_signature(shared_secret, client_id, steam_id) + + msg = CAuthentication_UpdateAuthSessionWithMobileConfirmation_Request() + msg.version = 1 + msg.client_id = client_id + msg.steamid = steam_id + msg.signature = signature + msg.confirm = True + msg.persistence = 1 + + data = aiohttp.FormData() + data.add_field("input_protobuf_encoded", base64.b64encode(msg.SerializeToString()).decode()) + + async with session.post( + f"{BASE_URL}/IAuthenticationService/UpdateAuthSessionWithMobileConfirmation/v1", + params={"access_token": access_token}, + data=data, + headers=HEADERS, + ) as resp: + if resp.status == 200: + logger.success(f"[auto-accept] Confirmed login for {account['login']} (client_id={client_id})") + return True + logger.warning(f"[auto-accept] Confirm failed for {account['login']}: HTTP {resp.status}") + return False + except Exception as exc: + logger.error(f"[auto-accept] Confirm error for {account['login']}: {exc}") + return False diff --git a/app/services/steam_ban.py b/app/services/steam_ban.py new file mode 100644 index 0000000..8f2ff18 --- /dev/null +++ b/app/services/steam_ban.py @@ -0,0 +1,29 @@ +"""Steam account ban/alert checking via supportmessages page.""" + +from loguru import logger + + +async def check_ban(steam) -> str: + """Check if account has active bans/alerts. + + Returns: 'BANNED', 'NO BAN', or '' on error. + """ + try: + response_html = await steam.request( + "https://store.steampowered.com/supportmessages/", + method="GET", + ) + + if isinstance(response_html, bytes): + response_html = response_html.decode("utf-8", errors="replace") + + if "support_message_page" in response_html or "This account has been locked" in response_html: + return "BANNED" + elif "It doesn't appear that you have any active account alerts" in response_html: + return "NO BAN" + else: + return "NO BAN" + + except Exception as exc: + logger.warning(f"Ban check failed: {exc}") + return "" diff --git a/app/services/steam_checker.py b/app/services/steam_checker.py new file mode 100644 index 0000000..dc45ecc --- /dev/null +++ b/app/services/steam_checker.py @@ -0,0 +1,297 @@ +"""Validation service for log:pass accounts (no mafile).""" + +from pathlib import Path + +from bs4 import BeautifulSoup +from loguru import logger + +from app.services.steam_auth import _resolve_proxy, ProxyRequestStrategy, close_steam, extract_session_cookies +from app.services.steam_ban import check_ban +from app.services.steam_profile import fetch_profile +from app.core.proxy_manager import proxy_manager +from app.core.task_manager import task_manager + + +async def check_logpass_account(account: dict, params: dict, *, task_id: str) -> None: + """Login with login:pass only, get steamid/nickname, check ban, update DB row.""" + try: + from pysteamauth.auth import Steam + except ImportError: + raise RuntimeError("pysteamauth not installed") + + acc_id = account["id"] + proxy = await _resolve_proxy(account) + request_strategy = None + if proxy: + connector = proxy_manager.get_connector(proxy) + request_strategy = ProxyRequestStrategy(connector) + logger.debug(f"[checker] Using proxy for {account['login']}") + + steam = Steam( + login=account["login"], + password=account["password"], + request_strategy=request_strategy, + ) + + try: + await task_manager.set_step(task_id, 1, 3, "Авторизация", acc_id) + + # Pre-validate password before attempting RSA encryption (Steam RSA-2048 max 245 bytes) + password = account.get("password") or "" + if len(password.encode("utf-8")) > 245: + raise ValueError( + f"Password is too long ({len(password)} chars) — possible mafile data imported as password. " + "Re-import the account in login:password format." + ) + + await steam.login_to_steam() + + # Save session cookies right after login + try: + session_cookies_json = extract_session_cookies(steam) + if session_cookies_json: + from app.database import get_db as _get_db + _db = await _get_db() + await _db.execute( + "UPDATE logpass_accounts SET session_cookies = ? WHERE id = ?", + (session_cookies_json, acc_id), + ) + await _db.commit() + logger.debug(f"[checker] {account['login']}: saved session cookies") + except Exception as cookie_err: + logger.warning(f"[checker] {account['login']}: failed to save cookies — {cookie_err}") + + from app.config import read_validation_settings + val_settings = read_validation_settings() + + steam_id = str(steam.steamid) + ban_status = "" + if val_settings.get("check_ban"): + await task_manager.set_step(task_id, 2, 3, "Проверка бана", acc_id) + ban_status = await check_ban(steam) + + nickname = None + steam_level = None + avatar_url = None + last_online = None + if steam_id and steam_id != "0" and val_settings.get("fetch_profile"): + await task_manager.set_step(task_id, 3, 3, "Получение профиля", acc_id) + profile = await fetch_profile(steam_id, steam=steam) + if profile: + nickname = profile.get("nickname") + steam_level = profile.get("steam_level") + avatar_url = profile.get("avatar_url") + last_online = profile.get("last_online") + + from app.database import get_db + db = await get_db() + await db.execute( + """UPDATE logpass_accounts + SET steam_id = ?, nickname = ?, steam_level = ?, avatar_url = ?, last_online = ?, + ban_status = ?, status = 'valid', updated_at = datetime('now') + WHERE id = ?""", + (steam_id, nickname, steam_level, avatar_url, last_online, ban_status, acc_id), + ) + await db.commit() + logger.success(f"[checker] {account['login']} → valid, ban={ban_status}") + + except Exception as exc: + from app.database import get_db + db = await get_db() + await db.execute( + "UPDATE logpass_accounts SET status = 'invalid', updated_at = datetime('now') WHERE id = ?", + (acc_id,), + ) + await db.commit() + logger.error(f"[checker] {account['login']} → {exc}") + raise + + finally: + await close_steam(steam) + + +async def _check_cs2_prime(steam, steam_id: str) -> str: + """Check CS2 Prime status.""" + try: + url = f"https://steamcommunity.com/profiles/{steam_id}/gcpd/730/?tab=primeaccount" + resp = await steam.request(url, method="GET") + html = resp if isinstance(resp, str) else resp.decode("utf-8", errors="ignore") + if "no_personal_data_stored_message" in html: + return "Disabled" + if "personaldata_elements_container" in html and "Enabled" in html: + return "Enabled" + return "Disabled" + except Exception as e: + logger.debug(f"[full_parse] prime check error: {e}") + return "Disabled" + + +async def _check_dota_trophy(steam, steam_id: str) -> str | None: + """Check Dota 2 Trophy Score.""" + try: + url = f"https://steamcommunity.com/profiles/{steam_id}/gcpd/570/?category=Stats&tab=Trophy" + resp = await steam.request(url, method="GET") + html = resp if isinstance(resp, str) else resp.decode("utf-8", errors="ignore") + if "no_personal_data_stored_message" in html: + return None + if "personaldata_elements_container" in html: + soup = BeautifulSoup(html, "html.parser") + for row in soup.find_all("tr"): + cells = row.find_all("td") + if len(cells) >= 3: + try: + int(cells[0].get_text(strip=True)) + score = cells[1].get_text(strip=True) + if score.isdigit(): + return score + except (ValueError, AttributeError): + continue + return None + except Exception as e: + logger.debug(f"[full_parse] trophy check error: {e}") + return None + + +async def _check_dota_behavior(steam, steam_id: str) -> str | None: + """Check Dota 2 Behavior Score.""" + try: + url = f"https://steamcommunity.com/profiles/{steam_id}/gcpd/570/?category=Account&tab=MatchPlayerReportIncoming" + resp = await steam.request(url, method="GET") + html = resp if isinstance(resp, str) else resp.decode("utf-8", errors="ignore") + if "no_personal_data_stored_message" in html: + return None + if "personaldata_elements_container" in html: + soup = BeautifulSoup(html, "html.parser") + for row in soup.find_all("tr"): + cells = row.find_all("td") + if cells: + last_cell = cells[-1].get_text(strip=True) + if last_cell.isdigit(): + return last_cell + return None + except Exception as e: + logger.debug(f"[full_parse] behavior check error: {e}") + return None + + +async def _check_licenses(steam) -> str: + """Get list of licenses (games) from Steam account.""" + try: + resp = await steam.request("https://store.steampowered.com/account/licenses/", method="GET") + html = resp if isinstance(resp, str) else resp.decode("utf-8", errors="ignore") + soup = BeautifulSoup(html, "html.parser") + table = soup.find("table", class_="account_table") + if not table: + return "" + licenses = [] + rows = table.find_all("tr") + for row in rows[1:]: + cells = row.find_all("td") + if len(cells) >= 2: + game_cell = cells[1] + remove_div = game_cell.find("div", class_="free_license_remove_link") + if remove_div: + remove_div.decompose() + name = game_cell.get_text(strip=True) + if name: + licenses.append(name) + return ", ".join(licenses) + except Exception as e: + logger.debug(f"[full_parse] licenses check error: {e}") + return "" + + +async def full_parse_logpass_account(account: dict, params: dict, *, task_id: str) -> None: + """Full parse: login, ban, profile, prime, trophy, behavior, licenses.""" + try: + from pysteamauth.auth import Steam + except ImportError: + raise RuntimeError("pysteamauth not installed") + + acc_id = account["id"] + proxy = await _resolve_proxy(account) + request_strategy = None + if proxy: + connector = proxy_manager.get_connector(proxy) + request_strategy = ProxyRequestStrategy(connector) + + steam = Steam( + login=account["login"], + password=account["password"], + request_strategy=request_strategy, + ) + + try: + await task_manager.set_step(task_id, 1, 6, "Авторизация", acc_id) + await steam.login_to_steam() + + # Save session cookies + try: + session_cookies_json = extract_session_cookies(steam) + if session_cookies_json: + from app.database import get_db as _get_db + _db = await _get_db() + await _db.execute( + "UPDATE logpass_accounts SET session_cookies = ? WHERE id = ?", + (session_cookies_json, acc_id), + ) + await _db.commit() + except Exception as cookie_err: + logger.warning(f"[full_parse] {account['login']}: failed to save cookies — {cookie_err}") + + steam_id = str(steam.steamid) + + await task_manager.set_step(task_id, 2, 6, "Проверка бана", acc_id) + ban_status = await check_ban(steam) + + nickname = avatar_url = last_online = None + steam_level = None + if steam_id and steam_id != "0": + await task_manager.set_step(task_id, 3, 6, "Профиль", acc_id) + profile = await fetch_profile(steam_id, steam=steam) + if profile: + nickname = profile.get("nickname") + steam_level = profile.get("steam_level") + avatar_url = profile.get("avatar_url") + last_online = profile.get("last_online") + + prime = "Disabled" + trophy = None + behavior = None + if steam_id and steam_id != "0": + await task_manager.set_step(task_id, 4, 6, "Prime / Trophy", acc_id) + prime = await _check_cs2_prime(steam, steam_id) + trophy = await _check_dota_trophy(steam, steam_id) + behavior = await _check_dota_behavior(steam, steam_id) + + await task_manager.set_step(task_id, 5, 6, "Лицензии", acc_id) + license_str = await _check_licenses(steam) + + await task_manager.set_step(task_id, 6, 6, "Сохранение", acc_id) + from app.database import get_db + db = await get_db() + await db.execute( + """UPDATE logpass_accounts + SET steam_id = ?, nickname = ?, steam_level = ?, avatar_url = ?, last_online = ?, + ban_status = ?, prime = ?, trophy = ?, behavior = ?, license = ?, + status = 'valid', updated_at = datetime('now') + WHERE id = ?""", + (steam_id, nickname, steam_level, avatar_url, last_online, + ban_status, prime, trophy, behavior, license_str, acc_id), + ) + await db.commit() + logger.success(f"[full_parse] {account['login']} → valid, ban={ban_status}, prime={prime}, trophy={trophy}, behavior={behavior}, licenses={len(license_str.split(', ')) if license_str else 0}") + + except Exception as exc: + from app.database import get_db + db = await get_db() + await db.execute( + "UPDATE logpass_accounts SET status = 'invalid', updated_at = datetime('now') WHERE id = ?", + (acc_id,), + ) + await db.commit() + logger.error(f"[full_parse] {account['login']} → {exc}") + raise + + finally: + await close_steam(steam) diff --git a/app/services/steam_email.py b/app/services/steam_email.py new file mode 100644 index 0000000..a570d24 --- /dev/null +++ b/app/services/steam_email.py @@ -0,0 +1,201 @@ +import asyncio +import json + +from loguru import logger + +from app.services.steam_auth import create_steam_session, close_steam, extract_session_cookies +from app.services.steam_wizard import AJAX_HEADERS, run_common_wizard + + +def _get_fresh_sessionid(steam) -> str: + """Get sessionid from the live aiohttp cookie jar.""" + return steam._requests.cookies("help.steampowered.com").get("sessionid", "") + + +async def change_email(account: dict, params: dict, task_id: str = "") -> None: + """Change account email via Steam recovery wizard + interactive prompts.""" + from app.core.task_manager import task_manager + + login = account["login"] + new_email = params.get("new_email", "") + await task_manager.set_step(task_id, 1, 5, "Авторизация", acc_id=account["id"]) + logger.info(f"[change_email] {login}: logging in to Steam...") + steam = await create_steam_session(account) + try: + password = account["password"] + await task_manager.set_step(task_id, 2, 5, "Wizard", acc_id=account["id"]) + logger.info(f"[change_email] {login}: auth ok, starting email change wizard...") + + wizard = await run_common_wizard( + steam, + entry_url="https://help.steampowered.com/wizard/HelpChangeEmail?redir=store/account/", + login=login, + password=password, + ) + logger.info(f"[change_email] {login}: wizard done") + + if not new_email: + new_email = await task_manager.prompt_user(task_id, f"Введите новый email для {login}", login=login) + if not new_email: + raise ValueError("new_email is required") + + await task_manager.set_step(task_id, 3, 5, "Запрос смены", acc_id=account["id"]) + logger.info(f"[change_email] {login}: requesting email change -> {new_email}...") + + for attempt in range(2): + fresh_sid = _get_fresh_sessionid(steam) + text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxAccountRecoveryChangeEmail/", + method="POST", + data={ + "s": wizard.s, + "account": wizard.account, + "sessionid": fresh_sid, + "wizard_ajax": 1, + "gamepad": 0, + "email": new_email, + }, + headers=AJAX_HEADERS, + ) + data = json.loads(text) if isinstance(text, str) else text + logger.debug(f"[change_email] {login}: change request attempt {attempt+1} response: {data}") + if data.get("errorMsg"): + error_code = data.get("success", 0) + if error_code == 24: + raise PermissionError(f"Insufficient privileges for email change: {data['errorMsg']}") + raise RuntimeError(f"Email change request failed: {data['errorMsg']}") + + if attempt == 0: + await asyncio.sleep(3) + + await task_manager.set_step(task_id, 4, 5, "Код подтверждения", acc_id=account["id"]) + email_code = await task_manager.prompt_user(task_id, f"Введите код подтверждения с email ({new_email})", login=login) + if not email_code: + raise ValueError("email_code is required") + email_code = email_code.strip() + + logger.info(f"[change_email] {login}: confirming email change...") + fresh_sid = _get_fresh_sessionid(steam) + confirm_text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxAccountRecoveryConfirmChangeEmail/", + method="POST", + data={ + "s": wizard.s, + "account": wizard.account, + "sessionid": fresh_sid, + "wizard_ajax": 1, + "gamepad": 0, + "email": new_email, + "email_change_code": email_code, + }, + headers=AJAX_HEADERS, + ) + confirm_data = json.loads(confirm_text) if isinstance(confirm_text, str) else confirm_text + logger.debug(f"[change_email] {login}: confirm response: success={confirm_data.get('success')}") + + error_code = confirm_data.get("success", 0) + if confirm_data.get("errorMsg") and error_code != 29: + raise RuntimeError(f"Email confirmation failed: {confirm_data['errorMsg']}") + + await task_manager.set_step(task_id, 5, 5, "Сохранение", acc_id=account["id"]) + from app.database import get_db + db = await get_db() + await db.execute( + "UPDATE accounts SET email = ?, updated_at = datetime('now') WHERE id = ?", + (new_email, account["id"]), + ) + await db.commit() + + logger.success(f"[change_email] {login}: email changed successfully -> {new_email}") + finally: + await close_steam(steam) + + +async def validate_account(account: dict, params: dict, task_id: str = "") -> None: + """Validate account credentials by attempting login. Fetches profile and ban status on success.""" + from app.database import get_db + from app.services.steam_auth import close_steam + from app.services.steam_profile import fetch_profile + from app.services.steam_ban import check_ban + from app.core.task_manager import task_manager + from app.config import read_validation_settings + + steam = None + error_msg = None + ban_status = "" + + val_settings = read_validation_settings() + + login = account["login"] + profile = None + try: + await task_manager.set_step(task_id, 1, 4, "Авторизация", acc_id=account["id"]) + logger.info(f"[validate] {login}: logging in to Steam...") + steam = await create_steam_session(account) + status = "valid" + logger.info(f"[validate] {login}: auth ok") + + if status == "valid" and steam is not None: + if val_settings.get("check_ban"): + await task_manager.set_step(task_id, 2, 4, "Проверка бана", acc_id=account["id"]) + logger.info(f"[validate] {login}: checking ban status...") + ban_status = await check_ban(steam) + logger.info(f"[validate] {login}: ban = {ban_status or 'none'}") + if account.get("steam_id") and val_settings.get("fetch_profile"): + await task_manager.set_step(task_id, 3, 4, "Профиль", acc_id=account["id"]) + logger.info(f"[validate] {login}: fetching profile (id={account['steam_id']})...") + profile = await fetch_profile(account["steam_id"], steam=steam) + if profile: + logger.info(f"[validate] {login}: profile fetched — {profile.get('nickname')}, lvl={profile.get('steam_level')}") + else: + logger.warning(f"[validate] {login}: failed to fetch profile") + + await task_manager.set_step(task_id, 4, 4, "Сохранение", acc_id=account["id"]) + if steam is not None and status == "valid": + try: + session_cookies = extract_session_cookies(steam) + if session_cookies: + _db = await get_db() + await _db.execute( + "UPDATE accounts SET session_cookies = ?, updated_at = datetime('now') WHERE id = ?", + (session_cookies, account["id"]), + ) + await _db.commit() + logger.debug(f"[validate] {login}: saved session cookies") + except Exception as cookie_err: + logger.warning(f"[validate] {login}: failed to save cookies — {cookie_err}") + + except Exception as exc: + status = "invalid" + error_msg = str(exc) + logger.warning(f"[validate] {login}: error — {error_msg}") + finally: + if steam is not None: + await close_steam(steam) + + db = await get_db() + await db.execute( + "UPDATE accounts SET status = ?, ban_status = ?, updated_at = datetime('now') WHERE id = ?", + (status, ban_status or None, account["id"]), + ) + await db.commit() + + if profile: + sets = [] + vals = [] + for col, key in [("nickname", "nickname"), ("avatar_url", "avatar_url"), ("steam_level", "steam_level"), ("last_online", "last_online")]: + if profile.get(key) is not None: + sets.append(f"{col} = ?") + vals.append(profile[key]) + if sets: + sets.append("updated_at = datetime('now')") + vals.append(account["id"]) + await db.execute(f"UPDATE accounts SET {', '.join(sets)} WHERE id = ?", vals) + await db.commit() + logger.info(f"[validate] {login}: profile saved — {profile.get('nickname')}") + + if error_msg: + raise Exception(f"{error_msg}") + else: + ban_info = f" | ban={ban_status}" if ban_status else "" + logger.info(f"[validate] {login}: result — {status}{ban_info}") diff --git a/app/services/steam_guard.py b/app/services/steam_guard.py new file mode 100644 index 0000000..cb17092 --- /dev/null +++ b/app/services/steam_guard.py @@ -0,0 +1,83 @@ +import base64 +import hashlib +import hmac +import struct +import time + +from loguru import logger + + +def generate_2fa_code(shared_secret: str) -> str: + """Generate a Steam Guard 2FA code from shared_secret.""" + timestamp = int(time.time()) // 30 + msg = struct.pack(">Q", timestamp) + key = base64.b64decode(shared_secret) + auth = hmac.new(key, msg, hashlib.sha1).digest() + + offset = auth[19] & 0xF + code = struct.unpack(">I", auth[offset : offset + 4])[0] & 0x7FFFFFFF + + chars = "23456789BCDFGHJKMNPQRTVWXY" + result = [] + for _ in range(5): + result.append(chars[code % len(chars)]) + code //= len(chars) + + return "".join(result) + + +async def remove_guard(account: dict, params: dict, task_id: str = "") -> None: + """Remove Steam Guard 2FA via revocation code from mafile.""" + from app.services.steam_auth import create_steam_session, close_steam, read_mafile_data + from app.core.task_manager import task_manager + + mafile = read_mafile_data(account) + revocation_code = (mafile or {}).get("revocation_code", "") if mafile else "" + if not revocation_code: + raise ValueError("revocation_code not found in mafile") + + login = account["login"] + await task_manager.set_step(task_id, 1, 3, "Авторизация", acc_id=account["id"]) + logger.info(f"[remove_guard] {login}: logging in to Steam...") + steam = await create_steam_session(account) + logger.info(f"[remove_guard] {login}: auth ok") + try: + await task_manager.set_step(task_id, 2, 3, "Удаление Guard", acc_id=account["id"]) + logger.info(f"[remove_guard] {login}: sending Guard removal request...") + sessionid = await steam.sessionid("store.steampowered.com") + + await steam.request( + url="https://store.steampowered.com/twofactor/remove", + method="GET", + params={"step": "promptdevice"}, + ) + await steam.request( + url="https://store.steampowered.com/twofactor/remove", + method="GET", + params={"step": "promptrcode"}, + ) + await steam.request( + url="https://store.steampowered.com/twofactor/manage_action", + method="POST", + data={"action": "removercode", "sessionid": sessionid}, + ) + response = await steam.request( + url="https://store.steampowered.com/twofactor/manage_remove_revocation_code", + method="POST", + data={"revocation_code": revocation_code, "sessionid": sessionid}, + ) + + await task_manager.set_step(task_id, 3, 3, "Готово", acc_id=account["id"]) + logger.success(f"[remove_guard] {login}: Guard removed") + finally: + await close_steam(steam) + + +async def generate_2fa(account: dict, params: dict, task_id: str = "") -> None: + """Generate and log a 2FA code for an account.""" + shared_secret = account.get("shared_secret", "") + if not shared_secret: + raise ValueError("No shared_secret for this account") + + code = generate_2fa_code(shared_secret) + logger.debug(f"[generate_2fa] {account['login']}: code = {code}") diff --git a/app/services/steam_password.py b/app/services/steam_password.py new file mode 100644 index 0000000..5a2b57f --- /dev/null +++ b/app/services/steam_password.py @@ -0,0 +1,122 @@ +import json +import secrets +import string +from pathlib import Path + +from loguru import logger + +from app.core.crypto import encrypt_password +from app.services.steam_auth import create_steam_session, close_steam, read_mafile_data +from app.services.steam_wizard import ( + AJAX_HEADERS, + get_rsa_key, + run_common_wizard, +) + + +async def change_password(account: dict, params: dict, task_id: str = "") -> None: + """Change account password via Steam recovery wizard.""" + from app.core.task_manager import task_manager + + new_password = params.get("new_password", "") + if not new_password: + raise ValueError("new_password is required") + + login = account["login"] + + mafile_data = read_mafile_data(account) + if not mafile_data: + raise ValueError(f"No mafile found for {login} — cannot change password without 2FA") + + identity_secret = mafile_data.get("identity_secret", "") + device_id = mafile_data.get("device_id") + + if not identity_secret: + raise ValueError(f"No identity_secret in mafile for {login} — mobile confirmation impossible") + if not device_id: + raise ValueError(f"No device_id in mafile for {login} — mobile confirmation impossible") + + await task_manager.set_step(task_id, 1, 5, "Авторизация", acc_id=account["id"]) + logger.info(f"[change_password] {login}: logging in to Steam...") + steam = await create_steam_session(account) + logger.info(f"[change_password] {login}: auth ok") + + try: + await task_manager.set_step(task_id, 2, 5, "Wizard", acc_id=account["id"]) + logger.info(f"[change_password] {login}: starting password change wizard...") + wizard = await run_common_wizard( + steam, + entry_url="https://help.steampowered.com/wizard/HelpChangePassword?redir=store/account/", + login=login, + password=account["password"], + ) + + await task_manager.set_step(task_id, 3, 5, "RSA ключ", acc_id=account["id"]) + logger.info(f"[change_password] {login}: wizard done, getting RSA key...") + mod, exp, timestamp = await get_rsa_key(steam, login) + + logger.info(f"[change_password] {login}: checking new password availability...") + sessionid = await steam.sessionid("help.steampowered.com") + check_text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxCheckPasswordAvailable/", + method="POST", + data={ + "sessionid": sessionid, + "wizard_ajax": 1, + "password": new_password, + }, + headers=AJAX_HEADERS, + ) + check_data = json.loads(check_text) if isinstance(check_text, str) else check_text + if not check_data.get("available"): + raise ValueError("New password is not available (too weak or reused)") + + encrypted_new = encrypt_password(new_password, mod, exp) + await task_manager.set_step(task_id, 4, 5, "Отправка запроса", acc_id=account["id"]) + logger.info(f"[change_password] {login}: password available, sending change request...") + result_text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxAccountRecoveryChangePassword/", + method="POST", + data={ + "sessionid": sessionid, + "wizard_ajax": 1, + "s": wizard.s, + "account": wizard.account, + "password": encrypted_new, + "rsatimestamp": timestamp, + }, + headers=AJAX_HEADERS, + ) + + result_data = json.loads(result_text) if isinstance(result_text, str) else result_text + logger.debug(f"[change_password] {login}: change response: success={result_data.get('success')}, hasHash={bool(result_data.get('hash'))}") + + if result_data.get("errorMsg"): + raise RuntimeError(f"Password change rejected by Steam: {result_data['errorMsg']}") + if not result_data.get("hash"): + raise RuntimeError(f"Password change failed — no confirmation hash from Steam: {result_data}") + + await task_manager.set_step(task_id, 5, 5, "Сохранение", acc_id=account["id"]) + from app.database import get_db + db = await get_db() + await db.execute( + "UPDATE accounts SET password = ?, updated_at = datetime('now') WHERE id = ?", + (new_password, account["id"]), + ) + await db.commit() + + logger.success(f"[change_password] {login}: password changed") + finally: + await close_steam(steam) + + +def _generate_random_password(length: int = 24) -> str: + alphabet = string.ascii_letters + string.digits + "!" + return "".join(secrets.choice(alphabet) for _ in range(length)) + + +async def random_password(account: dict, params: dict, task_id: str = "") -> None: + """Change account password to a randomly generated one.""" + new_password = _generate_random_password() + params["new_password"] = new_password + await change_password(account, params) diff --git a/app/services/steam_phone.py b/app/services/steam_phone.py new file mode 100644 index 0000000..7ad8249 --- /dev/null +++ b/app/services/steam_phone.py @@ -0,0 +1,216 @@ +import json +import re + +from loguru import logger + +from app.services.steam_auth import create_steam_session, close_steam +from app.services.steam_wizard import AJAX_HEADERS, run_common_wizard + +_PHONE_RE = re.compile(r"^\+\d{7,15}$") + + +def _get_fresh_sessionid(steam) -> str: + """Get sessionid from the live aiohttp cookie jar (not from stale storage).""" + return steam._requests.cookies("help.steampowered.com").get("sessionid", "") + + +def _validate_phone(phone: str) -> str: + """Strip spaces/dashes and verify E.164-like format.""" + cleaned = re.sub(r"[\s\-()]", "", phone) + if cleaned and not cleaned.startswith("+"): + cleaned = "+" + cleaned + if not _PHONE_RE.match(cleaned): + raise ValueError( + f"Неверный формат номера: '{phone}'. " + "Ожидается международный формат, например +79123456789" + ) + return cleaned + + +async def change_phone(account: dict, params: dict, task_id: str = "") -> None: + """Change phone number on a Steam account via recovery wizard + interactive prompts.""" + from app.core.task_manager import task_manager + + login = account["login"] + new_phone = params.get("new_phone", "") + if new_phone: + new_phone = _validate_phone(new_phone) + await task_manager.set_step(task_id, 1, 5, "Авторизация", acc_id=account["id"]) + logger.info(f"[change_phone] {login}: logging in to Steam...") + steam = await create_steam_session(account) + try: + password = account["password"] + await task_manager.set_step(task_id, 2, 5, "Wizard", acc_id=account["id"]) + logger.info(f"[change_phone] {login}: auth ok, starting phone change wizard...") + + wizard = await run_common_wizard( + steam, + entry_url="https://help.steampowered.com/en/wizard/HelpRemovePhoneNumber?redir=store/account", + login=login, + password=password, + ) + logger.info(f"[change_phone] {login}: wizard done") + + if not new_phone: + new_phone = await task_manager.prompt_user(task_id, f"Введите новый номер телефона для {login}", login=login) + if not new_phone: + raise ValueError("new_phone is required") + new_phone = _validate_phone(new_phone) + + await task_manager.set_step(task_id, 3, 5, "Запрос смены", acc_id=account["id"]) + logger.info(f"[change_phone] {login}: requesting phone change -> {new_phone}...") + + fresh_sid = _get_fresh_sessionid(steam) + text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxAccountRecoveryChangePhone/", + method="POST", + data={ + "s": wizard.s, + "account": wizard.account, + "sessionid": fresh_sid, + "wizard_ajax": 1, + "gamepad": 0, + "phone_number": new_phone, + }, + headers=AJAX_HEADERS, + ) + data = json.loads(text) if isinstance(text, str) else text + logger.info(f"[change_phone] {login}: change request response: {data}") + if data.get("errorMsg"): + err = data["errorMsg"] + hint = "" + if "112" in err: + hint = " (номер уже привязан к другому аккаунту, виртуальный/VoIP, или не поддерживается Steam)" + raise RuntimeError(f"Phone change request failed: {err}{hint}") + + await task_manager.set_step(task_id, 4, 5, "SMS код", acc_id=account["id"]) + sms_code = await task_manager.prompt_user(task_id, f"Введите SMS код с номера {new_phone}", login=login) + if not sms_code: + raise ValueError("sms_code is required") + sms_code = sms_code.strip() + + logger.info(f"[change_phone] {login}: confirming with SMS code...") + fresh_sid = _get_fresh_sessionid(steam) + confirm_text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxAccountRecoveryConfirmChangePhone/", + method="POST", + data={ + "s": wizard.s, + "account": wizard.account, + "sessionid": fresh_sid, + "wizard_ajax": 1, + "gamepad": 0, + "phone_number": new_phone, + "phone_change_code": sms_code, + }, + headers=AJAX_HEADERS, + ) + confirm_data = json.loads(confirm_text) if isinstance(confirm_text, str) else confirm_text + logger.info(f"[change_phone] {login}: confirm response: {confirm_data}") + if confirm_data.get("errorMsg"): + raise RuntimeError(f"Phone confirmation failed: {confirm_data['errorMsg']}") + + await task_manager.set_step(task_id, 5, 5, "Сохранение", acc_id=account["id"]) + from app.database import get_db + db = await get_db() + await db.execute( + "UPDATE accounts SET phone = ?, updated_at = datetime('now') WHERE id = ?", + (new_phone, account["id"]), + ) + await db.commit() + + logger.success(f"[change_phone] {login}: phone changed -> {new_phone}") + finally: + await close_steam(steam) + + +async def remove_phone(account: dict, params: dict, task_id: str = "") -> None: + """Remove phone by changing it to a disposable number + SMS confirmation.""" + from app.core.task_manager import task_manager + + login = account["login"] + new_phone = params.get("new_phone", "") + if new_phone: + new_phone = _validate_phone(new_phone) + await task_manager.set_step(task_id, 1, 5, "Авторизация", acc_id=account["id"]) + logger.info(f"[remove_phone] {login}: logging in to Steam...") + steam = await create_steam_session(account) + try: + password = account["password"] + await task_manager.set_step(task_id, 2, 5, "Wizard", acc_id=account["id"]) + logger.info(f"[remove_phone] {login}: starting phone removal wizard...") + + wizard = await run_common_wizard( + steam, + entry_url="https://help.steampowered.com/en/wizard/HelpRemovePhoneNumber?redir=store/account", + login=login, + password=password, + ) + + if not new_phone: + new_phone = await task_manager.prompt_user(task_id, "Введите новый номер телефона (на который переставится старый)", login=login) + if not new_phone: + raise ValueError("new_phone is required for phone removal") + new_phone = _validate_phone(new_phone) + + await task_manager.set_step(task_id, 3, 5, "Запрос смены", acc_id=account["id"]) + logger.info(f"[remove_phone] {login}: requesting phone change -> {new_phone}...") + + fresh_sid = _get_fresh_sessionid(steam) + text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxAccountRecoveryChangePhone/", + method="POST", + data={ + "s": wizard.s, + "account": wizard.account, + "sessionid": fresh_sid, + "wizard_ajax": 1, + "gamepad": 0, + "phone_number": new_phone, + }, + headers=AJAX_HEADERS, + ) + data = json.loads(text) if isinstance(text, str) else text + logger.info(f"[remove_phone] {login}: change request response: {data}") + if data.get("errorMsg"): + raise RuntimeError(f"Phone change request failed: {data['errorMsg']}") + + await task_manager.set_step(task_id, 4, 5, "SMS код", acc_id=account["id"]) + sms_code = await task_manager.prompt_user(task_id, f"Введите SMS код с номера {new_phone}", login=login) + if not sms_code: + raise ValueError("sms_code is required") + sms_code = sms_code.strip() + + logger.info(f"[remove_phone] {login}: confirming with SMS code...") + fresh_sid = _get_fresh_sessionid(steam) + confirm_text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxAccountRecoveryConfirmChangePhone/", + method="POST", + data={ + "s": wizard.s, + "account": wizard.account, + "sessionid": fresh_sid, + "wizard_ajax": 1, + "gamepad": 0, + "phone_number": new_phone, + "phone_change_code": sms_code, + }, + headers=AJAX_HEADERS, + ) + confirm_data = json.loads(confirm_text) if isinstance(confirm_text, str) else confirm_text + logger.info(f"[remove_phone] {login}: confirm response: {confirm_data}") + if confirm_data.get("errorMsg"): + raise RuntimeError(f"Phone confirmation failed: {confirm_data['errorMsg']}") + + await task_manager.set_step(task_id, 5, 5, "Сохранение", acc_id=account["id"]) + from app.database import get_db + db = await get_db() + await db.execute( + "UPDATE accounts SET phone = NULL, updated_at = datetime('now') WHERE id = ?", + (account["id"],), + ) + await db.commit() + + logger.success(f"[remove_phone] {login}: phone removed (changed to {new_phone})") + finally: + await close_steam(steam) diff --git a/app/services/steam_profile.py b/app/services/steam_profile.py new file mode 100644 index 0000000..de4565e --- /dev/null +++ b/app/services/steam_profile.py @@ -0,0 +1,90 @@ +import re + +import aiohttp +from loguru import logger + + +async def fetch_profile(steam_id: str, steam=None) -> dict | None: + """Fetch persona name and avatar URL from Steam community profile page. + + If *steam* session is provided, uses authenticated cookies. + Returns {"nickname": str, "avatar_url": str, "steam_level": int|None} or None on failure. + """ + url = f"https://steamcommunity.com/profiles/{steam_id}/" + try: + if steam is not None: + from app.services.steam_auth import raw_request + resp = await raw_request(steam, url, method="GET", allow_redirects=True) + if resp.status != 200: + logger.warning(f"Profile fetch for {steam_id}: HTTP {resp.status}") + return None + html = await resp.text() + else: + headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"} + async with aiohttp.ClientSession(headers=headers) as session: + async with session.get(url, timeout=aiohttp.ClientTimeout(total=15)) as resp: + if resp.status != 200: + logger.warning(f"Profile fetch for {steam_id}: HTTP {resp.status}") + return None + html = await resp.text() + except Exception as exc: + logger.warning(f"Profile fetch error for {steam_id}: {exc}") + return None + + nickname = _parse_persona_name(html) + avatar_url = _parse_avatar(html) + steam_level = _parse_level(html) + last_online = _parse_last_online(html) + + if not nickname and not avatar_url: + return None + + return {"nickname": nickname, "avatar_url": avatar_url, "steam_level": steam_level, "last_online": last_online} + + +def _parse_persona_name(html: str) -> str | None: + # g_rgProfileData = {"personaname":"jeffreyoelze1999",...} + m = re.search(r'"personaname"\s*:\s*"([^"]*)"', html) + if m: + return m.group(1) + # Fallback: ... + m = re.search(r'([^<]+)', html) + return m.group(1) if m else None + + +def _parse_avatar(html: str) -> str | None: + # 1) g_rgProfileData JSON: {"avatarfull":"https://avatars.fastly.steamstatic.com/..."} + m = re.search(r'"avatarfull"\s*:\s*"(https://[^"]+)"', html) + if m: + return m.group(1).replace("_full.jpg", "_medium.jpg") + # 2) + m = re.search(r']+srcset="(https://[^"]+)"', html) + if m: + return m.group(1).replace("_full.jpg", "_medium.jpg") + return None + + +def _parse_level(html: str) -> int | None: + # 100 + m = re.search(r'(\d+)', html) + return int(m.group(1)) if m else None + + +def _parse_last_online(html: str) -> str | None: + # "Last Online X days ago" → "Xd", "X hrs ago" → "Xh", "X min ago" → "Xm" + m = re.search(r'Last\s+Online[^<]{0,150}?(\d+)\s+day', html, re.IGNORECASE) + if m: + return f"{m.group(1)}d" + m = re.search(r'Last\s+Online[^<]{0,150}?(\d+)\s+hr', html, re.IGNORECASE) + if m: + return f"{m.group(1)}h" + m = re.search(r'Last\s+Online[^<]{0,150}?(\d+)\s+min', html, re.IGNORECASE) + if m: + return f"{m.group(1)}m" + if re.search(r'Currently\s+(In-Game|Online)', html, re.IGNORECASE): + return "online" + return None diff --git a/app/services/steam_token_checker.py b/app/services/steam_token_checker.py new file mode 100644 index 0000000..2206cf5 --- /dev/null +++ b/app/services/steam_token_checker.py @@ -0,0 +1,176 @@ +"""Validation service for token accounts (refresh token → cookies).""" + +import base64 +import json as _json + +import aiohttp +from aiohttp import FormData +from loguru import logger + +from app.services.steam_auth import _resolve_proxy +from app.core.proxy_manager import proxy_manager +from app.core.task_manager import task_manager +from pysteamauth.auth.schemas import FinalizeLoginStatus + + +def _decode_jwt_payload(token: str) -> dict: + """Decode the payload section of a JWT without verifying the signature.""" + parts = token.split(".") + if len(parts) != 3: + raise ValueError("Token must have 3 parts (header.payload.signature)") + payload_b64 = parts[1] + # Pad base64 if needed + payload_b64 += "=" * (-len(payload_b64) % 4) + payload_bytes = base64.urlsafe_b64decode(payload_b64) + return _json.loads(payload_bytes) + + +async def check_token_account(account: dict, params: dict, *, task_id: str) -> None: + """Convert refresh_token → web cookies, fetch profile via cookies, update DB.""" + acc_id = account["id"] + token = account["token"] + + # Step 1: Decode JWT to get steam_id + await task_manager.set_step(task_id, 1, 4, "Декодирование токена", acc_id) + try: + jwt_payload = _decode_jwt_payload(token) + except Exception as exc: + logger.error(f"[token_checker] {account.get('login', acc_id)}: bad JWT — {exc}") + await _mark_invalid(acc_id) + raise + + steam_id = jwt_payload.get("sub") + + # Step 2: GET steamcommunity.com for sessionid cookie + await task_manager.set_step(task_id, 2, 4, "Получение sessionid", acc_id) + proxy = await _resolve_proxy(account) + connector = proxy_manager.get_connector(proxy) if proxy else aiohttp.TCPConnector() + jar = aiohttp.CookieJar(unsafe=True) + headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + "Origin": "https://steamcommunity.com", + } + timeout = aiohttp.ClientTimeout(total=30) + + try: + async with aiohttp.ClientSession( + connector=connector, cookie_jar=jar, headers=headers, timeout=timeout, + ) as session: + async with session.get("https://steamcommunity.com") as resp: + await resp.read() + + sessionid = None + for cookie in jar: + if cookie.key == "sessionid": + sessionid = cookie.value + break + if not sessionid: + raise RuntimeError("Failed to acquire sessionid cookie") + + # Step 3: POST /jwt/finalizelogin with refresh_token as nonce + await task_manager.set_step(task_id, 3, 4, "Получение куки", acc_id) + form = FormData(fields=[ + ("nonce", token), + ("sessionid", sessionid), + ("redir", "https://steamcommunity.com/login/home/?goto="), + ]) + async with session.post( + "https://login.steampowered.com/jwt/finalizelogin", + data=form, + ) as resp: + resp_text = await resp.text() + if resp.status != 200: + raise RuntimeError(f"finalizelogin HTTP {resp.status}: {resp_text[:200]}") + + resp_json = _json.loads(resp_text) + if not resp_json.get("steamID"): + error_msg = resp_json.get("message", resp_text[:200]) + raise RuntimeError(f"finalizelogin failed: {error_msg}") + + finalize = FinalizeLoginStatus.model_validate(resp_json) + steam_id = finalize.steamID or steam_id + + # Post to each transfer_info URL to set domain cookies + for ti in finalize.transfer_info: + form = FormData(fields=[ + ("nonce", ti.params.nonce), + ("auth", ti.params.auth), + ("steamID", str(steam_id)), + ]) + try: + async with session.post(ti.url, data=form) as _resp: + await _resp.read() + except Exception: + pass + + # Visit extra domains to collect all cookies + for url in ("https://store.steampowered.com", "https://help.steampowered.com"): + try: + async with session.get(url) as _resp: + await _resp.read() + except Exception: + pass + + # Collect cookies from jar + all_cookies = [] + for c in jar: + all_cookies.append({ + "name": c.key, + "value": c.value, + "domain": c.get("domain", ""), + "path": c.get("path", "/"), + "secure": "secure" in str(c).lower(), + "httpOnly": "httponly" in str(c).lower(), + }) + session_cookies_json = _json.dumps(all_cookies) + logger.debug(f"[token_checker] {account.get('login', acc_id)}: got {len(all_cookies)} cookies") + + # Step 4: Fetch profile using authenticated session (cookies set) + await task_manager.set_step(task_id, 4, 4, "Получение профиля", acc_id) + nickname = None + steam_level = None + avatar_url = None + last_online = None + if steam_id and steam_id != "0": + profile_url = f"https://steamcommunity.com/profiles/{steam_id}/" + try: + async with session.get(profile_url) as resp: + if resp.status == 200: + html = await resp.text() + from app.services.steam_profile import ( + _parse_persona_name, _parse_avatar, _parse_level, _parse_last_online, + ) + nickname = _parse_persona_name(html) + avatar_url = _parse_avatar(html) + steam_level = _parse_level(html) + last_online = _parse_last_online(html) + except Exception as exc: + logger.warning(f"[token_checker] profile fetch error: {exc}") + + # Update DB + from app.database import get_db + db = await get_db() + await db.execute( + """UPDATE token_accounts + SET steam_id = ?, nickname = ?, steam_level = ?, avatar_url = ?, last_online = ?, + session_cookies = ?, status = 'valid', updated_at = datetime('now') + WHERE id = ?""", + (steam_id, nickname, steam_level, avatar_url, last_online, session_cookies_json, acc_id), + ) + await db.commit() + logger.success(f"[token_checker] {account.get('login', acc_id)} → valid, steam_id={steam_id}") + + except Exception as exc: + await _mark_invalid(acc_id) + logger.error(f"[token_checker] {account.get('login', acc_id)} → {exc}") + raise + + +async def _mark_invalid(acc_id: int) -> None: + from app.database import get_db + db = await get_db() + await db.execute( + "UPDATE token_accounts SET status = 'invalid', updated_at = datetime('now') WHERE id = ?", + (acc_id,), + ) + await db.commit() diff --git a/app/services/steam_wizard.py b/app/services/steam_wizard.py new file mode 100644 index 0000000..af069f1 --- /dev/null +++ b/app/services/steam_wizard.py @@ -0,0 +1,397 @@ +"""Shared Steam account recovery wizard flow. + +Steps 1-9 are identical across password change, email change, and phone removal. +This module extracts that common logic. +""" + +import asyncio +import json +from dataclasses import dataclass +from urllib.parse import parse_qs, urlparse + +from loguru import logger + +from app.core.crypto import encrypt_password +from app.services.steam_auth import raw_request + +BROWSER_UA = ( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/" + "537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36" +) + +AJAX_HEADERS = { + "Accept": "*/*", + "X-Requested-With": "XMLHttpRequest", + "User-Agent": BROWSER_UA, + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "Origin": "https://help.steampowered.com", +} + + +@dataclass +class WizardParams: + s: int + account: int + reset: int + issueid: int + lost: int = 0 + sessionid: str = "" + + +async def parse_wizard_redirect(steam, entry_url: str) -> WizardParams: + """Step 1-2: Navigate to wizard entry URL, follow redirects, parse params from final URL.""" + logger.debug(f"[Wizard] Step 1-2: GET {entry_url}") + response = await raw_request( + steam, + url=entry_url, + method="GET", + headers={"User-Agent": BROWSER_UA}, + allow_redirects=True, + ) + final_url = str(response.url) + logger.debug(f"[Wizard] Redirect → {final_url}") + query = parse_qs(urlparse(final_url).query) + + sessionid = await steam.sessionid("help.steampowered.com") + + params = WizardParams( + s=int(query.get("s", [0])[0]), + account=int(query.get("account", [0])[0]), + reset=int(query.get("reset", [0])[0]), + issueid=int(query.get("issueid", [0])[0]), + lost=int(query.get("lost", [0])[0]), + sessionid=sessionid, + ) + logger.debug(f"[Wizard] Parsed: s={params.s}, account={params.account}, reset={params.reset}, issueid={params.issueid}") + return params + + +async def login_info_enter_code(steam, params: WizardParams) -> dict: + """Step 3: Enter code mode.""" + logger.debug("[Wizard] Step 3: HelpWithLoginInfoEnterCode") + text = await steam.request( + url="https://help.steampowered.com/en/wizard/HelpWithLoginInfoEnterCode", + method="GET", + params={ + "s": params.s, + "account": params.account, + "reset": params.reset, + "lost": params.lost, + "issueid": params.issueid, + "sessionid": params.sessionid, + "wizard_ajax": 1, + "gamepad": 0, + }, + headers=AJAX_HEADERS, + ) + result = json.loads(text) if isinstance(text, str) else text + logger.debug(f"[Wizard] Step 3 response: {result}") + return result + + +async def send_recovery_code(steam, params: WizardParams) -> dict: + """Step 4: Send account recovery code (method=8 = mobile app).""" + logger.debug("[Wizard] Step 4: AjaxSendAccountRecoveryCode (method=8, mobile)") + text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxSendAccountRecoveryCode", + method="POST", + data={ + "s": params.s, + "account": params.account, + "reset": params.reset, + "lost": params.lost, + "issueid": params.issueid, + "sessionid": params.sessionid, + "wizard_ajax": 1, + "gamepad": 0, + "method": 8, + "link": "", + "n": 1, + }, + headers=AJAX_HEADERS, + ) + result = json.loads(text) if isinstance(text, str) else text + logger.debug(f"[Wizard] Step 4 response: {result}") + if result.get("errorMsg"): + raise RuntimeError(f"SendRecoveryCode failed: {result['errorMsg']}") + return result + + +async def mobile_confirm(steam, params: WizardParams, retries: int = 5) -> None: + """Step 5: Confirm via Steam mobile confirmations API (getlist → find by creator_id → ajaxop allow).""" + logger.debug("[Wizard] Step 5: Mobile confirmation") + + try: + sid = steam.steamid + except (ValueError, AttributeError): + sid = None + if not sid: + raise RuntimeError("No steamid on Steam object — cannot perform mobile confirmation") + + try: + did = steam.device_id + except (ValueError, AttributeError): + did = None + if not did: + raise RuntimeError("No device_id on Steam object — cannot perform mobile confirmation") + + try: + _ = steam.identity_secret + except (ValueError, AttributeError): + raise RuntimeError("No identity_secret on Steam object — cannot perform mobile confirmation") + + logger.debug(f"[MobileConfirm] steamid={sid}, device_id={did[:20]}..., creator_id(s)={params.s}") + + # Steam needs time to create the confirmation after send_recovery_code + logger.debug("[MobileConfirm] Waiting 3s for Steam to create confirmation...") + await asyncio.sleep(3) + + for attempt in range(retries): + try: + server_time = await steam.get_server_time() + conf_hash = steam.get_confirmation_hash(server_time=server_time) + logger.debug(f"[MobileConfirm] Attempt {attempt + 1}/{retries}: getlist (server_time={server_time})") + + conf_text = await steam.request( + url="https://steamcommunity.com/mobileconf/getlist", + method="GET", + cookies={ + "mobileClient": "ios", + "mobileClientVersion": "2.0.20", + "steamid": str(sid), + "Steam_Language": "english", + }, + params={ + "p": did, + "a": str(sid), + "k": conf_hash, + "t": server_time, + "m": "react", + "tag": "conf", + }, + ) + conf_data = json.loads(conf_text) if isinstance(conf_text, str) else conf_text + + confs = conf_data.get("conf", []) + logger.debug(f"[MobileConfirm] getlist response: success={conf_data.get('success')}, {len(confs)} confirmation(s)") + for i, c in enumerate(confs): + logger.debug( + f"[MobileConfirm] [{i}] id={c.get('id')}, type={c.get('type')}, " + f"type_name={c.get('type_name', '?')}, creator_id={c.get('creator_id')}, " + f"headline={c.get('headline', '')}" + ) + + if not conf_data.get("success"): + logger.warning(f"[MobileConfirm] getlist failed: {conf_data}") + raise RuntimeError(f"getlist failed: {conf_data}") + + target = None + creator = str(params.s) + for c in confs: + if str(c.get("creator_id", "")) == creator: + target = c + break + + if not target: + ids = [str(c.get("creator_id", "")) for c in confs] + logger.warning(f"[MobileConfirm] No match for creator_id={creator}, available: {ids}") + raise RuntimeError(f"No confirmation found for creator_id={creator}") + + logger.debug( + f"[MobileConfirm] Found match! id={target['id']}, nonce={target.get('nonce')}, " + f"creator_id={target.get('creator_id')}" + ) + + allow_time = await steam.get_server_time() + allow_hash = steam.get_confirmation_hash(server_time=allow_time, tag="allow") + logger.debug(f"[MobileConfirm] Calling ajaxop allow (server_time={allow_time})") + + allow_text = await steam.request( + url="https://steamcommunity.com/mobileconf/ajaxop", + method="GET", + cookies={ + "mobileClient": "ios", + "mobileClientVersion": "2.0.20", + }, + params={ + "op": "allow", + "p": did, + "a": str(sid), + "k": allow_hash, + "t": allow_time, + "m": "react", + "tag": "allow", + "cid": target["id"], + "ck": target["nonce"], + }, + ) + allow_data = json.loads(allow_text) if isinstance(allow_text, str) else allow_text + logger.debug(f"[MobileConfirm] ajaxop response: {allow_data}") + + if allow_data.get("success"): + logger.debug(f"[MobileConfirm] ✓ Confirmation accepted (attempt {attempt + 1})") + return + raise RuntimeError(f"ajaxop returned success=false: {allow_data}") + + except Exception as exc: + logger.warning(f"[MobileConfirm] Attempt {attempt + 1}/{retries} failed: {exc}") + if attempt < retries - 1: + logger.debug(f"[MobileConfirm] Retrying in 3s...") + await asyncio.sleep(3) + + raise RuntimeError(f"Mobile confirmation failed after {retries} retries") + + +async def poll_recovery_confirmation(steam, params: WizardParams) -> dict: + """Step 6: Poll account recovery confirmation (single call, matches old chemail.py).""" + logger.debug("[Wizard] Step 6: AjaxPollAccountRecoveryConfirmation") + text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxPollAccountRecoveryConfirmation", + method="POST", + data={ + "s": params.s, + "reset": params.reset, + "lost": params.lost, + "issueid": params.issueid, + "sessionid": params.sessionid, + "wizard_ajax": 1, + "gamepad": 0, + "method": 8, + }, + headers=AJAX_HEADERS, + ) + data = json.loads(text) if isinstance(text, str) else text + logger.debug(f"[Wizard] Step 6 response: {data}") + if data.get("errorMsg"): + raise RuntimeError(f"Poll error from Steam: {data['errorMsg']}") + return data + + +async def verify_recovery_code(steam, params: WizardParams) -> dict: + """Step 7: Verify recovery code (empty for mobile method).""" + logger.debug("[Wizard] Step 7: AjaxVerifyAccountRecoveryCode (code=empty, method=8)") + text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxVerifyAccountRecoveryCode", + method="GET", + params={ + "code": "", + "s": params.s, + "reset": params.reset, + "lost": params.lost, + "method": 8, + "issueid": params.issueid, + "sessionid": params.sessionid, + "wizard_ajax": 1, + "gamepad": 0, + }, + headers=AJAX_HEADERS, + ) + result = json.loads(text) if isinstance(text, str) else text + logger.debug(f"[Wizard] Step 7 response: {result}") + if result.get("errorMsg"): + raise RuntimeError(f"Step 7 (VerifyRecoveryCode) failed: {result['errorMsg']}") + return result + + +async def get_next_step(steam, params: WizardParams) -> dict: + """Step 8: Get next wizard step (lost=2 hardcoded).""" + logger.debug("[Wizard] Step 8: AjaxAccountRecoveryGetNextStep (lost=2)") + text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxAccountRecoveryGetNextStep", + method="POST", + data={ + "s": params.s, + "account": params.account, + "reset": params.reset, + "lost": 2, + "issueid": params.issueid, + "sessionid": params.sessionid, + "wizard_ajax": 1, + "gamepad": 0, + }, + headers=AJAX_HEADERS, + ) + result = json.loads(text) if isinstance(text, str) else text + logger.debug(f"[Wizard] Step 8 response: {result}") + if result.get("errorMsg"): + raise RuntimeError(f"Step 8 (GetNextStep) failed: {result['errorMsg']}") + return result + + +async def get_rsa_key(steam, login: str) -> tuple[str, str, int]: + """Step 9a: Get RSA public key from Steam.""" + logger.debug(f"[Wizard] Getting RSA key for {login}") + sessionid = await steam.sessionid("help.steampowered.com") + text = await steam.request( + url="https://help.steampowered.com/en/login/getrsakey/", + method="POST", + data={ + "sessionid": sessionid, + "username": login, + }, + headers=AJAX_HEADERS, + ) + data = json.loads(text) if isinstance(text, str) else text + logger.debug(f"[Wizard] RSA key received: success={data.get('success')}, timestamp={data.get('timestamp')}") + return data["publickey_mod"], data["publickey_exp"], int(data["timestamp"]) + + +async def verify_password(steam, params: WizardParams, login: str, password: str) -> dict: + """Step 9: Verify current password via RSA encryption.""" + logger.debug(f"[Wizard] Step 9: Verifying current password for {login}") + mod, exp, timestamp = await get_rsa_key(steam, login) + encrypted = encrypt_password(password, mod, exp) + sessionid = await steam.sessionid("help.steampowered.com") + + text = await steam.request( + url="https://help.steampowered.com/en/wizard/AjaxAccountRecoveryVerifyPassword/", + method="POST", + data={ + "sessionid": sessionid, + "s": params.s, + "lost": 2, + "reset": 1, + "password": encrypted, + "rsatimestamp": timestamp, + }, + headers=AJAX_HEADERS, + ) + result = json.loads(text) if isinstance(text, str) else text + logger.debug(f"[Wizard] Step 9 response: {result}") + if result.get("errorMsg"): + raise RuntimeError(f"Step 9 (VerifyPassword) failed: {result['errorMsg']}") + return result + + +async def run_common_wizard(steam, entry_url: str, login: str, password: str) -> WizardParams: + """Execute the full shared wizard flow (steps 1-9). + + Returns WizardParams ready for the service-specific final steps. + """ + logger.debug(f"[Wizard] ===== Starting wizard for {login} =====") + logger.debug(f"[Wizard] Entry URL: {entry_url}") + + params = await parse_wizard_redirect(steam, entry_url) + await asyncio.sleep(1) + + await login_info_enter_code(steam, params) + await asyncio.sleep(1) + + await send_recovery_code(steam, params) + await asyncio.sleep(1) + + await mobile_confirm(steam, params) + + await poll_recovery_confirmation(steam, params) + await asyncio.sleep(1) + + await verify_recovery_code(steam, params) + await asyncio.sleep(1) + + await get_next_step(steam, params) + await asyncio.sleep(1) + + await verify_password(steam, params, login, password) + + logger.debug(f"[Wizard] ===== Wizard complete for {login} =====") + return params diff --git a/app/static.zip b/app/static.zip new file mode 100644 index 0000000000000000000000000000000000000000..6cc8b0da40d4880760998f43728b474cda9ea12c GIT binary patch literal 100380 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%0DtTgcJu^yJ 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 literal 0 HcmV?d00001 diff --git a/app/static/assets/index-Bxw--tTv.js b/app/static/assets/index-Bxw--tTv.js new file mode 100644 index 0000000..fe29013 --- /dev/null +++ b/app/static/assets/index-Bxw--tTv.js @@ -0,0 +1,14 @@ +var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ee(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var k=/\/+/g;function A(e,t){return typeof e==`object`&&e&&e.key!=null?ee(``+e.key):t.toString(36)}function j(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function M(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,M(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+A(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(k,`$&/`)+`/`),M(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(k,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,S||(S=!0,O());else{var t=n(l);t!==null&&A(x,t.startTime-e)}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-Tt&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&A(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?O():S=!1}}}var O;if(typeof y==`function`)O=function(){y(D)};else if(typeof MessageChannel<`u`){var ee=new MessageChannel,k=ee.port2;ee.port1.onmessage=D,O=function(){k.postMessage(null)}}else O=function(){_(D,0)};function A(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,A(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,O()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1ae||(e.current=ie[ae],ie[ae]=null,ae--)}function L(e,t){ae++,ie[ae]=e.current,e.current=t}var oe=F(null),R=F(null),se=F(null),ce=F(null);function le(e,t){switch(L(se,t),L(R,e),L(oe,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}I(oe),L(oe,e)}function ue(){I(oe),I(R),I(se)}function de(e){e.memoizedState!==null&&L(ce,e);var t=oe.current,n=Hd(t,e.type);t!==n&&(L(R,e),L(oe,n))}function fe(e){R.current===e&&(I(oe),I(R)),ce.current===e&&(I(ce),Qf._currentValue=re)}var pe,me;function he(e){if(pe===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);pe=t&&t[1]||``,me=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{ge=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?he(n):``}function ve(e,t){switch(e.tag){case 26:case 27:case 5:return he(e.type);case 16:return he(`Lazy`);case 13:return e.child!==t&&t!==null?he(`Suspense Fallback`):he(`Suspense`);case 19:return he(`SuspenseList`);case 0:case 15:return _e(e.type,!1);case 11:return _e(e.type.render,!1);case 1:return _e(e.type,!0);case 31:return he(`Activity`);default:return``}}function ye(e){try{var t=``,n=null;do t+=ve(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var be=Object.prototype.hasOwnProperty,xe=t.unstable_scheduleCallback,Se=t.unstable_cancelCallback,Ce=t.unstable_shouldYield,we=t.unstable_requestPaint,Te=t.unstable_now,Ee=t.unstable_getCurrentPriorityLevel,De=t.unstable_ImmediatePriority,Oe=t.unstable_UserBlockingPriority,ke=t.unstable_NormalPriority,Ae=t.unstable_LowPriority,je=t.unstable_IdlePriority,Me=t.log,Ne=t.unstable_setDisableYieldValue,Pe=null,Fe=null;function Ie(e){if(typeof Me==`function`&&Ne(e),Fe&&typeof Fe.setStrictMode==`function`)try{Fe.setStrictMode(Pe,e)}catch{}}var Le=Math.clz32?Math.clz32:Be,Re=Math.log,ze=Math.LN2;function Be(e){return e>>>=0,e===0?32:31-(Re(e)/ze|0)|0}var Ve=256,He=262144,Ue=4194304;function We(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Ge(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=We(n))):i=We(o):i=We(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=We(n))):i=We(o)):i=We(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function Ke(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function qe(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Je(){var e=Ue;return Ue<<=1,!(Ue&62914560)&&(Ue=4194304),e}function Ye(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Xe(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Ze(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),un=!1;if(ln)try{var dn={};Object.defineProperty(dn,`passive`,{get:function(){un=!0}}),window.addEventListener(`test`,dn,dn),window.removeEventListener(`test`,dn,dn)}catch{un=!1}var fn=null,pn=null,mn=null;function hn(){if(mn)return mn;var e,t=pn,n=t.length,r,i=`value`in fn?fn.value:fn.textContent,a=i.length;for(e=0;e=qn),Xn=` `,Zn=!1;function Qn(e,t){switch(e){case`keyup`:return Gn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function $n(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var er=!1;function tr(e,t){switch(e){case`compositionend`:return $n(t);case`keypress`:return t.which===32?(Zn=!0,Xn):null;case`textInput`:return e=t.data,e===Xn&&Zn?null:e;default:return null}}function nr(e,t){if(er)return e===`compositionend`||!Kn&&Qn(e,t)?(e=hn(),mn=pn=fn=null,er=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=wr(n)}}function Er(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Er(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Dr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=It(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=It(e.document)}return t}function Or(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var kr=ln&&`documentMode`in document&&11>=document.documentMode,Ar=null,jr=null,Mr=null,Nr=!1;function Pr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Nr||Ar==null||Ar!==It(r)||(r=Ar,`selectionStart`in r&&Or(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Mr&&Cr(Mr,r)||(Mr=r,r=Ed(jr,`onSelect`),0>=o,i-=o,Ei=1<<32-Le(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),B&&Oi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),B&&Oi(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return B&&Oi(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),B&&Oi(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===O&&Da(l)===r.type){n(e,r.sibling),c=a(r,o.props),Pa(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=pi(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=fi(o.type,o.key,o.props,null,e.mode,c),Pa(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=gi(o,e.mode,c),c.return=e,e=c}return s(e);case O:return o=Da(o),b(e,r,o,c)}if(ne(o))return h(e,r,o,c);if(j(o)){if(l=j(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Na(o),c);if(o.$$typeof===C)return b(e,r,ta(e,o),c);Fa(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=mi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Ma=0;var i=b(e,t,n,r);return ja=null,i}catch(t){if(t===xa||t===Ca)throw t;var a=ci(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var La=Ia(!0),Ra=Ia(!1),za=!1;function Ba(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Va(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ha(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ua(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ai(e),ii(e,null,n),t}return ti(e,r,t,n),ai(e)}function Wa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,$e(e,n)}}function Ga(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ka=!1;function qa(){if(Ka){var e=fa;if(e!==null)throw e}}function Ja(e,t,n,r){Ka=!1;var i=e.updateQueue;za=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===da&&(Ka=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:za=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Ya(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Xa(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=N.T,s={};N.T=s,Fs(e,!1,t,n);try{var c=i(),l=N.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ps(e,t,ha(c,r),pu(e)):Ps(e,t,r,pu(e))}catch(n){Ps(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{P.p=a,o!==null&&s.types!==null&&(o.types=s.types),N.T=o}}function ws(){}function Ts(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Es(e).queue;Cs(e,a,t,re,n===null?ws:function(){return Ds(e),n(r)})}function Es(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:re,baseState:re,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:re},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ds(e){var t=Es(e);t.next===null&&(t=e.alternate.memoizedState),Ps(e,t.next.queue,{},pu())}function Os(){return ea(Qf)}function ks(){return jo().memoizedState}function As(){return jo().memoizedState}function js(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ha(n);var r=Ua(t,e,n);r!==null&&(hu(r,t,n),Wa(r,t,n)),t={cache:sa()},e.payload=t;return}t=t.return}}function Ms(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Is(e)?Ls(t,n):(n=ni(e,t,n,r),n!==null&&(hu(n,e,r),Rs(n,t,r)))}function Ns(e,t,n){Ps(e,t,n,pu())}function Ps(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Is(e))Ls(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Sr(s,o))return ti(e,t,i,0),K===null&&ei(),!1}catch{}if(n=ni(e,t,i,r),n!==null)return hu(n,e,r),Rs(n,t,r),!0}return!1}function Fs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Is(e)){if(t)throw Error(i(479))}else t=ni(e,n,r,2),t!==null&&hu(t,e,2)}function Is(e){var t=e.alternate;return e===V||t!==null&&t===V}function Ls(e,t){ho=mo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Rs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,$e(e,n)}}var zs={readContext:ea,use:Po,useCallback:xo,useContext:xo,useEffect:xo,useImperativeHandle:xo,useLayoutEffect:xo,useInsertionEffect:xo,useMemo:xo,useReducer:xo,useRef:xo,useState:xo,useDebugValue:xo,useDeferredValue:xo,useTransition:xo,useSyncExternalStore:xo,useId:xo,useHostTransitionStatus:xo,useFormState:xo,useActionState:xo,useOptimistic:xo,useMemoCache:xo,useCacheRefresh:xo};zs.useEffectEvent=xo;var Bs={readContext:ea,use:Po,useCallback:function(e,t){return Ao().memoizedState=[e,t===void 0?null:t],e},useContext:ea,useEffect:us,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),cs(4194308,4,gs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cs(4194308,4,e,t)},useInsertionEffect:function(e,t){cs(4,2,e,t)},useMemo:function(e,t){var n=Ao();t=t===void 0?null:t;var r=e();if(go){Ie(!0);try{e()}finally{Ie(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Ao();if(n!==void 0){var i=n(t);if(go){Ie(!0);try{n(t)}finally{Ie(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ms.bind(null,V,e),[r.memoizedState,e]},useRef:function(e){var t=Ao();return e={current:e},t.memoizedState=e},useState:function(e){e=Ko(e);var t=e.queue,n=Ns.bind(null,V,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:vs,useDeferredValue:function(e,t){return xs(Ao(),e,t)},useTransition:function(){var e=Ko(!1);return e=Cs.bind(null,V,e.queue,!0,!1),Ao().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=V,a=Ao();if(B){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),K===null)throw Error(i(349));J&127||Vo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,us(Uo.bind(null,r,o,e),[e]),r.flags|=2048,os(9,{destroy:void 0},Ho.bind(null,r,o,n,t),null),n},useId:function(){var e=Ao(),t=K.identifierPrefix;if(B){var n=Di,r=Ei;n=(r&~(1<<32-Le(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=_o++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[ot]=t,o[st]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Pd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Pc(t)}}return U(t),Fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Pc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=se.current,Bi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Ni,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[ot]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Li(t,!0)}else e=Bd(e).createTextNode(r),e[ot]=t,t.stateNode=e}return U(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Bi(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[ot]=t}else Vi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),e=!1}else n=Hi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(co(t),t):(co(t),null);if(t.flags&128)throw Error(i(558))}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Bi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[ot]=t}else Vi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else a=Hi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(co(t),t):(co(t),null)}return co(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Lc(t,t.updateQueue),U(t),null);case 4:return ue(),e===null&&Sd(t.stateNode.containerInfo),U(t),null;case 10:return Ji(t.type),U(t),null;case 19:if(I(lo),r=t.memoizedState,r===null)return U(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)Rc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=uo(e),o!==null){for(t.flags|=128,Rc(r,!1),e=o.updateQueue,t.updateQueue=e,Lc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)di(n,e),n=n.sibling;return L(lo,lo.current&1|2),B&&Oi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Te()>tu&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}else{if(!a)if(e=uo(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Lc(t,e),Rc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!B)return U(t),null}else 2*Te()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(U(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Te(),e.sibling=null,n=lo.current,L(lo,a?n&1|2:n&1),B&&Oi(t,r.treeForkCount),e);case 22:case 23:return co(t),to(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&Lc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&I(_a),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Ji(oa),U(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Bc(e,t){switch(ji(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Ji(oa),ue(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return fe(t),null;case 31:if(t.memoizedState!==null){if(co(t),t.alternate===null)throw Error(i(340));Vi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(co(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Vi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return I(lo),null;case 4:return ue(),null;case 10:return Ji(t.type),null;case 22:case 23:return co(t),to(),e!==null&&I(_a),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Ji(oa),null;case 25:return null;default:return null}}function Vc(e,t){switch(ji(t),t.tag){case 3:Ji(oa),ue();break;case 26:case 27:case 5:fe(t);break;case 4:ue();break;case 31:t.memoizedState!==null&&co(t);break;case 13:co(t);break;case 19:I(lo);break;case 10:Ji(t.type);break;case 22:case 23:co(t),to(),e!==null&&I(_a);break;case 24:Ji(oa)}}function Hc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Uc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Wc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Xa(t,n)}catch(t){Z(e,e.return,t)}}}function Gc(e,t,n){n.props=qs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Kc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function qc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Jc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Yc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[st]=t}catch(t){Z(e,e.return,t)}}function Xc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Zc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Xc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=$t));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[ot]=e,t[st]=n}catch(t){Z(e,e.return,t)}}var tl=!1,nl=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=Dr(e),Or(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(o,r,n),o[ot]=e,yt(o),r=o;break a;case`link`:var s=Vf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Tr(s,h),v=Tr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,N.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(i(331));var c=G;if(G|=4,Fl(o.current),Dl(o,o.current,s,n),G=c,id(0,!1),Fe&&typeof Fe.onPostCommitFiberRoot==`function`)try{Fe.onPostCommitFiberRoot(Pe,o)}catch{}return!0}finally{P.p=a,N.T=r,Vu(e,t)}}function Wu(e,t,n){t=vi(n,t),t=$s(e.stateNode,t,2),e=Ua(e,t,2),e!==null&&(Xe(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=vi(n,e),n=ec(2),r=Ua(t,n,2),r!==null&&(tc(n,r,t,e),Xe(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>Te()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=Je()),e=ri(e,t),e!==null&&(Xe(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return xe(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Le(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=Ge(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||Ke(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=Te(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Rt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),yt(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Rt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Rt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Rt(n.imageSizes)+`"]`)):i+=`[href="`+Rt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),yt(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Rt(r)+`"][href="`+Rt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),yt(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=vt(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);yt(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=vt(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),yt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=vt(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),yt(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=se.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=vt(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=vt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=vt(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+Rt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),yt(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Rt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Rt(n.href)+`"]`);if(r)return t.instance=r,yt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),yt(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,yt(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),yt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,yt(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),yt(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,yt(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),yt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},v=(e=>e?_(e):_),y=c(u(),1),b=e=>e;function x(e,t=b){let n=y.useSyncExternalStore(e.subscribe,y.useCallback(()=>t(e.getState()),[e,t]),y.useCallback(()=>t(e.getInitialState()),[e,t]));return y.useDebugValue(n),n}var S=e=>{let t=v(e),n=e=>x(t,e);return Object.assign(n,t),n},C=(e=>e?S(e):S),w=g(),T=`/api`;async function E(e,t){let n=await fetch(`${T}${e}`,{...t,headers:{"Content-Type":`application/json`,...t?.headers}});if(!n.ok){let e=await n.json().catch(()=>({detail:n.statusText}));throw Error(e.detail??`HTTP ${n.status}`)}if(n.status!==204)return n.json()}var D={getVersion:()=>E(`/version`),getAccounts:()=>E(`/accounts`),getAccount:e=>E(`/accounts/${e}`),createAccount:e=>E(`/accounts`,{method:`POST`,body:JSON.stringify(e)}),updateAccount:(e,t)=>E(`/accounts/${e}`,{method:`PUT`,body:JSON.stringify(t)}),deleteAccount:e=>E(`/accounts/${e}`,{method:`DELETE`}),deleteBulk:e=>E(`/accounts/delete-bulk`,{method:`POST`,body:JSON.stringify({ids:e})}),assignProxies:()=>E(`/accounts/assign-proxies`,{method:`POST`}),reassignProxies:()=>E(`/accounts/reassign-proxies`,{method:`POST`}),clearProxies:()=>E(`/accounts/clear-proxies`,{method:`POST`}),importAccounts:e=>{let t=new FormData;return t.append(`file`,e),fetch(`${T}/accounts/import`,{method:`POST`,body:t}).then(async e=>{if(!e.ok)throw Error((await e.json().catch(()=>({}))).detail??e.statusText);return e.json()})},executeAction:e=>E(`/actions`,{method:`POST`,body:JSON.stringify(e)}),respondToPrompt:(e,t,n)=>E(`/tasks/${e}/respond`,{method:`POST`,body:JSON.stringify({value:t,login:n||``})}),generate2FA:e=>E(`/actions/generate-2fa`,{method:`POST`,body:JSON.stringify({shared_secret:e})}),generate2FAByAccount:e=>E(`/actions/generate-2fa-by-account`,{method:`POST`,body:JSON.stringify({account_id:e})}),getProxies:()=>E(`/proxies`),addProxy:(e,t=`http`)=>E(`/proxies`,{method:`POST`,body:JSON.stringify({address:e,protocol:t})}),deleteProxy:e=>E(`/proxies/${e}`,{method:`DELETE`}),deleteAllProxies:()=>E(`/proxies/all`,{method:`DELETE`}),bulkAddProxies:e=>E(`/proxies/bulk`,{method:`POST`,body:JSON.stringify(e)}),checkProxies:()=>E(`/proxies/check`,{method:`POST`}),getTasks:()=>E(`/tasks`),getTask:e=>E(`/tasks/${e}`),cancelTask:e=>E(`/tasks/${e}`,{method:`DELETE`}),getMafiles:()=>E(`/mafiles`),uploadMafiles:e=>{let t=new FormData;return e.forEach(e=>t.append(`files`,e)),fetch(`${T}/mafiles/upload`,{method:`POST`,body:t}).then(async e=>{if(!e.ok)throw Error((await e.json().catch(()=>({}))).detail??e.statusText);return e.json()})},deleteMafile:e=>E(`/mafiles/${encodeURIComponent(e)}`,{method:`DELETE`}),exportSecrets:()=>E(`/mafiles/export/all`),exportZip:e=>fetch(`${T}/mafiles/export/zip`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)}).then(e=>{if(!e.ok)throw Error(`Export failed: ${e.status}`);return e.blob()}),getValidationSettings:()=>E(`/settings/validation`),updateValidationSettings:e=>E(`/settings/validation`,{method:`PUT`,body:JSON.stringify(e)}),getDisplaySettings:()=>E(`/settings/display`),updateDisplaySettings:e=>E(`/settings/display`,{method:`PUT`,body:JSON.stringify(e)}),getColumnSettings:()=>E(`/settings/columns`),updateColumnSettings:e=>E(`/settings/columns`,{method:`PUT`,body:JSON.stringify(e)}),getLogpassColumnSettings:()=>E(`/settings/logpass-columns`),updateLogpassColumnSettings:e=>E(`/settings/logpass-columns`,{method:`PUT`,body:JSON.stringify(e)}),getLogs:()=>E(`/logs`),startAutoAccept:e=>E(`/auto-accept/start`,{method:`POST`,body:JSON.stringify({account_ids:e})}),stopAutoAccept:e=>E(`/auto-accept/stop`,{method:`POST`,body:JSON.stringify({account_ids:e})}),getAutoAcceptStatus:()=>E(`/auto-accept/status`),openBrowser:e=>E(`/accounts/${e}/browser`,{method:`POST`}),getLogpassAccounts:()=>E(`/logpass`),createLogpassAccount:e=>E(`/logpass`,{method:`POST`,body:JSON.stringify(e)}),updateLogpassAccount:(e,t)=>E(`/logpass/${e}`,{method:`PUT`,body:JSON.stringify(t)}),deleteLogpassAccount:e=>E(`/logpass/${e}`,{method:`DELETE`}),deleteLogpassBulk:e=>E(`/logpass/delete-bulk`,{method:`POST`,body:JSON.stringify({ids:e})}),importLogpass:e=>E(`/logpass/import`,{method:`POST`,body:JSON.stringify({lines:e})}),validateLogpass:e=>E(`/logpass/validate`,{method:`POST`,body:JSON.stringify({account_ids:e})}),fullParseLogpass:e=>E(`/logpass/full-parse`,{method:`POST`,body:JSON.stringify({account_ids:e})}),assignLogpassProxies:()=>E(`/logpass/assign-proxies`,{method:`POST`}),reassignLogpassProxies:()=>E(`/logpass/reassign-proxies`,{method:`POST`}),clearLogpassProxies:()=>E(`/logpass/clear-proxies`,{method:`POST`}),openLogpassBrowser:e=>E(`/logpass/${e}/browser`,{method:`POST`}),getTokenAccounts:()=>E(`/token-accounts`),createTokenAccount:e=>E(`/token-accounts`,{method:`POST`,body:JSON.stringify(e)}),deleteTokenAccount:e=>E(`/token-accounts/${e}`,{method:`DELETE`}),deleteTokenBulk:e=>E(`/token-accounts/delete-bulk`,{method:`POST`,body:JSON.stringify({ids:e})}),importTokens:e=>E(`/token-accounts/import`,{method:`POST`,body:JSON.stringify({lines:e})}),validateTokens:e=>E(`/token-accounts/validate`,{method:`POST`,body:JSON.stringify({account_ids:e})}),openTokenBrowser:e=>E(`/token-accounts/${e}/browser`,{method:`POST`}),assignTokenProxies:()=>E(`/token-accounts/assign-proxies`,{method:`POST`}),reassignTokenProxies:()=>E(`/token-accounts/reassign-proxies`,{method:`POST`}),clearTokenProxies:()=>E(`/token-accounts/clear-proxies`,{method:`POST`}),getTokenColumnSettings:()=>E(`/settings/token-columns`),updateTokenColumnSettings:e=>E(`/settings/token-columns`,{method:`PUT`,body:JSON.stringify(e)})},O=0,ee={browser:!0,profile:!0,steam_id:!0,login:!0,password:!0,login_pass:!0,email:!0,email_pass:!1,email_login_pass:!1,phone:!0,status:!0,ban:!0,twofa:!0,mafile:!0,proxy:!0,notes:!0,actions:!0,last_online:!0},k={browser:!0,profile:!0,steam_id:!0,login:!0,password:!0,login_pass:!0,status:!0,ban:!0,prime:!0,trophy:!0,behavior:!0,license:!0,proxy:!0,notes:!0,actions:!0,last_online:!0},A={browser:!0,profile:!0,last_online:!0,steam_id:!0,login:!0,token:!0,status:!0,proxy:!0,notes:!0,actions:!0},j=C((e,t)=>({activeTab:`accounts`,setTab:t=>e({activeTab:t}),accountSection:`mafile`,setAccountSection:t=>e({accountSection:t}),toasts:[],addToast:(t,n)=>{let r=++O;e(e=>({toasts:[...e.toasts,{id:r,type:t,message:n}]})),setTimeout(()=>{e(e=>({toasts:e.toasts.filter(e=>e.id!==r)}))},4e3)},removeToast:t=>e(e=>({toasts:e.toasts.filter(e=>e.id!==t)})),hidePasswords:!1,setHidePasswords:t=>{e({hidePasswords:t}),D.updateDisplaySettings({hide_passwords:t}).catch(()=>{})},loadDisplaySettings:async()=>{try{e({hidePasswords:(await D.getDisplaySettings()).hide_passwords})}catch{}},columnVisibility:{...ee},setColumnVisibility:t=>e({columnVisibility:t}),toggleColumn:n=>{let r={...t().columnVisibility,[n]:!t().columnVisibility[n]};e({columnVisibility:r}),D.updateColumnSettings(r).catch(()=>{})},loadColumnSettings:async()=>{try{let t=await D.getColumnSettings();e({columnVisibility:{...ee,...t}})}catch{}},logpassColumnVisibility:{...k},toggleLogpassColumn:n=>{let r={...t().logpassColumnVisibility,[n]:!t().logpassColumnVisibility[n]};e({logpassColumnVisibility:r}),D.updateLogpassColumnSettings(r).catch(()=>{})},loadLogpassColumnSettings:async()=>{try{let t=await D.getLogpassColumnSettings();e({logpassColumnVisibility:{...k,...t}})}catch{}},tokenColumnVisibility:{...A},toggleTokenColumn:n=>{let r={...t().tokenColumnVisibility,[n]:!t().tokenColumnVisibility[n]};e({tokenColumnVisibility:r}),D.updateTokenColumnSettings(r).catch(()=>{})},loadTokenColumnSettings:async()=>{try{let t=await D.getTokenColumnSettings();e({tokenColumnVisibility:{...A,...t}})}catch{}}})),M=`steampanel_locale`,te=localStorage.getItem(M)||`ru`,ne=new Set;function N(){ne.forEach(e=>e())}function P(e){te=e,localStorage.setItem(M,e),N()}function re(){return[(0,y.useSyncExternalStore)(e=>(ne.add(e),()=>ne.delete(e)),()=>te),P]}var ie={ru:{"header.accounts":`Аккаунтов`,"tab.accounts":`Аккаунты`,"tab.mafiles":`Mafile Management`,"tab.tools":`Настройки`,"tab.logs":`Логи`,"section.dataType":`Тип данных`,"col.browser":`Войти`,"col.profile":`Профиль`,"col.lastOnline":`Отлега`,"col.steamId":`Steam ID`,"col.login":`Логин`,"col.password":`Пароль`,"col.loginPass":`Login:Pass`,"col.email":`Email`,"col.emailPass":`Email Pass`,"col.emailLoginPass":`Email:Pass`,"col.phone":`Телефон`,"col.status":`Статус`,"col.ban":`Бан`,"col.twofa":`2FA`,"col.mafile":`Mafile`,"col.proxy":`Прокси`,"col.notes":`Заметки`,"col.actions":`Действия`,"col.prime":`Prime`,"col.trophy":`Trophy`,"col.behavior":`Behavior`,"col.license":`Лицензии`,"col.token":`Токен`,"action.selectAction":`— Действие`,"action.validate":`Валидация`,"action.changePassword":`Сменить пароль`,"action.randomPassword":`Случайный пароль`,"action.changeEmail":`Сменить email`,"action.changePhone":`Сменить телефон`,"action.removePhone":`Удалить телефон`,"action.removeGuard":`Удалить Guard`,"action.noRevocationCode":`Нет revocation_code в mafile`,"action.enableAutoAccept":`Вкл. автопринятие`,"action.disableAutoAccept":`Выкл. авто-принятие входа`,"action.enableAutoAcceptLogin":`Вкл. авто-принятие входа`,"prompt.newPassword":`Введите новый пароль`,"prompt.newEmail":`Введите новый email`,"prompt.newPhone":`Введите новый номер телефона`,"prompt.removePhone":`Введите номер телефона (на который переставится старый)`,"prompt.enterValue":`Введите значение...`,"confirm.removeGuard":`Удалить Steam Guard для этого аккаунта?`,"confirm.deleteAccount":`Удалить аккаунт?`,"confirm.deleteSelected":`Удалить {count} выбранных аккаунтов?`,"confirm.deleteAll":`Удалить ВСЕ {count} аккаунтов? Это необратимо!`,"confirm.deleteLogpassSelected":`Удалить {count} аккаунт(ов)?`,"confirm.deleteLogpassAll":`Удалить все {count} аккаунтов?`,"confirm.deleteTokenSelected":`Удалить {count} токен(ов)?`,"confirm.deleteTokenAll":`Удалить все {count} токенов?`,"confirm.deleteToken":`Удалить токен {name}?`,"confirm.deleteLogpass":`Удалить {name}?`,"confirm.assignProxies":`Назначить прокси аккаунтам без прокси?`,"confirm.reassignProxies":`Переназначить прокси на все аккаунты?`,"confirm.reassignProxiesAll":`Переназначить прокси всем аккаунтам?`,"confirm.clearProxies":`Очистить прокси у всех аккаунтов?`,"confirm.executeBulk":`Выполнить «{action}» для {count} аккаунтов?`,"confirm.yes":`Да`,"btn.import":`Импорт`,"btn.add":`Добавить`,"btn.save":`Сохранить`,"btn.cancel":`Отмена`,"btn.execute":`Выполнить`,"btn.deleteSelected":`Удалить выбранные`,"btn.deleteAll":`Удалить все`,"btn.assignProxies":`Назначить прокси`,"btn.reassign":`Переназначить`,"btn.clearProxies":`Очистить прокси`,"btn.validate":`Валидировать`,"btn.fullParse":`Полный парс`,"btn.generate":`Сгенерировать`,"toast.copied":`Скопировано`,"toast.copyFailed":`Не удалось скопировать`,"toast.noteSaved":`Заметка сохранена`,"toast.noteSaveError":`Ошибка сохранения`,"toast.accountDeleted":`Аккаунт удален`,"toast.accountAdded":`Аккаунт добавлен`,"toast.saved":`Сохранено`,"toast.done":`Готово`,"toast.error":`Ошибка`,"toast.selectAction":`Выберите действие`,"toast.selectAccounts":`Выберите аккаунты`,"toast.noAccounts":`Нет аккаунтов`,"toast.autoAcceptEnabled":`Автопринятие включено для {count} акк.`,"toast.autoAcceptOn":`Авто-принятие входа включено`,"toast.autoAcceptOff":`Авто-принятие входа выключено`,"toast.taskCancelled":`Задача отменена`,"toast.browserOpening":`Браузер открывается...`,"toast.cookiesExpiredRevalidating":`Куки устарели. Запущена повторная валидация...`,"toast.cookiesExpired":`Куки устарели. Провалидируйте аккаунт заново.`,"toast.proxyCleared":`Прокси убран у {name}`,"toast.proxiesReassigned":`Переназначено {used} прокси на {count} акк.`,"toast.proxiesAssigned":`Назначено {used} прокси на {count} аккаунтов`,"toast.proxiesAssignedShort":`Назначено {count} аккаунтам`,"toast.proxiesReassignedShort":`Переназначено {count} аккаунтам`,"toast.proxiesClearedCount":`Очищено прокси у {count} аккаунтов`,"toast.proxiesClearedShort":`Очищено у {count} аккаунтов`,"toast.deleted":`Удалено: {count}`,"toast.sentToMafile":`{count} акк. отправлено в Mafile Management`,"toast.settingsSaved":`Настройки сохранены`,"toast.proxyFormatError":`Не удалось распознать прокси. Проверьте формат.`,"toast.proxiesAdded":`Добавлено {count} прокси`,"toast.proxiesDeleted":`Удалено {count} прокси`,"toast.exportDone":`Экспорт завершён`,"toast.uploaded":`Загружено: {count}`,"toast.uploadedWithErrors":`Загружено: {uploaded}, ошибок: {errors}`,"toast.importResult":`Импортировано: {imported}, Пропущено: {skipped}`,"toast.fileEmpty":`Файл пуст`,"task.validate":`Валидация`,"task.changePassword":`Смена пароля`,"task.randomPassword":`Случ. пароль`,"task.changeEmail":`Смена email`,"task.changePhone":`Смена телефона`,"task.removePhone":`Удал. телефона`,"task.removeGuard":`Удал. Guard`,"status.unknown":`Неизвестен`,"status.valid":`Валидный`,"status.invalid":`Невалидный`,"status.locked":`Заблокирован`,"status.limited":`Ограничен`,"status.banned":`БАН`,"status.ok":`ОК`,"tip.openBrowser":`Открыть Steam в браузере`,"tip.copyPassword":`Копировать пароль`,"tip.copyLoginPass":`Копировать login:pass`,"tip.copyEmailPass":`Копировать пароль email`,"tip.copyEmailLoginPass":`Копировать email:pass`,"tip.show":`Показать`,"tip.hide":`Скрыть`,"tip.gen2fa":`Сгенерировать и скопировать 2FA код`,"tip.code":`Код`,"tip.addNote":`Нажмите чтобы добавить заметку`,"tip.edit":`Редактировать`,"tip.delete":`Удалить`,"tip.autoAcceptActive":`Авто-принятие входа`,"tip.validate":`Валидировать`,"tip.columnSettings":`Настройки столбцов`,"tip.deleteProxy":`Удалить прокси`,"tip.clickToCopy":`Клик для копирования`,"tip.proxyError":`Ошибка прокси: {error}`,"ph.search":`Поиск: логин / Steam ID / заметка / lvl>10`,"ph.searchLogpass":`Поиск: логин / Steam ID / заметка / игра / lvl>10`,"ph.login":`Логин`,"ph.password":`Пароль`,"ph.proxy":`Прокси`,"ph.proxyOptional":`Прокси (необязательно)`,"ph.notes":`Заметки`,"ph.notesOptional":`Заметки (необязательно)`,"ph.loginOptional":`Логин (необязательно)`,"empty.accounts":`Нет аккаунтов. Импортируйте файл`,"empty.logpass":`Аккаунтов нет. Импортируйте файл.`,"empty.tokens":`Токенов нет. Импортируйте или добавьте токены.`,"empty.logs":`Нет логов`,"empty.tasks":`Нет задач`,"modal.addAccount":`Добавить аккаунт`,"modal.editAccount":`Редактировать аккаунт`,"modal.importAccounts":`Импорт аккаунтов`,"modal.addToken":`Добавить токен`,"modal.importTokens":`Импорт токенов`,"import.formats":`Форматы`,"import.formatsColon":`Форматы:`,"import.delimiter":`разделитель`,"import.or":`или`,"import.dragTxt":`Перетащите .txt файл или нажмите для выбора`,"import.dragTxtCsv":`Перетащите .txt / .csv файл или нажмите для выбора`,"import.dragMafile":`Перетащите .mafile файлы или нажмите для выбора`,"import.selected":`Выбран: {name}`,"import.uploading":`Загрузка...`,"import.importBtn":`Импортировать`,"import.tokenFormat":`refresh_token (по одному на строку)`,"paging.shown":`Показано {visible} из {total}…`,"proxy.label":`Прокси {num}`,"proxy.title":`Прокси`,"proxy.count":`{count} шт.`,"proxy.protocol":`Протокол:`,"proxy.format":`Формат:`,"proxy.customFormat":`Свой формат...`,"proxy.formatConstructor":`Конструктор формата:`,"proxy.preview":`Предпросмотр:`,"proxy.dragFile":`Перетащите .txt файл с прокси или нажмите для выбора`,"proxy.addBtn":`Добавить`,"proxy.checking":`Проверка...`,"proxy.checkAll":`Проверить все`,"proxy.deleteAllBtn":`Удалить все прокси`,"proxy.confirmDeleteAll":`Удалить все прокси? Это действие нельзя отменить.`,"proxy.checkResult":`Всего: {total} | Живых: {alive} | Мёртвых: {dead}`,"proxy.removeProxy":`Убрать прокси`,"proxy.reassignProxy":`Переназначить прокси`,"proxy.perLine":`Прокси по одному на строку ({format})`,"proxy.deleteProxy":`Удалить прокси`,"tools.2faGenerator":`Генератор 2FA кода`,"tools.validationSettings":`Настройки валидации`,"tools.loadProfile":`Загружать профиль (никнейм, аватар)`,"tools.checkBans":`Проверять баны`,"tools.maxThreads":`Макс. потоков:`,"tools.autoRevalidateBrowser":`Автовалидация при мёртвых куках (браузер)`,"tools.clickCopy":`Клик для копирования`,"tools.genErrorStr":`Ошибка`,"logs.title":`Лог`,"logs.clear":`Очистить`,"logs.activeTasks":`Активные задачи`,"mafile.upload":`Загрузка Mafile`,"mafile.exportSettings":`Настройки экспорта`,"mafile.exportFormat":`Формат:`,"mafile.flatFiles":`Плоские файлы (.mafile)`,"mafile.perAccountFolder":`Папка на аккаунт`,"mafile.singleFile":`Одним файлом`,"mafile.variables":`Переменные:`,"mafile.folderName":`Название папки:`,"mafile.mafileName":`Название .mafile:`,"mafile.txtSettings":`Настройки .txt`,"mafile.addGlobalTxt":`Добавить общий`,"mafile.withAllAccounts":`со всеми аккаунтами`,"mafile.addTxtPerFolder":`Добавить .txt в каждую папку`,"mafile.skipFolders":`Не создавать папку для каждого аккаунта`,"mafile.txtFolderName":`Название .txt в папке:`,"mafile.txtLineFormat":`Формат строки .txt:`,"mafile.mafileFields":`Поля Mafile`,"mafile.sessionFields":`Поля Session`,"mafile.export":`Экспорт`,"mafile.noAccounts":`нет аккаунтов`,"mafile.sentAccounts":`Отправленные аккаунты`,"mafile.clearBtn":`Очистить`,"mafile.insert":`Вставить {value}`,"settings.display":`Отображение`,"settings.hidePasswords":`Скрывать пароли (спойлер)`,"token.disclaimerTitle":`Вкладка в разработке`,"token.disclaimerBody1":`Функциональность вкладки Token не завершена и находится в стадии разработки.`,"token.disclaimerBody2":`⚠ Валидация токенов может привести к их инвалидации (убить токены). Используйте на свой страх и риск.`,"token.disclaimerBody3":`Импорт, редактирование и любые действия с токенами могут работать некорректно.`,"token.acceptRisk":`Я понимаю риски и хочу продолжить`,"twofa.copied":`2FA: {code} (скопировано)`,"twofa.error":`Ошибка 2FA: {error}`,"misc.task":`Задача {id}`,"misc.taskAction":`Задача {id} - {action} ({login})`,"misc.taskCount":`Задача {id} ({count} акк.)`,"misc.error":`Ошибка: {error}`,"misc.proxyErrorCheck":`Ошибка проверки: {error}`,"misc.exportError":`Ошибка экспорта: {error}`,"misc.genError":`Ошибка генерации: {error}`,"misc.errorStr":`Ошибка`,"misc.insert":`Вставить`},en:{"header.accounts":`Accounts`,"tab.accounts":`Accounts`,"tab.mafiles":`Mafile Management`,"tab.tools":`Settings`,"tab.logs":`Logs`,"section.dataType":`Data Type`,"col.browser":`Login`,"col.profile":`Profile`,"col.lastOnline":`Last Online`,"col.steamId":`Steam ID`,"col.login":`Login`,"col.password":`Password`,"col.loginPass":`Login:Pass`,"col.email":`Email`,"col.emailPass":`Email Pass`,"col.emailLoginPass":`Email:Pass`,"col.phone":`Phone`,"col.status":`Status`,"col.ban":`Ban`,"col.twofa":`2FA`,"col.mafile":`Mafile`,"col.proxy":`Proxy`,"col.notes":`Notes`,"col.actions":`Actions`,"col.prime":`Prime`,"col.trophy":`Trophy`,"col.behavior":`Behavior`,"col.license":`Licenses`,"col.token":`Token`,"action.selectAction":`— Action`,"action.validate":`Validate`,"action.changePassword":`Change password`,"action.randomPassword":`Random password`,"action.changeEmail":`Change email`,"action.changePhone":`Change phone`,"action.removePhone":`Remove phone`,"action.removeGuard":`Remove Guard`,"action.noRevocationCode":`No revocation_code in mafile`,"action.enableAutoAccept":`Enable auto-accept`,"action.disableAutoAccept":`Disable login auto-accept`,"action.enableAutoAcceptLogin":`Enable login auto-accept`,"prompt.newPassword":`Enter new password`,"prompt.newEmail":`Enter new email`,"prompt.newPhone":`Enter new phone number`,"prompt.removePhone":`Enter phone number (old number will be transferred to it)`,"prompt.enterValue":`Enter value...`,"confirm.removeGuard":`Remove Steam Guard for this account?`,"confirm.deleteAccount":`Delete account?`,"confirm.deleteSelected":`Delete {count} selected accounts?`,"confirm.deleteAll":`Delete ALL {count} accounts? This is irreversible!`,"confirm.deleteLogpassSelected":`Delete {count} account(s)?`,"confirm.deleteLogpassAll":`Delete all {count} accounts?`,"confirm.deleteTokenSelected":`Delete {count} token(s)?`,"confirm.deleteTokenAll":`Delete all {count} tokens?`,"confirm.deleteToken":`Delete token {name}?`,"confirm.deleteLogpass":`Delete {name}?`,"confirm.assignProxies":`Assign proxies to accounts without proxies?`,"confirm.reassignProxies":`Reassign proxies to all accounts?`,"confirm.reassignProxiesAll":`Reassign proxies to all accounts?`,"confirm.clearProxies":`Clear proxies from all accounts?`,"confirm.executeBulk":`Execute «{action}» for {count} accounts?`,"confirm.yes":`Yes`,"btn.import":`Import`,"btn.add":`Add`,"btn.save":`Save`,"btn.cancel":`Cancel`,"btn.execute":`Execute`,"btn.deleteSelected":`Delete selected`,"btn.deleteAll":`Delete all`,"btn.assignProxies":`Assign proxies`,"btn.reassign":`Reassign`,"btn.clearProxies":`Clear proxies`,"btn.validate":`Validate`,"btn.fullParse":`Full parse`,"btn.generate":`Generate`,"toast.copied":`Copied`,"toast.copyFailed":`Failed to copy`,"toast.noteSaved":`Note saved`,"toast.noteSaveError":`Error saving`,"toast.accountDeleted":`Account deleted`,"toast.accountAdded":`Account added`,"toast.saved":`Saved`,"toast.done":`Done`,"toast.error":`Error`,"toast.selectAction":`Select an action`,"toast.selectAccounts":`Select accounts`,"toast.noAccounts":`No accounts`,"toast.autoAcceptEnabled":`Auto-accept enabled for {count} accounts`,"toast.autoAcceptOn":`Login auto-accept enabled`,"toast.autoAcceptOff":`Login auto-accept disabled`,"toast.taskCancelled":`Task cancelled`,"toast.browserOpening":`Opening browser...`,"toast.cookiesExpiredRevalidating":`Cookies expired. Re-validating...`,"toast.cookiesExpired":`Cookies expired. Re-validate the account.`,"toast.proxyCleared":`Proxy removed from {name}`,"toast.proxiesReassigned":`Reassigned {used} proxies to {count} accounts`,"toast.proxiesAssigned":`Assigned {used} proxies to {count} accounts`,"toast.proxiesAssignedShort":`Assigned to {count} accounts`,"toast.proxiesReassignedShort":`Reassigned to {count} accounts`,"toast.proxiesClearedCount":`Cleared proxies from {count} accounts`,"toast.proxiesClearedShort":`Cleared from {count} accounts`,"toast.deleted":`Deleted: {count}`,"toast.sentToMafile":`{count} accounts sent to Mafile Management`,"toast.settingsSaved":`Settings saved`,"toast.proxyFormatError":`Failed to parse proxies. Check the format.`,"toast.proxiesAdded":`Added {count} proxies`,"toast.proxiesDeleted":`Deleted {count} proxies`,"toast.exportDone":`Export complete`,"toast.uploaded":`Uploaded: {count}`,"toast.uploadedWithErrors":`Uploaded: {uploaded}, errors: {errors}`,"toast.importResult":`Imported: {imported}, Skipped: {skipped}`,"toast.fileEmpty":`File is empty`,"task.validate":`Validation`,"task.changePassword":`Password change`,"task.randomPassword":`Random password`,"task.changeEmail":`Email change`,"task.changePhone":`Phone change`,"task.removePhone":`Phone removal`,"task.removeGuard":`Guard removal`,"status.unknown":`Unknown`,"status.valid":`Valid`,"status.invalid":`Invalid`,"status.locked":`Locked`,"status.limited":`Limited`,"status.banned":`BANNED`,"status.ok":`OK`,"tip.openBrowser":`Open Steam in browser`,"tip.copyPassword":`Copy password`,"tip.copyLoginPass":`Copy login:pass`,"tip.copyEmailPass":`Copy email password`,"tip.copyEmailLoginPass":`Copy email:pass`,"tip.show":`Show`,"tip.hide":`Hide`,"tip.gen2fa":`Generate and copy 2FA code`,"tip.code":`Code`,"tip.addNote":`Click to add a note`,"tip.edit":`Edit`,"tip.delete":`Delete`,"tip.autoAcceptActive":`Login auto-accept`,"tip.validate":`Validate`,"tip.columnSettings":`Column settings`,"tip.deleteProxy":`Delete proxy`,"tip.clickToCopy":`Click to copy`,"tip.proxyError":`Proxy error: {error}`,"ph.search":`Search: login / Steam ID / notes / lvl>10`,"ph.searchLogpass":`Search: login / Steam ID / notes / game / lvl>10`,"ph.login":`Login`,"ph.password":`Password`,"ph.proxy":`Proxy`,"ph.proxyOptional":`Proxy (optional)`,"ph.notes":`Notes`,"ph.notesOptional":`Notes (optional)`,"ph.loginOptional":`Login (optional)`,"empty.accounts":`No accounts. Import a file`,"empty.logpass":`No accounts. Import a file.`,"empty.tokens":`No tokens. Import or add tokens.`,"empty.logs":`No logs`,"empty.tasks":`No tasks`,"modal.addAccount":`Add account`,"modal.editAccount":`Edit account`,"modal.importAccounts":`Import accounts`,"modal.addToken":`Add token`,"modal.importTokens":`Import tokens`,"import.formats":`Formats`,"import.formatsColon":`Formats:`,"import.delimiter":`delimiter`,"import.or":`or`,"import.dragTxt":`Drag a .txt file or click to select`,"import.dragTxtCsv":`Drag a .txt / .csv file or click to select`,"import.dragMafile":`Drag .mafile files or click to select`,"import.selected":`Selected: {name}`,"import.uploading":`Uploading...`,"import.importBtn":`Import`,"import.tokenFormat":`refresh_token (one per line)`,"paging.shown":`Showing {visible} of {total}…`,"proxy.label":`Proxy {num}`,"proxy.title":`Proxies`,"proxy.count":`{count} total`,"proxy.protocol":`Protocol:`,"proxy.format":`Format:`,"proxy.customFormat":`Custom format...`,"proxy.formatConstructor":`Format constructor:`,"proxy.preview":`Preview:`,"proxy.dragFile":`Drag a .txt file with proxies or click to select`,"proxy.addBtn":`Add`,"proxy.checking":`Checking...`,"proxy.checkAll":`Check all`,"proxy.deleteAllBtn":`Delete all proxies`,"proxy.confirmDeleteAll":`Delete all proxies? This cannot be undone.`,"proxy.checkResult":`Total: {total} | Alive: {alive} | Dead: {dead}`,"proxy.removeProxy":`Remove proxy`,"proxy.reassignProxy":`Reassign proxy`,"proxy.perLine":`Proxies one per line ({format})`,"proxy.deleteProxy":`Delete proxy`,"tools.2faGenerator":`2FA Code Generator`,"tools.validationSettings":`Validation Settings`,"tools.loadProfile":`Load profile (nickname, avatar)`,"tools.checkBans":`Check bans`,"tools.maxThreads":`Max threads:`,"tools.autoRevalidateBrowser":`Auto-revalidate on dead cookies (browser)`,"tools.clickCopy":`Click to copy`,"tools.genErrorStr":`Error`,"logs.title":`Log`,"logs.clear":`Clear`,"logs.activeTasks":`Active Tasks`,"mafile.upload":`Upload Mafile`,"mafile.exportSettings":`Export Settings`,"mafile.exportFormat":`Format:`,"mafile.flatFiles":`Flat files (.mafile)`,"mafile.perAccountFolder":`Folder per account`,"mafile.singleFile":`Single file`,"mafile.variables":`Variables:`,"mafile.folderName":`Folder name:`,"mafile.mafileName":`.mafile name:`,"mafile.txtSettings":`.txt Settings`,"mafile.addGlobalTxt":`Add global`,"mafile.withAllAccounts":`with all accounts`,"mafile.addTxtPerFolder":`Add .txt to each folder`,"mafile.skipFolders":`Don't create folder for each account`,"mafile.txtFolderName":`.txt name in folder:`,"mafile.txtLineFormat":`.txt line format:`,"mafile.mafileFields":`Mafile Fields`,"mafile.sessionFields":`Session Fields`,"mafile.export":`Export`,"mafile.noAccounts":`no accounts`,"mafile.sentAccounts":`Sent Accounts`,"mafile.clearBtn":`Clear`,"mafile.insert":`Insert {value}`,"settings.display":`Display`,"settings.hidePasswords":`Hide passwords (spoiler)`,"token.disclaimerTitle":`Tab under development`,"token.disclaimerBody1":`Token tab functionality is not complete and is under development.`,"token.disclaimerBody2":`⚠ Token validation may invalidate (kill) tokens. Use at your own risk.`,"token.disclaimerBody3":`Import, editing and any actions with tokens may work incorrectly.`,"token.acceptRisk":`I understand the risks and want to continue`,"twofa.copied":`2FA: {code} (copied)`,"twofa.error":`2FA Error: {error}`,"misc.task":`Task {id}`,"misc.taskAction":`Task {id} - {action} ({login})`,"misc.taskCount":`Task {id} ({count} accounts)`,"misc.error":`Error: {error}`,"misc.proxyErrorCheck":`Check error: {error}`,"misc.exportError":`Export error: {error}`,"misc.genError":`Generation error: {error}`,"misc.errorStr":`Error`,"misc.insert":`Insert`}};function ae(e,t){let n=(ie[te]||ie.ru)[e]??ie.ru[e]??e;if(t)for(let[e,r]of Object.entries(t))n=n.replace(`{${e}}`,String(r));return n}function F(){return(0,y.useSyncExternalStore)(e=>(ne.add(e),()=>ne.delete(e)),()=>te),ae}var I=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),L=o(((e,t)=>{t.exports=I()}))();function oe(){let[e,t]=re(),[n,r]=(0,y.useState)(``);return(0,y.useEffect)(()=>{D.getVersion().then(e=>r(e.version)).catch(()=>{})},[]),(0,L.jsxs)(`header`,{className:`bg-dark-800 border-b border-dark-600 px-4 py-3 flex items-center justify-between`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5 cursor-pointer`,onClick:()=>window.location.reload(),children:[(0,L.jsx)(`svg`,{viewBox:`0 0 24 24`,xmlns:`http://www.w3.org/2000/svg`,className:`w-7 h-7 shrink-0 fill-white`,children:(0,L.jsx)(`path`,{d:`M11.979 0C5.678 0 0.511 4.86 0.022 11.037l6.432 2.658c0.545 -0.371 1.203 -0.59 1.912 -0.59 0.063 0 0.125 0.004 0.188 0.006l2.861 -4.142V8.91c0 -2.495 2.028 -4.524 4.524 -4.524 2.494 0 4.524 2.031 4.524 4.527s-2.03 4.525 -4.524 4.525h-0.105l-4.076 2.911c0 0.052 0.004 0.105 0.004 0.159 0 1.875 -1.515 3.396 -3.39 3.396 -1.635 0 -3.016 -1.173 -3.331 -2.727L0.436 15.27C1.862 20.307 6.486 24 11.979 24c6.627 0 11.999 -5.373 11.999 -12S18.605 0 11.979 0zM7.54 18.21l-1.473 -0.61c0.262 0.543 0.714 0.999 1.314 1.25 1.297 0.539 2.793 -0.076 3.332 -1.375 0.263 -0.63 0.264 -1.319 0.005 -1.949s-0.75 -1.121 -1.377 -1.383c-0.624 -0.26 -1.29 -0.249 -1.878 -0.03l1.523 0.63c0.956 0.4 1.409 1.5 1.009 2.455 -0.397 0.957 -1.497 1.41 -2.454 1.012H7.54zm11.415 -9.303c0 -1.662 -1.353 -3.015 -3.015 -3.015 -1.665 0 -3.015 1.353 -3.015 3.015 0 1.665 1.35 3.015 3.015 3.015 1.663 0 3.015 -1.35 3.015 -3.015zm-5.273 -0.005c0 -1.252 1.013 -2.266 2.265 -2.266 1.249 0 2.266 1.014 2.266 2.266 0 1.251 -1.017 2.265 -2.266 2.265 -1.253 0 -2.265 -1.014 -2.265 -2.265z`})}),(0,L.jsx)(`h1`,{className:`text-lg font-bold text-white tracking-wide`,children:`SteamPanel`})]}),(0,L.jsx)(`span`,{className:`text-xs text-gray-500`,children:n&&`v${n}`}),(0,L.jsxs)(`span`,{className:`text-xs text-gray-500`,children:[`by`,` `,(0,L.jsx)(`a`,{href:`https://t.me/lolzdm`,target:`_blank`,rel:`noopener noreferrer`,className:`hover:text-accent transition`,children:`@lolzdm`})]})]}),(0,L.jsx)(`div`,{className:`flex items-center gap-4`,children:(0,L.jsxs)(`button`,{onClick:()=>t(e===`ru`?`en`:`ru`),className:`flex items-center gap-1.5 text-xs text-gray-400 hover:text-gray-200 transition px-2 py-1 border border-dark-500 hover:border-gray-500 rounded`,children:[(0,L.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`13`,height:`13`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,className:`opacity-80`,children:[(0,L.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,L.jsx)(`path`,{d:`M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z`})]}),e===`ru`?`EN`:`RU`]})})]})}var R=(e=16)=>({width:e,height:e,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`}),se=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}),(0,L.jsx)(`polyline`,{points:`7 10 12 15 17 10`}),(0,L.jsx)(`line`,{x1:`12`,y1:`15`,x2:`12`,y2:`3`})]}),ce=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}),(0,L.jsx)(`polyline`,{points:`17 8 12 3 7 8`}),(0,L.jsx)(`line`,{x1:`12`,y1:`3`,x2:`12`,y2:`15`})]}),le=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`line`,{x1:`12`,y1:`5`,x2:`12`,y2:`19`}),(0,L.jsx)(`line`,{x1:`5`,y1:`12`,x2:`19`,y2:`12`})]}),ue=({size:e=16,...t})=>(0,L.jsx)(`svg`,{...R(e),...t,children:(0,L.jsx)(`polyline`,{points:`20 6 9 17 4 12`})}),de=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`path`,{d:`M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z`}),(0,L.jsx)(`line`,{x1:`12`,y1:`9`,x2:`12`,y2:`13`}),(0,L.jsx)(`line`,{x1:`12`,y1:`17`,x2:`12.01`,y2:`17`})]}),fe=({size:e=16,...t})=>(0,L.jsx)(`svg`,{...R(e),...t,children:(0,L.jsx)(`path`,{d:`m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2`})}),pe=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,L.jsx)(`line`,{x1:`2`,y1:`12`,x2:`22`,y2:`12`}),(0,L.jsx)(`path`,{d:`M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z`})]}),me=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`polyline`,{points:`23 4 23 10 17 10`}),(0,L.jsx)(`path`,{d:`M20.49 15a9 9 0 1 1-2.12-9.36L23 10`})]}),he=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,L.jsx)(`line`,{x1:`4.93`,y1:`4.93`,x2:`19.07`,y2:`19.07`})]}),ge=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`path`,{d:`M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z`}),(0,L.jsx)(`circle`,{cx:`12`,cy:`12`,r:`3`})]}),_e=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`path`,{d:`M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94`}),(0,L.jsx)(`path`,{d:`M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19`}),(0,L.jsx)(`line`,{x1:`1`,y1:`1`,x2:`23`,y2:`23`}),(0,L.jsx)(`path`,{d:`M14.12 14.12a3 3 0 1 1-4.24-4.24`})]}),ve=({size:e=16,...t})=>(0,L.jsx)(`svg`,{...R(e),...t,children:(0,L.jsx)(`path`,{d:`M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.78 7.78 5.5 5.5 0 0 1 7.78-7.78zm0 0L15.5 7.5m0 0 3 3L22 7l-3-3m-3.5 3.5L19 4`})}),ye=({size:e=16,...t})=>(0,L.jsx)(`svg`,{...R(e),...t,children:(0,L.jsx)(`polygon`,{points:`13 2 3 14 12 14 11 22 21 10 12 10 13 2`})}),be=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`circle`,{cx:`12`,cy:`12`,r:`3`}),(0,L.jsx)(`path`,{d:`M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z`})]}),xe=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`path`,{d:`M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7`}),(0,L.jsx)(`path`,{d:`M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z`})]}),Se=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`polyline`,{points:`3 6 5 6 21 6`}),(0,L.jsx)(`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`})]}),Ce=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`rect`,{x:`3`,y:`11`,width:`18`,height:`11`,rx:`2`,ry:`2`}),(0,L.jsx)(`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`})]}),we=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`line`,{x1:`16.5`,y1:`9.4`,x2:`7.5`,y2:`4.21`}),(0,L.jsx)(`path`,{d:`M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z`}),(0,L.jsx)(`polyline`,{points:`3.27 6.96 12 12.01 20.73 6.96`}),(0,L.jsx)(`line`,{x1:`12`,y1:`22.08`,x2:`12`,y2:`12`})]}),Te=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`path`,{d:`M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z`}),(0,L.jsx)(`polyline`,{points:`14 2 14 8 20 8`}),(0,L.jsx)(`line`,{x1:`16`,y1:`13`,x2:`8`,y2:`13`}),(0,L.jsx)(`line`,{x1:`16`,y1:`17`,x2:`8`,y2:`17`}),(0,L.jsx)(`polyline`,{points:`10 9 9 9 8 9`})]}),Ee=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`path`,{d:`M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2`}),(0,L.jsx)(`rect`,{x:`8`,y:`2`,width:`8`,height:`4`,rx:`1`,ry:`1`})]}),De=({size:e=16,...t})=>(0,L.jsx)(`svg`,{...R(e),...t,children:(0,L.jsx)(`polygon`,{points:`5 3 19 12 5 21 5 3`})}),Oe=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`circle`,{cx:`12`,cy:`12`,r:`10`}),(0,L.jsx)(`line`,{x1:`15`,y1:`9`,x2:`9`,y2:`15`}),(0,L.jsx)(`line`,{x1:`9`,y1:`9`,x2:`15`,y2:`15`})]}),ke=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`path`,{d:`M22 11.08V12a10 10 0 1 1-5.93-9.14`}),(0,L.jsx)(`polyline`,{points:`22 4 12 14.01 9 11.01`})]}),Ae=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`}),(0,L.jsx)(`circle`,{cx:`9`,cy:`7`,r:`4`}),(0,L.jsx)(`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`}),(0,L.jsx)(`path`,{d:`M16 3.13a4 4 0 0 1 0 7.75`})]}),je=({size:e=16,...t})=>(0,L.jsx)(`svg`,{...R(e),...t,children:(0,L.jsx)(`path`,{d:`m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2`})}),Me=({size:e=16,...t})=>(0,L.jsx)(`svg`,{...R(e),...t,children:(0,L.jsx)(`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z`})}),Ne=({size:e=16,...t})=>(0,L.jsxs)(`svg`,{...R(e),...t,children:[(0,L.jsx)(`path`,{d:`M15 12h-5`}),(0,L.jsx)(`path`,{d:`M15 8h-5`}),(0,L.jsx)(`path`,{d:`M19 17V5a2 2 0 0 0-2-2H4`}),(0,L.jsx)(`path`,{d:`M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2`})]}),Pe=({size:e=16,...t})=>(0,L.jsx)(`svg`,{...R(e),...t,children:(0,L.jsx)(`polyline`,{points:`9 18 15 12 9 6`})}),Fe=[{id:`accounts`,labelKey:`tab.accounts`,icon:Ae},{id:`mafiles`,labelKey:`tab.mafiles`,icon:je},{id:`tools`,labelKey:`tab.tools`,icon:Me},{id:`logs`,labelKey:`tab.logs`,icon:Ne}];function Ie(){let e=j(e=>e.activeTab),t=j(e=>e.setTab),n=F();return(0,L.jsx)(`nav`,{className:`bg-dark-800 border-b border-dark-600 flex gap-1 px-4 overflow-x-auto`,children:Fe.map(({id:r,labelKey:i,icon:a})=>(0,L.jsxs)(`button`,{onClick:()=>t(r),className:`flex items-center gap-1.5 px-4 py-2.5 text-sm font-medium transition-colors border-b-2 -mb-px ${e===r?`border-accent text-accent`:`border-transparent text-gray-400 hover:text-gray-200`}`,children:[(0,L.jsx)(a,{size:14}),n(i)]},r))})}function Le(){let e=j(e=>e.toasts),t=j(e=>e.removeToast);return e.length===0?null:(0,L.jsx)(`div`,{className:`toast-container`,children:e.map(e=>(0,L.jsx)(`div`,{className:`toast toast-${e.type}`,onClick:()=>t(e.id),children:e.message},e.id))})}var Re=C(e=>({accounts:[],selectedIds:new Set,loading:!1,loadAccounts:async()=>{e({loading:!0});try{e({accounts:await D.getAccounts()})}finally{e({loading:!1})}},toggleSelect:t=>e(e=>{let n=new Set(e.selectedIds);return n.has(t)?n.delete(t):n.add(t),{selectedIds:n}}),selectAll:()=>e(e=>({selectedIds:new Set(e.accounts.map(e=>e.id))})),clearSelection:()=>e({selectedIds:new Set}),setSelectedIds:t=>e({selectedIds:t}),mafileManagerIds:new Set,sendToMafileManager:t=>e(e=>{let n=new Set(e.mafileManagerIds);return t.forEach(e=>n.add(e)),{mafileManagerIds:n}}),clearMafileManager:()=>e({mafileManagerIds:new Set})})),ze=C(e=>({tasks:[],hasRunning:!1,loadTasks:async()=>{let t=await D.getTasks();e({tasks:t,hasRunning:t.some(e=>e.status===`running`||e.status===`pending`)})}})),Be=C(e=>({accounts:[],selectedIds:new Set,loading:!1,loadAccounts:async()=>{e({loading:!0});try{e({accounts:await D.getLogpassAccounts()})}finally{e({loading:!1})}},toggleSelect:t=>e(e=>{let n=new Set(e.selectedIds);return n.has(t)?n.delete(t):n.add(t),{selectedIds:n}}),selectAll:()=>e(e=>({selectedIds:new Set(e.accounts.map(e=>e.id))})),clearSelection:()=>e({selectedIds:new Set})})),Ve=C(e=>({accounts:[],selectedIds:new Set,loading:!1,loadAccounts:async()=>{e({loading:!0});try{e({accounts:await D.getTokenAccounts()})}finally{e({loading:!1})}},toggleSelect:t=>e(e=>{let n=new Set(e.selectedIds);return n.has(t)?n.delete(t):n.add(t),{selectedIds:n}}),selectAll:()=>e(e=>({selectedIds:new Set(e.accounts.map(e=>e.id))})),clearSelection:()=>e({selectedIds:new Set})}));async function He(e){try{return await navigator.clipboard.writeText(e),!0}catch{return!1}}var Ue={unknown:[`badge-unknown`,`status.unknown`],valid:[`badge-ok`,`status.valid`],invalid:[`badge-error`,`status.invalid`],locked:[`badge-error`,`status.locked`],limited:[`badge-running`,`status.limited`]};function We({status:e}){let t=Ue[e],[n,r]=t?[t[0],ae(t[1])]:[`badge-unknown`,e];return(0,L.jsx)(`span`,{className:`badge ${n}`,children:r})}function Ge({status:e}){return e===`BANNED`?(0,L.jsx)(`span`,{className:`badge badge-error`,children:ae(`status.banned`)}):e===`NO BAN`?(0,L.jsx)(`span`,{className:`badge badge-ok`,children:ae(`status.ok`)}):(0,L.jsx)(`span`,{className:`badge badge-unknown`,children:`—`})}function Ke({hasMafile:e}){return e?(0,L.jsx)(`span`,{className:`badge badge-ok`,children:`✓`}):(0,L.jsx)(`span`,{className:`badge badge-unknown`,children:`—`})}var qe=m(),Je=[{action:`validate`,labelKey:`action.validate`},{action:`change_password`,labelKey:`action.changePassword`},{action:`random_password`,labelKey:`action.randomPassword`},{action:`change_email`,labelKey:`action.changeEmail`},{action:`change_phone`,labelKey:`action.changePhone`},{action:`remove_guard`,labelKey:`action.removeGuard`}],Ye={change_password:`prompt.newPassword`,change_email:`prompt.newEmail`,change_phone:`prompt.newPhone`},Xe={change_password:`new_password`,change_email:`new_email`,change_phone:`new_phone`},Ze={remove_guard:`confirm.removeGuard`};function Qe({account:e,onAction:t,onToggleAutoAccept:n}){let[r,i]=(0,y.useState)(!1),[a,o]=(0,y.useState)(null),[s,c]=(0,y.useState)(``),[l,u]=(0,y.useState)(null),[d,f]=(0,y.useState)(null),p=(0,y.useRef)(null),m=(0,y.useRef)(null),h=j(e=>e.addToast),g=Re(e=>e.loadAccounts),_=F(),v=(0,y.useCallback)(()=>{if(!m.current)return;let e=m.current.getBoundingClientRect();f({top:window.innerHeight-e.bottom<320?Math.max(4,e.top-320):e.bottom+4,left:Math.max(4,e.right-180)})},[]);(0,y.useEffect)(()=>{if(!r)return;v();function e(e){p.current&&!p.current.contains(e.target)&&m.current&&!m.current.contains(e.target)&&i(!1)}function t(){i(!1)}return document.addEventListener(`mousedown`,e),window.addEventListener(`scroll`,t,!0),()=>{document.removeEventListener(`mousedown`,e),window.removeEventListener(`scroll`,t,!0)}},[r,v]);let b=(n,r)=>{i(!1);let a=Ze[n];if(a){u({action:n,title:_(a)});return}let s=Ye[n];s?(o({action:n,title:_(s)}),c(``)):t(e.id,n,{})},x=()=>{if(!a||!s)return;let n=Xe[a.action]||`value`;t(e.id,a.action,{[n]:s}),o(null)},S=e.auto_accept?_(`action.disableAutoAccept`):_(`action.enableAutoAcceptLogin`);return(0,L.jsxs)(L.Fragment,{children:[(0,L.jsxs)(`div`,{className:`relative inline-block`,children:[(0,L.jsx)(`button`,{ref:m,onClick:()=>i(!r),className:`btn-secondary px-2 py-1 text-xs`,children:(0,L.jsx)(ye,{size:12})}),r&&d&&(0,qe.createPortal)((0,L.jsxs)(`div`,{ref:p,className:`action-menu-dropdown`,style:{position:`fixed`,top:d.top,left:d.left},children:[Je.map(({action:t,labelKey:n})=>t===`remove_guard`&&!e.has_revocation_code?(0,L.jsx)(`span`,{"data-tooltip":_(`action.noRevocationCode`),className:`block`,children:(0,L.jsx)(`button`,{className:`action-menu-item opacity-40 cursor-not-allowed`,disabled:!0,children:_(n)})},t):(0,L.jsx)(`button`,{onClick:()=>b(t,_(n)),className:`action-menu-item`,children:_(n)},t)),(0,L.jsx)(`hr`,{className:`border-dark-600 my-1`}),(0,L.jsx)(`button`,{onClick:async()=>{i(!1);try{await D.updateAccount(e.id,{proxy:``}),h(`success`,_(`toast.proxyCleared`,{name:e.login})),await g()}catch(e){h(`error`,_(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}},className:`action-menu-item`,children:_(`proxy.removeProxy`)}),(0,L.jsx)(`button`,{onClick:async()=>{i(!1);try{let e=await D.reassignProxies();h(`success`,_(`toast.proxiesReassigned`,{used:e.proxies_used,count:e.assigned})),await g()}catch(e){h(`error`,_(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}},className:`action-menu-item`,children:_(`proxy.reassignProxy`)}),(0,L.jsx)(`hr`,{className:`border-dark-600 my-1`}),(0,L.jsx)(`button`,{onClick:()=>{i(!1),n(e.id)},className:`action-menu-item`,children:S})]}),document.body)]}),a&&(0,L.jsx)(`div`,{className:`confirm-overlay`,onMouseDown:()=>o(null),children:(0,L.jsxs)(`div`,{className:`confirm-box`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`p`,{className:`text-sm text-gray-300 mb-3`,children:a.title}),(0,L.jsx)(`input`,{autoFocus:!0,value:s,onChange:e=>c(e.target.value),onKeyDown:e=>e.key===`Enter`&&x(),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm mb-3`,placeholder:a.action.includes(`phone`)?`+7 9123456789`:void 0}),(0,L.jsxs)(`div`,{className:`flex gap-2`,children:[(0,L.jsx)(`button`,{onClick:x,className:`btn-primary flex-1`,children:`OK`}),(0,L.jsx)(`button`,{onClick:()=>o(null),className:`btn-secondary flex-1`,children:_(`btn.cancel`)})]})]})}),l&&(0,L.jsx)(`div`,{className:`confirm-overlay`,onMouseDown:()=>u(null),children:(0,L.jsxs)(`div`,{className:`confirm-box`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`p`,{className:`text-sm text-gray-300 mb-3`,children:l.title}),(0,L.jsxs)(`div`,{className:`flex gap-2`,children:[(0,L.jsx)(`button`,{autoFocus:!0,onClick:()=>{t(e.id,l.action,{}),u(null)},className:`btn-primary flex-1`,children:_(`confirm.yes`)}),(0,L.jsx)(`button`,{onClick:()=>u(null),className:`btn-secondary flex-1`,children:_(`btn.cancel`)})]})]})})]})}function $e({level:e}){return e>=100?(0,L.jsx)(`div`,{className:`steam-lvl l100p img-${Math.floor(e/100)*100}`,title:`Level ${e}`,children:(0,L.jsx)(`span`,{children:e})}):(0,L.jsx)(`div`,{className:`steam-lvl l${Math.floor(e/10)*10}`,title:`Level ${e}`,children:(0,L.jsx)(`span`,{children:e})})}function et({account:e,visibleColumns:t,proxyLabel:n,isProcessing:r,accountResult:i,accountStep:a,onEdit:o,onDelete:s,onAction:c,onToggleAutoAccept:l,onOpenBrowser:u}){let d=Re(e=>e.selectedIds),f=Re(e=>e.toggleSelect),p=j(e=>e.addToast),m=j(e=>e.hidePasswords),[h,g]=(0,y.useState)(!1),[_,v]=(0,y.useState)(!1),[b,x]=(0,y.useState)(e.notes||``),S=F(),C=async e=>{let t=await He(e);p(t?`success`:`error`,S(t?`toast.copied`:`toast.copyFailed`))},w=m&&!h,T=`••••••••`;return(0,L.jsxs)(`tr`,{className:`hover:bg-dark-700/50 transition`,children:[(0,L.jsx)(`td`,{className:`px-3 py-2`,children:(0,L.jsx)(`input`,{type:`checkbox`,checked:d.has(e.id),onChange:()=>f(e.id)})}),(0,L.jsx)(`td`,{className:`px-1 py-2 w-5`,children:r?(0,L.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,L.jsx)(`div`,{className:`w-4 h-4 border-2 border-accent border-t-transparent rounded-full animate-spin shrink-0`}),a&&(0,L.jsxs)(`span`,{className:`text-[10px] text-gray-500 whitespace-nowrap`,children:[`[`,a.step,`/`,a.total,`]`]})]}):i?.status===`ok`?(0,L.jsx)(ue,{size:16,className:`text-gray-400`}):i?.status===`error`?(0,L.jsx)(`span`,{title:i.error?.toLowerCase().includes(`proxy`)||i.error?.toLowerCase().includes(`network`)||i.error?.includes(`WinError`)?S(`tip.proxyError`,{error:i.error}):i.error,children:(0,L.jsx)(de,{size:16,className:`text-red-400`})}):null}),t.browser&&(0,L.jsx)(`td`,{className:`px-3 py-2 whitespace-nowrap text-center`,children:e.has_cookies?(0,L.jsx)(`button`,{onClick:()=>u(e.id),className:`px-2 py-0.5 text-xs font-medium rounded bg-blue-600/20 text-blue-400 border border-blue-500/30 hover:bg-blue-600/40 hover:text-blue-300 active:scale-95 transition`,title:S(`tip.openBrowser`),children:S(`col.browser`)}):(0,L.jsx)(`span`,{className:`text-gray-600 text-xs`,children:`—`})}),t.profile&&(0,L.jsx)(`td`,{className:`px-3 py-2 whitespace-nowrap`,children:(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[e.avatar_url&&(0,L.jsx)(`img`,{src:e.avatar_url,className:`avatar-sm`,alt:``}),(0,L.jsx)(`span`,{className:`text-xs`,children:e.nickname||`—`}),e.steam_level!=null&&(0,L.jsx)($e,{level:e.steam_level})]})}),t.last_online&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs text-gray-400 whitespace-nowrap`,children:e.last_online||`—`}),t.steam_id&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs`,children:e.steam_id?(0,L.jsx)(`a`,{href:`https://steamcommunity.com/profiles/${encodeURIComponent(e.steam_id)}/`,target:`_blank`,rel:`noopener noreferrer`,className:`text-blue-400 hover:text-blue-300 hover:underline`,children:e.steam_id}):`—`}),t.login&&(0,L.jsx)(`td`,{className:`px-3 py-2 font-medium`,children:e.login}),t.password&&(0,L.jsxs)(`td`,{className:`px-3 py-2 text-gray-400 select-none whitespace-nowrap`,children:[(0,L.jsx)(`span`,{className:`cell-copy cursor-pointer`,onClick:()=>C(e.password),title:S(`tip.copyPassword`),children:w?T:e.password}),(0,L.jsx)(`button`,{onClick:e=>{e.stopPropagation(),g(!h)},className:`ml-1.5 text-gray-500 hover:text-gray-300 inline-flex align-middle`,title:S(w?`tip.show`:`tip.hide`),children:w?(0,L.jsx)(ge,{size:14}):(0,L.jsx)(_e,{size:14})})]}),t.login_pass&&(0,L.jsxs)(`td`,{className:`px-3 py-2 text-gray-400 text-xs select-none whitespace-nowrap`,children:[(0,L.jsx)(`span`,{className:`cell-copy cursor-pointer`,onClick:()=>C(`${e.login}:${e.password}`),title:S(`tip.copyLoginPass`),children:w?`${e.login}:${T}`:`${e.login}:${e.password}`}),(0,L.jsx)(`button`,{onClick:e=>{e.stopPropagation(),g(!h)},className:`ml-1.5 text-gray-500 hover:text-gray-300 inline-flex align-middle`,title:S(w?`tip.show`:`tip.hide`),children:w?(0,L.jsx)(ge,{size:14}):(0,L.jsx)(_e,{size:14})})]}),t.email&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-gray-400 text-xs`,children:e.email||`—`}),t.email_pass&&(0,L.jsxs)(`td`,{className:`px-3 py-2 text-gray-400 text-xs select-none whitespace-nowrap`,children:[(0,L.jsx)(`span`,{className:`cell-copy cursor-pointer`,onClick:()=>{e.email_password&&C(e.email_password)},title:e.email_password?S(`tip.copyEmailPass`):``,children:e.email_password?w?T:e.email_password:`—`}),e.email_password&&(0,L.jsx)(`button`,{onClick:e=>{e.stopPropagation(),g(!h)},className:`ml-1.5 text-gray-500 hover:text-gray-300 inline-flex align-middle`,title:S(w?`tip.show`:`tip.hide`),children:w?(0,L.jsx)(ge,{size:14}):(0,L.jsx)(_e,{size:14})})]}),t.email_login_pass&&(0,L.jsxs)(`td`,{className:`px-3 py-2 text-gray-400 text-xs select-none whitespace-nowrap`,children:[(0,L.jsx)(`span`,{className:`cell-copy cursor-pointer`,onClick:()=>{e.email&&e.email_password&&C(`${e.email}:${e.email_password}`)},title:e.email&&e.email_password?S(`tip.copyEmailLoginPass`):``,children:e.email&&e.email_password?w?`${e.email}:${T}`:`${e.email}:${e.email_password}`:`—`}),e.email&&e.email_password&&(0,L.jsx)(`button`,{onClick:e=>{e.stopPropagation(),g(!h)},className:`ml-1.5 text-gray-500 hover:text-gray-300 inline-flex align-middle`,title:S(w?`tip.show`:`tip.hide`),children:w?(0,L.jsx)(ge,{size:14}):(0,L.jsx)(_e,{size:14})})]}),t.phone&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-gray-400 text-xs`,children:e.phone||`—`}),t.status&&(0,L.jsx)(`td`,{className:`px-3 py-2`,children:(0,L.jsx)(We,{status:e.status})}),t.ban&&(0,L.jsx)(`td`,{className:`px-3 py-2`,children:(0,L.jsx)(Ge,{status:e.ban_status})}),t.twofa&&(0,L.jsx)(`td`,{className:`px-3 py-2 whitespace-nowrap`,children:e.shared_secret?(0,L.jsxs)(`button`,{onClick:async()=>{try{let{code:t}=await D.generate2FA(e.shared_secret);await He(t),p(`success`,S(`twofa.copied`,{code:t}))}catch(e){p(`error`,S(`twofa.error`,{error:e instanceof Error?e.message:String(e)}))}},className:`text-accent hover:underline text-xs`,title:S(`tip.gen2fa`),children:[(0,L.jsx)(ve,{size:12,className:`inline mr-0.5`}),` `,S(`tip.code`)]}):(0,L.jsx)(`span`,{className:`text-gray-600 text-xs`,children:`—`})}),t.mafile&&(0,L.jsx)(`td`,{className:`px-3 py-2`,children:(0,L.jsx)(Ke,{hasMafile:!!e.mafile_path})}),t.proxy&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs`,children:e.proxy?(0,L.jsx)(`span`,{className:`text-blue-400 cursor-pointer hover:underline`,onClick:()=>C(e.proxy),title:e.proxy,children:n||e.proxy}):`—`}),t.notes&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs max-w-[180px]`,children:_?(0,L.jsx)(`input`,{autoFocus:!0,className:`w-full bg-dark-600 border border-dark-500 rounded px-1.5 py-0.5 text-xs text-gray-200 outline-none focus:border-accent`,value:b,onChange:e=>x(e.target.value),onBlur:async()=>{if(v(!1),b!==(e.notes||``))try{await D.updateAccount(e.id,{notes:b}),p(`success`,S(`toast.noteSaved`)),Re.getState().loadAccounts()}catch{p(`error`,S(`toast.noteSaveError`))}},onKeyDown:t=>{t.key===`Enter`&&t.target.blur(),t.key===`Escape`&&(x(e.notes||``),v(!1))}}):(0,L.jsx)(`span`,{className:`cursor-pointer text-gray-400 hover:text-gray-200 truncate block`,onClick:()=>{x(e.notes||``),v(!0)},title:e.notes||S(`tip.addNote`),children:e.notes||`—`})}),t.actions&&(0,L.jsx)(`td`,{className:`px-3 py-2 whitespace-nowrap`,children:(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,L.jsx)(Qe,{account:e,onAction:c,onToggleAutoAccept:l}),(0,L.jsx)(`button`,{onClick:()=>o(e.id),className:`text-gray-400 hover:text-accent`,title:S(`tip.edit`),children:(0,L.jsx)(xe,{size:14})}),(0,L.jsx)(`button`,{onClick:()=>s(e.id),className:`text-gray-400 hover:text-red-400`,title:S(`tip.delete`),children:(0,L.jsx)(Se,{size:14})}),e.auto_accept?(0,L.jsx)(`span`,{title:S(`tip.autoAcceptActive`),children:(0,L.jsx)(me,{size:14,className:`text-accent`})}):null]})})]})}var tt=[`browser`,`profile`,`last_online`,`steam_id`,`login`,`password`,`login_pass`,`email`,`email_pass`,`email_login_pass`,`phone`,`status`,`ban`,`twofa`,`mafile`,`proxy`,`notes`,`actions`],nt={browser:`col.browser`,profile:`col.profile`,last_online:`col.lastOnline`,steam_id:`col.steamId`,login:`col.login`,password:`col.password`,login_pass:`col.loginPass`,email:`col.email`,email_pass:`col.emailPass`,email_login_pass:`col.emailLoginPass`,phone:`col.phone`,status:`col.status`,ban:`col.ban`,twofa:`col.twofa`,mafile:`col.mafile`,proxy:`col.proxy`,notes:`col.notes`,actions:`col.actions`};function rt({accounts:e,processingIds:t,accountResults:n,accountSteps:r,onEdit:i,onDelete:a,onAction:o,onToggleAutoAccept:s,onOpenBrowser:c}){let l=Re(e=>e.selectAll),u=Re(e=>e.clearSelection),d=Re(e=>e.selectedIds),f=j(e=>e.columnVisibility),p=F(),m=e.length>0&&d.size===e.length,h=tt.filter(e=>f[e]),[g,_]=(0,y.useState)(100),v=(0,y.useRef)(null),[b,x]=(0,y.useState)(null),[S,C]=(0,y.useState)(`asc`),w=e=>{b===e?S===`asc`?C(`desc`):(x(null),C(`asc`)):(x(e),C(`asc`))},T=(0,y.useMemo)(()=>{if(!b)return e;let t=S===`asc`?1:-1,n=Symbol();return[...e].sort((e,r)=>{let i=e=>{if(!e||e===`—`)return n;if(e===`online`)return-1;let t=e.match(/^(\d+)([mhd])$/i);if(!t)return n;let r=parseInt(t[1],10);return t[2]===`m`?r:t[2]===`h`?r*60:r*1440},a=i(e.last_online),o=i(r.last_online);return a===n&&o===n?0:a===n?1:o===n?-1:a===o?0:(a{_(100)},[e,b,S]);let E=(0,y.useMemo)(()=>T.slice(0,g),[T,g]);(0,y.useEffect)(()=>{let e=v.current;if(!e)return;let t=new IntersectionObserver(e=>{e[0].isIntersecting&&_(e=>Math.min(e+100,T.length))},{rootMargin:`400px`});return t.observe(e),()=>t.disconnect()},[T.length,g]);let D=(0,y.useMemo)(()=>{let t=new Map,n=[];for(let t of e)t.proxy&&!n.includes(t.proxy)&&n.push(t.proxy);let r=new Map;n.forEach((e,t)=>r.set(e,t+1));for(let n of e)if(n.proxy){let e=r.get(n.proxy);t.set(n.id,e?p(`proxy.label`,{num:e}):n.proxy)}return t},[e]);return e.length?(0,L.jsx)(`div`,{className:`overflow-x-auto`,children:(0,L.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,L.jsx)(`thead`,{className:`sticky top-0 bg-dark-800 z-10`,children:(0,L.jsxs)(`tr`,{className:`text-left text-xs text-gray-500 border-b border-dark-600`,children:[(0,L.jsx)(`th`,{className:`px-3 py-2`,children:(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:m,onChange:()=>m?u():l()}),d.size>0&&(0,L.jsx)(`span`,{className:`text-accent font-medium`,children:d.size})]})}),(0,L.jsx)(`th`,{className:`w-5`}),h.map(e=>e===`last_online`?(0,L.jsxs)(`th`,{className:`px-3 py-2 cursor-pointer select-none hover:text-gray-300`,onClick:()=>w(`last_online`),children:[p(nt[e]),b===`last_online`?S===`asc`?` ▲`:` ▼`:``]},e):(0,L.jsx)(`th`,{className:`px-3 py-2${e===`browser`?` text-center`:``}`,children:p(nt[e])},e))]})}),(0,L.jsxs)(`tbody`,{children:[E.map(e=>(0,L.jsx)(et,{account:e,visibleColumns:f,proxyLabel:D.get(e.id)??null,isProcessing:t.has(e.id),accountResult:n[String(e.id)],accountStep:r[String(e.id)],onEdit:i,onDelete:a,onAction:o,onToggleAutoAccept:s,onOpenBrowser:c},e.id)),g{m.current?.focus()},[]),(0,L.jsx)(`div`,{className:`confirm-overlay`,onMouseDown:n,children:(0,L.jsxs)(`div`,{className:`confirm-box max-w-md`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`h3`,{className:`text-lg font-semibold mb-4`,children:r(`modal.editAccount`)}),(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(`input`,{ref:m,value:i,onChange:e=>a(e.target.value),placeholder:r(`ph.login`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:o,onChange:e=>s(e.target.value),placeholder:r(`ph.password`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:c,onChange:e=>l(e.target.value),placeholder:`Email`,className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:u,onChange:e=>d(e.target.value),placeholder:r(`ph.proxy`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:f,onChange:e=>p(e.target.value),placeholder:r(`ph.notes`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`button`,{onClick:()=>{t(e.id,{login:i,password:o,email:c||void 0,proxy:u||void 0,notes:f||void 0})},className:`btn-primary w-full`,children:r(`btn.save`)})]})]})})}function at({onClose:e}){let t=F(),[n,r]=(0,y.useState)(null),[i,a]=(0,y.useState)(``),[o,s]=(0,y.useState)(!1),c=(0,y.useRef)(null),l=j(e=>e.addToast),u=Re(e=>e.loadAccounts);return(0,L.jsx)(`div`,{className:`confirm-overlay`,onMouseDown:e,children:(0,L.jsxs)(`div`,{className:`confirm-box max-w-lg w-full`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`h3`,{className:`text-lg font-semibold mb-4`,children:t(`modal.importAccounts`)}),(0,L.jsxs)(`div`,{className:`text-sm text-gray-400 mb-3 space-y-1`,children:[(0,L.jsxs)(`p`,{className:`font-medium text-gray-300`,children:[t(`import.formats`),` `,(0,L.jsxs)(`span`,{className:`text-gray-500 font-normal`,children:[`(`,t(`import.delimiter`),` `,(0,L.jsx)(`code`,{className:`text-accent`,children:`:`}),` `,t(`import.or`),` `,(0,L.jsx)(`code`,{className:`text-accent`,children:`|`}),`)`]})]}),(0,L.jsxs)(`p`,{className:`font-mono text-xs`,children:[`login:pass:`,`{`,`mafile`,`}`]}),(0,L.jsxs)(`p`,{className:`font-mono text-xs`,children:[`login:pass:email:email_pass:`,`{`,`mafile`,`}`]}),(0,L.jsx)(`p`,{className:`font-mono text-xs`,children:`login:pass:email:email_pass`})]}),(0,L.jsxs)(`div`,{onDragOver:e=>e.preventDefault(),onDrop:e=>{e.preventDefault();let t=e.dataTransfer.files[0];t&&r(t)},onClick:()=>c.current?.click(),className:`border-2 border-dashed border-dark-500 rounded-lg p-6 mb-3 text-center cursor-pointer transition-colors hover:border-accent`,children:[(0,L.jsx)(ce,{size:32,className:`mx-auto mb-2 text-gray-500`}),(0,L.jsx)(`p`,{className:`text-sm text-gray-400`,children:n?t(`import.selected`,{name:n.name}):t(`import.dragTxt`)})]}),(0,L.jsx)(`input`,{ref:c,type:`file`,accept:`.txt`,className:`hidden`,onChange:e=>{let t=e.target.files?.[0];t&&r(t)}}),(0,L.jsx)(`button`,{onClick:async()=>{if(n){s(!0);try{let e=await D.importAccounts(n);a(t(`toast.importResult`,{imported:e.imported,skipped:e.skipped})),l(`success`,`${e.imported} ok, ${e.skipped} skip`),await u()}catch(e){a(e instanceof Error?e.message:t(`misc.errorStr`))}finally{s(!1)}}},disabled:!n||o,className:`btn-primary w-full`,children:t(o?`import.uploading`:`import.importBtn`)}),i&&(0,L.jsx)(`p`,{className:`mt-3 text-sm text-gray-300`,children:i})]})})}function ot({onSave:e,onClose:t}){let n=F(),[r,i]=(0,y.useState)(``),[a,o]=(0,y.useState)(``),[s,c]=(0,y.useState)(``),[l,u]=(0,y.useState)(``);return(0,L.jsx)(`div`,{className:`confirm-overlay`,onMouseDown:t,children:(0,L.jsxs)(`div`,{className:`confirm-box max-w-md`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`h3`,{className:`text-lg font-semibold mb-4`,children:n(`modal.addAccount`)}),(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(`input`,{autoFocus:!0,value:r,onChange:e=>i(e.target.value),placeholder:n(`ph.login`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:a,onChange:e=>o(e.target.value),placeholder:n(`ph.password`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:s,onChange:e=>c(e.target.value),placeholder:`Email`,className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:l,onChange:e=>u(e.target.value),placeholder:n(`ph.proxy`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`button`,{onClick:()=>{!r||!a||e({login:r,password:a,email:s||void 0,proxy:l||void 0})},className:`btn-primary w-full`,children:n(`btn.add`)})]})]})})}function st({message:e,onConfirm:t,onCancel:n}){let r=F();return(0,L.jsx)(`div`,{className:`confirm-overlay`,onMouseDown:n,children:(0,L.jsxs)(`div`,{className:`confirm-box`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`p`,{className:`text-sm text-gray-300 mb-4`,children:e}),(0,L.jsxs)(`div`,{className:`flex gap-2`,children:[(0,L.jsx)(`button`,{onClick:t,className:`btn-primary flex-1`,children:r(`confirm.yes`)}),(0,L.jsx)(`button`,{onClick:n,className:`btn-secondary flex-1`,children:r(`btn.cancel`)})]})]})})}var ct={browser:`col.browser`,profile:`col.profile`,last_online:`col.lastOnline`,steam_id:`col.steamId`,login:`col.login`,password:`col.password`,login_pass:`col.loginPass`,email:`col.email`,email_pass:`col.emailPass`,email_login_pass:`col.emailLoginPass`,phone:`col.phone`,status:`col.status`,ban:`col.ban`,twofa:`col.twofa`,mafile:`col.mafile`,proxy:`col.proxy`,notes:`col.notes`,actions:`col.actions`};function lt(){let[e,t]=(0,y.useState)(!1),n=j(e=>e.columnVisibility),r=j(e=>e.toggleColumn),i=(0,y.useRef)(null),a=F();return(0,y.useEffect)(()=>{let e=e=>{i.current&&!i.current.contains(e.target)&&t(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[]),(0,L.jsxs)(`div`,{className:`relative`,ref:i,children:[(0,L.jsx)(`button`,{onClick:()=>t(!e),className:`btn-secondary text-sm px-2 py-2`,title:a(`tip.columnSettings`),children:(0,L.jsx)(be,{size:14})}),e&&(0,L.jsx)(`div`,{className:`absolute right-0 top-full mt-1 bg-dark-700 border border-dark-600 rounded-lg shadow-xl z-50 p-2 min-w-[160px]`,children:Object.keys(ct).map(e=>(0,L.jsxs)(`label`,{className:`flex items-center gap-2 px-2 py-1 hover:bg-dark-600 rounded cursor-pointer text-sm`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:n[e],onChange:()=>r(e)}),a(ct[e])]},e))})]})}function ut({onClose:e}){let t=F(),[n,r]=(0,y.useState)(null),[i,a]=(0,y.useState)(``),[o,s]=(0,y.useState)(!1),c=(0,y.useRef)(null),l=j(e=>e.addToast),u=Be(e=>e.loadAccounts);return(0,L.jsx)(`div`,{className:`confirm-overlay`,onMouseDown:e,children:(0,L.jsxs)(`div`,{className:`confirm-box max-w-lg w-full`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`h3`,{className:`text-lg font-semibold mb-4`,children:t(`modal.importAccounts`)}),(0,L.jsxs)(`div`,{className:`text-sm text-gray-400 mb-3 space-y-1`,children:[(0,L.jsx)(`p`,{className:`font-medium text-gray-300`,children:t(`import.formatsColon`)}),(0,L.jsx)(`p`,{className:`font-mono text-xs`,children:`login:pass`}),(0,L.jsx)(`p`,{className:`font-mono text-xs`,children:`login|pass`}),(0,L.jsx)(`p`,{className:`font-mono text-xs`,children:`CSV: login,password,steam_id,ban,prime,trophy,behavior,license`}),(0,L.jsx)(`p`,{className:`text-xs text-yellow-500/80 mt-1`,children:`⚠ Mafile-файлы и JSON не принимаются. Только log:pass / log|pass.`})]}),(0,L.jsxs)(`div`,{onDragOver:e=>e.preventDefault(),onDrop:e=>{e.preventDefault();let t=e.dataTransfer.files[0];t&&r(t)},onClick:()=>c.current?.click(),className:`border-2 border-dashed border-dark-500 rounded-lg p-6 mb-3 text-center cursor-pointer transition-colors hover:border-accent`,children:[(0,L.jsx)(ce,{size:32,className:`mx-auto mb-2 text-gray-500`}),(0,L.jsx)(`p`,{className:`text-sm text-gray-400`,children:n?t(`import.selected`,{name:n.name}):t(`import.dragTxtCsv`)})]}),(0,L.jsx)(`input`,{ref:c,type:`file`,accept:`.txt,.csv`,className:`hidden`,onChange:e=>{let t=e.target.files?.[0];t&&r(t)}}),(0,L.jsx)(`button`,{onClick:async()=>{if(n){s(!0);try{let e=(await n.text()).split(` +`).map(e=>e.trim()).filter(Boolean);if(!e.length){a(t(`toast.fileEmpty`)),s(!1);return}let r=await D.importLogpass(e);a(t(`toast.importResult`,{imported:r.imported,skipped:r.skipped})),l(`success`,`${r.imported} ok, ${r.skipped} skip`),await u()}catch(e){a(e instanceof Error?e.message:t(`misc.errorStr`))}finally{s(!1)}}},disabled:!n||o,className:`btn-primary w-full`,children:t(o?`import.uploading`:`import.importBtn`)}),i&&(0,L.jsx)(`p`,{className:`mt-3 text-sm text-gray-300`,children:i})]})})}function dt({onClose:e}){let t=F(),[n,r]=(0,y.useState)(``),[i,a]=(0,y.useState)(``),[o,s]=(0,y.useState)(``),c=Be(e=>e.loadAccounts);return(0,L.jsx)(`div`,{className:`confirm-overlay`,onMouseDown:e,children:(0,L.jsxs)(`div`,{className:`confirm-box max-w-md`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`h3`,{className:`text-lg font-semibold mb-4`,children:t(`modal.addAccount`)}),(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(`input`,{autoFocus:!0,value:n,onChange:e=>r(e.target.value),placeholder:t(`ph.login`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:i,onChange:e=>a(e.target.value),placeholder:t(`ph.password`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:o,onChange:e=>s(e.target.value),placeholder:t(`ph.proxyOptional`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`button`,{onClick:async()=>{if(!n||!i)return;let t={login:n,password:i,proxy:o||void 0};await D.createLogpassAccount(t),await c(),e()},className:`btn-primary w-full`,children:t(`btn.add`)})]})]})})}function ft({account:e,onClose:t}){let n=F(),[r,i]=(0,y.useState)(e.login),[a,o]=(0,y.useState)(e.password),[s,c]=(0,y.useState)(e.proxy??``),[l,u]=(0,y.useState)(e.notes??``),d=Be(e=>e.loadAccounts);return(0,L.jsx)(`div`,{className:`confirm-overlay`,onMouseDown:t,children:(0,L.jsxs)(`div`,{className:`confirm-box max-w-md`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`h3`,{className:`text-lg font-semibold mb-4`,children:n(`modal.editAccount`)}),(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(`input`,{autoFocus:!0,value:r,onChange:e=>i(e.target.value),placeholder:n(`ph.login`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:a,onChange:e=>o(e.target.value),placeholder:n(`ph.password`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:s,onChange:e=>c(e.target.value),placeholder:n(`ph.proxyOptional`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:l,onChange:e=>u(e.target.value),placeholder:n(`ph.notes`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsxs)(`div`,{className:`flex gap-2`,children:[(0,L.jsx)(`button`,{onClick:async()=>{!r||!a||(await D.updateLogpassAccount(e.id,{login:r,password:a,proxy:s||void 0,notes:l||void 0}),await d(),t())},className:`btn-primary flex-1`,children:n(`btn.save`)}),(0,L.jsx)(`button`,{onClick:t,className:`btn-secondary flex-1`,children:n(`btn.cancel`)})]})]})]})})}var pt={browser:`col.browser`,profile:`col.profile`,last_online:`col.lastOnline`,steam_id:`col.steamId`,login:`col.login`,password:`col.password`,login_pass:`col.loginPass`,status:`col.status`,ban:`col.ban`,prime:`col.prime`,trophy:`col.trophy`,behavior:`col.behavior`,license:`col.license`,proxy:`col.proxy`,notes:`col.notes`,actions:`col.actions`};function mt(){let[e,t]=(0,y.useState)(!1),n=j(e=>e.logpassColumnVisibility),r=j(e=>e.toggleLogpassColumn),i=(0,y.useRef)(null),a=F();return(0,y.useEffect)(()=>{let e=e=>{i.current&&!i.current.contains(e.target)&&t(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[]),(0,L.jsxs)(`div`,{className:`relative`,ref:i,children:[(0,L.jsx)(`button`,{onClick:()=>t(!e),className:`btn-secondary text-sm px-2 py-2`,title:a(`tip.columnSettings`),children:(0,L.jsx)(be,{size:14})}),e&&(0,L.jsx)(`div`,{className:`absolute right-0 top-full mt-1 bg-dark-700 border border-dark-600 rounded-lg shadow-xl z-50 p-2 min-w-[160px]`,children:Object.keys(pt).map(e=>(0,L.jsxs)(`label`,{className:`flex items-center gap-2 px-2 py-1 hover:bg-dark-600 rounded cursor-pointer text-sm`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:n[e],onChange:()=>r(e)}),a(pt[e])]},e))})]})}function ht(e){if(!e)return null;if(typeof e==`string`)try{return JSON.parse(e)}catch{return null}return e}function gt(){let e=Be(e=>e.accounts),t=Be(e=>e.selectedIds),n=Be(e=>e.loadAccounts),r=Be(e=>e.selectAll),i=Be(e=>e.clearSelection),a=j(e=>e.addToast),o=j(e=>e.logpassColumnVisibility),s=F(),[c,l]=(0,y.useState)(``),[u,d]=(0,y.useState)(!1),[f,p]=(0,y.useState)(!1),[m,h]=(0,y.useState)(null),[g,_]=(0,y.useState)({open:!1,message:``,onConfirm:()=>{}}),[v,b]=(0,y.useState)(new Set),[x,S]=(0,y.useState)({}),[C,w]=(0,y.useState)({}),[T,E]=(0,y.useState)(null),[O,ee]=(0,y.useState)(100),[k,A]=(0,y.useState)(null),[M,te]=(0,y.useState)(`asc`),ne=e=>{k===e?M===`asc`?te(`desc`):(A(null),te(`asc`)):(A(e),te(`asc`))},N=(0,y.useRef)(null);(0,y.useEffect)(()=>{n()},[n]);let P=(e,t)=>_({open:!0,message:e,onConfirm:t}),re=(0,y.useCallback)(e=>{let t=new EventSource(`/api/tasks/${e}/stream`);t.onmessage=e=>{try{let r=JSON.parse(e.data);if(E(r),r.account_results){let e=ht(r.account_results);e&&S(e)}r.account_steps&&w(r.account_steps),r.status!==`running`&&(t.close(),b(new Set),E(null),n())}catch{}},t.onerror=()=>t.close()},[n]),ie=(0,y.useCallback)(async()=>{let e=[...t];if(e.length){i(),b(new Set(e)),S({}),w({});try{let{task_id:t}=await D.validateLogpass(e);E({id:t,type:`logpass_validate`,status:`running`,progress:0,total:e.length,result:null,error:null,created_at:``,updated_at:``}),re(t)}catch(e){b(new Set),a(`error`,String(e))}}},[t,i,re,a]),ae=(0,y.useCallback)(async e=>{b(new Set([e])),S(t=>{let n={...t};return delete n[String(e)],n}),w(t=>{let n={...t};return delete n[String(e)],n});try{let{task_id:t}=await D.validateLogpass([e]);E({id:t,type:`logpass_validate`,status:`running`,progress:0,total:1,result:null,error:null,created_at:``,updated_at:``}),re(t)}catch(e){b(new Set),a(`error`,String(e))}},[re,a]),I=(0,y.useCallback)(async()=>{let e=[...t];if(e.length){i(),b(new Set(e)),S({}),w({});try{let{task_id:t}=await D.fullParseLogpass(e);E({id:t,type:`logpass_full_parse`,status:`running`,progress:0,total:e.length,result:null,error:null,created_at:``,updated_at:``}),re(t)}catch(e){b(new Set),a(`error`,String(e))}}},[t,i,re,a]),oe=()=>{let e=[...t];e.length&&P(s(`confirm.deleteLogpassSelected`,{count:e.length}),async()=>{await D.deleteLogpassBulk(e),i(),n()})},R=()=>{P(s(`confirm.deleteLogpassAll`,{count:e.length}),async()=>{await D.deleteLogpassBulk(e.map(e=>e.id)),i(),n()})},ce=()=>{P(s(`confirm.assignProxies`),async()=>{try{a(`success`,s(`toast.proxiesAssignedShort`,{count:(await D.assignLogpassProxies()).assigned})),n()}catch(e){a(`error`,e instanceof Error?e.message:String(e))}})},ue=()=>{P(s(`confirm.reassignProxiesAll`),async()=>{try{a(`success`,s(`toast.proxiesReassignedShort`,{count:(await D.reassignLogpassProxies()).assigned})),n()}catch(e){a(`error`,e instanceof Error?e.message:String(e))}})},de=()=>{P(s(`confirm.clearProxies`),async()=>{try{a(`success`,s(`toast.proxiesClearedShort`,{count:(await D.clearLogpassProxies()).cleared})),n()}catch(e){a(`error`,e instanceof Error?e.message:String(e))}})},fe=e.length>0&&t.size===e.length,ge=(0,y.useMemo)(()=>{if(!c.trim())return e;let t=c.trim(),n=t.match(/^lvl\s*(>=|<=|>|<|=)\s*(\d+)$/i);if(n){let t=n[1],r=parseInt(n[2],10);return e.filter(e=>{let n=e.steam_level;return n==null?!1:t===`>`?n>r:t===`>=`?n>=r:t===`<`?ne.login.toLowerCase().includes(r)||(e.steam_id??``).toLowerCase().includes(r)||(e.nickname??``).toLowerCase().includes(r)||(e.notes??``).toLowerCase().includes(r)||(e.license??``).toLowerCase().includes(r))},[e,c]),_e=(0,y.useMemo)(()=>{if(!k)return ge;let e=M===`asc`?1:-1,t=Symbol();return[...ge].sort((n,r)=>{let i=t,a=t;if(k===`last_online`){let e=e=>{if(!e||e===`—`)return t;if(e===`online`)return-1;let n=e.match(/^(\d+)([mhd])$/i);if(!n)return t;let r=parseInt(n[1],10);return n[2]===`m`?r:n[2]===`h`?r*60:r*1440};i=e(n.last_online),a=e(r.last_online)}else k===`prime`?(i=n.prime===`Enabled`?0:n.prime===`Disabled`?1:t,a=r.prime===`Enabled`?0:r.prime===`Disabled`?1:t):k===`trophy`?(i=n.trophy!=null&&n.trophy!==`—`?parseInt(n.trophy,10)||0:t,a=r.trophy!=null&&r.trophy!==`—`?parseInt(r.trophy,10)||0:t):k===`behavior`&&(i=n.behavior!=null&&n.behavior!==`—`?parseInt(n.behavior,10)||0:t,a=r.behavior!=null&&r.behavior!==`—`?parseInt(r.behavior,10)||0:t);return i===t&&a===t?0:i===t?1:a===t?-1:i===a?0:(i{ee(100)},[c,k,M]);let ve=(0,y.useMemo)(()=>_e.slice(0,O),[_e,O]);(0,y.useEffect)(()=>{let e=N.current;if(!e)return;let t=new IntersectionObserver(e=>{e[0].isIntersecting&&ee(e=>Math.min(e+100,_e.length))},{rootMargin:`400px`});return t.observe(e),()=>t.disconnect()},[_e.length,O]);let ye=(0,y.useMemo)(()=>{let t=new Map,n=[];for(let t of e)t.proxy&&!n.includes(t.proxy)&&n.push(t.proxy);let r=new Map;n.forEach((e,t)=>r.set(e,t+1));for(let n of e)n.proxy&&t.set(n.id,s(`proxy.label`,{num:r.get(n.proxy)??0}));return t},[e]),be=async e=>{try{let t=await D.openLogpassBrowser(e);t.status===`revalidating`?(a(`warn`,s(`toast.cookiesExpiredRevalidating`)),t.task_id&&(b(new Set([e])),E({id:t.task_id,type:`logpass_validate`,status:`running`,progress:0,total:1,result:null,error:null,created_at:``,updated_at:``}),re(t.task_id))):a(`success`,s(`toast.browserOpening`))}catch(e){a(`error`,e instanceof Error?e.message:String(e))}};return(0,L.jsxs)(`div`,{className:`flex flex-col gap-4 h-full min-h-0`,children:[(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-lg px-3 py-2 flex flex-wrap items-center gap-2 shrink-0`,children:[(0,L.jsxs)(`button`,{onClick:()=>d(!0),className:`btn-primary`,children:[(0,L.jsx)(se,{size:14,className:`inline mr-1`}),s(`btn.import`)]}),(0,L.jsxs)(`button`,{onClick:()=>p(!0),className:`btn-secondary`,children:[(0,L.jsx)(le,{size:14,className:`inline mr-1`}),s(`btn.add`)]}),T&&(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(`div`,{className:`h-5 border-l border-dark-500`}),(0,L.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,L.jsx)(`span`,{className:`text-xs text-gray-400 whitespace-nowrap`,children:s(`task.validate`)}),(0,L.jsx)(`div`,{className:`w-28 bg-dark-600 rounded-full h-2.5 shrink-0`,children:(0,L.jsx)(`div`,{className:`h-2.5 rounded-full transition-all duration-300 ${T.status===`completed`?`bg-green-500`:T.status===`failed`?`bg-red-500`:`bg-accent`}`,style:{width:`${T.total>1?T.total>0?Math.round(T.progress/T.total*100):0:T.total_steps?Math.round((T.step??0)/T.total_steps*100):0}%`}})}),(0,L.jsxs)(`span`,{className:`text-xs text-gray-500 whitespace-nowrap`,children:[T.total>1?`${T.progress}/${T.total}${T.active_count?` (${T.active_count})`:``}`:T.step_label||`${T.progress}/${T.total}`,T.total>1?` (${T.total>0?Math.round(T.progress/T.total*100):0}%)`:T.total_steps?` (${T.step}/${T.total_steps})`:``]}),T.status===`completed`&&(0,L.jsx)(ke,{size:14,className:`text-green-400`}),T.status===`failed`&&(0,L.jsx)(`span`,{title:T.error||``,children:(0,L.jsx)(Oe,{size:14,className:`text-red-400`})})]})]}),(0,L.jsxs)(`div`,{className:`ml-auto flex items-center gap-2`,children:[(0,L.jsx)(mt,{}),(0,L.jsx)(`div`,{className:`h-5 border-l border-dark-500`}),(0,L.jsx)(`button`,{onClick:oe,className:`btn-danger-outline text-xs`,children:s(`btn.deleteSelected`)}),(0,L.jsx)(`button`,{onClick:R,className:`btn-danger text-xs`,children:s(`btn.deleteAll`)})]})]}),(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-lg overflow-hidden flex-1 min-h-0 flex flex-col`,children:[(0,L.jsxs)(`div`,{className:`px-3 py-2 flex items-center gap-2 border-b border-dark-600 shrink-0 bg-dark-800`,children:[(0,L.jsxs)(`button`,{onClick:ie,disabled:t.size===0||v.size>0,className:`btn-accent text-sm disabled:opacity-40`,children:[(0,L.jsx)(De,{size:12,className:`inline mr-1`}),s(`btn.validate`)]}),(0,L.jsxs)(`button`,{onClick:I,disabled:t.size===0||v.size>0,className:`btn-secondary text-sm disabled:opacity-40`,children:[(0,L.jsx)(De,{size:12,className:`inline mr-1`}),s(`btn.fullParse`)]}),T&&T.status===`running`&&(0,L.jsxs)(`button`,{onClick:async()=>{try{await D.cancelTask(T.id)}catch{}},className:`btn-danger text-sm`,children:[(0,L.jsx)(Oe,{size:12,className:`inline mr-1`}),s(`btn.cancel`)]}),(0,L.jsx)(`div`,{className:`h-5 border-l border-dark-500`}),(0,L.jsxs)(`button`,{onClick:ce,className:`btn-secondary text-sm`,children:[(0,L.jsx)(pe,{size:14,className:`inline mr-1`}),s(`btn.assignProxies`)]}),(0,L.jsxs)(`button`,{onClick:ue,className:`btn-secondary text-sm`,children:[(0,L.jsx)(me,{size:14,className:`inline mr-1`}),s(`btn.reassign`)]}),(0,L.jsxs)(`button`,{onClick:de,className:`btn-danger-outline text-sm`,children:[(0,L.jsx)(he,{size:14,className:`inline mr-1`}),s(`btn.clearProxies`)]}),(0,L.jsx)(`div`,{className:`ml-auto`,children:(0,L.jsx)(`input`,{type:`text`,value:c,onChange:e=>l(e.target.value),placeholder:s(`ph.searchLogpass`),className:`bg-dark-700 border border-dark-600 rounded px-2 py-1.5 text-xs w-80 placeholder:text-gray-500 outline-none focus:border-accent`})})]}),(0,L.jsx)(`div`,{className:`overflow-auto flex-1 min-h-0`,children:(0,L.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,L.jsx)(`thead`,{className:`sticky top-0 bg-dark-800 z-10`,children:(0,L.jsxs)(`tr`,{className:`text-left text-xs text-gray-500 border-b border-dark-600`,children:[(0,L.jsx)(`th`,{className:`px-3 py-2`,children:(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:fe,onChange:()=>fe?i():r()}),t.size>0&&(0,L.jsx)(`span`,{className:`text-accent font-medium`,children:t.size})]})}),(0,L.jsx)(`th`,{className:`w-5`}),o.browser&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:s(`col.browser`)}),o.profile&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:s(`col.profile`)}),o.last_online&&(0,L.jsxs)(`th`,{className:`px-3 py-2 cursor-pointer select-none hover:text-gray-300`,onClick:()=>ne(`last_online`),children:[s(`col.lastOnline`),k===`last_online`?M===`asc`?` ▲`:` ▼`:``]}),o.steam_id&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:`Steam ID`}),o.login&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:s(`col.login`)}),o.password&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:s(`col.password`)}),o.login_pass&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:`Login:Pass`}),o.status&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:s(`col.status`)}),o.ban&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:s(`col.ban`)}),o.prime&&(0,L.jsxs)(`th`,{className:`px-3 py-2 cursor-pointer select-none hover:text-gray-300`,onClick:()=>ne(`prime`),children:[`Prime`,k===`prime`?M===`asc`?` ▲`:` ▼`:``]}),o.trophy&&(0,L.jsxs)(`th`,{className:`px-3 py-2 cursor-pointer select-none hover:text-gray-300`,onClick:()=>ne(`trophy`),children:[`Trophy`,k===`trophy`?M===`asc`?` ▲`:` ▼`:``]}),o.behavior&&(0,L.jsxs)(`th`,{className:`px-3 py-2 cursor-pointer select-none hover:text-gray-300`,onClick:()=>ne(`behavior`),children:[`Behavior`,k===`behavior`?M===`asc`?` ▲`:` ▼`:``]}),o.license&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:s(`col.license`)}),o.proxy&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:s(`col.proxy`)}),o.notes&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:s(`col.notes`)}),o.actions&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:s(`col.actions`)})]})}),(0,L.jsx)(`tbody`,{children:ge.length===0?(0,L.jsx)(`tr`,{children:(0,L.jsx)(`td`,{colSpan:16,className:`text-center py-12 text-gray-500`,children:s(`empty.logpass`)})}):(0,L.jsxs)(L.Fragment,{children:[ve.map(e=>(0,L.jsx)(_t,{account:e,cols:o,isProcessing:v.has(e.id),accountResult:x[String(e.id)],accountStep:C[String(e.id)],proxyLabel:ye.get(e.id)??null,onDelete:t=>P(s(`confirm.deleteLogpass`,{name:e.login}),async()=>{await D.deleteLogpassAccount(t),n()}),onOpenBrowser:be,onValidate:ae,onEdit:e=>h(e)},e.id)),O{let t=e.find(e=>e.id===m);return t?(0,L.jsx)(ft,{account:t,onClose:()=>h(null)}):null})(),u&&(0,L.jsx)(ut,{onClose:()=>d(!1)}),f&&(0,L.jsx)(dt,{onClose:()=>p(!1)}),g.open&&(0,L.jsx)(st,{message:g.message,onConfirm:()=>{g.onConfirm(),_(e=>({...e,open:!1}))},onCancel:()=>_(e=>({...e,open:!1}))})]})}function _t({account:e,cols:t,isProcessing:n,accountResult:r,accountStep:i,proxyLabel:a,onDelete:o,onOpenBrowser:s,onValidate:c,onEdit:l}){let u=Be(e=>e.selectedIds),d=Be(e=>e.toggleSelect),f=j(e=>e.addToast),p=j(e=>e.hidePasswords),m=Be(e=>e.loadAccounts),[h,g]=(0,y.useState)(!1),[_,v]=(0,y.useState)(!1),[b,x]=(0,y.useState)(e.notes||``),[S,C]=(0,y.useState)(!1),w=F(),T=p&&!h,E=`••••••••`,O=async e=>{let t=await He(e);f(t?`success`:`error`,w(t?`toast.copied`:`toast.copyFailed`))};return(0,L.jsxs)(`tr`,{className:`hover:bg-dark-700/50 transition`,children:[(0,L.jsx)(`td`,{className:`px-3 py-2`,children:(0,L.jsx)(`input`,{type:`checkbox`,checked:u.has(e.id),onChange:()=>d(e.id)})}),(0,L.jsx)(`td`,{className:`px-1 py-2 w-5`,children:n?(0,L.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,L.jsx)(`div`,{className:`w-4 h-4 border-2 border-accent border-t-transparent rounded-full animate-spin shrink-0`}),i&&(0,L.jsxs)(`span`,{className:`text-[10px] text-gray-500 whitespace-nowrap`,children:[`[`,i.step,`/`,i.total,`]`]})]}):r?.status===`ok`?(0,L.jsx)(ue,{size:16,className:`text-gray-400`}):r?.status===`error`?(0,L.jsx)(`span`,{title:r.error,children:(0,L.jsx)(de,{size:16,className:`text-red-400`})}):null}),t.browser&&(0,L.jsx)(`td`,{className:`px-3 py-2 whitespace-nowrap text-center`,children:e.has_cookies?(0,L.jsx)(`button`,{onClick:()=>s(e.id),className:`px-2 py-0.5 text-xs font-medium rounded bg-blue-600/20 text-blue-400 border border-blue-500/30 hover:bg-blue-600/40 hover:text-blue-300 active:scale-95 transition`,title:w(`tip.openBrowser`),children:w(`col.browser`)}):(0,L.jsx)(`span`,{className:`text-gray-600 text-xs`,children:`—`})}),t.profile&&(0,L.jsx)(`td`,{className:`px-3 py-2 whitespace-nowrap`,children:(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[e.avatar_url&&(0,L.jsx)(`img`,{src:e.avatar_url,className:`avatar-sm`,alt:``}),(0,L.jsx)(`span`,{className:`text-xs`,children:e.nickname||`—`}),e.steam_level!=null&&(0,L.jsx)($e,{level:e.steam_level})]})}),t.last_online&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs text-gray-400 whitespace-nowrap`,children:e.last_online||`—`}),t.steam_id&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs`,children:e.steam_id?(0,L.jsx)(`a`,{href:`https://steamcommunity.com/profiles/${encodeURIComponent(e.steam_id)}/`,target:`_blank`,rel:`noopener noreferrer`,className:`text-blue-400 hover:text-blue-300 hover:underline`,children:e.steam_id}):`—`}),t.login&&(0,L.jsx)(`td`,{className:`px-3 py-2 font-medium`,children:e.login}),t.password&&(0,L.jsxs)(`td`,{className:`px-3 py-2 text-gray-400 select-none whitespace-nowrap`,children:[(0,L.jsx)(`span`,{className:`cursor-pointer`,onClick:()=>O(e.password),title:w(`tip.copyPassword`),children:T?E:e.password}),(0,L.jsx)(`button`,{onClick:e=>{e.stopPropagation(),g(!h)},className:`ml-1.5 text-gray-500 hover:text-gray-300 inline-flex align-middle`,title:w(T?`tip.show`:`tip.hide`),children:T?(0,L.jsx)(ge,{size:14}):(0,L.jsx)(_e,{size:14})})]}),t.login_pass&&(0,L.jsxs)(`td`,{className:`px-3 py-2 text-gray-400 text-xs select-none whitespace-nowrap`,children:[(0,L.jsx)(`span`,{className:`cursor-pointer`,onClick:()=>O(`${e.login}:${e.password}`),title:w(`tip.copyLoginPass`),children:T?`${e.login}:${E}`:`${e.login}:${e.password}`}),(0,L.jsx)(`button`,{onClick:e=>{e.stopPropagation(),g(!h)},className:`ml-1.5 text-gray-500 hover:text-gray-300 inline-flex align-middle`,title:w(T?`tip.show`:`tip.hide`),children:T?(0,L.jsx)(ge,{size:14}):(0,L.jsx)(_e,{size:14})})]}),t.status&&(0,L.jsx)(`td`,{className:`px-3 py-2`,children:(0,L.jsx)(We,{status:e.status})}),t.ban&&(0,L.jsx)(`td`,{className:`px-3 py-2`,children:(0,L.jsx)(Ge,{status:e.ban_status})}),t.prime&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs text-gray-400`,children:e.prime??`—`}),t.trophy&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs text-gray-400`,children:e.trophy??`—`}),t.behavior&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs text-gray-400`,children:e.behavior??`—`}),t.license&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs text-gray-400 cursor-pointer select-none ${S?`max-w-none whitespace-normal break-words`:`truncate max-w-[200px] whitespace-nowrap`}`,title:S?void 0:e.license??``,onClick:()=>C(e=>!e),children:e.license??`—`}),t.proxy&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs`,children:e.proxy?(0,L.jsx)(`span`,{className:`text-blue-400 cursor-pointer hover:underline`,onClick:()=>O(e.proxy),title:e.proxy,children:a||e.proxy}):`—`}),t.notes&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs max-w-[180px]`,children:_?(0,L.jsx)(`input`,{autoFocus:!0,className:`w-full bg-dark-600 border border-dark-500 rounded px-1.5 py-0.5 text-xs text-gray-200 outline-none focus:border-accent`,value:b,onChange:e=>x(e.target.value),onBlur:async()=>{if(v(!1),b!==(e.notes||``))try{await D.updateLogpassAccount(e.id,{notes:b}),f(`success`,w(`toast.noteSaved`)),m()}catch{f(`error`,w(`toast.noteSaveError`))}},onKeyDown:t=>{t.key===`Enter`&&t.target.blur(),t.key===`Escape`&&(x(e.notes||``),v(!1))}}):(0,L.jsx)(`span`,{className:`cursor-pointer text-gray-400 hover:text-gray-200 truncate block`,onClick:()=>{x(e.notes||``),v(!0)},title:e.notes||w(`tip.addNote`),children:e.notes||`—`})}),t.actions&&(0,L.jsx)(`td`,{className:`px-3 py-2 whitespace-nowrap`,children:(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,L.jsx)(`button`,{onClick:()=>c(e.id),disabled:n,className:`text-gray-400 hover:text-accent disabled:opacity-40`,title:w(`tip.validate`),children:(0,L.jsx)(De,{size:14})}),(0,L.jsx)(`button`,{onClick:()=>l(e.id),className:`text-gray-400 hover:text-accent`,title:w(`tip.edit`),children:(0,L.jsx)(xe,{size:14})}),(0,L.jsx)(`button`,{onClick:()=>o(e.id),className:`text-gray-400 hover:text-red-400`,title:w(`tip.delete`),children:(0,L.jsx)(Se,{size:14})})]})})]})}function vt({onClose:e}){let t=F(),[n,r]=(0,y.useState)(null),[i,a]=(0,y.useState)(``),[o,s]=(0,y.useState)(!1),c=(0,y.useRef)(null),l=j(e=>e.addToast),u=Ve(e=>e.loadAccounts);return(0,L.jsx)(`div`,{className:`confirm-overlay`,onMouseDown:e,children:(0,L.jsxs)(`div`,{className:`confirm-box max-w-lg w-full`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`h3`,{className:`text-lg font-semibold mb-4`,children:t(`modal.importTokens`)}),(0,L.jsxs)(`div`,{className:`text-sm text-gray-400 mb-3 space-y-1`,children:[(0,L.jsx)(`p`,{className:`font-medium text-gray-300`,children:t(`import.formatsColon`)}),(0,L.jsx)(`p`,{className:`font-mono text-xs`,children:t(`import.tokenFormat`)})]}),(0,L.jsxs)(`div`,{onDragOver:e=>e.preventDefault(),onDrop:e=>{e.preventDefault();let t=e.dataTransfer.files[0];t&&r(t)},onClick:()=>c.current?.click(),className:`border-2 border-dashed border-dark-500 rounded-lg p-6 mb-3 text-center cursor-pointer transition-colors hover:border-accent`,children:[(0,L.jsx)(ce,{size:32,className:`mx-auto mb-2 text-gray-500`}),(0,L.jsx)(`p`,{className:`text-sm text-gray-400`,children:n?t(`import.selected`,{name:n.name}):t(`import.dragTxt`)})]}),(0,L.jsx)(`input`,{ref:c,type:`file`,accept:`.txt`,className:`hidden`,onChange:e=>{let t=e.target.files?.[0];t&&r(t)}}),(0,L.jsx)(`button`,{onClick:async()=>{if(n){s(!0);try{let e=(await n.text()).split(` +`).map(e=>e.trim()).filter(Boolean);if(!e.length){a(t(`toast.fileEmpty`)),s(!1);return}let r=await D.importTokens(e);a(t(`toast.importResult`,{imported:r.imported,skipped:r.skipped})),l(`success`,`${r.imported} ok, ${r.skipped} skip`),await u()}catch(e){a(e instanceof Error?e.message:t(`misc.errorStr`))}finally{s(!1)}}},disabled:!n||o,className:`btn-primary w-full`,children:t(o?`import.uploading`:`import.importBtn`)}),i&&(0,L.jsx)(`p`,{className:`mt-3 text-sm text-gray-300`,children:i})]})})}function yt({onClose:e}){let t=F(),[n,r]=(0,y.useState)(``),[i,a]=(0,y.useState)(``),[o,s]=(0,y.useState)(``),[c,l]=(0,y.useState)(``),u=Ve(e=>e.loadAccounts);return(0,L.jsx)(`div`,{className:`confirm-overlay`,onMouseDown:e,children:(0,L.jsxs)(`div`,{className:`confirm-box max-w-md`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`h3`,{className:`text-lg font-semibold mb-4`,children:t(`modal.addToken`)}),(0,L.jsxs)(`div`,{className:`space-y-3`,children:[(0,L.jsx)(`textarea`,{autoFocus:!0,value:n,onChange:e=>r(e.target.value),placeholder:`Refresh token`,rows:3,className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm font-mono resize-none`}),(0,L.jsx)(`input`,{value:i,onChange:e=>a(e.target.value),placeholder:t(`ph.loginOptional`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:o,onChange:e=>s(e.target.value),placeholder:t(`ph.proxyOptional`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`input`,{value:c,onChange:e=>l(e.target.value),placeholder:t(`ph.notesOptional`),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm`}),(0,L.jsx)(`button`,{onClick:async()=>{if(!n.trim())return;let t={token:n.trim(),login:i.trim()||void 0,proxy:o.trim()||void 0,notes:c.trim()||void 0};await D.createTokenAccount(t),await u(),e()},disabled:!n.trim(),className:`btn-primary w-full disabled:opacity-40`,children:t(`btn.add`)})]})]})})}var bt={browser:`col.browser`,profile:`col.profile`,last_online:`col.lastOnline`,steam_id:`col.steamId`,login:`col.login`,token:`col.token`,status:`col.status`,proxy:`col.proxy`,notes:`col.notes`,actions:`col.actions`};function xt(){let[e,t]=(0,y.useState)(!1),n=j(e=>e.tokenColumnVisibility),r=j(e=>e.toggleTokenColumn),i=(0,y.useRef)(null),a=F();return(0,y.useEffect)(()=>{let e=e=>{i.current&&!i.current.contains(e.target)&&t(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[]),(0,L.jsxs)(`div`,{className:`relative`,ref:i,children:[(0,L.jsx)(`button`,{onClick:()=>t(!e),className:`btn-secondary text-sm px-2 py-2`,title:a(`tip.columnSettings`),children:(0,L.jsx)(be,{size:14})}),e&&(0,L.jsx)(`div`,{className:`absolute right-0 top-full mt-1 bg-dark-700 border border-dark-600 rounded-lg shadow-xl z-50 p-2 min-w-[160px]`,children:Object.keys(bt).map(e=>(0,L.jsxs)(`label`,{className:`flex items-center gap-2 px-2 py-1 hover:bg-dark-600 rounded cursor-pointer text-sm`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:n[e],onChange:()=>r(e)}),a(bt[e])]},e))})]})}function St(e){if(!e)return null;if(typeof e==`string`)try{return JSON.parse(e)}catch{return null}return e}function Ct(){let e=Ve(e=>e.accounts),t=Ve(e=>e.selectedIds),n=Ve(e=>e.loadAccounts),r=Ve(e=>e.toggleSelect),i=Ve(e=>e.selectAll),a=Ve(e=>e.clearSelection),o=j(e=>e.addToast),s=j(e=>e.tokenColumnVisibility),c=j(e=>e.loadTokenColumnSettings),l=F(),[u,d]=(0,y.useState)(!1),[f,p]=(0,y.useState)(``),[m,h]=(0,y.useState)(!1),[g,_]=(0,y.useState)(!1),[v,b]=(0,y.useState)({open:!1,message:``,onConfirm:()=>{}}),[x,S]=(0,y.useState)(new Set),[C,w]=(0,y.useState)({}),[T,E]=(0,y.useState)({}),[O,ee]=(0,y.useState)(null);(0,y.useEffect)(()=>{n(),c()},[n,c]);let k=(e,t)=>b({open:!0,message:e,onConfirm:t}),A=(0,y.useCallback)(e=>{let t=new EventSource(`/api/tasks/${e}/stream`);t.onmessage=e=>{try{let r=JSON.parse(e.data);if(ee(r),r.account_results){let e=St(r.account_results);e&&w(e)}r.account_steps&&E(r.account_steps),r.status!==`running`&&(t.close(),S(new Set),n())}catch{}},t.onerror=()=>t.close()},[n]),M=(0,y.useCallback)(async()=>{let e=[...t];if(e.length){a(),S(new Set(e)),w({}),E({});try{let{task_id:t}=await D.validateTokens(e);ee({id:t,type:`token_validate`,status:`running`,progress:0,total:e.length,result:null,error:null,created_at:``,updated_at:``}),A(t)}catch(e){S(new Set),o(`error`,String(e))}}},[t,a,A,o]),te=(0,y.useCallback)(async e=>{S(new Set([e])),w(t=>{let n={...t};return delete n[String(e)],n}),E(t=>{let n={...t};return delete n[String(e)],n});try{let{task_id:t}=await D.validateTokens([e]);ee({id:t,type:`token_validate`,status:`running`,progress:0,total:1,result:null,error:null,created_at:``,updated_at:``}),A(t)}catch(e){S(new Set),o(`error`,String(e))}},[A,o]),ne=()=>{let e=[...t];e.length&&k(l(`confirm.deleteTokenSelected`,{count:e.length}),async()=>{await D.deleteTokenBulk(e),a(),n()})},N=()=>{k(l(`confirm.deleteTokenAll`,{count:e.length}),async()=>{await D.deleteTokenBulk(e.map(e=>e.id)),a(),n()})},P=()=>{k(l(`confirm.assignProxies`),async()=>{try{o(`success`,l(`toast.proxiesAssignedShort`,{count:(await D.assignTokenProxies()).assigned})),n()}catch(e){o(`error`,e instanceof Error?e.message:String(e))}})},re=()=>{k(l(`confirm.reassignProxiesAll`),async()=>{try{o(`success`,l(`toast.proxiesReassignedShort`,{count:(await D.reassignTokenProxies()).assigned})),n()}catch(e){o(`error`,e instanceof Error?e.message:String(e))}})},ie=()=>{k(l(`confirm.clearProxies`),async()=>{try{o(`success`,l(`toast.proxiesClearedShort`,{count:(await D.clearTokenProxies()).cleared})),n()}catch(e){o(`error`,e instanceof Error?e.message:String(e))}})},ae=async e=>{try{let t=await D.openTokenBrowser(e);t.status===`revalidating`?(o(`warn`,l(`toast.cookiesExpiredRevalidating`)),t.task_id&&(S(new Set([e])),ee({id:t.task_id,type:`token_validate`,status:`running`,progress:0,total:1,result:null,error:null,created_at:``,updated_at:``}),A(t.task_id))):o(`success`,l(`toast.browserOpening`))}catch(e){o(`error`,e instanceof Error?e.message:String(e))}},I=e.length>0&&t.size===e.length,oe=(0,y.useMemo)(()=>{if(!f.trim())return e;let t=f.trim(),n=t.match(/^lvl\s*(>=|<=|>|<|=)\s*(\d+)$/i);if(n){let t=n[1],r=parseInt(n[2],10);return e.filter(e=>{let n=e.steam_level;return n==null?!1:t===`>`?n>r:t===`>=`?n>=r:t===`<`?n(e.login??``).toLowerCase().includes(r)||(e.steam_id??``).toLowerCase().includes(r)||(e.nickname??``).toLowerCase().includes(r)||(e.notes??``).toLowerCase().includes(r))},[e,f]),R=(0,y.useMemo)(()=>{let t=new Map,n=[];for(let t of e)t.proxy&&!n.includes(t.proxy)&&n.push(t.proxy);let r=new Map;n.forEach((e,t)=>r.set(e,t+1));for(let n of e)n.proxy&&t.set(n.id,l(`proxy.label`,{num:r.get(n.proxy)??0}));return t},[e,l]);return(0,L.jsxs)(`div`,{className:`relative flex flex-col gap-4 h-full min-h-0`,children:[!u&&(0,L.jsx)(`div`,{className:`absolute inset-0 z-50 bg-dark-900/80 backdrop-blur-sm flex items-center justify-center`,children:(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-yellow-500/40 rounded-xl p-6 max-w-lg mx-4 shadow-2xl`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-3 mb-4`,children:[(0,L.jsx)(de,{size:28,className:`text-yellow-400 shrink-0`}),(0,L.jsx)(`h3`,{className:`text-lg font-semibold text-yellow-400`,children:l(`token.disclaimerTitle`)})]}),(0,L.jsxs)(`div`,{className:`text-sm text-gray-300 space-y-2 mb-5`,children:[(0,L.jsx)(`p`,{dangerouslySetInnerHTML:{__html:l(`token.disclaimerBody1`)}}),(0,L.jsx)(`p`,{className:`text-red-400 font-medium`,dangerouslySetInnerHTML:{__html:l(`token.disclaimerBody2`)}}),(0,L.jsx)(`p`,{dangerouslySetInnerHTML:{__html:l(`token.disclaimerBody3`)}})]}),(0,L.jsxs)(`label`,{className:`flex items-center gap-2 cursor-pointer select-none group`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:u,onChange:e=>d(e.target.checked),className:`w-4 h-4 rounded border-yellow-500/50 accent-yellow-500`}),(0,L.jsx)(`span`,{className:`text-sm text-gray-400 group-hover:text-gray-300 transition`,children:l(`token.acceptRisk`)})]})]})}),(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-lg px-3 py-2 flex flex-wrap items-center gap-2 shrink-0`,children:[(0,L.jsxs)(`button`,{onClick:()=>h(!0),className:`btn-primary`,children:[(0,L.jsx)(se,{size:14,className:`inline mr-1`}),l(`btn.import`)]}),(0,L.jsxs)(`button`,{onClick:()=>_(!0),className:`btn-secondary`,children:[(0,L.jsx)(le,{size:14,className:`inline mr-1`}),l(`btn.add`)]}),O&&(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(`div`,{className:`h-5 border-l border-dark-500`}),(0,L.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,L.jsx)(`span`,{className:`text-xs text-gray-400 whitespace-nowrap`,children:l(`task.validate`)}),(0,L.jsx)(`div`,{className:`w-28 bg-dark-600 rounded-full h-2.5 shrink-0`,children:(0,L.jsx)(`div`,{className:`h-2.5 rounded-full transition-all duration-300 ${O.status===`completed`?`bg-green-500`:O.status===`failed`?`bg-red-500`:`bg-accent`}`,style:{width:`${O.total>1?O.total>0?Math.round(O.progress/O.total*100):0:O.total_steps?Math.round((O.step??0)/O.total_steps*100):0}%`}})}),(0,L.jsxs)(`span`,{className:`text-xs text-gray-500 whitespace-nowrap`,children:[O.total>1?`${O.progress}/${O.total}${O.active_count?` (${O.active_count})`:``}`:O.step_label||`${O.progress}/${O.total}`,O.total>1?` (${O.total>0?Math.round(O.progress/O.total*100):0}%)`:O.total_steps?` (${O.step}/${O.total_steps})`:``]}),O.status===`completed`&&(0,L.jsx)(ke,{size:14,className:`text-green-400`}),O.status===`failed`&&(0,L.jsx)(`span`,{title:O.error||``,children:(0,L.jsx)(Oe,{size:14,className:`text-red-400`})})]})]}),(0,L.jsxs)(`div`,{className:`ml-auto flex items-center gap-2`,children:[(0,L.jsx)(xt,{}),(0,L.jsx)(`div`,{className:`h-5 border-l border-dark-500`}),(0,L.jsx)(`button`,{onClick:ne,className:`btn-danger-outline text-xs`,children:l(`btn.deleteSelected`)}),(0,L.jsx)(`button`,{onClick:N,className:`btn-danger text-xs`,children:l(`btn.deleteAll`)})]})]}),(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-lg overflow-hidden flex-1 min-h-0 flex flex-col`,children:[(0,L.jsxs)(`div`,{className:`px-3 py-2 flex items-center gap-2 border-b border-dark-600 shrink-0 bg-dark-800`,children:[(0,L.jsxs)(`button`,{onClick:M,disabled:t.size===0||x.size>0,className:`btn-accent text-sm disabled:opacity-40`,children:[(0,L.jsx)(De,{size:12,className:`inline mr-1`}),l(`btn.validate`)]}),(0,L.jsx)(`div`,{className:`h-5 border-l border-dark-500`}),(0,L.jsxs)(`button`,{onClick:P,className:`btn-secondary text-sm`,children:[(0,L.jsx)(pe,{size:14,className:`inline mr-1`}),l(`btn.assignProxies`)]}),(0,L.jsxs)(`button`,{onClick:re,className:`btn-secondary text-sm`,children:[(0,L.jsx)(me,{size:14,className:`inline mr-1`}),l(`btn.reassign`)]}),(0,L.jsxs)(`button`,{onClick:ie,className:`btn-danger-outline text-sm`,children:[(0,L.jsx)(he,{size:14,className:`inline mr-1`}),l(`btn.clearProxies`)]}),(0,L.jsx)(`div`,{className:`ml-auto`,children:(0,L.jsx)(`input`,{type:`text`,value:f,onChange:e=>p(e.target.value),placeholder:l(`ph.search`),className:`bg-dark-700 border border-dark-600 rounded px-2 py-1.5 text-xs w-80 placeholder:text-gray-500 outline-none focus:border-accent`})})]}),(0,L.jsx)(`div`,{className:`overflow-auto flex-1 min-h-0`,children:(0,L.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,L.jsx)(`thead`,{className:`sticky top-0 bg-dark-800 z-10`,children:(0,L.jsxs)(`tr`,{className:`text-left text-xs text-gray-500 border-b border-dark-600`,children:[(0,L.jsx)(`th`,{className:`px-3 py-2`,children:(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:I,onChange:()=>I?a():i()}),t.size>0&&(0,L.jsx)(`span`,{className:`text-accent font-medium`,children:t.size})]})}),(0,L.jsx)(`th`,{className:`w-5`}),s.browser&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:l(`col.browser`)}),s.profile&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:l(`col.profile`)}),s.last_online&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:l(`col.lastOnline`)}),s.steam_id&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:`Steam ID`}),s.login&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:l(`col.login`)}),s.token&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:l(`col.token`)}),s.status&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:l(`col.status`)}),s.proxy&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:l(`col.proxy`)}),s.notes&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:l(`col.notes`)}),s.actions&&(0,L.jsx)(`th`,{className:`px-3 py-2`,children:l(`col.actions`)})]})}),(0,L.jsx)(`tbody`,{children:oe.length===0?(0,L.jsx)(`tr`,{children:(0,L.jsx)(`td`,{colSpan:12,className:`text-center py-12 text-gray-500`,children:l(`empty.tokens`)})}):oe.map(e=>{let i=x.has(e.id),a=C[String(e.id)],o=T[String(e.id)];return(0,L.jsxs)(`tr`,{className:`hover:bg-dark-700/50 transition border-t border-dark-700`,children:[(0,L.jsx)(`td`,{className:`px-3 py-2`,children:(0,L.jsx)(`input`,{type:`checkbox`,checked:t.has(e.id),onChange:()=>r(e.id)})}),(0,L.jsx)(`td`,{className:`px-1 py-2 w-5`,children:i?(0,L.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,L.jsx)(`div`,{className:`w-4 h-4 border-2 border-accent border-t-transparent rounded-full animate-spin shrink-0`}),o&&(0,L.jsxs)(`span`,{className:`text-[10px] text-gray-500 whitespace-nowrap`,children:[`[`,o.step,`/`,o.total,`]`]})]}):a?.status===`ok`?(0,L.jsx)(ue,{size:16,className:`text-gray-400`}):a?.status===`error`?(0,L.jsx)(`span`,{title:a.error,children:(0,L.jsx)(de,{size:16,className:`text-red-400`})}):null}),s.browser&&(0,L.jsx)(`td`,{className:`px-3 py-2 whitespace-nowrap text-center`,children:e.has_cookies?(0,L.jsx)(`button`,{onClick:()=>ae(e.id),className:`px-2 py-0.5 text-xs font-medium rounded bg-blue-600/20 text-blue-400 border border-blue-500/30 hover:bg-blue-600/40 hover:text-blue-300 active:scale-95 transition`,title:l(`tip.openBrowser`),children:l(`col.browser`)}):(0,L.jsx)(`span`,{className:`text-gray-600 text-xs`,children:`—`})}),s.profile&&(0,L.jsx)(`td`,{className:`px-3 py-2 whitespace-nowrap`,children:(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[e.avatar_url&&(0,L.jsx)(`img`,{src:e.avatar_url,className:`avatar-sm`,alt:``}),(0,L.jsx)(`span`,{className:`text-xs`,children:e.nickname||`—`}),e.steam_level!=null&&(0,L.jsx)($e,{level:e.steam_level})]})}),s.last_online&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs text-gray-400 whitespace-nowrap`,children:e.last_online||`—`}),s.steam_id&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs`,children:e.steam_id?(0,L.jsx)(`a`,{href:`https://steamcommunity.com/profiles/${encodeURIComponent(e.steam_id)}/`,target:`_blank`,rel:`noopener noreferrer`,className:`text-blue-400 hover:text-blue-300 hover:underline`,children:e.steam_id}):`—`}),s.login&&(0,L.jsx)(`td`,{className:`px-3 py-2 font-medium`,children:e.login??`—`}),s.token&&(0,L.jsxs)(`td`,{className:`px-3 py-2 font-mono text-gray-400 truncate max-w-[180px]`,title:e.token,children:[e.token.slice(0,24),`…`]}),s.status&&(0,L.jsx)(`td`,{className:`px-3 py-2`,children:(0,L.jsx)(We,{status:e.status})}),s.proxy&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs text-gray-500 whitespace-nowrap`,children:R.get(e.id)??`—`}),s.notes&&(0,L.jsx)(`td`,{className:`px-3 py-2 text-xs text-gray-500`,children:e.notes??`—`}),s.actions&&(0,L.jsx)(`td`,{className:`px-3 py-2 whitespace-nowrap`,children:(0,L.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,L.jsx)(`button`,{onClick:()=>te(e.id),disabled:i,className:`text-gray-400 hover:text-accent disabled:opacity-40 transition`,title:l(`tip.validate`),children:(0,L.jsx)(De,{size:14})}),(0,L.jsx)(`button`,{onClick:()=>k(l(`confirm.deleteToken`,{name:e.login??e.token.slice(0,16)}),async()=>{await D.deleteTokenAccount(e.id),n()}),className:`text-gray-400 hover:text-red-400 transition`,title:l(`tip.delete`),children:(0,L.jsx)(Se,{size:14})})]})})]},e.id)})})]})})]}),m&&(0,L.jsx)(vt,{onClose:()=>h(!1)}),g&&(0,L.jsx)(yt,{onClose:()=>_(!1)}),v.open&&(0,L.jsx)(st,{message:v.message,onConfirm:()=>{v.onConfirm(),b(e=>({...e,open:!1}))},onCancel:()=>b(e=>({...e,open:!1}))})]})}function wt(e){if(!e)return null;if(typeof e==`string`)try{return JSON.parse(e)}catch{return null}return e}function Tt(e){if(!e)return[];try{return JSON.parse(e)}catch{return[]}}var Et=[{value:``,labelKey:`action.selectAction`},{value:`validate`,labelKey:`action.validate`},{value:`change_password`,labelKey:`action.changePassword`},{value:`random_password`,labelKey:`action.randomPassword`},{value:`change_email`,labelKey:`action.changeEmail`},{value:`remove_guard`,labelKey:`action.removeGuard`},{value:`enable_auto_accept`,labelKey:`action.enableAutoAccept`}];function Dt({value:e,onChange:t,disabledActions:n}){let r=F(),[i,a]=(0,y.useState)(!1),o=(0,y.useRef)(null);return(0,y.useEffect)(()=>{if(!i)return;let e=e=>{o.current&&!o.current.contains(e.target)&&a(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[i]),(0,L.jsxs)(`div`,{ref:o,className:`relative`,children:[(0,L.jsxs)(`button`,{type:`button`,onClick:()=>a(e=>!e),className:`bg-dark-700 border border-dark-600 rounded px-2 py-1.5 text-sm flex items-center gap-1 min-w-[170px] justify-between hover:border-dark-500 transition-colors`,children:[(0,L.jsx)(`span`,{className:`truncate`,children:r(Et.find(t=>t.value===e)?.labelKey||`action.selectAction`)}),(0,L.jsx)(`svg`,{width:`12`,height:`12`,viewBox:`0 0 12 12`,fill:`none`,className:`shrink-0 transition-transform ${i?`rotate-180`:``}`,children:(0,L.jsx)(`path`,{d:`M3 4.5L6 7.5L9 4.5`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`})})]}),i&&(0,L.jsx)(`div`,{className:`absolute top-full left-0 mt-1 z-50 bg-dark-700 border border-dark-600 rounded shadow-lg min-w-[100px] py-1 max-h-[320px] overflow-y-auto`,children:Et.map(i=>{let o=!!(i.value&&n?.has(i.value));return(0,L.jsx)(`button`,{type:`button`,onClick:()=>{o||(t(i.value),a(!1))},disabled:o,title:o?r(`action.noRevocationCode`):void 0,className:`w-full text-left px-3 py-2 text-sm transition-colors ${o?`opacity-40 cursor-not-allowed`:`hover:bg-dark-600`} ${i.value===e?`text-accent bg-dark-600/50`:``} ${i.value?``:`text-gray-500`}`,children:r(i.labelKey)},i.value)})})]})}function Ot(){let e=j(e=>e.accountSection),t=Re(e=>e.accounts.length),n=Be(e=>e.accounts.length),r=Ve(e=>e.accounts.length),i=Be(e=>e.loadAccounts),a=Ve(e=>e.loadAccounts),[o,s]=(0,y.useState)(0),c=(0,y.useRef)(0),l=(0,y.useRef)(0),u=(0,y.useRef)(e);(0,y.useEffect)(()=>{e===`logpass`&&n===0&&i(),e===`token`&&r===0&&a()},[e]);let d=e===`logpass`?n:e===`token`?r:t;return(0,y.useEffect)(()=>{cancelAnimationFrame(c.current);let t=u.current!==e;if(u.current=e,t){l.current=d,s(d);return}let n=l.current,r=d-n;if(r===0)return;let i=Math.min(400,Math.max(150,Math.abs(r)*2)),a=performance.now(),o=e=>{let t=e-a,u=Math.min(t/i,1),d=1-(1-u)**3,f=Math.max(0,Math.round(n+r*d));l.current=f,s(f),u<1&&(c.current=requestAnimationFrame(o))};return c.current=requestAnimationFrame(o),()=>cancelAnimationFrame(c.current)},[d,e]),(0,L.jsxs)(`div`,{className:`mt-1 px-3 py-2 border-t border-dark-600 flex items-center gap-2`,children:[(0,L.jsxs)(`div`,{className:`relative shrink-0`,style:{width:14,height:14},children:[(0,L.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:`text-gray-400`,children:[(0,L.jsx)(`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`}),(0,L.jsx)(`circle`,{cx:`9`,cy:`7`,r:`4`}),(0,L.jsx)(`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`}),(0,L.jsx)(`path`,{d:`M16 3.13a4 4 0 0 1 0 7.75`})]}),(0,L.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:`none`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,className:`icon-shimmer absolute inset-0`,style:{pointerEvents:`none`},children:[(0,L.jsx)(`path`,{d:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2`}),(0,L.jsx)(`circle`,{cx:`9`,cy:`7`,r:`4`}),(0,L.jsx)(`path`,{d:`M22 21v-2a4 4 0 0 0-3-3.87`}),(0,L.jsx)(`path`,{d:`M16 3.13a4 4 0 0 1 0 7.75`})]})]}),(0,L.jsx)(`span`,{className:`text-sm text-gray-300 font-medium tabular-nums`,children:o})]})}function kt(){let e=Re(e=>e.accounts),t=Re(e=>e.selectedIds),n=Re(e=>e.loadAccounts),r=Re(e=>e.clearSelection),i=Re(e=>e.sendToMafileManager),a=j(e=>e.setTab),o=j(e=>e.addToast),s=ze(e=>e.loadTasks),c=F(),[l,u]=(0,y.useState)(null),[d,f]=(0,y.useState)(!1),[p,m]=(0,y.useState)(!1),[h,g]=(0,y.useState)(null),[_,v]=(0,y.useState)(null),[b,x]=(0,y.useState)(``),S=j(e=>e.accountSection),C=j(e=>e.setAccountSection),[w,T]=(0,y.useState)(null),[E,O]=(0,y.useState)(new Set),[ee,k]=(0,y.useState)(``),[A,M]=(0,y.useState)(null),[te,ne]=(0,y.useState)(``),[N,P]=(0,y.useState)({}),[re,ie]=(0,y.useState)({}),ae=(0,y.useMemo)(()=>{if(!ee.trim())return e;let t=ee.trim(),n=t.match(/^lvl\s*(>=|<=|>|<|=)\s*(\d+)$/i);if(n){let t=n[1],r=parseInt(n[2],10);return e.filter(e=>{let n=e.steam_level;return n==null?!1:t===`>`?n>r:t===`>=`?n>=r:t===`<`?n{if(e.login.toLowerCase().includes(r)||e.steam_id&&e.steam_id.toLowerCase().includes(r))return!0;if(e.notes){let t=e.notes.toLowerCase();return i.some(e=>t.includes(e))}return!1})},[e,ee]),I=(0,y.useMemo)(()=>{let n=new Set;return e.filter(e=>t.has(e.id)).some(e=>e.has_revocation_code)||n.add(`remove_guard`),n},[e,t]);(0,y.useEffect)(()=>{n()},[]);let oe=(e,t)=>{g(e),v(()=>t)},R=(0,y.useCallback)((e,t=[],r=!0)=>{r&&P(e=>{let n={...e};return t.forEach(e=>delete n[String(e)]),n});let i=new EventSource(`/api/tasks/${e}/stream`);i.onmessage=r=>{try{let a=JSON.parse(r.data);T(a);let l=wt(a.account_results);l&&P(e=>({...e,...l})),a.account_steps&&ie(e=>({...e,...a.account_steps})),a.prompt&&(M({taskId:e,message:a.prompt,login:a.prompt_login}),ne(``)),(a.status===`completed`||a.status===`failed`||a.status===`cancelled`)&&(a.status===`completed`?o(`success`,`${a.type}: ${a.result||c(`toast.done`)}`):a.status===`cancelled`?o(`info`,c(`toast.taskCancelled`)):o(`error`,`${a.type}: ${a.error||c(`toast.error`)}`),O(e=>{let n=new Set(e);return t.forEach(e=>n.delete(e)),n}),M(null),n(),s(),i.close(),setTimeout(()=>T(null),3e3))}catch{}},i.onerror=()=>i.close()},[o,n,s]);(0,y.useEffect)(()=>{let e=!1;return(async()=>{try{let t=await D.getTasks();if(e)return;let n=t.find(e=>e.status===`running`);if(n){let e=Tt(n.account_ids);T(n),O(new Set(e));let t=wt(n.account_results);t&&P(t),R(n.id,e,!1);return}let r=t.find(e=>e.status===`completed`||e.status===`failed`);if(r){let e=wt(r.account_results);e&&Object.keys(e).length>0&&P(e)}}catch{}})(),()=>{e=!0}},[R]);let ce=async(t,n,r)=>{let i=e.find(e=>e.id===t)?.login??`#${t}`;try{O(e=>new Set(e).add(t));let e=await D.executeAction({account_ids:[t],action:n,params:r});o(`info`,c(`misc.taskAction`,{id:e.task_id,action:n,login:i})),R(e.task_id,[t])}catch(e){O(e=>{let n=new Set(e);return n.delete(t),n}),o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}},ue=async()=>{if(!(!A||!te))try{await D.respondToPrompt(A.taskId,te,A.login),M(null)}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}},de=async()=>{if(A)try{await D.cancelTask(A.taskId)}catch{}M(null)},ge=()=>{if(!b)return o(`warn`,c(`toast.selectAction`));if(!t.size)return o(`warn`,c(`toast.selectAccounts`));if(b===`enable_auto_accept`){let e=[...t];r(),D.startAutoAccept(e).then(()=>{o(`success`,c(`toast.autoAcceptEnabled`,{count:e.length})),n()}).catch(e=>o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)})));return}let e=[...t],i=b;oe(c(`confirm.executeBulk`,{action:c(Et.find(e=>e.value===i)?.labelKey||`action.selectAction`),count:e.length}),async()=>{try{let t=await D.executeAction({account_ids:e,action:i});r(),O(t=>{let n=new Set(t);return e.forEach(e=>n.add(e)),n}),o(`info`,c(`misc.taskCount`,{id:t.task_id,count:t.accounts_count})),R(t.task_id,e)}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}})},_e=async t=>{let r=e.find(e=>e.id===t);if(!r)return;let i=!r.auto_accept;try{i?await D.startAutoAccept([t]):await D.stopAutoAccept([t]),o(`info`,c(i?`toast.autoAcceptOn`:`toast.autoAcceptOff`)),await n()}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}},be=e=>u(e),xe=async(e,t)=>{try{await D.updateAccount(e,t),u(null),o(`success`,c(`toast.saved`)),await n()}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}},Se=e=>{oe(c(`confirm.deleteAccount`),async()=>{try{await D.deleteAccount(e),o(`success`,c(`toast.accountDeleted`)),await n()}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}})},we=()=>{if(!t.size)return o(`warn`,c(`toast.selectAccounts`));oe(c(`confirm.deleteSelected`,{count:t.size}),async()=>{try{let e=await D.deleteBulk([...t]);r(),o(`success`,c(`toast.deleted`,{count:e.deleted})),await n()}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}})},Te=()=>{if(!e.length)return o(`warn`,c(`toast.noAccounts`));oe(c(`confirm.deleteAll`,{count:e.length}),async()=>{try{let e=await D.deleteBulk([]);r(),o(`success`,c(`toast.deleted`,{count:e.deleted})),await n()}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}})},Ee=async e=>{try{await D.createAccount(e),m(!1),o(`success`,c(`toast.accountAdded`)),await n()}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}},Ae=()=>{if(!t.size)return o(`warn`,c(`toast.selectAccounts`));i([...t]),a(`mafiles`),o(`info`,c(`toast.sentToMafile`,{count:t.size}))},je=async e=>{try{let t=await D.openBrowser(e);t.status===`revalidating`?(o(`warn`,c(`toast.cookiesExpiredRevalidating`)),t.task_id&&(O(t=>new Set(t).add(e)),R(t.task_id,[e]))):o(`info`,c(`toast.browserOpening`))}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}},Me=async()=>{oe(c(`confirm.assignProxies`),async()=>{try{let e=await D.assignProxies();o(`success`,c(`toast.proxiesAssigned`,{used:e.proxies_used,count:e.assigned})),await n()}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}})},Ne=async()=>{oe(c(`confirm.reassignProxies`),async()=>{try{let e=await D.reassignProxies();o(`success`,c(`toast.proxiesReassigned`,{used:e.proxies_used,count:e.assigned})),await n()}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}})},Pe=async()=>{oe(c(`confirm.clearProxies`),async()=>{try{o(`success`,c(`toast.proxiesClearedCount`,{count:(await D.clearProxies()).cleared})),await n()}catch(e){o(`error`,c(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}})},Fe=l?e.find(e=>e.id===l):null,Ie=[{id:`mafile`,label:`Mafile`,icon:(0,L.jsx)(Ce,{size:14})},{id:`logpass`,label:`Log:Pass`,icon:(0,L.jsx)(ve,{size:14})},{id:`token`,label:`Token`,icon:(0,L.jsx)(ye,{size:14})}];return(0,L.jsxs)(`div`,{className:`flex gap-3 h-full min-h-0 overflow-hidden`,children:[(0,L.jsxs)(`div`,{className:`w-36 shrink-0 flex flex-col gap-1 bg-dark-800 border border-dark-600 rounded-lg p-2 self-start`,children:[(0,L.jsx)(`p`,{className:`text-xs font-medium text-gray-500 px-2 py-1 uppercase tracking-wider`,children:c(`section.dataType`)}),Ie.map(e=>(0,L.jsxs)(`button`,{onClick:()=>C(e.id),className:`flex items-center gap-2 px-3 py-2 rounded text-sm text-left w-full transition-colors ${S===e.id?`bg-accent/20 text-accent`:`text-gray-400 hover:text-gray-200 hover:bg-dark-700`}`,children:[e.icon,e.label]},e.id)),(0,L.jsx)(Ot,{})]}),S===`logpass`&&(0,L.jsx)(`div`,{className:`flex-1 min-w-0 min-h-0`,children:(0,L.jsx)(gt,{})}),S===`token`&&(0,L.jsx)(`div`,{className:`flex-1 min-w-0 min-h-0`,children:(0,L.jsx)(Ct,{})}),S===`mafile`&&(0,L.jsxs)(`div`,{className:`flex flex-col gap-4 flex-1 min-w-0 min-h-0 overflow-hidden`,children:[(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-lg px-3 py-2 flex flex-wrap items-center gap-2 shrink-0`,children:[(0,L.jsxs)(`button`,{onClick:()=>f(!0),className:`btn-primary`,children:[(0,L.jsx)(se,{size:14,className:`inline mr-1`}),c(`btn.import`)]}),(0,L.jsxs)(`button`,{onClick:()=>m(!0),className:`btn-secondary`,children:[(0,L.jsx)(le,{size:14,className:`inline mr-1`}),c(`btn.add`)]}),w&&(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(`div`,{className:`h-5 border-l border-dark-500`}),(0,L.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,L.jsx)(`span`,{className:`text-xs text-gray-400 whitespace-nowrap`,children:w.type===`validate`?c(`task.validate`):w.type===`change_password`?c(`task.changePassword`):w.type===`random_password`?c(`task.randomPassword`):w.type===`change_email`?c(`task.changeEmail`):w.type===`change_phone`?c(`task.changePhone`):w.type===`remove_guard`?c(`task.removeGuard`):w.type}),(0,L.jsx)(`div`,{className:`w-28 bg-dark-600 rounded-full h-2.5 shrink-0`,children:(0,L.jsx)(`div`,{className:`h-2.5 rounded-full transition-all duration-300 ${w.status===`completed`?`bg-green-500`:w.status===`failed`?`bg-red-500`:`bg-accent`}`,style:{width:`${w.total>1?w.total>0?Math.round(w.progress/w.total*100):0:w.total_steps?Math.round((w.step??0)/w.total_steps*100):0}%`}})}),(0,L.jsxs)(`span`,{className:`text-xs text-gray-500 whitespace-nowrap`,children:[w.total>1?`${w.progress}/${w.total}${w.active_count?` (${w.active_count})`:``}`:w.step_label||`${w.progress}/${w.total}`,w.total>1?` (${w.total>0?Math.round(w.progress/w.total*100):0}%)`:w.total_steps?` (${w.step}/${w.total_steps})`:``]}),w.status===`completed`&&(0,L.jsx)(ke,{size:14,className:`text-green-400`}),w.status===`failed`&&(0,L.jsx)(`span`,{title:w.error||``,children:(0,L.jsx)(Oe,{size:14,className:`text-red-400`})})]})]}),(0,L.jsxs)(`div`,{className:`ml-auto flex items-center gap-2`,children:[(0,L.jsx)(lt,{}),(0,L.jsx)(`div`,{className:`h-5 border-l border-dark-500`}),(0,L.jsx)(`button`,{onClick:we,className:`btn-danger-outline text-xs`,children:c(`btn.deleteSelected`)}),(0,L.jsx)(`button`,{onClick:Te,className:`btn-danger text-xs`,children:c(`btn.deleteAll`)})]})]}),(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-lg overflow-hidden flex-1 min-h-0 flex flex-col`,children:[(0,L.jsxs)(`div`,{className:`px-3 py-2 flex items-center gap-2 border-b border-dark-600 shrink-0 bg-dark-800`,children:[(0,L.jsx)(Dt,{value:b,onChange:x,disabledActions:I}),(0,L.jsxs)(`button`,{onClick:ge,disabled:!!w||E.size>0,className:`btn-accent text-sm disabled:opacity-40 disabled:cursor-not-allowed`,children:[(0,L.jsx)(De,{size:12,className:`inline mr-1`}),c(`btn.execute`)]}),w&&w.status===`running`&&(0,L.jsxs)(`button`,{onClick:async()=>{try{await D.cancelTask(w.id)}catch{}},className:`btn-danger text-sm`,children:[(0,L.jsx)(Oe,{size:12,className:`inline mr-1`}),c(`btn.cancel`)]}),(0,L.jsx)(`div`,{className:`h-5 border-l border-dark-500`}),(0,L.jsxs)(`button`,{onClick:Ae,className:`btn-secondary text-sm`,children:[(0,L.jsx)(fe,{size:14,className:`inline mr-1`}),`В Mafile Manager`]}),(0,L.jsx)(`div`,{className:`h-5 border-l border-dark-500`}),(0,L.jsxs)(`button`,{onClick:Me,className:`btn-secondary text-sm`,children:[(0,L.jsx)(pe,{size:14,className:`inline mr-1`}),c(`btn.assignProxies`)]}),(0,L.jsxs)(`button`,{onClick:Ne,className:`btn-secondary text-sm`,children:[(0,L.jsx)(me,{size:14,className:`inline mr-1`}),c(`btn.reassign`)]}),(0,L.jsxs)(`button`,{onClick:Pe,className:`btn-danger-outline text-sm`,children:[(0,L.jsx)(he,{size:14,className:`inline mr-1`}),c(`btn.clearProxies`)]}),(0,L.jsx)(`div`,{className:`ml-auto`,children:(0,L.jsx)(`input`,{type:`text`,value:ee,onChange:e=>k(e.target.value),placeholder:c(`ph.search`),className:`bg-dark-700 border border-dark-600 rounded px-2 py-1.5 text-xs w-80 placeholder:text-gray-500 outline-none focus:border-accent`})})]}),(0,L.jsx)(`div`,{className:`overflow-auto flex-1 min-h-0`,children:(0,L.jsx)(rt,{accounts:ae,processingIds:E,accountResults:N,accountSteps:re,onEdit:be,onDelete:Se,onAction:ce,onToggleAutoAccept:_e,onOpenBrowser:je})})]})]}),Fe&&(0,L.jsx)(it,{account:Fe,onSave:xe,onClose:()=>u(null)}),d&&(0,L.jsx)(at,{onClose:()=>f(!1)}),p&&(0,L.jsx)(ot,{onSave:Ee,onClose:()=>m(!1)}),h&&_&&(0,L.jsx)(st,{message:h,onConfirm:()=>{_(),g(null),v(null)},onCancel:()=>{g(null),v(null)}}),A&&(0,L.jsx)(`div`,{className:`fixed inset-0 bg-black/60 flex items-center justify-center z-50`,onMouseDown:de,children:(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-lg p-5 w-96 shadow-xl`,onMouseDown:e=>e.stopPropagation(),children:[(0,L.jsx)(`p`,{className:`text-sm text-gray-300 mb-3`,children:A.message}),(0,L.jsx)(`input`,{autoFocus:!0,value:te,onChange:e=>ne(e.target.value),onKeyDown:e=>e.key===`Enter`&&ue(),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm mb-3`,placeholder:c(`prompt.enterValue`)}),(0,L.jsxs)(`div`,{className:`flex gap-2`,children:[(0,L.jsx)(`button`,{onClick:ue,className:`btn-primary flex-1`,children:`OK`}),(0,L.jsx)(`button`,{onClick:de,className:`btn-secondary flex-1`,children:c(`btn.cancel`)})]})]})})]})}function At(){let e=F(),[t,n]=(0,y.useState)(`secret`),[r,i]=(0,y.useState)(``),[a,o]=(0,y.useState)(``),[s,c]=(0,y.useState)(``),[l,u]=(0,y.useState)(null),[d,f]=(0,y.useState)(!1),p=(0,y.useRef)(null),m=j(e=>e.addToast),h=Re(e=>e.accounts),g=Re(e=>e.loadAccounts);(0,y.useEffect)(()=>{t===`account`&&h.length===0&&g()},[t]),(0,y.useEffect)(()=>{let e=e=>{p.current&&!p.current.contains(e.target)&&f(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[]);let _=h.filter(e=>{let t=s.toLowerCase();return!t||e.login.toLowerCase().includes(t)||(e.steam_id??``).includes(t)}).slice(0,12),v=async()=>{try{if(t===`secret`){if(!r.trim())return;o((await D.generate2FA(r.trim())).code)}else{if(!l)return;o((await D.generate2FAByAccount(l.id)).code)}}catch(t){o(e(`tools.genErrorStr`)),m(`error`,e(`misc.genError`,{error:t instanceof Error?t.message:String(t)}))}},b=async()=>{if(!a||a===e(`tools.genErrorStr`))return;let t=await He(a);m(t?`success`:`error`,e(t?`toast.copied`:`toast.copyFailed`))},x=e=>`flex-1 py-1.5 text-xs font-medium rounded transition-colors ${t===e?`bg-dark-600 text-gray-100`:`text-gray-500 hover:text-gray-300`}`;return(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-xl overflow-hidden flex flex-col`,children:[(0,L.jsxs)(`div`,{className:`px-4 py-3 border-b border-dark-600 flex items-center gap-2`,children:[(0,L.jsx)(ve,{size:14,className:`text-accent shrink-0`}),(0,L.jsx)(`span`,{className:`text-sm font-semibold text-gray-100`,children:e(`tools.2faGenerator`)})]}),(0,L.jsxs)(`div`,{className:`px-4 pt-3 pb-2`,children:[(0,L.jsxs)(`div`,{className:`flex gap-1 bg-dark-900 rounded p-0.5 mb-3`,children:[(0,L.jsx)(`button`,{type:`button`,className:x(`secret`),onClick:()=>n(`secret`),children:`Shared secret`}),(0,L.jsx)(`button`,{type:`button`,className:x(`account`),onClick:()=>n(`account`),children:`Из Mafile`})]}),t===`secret`?(0,L.jsxs)(`div`,{className:`flex gap-2`,children:[(0,L.jsx)(`input`,{value:r,onChange:e=>i(e.target.value),onKeyDown:e=>e.key===`Enter`&&v(),placeholder:`shared_secret`,className:`flex-1 bg-dark-700 border border-dark-600 rounded px-3 py-1.5 text-sm`}),(0,L.jsx)(`button`,{type:`button`,onClick:v,className:`btn-primary text-sm px-3 py-1.5`,children:e(`btn.generate`)})]}):(0,L.jsxs)(`div`,{className:`flex gap-2`,children:[(0,L.jsxs)(`div`,{className:`relative flex-1`,ref:p,children:[(0,L.jsx)(`input`,{value:l?`${l.login}${l.steam_id?` · `+l.steam_id:``}`:s,onChange:e=>{c(e.target.value),u(null),f(!0)},onFocus:()=>f(!0),placeholder:`Логин или SteamID...`,className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-1.5 text-sm`}),d&&_.length>0&&(0,L.jsx)(`div`,{className:`absolute top-full mt-1 left-0 right-0 bg-dark-800 border border-dark-600 rounded-lg shadow-xl z-50 max-h-48 overflow-y-auto`,children:_.map(e=>(0,L.jsxs)(`button`,{type:`button`,className:`w-full text-left px-3 py-1.5 text-sm hover:bg-dark-600 transition-colors flex items-center justify-between gap-2`,onMouseDown:()=>{u(e),c(``),f(!1)},children:[(0,L.jsx)(`span`,{className:`text-gray-200 truncate`,children:e.login}),e.steam_id&&(0,L.jsx)(`span`,{className:`text-gray-500 text-xs shrink-0`,children:e.steam_id})]},e.id))})]}),(0,L.jsx)(`button`,{type:`button`,onClick:v,disabled:!l,className:`btn-primary text-sm px-3 py-1.5 disabled:opacity-40 disabled:cursor-not-allowed`,children:e(`btn.generate`)})]}),a&&(0,L.jsx)(`div`,{className:`mt-3 text-2xl font-mono text-accent cursor-pointer tabular-nums tracking-widest`,onClick:b,title:e(`tools.clickCopy`),children:a})]})]})}var jt=[{value:`login:pass@ip:port`,label:`login:pass@ip:port`},{value:`login:pass:ip:port`,label:`login:pass:ip:port`},{value:`ip:port@login:pass`,label:`ip:port@login:pass`},{value:`ip:port:login:pass`,label:`ip:port:login:pass`}];function Mt(e,t,n,r){let i=e.trim();if(!i)return null;let a=n;for(let e of[`socks5://`,`socks4://`,`http://`,`https://`])if(i.toLowerCase().startsWith(e)){a=e.replace(`://`,``),i=i.slice(e.length);break}if(!i.includes(`@`)&&i.split(`:`).length===2)return{address:i,protocol:a};let o=``,s=``,c=``,l=``;if(t===`custom`&&r&&r.length>=4){let e=Nt(i,r);if(!e)return null;({ip:o,port:s,login:c,pass:l}=e)}else if(t===`login:pass@ip:port`){let e=i.indexOf(`@`);if(e===-1)return null;let t=i.slice(0,e),n=i.slice(e+1),r=t.split(`:`),a=n.split(`:`);if(r.length<2||a.length<2)return null;c=r[0],l=r.slice(1).join(`:`),o=a[0],s=a[1]}else if(t===`login:pass:ip:port`){let e=i.split(`:`);if(e.length<4)return null;c=e[0],l=e[1],o=e[2],s=e[3]}else if(t===`ip:port@login:pass`){let e=i.indexOf(`@`);if(e===-1)return null;let t=i.slice(0,e),n=i.slice(e+1),r=t.split(`:`),a=n.split(`:`);if(r.length<2||a.length<2)return null;o=r[0],s=r[1],c=a[0],l=a.slice(1).join(`:`)}else if(t===`ip:port:login:pass`){let e=i.split(`:`);if(e.length<4)return null;o=e[0],s=e[1],c=e[2],l=e[3]}return!o||!s?null:{address:c&&l?`${c}:${l}@${o}:${s}`:`${o}:${s}`,protocol:a}}function Nt(e,t){let n=[],r=[];for(let e=0;ee.addToast),x=F(),S=async()=>{try{t(await D.getProxies())}catch{}};(0,y.useEffect)(()=>{S()},[]);let C=async e=>{let t=e.split(` +`).filter(e=>e.trim());if(!t.length)return;let n=f?`custom`:c,i=[];for(let e of t){let t=Mt(e,n,u,f?m:void 0);t&&i.push(t)}if(!i.length){b(`error`,x(`toast.proxyFormatError`));return}try{b(`success`,x(`toast.proxiesAdded`,{count:(await D.bulkAddProxies(i)).added})),r(``),await S()}catch(e){b(`error`,x(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}},w=()=>C(n),T=async e=>{e.preventDefault(),_(!1);let t=e.dataTransfer.files[0];t&&await C(await t.text())},E=async e=>{let t=e.target.files?.[0];t&&(await C(await t.text()),e.target.value=``)},O=async e=>{try{await D.deleteProxy(e),await S()}catch(e){b(`error`,x(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}},ee=async()=>{if(e.length&&window.confirm(x(`proxy.confirmDeleteAll`)))try{b(`success`,x(`toast.proxiesDeleted`,{count:(await D.deleteAllProxies()).deleted})),s(``),await S()}catch(e){b(`error`,x(`misc.error`,{error:e instanceof Error?e.message:String(e)}))}},k=async()=>{a(!0),s(``);try{let e=await D.checkProxies();s(x(`proxy.checkResult`,{total:e.total,alive:e.alive,dead:e.dead})),await S()}catch(e){b(`error`,x(`misc.proxyErrorCheck`,{error:e instanceof Error?e.message:String(e)}))}finally{a(!1)}},A=(e,t)=>{let n=[...m];n[e]=t,h(n)},M=m.join(``);return(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-lg p-4`,children:[(0,L.jsxs)(`h3`,{className:`font-semibold mb-3`,children:[(0,L.jsx)(pe,{size:14,className:`inline mr-1`}),x(`proxy.title`),` `,(0,L.jsx)(`span`,{className:`text-xs text-gray-500 ml-2`,children:x(`proxy.count`,{count:e.length})})]}),(0,L.jsxs)(`div`,{className:`mb-3 space-y-2`,children:[(0,L.jsxs)(`div`,{className:`flex items-center gap-3 flex-wrap`,children:[(0,L.jsx)(`span`,{className:`text-xs text-gray-400`,children:x(`proxy.protocol`)}),(0,L.jsxs)(`select`,{value:u,onChange:e=>d(e.target.value),className:`bg-dark-700 border border-dark-600 rounded px-2 py-1 text-xs`,children:[(0,L.jsx)(`option`,{value:`http`,children:`HTTP`}),(0,L.jsx)(`option`,{value:`socks5`,children:`SOCKS5`})]}),(0,L.jsx)(`span`,{className:`text-xs text-gray-400`,children:x(`proxy.format`)}),(0,L.jsxs)(`select`,{value:f?`__custom__`:c,onChange:e=>{e.target.value===`__custom__`?p(!0):(p(!1),l(e.target.value))},className:`bg-dark-700 border border-dark-600 rounded px-2 py-1 text-xs`,children:[jt.map(e=>(0,L.jsx)(`option`,{value:e.value,children:e.label},e.value)),(0,L.jsx)(`option`,{value:`__custom__`,children:x(`proxy.customFormat`)})]})]}),f&&(0,L.jsxs)(`div`,{className:`bg-dark-700 border border-dark-600 rounded p-3 space-y-2`,children:[(0,L.jsx)(`p`,{className:`text-xs text-gray-400`,children:x(`proxy.formatConstructor`)}),(0,L.jsx)(`div`,{className:`flex items-center gap-1 flex-wrap`,children:m.map((e,t)=>t%2==0?(0,L.jsx)(`select`,{value:e,onChange:e=>A(t,e.target.value),className:`bg-dark-600 border border-dark-500 rounded px-2 py-1 text-xs text-accent`,children:Pt.map(e=>(0,L.jsx)(`option`,{value:e,children:e},e))},t):(0,L.jsx)(`select`,{value:e,onChange:e=>A(t,e.target.value),className:`bg-dark-600 border border-dark-500 rounded px-1 py-1 text-xs text-yellow-400 w-10 text-center`,children:Ft.map(e=>(0,L.jsx)(`option`,{value:e,children:e},e))},t))}),(0,L.jsxs)(`p`,{className:`text-xs text-gray-500`,children:[x(`proxy.preview`),` `,(0,L.jsx)(`span`,{className:`text-gray-300`,children:M})]})]})]}),(0,L.jsxs)(`div`,{onDragOver:e=>{e.preventDefault(),_(!0)},onDragLeave:()=>_(!1),onDrop:T,onClick:()=>v.current?.click(),className:`border-2 border-dashed rounded-lg p-4 mb-2 text-center cursor-pointer transition-colors ${g?`border-accent bg-accent/10`:`border-dark-500 hover:border-accent`}`,children:[(0,L.jsx)(ce,{size:24,className:`mx-auto mb-1 text-gray-500`}),(0,L.jsx)(`p`,{className:`text-xs text-gray-400`,children:x(`proxy.dragFile`)})]}),(0,L.jsx)(`input`,{ref:v,type:`file`,accept:`.txt`,className:`hidden`,onChange:E}),(0,L.jsx)(`textarea`,{value:n,onChange:e=>r(e.target.value),rows:4,placeholder:x(`proxy.perLine`,{format:f?M:c}),className:`w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm mb-2 resize-y`}),(0,L.jsxs)(`div`,{className:`flex gap-2 mb-3 flex-wrap`,children:[(0,L.jsx)(`button`,{onClick:w,className:`btn-primary`,children:x(`proxy.addBtn`)}),(0,L.jsx)(`button`,{onClick:k,disabled:i,className:`btn-secondary`,children:x(i?`proxy.checking`:`proxy.checkAll`)}),e.length>0&&(0,L.jsx)(`button`,{onClick:ee,className:`btn-danger text-xs`,children:x(`proxy.deleteAllBtn`)})]}),o&&(0,L.jsx)(`p`,{className:`text-xs text-gray-300 mb-3`,children:o}),e.length>0&&(()=>{let t=e.filter(e=>e.is_alive).length,n=e.length-t;return(0,L.jsxs)(`p`,{className:`text-xs text-gray-400 mb-3`,children:[(0,L.jsxs)(`span`,{className:`text-green-400`,children:[`● `,t]}),(0,L.jsx)(`span`,{className:`mx-2`,children:`/`}),(0,L.jsxs)(`span`,{className:`text-red-400`,children:[`● `,n]}),(0,L.jsx)(`span`,{className:`mx-2`,children:`/`}),(0,L.jsx)(`span`,{children:e.length})]})})(),(0,L.jsx)(`div`,{className:`max-h-48 overflow-y-auto space-y-1`,children:e.map(e=>(0,L.jsxs)(`div`,{className:`flex items-center justify-between text-xs gap-2 group px-2 py-1 rounded hover:bg-dark-700`,children:[(0,L.jsxs)(`span`,{className:`${e.is_alive?`text-green-400`:`text-red-400`} min-w-0 truncate`,children:[e.protocol,`://`,e.address]}),(0,L.jsx)(`button`,{onClick:()=>O(e.id),className:`text-red-400 hover:bg-red-400/20 rounded px-2 py-0.5 text-sm font-medium shrink-0 transition`,title:x(`proxy.deleteProxy`),children:`✕`})]},e.id))})]})}function Lt({checked:e,onChange:t}){return(0,L.jsxs)(`label`,{className:`toggle-switch`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>t(e.target.checked)}),(0,L.jsx)(`span`,{className:`toggle-track`})]})}function Rt({label:e,desc:t,checked:n,onChange:r}){return(0,L.jsxs)(`div`,{className:`flex items-center justify-between gap-4 py-2.5`,children:[(0,L.jsxs)(`div`,{className:`min-w-0`,children:[(0,L.jsx)(`p`,{className:`text-sm text-gray-200 leading-tight`,children:e}),t&&(0,L.jsx)(`p`,{className:`text-xs text-gray-500 mt-0.5`,children:t})]}),(0,L.jsx)(Lt,{checked:n,onChange:r})]})}function zt({value:e,onChange:t}){let[n,r]=(0,y.useState)(!1),[i,a]=(0,y.useState)(``),o=(0,y.useRef)(null),s=e=>Math.max(1,e),c=()=>{t(s(parseInt(i)||e)),r(!1)},l=`h-6 px-1.5 rounded bg-dark-700 border border-dark-600 text-gray-300 hover:bg-dark-600 text-xs flex items-center justify-center select-none leading-none`;return(0,L.jsxs)(`div`,{className:`flex items-center gap-3 pt-3 mt-0.5`,children:[(0,L.jsx)(`span`,{className:`text-sm text-gray-400 flex-1`,title:`Двойной клик на числе для ручного ввода`,children:`Max threads`}),(0,L.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,L.jsx)(`button`,{type:`button`,className:l,onClick:()=>t(s(e-10)),children:`-10`}),(0,L.jsx)(`button`,{type:`button`,className:l,onClick:()=>t(s(e-1)),children:`-1`}),n?(0,L.jsx)(`input`,{ref:o,autoFocus:!0,value:i,onChange:e=>a(e.target.value),onBlur:c,onKeyDown:e=>{e.key===`Enter`&&c(),e.key===`Escape`&&r(!1)},className:`w-10 text-center text-sm font-mono bg-dark-900 border border-accent rounded outline-none text-gray-100 py-0.5`}):(0,L.jsx)(`span`,{className:`w-10 text-center text-sm font-mono text-gray-100 cursor-pointer select-none`,onDoubleClick:()=>{a(String(e)),r(!0)},title:`Двойной клик для ручного ввода`,children:e}),(0,L.jsx)(`button`,{type:`button`,className:l,onClick:()=>t(s(e+1)),children:`+1`}),(0,L.jsx)(`button`,{type:`button`,className:l,onClick:()=>t(s(e+10)),children:`+10`})]})]})}function Bt(){let e=F(),[t,n]=(0,y.useState)({fetch_profile:!0,check_ban:!0,max_threads:5,auto_revalidate_browser:!0}),r=j(e=>e.hidePasswords),i=j(e=>e.setHidePasswords),a=j(e=>e.addToast);return(0,y.useEffect)(()=>{D.getValidationSettings().then(n).catch(()=>{})},[]),(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-xl overflow-hidden flex flex-col`,children:[(0,L.jsxs)(`div`,{className:`px-5 py-3.5 border-b border-dark-600 flex items-center gap-2.5`,children:[(0,L.jsx)(be,{size:15,className:`text-accent shrink-0`}),(0,L.jsx)(`span`,{className:`text-sm font-semibold text-gray-100`,children:`Settings`})]}),(0,L.jsxs)(`div`,{className:`px-5 pt-4 pb-3 border-b border-dark-600`,children:[(0,L.jsx)(`p`,{className:`text-[10px] font-semibold text-gray-500 uppercase tracking-widest mb-0.5`,children:e(`tools.validationSettings`)}),(0,L.jsxs)(`div`,{className:`divide-y divide-dark-600/60`,children:[(0,L.jsx)(Rt,{label:e(`tools.loadProfile`),checked:t.fetch_profile,onChange:e=>n({...t,fetch_profile:e})}),(0,L.jsx)(Rt,{label:e(`tools.checkBans`),checked:t.check_ban,onChange:e=>n({...t,check_ban:e})}),(0,L.jsx)(Rt,{label:e(`tools.autoRevalidateBrowser`),checked:t.auto_revalidate_browser,onChange:e=>n({...t,auto_revalidate_browser:e})})]}),(0,L.jsx)(zt,{value:t.max_threads,onChange:e=>n(t=>({...t,max_threads:e}))})]}),(0,L.jsxs)(`div`,{className:`px-5 pt-4 pb-3`,children:[(0,L.jsx)(`p`,{className:`text-[10px] font-semibold text-gray-500 uppercase tracking-widest mb-0.5`,children:e(`settings.display`)}),(0,L.jsx)(Rt,{label:e(`settings.hidePasswords`),checked:r,onChange:i})]}),(0,L.jsx)(`div`,{className:`px-5 py-3 border-t border-dark-600 flex justify-end`,children:(0,L.jsx)(`button`,{onClick:async()=>{try{await D.updateValidationSettings(t),a(`success`,e(`toast.settingsSaved`))}catch(t){a(`error`,e(`misc.error`,{error:t instanceof Error?t.message:String(t)}))}},className:`btn-primary`,children:e(`btn.save`)})})]})}function Vt(){return(0,L.jsxs)(`div`,{className:`max-w-5xl mx-auto flex flex-col gap-4`,children:[(0,L.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-2 gap-4`,children:[(0,L.jsx)(At,{}),(0,L.jsx)(Bt,{})]}),(0,L.jsx)(It,{})]})}var Ht=[`shared_secret`,`serial_number`,`revocation_code`,`uri`,`account_name`,`token_gid`,`identity_secret`,`secret_1`,`device_id`,`server_time`,`fully_enrolled`],Ut=[`SessionID`,`AccessToken`,`RefreshToken`,`SteamID`,`SteamLoginSecure`],Wt=[{value:`{username}`,label:`username`},{value:`{steamid}`,label:`steamid`}];function Gt({accountIds:e,onExport:t}){let n=F(),[r,i]=(0,y.useState)(new Set(Ht)),[a,o]=(0,y.useState)(new Set(Ut)),[s,c]=(0,y.useState)(`per_account_folder`),[l,u]=(0,y.useState)(`{username}`),[d,f]=(0,y.useState)(`{steamid}.mafile`),[p,m]=(0,y.useState)(`{username}.txt`),[h,g]=(0,y.useState)(!1),[_,v]=(0,y.useState)(!1),[b,x]=(0,y.useState)(!1),[S,C]=(0,y.useState)(`{login}:{password}:{email}:{email_password}`),w=(e,t,n)=>{let r=new Set(e);r.has(t)?r.delete(t):r.add(t),n(r)},T=(e,t)=>{e(e=>e+t)};return(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-lg p-4 space-y-4`,children:[(0,L.jsxs)(`h4`,{className:`font-semibold text-sm`,children:[(0,L.jsx)(we,{size:14,className:`inline mr-1`}),n(`mafile.exportSettings`)]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`p`,{className:`text-xs text-gray-400 mb-1`,children:n(`mafile.exportFormat`)}),(0,L.jsxs)(`select`,{value:s,onChange:e=>{let t=e.target.value;c(t),t===`single_file`&&(v(!1),x(!1))},className:`bg-dark-700 border border-dark-600 rounded px-2 py-1 text-sm`,children:[(0,L.jsx)(`option`,{value:`flat_mafiles`,children:n(`mafile.flatFiles`)}),(0,L.jsx)(`option`,{value:`per_account_folder`,children:n(`mafile.perAccountFolder`)}),(0,L.jsx)(`option`,{value:`single_file`,children:n(`mafile.singleFile`)})]})]}),s!==`single_file`&&(0,L.jsxs)(`div`,{className:`space-y-3 border border-dark-600 rounded-lg p-3`,children:[(0,L.jsxs)(`p`,{className:`text-xs text-gray-400 font-medium`,children:[n(`mafile.variables`),` `,(0,L.jsx)(`code`,{className:`text-accent`,children:`{username}`}),`, `,(0,L.jsx)(`code`,{className:`text-accent`,children:`{steamid}`})]}),s===`per_account_folder`&&(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`label`,{className:`text-xs text-gray-400 block mb-1`,children:n(`mafile.folderName`)}),(0,L.jsxs)(`div`,{className:`flex gap-1`,children:[(0,L.jsx)(`input`,{value:l,onChange:e=>u(e.target.value),className:`flex-1 bg-dark-700 border border-dark-600 rounded px-2 py-1 text-sm font-mono`}),Wt.map(e=>(0,L.jsx)(`button`,{onClick:()=>T(u,e.value),className:`btn-secondary px-2 py-1 text-xs`,title:n(`mafile.insert`,{value:e.value}),children:e.label},e.value))]})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`label`,{className:`text-xs text-gray-400 block mb-1`,children:n(`mafile.mafileName`)}),(0,L.jsxs)(`div`,{className:`flex gap-1`,children:[(0,L.jsx)(`input`,{value:d,onChange:e=>f(e.target.value),className:`flex-1 bg-dark-700 border border-dark-600 rounded px-2 py-1 text-sm font-mono`}),Wt.map(e=>(0,L.jsx)(`button`,{onClick:()=>T(f,e.value),className:`btn-secondary px-2 py-1 text-xs`,title:n(`mafile.insert`,{value:e.value}),children:e.label},e.value))]})]})]}),(0,L.jsxs)(`div`,{className:`space-y-2 border border-dark-600 rounded-lg p-3`,children:[(0,L.jsxs)(`p`,{className:`text-xs text-gray-400 font-medium`,children:[(0,L.jsx)(Te,{size:12,className:`inline mr-1`}),n(`mafile.txtSettings`)]}),s!==`single_file`&&(0,L.jsxs)(L.Fragment,{children:[(0,L.jsxs)(`label`,{className:`flex items-center gap-2 text-sm cursor-pointer`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:_,onChange:e=>{v(e.target.checked),e.target.checked||x(!1)}}),n(`mafile.addGlobalTxt`),` `,(0,L.jsx)(`code`,{className:`text-accent text-xs`,children:`accounts.txt`}),` `,n(`mafile.withAllAccounts`)]}),s===`per_account_folder`&&(0,L.jsxs)(`label`,{className:`flex items-center gap-2 text-sm cursor-pointer`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:h,onChange:e=>g(e.target.checked)}),n(`mafile.addTxtPerFolder`)]}),(0,L.jsxs)(`label`,{className:`flex items-center gap-2 text-sm ${_?`cursor-pointer`:`cursor-not-allowed opacity-40`}`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:b,disabled:!_,onChange:e=>x(e.target.checked)}),n(`mafile.skipFolders`)]})]}),(_||h||s===`single_file`)&&(0,L.jsxs)(L.Fragment,{children:[s===`per_account_folder`&&h&&(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`label`,{className:`text-xs text-gray-400 block mb-1`,children:n(`mafile.txtFolderName`)}),(0,L.jsxs)(`div`,{className:`flex gap-1`,children:[(0,L.jsx)(`input`,{value:p,onChange:e=>m(e.target.value),className:`flex-1 bg-dark-700 border border-dark-600 rounded px-2 py-1 text-sm font-mono`}),Wt.map(e=>(0,L.jsx)(`button`,{onClick:()=>T(m,e.value),className:`btn-secondary px-2 py-1 text-xs`,children:e.label},e.value))]})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`label`,{className:`text-xs text-gray-400 block mb-1`,children:n(`mafile.txtLineFormat`)}),(0,L.jsx)(`input`,{value:S,onChange:e=>C(e.target.value),className:`w-full bg-dark-700 border border-dark-600 rounded px-2 py-1 text-sm font-mono`}),(0,L.jsxs)(`p`,{className:`text-xs text-gray-500 mt-1`,children:[n(`mafile.variables`),` `,(0,L.jsx)(`code`,{className:`text-accent`,children:`{login}`}),` `,(0,L.jsx)(`code`,{className:`text-accent`,children:`{password}`}),` `,(0,L.jsx)(`code`,{className:`text-accent`,children:`{email}`}),` `,(0,L.jsx)(`code`,{className:`text-accent`,children:`{email_password}`}),` `,(0,L.jsx)(`code`,{className:`text-accent`,children:`{steam_id}`}),` `,(0,L.jsx)(`code`,{className:`text-accent`,children:`{proxy}`}),` `,(0,L.jsx)(`code`,{className:`text-accent`,children:`{mafile}`})]})]})]})]}),(0,L.jsxs)(`details`,{className:`group`,children:[(0,L.jsxs)(`summary`,{className:`text-xs text-gray-400 cursor-pointer hover:text-gray-300 transition-colors flex items-center gap-1`,children:[(0,L.jsx)(Pe,{size:12,className:`transition-transform group-open:rotate-90`}),n(`mafile.mafileFields`),` (`,r.size,`/`,Ht.length,`)`]}),(0,L.jsx)(`div`,{className:`flex flex-wrap gap-2 mt-2`,children:Ht.map(e=>(0,L.jsxs)(`label`,{className:`flex items-center gap-1 text-xs cursor-pointer`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:r.has(e),onChange:()=>w(r,e,i)}),e]},e))})]}),(0,L.jsxs)(`details`,{className:`group`,children:[(0,L.jsxs)(`summary`,{className:`text-xs text-gray-400 cursor-pointer hover:text-gray-300 transition-colors flex items-center gap-1`,children:[(0,L.jsx)(Pe,{size:12,className:`transition-transform group-open:rotate-90`}),n(`mafile.sessionFields`),` (`,a.size,`/`,Ut.length,`)`]}),(0,L.jsx)(`div`,{className:`flex flex-wrap gap-2 mt-2`,children:Ut.map(e=>(0,L.jsxs)(`label`,{className:`flex items-center gap-1 text-xs cursor-pointer`,children:[(0,L.jsx)(`input`,{type:`checkbox`,checked:a.has(e),onChange:()=>w(a,e,o)}),e]},e))})]}),(0,L.jsxs)(`button`,{onClick:()=>{t({fields:[...r],session_fields:[...a],format:s,account_ids:e,folder_name_template:l,mafile_name_template:d,txt_name_template:p,include_txt_per_folder:h,include_global_txt:_,skip_folders:b,txt_format:S})},disabled:e.length===0,className:e.length===0?`btn-primary opacity-50 cursor-not-allowed`:`btn-primary`,children:[(0,L.jsx)(se,{size:14,className:`inline mr-1`}),n(`mafile.export`),` (`,e.length>0?e.length:n(`mafile.noAccounts`),`)`]})]})}function Kt(){let e=F(),t=Re(e=>e.accounts),n=Re(e=>e.mafileManagerIds),r=Re(e=>e.clearMafileManager),i=j(e=>e.addToast),a=t.filter(e=>n.has(e.id)),o=async t=>{try{let n=await D.exportZip(t),r=URL.createObjectURL(n),a=document.createElement(`a`);a.href=r,a.download=`mafiles_export.zip`,a.click(),URL.revokeObjectURL(r),i(`success`,e(`toast.exportDone`))}catch(t){i(`error`,e(`misc.exportError`,{error:t instanceof Error?t.message:String(t)}))}};return(0,L.jsxs)(`div`,{className:`space-y-4 h-full overflow-y-auto pr-1`,children:[a.length>0&&(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-lg p-4`,children:[(0,L.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,L.jsxs)(`h3`,{className:`font-semibold`,children:[(0,L.jsx)(Ee,{size:14,className:`inline mr-1`}),e(`mafile.sentAccounts`),` (`,a.length,`)`]}),(0,L.jsx)(`button`,{onClick:r,className:`btn-danger-outline text-xs`,children:e(`mafile.clearBtn`)})]}),(0,L.jsx)(`div`,{className:`max-h-48 overflow-y-auto space-y-1`,children:a.map(e=>(0,L.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-gray-300 min-w-0`,children:[e.avatar_url&&(0,L.jsx)(`img`,{src:e.avatar_url,className:`avatar-sm shrink-0`,alt:``}),(0,L.jsx)(`span`,{className:`truncate`,children:e.login}),(0,L.jsx)(`span`,{className:`text-gray-500 truncate`,children:e.steam_id||``}),(0,L.jsx)(`span`,{className:e.mafile_path?`text-green-400`:`text-gray-500`,children:e.mafile_path?`✓ mafile`:`—`})]},e.id))})]}),(0,L.jsx)(Gt,{accountIds:[...n],onExport:o})]})}function qt(e,t,n=!0){let r=(0,y.useRef)(t);r.current=t,(0,y.useEffect)(()=>{if(!n)return;let t=new EventSource(e);return t.onmessage=e=>{try{r.current(JSON.parse(e.data))}catch{}},t.onerror=()=>{t.close()},()=>t.close()},[e,n])}function Jt(){let[e,t]=(0,y.useState)([]),n=(0,y.useRef)(null),r=(0,y.useRef)(!0);(0,y.useEffect)(()=>{D.getLogs().then(t).catch(()=>{})},[]),qt(`/api/logs/stream`,e=>{t(t=>{let n=[...t,e];return n.length>500&&n.splice(0,n.length-500),n})}),(0,y.useEffect)(()=>{r.current&&n.current&&(n.current.scrollTop=n.current.scrollHeight)},[e]);let i=()=>{if(!n.current)return;let{scrollTop:e,scrollHeight:t,clientHeight:i}=n.current;r.current=t-e-i<40},a=e=>{switch(e){case`error`:case`critical`:return`text-red-400`;case`warning`:return`text-yellow-400`;case`success`:return`text-green-400`;case`debug`:return`text-gray-500`;default:return`text-gray-300`}};return(0,L.jsxs)(`div`,{className:`bg-dark-800 border border-dark-600 rounded-lg flex flex-col`,style:{maxHeight:`calc(100vh - 200px)`},children:[(0,L.jsxs)(`div`,{className:`px-3 py-2 border-b border-dark-600 flex items-center justify-between shrink-0`,children:[(0,L.jsx)(`h3`,{className:`font-semibold text-sm`,children:`📜 Лог`}),(0,L.jsx)(`button`,{onClick:()=>t([]),className:`text-xs text-gray-500 hover:text-gray-300 transition-colors`,children:`Очистить`})]}),(0,L.jsxs)(`div`,{ref:n,onScroll:i,className:`flex-1 overflow-y-auto min-h-0 p-2 font-mono text-xs space-y-px`,children:[e.map((e,t)=>(0,L.jsxs)(`div`,{className:`flex gap-2`,children:[(0,L.jsx)(`span`,{className:`text-gray-600 shrink-0`,children:e.ts}),(0,L.jsx)(`span`,{className:`shrink-0 w-3 text-center ${a(e.level)}`,children:e.icon}),(0,L.jsx)(`span`,{className:`${a(e.level)} break-all min-w-0`,children:e.msg})]},t)),e.length===0&&(0,L.jsx)(`p`,{className:`text-gray-600 text-center py-4`,children:`Нет логов`})]})]})}function Yt(){return(0,L.jsx)(Jt,{})}function Xt(){let e=j(e=>e.activeTab),t=j(e=>e.loadDisplaySettings),n=j(e=>e.loadColumnSettings),r=j(e=>e.loadLogpassColumnSettings);return(0,y.useEffect)(()=>{t(),n(),r()},[]),(0,L.jsxs)(`div`,{className:`h-dvh bg-dark-900 text-gray-300 flex flex-col overflow-hidden`,children:[(0,L.jsx)(oe,{}),(0,L.jsx)(Ie,{}),(0,L.jsxs)(`main`,{className:`flex-1 min-h-0 p-4 w-full overflow-y-auto`,children:[e===`accounts`&&(0,L.jsx)(kt,{}),e===`tools`&&(0,L.jsx)(Vt,{}),e===`mafiles`&&(0,L.jsx)(Kt,{}),e===`logs`&&(0,L.jsx)(Yt,{})]}),(0,L.jsx)(Le,{})]})}var Zt=class extends y.Component{state={error:null};static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error(`React crash:`,e,t)}render(){let{error:e}=this.state;return e?(0,L.jsxs)(`div`,{style:{padding:32,fontFamily:`monospace`,background:`#0f0f0f`,color:`#f87171`,minHeight:`100vh`},children:[(0,L.jsx)(`h2`,{style:{fontSize:18,marginBottom:12},children:`⚠ SteamPanel failed to start`}),(0,L.jsxs)(`pre`,{style:{whiteSpace:`pre-wrap`,fontSize:13,color:`#fca5a5`},children:[e.message,` + +`,e.stack]}),(0,L.jsx)(`p`,{style:{marginTop:16,color:`#9ca3af`,fontSize:12},children:`Open browser console (F12) for more details, or report this error.`})]}):this.props.children}};(0,w.createRoot)(document.getElementById(`root`)).render((0,L.jsx)(y.StrictMode,{children:(0,L.jsx)(Zt,{children:(0,L.jsx)(Xt,{})})})); \ No newline at end of file diff --git a/app/static/assets/index-Cm89176E.css b/app/static/assets/index-Cm89176E.css new file mode 100644 index 0000000..5c84a32 --- /dev/null +++ b/app/static/assets/index-Cm89176E.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-dark-900:#0f0f0f;--color-dark-800:#1a1a1a;--color-dark-700:#252525;--color-dark-600:#333;--color-accent:#4f8cff;--color-accent-hover:#6ba0ff;--color-accent-dim:#3a6fd8}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-50{z-index:50}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:calc(var(--spacing) * 1)}.-mb-px{margin-bottom:-1px}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-dvh{height:100dvh}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-\[320px\]{max-height:320px}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[300px\]{min-height:300px}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-7{width:calc(var(--spacing) * 7)}.w-10{width:calc(var(--spacing) * 10)}.w-28{width:calc(var(--spacing) * 28)}.w-36{width:calc(var(--spacing) * 36)}.w-80{width:calc(var(--spacing) * 80)}.w-96{width:calc(var(--spacing) * 96)}.w-full{width:100%}.max-w-5xl{max-width:var(--container-5xl)}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[100px\]{min-width:100px}.min-w-\[160px\]{min-width:160px}.min-w-\[170px\]{min-width:170px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.rotate-180{rotate:180deg}.animate-spin{animation:var(--animate-spin)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1px * var(--tw-space-y-reverse));margin-block-end:calc(1px * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-dark-600\/60>:not(:last-child)){border-color:#3339}@supports (color:color-mix(in lab, red, red)){:where(.divide-dark-600\/60>:not(:last-child)){border-color:color-mix(in oklab, var(--color-dark-600) 60%, transparent)}}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent{border-color:var(--color-accent)}.border-blue-500\/30{border-color:#3080ff4d}@supports (color:color-mix(in lab, red, red)){.border-blue-500\/30{border-color:color-mix(in oklab, var(--color-blue-500) 30%, transparent)}}.border-dark-600{border-color:var(--color-dark-600)}.border-dark-700{border-color:var(--color-dark-700)}.border-transparent{border-color:#0000}.border-yellow-500\/40{border-color:#edb20066}@supports (color:color-mix(in lab, red, red)){.border-yellow-500\/40{border-color:color-mix(in oklab, var(--color-yellow-500) 40%, transparent)}}.border-yellow-500\/50{border-color:#edb20080}@supports (color:color-mix(in lab, red, red)){.border-yellow-500\/50{border-color:color-mix(in oklab, var(--color-yellow-500) 50%, transparent)}}.border-t-transparent{border-top-color:#0000}.bg-accent{background-color:var(--color-accent)}.bg-accent\/10{background-color:#4f8cff1a}@supports (color:color-mix(in lab, red, red)){.bg-accent\/10{background-color:color-mix(in oklab, var(--color-accent) 10%, transparent)}}.bg-accent\/20{background-color:#4f8cff33}@supports (color:color-mix(in lab, red, red)){.bg-accent\/20{background-color:color-mix(in oklab, var(--color-accent) 20%, transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-blue-600\/20{background-color:#155dfc33}@supports (color:color-mix(in lab, red, red)){.bg-blue-600\/20{background-color:color-mix(in oklab, var(--color-blue-600) 20%, transparent)}}.bg-dark-600{background-color:var(--color-dark-600)}.bg-dark-600\/50{background-color:#33333380}@supports (color:color-mix(in lab, red, red)){.bg-dark-600\/50{background-color:color-mix(in oklab, var(--color-dark-600) 50%, transparent)}}.bg-dark-700{background-color:var(--color-dark-700)}.bg-dark-800{background-color:var(--color-dark-800)}.bg-dark-900{background-color:var(--color-dark-900)}.bg-dark-900\/80{background-color:#0f0f0fcc}@supports (color:color-mix(in lab, red, red)){.bg-dark-900\/80{background-color:color-mix(in oklab, var(--color-dark-900) 80%, transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-red-500{background-color:var(--color-red-500)}.fill-white{fill:var(--color-white)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.text-accent{color:var(--color-accent)}.text-blue-400{color:var(--color-blue-400)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-green-400{color:var(--color-green-400)}.text-red-400{color:var(--color-red-400)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500\/80{color:#edb200cc}@supports (color:color-mix(in lab, red, red)){.text-yellow-500\/80{color:color-mix(in oklab, var(--color-yellow-500) 80%, transparent)}}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.accent-yellow-500{accent-color:var(--color-yellow-500)}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}@media (hover:hover){.group-hover\:text-gray-300:is(:where(.group):hover *){color:var(--color-gray-300)}}.placeholder\:text-gray-500::placeholder{color:var(--color-gray-500)}@media (hover:hover){.hover\:border-accent:hover{border-color:var(--color-accent)}.hover\:border-gray-500:hover{border-color:var(--color-gray-500)}.hover\:bg-blue-600\/40:hover{background-color:#155dfc66}@supports (color:color-mix(in lab, red, red)){.hover\:bg-blue-600\/40:hover{background-color:color-mix(in oklab, var(--color-blue-600) 40%, transparent)}}.hover\:bg-dark-600:hover{background-color:var(--color-dark-600)}.hover\:bg-dark-700:hover{background-color:var(--color-dark-700)}.hover\:bg-dark-700\/50:hover{background-color:#25252580}@supports (color:color-mix(in lab, red, red)){.hover\:bg-dark-700\/50:hover{background-color:color-mix(in oklab, var(--color-dark-700) 50%, transparent)}}.hover\:bg-red-400\/20:hover{background-color:#ff656833}@supports (color:color-mix(in lab, red, red)){.hover\:bg-red-400\/20:hover{background-color:color-mix(in oklab, var(--color-red-400) 20%, transparent)}}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-gray-300:hover{color:var(--color-gray-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-accent:focus{border-color:var(--color-accent)}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}.avatar-sm{object-fit:cover;border-radius:3px;flex-shrink:0;width:24px;height:24px}.steam-lvl{color:#e5e5e5;border:1.5px solid #9b9b9b;border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;width:18px;height:18px;font-size:10px;font-weight:600;display:inline-flex}.steam-lvl.l10{border-color:#c02942}.steam-lvl.l20{border-color:#d95b43}.steam-lvl.l30{border-color:#fecc23}.steam-lvl.l40{border-color:#467a3c}.steam-lvl.l50{border-color:#4e8ddb}.steam-lvl.l60{border-color:#7652c9}.steam-lvl.l70{border-color:#c252c9}.steam-lvl.l80{border-color:#542437}.steam-lvl.l90{border-color:#997c52}.steam-lvl.l100p{text-shadow:1px 1px #1a1a1a;background-position:0 0;background-repeat:no-repeat;background-size:contain;border:none;border-radius:0;width:20px;height:20px;font-size:9px}.steam-lvl.l100p.img-100{background-image:url(https://community.fastly.steamstatic.com/public/shared/images/community/levels_hexagons.png)}.steam-lvl.l100p.img-200{background-image:url(https://community.fastly.steamstatic.com/public/shared/images/community/levels_shields.png)}.steam-lvl.l100p.img-300{background-image:url(https://community.fastly.steamstatic.com/public/shared/images/community/levels_books.png)}.steam-lvl.l100p.img-400{background-image:url(https://community.fastly.steamstatic.com/public/shared/images/community/levels_chevrons.png)}.steam-lvl.l100p.img-500{background-image:url(https://community.fastly.steamstatic.com/public/shared/images/community/levels_circle2.png)}.steam-lvl.l100p.img-600{background-image:url(https://community.fastly.steamstatic.com/public/shared/images/community/levels_angle.png)}.steam-lvl.l100p.img-700{background-image:url(https://community.fastly.steamstatic.com/public/shared/images/community/levels_flag.png)}.steam-lvl.l100p.img-800{background-image:url(https://community.fastly.steamstatic.com/public/shared/images/community/levels_wings.png)}.steam-lvl.l100p.img-900{background-image:url(https://community.fastly.steamstatic.com/public/shared/images/community/levels_arrows.png)}.btn-primary{cursor:pointer;background-color:var(--color-accent);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-white);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:.25rem}@media (hover:hover){.btn-primary:hover{background-color:var(--color-accent-hover)}}.btn-secondary{cursor:pointer;border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-dark-600);background-color:var(--color-dark-700);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-gray-300);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:.25rem}@media (hover:hover){.btn-secondary:hover{background-color:var(--color-dark-600)}}.btn-accent{cursor:pointer;background-color:var(--color-accent-dim);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-white);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border-radius:.25rem}@media (hover:hover){.btn-accent:hover{background-color:var(--color-accent)}}.btn-danger{cursor:pointer;border-style:var(--tw-border-style);border-width:1px;border-color:#e400144d;border-radius:.25rem}@supports (color:color-mix(in lab, red, red)){.btn-danger{border-color:color-mix(in oklab, var(--color-red-600) 30%, transparent)}}.btn-danger{background-color:#e4001433}@supports (color:color-mix(in lab, red, red)){.btn-danger{background-color:color-mix(in oklab, var(--color-red-600) 20%, transparent)}}.btn-danger{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-red-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn-danger:hover{background-color:#e400144d}@supports (color:color-mix(in lab, red, red)){.btn-danger:hover{background-color:color-mix(in oklab, var(--color-red-600) 30%, transparent)}}}.btn-danger-outline{cursor:pointer;border-style:var(--tw-border-style);border-width:1px;border-color:#e400144d;border-radius:.25rem}@supports (color:color-mix(in lab, red, red)){.btn-danger-outline{border-color:color-mix(in oklab, var(--color-red-600) 30%, transparent)}}.btn-danger-outline{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--color-red-400);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));background-color:#0000}@media (hover:hover){.btn-danger-outline:hover{background-color:#e400141a}@supports (color:color-mix(in lab, red, red)){.btn-danger-outline:hover{background-color:color-mix(in oklab, var(--color-red-600) 10%, transparent)}}}.badge{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);border-radius:.25rem;display:inline-block}.badge-ok{background-color:#00c75833}@supports (color:color-mix(in lab, red, red)){.badge-ok{background-color:color-mix(in oklab, var(--color-green-500) 20%, transparent)}}.badge-ok{color:var(--color-green-400)}.badge-error{background-color:#fb2c3633}@supports (color:color-mix(in lab, red, red)){.badge-error{background-color:color-mix(in oklab, var(--color-red-500) 20%, transparent)}}.badge-error{color:var(--color-red-400)}.badge-running{background-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.badge-running{background-color:color-mix(in oklab, var(--color-blue-500) 20%, transparent)}}.badge-running{color:var(--color-blue-400)}.badge-unknown{background-color:#6a728233}@supports (color:color-mix(in lab, red, red)){.badge-unknown{background-color:color-mix(in oklab, var(--color-gray-500) 20%, transparent)}}.badge-unknown{color:var(--color-gray-500)}.progress-bar{height:calc(var(--spacing) * 1.5);background-color:var(--color-dark-600);border-radius:3.40282e38px;width:100%;overflow:hidden}.progress-fill{background-color:var(--color-accent);height:100%;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;border-radius:3.40282e38px;transition-duration:.3s}.cell-copy{cursor:pointer;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));-webkit-user-select:all;user-select:all}@media (hover:hover){.cell-copy:hover{color:var(--color-gray-200)}}.copy-tooltip{color:#fff;pointer-events:none;z-index:9999;background:#333;border-radius:4px;padding:2px 8px;font-size:11px;transition:opacity .2s;position:fixed;transform:translate(-50%,-100%)}[data-tooltip]{position:relative}button[disabled][data-tooltip]{pointer-events:auto}[data-tooltip]:after{content:attr(data-tooltip);color:#f0f0f8;white-space:nowrap;pointer-events:none;opacity:0;z-index:9999;background:#0f0f1a;border:1px solid #6b6b8a;border-radius:5px;padding:5px 10px;font-size:12px;font-weight:500;transition:opacity .15s;position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%);box-shadow:0 4px 12px #0009}[data-tooltip]:hover:after{opacity:1}.popup-2fa{z-index:100;background:var(--color-dark-700);border:1px solid var(--color-dark-600);border-radius:8px;padding:8px 14px;position:fixed;box-shadow:0 4px 16px #0006}.popup-2fa-code{color:var(--color-accent);cursor:pointer;-webkit-user-select:all;user-select:all;font-family:monospace;font-size:1.5rem}.action-menu-dropdown{z-index:50;border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-dark-600);background-color:var(--color-dark-700);min-width:180px;padding-block:calc(var(--spacing) * 1);--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.action-menu-item{cursor:pointer;width:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1.5);text-align:left;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-gray-300);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));display:block}@media (hover:hover){.action-menu-item:hover{background-color:var(--color-dark-600);color:var(--color-white)}}.confirm-overlay{inset:calc(var(--spacing) * 0);z-index:50;background-color:#0009;justify-content:center;align-items:center;display:flex;position:fixed}@supports (color:color-mix(in lab, red, red)){.confirm-overlay{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.confirm-box{width:100%;max-width:var(--container-md);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-dark-600);background-color:var(--color-dark-800);padding:calc(var(--spacing) * 6);--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);overflow-wrap:break-word;word-break:break-word}.toast-container{z-index:9999;pointer-events:none;flex-direction:column-reverse;gap:.5rem;display:flex;position:fixed;bottom:1rem;left:1rem}.toast{pointer-events:auto;color:#fff;border-radius:.375rem;padding:.5rem 1rem;font-size:.8rem;transition:opacity .3s;animation:.25s ease-out toastIn;box-shadow:0 2px 8px #0000004d}.toast-info{background:#2563eb}.toast-success{background:#16a34a}.toast-error{background:#dc2626}.toast-warn{background:#d97706}@keyframes toastIn{0%{opacity:0;transform:translate(-30px)}to{opacity:1;transform:translate(0)}}@keyframes shimmer{0%{stroke-dashoffset:80px}to{stroke-dashoffset:-80px}}.icon-shimmer{stroke:#ffffff73;stroke-dasharray:8 72;animation:2.5s linear infinite shimmer}.toggle-switch{cursor:pointer;flex-shrink:0;align-items:center;width:38px;height:22px;display:inline-flex;position:relative}.toggle-switch input{opacity:0;width:0;height:0;position:absolute}.toggle-track{background:#2a2a2a;border:1px solid #444;border-radius:999px;transition:background .2s,border-color .2s;position:absolute;inset:0}.toggle-track:before{content:"";background:#666;border-radius:50%;width:16px;height:16px;transition:transform .2s,background .2s;position:absolute;top:2px;left:2px}.toggle-switch input:checked~.toggle-track{background:#4f8cff;border-color:#4f8cff}.toggle-switch input:checked~.toggle-track:before{background:#fff;transform:translate(16px)}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--color-dark-900)}::-webkit-scrollbar-thumb{background:var(--color-dark-600);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#555}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}} diff --git a/app/static/favicon.svg b/app/static/favicon.svg new file mode 100644 index 0000000..d47ee23 --- /dev/null +++ b/app/static/favicon.svg @@ -0,0 +1,4 @@ + + Steam + + \ No newline at end of file diff --git a/app/static/index.html b/app/static/index.html new file mode 100644 index 0000000..af98d4e --- /dev/null +++ b/app/static/index.html @@ -0,0 +1,14 @@ + + + + + + + SteamPanel + + + + +

+ + diff --git a/assets/README_EN.md b/assets/README_EN.md new file mode 100644 index 0000000..17750a0 --- /dev/null +++ b/assets/README_EN.md @@ -0,0 +1,97 @@ +![SteamPanel](steampanel_en.png) + +# SteamPanel + +> [Русская версия](../README.md) | **Author:** [@lolzdm](https://t.me/lolzdm) + +Self-hosted web panel for bulk Steam account management. FastAPI + SQLite backend, React frontend. Operations run in parallel, proxy support included, real-time task progress via SSE. + +Supports **3 account types**: +- **Mafile** — full accounts with secrets (shared_secret, identity_secret) +- **Log:Pass** — login + password +- **Token** — access/refresh tokens *(work in progress, not functional)* + +--- + +## Features + +**Accounts** +- Import from `.txt`: `login:pass`, `login:pass:email:email_pass`, with mafile — any format +- Bulk operations on selected or all accounts +- Search by login, Steam ID, notes, level (`lvl>10`) +- Configurable columns per tab + +**Steam Actions** +- Change password (manual / random) +- Change email +- Change / remove phone +- Remove Steam Guard +- Auto-accept logins +- Open Steam in browser via [NoDriver](https://github.com/ultrafunkamsterdam/nodriver) (Chrome automation) + +**Validation** +- Login check, ban check, profile parsing (nickname, avatar, level, last online) +- Configurable thread count + +**Proxies** +- HTTP / SOCKS5 +- Formats: `login:pass@ip:port`, `ip:port:login:pass`, etc. + custom format builder +- Check (alive/dead), round-robin assignment, clear + +**Mafile** +- Mafiles are linked to accounts via the **Accounts** section (import or manual assignment) +- Export to ZIP: select specific mafile and Session block fields +- Export formats: **flat** (all files at root), **per-folder** (one folder per account), **single JSON** (one merged file) +- File name templates with `{username}`, `{steamid}` variables +- `.txt` generation: global `accounts.txt`, per-folder `.txt`, custom line format + - Available variables: `{login}`, `{password}`, `{email}`, `{email_password}`, `{steam_id}`, `{proxy}`, `{mafile}` +- “Don’t create folder per account” option when global `.txt` is enabled + +**Tools** +- 2FA code generator by `shared_secret` — click result to copy +- Validation settings: toggle profile parsing (nickname / avatar), ban check, thread count (1–50) +- Password hiding (spoiler mode) + +--- + +## Installation + +### Option 1 — `run.bat` (Windows, recommended) + +Download the archive, unpack, run `run.bat`. + +The script will: +1. Check for Python +2. Create a `venv` virtual environment +3. Install dependencies +4. Start main.py + +**Requirement:** Python 3.14 — [python.org](https://python.org) + +--- + +### Option 2 — manual + +```bash +git clone https://github.com/LOLZ-dev/SteamPanel.git + +cd SteamPanel + +python -m venv venv + +venv\scripts\activate + +pip install -r requirements.txt + +python main.py +``` + +Panel opens at `http://127.0.0.1:8000`. + +> Chrome/Chromium is only needed for the "Open in browser" feature. + +--- + +## License + +MIT — **by [@lolzdm](https://t.me/lolzdm)** diff --git a/assets/steampanel_en.png b/assets/steampanel_en.png new file mode 100644 index 0000000000000000000000000000000000000000..51003d2c727b2f7e8516cecd35d1d27a2f9d508c GIT binary patch literal 288754 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
e&F=;2?}huI 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

=I>Jzx)^AQ7&+i9a7Uui8a}^&{9|p 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 a8xlHh(s}M>la`|2G(T^3uJnxi&;J30Kn1e^ literal 0 HcmV?d00001 diff --git a/assets/steampanel_ru.png b/assets/steampanel_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..bfae261f2cf31efa961b4a034b5919154af6bee5 GIT binary patch literal 293342 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

ccP^MD+ki+J8w% zyDDZbwfow1ObmOa8+X{LvG^mUk7;jR1p8wdeMFGn>;)Z?w!N93?_isBA9o7kc4=Ud zoKnmzMya>W6di%6YB7VnmS@WE#l{SQ*DA~jpR!{xqfr`L9V77tQ5?-8+;z8$XjkpU zg?U3-1Dl+`hw6%`Dz|0?lN?}q{x1w0`gsV)}@Prt`> zNytg>?}OQLP3S-@Yis}DC93ppHs8f0SHkK4)fhRyQZW4(bQP zqs(-Msx@DuiTG6)w)(q52}tE34qId}qMlZ+TSX6Rny!%;)Ng*EDe!oOjp`m$m=2LD zK=?A4cg8MK({c1}L#k=hw2r;YYDv%FL&qCR#7gz0&xV9LO6Xy2SAqC^r3xq!)iGu- zL7yS-^Q7oeKGUxSVzsc2gx0VU3l-?!iFg!(jBwUMNyv@tpiYA=~|x8;4$Pe z@nWK&m z@KOA^RQ!|ouY**{a++0_){6wKoo~A1b;}AfxGrxapss8r&r(uSwsT%huZ`qfeB1b$ z!*h9hmnGxq^FYAc8-1_4D^rJ#hv_QCP_=<_x=Q+UP}Db0aq#k^&d5R({_M1rJKcn% z>o%S0KI5%Nd9YIlpARNZT2w8J;6z6SNzcZ>J1;7C^r_vgE_8dwsku(9?4X8q7Skn3 zCLHlTd~K_69C6#jumS05$8GrfA|Ww*DGG?G)GlHbJObH3b5*C((`}@ALZi10#(+W6 zYV9=hHZI=Y!7rv;$840Ub7YlX!m&NxX$O5R&7@GuspasPI6-<74U4b&Mp++9`$W4J zr>j6@^|-n?(>(@+uq{`gHIi883M~oULu3rg*J)r=O&s+GTkR%iGmJpUn!k`xuTUI{>Y4gWi=EWyV1g0LGnV7M7T*l zNA=e1Q)Eb=9?}l&ztDQmA-1oAp1>rD`A#g4;M{7a%GsAZpN)|aXo(^AbKfE6Epm9B zH&ot>u9W0TS@!+xyMZF=khi-|PmdJV$V7f}jG)#NF>nH5ChAkPZ36`^z*%D$P=Rrq#m40NQGftON1{Xz?00ACKE=7Z6D-QYo#G7O(sKJTzonA2V|7W z#(Iay^Q(*b2jGYLw^M_61{Kb>#%B4VR=q7J?e3x-sk=Pve9P34q&ZvdBDztt0NuDY z5UKmnvTv*ozw>|)sl+&fE)-WD5QxNJEv+av{b$q#7{+}fQ- zEn}*$bj{Q`Pah#^;wJkv`I#@qY+u^l*0i={$CjGlc|-O%X27K16G(Zd6esqaiD0JpyjD3MMc;?fuZg94U9odvLG; zQJ2X6ygK`oC#|ZaHM!D%1!HugxV6AZk}Ho8bU7i z&RxVxzH4!vW+~!z&=n4?s-O7?n>ndBqn&>y2fw{<;Tkz&QYtuw27RJbLnkN$?_R9Y zVCZ#=os`WP^KhZA^_do|Os&_w(Z{!obHrAY`M=nE&!{Hbtqm{;0!md7#7Ge<(u*K1 zpoj{JAR@hpNGE_Gp@x7|K}3-%(xmquYC;oGdT)UM(g_fHfIu=2Z#(aK&v(9=H9uy} zS~Jg|C#;an*z3k!lJx2Gw-+&^58-#F$H?Lb|HZ9%kjt~!;BrFztGr~ zPsS$C?Hd0w33oIyn2%xT&W;Xp3F?Q`Q15zk@Z&2eFo-(FWc^|^H*g@R@2zS;#fNsA z#|rapcl0sO_43X7fgR%WfejmO=M5Y{Nhh_C@<0niPtVG6c5L{O`Lw(^vd~)^+5|y_ zL=gxlLDjM~t$~DUzy{;PUeA9&v8DB7u8CNp*4n0v($-GJ>|yBfJK9{G{JV*(73F7A zTajaox%*x|PB7A8x6Cyd^xlHef(fqKagBcqUkdYHt<7EyBxu#ai3=!A&k8ZvWWJWk ziicDP5*xE(I9e7(*Ij6oyFNbVgpidyksS5A)PFDVjjDh#uL<9bm$tm~Q~qaHc7dK- z!V%7DSYvzt!EkG%(eL8VQw+1f>^=aMp)KZabuX90`#roT!hY1<|H4T8JU=RZdeXUZ zQ#(AW!WN1tvQF9&uUlKc5NN*Q5z_f=0tR505r#1N)$_f@e|X-1gkS-BuL9j-fM-(b zm4n75Phc11e?;*S9p3J?u%S-{I(!Axe}R5C_9N6FY}dE7s~BOp>w9(A^wO(^Rt3xA zIZ}CW@z&%}6``xaVq|lpfm-na9sc#Syygm* zC163{fN^gRR}c+#E1>;#*T)XNIFK`wO%SQ;;r)9A4@6Z$;fRb(&`pO0-C-rX%Q4(V zST2Y}d}24oPW);*2PZit%deoBcZs?N^hAHeR;i2cim%1l=RRcpTH4X-fIgvaT=_dW@}``cC1ewz5HN`G=u$TjrVv7@3UT0-crEt8zM| zvV`GvLtP_S!J$mksxI7{Q@c=Ma$XNyWP1_N0b9g?-u;R>*oWuWb_teGIS-(?z~TPF z*1h(Zb4`*KM@Gby%+>5#0If`NLQI0g5}aj&qI40#fD4e2vFbH?t7vPrduw>m%T}DU z&(wY)cd{T85%xT3s22bb%^?|T5@7<1x_>zQzjrzU8h{u~lv#iF?DoXY2-O{KY8$yt z2dstg7dWCkc0z_IC3uPT8lg;H#Z1Y+g;?H5k+`?_{iHzy3dC=N=qq7S6rki>-OAQR zS&&UPDFIJ|_Zni_2ZM6{VPWhd0g5bQO^Q+w(gx_R)a&AVA865e{GC1YE98%a=LatV z9#`%|#R}#;pd$YP(D(BLz}3Ln{O<;9+4E$x-)oXU5`H3}hkHz*GkQ9ss-*!xvU9YFaz1@9I z%!6O28aeX+=YWz+xa2*Q7boM zE{VF9lro0h*p2-O-Eb~q6^gKm!y<=$*E&53-AfDD?P%k*B&>&zXMa4Q`)CcnJLZ{& z!6l?lVC8A5EAX=8JB#Aos8T%N8YjxK2JZ0~hGL4H_1NZIAZ-ZBPfU`U3??S)mY`KK z9`m*RM>Fx0OS@x1Wa8f*v1e!d#)QX(ec?3tu;}*>3`W=g5YOWT6d;Q(l5Z5`i44xD z2VbWS9vk8hxZu_kIB{>IHMb{k_^RfJeq*a5NqI!3e3=-3D*;Z6Dk(>?{#jsaZKb^$X2_WNTIq( z6Ct}Q#0>cRRauRw54B9r-6wh&_<$)G{BKk68?%dUYyo!Xg6n;;voBUEYvPL^pr#n* z4{O#wDk&^8UVz2nDn65HCt4(sLilSlKFh`m<$1bM%v&V@`QA0pN|$=i$sCi1!k zK?<=Ybv$n19Re9Wc(gi6@*~#NkslB;qzH}Rkgd&1UbE=1_6KC%;r(JeAoxpM41Fsa6 zLcrcp3=v88*%mUl>N~@ydghEk^0#j{PM`i3EQtL6-EAhut4gX0J02b1O_stpx)_%3 zC$-QwNjn=SEfBtz5^mOrc#h{Cl^_S82Y~}Q1pml<5!E#TE#=JxVIc*wvNy{?dlLRh z)l7_QEM9>)Dm=@sK)$}Uuf9*GTCDjz?TsNP-)G$izxbu3dcm519+tnOk1vOXOvIBQZ3Ukk}wszwmDLibiZ9PAe2HeM7q+gEL4z{ z<=W$q>5pRCfP&N$`b95%Q+Dp8WcPSyUr21HV+MWSux{nF{`Hyqq0>Y{U-BSEGj&af zFTTg*G+P0W>ny)eU5AeDX*L1gy2Gn)y=jk@yh)*mh{Kck=xzd3zR6S<9xZ5aO;Eo~qunUWui7d#isj57mohJUS1MktI|*jY zN95fouOqzx7_@m#D;JQs=J5i&AN?09%d%C?F@gaG#yD;cTtd4xR5I0%ewW03H z`mwS3Y`U8s73kU3Vh;m8y#kN<>f3zA)gJQ)S6ql`N*|fTiKZC}`G&wyo0xh28YKUHs-rY-ORZj@Ruj5#_{hO;o%WiTTLad)GxeTe)33P&=CCZf7&k*M&L3q`Ef= zc@wodFmA6gs=e_|jbzR-16?!$U1c*-+Yxvqp^xM~``bY&?xMzsLy%gbqg} z9sN3Zj4*GHj`BbKPC@80)t>YI9Or%qL6t8oz14q5GgZZb@3Y3Eh-H_L`uW616EMm& z?eGv$sTT`X%V&OGY8C)t7WY z)(_|ce|R2GN17bW)iLk=rfg%vYG_Xl0;}ETNs#gqjMD!gwT@aswGLEEU)2Y?4D+X{ zXrc!D^7;+>a#{=1)WRoKYq%y=gRmx#;*IMfR0sR#VqC|sDiE8y&DUz(HwT=%RY$+O ziL*>`x<*C8R$JS;z4z%<9@|{8HXBwcEug!Sa$hRjI5S|p^zfBl&CXL-`I{+X3Lem4&NVWdl&rH8v8B1 zc5}>t8g1)>#E&`rlb->PbmkgPJ}TMvlj%R~_nIqLuDr5-bgx>OU$Sjro5n$RGTp#o zv;8$}52O|`j&zUuoUJwWM(+?ad% zO8;Hhr^m9?-!!c1bnLG}xr2k9z+zYRvxG8v4uf9ToD7Z5nUlVxD@5HO=YO=q?{0L1 z5J)b1e?Uu7ePor<<)xu*u@bRkKmZ#ME=D!yN)mYvE6gTen{ejk#%VrUCeDS)OgPnZ6XF+zuTVLKR63gE#Zpki<;K56`r(FBY*QNTb*YRmh^$uy~ge}dR z5H;`D54<@fySP@YL1W&l?OKt@gawtOjEUJKZ}%Wp0mG*`1BREv^o^pa^9xkx zZazzY91yLU>td4KE1|ZWM(y3>OVdz!s$@mU0zsiDPzT@FkCw#JRP9m}8nl)$B_8#T zRUgst5AWia7P?-I22zU?rf;G3IXdE{fV#--XImFG+hc^=>wOP8LKgi>L1*WLfQ&qhtPFG; zd^t3{Ci&b${=ft+=G7{LVcgM}j85e?pdJaVP%9Ec5YOgyOz1e&jYQYMeB1Iq@E2y8 z>$Z4cu=1qSKN-?+Et7j~EBm|1Vw|8|do)FKx!86Xv=Yj zt#k@xKT_N2KN4L)D-Q}z#x!>j)32+4J$(UmQNk^@cD+xUrKG>@XlbOl^sDDq#MgaM zIrg>>`_-l40)86FkCR z^#uPEGaqs?>qw({znkEhz4PwnJ2u95x0>h6q7LzoBYv^Ow@+|>POp#a)m$H8E-$z* zTNnw)`WU74f4Iapuq5%!NIj+ByU_n?c{M8*YY>vR{4K`Q3Lx;RHM1i_Cs=-Ngtivn1Zav9}F~c&+Hv(e$&TbU0+wwT}+UHCK9;N&5 zw~BG|g2racFA|2-jm?_8F9>2-g{VP%^HaZig^(}KgF1|+sX?;&M9myz!cB&jl_)Mx z(lyRuFQM1v9@$XdJ7qx9mi{RJ4d<>}#-u7iv@XV*0O$9!B;WB++e>)EwP~;djJw+|hP_1|vEN0@u$Eb=pn`)Nxmn zQv1`Hg6_zGDek)-yLU3-jv+K@x-FSfJhZ!avIrE}bZ}A7A~*HdYACUb-9pK#b8?Df z8D>m;rysbx_yAmALg})~o>Z6eBw5T0UqviLyPUsLN>Qn3E@@{;>9!_n>Y43qB7uX} zXtWi*hnjvAa>2$4EYPn{Om27*S_faY-7x`s3XOZ*zLw89mYi>NU*7XDa%)9iMDvr=q8pe4r4y3!EN|P;7d82T6LD37HntIz6am8 zF$z02{K`Hi3|C&bHCLG0^6qi$?AD~&^&gGYVI>1NgX|oyTW(p0X5;ttCi9e|OY#K` za-mOLo`}QEz-u0eGP57JvF_R%M(ps^=&I$6&d)FcYRRDBYoBVhAlW(ErT8%sb@oFe zuI6Wg!;_B@a9q}$@fhU$iT5$4hMk;2l<&j#!I|$RU>)jU@|6(D->l7*yHog;D!RUJ z=KNcunGT3@<0rJyp&RU=4*R|C)2t$8_VZDVz5i)`iGX5j8W}(^uf=DRGG6%VB|^lA zW3XNUcFB9`>qdDTXA!{{@i4PIiD*HaH;4$^9^b;xv$Wsx6pTvrB=>LoDw>ANPfo52 zLoa;52&@$bYOyxGueSQ1|mE zfppE;m8|EXb^r+4uECPrEZ7=DzMLI@5UZuabyHb2GD4P)HR^QKeO1)FuX)*b=>2_Di&1myp2OH`I31IAc~FB}>=HF-!kn1g-&GJ4 zRH7U7B5_xd9ooa@GVTJ)fDnt$;d-&)btUpH1+>U%J2a>aR@X2oTD`uEjf`Y1r!OVL z4>wxH+&5p9)>?LRZFy#S64s;!l)1eaM0!{KXyO1#BLIhv{jWP&aNW~;A6&3BX+B6; zAgi1|fHzl=dJ#w=F5pQsATY4SE~cdWgf6G5r?BphP(D5UtwAf}-pQNJb)M~Za5~IZ z;QrevYaAt~!cYzI0&Q1eey9Qy{VSV=b~;SG=>4W-%PUH^=}YHKwQu`(iO^wtOfSRl z+yY4CInJfBYj||@$LAlpv7A_Qk8`Q6vT{qP|rljjGZpB z)pwO99w<-R1t1fU-Nt@Fj8fwCVxWg_E)$H~u$HC?o`r#8UcVAMsF&>O83-n@YnD=3 z^Fz&IkTV~ZH&B8-{jRoqbw1o3HGPcsVxv>0$Pqma%gQ7`)q0BOQr-iIVw zSakF+w_aEUJW}gRvch1H90rxS&uA85tJ)nBRXSiWl=Uu~(0V3y_GKZuZ;;Onv_8*s zI4rA__LMv|Gi47FDRv5Z^M$}~4cV+`*m)VX>v>h{YT&I%;4qB*#)N#3sv1T@U zN}np61*K2S{Uo_?tqH~E-HB&DHVfTDg+ z2Ht`5duOl9T`kZH_ z#O%7rpDeLNru`Vip~8LzHz~<*Z@$j_aFcvlzSZlpQ4m>MhW;Qy0>7Cv{yZ=G@Q_{M za}xQGUGv*x18eNGj%H!Avu5tkt-h?eN1B-%XRJqd`LibvziB{E`g!ZZn!I2rLJb{m0y+|ujV!1UjI5$iaF}>8w@BFzt3wfS-D?vy zS0NB%K?Af`RV|rB6a#|$rM31GGVX*4*L0miFgJ5D)ApQ^`n`%osi_49(23|`tidGF zhjnrSxwnQlh2}Zaw2hmuGulv4m#=sf`59V;OU80^M_W@G`%+hxiP>Q$&=ZWyR5zPk z?Izbuk{vI$9R^%DiZTV;gL>>SlN+f_k)wC+ABLJ>hUU2ZjP5J=c4g1WbF)JHd)HO< zJA^8P%tEWk^>Ak6C0o26Xj*z4Y;?3px3z?>9s+}E52hEc9U`3x5SCe`B0S1A>F4`x zq8jHor75T#OQ)73+P>}UkrfUb;ig(yIXb@?2a2F#XYKX#f+_Qi!KhC z&DRDE*?(j=@t&|VYeyPosXV#SaiCxGz z(Og@BZh@^eXsZC#HDcc?Z|O6mXw}0A`c>Yz*70^~!m^^Halbif=8KCS8KK0At0ibg zqZS&0EOdt_zvtvUbq|POWWUI?YKO2licC#J)s;fat96Ima3hcjPoqj#iZuqilOJQ!5XT>)ufk^>C(6Y<-nb+UTSbL;|_GHmkWTZP!N5p*F>#W zkD%?`V3PB&%aW+Zef3%sYWnya<;w$v{EAD89gK@Z*F#R~-~QfC1ycATboIV*(mAG5 zHB+P<)rn%mSMHYL{8OBDDpKN$=Wa`PbmUlKQqi)0FMM@c_70RC(_i7oEUJ32-Wf~- z70?Y2tXER^o;9G}AqTHxI=wB1l))?fyBs(>lW0#lWa7lNMv47`C!Ku`B7b;&#*(1m zqC{MJr6hKvINet4<5(#oieC_LfQd1+`AgqG3=Cg`$^769RT$k?M4V ztavg5!vTLdYz!auF-<$>tvbW!w-2b}@iv?RNTyQMx; z(K6%2FWY{vc|P%W?i0TDprW5?sn-Nzch_C@ELiX96+R$ee^l8`4dO4qD9ovi5HOO2 zo89#})*SE^d^+L#g?budS2*d1cyB@+6#^FVNA;<#EeFKMm zenKK$we&9JWGTsId3-QWsgkMm*Ql6ojd$s(Zqp3K4k|0mjBy(nbT12#7Eb>WW(%ct z#`em>MtLSkaXw3T?TZtyXRbfqEdM!DHaKtxp^GFu0$e{Icmt%$g0RWi%qwYQFM^O6xhTn=`&nkU1g1oMXOyUgKT5x4w|9eOTuFiUgh%^p zEVui%s59f46J->4?6@iJfAu?;JM?9yfe<4$T&@De+2SWGYq%T>L|HDAE~3O~&i3v& z#(}XVj@`FhdzG&Jm5SufNED4vt?%q)1%u@oF?F<`Z zq7~elg^h_g>H}sH*cC5lJ%|k5<`PkDQICr;rw94oDQdr0e3vfBt;)9wu&%%8%)Vr+ zkFe&;s9mp?;44W>ja)HNKMj%ATHAA}X4M;Q9!9V4Vk5|#uUO81&twA$NLE$N65mvx z+OMLhZ?x^}u=7)9cM*X)ScBGEMZ%=4&cFY|L(sWFq1ZvYmw6`D+#w#OhsHQjgPQ!- zx$n9OwsL(=yLQy+>Sg012rvMTi$U)z4!n+eN`qr&{qEtw-TMS^0z$rt>pvoevZy)g z@e>|kf^>a0gx=@6x1vNK3)CRgOvu_^f+SnehC~hH+#((3b*ngVI=ZlpePfDDVYJ|W z1q2)^jzdsu7Mu`RW5?RUT(ntjFZ8p~Z^i@@B1ySNJ$|3b<;;jPj;8Uy*%kcbpck1g zCSOMPMJRbrc+qZ}?n0<`nAdZMyaNjv?t0K}UmCHb^a;BrXE7#`;56<}zRLjm2C-nx zlUgy|s-CI^vgXp$u6>?;_*YYT4(3125YgO=<8f zzs9xF35{$$^2gt-|J9}!>|DDCbfD^;jcRe?#|tjwG-dYOFwPO0L1W!;XqEV3iaNp9 zxyZ?mj>&q}d!`2FW$bHAQR}wxa)0)-dP(hx^Wq@b^1xDHwb#jGYd@NE=Tr71q@lrsgDDQ`{PE-qFGSio_nb`St^9QKO#q|eFe(K> z4CfFDrbd3K6LW0x#F}G<{ zU-Wf0y?3Pjdg%vjaq$_N$m419cDNbsJeLY?wD9p{a{%=i0W`vagcW!cD!fs0T?PZB zEQn*t@(0C)dsxVcV(3Kmm^a08vIzkKIO{blcyHzv?_VtKSvY$dX8-SYzEfQ*mZnHW zDgjYhZpg$aWlVuCT&d`+_@2Av=GI!NQTU5Xy9_&LNKLj$P>wT4->H$~8ebWF-6;)e z-A8#ir)n6yeLaQehjy_2zBOI>xS`kXI4k%82JLFH0?(ww_0k-a5rEP$+L}?Blt|Oj zz_~K>M;NXb2}H|py`&Y#Jlff+6uFx4wbz0DTt!J)xJ2iCR2|g1Oy}U`yn;V@U0$@f zk%8h)E#pYdhZ}5G#}@tk3cZ&P$7V=+#Z%lE2XUO)q#;#lw##`&O_8~w8hpaXZ&}4R zrsWF{-CZAh%-!(q_B?SF)%P}b%he6FUjcLG+!tCfcE816;D|akL8lEO_-etN(nriR zVnZoI;lp{sP_X3g;OJOR*r}sShe0}IX%LIP%?7WD0=8EL4xg{A(*3pc?&{WTaC%N4w-kCZb)e{A2(^BxYR*WT4|~ zPBcyOs**rYOA~0uR?;y@3_tP}!)OMdDnxOb-GjTzF`K!NS|;p3%stpu^<1VgZ%y|t z0{x-UC9MY1lY13xzl*eKph5>}p)r=XjhRI05WjL7@b{^=i{2;6`;%5O4U&M$qSF63 z-pyJ+n1e*v1Hhm+l%DqW-IMe_vH8N;?H5fzMVMWMePgxk z5pgEo8|@~lb-rfiO9yIVR=-rUHEpvZZ|bO@X1#eiAT%oGtm|+@V{@*mZ_TfC$6gyv zSw?(MuSRMD_K5#af z2Iq~}aO)NZFr)hV`;U{6g2!kH!y1?xm*BPmi6Wb1-*m8*c>>x zF8mVSg^s~QlGaT21m)cB$;h9TUkXTE3eZ5%CXyfdwdx`HkT-Bq+>hnS*4=Y^BDFUSeZ;|BP+pE$i z@DMXjlGjrjxEZq9qVo%JndK9ssStRraUrj&y#sZA2qUwG0s?ZPP-+NOLoJj2_-cR? z(?Wjg&XNNW3xBO-XMDpsoC8|K37tF<CLCg8%%tNm zXx*fLKKt5=j{H)lf*BQcaTipHm9ES&IObFbTx_CaO2^CV8Q)$9?N-htZ*D>Nrp^j_ z$U zPvMq|wQ76^uoM=q3@=$IsP5*c(ts*<#3=3&Wz>K!QwqO}uVoEEVsc^7fv1jJvXP2( zU%T*<{7r4iLedU3k>tEW<(_O$*-vxAhb-&;EpEd>2d9<9binX_3G{-<-Q?|tDg;x1 zca5Cs_hxG80tK%pO06uQxkj8Q5m=ex3m^gMN_5=G@}8D8i>kfv^AY5H&$RFB>lS26 zDECX>x?*ux0cLaTYvqcIW^iorU01t-Xajpr{9Z0Reoy%SD6X^}0(vF)(8RSG?#tdJGI2VHdltZ4i8)~9 z%7sr0Wm*86246kL^j3#7#1U)y)^kE9FMS>wp44^NFtDmb@zjwfYuKVW93EkeEz_Toht2m}2(t?0g}S-z0O6|zFLn5y z<|MKT87oH%V0jToh2)6NpzcRbC=Si5?s?yJIIf+`4Uhh^qw{dWq9*Oh=LF4)pO-aj ze!^UcY+Ns@nPddzs9gM<-PUcmy?;#$*?%pnwK%%AH9=%P2S4!4dJoxf93hIZ_tb&c zDP1uQZM{-x%u%2s@udrHNX?=g-Pm0kh*LWSKA>&3lNxdCk83DhObr^F1paLlq=BC zVHy;_8No0qVMkA-o6u{+Lfvr{^|icg1l~&Z2Kmz+@pV6_Mrunz-x5951I%k}*!`X( zKfsTKfPguX2OQDFZ?BGW9P(#;@c!bAt>5sWExatfSsY|MYiq_CkWINS%k1-A`PEIkw)BD`M zMm#WGUlSjauYB?D;J|`+vzuXH6bQ&ao5r?b5mk3&3@q@?cJ+c9MquwPqzmq)-b}t3 zaUBb`!7!Bx8v~Y+w1yGFd~N@`*zO(AghE%(8w3KA`S{FwwDRSS`5+L_TOXKFzRXUi zE#l0kAEOcCf_Qx%;_FfP%P2O+4JS%xU1W-M-UHf`4Rt532gMC*uq9xG+Ub30GiU20 zpRZqdaSOE9E78wYs=MFlrhpWbEG?fUZbSHLt8*to$?oOrv-25(jh@T&KG}n6-23RS z*2a8!CqcaqXhKG;nFz5NGzHBJSgExG^}tUS5tp%gF3Ud&sjWZPB%z&R<0cj8L-+4i z?$Y@|+1)yzN!ke)ThR>?a?a{&m$Q~wr*|0?#nkCo-HX^*?nM?c~CNIrEndEq5Ug!ms3 zyAWVEw*$DASIr^kCn%TuyLDS5|{ z_?q-Msfw_`FJj=eM@DXU+J+Zxh5{~tzIVKJ+Yyf5vH=yrO3!JgdRJc=PPkEiVO)6U zi(s^j8ke6)6(16W8Ah1L}oI%VD?1!gm89w6s+@q};nR~rIqdSUBY9)WB z6gK|k(aHTW&EuIkrZZB8VP0i5Ff?5|l_vekjJamvl8wqw!y%-@bVC;W{7R#e9=^lf zZQa(=VXA{)VGEY%7K$Bu_ zxK5j<%c2yx-i(P6i$|5mMO5D=3G-r^f+*5xz^P2CMfB)Y2!DmmreJjS99tfPq{o(`-) zy|ZhQw*`@1$mmvsOov6V4|ike2x6PuGsdv_tG&=fVW?x~t}K4TBW6Pt%Wf=V`PQQ~ z2?D+QX_02K#szPEP;^Jh|H80?*N8to5SOzbl6OA1S}I7_8m_Y;X+74l0zMHPk6iho zX?gHoFT(`P`(4_xo8N-SYeVOnS z!*UA!(LwyDF|5M@e<{3bfgS$Mp#~A{SwPWnr$T`ahid)AE@3;`<$o})Lt!Rx=8}Tz zyaJd6mUvm>!1+|5xABtkHIW5NYQ?;E!YDn8}Zw?OK6yirj@!0%es<= z1|8@n3<5?vQ~Kx%tsiFL3c-okKL11JUB6#5@rFry%oK{(vn+SFu2K5LUh3(}3jn<7 zKMepFwW9wXy8Y0zuR`fT+sB;2Ik#4!&6uZV=6AzbO~AF(d#DaiZ-XG9sdxEB&kp~i zTHG1>dvUIC5v(3*eL~1ATA}vB`36YExR7U)PceYEx*P8iJE|&5_LEup1swz*Yb1xwS>VWr=@c%QKZWPhY@`s3$ctrt!hjT6(0d%xMI+8 z7%t`+09Mmo%s)-OQ)GA?s_*_M4l1S5j-%XW@O0MwFfch?Ea3V8=tWsbH0VY7m!`Cr zgA&1J-BH-9c6F*-2c;^FGSQiLWV@XBD#_0sTDn)xjcv%icY=F%uMQ%XqsnE3Pn z;(EP=?hTO(FXqtzrfNc~{yelNx|9syqM8dlcECSAUw;zkbAIj9dXBMw&pP3vLoB_i z=zwx8gQ*zNM$ZAn+)kTy>1$v$ZNYRD8WxWQ@gM`@_IntoWokptmyV@$by9(fO=w9e z3K!We>YEO@-|lgq%R(cARc4W_hJ|(N}q}( zwvw$9KyBMha<`~QPBL%^iQ5c|Pec38Y$4TMQk-T#Np#;^@`hf}l zU{@Lls_=9K>5*4D5WutQ(KG~-YjH;Id{kLS#v84NU2y9>clqk0gmXer?nN1DT(A?< z@35jWtI;-pPD6ymDiyygnb71ktyIW(b0ckKz(JDW!hxQ5CVOn{k_b*g%37BORL{g;UVe@MPS1(3Lj%-*K2{RfVWaw>wR$g|5)9Si`B#<{`G<@q8PS6#i%Q8?4Mm4Z5t< zdg)ObF*d!=eBfd>=CzNOb&qmH{B{HYAXITGEznF=zHZ%{UnekGYt&_o<_%BuGLE)a z5NJ(Q;LkMiG)nZwtOfj5uXP7RqWcbSu|v@}aJX?%dg_ysTE`&!(B< z1?PjgKIhY{eak9zQMfr&`{TD}ew9z(-f5=kD)Sjt7YOK=JtrM;BVxKq_{mrMEuS~% zm@EG*3sc@ZEYP95%JREfD%Az0kKRI;-kM%#TkziLOdS&-+jB43B+&Efg7i6Mug6q z0vOyMbj(y8t5YUuk=O=o}Xh)wv6+fFI=dc;{-d<};PNv3of~R@a#XJhc+59hJ2eyzf_U$6rdl|0Gfe zOO9GW9EH4pIC=AD93pX0bIjZu7G+b8dDNT+Kv+GX*^yf6H?K~Zs+M0(8NI@CqJv+Y0tl(GkZffDu+l@#aM?bstcWY;atD8C zJ-c~5{Z-D+=UIKt^!uDDs@az>-w%&geV+R;)gnJ#Er=xM@{4tUbJ#>BG+Hoy&*)_O z_C)%X6isuLyf0VIHa+GLs8CXXDjH#mUXj-zAQ&oxQ1bAPRDm&kEw<(GoMQXU&e# zdX}S=e{(J*CW80mX_a?(1JZ2+9FosB}|oB2FEdpQ6-O|J3%=CCw&mOtZrKL3X5}!OiFSm!8`U ze4Y&yOnbT|6rq)?XMwo@u*RK^TRpq3cWadW#N!Ub59)bY4)K3Z*6;Tl?1P0SCcwrY zcwr<_kDfVSW|oR+1s^zDk7hWEf*y*}u!qBn|J){j-k+|hK6w&7R&JX+U2Ww9Zxyv_ zyZF$CW7fB6^flzbRV7pI?BV~e!Y z8qqJ4I7p$7$CBdG|Bgwx|EI+Mb&vd9o1zf&cL*!^&q4fkfBIxIkYxC881cV8|JMuY zpZ{l*a^}q36^F&{|Nnvh>$ds-_6)INe*OA&MOs>KdAJavq|2{qYEs-i;<_5UxZ6kS z5coTaRPx{C2KXbyh_+`i-$2J^xIj=vMMX1TzdXwa-V8CD4&GY?{Wsh|l%h4PNE7n>Rb-C8MI+ zqubC4v_xoB0$A!tv=#4!2hVg0Ui236%~c?hMpqd ziobFy-$G@-nljzcDJDxBk{)wr*zN5V2~OcT{wvu)RgtmR{K@^jqwqODSA|Fd)>~aD z0r5a6v4&^C#9b*-cK_?+^UmRsg3palv){O;jK3+=OcxW`crsMAxbdo3OsJ|;`Gpck ztepEBjP_{x>r}Z~`}|jVhJ5i{`urF%$)CGw@#YKBoh8s24;SKJdhPcYRVV*9tL1GR znVHnz_@-9~J*p+nk_;RFG{429@L3pgXb2%riSN%YXKps6+iqf;`JI-+D$LshJ2gx7 z)%d(D&+uty#YWzI`lJnOWUMb~$LoAe?Gr#BrqauMHQmTY*8R2_YGu4qh0C~3Te85I z&o)LV<~^`?w#Lfm2kT{}95gDpan&xkYfDQ@09)Cm8dtpJIwwveqx{mJ8@lb;ubDK! zK-0`|KgTy%ec|M1_e4juBX(d*MS1~7vfJ#AbL!7O)LZBlJEP3=zZ|o?bjHL`j;%6~ zQCZXLs~M0iF4wgE!=~=J&~Ws}?n3w_?mBX|*EY6wbGl}Dwp_fhEo(Y8&F#}!%`C+; ze9vpkzQ^1YhGSelm6tBG#rcK*^mXCTtiETRtyLV-ftd0hty=N`Irb~%zM9yaD|x+h z)7@=CW)v-|1cRD_dIB7|-+Gr?c1M?$NdO}LX>ZSsaRDd+Ikg?TZLIi~B$QFSd|VEZ2VYr9U$7`YL@K z{j2XeNbb?Hs?%cVo;yhk`n6X!^FhKMwBDba)E1-ziG0M4{ghzfs(N?-v}WZCQNE{T zW#dLSpHw5Qt`Zo|3xF*;qGJg7&pO-)IcFnVzNdNq@4=#)Fb6EJ!La3z`CGZ>GfMog z+N*Ds2m)(7Qh5gk9nG>=V4Eg%l$f`tDTlJzRMEL;utUq7{#?p$Ru&dtHQ(~GUJ%cX zb~>(gTeAF&=z7CHH{UITh<F}mU*_R!#j3Koqsr4XiS9aui`}a zPN;jijd6rKsccJil>Mnf{GoG(!3`b6(0=LTduRS|9PB08XS#bnv81`TYn2Pce&H)m zH|X|;NMY2={)gOZ%ll7CL5wO{WTPr4Wj0~syj|r6QP6n~2ytC}e~>1r?K&R8J6zy( zqpfQf&^2aASz)0muIA_tFxF-j~*s zS?^f+wKeZEa9pEtU5hk|m-;!hgL}30C8%Set1})@g+b;7WYFMh>)F~i_R{?T7E);s zHFRI*#hQV~O)QE?Z*Y-F~aT+odP{KvO`2Z14Ak zlVtqzU~Y+3FE5a!`TztP)*EWL+vX~;Q5D@L5w6(UD~0Iw5c(wr-L=h=Ai9SQhXH9` z*-o23BCc+3WIx+%c$Ybw|A5d=4Cjts6Vy!CNckpKsg97Yw2fJDKVL{e5(QP7`mKzY zsO{QeE`_g+XWJ`8zk2n`e|yXX(ZdF}GCx+NX&4kC*>HbKN6cJ*Y7}EoZVyC<6fO%V z$P0HGlu6*Cg-is8A^UA!9ypdW6ZS^cJJIj+iRq>@88+@bq1twl*-K10=B&DdHY&>= zyw&ddxBVM`Lkz4M0$m#+XXmI^7gn|Vc720yR9rfi1gE}fv+J+6h7xRmDZI+=$IR8} zW-R&DvI*g1-f~>lg{g^tq*UH6<-yut1&{iFMkL-*hf?h*}bE%E^pB7l*4^`i+l)P`gL&wX00 znVU*PIqmg60QS-84xshao{jmmBKOymA8){>r`MFggz*6-W8QDN=L7)6<79DW;%9=w z;kf^ivHPkZHR#=qoBn4(_eST9g4CwEjk-ZE+?EGyulU`69L-l64K}+b|Dp{4f3WxF z;ZXN||Nlr)q0uS{sZ*4)hGZ@6WUcI5GRT^3491dB5h`nTDV5#WcPZPDeHp_HF~k_d zU%Q;n{(XPH@Ar>y|2R4h2jg>m-plLtdOn`dQH?z9s}rCnT=Zc$ zx$N~;$}K&=2kw>C*2RY|${6nz;L98wu$zf3)>a%Ue^VB9RpBxn!J+ZU^Gr=``5~i$ zYZA2XzkA|)zXTjLFfFwEWSn~N3E=^Ehx%|=-Rq$cH<_P`0l)RXp3lMCCoExDU{EpZm!hhv%|TSd)SXupwd?s2JcYGxbsnt z*t1|0i_YUEKBPClEOwa@S16(BDo}o^c+!hbDl41y_V)G{gOO3&C;jZHB$v8Zc*X*} zSaDhD(JBO)E|C}U%vnO|>ffVsrlmGGH>HYgU=AgaW>`k50d&;oo<-R@IxFyiJ@_aE z2**zj9D_>{9pFi4YXuk*7QA)VDNbQNA6?KrQRi75o3N)16YG(C?oTh|lv_BWEvnUQ zoYT@tE-kSJ&URsBLt8Ay-At%5$YX4c5ATD<3e1<06g+8t1m&5l@?wUNLO_(dP0u4R zRmi9sYBPx7JD}UY`v~N#vgnrpcOK=hknuZT90TOm!U_dXa1Q6%C@!a5R?AGz2vM)u zDQ>V6FTX@6jm*FW($Eb?lR;?5~#L_tNIg zb&}wTb(KVahV7w%P(af>&^Otbi#dw9NkLv1+dPMr+wJqCtLA4g$!~Q>5A{{MMv9iq zz-oS#{c_eA(q$t~EW6~jGkPo8#ta10;J)a3BjuN6EWli&bW{WA@y7WL+^tNxCLN5c zZ~ky`j21oi`%bU}#z3LA?j&EhmiK1+#Vko&KNm2eT76uzONCV!`TYQD0%0! zc7R%F#L*e+p-z*U=KjV@d1*Dxe;y7r{z2&&)85~8QoMI80wbnO-Mn)tf8F%Qqg6fZ z)hB=sPgQo;GWP*{1Dt|TpbSg38P=LNzdR}|`~r6#e)!zkZ!cnA7Yn0rRX5*xI2fHl z86VcAEcSlu&9_gYWnR%MwA?>CP@An(<{LGSEi&_R9udXL<;H`z(59=5xXx{A-rmZdVqoC5v~36-^#P4iiIU#AqBoP$=BC1e z9AT8S5G6i_k?ey54Wn4D1dw(xDs{b^BkOONBPX5K$0sE^=e=%3ro;fTOp^3d9Inpq zPO37acz(3DYv+_D5YG1oG@L*XMtAisJb&_0h$qetBs-S9F&O^eIePz4TO6QON2e(88Vh-Pl`$&_iv?YB`%uIjah?-?~ApT8D{g0tee5WCUkZ5eFQ zg$P8YwG+2pvUu-P8M&K>W`E(Mn2-iM#+@e%SQ1R5wDHVGwaMJ)cqSzv31f?Chea*z z#yZ48-X;FIzxc!oA_)hQxcRm2>^jdioM#_dxM+eKWm?kWsWGvu;IeIjGV) zxear+j?Gri;5$X)9H_=;m1)fES=OL00={)LhQ{HXi3&#VqwhJe>gS2r8`aY?TDQ_V zn7W|^%S>U&+K7frYmTjXe7sg#>`dyV^NMm#@vnkIZ#7k|X5D`OS#M)O`as$z=Yh}C znZ6RU!-bz>#P45O=!my4?*A-?yyOw{c@MCYc&v{pf#uEPD?zP-`%O{KxwS->N*XzT zgC-a)vTyUymBkrAQzx+J2C|nfY`kkplY)BdhT71_hsCi~c40Q<66A>UAFa`&Woypm z)`FW4J{(n&EL$C8e4+K(n#+2Unruy`LyQl zhgFl~>Vq^Kd5DiWM-;9jV;p8;zsMlkJrFd8_SCm{3wfFh7=}yIF6{mxR01Qv=hjkW zuGnK%7WbhdAXqHfUo?u}zn6#8BluCp)@8o_YYHP~6&?dmf55Wvg4D8}y4$g5KaBMr z&grCfrPTlCFyumY5}c^Yw;wAQT9=9rqaGB|mLhg%V+x|`BxTk!NRehyZ|hL=?$eJm zx`6yBk>t(l4OI24>|C+(cz=8YTwmZ}TD8X=8T^;Hs-yEa@$boN6;iC~?%s%h%9_zB(j;ZCn~r z%~m6oI@yz0izZazX7K{7HY;E0HVuW(^>Vb3cpttUU*`jzktg@Q1S%eBmWHSgN!*9y zq_8o23_9xs^3N96pb`%+M&h%QFhhHjkHelAl_}3v%j`blZ4*&ovD4r-HQyRTAh{cBeyeK|1wZk@&0@adyqYcSg08sMQf-!U7v8f*91Y zVNkf^K0GNQEzcGWw8@k*btF7_AF&p@(t;m8p?g7Xy9%;l|KfjCqa;IhCxj#eLx-}~ zI=NggG>tgYjsCPKC<*aC^-qOQ6U1_%3Inmss}pq;$@}S;nY}w8k?F#CdwC zmIt3?B-MT9H{=iQ*0ht9)PP9VX$dZGSdI>7)>F=m-J!F+qune(Zk@W5og$gh@YIL3 zcqimd)pr@xzDzT74oKYw*oO#xwuJt^E_BchD*6fgbUTu!^?K>ljoTzpGT**(?Rivq z{DW_|-zKtzkKVg`Y#{eMyFqS@0ZsL+2~Su2p5U<7FAC6h96#2E7T0-tXNB1Ea>FTK z!p|U9x6PuK0g{Qgq(hT8bs~pr!AeG*@IiblpiL?xborw)3j&p!%ofV%azR2Ogye&+?izU< zR6FEOLp!^4Zrp)waXTh^SyY|j@JxGbKI(gY9=gG+YW2E+Yya3WobQ=Ybs_FhZ5N|- zn|?T}e<0aQu0{>}n7B?vbM@L2eqy=Gjc|26&@y5kactX9M%bgtpE*}W%N1q!YoQk5 zyGW7JbB!^{N$sv7nZ?m_DjCyr%Qwv0P zr5%3+vlc5Z1|IYiq*~!ELfdJ{XWHi>hK_FTZM4}{gNmyElz;&j0p>X=K0?B2`52*R zFSsqAPjDdvz9$HCTix@k5*pC4qaV%TW;S&M#6G$po7QN~>c|=xXY!$Q_p?h2(sP#l zPo5Z(NvB5aRb4VfFTE?Bs=wH?GrrUB~bND4t z1TWK0MXzU4*ZWrux*{)U*37PvrmGbrZChALOv@BiQJOrsF>w95G01ads6?FFNLuQO zo0$>|3IxtnHI4iUtqA(&tLUz=)-!4 zJ}gdk=Z-Om<(peK?ifmvCdkDdqR)!WqnO%pu4!D5`;QdNFXb`~s~k6)pF)<6A&aq~ zdx_z(coVN(f3_>lPd8GTnWa=RFT|_l`tgFpi1C5RoZE@L&-JPtGh;+kPJGjVF>MMB zd3lH4r76{~TOsVxatH+3+(;f?=kX}*v^z}ogkqWF>y#w<)>GKBwn;j*?I1g}T^|4n z-n%z}u@7qJ?4o7A%CM)pPh;HDa~qTCIA2!3Kyq1Kxka8tdENa5?Q{dkDM-aO`OYuz zz$0$D$OoAc12=j>f#@pe+1kazp6^$mguPmb5Tja&Y^eE?n=Eos&^M$@Rr^@)IX~MM zeBZf{E7+L1!`IN(qS1l9Wj_6wH$7C1VQ(`GT?v=2jtB?}zZBG7=*a%lRcT>7Ezf}* z1+KNw`_o^%Mh&>DiLARIVD&6Nv?t9=S*nhbofQL!XZ)zC?5wxVse+2b+^N12)=kcG z6>JswrO=_8Eyx!V5mug;$Lh$AMbYfM1Z!#ThUE_ijPaM^%eqFY)Ibl##avp3F(Lb< z%>N@@34rS#NYiHaSP2_Xf9 zVe8lZS@r9Y+IjgQAUV(~PW98`=-VZI3ARF>E_l`o+;if(O4k#AYa^>dU`AaeHBph4#yFALRhK%eSTIO}wQP7PX zB4vBIosT}V#5Pwv34F6)UaAu1$0viGe=#dPJABrvrJwkZbOd}1Z%8#!3}?g2tM&ksD)lu-nsd?G;P8mI9gx_ayJ#6#P9Y*CCc5& zJ}y5|5B!lnM)B?aLEYEb=B6dmompkG%`-0&-8)_EDy!*%ez13z_viiLRfBd*C z%zSMlsFTS_T$JpiyBhulJuCdq|M5#;jC?CN8|;D|jV+98EdjN{M)@mwhQQhIM0Nq6 zftVm=e>i`c6+6$^s-f4`uA=zC`09Q1K;%+c3-t=GY1a6>a#xN^&H1L#C`!lzq~QHG zF?i|X+avi+j7YwiWpQ=j-8JJyC5Y*|f zVO|NBxot9lVT<8c&2VpFY4fNE%wDPCnKGeF6Lk(02t;>%TW>S!3rfN@=U~^MvS1$^ zB)wdM#_TqUlpfu(zpUtj4@6Q2SHWUK4364-aDn4XtA2Lnqv$U@5$km&H}DhkHB6oY z#Woa>I|*0uWurRe>8P)hF=L-g-ZO5!Ij)b0^Ufp#f% zz9+%XCi3$k{-c(edqjMI5U|)HJBcBRDUTF@j1HoAa+8P`7$NN!{?dEm`SLyp2Dxfj zIu*@Ur#b_K@wQ9_ZD|zbhb;zs8Wg?D(j5z7L-dmsVMfgKTHEP*oi72FwvemdU3^q` z3#emdkg7|HAr~a>xGBEliLsqE9AyexrEOb-%CJxk;C%2)ld9j8kO0r^u!?vr*dzg(wvcO5Y#^jRvS+kq8_##SO?u6|A@8q zEpixOx`V+fQ-fIEwk!k;xwB;#*V=j#3pZ+2*fVjG1LB2cir^iB0F`obEv(FYO!7+@ zLJG3>BfOvu(>F7<_R2O3PR=+GpYYorLQd;i(7P$h^Me#-Pe;;#0`zw5ZQ1vZn9q7; znl_&d^FLp>lP|(QC;R$?>?4iRigvvkoyV0qmix~bW<5P5W^R5&WifpoSA0tVUv3ep z>Mv>s;f5M7eTtpT_>2rZ=E$3d3oA5iZZc77z2@D8>?Y>TP;*v8{O2#_jixz|RkZ^f`pefZ!CVITGj>E|8JqpipH$VBgykJ0WfYje1hXEkmW0)0K`rfB z?|q!)KLMB$m66I|$8B!x16Om19&FdKo9^gBZJhNo{P=>UwHc0U5yA;*_ zZ|Uh=7pq2{epGvz9#YxaucfqnrD3S!(S+>zn_+Z*fTs|01pUQ1jxan5!T}CfoHSO( zg|{#0s|9v<#jvr}@#kexa;|V-i}yMiwEtZYQH^+T;;D6P!Z)WrokKxFtGWueir!JE zU=%YUqLt9qs2)adfA({*vG$E3wiwOl!BG<7E72i66FNRRZkkTAqq+QSL3Ud=c^D2Z zuoUsbLuYj-KO~Tu8~bD-&sOci>&C1b)y1%3%D@n`|JrWu0`4;6sC6MRlNYwE4&lD6 zR-J!8Wn;Rue)sz2uzb~*R+fXR-BNQL_}WRX+KWi7NVKwywOS{XfEHjIuCi~ zzg#Q-?RYQ-lpQXLBvaqRMuTlnwa6o?4Vwzs)o&sfWK>OdX-7#D$I{qMLQkC7k>MN= zWJgbk#}opblNidf#7|f&!3RHP^;`2$56l3EjNHdCa*+~idgA+);4{+$^=pYOe`Q8C zU*=R=2Z=66im~yDd9+-2sw509MY0S7>*b@qa0pu(AL z8wSWoblQ;>>wgyw(dvZk1|2H2;Ld{0JQ>NRowSjHH8s!$ri9QPExD1Q00s%RcT|*e z7o#ex|t|N`s z-dl2C*+|j)g;FU~2!X)fNBE3ALOfV?GxEiA+7A>yj}g_=+skuCc=CEgTnf}B?iBmJ z*0xh&TuuP@g3vkoK;hUMT0Dywcq}Y0G_E2NxUq@lCq) z6N6@6^lxzBykr)3`7F8q;y1`)ws(%{oU8^59SGo4w!(E6f$nbJ_Y6TVDrv0HX>Xv; zj@bg!r3xV>zmWi|@Zt@|41J`E&i|1U9TbVDIP;abldkXuus)6R+BBTu+NVcV0wC3% z9MC7aH|XMLI4xm%7TD;$z5^vo5-@up{)2R1Mp%B%>9b8`ze&vih1Aq4ZUtQYU1T@;z+Hzk$Rq3k27D2JHx3`>JAT z!R?&vgxOLYl7>yWe&;k$Lg!1qxdqMKFbf!4T!}k91!gvf1o2;=R%t@I z_sk_SYT6(tV7p6X95Rww8n9rXXPzKj3|s=IXNtx@>FU|JM-dBNGF^@1jF`onN)N?( zM*5pdfXV0tbvCLj3UT;Kfb($I6;ZH}z|BN!P@5CgX3ggUyk#YyAe}4CsG%&@3Scc@ zzB#^6U_gcJ^Ry&?xug|YX?E~Cu)>u(BN>>*RQ?<8Ef;;aT^}FIk}vYjW#pN;(2E!& z{)M9+n_kQOo|0^K^xYTgcpSm_=It*@gIoL8Tl$)dQ0wsBtdBgmkHgb3fvJFn{%4^2 zSEVJ%ux_n0s@+Sj zG%z2o)EBTQzT0bD9;;w2ax*x_SUTPPhC+$eOH+l%hPdHs6WnmEy11a?X>FCw!V>3U z;C+1dblbqA_9vCgnvlh>6Y7_@on6G7pEMv(5V@vz88?f-)=@}=;QYvjm!hTM312$M z01(7g1ytj5U&-_-6;;2zt0&_Gx2vk5%IGTdT-d z53O&8P(;Zn;4sAYGi3~l+Bq`Bl-|4%qYU~c92sZuIUX`XoQB>S+6QxGSaRPqX(qI@ zv5+_ePutP1P1CrBf<28P+!;zW8$4+6r&ZsH=b8yQ09h$*5(`WdaHbCRFYkmb?X~9H zsjje1ka*?G3is(v<+HMObiH3kecw#{l4iS9q*{Aq7_>dR7R=Uo(VLYGB5_V;paIg6 zV;rdr`{IvV-OZNSQLSsCT2l{783{aqh>Z|80FaXR>Md+sb{IIWdX?MK! zx##MEv;8q^Yj5>b>OS9X+YEQ9r`k)O&Wl&tY+$7{Pq0cOzTQ0J3pbh_C<;$jaMi&f zHq(>Gs*G?*%F`O!{28Oic+E3+)1wbb7+?4CAcAk5Uwh1^wp9T6erqC>;)Z>?=U|6} zU(+6zOmSdId0z|YL1Iiw#*gpUH3#O>j_Tdef*oa-)f(W{^WV8|UX{PW5q5P)fKZKV z6Qc6+-$XJUIovA%daot!-&>Q&3vmGv%DXoz3)tCQ(j~XMQsuA9pdKmUKKnE~_MqA6VS z8&+Rv+s9W2-%G=`G(HOLS!&bEcRYMXH?t;2)Y!Q9ZF$@&F@yH^2en&^@=V@eOJUP1 zyPF&_FQbO@q3lseDY|SvQhLLDq}E_ivtE0l-9QKUpo=dp9VXO$>YG~2XyJu;oM;Wh zY?chM_-5>z1FtoBM6Uu_)K0#*2Bz|V51eEsWrwJrWMK`=N+DuzVOwhU7BH_3LtnpL zkw@=lT1_kGG4p_VOkM_w)vN__LU-ZUW4QK4$4x5Xy$jF~30=0-CZ3A6WW3Yfxxcgw z@#@b5IML$Y%976zi2Lp~x%cGz-Ilne*|~A7<>u;qn|`q`-F$Y;_hU>{4j5s_zp2*v zrh$<@{NDAIp5A5)WSl9iLHN=mLKxwYK!3)#XPM5r=?T|8=@5|8Tj1-yu|ULI#Jx;A zC-y-zrdlH=`pK>rwA5yy0Yp?U4uPivRO-4~VgofVj&Wyj+oY;)H(IXscfmNB3e_2^4H1Fc=fxRc zw^iGedejc!_bp2MT_d;0UFucKpU3)#jJ74SYcTx*Aac~OlNDQD+t`+#rYbBYJC2o@ zRe8;d*|gt({Tkk4VUSsKNaFtO+p*`wQjW>R-J@y6@|3HdG)VO`Hpjqq1dhsRX*pws zZOdHZ^^*o$-=L4QWgs}FCT9DD^M}X4aQ`G2?&}_e_-*#wm`W6h{EUtA+)aC*ot>19 z2fle+0JCA+`h!LgEfCYs&J;M15k0NflK@MpS^+e(89V)`iH zo&NYYwO>%=eUj^uhNPh7(B=0pk06IaFZA?_F7ach|uk=S=c}OVMEf zOU1|ee{!;6etcC-#kEm%KG@JSqrvKJ#h76UBoSy^Y<5~qd6YnOw#@z8Shm%v$jx3>ktmYrxw9Cd3-Yc$P<64`7)342*QzUpKtmQ9{q+^(uN&5&t~sji(N;x zsoJ*RDW}+`sG_eP3i{RK?s;07(E4X@WVw@7JqZAh?fksjn``trMqIx~4FWon;`c6H zesNgrywjX)%r)y9=#4Y9_I6*9c6|o}bPnAMttgTflhdUtMh2!TI0dhp-yQLy=-zDf zSKsEggo!2sGg0Ote!dlCC8Ywc=fwk?!*@O|)cqe@M4Ozl0KQi%l)LD^GDnb&ul_-UQEuPxj}zCGxr z!^4@uJH>RXVNu>3gSLeIr?QL(KF?8~|M8Ch{?$!`v9T(A=FBaw!E3DZijkKU<*JbX zC8Y8#e`@OCC$s9ZWBK81!|>z5UXC7gZ}kB2{{kC${P?k6xwF~9tnd$s5WuM0{`Y^Q z+|Hkp;R5FGiChlX&H_8a#EJUWEJmWy{{?0KaKrzDr@99 zWsh;)L?GtB84x;Y`R!qX0l(4rDW86G`fRbTkJAET zhQ#Z|IN~H?vyRFBn@o#N$Zxkk4rw3I7mV3Uioae9KpdH*m<<%aP8eXR{*(U*)6)2wO0gy4=XQ3je&x za{Ox$;`%G${M*P|c9+Z#7-0 z1^w&0a%l2j11+aj^qbap+NbGUuKMkMgy^uyJRemT3(qVZZQn+&uU*~$tMm7-cRddJyt1gTz)=xiR7>ltuy}N=K0D#Z8%4rY^Lnv0uC~~&ceg@?ZMYw> zL#9XstcL?3XJ4L){4H(m_=pHj%f!B+ljIs)#uaz;W2Gl|uEW8g zMpcRVQ|f^+=POry6Y5dVL|^|Wm)yp?xrVy;a}9;uXTHZOxKHma^;>tF9V$ozF+cm` zPdx9;PWXfJnec3wE4q=OZ=ezzRnH9e+vtQ-Fy#6-1{)JYIEIU>l$;dMYVN{ z!5E?lZf%xsuA*pDX?TQrK0odpdBNno;BnjuL6u4~apkgG`wEgyB~9bSZpcZ*@xb$6 zBg3=X)%9<*Za!9@8pb(M7#3T1{MRPffuwrJgvw3^Fq}I7J9&N*81b;xS@XB+gk4tq z+~(U#X4P;DZaG^Yk;!k&2 zXX2Tk0T!g0AbI&;24E3{{YWlyf0REzKr&Ec-J=$@LoZAj${l#4tA~VszjjW++@+YD z{0f)ff}$7wxRRKeR=8^=ujog}$i)n252rfA_`Qm>fHTkBd( z@UST5TbtSkcWy>)Z6<9lRpZ;@)6CzfGMVxea{ZPblUy23>HHQ?AR1`5+ltWIV_89n z5mnd?wydPE-tCB~vineJY!4TuJv4+es*WNo?RrCK2-bht#7b+=l~T8veilUe+8#og z$dN#=zv*hN15jq)i(QmCO#DuaZ=fLwXHYqS*Aw3bFB?JziC=ute*F;3{&|7 z-x$>A`x<&f2YW~$uj;{_A_XVmEyXukz|GJN-tzE_E3D*@lHAq2oIj_Y9f<3n)AROq zIaB;O+W5D9eTPYNv*K#(JNIF*@^ykA|b3W4Jll}LBIj^l&+wVTDf3ne9n}%se`9GqgU+T5Lz3N6d*bNh=t3#^yqCfPpd)s@0B+P1RPZv zqr81Q8y-XNkm>9L%n>mB4cXx4|5KXPIu+|epb*f~uH$N@0vqG!0qm;7VzrP%j$&H z(&{_0Kv))EzzKr>%G8zn%LzYQ;#kTioDSx8;OlmZq2^U8TiBT+nW<(_GkNCqv%kqp z+TbSPQ9y7_tMR6N8-oFMr#PmP;S;sr(@7DoIy>zI!mD_6WiYyS4QWDfAYIQ>T*yl#*7e}*&g@;=8{KXcaPHD{c z9_UDm-pwMd+UwGGUmqq)J5)-+dRed2zt{F}T#ccFk+VT#Q}9$|f$jRXDdCHA#H_)W z*LO3S;~NI=SfJL#yEHMsurq zckk65Q@YEPa?Z?k89b?h8H~#tkjuW5omf}I1+P^dk^1`NQVQ%d@r(!X_IEvGj=!_u z=l&#S-sHx4S}#@Thi#8|95xV;No;4lae5>hUONZ}6bV*OKrJY1& zy{`#xUsdIAcW=L4obz@KXRk&NIaW_(NX9Ll@LI?WD^?m`{SrJ3AWo!E9gr%l)lE*E-&o{XY}znP zW8r2&Ib-XVccHmWm*u@ft5SyiGvhLpH!kz%{YR7$iltJ`Mw~C-oqccz|Eal3PqXde za*7C<${IUBR>jlCOr{q&#;XBNm;9hMFWmF|hs~8Ouj4?H9HUG%*QoBQG^!}rdjzs_ zOzKfYqE(mpsq|-sf^1ENHFj-#5lgZ1Qxi_rcR+?OoejzhgDt3!LmQQIbM)T70Fi`i zbH|lD=0h1Mx)QSa9R3o=%q|AWXDTpRW%(@VYa(Yqayra6K0+%whk;KJX;s?COgC-$ZrB62fy?gTz%&TF0{F*Z8 zzmOzUcz;W_*S)JgN&DQ;eCb`E1%@`T1rAZB`jP4JXYV&XroSIZHt6&^C{rHg)oGjj zS|yS3juYK@RRdCJ(DYV1^A0~Rt}Jp?)jzPt)iJH6G$1D#Q>>|?fzHm&EyDz7COgx8;_B#LN+nc5#a|hye?zMlt z7gtOW)A)8gq1_kD^3u6IqQ<|@A zhga!(>{-z{N@P_Yzm^D(JHi2Vs%25_FGp36v$*H7L-rp-p$4oPIMFy3S&r4skPdDw z6k~0Yt7Mnha_G`1OTC(n7yrf=wG+ctjgdXdfor=tyQfeJ#G3G zG74R7pt@S?U*S}}&uyVo!|g{RPw~!OvK0~_|3GvDvuK)B#@~T_UF%Yup%6n)x&uY6 zRyxfy_!sJ7oo3Tw?zVj>Y~MmlxBQ5=ElWomU44a6kRMXDZC^M+X383476o_sGl3n& zs@(2Y?i0VRP&Htl{%%(9!PKhJk|g#J46S~G8+|PfE{EEITT1ef2{sRU)6|jc^IsA( z5os_%kGXe(aLl|d%&eplm?;4PrA=jvH4)=UR_E34=LfzHMO)wzi-S z`hh>9X2v`1RhKhYzH{66tFEn8{s$bL`JP)~Jhj#@dB*!;;d=g{?zWz{L`t=A(*Gz2 z${M!TQcS&b4EI>NACAXOM2h{W<_|`#juu^AAvn$O_cd+kG*9a+L~yp_JQnwE#}|mg z<8MXl*@)eob$dQXZRDdYyEO%^tkScrpawT@FjY4}`$Nx2pdNi&-rAU3n_`^kz#3?0;++Peag?PfJs zdirfX2p9I{h`@A}Q!R4BH=TFK@+EkB$KS&;HthKTcU_9z4yfAUXv|wia>nzY;J7<& z)*P6e7jBcwUR~g<`q5#?*P@d6#m8w;$}n+Eh1yl!Rd#%a#i`W#YW>1^CLvElzJ&`? zM();?mUEIVs6{T5Xf~vc&gs~ykMODCTL)vBq|MvHCAZ^xWmyy&kkBVVw%=3bNnZ0l zcemr@N@Q&kSC@|AQ>tl+Lo=BS2bUUa^HK-m8t`xXOVM%1<~rk%0wu$(2?9$gLTi4fMXXxWUE**UA_OZ+0%ng zcDfwLAK(F?q#L;$NOex&_ALB9X0Q_EK9L$_G9W+?^Bj?~cUg3BChT9-K6M?9lOq-T zl@mB2p#T=>*fjWbU4NN(UbX?)&ZglO(^B?x2VGhG&S|F}%xr&`0^;WmU9&BT+vE{> zJ6?Q$Aqwa_8t@mB6q`e(BPJ^+Umcx9WvG}eMA}qYJ08_nHw##uPvC1$io`qDy{pT! zZCRe*reYTS9SB!n{Vg@hJNJK(8pR^_zbrMX!gFpn!h6~-QSoDvrXyA_RMzFx>fGR) zu>0gVu`X4KnZa|f4Ft^3r`1wQl;Tv3_KgJ;Bpa=!CmTy^M0O;e#(s#5&7-}16>^I0 zR$tXi;e5Y)&%>K6#y{V#q}FPoa(fVOU^$pij)NBmB%E|sWYIUOaJB{JqY<$ACSf0Zk5Y z{NjcSJU))wgJKFDeP*+h4A6AFI3t?Q4Gzc;&)O)ZjRbpOje&ewa99*l0UNu15Z9Dl z&e^E!o90cy@VviAl&h1*id=cIjn2-~&;@n&)J80boxX}-U5Eus$!wwa(8xLm4nbGD z*%{gk)*W%!HKSU#JyqeXZVSOih7ic#)W!%`X8BF|5_`0l|=a{9r7CR7E z-FeDI_Orec=O6r+&c?P$Z=z(|noytMjfl8!TzvF7N2h`2r%ZsMROYCf(mSAIzM4kRk_QnU}w_X~e(6GA@@NV;>s)qEMUgdHYxTU`%zhoz&5dp#Ka~ z`+rNyq#0hkCSWFMG^ly}9Fd(CYc|>3{&T^;*!7z@rrI-2>5^||O`S_pGPd;cV5Hz# zD3x?Ne8Vd~Hqny@SbIZPh^HNzp|28~!fwBux}-;0pj@wXi+!(&xvlrX^qb~dZkDs) zqNVIGXCQT=lxq$noeLNI?qmB?U11PoQ(jBraau~}O9R)ixUuvTgIHcRr?j_f1rYNZ z?;<}+n~0G)O9U@O(R0p2-K=g$g6PKh<@d`u{lh#EOOAcWA`mGduv3>*R-wcb5*RJUbJ03;i!RCxx+8i}gw z^zfhXAWl{*UYuRvnX|_C4CXi0Rkz&61p6j~9sAw&s5kGlRh(dKS6!h_j{Mk`7xx^H zt7aA1lu&vNvE))hDO6@z=xdm^(-GDFp&fy%bMo84jAr8IOf?_cZ2Wu94_yg1=C>j+ zyQL z>WQ1|u`5{l1?_A(9rA-cMGUySx;JFI zF6L$7AR~6-i@RZ(&5?T0862NCJmc+?wWnVQD5oJua6KlJfD4@+Cx0frlt3LX*ni!% z+lk1w+#SWId12zJHl*8tO7uVpf|Im|H4y8Q2+2gI06X`;xMw$@#(dwBm!-G9Q|MNw zG{;>Yt{&@s_rPX(&cdaTtlFX#%|0h5i97*WtDh8k%e&=Oss? z)eZ_fNm*tqvUUs-YL9gLc95VVxp7D{!2#u3eh6T0wNdOy?H9CgH^uB}ybF>wbz>oEP*%lG|5KGX2oe)LWvSM`v$fAntH_8k`;$~Sw{BH-K6j{rGL zQ_n?Gb%>eAk@hxM4<#<@^dUv(DYQTysC?4aRuu}Hh{ z&iVd5LSs*#IiE99k%P(SVyh~wHx^_@_Ec+UI9iA;e<_|`HmuVqw1Pmycr;wFnoK~TgFmts`}oRpmFp8=V%j^XtC*Z<<(qVSCk0#Yg8+MI4k zK6H-f-7bhzt2PJlc1}S4lRFn%0iniq;!9Ld-S`$`S#=AwhimX-<3na=>nC0a3%=TU zJ$O8}-jfZMFm6siEO^s2&%6$x*PNMMK#%O*5a}cW`fcW*;>k0)XFT}ngjv%4H_k6V z-!h)2d|qm@nf^N4`x&icwBBG^>ElB7TkO>+13-ab7W-K`6WiG%k~!<|k+ zBaVq{3;1fW?K^hnF+uEhQRe%st4qatnO7Cg=u$*RsOL#S1xOuIeiIzd3(X=m8RZT= zK{!`*JGlt1RYBh`*|P@z)K5y}Mla+BzWswclQt}V_}uSbq#nJ{1Vy2E0MwflYy#&O z=>Lnql70F7rFmb&a5-m-HD}wrBI1Kxe~Uocr)D+Yp3)=kxe#90DCfdEGRz|7q8cZ6 zl;<|@uu5rzNxF1H(Fk&nN5nAu@pn!$%BMMh*wcAFa!MY3c4;lrY233GyeUCfU89erK_C4iV`Y9j+p4B;yLl?)!3>xYHKZ>({;g!${Wl`J7 zLaH+MoJ$&Fo}6OmuVSvy`GNI$isGpg`w8N}yU1pTyFU!_waPE8Q}S}m59_xH+&GX8 zTrcp$A^x`z>WVCj>dswYy})KrR*E41g|MS5s)|`PF?;?_D`=*Qs?@cuChpn~@p$3` zQ+1JsJmcL#>M$0yg)CD0u6ThcU^`pL)o0}DiFZ@jj8ir@2j<*rta;YaAB&_juD>YY zGH2a1$FtOdI6&Ngno~4r!D4Es50x=F1KU!+X`FK~;+JgS`lv)xcD2By4X6btoxE~8 zB8w^~0~T_9aZ(o*r(u7KDB4a0=8wQ)R7M$%#bVvS-lXI&>h$MtJ|v6_HcM{@1Z>|a zHAPvJ!Q~!f`%ldE#wt;SgGW3D%;Xaj8BZ>+K}&uoJH48d{%7GthR^si2nQ{DG{0%Y#QqRQf5yTw?0psci)&=Qj|&x= zI16@+NT!vmSf=nD@DTj%T?ZG}4=WT1DD6<>;~aKE2;TIa7^ppOT%v=%5>)2LkkDP( zvjVy2+mNIDv{YxPZeIgZ_SkS(RoQW9a8U$vRE2Vh^TMvZKdiX-(xATx7fbX%6D~(V z4<>}+Mr*-K`Ov=xrommm#~J-p)Zra@02&nJI<`wLA05!6j3w%xk+eM_>@=x`+L+pa zMu*4c(BcVv@LXwb_ zohiv0Dn+tp-zS9ZvSt~h1(l+#AzSu+C+mnJhU|kGOtKqepBc>d`{=sv`@X){{k^Z} z_iV@U9LMvWfAU9j%x8I@=lNbzm81UhGqG zLsfM&7mc+S2fOqC0E1p!I`6pI;TF0UB)_rCzV)rOO9wWt=f*Un((CpRI}SR32zKP8 z9YJj*)gOZ7PT~f9GkCn#=OV}zuY<*Sb~;*;TawzL@xkD5J(8G3h3&QV7QX$FLt!46 zL}KW1pyC^_TwBY}#p9IonlphpgV4xgE3>?c%Jg$G;EL(C>pAeEyVdXa30xBEiun=x zQ`1Akhp`(eHoery>zS;FP~0G$fwidKb)GUNYz^q#&AW@dtIMiR#lpdGlDn))7>k!s_Q|A>F+IA^S=&AR1K*|yq{+)XH>7~m#jxjU%C%; z!28xG0sqjkY&6Dv=3rKLf0EVSZr69r{@4Lm#_I9`S4KXWH^~QUzuKGFH0yKPsTz-y z&)|*RjwVg`7pzB*HjwN|wNKvwjZ*esjZ)nkz-q0o7b7zP#=Ag@r}Eb!M)>*5m+t`* z{!W0c+c769BK;q{ncGnb0BwOIA;|b=ZfNb6K}*P^!q}1PEA_k=@MyNg&a{Z0*TGKT z8t9uGXeFcvUn`zSXPe3;4~QB&9_JB@S%=+C51i3ip0*E*Z)_@w2Pd8LbCG-N*k_^X z?aljAui$(@(yO@hU+*4Z9WMD`04?BNHOA6wCjcHEK-C3MaB>|ypu>O((+f3_2bQ2L z^n*A)BittuDC>d?9x%#Z+g6!A^|k`MOlE2lbaE2)#$Rnx%K@g z;N@mn=O*a{fr~7Ht=>sl4_A#a0c~TLeBMDRq#n(enyZ^2W~{w?Vv+8%`i>v%!=CvH z2xvIm8tezUa6Fj-{;IvdJ%o@D8~lT~12)PN_z9a&GtHBkzgxH-U{PL}9NC}2!vQ`N zgJS^W_3Q81s;Lt|2p&06ef%jaEpV)9%ixGUsl{8|nRI<@0(6dMD*^a{{%*-AX;CLF zaJ^I_AAmB9XcxLupZsVc_FcWvd|$u*K>HWWy26OXB)a0Z&;Rw^-FpDY$4PTYS=_pN z3Vi;m_*c!l30nq*Zbu8vYNKVAnxGcM4pe}B7a$p01-f)Bq|XPc(IJgAe$cKQOs zu`eM%UH&2$hIBKr#0)%-_^P>VFn>Wx>RyqFW~_xM9?)hsa*jjYNV%$)5O0AW#Vz`= z3u#{}-((d&{Gt&c=2K$lH$zDMZvJVN;H z{N2$UlhUA}ibq$RCyLT)*1cvWBr6Zy_=|VW0Zy-n`^X`?Q`dW$k4$sZy<8%Q{a3P1 ztzJPUBkuf3g0WJ>!-WVc=*pq<#|lPUjO~O#?^EHCdrIQx0HDDi4om;7bhrA+3sN@# z2a5b!&iVjC!7D48 z`v=KE#3a7Z@E+Ss{X1U2RIbM^soY>i-#))u?0+nf?rB&9FFES!UvP{6nW+@_UzkcC zXTdoEQ^rOHz;^QFSyy-4jA2fH=Fy>2;+^F|&)0z8y6*llK5$%K|2yMiS;TiH=^W4M zvY~p!eTAUa*W?w1s%DpNORpBIGDd%;nyxR9xYV>M|SN1V&oM3Q( zswf1y-EtPTP-1kaK;r02<6H|ohi2KmuIC_eW8Lp$o3VWLzQ$y%YZ3aNb`XCsdc<0f z%gZD$cK3e#dah40@;I{SoL?ac1IJda1(I$mE>(C#7(eC#IMr` z{8c_{7Tg$z7uWoj6!vD})cV(aa>l>?CayUzb~RW1O%O1!g%%pr=3Tf5NF+bzN)@_Gp};1B`?Ro-qpsP z>TYrFnA@ca&*K8h?`8{0UXaR)H7d8!03sxQMbl4uRQ3v0V28=L7`c0y+y$Gs{ZIV% zuRrQd|A*%DKYlnqe`}-k|8GB>Teton@>Hsnl#W+uRYKCi_0?>{n7)B z>+k(Pu%rqHSx+_k<@)1LvGMU2MvIK2n8!_5uMpA%+P?i8JLknWxc7WdA@(1q-5<=N zE#}^jk>}D*Rs9V$@74WBNB8$d*ptkRt@#Ik_Gl$n<>u(mG+lsEn{w_yxtY8cd;T`S z6F&d740fu=%CsVL5*nZ>sG_1PW^(84C-2-`t2~!cF|E=w-9rVT*3M&9@3c>=S_w^F zv0*&61TJ((-@z&RT|s}r{%eE({mAOM_&C8srjNWB{-2DxvX2-EXadCGxGy72e|YK4 z_X1uz;719r*e;$YD&@!L7UXb98VpHrH5R|+__VDnYE%&h zP~*++Vyq3sE_7ZUzt zZz1-yCx|-`etwk>o(bWG^_wkE!DD=JgNCRY+&P_;y4Xg1%ANV1(b0cVWdC^Hl7Gii zK6PMapK&TL%73#jFC`gN3z)7{4~c(6;rkvCC{w`9xH(>w7rgn1Gv{Xb-B`2A*b5iF zXaQuh97lYQL9O>~=h32E?Q~h4wP3IGRfV8iQq3@({ny;WxL`seT}OmwjEZuuADS@q zNmHxPw7hcUPN86en6PF;6@VVGH^!lA9p=8hs{(Yi09EDUYg^w07uXTNY@w9*Ukn^} zeqo0dqj-b9;yZ=NQIYq(+t0VdxAW5VdKBun4-8r2Q$6N?H)J{VOML$0f1kqL`1#v~ z$~_JM=XWYI%3ofp`M8-f;YhWcEvI=?UfF{Zte{Q`U|M&^Pv>E|Zdy=mypfuiQHe-e zlmELtfce$vj&}H2Ldx~CkXs(lkCCv*5Ex##CL*aseA}uPi5Pzgby(Sv9cp%ty&yaq z`zk?9YtMTVkSquUBnxT)qLEA}`7t|z=ZfR&numio#Z13n(@Vwz(vu|`3M+x=17`iN z&%EgW+on2*qzm0!oV5=9f>4LvU6r9S`;;18cd+$PWB0hT;e*wk!XenmL+3c8aY~J+ zxTKIte{_Y>d z@OzH;K$t6=ThaTejAwFDBEx~vt1otq zCtpcv`_5y46^j&@2_yiBacGUbj(hE1J@?I!duu6cs!GiM*`yM*aZ;6b!}%Rj$K`>I zo({Sup;6M}j(3N;L5q!Y;b7*w92sY!+A}im1ZLOY2^b0?GLLpR%r2x?!C+bwjk#HF z6C)zqXPiaEO-J7CBwuy-QUTDd?T@yHs6`yRhadyS(!)LfB!7OK`rmQix!L#i+=s<^ z$qcw}TFF$isXu=R>hSL5mVPEL%F?Wr*xKMS)!h46S%uF(YEvVR^Tz7an!M**ULK_@FgW%^Oyx3KVUo!2QBH@1@PeDknYmz{fsN z^M(u9H@8YYV?!=yXPBHihT8ON`$r-g&s9iwk~zvB@KLJqfhswZ?!>d#WYizj+vh({ zM*QkRXdZMSYN|e*032%tu07vuc9ZXqpn(wY8BWlt)W_UEaeAlj25p8A$MtV+OQ#Qm zV$LdT**AlCVF!Ruz|g4>de5tY8{{T46XrX;QETL)Fx^JXBk~zy7vcfC2*O!e6Gg&` zaP66^aZ*qwt&DfGxum!6hFnMF3(<{ljP4XkCAj9@!7KVntGYT$2|E-C0jj$3J$Rn( z$u~+l=z`1Mm}ivv@xkL;6A^y+yDZDC zTMewgbl2jJ^D7CY)~^{Myl(>T+fM_JkS0vG8uiy$X|~+>lZSjsgW73(nI*mB7qRtg za&>D8Vo|23vozo40uUNbg*FYPh}UpFz6UT9`)hznqTjCM3sR zpH&zlhYt1#X}>?W-aN{sOq7m~%)kJ`9Qaqn><5^@k3pg!qR#>laKJZ3`J-`r21SU?h z#HYYS_ABG$@C;S_OvlsDfV)rmGzr;U@*fBx!8KlYNam_-1Syr042tT~#8^956ZnFuLcC)kQjcnb3f<4&s5uPE*C`h# z_PL4L3)j879H)r*aNGU?c_cX3IOfSv@SIn&ys&j%AMARbioDh-cQf(oMDROJA16d+ zaOa)w-JU9MY{wAv4mi2GrhGLpr~0hQxJA1BqJR)YQRwIPdig=v#$l~c-W8X2K$ zuLCoK_j`-Y4}}5Lvv>7iNL(($G}R#_V(UjhckIQXkGG?Ekh8#Ln%caRn|`dO=(lpg z>HCLwQC#4=K*QLhAd0Zm)s+6?JpG}->`v>9+X$71X(`nEiGWQ7XT}lwk8ey)EeS}_ zhdmK!L%O2_T5kwH?;*3MXL&5vW)wI)j0pu=zm^eCN(oW@7=2-V?p8pd$`qq`?Ck^y zkQ3u6sHVF`d|%Nr(g04u*IA1=n03~XdErga^@airtaZI90Nz4c30J9=_EcRXh*pim zjywszSb7b7#Q*id^kv@E0B8=kF1H86Pw5=OHBmG~o~$WvGxrjlp23cg=-R{j zEb6XcxDQ`wr2Jpu7oi%E?^WRx`U@E0;d0vRpZyzsM-ALuv><7}3G!&R0(J};4rs<3 zdgNp-fId-fa}K4_*+{qozB_gsQ{eEw?NJo=NcMHw%&>LL<;$>H-*?PiVUP3~L82)F zhCf+H<~a@&!)U4U&aW(l4|se4V%HHcSYTj2Z6UXPcjlqvzfA@I5sNB2g`T{v0aH7{ znr`x6Buv+R;lAH@QN72E4fmBYvtxO&jqUcmOt`IMH#yZtRR=l$!M6NspkM&S{ov+qKO<<<%Wp5my_KnW?U|WprXI^~!xa`_UXNs*-(i=#A3=9T zg2WScQyC_3v*lb*@-X=zJLJE3AqzvmDyJeaT6fo1XZ zvp9nMy)NbBN%dvo1Dj2F5#Q|va3Y`%>#+u1ZImr^pRbjhzP!OplwWh}^bZ7J+*>O= zo(Lv>n5d^sh@Q|?Fx1~}l4&AX3_;C)VN!Z!ofNGqxbEb!y`lm6CcY^3?c1Qe4)raG<%KtpqZl^9)&xEfDh*FL83jrjm>2D7(04X&oU9&dZB{A>KP*7|_VH$2C0L5Y2Q zYoE@vqA#mj_9teu{UTzJI)c_^TLy%HK_uM%-L1hNv}z*%4+G=9bQ%rjQ7>}jh@Hye zlbjcr&zs*ncKGD2?iaBa&Q?7UdHUO}TThQLe|$fnehVjCQ&(4qvU}*WWTG^6+=ryP z-Ai^{qx4Pg1z=h!l#Kp%V=38UUE{P{qlI$)+d)MH8{2j3d|5Xn^+Rof=*#dGF|8+X zQwR(lgkPJrDL?IRTw`PWEk5cc!%mSHS@Q3UKqcm! z0PKdpu7}Z+X3F(#c*}WFul@#_8p%3N1|$79B$1E41o4Dm;EmVsS4#;VX9mgQ9)|~q zR7kmvVnlILKDZ{UrjCefyQWwb*9;a0S*76J8+2_*`cn<&OrvFW450GHk{F#&ga@f! zeJ^Ege`@-7ym3O!_G28n(ndxacb07P>lB8g#T6!2^h_Z&N%;EbLjQ2dSZo26UE2o&n_)hW=29x@1$CoS0(4XFXQ zdIWYA`l0mT;LsoaY}X^;bgMBPp5SW{ThW+uHIIF^(@RfXX8hik!9srMAiA;VCBze6W#6<f9IkSjhXS z>k|N2X!3G+1~`ly-<&v9wVP>k8g#6~*MfkH9dm8XFl%5t7J+`P>46!pA_z{@*X297 z3pSrJg5qbBMx`WTa80}Y0)ehzJAd+xCU9X)l#j9g?SiQg5%$4_M$ z!}DKjFG~x`X608JMFp&Wuvk|MOX0m#!j`%JwOv3{3becD#`STi$}!b@rikbG^Wrnp z{)MTW8!s?@0oCQB(4Z0)$2~$3|Mzod#Dt@Tp`2FE(lyU4%i!C0$0AoqbwSrW)5;g~ zP!af1y-%xz>XI_l1$s!<#^VrWxK6n9O31bC%+M<@p=AZl<4$S5y?tEfX`TzH!F>gy z@|D`w&3Hclxy9;9x9EMT2n-WL?h1KjKsNacq0$Ub@?U@_I{5{ZC-c#tWds3Mb+kQh zI!=-Jx!y1pnfGPQ17BM`%|%I6WUx!gXmAJzW?tgq2W@-1(B@v2u5qKh%e7vs+V&nZ zW@$YXvvhu+ZA7RQ*jibYF@I|@)4-k*LaW2;h6xJL`R__|eux z^B#EpRE%e<4Z_Au+yenXoH*Ras}M8V8hFTCUVVKWSLzDi#lBVsF6gMNs)B}9=+SeXv zFsxeP*kZUlrE%*5eV9vr>i5!|QyX`q8PnQNBr|^W?fb!0E_1@z=53$qQzTpT-i@o81j%_km-uk# z^C$9>;v)Hq^9jxqYy%gc`3Q`%@@J>In>Tv%me+BuMdqNn;3`&&OlP6!w@6Zzc2~@+ zd*f2v8^hX<xY0-%IqkmlgMJB&?MP3u$AW$M{>}=081syE$YyS#bU1B#@2iunORs!D zh~jttRf?_HYW_yLBdS}7w@@VIr{7o)uJzQz;5gz6(wbIDsFYyu<6o(a44ik3aL(78@m`ISjUUW=xHam zP8vcQRX8#E1ii6Fi^XRVKc5B7_<1>?i{E&bw+_{g?fdS$fG88>j_rt&<(xauV|{MG zcofNJQmq=lrO3Lch?(BkCrgK=oMef-5dNe=s6(+qKf#gCO}ZjY+_SnDHMWa=9ih&V-h6N;>GCjOP-f9!H0s{0|E&Y_+vo49IZ?&aJ z(2siClm`Qs;>H(W^+Z9Dnrlvl6C%RCN;%p$jKV=NyaBo^izViVI88=fPaE{9yYWZ8 zYlkt<;L|^KSp+oow2Zlylr7SS*_fS5J*n^4?l3y2$iPsmGNF+b1;tc7>YdzP{YEjg z_EIoO*LCB6^`x^^#($x!?b@3s;dE_tpFU2LGOgX3b?lu((|Sge>e!>5BG4PyYqiGw zVurkZD(}lYK7nUQ50o=ch#3CHGHM)u6MAM$TW&T3T;8K`$f@V+mqS7Osd-hP7f)mSH?f)N0T0}OGDlI?Uiv%F*_CJSJ+yz-o}5h z)sqYKvo|icRUW-JWd_oh^SOA6Q0xZMC+j#5wid#*>Dqi_K*;P+{5QlaC{MiEANRL&3VtRG*N$CYWfd)atT)a$H4WE})X*+&hbEo1w0-giiu znd$uJjFem05W}p8T+&uZ()f(E>Kk9JV6!*5deJrWHgec>$7Oa^`i!ziv2<--3U#{W z-CiG7c3rbCSPRadNo=wk_X13=+5?&Qr>g7{0C~Nh1YoC>{=l`C4>!@W$#C##{!K|e zoXSBpSyOt0X_)T1ua zhXE_`JAV|I9aoPb&OQ1UKsuEC|ya7^QaTY0%jUPng-u``rCw41j+}=+u44U*HGIR<(n=MbMIC1j#Ou7vCBG zY`^aUq2c3}U51~*mePq=lnurAfs>n<*sOwOVe&=i~)8;-R}s9k;80Ssk86H8A-4Pu+VOJU+Wz{ z{l2qZrZul>?vvg4_n4Vn*LC3Zgdkd@J6B^r-{@xo-NtoL+k-5QcdhQEc&wJ2?Lo|X zOd4r1S&qN2wvjbu(&TEWrfox~ONVSif+$zqu_b47jB+@Y>}r+)x<9{H0nwH~$BQ2d z6H!zQv=g=zVi(rE05W?9EVhUzEth^Ic`#n@Lyk4lo*IF?29UJGAPKKJy6X(I5tA4m zlidngMo>R4C>pN}FMq>(73HYiidt)ewY+Kas7edA@x%rWh9hz0X=JOGlTtA>*!9uA zv%hz@D6+ylY8z3yoQ`5V7z6E78 zi@x3knYd*ZHG?w2TE`!}+}Asv@|AJ6N_5+f1e}Q~7h@!^9dF4~%G>IR4aq?Hd;gH~ zC)<2t#b-6PN+3<^9F|ph9_Yp3MrYk&l0()l<#hoDONcK#-pG^SHZx-@V-$5c531#pV3?Mz^AvMlvnC! zR_LqAS5th_Q#ti#6iQVeo`SbJSxlJvla$5F+clqg4^*bhrc-iWz#-SI9BF`?tz6W=JZ{^Lx>bEV9<`)(%tP!L#>3P`0r2hFyT!GoRJHcb1b$CVsm}Q&Z$Qul zYyeeLt*(=5(P4kae9S|5qOlf-iypVH5uBm$}qUzSgg$x_=xhXOo4@-Jg3B-OF zwHmrR6Y0!PD<)JX)6vaEW|_WGSyC_eXni#;?Ag3xjIhXP?k+Z+3S;&BxgSdQc5k_1 z$$ch=`I*y4Ix$v@J+BnTtoG#XeJS!IAXPTclMTHtF%iSX^BR$-9g@)vjZP?xxg?Tr zsw`zXFQ&y6FJ7)a#0zu7w9~1vGVZH%KnJUAIyCkoa3l4o6=;gbpKA3nn_T#vpfp?ls+>E^PO;aEzAdnmN%jmB65x7(uP2sy)0~u_bD^U5ktcn6!-w^+*v-7nxpXPtfj@63C|sYT&0zd) zOx88WnQ$f`(eZlKZW46NO9m(iCB|&3&2rlxW9r;x)~^+BBNUML`@(AIt`i^5EGt`E zh7&(t0TGmk@%I+TwkHL{?SW0watWS*f)Yf83TSDJ z6dD3=<(CY|XdZ1b<$a^NuhLE#^j0k5incryuAUrgR!~;73;HqSAbvdMXoZ+V&({a+ z11u*&CD-@~Q7;`*y>Ej~+}04*TYZ4&jJ>Gk_W3D89RSqvmb7jhF)6ok2iPQU2+w+f zvuhu7fqQ>L)oOgb1d*7xvebesbX!t`)w7t!TTlA)&h~_SDqrvOM2kAHdSR$wO2v%xW;Z-H!oO|GgYPuhfH;wsKS=|E^zQ%-V(#AZb-Y1QQcf0YugvYwAEZg z$dCNJqfQ~4btYgzdalm-@iMiYT~|d&dR~G`)qR&`mtIBtPt~-_`aWdgkt+){SIwUw z^YqsgtEWG}uUviY0U>KkW^D*ndbD*SotQyFXch8!`d#Hie`QFou*9CVr) zi&_Vp@YNa8P`V`&!<*SZ7rw&>!zWazWFFGYw(6tmrM;>LAgPA4mid{fPyIdN#7g(p zMU_;=mJ!ByYjEoxfobhgMi5)qw|ORTq+rgDwQ7UUNtZE_dIn zQvvNhny53A@&iOe=v?Wav zf%|R+8hE)H>nzp<;1G_A&Ml5D7ANZV4E&v`o?a=vz7MbnFL1rrxkVYhwAFCYjW)vf{+h(7wn(8+o z0b_#l_atIH&#s~hO81YDw1w+pYK_-l23w7T8*DybPq;Yd6#HRbZ=F)*xHp{rgmaYz zLGhM8X4Xr0eK5eZI>CjY8lGeCC;bwqc6s2mnJnG)H{t~A9RuI9ePe806YZ5U{GgFw z)rCCw{Z@N>FQCD)OFatuc>4D=F`;nyuJwiE{=mfv1?%8(Zl^>_eqBy@DsH_Xd&Pp1 z&0|K1V8y-fd^4FHW-VV43M~#Exo46e?a1u*08{MqoH9(Lb+>{sO6}3|KS>0NU@O;D zsLqg%{ZzrIYe}=BPWrWpJe|~2l89Tl5fu|g5a?|*TaoCw{N(-is#k|Woau%lx>$}~ z%VysOOI7a?v*4NBu}MYNhb^Sfi*@+cG%2t5u4cN`IOjYSd^UBYeBU&g4J6jP`)y6w zx?!m$DS*F8t#6oMfTsBZ@AxHG9>4cn! z!xB%ZmGI}Zunysa(&C{QUSvv|nO=50q=5z5074GiTfgsNqN5xOlX^(hnIJVCKa2(P zi14kQC5U7sP&v!0seDM%0bLr^jRA!^en3M^!6!i@g0G<`wC92THhkQPclg15C8hnW znYG~MP^1G!lyZ$nkGxjd)(y&RZPLIhnGjkAiW8wzzCfyEDY}&3MH3n$7C+?%-L_Tf z+g}8NTi|-1qKFDP$%?;7N1$z-D9K9L<184N<$6Tv9j!1x5Ct%zLL$#E=$V(o7JUko^eg#vL zVU89eV&>Qrkc*AP*;uxr@C|R)#nI<~B&CstZv3v|z)4`M>O6%Lt1tPH@id@vfAls` z@le{k=(VKv&6eyi^(!1`rn7*lMS((3{Fj@4#<`~JDpH3}ix-Pc%-P9kVPZM4RUg}I zN@BJitU#b*FHXB!{)cDgHJU*0zTrSAg}_-#G-5pb2@_71h{Sxr>RfVlcUG^)o`>Iw zl}ENN2)}|ZxM%N1CGYu9I3!JsnnG}V;ZuMo=D7`G3rA_OVSaRQIq*K8R^m*B`&NHr zBp)YANCM~>e;^)~l9nH}iJ2;onl_p7f4?WT6C79k8h>zyUd~ zDg&U-mg&e4KleHebUemP{sR9A(5=;Kl@A9gd3cuU;Oj7E`py*-u0vs?f^}^2VW4yR zKJf=*8|I@8@5!@&9nE|byx3O~*l(beJN)9|RN}YmwC)y@v~uX;!=IlSfUwEvQVN?%usS zS>of4`ruG%k!CBYr#z)AKXbvdanA8qX?+-{BRBORU^*~A4MyFo^I6nQRrD*8G^=P^ z=u35y!-Q13PktIyW;Xk*s?29b_t~|qp;LKlte=_>%H(4@i)Q-$@kjn(?he!>Et--+sYGix$^BB1$3d&*j#P1HbNTA}+J}Qf z7PVp|1sQke{120p09`O0)srIUxhCU^?A2Aq8!0X4#94`W?e8oT#_eMo^nX;?c9a0f zMt?vDCaG5Gb4&W;pD)XFPJ=koQY&%vzhAJ3w~p5F-s=f^F;;y}4jFN&x1-MK;FUgL zbV9!uXpZh#FE$-J$0mBv^5p!@`|@5FaG1t6qm>F* z&$_q)274~}l~ErVAE3GUkqE4M-)hF9(wm{o#N~T%vEiy|ttuVwrazw9!9OE1e-o&G z`hTETriwr%)QU@_0Q!j-Jiaa`MB13xDyDw6RcyL07NBP zz~4VJO1e&&JF90!N9edBCPLvo>`D(qB*US&oy*MIs32xKh!ch?TOZhSX_ zdh@?bi2wO>2Y=`%{Oyf^jB@|(g8%2||3CcjGe0H7$D5_fx|aa95RuPow-N}(q!MTh zFZ=QG@&4YZKUa}|tma>#aedPutjsW97n!BTm0mk*DB*!uLl9z!9l*te~PQxaK}Nzw^FC7#1Eqac-2>6C!Lt55iW)2=~O0 zrirUS+ol>QaVOw35*)2c-Hh?HupoC-O<}6;r$@7$Kv}JPkXo?N zrTZbx2|eQFX91r{m9ln3??Rn0aG-L>FUN7=+s-t>|4RhhR$2gY)>xB_f={YLId9Ud<+zv4PkmCHiL zFAa7y`e7HIK4Cp0Q-MR*qhSCSF9hB3879Mi-;MuIH~#BFZvN{+9+VZH|0hi38(4}w zW}k8u>(i1pp6o6-VZdUl*waeQ}k z)_rele$A(eMkVpKj437*>Xu0Ue%bn18Ocia#*^gYBT$dSE=Bj!L*(`pvQeW00cq>f zVId#2H6@Hp?|l0@$Nz8bn7I){z1jqEQ&f96i#yPk;hyqGyZg^4grD5%(KtAdd!rbZ znA4(*12JC*XTQtMQvj&|>3qZE#AWk1 z3wYt*0vD2V94z$b)h)>$PD>Bj z(j>vC8MH1c4nvj928^W99<6(huG7tdHLCIDKp00JUUXq$0QrSf0=KkGeaP4bq3w_P z1131=Z|?+gAETtIveY6`ueq$<0IJ2ZOIzZGVko_=?Z2$aI_+Pf)j*#3^e8)(P7=xAW131I zX0Sxp2B%Th32RO3ji4XVyh?6ZWa--FwiJpU78A0q6ATPf+yM2hgIuqPLO|mtoHA-* zG$M>v7pX@3QU^K4F*ht2Yws|BkEixc!XGA*!^;=>;Rgt$Y6yrD+gosGdos*wZ2vewQ&YCCudZ=0yk zB2fF1O{*V#nluouJ-vHT?h`$%gVG#%!~OT`LNmnx?9MlxgSz6Y3bsSEF6O%N3n-=t zs4793dB4&@#6GuyX`8{_wHYsP^T=S z^xS{^wV3*abGyn7T2-7EXxb^mSOT~d-j;P0d%YSD<3d2TQkAl-Ck1qz2zU4TD=&eoF(N>)a+{N9|$5_bl;Qt#M;~ z^W%`x)|4~yv5TJ4+D};%VygLC*z(6!4jBs&pa@OOmD111EToqo z?Q!7EKRr&)aGH!tlkdc5L9G*5ObZq#~Vv-vWRpm^d1Af7_=E6{Z8L6X(0^wA4YX z&_Y7(OZOAiv0XJwik(tcn@?D$@NydKwNfVaMI1pOeHfKc5C63p|0;mSD?U$$lH5sq z{jfDYJZYu4ypbCO+aJzo>>3d}y$hrE)As5d$iS=)!swlDnA#Lvb$>0QJcHxBpuul=Ai#Ng~74t)c zQ0i4Wc~!oo*g}cPu?KLJNh7d>*FGHn%ILOhU387y+Z<&I^}3@3_J3WJzu&5-8S3#f zMp$CFE`$e{L;$-zn>-0R3_286a3%%U&qU)Ou!qwH@3aoI2p>6ObkJ@w@+96-`biwi zKfAZA?fMvdaj-G`P8K|ypV!u}HN{nf?AXeSM_o`Ntd#vL2<#{OJ;%I?x93;sG509P zFe!F#90|Ik3jQIc#oK#sL~DXO$IeJU`TbX}yp;r?b1MH;(MB5F$TtB%SiA>+e7~`# zgn3}r^)S%jV6g7CS~AetQN>H6XMQ4m(e{0rm@`sUm4q2_&K*=V7BG|&lD(3VBt>3K zy3#;?by61g*&E#qt=D-kjmYb7?N)~hYGCasBeE*1TeQ%FVdL$eF1zri6J9=_K9rO2QkCPYG%T>;aj3wA)tZ2wZAet1k zK@}m)iL8x_;KH^P#*87>^uo2=fDmp;!(cpn1iD?C)f?Y5->0?`Z<`nJ zDvZL#2!di-`^{jjF}@?^nEDN_J0tlJej7sBh0c)kccV*$H8n%I_>|wRjOms)-4so&r@GDW7TrcBno_&k#3FvA;eOa|4q}Th( z!q*k9)IS=4nkwG{zIZM+jqRs0T2e^mHG-!Nvsqj~q%MoONQ z{DzLSd+PzfAMKYrMYnb8W?|O_^z$y9Dk_#>pxQtw?pWX$3~sR-Hy#Z76^+)QimDma z^5(EC({~!oT+;uRdOZi-@9Vh=dc28)YnKj_=y+%k`ue$XiT%xU>P^0s^{Le`HU9l3 zYwxbHLheIoNG(zdvq@_-m8|EjYL~+7t(UPeFf*<1);|k1y!}172C*-(TZs19uEG^t z_c!!Ua5_+mwGqi9i9pQa(G5QNQ;)iMJvsr<-c_C-K+fV$T$`$M9h2hH9bOHi?PbvR z+!4D#lGbtwbb7i%myteBKslkf43Oc;FPj`QR)XXOS>*fo!*_;9-Z&mWFzlg`P!|eQ z23f4J^!*kejr4_G?^Ay-By+jtWSOK^Z{z)W=CoxRmjy%A%`aqXo4qFSWTwf zbjD6GJ+)Uc%A>m?na}gupv70T&_*0jR858ZTLqW4^0mzJLuz*+^F; zl}V6G><|VvFpH#X>Mi{;W`*tr(a{1^P9=CT@beq}A&G#5p4aes(#CN4>bxnYMhWRz z6{AW*rH_-`il`H5P2(}Jtt-KdDg@BBbFA~)>?16o`NxGJWR!|nF|A#zeB#?Z zdqekqYu`#7bYH6>G^zFo6KT*4TpE(+W_l7LrO4+&TmBkcl!f#j89iCTyQ zR@M#WvJTyCC?*0^jZ#|J4Z`X+xJee3?}wFZ>hJdS`8kJO&G&4M+i&K>Y}WuK)o{Yz zEDf0IRRVgmODIyP-)bux$QZ$d^u^`4iow!y9ZHF|O&j~#96{SR>Mo5ZO3j_BBVubL zA$nus7EkN;erXej(w1HRJdBK6=-97Lh4qoL!az?yRqEaBc@lIaRzeYKTg6^ z*Bv3nq#ZM^-YuN5>W3Q@YvSw%6tPc34<0hrTfr6+%GgGU?)b;kijaPtT2^dvhSvnn z$=teDld<*Y%;s)TXe#sY$ll|H8x+UiNLKd(fw}qe`&4k1BBr-C8}G9g?C1iW6;)pS z*6-9XaTafV49>=UcXV$w%N-cN* z{uS{FDFvwl{Bq|)6*q8p0eI+xv+Dp4ZT<@njVUIC$X}YMJO2x^(o)1s0}dj!zYc0F zg${#UO#lD`F0!=hGnzKauvHU++8cHssH54^%hIB1c|)T7&Q?w{VuA`OTT!c0O433o;9^L6+4b)QqW zZk<1F9sjVay0j8Ed+oi}`#!(tohsce#qY+oQ^t&LlH24_7Ld}#$Wy*OC#nh&pwG49 z${&XE8~EU9&`+MMzA@`6ryE=ZdK`n%T}K)8R&}CJ>JJt}#IuhTafY8V`3p+DYCV~6 zvD4!orNZH2{o|kWq=v?Gf{tn2mlB=8PbjsnTrW@0MOAEoC~_rRE1#CEegGpb6=3RN z_vaGOE423};P~f~ZV`$UdZ&&%k-yz$C9Y|N{9#7%YM)tP=aIVY`Er>Gs02bBi&rGxQo_9DcJ3TXK5rYW@QUGC%%0QnWz~b6 zcOBe$uJa`fezrt>66Qa2s)V0+cz7}$9^oMc#f}+r6TO`bnTy)=3f-xJU&V?K+}6JI z$-O7XR8Gc&+h`2O?Rr}BFfdLF9~j&QI#6?g%$JwaowpQNt_ng8h=AeGh!QlwUf-o1 z4ZT`G--fQERHxU7Z40K;pgT z_MYbGf}`S>9^Yg-g+>L56c5eC7B^daI^vZ`uloCBOC~a}(l0SAbmw^EYKQWA?I5Kc z3mGg=?A#j_lk)xOYIYrZo_zZFGwN=4vF8WZ z+?ae7a1rWB{xPq#z`5bURV~mWE0X4SzDKLJPfR&$=&wB{0h!R;&Y#y1K4`JOIYkJ0 z9SSo)9gy=7ST1 zg#^qPNrcD00^8rYq+oI8YX#uoxn~A(q@1+b_GH`9JvTK3@EU%u9_=8>@GyeRSp3~y z^#k1G9ML+{zBOaBQ;qxvy}(|2QRfqKzLx%&{+I{Ha@QdVNN^hKwz#-t9anuFd4FE{ zZmE^UEdNX?2zFAxU(I1YdXc_lEF)Y5RzI0CCK48g2>_bI!2k{Z;xwHO(_5ILQNg+9 zk_;^HA*i9Xf{lYG=nGeYib(CsTq}Y#nbJc*>dGDS&!Sy#Rh>HghRdD~saUs++J{A& zYe#8rj`h7iak>hQNqdRgP-qJ`A9XM@D6!S{K|V3Jnxcj}WFCOz$6o?&~Lk< zgBIz*GziJ&iLHBj^vX-`wa^b^{qe#HYezl`l{lTKwkdX~VeEmO2PBOZ zT1@WXwlU8J0ZKz1Q>7BP`+iBO7^|_MfyzQoPve)=i=^lN@N%E=@-4oOVT%muHC^|A ziA@@KM8O;y2;s$v!{m^P%RZG;{B;UJnT_P?fzR=dLJc$XA9cuE^Deop3W->fFrQuu zKPkv&nC~<{ws}uv!Dxd^8KdIRu3TI6&Kz$Yg>Ca)HgEJ`4biIw^t$d$D6$XqJ5v|my!KBk zW0fIZdS{wVJ|v`a%!iJ2CkdM54s(Iop?h))>)DMWZT9GRxE@ zX1l{(D|ap~UzXWqRXX(m^66bgG2k0u4^HiVU0NLelu_F`+2`FB6x49Z*?Jv>_TC@< zzC3&I$#o0je=X>9sC7nVnHBZST7AV^;PEtKJ z{MUrUqFZo5HqZ%oZ}dXf&qA|4?6-U*(PiEAFJxQu8?p_;P2;O?#g-dA_?9qHR{iqm zZpe-Oe|rpQ#=&d*IY&jZgd@b}yjTXJi_$Z?+4KP`x#$JyFP5bM8?QABeOoo|jO&eF z1xQZ;!9!Xve3CYG?M>BTNZvG$fg$>Ws#rGHfIZpY*>r!q8!+t`b%Wf4pkEq3+b9ED zZ@QZZs@@Ku@(kk653xvYaP4BxXz)VEV#^K$sLxlos@1+1^sGY(m&$+{Xub1T>;D){^#BFty%#R~BZ?Ap0!|~42r=Ip&cAih@UW|Bc)_V-41%)||Q{KTh@58i4Trx#e7TF7J zxz&jyW!yLzgx}(w=`BIaElm^4b7uS&`m2iU~V)Rnv&W=E2q6Fz~ zy=!w2Kh@m5%=>6Jd$$HXcZ~6NS=Ia%d1QIcL()XvGPE^JouD!TZ4V^bQzhiJrXG-1 zC(4L|RYe517Os?@QcM&NI(X;|WYaqssL71nvVyk-Ybhu({2IE~d2qas zj_GMDXVnKdpg*XfknNQ?j9Fz^dqT)=)#xga2U$yv!KF}+#%4(k=R0Xs9yqoQyRpG} zLP_|)--LhRUrQY~a{s-w_gGp@)o-m~v~}A3sYlDl zdy!#I{q3QtX`&YN(aULbAZV!7If)9Z!w92NN6nY_dGK2mSCqsc1ts8p^ozQE4kXJ6 zg@REBZK;jgs9zm&wF)fX|93QaM$X}~5xcae-iS|XTA#OKK^oDOX`M5Bs=K!wvpK$V zpBKJGkg0H8JUP1Pcz;3sjF^@C`Bh@)>X<9?*)k~L#*804ud(9AB0gwZXPq;XxtD5X zljCG^BrDe)$(CN8$G9McBNNB|W7)Q5Eu`VK^R}7u0DJdfc+=1)4nmGyVW7{0n;Kx? zx6oG$NgI_T>;z?=MFCIIQx_VbeBeOYW^=s`vK_FqYE=SMj<`GW#9<@a~`~Rfb!PFFze8Yd_o+N4p;+wlO2{<5@FO{7#ydE0rBMY^iM> zG=DVI(pDR$sd3M@bXo2N&cy+|EK%us>BPH*sUqE$+XlP9ubFBu+pP$SQlWJ2o zySaP!6kW?415KWEb;448l8XJ0#f1i4wnY+#sE_0e(DNp9YYVR&4|db63sq^}4sp|l z{h)B=-bSl@v+I#6_BqQ25o4`g=<6R;w6-Oirq~V|I@skP&&fO9*b!zLVlv*+g+9_J zquXSsub$@Cg{{IA6w=qSgh&tQ(C$uyya+*>rzU3K z5(xBF-D%1sC1xea>Hc&toV%~J3iM0&X=9GPfFl*lSk1#*iRiFJ1ZufScd9~y+vOHr zk-p^z!)|d*dLT1VLTH&$IfFAn1a>yvp?r*2&l{ zE&N=UNu+~J+xqppbV0%V;*S9;IFI#P}Vz6`sWHr}s+JQ=zM)#1$DCSv`izBhHo!)*6s|gHk{OkYmgb z21i>__Hyyc+jA7Dv(em$OBP5EIY?KW7os+_-=M1pJXX-Ej#z+xZdG-7WeeKUGns8l z_^VrAr}^TV4R{Nd>?aPQ%SRjN=BT;N;b8hqkz=(l=n@B$c7{9^7nVn_%=T1zS@!1E zgWL|4kSmvo%b)PO9iwd*WNAIx?4Q{at?k*6m5JGNby#7Yii`gT`kJ2Wb~%KVF!~)< ztGegO%nLXYgz;R^GGu{<)SC;hFESo2t_-8QZObJL`P;&}zeM>ynmB#s#%9gB3$lY> ztWzk{_c6NNT;9ie9Cho_K=A(H`?C8NT8B`}*VSu~cmO>vMi`oE ztd4i!%IqP%CDczw;kqIEpPiLVaBaoxo7lcRky{olb)#3MedgW8x2l?oZsaXKt-q5B zJEX#P(I#%Rue_X+7I)~Ws70?6Zfj?DP{Suz#e&-Dei8WI5 z&I0$58stlLzT1cQ_XuY1(26d7>R3s`?sLv}#vKku>@9M3bJ144qoKWIktS8cSsV&V zow&_ttQHpu<~w|V&+n^FRC_CP5nZ-SiGiz^F+D4G$j2@nVR|3_69TUNX9WBK9vmQ> zML&N8A%`H)j$qu{pBintyKWCkd)4rl>G~cUG^tcXqtcYQ9pnXq4HU5RyH%^YuhV2o zj?cUr>c_+0f!>psUQL>KPz~hLrmg_4{Tom-UB95=o&OZ_X$Um59v?k_nU-7+4NR2){|_b&H^f z{3o0u#VK?&F?gP=O$FV0+Iv*W{uQM%!UKB{xPe-}|8Qq@s2=4B!ydH;-7z!wuT|(* z&nJJwGPc=%Za^aaP*k(y-jR;U2#AG-_(TWMp`;j;ITnuID1M#cF+DH6V)?)v>}2J+ zT!1&!WED-Y00#m((+1%~(J}+&6PjKh--?PYI%{mWY7b8QAeV?|Yuh)ZJv%7w_cp8` zTU=>FE6>#a>>$JjPB5vERP=-_1R?bo6DKXpYwUGH=PsvdsiO8AlLMFB)g3ZtJlBM{ zA!7YV`vNcS0$QXGV?H>usC^MxBM;97kvn>ap(U;~UE%h}#i+GS^*UeE70uSi5OCQIxWjC8k)8C>L z-8)0mra^Tm0ML_Dw!KycFLJ$0 zax+5TLrETos-|B{4p)fz(Jk=4j*Y(aQbu?PE?Dfxf^?6O&Y~zvQi+J4!>cYq zHQ8K`bDx?pf)WIk4OP{haRZASR=5H+U2ZB^L*k%azMJiFA;VqJaoM(Z$`0jqZ|^`f zZCnIwg=6&>LYe~XNB9Y5e^2O73{cIzQ11sq3I_eJpO&F@lJ<@c8pSh_|9#KjSG7~x>x?C9n zOnMYhEh$E?@`D-0)u4I2=m4NB+d+JIh@h&fD`kFc=(cpU&^|2BXFSIHMrYLn6*ytw zbOPTu2IG?-M`>yS@IuRDi9A#Fbf(d@q3mGIfb?6}QhzW%K`6zyNViyKnevwWor$q( z!J}dv{hI05?{6Knec%u3i}~PmBL>V>Y$tl^*%?+jzoFFe$d%lgXUmpI*t{2)l9Y+J zpjueWmMLXiA2K9nj(-i1J6oZzVo1_({}WJKt?z-1i#)>jIEJsnL0L!_e=wpIF*V<< zwZ*Axw!N0GXln+}B<3g<&aNMfB-{4`21_onJtMu)nH`DTWU(-)en(@C@Yh4jf9Cc9 z;lD&535yn1))mRx|6Z`2c#j5M1N(K2cUB)UPF5XQvyDrz22jB#hyr9p#_i@r?pLPC zS|A!SiYzNHcyvIf6AN3XopH#m%}C~L>(4>qfTdw7pAOPkoNjevdhY=T@3Ws%4}$3y z-$>S&6(h(Y=+cMGB{s-APeO#CT8FB+4#|q_4A5i`Ft)I}e$(UZK+5ZkC##|Fb%r5Q( zN8_rvZa~!JsgNskFAeb7(6VQ?PTPw`0PB>Qe*Cz%#)G@JB2z^zDumBnKWzvR^gKsI zgd=}J_WZvLHbn1DbGq*_?pW>$vytwLUA&NC!Yecv{lN|K4;SKASlG1ZYA4tdOwL!V z3hD+PSw47pJC8%=GCDSHo!UkjBt5L-Ki&BVW!hN*DT!!2p_dv z->#Qg=+psb^ZX3pcCbEXG4`UTkl6P-ekxs)vu~Y8R!gpN$>)ml_Ga?)Qx9^MceV)- zxvm!z-x3gaz9DkICsdl9EKh-0%Qw5o1N1pF#wQQquHi_>1;-0Bsce-Xjn%};i5>cb z5hD#K&}H{{(9i-+6l3Z z-{UZU`Y_0ja}|r6l$D5077?ZDpgn-Uf~Wi*Z(aB{QCz8{=46K-@bi4`IbsDFO**Z zXE}!A`9A~y(}V+4PnjotG>!SjTbnGYLmN>Z&VL&f_&>t_9|95omoNCIe8K-7;LoIB z@0MVSa!hMx{;*0$){&p*?t-aY{)a{NJ6rEir9*Ctmv!~F9k^0ERZ9z=cJeegsC$#- z1Z{Rm4|}S4)vi}oQ->m(+`;ey2ej1C&Phfxi_(iR@KVsPq6N35Uh?Kjm2zm|eM{oC zj(z9{@hJD|*l+W-r>dp?_?<5R{;5cL?}+PM!e0d&yNR!6;0azmMeU2h=W>4t zzMjSxW&Rp`^68_1Tsx3iWB$6eSnwk5Q6Uau{Ty7`MUGdf+UnIL`Bx3{bs;Zlhmb|- zH=K~(cEpS{j=9k5;RM7LvYF52lWKass2kI=+&QIMra2dV8BSO##YePXt#x@n+LOb% z7VM0X)beaO(JJ665w^38xA!2Pd4{vPyU$H|U#Z|3Z}p8f`Q309S{wJ)Ar z-Dmo8n7PyxRP54_4G@@Dii^zKiW?^va+K`o71Tb}PUC(zhHq(Z^`J*P)IS$tcdQjx zg>Y9j_wtG2vMU+qNqxn!Ig~lMTnh8NNB>0Q%MPZ@^Ak~P`&T&g2*6DXS~*`&>t$Ns ze?&i}CiQKgt>;_cHqaK;)E(3h zWw3NGZzCW+p{d&h|ycyu|E8fFD&u9^+@2S@^9Fv1yn7dwYF*k@$5#BmVdM8Aq)glN47lXslFJeCw~?;~!s|6-iyr1=)a( z87D**Br9GWL^eJ@V={c$ZM8n_C8n%wg#piSg~2P~3IkW7xPc)3=k>`587H@sDI7^Q z)9b-iLp#@IhQ!l!xK|xRhWE+^^oQE8^QQYR1QGp6+FqBCxS-N}fM_zS+p5F0R4S@k zKU3y7mXk@0+@GuA`xinQimL~&;=>m2CEc+y4(e94k^J`0{1n+Rccq*1VsbuK;C-xH z_MHnjty$19twVQ*gc^N4xIVB_l-aD|u_Ddrul1``d5mT1^kubTO!BWlquc%sx*s3J z*NU@|%j3B$zg3ps=<AGRi7>@?TNqv|+hzvyPjK+Pa(W`@QZ+2iOlo$WZu z!LzBlP-IgKj6zC1THqNcEAJjB*IhN7dbCu-@#*C~%bA{=OTKs(es*%B+O}0!IAmO= zbNQ>JiSA-IrOd#hI9aXNQ%+UyG9o6O!};SdtT)xcvFfrQA%o=^W$nuJV0D_H%jUL$ zGm}x|w|~81SV!dg>)(N{W&eB3Jr-NON4X(+Uf*)u`5?z_R#bHGa$4+#W9kR&36~pn zYTY``sQeiXwbwF9o+p`IgPn8tkBesq3CiDpk&;{nffPZC)E`4+}>IwK`MNgHl!DN2`l6O<62Pd%w3jvnp4f*sfIs^J(2` z7V8V8f6FZ-&t&FmU2PqX6oMEcDu4rl)uwJxk>7bfdlXy`L#*r2rV+(&7PG}6X{vG7 z!M6mz?gLmUh(+hO%KJyqFZAh53eR@8-VKg{MmNNU_i_9)q*m`HfrPklgo{GT{zFfE zviSkbT&fPg%P#;hMI! zy)4~(E0tF5>{mTtb=7$1B2xEx8`K^j7F1-83GiwBEz}*Ue+iCSNn)<{2e5_}46Y^^ zyn549OaPDZ=@bS0Won4Q4%OD^<%c8Odk)}KZj-<>HAZwB7fC>_2esAEn5>PuAl$G6 za`0+jVgu7yz0Oqu&5uJa^!KusGIEQJ6EgDWE`OTtAh9W21*A*odC%O5Uvq&8qgIQ! z^yNHvp_Sej4g}hAT8Jue3_isWF*Nv~*_*=+rsiFHEE%Ry7<)1ub(--d407gP^vMUm zgUEsd`^|z)-^vvbLsQGIjPOCRRj(a^0P5(ND|m1~Ci_xGJ&OOZZg-+m1KPm`84YPb zxq7rY`V{uiJwtr^M}7KdZ_~=dEbrB$sqzD91=&FeYE=TuI_EPXYPbTPwALx? zW_Mx8i|*rd;XPUW3q2Loe(cC{3ag(Bt$?FB1mwb?H+HpnjJar=S)PmXhXVnen$YWy z_5sW&bJVC>>O#S&9lqt`dt}&szakSE>jb^IUwA`O=u$yAk_94ZH9=*#i70!>O^P4L z>EzR&UOa;dN~;(MqwQrePHK#)8|2}M`A?k`e)|6)D>2^ki1c}5-;AzzM^0=u8--j7 zZK5optzQPdkSpl2Z;b6?5q?Pd;B1G6cRG*Ul?% zM1x0aJBwz!GJ*#h5k*tydmZrl+1WvEUuz~Tdj+#HSB94UpvUbtJ3VNx|{rd?4>w3 zRJ7Lr7b#vZa=y`6xnOZqz!yS2C&Fr?#s9G27QznUMuROh&fDJS5E<3$( zf)a|yQLu5*Fofk6n-V84F!4Nay0_?fsrlK7lgP#vNS7q;Yy|m* zNQEm$jy!%V0=K&k)mn1WSEZ1^4>$!W{Y_d$F0dVb@r1VM`#&c%)-pjtqwB8;4cTq; zyQ}9~Rw7fSTBAuXn2WF_x9Y*_)|~g4`A5_bSRU(fW^|IZErx*aH$WyRKJ&<0T47ReNp}X!gc0kt1{`s?G*a zcEkR4N0MG;(o2SH##;N=5we%J6EquT$&={?0h3E5He>VsQ?--S{a^AkIfrA_O}Yhb z>R1>tl#6&>4n5s!l)hH2Tzsr9(ZQe?rXUwcMMJN^4*$oP5bm00T;@x;-1pke*M81= z@GZNSB#g!o_}Ik>8VT=wc(ULMUhouttOl{`pUJd!e*K~F-JWRil)t@umss$eo^f7e z9J>7T*!|#EPv`5|FdU!l8~pm26pyA>GtB6cxXHvgcqdOUp~1DJO4_?5Pp^dZ-Vu(D z3R!WSsJ5yLP-K=Hh@&R3)H)yT)!u-qfZ$X1s|P!;D}oiUvXouTY+qfeLe9+FBKm*z z_Gw=F0UOFc>UfR3zqZI&#yjx+g`QIW!=CcSyR4a#aArgK^7Is%W>aE!HCIcSF?@Tt zh~HsMDT|B89^P|@VwnKF23D%PIsGu8-Jiggf+Jt zQ$L0w_N>@9PCWmuzW~o%zKp$`ZkKlV zF{UDuFdHwvxk-M{4p~i)r{OOS2^m7VPxYQpCAY(k$7RpmG=w>-ItAA%cj7|DlN17Z zTln?SUu3ici?)yy zi6Qh{30BaZC}tG3$y5y74=r16{Jt*>dL%WsbC$}Ps^aIov03FSGvBp))cC`*)0S~z z0s|*G*)bj7UIDts3SDr4GV{GOUk*1|#IQ~w4FXs6d?%%UUo6U9p9Bp&gLmD+CAc&C z%EtO0PMeW+-W?P?z00m?Zy-^DlfBOQrBrUl`sZ3hc29u}cmrw6;$Xr&Cyd|(aJ$R3 z{wCe*hXXmeVMDA)qnxkLcrh`qmr3^>zBELFbfxi*$YX@^PXa{aLt(*8<|c^Vum5o! zSRaM-q52NW)$!o4UFNO1=}_8Q1Xn@p(mc_Q`li~B^aBGigIt{uzDdU2KeivzS2?_8 zYW5AT)Eb>zS^K_f`Z`lmZtfGj7)Tw|r28f(ht>h9i# zQ|;#;mFs|~|20xiH76j4k}XAZt5!*OH#fkNQM}PwR=1410h(mM{p8uf3?Xcwj2VWA2eYcAp+Hw14$Ao^UAAV#VX=WUN`9=4_ zhpOyDg56JQ36T?7vC-+;bE_ zio%hZ?ZLYbs(ND&$durQ3||!tA(C2yLzdEtiD5l;nq59+J2f1W$P|Vf!Xg z@ucpn(PdpsATp2OS4f)g;e`1XAnf40+pWIP)`R`Tb(Y1bvBg+)OdMiTM(EO@(E6a75--k~-j z?9}nYuU#M(nC6*GAe6glbhb_6%gLzm7ID}lHz~1v+7F-G_$B=}FV*O5am;^Y}uJdt7(EFD?wFVm?Y!@(Y@_ruTLdt~hBNFB!`(X#!2!EbK!) z`7Dcn$<)nF|147JR78kYPgyIXxQGF4={9vnVVKF zW#K9NY1*jy&DVz@eF(~CHI-vCQ^Xxdv$I-a^k#aa>X8PJzH;{E+ACz49`vw+z!xP7 zfi5*Vvf!(&3QXc^FSK77N^yJHu#RfF`LrX^+0!w0s}fMt#$y#pT9xrkv+6qvb-gHV znmQ970dDX;37Eur!I_j?s}` zX#N=dboF%fO+EZF`$zENaZae1*G^k3NNXJxh49F}aAVgK^)F0>UMujv)RJTw`a*_T zuQ+K1&2o9WX+LlDJEYVbJ^ffag$FqQegWqnA=Yq3w(_H9ltSG{Lo3|tj2;fDd-=^_ zXr5v-;bk4))t!>yZ)nmgyWcW>uBCEv-IqYUp-=ELL7n>7tLu&+lqWTgZ~Kzm(B3eg znYg^3(ZuRZ&i7p!OukcD+{Xfkxjm6Q&5rMl+LQuauQ@9){HYxl=|@FM^@&I^gQvHM zNnqMP0{UTw`({vq;>d+oo=ApGwNy>@kHN9pbpC5FN9746sRv_UJ4oKN^s&${hXttZ zlPXV=>*Ou%x2^9gCuWFaNFVWRUS9i1PzD`!9iNNrSj=A10p!0`Nf0GNYB9PuwY$UF z9h?A%#vaB0ZJ=i70@_=2ZKJw~Ay{?NYd@z-Fh-25Q$%nFYUR(3#{e@0WT45@NjZ1uqH zUVv|S105gR8B>PKkb;D{*!!F|?B0-UZOo9C?pnUA5UmCr0ZoSk+AH?3&4b>I+J)+T z1vt)kK6#=bvT)P`Y*QW&-xDZ8=7or*_@=%Uoy0;9$yu*)ZiIHRal*=;>l9Z>L)CE}2S$hWBqBIMk{(4jQ_C0Wq3hR&Fc&K5SiD z+o-;{tC0Q@c*-#z-nYr|`^+F`tnw&vRAkB9VWmn0eEcp^u(P~jVTUtIrYf5#=O zV>4SmhTYv*-njg2A^}fbzCNeZ_;wOKVf!v3Q&|Y1-D?T$WdlsWBf8(tI zf0EIqnN*Sw)=($R`!4GQ_qi5ucwA?G6`Z8zfACWPs|6@gH=GPe<*9c{M21a^1U;L< znJsE1cXxQdDt^!+jTJu`>OvnvagklKziLOp-KnwhdqVZb-^z~{rmTWU7xy#SamSCF zK#RDl?c3^j@gOntruos6&e@zXW5)7!Zv7@WUg(TTkUI>?4Ul*}>I6ZrL)2bc zSb~Zp)ev;a@%Yb9w%QV(t%D#R$P(;E72S!r1M3#k&VHAMych}DCCxpq{Ip=Zh-Sd0 za+G2jvWR@NHdB7OFf!AF1H?4-DXZlhR__W&78Kg^rGGo01cFZwGU2^gc6ab>oWjeV z{J4ot5Q+Vzbs_iDj%zwN$M+dXM+Le$%Noz$)J@z++R_j_w9T;y-*Pl3d54sVc8n4# z!lKJyQoTq3#RO4ow3yM#!%3rOTkM5Y#Ff>uTIA)m5} zS5+77KKTINou6MUuU$0b0t^@iuiWtXg?f4JXtF}TAA0^gceyZOaxs(tfyMtMRO>ru z=iP~Wncls8)DcM~vj!^6Da4gzdVd;}d$$;duaA+O@`LGCS8q=6zB2Zd*0fdqsY`&z z{c?NDJJd-=4D~mL5;cP~U6EjLqk+Jg<9%V_orEKI(=2*6dZOKq!ypz+-bRKGITK1> zE4kv^l=>l6(|fWILnx0Hm(hVo%tou)m+y7>oS1S&Eu>C8X;FUc zKXb@t$}4>6weuOC5?ftm^WwBf^w~0A=d6amT_{KoJYJyYjSHij-RaZj^c$q6_}V4} zRqoKt5t$VbIlP)ZLnnB`E9LdWkv8+%N2R z{yesOBWc5S(#hT5Ypw>6SHLe5jF6H`R0L)8q8gHT2K$QPYk$mLB8Bbu>VkHw- zMybERm!YdmBU08Of*_pLHc|JPxIlyEtCa_!q-~Rc6Pov`T znZ2@EAF~pro_HNP`1Cktx?Ul7ZO$Y2tHbNwKH}Xdd-KYt|G? zja>-H2YrVdVdlLyL-;Qek;wKyWEW>qk9}qc%n0K3a7w#&Mp4y)G#mz`;a7nsM=daH zp=4-kY_eB7<6{G|dO{x^=cs^Eh)B5=DRw)CC$QdBB^se!`r0k`Tby|957VlLWI8u& zx}>E6DTtdGM;>km^J@<9UUUJsF+EiOy1tD%m{cPz5|`{{@;+f6MBKju<8EJpafwXa z!yTRgawQJ3hq;TqD>dAa;wk*Zm6gLg3eRhoi;0&EWTBx6sY2o1l>}g#l7lHsr0H;xSZq-`Oq${u`q;wRZ6!{ zRt0V*(53DFaEI?JQ?kGI6;r1vk>d}ir_r&NZL*(wKn}L+{jIPCOp>=Z#D6$ln~EhX z`?SKesW@wGN>f!Vf*LalrYsg?ho=&Qhi_l#DY3ScyWW2a%YDdXjgz=cnd#N{8K^mz zv9$^aj(OccjybNLyv8n!=AWi>?TPAB=wTdEU4p?$ z>%{H)7&l604*wxn&kTE+8=nikt6S<&vz{1#>Led`n#kB@tPq8`3t zr@5l}*eKL-nmR6g0|g`_$AG1TIj+F(1621!9hl2kLMu8>CtupJmhakX@QM8$>c)cH zQ>nlo5EtSXFdCj2I+$2UYtdv}^aVgT_#r)}NJ6YMqnUv_UwZF{Iqt($2g0@(v}sF> zCCWfdoO3y(FN)mxN*ZMwXz@+pK{votb#6tew8F-ui*7^v*xG< zFsxz5ogXLs+`!--jaI0 zH-i0S<}CZn!LXXoMldzVwl#|bD4Ro&yzRog_YMb@AUBqPd2KKGM|&U>qp`~d1A6Uv zrcqLQTFVvo>&SB`WHXwke!j4cvY_Scb$%>WD^RQFDT zf||!0Lg|3IQbT0p4u~`|MAI?fW7YDEj*Zf{#Upgp!~`=G78e)&yKtXURz70qa6O`} zm+cmhicqI*dogjxEpmvzggQC2ZP)OP{g=OWnt@TAmQYeMlX$N!?o!_vEq=azUyfSBG*P{O&0?hqFS-B)q@gqe6!D64y-tUVTl;L zf0vbwOz0a_m@MT2&(Q|Al2U@cE;U+Tr>`^?*FO{6UiL65tnY1EGUa}AgHO{77p;Ja zGikbR_rs6+`*6F@-X!`Mp+-C2BdZ6)yrb(0SF^G2`9Rk!c_+=UhCIlf31IipR2@TJ zfT3&v@)q>5J`0Bx6dH5P)YFj`@aETao|Hk@hjI_0F4kb!*dFdkEW8#az4vJd&$OpF zTq>N?tu3{DNVWfK2KzR0F;)~3X;UwyYn3(5Hq z21FT75XN|!n#pKXB*>e|RC04Bd9Zc2g1~#(C{*w?0CmsnX}cBL0K5O>YOXN^s?o;8 z6eh2SO#IMfus-MeFot+9Fn@0+?}I-Z9|&cXPydR_h*Ltb?LJ+GSkP(Ni#wIM&R?us z3BKSUSyT)d^kMX42G{zHMC9{BnI61(jaAO3ERUVi3jFgxCzG@35~%USb9LFHcc*5* z^vBpfcI8HjL_iL$G`d2%Pkze;EP%d2G{nu_dY`3Q4v;fWCI9I8-u}z28!36d?Ssf{ zWMiIh4j&m>1VYt+O_07*UjvzM7$i+s&A4$TTmSlMdN8+m9?^@XB1o|6zIf|i z>ag+{l`@{qoXgl*S<1^h0kwOln#@%;ntY&yh}7!(j`3wVAvXUYF^3%abGS_rmY{sqGddw1LLu^0-dZ&WGAY)t48ilm&bU~%l%xQ!m$^k-~eu&ZodH*R#JCT9Ms(H{(n zRf+Pv!qUvjso+FMn;G*rwRXIT=O7I$81l4l`+k)`AkYfB#}tv=1zF#<;~R@5*nfV?0zE$VO^9X2~;Jhr@-sg84tx^M4?g=^T6VM|S_rH-3G@U-=2- zQvaBYz(W+eNK>iL4A{23nY=#l(4`{ZpaZFpOQxt^j&7mT8pzGm?7ug(oU!X}?Wn!*=LTMa&NX7Ar@0E2W7lL*cQD$`K5|GTkI{m9Afgo74dIweujZ zN8T~$F|FbXPQTRSCc^%3`&JV|%Ubrtm9Z*suLf>#)u=`Zc4y(%{?G37KK+x0Ok78D zUy!X7HpMcA`qXO=0yVx3+=ktNHTzM&B?Mq*z8*xN8+HIKp#c;0bGAe7k?x@~BJiAI zw}bOc_&if;U>J#Bs8`lnx_;{r09NwqHtS}{O5NS1y!?&l&m^QZt_0X@D$R*PH|79R zYb9ND*LSJw@5=SR$aGWF_1~wmo^0RvVGGU!S)#5>P!_O*8KJJZ_?h=+wcg~7?pymT z69(O+e4M>PRMHVrMfR65gT#)(h#Q4?-sCXWZ;XcJU`4SJgL~8bM;m+Qi#}`pR_}}D ze+~_vp4f*C9@^ok6L5=mEa(OK)#vMJnxp5^xCn^Q3t&G-=r=+`D_$f<*sN5Ncnm+O^JFy z)j>eq4b*tt#V>!{%$kX>!g_FagkL75V;AFJV%@uqs9{u7*2gHv$--(-Y|IR;&**co z31$d89{0OPJLdIb8Mu@+ntM)#>?cChMz_>*QXM8^2#; z;Io;+mfr=`kw5iTj=Ywz;w-%Dj<8`Jud%OO|Iv!rz@d$d-A}bjrw0*QA#)GDYF~Hn zmU)c+Yo&T4CwHV$(pS+?U-H#=Tl7WkdHC7FwvJ)4vD<0MGMP-8dpndDNxMc}45ovJ zAFXgJg%#8~nb93P$uY)K{0we%4u)RKWKzqTu^0!RYB-dfWL8Vb*{E>2p$*#m*?gOC zhM_dJ8W-;FP4{qtm)PGPQi}>etI;MN{ z#w)la=+`x35xDLi452yL7f0?FwWe-s&WElrizu|0OfA4w$ zvPO=;(3|}RXOxBPJ^VI);~n!O3o`fqUUPo6Gbaw1U3bft{FA2q4<90pdGzQ;3z|6~7MvcwT`WRsK4JLS9#KhjWYaftlRQ$6xU6hoVz* z?)}#c$3KK@AXzsK81{nv3rNjGRr%5=ZO4Z1-^v0LDZJ?$gg$55q0WLSGFyHIF~yxS z>;H9UMN-Tvz8p9sBi{e7Ng1x3eY+v+tu_f6?$Fvt{*5tjSK&bx3>L}n?KIOR3r3JQ zj{-z3D8jzbrud@!?nJH*LA}Zn4y*ycqt}8@&^(*q`6rS8-O=RRAg^{}4Mg1dpHY5b zFz5s1rJqv9jpsnDGNfP3#(>Ur&~5`&?)Bn%W|i3}A>P^CfODB$aAYyOeuL5`;qOGW z;FEU*|4Zrr`-iTavfbvigdu_HDPv(^qR)EW8q?KV!RKmsn>E*17TL3#gU`kG2n_FH z6Y0P@qE@FQwr0Y*g3T!f&F=n{x4oS@aCk%wWoa=CW0*D31bEZ``ekUk8}iGI9YoZwVDlhDCs}K*9euHOFEXK-=%`G_M*C$CeMb>x!iO ziZolUTc|k&HMdIt%j*jKAg%6vzX9ID1EWuXp{fAZfWV%0UelbeJtj!6-PBi@>I@g< zNYBjghF(ZXYM9By44*`UeB%<(o+Q9Ao3eTuu~NT!&W$vyO=^FiQ#29&;_EOUYxVxE z->!w|*Zn};C-|u^0edVg7TK2$?76f)ci7hE=@Fp%w18ySm28AyP1cra9zVPy2I@Vr{hTQK{^jY+8r zU_91<#PF8-MUejD?@oia3QYnnm{PMuyHGQcPoOkTeEWL4pf%fbe>(BQWfHky3kPgW zISYa}`-IiwZ*O+dKU^xS4&oPF$n;b_QZSi-MWO_ge2q~ zh(2%0xCp9l`U(T{&kXR(hHx&6$pmAcz<~!v85F4Jfq9Dd-dhG9QRdB{jweEP9X#(s z=*TuUZvA)xSrz+THoptHGs(EHNAX_+o*rjv6kLb{+hjG7cbkFaMDsu6?P^KzAB7_g zMXeXqb@b28fl(M0KC2NkZ`K93s#gCDs<+?-7G)GJ_GNq)FUH_}$P^Aw?QU*0J8vsjhlP*+iW$K8(WTC(3M{& z@%4gQ9D6SG!^roM(*FiyU;PQvR~Vw8WMi|XoZPtoY4Wcs@N(C5TA5ca0==|d=9749 z#k1h6(_W!XPoq0?fYKEaly1R-bSY9*R79%MYe1Tmfb^OKM8HB(5RfJ!N|6$3 z=n0B~fPnN8ARtW$y(EwT*^8&V@AK_*_Wow}oHMicH#;*9GZG;Gvev!+_qwj%^$q4a z>Q!r}J0N--jLb(eS_>3T(Jm0^XAOca!*2NhQ*C_%AOg!HUU>Ym|E;?7Ymm4$hack9 zQ}x!*P@T*0h+7F9Q6(?B{vog4FC#>?4(h1o>8kc@4T_@nM!PAd{Cb1xis+CU@gCWY zC4yXampSEQ*Zy)aTF}txK*=4|MLoOa9SDr=ZjFuYY@g`f5iQVO;T`E%1#^)-M%KzL z3qMcT8z)`0Y+oOh(9QpuTpnDZ>fkO_keNRI(9Gz&2zNHe+b;o{s_Ao0$oCE)(HH_9 z(hy-{5y9nAEh+h||0)fQUtYo>B|9~Cu*MuU99P_%gYM_hIRd8C7_ODQWoPcgZ^vD{ z-59w{PRk~la~D_`xu`?*E3C^u9c1wmzc5Q2#HQV!0SKB({O+tgaUz_(*0=WOPgWh; zP{x8bh|PT?fpYTBL;{rGi*F>-T{+mCt=$N^6i=B{f9k?XkayhOURz%IWjg%&qQNLh zKdbkE>jZ@ATt&IWh4aP?hPn5qL_Y3MRRE?uu2sz-up6mP&56SYxc&-Y~hY0FB$heK54I1c2*gv^pj>5T9TikU%4gZUmnBQUot>q zv;kH=1K{P)87-5xei;dV7|;xeZrwZ5el{@VEm_-Lj}THfEoY>+1rL-{W0p|voR+&M zB|2E>O;eU^4ewp9_D+BeRrD{{QL_wpcHj~v$?a{3weDoJ_n=+zzIxn#qlhkM`5nUR zqa=>kgL=9ENfG^|4>lVe7E*sjXHTz?3b3aAOB$ z=-3xR(R8J8pu=$6@xFq*5H?5>sV33i%F@DDxvn6lKBzX)8kr_zJEEhD)rz`Fpi?lt z%y-}Ilvs6RY>0oV>_H@TU3E-9eBQjE%E_m~UHc!sj|&w4?fAg%t?$;Ldz1how!@3m zizXNL*VdmLY}rl+*yV9Fe~F($Si7aOUpUmy4>8=U=>syjb!6bHOJR@I|VP~=Pv3Y$>1842+LA3M~*?1-we!o zLw+)D9dNQY%Ln9o#w1Nr-0KP3O?#{IGjOE_7v2=r@R{~xivwf78S2H5iFM$&@qj7T zy6JeW#gEC>WqTBo1&Bju%P#=8UyVSXZtYI(4rXlGsJ&MB6E8Xlm6mk?vHw)Ch50eq zL5!55XpcASwv&9i z&7hrB1^o0x)s6awz3~I7t|maqQH0`TNNvjFJ)RmDz2OnJOOk2!=QVL$*$>dk6q8{W6;W@IF4 zy2Y)i!SYHI2RlT`qien{k&Q%?qRMvvT`ag=U{Qr7?f(091of~lpOyBPUgC|fI`xPX z$|rK&>pI%eC_j}sRVS0zTPSHUr~4M5_H8^9KOOR2Z)Iz2@JtwTs{mT_=pFmsj$Ba3 zImmC1$c0(AfN;4JkUkv;s02$!gl+Y7%(!WqHf}Ve3!d*)X_Atw8lu$k9SGBmOl%eD z$9)Wf=EbUV$Q!UP`+d4IF4<-4#H%}jdAf^lnu3P;;=Za9v?p&%jIx8p%ZB`PLRh0u zkIFt+9L!7gfky(b_MraDp$Q`VL8W`4Az$D-kCu#aM2$* z0?Emx$(4-GnVAkv%?+BTbvjk?JYwj^LRI}sn=);9WVr3*fk@h%El!lbl0EKxU9N5<1TtU>oCOiMEqvI4j;Q_&7cH$Gy=C zU5C;sMN8Xn3)4+VrtOcxi>LvLkdW{-p#vtEX4b`sf>UEZ2Tye@+i5iTX7ukoNJ^8E zFvbr3jfGynjyZ!+!Z!@yuM92VkstYYhA(q3yZRV_T;G!rw~`&N0)X2yMovwHlmGA} zqbge+-o<``3eQiKOBGpZe?vM^L|AAG&BJ~v>P+9-Y8N9 zD|WFedvMjUoXqY~;%b4BIEZ;ope%VTlD)8(Csm_bQg)Sl_`OXfde;J4G2c9tdUZmu zf(SD>WlzuK{OmquC9ZgI3dsdYmtSd|;@kY>P^34I=(7juKL_TmjxOB5IA=rFr?mIB z6MF6Q?uQEW5~F;}Ys@U8ZKla*%hR1Y~32< zs=fWwqsbcHaVU6mEq4^-K5V>?o!LKiZmd%C&fqyfv=Ky!0&C)mGd6RSluofc{-jT~ zCk|v@kOFm6m1ReoH*kHj$*QhJgn@=AW_}E@xlWuX53#kgupt<-6NZ#<$IQt2?~)fc zH+q6$dY{{UuIoVN=To%??QQRLL8BZlwIBb$Jb$XF{@vR=6oGp@b-@7kg;4)SdoMDp z){WeY_O;wsC_gfj-?d6EukX^?%hwJ`!BeNv71lG8bA^gb=S0GvjWG7J#z_oV!zqul z@wuNKX2!BpBM4-60oy^{hVIC?43{M(Kiwh{*i~fX8DM;LplSWDrX+vd+R4v35Umnw~?6+T+Vfy6uoersTVRVizR4iBz{bC@*c29o4I|A~; zncMIceD- z=OwKLG20+HnnOx)XUoOqNRTFFk>ytxp@euD2pN8?$OO4Ch+-yPG!wvK)H?0WYVFtv z-^g0ac4a!%svrE0SqKtyNv%QqJYRe@Q)okbbM^e&gU&&ohP>x}(#o4X8KWgeP}5Iw z7g@Od0ed7Lo zYnnnl!}8VH?E2OIi>Mz}qzb`Fh)uQXs8c1YU`>I^)=7lGNRDcDNk(2Q{`R)&WzwKM zMosN0&j2e)bE}6xdm*BwzyyxKh+n!*WpllzS-$Hm2Z*Z26%4ku%g5*O!D6C$2jMPO z8JWAAV%!P_t9tO?cvzx@X~mU(k3d^hJ)ALq#>(J>_qUQs@oJvB@xwc=W!i%Q?_JNr zPq?m(K9p!6=cKhh8c5&it`&|DFp_6E)0wW)#h*s|!glN|wqtb!2qOnX?*vfz{c8vc z@Mg7;{qxJ^TT2zJ5mNF%JmSdT7aid}hY$EE2eHp_Em%#}MyWpeBVK1wf}g&<4_bJc z--pnZbf86MsdT)HgUha$c^H&`4p-`lxNwzxGV46e45~W9m%V>dn(Pc_Ipg!w$~p* z^=;k%5=wPK&ybnd4=p=eTZrVFCTo z3E`RmT+MRQ#k|~5{K>u9oRJG3a<64RKCpNAww)=~A@wwf?;b!ow`8*?hV54T;+Vw& zZ~MaT+#sQ$lT(FE>X64*sKUwB(nZ{O^l1?I(slenZ$uoxnVk!Fv*qu?3lZgO?c}3< zH;f!6b$+>_PolXibySbZ*XZKdJ%}z1WZ+Fwq&^+B5A?z+Z>5b^`Lys2XrYfHmFGvE z5Y#_qcj==h$zD;Nr;bYJO~?S3fhw1UY%lrq)h-Ik-?_T9>-) zGFx5HqIajLcgl%Nu5Q0MVi_MC@k0O};^E?WmAXAVXC2ZX(Vdgr=|`i`ai270GF~$5 zjp}kap$Jm~oNsXGdeqexA`o5G?Y*$Vo!ybN5(lSHxS!f4JG>`X;K7|RpW0m2UjUsW znNd7jKhljV!aK?JTQ!6Y($av(?y~u9HHoDv1OmYyy7-%XnZ;|~Tx;+?Q(huia|k+a zWJy6KZtvw`P0hZO<{g+)92N$na9=nq0^@O{U8$C{q%2TTH&yF9b^KY(b74_iz5H=x z{jo=Nr9|@89UEwXb|OrWGx!5YQ3p!z6~OcGymL(-FbIq3{-~k7rsH;+lwBkU z??jdrSyUYeBP>$}qL#p;uSmF)?f1)Si=nf?S!z&_Vgu;t!^=imb>KsBp_3f^5VNLF^_&m^|uU&g`R zrP`Avs(@ILzYL=hC$L=FE77nS&-`{_E78Q-le?<5)&+%#CxoSb;7wv$|F*wjZT(b_ zuzUI9WH7XtgosQmu_}GR`lrf$tnsx3P`PXWQ{^t|Ayiaf<^y-d_p<)dRM6)UCDFkb zTB0^@q&A?Y92jZgljtpLLLX}7jPdMXgu^~hf|^=UFD4Q$>>qTfggV23)upmg^iz?C z9&N8wQAvus^1HuYNchGTY+Y|GA~^^YcKcojF8ps=$#sv?9KZHXdGzPh0w(%TU0jcp z6Q}*=(sI3PIfYMs*xdky$N;~`E3;Be)xL9)YqpOTn)J};*HBHNVdNM&{o(RToV+%g>ppu_GfW8XX1gan+2 z^}kw^`nTvp=@{93vR(l-y#)UDZVz>*MQz`fU2V5S%)H{l2)A^>r<0IdD~xXY+`VUz zO0lLZkAwG&5f9ESMSTEfMaeu>FwzzxtI%WhAo)`k^1CU->1|+6+KfkE-aX>)?6?si zYqxRA@J(`^A_N>5EV87>R<-4MGu=aS>UQ$CYQq*h;v?lNRJMxJinTmyWC^h6WDpxA zTklygvno=BXUBtqxIDPCw;}JB&>}G(D^ue!AA7Yh+3n0HZm{Hxf##CZR%#?F)7`PV zh;0X?!MI>HbyQ~T@?bO~)j`^LR**uOQ=<-p1mdQOII0n4=tt-^9nEp&fta6JCNa8+ z1cp59PC;7526qT)<(6rV!>%x= z32}B*u%A_MqoB4F{v14y?#$S$D268`Xj)xmx7i309QlY#r5L8_@kr{BFt##X18T7p#05cR&p_MNr2-flbu@sGQBWer^pK=3c zmEcT-IKd23sW(z3xVUF)9QOGoJ_mbZ{di8F8`7@DYAR`K*wy&=-U{-8I;y(ob_|H6 zf61;w4)2rOI_!90BBp(rQk>$mG>vNCTtIyU0%*$jS#HU)BQ^QTfmYn&E%poYqw@Xj zJ{fP6XWh<{goib@Yjy}WP$;FUrcfI-91jn8KIN|w_ZNVqa;09NMxY=WSd^cKHP;@5 z5^eOnvE+gDRlfmf_^F2oWnJH`v+QcINkHmv_XN?f(n2Coy1huP7GuHv-KIG!XGR6Z z&O2OUWV!{0Yyya_0^A`+poLEaCGcM<4BytZZa_Hl-aTi4H~?5H+U7H@MU9t3O_I2k z%K`HDbB?Ln_shU^oEhc_(vu(AV#~!XQa^#+tlY9cm=~7!{5)~K(V`oZ7>qm?mYXiy zSkx{D$xET%`VAH1wg6?6>Kv&i_^Y?fale;UlM1dA9ehHXRnT+X z)iHz?4_j4OTDYeh)3X{Ua)0e@Oez-KJ>w2fVLKT60`*ZD!M5Se~6-Fz+z>1h;afkx2FmspnITdwTW;T!q=iU)q z14Fucmz_RlrXc(Pk7cVs9>s zg52Bznu85C(8lq0c7*iRDndJauOILDlEX0$f%qwq4mjLCQ3Bqt)r7Dw)1>zEUO|3ks?Fd8w0rEaI z%Wn>VEjtptkTfc5jO?ADi;LNJ8@OJ+%fAV~U{Q?qEOE_7FPvGF$rw@{Fa}v+p0?QO zAbL8ZB+E=quOzhwQai{kieoS?k+@81ZVuaknTXh(J8m1nPkL_`+ zG<|!}=I@kCgOy{=9XLxNoh&7K1`o@Uvql)lr6BIty+VoX?8Lg?zYGHvO;~u}GOahP z_PEY4K)AjK6L*rwR9(~#>?gDy{alc~_068)gUh{kje)oa^E2G%j+D(~F4Ib3fIH z$*Y3;nEyTU20p&a6riSA;!#YFkmC_MR|uJzzyJf0CA`~Sg?hpBjSaSUku!uY zfuIZU(m$C>-_?~m_sy}Z9sM>r{gqyP`L^>3Oo?S%no5Zxk!Jql?_3QUiqN~?4Nx|x z!-qJy0ZcyJN4VayDNt7U-{3${lH&G_hV;z+>)OObw{s_~3K72dfRN`P1}L88_=(yf zQjy{}A`K&uE4k?UGD3p?JJ>!6xqH(4M6Hmu$R}L6KmH+9>Qh=i5-Q*d<^8L=2+@W{ zgh6Z&`VYZw%BHO-6h4GBH~jZ?LkmvixlXcqp|Cq9FMRNgMk87C0ML zZ}eoy4&>!L%dLYW_XXg?{_d$DSuJS%fXOYm$GUItQcM-n^NteWfueF-__2T^AJvxt zF!ERPy3VRFTpd^jN|6tvDa;?=x6niKGC+{x< zX!~35%9(dxLQ8A=BOo?gPycc)q%W{R2A;TiNu_@DXnpQ$cF#s)KqF9k3#H0+GrF=U z<{x|UKkG@#KvwtkVL1sK3$BcS>x%V;xh`9Pmw%0+J zaTB;wTOb?_^M|}lBW`1?%;AO38_CZ>TMLO~fqA2LbCj0=h51jp(VN(n;Y+7Dt|zsr zVh?i9+Y444kN%q}4|t$RCz|h^-;P0UcKqE#IuQQ-5A^fLr+W)-1gQ?4SMAG%fHo2n z4FLAfH&|DW5B3)fh`#w4WKM)f;%L13v(y=R)e!Y*lX|vT$_f^Lkp68X;QFTuK6Kar zL5snZ@KO6)na~4~#7wXMfpW{>z~BIsTiig?$N%@KLUwaS#wYO?n#DPbA2PK7?Dii> z@!dgqSw_!$Nr79RIPjY1GXUPkz_hDtXpSz#_Kidc%7khS`e&&3m=LufB*?>zVQW`@e1k1ME|X`T0+Cco39ziL_fb0;H%WMF!aO>5m?#os%3D z|Kq|yAPPEKY(K6g>cv@hI5}h{q}_TUq_d@zj@LnS=4tltSk2Y32(cf9-1L3=S8H$g z7NdPv*DUC+Zf+iiMvyial8uU6C<~QF1;)z_)_d8=TPtulK6#)(q9G2(``4cVUqVxX ziuE7I!~f^EPCra8fk3F6nm4Z-{`o)givG)Ppd}H@Kwt{{Tlf8!`0y!2=+8I(^;X~! zv;*3%r;-2pTkqbzTL_}+#P68g0Vx2`%B~TAe)YwnN84ZjTu_1`|Ic6j^j;{C*v{Xp zZF_T^7HE1?R-p)RYu;3=8zNhR6Y?j>|DQhr#Nhv)J^sTtTyFepPvajNUf?|u`G5c0 zkpKGw|2TjDpPi+r7eTb49BjlC$iA(bKX5!exCux@Qj@Fy^9!qAfBfBn8v%G2KATs$ z!<^DRZ(sk3amlP)c>>wc`}eh-UXJeVdI|vUCpuDZ4+8(y-!J{%D=*$Y_9=a7CHxaZ z;Cavz*>wJ|fqfKmsBG}PnGB(~JT691e%Kf`V&ktu426X(3gaq*lVPKK6IFi0V{vMR zXoSfyIm*p@cs-|VE3LA4(YM!53D!I1up|I)bhkoeiwXEY8&lkuwvY`h8B<=qPe3l4 zb;JJoITAK6jNM4xkR4TcC^qcx69m30)B^}GJ%Q;UFoW~oitNye zhp>)LOiwDw%1w-1bRhr)qlhZKEhq$jowcbB^(Mx+l2_jHLwSMz!<%&imHb#rf(nf4 ztVf-?c6fDOI+#i{v7pZKq62Uz(#iwEbkbycb2=|po~#;m(-K59F7GWc2QR2m-Me=8 zR){}aJaEOn<%^|Cxx;5%bBB}8oq;VCYQee_RkCq^d8ZCO^Sd07(S+x&xi8vr z?7RhtJHcJdxINSgBXd_6jIes%?aX-4(V3wyDcpF(PGsnJjsM8^8UpOc;|}y}qW@Ap zb(bASildg~YNL=<{Sqo32D3>ch0+^y9hZVLY-OCfN`}iFN2Z+<+-9GDL~m`x!SKla z4gs<~R^?HPHm-735r_F@j;jc$fSF2;y7Q_@{;vV!|KlWY!t)2rrc}}@%XP%=0CNqf z;*JZI32r^_JLL8wW8{MNgVM_3D3u-LK9aauCEUn}pjxD%w;AeYQ@iCtwmIq?cOUX9 zk?*EiD-O?E0RvP=hI6l@Zq+R%^f3GWAhm)~ZP>#fFV~6|s~bRzVVjqsvaNn&QvCzg z{MQiMDZT-AwW4B$GOu2|&>2TGU zos5ZFWxm!jx~EbJ)`FtisBPn*ur55c$vu#KF-|4jrXcco|OtB zI_9Lzm*NH@wQC&NXks)&n4(fC8K}I&&!vr?+kJd8u1=d3akk=T@R73>`sx}%Tpan2 zuh8FeJG>D3Jn<+!J=dYH#WMcQ&LrI$MgL|c?-isfR+(9?CGnf$x$_a}=}y)t5+S`| zWSo+IrreBTyJRaJ=vDl~6s_+EUoRa+62)p(ir31{{n7t%N(_H{Hca$ zq0y*!_|5s=b7#(|A3JvJ16Z&zjAyg>K5P;aI{Md(E78oejq`Zc_cunB%9)~ER%T?_ zdT>s>VJg;lKj~Rsp$+8a-NzExLoASEw=RyT{pQ#Y{`KtqbQf~JJY;Wc(3W2fVL98C zDIx1RuoZ zpJPd(v@;n>%K&-y{`iuhkLeEkB=*a$2QZoTVBoZ@0%$GzE)Q7eWFds6t}DMe|c|A@lIx6lGogX`}$DD zt1`Rw!}ERUd=|c|rUMP0hJIK|?IK3WM8G`3W6N~7+$DO^I^_%q3flmO$#7_=q)gD5 zywOj2Cq|Y$bm!(@ukLk*n|b;n;38(Mlw;CETJ9L~gA3px)MqV0)`XQx(DMMX*OuXWnX9D3_* z%iM`JX0i>~!t@c1+08lRc?T|mnHT-LOq}}$zr!&he3E}$(r?dmIxN~oI_l09Y2{R@ zzNS&X-TK&p@FRE=Uk%F)6l;5H_52~*3#mETb%w72?4-~9HO z6fCNVu@gFd3HI?QWR$c`GhDKx>S5*i^elHchrpKran?EKZT6BFBgoN-@|MGlVb`nJ zn%x zt`DIt10N9-hRcLaA#BNWI+~149Lg${7#~Iwg2e7`Oh(vbpuP1C`{1l(>S6P`-z<($F-hBFX9)c zSuPx4gePWVJ?{$OsL_4JRu;9S-xodJD!LYDjAFjowxg}qXK{1(KdLRu`CG5bwo>a( zkMJw)$6m!envr$sdpYbq*S?nEL_7DaY+h!rO%&B|(Ww*pK$-OAp7;KUgjmB1W$*1< zSK-Tc8z&nOzpPTE2%XndE?d;x)}2PG=4sSv2&i2sGCz0Xq592p+10e6=y;a-ThhcQ z^)+PZ?YDAl#5#CKKjmBh2QS@K>g_%uLR3~CF_^d zo#oB$5qz2)E5UcnBuyujO5~EER@KVvE=p*(^6Vv=$;t_$A)+t!GFv30Cctwxo;UGo`~*_R#S=fsaP+1ll{snjKwjHM4V= z`zl=KwJT}X;8a;Ss%l-ILHhICOGyUrNXGX#A$xy^akeL>b*dqtxY*~tF?;IayHN2*eGG0&eV))oH&JAR#&Pnu1?Dt5v867quvuGY&=J&RbfQ z*c~y6T6g%*AvA4d4N4w@JI#llV!)$KTjmglZtKNc)EOrMf9}M+-J)|+2B#VG`QIk9Adn@1q*!Azkg*rszgwTW$03VLtvMX(7gc6 zqo)PGF#BHLBy#921N|Ob)}8Ig$(<11^zRr)+@H+8==IGh(5t^7dpa_!qaFtTYlbIE z;ql9u`;%WjyujWIi9*fYNj#z%CMVD0D#F#NCyjMj3V(MVvq6|evsW;G^N;q)zH%pH zK`i(C4#Fei-p;c4tUR>RgwCU(-JfNxF+-{RTTh5-NzL{5rUpPyT1d_dK3o!1>sA|_UTF3c>geDfpXDrO57$)-^Z~`hXZB8D$iRg_H)He>T2)Edhs$r3 z%$I`^<%_l0s>{&Vr+do{9D1IzwDJ#_HM1{WHqdbV{`xJfffC16?P>M)G4hgxgr2mt zbiFUgyh}d&hgj^|MIVPxQtD^SI(>ivs3Rrf#3FX~1Hh*p+P{Yo!@Kb{l@rlk~P{EybCqfZPk)a3d+M!IMXUn0* zu5shvoC~J;_OEY3ej0&U$RyAE#zS`DI+zma`{Wtap~r~NZQYEbEWd_UaQoN7Hr)EE zpRw>KaUEWm+-mIYN|Agpkk_5F2n>#59MkF?KlchbRQpIvBmS?mQJJrS!KsNaA&K+e z<|CB|*E1AB{Ru^;K^NGF?`4jpCf5?APnfIdlOg?BlPCBqtC0vEMp&Z&Cv0(*w|K)R zWKjz@uTYCzGI&$^88&r85Wn@XTCpVVTM_e#r-v#A2?lu5J%NYY>@--LxV>973^XTc z&#rGos9PS^5w-+f)aQmNuP>W4sG47@SL-f(Gv_Mk@z)LQ=lpWzdDq4d*N?1YA9^~+ zy=H2jiHw>!I6iltV}OWyEQ)ifW?V`f@E4V|zJRfd_UF%e`*M>WyFM^{%JIi5Vgi)i z4IlsVvQ^T4=`}OujlJ>HAPPLkYsSLvG+Wu@6`o%-v+a_}ktTI~-gcj7FSe)ZdxzgF z%>m+>!@CV3o7EM%cjZu^7_Om3*}54ZFHY?nWYI=mO4VR$k^aX7o>fBAsOt~sxX?t| z+`=ZM>M*7*DcyIvGgpa~ETD5--hpab?RnZnGzP(qHA(zPS=3N5&aTu4zvVB(KpQdU z7h*L59lq9kukKvnfT$x@c7qg$cxJ$+*|ocNFKX!#nD7_9g#`4L24PzF9aDsIF2R&?T znSGP~Fy@?*+<3q7Z0zz`gWDh4H($LJDKGDJxZU+#Q0hfmRc+7n8!0$8dH=OHR~s~$ z{q*%b6e-Qul*Fn$Hb-Vg1bis5SC{MU~;r@6&iz!`HXG%4NXl z!s{4B7s$tZ$|#Q0h59wJaOw~Fo$ot7LeHEc%*XBi>yqJ}PLn99&+gfrh^&PQZCmZ= zr2=MOT|a(RUhPY@ExB6(f{VLjcD_|G9^mDpurN>tp5271M99x|MtIGRw#<&)Y9Gm| zNHBp0w>Jh`dJNgt(1b_6;aYsGQg*@??aPaPW3*Uue@sgwu62EI5YD$C)e-pl;^2GS#g?e5$5wGPs;)|q-{$BCl~-6ROIi)_?5SORsE?)y%(k8n1{$S zcokdpI3_z}Fz;0#O)P$&4|bsnr3dprVy!V&Q9rY!9o>zrS$^(xoRYe96tO z@*-z(DniQAcd4h-(Wp@r^IfI@Wd(m!a>UUYSy5%eQBVF@*jRnI*s!C}11-9=0BgP$ zy!4`F!+1O3?mN_&z|;_KR$&A8K8|<0Y{tkLu)htkhfIH$gX~2cKUda3ZV$ zC2pYp-1Yl&As3!C5iNVftwA+A+DhFs4)H2646%nG+m9ZWn~U0!276j;-pK8iGV@~yQ zz}+esH07F2jL06-AxMGzZ)X9)Xl9FOf4dtdz1Y^L{5?})$UE)N7_~2y+|I_((}q^| z%)K#U>_*koL(V(J#n(Idw?`+sI&^;Omv#?Hvi~Tesrx|vWI~^Qvxw|VnxX|w-TQW} zI_@sCVZ*I44)$KzA*}1|ymzZ!Ge|pnJ$I|lZ776x>z;^SIxADwW8eJ!N=iIcQ5HY_ z13WEQReLgHyhu5&)es@;EtQd9k;UU2x0U?Wh6Z^14zCJ-kJ|qop4K{IP4MBR;LAx; z9{e^e{PL!}lz`Re%#AiJ#iO1}Ucrm{AdNu0zrchvAZAr-sGF%OM#sP+iE|w&d{u=< zSOjfW`+TE~4l5n?dLQs4En=C~u;JBVVh1!Cp3oPeTJ4+;;aM;J2O~%_ulE`DT)~==w^KNu1WCyybzKQ zlczom>*!T~i$yodO*D99E?<3!)6dNJQe(eVU$Mz@)o(YWQSI)v6zi@<#P56MF|PDV zm#b{LrM<1B&Uxhg00MPo@(JNaajUwtpeM^5mu`l#f3A%pstB*V-OFo~eZjk3UUjrl zor9gG$w5>?S48-C)HOk3C8F1uZfQwlrr5l^^AJ!d`CTjXZcf#h{q?Fg&%5jM`0Yjx zyEFPxjb|3PVi_r(;h4&P5OX1X-f%u=Jw%1%WAoDbvqj~{r z5k`;#$Fpz9ZLZSOBeya>xMbeGzxM39qb%ArIhUSnG9G`?OHGAx0b`G2b3C3gK(MU6)z_OI{ayD{R*n_ibF8fXz;@m63B-e^=gO*z zUE;MTMr$rnhG!;~ngb$M1&#OXYILWVjpy`K+#r zz44B^&`&l9nun5igxS%JY!${ue{XPVA9?&R$r-Xb`@wC#dL6E5K^5hsz3f5LxMLUD zX62gHwr-^5@a2Q$d~(nI$V#^hX3tn1>UTs?9je^gPsBtiSmY!9k22ZaE2aMr|>K? zTzc2p@QS5+l4tQKHptGjwsj^>Bfp0%oO;!cKaX6{cA;lp%+eP8 zT##U=n9s00#Nnb0<&UMCdaqlxCh@3S#4v-%=!T198bAlZpOE}0Hom{(rh50BPl^y1 zDtP&byXs2@S#c_nqNXa%%_WDb{G#1boVJv$db@ z>NjtNyIx@36V7vt`m*SH(arVF4>sg5{Iyl&zTX|amJ)SOqSV8a6SbWfv^V9pG@2Fm zTnX}28t+@c3J|-*2i)UrpA!!@T;t-8eaJ zmMq6ZY^b-rwwTZ8yrdVtR)-2qCs^3cL{4_-SSYaEwZoHYPgdh^tBO~eZ%VDKEw~n3f#fYJ;-7~; zwDZVjZR0q8vqtH5Ay}k;xnUDX6)N}oRHb?dFZGq~hrh7oTxalnJs+)ap7$KrQjId} z_VAumW{yK%i>cob`y%{d$_;3Am}14}h49ZKH_jfc;@?%%g;E66Y>Y|X!&|&^c$0T} z_ik}QzTyLqZf+FqMxhTc4lk+OLRRl%c8^Iy?i@eI0I^fIr3=k>Rh2E+u%*9tXq#iY zX#swCL3qMHIO<}U>fw3epHViM43M-LWqWePk1>xg$X5)IZUIpyxl{G6%Hq|aS`TXT zoef5JCQ{_bE>1BzexEquyCM5BOpNyq)wuF(6(P>vlj>@(ZEiF_SY7-C2^IEQAE%DJRGFl2^{sb~l|;6i=%=&SAUS7tVU${@7aaV-;9YbbcE7 zqeufZ3yZvE)x$5+>Vxcz<~z(9%!+1+tPe&fzUi3pw_|8r)s;3q=|V4*H$@RytxH;( z*KE>laG{=$3IlFIs{|Z~Zxl`(f-K3&6^>@low}Q+0gM&XzJH+Pe&9yXYBjoP>Ud38H@f$OK`lLwaCN$gSq)7RwQ09%R+akju zb~_^x1x?$ES0gpA`~=Uw72_%l+?^7pymjJzb3m?=x6z{T&Uaa^`DUoZ=yc`^&uD4h z!<>#cup16<3|-=>r0g>if-skYhO!cr$G zM+}4Cy1)E3_mr}IwVCr#iX~!jj9!(uaVoU*y`b^suhrX@=e5c1Mob~x0cTgO3Ra{j z%}g)!_%3W$KRA6!(b9>gxckcSNWwYR_TiOET~z+h@rK*IrKlH4^d2Igbl+)VN5oL~|k-L!NlK zyAoJvM$dtDsL}%u+n2jaY6S&WUW5u7?}W2;wjp0Vp+ab`ReZaIJiJ!pdl+(hI@iHB zA@XkS$y_>z-{Ep=e2_xLcco_Zl|8k^juf)gGp`xm><*@6cif|p77q514cpK_1=i85 z&WyBj$~>QA$-ZJso_F8~gSYSJ*)jdtplirrWvE3kpTE-hq#%#5KG#LkN}6Hq!EDI2 zUqa4g^?sfQX1P(-TSh|=A@mwf{kI-;iO2#uk@1hUy8aO49sf`{9pbYw66h+5db;NP_39zI=U7XLtTs(IHRVVr!$mFJ`J~dzCVnD}*yVNiWp_LT=TL(x|*PJBQ}=<)Ll zRbU0(TqE?Fd(pF&hnG@Go|6Q&{3;t=BVn$Mn1Hxc7)dxeU8Q(Lrig5 z_3nNYT2aX9^v5M!0(6V4khhr+$#z@?*MP7eW0Zq_#U!Ym)F#>+&H(Aij%YcTiaERz zXado$X^Or#*_%K6>I()U)LgXcUVN3&+mZ!h?FYuJ?^3)Wr(%PnKXgOIb!Y2p(GQP; zUz3wLqx&ik`5%WKelju@@k^Ep^wss{C!e4IuxWhCNY?abk}%(7vx$o*6izneBd;CnlUf6Ln+5Hu8nL zpsBW2-9FV4hvZ#ireY7MQX*GObJ-Ghx-S%SL1@LGZ zyMPKi>k+4^^ZIIdomLm|Sx@~vxU)X?ZJ+B)syV9oN`7#;&%+cUyPUXJM*`Iyf{at6 z`A5t|;=aEe1siNI`&#XVqx(l2-w9(iNNOsnX+7T@>~20CzTb~cxx{P*fTJ>LCtbQ>>R*;o6F(L4nj z(QTuNw6LML@sI%+rP)jQ^VvjRfu=)TB1KmeqFOId)@m-6XR>Q+*ZBU<=6tZM&?Z00 zrOE&M4W=>8B1$TR)7^Zqx+^0LMyXcspGWJ`*0%62>~?G5>tJwv_?MwKcluxz{d?JQ znA~3xKS$F%G85o&{E{d-1~|8V2}-`?K0oc_poaHxbNyt$C8f6RLA_J?8NJLE&(1=g z!k(;gwDlT6x~ZV~Ob4eY(6ahu5NKsKhdhdiHy*DWV0@6zeH334B{otI=fBU|*zJ0K-y$%)!6AxxC z-Z$_2JmVQ-{O)_iG;GILQ`0P5VIN%(VJ`b|tyZJ?TB3OBlZXsI880aQ3XgGqwu>jP zUR=J*smidU%~@u_nGI#0iqcV)&6z{RcwPM`^z7SS!kSbnR?!0!fqN@AsdRFU#{>6Q zqA8d6hmZ@6?D&`I{BYUt7SzsHwISE_UPOG2<3FNps>*-S9H0vvlV)p>_F}8sGo}lZ3_LI>4h?R<`M%-2T5EnopZq3j+>wC zKzFB-SL=fCB4jcyzg%c1*yE2tDumsuZ=j;>$O*Y1|5ug!ei2peM73A@{_ds)U>z(i zP>!r*8jS7GnlB7Et9iOKx9 zEn@)!Y<>YhA1M^;!~^+oxrY`)c>4Zgg7)1=i%Y@n9a*c9(MiJ9?|;OQFD|v_No!ba zmem!wtgyzvAGz%*Bps!FxH#3AL~H$S_+g*^P}Egy&bt*p*jqm(?)H`myR+h=s&lXJ z#40KtcYpX^eMQSrk7VN5z%Jtw%-k)Ni}xZ}Ua-g09fg2!mvyM9fzva96YKa+m*^Kn zD2hO+j${`SA5+TovJiQZ$wm>=wdCh$>~wfAfm4<61RBiLoSMnK#AFLxrtbv5t^Mp} zP|8dRnKS8$ji8*}3-_YAGN92{KW6yIvq8_{lZ~AH4YW+=^dX_lYlqe)@?R{|tG^zx zlhFGzbkaW2z(La{!;$E+ykbVBAk6WN8CN_O(_?uAY(ItPT2AFhd$a{lO5$H zz|60?Scw?AU!|8BQ*ly?+@ZEN#WW znn_iWNi>aCL9B>3Ag|Z$)}Iy&{7N0s*BLBfG8;Cok=I3=$IL8kD#Ap)bi`N4ig24u z^b(_6_6FVejkN{%Q#6%|Te39M{2#|5j9U$YzRBE=!-tBTseRo8^XcmDbweg+=fS|% zZ6vhbCoWD3!IMCB=3U;4qsD5>xwnAA31} zzjWvJhG#mv4PN6-B1rek68;F+YWqslT6Y%6dzdqv)0!`W&)R)(76e4!UHOjasX?*k zQ*peI?^Tc6J_!1GNO|#TpwXL8@l||tBSqC+EKB_U`P1{4C9!~ubFb3MSXgC8N!+QSO_BP;d>aesxR|k zRbN(HdMy5;!pYY$he@Mq6ib&c@S3aHJZ%FVcquU@J-VVS@c{jScO~1lYCvvd-V}Jc zz~r$ESO2DT`~ddkV$Ad4%eD`125ntukT5EscZ(V`&5%;AXNS}=HSgMgk9kt&kuB5J zaF|{H^$G1&13*yeeW}%f9@$F~*P#ds2#9!X$xl@iV9|~3VnIVuJV^;C#|*uX%%_Xe zSWqVQwysLotc6uWnD{*QQ}hzKhM;e0A^Bm`avK|x{m_pxQ5p%7Xhi|e=8%mi5mh22 zdPZrNJf}f@w!H=)kgCusJYO+ix^@VB#Q6r4*xPV#0K%^yBzW>VY z0br0?NILV0ad1((xa#|%Skuns+1SD8l5P9g(Zeq06I;g$?8YC)E9A${FfW`@RVa=6 zZn^#C*=PMe!QzbP)YZa=zu$*~L;MdQq za}3mv*;TTRFs#1vy*@L4G&t%IBP8-qR7}@+su#sTyqbLy(IM@RWSH0;jXeR>CtHP3 z7DoFNiG%X$*;Y5k=f?mO_9ZQq#`nwVNJB>L#Y*S(_aXdw^E`r4j?-r9w8s#LcENvY zmikfE7Epl`C#1|``=Oq+jDd6q&skuA|3+D3xuy22i-lv&X$`gwxSh)v)c}Q5*Kyj# zq@)W9tML~^=NO|ZIV{`jGf3w6mhi~&wCd+p<0_-Y-$cs;6k4v+K?GgpsC|9;q1v0F zGtX+R0!kPuf8%~y`~2(L4l02HQ4|o6bwnzpw$ZN}a3jnlDs9^9oIOJ&soymqd6$vP z`1;mUXQ-!W7ME3dNlp7Mw{ScY?hQH2w%u2#*usRooFe2xy*KL+vD&XSdQRr8LfVto zE|&)uvxxySNnbu&^bU}vEFS7`!4x%wSa8B-L0{War!pcF;%CNT(HGsLaHGYxoozl` zTwIZF-k50b(Nx{!TIvakAf5g5feL*3w5Ju2yr(K~;+VHjO?ULGoC_rB>0K{S3@!>l zu7CY?bD<$^N9Z6KXMS%v;KrV&_okOVbhuK-lM?E3B{FR`8UA$t#q;g&ejBx4N1O;h zpA|fJjd^M$rLC>WC7{GTA%@@{KaJoSiX^|G)F1_`enc9F;oitid$v|*rnS~&J6kAF z`)&rc2C-TFokG3rUsv|y`8czAdSEtDdNt^jXp znuPv-VC)G?gEPSw%Z`{_UMrv4-1Gr;35%K1R$TlY!}DNnnSs!!fv4@t=}ql>lN0Ml6-J7{C0Gsnf$yOQ9J0lz41^b@~^k) z_e<4R58;od{k?=KDT1#Iu?F^$%GiXqEGk~}{_pB~G9P2Jc>9eiiZx@z66Iy(Z{M)F z+1i4{CL~?hq)Th{pRz7+)UElrDCKbPN&Jt@u#ScJC~-YY{8K@*KK)xZg%un9+=JD` zzc!}de_!Nc7>`VhezA>50GPPc9PYf9$YZ4Z`+0*U8uG6{EsrW)?K0q~8W}^5qmC=G z^qBJA+3CNq)yI%G|N4K2gcuHfd-N`diRV4P(S>Z<5VJEUP0HO`;goBt-3{^p{8 zKha%&mEcEPYr;n6>W`_y*_%7o;3G5OZ`3HjJxnDbx1P~c)_2HeAWZ(-kI3Es{>nqr zFaKVSfC~J#4+2(q^1r`{kUIf?SGQFD{gVPBO#k$BiTi@Tb6TCViXdFVpIzwuSZb(P>7iJ#s0L}15;-2 z%}$vO7-bW-0Ym_oQjc{wJzUDuFN1s%@BNL-dcAol=m1c6V=?z#7 z7}$L6h)$5d5bkm1-PgHfO=yOz8iKMLbCrQoUI!ZjbJ>ya*Px?0#?|`Fr)2rXQTqi| zn_UVU!La>0o_*(w@S3sz+`|0TUyAE;sKtez_xfFX+7A$uepp$YKVTJq5yZS!5Y<~X zZPFTxc-TBS2j9=%3Y*iDJVyQ942ck>jF9(+P;J2ee>TZ$^=($x1ug~GEcHbBM?xC! z&w%<>?73v`zM`Y0+<;)*;-&ffrW?ya6uZgfBLcfs^~k4Z&h^MSigW$^i|$UM$Nly4 z4=4?v?uYO1Y?O9kq>e>jWrWns(+zR?s`^5%=h$41-QY#n!eYc|Df z$7++AB1ojA%v|%$xz4^^IBapevXqfWx+4&BPCbtQ^Np}bz%I6zJI@Pvp2~Be%sv9P z?Pmbx_#?+i6kX~dv&LtUzPWw+_h#`*VKB3m#Xw?*gUQ>TaUd#1Y6Cq(P(Pa!<+Hqh zkxfhQ-}e7dszIAuo!<=$A18^ca4b6-yPwJ7IyV52%nD~+;bFFAguHA3b=wMj{U+!7}6Lx zhHx`bOlMI*Y}y7wKq{yTMZSM8;!wREBeOQYfki3SB}3I>F1-DbZQ!+R2hNfU)4vbS zAi1EAo$dWLdz(BzPc+O}Xd7^Nhq)A;a-WpFS*m{Bf|kZNmizLBo5$bXuX33h&`1|I zsvt0jxPH)`|7#Ip^9CKAQv#ih{2%6>mT`tv zH?$pw&!VB;ZL~Wpd$&@cd!kPxk`>YD62;BG-p@aHARTROk-<%o5FRa3G>Kab> z1RoHB1c>jXu|oFylgZ}Vkd^+lh}~)!Wq;FYs{W7%ws>e}ZK^@)>9EA^W-?`kX}=u2 z5iD!M@T@tVxV7YK(5=~N-`}BKm=BZ(9?JeNu6?qmnWZJDli;!ZO7%=RXW$xZle4v~ zW&_gKE{i$@lB{$?mVvPXA>m`%e4gd^+W+G)M0uk{5Yt4gr{DmUSOA=4z_lA&AM|!t z-gXi8ui4*ilU}Qt-D$423sv(t3=t@E+uwOsP9YO#bCIOXeKG+h^HF6WQPJamlE)m^ z?p%Vy%)#CycKFX50*j5O*9;kO75;iEQ&6DbirvKhRsGV2s=cL`Ap*tji+AL_rY>zR zWr{P8du>I@XeLId`M7>JfR9;rR6H<-t>?()zQZNOMrZ!G6UKdodfOf5wdyVBv!Om& zr6rA+GxV4(mYMC?)qD+lDk1<OB6E&D^(5;~D@$>JKj)e4eZb;UMcV4Q)&V5hiGdJb} zD3JqKl3TLRmrvl8Wv=j?!E&Gk<0~oFlS*yge?Fyp42A4AQt6iKjURckF{lG?g_Acp z*r>-!9g_FK7A_5X2S|#Zp!KP!7w}RuB3ry9zr>=-7l} zXVef*>Z<1$MI(h7r}dT8!;CHFo3`RLf!ZfKy3~cAH8e{1B+3eor;Rtq)T|yY&v0d< z!4(_AG)oOlv*fWGxkLT~i}`d4^sgNVTA)jCwK4YsJw#@_(#TkWT=GlJL*R;4Xr0TB?J7O7`i9lV5Wb zZF|z=x1jQOozgB|DQN1tEdP9U%1-lygZI=M_Xif*3gsKw`A(#`>$^T_qfXmzkKJEi z_nRnD{-@QRx=%^g_*F0q4w}aPovnUd?Yn!?R}y1TY_j%MgyPe$ z4gp*3@86IWdl*pDo{(-l4Iq}hM?3y6D9;r>tSS+2Ph|a3@QkS3+7>T7Ez}w1r+V{{ z)yRhznd&@IyG`dEes2>_|Z;{gC1b&SI*W0DMl(UK2hzo;D+iUpqM<2^U z((7PoC}roS$D|*9hmG&S+@Y%djrKXEC2vz06hk&M`rVY3emcw#^CWs18m_dut2>JjoDUXG4GaPK-36)hERoy+8sjl9Wi_aePM$JO_M+JvZT0>YxXOv1PTyk$wxl}at z2~t&$i9OEZ36ou*-zR%LIP97RVXMQ>}Y1i zb?gtJ;bH@=6P6vIQiUz?CAhjX6R(f-JtCYGz9}p*>>`|VZqpJW4~j7Cx;G7D$4a)@t9zc6!lKy%ci_IIYZ1*p3zTk-RwBR>(FpdNyOCB%k3U z$`+4*cLb{OR#dtDU8XVbSs6yVIlJZQgXry@TpY1Wb|pj~;Se&~5BsU$t#tF7`mG~H z<)*rqG8}y(cQ4vPX_eL!;WDL&6r=x{(%{JFjd7z6hZ>t)x(UzNUs8h+iTN+iZbvpP z4x|R$9gB-qi3(}APT1ZNfrQjz+HXdvfiS!|TBrkcsQh_=6sJ$Y*hNgzKY0Kbx8G4$ z62i%Iga@+ne2Csps!9`1vCSBHo-$G+=o0kYn0T~M-efL`5^`6L~+D005cFEk-{I2j!- zM%VSc{_sCk0x6~fqGR75rJH=nWj3?nyo+84gr`^Bo1ePNJo?UlstYscbJE=*8C98m zP2+Bb%f~LQb_lljK>9nC`o--niJqku{X|(}=<4dU`4vc+CH98L-rCW*X9Zq@ftDMwAQqlIr)uZl-b3g(={ zLQ-r&i`nu84D`;g@w3z^GC_WBtCR5`6gcQcL72P8(JB|nquL&l&QH{D<9J-SjFotw zlOF8kbx5)Dltef_KX<-|*-vpCYMdYDRMbySAu^R{zP5()OrYmK^>iuo>E!wNB67#8 z&|ZnwLnHGaw>>9%e@r3D%p(5aCaczp51S#ia;~ZbLCz=r*_mO@`6i|G$2avmF`35D zi|iB0R@xn##St=p?b4N(TihDwJ?4u0g6!{GKXEAE7`x84nkjXuvB()vNHVUmN0RSG z-&w9?=M+DIk!-pYNcqj~kN;Qf{@V&u#|I!VNFJlts{=wb{$cMprHCN;4$+b>gv8p` z@vZ!MOpoz$ZIW|?SK@rXtA2!}L=3t+k*Hc;skzpPF5i6hH@v_43*H}fPE7g#h29rW zqW0xpA|4zKV^RBGRz?bM@*%dg3iqIVww2EFcQ-M0$&~$hfkTjI&YV{j#vmo_+d_F0 zDJ~8Il_YPO=sLb;UN&@aMAhTHPszMu-%Au?jz(-}8&_A9GM~QfZRw8r_DEFDVbWhJ*m5V{`OLlfgtfj_S+9E0hrD<@941NP=p&9LMQ^sJ!#5D=KGI%r{UBF)`}ED{ z=jc@jP1U_9H6(xB2Vr@JpQM$MSn~=0Mk!0foWt{{Yl9!n+{?Wx8%X3EB?NlRtN`hZ zMw$KK`%vWSBs%~_07Gyfr0iCl&~9#acVEHoX&5jWrj0~YUwjH-%^d3l0Dj<+V@ax9 zC15kK=R<_LGMxFu;{U8d+zoc*V5!6`dMp>G9L*#hNQXVPi%V1O?kG6$1fE$hUznfi zySZKCg%^yElxc{XGIZRRb+vnv>~&_I)t<2uddw)$R>-K8nd-7(rgaM=V8-pu$Sx<1 zds+Ns6td`qOLemQC0)=puBvcD=%=ufVj9Nw^v9vuu6=e$DNgA_tf+I0C z{y=#ndV+~EVqrbL*BT;uDHS&V)FHka{PKudXe{7En(Ml-<8lSTmASlv&C}gDn>4 z>o%C0KJQoK>h;>pAz`}1AynCZvfVN{qNE=op#EU0BanJJ=y&W}uGr=MQh)Bj47Ydp zc{kd&+-~c$Isiw~cK+_rOIG3+el*pfMhu(=)cxQTI+|ji)8AJWfkd$~89{f0w)PCJy z{D()i3HG@U^Y+EU(l`QMkuUs^v!AD;@PlF3`OOuxQuOgg|DVhdfq`I;W)o4eHR74_ zaak~dJbevXf-RYnfViLkN69K5NbppuJ(zf7fR7bhp}G>^;Sc4+;P0WiaZ)f$`dgG%|V%{w7l%h znqdo1vlBA%;|Zz4&JMm6*cItA>sJtdyeXmj$4nzaKJsr zKV0IQTK+Lzl}|0O6j9}!ReR-I{kNA2IAja$c~DrJf8j*u?NHOJmf9^{44vM zIm}=svs%cOb|?pY`sUp5T$ZKU^~dH_14D<;>fJOz?E(+|9Dy%Iv6Le75W9QyXdMan z@8Wz!Tlzg#GS3yC@H3@q?>cH4&MLUw_1mSTrMp`C^5;vy-WJd}Kk~YA`J+e{weA(c zx&a;Icc+KMmd-pPUXFaF$tabXZ&ayxu?KZv6tFQM%f|UVQyijeVfg9c&g4%)LoCE( z_7Rt5aozIC=a&&`mmxcLaZOCze=ogu?^xY1sm#W+E)1UpXx$s$eD%X|Wzq^{z0y%g z3n~UFFR0B6x*R(im_4xxOOCZO(RPqF*)3#Rm(alJ|n8 zbrBK|4ZJAsxCDbUuMRcx{xZKPtVnLpX*T>io|X>Ky`Q*ZhP_=NBQT)Fui!ua=klus zsrmcC-8^c3YHx-O(`{wiZPvBQ>V_y4Xy6v>f@+>7jc=zDpA)=HVL;|VFQT=vf^WE94w#!d|0OU~`EcL*kXlf17fQFEH!CIVjSl37C# zQ*059GIgAA$&}E?iBo|lGGSEMm4xaxUK$y$ah}Q=sSV8})4sMu@A|+frF9F{f9BX3 z2C0O4RnW9Ramt6ENy-(A+`P#(x+FdNIl08Sl)YrUz|lqcs4Ll*AY2#`|0($9Tuy~o z^+6iGS*D+*JAV|iBt2O{PuaOfp$f{`2(CHs9Z-KS)fqTB<~oXD+Ghu&vmyrRNn3BL zR$T;31eqYrd{SeIHXKtmvu@+O41b8w67$5pPcl$WU$7dYQFc~z<+59QWtXigEcMV` zJkps#CTKh&q{b|`yq4KxWXM?m>$dBpTJGYCr$zAaiX_(Q=`=f<`_$$k2zHv5wv+V( zV62Dj}N{?aRLLZKim;WRRV>!U}J^ zN#FM9W}$`(Yh8sJwJ(XMbx{2E<*O$HA=sL^XE_dG(L6yiGIm%K<7f1c&NfG!W>lte z`*{ib-?hKWF^q2~K}qn#D|VWErxdjEDU4*y6Wwu^2*Mw=ESdXM^+^2xoDC94~8Sf)C?A#5oxEuFfa86%v>C6BNW35^g?}hcPTbZNix?I1T1^)=sc@ z%_HcMxwRNB0rpnR#q^m2A(-gC={AgK?zC3$8ng^?K+UNb< zBWO>W6D0rapM(W+TBqRbnCA)`DSEv5+;6)B7R5E+UBw_4s2K1reOLIT`+Z7&?!~5B z-5PlT5u&46PtDs9RME6J4$q|eg6CCwp@R>#z3`}6%7hX25Dp>ZHJ#`{-7cdwd$hLP z#VW!Fe}?B@aBOfW3$ z%=NYriatGoBWv!Mm+v-bR=uQ8GSuw)JKnx+H#3`@EbK@c%y{r*SPP7Ef7Q8=NjN{})yG;NgRwNK)+3}rM^jh6lDX*V@Io+@e zb>EY-9u!%Rly+GbqOC_Bl*3A}d)eq!8B8-MO3+vUrKO^e+^_W%bF9~GY+3YaKrVA0 z))+Mc1}G`xT~dr9@CVAi{1NY=XnXhzM5WnI*X={-C+YH-DMhXqpfg}%n+VR(ych|I@0%^`1oM*kly?2z~7!8c4JuoC5llpN;RtJAeqcoPqnXR7v*G*)cB}>GTd#lDy;v4mIjORI}OJ0)bOVHFR7Mi zM`HPA3Vtm8hiGM(66%Sn0`L)Oo=Ye_8no$gqWyn{h##xfE3$gKzv_k}O8?~8M^Zo` zcLtcyM9DeNxi^1Wdu4k_rIxrAhGJLTD7}g*7AhMu9q|H|A`vQOnlu5Nmq5(i)sfmI z=ENfz*N;QKFCmhVcpjsCFUSYKuC>+Icd5h1)m4Qh zq8mtZvCT_MpIwhRsV-;)SiKpQ8>j7+u)OcY(@$rIh=2gWFS^E7#xQeH(BBlh*EuH( zsJvn*pTbH`2fb|96K0eZAN+MQ=Vx{3lNEgL=8tZw%q^t@mnSiXJ2ndFF^^F77G^4# z%y63YL}h0n#gVVZ>_eo?=h`PU+*#kBaQ;=xSWqZ)t-o?|!uAc&a@yqXS;A4)$V%u^ z?@7eg`);QBks)XM$<9(3@jcMz^EKF(x)7`jyE%HAYGR5^VXi8Yeew)$NxcK*&3ym0 z9HUdt}Y+f*bPran_{}&7lk4@)LpCYn&zykhT5m z{m@L^L-p<$e700^*ux!@f``WOe3v0sV9bJ8@75pg-IdfPZM>GRL3QIw#0mT%h@|}s zH|I{dxar4`wF01m%(0D4ec!WqrIPp_r`Ha$DhnS2b`}CQGAr$M{sF#&f=G-G z18Kw*_TnDDzpty_nH31s7|UvMMilaiWpoOmmRsrSeyn>Ot zN-7Ej=yA5j$Vg^LI9GzLKQb=#fPVX$4nh+nkT8GxU1`&TmGv zhq?4==z-KI>q5v)%3}pSYTtv|^?o-g0+5hNZaxAr6uw^{NS)7pAWV&>UGp+CD*h#FA=g>ndXxKuhsUf6X#&ZLQ0#mY8_pMNAv$#8%}8OXbpXla z>8V(wh{4o#u-lHbDcW!m4N%W)LBam1R8vpN$0UVG5*t19A^(`EuG5i{2Ng(p#vyBl z;)6=c@DJOI3LoY{l&rfKJshnX~G1 zJUKckty28O1~4fYs=hI}@d+$nW4@w0HV)Si_|LwQ5g~7qt2dH^D0?it9KwRHWPmGH zJMEl*79^wq6!Imnp2(^XVx3@z&loYT7w4XhcHOEdyM~Ut?f}Y2o7Tg3RrMD_v6;!d zKI_jK-bJdnu$aQilq+8xc8Q0iun$~n=CS|>INGH){q!f0wT%PWa@KJV(1e;J=&tuT zW)yuyH#Xl$PS7=pMp2`J_pzXa8LtfTr4`A5bzU=%=*t_=*znHn#~80C8t{czwm~PB zrL}h(KKmV8DO`3zGto3TLs-|)jW%C&Ni3(W;R(NFjuJR_Pz`Z5cQ3NfE0^<9?n!)7 zI6wDX8B~(;5u46dxpvR@O{i41ddZyaN*teb?{ibBbg0HWJn$U3@He{x`q%Z@r4u6C zOM^!8pkVDmaP}N48=*EN>F8&b&I|(m?n3zsl+NC@4*>{Y}ya}iSD~oeTC535vS!3#! z$!yJ8wV3Pd3^zcBehCRkqK6-v!jpw_lii1C7g_DmRTjZOALBIenYZ3OG$xB7%cS&x z>Q+%zFrvy;ZNBS=m|QQs8IgDyp+#AFtMi588=5)f#{;2Nd`$SBK~PWDG4|@G9cO)9 zn2Q0n7(B8ApJfF|jZMIjc&{LPfbppa=30#G%jIT4cs*ItVxcAt7xinW!FLQE_vD zWgSnCAX)50{7eJ~vTIf%Yr^B+3^dvk!{fBe>X7A06Sl8?{3$sQD}UGI85C;%ab6b( zqP6)YmqST!kr;hc4poF^WQ{>%Dci zHFe1Sto+)%v`m!p*^-SD)LWzpe@WzAjYOX!pHko2H(=HF9EfVhku7T18*>4Lo&7FS zgP})9$FP3(@siMh3%iN^neTa zbs2K=rmFfT|7^o;&(0it2@&K!hFNTi7tBh47>^K-9F-+Y14bz?! zPzj2^2c<^p_Bw#nXQNL|{1+v#3y`Xg&&YMFNf;Q7H>Xv*XJrydPV(NkJp$&$dR$mr zpKk7)_Fw0mEC7SqZ_+Hkx~QKM(FOv-FhbzPe?^@~BmbGOUtghrS?Wn65Npsu3)zIh zF!Oi*(D~|<@N7p3{Sj9C%9nv=Z!{*V42;#Bb4Wy5zW5G&G8SLP0{T|$cd3&C^l^XE zSLOMpFb8+BALDU707}=`PWIw5qlX+@X%O^g0X)M&cK1QiqYtREaTo-_Xfwn_k#47f z1r{Ypg3YPX>5&uoLHC95e>}0^sTsv0x7X#Jja48A(gqBK8VTZ%v&Sq&BtS}_~U)+LU zB6}KxxWhcv0L)fJRiUdR=%G*EZES+y!b14#5n!7XC6bzv`@!cad&{|ROq&xOg`$3HT7% zgDd9T|C_?y)84k(XgF!%%wAi-oXn#P!ySD2H+&NIlQOSMq;#0UJR&4*#fG#ZwDa{<@L0gnO(gKdS~%C>y$-YdhBo17+06r(c7Ixoh* z>C6-J-*hU=s2}Nh&e-V1P~_qt6>+AX_lVv6#l1hcP5#BbONIO!_pWOH%|e?xD_%;+ zeko6OZYm$8yPG@OX#v|$)6UX82JEXEVYGX!s|~MwV8oH`nezFhcPz>~D&c%eA~(ZN zNp2@2@bQ!DDEAX<07uhUz|F?OW58sdcsz2a0jkcx>UWI^BKBW`mH);D0yaETI~#mL zlnR{g21&+9lFMcbrrL|pW)`7j$u}R$PClSEb8Gg#Wi;IJbtLb5jG&OHMU=;;rQGv{ zH~UxzZ>9sebA{>yUN*5P%z7 z*jWDye*>uZ-;eFDe<(Bbn6fJ=-r?YS2e{fs$xHh>(qISj#dYZz>jJcMtPZJILmB>e z3_T>|)w}=x%KtCI{pa`fe;&g9{}Gnok_HqH_kohZdaNwJHSRn0DbaAQ=2eAr6;*&t zs&$(e6~90SIlnpyzqQJDm4%AQuh?i1}Gyyym4|oBuQJ*$N|7jM6`; z0gm9lCOB-z{5zn{q5B8RRe5-e*vZNN0@41a-2mq^`!-nBX|wAYQFAE~tkty|Y)P6{(z^oEm;RW)Ex7qUo@k;YRtlTm5n< zqA%=AG{x{gS0*Re5YJxW-i~>H-g)*bbEuhdXKKdoeE-dFB@!%%l~2qGUh}hl-j&_;hstqSx3jq3YAKs}&-k55 zvG@YB!Yz2bpx_UUH_B@Ittnq#_L&-9Y1Mlt)+v7$$eRB3N+0UKIlq2r`SD?ANsGU? zsDn^wQz{+9eX;P%jg89((R}wdwkXck>>A5w{moMuy^5kj*L+LIJl~BW&0kk-<3ekS z?@e?B50#Rq70yx0Zrvp{3wRJBLT3}b)5vAlC%TXbLU-s)G+h0i87k?#I6_%336?A< z?sNHClKi{#-Np;R?HHrOoVa)%OxZo_Wz4yvME9Ek|MT~!f0z1%G95VF!{BjZKOO;j zSQhO9V5sLd9SUX(Q4PYolj4Fi3om>&n$D@thElp>SWtZD&nZLCHIa_Gt0e4Hx&CynTbN|fLlggI7 z-movvHhI2S^mT50@6FjYn=@qOcnn3h@F-{D95cox9(fIaU1IyY=|Un7cA9C z?^;+pZC;eQ)BGB3zViBpl%>8Pm(1r!WLHGS1Jn&NF-FS5r=V)z80N9q0a@%TOd7~> z&Rl`LKc7t23HQc#wuDmEI;i^AkRFT#!PsIi=m`L>9{&T~Luc39{C5&?eMU<3u7|(C z39iC#G4sGHOjPZc{vq<unjJ)Fy>B4P<3S&}R^71>+I+z-8DT`^{(6G8l6C@M6o2k%RxQm5XOWX?g zkx-e~c^>Dz2REdW_`%;298JpWOU|93x9bf){kPic)prYzA{&p$e+Wwtg&^3xvXIv8&ZIpLoyx_?@17A_a(vimLJX?3ljXLLQ{-7YxgK z6i&WqhM0`3jbLuJaZnPmFPf>7$sXeIeHk_CNxj+yo-#3SRrT*^-z|83D)|ggiOW0Y z#ZHSK1>t=T?vbzK`>qx=eQkNAVRZJ3s&jmKSs^1&zqa&BR}>41dvzR{np3l9vx}k- zC~XnQeKQ9o_AM{~7f$Y`?85GYp{foDS@$S$?M+ej9nFs{dmGPcfA4B1!e#icz4-Z$ zobAS^pOeJu=rb6gdyFpWV}O(Z-(+u>#?yU)=HL7kFS>_r6v zA;yS)ujMPfSL?f*^esV3O0(JUaEWOm9(p*C(#Mt?dxsr$4z}B>S!H)b^Z=pWTH+}H zkp2jOq&N92YD%V_<9Z)VD7r|0%kQB_07Ho*ry_EVO!p`0VQ*gPAT&KoGex3B9&MBy zegb4&$CU6goWRfn^wNM@#Gz~g!2X5QTYI;2GsiqtW??i+zXVeEBK>N6?P+ZdSSeaP*EKqzt!CQ((G@n5g*4dRvU{v|`}8A$M2*8q|a* z6CzOiB;pt|b$~teHGKG48_n-r5sVi2c=@2|j=weU<#Sr*oCS|N#%X_gqNMRG@L5mZ zM-;8EW1Kd^+K|ZJn@FDXP?AoJ_s0COjddjBy9kQ%HDyx2yt-hx}cNFVqkGfD>9F55qm8c81i_&aKFi0^pWyBg7 zU$Gic2X)4C<^3_-dS*|!dF2UfCFeeEbaODjlzC)X{7w|ZEjko&I|}Fa?V=8p>ohwQ zy6`tXd{DRea}BWHY2&@`q4w3VQlJx#TLVHcps!g3$t`l{X6NR~3-})#!H(sew3`w` zDG@WpA19b7raahV)J4tf@e(dM7vPl|s}oh|;i_pZy|Txukb0y6bQo$CP*CBr?9nWu z`Oj!NASkXRu*7UJ!S8eje{b<#gGW}(v6WvrJA|H?|7sbKO8V(`#+d+Ps=67UYxnGB zG-UE6T=4=+;_gFjUOACVP@n5_xa_lXqDW!V$wzO61ao8NKIcYif6j?C4Han*iH@njWgIvmHuvX^pyAnItjm-dKWn zmW1fuD?FV^Jw#tJQ$;f&Jzhfj!`>muvTfNdo?mH|B6Kep_?h`w1>^N2o)t0Yv6O0- zRhTp%&*@Uub~9WN)djA)_&Aefj7D+7t-T6yY8U)`hWGq}kEK28-aLb+dJReIXnlP1pPC!J|{}4p*@b>OrjEpW;GXTjz zq^kGLjvP%OFoH&vIA~NodIm?9|K#YW&QVmjnqw5XWXBWAx>srG0LxhGJyHI%P!Y%r zwVWDyEdQaJAjaVw+~66GrhSbV;hKga=hU{qRFwptpeyf=%%6+L6yUG+uwiyxoYC~7 zzzyt1g%)?}-R&6kf8&_{9~`@%f}3T7;i*l;c7=OTGO=Y_Vh-mD>L;;){MY--NQoRWM))wbQA$yTbx+ zGf4J6%?7M_JDUfi=o)fjf*M3_RiBPd_2?pOV&LaBf=I9oblR&TE@aqi!*TUhr78nH z1%j=|-u{z=mc!ij3yy$iVkDxB|?~X)AJW@B!Xzd#9`D@iix| zA<_$pA6EeUUWLs^77dwgZI_!y=xq!xFRTf_!D1Y-*DEe-M!hjt0#PrTu zV#?k2^Par&u2P~n(=XM83ChE8z+liZ@mVhAwM~>Hdd&da{0^8@?J^CE^5eE*l(DL5 zam_)U|MmLbOE-&^otJ*nG;~aofTV$P(r;g~9JgL_?0ig7rR!Pd#1!jFAolRFG86J3 zWP}LY;9-4vxy>t1h7pU~?8Za(6LvY+EvWVIkc%g2E_{(3z+yNw_1=E*o0lq?hQ$#* z#ol}`DQEZcey}e*ubKSGFu<3Q>NqIH$$o#)bE5vyqpxYVqHni44K9EFQcq;-eC1Jt zUvK(zD3on1-EPi~Vt1AHXpe>ncIBc@Qi4@I;*sUoI9Gc}-bT~vePG0Q-x^U${mWI) zeaLj_@NM{-s6%4s|AcFYY+A%o`s8F^>=u}8MprZt;&){+DfS;_4p%y&%HkGVrQ^>#iu7yJ^$s-Xe#ZZ zLg{-(gCDn=vR1{;n>j@0T=Eg#4jzcoZdht(W(?Ij-d%m+vrI?S>x@o| z?>{e$c+8YNRd#>aG&j?>GUA+Sym_PG@x1HE=9uUNiTE%}S1ZVE_v8L@r#YLYmk+|< z8|Q_&B zI>mPm$!*><+w{2F9@sYL{2Z2Rn_G>KBnnMAgK6Yp^lISyYYGa!mJQ#d z!r2&`T+WqWI{@VCkJ>%27k`*Yn#k_Qiwww3={l;{_~7Ge*2ky&mFv3TQ@Ta)bmsx7 zJmNiICNX}%Qurfmf7o9h;x6+!5cmx!0U6#0Im*iw^ih$h-!4{~JGf#i!?aV5 z_PiLZgNU##3EOq?#9BrK*nxIc?(B*@&)!J$A{}Jgv&SyL_fxfh5ufPjlB9nS8pxd{yILdEwzoS z_rdO4N8gc^Lq5C5_8r{-Cpv@7kGfNKI%9+2SHX@kM51!n)}s`Rt7V%D%R8NZlwXI6 zubCHjs~{KU=sssUS||lLHT?$Kx=tKK+@E=S`3W@w6(vnPKa47Q!`rPck}dhY+zQV| z8+w&N`I!@Yjv&&|5{pIK>TeM1 z<@d{xO4dCNxh_a-^fA&QtG;}YE%XYC|FPasQSjA6oYO`0F!tpLhb-G}Xvrs!`lrOU zB1`)0kcYhR2whj&!!~`0WB=8w=IEnN;aSAFBFCNcABw%-Zhaci+V9HbPkG0AbMo_K zpJ;hnYUJ%VQmk)N?Qb(!4gC14d$?bkx@t%iCx@?%~mTU_F zf{>S|9fm~MaRhQs*fjOZsAIl6KF>C<@EcVttLmHVnNx zcc`9n!a+z0WUzSB)f3(kk&wrrfr#=O(xHw|*2|zuiiE`fOt<6PGcL%J>ocFTCOcdm zur~U&GcSZzylTpE{q8Hzg}s@_Z}HWWM!gGCQ%jQHPwkLAm9eR+wZ}=gx2Ld2uJTr= z0kN;pPZptZ+H&<`EcLw99$@&jM69nbW$Pq$L06pX-3WJgz3+`Yb;H$5cHR z2q%=t9;050Hq^IZ5CaZ*v4^d!26gYKT`^v5>pi5V%X87b+K z5U)cOMue9^(CDyR+iECm>d20<1yM!<*Z|UwmQ5p+qm{$28CCKHwnx^o%&VX!!x{;! zL%h$A8m8&$JXZ2q7nFA$26iRijPt7s<4(R`8J8qGVtY}~z92>y?LbIloa}gj9_)FV zRX}Aj_>xr9*i$vcpgQBN7P|i?kDSoAoMt!lMu`HxO<#DvO>_3H32i-Y3-@%2Kc%T1ZYtr&m52lH$<9ygwJ7x)aA|zWZiX z7=?IHG@mwn(OvCxYG($|MEYPzHp{C8i#DI&Z{AJhQ_@gFCKP(d&?#F zTDChb3U{)GGqMhgkn!Gs|72lBV7}LkVXnT=`N>Kx&3v$q(YwVvsJ8J34EXbORE>Tq zSN&KX?g^ZcS;Fqy@_vi--MY}v&>)2~Rv(FsE^czE_&|;Ijh^W8#f0ntDD&j9s%?4h zMzrk*__&wdhyd7alUo8g=A?tQ5Z?Jim5(0s7ns>nUaIiuWNBsAGs-2g5xs;=6W-wf zhQq>pZ)4s9$pD$V;D6a@<_9d}6`TF5rEt@6g;JgHUgjFcCil&A<_pYrD;__{TLi6x zZOP+mo^Yl8n?6i^h15(i?BKXT$*~8au(-s{V7gxI{Kz$>-m_HvYL>Bo3wPtFm;%2@a_?o&)Q{mc0#03=XC zR!!c-$n>PYK0ah>MZ=&1lISqC5JqcSAeU$=O+6oABtC{~sbCr^CJA1()VO~bv@YAn zz>DWN2;C92opiaSKpRQo2HKwo1Pjamu9!Wcg;GFe-1n^|O*>5PhpZ7CMo;VyfX_#? z-<_9%4f~sV`w}O0wAxiQinbmK7$c;Fy`aYLm9FHVKJ=Gn?Wne&%xy+-!(KTy-M)(c1ef zwV5xZYWG$q*|E{D{e+Lb)#fhd%2En$*Eor2<(YbjaGO~YM1*V$J|`dJe8@U7BkPU~ z*>sLPJzHhYFa9!gcG!`oh4zTDf&&oB zI`iFUA*$!x^Fw)oB|i&hQ{|j16_yw?vi)g#WJ6x9R)Lw93%>t73s_kzp?%ck%9NKv zRZW}-EF33?A2CI28V-+gNHUC>+TrxnTFQ{o;uBufm2)84u=3M^l5hU##WCE(z2)j| z>Hx*4QTSiC66Z}<(>J;enEjP^_tzJbe%z}Y&a0?sGmdVBb!7Qdb|=-;^Y~tN|28NP z8TBGG^uw#Oje3N)z@fXv_nEcn1_arb3YC}xgWQazSAv~ZOp=drNr70{1Sm#JWMOTl zX&{rxCQ{mMr;iOv=Dz_K)wKN7rNr!wSq~`0j`?)!Kv~}4Wg|tiK{9Lwdkh#l=g(>H zfFwTMcoUCbPlN8Bz?(Jb0+l}{rqWa%w_e|N@}Ls-T@>=rRl%&7$|lX#uoJs&c51#& z{6;K2m>~jL8V8%nWJg>RX-A}K{E1C>grs;i^hf7-<<;uCuDZ(2fS7D&)XtfEX~FtJ!!5&k#TMH0Q(Dl-oNhJf5Hw_Jzvt;bC`(r1}8I0fl`+GPt*B zk-KP)t@M01Z(v9KTZ|0@v)SnDVP{)0zB|!sySd9-^a#%^?7Vzc*!D0*_)+ui#n`Ji&*tfUpQxh_Kx940KI_;- zEq*f`YN-2bwHgDC`}F5R40$nYPZRaysS932u#!5~dgot@qH>~;w?CZ6z0HIAN+_VuQOh+9)zXT0z zn`K`a8QXPKwAf}sifZrQ7DU9hxy6wm_@I5n!&~J8=3_Ic==uAlrXJJ(U9`D8wZ6CH zcz3muOqyn8IR4tTSQFH8V~j-i&1JACxhfxJf`YD$XE<&-)m6#bcF7bsvgMgOss=2d znY!SwK4;v2f>B~53gpjOTlkyI{6UGU)~)d&WB+Oju1`!3;oFl3SJ|XAtM{&^p}Qxt z;>ebVTw&&Oi^DM8Rra!HH9`-50s-YV72vjgIeTPAS5i#!lnOb&_>m@i55TL~6W z66B#*xP{pcsU?rRIb`G zL;$LXVnO9q@AwXJ)LHwyo?kWuCzLq-nCYOrY?;ZXo7j#-@7Y7NyS*3d@Y|Cd&T>8IP3Z)$y>*-2NZ8_DAtkn!E`@lrmkde-BJI+5GZOW{|WZ-zHp-!HX* zpA)mpJ&{m(d(7<|d#>jFH19~ZzFK{n#VP57y2j1S`)M!kLJc~fjz-w$LPZWJzyfF) zU8?d(7r!$!GmLqxfsHu_Ch{dTOq6=Vnp*?O9hIb39!6ND!96i_`ihUvH@+3+hj{%M z^a)Ff@(sB?TnN$3T35>3eh2FqNhz5jm99y=!P46AU86<@B# ztJim$;hGDm%|>|ZE5x6#%MHv1&(d>dj{AR9ld_IE@%A3J&GV-ap^P9zc&kYeBAjEm z#k$M+C2-L6#LKjn7dnQfG_K*e@pB8dQ1PWe)q$iFZ@sF*%Nn%lPl(+^NvlllOwY!r zP@7dGhyqQgP`uBQu5PJC+_5FJ_X=Qh^XnIa8aNgz^H`f~95A_=~d1Sd=E>TwuBWg>Zl@4|VWD+W4?ZB(nGXY#U3x)5T{%Dz$&MkzB@>bNA#S1jo*fPISqQAe?jwqSgJm_CxI2KNlA8| z((3*7M#Fg;j4N~Y!Ax&GC3bYX3LQc;3$S?qsy|R~`V`Z(dD)vy9d#s9lfG$%W#Nh+ zN!qkom0=!B%73>kA(a;qgnl=w-{D=-Ad?Vb3Z*H7_e{kxU-JXC$nn|pJYlz`AQBdK zdB=`s5W%n}`9$?y7xr&2Wv~g`4H=wX z(#Q53FG7DUe$w4g{&Ktf(;L;$$>{LV$#>MDldoOnz4hP8?tk1$sJd@&8*{!~r27@} zt?+zEg4i3(l*d~UyWZP~@0j59r?FL;oBZ4~#-*I9KoJJbt3}V2m-`Q&;wkOEg!eBV{~fRbhTd%i9z zyw)Fu42EP6Kj+9f8feS;8fatuG~Z#oRW0l!xi9>1cn zodn;wRO2bF#opStscx$mtz015&~@==Bmdhqw-QPQRFc1 z+iB1V4jnjN`$IWS@*m|}&5*XY zG%ur22~2$IvSQk7<5%yO*|G9SmszyVf*50O+y!$~^Xno{)iOIHqg@3?Hhiq(o$Hy7 zU*|#MV7?Y?RA$vvNd(i|l-6rdA;IPfE?%VO@ZrY^w{^sZ3v zO53xU3m189Q%{_G!)GW={%xA$Ly@VOpQI1FzFN&IK4=^hSDlpj^`pbLk{js)7T=8J z6E6E56|A)$K|!tuB+%c3!SX34Q1-UOeM%a+D!jFWA$Kr3blN!Wc65zvZ{z=$Q7}U<%iw(zIhuZ*C%J3{u1yR4Rx$Xq*Ry6 zmw1llR^2>I?dnT(wei)pT#Okbh~U-bylit0j%IIdv~*jv`uW6j85_m0ryDc#;n4xA?|i;glyWa zSpGgiNyDY`)$_-4`%;a(o!arUgFh z*qf5LF%!v>y7HB=A?4MHk-qK_Tv>p{}8357Z&zkJx1cM zb?W!Z5`adBjBB+6pV?LOyzv23r;a8wzrqdU(pWQ;B$ibw?T$tMQD3d4-(pn!Wtg;E z^jX-|)MMH^ckV`4@k!lM+C15p_&_Cds>tjJr*^+wS0%GQCr;$n$`zRO6)Yk#9PVn1SHc)lzco`^7r|_GMl0fZzx=M?(7jgKwqejo>z$%#$OrJy}g_p4KTTzxHcdUEY3vZr#UoS$WKL<$No;Kg~4kOeRv~x{bIsSGnlzcVppi)68St`eZMtlJ6|? zEAL~Yz*b}Gy|BmD@#A_@Zfb9Y%#dwM)%U@J`o_PZe*YO*-KAi?H<$GwpQC*Ip1O^= z9bfoq>D$Gr5q*i~($-M|wRd!GVa8NHme~lDGL^llQXTu2yRF}frq;WYa`slAba8b@ zyoAB$2-Yic(r&_V8&Mm+@{1*cFs8EGZ{D@?rCkrxn}q*!s{J#Fjotw)^O}aLe}_E( z9c}#maV`sRP(g%#ia9Tg>|gWc|I+-(BhcIdVn+29|2u8sFF)h<|E+$&hc>Z^$IBy% zUziiv4PKa8?B?5nA>zM-zthptbNwUY_xmUQ`=b`q?`!o0H;jXYkI zeS1o7|JJ=h6^U2!|BqFsHtGKq?$2&0HfXck-d?~YYV!>MH&{Gs=ilk4g24I@df)y2 z1SUOqunI=LWS224CUth-^h(VRI`%()^$ZaX&F{yDzMlH=sO|5c8uTGq2kkQjK-uFB zm?!*I_V_Y>u(`-LXdfO|a;PdkaZ!G^fo4uce*ZP_*UrdBE!%>3IMrt~NWDm5G$ zGS?i~1J3n}v+kqYc% z``CZ~agD9`Pivkt&YQmRT0Z=!pCi-fH(+QbVCHH6X=D;J zA+TnAOhL15lA^?E0{s|oc*-ZoLe46{c* zVBU2HtVx=W6qpuS^`0NC@hn~$uk5dR#5|v|v;B98k|*k?l85mij9gBf+~&5%xjop1 z_vceOx9ePw-aXH_VhW}%fqzY1E|1AC&}!(F*?s7Um(?dU6NdWI?xeY6Mkqa_uM?Kz zJ2uG{9$sOf> zJl;jc#i}C$ATF<0ZqK^A3LscfDQxI*#NSWAU{mc+8>H8{g)JWNbrWiy?|#-iFGhn_ zEurT5A7&%~#4q)$@Jyi5Uoi%K#fL4C(D!?rC~tt40e#95=6GHjTF95Zy{_sU#hdw{ zoy9qqt|(7U^1U_>?5i8xWQV*1>VVePR)UtPZGs+xc5>NPpniRC^g*^ZUvc9UAO|-2 z8fU0Tm#D}a12@@Umz5)bd&-0Mw+Gz>3~g_8=FgIcV%q+%k_RO@L_pN)VZ=pH+g@%2 zZx+T?E*Mr?v_#?G3+-sA3!$G=*LdInPTwDui1Xiq0Zht^X}n(pY9!hNc2#9{fyRwR z#zP~5RhqL~cIT5WS)OLP+UI<16E6sgA2US+kWhFn2P%4RZ4UlDYy{6zKhsFs1-dM$ zDNDHIUc~DRiQQk~uWQ%Ra>2VH=$li6cb{h>3_*_Z?YVW%>rA?}rtj_i)-Io(E?&M6 z;Jc7t08&VH4#0wje7Z zZ>1cD6x-XKjhuh0F86v9)!mLt@Z&f3Sr0x&%*o05u^@pN^2LJ*axKmQuO&9^gm~E7 zt;29~fBlcL0=2QkQ>vCPMn_3rX+PP1(9vv2Tm0YaAqx zoE(tf?*qUIQ>UCbbN6?9@Xs&*DG%lpkn{RF+!P#jKrVw5k82|aoM&Tpqp#BP_*_6(3Qn6ZFp zJbl7H1?7u%jGf`wkt54gH}u$~Sno}{xQha{`yl~42(e4Ya6SMO&wQ!W&p>AitXh7O za2+y$Civ{sfcTf@(vT`4@LpsJ(ElO%d4dG4`&ei7o%xRrN|Of8aNTS-RtMSZs4}Fj zXZv%Y@%>+wi;o$OEjKAFM@T$v|H>W{T96?3W;n!4{2&xoqC(lj)?(Q>P+8=I7OV8$ zv^U#~P%)o*K}|%7hrvz!5~Nfa z@!U|9frEEK>__T1*s!VB9TRvFfU7~2eN6+fYohswGw2ETsc6dtxb{a8>r)w1Mdo2Y z4FdHfG%>;kR?`;dA^?oA>KMeRC}#|pxDNKHTq@whL6cQ)0uN_E(rwokKNd$)#0Z zhQqBYBNpHBvJSI$%brb3s6G4;BBl1iu<6E25u!4#lPoVrAtrdDp!rIMh_<7kP-1gn z;(nKspAdCH0LoiTy%y*@>vy#pn*o7gsHJtzn;URYNBhOPB;32P5+h`*xj0O zIWcc2!mAVv-_`&IeQCbJ(PuI3{aop=(c6ImEy*Wy&pt^wDS^Su^_Koti-f)8y_$N} zv2Y}otkJt7GfP~$@FSIyHznmG=6ojFt-)ZufM7zLJo9IqywQv@`afz1I5S<6^O_pX z-V>5FI}_!2%fu6>O$io;GPQEWa=1oht5UUL#wLwx#7Oz7yq2_r^n~TC9H7Nkq8&}Uj*)$T3IS3R=`UP@M&?lJn{1t{nnAQgA}P~zFb#H@OySGAd0y}mEf2qBU7_w_xyj#`O&|LdeFEyk@NMR* zTWN8%^KH(jRV(t_I?nWWQ9}Um#gNBG>H$wKM%$!D17yoEQg>xJ7LWVR=N5~0#9Tmg z)v=8rE^+8qT{$!hDDwD$tG&Jy(x5uuR^EJ#{`eBusrgP+0&Df- z#`Cu1H&l@GYdaggvwc#RM{BSvgDuEBiEGS|D>l38!BmV{R&1A9+W+y+_R~2bJ+ZBr zcmmTujMuXfW3?*7+>GOh8$N2xIT=%l^1I}^-4Z}gyu7V@X~O+ru;x*`1i?hxdsJL$LLs4= z8cW3kDi4PD)u$A#?kbzd2sV{TCw=bWfB5YLkq9dn<4b0{^X)pJLTE>}F#_`+OdL`3 zDQ}-9&OVj)E7=TRTxA}g)vPj}n!DJhf%26b;c6?SnW&Ri%W%5<#A|{;-y)FypZqxB z`Z2bMK+~M@cxeaXT^rwKDdx98#M(P&q}+E_+j%0?tJbY3$kP4;`Gyf3&F6X0n((2} zG5mX3KbjEVjv#3XDx*PrC)W#^4%Pzxv8-c91zV%jV(FVz8tptiTeirs!F3}~v}*BE zVnp%dQNt%IyV4dcy8uyit9+FqXzcY%Q)Ap^5K37`+z4k9_M5rydDz)+apF^d1P;n0 zNPbi*fQ_8>IQ&vA>;?dJDm!6=q}wBR>&$sOB?xVOPl9KOpqdho1sC=WcWJ_NP4Ba2=KuX}5yeGF%{> z^@Ur%g@DlT%Z&cRCD9CQuivZWmcWm9|C<91^H1l#Ng@`uDGGC7iYw`dfV zf_6!u?AMaGnp9sg^ZWL$viDWVTx&g3Nj~M=#u~7(?5x)sjpF(^$g-|q;zvVy`@!y7 zpBzZU2*ta`cq#o<5EKvTI~0Q!ox`nH1Cr3&-wR~lmxSs3E5Y1n)83>z7$nwS7a;7M(k?f)*IS4d1ht&=_tKMFW)^&mrAuH$J)#>|+*fTfKE-`GSCgsiCR^ z8HmlQFtsUnYVTEPa-!vjWQfP1kFHvFU&T0?>9tS94tmWFP2P|lGi4U9C_TA0ndd$u zGwv7<=O1a76O7QeSB4ir60tjjm2Ru!i+nA!esqveQrq7zoFTlTRl_(&B(AO3*Y-Y- z{YZH@^Enfq@(^?%0cEspA~xB|Z0D@l1p_|~1zRc!QIaaeu83p#jcQN+ z5x+*pJnc7Ys7wC3izu^7pEY5gPlT894@f?;t0~_J=)S>q61F;*sJas=RC>21ub&@3 z#*cr1t4d&q=r5P&VX5_1bUaBUP5Lc@P1?HA!lUNO*z`xzhN}RLTvQFV<~In~JlGly zQ%`d(|3>tpC=)i+>7x&BN2ol`{=&Bq`qh=gMWIqvYc2s+SvCny=kfdm5i{FqwVhBW z+7V@Dkg|SCD@5L`RN#an@xEj`V0AiG`OplPAQVu0v-ulnV;I;booIQgvYvbwx3msA zfu_w3W?n5X+eIT6zapGY?90}`_XCf~ey^?v-jcm~QleppF&>I|-!30=&?Fq#B4U~S zkt?lg9BigoS;mpP=ExVq9&4n&So)szW^sP5h(|hdA${0-%&4WW5N)e4uqb9E6p(jV zm^}TEoyM~7kq`)RWgi|Z{0VLbvV$6P9>N+?E~gi_C1Tziqw;eT2CPkjC~?&vS!f=Pamw?glb)w0kVSNHK_Jcb*0*! zO{P_$dN)uSu-{eJA-$GJJ049WD#Dl}M{robuCTw&T)FXu@w5SUkYW~C-KS&SNxa#p zU1RY5l~My{@pn;eB|uqFf*N%(;(I6^2fYSwU*Y>vE87xk)*urnosUw&H+F=dioOmq za@R6woIM(}5Bm4N`&@JsA*$Dyk+(y_noJ>U_y4J|_oXg^am&_>%(9}(v zNemB=d#*_XtOK-^B_#fQ&2l!4f#+gqlPw*5mW`^6;2k+`CvVH zZ{~B_B zGD&x#I@xc{q%z4@L9g=`KT9a5g-ZtM#D3M~_}AQ(YN&u3@@R?Y|T68TAT zr|{TE>pFlvj7?-$az~H3iwv^^I-dF`uWr)0z|wx0bZV$AYtF_`B(|9LS7pX7xz9;W zMIE<2y;w7FO&6RfXwI=&g+f>xUHdIMPDW*>riyKBbgQ57Iw32EJ1EVMNK4or+n&k| zdD+d7ua`a}7d5-tf{N&dngau$=v4c00qEPaeENnfJ7|#8ylsJcNu87PjQ0G}b8g{^ zh$0erB8NzAUQv^!|FRfg@f6AAvTK}!-N2$~yf?K~`LJ05iN#DacALmgu~j^|dg#6gM3Yc8(|sKal!b*4#jUg=!Q&n?f*8?g-C z<&l%p$dmdABMzh-GCT!YnYx+hYnpnjh@I4GM>NtIZksbMSW{_jOR))JY*yMK-hRmj z+j?q$RIKKY$n6lAb2C~wjL)J;Ca{FjmJLMLX^sAjjz^P2q76~{bhNM)Sc&4fz(8*I zmS+TS$V19280cedwe6wMX>cF5$V z7v`73Aluo^Drk`693<64W1OfS9tjo9##OF($z1xfs;LD=+jVy%(nB9!d=ekAw;N7_ z5mFQN=Q_@>s&VI%4ZaCD0xwCag3xBmU?JD$niPv#I6|w zmTgJPi@D0aB8}7tEhQ;Ga2z zKWa9lh&jvIl*QQOq@yOo>~yWPb_T4b#p(NlmW}99NBahC$d}nrv=rY?c(55Zj%I%( z!CayNWV2NczrU`-UhoG z!vhl8^5oe8Ups<1$MB-rqL6CL*2EI^>TUxT6~DPgmonGO6)zn5^BzFLRuowaqau zL|9rP-7)+#hmb+>D3KVhs!P1gXm&={2n=jEsV;XoqrIK1J?Xy4K>BdJ{fKI$V$$92 zrrh$#ezsxzS?saW@Exgm2mP6G5j#u2W=0BgiIXfeZI1R5D&kS0PQ62Hbr<(3X1!B? zX2fYQwnH_GZ~O^3V&MtS1m(_I<{bGc~y29WxliMEi3FLLQKcz6|xs=?R%moESdoZOS4YW7YUv z4I-$q;~6g*kyXpIOX9zS6(qU_|7201@gb6s6Ce<2pWaah0qFvp!2ng_sm(!(&^fK}-gT!aI2~qK8~Xkp!Xz?-V0UyTSz-LKyq}EBQN~S2`QTs5JQ`bhTG* zy1B_uefl&3b&ctFMv)0k{piA62FvX|Q*7PCY(6dLZW(%p);UjOPQQLJhhf!v0v-*| z=#L8a6R0->Gn98}#^nexI`*=4r1FBgF&g_vobEYc4Rr*P$U0I?;!C*nZQ!MS7GP>? zSa#q&U04qu+<^aSEMw0&)8qjJ8ocZSq4Y=1kx+rUqwRcifCeHgw=Zef@9;)I68o4F zE3B!oojT0+Y)B4S=(xtoA?Uo9*$^x5K$$}wfgff4p;L~F4|Go^if4?Rg%+sXoF@Uy z^+Uc)3<#^=0(nz`%MOEC(VhdFz}9egFYTe6v&g^Y8TbSC**t#(PTe z=OcCOQdq!m6DUQ)o(4X$IWf9 z8eepka!Zlh>=3fH>IrdP55G6!thEs8HG$pUX+S_)asreXmL@P{v$GFZ;P+={#)yY$ zvD+clRPiBbpJ7JI`58U(#$fE$*o_wIA^taoJ}pmaSsERsd74((P5RT*%F(iCI#2 z;50QsN=$lG`J#txzg>#Ney}Lawd3GF z1+Tw0?K+;P>1-68W@U1=TOJ@0fWTlugPGV6^TDUokatMxF0k6IKFP`;Dno0a$Sm%8@oYo388f?J}n-!ZIJ;d zd63ja{k?LFJP)qy{$s`Shb%T}e)Zu@S?@4Hk-4=~cjb=5#*(V>l&2}Qq4DW{<%l_B zyP=^VOU^=QG%MV7e`E?c*Y8ilcP0`e@z?#P+WfDre{?f`*7%EQq-BN42`38Zn<~;!(5*boJhRR7GAr>DxnYLz&xH z0GODo@9+N5LOd%}ygKU!wl}N#Sn?Dd4O1eiZ^Y_4|M<|-yR;o?)V@#}9+3twjjKlU z>H}}C^Eh_aWxHa+mMf=f7&PSj$x%T)aUm4z64cTjp>9^jF+v(4!yrd$aADc(-SUvC z;P4|azKp3LcwA^<$)tEZIUAf8!X|wbk(y>n+I&8_$1yjUo>3&{hmmd4IHK%Hey2wM z@S`!Ea(IK-z#?J=;qO*K{v|sit!0K;dcl3a&&%%Z%O#AEpi~4O9(-Wqy{5K5c{Ju z3{Y{I%dJljXt6=d#rg&Yy0k_++w|#$mxwFl8hW!9w z)wY1{U?BRDF!bR4G2Gyylt2$T5YSh3$l`g?3@GDqG3LihBIECc@fG6_xhA3jT>VR1 zpvRU#*(@K#DimMPm=LmC5FU+pe5(n?g*hgYAFcR;+Tk`QH~+JG#7vgBX{nk+)OT{5 z3JCkiAv(5tBy=*ywS}r2&4y|AF8=_l&161-&4dT$j)cO`a6%Zf;DX!B!!-Mh(>MRx z;JYW&6I)c}Qa9Q0!0R-FE0$VUK_8964z48*g?GiBt#HbLeK)LVdD_g4`L5k! zX|O(O2p8xS95+`KN#>%ITj1)Z(G_e~7CE@8ALIN5r-4(J-5)d8%R8)>qluLkI_73P zRd|2KdhJ9*B@Xxr0$nMiY6<#8xy|pY$Dg(tdF;g;+mr=H*C)eE-gA2le)eVWb8B{Y zLvMt~#@LEP$(CS_>DF0iR}M*NDiPJo!Ex=(4sl|`))MwBG?8o9HSVRmm|1ixVvBe>5YU!^JHO>=W}NN=c{|hU)#Hf!FRlq|UAyGmmtplvDJnICJNo`@x?2|f z@0XvT8sbzF@Sd1eDfd!+%l&v~L>xv^AhKn1eZo5*Y>jv)@sdf99~tG>~#b;I5-j3M&O@&5pR2=c;quJ!ySlk8 z$ljvk2lSiXeM7v z>@olKo?nVrAtcerbS2P)hYRAd5S-_FbC69nXC>J=1!KNdtcF)xMCp3=_!%E(p@A$_ z>uXOHZefDuN>`UGI0ssivknu@?~Mo`3>y@pzm{8a$+aiEo2atb>(36LU)gM*@RB+4 zaGb=y7c;&clsue*5~*QgSWCMS4IN~l!bC9`{}f^}bGl977?A?I zB3KG~Z6HYv`J9z3NRr6i!9_*Hv*zA=onaId_mbCa0T((2JtmHblyg1}xpI3;P>05G zLU}?<&|}SnSH-bzEp01X7g#aRcv@AQnl3yxf9|P^~ zRElw`+1h-Pe?l9tldJ0xr;a&QngmHWzLjaPtu?hR#07hn7u4vHcksjM^hv2H+Z#qu zL;YS0mL_#^PY(r zJ_osOD%ZJ>vN&?)Q0SE6=09MVTIIdXQQxzZ%O1S%e@NL))T-G-RPTnCzQ$3nq3heq z&(L3St9Sv5GIT}9a6fy`ItW7|%nEX82RrlNI&5Qg+*I@LpF-GQu@n1e27q&vm}sP@ zr*~$+xj{B~d#k6HX3N?zui`tEH!9BEZey;sm)HNn=W~$lMXWP=p&z(}*ra?Fdz2r@ za&Pa^L?8di_G5`?bzA)9bGFrH+;@2h|6R_zF(wQKj*10Wu4d&QDw#td(>=$?y6;C5 zyHQPBziZU+Jg<}_4Y{tKMG6^I$BQC76(MUq8a?Xy#BPcTy+!&vmXxH91sW2mfk00WE-n>&=r& z3KDZdvh}OgJA^)`S{EG|Rtfg_QZ;t)bKtWicv!NA?=4CQ@v-xe7$!={*^^Z0uO$Bb z9Vj`&0`=m!y~OFxtnc>0T$viQK=fPH%oA~RqB>FHd0!^0$I#~8dP zl49&8FA$v_zhqmd!3u#mE~MH(G(O&;!Dc2ahA4uec5rLiYk5Dnz`pGu&kRT!azF_V&<|CY41%utp0ty*b& z;!23TrTiAxM>-ADdX0&|`*y_stp|CV(!6&_Apvuj`H2)R>TuUx1ph+19>y;^0P~9* zwCR;+jKAYr`f;nQidECB-cXUhcC3T!(4~0V0`FXWba^~o_h5X*Hw)7kn1#V^8#T=&<0MOU4xmztkZ`dt*bIce5p~}~yhQzz+S$f-d-s#PD z8T5lAcKgmUi|oEIIlM*(A%#G=WwONOg;`E1Ml9?H=kadj3Btw0HoJ8d>mO6#U&KE4 z9o~y0ODq59ctGIjBP2>fb~RAT9p)Qp1ORUb0Erag!@~%dhnJ(fx1D4 zI*}Y1?hNrjQJJ-F!r1E4k|vV=l%{NMwbRu7sjPz? zOC{&d21CNy?)rb+6QIJEve}g`r8V2$qyL_LFXe_vQ$nMceX|_H^k$RKQIXt4(U`^u zx$Ce>w-SS5i_Q%Dh23A@9P*-a%o=Bz$a6Q}fUl!3UsELPtm4N&cka5_gHNyTlIn8ypUfGdC?$IjkUE+XH zUVLWkqR>@2da#xGD&A-&do5mWqN;7%%NQwB^=@{g|q zxu^+V>T>~gzrnm(+mBU3x>kVj6*R5XaK;$2n?@h7J8c5Or+FEnEoEz1s# zC?B-sD|Q{`E2qJ(lmf)N0B$i9)0gJwixd?f8P7JY&l`FAOX0$kpl!hBJu|b1H!V5(EK1wTISHFtFVMTb2AiOdVy=yQry=BS~6k9 z%PeolYnfM2KIPMNw2L$ztvgz0z|Bng70VwUiDSpJ80;1+(#k6Lh`qO?(pSorCku^t z#?1wW3{AXa+o0}!gd9i$IJKxYD~P#VP)Mr2-Ac*+~?Y2 zv$wfkPYQFVw%e!I|GXB?68m#gf(HyOg!I%GfvSPT5BM`j$AcH|8=}Q@RIU<*bX6DZ zxqT5>L8aRl>O|_>*D+xO4p+a!%T_^y%j`%~%(Ay%%zNg3td!sL32FH2!yf_aE9Juo zbB9kQ-+%`hhwVR*N4nD-HOQf>2j!p#A-NT3UGMLUD7*QM2W3l@maxuZUf5nyTG{S8 zec5d16h)*Tcbw;s4`Mb0+_A#uFFNC-#golpnz~ldzYh3bj@!ov4!)_Zy=4KcPHjTp z)b?Hbw)!DFDDO?opW zm7Zjg!8HEJo^%-FvaERojW7Iq1P9EDNRr7ysKrrhe6{^^)v9fxSV8Cb3Ha0n>`_N~ z=MQ|Vue?Ph8iubpL`yW$yJL*Hhx=!=j9nGpE zw>%?}W3CRPtHXF&nWLmc$Amy%@o~qX?S-6{&YY|5H zyK4e;RraJdR2u)q@IF7!F!72*+3x$7=VD%43s=IK#raR!kVtCgZ+zZ%W!2UGh)dmK|}J_S@f@YZt;nV^!lr-y*YXT%P(qp z?@p=uc5&Y%%mxj~H6GGJWJZEXLLMTqtU>0Z)_~a?H@f`k#PhPZOMeYV+`Yyw0QDcy z2>0GuEp@2-f7m5X8dR0HxP}NGBAj0!dH?84IAJ zh}2M|NDB~1ga`pqP+E`{NPwV7O9(v)BqX_qnfc9s?!EsP_pWtc-Zw6mD+_YYbDs0; z{oSAM-aMUaP&hNK=k=Mk%PB`>0wqROJB3WI0KKQ7NpZIcM%)N4eJ?b#XRDm2H?PX2 zWD^%&aD7Hu$6heTF|Wv|%ZoL@N_GaW1TTQu@4aFKa*H*q8=lx-7BV3i zDb=A^QFVx+dd~+DPip^uny;P(=>aiq?Dt1XY9#{3L=y!lPbdNxeH`SVw-wT($pC7T zl&FJ9A4m^p81b4@1dkxoAUAj)nvq-fEJg*K_35J*D{F-~ zLh@9=KwZvtnhNmne?n>0OhFDM2qbFYn@l^Pal2YvfCAiQ0JT!ujZQwZysBRtNxmA0y3>VaU3*K z1yB05R1Nau7wN+NxgVlKHL_g7nu!%vqASz#25oBs)~0eID9^T!Lp zBes`-nrj@pfTaXUU=tTkXoE)lKmTkvb)U#6WhESU3W5*Sx{q)Dp(50RbXy7ImQqw% zQ#rtEe0J+=AeqE^5*n}&+=Z%MvNMJeayH)ZBIb0s9)r%Twm&o(_)WzTr~>i}9~+rw ztUu{(STz%B*JNQxzlFxb7`Tu8kRdLMw;s$uO%ZCMdMSaiiuWicZkuo6%`^<~1Z>ZV z(2rpRd)J}KyV8VAJwm=;sbu87T`M30TVP{G!yyn)<+nUc{Wb3L+M^eX*rp}8EZm>B z&^$|iWe>#_b)o(Y5YQ7olmI{-NF$;ReW_cgx!*)tWVxl0KGh_1y1stN!G1wiX^b;& zDTR|h&H^;|k=I$l^$a}gPId`)JY=8;JD)}hBsQlW*Q}r($sthCZKq1eQ@DLF(2y^VhSrF0(8Wn5t^w*ze$huM!Da!>m_X5#WPageywGpR+j&m)7FGNl)OXv ztZ1${aQdCR=^~K&f6nQPxHOSi#mtwa9e<{1M#Vjlq=|rjan=%!zxJxKdLE-7{%SgD z;qDpnnNth1ZeQru_l&kmB8KdD^#v>apwWY{h9yRUY+}q=t$+z@9e&lkj3giE%YE;% zJS<@BjbC+T!7u+rHN_9Jfexg(;m;#b{Ine2>q{Ip{+C7z{)lY&5rqoHTj-(0VZZM| z^tHLDpVR}KOM?*GyB|#)_e9q_c?lG_*SJHBr4iTh%aoP91`domJG(+BCBqXumqnO1 znIFwmW%25oSOdouM;`im}O5ux-TNC|h4Sm9Q9@Mot; z$~eLz-7w1MrJsI@*LOBR>ZdiJu53js9~S)ybR=Z-DCIfAlD+^NPSY@)BEA>amHTcIg=dG)zU2-w<#6ODa&9%;MO2WbI@Bw;Y3-(@ zu+1~82pju+NPXob>Oo>z*xI|@GH~ILxgRI2X2n2oQJMa(E0jjdLAYRBL zZnR`Box!N6(lQmPoxS)USLG1AH=kQPbT1j8z8X3xn)d$o;n=4eMPExCzvQ%4toC6e zqth?j#f*E|d5?;=HXhr4^-8$XFPs`QeV7k{&1P&0;Yu2`c(|qArar0*yU*k zSKg;3_d+81g;b<0p)1HJ?Tm?Jq^LZ|X2a6+@l;UOVKpLHe>ccmM*`~o4T8(far0s0 zZWbzyJZ-oZIQi_S$mw&sqoV09xvelcL;gf*3O12^%Kx8C%H97n3{*}3VYx6jP=!6X zQ=>X}jqmNc$ot%%$=bJQefSOF&Pf<>!wxYOYp7td5A`XMxVUs?A|+^IpcfySmbS3c zD356Gio8mVg$>MgF!0Vgqu>E34oQp~eRbW*7Z!vh#u(Lg4O7Di##H)A?%ew{7S|(o z0Zl^QE|=@AXLEz<*g@moP|au(g83QWI%OF1D-9Ad)F>Pu(^3{;+$V)pG``Maf9Wp0 zSy*A7s?b_HKTty9E)jx{Uw&E*^vonDDI$CUDH~Q@MYeLz*8=q=xQi~I9Ot?(3;D-o zL5syoJcIDFc}ZWKqA0bo%jK)zO+@l`X7|P|XFc7YZ5ENSH}~zL47*8MZGi8uq%axg zCHt9XgrJ{~s8t!bi*7*njuZ=>mVVY%b{!UZWbJm{Lg!YV8~&Sshq=kUBh}ay*mr|b zdPDl|I^_}c$;Jwgw?&uN4C6lJD3Pl;oQylemOs!yqT4PN4mzz-9@cL>9TwnLn>4Fg zdycN-HFm)pcuajCo@es%8zjJb#3|=o_w+r7U!TcBnb=pv91}mj@BP+e-z;yDg}9h> zU&lcu<_(YYxVIZl1SUoAZ?~y9zhmqmJ8eRM4SZuxRyQYBZAeCEl=!Gd><;SGs zjA~1B$G7R4IFZl1=Hi74CS>ve+VdJvvI zZXzB-^Ko05v5;Zb9-w)Kk~SOVhk01d1h3{p#_die0XVM;QgDB3Z}vJ@1S{o}zvLYB zk|5}wGlbR$ueslIDFuJJ-#&VlUu22Iw~uSdm8b>Q$_fVcikzdETQ%qNs!x3e<$3eM zFoM1EIz|pkkY8j$-2ofKFDmYHzpP&UW^?Fo5o`y@`a+OMyzAmUh-cO-yd}42$av*} zFK?tumn>s#lIktCfSD7c$572>w0Gz*qR`AtHfhe9o*Zjg=O)4bsXpJ-gLseXy%iui z`>{*0eqW*PrH;xhL>z+@`NQAPunC^#XKeWP04Q$iw^@KUvWBt!0vM?{{uo~mfx6KU z@}MVUt2!bF-(x_$H;{`A#lbP2S-f|vQe0AY`T{=ItqyAG7!Vvp_ER+CzTtgqeareP zWetO(rdd5j=uw|0?8xyUrP1C2R6W={xQ5zI4j|+hl?shCW+=an0tDA% zCMyh+rbgVA7bjb5fytGlYea~mI-5Zu0j2N&Ksqxh%`M&QCbH+KVazkxn0IAKpZHik z#uViGaNAIHo@K-q)|T4SeD~8b9b5(-Q@%K}GwrN@n6voIzj@vEe1S5U}RhPTv# zr|EBRKt_rUf?71owQxN*v-}Nh4jCv7kwCZYS`Cndz8Y6S_>G|yq#M6^Wo?->luPr{ zefHJ>A@^(dh;ut7H_D{;lcieMNTh$qz{0eBEHLCI-l7uLV=Xf4T$~Vl&E|=sE*b1SdevP0yW>^kf>f2Adz*ju z?`pbgj~6J31iJgc-4kDX$Ej5==;xK@feK zc*dxx{3Q|@3~Ha}&>}uv2FP#jksGa78K^& zSdA!RF>f%1_B*whwt<Ar;E z)MWZ-0J45uRA{%5aD%jX(#KP0i$ZLR;8R0=t=)D zT$n8^Al@B_b!yn0b@&o>`Qo?ctGW?SX@Jl^?XzBc0OjH{UCcDfYpVE-K zPKleJPw!?z1Zt)J+@k(OCL49zSdo8Ca#ux|nLtE1zCH^j-(=#Ti}gp_y}%UkEZ+s@ zGTkw2XlizQReSn`~xCyZ^? z!q56W<}GFvvAF5En59SbEU!-8FPc!P@0SY?pSs4vbE7CrOGsm26H4&?SZUFvmh=@^fmjXy`u$@u zmBGO9s{}6!7KXX>geAB{0QMplm@=HD?bCanc@cJp`Pd!wtWU%S76y)+0td)53S)v? zBfj4^LAGZ^!_|F;BSR;_FE{B26bBFN^>1K&-`P+{V9o1Ax?XnlZBZ>hUuBh%!ce5j zn**m)8082gL|R(0VvX`8utgoA#xyqBKc6B)OMg{=!>eqzD$RG4X^tu@fvp5Adb*!R zhSMjG$4plsQ-65p#je+s6fmP57O}gdE(*PSUKmuH)&BH}8@zn~WQGs(ai>(Hb*U9l zA)qTbuhum+u-lG^fuvfj0h*`HaB%|i`b{267;Z3Jml5`J8T#2bpeA!UVll_)ocK-+ z$Hosk!7|>dYEHMoCUwXbWyC&yqwqt2XEe=r^5(P!LJV|{f~rcBuzyJNJ#;=NsaMHn zU!MENrSv+DM(AqWU2$fE*LZM4Y*}>P4GK_WUT+IVWEnhUg<-yL!o2HIo!Qw~#+~7m zLX!aM*sDiKaHg%}R?OQQ;{p!PRv;PqH0kKjLmH=JHv_#kSU(sUmEFw(%d28|nC~Bu zd~A?0m*RCHxGqdn*8fHpu6tzBEIw1d4-GyV0F<0vBtc_QHzW)C8@;n0f3VeE0NdNX z4!?X>bfog8`D zh6-6VO{>pz?Cw&3_ti0nOY@cz9^5)%q8E)?0QR>_1fSTAG?ynCaJm=IwID!NKwgB( z`pN3P*(2hfIkSX}w35a?wz_#gf#8+f@VV3Io(XmO$gX7kBS>?xR!{b9`-n}|idHCW zL!17oWAbcOabw0%*i?{8uyJ%`T?MBqms1dWgQN(P_{w(#N|eEIM}ATc6#p4iT8(P| z$#u?B$h4B{qIbGE_~!#a=qbe?XoTt-?f`-Rms5Aqqb9t0P2RAK(NgMy-mwVeL&M)c z$jET(nt~$EcAdCn{fQvOwW^75ruVdZlrKLX!Rmk9upH^R@-;M z8OBz0XcQ~0QpZ&pW=e~87SK2g)g(dhc`304%|WpYb)aQ$ zq6}AmQwB5`fPj+g)M-;64fkn~?x`5PU5${#dEX<79~I2IUD4*xn_R7{faS-Y>L8Td zGF3xRXT&DzkVbE!c&{noUEGG)chMu)VZP4Z)B1jtS=w*CS85y0d&;gedVYm?myTC- z4k}95t%*b%yuv;*Ebg>1r;KfSVF|2IE*Fxt!OxIatwY+aKZZ83NZ|ETTTz>~o|SEW z;}yh)bn@gkPw?R|D|f3ggZKqN1_(vCSNT&9-7LL|0ogIW{-UA@X-Kkt-S?@CWjN7k z1ot>A=bUJW_ga7=A{A9PIcYcDtx)+O_aaq_(<5Md`G+Ae=oJBHewO0?37GN3Qttyz zB0rp6$@7RbBT3zpZX6E%O1y=+xzA`bPfPTslyJq}l}9oVpPmDy)nz8UXZ{wz_B?WG zt7N|$_k35yc6Hqg{*Y#%0h-(J%9jzc?SR_L!>p~WC{wUE+gnsgCB^8|)y2cIqUjf= zGj=oc_4@Q)w}1UUt#*{aIB-?jSFU-1uYyOUZI19N4*Yma6|AJRp z;i#B)IsG@zymi(JLOAgT@KTkc4IIAht<7&(-HJOA^0SaB5AJZD(ASMDD{sk#LRA0v zZR)CoJkZlyA_J0|w0>rZVV^23iKm{)G5205e3mN=7iTqq+{=%pUgFj%G#iNvrq2R3 z?aZ6Y8&AA1qa`%_g<5blbRF9w?#nRA;ZCYeGv&~5?wxWcs;4Hqq08hw49kn)Jz=$p z;Tav!_rVYz?I8CX-Etw=P`89~2Lk7XalcLB7+Fc_WL8)4=u)n;AIj)mU-Lb_D0iq{ zliWLzN~X3q`6HX|mGhXd76fJ$Nw`cQEAZ>_1W$8t`1bzXFNc;(A5x9S1&znFsKzq| zOrXg$xJ>E2@L^MnJ4}%6RuYjP$vBAIC4*dko77xZ$XKa{`Z|aHBy03UjB+u-A|tV@ z&ebfzJ|9~v`=hhsIs+e)z4PnGp)Y0KX&v1CC2L_3TlXRM#X4J@AUusj8AOU67?Mt8 zos}yHxCWyiu0pGXi99Gf2q|_Z)$p`P7F#1_2Wd)ompF1A7xOWI096ZUWQaG*8NQCw zE6XlP))w`nV9npXYr@c*5z`u2qzC(jHE-O&WnOY6^_JuOO^$I$(y)(H{gPvMB)(cRY44sUxB3gh!0 zM2Lxkh=vna(Tb9yj*`Ob>}0pu#<1764eM`8s}#GtmO$=jwa4(sD+X0B?DN$%{5v3i zw-MDM&CyrQE|U>C7v}yR5eWb-ooDeVx25uUl=tSrM8Q^u;O+tbK~a#cJ!b3FM`=xK zkkv5=t}>K+t)eSA*eh_rr0fEyudroxRiZG%I$_#z*Y@6foz>p9J|9dvoF@mBNLJ-= z{l?TxB4?J+TFIjgXUy!COzh?cBGaC**c6GObSubsByy(p`(-4%k9zK|3Z7sM%<+r@ zg?y=%`nrG!MKrYg^Wdv0IN-RX<4gKb+;#dvP&fWx$~k}o2*+P}Nde_4j;x6wGI~Iz zqa4{txtyOsMq#XAZ8wSR0Z`rpB-tJrPOrn;(Hz+Z8#49JV861YZNAyuc(v z??m$=f;&B!$YMy)86B1rXShR3tnsDhYDJS+BHsX6#ecPSh5(Jtrg zD57~zhTGO2!772#7jSJT4Arf^oo_;$4$mqe_N~aX_d9^?n0>bAP1&dI*OzUyC>>M< zUEs8!e=Rhx4*d2Z5gSZ3!LRpUg8|K5uu)4B%6pEKmFo=JmF@v$cPr!>WEf`;neaur z_NUR$dzJ20$0vQ{n*a$1NcF5$n(e#pw71QyH8J!cBCbyjbG~Y!Guuj_1+<6MqT?(( zY$2(J>b!|lyn)2^IDW)kCUYKlaCWEA1+S{${IKC#>{~Uyc7MbC$Vw!JBXcZjUBxMJ z(=E>Lnq)yNuQIAo=%oE((yXL-oCj~l*HxS8ce(jes;03r=&- zrE>7Mha`rJZ%`6wpkMcmdp2;@q&HTVioUaLok$lB!^;p`_W`wRhKg*6TsQDQ+8Hs* zb-sIO6Cf$n^z6Ev(dHGcuPa)3^Sx;e^qJtUD~>k@FiW4rn)vo;-cUCZKx2X^XT-Vk zlw|_-C()g|LBb6Oft2ym`7(CZBk$#Mqj&XbjuBVZ%c$Z}4AeBbzrN%mMp(tDgdx`b zowVYh+7$XM%~AWPxZkM?Dd1#74Jc*4y@A=)csjT9+=Z+M3H)Zn$Th}B>qq76!xA9x zm%KQe!PGK%R+30On3W>@`(i|9Mq;Pgf6hMfbnkN_dBCg&O}%4Nvo4&`Cj-ddwgN{G z(=}!3MVgi3liFUvZtgs@8FAREONCV8+?$dmWc95ndW48HuAUO(e~)+^0IH^Ksuwz1 zb=@#lbwV4}Ri?!;ANxM+iXI1oTdN~?bPmm?ihAp`&vc#(nn|sB1X-NvlqaO5$jd&l zF$U;8&Wxg_8)-LF8?z=NUcR*tsg@AlohQ33v|d6hOEgb zfAz=DTtrtR4=v#J%(8eWgcpmexxh_jlT%U6p3vYCZ%rKhGnVP#zLxp4Mz>w98p)XO zLn1cyxjj7MC?u&0gM?-*mZdL1?VAr9H5ZD#;fuH%yE93)8dc4)zDJPzlMN zj_p^Y_vI&4LJ1Si9GWWk#|z7X{qEaBPra0i2uO(!vITpZC-aw3yHzB3T_&(7@QVxI z!FjeMG}^1jyI`sT_9=1a+wbSKq)&%=Xzjhci6%1iWiOlXhYH!i` zv0i2=tn@nUj+A8J=+djF5dx_z>Vi9rD%L6f6hY?7d4grb4S%<~~ z>-h)}IM~~TqCbjM3y5o)@AV416Q?C}<)SyGZkqOu+n;)0Oj>JP9WclV%EB=ohZ`4i zg(B`A01Y;Nh!&r2a0Jy89)xBz2|K_^jj`kCxe;0d-h7>SemV%gppLub(bnxP)U7s` zKFW#)^@*OuWO^-cgQa>@03ZC4Z<@WBe^vs8w*>M@M4yFMJQ-p_^*& zl2x`uG$`R32~5-x*E_%xGj*^I^i*)v;B2>9?21->K3$3c?WyWsLcUkC_0xfff~0nY zQ!;geWtv#_#~}JmT%=&E?|M9WhPZ3j(b#QRS@HEiqlC2|-b`8C{ZwEP$;$4?zx?ab6T(Xd?T8HYn0a z$G`BS66q3Ja-S$@DCm)HlKJd@Ccrly+YUvgf|g_xExJr%g4Tf&t18&q^xB6yOD_d*=zHZ zwnBRW%@A#0l|=JW8ch0bI^`~_`Xn`Ja|#)>rzd&TFN+mAX&Xy`rFwah;X;4A7c2AjOUz z1HF#=oAr3<3$hAom_8(D98)(Q+9B^Ks~eO(9zk*i{LBn@!_RKO=YwW4O`aehe?WBP zoYN>w*;X~+hj{KeCyS|L*v8W;Vc(ila6veyj)+w3c4(R*%A`RnrH4S1+#7Dy1XsXd z5c0u*Tes#-af*7RUT)A8xhKmL66EFysc`iWxZ(N{V-2Itf-P6>A{aVC;I9|)BIy)t z<(Grl_cWu}rS~NZQ}bPn^43&}B^@^cb%T%cS^Yb?Yv;Nas0ntXgnnN1D0y<_64;uT zggXG~Y^hey{u|SKtp(a2Jl6W=!8*7?L0Nwrh&+W);(Z&1mE(n>zx&k5W_@T6b z%ZDpF6n~M9$ZtJKxGv({i0o@|h%@aRcmCM*eLCONDY7FueG~o@^0ZpHmO7qc0!v+* z{SX-hMfEBn6!KvOu#Eb7wt0sguaQ{^e~qG*MOLF*Qmy9WA`wH?;oKhLKLOce{b$e(6JY7In|9ty> zI9=BJU^$)O)Cb8XuGfY_N#^j?u3%a1#dwqm5Qr{jY;h~19W)TcX{z(H)d1E#~hm-S@SodmF3;P(nX{;{ys|nd2 zwgLM;whv^B#1|}8d8-aBAjPjF(eC`Y3q3t#HJ_wD^6TyfgZy1;rbZ%UJOhFMB1L%y zeosB&@6t15?<|`T<{2Jj+>D}er=k%^7kp?HDrn0(f){#T$;4!r~T<15SCLcA{3SN9}_@}$TW;X~ixOIs;+lQhk z!E{DQJ}_LAg^Q1Ks>^M;q+XmNHD(AwX8kcbBfWrE4_Fw;upH%FJ2b*gH}+Yocl261 z=MZpBwWr!uJ)JCVZAV#Bgu(DZa9vL zh&9W1Wfa0Qcwi9d%>g!8WdgxIm=)b|Ul8)MLM}dH>&;vQR(!6~2{WO9yt^qhoyoMI zNcz7}N;j5kI;jUla+T!}x=v6s%l@zhrHT-Gef_aJ^CpG#x5c3J`eJj`RY}f3s7;j& z(*QMbLZwRuR2q?kVXZ)o)$Z*D(VX5A$cIV{lyE@@<+W`Vi6MJIzshUuC>;e&VYq&; zOxa}U2c+q3vv1Gz5{tFmin1&`T2{4VF10o)$1?$G@O7uC(D(gQ^F}j(M zY2qpX-B$vN{Kgr$Mt1rOkb65KMs&IJNg@9-^ETj<|1cujYGVPw`#@dzS($OB!|0{i z%hawppB#QpKM}KN#Q+ks@6eXuPa13#yG~Jtvoc}#GMdbz0b7u%4Lw%)O}GY z{tEz)NX|O@g#UHImXz}7LGfadv+W+M|s5)e0>$hYU zI=}>{X*qrysW*FrTR_=I8KPf`_3BjNu1GIYEEStz5C*(0kZs4k!&Jr2KX+x3#|;Ca z>3dmE+T|8TuY$=XJ;S4DA~guv?32LbR*tgm1kanHjtV@uw4D z4&;t!$#2J0YJ_b#$dMD2p{H*yIU-U2JZ*t&pC$hDLzepEe-+e$X|j4-wL@Jjv|Mu? zG-AS=noH;~k!d2jK^uq@ar|@K`7Fzx=FJA)Mvo7RXRk;>L+`a=jWDE0bR5YIAB%?% zuSrpC!t&wd@Jim|mhJ+#bspC38bB=};m{DABC~UHuO@{crdh9uSKq4u8I}Ao5Qxyf zCtpn~)%XValXyBRF6@8Ev`1WdMMg;Ihnw<|TZe%ug@3V6hrAGTmS>OW0dImv(L|7Y z>n^4c7qA)pQIaPT|HV|J_&=|Pqlm9X4;vY1jFUP?tS#(qmEDU8JKR)H>zYPjvr*^^ zp69wIBi$88w!gp{iPc2h=0+mCQBBNz-UeQCp@fR`V_a(QrawG7nGxKDh!G zZR(5yXr`~-2;-Rb>XSDzFKY81{aNH_3qbyjD?SLjNZHvMzw53t?=PE#6=0KC`Nt;l z<}aJXv;RYzL|o|iYb@LuC^=mmltS^LklqL5NlgKSG2U~y01q7nBey#FtYHgoo~;k} z!W0JR)%tMMr%(Y0E?&YyjW+Tb@=XI1H0}eQ$Cx>5DT7dl;#6V@*(=X@^l4XC8wo|R zB=85Dk?eEa4rb~$a(ZeENUuwk=X3!S=l56j$&-K6rdG@UyZ>WTzwqdZHGFTBjH$d`*hP40LObR_9`B-#84 z1WVF+@8fLW>}9xf%o}Qi`^sNgOJ&eMrBcvjW*zdZVFx1cUNWz+?H8bd>LKoW0+d1` zYz{Z`InG>0Fy9-=8Gwu%&prL(VKf%7|${-u)DwgkbU5X~fh9L2MBO5`sNPr2Q{ z#IgQGhUjSkC~ZWvZu5t~{K+4NT;cr5AHD`2)ARqa3;@qxN*$-CAOplSn2gC$Dt_Mx zOET9M6rJ;xF`|C(y(oCjS}Z0q5^@N2scbk51z%3)#Zl1=W^2?4_C+s-tLNyY}sv5u79{&%uEE!fmz#^L3zIJPHdR+u9@jaye;H>D96+(AY|9FP@>Ys~p z3>azsuSF62;Zk_HW3+PW{Jy=BORro$RTeuL?A z?oi@39t|&JL30?&YgXd>sD0$w-4b1GSM0^4sk{kv9pH&eAWJVfMERssKmHTQH*l zKE0!l<$1(|K&O;{zAo^?r*z?Pb*H*&pf9W=Fi(Q<+B4JWVy`MSAlDN%PyL_|6 zxq*_}yHYAn^N+bCx=ooooIYG@=&Vy4>#PvKpdSfJQ?;wsn(lG}4A^L!xBYw_)t9Mc zu>8NC!T3A<<>A(TGX%Z=Y=%zr-?m*07eS{*i-vXwTb}WYNZl8t*}V_4wVWV~4CM&Q z;y#JnHOBb`Sk;$}lioKpMR_2(oA-c+J>{o5(CWfD;YOlc=)KP!(s_T`ekC*Dpnir{hV+ydZA9dFCC_1?l z9f&jU2ykuBr!YcPMb1Q7Lt6Q>35!qbto}4Eu|zojfPu+>eHG9bz;O1j*Bo&6$kx>v zREjz0>?1i>9^zGc7Y3cG1R{s$buS(|6`BC}UXYeJ*z9H*Xz`V;KJ3c?o#9KMtX6j44_ygXSgm~ezU1DO$FL})m|;QsOuG35%lyW=8t(wSDLEFtbD}N%EggS zLBS3knKo747YyA3aj1Kbdfxm0ZX7;jYFOp19$-a4oDFk-D=xn8Rei0vP_cx(;x0eH zWVQG3>6UFHFo1E@0(~6Jfs(6=bxvRNU+eJevHF1u@|PWg1NrpJdBu~;4pIKc_V7Qw zP5lk@T;@s@KFW)YjO$c$(W(-9FLvs-}Os)9Dm+^Ojw4 zxMP4VBgDCHOE0z{6mD34IRZbs4s^8$3#zs)461=?FV#+^8h7^72J8F1I>{c>SIxNx zKo^7dC>ZI9bM_w5>jPXGK0q4?qVfPB@L!LxAyK9Oy2`gFGDB7NOP=q&i18N%Jg^oR zdZKVt;&YCyf!I-{KQ?1uQyoF#694iNy`0lDNEGBEIDTAUYML(Ks(g6h3D6L>%Hp(921Y16_LgvT$FHp(Evro z6&tv`5kFAv(dHXT09>B(`#D`tX{A-Hug&=ee_f^WSTrM8p$JOYCfcRiNqq0i@Vz-A z&kkPU{k4ocgjy0@_1u52hf&Wsyvk|6kvW>t)cfU`ui;ybzY+BVyh|n9HMy=Hq|H-yc)$9|R-YWa|VF{9tEHe4nk+(tw$?2{C0qi!A>HSc6N z`!Xof;q5IJ((9_@`08|}j}y$WCgxoEt;YBAP<-xQ*ziOZ?H(rQUTa{iJI5fF{x(f# zW`RGf36E`9m0}34rdv>f@gp8B2X=s-1Br<}W;3z#t{HdLzvDeFn;7g70*pK}URJx<=stKOA(;n`nh z&cp?AOrJhT|0hn;YkAYd`l!Plg$m@g{$NJh)7`+u)S}Wf z0!|F1p>4j<1}k797W00Z*W*UWI>xOkFE#v1hRQrT>Qe|&#mn^p4It6wcqH5dEFR}6CqSjdg`wnI6lhIpab3@!f z$|{Yn6Zi46yZ$PwiV1j1Zp>xkV5EuR3d&1Hb5G_u3^4b1daj<3v5h#u5wOH2lt;)6pd*ZU0&=en>enwY)jtoB@X zVc72|OT=7kZvz(4HRtqz8GnP=C9fKp?^Tm5b+XJ}JL0A+YiGs~j5zu)xoiDJ8s4+1Q&g{1v6|PPD zh8yj|=r&vj!y<$>7g=#mx{T1y| zI90&N%>M*qZ-Sk81~G@TMiabXN}vsBrAD*v6u*V!G5FX$CpS!Rrz3k%ojkG7U0%sP zF6iDqS{isZmQ2?Ma;R5<=STLJDm6^=9s3#fIgDo`zcGyXrT)v}k)o~~eC6Mkln2}m z?x(IT&qqjwm9VEk{ZUkuzM_;)p$9hw*zY5pbh0c0X1zqIV8;NH?uc_L6*E3t3xwyKDwNv|m5%yS!^p^FA zrR2`QfoAKv>-+ZuX6$dz-f3Oy#k83aOfGzBvUg6T;CIrCe@^6gnoLly#_9F%bV_;3QPEkYA zpN;d2G99g8mF!?U!Y`+m!sOeixfy->l43o0H|epIYzdy*m*iD8%C88!w+5&Ui*-$H zn^MfC{8J$OSK?+xuAwiAT6;D1apVfY(*ObXNW zmx70S{8WHLbN2XPL6Y$x>*v_8{-3kXhP=tS zRhi2$swuBD#Jeqq^W<6W*blA;3cyN02=-@1=LP^7P9OzvxihzayOCos zWU{q<0nZ`_Bt!t5w0N43=nb$H^XO0|{d{F?$PsB|bVX7n!u_-=ISJ%Gb9OR(CV_fq zN0;Q!U4hHjBZ%*on%py3_J(}WD`@fkiry)l0$}CPQfFs!XP?4kLDugy@LEjE*-7Eh zjGPy&FaGW~U|iD4^0085;`{HTL00rC;Mn^1M4KE&`T!Q=bXY?!%;v8R-vivM>p+jC zPb6^B9p>~O*Tl%XC#dI?CPJemjRs9~p>_i}t+cx&a%^*U zX5y^vyJeIxA_J(8Qe5{x+kf;~+;&w|IR3;0zFlR!@2iUIKuwM#YxDD2yRA{J2H=ibqGVJ9mLjR;@)CR&Zg^ zon3M2F;D9)NI_i=XzH7U9Q}E=SfFaJ8NvQ;S?47sr!P4dD!=#SJeWR~Zz3s{kzDTg zUJVo4`Jp{|GqD}w%)+1WbVc!_m8=d+*?_F>6OyxV&f8iq5yNFk40nNnHcM-={IFW_ z!v>Gu-_lD<{7-Ls!l)nB<*94QRz-eR@MA`y2k1RKz@<v);475Pi})2)T{6m-PUfKFw3Ghs31 zo1%T)0u)K8+927?z6RyVT}+D!M7Qkh2o=-A&|(ipU@85>qqNTIsuJaxQQ{e04zO~>91 zFWVW-jxHCtym`WJ-*HoG=;Ts2yV+8D3CkeGRa&07*R;`d`i|+Xj&R;1XfP9kNVYMD z(W6IQk#`u|v>y6x1bcS@gv)*tEEn6g;oC$UogGObQB$x1t`W>xJU7g+gpQ+zrou+v z8;gJN(|M0y%DEju8+=6joY!hUQf%+`q;p8Asmva|5HT%pp?{8+(8*fh>iGw>cqJ5Q zMIl$mGSe3Tr&rHWx!CsPtRvwlrNxQU82&_*VErjSkg`&|7w>=ZGIVh1j4o9c zX73#Qp6M3uBHuN%(m=ls+OPax(m$+KC-Gaj;jHBRN z{NFi+ja5+5dZeAp29Y{k>4U@v&Lu}KUb;}}xAsbg;tDk165%j~BrE=`vw{}!?PYsL zAga0ES^a_c#CP~NeR!i?;3x#<2HKoWaGUqheC$0G#w~A#B)HG-711W!h7|duyuZdY zh|XSwl{QoC(X;9+Uq1_aP3DGxmtf2walMgj4)mR=@2Q{On4O|Ec&c2tzD*nwtIPV! z=xY`k3Jhncb}Jnl4Yv!9oy}eg{OVU?&P>wv%e{FSboxvVn&JU3eqB$~J>jqjkhBqW z-I^*-NHtdEkh~50oj7o)Jx}Ry%J9*s)w0Z0R2QS~*oKdOYiE8`3=Z@3<|JVkZ^#1N zZTV8?M@8^ptz1GF)1?6jKvsBWQx8`>+Y{Saab)}1myY^Yhb1opw;YnJ+Smu=dHj*0 zcOmX^)Qi6y0Cl66QNTOc;a{OR@K(uUH4Vh{@~%mK9*E&tqwBP1w^|#C8)RAbk>DP# zWlb(va6){?uztQkNT`L}Lrif~tdMiAw=e(V_?55ZqC)ch*sHIT>_B;jKm$}KDD$Eux4A}-QDhk@^pC%EDkA4G^3HzWZRycVhWfq%?$ zxtIMSd8KPS;SR}rYeT$cvm*rNo28(_?Fgysp;mcrg5T6HJ_yf{pUMs+cHt274vXa9 zUro^$^~h8(sI0qQ9!*!YryCR_b2Bm^NJI!ekb>6 z)~aiNNOrl?|Cy>yu_w2KE!GOyK5J8!I3<<@2*MQ-GHabd1A;`_5m(gr4r}L(y{9=_ z2*2_A*>vt~Q9vlR-Of+>k%CKeq!vH56BbTf2JNZ`h(!>|*!Z5sFx1MvoH~jMC zO*%Q(5h=B34Ry_123&UJxAK-xXmd`b^6~-8&pfapD=)q_Ldr3Po<>c#nL@J?dCMzp zfsJTj6EC`5r)vxr$Ernv0eo@Ztp^NhoQ~#_i!C9)lz7z_dV1LvPjB$tw)9lOxc<&Y zpgE3u*(?f8t)drFkvHWDxt6eZu{QSRT)dULQQTny$~J@Mn}ttOFXd?$+HcY735Yz) zZ-g$iY=FE4-5cK9G`JJ27yxu2=~cG>ljnc1?T*{L-%tj3zKH%jq!w=*d-hRhm*t{| z)XDIgGF}Q!%M$9F#EW}r`wrvW&Y$*S*ZhHo%82e{%7}yP8fz=lq6L}CKL7`J7nO26 z6IT5lR$|UQO`$Mg>p-&ek&2dwO&8>f}Y?c*jIR-6E-HA0Yhv&oM||Y@b@rQd~!hzu{>WlIne~ z5hthqUC8Bj6BycAzGt<>G*1y^bZ^A^rbBf{cksT~H?6#y6gSyI-%O-IMrAyAL*8Ok zC8bWYaKHOa2@oGTf0qShY@;i-W#ql)@_xykb~O`2DcGXQUYuWY<4CeO>bB;drUAEi zk!8uH)G>{6TWasyq0g^$j7KK|L(5>sRrsd9YD{Hd^h5Qa=vT=Vq|ru_e-NCW^V*G2 z8Bsbqa`ok@;1gGU0E(dvDjhVC;3hgK8MH=no$LlTKI&XIB?VjB*u!YrZbV3KIofOJ zYb~vz5$H!+0I%yA`bluOZ1%z3Dwi#6b~K7N>0;NhOzFHv_})SEAE!dK@cjIMGML7j zIc(w`fK>gDVdpp=&ShN}iSGve{=p3FHZIZ`ouLreuGml0w9ij!y%4Pa z*SxevnXyS*yM$Zh8MiCnc6N;AWqzc*svt|Gy;bzL_X=`7ZvdDAuG53!EoP^{{6|!r z732a1V`wflBF#%glkl_n z&?%Q$v-_F#i}kt_HQQVy*&LbcBfaqit@?Y346{x{{KKjJC64h!Nk9vZC&E!c2vL8- z!c%KPUGR>yg$+hNhK`v%Y;TGmuq>!CbTW#@wnsrr*9V=2#e4UJF;8 zL2@t?n`~d8|LZH;#ShW^+5jkJFvT!sksi0$td6P8-odna1(50V)Bs(?b;#)wY&eld z-WM8ChlUdC8NKHzgH`0zq}4(5AttfrD2sS~F0DCp)AAccomA<(loy}pCRPCpk~eLY zNWAb}@^zT@@+0rh0%}9o< zym@MXG02up{2%PScUV)|!nYknL_tJH5ETJu?4qF36a*9tj!KhWgVKZ$kQPb^K^;Uz zK*vF(21Ee~y#xqNMTpW7LLebTL0TFjC6JKhU2&W+Rm8#yQPI_9{WahF5JeX*C^7GQ2D|vV+=JG;?5#)>OKek(sXnod(42FE& z*UO9qJPg1zmo<@?TM<%AN`2w(tp-xl2YT{cG16e^@2g#<8RJuX&KIbucyvL@Hi^Wh z>z?!Yk3T6u4%zRGkhszLH3{xY^$sm+&A<))!*QsnNGP)IXLMR*zqfXw1=2CnDOAs} z=qgv3Y+V?f5-2Km*sm(}u*J~1=CItUAYN^t{%(Zjei*2nnusMk*>w_woYtBF@+M<3 zC|es4t^|F%C+3hI8jUu={Yfxeu6I6aUNvf^aDdO>Q^6=PXlahhhX1&E@8wcpdzEO% z{Z9XIm_u%Tc|x7*A1xJqRIS$Rj#IwOmEDJ$jjeqq`Eph=nGBWHI<*5~hCL>pz;9b};`h|@Mo~Rc z+2&bwjeb;_wFQ~b3IEWLM_VQ4;q zlx4#&Y;hxw<0!kg|9rkvFlMY;LH7=23;mKQm*F48y2Bl1Z>masb2Ifv^NIuXz8DEH zITw62{@T)lw$HqvDW@(3g-0F<6~6F5`8c;rJp)P2{)TiIK~|1iesHre?1v_rrTsIp zQ%xNThUYB?{wtz@GbXkE2ax$u1)NUYs-PL?&7B`@!*9S;E9k#YSvSeE$%gIF7cjGX zo)T7JrWDzyEhS@RHW6bxRVzGC$>m#?swqPb8RjJ>4eR`rdhUpucH?|t!+E>cr_oTu zr+J7K*K2a74Bhvy&StS!l1O8*vm9NMRnf67e|g_eG!g0zsH@|5ORdNp zUp&qTcjr$Ln`T{UhHGTX(j3w^f&$@>9KaT92=pT_64v`;`kL$jKKu{j=W$ore*pYg zf`FxUxBs@zTMmA7``(E0Y;?e|A3 zs5H-c*R@fPXV6^o8v$(Bhv17(j%v5&p?jX6vNmnO$n32Bst0D?0!<#q%q{L9m^_T~ zK3jwIvI8m9EZdMXP1^To>KW_}i|*Vh$;FjusHX-4O&@24S`Y^OB;gI8q1K2!NusYF((=_PyB>H3_v8LgQI}kx!f{^TCQy z?l73cOB}J}3gx25QSq#)*Vs4LA~s?@s*AU|JN1~zdTK~#wX|0j$5w&SK*gtB?de2Y zh*OhHXki%2!f`gs*>k1wuAZ%u4%Y3n?O#S>dK&k0l+6zXD#!j<)ctq7&}D{CooK!6 z{YS%enE=_le7N9@Lv^SAyLiKoAq!)&nVXbfNy%8ntO}exMhyL=XPdh?cH7flCeT9% zvNu~0)7GE2RO`*}?^QpG3d}x@ff@$G%XN*b6n*+I**%jSvvI#8$FLEj#g7uOxHE(f zrdLdQFDUM#nhFbom)o>@^^*jbM{1E!≫sPjkW*QlQPvTIRsGr~oU$4sxSUwPfg= z0yH&1{l|!g63^Zs_;4WOt$5qH*Jn|C^&m?tWSMQK8~Ds#{nVqS0b_f&eQJ_OG}u&B zhl7CIw&VlG-uALVPWtdUub#fe4&@QB=uF#HKwVi2@d-a4 zA#`#EZ|vzfg%`2rsht3{1~F0`a9p1+;ak5mGo2C8n$%%?Pk}$ZdbRl%QT!APz99;! zeTW!yxfKzW-V58WnlK&wYJId+o~YGjTI!lvLn4Y!Yb<16hpscs$I6B zU=qMTrje0-7Jp-ZOi@=OWn=6C?>YvSJNyl2y;gOY-CGTDey1)szw6I?4G;!5K0N=q zm$4^^ODl<5!0y)!8xGh#xA_rN19JaK9eC@WZ=+4{^Ul5o1;B$dFE zF4|UL@lKv;{%NrGI!={rx3ce?8QUAKI#9X6IsyEn_*{=nw(|Dms8ELPsE}I8B$!`P zyEV?inqkjxu27EdX||4OaVqVMp{``5VK<|1sFEjc`H+iurYeu(7sB3|wEH*`0w|FO zNwa)X`}9_yKEp=ngbK|7$D<$3FQn1NRv4x^MFp*z>mRt3Jw28xo0%}N7DpmP6uB_h~BUy(9S8G{2>TSx> zZ3os^HFmtiMcpag`{Bjgb^>h~bMKxunPc8Z+Au$tj6GG*SVI~0AQNQnwon2@46Pre z<2y5yf0$&8@?0QO!wk=m&Ibl2JVQC_7r~D7WZ2fLrzl+-C7mT);fFO87Rv+@B)-gF zbZjuPE$P=U>YMI`Ma!@4XP~w8val+`AiaHz2JFi50 ztH(}o${*^@9_~XqRGeExaw{C(cTt4J)==2;OVX#R!L&W9X3mk)s^j*^il1 z%I(y|<(ns2W0H`nlM^`PF;Cc+=Fnm#+r6`HzqGB4-AhOU4d_KML*dhc8MYyxHEM(= z=k1q(yfERJTI2&h_XgMw$a#n{oWn>9GeX}dZKFVT8}HxogM!4wu@o_L3fP@FCiTop zIV@1_jUE%UMV*Pv*zQmpj>?I~+`0wsG0(}Mt9qafec=O4ohrnCf{~4XGz8V`Uq3$P zbRWuxWGVE=aZ_9&<{GQEGSNCbj36bzNL4ut z1Gl}5+Y536^hkGTDn+p%ez=s^Dnm73hdr3hKB77W+Ul=1=X}H%MN5g_p?@0`{|N#5 zk{;Am=IGx*%r!~d(#cF#iV^Pa-%_3osMs`_-0o4#vr<}sSA2VZj;MbXbI#B%@7}ad zb&=YGHm91Bu_8**Kmaud4v+;O&(jTDTgEvp$P)TR`;ai{pvOX+bvc8s>~W?*#iNgDl!dG z)nI}jf`>Rbrd=eE=l3eH$lRhLi{%2F0wWoi71sO9l7VQv>R1r>II%8kxx{BPE9V$1 zN3uS`m5H0SD{fq>Ak}gO+P(OuL`DgH(irU5q$o8LJ7Iqem*seYACx57srh{FE5pn4 z%g5Ki(r|po!_5F7`K2w|z2`P*>5Nt9#xcX|iz)+LtK8V0S=4Spv`q{$GGm={+%0gb^3!F`l5c{X-c!Q+C@A1>X)WP@u;t zTFtk=rI8F}(RJNbkB3hD6gux!<|1Cts;VvoYu{%nastZ>W`IWn)iF86f|DHaz!Ubi zVg3Y$KSfmig73akYOW!8+0{9=_bh<~i=DyfYNSq^X-vK>ZqwSF#m&~GGfdoChx(^0 zSTFNz&vVY>6a? z9bk#T^zMaZ-3SEYhBaF;RI`fJc#_};f%t}aun65Hv9KdXti5|m9&BEux`500RF?EA z{5D8V7L_pFF3Xf1hyg7{H&XV>SL0EF+ZN(0#M+XvNk7C zjY)&~J2gP9QL!lW_LKdMH6O1j4l$SZ59d9k)lFt9G)N87{I3$a7MsVZm054lMt{M1fIj0&wVyMi|E1-;1C4oP4m$E#6Y{hGM1Pi=_JIBU zCu;CLeTIs*g+44*6~Du())id&0=pMi#tR*j=!?O(pDa3XPf%?q!|JMsrg5JNc&sss zC&kuFwjz-dQhFdHjq;Xk0uSfoaI8TMW~G$z(2Ee$QVn`l`N3)U4x92yB^&%T5OdPF z`eyatLqMkjazCcNiNZn$ug7oKx{srRy^iZ2f3BEYt{C)Cc-rpk4E!9ac^}i?MA|}w zoX@BEK!4Pg*l1lmG^Z*4DTGA(&0?~CPQAQ};gVn!O;2{QI0=eKEzpmZKu^g%d3GP{ z0a0P$XJOXo6>0SZ@Z$2&f-<%OLUK~-68!mtt_rK=4%daC@0^0XmzRo_Tayy=B~Y>J z(w%SRp+<-p`>7pQzOyuSMmNJV{!5sK?{WZC$GSF|ivXJae`Q46ljA^1u)SvO+y9ZF zxda%RGa`nDcEy7!6y%&u3AEYkeDBwBX6cm|MUi;b4+)j$j8))|8Om;*ZMN0Yuzp;) zQdc#}*rZyP=X{l?TUl;ltX0vK1S6YhZKph0lffEt(<5&q_W7r#&R_7y`bIc30J2HyrK^^dfLWI(d^uI;UmgH9VABs+uHy_nlwdz9ScTtG>yW%6#8D|RqM_T6h z{MMiRh$xxlIbG*5`gwK__u%MB%b ziEm-M3vlB~_{Q~jcgB7wfr|1wx}=v1>&f!x=`e65q^NK=gJqv1uK9ka4`_?Mau+C1 zgxWj-x`OwXPOG9X6n_t&gF4Bxm{Y#;C_+MYN*@INwCEN1t z<1jmLLWRC5J(!{<+O~h zL+5>C$~poDHm>^I{@y$eFkOF!LwBZ9%}zJ{n`EdGF->LLhI>1WgZUziKlB<)_jRfB z)#r_Oy0Z71Z#**ex@mN8N>l8Ap${=6_*B>GZq2$B5~AybiHdqTtMK89N1Nlz54;1b zL6phL465Q#Q5;`9)S+hZ>`_SmZ=Rt_;gvUcPT{Ay5+$l% z3lVrrOV=%@7A(HSA$R?|RI8|3{Q|7#1HDpt$6pL18JgfcW zu7dBQ;g~#Yk-XsRUX@emHLg2QV5FtjK>swrxy!|Usp(^8Y}q%|XRP7|S0$B?VKJ@> zm>Z2DhKrh5YdoHc4!*>oWYhM^4fJ08?WLxi3bo4hl$!N%{6OW@Z zp4nHf{UCQ-f}vUGay3$^l>5AKli*C_{&%$Im9AChYd8I!d3hKi1H#1&MEwvwB=hOl zc`~$fB^hBwuTQPKNZhqyJtP+`D7<_EYgcfKs17CiJi+>ow?C=)>T%E^<(Nm|#p#QP zi1A&l*}Zu~)CC7SqLg(J_md3smsWles=1=bYhe*FX>qv7k~M+2Qj%8K6_Drf@``-X z6=K0ZKpoLpJUsNzP7~`Ai{=6={gbKdO3zLoo4#oO{=!pL7jUjF83tIhP0KiH2emN6?okUZ?8YNqJ!uS{u1s37rL`8R&i z@+MP#2Ecnz!4Bn4?X7>$mw))bc*-AW*Z)YznRY`>p=_uX0eSo~rA;ZvY+TDWj-e>6UO}@1A@S z_GG&DAFMUVXP#mcv7zoa^#1Z^&&7E5T0T^hE59W1FJ2y3sf*anBbnDe(3O>jU7ivP zlROWb`MNciD8Vcz4ZJi|P(u@k!il+uhp$&)2Cr%;%#=`o$J zumAWtRX$~nf2lbKP5&2!>!}f4t5TPMaRU|$-|t2xXmXSR|4>m>#h2wRM#e;c_cJAp z@7XE%ce$NVuRfI_P_s_GUa`f$N;0|LQ`VrdFSm=9>X$>kLAk9x%1zPcJd($SQxrj* zs$ubMdHf&7!D!}R0lCJ{K0hlwGh+oPk;FF6#x(% zd6sp9M4e%;%`;HH$0{SPoUZWqo(A|9W&6fH<;cLiPW$q{+z!-`as<<(E`;f>IE1|G ztTVa+>HdBVNI3f;BgQ?`gi8^~$mK1Lbpoxl>ZNmz)zeyz<-zgP$3Rx>-;xa*O4FpF6$EW4k`4beCmA=o(*v> z=nJ0?dG$I--Q8681vb9P|B*>*BYCeuX1E0{= zOjRj4NdIySFy7RD`SrE-v|yj_=x>v(Cv{KA;z1dVeC z8_JQMpp3q^WcG%~`Lb8QNzeX(j3PRKepe#U;=~~+`j_AXE7pr2>&LajxkidduK$uj zK}Qo`_Vu(SVK<#LxSuI{KhRhKPp(6|=99Pmso)cRadOVFpNR$Me&#Mniwqi|-4r<9 z#4gf9MUFS4Tab^h)pi_tOUBJ?J=AVGwzren;WFudp)$kjAN5OuXD}*0M2=0V3oSwM zSk?AiI<~|Y&>Gr-pWnGUzH_nI0J#Way}V51%lJCp(Yl2ZFDCAN_uy}}ApM@AK2#Y) zfzxl8}%XZ{Z-L1&844o$nj&7gGC$z zkFmVMO5~*P1!3e!uKKX(*#jPz_Au2aB{&lpNYsX!R;T$#^(cq?7B!S|B`7%W95|4R z=vN26=zKc+i%H62CH2JkQAPcLN7R#7b3+)tq=O(A8ey!3`??wuC(+PltHF(FE6?GF zDII}8-rd8o$dovB_`T~VtVAf~%OB-7oMwO9LjSjC?^Ny^V}e;QFa1C2N;#$h$qY@A zQ3{BQZ}R$fpSO%o+hK9h6oJ2q@hvg6Yp_7TiqF-eidZ4%0X@F-bgh(iOd_x+s1La_ko|q zmJaFOa!}H|W*9-}2l^RRY8TVZ(o;Vb%R53OiomJNB&;!Y2bH7c8|+kiQiE(})H;crUzso&We?9Yig#{P|!TKv$9@>uF5lVUM8Xomd zO(DlM^Gy^xsoo%o(2RDlMS(yC!l<~B?O7Mp){GDq8tJnP5AVh`{ROx^Yx6qY@9)2 zltOPgE`~ml47y|nU_JfYl|yei9}9aBk6Ed7)88#b%{QA<1 zS(~R^VXX4hQ+l6CnU|NLdx?L<`w=8E8C5@NLgBQUBFD!&7h4nHi%bxH%dJx`b67|y z%SrIN=Amj;T|N$TNcn2KIuUbmxS75ZW}dFZ*=bMsa5RKzu5T=xt|7hK(>B-bu2HN& ze16!VL-~m7sd=QPl{SKDhZOQTIi$QM0hck*gciE$vq}&~9;XiWG}~}W@`lA7^)G}_ zBH6DCmDhH=dR;w+4g^BUM2I9b`JOVLmzDQ{eCPwYvTy905J+6h@Jhr%oLH9Te$ zjK*spF(Izc)OKVQnjUkRF=1OL7sigL9Ifkm{cC<+4m7$Qu7b-S+~)(X@P!3&qbU2N zd&*b57C$;uZte#F^!;7mM`pLrc! zwfUg9l%D?e&iCS$!cPG!*_8$rsnej2W#Bs>vi{Hk*C#_CQ|OriH00}JqH9sy&M&KY zZmCF86hUimm=K(BOI!0AKU}LvIrg4@(#m#}f;vb#^$ZG9G;VLZb+B{(qOv~LY?K~b z*IoNv-WU)bfM(a=1mGkIHF&ozRAr;=(xl|7Xvv?z738uS5|np*wWyd~T5y25Pf8pI z%-jxp*RI{M9b7O@DSIY|u415=?9U_EqBkt(+aZ>ZjL;q`GyZ!Fc6i64blWaAMAll@ zKDYjZha>6k<}T|;6eoqvr1EJN{Poo`WfyI$yYnqQPN}Mv&7@A%F&8a*EDh)G>x8!D zCyPoX>$*s+Qg$_J+o8FtsiOnB&UJ^~8loO=KukQRsgxESmqyV7b5{6X=V{A-@<^Jd zxw9opVJWQx-)tenHPGuT8ZP@PM6!_mU>9u_T2aTpS|oPHcyU+?g~=*FMlhkZGU+aV zB>0E$7dH+{|3g#y@<(vRsd4HtWhU*^JpKoIX4vV%jqxafSGz{rv5ahMAlP z+g7D5){!DQd9eAH3#|?N97-gFcgf~irIYpkvP-twfurMz4zayy&&CE!3>z0=dVy6L z86%Btm6;jfdHCdjZRbI&V(%gc%(chth*!l;3#Ze*_H0K+b#8I2neukTuk1liq$n_n z$vT6nF+r>?8;2wYSF{7a-WZsPRldv+tHLoXJ>oESTTW(@ zgF(ppR*>3_JhLJmYLS-}+a)OLPY~{O2&q7Zm7vc2*woQByzEZQ%{R3nwI>gOomn2O zZl)1t>k{r!Y2ZInKgF4}_sR${cjj#WxP-_m?Q3?{Kh$}sX3|ohvr$)hDz2oC>o@R9 z^$yewazt9{QLTB(nvTlMp`DNEwGgNDRoA1AA3n?S)OshcZkZNUY7#OW4YlzY%7{gG z{pbhjl^s}S)kQ?9%%@P7A5&NI&W=`3%{9fqMXE92eR`yi`|Qma;9mw|=?2yiC!l}e^8t-Qz)D;2@QGi< zBY`*syf`cRH+bzTR`LM*73JGx4Se-n&=gQd_Bg*2w2i^wc+TqwW4y@%vxPn-OF|q+i&*e zYg*Dh!zZ~OIuq0M+Q6!8+$gVwpireB)p4BEy;PIsuB9!iz}p0|8Z>jeqc#uxh65UM3Q~%gtH>cqGFoj|M4v#LO5wWX&WaIfA-u@A@UGF#kOWZj2yty@yXDwR zRzX3|`iUC&_%1<RBT- zBO|niK7&Y}32#{s$$T8FGK1!644&|=a#Ifob<>z%MP^anVjA8#+(-ycL(l36a zDknMKYQk9ko^8oihK+E`Jbz|U3Bf9<9^bapCH5DvSW^acSY*z8@U&fl6c0-+L zE5}F)ZKJm%*)@cWCsF>%f@#@9x>1IYYP#}5%MSE;p1WBOX5$_lsv&iaOVqhmeq3Es z07Ht@P#RT1H4O0t-GCCGU65l+j%DI&0jnZGH4Nhm*jdvF(yg`Hx zH=rM0U=>_0sj2z=;pXDf3bJ@*#yO;`z{=B}Jh^hAA6*s7X|VJ)e_oICEPJ3by!`=7)PN|) z=R%~;e~Y+4IL@16@+*sna-ZEG%J7=4<@aW6>XZr_^vZcQM7n5*w2?m-$4DSMRwkmiNmz?S ziYgn~L1M3R$g;S;nJ5z8gm+9zY)ciyRjvzbPCaN<;91X7P*>>D$ ztqD%hvar~S>%>h~!56s`3yWN`)}p}Ce^3&MAm{nd;A9sYy?GsW zeaa5ksC5{xaa9(YU$R-ZaZIvvej`a@YQ>|e5jn+(9jGh>vKTW0kyO68PCs2H=JSeM z+>@%#Bt{rJyMjEQILA zC-*E!y*~(9;xbAcX^p6y1-+Si4TpV@yU)(bs_*SK&7Q>-K*CO;}dOK*3b6C;pl5u{9L-H%dx@Tj*$ zqA$uTlc-A0Z4~KSoPd2N(dZG#MJpdWl#}r0iO;?~&Sl821gcldZFhFmp(y_+M0{OS z--Da>5?w32svdqiOru}tFxIKPVC>1lG%09BSD;PuLfiMtDnP7|K*yFiW2uO@T>!=v z9fkh6ncLQEI^GR?Ii#{vVw(oVFt~7-iP_dL3OeW)#8Fa0=P05b**SDkiuXON7Y$@z_tcl=3hCBcRdvg!zk0ejS|}-D`rpkDrJNzo5{ z481)0Xd7?;^So1-TPQV=M%b;_peR;7@eLY;+X@;zlj-t-DH7ykdI@x_I@wV9&D@zFpFaJ5n~ZdjzQv3Z5Cl2f60pxz-1H1blnkY2 zbQIfO@GOBS8%EVPa7K`l^{ebal#E4Q$if3X%gc+h2l=rtvL*2m7p9fh)WIXnPmGE5 zvWNH!=KLP*UnILVufKo`PFdT0ItEYf`DmSAWZuAR>u=-{)^9(%*>+z=`EYuy;`1Qh z^6i_msD5J!e(=c{8LcrOF_~XE2Z*FLzFXZf^g}anXtvH(d3+~FQyarwpA!Tt-QJL% zk{q6d#K;!IvO_tCsVZ-0y8Cf1v)Ci)o{;%7p;B$$x%FO{OHHA}Rr{pAdZR;UJ}q)) z&W%!ng`a3+%l(OAG-nn0AA;enlmXRP{=;i4^}!v5tD@OY6|0%0i!8JE`D4ZQrZXv! z-DXpnmpQ&5KCkXoUCh&v=rp>jK~1YY;&Af$761b32cUv@#{n`+?47MD>~UFn8s(S* zk4whNfNW{UzB`B0GXtL2I1y7f|~BDY*K##1=w&9v~468;>Csc(aWxFMGfg0KdB zE|~TIqbf@VvSGXCU5M)sEhhKm-9i*78YXPkO+c?tV%#h-0M#`i zvKho&q^r_Qn!%XZDSfN%LU`3?S#>TiHs8f>RW!YhQ3Cp0y7eKU$Ld`Ez@(Ha8_+@l zaJ9G~nPmi#P8Sz6Y3hg%o(6J49yY^#oB7igl_zv{7Pq}l*mG?Dl(p>PF-m1ID_gQv z6rWn=$%ST%7503)BW<^+6#h`9qM|7+(>ngVW8H$f)s}+fq41h9WtzWJKU87=d`rpW z9F}f(dS+8j)Lr^736raCsrhbIFib3rI{!|Izl=!+=RDcOmR-q8hdF929r#!sHD;q% zHRio-!CzVDM=5^8(uXJ42ToOOOBL&BQn=^eH%m-(^vl?qw4C4{{^m3)k<+W-PqDB& z@(7ZJZg|`2^7Qw~GJanW$6T2pMUj=8y!!A7FT2B1^7Sof$D|i)BXpyt zc8rFsz@sqKGN+V;B;xw$?8W={Gg0aWQwvQItP;`2YDows!D4V`@Q$!S`FCt;mk67> zW%d6MoBD9YPW2l$Wu|GF=D8{O>d7S79c>9oK8jzOOrE`c&*J#eEs&1=yyg6S6>FZh ztRzH*sU)$H%Fxu1PKx=yEi)#k*6Fk6RE#y&<%UsfckO(ILY^=^_FM&oUblm`PZi96 zJu-xw7yB3}{*kOF*2QMk=}J1l+=84f6}4OwWLH`kawLc=anA94Mb?wF2%Acm@avAM z%XInP^~tmNp>HO#!3^oI%M|`>Q%}t^XmLQr(o$yY$S`m}EQK6Xq*;FBF}7?^d=SUc zz?PjBIz_+P-6S3@DrV40U(yhp$OGuI+GhnR?xw#6==^G?vY}LG>*YVOTD{>Cs*C}(E#o4)O7k_NFUGK zT|8R8;GEd2a(TJcg;(=1Au%#_pN`fAjB02{GIJ2)CemU>I{z40gj>S_bOVf_cBoagy*C2YuMX)PHEZva-c3F@a<=4?KM1w>cfr2x_Btq^D*bF3mw)!A;nt; z*P4pU(rMiWHCqh{JaP{jT@;HmsUKrcRW(;kbadyB#c`+$jwKuY`ty6mLd+P!c=!lT z^~1sgcCU8l>YCu?AYlIrQHzi%9|$qPO9o9oL)bQz_97Z;yVbURp&^wQELflCGuNH^ zDr(o@TqRGi-;Z*F1gI=95(c-=Zp?(55klJq`X65;%XS|}L~46?9{)tPg*x%r4mBaH z8CoblB=j;GT9l{TIRVyuZbkb!_DvklAqftC-j^3DoT0^nY&vckgkJX_7p-#r|3=*6 zzI}6CVzT!R(AogNjTp|TTTlT*@VW^4Z>=q3VZ|~{h7Pj8^%;-$6s?tQ`HL`qj38+E6&C5H)_%8n5UTN)1US7CY+=ZurJ-@JK(Qwg}~7 z_z8M2r}Ijp8-)vck#tQiH`T&Ju3AmJK`HrD{i+fe%J6n@X=zB)K|Ei*O#?!ge>JXZ zT^%^Bn{i^Wb)>4Rb);hCd;+?)cpIlOz7|&0>F}ihPR92EEA1`)lQZ6qi}QiV<(R6) zHffme`_Y(zViaK>;gef!*?iEt$YcEAKUU+PH+gx)P=90 zdiYQu2{QQ$l3ya)29C)zqyYzXS8XKJplIexVpkM zX~VBkgDAtO^O4THTAsMDTL|W!QXgKjGf^tW z7(eGv4SO!x4zfar-9$2$0c*p?CcX2KjvQsLp#fH1&Z$gK(?-x2lBSEo=`YN;xzgkZ zEZ15P!u>igA-YkrgXys8<44tdA&;St7k&Fi*Ra6sx$>x+}w z->om-wltmOp0>NMIR#gp{q%1C-DmcL{{&rex_h)M;YUCR>ax>dS4?GP$-t$OhF~G% zPKmcl%!=INsDGo{ZymzR9T|ULL^IUjg z;}_A*FNu%xdMj43qVxrI0jjQ30PWfGD#RfiqAsKvt=eaP1RedrZUfk($Ywj2M!h0N;2Cj&0z z!4XY^yZ|j*TD%gz%&=OSX12heJ>6tjOg&CA(=pwaOcd?D?%oB-KiYgtO1KVmpzix# ztM~N>$Zu<8w%dscVS|SQ&Ur!R&EI=Nj#$6A2q|@n*)CkiB38Cp!v?oCs8u<#9o)wD z`j-cA8h-P;O^xhcqllaVoAW6dI26wX83jaki#W+5XP)W6i}sX(PyMDg(|0vhH+Sxy z^4tt?y*|UBt&l_Xd2>hEN^0}MGoNor(_pEqJ)#n`D4Qe(i5~7_glaivya})H?AF__ zsQ@JzfK@RcXI?RAyOHYlK7XoVLl`l2p*J8TQi8L>J+Thb7Cs4ehmji6H}z8hvMcA= ze>svx!CV8cTF0|yz+Oxh0ppZ8E4yQ!d=*e52qP|SlXWic^LvkO@-srR@(mZMOPjZ7=5-*FF!OH$PW+ za;m9BB0&qK;WF;b;(&$!Nw2|0ZjIvcGH~m3tWYw>MJle4uA{`qjkF{TJBNkmt+HSL} zDAQRxIGq~NeX$PSc0TP(v~T$=$G@`dvCbe>1B#0;srS}%LAJXLmlDrYZ(x;%vMeGL ziABCG+imtnWR!Z!1!o(siZ%^c2f6RULH<34wJ}r>qd*YWIMs#*x_A!O~c=3IySWTUE!b9Jr zFEyaU*y($#$Xj*1+(R1z9jD|6;<2)KCa*Xb?QJLmHS%vJUEckMb?7YEVL>tVp;3#s zE=R{V%y}byr*$3qqX@?eftF*#CoPb8y`(+%DFnfp*V0~io!8f{O;Igr+%!}llB{1o zbwIBc?xpG|_(&3PMJN4&wA=-dwTfQV zkR1U6Y8U>AXb~kXTb3sace<9}Mz@$8Yhs9q3cG)@h};onltszd^*t}}x=O`nhE4rT z(%!^MGU6IVgE^|Ycc@fxaww!)tvv5Z)AjC>A$J%wa%cb^*5X30p$_;D`>6Xx5N(Qw zuC+fYF{y5SqF*s!V<7xhU+}pC!Cp?bZ)poD^quEI6;^$gf7Rj)irRfell=8)DPAYW z&=8a-;6Q2c_o(mvdt`4L*5@}Tq+PG(F>)CS^&q`v^p*N~^1-U)=QFxA4@k^k>)QW& zu*KEV!2u2njMQU<2xJhmr99?Wm={@|)QLmp9>$$Z)OWk|q_{lKwy;XRyQspt8(unz zp=}LctX){_Xj6bsmrpW3EypnjW?9Z$G>#2i>|0EC08{! zyHXQ$92>eeTV}fOuqnb12^TZ$J5w&legl>ztYkl)KhPe>?7PzeJw_$_Xi>?{nDMxDD@WBaD^d`*71f&d3e8C~?1v zAT=d7zFLOsqzs;TemE?ds<(U^G=Mv$od~+Ae;k?JnaR&L!JO!3H+tQthEi77HPTLK z*E>rp-Uvi8`pSzkC|o%PiLD8vuI$F9AS$g3(mi8UEZThr)~oyx^9IKf?e0BP{zA)l z@W|G}e-rxO`R6f1Afwy0eB1%HFMWq`<>tQx@c-sesS!ChdY_$>dw%If3WO*^7yd>s$0Cra@(hRaPTohtcGnGk?rO*Fti$Ds?}x4(u&r_r7Mu*vD_LDl|&+u_+(j z1ZEYFs&oaKSo7jL)^kz5=+Y-b^~Kt@5XKq-y!OCLOe`@FBwT zgu5S zuRHK!ZktUReUr`1)EdNxbw$k22zZfYVlfyKwGr3SK$W|jEDY&j3n*?-O!X+4!hd{z z=x#fAuqUpoTrn1UJ+Uj}>Lt$v9MNppN6#hQGYx}!)B0#o|ULMDMKBhRhu&b*|lD+*Z zhZg$S1kc!8=kxZIqQSMAjDf1;h3U|n&gf>MHoOhK_)%PkQo~TIq8Q8K*6BF=$adHE zjSS%iN2rVW4Rc?ODD(a9lycAFBBwC7FH7foQ@k?0K}~1*0n6OM;o6{GqV?^V#qSsL z{UR_(H!MFw0H++{?E%70y=l_Vq)Vj3Vfv5I8^%K)V>Et!xwDB8nJgw}^mkJ7z|Nus zB3$nz=(m;w?5wVO!-nHw?3fOMzj{?7E$q#rZ^S#BLpxxXl<~dn#_34pX93K&H{C)z ziAmn#O1W>m$sPVTH;hH zGZZH&L1t9%#LEpW?0Ua^XZ_OZhT8Cp-~{izK}m6`H=1Pza*SnRAD-V6t1SBZUeP(Pqm82RGR)3R`(*)THOv#7DqL#m=R}dAbEyl+pO_571KqoBnew=iYzH zsC1uT1gAytjv#$oZ&2z3%k?=+&f0TqRrve**#TjCrcHs>37~~`91zfizm*F)=siqy zlnq%>;vUXJ8>&8TEPBp2!wb7d(64N*_xOwnXHYYGx{Gh}cV&mJZHR^3G{17;1?NeR zk<8A9b@!w9?|gP^|NZ?xT@#l_o-U0;1>a9d&={!=^-JS5a!@mTTK7re+#$~ld*6Zg zKbuOOc&~x!<^*+(V3}2B2`QaqvjG7V9eT7F|JCd1QPg&2ywG6B2wL)f?&MX!-u*km z=M7FGzCaQTorA=q*MAN0Ff5**ROMWC##yX2Kl}a1r(*8wbzE;+XGEL3)KE@ z`-2uqQKSXuEsuPR#9jr(rq2_#LTw)?rQY8qJ91xg#w9k>d3&}i{eq@9 zdAo3KM(vGo31cWzyHQ9J)_g3XL<%=obV5D~S1<}6X9R3?Ho8f!(5ZHnegy9Igh|ls ztC6(X552d;IPqi0SH3upj1lw<+LE!$Nqbhj%48_?fLA|#|GDBAF8DN+{x7TjOeWgZAFYc1>F7Z-$QPhjT87oDbA_fDgLop=7Rmc{s^A!8uvo^N%#O9Wr_@{I1r44ak!;{Te}=p=b?t?9-NUn$>ub4Qq^y9x)~P<7b)Ak*aWT@y z*B0&{s0r^pd3jrM%%<>$20~(}W3}I5q8obGRma6os+%{hqkkxp^s7ZBhA$+=-Thze zy?Hp)eg8K+%2L^qge;R5Dtq>ACY5MYrxLQ8Y+1$<2D4O(vJDAkO{vZzdv;?t_CaME z3pXwg_1yRGIqv_Se;$AMIt~Z({VebO^?JWwnb068|CN>7h^bkf z#2<A#ek@onvoND2O8d|*ojskHUk3OWz)$pBG`&4)$>}0Ta)DfS1?;YM>{*(AtB<-7b#Kw~0#?>n(5g&6fe?FuC^yvfj z*j8NrRA8SlpemWJ{k0`V)i74a0VSZ|fZ9XL(v8${KzD~DubNXM>exb)E25_U^Q-P^ z-<-lKm5O}~#zGkmw=Y+C;{^4pScv(=X1DNPYnC4;mWd(H77xN@X%p+nf{vejqTW1YnwJgQVG-!pt9?y&H?*JjNh~-rIdngFB@Jix=~hQ277UL zE?#R`6)Selpdxl`oj+xyT+lY?^42oxDZ{pr+!nB#Vidfxo)XueulZAY>?th1U%~hTk~-^ENx)UOiy@ z`e9`|`1LIRh(vu|yshIU7czg;4{a-zUs3#|H;?l^DonZWwVirLPV!sL>7S^E{F~ff zo#zztDX&md2i8%f&XXT_REWtjU2yaDR6b_gEh#^h*gzL*ZCb0IPH!D+)Y25kf|6LC z@i)Jeb_#*cZR4wklJkZ_yA&^!*$G61)-vvcI~H9+)wc0IgYNtKmhtZNC$p8Fi$;|} z6bOux6=5B?PFIWMP^&q9l|qbfSG*UO^W;}&Q_Z-}CrX?FNq{?#f~3o4tvm+d+WI#q zV)BhRQhRk!aZk(jCbWMV14Fk-s7<}v^#%1>Mq40)#lovQZ>!mDmMZp@1!+87{K-?* z9N1TEYx={>4m>niH{mhyQF%ejGd{0?t#|0C)}_+B%Kdd#hekuF&*?J6sV{k|t!b7q ze$zkSBMg4fI)<_uZ3~T-jd0(5cPDx~XAjv9jpV zr_9l^E1E%B$hk^STJ>TU`})XI6@PcnjFTSQ$?@yGZ%r`M_~~z=wByP~qKt_OFc`fi zc4WM0Dc_%4OkDiLi4)DXwu=!MP+%LY?NBdkb>PxrV%p~(36 z`mrXL9`HGYsBc$1+*GD0gLEH^-GRT!z}PJlcsUaE6Omlu@(dlC8291N);K@2zE)vu z%T1iUMDUbCsXr?&qBe*uauJhisJTZRsRf3zg4EGl3wP{{aCsF4SXyB6+B#|wGDoR^ z>#8tasBdVeF_8)f{AZVD{4(})29)HGJ3f3G6J@H5FedXXKv_uj= z#c6I#N-b>rhguDMB<;pWAqH#fvnP^u$^vxjX^ z+X~!^ZM3b|%G)~!Ss_W3u@+YjJobt5xj@gt=oA7p)>5I7a8C0^<9X-7ENJ%T(CHtp z3y=+mwP-!xh`!Yk70=y2W}a=iOIEyp0gQ+;D1^i?CJ?f;ECkoJBfXbn+ywoXgN7zc z`Y_jm3hH==95{h?=%2}z(+he1MOQ>m{(w8l3XUBwHY$Mk9ZVgnI*{rRs#k#f81MPL z9OW`!-`v&r#pL!_nXlf20qgh#YEdr(Nw%S_DocUxClIV~ zP}2SCkps-eaYA(S;&q+dmd!-X^MOwMBF&!tdpwqObUQ39B-v%gdbW7;=gD{GaKZqF zAtl`0)l*za@mHz8Nm|BzXydx@;O4hk|0*o(1)X)RBju}g#P@7;9G|fC0or2v0O9G* zb6QoQQjS3dwe5!ODm5zmjh9A2b+;*FG^}=F`aq9@Im)A8d4e;~U-~Y4=e?jq;i|qD zX*c4dFufw6CyugR99dUDhDC$*HZCE)HQlD6p7s0@UHEn#<+uaIU<^@10QjPP|W!6KGdpI}9T@lyqAKI|#256bTLM3v#eo#w-& zDi(yC))2{&Sc%yfcBEDqpMM52=_H5??RW8rp8BFF{$aASs&4hW=y$(HN?><%C~oUp z+`nYkSi7B(L^_;4bgjaDY9Ksny6Gn6wI3;2C--$2&|%fppv1qi@W|wVkB$4L)gh9E zmqsKfpkj}Glu5R22;je@opk9daXjYPw3qTD?<ClNBJvOkN zVQ|xp@{?&=Pv0-&P43Mp#wni&aY&>s*Jgcn?;7D_A1H^RLR8|}5qN>KJ=@u4K~^?g z=XrM>(90*oPBF9#Ls`wWn`bZN1DM)KPX5b1k$07_hvVJ<-IoG>SI*Lr^J3J$IWJq0 zzLEK&yJmO)FN57j+BRN&=$51 zkHJw0>(+C*@OaZe2&xDgK8Jc^6O^$0;2vltq9T5(ImDqsw& z1x>-7Y?QmEPs;PfMeQarD+loaWtEy*p@OOcS(Uo!2X=n_txP~`8f;@Q49*noLZP^Q z!2SiDFEQ6tstyj>-{xcKdFG(O4Xf_LldSi`;aIo{KWOc;7CddujZOqEWYxNOmZgIQ zNX=vYE3v1?sQ@tD;oiio#`6;=(SSpH4Y@G}5bysebTERC+`eh_jFOFk)b=pOD1*hr zeC)O47iQa2aknO{gW*lpY(%pr;{DI*p4$vJ)x|0zk~YzjT)*F3ZN%q*`2!J!Z%gQs zBs*_{_L;8us4k?a1MW(}%T9zhgGtxTzilB&T4x3$k#U+_6!XF44>Db24d4n?_KjP9 z0ex$k7(Xy!$Vk3R4>t%j&{3M}v zzp_VAtbkb5zXYo+cw_CV*H^a?8w(i{+#C~m(E(P+>0hQE*3dunptC$rnHyZ7OQ1)7SDzE;CFnT;!&e8R>4#y zf$kddkUBg@H{`vD4kpI8j+f&@y#^(oMHZL*B%eVV7@2p!Hpz)XTi_bhmc8>tU+mwJZ}hFBe}o&V4=g_gAY zoJ8#PcB~Hh^H;>Ck1ZsN@uZLvMXcT&!PfY+Nq*_lZfr>HG6LHYWRslJ_{|BBJdy`8 zJMUFCtyHMm?q?4VHLSJtQixThlhSW917q$GdW}mmZtj~34~fUZrlhlE zgc+tdF4U(ey+zWE(LU{Y0s&iUuVd zV2psA$TNEchM9T;6>OtFj3UZ+~g;d`gwm zeZy7U>V7C|^Y)xu;kdW}XssAgYa_MnhA0C~Y7h)XC+5O=Kqe2g!$r>_niH393`~ZL z6DxI`LQ9hr%PLX+V0b{a4t7?+{7zNU)r_)ft%%IpwHsG$#@xY;UJCf7+@n0~k1w~@ zll`TaQeA`7MO}U?g^Fcv83I0YyEJHdQ-nm^=^q_gzyBt@z*sthjc^Hp68hsuW(_bk zq>$?d=J6yHtvtB|<`n-JS~IO)7&!JwYGlREX3rympK&re>b2RAFF0iTKbz~#!9=NV zTt*VsW@aFBqcM$j@tOMR{%RTcw{Mptkg%!EqZ}rTV$XnoVQj)>XA!@Qu8n- zd?DX;eq2?ss#)RPTaOW&KrR7+m*YngOV$Cg9&516+!m6*(`pG?ynixnt*iY0U?-cbSzgC7su&*=jLTC@Pi!mH1>-lL+3;ad_gNEHzeJ@H7ec} zR`XE=8U_!k-B9z8_{Z4Kxp(|Ltq=nJ6l;7Z5>zNVbZR?r?(AcMytSW#pHm{?vEM|R zF#=PkZt6Wv8IO9y0AinS-k`pKE~Mg~lK7e){W1L8V+=m_^AH@(*3(YCURcFYYn(e3 zHJkWXIO-d_?$F56?9Hj-YM87|GZ1#)i}nrgeLsRya(6V0H^}}a+e|GT9_;NZ7P11z zo&rfIQ4HVCF?03v=0V3UqB3sAmQ80X7q*-3!5;!CodJwpg|FrTP*zu}<8k2bx&R>+ z^0XJouP?>%%}-Y4o@0BFKz45v!n-N4;+3Tj9gCDR;@y&1Dg~M=JY(NTmoejpK|xUJ$M|SNqp~2=KYiO7VY6kz9qT$Ne<>PWAT|nHsq;&4w{Oi2#p0% zd@9{3@)?L<2PZ-|MQE#EJ-E(8;^TDeLz9v>sdaD+Q^dy@iIjpDKu}AqD`zo-AC)W8 z#T=H-Y8@5;#UIt^9UF@e)~L-j1+DwnHv->_8*tTO+<>p`0)IIw^{P=S7YT=(-5V2{ z*qH6PLJfoi?dD%#)?$;cjZw_+_@7ghm?^EyMkZO|a97i2qVKfr`T+LI_!+d9lQ&bOt}A`!m<5H_wUbv6xZvP#7a1b$RNbl`g7f#U#O`Q9EtL#T zsGM!wYDCd11$55Mcr02=8!T>BqN2@a11|a`Uht|FT3;4k`$>kB3}Lj9ZX=5Zq)jkm z&Z(*swOG?lyY|9=ab1`%_R?_((?c$=;lihD^9aj}Ik1DUeti zyB^b6b-ni+PeeqDAm|XWW{0(q1kW%&B~$uwy558d#}2IR)Li{yZUW%wArD*fsp2y! zfdzv;w;hVPL9B6DAE9Cmym+pNGN}6E-wa>tQBcM?*XTWuEdR{sI)uD@{d^#eke!Rn;)V}`pmR)oIdV*`IZ8_%#B8)BkeM2M>S33(4~eEbPd1=Wzt)yi zysKhzdG6T5`97gcgOCgOc$o_vpP&nzT~xwY4c|+)e2zPTIzReN5oi|@73@Pirm7>V zIHcSr1gkc69)j{fD7V7i zYsB7^Rl^g>Rm;fi#IBHC97K1}p_Km2ibo(?^X?g$@bTtF1qY2fAg*?M((#qdPcS+3 zxu7N>OAxfyUyY<4)zmfG=994$1KkfNwh7YwrLodsP24Ac$DCEYwVUNK?$6f8wr~(6 zK4_%4(E1xSgYZOAj(0J}Y_@plp7#8lqUsH`ZYu)4LrNR>bA2qVanUHm5GgppEFMZ4 z6R+h}@-!G0uUM{(SZLBx{F4< zK5Kc0tHB`fI;bCFu3_&10eG@18-ZEQce!Rl^oBqF z&K}+Wj1gq7uHt+p5@%ebl5H@RoR$0V>;s*tPK$^+Tg` zPn%KNYVD9~fXCe9E?Z;lA)p1=@2L(T&sWv_TF>Xge0^rQM}NuwG)?%^yI<3uP3T;9 zA>Q@)QE5Dn3e@x&JzX|_Xj#APa_Ox)x1Mz1gcgTx?)wRkAI#An8e~hVRBgFzFKy-Z zy=~Nbt?kMU_>_Mj!`9%~=FQ^2WDm=ny^5-R+$A+^SM1hNlKe3iNJ`B1%xe1_>WTXS zBuBjOGGMIVDOACs$pep+C_OH0gs!3yY~O?-%NSuP4S5-_^OV)@T;Xub%}xG@^1T^l zvdK`+#i*6>5RxRDLDOL)gMeuNcT9?Gm(kwJPk&dN_yAtU>tA2T)vZl$^DUC)VNbCK z46F0Yr!HBj)w=C<)4tT!aXN&j_SFYMlmhXIt2a!c<;jlqsT%<%>7Y{7)}D~YbM!{s zk~QlAIJ>dLym|MCN(kQG!XPEkf=~_{A3$pdJ6=h8E==wE++7Q}TDje0Z=7e$t8!}GZG@=-Z-yYHk7SV$u>RQid?2u!fLIKB?+8H3w zQ#ItOge?n;2;ZSlVPGTyGMs9Q_i2WuXoK3dsjQW{aiQ|k*u45%Yn%E;* zZ|;wttEJd;seO3%i~PhS*UOsJy%4kec-`9TrPom=$BrN~4#8zN4`pCt{0(+|2SDOV_R(}d|rMU5& zFLyS=74|5C(k!n+RnB2|XG5~Ec8s4fZ9t;vQJ`A}qh#GT#bC&dvf}O6+nZb!n1Os5 zm1)4=`=MBtIJ#2~CKfJ75seN6zhUGzR~Ztc3}k)Tf5m|7alu5{n}JA+Ov{HLwRT>R zRe?ju;MGTBXHr0K1zD^o=mVgXY}NWp2SCv+rvU->e^zknT8dM1q~NK0RRO1baV)nV zc~%4>_L9{g=&ik=JfpGxb&=zuoMLkjGmCAV!fwF4=T!H#`V6Um?2cqx+|9f+KKRSc z5vbzX*(3mK3BDl+!ZGGb5j!6~6+K*)ez-h3!3~nq{)}zAarEsqj~Yh~WIj9X$uoX& zr@Q?RVI);?)h0A;^+k>WF9#vgGAVO0jF!DSFm}tnYVNY=1{qxdoB(M8#n&xpSsl*UnIBRW zBh+t1+KkM7hN(`@)O=c=H8R;oD?zTIVuH0V zWTH+Spj8`vaySScC+1nH!fiZ@zRGeG4{;D0Kkb2@Ex(SooD0`T)w$*)m0I`W0sPD8 zPVN3KAI3)?z=QD)=+f5&fKh~z{KI| zrNt_7hi2t;_+BdlSu1Vly}%&RpJFt3G)}H=Q^%+2i`L@rO0Qe1Yf9=VQ2QfrAqgP> z=}pDYL`RNI6s>kUe%cxZGHj#Tc7JTqmutE^pVQFH5u3-*3S6PEZ{X~CdZXW|LK!`X zgV(uj4^Bf%{7&Qt#hzlIoOvISaoj>{Y4c9*VyTmp%ArBn^FD`k9CA>pLqEvqA z5XRSDM;E_n!2Z)VU@`SDliwF`ZbGHQ(T%}}rTHqx%W*p`+JIAKW|YKEzm?5C?bORr zpP>|NyEkJ_;0XdW(ZpdU;KRzRi97S0r`Am7vE-jOSq@7yu{(5H-7g?_Y^Mi|SnhW{ z(z9j+K>m&3BlZOy>hCmLw*Kd1h%*A8-H4T9n`mf;f;Tr1Yp1(2fHe# zD1s2XKn?p?!J*Lp)hlys#A^SG%7@{DZ}68f`jmXj-QF$8({k1E6xY!rWwswXwne8c z?QCeLoG6{2>aLdH+PKrtZN(yo*YsHKGCiDl*<%4UG6H)C=Rn6+Yr1}3t=a-#9Kh-K z{}l`N0qey^A$6-uNwQ?K=Zm zB0NFnlR-VDcZUam%0k967~}`kbwszx$m7kAaQeUPt`iUp{v*bJ8giX?ng8TNEI;*N ze6-#I`^o_j#?`X`?tq5#7f^6CaNF}pM!)RBcel9i1@w?zxY)u_y=+{%X3J#bUVp%q zH4J9{A&p=f8`7C45F0C8hUl4NSz%lLGr~Q_F>^O=sZNF2t(WE{CiuyWmU+hd+TWXu zoW6pfzpzJe;!JA+=z(1otxXCZdq$vJ+dJVD`#H-}Y7<@KzaHDx$ca?4`f5(IK zws}YeNcRvm+#F#h%JLpO@EMIYDeo{j+A5J&nW$_xMvydei( znGtzw_dV7(W3`;mN^zF~`uXj+>O~sdKs0}y2PD}^evheI<^@IIACCArcn82Lytx@ETHe&%2{?j=3po2|w zsAc1S<4W4nqOrTK!`OSlV7GF~ZP-e$RegyXsQvA4xAp+<0dgjdefJF#mH_k_Is92a zSq8L}JVty9Lb-~ax~KB-hKqqlp}N~IA2dE=J zPJ^tCY8i9>hU_2j+mD_*I5bo@_>^;0+c#23rsf^|>RJ8Zg(rhPhgR3Cp{5shxPN?Q z1lk4q$ZRjUTal|53ykZYa@z&{w5*(Shc=6)I>uj9spH;U7-~M1x~*A;l8dA;nx~>F zCaV-4&|$ukGvo*8524a(i$w)Zn7=k?Wwj1o&*;!&GACGwYXyWz>Am`F)m5ojh|nYfI-+oB#9XTAR+X{+?5ZM zcfm72-R=XtwOaW@Q$toE_T{C;Y}C2u^Io>1thH;optokRhe5G>_iy$e`@Ap6Aa*5^ zGHpNJBCToWFbQQmn49S$OwUj4ZSOi7%a2}z`u%bhPv?(pi#vKE2i=?iBz=n13#zF4 zb`LvRE4R|}{9Q8@{aBW%(*s?qO+3&Y$4cfvj9-Uq>SR-l>ZKjtO#qUxN2O-wxLw#P zNzTA%e+b+$-d$*X!3ce$$&}?gUi~wFDK#0(1Un5b5!eMdWv9Q zj{SOq+x$S4SoOmP&swwvW6fpK-(6(4%@60O>xVoL2_td$q}fGX7F>LLBae4}EQe?G zo9ENo4D_)7;yFV<#sg_RzfuNMOQadq+S)2VUlGpmji6QCY=i;}`s*vPzN!Fq0%LaR z>a*ATdJ2sk zjL$pA{MT&*&LLjY+w<-o?}QR*!P`TvMi6?cBIlH5d^Tm6kZJiSsSpyEnhkv(P8)r+ zndk1jI@WJp?WA;9;3?A0=@`ZIh@~Rov;F#Keor2R1qkZ&}XRw~d&OY3;z{@Uw z?A!Zf-E9^)&V5R0I(u{qv!cU8lrA(rm8Pwl{0(o+P0363bL084u+jc=L1{zpjb+*4 z+|NkLdd=tT(mNkIw+j|)l#c&Q*z?Fj^6v4Y;i}~$hMew;h>aYX z;aarppt5qybSSx~3~~If${Dr0fu!wK>u+TsFRQ~Yn`@tQ7`Ka%t1}5#taaf6bJq#Y zOP*D8K@;7E-I*!a#L&I{`JS+Ud%OR7%P&AW>OVgHUkJv39>$saK^MAGl!b z(nyLt1^X{I9sni%eL{af_dodgMGVL}Q3Qut_r_;ZCJl7-Fn=!&aQ&bE=a<>73m1Nu zXq=urTrE3v4Bx39xMavjs_J0l>Yv&xo7{rJb-%t=TH9iL*kdeh2#J5 zK9{~c`JXpLIwP-5d!`lzq6`dC^`cAB!9fTt#z2J~| z%f;+gLB;HbrVmlY9>2)e*4HqybGIaKD?y&QUmojXasZh>-&RQWS7Q;%#oZH>_ zglQmgR!z58Z(>@6>p5J&Kv(~EQzpHFG~HE*Yje-WJjO!x;=X@^9;idd3PYF&;dMcW z3hU_l4&m!TwL4S;1n0f*%0v`+vibX`)!Cu!_nb%j{|~R{b`=RImv?s8|M4P!TOh#L z$Sj0(n?}s=c)YGwp=z0(J&;Mbby719TZW3@jZ+V#%P?25&}m@|=fv*nP0l0e&iCvU zJapFx&0&+KLNH9BY&3npkhJb2ysXhv8is-LAkkKcBvh2+&YTXjb*NtRal=h0N8l5b z1?X4SrWJFuf;5>4^QD z&5Xxeb>i=QqeLokmiO%P(qF?)K2*H4Bg^wAvFHP%HZNVwE4ww-ai@u!fnzOKFvo?V z+hP&u`c`~4DmsEsc&d?4wh7qly8ZmSOokjZYc(o?#9{JnQ-z_Ed}N0F2BU_=c}~MH zjc_cg?e>~geM^277J*g$M_+%ltxHhZTsZL!eKA+d<79Gdwgwaql*h88wr>EsHci{> z@!hY)cQ=Sa$&owjx`tVB>Ep=-4tol`Nc)CPYPD*i(ya1tWiO@US7dE3%@_j2^Z!`p zUaMUglOX;vCIs+tv=zCwdTXlBoJAid)G-gm%VPGc)@|ueAQydV{ihE*VAfAgAQlfh zgzj*c!%5G2(#xmw9MN$!97mSKp++S@Co4!hj~p@Uwxy(kJ5RtV7y8QolQAyS|kUuNSQ2#I5F$kWy=leQY@3EZ-JjsLxk;^dG-}|Nb#`b&<`5 zpBlf@U~T#b_WW%{&20Qn={xG)_`(atkO(FVX<{s-TwP}yd8_S&g-v%SCab~0RZWo# zh_C?G!N0qB(VOBj%^0i^U1FD&&5^|Hu4lj34_!NX_v^i9KsyHnJL#p?b$f~+;U_l$ zW7tLlYt9w0j`SzD!P++TPAe&0SZ$iM4k62r1rsxeLn*S}f^{nPCA|D|s;vbz^vM?r z*)8h?FuoW@m|B@SfmrKsUjck`shf~Z0XlSJAAO=im_bE>u;9?6s^oFT3I$)xDJCTuc|G{q2Yp@4h2~%|xG1sR4E*F3?sE=p!0_X;ipEuOE{aK|>#hVtgG4?WP?1H+rQJTZy! zA2MRNbmxvwkgsjF90Oa?$yYJB0Pvuz6o3`{mk*L#hRo6Yd=Hl$^J6n|{Y&)km9LM0Bd7{+ID`}XhE0->?&mZ04Wk!I7#*vk$RYBO^JCM3vCTz9Or zfRuKpnN)_`9*mxzO?z*zP)8F`i&uL%zfSRbCqud0|x= zlM366BoanQA8dua$E$=r-&9dvnLM~SMp&Cf)0=mP;YG2-@uFlL+P3^b+-5p;BmRTt z)uS}ltpRr_e)?Z@1OQT9D)Y;IvN^0=#SsqhPFS_?cWSRTmDkWAZp_|9av2o6CjCj? zbFlV9Nc|5L-1)RS%7DNC5;58=K9G0)pZ$d(=l7M0NKG7 zA0RdcWfM&`1q67BMVu1)ZPEYs7h{DjB|%H~m>^yfUHPbjxCD{}8 zUtig_cuDM3^JO^&1Mpsp?|q7&g?WWL8~V1Lf$cTEcQ38K9s}K291`Bk_wlH}mS7iH z=0R67NZ}bUQDIMn_r;4P5=XmD7!EPD_(G4HkU(iLa-08f&l{R@q4~?OQ{)d;q^93+ z#ia~Gc;>n@pd&wo0n*{!1wp$04*F3mTMQO%iKmnR{66P1lXMb=2pgw@?R>Je|=Ko@eJL)V2d*b-} z%RG~w*MyMZIDRl@S26!y>4dE+6ZN7ZyXsDc*;M7r3l9=UZ{@DoTrn>6kW&MuW6BQ@ z8lpBkx7MTOM_0u_hVN1M0tr2|eDsk59eF}!qnS(w`Kzi{wrYaBYw4FjtL@+o-ELo^ z>_}YNWL<5JZkBqB?GT<3C<26f^p$5D|4%-~Z!LG$0Mxz$rf2}=2a0mxzWxApfjRXh z_y37@p|wG~H(EtGHaJ#m6gyR4LxoBgG^2o~FPn7Bq<=qPpe(OFuYKef5p#Y5Em0-B z%M($)edxyR=-N%x(O{W~-9^ZG0K;|;(9y^s#j5}jgZ)v(6uo;ZR?0x+_DA#PBIgqc zZy?;Ccleym+{#DX5(?oD4ph_UU-ag1aQZ>No(stsMDE%yMn2xTotUX50K;Ezng4@) zfwr!$iO~%R2v7s2d)>e9b{q;8!m9p>ou$2N%u2gXar(S zsa1SX@d_D#Vv1nxuZYslN}n!-cYKbft3~L$XIbx(P5FJ2D>4QKG*;$1gu8Xi$Nj~% zeb+dNj{zKn&V+Tm__mF(w5~*9CPEzVi2m-KI#+Y+XxH8R#$PwY64)te(pm(2nQwP?Tk!< zo6#+5PK24=xwL-7S96@yrdY=obBn;iW@!uh^8swE0NY|sQurHtF{V=Om z+$MZihu3%O=zgETTAwcwi2We?QqSALgQW*1f1J6k=D*<)+tJfhnWHC>o*h$s!t|Jq zf-r2YG%-p0piy;*u?1G8{TeN*_+r$tpa!Rz+4zP(6Ul(TpqEp9F-nMkGc_iENh#Mg za@RO1GtQw-ktWHh{X<;15jri{1H(Ih4sL|zRaQz!N=i)zIDsK46j563(^8uRA6PZxRc%kizUB=fam^TK!a zJf&mg)I0LYiudNv+zT!1yBpf|xvWu%2bAYqTP$689LN8m5hMC)4*LYKdiD|}(`0MC z7d@u6Dt2Ko-Hq8uvbPbHKk|ol6!y*Ru9=Uw5j)FRRW_;6w=d=~BtAm^dZz1wwYF{> zWC;?lBLVaY^nub>zm*H&n|7BF9p%ONVoC?B(sd?p5%M6FJR&kWr-*G-4-oKfwi*nn zSRP(dUuOB)(MxB`!6p3a)Fn)<1uA3u7=K8cGdGek5-QbHJ-^W+?}wUTSzDt*r8&bitFCQ=mS%-=lFjm5B`MJOg4plBuCHg)XhS0>OXih9LdNxneL^!I!8RSN~))Z zPxN4TDJM+6)N~#Iom*k7c`5V*EY;ASF7Vt}D-pnpNYUALPd=yW_P1H8*taiq7SvvH;SaXa`2A1eIe1yWX~8qyCQ+k4eybkew;AQhi@qAfDk z)R%f|=04@w%yA7xQOS$n6Lj>&J5cZyS&}P!II%`w7T!{&vx<1%J0U&Oqn`prOx~*W zS!t75WN&TyFIrsDNrXwNE=n72zxpitOX7oMVciwaMUjeS%9NB2gGH}l&QAczWcWy9 z1fT!fOvj4JDH2$3nzN`(&%uLY%q(FZ-R5fkO)rRz`?X>=k3Z{{xEG`SM=Sc;f&IK) z!=D73NA!c63UkjfP(}HH1uTMA#b6>paW?8O7YGs2_kM-80->2|hv_)<&Xb^Buv5=jk zQrf;}LaM^Qx{i3|&nga0110GmNS2fp-^0E3KT6#X$%f4o0n1zs>WR~N^K)tf&AAwGrnkmts&Qw3ls% zeoe^Zq8K^#Mz+AHpRb{{L=0`x;9wZ*R z5U{;W*2JDx9V$y+`7iZKqHPT2;WI%U0L4Ftqm!^!O%5bZL_wmjFt-WLn1M- zi0mvg7*t`?8x~9~|3-PhE`!~dT;#6sv8MxNb3s}7^pAHInGxaCV7swk3~yr?auX%) zZIhcVPO5=f+NdjNYfwWH15{*!Bb%Oa4q$I}?_M~<8-Zw|>>u0Pz{P=6Ch zK(jY4hIv4V#YPv{zf^g?uc9Z^1mL4%WyG-)`!PqM9cAPLVTDf%hAO{g8TIzgK&HxD z$N^CNtSqOWE8;phA5L6bt>wV4I#+(Rh3cZ|_-bz$z8h7p+O=coZ4}X#L}IsPf6GB6AYrx^Me*#f4+s>t5Y9Ls*+(=*~f8fxqUrdnSDw9;Sn0+zyWdO=@i z;qm`BegUAY%6sbf+thG+xYsJjb7|M_Pi)>aBdzk4b=-@fpC~`Rn1#`J+_05tnjr?t zAA%4JA+N>DmkNES4}Qn3=Nh$FaiIOMUJ=m)`6Pd)4Oc_TudePd5#Ck+c-bh7VCv?^ zySBD=VJ$H|GcH3;((I`f)|EZSjgBp|%B-*^368Tk~I z!m6G%#KFhQN8#IZQHx;c z$Q6}x_w-k;_-0q!epS**t1GUC<>AP1>A^FfV`-sC0|;((_0_}pd~pHYfb>~uFncmj zdHtuVCv=1ys6>4|9)K32`sYvTrIug63a4&An>+dFnk5%~c0%e^V={bj6RwhkeA$j^5&mdlt?Iz@JqY$NM> zOGWZazAepW<-uzsaA$U|8$g;~`$#A)NpFQHf**I?I@bJHiNXxc_>HjJnyIYZnJ~>x zNBh?82#L$8j}k8h&!tm+3nVe68qbL>OQ87I+I zIVvIG5k~N=ehpS4-bF1&v99WI*~`&`*lz%3_+y;Zml9*ul&Z$Fwr+bLHBO5AgS%`9 zD0r8$EU}!NX9SP$-w{}{MwrtLeK7syFHj?v`1^Bb5F8$vao~9#b_nvtZi?+JIm3rzY2V zDI^;)zwf&D$Wd&rkS4aJuGota*z_>uBtzY}ez`6zssc`(5QU{zwD3#XFlnE^`+E@_ zrpRO2FQb7bq*zygYGUOG^7E~sGuLx9S7%}h;v8T5_%~ktA5$S zL_P|1M3{2NN4FpK<+)kVoqn$Kkz2Z|VxFx~TZcp}cl;@kwFMJP^d0v&3^GjpJ4wvd zz`O-O+vQ6Q8yp|nB6x>caP+UWQ)A5!{3ryKkr`Ay}v1i6c9-ov*5bnw`cbgZo2p%I%L zRCB4i+Z{;2xpN6W>J0RQy|GzF)j6hwKDN0`fAK}WjhoaLyF0hlbbZuHO4l!t{o*|dNWE%wF~hA<|c(3Mdj0^DrDe(^#EyV1?Y*iAHH4(v@x-; z_j}SI80S9_JtPpk)~R#G)ju2c>T9NSY0`tkOX*h^0ED-HWs<|#+$=RJSc5%!Obqhh8rG;S^(e< zGsEr_#pYb#rAkDT%Z=o%9+9v5d257I_lO=RQ#yTY@q&z1Xcs36yig@q@^Umm@ao95Z$^WPkQC9Yb-SbmoM;4fYBCv}ZbM3t~&EvUSzt8(iNJ80Iq>rN~C0 zOtwOc{~A!pT>Sm#cBf zmYNRNM(u-uAp_jpp|wsRKV-~ZrW!^UZS)|2KUcMn@JFGhkQ}eRrok5<3#7UMzS87q zA8TbtH4^(5Q}TC!UQ}HI6#4%z$WsXpckFg(D-w199kafc`*%2$IM=D0JqLiS0=cl-YXH8wxb~Wg%z@`0|9R!#X&~#uN#okH zV%I}{YHl?Nn!4I z;Q0eDYl4llb5&lyHaeK}zu0>ZpeDDt-8YJ$bQPr+E2#7$y@*IrDT)P-Rj5J=t4$dcj=6AeoH9QLQQUyq~48((|Q?j8?WJzY$}%R<^XD@O@R2NL7WFHTk(- z^CJ8X-o?IeNk;F@mplyqL6`LQn1WIl6Y& zO2iCIZUmK_O2rfBR8ynVhV(2W4A!&B4YA~2-Gat$o-&eM5!(U3(+_HCAs}(XU&c;j zrBqDWwEgs&Tt_v3G~oj_|uj zNBs5P6m4x@p9#xOk+tlfKw&b@7!`W1F6=Q3(IhY`#o-yqVBjsxdMP*9-ri3KmJFr` zEtoKm`Jy(_u%s7jAj-Y^#~Gu_lS{eWpL7L6R= zI4r-g-cIeLGlD$ErwbdB6n)%+T2!K_CPkkvuPkOO+*%S0Ubcoe{^-*-BQg1cgk5N- zuBcqKuGH;DI+0j5b~p56UVf^#K$~=QR`a}Se#DQ&C|9BtwrOoW8LdETACMT!(91@7XmQZYTq$EDhavZuH zcHuDRSv?&v9#=KyZH@;6n9$I5!p`aK7K%*DJ%>a&Ret4A@N5(U;*gCJ!tfOYs-c-90AEDC_jL%|w#0y(?Z;sczLq|GzID2;wjCBc;VX3?v z0_gE2DT8Cn-CF6s7!!T=7_UJ|9?CB2e#a_}(}p)BA+6^REB4aEaF2PQI|yIvuem_` z1;bUNdeXg|7P&!)>ECz=MnQ+f2WHewy`u;eIJsM8s=8-sAZ9CjL2J-gK$v2(hOpkP zFb<@B`2u3w8pUH`YJQ2IpK^ECPwD4VXW;K1oy~Yid>@Z?O;xvLJSR2CLMiy?9y=^}9CGeo*yl{bUYp*k&TXY@8 zBl+3=tSbuhFk7i|i)g!QuQ*59r*?LNLPA0{rYvHxFIt9P0e{?&XHJJ7N<7Wep3HCm za})Azm-CY+-IF}Jlnaz`Mcx9fEr)(FW_4{9eQ$K?)_1>(XHQfP747YPGHn#Z-4rLs zKCjmP>dHf?Bqh*BUhIde3=JI}ap9AoL@;;Gtnj4kK|>FnRuu;G&@Us`VrE;Ms;|~= z!wZ+7BMU>m``Q-yYCsH@4F1z6>r0jEHyP<2?9NMg)9YQ2;vO9mxX|v4+FZu{m;{1L z*~{bN+4QPnxsydJ#DkDq&$IUGz^YC^-hI6fYuapIaFq?=iS1ZpQ*d==ZL}L&eqBdd z=j})EmGhghv#OrJUmcdXyZ^l5D|O;}teA;!20x2zNh6Qg z6)CaON55Y!ags|8c@)+`C{7_+ERw~agp>WT%Qq;rZHZWpY}@X}BVho_BQD|YYJ5A^PEL(*(Smry7|mGP}Qa|y#`g2fVr57jDZllKbd6|dMDL*AogElACC zH@M!KU9{Wg>QzD@W(w8fx~Pa@QLt{1Q0R&!C9zv!O}8-+9M-#t{k|ki6r7E?NizHr zoQ`65YH(xShbaSSN3{xC>XpuvR){T2IWH}N70WHcug_SaNy82X`4<>RovZ2 z2I(|x^N$?8AQG6w3|W%1AZ>|Y^4lNL3uhEOk%^-D{QWb}xlX2lN*v0le<@l;Z9cSM z8R$0eb5YHWQeLlhf2&bWGuK;po^11OOV7w*MpdSu`Jr|P5A&b;JFZYS7`=@YJH8wtz2c(a$WtzMWm!$uLl{w5lZZ-oNAhZ&EJgF7 z``Lr6t>xs4BE`gIK|4Xl%o25fr2BBho_&0KHSN(|EY#G@>^X3Q9uqQ9VV86~HSUE^ zErK6;|MZOe>C2^}NU6?uhUhU(=`R@Xv#mG*MTrC+HM8fKb{9C5Uc8vRrhYh z3=W=OVHCn-YAt)qzK)GiZ(KZWAZ0aJF_VHSP~t8hU@En0eo-Z2%rpwxR+nPU zI22gsht0pw6^Wl;z^`+q-^?f>x){Zi{#v~kdBr@Hr0ZB7lpr8T)Uaqh=0?pED(m&%MS+CfLshY4Q^cJ+4Y)OFD;7l87t zgO$I1S=)EU(+2P031--l^|Pqc*QK@kL`g{;ouypEUnBicMu`Vjqt?agFF(m`pP6UX zMr`e-5th1r(0?58ePSb+j3YG&l~o7mDsUu*OtA(INLq}8;m#=|#?X$P5$_kiX>A8; zAG*EH+19#mskV0O?{)_sDMh9;jd2lAUFoOE#zqcc5L=~WNfi9Wjw_VTtXoLs+N;7k0_2SFOJ;kRZw2L^Jb zWICIl3=P_zuso8ngW0*8vF<2zQ7-VnLg~3K-GT$kh7blMmgA4!V+zK+nhpRM?_FnP z@MJyWy{PeAH#I?rid5*-+zL0fSOZE+?1Xj_Xwe34?bIRVj_&|Nq>8ogjwO5Jv6OqR zi+6sG^h%K~kP;^whJ(Q%Q8;Vof{w1DN*sJUgcVjfY9@m$BUsBJ4bikjGdH1Cogf?n zN$Vm#vTaP5*ylpy7`OKa3uWrSj(+G^!@O{)>Kek~0Ts#K!W%8HF!%oa`F`0)W@?l8 zfRnQ3k56(xS))ZuiVa1mj-m_sLkhs^PSCCyIeGN_vv+<_9@W64#|l(uh2$vWaPc-n zxjrgEh-Kxzj?-Bu-S^2}po?p7DlfYij|O7X1W8v?B^r*%BB;{aw?-#gG*nU3Ilz{n zWj}!KL5;v)Rku5BB%EKJ$Ss9*VJ(60e{$X0V@edSESY{mwyIpK&|s{%&q!D1 zQ0oo=Rf^kqF1BYY`KwCu~+=#*==6alF8Xl@q_t++1?^56G5x(!+HMB zvR9yFAGlKU)aXGtK?A;hANO?`tnADk2KW;6x9mu2YFz3FvhNsMZy4_^35|TsGg3>?V@HCAJmoGVX`y4 z3tc}*neE^feI+StfbXit|MWoWZPK{xpyI5GWnOk|3PgO-UG+5S!mNzqp=i*sJb%F0 zT8cd*T{wYUtv56TA?JrA=xwlUi*5v$lsz{x|S?Ga7lCqr8~ zzgIkzD+tbtufWOEx?lsPOd>ppjYBURF@8dxguq2Vod+%r6yAH!Ub(I2(h+6b$FQ^a z=pfTI&%YL9Cf$mSg1b_2mtDLgaaPE>RIySAxU$8L4WJ$br=00*$%e_>c;kQ{kGvbpj4dbd0qk!QPwp7&TF;aclwAxlFZ?Di!k z0+xLi=g!ffcE}SG#3krTu#sQ(6=QC5J~!)CnKt?3?S0gpE1b?s1e&`R-#(t-yW-UF zspb_}4nIu+hfK$pp9rvqT(7RZ{Rovt*+YgP#`ah&c%g;eO^O zP}=-}jl=S#*4X`((f4{YR0gD|)5{}+UH$D}yKZvt+tn<^Toe(LHq#<6MU@kNJ$E7W z5LPMJJMzg&6sFr3T7j=Sn4Cytv4G0pg{SH)pvE$I;u+Y!uwS4wJsu~#IKW@_7@HI? zH^YR^tnL%(vG{GA3llyWfh8$M>bge5ay1975&o zeZ6|PX8uBpVlx&HS#LQwNUi*QzTlnF`WGL(pf$XZ&l!B~GxtmJ!W%o@eD5F=yI;WH zIbsd|`o@ZHSw;VVdC?!NA%^6w|s-x-e*eVYws^H}oXx+^aY|55^drGvcrm@$vFVgjq)KxI`Fw&f{0co!nt${C?B~s2uP5Amc}=JfI2FflTMQIXyW>|( z7P``8&QdCDRcKE52G9xE95Sl%wzl}+P0UXBWpZof_;ymCa09}qK|x8`3H5A0d)!1H ze7c5}fZ$D$qk14{(sGNg$*4~9lI(unnuh~8g?4LK{3wiH&o$w|EaY;p2Qpx7mr zq}Lg*g%i8YKkpRaXR{U_J3~I*c*Dui^kna89$NDT)za?XwY#NT+fq2SmIP==#En*>LrBP(FGaZGiJ~3WDP8e>Fdq!9)G$JwF5jR zwQ$^>7$2P=r}KwEDv`tfv~bkusU(KNL9cOXEe6%GVBTH3#w@uweqWPfe`UlD3nQM^ zV)JUiD7mB=t+^<+8Q7QgVhx8s(97a`Rt8(7#y$~c9}r6$ZlOLn11!fFd$h`nzXNhi z^O4PiLQVh385X~k44?-4k;4o4+h@Obz6bBZXsKT_yanL&*qR<7&l3Fp1Z_nuCCI6n zMU-+ytsm6e(Un?`A0Kk_5-by-B>jea$SCA;sLfN80m*Ek0b5tujDcfj0riO`fzaO1 z>lMas7eg5|T56`&!A69RleV!{&@X&FMp)4Kv(e@QhydUE!#ZGGeUqDD`V+D3&D&Ha zcK)DjGTT~!SKKqwUhItFNa*3Mc6 z*;@z!PuCl*c=xT^Mv)xm{e3SvhMchM&S$P9?y(W5t%&!?=chk?^n;gmIxVy8Ho3?8 zpuj-7ll2j}QO7p^Rt6Y4u4j0oJijkWpjiNLyyd}9l{)@l)lEw*hlCzF*dx!mIZ$mV zCIajK!k99I@3`#we#W>Z?@YqusDRD9f>y>p>ZTxk)0cIo1W5@>Ve{z>iW#oT2iLD zy;wL?e2A~F9u>?*0l$BTQDp#PT85_L#hSw`Hh;~~kqTp{SohVNRe*rC zJ9ij^%QpC&2zGoJyM_$e&aZHaqY#yw?;vj|7^7|FK-jZ>VO^x&jZ$Io?c#Cw_jQ{WqZ)3wn${r~vdiTxi zx4P>B=A>+CG|4)Zs<%mMQ1pM%*gs$7-1|QgF>oXPk3{Sj#s0sO7%tu4|3vAF9~9sL z7h;M5`bYZ?*6P)i>3!g387wC?epn3TfG^k%Q5XV3?N5mRuWv8-$>xBx(Z_jtIK#9( z&SI>_O>aV5!YmT#Qx^WI1shuDC-o$>=XxKwj~)Dbct_w{n6hvIOH;>C20D2BRp;M} zCMjg5=I)2pal?o*i{9hVmheW9cWsB&uU;F(D6f5eX)~4oXmzU19PxZ{8~yNs0C^aF zcjM+frpR&kw)DneX2Q+#Qzd3FH!z@Y(O`TPeHkZU`qg#Bw#jpIH9mYK zPsDL?q}Rjq-#_nX)ewGd28}miIe%?G_7oX7RCfxoRNq%?PXkqY!&ZLZ)H5JUznr0a z5s05}jRx`()jm|L3E`7XB?8V%wyNo}q+(+g%rWm(8>q#28V2o}qGBaZS^5!-JLaT2 zQee>jehgLuOZRjf3?Ssyt(~@#SHH-22mXE!0hWW%ob1 z9y)e#-)LwxR)|XM=A=7q2XaoCAK>dsqF-8oEX zR{X+C>r^xr1Kt4(xoRz~toL}-;F(GlHHms+0O+vsXMb{SV7=wMG7{pkT02l3CYP# zA>;aEeuTFc2FH{lI-3A5lpvc6DIcpMw`B6GMHNzzl9F;RiMef0v#u{UP4QtOiUB<`Dj{JL6I*A6%bV4v_;Y49nemZhSlJkBU}8HQR*xfo+dtD}TI z@K@oNKzUJ>=};aym-d~Mt@;Yl6<52;kqs_7;1+P?^xG8W;yXpmLUrEqgYt;7K;2*W*N7S@s91_k~U}!rjcK9B-^m<1O<4xy0{7!6$ zab0hwvPb(RV=p8w_IHIFtkS$eb|*{qPorhobWiBHoKwJDmAH8W)%g=e$R{m(nIjm*%C;QOI@{nkzddQOF*f0s0LtR^ ze%QfH6H4Yc1qO=wv{jG-+?9a(pQWP;c6j6mawV_cp3{z2)k zWE|exf@8ZoB4dZs(3HJ7g&MED%Qd@W9^$*(QezmcK;jIA?Mi*fL0};Vh%8|pBon3Z z>sM_x@RqL%77`_fFGu$xcBaD&0ea?ElPF+GVc>?b_T1ksTx&$tH;h)VDkqDEOxkDAyS~wnw;Xh$ z+AAbLDhY?}6CR-dnSTxR*gO|gV|L~?mBqKVSzPxLgX}g3GhG+Iw-4IlB*Rms$rGED z-X6V`S6cbddo4luBxM|5b4mcEAiVd|xvqqe&pO|tQBU^3iUYohIh*2o?0 zJ9LnzA`02jB^)5vCAfQmx;*H}KJ;R3T>i75b~6Tk+IZ4-H>mr-7^=g&&K`}V1de!C z`Y3A(Lyih}29EXqw&4SQi!t8LC7XB&776^pxGmGTL%KD}J!ZkpGBiIiF;A0V>qo}2RngSB{ha2C}J3YB}H za9qf%yOZS{@*Z*lRdJ9OR6F2*RsVj!$+DDlbL+bB!&2K?LAMrarG*Jr8?Q4VhQRdG z+F|Ckcg0#NQ^gDSv);rWtfVYC0|)bR{vw9xLgSgfwL8s{>0iJ^_FtzG?aX%ZxQy|! z+sbyQzNhM9c-H8q9=(ty1dQ@PPw!C7ODVcsUGbV4M4<16XY^;#woO{9IdjdRm|n_R zF1#(kLBL^!no-94MZ##gRVU}8AcE(?cagsf&!3zEkiSuM?sY0*+dQJnuyE)^c42gn zC<>h|84R*k+8z~7?W|vR-LnilqM6*e-;HT|PdkaU7Q1XSeQlE^<<&7uKLK%WIvhRk z7o^ncm%Yy9+oI4>H5LKOg>$M2l4mZrgv%d=XS6bjp0i2wJXwFZg5TND8lNgDghy!9 z?VXoB*w7loC^scnP#v*J??28V@c~hNiiHNXT|?cJ8Sw`0m8BzJ;-Cvhl5AbdBYGXLPZcyK;mSj+Ub?&QU?@Si@_(U(%(R zdsI=1Nz%~K#^n07I52Zuzits92@5zmuFGIb(!O^)d|7_ZBNEqD?zgq{)`s+O z`bcZW&FSuapdo77x;MoFwT`cvIM=5IU*&ahYSj)r#Hst2CtulCn%$F2Eh`iyMrKVF z>k4OaB3DX!p9fpg%dj~V4#xRJ&vGh$^!xunb<|~;<(ODSTN_{VJQ97u z(Gz(;34YEk<4~t%*#aoRUFUiXq#ZU-v%{w@uuJYh*gf_yIIq@GFN*S@_OIT5AOdHf z|KuG;YrTk5p zGDT*QL6!hBSGMOdF$Mzf^(%}#(DW65fPa(Mzy3OcZxqrUS3mn2jUc$a`LZ07&O#uM z9QA&>)GZU(9@!+O(^fa6TpFS}zJ67-4l?n^*K!gyXJ1yMOe6CuO(q7|Y@Mhu_>bsX|#kA6gm623#-`aR?)hbcagc42yx`3 z95C9J*^VbzpMG%hR&-M1|Jq<4>#exz5r~l=X9#2I5`#+8T7$&a3vQ69Ra(G~CS|A- zuKh0mbR!}|bggqSTIzj^P#5?14R?Y4O&X*f_Ph4DS8`7`c!CCJ;8bj ze-goDf?~3y>6YO#tWaiH6}{&O#(Azr9VeoCAh-u+`e3e4g(7Jj!XXUKgb7EUuRn#e~D^SrxL{ zl(!r0iaB&)-EA|GieI@HAt^c{46E?X0P=6^NiWfn)vB(DMmaKwawKzD%xYT8di?ku zY)}3BiUoE*&vvaeoih@^W)d;%wKo_x%czT75g@oOw_t{ecJ}xR^iDJ*G z1x)v_^7AJ6N?j>9Ul8#U3`C?x0#Ymhk3M|?CI3iNs0`UI zHKk|k-EmsemtR52A#vvpF-To8X5dOP^Ur$yCd9&q{?US3`a8QmlSf_3$FVB}en-ZV z%OjkYjSow{a*(`&K|T?}{Wy6N>`(~v{A;bnDTG5@9-zn|qUwANJ`w4ctx7_{1XrhBUF;?Vyv)A^S8fW_s^^Xrf+1$vHGh{+d2F_G;eq#Nn+@qB(*(QY^ zUv0hYR;+>7b5o5Rjci`QWEqyg=Cf(bIkp#(M47t6BUZpB=9m$O93TMf4UTNN}~pd2FnOGi5I?JJitc0bihGx%cf^yb4@Tw)S9_q z6^g2~Ici*!-ERMJDn4HudicQqRfEN`29N^wys3qE&~tHn?VfL==p{|Un&elqX;-fq zGW5{nSHYC)DmH_H%?Jcb07onS-R?E&gd!F@5Oexc2k_`s1#x`z)+setznWxOy^ zV0C9IhM)E9G}-LJw2MH-je_IaT$g*_7$UEd#22y!OEyVP0q!y3#~@$*b>5M~V*SdB zwc12ZfmR@7Q7-8!~;uCNERUntzpvc|FQa9&VLw%s7uYA*AX;VUS_Y0IH zDhU#%RPTgNxNcSOO{NQLk(+487Q$4@M1XT_1mhv}6hCk#E?tuCsKMqI7MPOw#OcoJ zo{4fAvF@LgB_pkr8&n3S<>U7-p}StTlR5L86-&P~S3WqS6oNgrskN)t4i;|O=%(nx z-YLd_suZb4%xoiUcgOne5XN{NU|s_3j`X|)H1*rX)Z5u?KB;C&0y1-=DJU}G$ARyN zy)0?-pP?J84rB+O+($)xBp$GX*ViDfe7_IufIL0}EP?X6-lk8n7yyp03AUns5E#Eh z8w%YP_H9`LHyP)kpSp=%iWMB300vCG4UNPUn&2J$zc(EZ~vbVMXik`T6rF^tVyHT*hYB2I(Sg?e>$sP6qF(|i4T$m7!k##_A6gwll zA=3xEJO%ercz^~-b6sdf9Xp8!F?+<-h_Sesd+m%?Yjtr&VR?amQ8)FvzNf7Skzyi0 zC8X`54zV>+*4zAij?TpRRFCybcI;jkm7Yvda?T*PYbqU7$JU_N8YO|8*iT0T zSwV4~6l%8X8!3>ehb-S0R>rctp8;Df3vj+JyW;RkISS{;mB{ck^!tE_GE zT}YoQ>2fC-X*sWU2p>c1Wn-T*_r5 z^xz~{C#dOe(UK=GzgT zswZO1_YN72bKBHJ6k#}%7I{I?hKg&ftn411XhN`D@yy8JaLpF}2RTH@ zRZHCKsViw6kq7x^P9LyHsK9J4FOFq$8MyAM(H#dMOuyS&!^N6|!}p9g&GcN;+Xo7R zzss(a#qgV8pGy=rjV$ul#hrtcdJb62_kzfZ2oBKYaP^gOM6$t?x*&Qn1QoV5ycaw2k14GXZhSKemv^MmP%Ej4?O7`-Fs zA_Gq2#pCCa?Y_6!tkOcp5~0U~x9yUmZ=3#($UZ5k_pA@hsk!}3qZ0cLb#ozh8R?TcoFkMnmc*77aQ0@{s6Eq;bH!Oi?USG-;Ldc?%AafDflQ8%&wVPMP`Q7e`a zeqdbx-%6k`Qc?;e-{0TCAm9-@iihKdhZ_viI}?7|NUOwhK=QtO3b|6J0W1U7qU)EH zt!_5fey8TRoMEjlK4MPdw^RZ`&BpFvi&*?y9y}uP5gV^Kg%&MrSV8+o4g#SG_(FnT z;X6BqNPIrkwM$cv`lwCEvUm+P%8xWa)-|52FwCohyVe%H9KSk>%4=gv$+Gt|`O?Oz z{%q(L6Ibd;?51X%EJvCZkljS2o~GP}DuUdyr%K4~i3Bge=2H)@|L`g;2ut^4<62y2 zwbofn5zjGi_r%(8o$|we##AA=&166#_pp1T9a*{GfvqaY!q$dCA{%RfEv&WtrEV)MkAw%PS81NTM_myRNcq66L>~4Zx7}JST!Z32xgq_eH#X+rdgkC7t z+tSEA3i(b&3|(SLz#yp~*~uwfqcRe-YDPUUC@MYD;f4sMeExKvgJg*s;w_3Q#ol;2 zDKKV;HmH0{%eQ0C&WBE57lc@_^GXZ1m72PCS06XJNBIp!TK~+5{rVCmqJ;6x@L?ri(x1I_6LHnvSN99T`!!J&^QC!X( z+r-lqR0+7-#GzeLDJ=`^zIMFE#wQ0WG7Y?wlcP;5%euyR+S{JCfRUVvMcAd>~(CMeZ!Gl*_HcY4*9EN|}P{!)JOp z+{>P~#>bg~qiJ?$lK){Z8lsjYs??O-+4JF{j2>J+^+D~+o-9*gfKr~KekLma&Dk9ih9ma{iPlzK^IdCErePJxvDSm~^ z!y!S;WEtAsI`+v_%A;f;u85<2+-Mi%1esN5k4)#EisnoPZdORw10xQ*m+j)j*cD&X zMtdp2**{ZPis@eTeho$=JG5YS9V=JT(C?{_DxJV!+Fw4A!Ar}IKz%Y@LY0pXM4~2& zv|EaR{EM1r(H(lfoE$#f&hydJ*Ft`1-q@f?PaNi zH4X)rFqpW5A13e*^W$E6AvPed*lwo{>bjcQ-E>jv@C*v0AseQq3j?BpZ)k#@l=Cu<8Lf%J?xxgJS}&5ezkvl)xeiRCuFBl^|4Dng%`i zvTb7b$BDmVS8D$iyRtI_de(^zdj97jm8-smv&k1Iw2YyrR=LK{rIW93*@WE3Pp9i- zSi8RlRuDgStp>XSO9$i73^G#d9hg8YXL1y9dUJdt??SgAbnF(_2lEyt5ZlCkVmP); zy8xig#4%TKZ(0$>mAHy&R_2=OTh=jWXE~TpDS5gpwMaNUT<548XW4{YYFZX1#%zC_ zz8<7H$X}7(cq@(+uS};mgIHY_1>q~1ub7q`+LxULsI-$we7>ymX>rdiz^U#M7Jg|^ z-1xgHNwM|f{6M=Zp&VDd>PQZED@fSB5Le z@hd}t`MUk@?teXfji|P#-m`C@@ym>#g7~co7%KsW1F#ej6<)V14=-@j2QPPhY-L|JXtmK{@x;1gX zFja(mrKqbGFK6QG^2KL@gjR+b_O0lVxwP~2hwB(Sjaoc8a=BtL@5wPQUrczZ&HC%} zvqfJT-4pXSZfJKlNj6F)Hv&P-{yA2sdkP>HzRvYjwe`!YpSlyv@WtAFh31l2v-cQd#-V}l^2 z0qy9~TL1B)9+2fcf^@nJ>YeQ8JqW}R^@>Km&v{6Qv24Mfxz=F`(0oX$i0(6ttbV+E z@zyw=_bg5dA8>tkeeMtHLbBbK3+8ty`a@KjbC)1Sh0|l4C+4_wuL18$>$B)YInI=u zHaX-|icM8_+pdq*d1{M2J3@{O)N%e!RE`ycTzjH$tYKktMPK)m2VQi<4NK3XBhA8A zz17ss?9}u_jez<1RKZpaZS~zUJ}h_GWMb+i3uZx5uE|u(AcDJ~jv`(U&8k(#=p&gS z6leIIhwUiW;Kt!f(jAc(ss8zB7o+Bnv2!D3bV)aD=48B0r!LnjBiNUD!~C~~y0kcd z0X}E%+Lp=YW+{_|ark+Ap8G_7{47wGxCGof69NZItJCT0{#yOE22a+0g?j$X70I5; zgfnet62oq-$&MIna6bxpfV;~aR+c@%_tj@&RP__i|B0*-T98pfD}}WF(v_NAWN#{H zb}n2IzjD3eBkZM~ll~>XJvR?Md#_6cR^Lfe2~rW zYJiZxHSHOe3^AI+;fVL=$3nFZCAKl8h4(i@ z1HlYpRen!CI*ea3yM z@HbYZ@}ufM1(9?P?>m_NV&m1Gcn@qz-M{mZ@?T*dAXFs*;VxtDK?2Y=@6~_|9Ls{t z>VjGOEVXv21z)x*8=?pkc$v4BpZTU`;9_#==O1d46JN7sY!ze1Dg-iw`96H3XVB|q zg}b<2#=s5wS>i=CX-cwr1xj!#QTL8|Pt&to~PNxKIXsDYTs}%@&%I&;8)0iY8dq^C<0fA&`gpwlIAgqCjL-do0>769g<*ke%$PlQIpy}a&gkUi zhc|IQ6IMkVhd%V1N4b3lWo6mZxRL7c6?-9)hc&&pxmIWv+LZ$aMuGS`{=k#Y%0) z$wI7k-`)L2mH|)D5At^(c&FIj0&j-r>4$MI>IITTEL_ZSp`~JrM!;mM-#Wz8w6=A& zb_V!Q+Js zTm*=3m&00Wa*EvF$9Mnn^6uQZat%aUut_=!$XB^OBaZ^i6Akbd>*iRr;ZuN+<~JR=dL9-1#l-#o*@7Qm`8~Y=%IM!; zn&*F$U;jDRC0OOjZ!8t)TmJnoFFpB7@B(@J*PH!*@tE}gyeYV2|Npza8bs|+*^2=1 zfG39EmHx@HkGiPadxK`@;>j$VmOM<^Y`7#C)NATRphic3Zs?^dB7)a;vOnVWbZc>lgK z;w#PAool16&vyBPp;(EXF10R>zn|fCu-r-!*DtU<_Xs%YkGza}d`>bwL&btw?#LW% zGkxXUigfsTImhP_{U8Ak)MXVz{Dr;z8V;HGv7oN7?RN*hqZTq)Sn0LlfNbHFJDH!^ zETp%bMUpB=sk28Sy(y8HQ98mpN4iWXc4a(7SJWC+e6u{$w(V&+_n3bOB}{4j6~(c? zu;rh_taZ2ff1Zc$7`7LqU-CNsZPlHX&V}`JFz?AIr}m3kqdSnjg5jW*c6`RSDMAm@ zmG)U@ElX#Zb4FW7s)dNx$s|?uE3=G&rSnoC_|j`4%lb<(R^U1##o(7`f7%pIbO20O(r1PE+k)K9NZ}arCx{^_@!kNFV zdLNHj759HwE)$xkOJg*#7t~|E|K;nXsU+FXt4TfBFWq73$#~owibwoe_iOi5^2bkG zQZql{W~D>52=2A;X>!KydT7^|+{t48*D^Lm!a-<1kMlfM<%+_+h$boirCbI?PP)?xtgeql~A=oKGbtvp4%tBQCg&9&^;+x**A0%drfrpbZIIQ3z_T z?iDUgt=(ha|2A-P9bqHmGr&1sKXUFvjx<&OR(@b({e{Sf7jIpUzp*EiH?9NX8UJUXcy^DOt4nSx zidGUE$Dc}Xu+FYXg9(Q42*Lf5UKiHmR--;2q2B*>F%->+I&z@Y3 zVzH??1A15+an;&EPD3p}b0vR0g5MI)zn7LjbDgc^V;mM#c$fwEx(0oxFGYJ@@>wDu zH}Idl%|le2fX4MN#o)ud`nmre2%qk;_=MGc`N@*xHif9{`lUEF>Bu2k>7X_|dsC~v z#zkx-SF{_Nj zeGy`MU;@y7bdho}BZSbK3e8hr`8R;w_-hZAy5i6W!+KOrZt{&A=NFMixb51(gNYc<25ekB z8M>&pd07V+=f2o)@@KV{xp4x*;Wiyz-$HnIw7NO}O}o~;3>+k=6F24ui17w~?*nFU zd?)43sJX`EU~aeZ!6O@^-V7~)#mRVqnO6*g&a0HI;|J3A&TNV;si>$*jOCKY?y1Aw zCWW0Qu9Itp^>V?FlwpmJs$pN`;I(IH`8#fZyAPsbyN5IIK1GZI?t**j+LIvU63j{c znljsBXMtm3ozTy1D2R!;OpN-N{h?*RHbcu6*`&eVq@3<;-QvA5`c1peKEJ#GP=#5h zv(Eu>KG&BYRIb-mXx6Fgjt^5=21KdK&`(O#u(d!EM|>o9ybB+Lo%x+RAD=w|7cT2~ z0_`%k%$s}akG5t3f0Teh6g75ejl(WE7b4Vv-9AH2;@2p;RG)Y7{lwqpEk@zLRtKz! z)w_`#t!s2+;75C>4wq|{*9ik0jguIDqvmg15B7H!ueopDRFzu0G0Wje4qfqJ52KX{ zdT;1KVd%9det1x#u!G~kPnKjh?`+K7miBCN-N&?6%w;#V9&!;9&q(JV6=sT~v#2 zK8SKW@l|d%*Q7a#?&Ld6jO}_x?^xBZLp6rt+%8Y-1x@ChnAul&fT=0E^6?J3EucdsU8gWw8+$dV-4!GM>~h}V(n znhbt-;s4_9zk`}uyZ2#yBM3^jAkyVn5RoFiCI~9Wg91_nr36HJ6ObB0Pz3ZSV52Dz zEcD(&O+pb6=~6?02uKkKp`}1bcsJ)c&-0wm{64?$%scPQ`^TFZhM7>Z_r2G>*1guc z)^*)}3o1^qP{=TmJ(_^gIu05pj*MVlirAZJ4W-a4YkzH9*o3WcBZ=$CPI-J@)ySbXC;2N;#zHRf0#ya;6TE0Fh-<{rbzS76Qk|0^kX&>*qte|C%`f z6}_Q%?-VU4mOtwNe$b!28NhGXOw{vh4hYMovcSY}acOM7(m;7k74-)oZ zRer9!{Awu&oKr~et18^PiMsW(*y0FCIrE~58}@k(HJNZu$B*OBl%lqTNdf18Y4PrK zIQz9kl&C9B-nO!HXc_{8s>T0S6LO-zo!D*_C%Ys1en3I;)KxPj(l_)~$OlRC@2J+qt(s9`H@y z9Kbw#_UwNZSV1CJ3=`Q-JTq;4rQ`4UDy;8)P2;n!_jTxWvIxtze&>WA&|hqO^dMl| zemJ*V2gw`Paq_}*)v)&ZXbt4Fyfd77EWN41B|XpBesf+c=#LAtjFrhf(W#E>$~uQ{ zn~QXG1eQ%V{=RU(H4;>iuOpPa?tR7h4WYi$CkfR=zy9`zcE=B!3FT)JrLYO$RB0u> z$7|i)_ph^%E-R+$Pa{dPphkDJBm7llRnGlT2Fe0=3=L^hWDJ zRNp1J`R%1qb!?y2w?5$to(i_6l(_rvX{sPo;e8FyfZG_chF}c}OEdB}lewR#CuJ=F zrQm!X6KMp6Hl>`h?;6h>iB4u7xPDAhGuOdqj)5`1Yn@1X4Epf|xnvqGnX!-OdBFc- z(*<0x6jfpC$+xO|zj|#s7dWpLeENTXv_YKZb-b`^2(gIyDHJ%t`C+!w{`>ByuRN4K zWnZIXifm1Lv<_$brm*P`*c9Y34!JFeMXmxY7Nu1as;)9gnw?)r zKc2j63x8$c%A0ldeL8pS$j78|(}4eF#DN1GhN$=*#Rs*JJgr&YQGYgR9dUiZy`v9e zb7CTSY^*E;lfxa$j9_?+v83C;fxnLZHY?dQ=7p%<$dFS%nVE=HN?dZOE4FxNM41Pb z3S#4JU)Z825;RP(emn0}$P+>@ZNUmjM}l};94aDayX|?Otnd-pco3c?vgRz-a5JJ$ zotI<0-i2?eTymLld)qlp&!h|{_S-|k_^FRNx9>?6c`^PRn#$y%HO$hgX%cegjQ^t; z$ZsG`XN&aZa{wK0XQwyaT@Y&L^Jn4QCBd(xu2BK?!UL?I@9$MUp1NxKLalHKPc0&s zoC+N$xUGhO#9|(ttHbGElec$`XE>-aD3o@ffT>*U^ zBb6QZQ|BKKR`xAvi0+4p1s?oCJaDQt92>BlB&|h%xcIwnzh6{7?CluDE(dV*HWyAe zSiPOKT(*d`B!itYQQkeg5F1|VpfzXJhvwhs)_ZC2Y)kXIKV~{QW@e18rO~FeCHE!*&nSGa`K5}i>md-Zx@WqT z8u;bOf#neK$lE}f%Z_s8(ka4l74QRvT<2g>n630&4XF+(qV5YEa^uAAtXIf1X(BUJ zt5C{;Sb5M7yRC}V!tyIBh$N6riki#cw>!?}iSIJ=g~rlH1u#eNIz^;^9A~2 z4@FB~w!J+LWRW!?AlozQf2x3FgLF(iP45erH73JG`0mJ=gUsc%AAkIz(!3KPRdm{o z!_YbS{o^-xzg(AZK&_k+CRE_bc#@*WzmMCd>0%|MV3X^$L0Wef zsI5M5{#EB7pZC8noFrBH_dN%xH1E`GJ$3Q6{;tIdRUD~2mUOfM%$R5-Xz1;XK~!YC zi`)pPU%V5#wKjOJ${IX**trexb=@#a91RGDslNA{^t~-`zhB8_q{_o$0#1zFq{CtX z5l-HbBS&QU91@ex0$;rpZQGgZnhOoF&S9WXLt@7zdI?{hpV8uYuXTH{y1Ov%xp6Ne z9f#!d1h}3^z8+zW8oZ08zDk($f*pm-fEc?Vb_DO<&5UYZ3?o}Qgns4tae19(B1owA zdh*1pcYWaGPyl;i(1uQ`(a!*(CT)>tIlC3|BDE1D{UMQ&Bf?O1PU!Z{OaK4j*LCN9 zE`Sk=@YdokeM`|dVCwd3}t8x)1 z5%R$9x8Yk?xd4%+*$L0jLVMm}S0P6=lL5!;(@@`rAP^ArKgW$grp(p&#i93*tFxaw zbJ7zzdM9bHMI~3G+MC}We{xNNavqoj9BCq4H*J(=6Qug?-g@Z*4(u-6nTCLIHr+0Y zO$=%T0<>-(D$6+t?9H{xto7w4{E#vcZ%08w#i0xS6yO_9#*SS6d3`Ro5Hvq zj$B`in9$M{*;~Ny(V;T89YdTTk(#v}FyG9_xhG7TW)E)L=$_{j9|ULh(CCs#wdc`rd(*{nHpaLuqzFDa;Y|P)dl0IL-4!qGSEAa@N8j`DqSvT3iP87uU3xUYF<`@^UX14d8A5? ze-&a+#O=;&jUqA(_mXvXzuY>;4|ZcGK~Pi0k048sr4&6U6*LB9*`BxHqkHE)1TDn|MYI;g?T*LV2PhJVw9 zTg}za^PBtVi`2^hJLqfpFN~pKkn4{<;#5Y|b*srRDP(5a)0q?fwO?HQ-G~#wWm~iR zudW`yB6x&@?aq^H2ajJCv_5me_sC3U-lg`l{-!U^iN+gGsQGs)Ur*QcQts4w6DIRU zW3L7ox7*b^XK5WoF|eYIE^O;s(K6?zZ0)O30+H#JgsN75QgG_Ukz5J2`aDQgKATV+F0`3e4@aSlgD3E^1nUk%_)shJOC<~H`!*8py zXB~*(-teG84pNS<>9{X`v=fWjI=*O8*2f+d*Hf=k^$SXVB*>Ce2l95_-6|u$U2Y9% zmX`|hq*6n@r@WjY zeqUHT=q(1lD&Fw$=PfGfYAzn-3kqT1)#>RKQ|jL#4-9h#>ke@u%H!h6T1~4C^s|QDYaukfDDX{3NH`!L{vbU(bj1Z*%r(5Oj0-=XLH#R-fxx1UOP9O-M`irEemFhF}pz$=+M^LG)dg zbr;KX9vZW^BT&Tego|#7IPt{N@g;Dozy5QJ^c`s>8mmPq8pcRt`g9oO#AZi^V7xak zB1yek7rMFg*3zkdm!88Y%_Gz_5%jEcZk&F`;~+fnLqQ|4l0>u@bUo7D({62B;_^gD z`~{)CS(kE*>zJYDrDH&M60`AKddKQ4JQu_}C-AXdftkDkexOsh@h)MY!q2hxC$uhx z#64V^vKj}=1X}w(ekx?IY|Br5jFu}>xv~q1djdHQ>=M%|TVEh+#H}(mN3I{U4Fb$6 z86IJ~{w-~iJ zOT_hz+?~z@t9cz)<7}jEw!T&Q46-O@e%~APtmWeO?ulAkrL`bm`wW^<_yA8^qFxMZ zSFOYpD4RClJ}V6zdYd-{WVL7r!y?KNJHK*~&*^h}J$%xMhO zv=q_9+AW1u)@bxr8;5UIby#OOL6M=)^dg$CFa~y1R%VZh(U4^BkDjBm zRged7nkPfEM!c|by`JO`I64CDAPx+nm%dc;&#QP2o!6mFJZxIu=u)f!DQudO!23&8BMK5?`%1Xs3FY7iN)^0bfDTbu?|D`p-M)bC2+j=SIXNXrNAZo&{UxV2VF zGPGz>ev5*s-+wLw2$|qnr0pD+s5fj)A;M3n@7gX1w=--B!Os&b)S+4(!F3T=rT|Bq zyP>O1{kNwvKY62ux#A$>5sjJ`Wz)ehK~yj8;~5p~eGdFk|JPnpayX#rP#Vy^@dFn@*H?W@ z598OP0>s|=gZNH3nKk(<;jmLD#S&v+zR)k~9%16_5FStKn7yCx-&Skq?2a$Tg?bNl z+1uroltX)V78XuODcX*@^r;ZTykOMuM*#z1bh#)1l-SgTKTiY1EM(dA1-7#vM{)pS z3Q4e|2cqL!1x;h72D{G+2}`zeQ5i6z zJB~5n*|7QK*a{`yjUX_R=?a5}e8fClw`_3Q&}5MKDoMSvpSb1bfs`sZR=b>uFz4Cr)_ce6g#zy-3DzX{68uf;Q;{LuZax z>?)eowP!?lhNdnP!lTmt&?%uf$wQ+TnJat37ZUe|VQ4AL=xZ+ypyu=C0&kmc!~2pK z2cs->-#AbzWCEj2@ygZfY~|ii1+_e@8)>1a{3u)W4a66Am+;}0(0ufc_^z&%>F6T3 zIb3QgM{P#kj&)_)mV-*JLtYWSK@!K>1~F#h^EycUpMpTdYK-+tL1Aenmtq!~v^dQ|tarVgMPX$E-jh| zAC_lm#0#)N4<57ty>Rb>Q-dauM?xo>5*jDgS}sff%q>Gzp~9{lqQn4>$A@?p?tmYs z!m-nR_ks*iOUgC~z9R{2fm?Bgu~p?k?ff}N8e$hfb0vuR;!x_Xu0hMMygs=^!K9$l z)^Wg(k>fkhTO&b3i|??iRLdSC{OkPOTBC}!fb%*q9qsPh1^B(= zuT6$!&jj%oKWgt(4RfI|WL#MjRTDOTLu?-Bchx$@pzp3qRYli5(rDkPv9SSl$yB@|D&oTChvx%X2M|*V{Cm%!9MlbvO6xFz z1Ax8}_5QO+|l^Z??(uiCiUiA7)*d!S);;IKS0HjY z2^;p#_Nbc?3QMpK*_@(&wI#Yk@=jP5tD;%2hfYf(;6x3g0zlGldZVF^Pt-L@1>wL)qhx65VV+oM8*JWsOmqx;lL=L+Km``({$^4hLY#FTm!h-n6n3 z`R;6g3iIqPSCvWrgWr?6DCsRx4c;e@Jr25?V_mr?E4X-BAH}A`L4p(@_Og4L>n#DZ z54!TqLXswss^{9>8rH@E1d^&a)>?C8Hu)&v;DWqUkun*y(7(@A{V7!DayOn@Xkl7; z6|)oj0A&zKzNvZk;z9A6226M!bFLd7+!NKz0UYD(sf9jaRxpHkE$;*)r9s+fa9a_1 zLF0B#dA&Cx9u*d*+naMqy_7ub4^c?~b{$obTc*3bHTF2N(k$P#=bcdUda>ytv!LN?J{EHT z_=?)dM*f)IvuSnNyTzq$(Qj(Z1{XBjnyQ%06s^pufi>beww9Pf9HeNz2>84 z`Ny{gH*k0+_rYXkcE|kVfMvg;gQQKxqn1BXb}--HnlD84m^W(!H$Q1fe!A8BSKi=CJC8yYOs}$& zMM^6jeT$~->zvb{e7 zaJ)0M-~!$oUaC9U^F3sGDd_4gN5x?ydu~c8MCi&55O@0zYgtrvFDDJU-BZ@J{zd(D zX++x!_Ofv`AaE()81y!MHFEPXcc>jA6N3${uqP}$u+`W&(-8LUV#98?D4{kup1BLJ zA#f#5x$muGZc>-{yhw#|3KfOI3dKGlnUevl<_%5*=C*-UbK4;5QCm1wxxsz@o(^*; zM%{BoS7&!IE%@s|@oC`v-ESex9g34H?$v3dyNQx|EjN%KY2&%d!%leEz7>JX9ilvq0Bg@1E+))axb}Y5%npUWb8? zVc8qT27uuCBe=y2h8@`1;?}6`PQX5USu^xHiIVXaykV7q-J@d2jeEA5Ox=d?fdKeg zK^JM(c68iywP8eE9_9hN8}Nbovpk*}CpGEoHyN6*=l|*w*#uK1;HjKJEFN-qgj?+pH~F04Nj{3d&XxVcIs}cknF&xbCtR>{(Ob8tXS^mSKAWFSmb2j^{fe`1^G&$$`t(WxVGC3 zhx@sxivDw^x*g|CY#e9X`zmKmH3`>VqPzzEP1x-RSWmC5b6kHz?S+rgTGyy=e{>wvh=p-<36) zK>Q!Yi|f^l;MF6x#Km;IlO@z2CQIDXo7|DmYu(|^bj5I*)<{O@5SruG6}SF%FTk0H zdE>h5LS1aaxzs@JO7|n5Jp#B#Jc2O+cKkLAp94?t#$6kDi;LUNIGDwI1h``H`&`Ns z;FQ^KkppaP%ikNu`E`QP6sT_kp9p01TBg!ydqRevo5@{w9uwI81@Ozd$NpYnuibqf zubSMOcK6?y-gP{Et*3m+DbS11gTCC+Q_svB zxIdIG$f=6}mk_ZO@jm>!u2@jZ4ISSn$=iBe36MxMUtTeieo2MYFYPw&)RFGNOn?l6 z7cd#l|IQV|Wm+hY^5v2Ue@!A#elJ|=*ZQB=V2q1o7J->cr=$JZ{<>vR^U+uznZMH* z&>R2ba!(b4oPr~T)}{ArOO7s11o7p2wW8nrZ4?{;+dqEwrInSH3u0&M@a6hH-W@hu zC%sx<{Q0}D1p$sft^k7n`~&^Ke_P@I=WgNm{DOjt68na`pm`aze?Gcs z7u2gw8&Y#3fKTlTv|)&~^BeH=wh=Pa969#SHR%tR)gR3@m0BJyObPn+y^UXcG3(E) zz+tWBiNkEksQ>keL|p`p=al`0`__jauGYs6RXY)`|Hn4;nTYl0up6sf|NWG#?0)n5 zB-Kq=a82VIn&6A>QfL_C*I9A&A)u=> zg2y|@tG(Pvgqj+~h-n`5r~^Dk_K8l&s<`-rCbr-okGST26+Xjht0SL`64xAD!b?X% zrf1H4XZHVILx1{P+0NLd3w(8{8~@%!pl3am(O}bomAR9<#8b4{KP*%_nAKK28dzaP zBFZ5!F27IXaC@M{;^W6r+#E}NZ@$qc0{fH<9l^?i0br(aoI%DR578we)|#~>S%Y3R zzLP~3xh5at6Fy}*QUAHlsxk+n+_~{9uTO(Dyr-~-NgtM?B1g*iZh(RJ8F=dWh$vrP z`x9-NSblkUy0U0?dQk2+jyyABuMXK8#h6$Kn8uN6h*QB6{ze3_(${)1iW|7lmv zb_=Mm<&-o`xOc)10yPBR2D>%W4^3c(@d$EoS9f<5bXpT$JlMCM;KFFvK zAxpMIz9W^Iq99J3`nlTN>;+iY149+f@=k{xV;IM`z{+Hx&(E)~rteblPp7<4-z?)! zo%+{3nAxQIUpR97vVTj_-DiD5eAXt!n~}ZlfAnnIFEsFG*$IN7@T+Tz_xPdtdB&pZzvxGEguXjuRqDh5rmbIr~;3&<)_44Ry~R>}03hcfZE z=zfWM)UwGCqTWS(VK!WEH&=uiF%K2k+3rS$52GJPMRN(DL2eG+6`h%VwK2m=M0*H=^G-X-Vu zCu_tgHuja0hSiD&GFE5kRvxuo%#U|kpOU5>dDiTusR~1uH|>JyE&FO|j=v+t&lKLL zSq|nXIZ*}59Y5pzKn_vECB_Jt8v#I1vDSgV@}ke*L=DU9PR49jRLlvNIJjBchZOoW zE>8>oc;5B=L$D{g3IXOyuY+tWyn{QzX!eJtCt%jKs- zv7i&YHDF{*#3D!-+EnGA-$yEYzV z#_e4pygO*dhOJFBIDWDleQS?G%02tv7?|`y>#xq*V8Y&aMIYQ{6?P06No97{$7h@W zMM%Npgn{kO2vbvVyJvSr%%1vziAiu18`qfDLb~(bmg(O8H!`ODDr{511Rv^phZJEb z-@?%BLFenU)JhbyyFF3L&%XX)c?v8N&m!(Ikkftb-;(4=&tx*o4EeRrh|2`+<|z9$ z|Hc?7^otv{3@hK#I$pWr2k|U~n7e?Ds5r?fVo9y5Md-~W_9$CK=Ny&Ffbx{)2Z*Rp zzdXQgt<|9ZNOsH6jC_pPiz^);m7?EH71FlKg*+?`YpeHKNg5^cE$p-ymlDE^6(>IS zf@VdUVn|hJOl|j1MbJ(&sI$cC0q6F)Z%omlDJH!bHILy+*YZlhP}>>QNjIcBd!qQ; zBKEAglMv7JV%&5>Bh6&fOQ9^utMqzuo24nu(Y`*|IN6z?wU(vO$pkJKUl9L3US%8p z0<0X1dx4E2#B^=R2sK~DyMtkRbL8fAM2UOtkQ+umyZ4AYZ$8-;V=3j`FrnHTjPVYw z*F7D?5A;uf6}r4NRQm<%BD;)>e!MXOm$>I;R~C#n+ATBr_B?DULI++juBYMX2O1tS z<%21FAsias^?kSPgY6SqkQzjmen|o~h&-Tzw>EzLp97j>gLmt~*vi0QA0vHM~bJ00q)2~e)^Qbhj0te|0~!Z>u8Hww!9WlE~SF^eaW zdravq+L&`5)GRV=h@!mtlM3*zF#_Sn%4GqVE8Yl1&8?nJ|+!fu}MV!LGi@8v?JbO1Qp{ zP6n8cg$x!G4+#{^MmmF@>*1J(_57;9y=X7V8zUl^by{%$bZaZi;nO@}jKI>d&Y_Jj zkSt9p7&~TY+TuyPdd#oo$#cLg{5^K8}w(Hb-a(8m|6%0et z6|8`JZ6@0ty@3jhRNA7KckTe+U>C$+SI_F@js@fFURN>+n?9pzt*?XRUKt>D5J4ZS zw;f;k&?-d<(|8r1n*6x4%Q=5L9+SgRoX$C$_cUQ&R>G1Sz2%~p2GXpg*Ed(n)o057 zB(`hn+GSH_Hx$|Y(hgJqx%WsljkEQH4DC}WXy=HP07~9k1`!cKz8`jbN&Ief#H{aY z(Lp)4?RIEl!&XO~*LOxO?|F@zBEV1)62c&^Xl=d@0{t0VQ$*$39M9f%u(Y#@ZkuPa zgSVLal=GmQd|4e&UyVg>X4)(xxwKw+XaH*omA|Rp@blkgttBx)9KGtSvzEFY{B_IL zXDer~YPMvzzaTu}CR&y&=_ue$Ko>J7iA?*{M{{XznTMM(l6v7|;AxWt+oQlp({WP# zY&Euim|^XprTeXM0yRcb2-WVbQ4Bofy-tYlA)b+;p(h()19q9Ze^C5D(xXi{_dys% zAUoiBVbyLUHvM%Uy{A-?j}S1V7B8-)d}qIdInE^&AqbI?k1nF6z%nD7N+3hl1-$xQ zS#c$9J+`k2BhmPw);rInuE?Fq(?>yzhP|jC{BAG~1M|6TxwkYT-|-~NK1lXkyAhO# zTVmc%8!tqy0LdvHS-y(}3pE86)@f6Tc)C;_LiEh$<+A#34VNtLe%vS%a{G%{RWJsCWr)h zAKKMpM5mAzmz-O$vbi^ToUjbZ&@v$4n6a*<{Bp$TL$khhjW z@!YoaF2!sggEL72;BzUyQpW+zif~lYklGp z`FP3w|0X`lLmEKngb=ioG{`tI%4*k^2=^R=gpP#;@9w~2@oXKF+rnbO!*O*Y2jH0z z+41--WJ@8sA<^E)*_UatX!xjQ;5{pqF?xQrUxi%OY>X35Ammf&o*EAZJ_X5@E**$nc74Cm5V|ncRP?(AjlEFg0CdeaC;cN?VoR`T`-pNTQIkX9Kj+OWf#kq zJn+QpZ_cH;0z&~fu&zLzQ$%WY|CR^*c<+bx*cY2`MZLP`3cO&C3MUJETHc2m^@-+j zjfKA~W)>8lU8<4~FTLZs6=f6jJgmPs8!i-kBMCgIBB(RZ73Y1+wph(vgO3hUnw6XM zmp{gpu16DWb_J~k!WHW_+U+na>`tX*73}%@c>xEaJh)$NXT9c3tIFX1^lYh(ttyqX zkekoMh21CS+mM^Mw}ph%T4CYENR<3wa72$RB+ACRtfYjkt{x(DD~)D5>ga;L2%D^h zs=nX?M!|ts*N(v(@Opvo7sDqT{IIxAPC(5ta}^|eq{#o(f$2BtB72HVSt5w65ocm& zPj9Yz2yruh;?hPZ^=$oug;HN@*p6_8-w3s4x5cVX8w`^d20^{zWp3?nPhZK5Z7Qg0mM8Q@UWQAuD(?=8`^?Ger!P{NY`B+t!+v!<3$ylcLLSd3IG`2^P^D@H2% zpHdoDHzrxhVB@xyeXrAANU|)N6p0nMaq?w-gD8EM>-#NCU~Mu+`bxG>kGfEc)q*d- zH7UGv-RX7{De~4aSC|*0|E*y62DLz{@6;HzVK9(+p|*li>)-@mur=jIS_K(AW`fa-DA;4GuKZT*&u^`4(uLI`!NrNTLu~CKD8wm6n>e=%>t-d=_pXlI% zktwMesM(d~IG`h`?Ef5ajGK~)or?}~E@V-E`5U++zlyx~ULox{Glg|e8a$FzsZOk*ozI8r(5>$nKgUoI$E7wr>bV zxANR$dN<oJwBFN_Gdn(VhzgY&%*} zHgW@8^4UsPPFa6Yme7Gj>Yl$129sraWMp`JpHZ}XWaiFj%{p*z!qmQ5yZRQ&-}V`y zgRz;ktVaCdOjWsc#}gHQ*w41 zLE{e@OBf)gQ>i%=v(7jHGp6e!}~5Vu(;I=;HmpT3fQDa^GFc0k)5LVr>E zb9Y8CA6gLWdRbhoUF<-q#X~zv*wlBPK+098D;cN~NpBsl|7T8l`4|i9Bg=HHfh<~ncUp2y06?^!b=Pbh@`@qnR_-2pB z8_wRMUf@=xSIiYzcKn6WgD##rMZCvCo@rr)a*RO2f#7H z9xHHOCSC%t%rkXr~$Q9^#FA zG-z0t%pn=lfhz9%$ycY&E({d~!K|m0_yNgF3s}Ju;$h5O+wSvu73DR|z7x|B0bo_b zJx2n*4OibChs6mx8uI|2uGswpSq*p|Q|Wf3k@r|+C$Ip)rr|Sw9~=+o?P9WinIbDX zB;gmkAJ#-{2Q)BN8%R*rEVKx$`%u3dE5@j2=!Eba&larK`p+6fnN=Rj1dB&kL4Pw{ zOpkUMXvN=421eL_fEyE&NGQyNYWC)u0c!*zE7;eTd>A+&sMpjj{CzOGpUze~)gfSn zK;2!nX=&MqDEV%W; zlvaC7BPX?kS58uIY6tyshy$|oMa2n?^UhLS{<40|fa(21u|Yy{c9~5N)~+Fy@y1oy z(*3_FO8ES?lEnuuASfLixc8UIyziw56Lt@V%8R7?d|I0YMS|RTdh-v{l0YQyh#~D3 zK5gw`>HOuYAx!EfTp3BGRQQ;8d^Km*#!oS{7BNyX3Z^kLGm%5L5qS=~5JG!&xM+VO z`POhE^?F1GwlDG1j^q#siOHwtJI{Hcv~NT1&VVS>_D7JIyI(eMPX*LD!t&1^55uA_#-Y}A9g2@O)gfSyXOrT|W>gZ~yaBv6}5iS6se}Hju z>xJO`TZfc<#gYRNVF@I4(wdnD|GZi-pw!Jvn>s+4=Bh+5*1X(rq#7ee?%>J#7b$_a zHLX-QJ?ERenILX$OjLF^S8yszgl4v z6tM1BRNF)?T__VCE#+ZrD*ktCm#yiW+5dA?bskg&Nee-`HIUHn5hO2IC0M`NE1mT3 zkO&^R;}+8#2;y0q*agP+cKi0mzzI5^Z*OItuHm!-=buEOTz4&$%#3G1q#8>-WYvyA z++)IYmhwKW>?c&@g+7!YjNT&r8pKgQ73132>K~Wt9uWdwxFMcJM;F*y14{75xAn=u zZ5!nVjxtEJrF}BMc~?NMv6}{12tX^R_4GdXjEtfspXMy(Ql<4mletSh`ek9YHyCHt zLX(!{tV+$&c4)}%tjntF+S}j0v_30HnM~L|mGN!n5%jt}+#d04JP)-JX%ADMNI8m% zo^mrxSVtEwyFJ-iho8ahV7=+`Vv82%{iZ*jrS{ikRtdwxR4y)v5n(RNZZ(^vE+b&HZI(U6(&A! z`=Gk+XltiP$Vp|W2rP!-jFXFHJvo~|dXz+=n!>{P#fYE@dZS*EaNNdFX&hw+`%s)T zcvlKGgrQWwOx|;r}r6`KK&tvaICEZHO+Xt2Aqyq^KKja}>l*9+D25iMBs9Pd3NE-2EZ2)?O|hwb@6^k@ zwyFedMckfb4jBeO7tjJ3w;6$%$H2yRh!!DdKiBG1Z9pZ{teQ+KcRTyLyOC{A_O7t$ z4-a2Na<98|fsmH3eY7Ac)!_ska{L6O`c}q>I52@Q$0_kF^^T?sq6vMH?u5OyBBfRr zw6FAEGYkCSSkm$M9*-NQ&hQIe33BZuRo`UM*-a{>JyoLXMaQp-2wpRg=UmYWX1*h`HrcWQ*M_ZaC}I2S7f z@qPxvsg?^x0E(MYC7n5nWTt?u7(G;iAC%yns0Sv*)QZxGIXNo0F^KApO;KfjOGEkU zPAyNARDLKTx4X(F$eVpoKQ|O2IIABP6jU8AqH^vcUj$e`j*D_yqAQ4f9c*>hOC2th z?9Dk4<^Ows4bv$QtaW*LdU}JciOz~HMcf30{)62X?R{r$3Qmr}3s?jV$L;))#OAKG z^|G=gF6F{=sV6&Fy5jbFtF7Mgo?al27UP=g5pT|JlmDoozQx5MXU9`mz#)IH{SeS@ zzL0WZPzz)iCI->{8JUguo;RaYX;!1_R}tGy_bxFkW&-;%D-#MMx9~eyOTD)WLV&pH z;(7QyLvd~uRpEpID*@syfp^@6%>|@@+V$TK%EbfNK zqLkEyGrKk-ZC?+}ni4#>Vc@9b{zh4bmT5m>@~>{-qg4)aRxA3lXGLU#!wUY6CIrcx z?~yTP$D7Q@{^&A`jKsf`cLgjpuR6)ev#0X{*oIS8qZe=2DNPZ_(Y6t9tG7F~&|Pz< zH#mXT?=68`v1o4cSvQ~vqPaBy))t(uPlG)$COQn^P#gQe0W3V$4Y_4hFTZn=epo*! zajc~ePpd(xor9ux8a(8Rw-6;)z_9e_W$`YAp9o$h< z;Lyg*+#`E&de?}@KS0&PAr8hRxl2N?!2olLSbJC3B)4Lv_TGo`mVaTXjXF%?4}v2= z%*{YKRp0aZo88~*lzQU=M*a_2>c6cV9L;I``P#VUqC*>tmbgbxlvd3v`>PpM?g|{o zNR?05?OS^DPL;la{D9FeAyb>sYmf^UJFNdD&q?0LTTKK>|A@ z0&Gp667$go2@)+8P27yhz&<@E&ZcL_WMbbRmgj4{-+9!wE+Ct^-G@YLOog^a(i(^{ zf>|xTZ_eGU0KHrcG;zNVVd!o~w&)1K>pO_Ab_oNPO!{=i6eAe4dZTzzmxWBYZ^aE% z^y5U_&T#1g`DaD@bz(zA_BWu4H~#@F`J0vE6gbaORXnOGn5XWK3nzEwZ$rE#KY!!w z)ODPXz9IVJPq&6b2kL#_GI`q^b;zk?Qpd2`S1Wg*o6(&aSa1W8rwFyi?5x1UOPANs z>tPH?Zr|6^%X6Y%x8WyqMaXUzmt`_odXwXr-{=PN5Izu_ffmDr;TJ4JlQK#rB*ycKcb+o3Wr7mq zlMImlV|}v6^G-Q7mY(#FGA;E#RF*0N3}2&cVXGC{z!`H_x#1Ng_x0SRZRlak~1Kd;8YDU*W5$r_NK$IzM!` zB8G)A?u>_GN2o&JKtlK9yF1o|{e6_SUB&SLB79_wE^;(s&iMkt4 z!8Qt!=Q33O;4aAzNq}tsJZ9S%S}x)L^4_i`6 z8S=j+Dga!#NSlkVi7O)nDmETH5VVkq+x~D>y(ky{sb-2Xwz|C&jdmpo?U&nl2@aXX zsL9?MMU+=54!>W8lTOWD`_O_E(A~-lB4fANy8f^B&O55ftlirWpn!~mGoq*n$T*4= zMWiXxaYRJ~K}2dmq<1iYgb-AaaS(7uX;K0zEtF7$AS5bkhK^D~4@Fu+C_)lQ2>Et& z<{f9=Ip=)mto5yR{`mfowNw^7dD`ClzOUc4WvfwG#Q5yA;o(c9{o&krA(?6(FrlRx zxz^ix1vwNlt&?Lvh6kyHk@2hT3yK_>$ImE`$4PDB8lTCXwQPAY`ni3$E>2PhCLf`C zeP*y?S_#{ zttjb@Q?8VuAzf%vd8cTTg@;1TBfldte4+gS@}?R>)Es%)3zPo?c6-j?Skew?h+%<- zH_snH^j!?SC`@iytSseRoSp8EeCOW6?=BFtQa}K{jLJXIoto@%^~UDJ-^JT{)3Bs#ZEhM{eyT&R4kH9s%HX;M+gI?FeP*#_qrh z(w0Z*Q^Jr}1g`Kk3J|;NzoRCX3IWO=;Q8AFS!WxvVd@&z`R8rW6%5!=1I&_n2+UF2 z+7BCxv3h-Z@shO1bXbKPI^x5~&1tC@V6RfcRe!Kwne(Aj!{&$QYPv3-ia8jqe&+(% zd%LlyfDE30EmmckPRPMddZ|t2A?>SYlSn^)P69xXesD`06xNkz|G=ze&9Q!}Vu)j_ zQ5<@MuJXAJm%b2r9b3Oq>JU6^3K!hi3r5NHW;)|jBDrnzPJaS*WIHR4dS6<#9nV<} zZ9FNzKa5BDgNAd>jFE3oY;$$Q5@-zeJxK&l6;xm^&EM@4)!)xiGs#wF1NON<``_sA zFRlJQ3;CJ+NmM0!r-;wY)~F}P&|pwc<7#gzun~IOi0bE*CyVo6K$0I@Q1+GCC|niF z_EdvIi@zD%F%mvz)q7QB@>(5pX6J^%SpT%rHwN{FmqSOhDc5207`pvaL8akXoq_h_4zOop8xR@MVw&*lWJ*zCY413R9%vm9Fp^1FPD%wDq~8fWao?OeB9JZeQKJPZ|N!|Jumt_#E@ z9i=0^&ld*2bOZD8sjhCmms92!j-IJpad;l?a7nz+gnlW-kW*x~`CCh1cmArp1o(C# zG~Z${nr)w2jRp9nYb(*g>jG;$|&4OF-fm!9+&dPmd zl!BvUdJxq4xJ}!;lr#F4^!k333eD06vkijYnr}C+guJfkH?<23XIIRrEJj_|-}EDf zv(5uiN{jL7C5zMhVmD5!@+)jj#SC7yHHFGf5~%C#m>poiSgT3~(6aTP&@%rQaH(Gx zdFW7MaFQQd+NA{WXtMxbvTd$0P1nFpB%HdN8@{vGGQf;aw{1NC7+Q#}{c$>?mw>@w z%uB5|3+kv9Skt?{^6#37+e;1<5P;!)kH=%@hB?bG6xh@P}|C9iYnu4iV8q{ zTdjmvDib*FcR}SZZHu`oH)fGM)>Y!gZNA##h;jq>rVzBVw`*$@H~@q&pVwWzo-Us# z(3{bX0bGzx1$j!`Y({Dd$v^g^dU@x5&Qv#GZ*8OioX+^f-+sXxZ;H|-is z{(L|eO}}7Wp9$xmf=yI-VZ_xRtqrt7x2W=kVDK-s#2g%!s^+k68$|=yE>sn{S-t`j7Dt-OL_q@?PHy~*!<)49K86UR%yvEmx}i_Y6{@2 zrhg!>t3L{f`!6&w+uJ@&gI)+jZ30bt?}K_0fOcbceMb=CQ}~#Vd`#!v>tj|qdSU<@ z88eVFsuX%h-2CUy%&w(VNy^&fi<_wmxBd;z{0ls51Ns-$V7Ih`jqoJ>=~C~r4wAUc ze?4Mf1G`a5CD#B_ir)UL=vf*BFV%9-d{HV3_w5V$XCT-@JiALN-1fZno`>go27&<LvzC$ppO1!G%>EHT*H3nPZ~5Tp&WfTa`lz}qZA2=)DOOeYxDh-6!m*HB+ zY6%%M@M6G`BiS~@1gS>q27AFjQwuJFeG-IyN)r%0vEO=^Wi4q5-+gg`qYnQ|q#!Q& zL&>u=ZpFWI&^w<6gPqQqKTt0tZ^5PO>c-)FtDZB$FXAv9L@u^wt9(WcXg>5gB4|7F zwt&1M0qg|;nvm7BNx&jin@u_zV|i=d#-ir#g)GGUo`ebCug*x{u1E6cz(c#`uQ>A` zZ$ew*D-$2I?haa+?JnxNG z??reWiJ>AfC|@G+N9u8q?k_4VEC=tN!FTbJ0zBPF?!cE%mz^~8KWCKnt&FK^0gkCE z$~&`*ZqywG(Xx8R@ux4dV%aN>20S+Tqa5HO_H8U{NwYwc^_8Bor5+w8t4}kLk~xwN zFltsNV!l=*=;K-H`=`dM_}E4AMicpAEX8vZza{}AZ{8IEs( znzwwFFY)?Kxz482t)EvJpZ$;vw*{2k1B$@gS?wF}NI`oj0w53#! zRr=+VUrw8C-m!_x-ygm`9&Jn0}@{9J+J^Ho#LA$LfzoX*T9n3@5 zm>Uc4Th7Fvl+W*uRB-tH;Ynh}m7=&CvO`QTBo4}OSBYB4Pfc<-z`fd4d0eVc7VrI4 zAj(3XPk-|=SSy-$+(AfFx{8EY;f%RG{Gd3$@<4~XzRY;D!>n(c=8zLnD%9SCO4DAQ z#%_Y_$edk(}4}jPkw~ex5|dw14duolATN024VEXAdC_`qDtGg+1mL%E1H`z zP;jJ$@5|FsCE64vOgTueeKKZ&rsE!I8E30J!~2`cf5A8pKw%%VUm0MERm300T@p5P zu2&M9zPV~vRbm6}9F1ciK7H$zk0c#Njr1qAigL3gZuqetr zCYg7;%*=M7j#xnB#A<*=f?bcIkQSDh#mZ{4Gw1Hnry_i{-X%IB zUp#a1Riu)z%3l5C2++8D)*RJ4-`U6>+)45g0sJjgAYPgV|KxmiaKr}Snh_^$dUu1B zi+HPLUq{Nv_(E;TjV>HTano+*!{ex>%^|ZayE%&Fys%&24RlG}T;0AHt{q|u110&I7l%Qa-K%>#~7HO+PD4&9KJQA#KJbE-yb6_hZp5tgn`pjorXPY<{6 zL(+S!eaGM2YYOMVtd~5mlr|h0t)ZCtRPnTptuyXbC+U(>xyB z7J5OCygD%9{TmKYtlK36+mwTd_Xpn+AI?>qQ1(`$ZHDr@;qgQV)`WdpyUDaf&5s1)wU;4m1u*-ZGo&T^*olIB5 z!}&&wNmB!6bREGYiN{y^=DZp~id9se}k2-W{Uj_ zCH*&Ky2K!4PU(vLgmcV0ZWYaS??N0;O4SYC9^92V_}k{5rcdw8FF?o0N)cn zQg_JNwta~6ZG4CDVHI!I2pwAsp>(STN02{RS>M$fNTKBC{+Vb>$^k+hXR0nvATiB9 z_5z{jj6cil)O@p831+(QdU{Z&1%K3IzQwXe(aJ454)pM+(UjA^g_Lm72yV|9X-WbIfU zD-(I5`#qaSD%e<0g5IX!qXRmrI^H9{4&kKNfA**51S^Oa2-T{a=&`v!Y8zd!?*N^u z^w%Cw{nphalq^S;$fIc#X;crp>3FrZUf}a1N4xfuI;}eVt@2BcH^@{j=>@UXc2C`L zf+yWH?=T8mD{T@YMRXqNIVw6_h|)X52ro*}Ndtds>PpMWO%hYMN?OHWKUFVi#GMH( z)#lvT;L=&G+C!JuWxnr*%e?P|oK89@M}0DY%7Q%pjpwZL0i}-K1ZKvyK~B)Qc7}gP zjRR?`NpHz%5e{vo=Uy*xbl`?NynJHaJF15Bq?3!&f90ir3p=z9uCLFhI{A*kp0Az4 zpvS(cEFNArsMUIr8JSvrGt_zYC_-|x4qcVIzS$^<&g-f4`pt}|_`GR`$+cWVo;g}0 zJ6-=^aD+f~l7u%Ae9N)w0DGahq!by)EUW{ylw3>YXGx8{=>%MNeo9Rv**~LV$YW~< zkr|P3OxQe`Q)#dd!TP2 zIxIaL(ru6lr1=+j<>cR`-HFX~Ct|s-sZs$$nW%DSYh-G=Y}s^^^+2jASFYac1-q|D zW2#p#MpyjszJ}SvT2%bFsLryeWc>~F{Jz)z zn9pR*d!HLcZ>;3Y?wiTc^M6VL^jmnm%trXC(kUZ{dYD)QeU!u`(yL%%cN&Id3{4_3 zd~DXClOre+X`cK&RG>SL82u$cbR=Idnn8Qc^{HJgAIDeuzs0CCI5POXlp-aBgM!KC zZzt-)W%L3P1#aOxToYw6SgKVz@Gu=29t07*>uGLWkmO_f%n#K%BLILp#+=zAmr-Wr zz@t7vKz-C~W&iWkSX`k{y%$w=lfw10&@sK3cM&ho-MKK(E?RK1r$yp;*ULxDhl#8b z#UE0SSfZDrQYfoYFbCHqwoe*~X<)b%Ss@UsJCjE}Pya%hSN>q0(HPn}S zuOKfHEz;1ZC}vE-$F-yd)i+#j#^*Y3MIRP z@}A#(mh<8z<3X@lq_`W+5~bV&oN6z|rUFm}A(*Fi9UG&rFSzMsQF?dE{E_kHMTEw% zrN`jHk@b@LpuB$-ilygh4bEH_OJrl+bAE9pU44;iW zSE%nrGd!8s4tm8z`>*bk`mgIhVX!cx4gIAGwyy>4_BM|Bio?ZPx!IXu3^& z;}6pFz(13o#lv~~yaox{FJ|@^@!V*?X-e-(oLEauza4@%G!DtQK%eM2HLjxBz*I5A zPEYE#r}#=F7KY2bO=v6h#YgU*Fsk*&038deL!0?T>ZC_Nm`>n&Q&V_+4xq|j;wfJ`9ky&{wRktN@A6w7zdzC_&JuF zA-(9ut@7-e%S~~tK&{52%7A9-E)u_jt?>q;ymj3?PT)^RM62H}G_GSoic9hM(P}nwTO#6N-^Vv+u)Rask^12)~r}u12(l;Cwn)636dlcvm)XD=@YV>K>lO3wj%78^3n|1% zx3e0Zb)NOyalR)r;x_ox?K>M$SAiPs2{R^ni(kq3t%@+aiaWMX_zshmbx-6nyeu2m z3+-*ZvYUk_Ze)a^@I2BJFJla+C;)FExkLF>z%Ej}(9q=$A$CSezM!Nf{h$?zNdggu z$jlV9y8~&4ZI3%j@t-Lt_OrbGg~v`FX+ZEu&lS}UUJ7|YQ#wLzhdSeB#N^b-|An7y)05_{EgeWaxUJ4ffAd?F79 zDz;~97idO8UZ>ic6YX#QJ)(Be-gnK5OfzftvuubnYSif^EyaKg-+PymQC()wD+m1Cq0 zt!T&&RDY#Eg2u^ZM+XOA-eQ%rKCM>+7W;BlmT4Zfqt6`xMo^if`Cedrt~E3;tj)+< zI=~V}Ai~nV?(%LG-I~<~#|iI6t0K1V`(x9zb?ph4u=H*YnsKx9 zs3^OzgmDiY*Bo)kh+y4Da`df7Mo4e-L?Eg|Vtvq+V95!YMPrfLY^nBqMkwJ?Lf(ydEuy~ zO^QrOf7j2zwr{&-&;S4`+LUOOhF*Vtv^U_+CYyh8#=YvmYHL*aet<^Fuhsgqon;F_ zBLd(Zm9IN2Dlc8syH<33^QE2qL$oTRU_JM??+VH=juQ{ORQ{W^==~05t!5m`Ger1k ze)BRfVwAmfG(OFh*r2An3xNMFe!P&0N&K3pb{n(M9_dP48FyLL&BsxUTrp4kg_e8b z3o~Uj;UjCM5{D(e0M`?lUjf(I8>OY$FyL(Mv2s!_g-P&7*_r%H*6_#DMznI-Q&4~N zs`$sQIiv_hel)bR^T%2Zky-i9d?(Pc5KD)LdUT;i1Z3B(eIRqX`co&eJSleawjHon zif=4)!m)aCwk+n_G`i;19iiCcGztH~R6c!j@3vp`I!hE^PKo`(X^`HfSezfS;be<^ zTjf7x6Z{Z~G1b_eIxK-kJ7%g*d#9>;#ds%Qf{AC*Qw?d)kU|QKP)Yz{Tp8a?m zI~VYwsm~0Ge1uH}EDDdMdk~%p7Fi&3DLWM`xf_Xl)P6eTChA; zySBg+L65Ig`@baNG7R|>naK6mmdSoDN)xOQ9_k}e0Ojga{` zjz|j2n}}eaW**eKn=r`~Sz5{%pzdBmMx)~vmY1!f%w>NBLe?~>0q?f0TPb>kn?x-w zCylJ1o6oQyeFFgnolx(!I!#L(d_cB;T(f#*CF_a}V?-H_o`!3mmWZ9S-^c1ILRV5I zzkz;ck<{NXe_cy>8p#Q#ddZ+JMoP!O*F9MM478doSIrhq!724t`sOWs?o7S{-ij;P z@QSVg+T(70h`O;Hm31E(_>(`8eX&|9D}4|DZINCOP}I)FRwKjD2v;25w7X_oOD$fT z7?K_mRv;;~y!RBe+wCsG{}yfWj*Z=l-C3R^AXk@KJQun@nRQYz1G7g!J=h5s3E0f9 zVb6Q7QGj{)uV_yx{-|#^C(ESnbGvAoOp^Vqh3m4obs|2|Gvk6wVxdaS^UQaohzKwp zCz2~%(hAEB^EnC<)roAA9@0$@dlhM>uVO~B?FwR*6nD=59 zTV`t|+x6`v%eXHv{Vv8I*d$r=@+;HWK;UxSmh$^@Emsh7Z%qY@);&F%&~72dcoYo3 z2U53#rHq*b^S!*J$uaS>83olOk&VKVWXUV5Wz`@IU?ooJ+KK|8CXO?uNhnYEtCNqe zx(sH7FW!klT4bzHJsezhU!4mK-3GEx=2eW@B}tvL2{KpRsqdy8J?yXpz3j_m-fh3H zw~K)k)Bg1Z=>G-LC+YT--5_B{T(0iINk1XJf+WzeE2gILpF^Y?f#aunsUjL^s*1uL zBiCHnED|BBxG0Dx#%;D*&(_F`E!}v~$1E(>+ud74NX(Tsln4g~?p(n#3jr(4L#h2O z$+?0>-6$~bxfCv&B+X`2kn(6xQ*^&=ZxVp3B)NCkUcRxIT7B?36uA|L=p3X3s~oZE=3VnY)GKh;@jl+PhJAec{N1!v-T=>r#@a- z4w4`>CHQOg0B|qTuRrj`RlK+P@LZpZ194NcfeYw4H=^CRah~gzt|HuXI8!4~n_GDR zQLw*QB?)vxfpEj*KC3@wkcD(WP1m(44~29XW;MRp&5V zNy4{60QQ4dkaEFhspYGcP12R6A?4k*dH46KD@15oxIQ75%S5i`@R}FSyP7~7M~+(f zSr^@WX?_2R78z~!9VeYP^xVjUlA`wuJD$TDI&_uJXlYN~xhSpQ_0mfFsRK`nD`3Tw z;=U^6NpW{uUr2i<_~ug*_(7A?7}6Y}49;`nR&r)~u=0KnkL=jCIC&~GrS8l&@o+9Y z)15Lj&Ua2N;qv~AOwqd7HI@Lm`AA86F8hH`pIHl^x6NqxcP~LPVRC!-G9qR*?BZt! zaYGZx`u79Z^z$C2sD~FbuPOHcjh8nwHjN+IKmHs^S%qw|VDznES_8Ja8__m83f3`z z*X=H^(nG+e;S-F&^zM+{E}uw{MHZf6gE*Q*GRNvSvjnN7e!Z*U)&NW=uLghi%D&Vt zTx?+#OjdkznK3e(i%td8Di*5GKnWL$kCgA!;#Yd_WVy)3I* z9J-ZL@*2^!2PzU1MOLka1zxo{u@kyX@O4B>l*(pE@V)c}A{KXAo!eF6%=sI{=*3_L zhvvRbm|P+ylfH{VBnv5n2HdUA=LBF1D9^Q+Q5I#NjN#w8={|Gk0nx=-by2=ussh;q z1z96CQ+uFBrCk5EZ%nw9Q`mzfOS;IHiPG`-duu1qU8}ahh@1L2F=_3Dt@gV;*t%b& z+%0vg>70>7CY9syg4>$@8qxFq1e*CRIuYlBq0%d=V8qKW=5F#$7L*G_0e`Q3c@TY< zDxXFkOArFtw7!5pL_@#;bF_ZZ(5~)AAxLoIE-GFrE(3BZrA_G;KrIcv8+j!ibQIL1 zIdz$3-&-3mRGYa@%&*67vvEKKBlCBL2iereR&!S#u+vPsgZ%;1PpEqtk|Z#N-f!WA>kS$mnmaPN3q z=ZGL#cZ-2?eAD+Td^{gz{XRh zSjw^p)1ySI_0W5JJp zA5wq+AvymXpvZff0Wf=G*T66{_5{MHfu$$Dv{9dxP=c>OR&5dx+_ohLA13bdE%g@0EN+#(bG^kK1JNvJO7erW2YSof-(I z<3Pc`rtLE=d!)K2WRRHe>*yCYmc9LxWuMtVhxWDQ*4rY`8H0v^tb@ETdUi)~ZV-Re zpd-k2eo*?w7p-+5LMAlg#$#H<@Jw6F8A7E~oXrMqRkz!3A%Zs3dB(TLc*q?@HGK;I z?%=iA0AgA77Id=Ul``d{Oq$Q`GIb&7N3uiP-?Y+1HBpJg_xIkt9EY;s4PjFBk|gC? z5?bE6ME)w}zRc2$QCoOZogUH_LTa;B38fZrco4o{{&)%mFhXOzuTy`~I z#XN@362A9m$Z75O=E;-0V4IMfyeu6=?>SX;?!c2UkP%R{GD+n#7oXY@1JW@rAT`DS zV)N*1ALjgUV`Oz34w$F6zwNpcAhwirplzrIh;$c&&Hm&xJ)VPN&^2DIR`|nkKv!NF zuL>2DMi+n51swGL8*lI-WX)icS+J-(9^QI_*Taep5m|0ne5z^4m2NLmgbJXs1Bp6P z?GtMfD4zpovdrC~PBvhs0)I1KQFbF259jaC=D&r9@h0U-r^oPhZn1t%0J!XjD#2b6 z$@(xx%A!o?ao$8j#B>q>Ai2jzk4nCac5)DQ(os7YU8pTQ1N`^d!^YJMgsPKQQ^4E! zQGPC}S_-V^i1%-vz@|b@rJ2c4D^19gIZ2Oim#Gc6B zYO*{>d$42G$7U3~`pLtYD^f)q#~G_ZM@@A1N!(=-mggFIZX+lDm_YX7)_fZ-PXos1 z)oZY{2n#_KAB=%4$u$wL7l!iPqbJ|TZNs_&YgGD8=mBc?H);)lz}0YFHT$n2(ccTM z1^#6G&6Fy`wf)dlY4PqN3`WF2M{HicIKK?GZ>9^E0q?b80B2oa9h_>o{faA?4Pi&x zf!;|7s?OBXr5KA5=}tOX--I}vg%8Jvm`71hn%eEEG&lejJE}j?`E!ey-AP10yyzA63Svq{rb+lfb(ZYb`Oud z{0k!cbJ}i`{}3T91lXHw<0FM4Wq`-R#m`#^%hQEKC+`3Un7M~CNG%^j6T-{PDmegV z>A0x7c3o1>*!E9y=lgHn`CsTuT@{%2j)m(Vc=XWm3xyS543L#)=`-b% zZ6}&9e1>JR{-QkIW}ATrz>HItTk8tI5_gFMdb1&X(F|3(;+Uh`!z|0DAO^t;k&K11 zDLWva%&JEVEIPHZHS&OQ!d5~$-Qg3t>tC+o2SKN~e6lO~Y243HbkLi^aKL>OT=<*4 zSg~lqP4Q3e)P@Jh@|z#}ojGd0I@2G9DaM1pS^=0w;?~pSr1FJxz0NP!uSb=BfbXk+ z#$YK-C_fYVG;1ZRBgVKF%Mu^8EHjhU2V7ADsfdAaXz(Iz3>9YKKrZKmN2d5ZfRDBq z5aJ~@1wnCT6Zdz72HOz6kS=;J`!MSZzx!_p4RG?d9if#IrDb0{8is+Lx;>Kc02jHN zdw%EX^PE?WIBU4R9<>kUCd`L>lm@9U!-Tm~y2BU-_I~x;&hbIe6EmXNJL{m!I|L#E zQ|4G363r-tm3U((-uyv}Mr9lIOzkOX_H612x&mfuHdVqO)Ea!(cmUK? z_oFWW)OG+sZSGKzN98P{D + + + + + + SteamPanel + + +

+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..bc6f188 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,3619 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "lucide-react": "^0.577.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "zustand": "^5.0.11" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@tailwindcss/postcss": "^4.2.1", + "@types/node": "^24.12.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.0", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.1", + "typescript": "~5.9.3", + "typescript-eslint": "^8.56.1", + "vite": "^8.0.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "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.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", + "integrity": "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==", + "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.124.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.124.0.tgz", + "integrity": "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.15.tgz", + "integrity": "sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.15.tgz", + "integrity": "sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==", + "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.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==", + "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.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "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.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "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/@tailwindcss/node/node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "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/@tailwindcss/node/node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "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/@tailwindcss/node/node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "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/@tailwindcss/node/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "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/@tailwindcss/node/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "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/@tailwindcss/node/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "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/@tailwindcss/node/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "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/@tailwindcss/node/node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "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/@tailwindcss/node/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "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/@tailwindcss/node/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "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/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "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.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.1.tgz", + "integrity": "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "postcss": "^8.5.6", + "tailwindcss": "4.2.1" + } + }, + "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/node": { + "version": "24.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "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==", + "devOptional": 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/@typescript-eslint/eslint-plugin": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", + "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/type-utils": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz", + "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", + "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.0", + "@typescript-eslint/types": "^8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", + "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", + "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", + "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz", + "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", + "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.0", + "@typescript-eslint/tsconfig-utils": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", + "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", + "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.7.tgz", + "integrity": "sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw==", + "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.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "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.30001778", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001778.tgz", + "integrity": "sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==", + "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/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==", + "devOptional": 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.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "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/lucide-react": { + "version": "0.577.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.577.0.tgz", + "integrity": "sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "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.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "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/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.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.15.tgz", + "integrity": "sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.124.0", + "@rolldown/pluginutils": "1.0.0-rc.15" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-x64": "1.0.0-rc.15", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.15", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.15", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.15", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.15", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.15", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.15" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.15.tgz", + "integrity": "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==", + "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/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.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "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/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "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/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.0.tgz", + "integrity": "sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.57.0", + "@typescript-eslint/parser": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "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.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz", + "integrity": "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.15", + "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" + } + }, + "node_modules/zustand": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.11.tgz", + "integrity": "sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..67c2d5e --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,35 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "lucide-react": "^0.577.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "zustand": "^5.0.11" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@tailwindcss/postcss": "^4.2.1", + "@types/node": "^24.12.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.0", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.1", + "typescript": "~5.9.3", + "typescript-eslint": "^8.56.1", + "vite": "^8.0.0" + } +} diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js new file mode 100644 index 0000000..a7f73a2 --- /dev/null +++ b/frontend/postcss.config.js @@ -0,0 +1,5 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + }, +} diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 0000000..d47ee23 --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1,4 @@ + + Steam + + \ No newline at end of file diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 0000000..23c770c --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,36 @@ +import { useEffect } from "react"; +import { useUiStore } from "@/stores/uiStore"; +import { Header } from "@/components/layout/Header"; +import { TabNav } from "@/components/layout/TabNav"; +import { ToastContainer } from "@/components/layout/Toast"; +import { AccountsTab } from "@/components/accounts/AccountsTab"; +import { ToolsTab } from "@/components/tools/ToolsTab"; +import { MafileTab } from "@/components/mafiles/MafileTab"; +import { LogsTab } from "@/components/logs/LogsTab"; + +export default function App() { + const activeTab = useUiStore((s) => s.activeTab); + const loadDisplaySettings = useUiStore((s) => s.loadDisplaySettings); + const loadColumnSettings = useUiStore((s) => s.loadColumnSettings); + const loadLogpassColumnSettings = useUiStore((s) => s.loadLogpassColumnSettings); + + useEffect(() => { + loadDisplaySettings(); + loadColumnSettings(); + loadLogpassColumnSettings(); + }, []); + + return ( +
+
+ +
+ {activeTab === "accounts" && } + {activeTab === "tools" && } + {activeTab === "mafiles" && } + {activeTab === "logs" && } +
+ +
+ ); +} diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts new file mode 100644 index 0000000..228152a --- /dev/null +++ b/frontend/src/api/client.ts @@ -0,0 +1,182 @@ +import type { + Account, AccountCreate, AccountUpdate, BulkImportResult, + Proxy, Task, MafileInfo, MafileExportRequest, + ActionRequest, ValidationSettings, DisplaySettings, ColumnSettings, LogpassColumnSettings, LogEntry, + LogpassAccount, LogpassAccountCreate, LogpassAccountUpdate, + TokenAccount, TokenAccountCreate, TokenColumnSettings, +} from "./types"; + +const BASE = "/api"; + +async function request(path: string, init?: RequestInit): Promise { + const res = await fetch(`${BASE}${path}`, { + ...init, + headers: { "Content-Type": "application/json", ...init?.headers }, + }); + if (!res.ok) { + const body = await res.json().catch(() => ({ detail: res.statusText })); + throw new Error(body.detail ?? `HTTP ${res.status}`); + } + if (res.status === 204) return undefined as T; + return res.json(); +} + +export const api = { + // Version + getVersion: () => request<{ version: string }>("/version"), + + // Accounts + getAccounts: () => request("/accounts"), + getAccount: (id: number) => request(`/accounts/${id}`), + createAccount: (data: AccountCreate) => + request("/accounts", { method: "POST", body: JSON.stringify(data) }), + updateAccount: (id: number, data: AccountUpdate) => + request(`/accounts/${id}`, { method: "PUT", body: JSON.stringify(data) }), + deleteAccount: (id: number) => + request(`/accounts/${id}`, { method: "DELETE" }), + deleteBulk: (ids: number[]) => + request<{ deleted: number }>("/accounts/delete-bulk", { method: "POST", body: JSON.stringify({ ids }) }), + assignProxies: () => + request<{ assigned: number; proxies_used: number }>("/accounts/assign-proxies", { method: "POST" }), + reassignProxies: () => + request<{ assigned: number; proxies_used: number }>("/accounts/reassign-proxies", { method: "POST" }), + clearProxies: () => + request<{ cleared: number }>("/accounts/clear-proxies", { method: "POST" }), + importAccounts: (file: File) => { + const form = new FormData(); + form.append("file", file); + return fetch(`${BASE}/accounts/import`, { method: "POST", body: form }).then(async (r) => { + if (!r.ok) throw new Error((await r.json().catch(() => ({}))).detail ?? r.statusText); + return r.json() as Promise; + }); + }, + + // Actions + executeAction: (data: ActionRequest) => + request<{ task_id: string; accounts_count: number }>("/actions", { method: "POST", body: JSON.stringify(data) }), + respondToPrompt: (taskId: string, value: string, login?: string) => + request<{ status: string }>(`/tasks/${taskId}/respond`, { method: "POST", body: JSON.stringify({ value, login: login || "" }) }), + generate2FA: (shared_secret: string) => + request<{ code: string }>("/actions/generate-2fa", { method: "POST", body: JSON.stringify({ shared_secret }) }), + generate2FAByAccount: (account_id: number) => + request<{ code: string }>("/actions/generate-2fa-by-account", { method: "POST", body: JSON.stringify({ account_id }) }), + + // Proxies + getProxies: () => request("/proxies"), + addProxy: (address: string, protocol = "http") => + request("/proxies", { method: "POST", body: JSON.stringify({ address, protocol }) }), + deleteProxy: (id: number) => + request(`/proxies/${id}`, { method: "DELETE" }), + deleteAllProxies: () => + request<{ deleted: number }>("/proxies/all", { method: "DELETE" }), + bulkAddProxies: (proxies: { address: string; protocol: string }[]) => + request<{ added: number }>("/proxies/bulk", { method: "POST", body: JSON.stringify(proxies) }), + checkProxies: () => + request<{ total: number; alive: number; dead: number }>("/proxies/check", { method: "POST" }), + + // Tasks + getTasks: () => request("/tasks"), + getTask: (id: string) => request(`/tasks/${id}`), + cancelTask: (id: string) => request(`/tasks/${id}`, { method: "DELETE" }), + + // Mafiles + getMafiles: () => request("/mafiles"), + uploadMafiles: (files: File[]) => { + const form = new FormData(); + files.forEach((f) => form.append("files", f)); + return fetch(`${BASE}/mafiles/upload`, { method: "POST", body: form }).then(async (r) => { + if (!r.ok) throw new Error((await r.json().catch(() => ({}))).detail ?? r.statusText); + return r.json() as Promise<{ uploaded: number; errors: string[] }>; + }); + }, + deleteMafile: (filename: string) => + request(`/mafiles/${encodeURIComponent(filename)}`, { method: "DELETE" }), + exportSecrets: () => request<{ account_name: string; shared_secret: string; identity_secret: string; steam_id: string }[]>("/mafiles/export/all"), + exportZip: (body: MafileExportRequest) => + fetch(`${BASE}/mafiles/export/zip`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }).then((r) => { + if (!r.ok) throw new Error(`Export failed: ${r.status}`); + return r.blob(); + }), + + // Settings + getValidationSettings: () => request("/settings/validation"), + updateValidationSettings: (data: ValidationSettings) => + request("/settings/validation", { method: "PUT", body: JSON.stringify(data) }), + getDisplaySettings: () => request("/settings/display"), + updateDisplaySettings: (data: DisplaySettings) => + request("/settings/display", { method: "PUT", body: JSON.stringify(data) }), + getColumnSettings: () => request("/settings/columns"), + updateColumnSettings: (data: ColumnSettings) => + request("/settings/columns", { method: "PUT", body: JSON.stringify(data) }), + getLogpassColumnSettings: () => request("/settings/logpass-columns"), + updateLogpassColumnSettings: (data: LogpassColumnSettings) => + request("/settings/logpass-columns", { method: "PUT", body: JSON.stringify(data) }), + + // Logs + getLogs: () => request("/logs"), + + // Auto-accept + startAutoAccept: (ids: number[]) => + request<{ started: number[] }>("/auto-accept/start", { method: "POST", body: JSON.stringify({ account_ids: ids }) }), + stopAutoAccept: (ids: number[]) => + request<{ stopped: number[] }>("/auto-accept/stop", { method: "POST", body: JSON.stringify({ account_ids: ids }) }), + getAutoAcceptStatus: () => + request<{ running: number[] }>("/auto-accept/status"), + + // Browser + openBrowser: (id: number) => + request<{ status: string; message: string; task_id?: string }>(`/accounts/${id}/browser`, { method: "POST" }), + + // Logpass accounts + getLogpassAccounts: () => request("/logpass"), + createLogpassAccount: (data: LogpassAccountCreate) => + request("/logpass", { method: "POST", body: JSON.stringify(data) }), + updateLogpassAccount: (id: number, data: LogpassAccountUpdate) => + request(`/logpass/${id}`, { method: "PUT", body: JSON.stringify(data) }), + deleteLogpassAccount: (id: number) => + request(`/logpass/${id}`, { method: "DELETE" }), + deleteLogpassBulk: (ids: number[]) => + request<{ deleted: number }>("/logpass/delete-bulk", { method: "POST", body: JSON.stringify({ ids }) }), + importLogpass: (lines: string[]) => + request("/logpass/import", { method: "POST", body: JSON.stringify({ lines }) }), + validateLogpass: (account_ids: number[]) => + request<{ task_id: string; accounts_count: number }>("/logpass/validate", { method: "POST", body: JSON.stringify({ account_ids }) }), + fullParseLogpass: (account_ids: number[]) => + request<{ task_id: string; accounts_count: number }>("/logpass/full-parse", { method: "POST", body: JSON.stringify({ account_ids }) }), + assignLogpassProxies: () => + request<{ assigned: number; proxies_used: number }>("/logpass/assign-proxies", { method: "POST" }), + reassignLogpassProxies: () => + request<{ assigned: number; proxies_used: number }>("/logpass/reassign-proxies", { method: "POST" }), + clearLogpassProxies: () => + request<{ cleared: number }>("/logpass/clear-proxies", { method: "POST" }), + openLogpassBrowser: (id: number) => + request<{ status: string; message: string; task_id?: string }>(`/logpass/${id}/browser`, { method: "POST" }), + + // Token accounts + getTokenAccounts: () => request("/token-accounts"), + createTokenAccount: (data: TokenAccountCreate) => + request("/token-accounts", { method: "POST", body: JSON.stringify(data) }), + deleteTokenAccount: (id: number) => + request(`/token-accounts/${id}`, { method: "DELETE" }), + deleteTokenBulk: (ids: number[]) => + request<{ deleted: number }>("/token-accounts/delete-bulk", { method: "POST", body: JSON.stringify({ ids }) }), + importTokens: (lines: string[]) => + request("/token-accounts/import", { method: "POST", body: JSON.stringify({ lines }) }), + validateTokens: (ids: number[]) => + request<{ task_id: string; accounts_count: number }>("/token-accounts/validate", { method: "POST", body: JSON.stringify({ account_ids: ids }) }), + openTokenBrowser: (id: number) => + request<{ status: string; message: string; task_id?: string }>(`/token-accounts/${id}/browser`, { method: "POST" }), + assignTokenProxies: () => + request<{ assigned: number; proxies_used: number }>("/token-accounts/assign-proxies", { method: "POST" }), + reassignTokenProxies: () => + request<{ assigned: number; proxies_used: number }>("/token-accounts/reassign-proxies", { method: "POST" }), + clearTokenProxies: () => + request<{ cleared: number }>("/token-accounts/clear-proxies", { method: "POST" }), + getTokenColumnSettings: () => request("/settings/token-columns"), + updateTokenColumnSettings: (data: TokenColumnSettings) => + request("/settings/token-columns", { method: "PUT", body: JSON.stringify(data) }), +}; diff --git a/frontend/src/api/types.ts b/frontend/src/api/types.ts new file mode 100644 index 0000000..3dcb9cd --- /dev/null +++ b/frontend/src/api/types.ts @@ -0,0 +1,260 @@ +export interface Account { + id: number; + login: string; + password: string; + steam_id: string | null; + email: string | null; + email_password: string | null; + phone: string | null; + mafile_path: string | null; + shared_secret: string | null; + identity_secret: string | null; + proxy: string | null; + status: string; + notes: string | null; + nickname: string | null; + avatar_url: string | null; + steam_level: number | null; + last_online: string | null; + auto_accept: number; + ban_status: string | null; + has_cookies: boolean; + has_revocation_code: boolean; + created_at: string; + updated_at: string; +} + +export interface AccountCreate { + login: string; + password: string; + steam_id?: string; + email?: string; + email_password?: string; + phone?: string; + proxy?: string; + notes?: string; +} + +export interface AccountUpdate { + login?: string; + password?: string; + steam_id?: string; + email?: string; + email_password?: string; + phone?: string; + proxy?: string; + status?: string; + notes?: string; +} + +export interface Proxy { + id: number; + address: string; + protocol: string; + is_alive: boolean; + last_checked: string | null; + fail_count: number; +} + +export interface Task { + id: string; + type: string; + status: string; + progress: number; + total: number; + result: string | null; + error: string | null; + prompt?: string; + prompt_login?: string; + step?: number; + total_steps?: number; + step_label?: string; + active_count?: number; + account_ids?: string | null; + account_results?: Record | string | null; + account_steps?: Record; + created_at: string; + updated_at: string; +} + +export interface MafileInfo { + filename: string; + account_name: string; + steam_id: string; + has_shared_secret: boolean; + has_identity_secret: boolean; + fully_enrolled: boolean; + error?: string; +} + +export interface MafileExportRequest { + fields: string[]; + session_fields: string[]; + format: "flat_mafiles" | "per_account_folder" | "single_file"; + account_ids: number[]; + folder_name_template: string; + mafile_name_template: string; + txt_name_template: string; + include_txt_per_folder: boolean; + include_global_txt: boolean; + skip_folders: boolean; + txt_format: string; +} + +export interface BulkImportResult { + imported: number; + skipped: number; + errors: string[]; +} + +export interface ActionRequest { + account_ids: number[]; + action: string; + params?: Record; +} + +export interface ValidationSettings { + fetch_profile: boolean; + check_ban: boolean; + max_threads: number; + auto_revalidate_browser: boolean; +} + +export interface DisplaySettings { + hide_passwords: boolean; +} + +export interface ColumnSettings { + browser: boolean; + profile: boolean; + steam_id: boolean; + login: boolean; + password: boolean; + login_pass: boolean; + email: boolean; + email_pass: boolean; + email_login_pass: boolean; + phone: boolean; + status: boolean; + ban: boolean; + twofa: boolean; + mafile: boolean; + proxy: boolean; + notes: boolean; + actions: boolean; + last_online: boolean; +} + +export interface LogpassColumnSettings { + browser: boolean; + profile: boolean; + steam_id: boolean; + login: boolean; + password: boolean; + login_pass: boolean; + status: boolean; + ban: boolean; + prime: boolean; + trophy: boolean; + behavior: boolean; + license: boolean; + proxy: boolean; + notes: boolean; + actions: boolean; + last_online: boolean; +} + +export interface TokenColumnSettings { + browser: boolean; + profile: boolean; + last_online: boolean; + steam_id: boolean; + login: boolean; + token: boolean; + status: boolean; + proxy: boolean; + notes: boolean; + actions: boolean; +} + +export interface LogEntry { + ts: string; + level: string; + icon: string; + msg: string; +} + +export interface LogpassAccount { + id: number; + login: string; + password: string; + steam_id: string | null; + proxy: string | null; + status: string; + ban_status: string | null; + nickname: string | null; + steam_level: number | null; + prime: string | null; + trophy: string | null; + behavior: string | null; + license: string | null; + notes: string | null; + avatar_url: string | null; + last_online: string | null; + has_cookies: boolean; + created_at: string; + updated_at: string; +} + +export interface LogpassAccountCreate { + login: string; + password: string; + steam_id?: string; + proxy?: string; + notes?: string; +} + +export interface LogpassAccountUpdate { + login?: string; + password?: string; + steam_id?: string; + proxy?: string; + status?: string; + notes?: string; +} + +export interface TokenAccount { + id: number; + login: string | null; + token: string; + steam_id: string | null; + proxy: string | null; + status: string; + ban_status: string | null; + nickname: string | null; + steam_level: number | null; + avatar_url: string | null; + last_online: string | null; + has_cookies: boolean; + notes: string | null; + created_at: string; + updated_at: string; +} + +export interface TokenAccountCreate { + login?: string; + token: string; + steam_id?: string; + proxy?: string; + notes?: string; +} + +export type TabId = "accounts" | "tools" | "mafiles" | "logs"; + +export type ToastType = "info" | "success" | "error" | "warn"; + +export interface Toast { + id: number; + type: ToastType; + message: string; +} diff --git a/frontend/src/components/accounts/AccountRow.tsx b/frontend/src/components/accounts/AccountRow.tsx new file mode 100644 index 0000000..8eef902 --- /dev/null +++ b/frontend/src/components/accounts/AccountRow.tsx @@ -0,0 +1,283 @@ +import { useState } from "react"; +import type { Account, ColumnSettings } from "@/api/types"; +import { useAccountStore } from "@/stores/accountStore"; +import { copyText } from "@/lib/clipboard"; +import { useUiStore } from "@/stores/uiStore"; +import { api } from "@/api/client"; +import { StatusBadge, BanBadge, MafileBadge } from "./Badges"; +import { ActionMenu } from "./ActionMenu"; +import { SteamLevelBadge } from "./SteamLevelBadge"; +import { IconCheck, IconAlertTriangle, IconEye, IconEyeOff, IconKey, IconRefresh, IconEdit, IconTrash } from "@/components/shared/Icons"; +import { useT } from "@/lib/i18n"; + +interface Props { + account: Account; + visibleColumns: ColumnSettings; + proxyLabel: string | null; + isProcessing: boolean; + accountResult?: { status: string; error?: string }; + accountStep?: { step: number; total: number }; + onEdit: (id: number) => void; + onDelete: (id: number) => void; + onAction: (id: number, action: string, params: Record) => void; + onToggleAutoAccept: (id: number) => void; + onOpenBrowser: (id: number) => void; +} + +export function AccountRow({ account: a, visibleColumns: v, proxyLabel, isProcessing, accountResult, accountStep, onEdit, onDelete, onAction, onToggleAutoAccept, onOpenBrowser }: Props) { + const selectedIds = useAccountStore((s) => s.selectedIds); + const toggleSelect = useAccountStore((s) => s.toggleSelect); + const addToast = useUiStore((s) => s.addToast); + const hidePasswords = useUiStore((s) => s.hidePasswords); + const [revealed, setRevealed] = useState(false); + const [editingNotes, setEditingNotes] = useState(false); + const [notesValue, setNotesValue] = useState(a.notes || ""); + const t = useT(); + + + const handleCopy = async (text: string) => { + const ok = await copyText(text); + addToast(ok ? "success" : "error", ok ? t("toast.copied") : t("toast.copyFailed")); + }; + + const masked = hidePasswords && !revealed; + const dots = "••••••••"; + + return ( + + + toggleSelect(a.id)} + /> + + + {isProcessing ? ( +
+
+ {accountStep && ( + [{accountStep.step}/{accountStep.total}] + )} +
+ ) : accountResult?.status === "ok" ? ( + + ) : accountResult?.status === "error" ? ( + + + + ) : null} + + {v.browser && ( + + {a.has_cookies ? ( + + ) : ( + + )} + + )} + {v.profile && ( + +
+ {a.avatar_url && } + {a.nickname || "—"} + {a.steam_level != null && } +
+ + )} + {v.last_online && ( + + {a.last_online || "—"} + + )} + {v.steam_id && ( + + {a.steam_id ? ( +
+ {a.steam_id} + + ) : "—"} + + )} + {v.login && {a.login}} + {v.password && ( + + handleCopy(a.password)} + title={t("tip.copyPassword")} + > + {masked ? dots : a.password} + + + + )} + {v.login_pass && ( + + handleCopy(`${a.login}:${a.password}`)} + title={t("tip.copyLoginPass")} + > + {masked ? `${a.login}:${dots}` : `${a.login}:${a.password}`} + + + + )} + {v.email && {a.email || "—"}} + {v.email_pass && ( + + { if (a.email_password) handleCopy(a.email_password); }} + title={a.email_password ? t("tip.copyEmailPass") : ""} + > + {a.email_password ? (masked ? dots : a.email_password) : "—"} + + {a.email_password && ( + + )} + + )} + {v.email_login_pass && ( + + { if (a.email && a.email_password) handleCopy(`${a.email}:${a.email_password}`); }} + title={a.email && a.email_password ? t("tip.copyEmailLoginPass") : ""} + > + {a.email && a.email_password ? (masked ? `${a.email}:${dots}` : `${a.email}:${a.email_password}`) : "—"} + + {a.email && a.email_password && ( + + )} + + )} + {v.phone && {a.phone || "—"}} + {v.status && } + {v.ban && } + {v.twofa && ( + + {a.shared_secret ? ( + + ) : ( + + )} + + )} + {v.mafile && ( + + + + )} + {v.proxy && ( + + {a.proxy ? ( + handleCopy(a.proxy!)} + title={a.proxy} + > + {proxyLabel || a.proxy} + + ) : "—"} + + )} + {v.notes && ( + + {editingNotes ? ( + setNotesValue(e.target.value)} + onBlur={async () => { + setEditingNotes(false); + if (notesValue !== (a.notes || "")) { + try { + await api.updateAccount(a.id, { notes: notesValue }); + addToast("success", t("toast.noteSaved")); + useAccountStore.getState().loadAccounts(); + } catch { + addToast("error", t("toast.noteSaveError")); + } + } + }} + onKeyDown={(e) => { if (e.key === "Enter") (e.target as HTMLInputElement).blur(); if (e.key === "Escape") { setNotesValue(a.notes || ""); setEditingNotes(false); } }} + /> + ) : ( + { setNotesValue(a.notes || ""); setEditingNotes(true); }} + title={a.notes || t("tip.addNote")} + > + {a.notes || "—"} + + )} + + )} + {v.actions && ( + +
+ + + + {a.auto_accept ? ( + + ) : null} +
+ + )} + + ); +} diff --git a/frontend/src/components/accounts/AccountTable.tsx b/frontend/src/components/accounts/AccountTable.tsx new file mode 100644 index 0000000..7d34762 --- /dev/null +++ b/frontend/src/components/accounts/AccountTable.tsx @@ -0,0 +1,183 @@ +import { useEffect, useMemo, useRef, useState } from "react"; +import type { Account, ColumnSettings } from "@/api/types"; +import { useAccountStore } from "@/stores/accountStore"; +import { useUiStore } from "@/stores/uiStore"; +import { AccountRow } from "./AccountRow"; +import { useT } from "@/lib/i18n"; + +const COLUMN_KEYS: (keyof ColumnSettings)[] = [ + "browser", "profile", "last_online", "steam_id", "login", "password", "login_pass", + "email", "email_pass", "email_login_pass", "phone", "status", "ban", "twofa", "mafile", "proxy", "notes", "actions", +]; + +const COL_LABEL_KEYS: Record = { + browser: "col.browser", profile: "col.profile", last_online: "col.lastOnline", + steam_id: "col.steamId", login: "col.login", password: "col.password", + login_pass: "col.loginPass", email: "col.email", email_pass: "col.emailPass", + email_login_pass: "col.emailLoginPass", phone: "col.phone", status: "col.status", + ban: "col.ban", twofa: "col.twofa", mafile: "col.mafile", proxy: "col.proxy", + notes: "col.notes", actions: "col.actions", +}; + +interface Props { + accounts: Account[]; + processingIds: Set; + accountResults: Record; + accountSteps: Record; + onEdit: (id: number) => void; + onDelete: (id: number) => void; + onAction: (id: number, action: string, params: Record) => void; + onToggleAutoAccept: (id: number) => void; + onOpenBrowser: (id: number) => void; +} + +export function AccountTable({ accounts, processingIds, accountResults, accountSteps, onEdit, onDelete, onAction, onToggleAutoAccept, onOpenBrowser }: Props) { + const selectAll = useAccountStore((s) => s.selectAll); + const clearSelection = useAccountStore((s) => s.clearSelection); + const selectedIds = useAccountStore((s) => s.selectedIds); + const cols = useUiStore((s) => s.columnVisibility); + const t = useT(); + + const allSelected = accounts.length > 0 && selectedIds.size === accounts.length; + const visibleKeys = COLUMN_KEYS.filter((k) => cols[k]); + + const BATCH = 100; + const [visibleCount, setVisibleCount] = useState(BATCH); + const sentinelRef = useRef(null); + + type SortField = "last_online" | null; + type SortDir = "asc" | "desc"; + const [sortField, setSortField] = useState(null); + const [sortDir, setSortDir] = useState("asc"); + const toggleSort = (field: SortField) => { + if (sortField === field) { + if (sortDir === "asc") setSortDir("desc"); + else { setSortField(null); setSortDir("asc"); } + } else { + setSortField(field); + setSortDir("asc"); + } + }; + + const sorted = useMemo(() => { + if (!sortField) return accounts; + const dir = sortDir === "asc" ? 1 : -1; + const EMPTY = Symbol(); + return [...accounts].sort((a, b) => { + const parseOnline = (v: string | null | undefined): number | typeof EMPTY => { + if (!v || v === "\u2014") return EMPTY; + if (v === "online") return -1; + const m = v.match(/^(\d+)([mhd])$/i); + if (!m) return EMPTY; + const n = parseInt(m[1], 10); + if (m[2] === "m") return n; + if (m[2] === "h") return n * 60; + return n * 1440; + }; + const va = parseOnline(a.last_online); + const vb = parseOnline(b.last_online); + if (va === EMPTY && vb === EMPTY) return 0; + if (va === EMPTY) return 1; + if (vb === EMPTY) return -1; + if (va === vb) return 0; + return (va < vb ? -1 : 1) * dir; + }); + }, [accounts, sortField, sortDir]); + + useEffect(() => { setVisibleCount(BATCH); }, [accounts, sortField, sortDir]); + + const visible = useMemo(() => sorted.slice(0, visibleCount), [sorted, visibleCount]); + + useEffect(() => { + const el = sentinelRef.current; + if (!el) return; + const obs = new IntersectionObserver((entries) => { + if (entries[0].isIntersecting) setVisibleCount((c) => Math.min(c + BATCH, sorted.length)); + }, { rootMargin: "400px" }); + obs.observe(el); + return () => obs.disconnect(); + }, [sorted.length, visibleCount]); + + // Build proxy labels: unique proxies get numbered "Прокси 1", "Прокси 2", etc. + const proxyLabels = useMemo(() => { + const map = new Map(); + const uniqueProxies: string[] = []; + for (const a of accounts) { + if (a.proxy && !uniqueProxies.includes(a.proxy)) { + uniqueProxies.push(a.proxy); + } + } + const proxyToNum = new Map(); + uniqueProxies.forEach((p, i) => proxyToNum.set(p, i + 1)); + for (const a of accounts) { + if (a.proxy) { + const num = proxyToNum.get(a.proxy); + map.set(a.id, num ? t("proxy.label", { num }) : a.proxy); + } + } + return map; + }, [accounts]); + + if (!accounts.length) { + return ( +
+ {t("empty.accounts")} +
+ ); + } + + return ( +
+ + + + + + {visibleKeys.map((k) => { + if (k === "last_online") { + return ( + + ); + } + return ; + })} + + + + {visible.map((a) => ( + + ))} + {visibleCount < accounts.length && ( + + )} + +
+
+ allSelected ? clearSelection() : selectAll()} + /> + {selectedIds.size > 0 && ( + {selectedIds.size} + )} +
+
toggleSort("last_online")}> + {t(COL_LABEL_KEYS[k])}{sortField === "last_online" ? (sortDir === "asc" ? " ▲" : " ▼") : ""} + {t(COL_LABEL_KEYS[k])}
{t("paging.shown", { visible: visibleCount, total: accounts.length })}
+
+ ); +} diff --git a/frontend/src/components/accounts/AccountsTab.tsx b/frontend/src/components/accounts/AccountsTab.tsx new file mode 100644 index 0000000..25dd4e4 --- /dev/null +++ b/frontend/src/components/accounts/AccountsTab.tsx @@ -0,0 +1,689 @@ +import { useEffect, useState, useCallback, useMemo, useRef } from "react"; +import { api } from "@/api/client"; +import { useAccountStore } from "@/stores/accountStore"; +import { useUiStore } from "@/stores/uiStore"; +import { useTaskStore } from "@/stores/taskStore"; +import { useLogpassStore } from "@/stores/logpassStore"; +import { useTokenStore } from "@/stores/tokenStore"; +import { AccountTable } from "./AccountTable"; +import { EditModal } from "./EditModal"; +import { ImportModal } from "./ImportModal"; +import { AddModal } from "./AddModal"; +import { ConfirmModal } from "@/components/shared/Modals"; +import { ColumnSettingsDropdown } from "./ColumnSettingsDropdown"; +import { + IconDownload, IconPlus, IconCheckCircle, IconXCircle, + IconFolder, IconGlobe, IconRefresh, IconBan, + IconPlay, IconLock, IconKey, IconZap, +} from "@/components/shared/Icons"; +import { LogpassTab } from "./LogpassTab"; +import { TokenTab } from "./TokenTab"; +import type { AccountCreate, AccountUpdate, Task } from "@/api/types"; +import { useT } from "@/lib/i18n"; + +type AccountSection = "mafile" | "logpass" | "token"; + +type AccResults = Record; + +function parseAccResults(raw: Task["account_results"]): AccResults | null { + if (!raw) return null; + if (typeof raw === "string") { + try { return JSON.parse(raw) as AccResults; } catch { return null; } + } + return raw; +} + +function parseIds(raw: Task["account_ids"]): number[] { + if (!raw) return []; + try { return JSON.parse(raw) as number[]; } catch { return []; } +} + +const BULK_ACTIONS = [ + { value: "", labelKey: "action.selectAction" }, + { value: "validate", labelKey: "action.validate" }, + { value: "change_password", labelKey: "action.changePassword" }, + { value: "random_password", labelKey: "action.randomPassword" }, + { value: "change_email", labelKey: "action.changeEmail" }, + { value: "remove_guard", labelKey: "action.removeGuard" }, + { value: "enable_auto_accept", labelKey: "action.enableAutoAccept" }, +] as const; + +function BulkActionDropdown({ value, onChange, disabledActions }: { value: string; onChange: (v: string) => void; disabledActions?: Set }) { + const t = useT(); + const [open, setOpen] = useState(false); + const ref = useRef(null); + + useEffect(() => { + if (!open) return; + const handler = (e: MouseEvent) => { + if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); + }; + document.addEventListener("mousedown", handler); + return () => document.removeEventListener("mousedown", handler); + }, [open]); + + const label = t(BULK_ACTIONS.find((a) => a.value === value)?.labelKey || "action.selectAction"); + + return ( +
+ + {open && ( +
+ {BULK_ACTIONS.map((a) => { + const disabled = !!(a.value && disabledActions?.has(a.value)); + return ( + + ); + })} +
+ )} +
+ ); +} + +function SectionAccountCount() { + const section = useUiStore((s) => s.accountSection); + const mafileCount = useAccountStore((s) => s.accounts.length); + const logpassCount = useLogpassStore((s) => s.accounts.length); + const tokenCount = useTokenStore((s) => s.accounts.length); + const loadLogpass = useLogpassStore((s) => s.loadAccounts); + const loadTokens = useTokenStore((s) => s.loadAccounts); + const [displayCount, setDisplayCount] = useState(0); + const rafRef = useRef(0); + const displayRef = useRef(0); + const prevSection = useRef(section); + + useEffect(() => { + if (section === "logpass" && logpassCount === 0) loadLogpass(); + if (section === "token" && tokenCount === 0) loadTokens(); + }, [section]); + + const count = section === "logpass" ? logpassCount : section === "token" ? tokenCount : mafileCount; + + useEffect(() => { + cancelAnimationFrame(rafRef.current); + + const sectionChanged = prevSection.current !== section; + prevSection.current = section; + + if (sectionChanged) { + displayRef.current = count; + setDisplayCount(count); + return; + } + + const start = displayRef.current; + const diff = count - start; + if (diff === 0) return; + + const duration = Math.min(400, Math.max(150, Math.abs(diff) * 2)); + const startTime = performance.now(); + + const step = (now: number) => { + const elapsed = now - startTime; + const progress = Math.min(elapsed / duration, 1); + const eased = 1 - Math.pow(1 - progress, 3); + const value = Math.max(0, Math.round(start + diff * eased)); + displayRef.current = value; + setDisplayCount(value); + if (progress < 1) rafRef.current = requestAnimationFrame(step); + }; + + rafRef.current = requestAnimationFrame(step); + return () => cancelAnimationFrame(rafRef.current); + }, [count, section]); + + return ( +
+
+ + + + + + +
+ {displayCount} +
+ ); +} + +export function AccountsTab() { + const accounts = useAccountStore((s) => s.accounts); + const selectedIds = useAccountStore((s) => s.selectedIds); + const loadAccounts = useAccountStore((s) => s.loadAccounts); + const clearSelection = useAccountStore((s) => s.clearSelection); + const sendToMafileManager = useAccountStore((s) => s.sendToMafileManager); + const setTab = useUiStore((s) => s.setTab); + const addToast = useUiStore((s) => s.addToast); + const loadTasks = useTaskStore((s) => s.loadTasks); + const t = useT(); + + const [editId, setEditId] = useState(null); + const [showImport, setShowImport] = useState(false); + const [showAdd, setShowAdd] = useState(false); + const [confirmMsg, setConfirmMsg] = useState(null); + const [onConfirmAction, setOnConfirmAction] = useState<(() => void) | null>(null); + const [bulkAction, setBulkAction] = useState(""); + const section = useUiStore((s) => s.accountSection); + const setSection = useUiStore((s) => s.setAccountSection); + const [activeTask, setActiveTask] = useState(null); + const [processingIds, setProcessingIds] = useState>(new Set()); + const [searchQuery, setSearchQuery] = useState(""); + const [promptData, setPromptData] = useState<{ taskId: string; message: string; login?: string } | null>(null); + const [promptValue, setPromptValue] = useState(""); + const [accountResults, setAccountResults] = useState>({}); + const [accountSteps, setAccountSteps] = useState>({}); + + const filteredAccounts = useMemo(() => { + if (!searchQuery.trim()) return accounts; + const q = searchQuery.trim(); + + // lvl comparison syntax: lvl>10, lvl>=10, lvl<10, lvl<=10, lvl=10 + const lvlMatch = q.match(/^lvl\s*(>=|<=|>|<|=)\s*(\d+)$/i); + if (lvlMatch) { + const op = lvlMatch[1]; + const val = parseInt(lvlMatch[2], 10); + return accounts.filter((a) => { + const lvl = a.steam_level; + if (lvl == null) return false; + if (op === ">") return lvl > val; + if (op === ">=") return lvl >= val; + if (op === "<") return lvl < val; + if (op === "<=") return lvl <= val; + return lvl === val; + }); + } + + const ql = q.toLowerCase(); + const words = ql.split(/\s+/).filter(Boolean); + return accounts.filter((a) => { + if (a.login.toLowerCase().includes(ql)) return true; + if (a.steam_id && a.steam_id.toLowerCase().includes(ql)) return true; + if (a.notes) { + const notesLower = a.notes.toLowerCase(); + return words.some((w) => notesLower.includes(w)); + } + return false; + }); + }, [accounts, searchQuery]); + + const bulkDisabledActions = useMemo(() => { + const disabled = new Set(); + const selected = accounts.filter((a) => selectedIds.has(a.id)); + if (!selected.some((a) => a.has_revocation_code)) { + disabled.add("remove_guard"); + } + return disabled; + }, [accounts, selectedIds]); + + useEffect(() => { loadAccounts(); }, []); + + const confirm = (msg: string, action: () => void) => { + setConfirmMsg(msg); + setOnConfirmAction(() => action); + }; + + const watchTask = useCallback((taskId: string, accountIds: number[] = [], clearResults = true) => { + if (clearResults) { + setAccountResults((prev) => { + const next = { ...prev }; + accountIds.forEach((id) => delete next[String(id)]); + return next; + }); + } + const es = new EventSource(`/api/tasks/${taskId}/stream`); + es.onmessage = (e) => { + try { + const data = JSON.parse(e.data) as Task; + setActiveTask(data); + const parsed = parseAccResults(data.account_results); + if (parsed) { + setAccountResults((prev) => ({ ...prev, ...parsed })); + } + if (data.account_steps) { + setAccountSteps((prev) => ({ ...prev, ...data.account_steps })); + } + if (data.prompt) { + setPromptData({ taskId, message: data.prompt, login: data.prompt_login }); + setPromptValue(""); + } + if (data.status === "completed" || data.status === "failed" || data.status === "cancelled") { + if (data.status === "completed") { + addToast("success", `${data.type}: ${data.result || t("toast.done")}`); + } else if (data.status === "cancelled") { + addToast("info", t("toast.taskCancelled")); + } else { + addToast("error", `${data.type}: ${data.error || t("toast.error")}`); + } + setProcessingIds((prev) => { + const s = new Set(prev); + accountIds.forEach((id) => s.delete(id)); + return s; + }); + setPromptData(null); + loadAccounts(); + loadTasks(); + es.close(); + setTimeout(() => setActiveTask(null), 3000); + } + } catch { /* ignore */ } + }; + es.onerror = () => es.close(); + }, [addToast, loadAccounts, loadTasks]); + + // Restore running/completed task state on page load + useEffect(() => { + let cancelled = false; + (async () => { + try { + const tasks = await api.getTasks(); + if (cancelled) return; + + const running = tasks.find((t) => t.status === "running"); + if (running) { + const ids = parseIds(running.account_ids); + setActiveTask(running); + setProcessingIds(new Set(ids)); + const restored = parseAccResults(running.account_results); + if (restored) setAccountResults(restored); + watchTask(running.id, ids, false); + return; + } + + const recent = tasks.find((t) => t.status === "completed" || t.status === "failed"); + if (recent) { + const restored = parseAccResults(recent.account_results); + if (restored && Object.keys(restored).length > 0) { + setAccountResults(restored); + } + } + } catch { /* ignore */ } + })(); + return () => { cancelled = true; }; + }, [watchTask]); + + const handleAction = async (id: number, action: string, params: Record) => { + const acc = accounts.find((a) => a.id === id); + const login = acc?.login ?? `#${id}`; + try { + setProcessingIds((prev) => new Set(prev).add(id)); + const result = await api.executeAction({ account_ids: [id], action, params }); + addToast("info", t("misc.taskAction", { id: result.task_id, action, login })); + watchTask(result.task_id, [id]); + } catch (e: unknown) { + setProcessingIds((prev) => { const s = new Set(prev); s.delete(id); return s; }); + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }; + + const handlePromptSubmit = async () => { + if (!promptData || !promptValue) return; + try { + await api.respondToPrompt(promptData.taskId, promptValue, promptData.login); + setPromptData(null); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }; + + const handlePromptCancel = async () => { + if (promptData) { + try { await api.cancelTask(promptData.taskId); } catch { /* task may already be done */ } + } + setPromptData(null); + }; + + const handleBulkAction = () => { + if (!bulkAction) return addToast("warn", t("toast.selectAction")); + if (!selectedIds.size) return addToast("warn", t("toast.selectAccounts")); + + if (bulkAction === "enable_auto_accept") { + const ids = [...selectedIds]; + clearSelection(); + api.startAutoAccept(ids) + .then(() => { addToast("success", t("toast.autoAcceptEnabled", { count: ids.length })); loadAccounts(); }) + .catch((e: unknown) => addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) }))); + return; + } + + const capturedIds = [...selectedIds]; + const capturedAction = bulkAction; + const actionLabel = t(BULK_ACTIONS.find((a) => a.value === capturedAction)?.labelKey || "action.selectAction"); + confirm( + t("confirm.executeBulk", { action: actionLabel, count: capturedIds.length }), + async () => { + try { + const result = await api.executeAction({ account_ids: capturedIds, action: capturedAction }); + clearSelection(); + setProcessingIds((prev) => { const s = new Set(prev); capturedIds.forEach((id) => s.add(id)); return s; }); + addToast("info", t("misc.taskCount", { id: result.task_id, count: result.accounts_count })); + watchTask(result.task_id, capturedIds); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }, + ); + }; + + const handleToggleAutoAccept = async (id: number) => { + const acc = accounts.find((a) => a.id === id); + if (!acc) return; + const enable = !acc.auto_accept; + try { + if (enable) await api.startAutoAccept([id]); + else await api.stopAutoAccept([id]); + addToast("info", enable ? t("toast.autoAcceptOn") : t("toast.autoAcceptOff")); + await loadAccounts(); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }; + + const handleEdit = (id: number) => setEditId(id); + + const handleSaveEdit = async (id: number, data: AccountUpdate) => { + try { + await api.updateAccount(id, data); + setEditId(null); + addToast("success", t("toast.saved")); + await loadAccounts(); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }; + + const handleDelete = (id: number) => { + confirm(t("confirm.deleteAccount"), async () => { + try { + await api.deleteAccount(id); + addToast("success", t("toast.accountDeleted")); + await loadAccounts(); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }); + }; + + const handleDeleteSelected = () => { + if (!selectedIds.size) return addToast("warn", t("toast.selectAccounts")); + confirm(t("confirm.deleteSelected", { count: selectedIds.size }), async () => { + try { + const result = await api.deleteBulk([...selectedIds]); + clearSelection(); + addToast("success", t("toast.deleted", { count: result.deleted })); + await loadAccounts(); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }); + }; + + const handleDeleteAll = () => { + if (!accounts.length) return addToast("warn", t("toast.noAccounts")); + confirm(t("confirm.deleteAll", { count: accounts.length }), async () => { + try { + const result = await api.deleteBulk([]); + clearSelection(); + addToast("success", t("toast.deleted", { count: result.deleted })); + await loadAccounts(); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }); + }; + + const handleAddAccount = async (data: AccountCreate) => { + try { + await api.createAccount(data); + setShowAdd(false); + addToast("success", t("toast.accountAdded")); + await loadAccounts(); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }; + + const handleSendToMafiles = () => { + if (!selectedIds.size) return addToast("warn", t("toast.selectAccounts")); + sendToMafileManager([...selectedIds]); + setTab("mafiles"); + addToast("info", t("toast.sentToMafile", { count: selectedIds.size })); + }; + + const handleOpenBrowser = async (id: number) => { + try { + const result = await api.openBrowser(id); + if (result.status === "revalidating") { + addToast("warn", t("toast.cookiesExpiredRevalidating")); + if (result.task_id) { + setProcessingIds((prev) => new Set(prev).add(id)); + watchTask(result.task_id, [id]); + } + } else { + addToast("info", t("toast.browserOpening")); + } + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }; + + const handleAssignProxies = async () => { + confirm(t("confirm.assignProxies"), async () => { + try { + const r = await api.assignProxies(); + addToast("success", t("toast.proxiesAssigned", { used: r.proxies_used, count: r.assigned })); + await loadAccounts(); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }); + }; + + const handleReassignProxies = async () => { + confirm(t("confirm.reassignProxies"), async () => { + try { + const r = await api.reassignProxies(); + addToast("success", t("toast.proxiesReassigned", { used: r.proxies_used, count: r.assigned })); + await loadAccounts(); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }); + }; + + const handleClearProxies = async () => { + confirm(t("confirm.clearProxies"), async () => { + try { + const r = await api.clearProxies(); + addToast("success", t("toast.proxiesClearedCount", { count: r.cleared })); + await loadAccounts(); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }); + }; + + const editAccount = editId ? accounts.find((a) => a.id === editId) : null; + + const SECTIONS: { id: AccountSection; label: string; icon: React.ReactNode }[] = [ + { id: "mafile", label: "Mafile", icon: }, + { id: "logpass", label: "Log:Pass", icon: }, + { id: "token", label: "Token", icon: }, + ]; + + return ( +
+ {/* Section sidebar */} +
+

{t("section.dataType")}

+ {SECTIONS.map((s) => ( + + ))} + +
+ + {section === "logpass" &&
} + {section === "token" &&
} + {section === "mafile" &&
+ {/* Toolbar */} +
+ + + + {/* Inline progress indicator */} + {activeTask && ( + <> +
+
+ + {activeTask.type === "validate" ? t("task.validate") : + activeTask.type === "change_password" ? t("task.changePassword") : + activeTask.type === "random_password" ? t("task.randomPassword") : + activeTask.type === "change_email" ? t("task.changeEmail") : + activeTask.type === "change_phone" ? t("task.changePhone") : + activeTask.type === "remove_guard" ? t("task.removeGuard") : + activeTask.type} + +
+
1 + ? (activeTask.total > 0 ? Math.round((activeTask.progress / activeTask.total) * 100) : 0) + : (activeTask.total_steps ? Math.round(((activeTask.step ?? 0) / activeTask.total_steps) * 100) : 0)}%` }} + /> +
+ + {activeTask.total > 1 + ? `${activeTask.progress}/${activeTask.total}${activeTask.active_count ? ` (${activeTask.active_count})` : ""}` + : (activeTask.step_label || `${activeTask.progress}/${activeTask.total}`)} + {activeTask.total > 1 + ? ` (${activeTask.total > 0 ? Math.round((activeTask.progress / activeTask.total) * 100) : 0}%)` + : (activeTask.total_steps ? ` (${activeTask.step}/${activeTask.total_steps})` : "")} + + {activeTask.status === "completed" && } + {activeTask.status === "failed" && } +
+ + )} + +
+ +
+ + +
+
+ + {/* Table with action bar */} +
+ {/* Action bar (table header panel) */} +
+ + + {activeTask && activeTask.status === "running" && ( + + )} +
+ +
+ + + +
+ setSearchQuery(e.target.value)} + placeholder={t("ph.search")} + className="bg-dark-700 border border-dark-600 rounded px-2 py-1.5 text-xs w-80 placeholder:text-gray-500 outline-none focus:border-accent" + /> +
+
+ {/* Table */} +
+ +
+
+
} + + {/* Modals */} + {editAccount && ( + setEditId(null)} /> + )} + {showImport && setShowImport(false)} />} + {showAdd && setShowAdd(false)} />} + {confirmMsg && onConfirmAction && ( + { onConfirmAction(); setConfirmMsg(null); setOnConfirmAction(null); }} + onCancel={() => { setConfirmMsg(null); setOnConfirmAction(null); }} + /> + )} + {promptData && ( +
+
e.stopPropagation()}> +

{promptData.message}

+ setPromptValue(e.target.value)} + onKeyDown={(e) => e.key === "Enter" && handlePromptSubmit()} + className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm mb-3" + placeholder={t("prompt.enterValue")} + /> +
+ + +
+
+
+ )} +
+ ); +} diff --git a/frontend/src/components/accounts/ActionMenu.tsx b/frontend/src/components/accounts/ActionMenu.tsx new file mode 100644 index 0000000..0336c6f --- /dev/null +++ b/frontend/src/components/accounts/ActionMenu.tsx @@ -0,0 +1,219 @@ +import { useState, useRef, useEffect, useCallback } from "react"; +import { createPortal } from "react-dom"; +import type { Account } from "@/api/types"; +import { api } from "@/api/client"; +import { useAccountStore } from "@/stores/accountStore"; +import { useUiStore } from "@/stores/uiStore"; +import { IconZap } from "@/components/shared/Icons"; +import { useT } from "@/lib/i18n"; + +const ROW_ACTION_KEYS = [ + { action: "validate", labelKey: "action.validate" }, + { action: "change_password", labelKey: "action.changePassword" }, + { action: "random_password", labelKey: "action.randomPassword" }, + { action: "change_email", labelKey: "action.changeEmail" }, + { action: "change_phone", labelKey: "action.changePhone" }, + { action: "remove_guard", labelKey: "action.removeGuard" }, +] as const; + +const PARAM_ACTION_KEYS: Record = { + change_password: "prompt.newPassword", + change_email: "prompt.newEmail", + change_phone: "prompt.newPhone", +}; + +const PARAM_KEYS: Record = { + change_password: "new_password", + change_email: "new_email", + change_phone: "new_phone", +}; + +const CONFIRM_ACTION_KEYS: Record = { + remove_guard: "confirm.removeGuard", +}; + +interface Props { + account: Account; + onAction: (id: number, action: string, params: Record) => void; + onToggleAutoAccept: (id: number) => void; +} + +export function ActionMenu({ account, onAction, onToggleAutoAccept }: Props) { + const [open, setOpen] = useState(false); + const [paramPrompt, setParamPrompt] = useState<{ action: string; title: string } | null>(null); + const [paramValue, setParamValue] = useState(""); + const [confirmPrompt, setConfirmPrompt] = useState<{ action: string; title: string } | null>(null); + const [menuPos, setMenuPos] = useState<{ top: number; left: number } | null>(null); + const menuRef = useRef(null); + const btnRef = useRef(null); + const addToast = useUiStore((s) => s.addToast); + const loadAccounts = useAccountStore((s) => s.loadAccounts); + const t = useT(); + + const updatePosition = useCallback(() => { + if (!btnRef.current) return; + const rect = btnRef.current.getBoundingClientRect(); + const menuHeight = 320; + const spaceBelow = window.innerHeight - rect.bottom; + const top = spaceBelow < menuHeight + ? Math.max(4, rect.top - menuHeight) + : rect.bottom + 4; + const left = Math.max(4, rect.right - 180); + setMenuPos({ top, left }); + }, []); + + useEffect(() => { + if (!open) return; + updatePosition(); + function handleClick(e: MouseEvent) { + if ( + menuRef.current && !menuRef.current.contains(e.target as Node) && + btnRef.current && !btnRef.current.contains(e.target as Node) + ) { + setOpen(false); + } + } + function handleScroll() { setOpen(false); } + document.addEventListener("mousedown", handleClick); + window.addEventListener("scroll", handleScroll, true); + return () => { + document.removeEventListener("mousedown", handleClick); + window.removeEventListener("scroll", handleScroll, true); + }; + }, [open, updatePosition]); + + const handleAction = (action: string, _label: string) => { + setOpen(false); + const confirmKey = CONFIRM_ACTION_KEYS[action]; + if (confirmKey) { + setConfirmPrompt({ action, title: t(confirmKey) }); + return; + } + const promptKey = PARAM_ACTION_KEYS[action]; + if (promptKey) { + setParamPrompt({ action, title: t(promptKey) }); + setParamValue(""); + } else { + onAction(account.id, action, {}); + } + }; + + const submitParam = () => { + if (!paramPrompt || !paramValue) return; + const paramKey = PARAM_KEYS[paramPrompt.action] || "value"; + onAction(account.id, paramPrompt.action, { [paramKey]: paramValue }); + setParamPrompt(null); + }; + + const aaLabel = account.auto_accept ? t("action.disableAutoAccept") : t("action.enableAutoAcceptLogin"); + + const handleRemoveProxy = async () => { + setOpen(false); + try { + await api.updateAccount(account.id, { proxy: "" }); + addToast("success", t("toast.proxyCleared", { name: account.login })); + await loadAccounts(); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }; + + const handleReassignProxy = async () => { + setOpen(false); + try { + const r = await api.reassignProxies(); + addToast("success", t("toast.proxiesReassigned", { used: r.proxies_used, count: r.assigned })); + await loadAccounts(); + } catch (e: unknown) { + addToast("error", t("misc.error", { error: e instanceof Error ? e.message : String(e) })); + } + }; + + return ( + <> +
+ + {open && menuPos && createPortal( +
+ {ROW_ACTION_KEYS.map(({ action, labelKey }) => { + const disabled = action === "remove_guard" && !account.has_revocation_code; + if (disabled) { + return ( + + + + ); + } + return ( + + ); + })} +
+ + +
+ +
, + document.body, + )} +
+ + {paramPrompt && ( +
setParamPrompt(null)}> +
e.stopPropagation()}> +

{paramPrompt.title}

+ setParamValue(e.target.value)} + onKeyDown={(e) => e.key === "Enter" && submitParam()} + className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm mb-3" + placeholder={paramPrompt.action.includes("phone") ? "+7 9123456789" : undefined} + /> +
+ + +
+
+
+ )} + + {confirmPrompt && ( +
setConfirmPrompt(null)}> +
e.stopPropagation()}> +

{confirmPrompt.title}

+
+ + +
+
+
+ )} + + ); +} diff --git a/frontend/src/components/accounts/AddModal.tsx b/frontend/src/components/accounts/AddModal.tsx new file mode 100644 index 0000000..06722eb --- /dev/null +++ b/frontend/src/components/accounts/AddModal.tsx @@ -0,0 +1,41 @@ +import { useState } from "react"; +import type { AccountCreate } from "@/api/types"; +import { useT } from "@/lib/i18n"; + +interface Props { + onSave: (data: AccountCreate) => void; + onClose: () => void; +} + +export function AddModal({ onSave, onClose }: Props) { + const t = useT(); + const [login, setLogin] = useState(""); + const [password, setPassword] = useState(""); + const [email, setEmail] = useState(""); + const [proxy, setProxy] = useState(""); + + const handleSave = () => { + if (!login || !password) return; + onSave({ + login, + password, + email: email || undefined, + proxy: proxy || undefined, + }); + }; + + return ( +
+
e.stopPropagation()}> +

{t("modal.addAccount")}

+
+ setLogin(e.target.value)} placeholder={t("ph.login")} className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + setPassword(e.target.value)} placeholder={t("ph.password")} className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + setEmail(e.target.value)} placeholder="Email" className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + setProxy(e.target.value)} placeholder={t("ph.proxy")} className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + +
+
+
+ ); +} diff --git a/frontend/src/components/accounts/Badges.tsx b/frontend/src/components/accounts/Badges.tsx new file mode 100644 index 0000000..48fae53 --- /dev/null +++ b/frontend/src/components/accounts/Badges.tsx @@ -0,0 +1,37 @@ +import { IconLock, IconUnlock } from "@/components/shared/Icons"; +import { t } from "@/lib/i18n"; + +interface Props { + status: string; +} + +const STATUS_KEYS: Record = { + unknown: ["badge-unknown", "status.unknown"], + valid: ["badge-ok", "status.valid"], + invalid: ["badge-error", "status.invalid"], + locked: ["badge-error", "status.locked"], + limited: ["badge-running", "status.limited"], +}; + +export function StatusBadge({ status }: Props) { + const entry = STATUS_KEYS[status]; + const [cls, text] = entry ? [entry[0], t(entry[1])] : ["badge-unknown", status]; + return {text}; +} + +export function BanBadge({ status }: { status: string | null }) { + if (status === "BANNED") return {t("status.banned")}; + if (status === "NO BAN") return {t("status.ok")}; + return ; +} + +export function LockBadge({ status }: Props) { + if (status === "locked") return ; + return ; +} + +export function MafileBadge({ hasMafile }: { hasMafile: boolean }) { + return hasMafile + ? + : ; +} diff --git a/frontend/src/components/accounts/ColumnSettingsDropdown.tsx b/frontend/src/components/accounts/ColumnSettingsDropdown.tsx new file mode 100644 index 0000000..2ac994a --- /dev/null +++ b/frontend/src/components/accounts/ColumnSettingsDropdown.tsx @@ -0,0 +1,59 @@ +import { useState, useRef, useEffect } from "react"; +import { useUiStore } from "@/stores/uiStore"; +import type { ColumnSettings } from "@/api/types"; +import { IconSettings } from "@/components/shared/Icons"; +import { useT } from "@/lib/i18n"; + +const COL_LABEL_KEYS: Record = { + browser: "col.browser", profile: "col.profile", last_online: "col.lastOnline", + steam_id: "col.steamId", login: "col.login", password: "col.password", + login_pass: "col.loginPass", email: "col.email", email_pass: "col.emailPass", + email_login_pass: "col.emailLoginPass", phone: "col.phone", status: "col.status", + ban: "col.ban", twofa: "col.twofa", mafile: "col.mafile", proxy: "col.proxy", + notes: "col.notes", actions: "col.actions", +}; + +export function ColumnSettingsDropdown() { + const [open, setOpen] = useState(false); + const cols = useUiStore((s) => s.columnVisibility); + const toggleColumn = useUiStore((s) => s.toggleColumn); + const ref = useRef(null); + const t = useT(); + + useEffect(() => { + const handler = (e: MouseEvent) => { + if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); + }; + document.addEventListener("mousedown", handler); + return () => document.removeEventListener("mousedown", handler); + }, []); + + return ( +
+ + {open && ( +
+ {(Object.keys(COL_LABEL_KEYS) as (keyof ColumnSettings)[]).map((key) => ( + + ))} +
+ )} +
+ ); +} diff --git a/frontend/src/components/accounts/EditModal.tsx b/frontend/src/components/accounts/EditModal.tsx new file mode 100644 index 0000000..6dea62c --- /dev/null +++ b/frontend/src/components/accounts/EditModal.tsx @@ -0,0 +1,47 @@ +import { useState, useRef, useEffect } from "react"; +import type { Account, AccountUpdate } from "@/api/types"; +import { useT } from "@/lib/i18n"; + +interface Props { + account: Account; + onSave: (id: number, data: AccountUpdate) => void; + onClose: () => void; +} + +export function EditModal({ account, onSave, onClose }: Props) { + const t = useT(); + const [login, setLogin] = useState(account.login); + const [password, setPassword] = useState(account.password); + const [email, setEmail] = useState(account.email ?? ""); + const [proxy, setProxy] = useState(account.proxy ?? ""); + const [notes, setNotes] = useState(account.notes ?? ""); + const ref = useRef(null); + + useEffect(() => { ref.current?.focus(); }, []); + + const handleSave = () => { + onSave(account.id, { + login, + password, + email: email || undefined, + proxy: proxy || undefined, + notes: notes || undefined, + }); + }; + + return ( +
+
e.stopPropagation()}> +

{t("modal.editAccount")}

+
+ setLogin(e.target.value)} placeholder={t("ph.login")} className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + setPassword(e.target.value)} placeholder={t("ph.password")} className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + setEmail(e.target.value)} placeholder="Email" className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + setProxy(e.target.value)} placeholder={t("ph.proxy")} className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + setNotes(e.target.value)} placeholder={t("ph.notes")} className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + +
+
+
+ ); +} diff --git a/frontend/src/components/accounts/ImportModal.tsx b/frontend/src/components/accounts/ImportModal.tsx new file mode 100644 index 0000000..39fbf22 --- /dev/null +++ b/frontend/src/components/accounts/ImportModal.tsx @@ -0,0 +1,74 @@ +import { useState, useRef } from "react"; +import { api } from "@/api/client"; +import { useUiStore } from "@/stores/uiStore"; +import { useAccountStore } from "@/stores/accountStore"; +import { IconUpload } from "@/components/shared/Icons"; +import { useT } from "@/lib/i18n"; + +interface Props { + onClose: () => void; +} + +export function ImportModal({ onClose }: Props) { + const t = useT(); + const [file, setFile] = useState(null); + const [result, setResult] = useState(""); + const [uploading, setUploading] = useState(false); + const inputRef = useRef(null); + const addToast = useUiStore((s) => s.addToast); + const loadAccounts = useAccountStore((s) => s.loadAccounts); + + const handleDrop = (e: React.DragEvent) => { + e.preventDefault(); + const f = e.dataTransfer.files[0]; + if (f) setFile(f); + }; + + const doImport = async () => { + if (!file) return; + setUploading(true); + try { + const res = await api.importAccounts(file); + setResult(t("toast.importResult", { imported: res.imported, skipped: res.skipped })); + addToast("success", `${res.imported} ok, ${res.skipped} skip`); + await loadAccounts(); + } catch (e: unknown) { + setResult(e instanceof Error ? e.message : t("misc.errorStr")); + } finally { + setUploading(false); + } + }; + + return ( +
+
e.stopPropagation()}> +

{t("modal.importAccounts")}

+
+

{t("import.formats")} ({t("import.delimiter")} : {t("import.or")} |)

+

login:pass:{"{"}mafile{"}"}

+

login:pass:email:email_pass:{"{"}mafile{"}"}

+

login:pass:email:email_pass

+
+
e.preventDefault()} + onDrop={handleDrop} + onClick={() => inputRef.current?.click()} + className="border-2 border-dashed border-dark-500 rounded-lg p-6 mb-3 text-center cursor-pointer transition-colors hover:border-accent" + > + +

+ {file ? t("import.selected", { name: file.name }) : t("import.dragTxt")} +

+
+ { + const f = e.target.files?.[0]; + if (f) setFile(f); + }} /> + + {result &&

{result}

} +
+
+ ); +} diff --git a/frontend/src/components/accounts/LogpassAddModal.tsx b/frontend/src/components/accounts/LogpassAddModal.tsx new file mode 100644 index 0000000..3085605 --- /dev/null +++ b/frontend/src/components/accounts/LogpassAddModal.tsx @@ -0,0 +1,43 @@ +import { useState } from "react"; +import { api } from "@/api/client"; +import { useLogpassStore } from "@/stores/logpassStore"; +import type { LogpassAccountCreate } from "@/api/types"; +import { useT } from "@/lib/i18n"; + +interface Props { + onClose: () => void; +} + +export function LogpassAddModal({ onClose }: Props) { + const t = useT(); + const [login, setLogin] = useState(""); + const [password, setPassword] = useState(""); + const [proxy, setProxy] = useState(""); + const loadAccounts = useLogpassStore((s) => s.loadAccounts); + + const handleSave = async () => { + if (!login || !password) return; + const data: LogpassAccountCreate = { + login, + password, + proxy: proxy || undefined, + }; + await api.createLogpassAccount(data); + await loadAccounts(); + onClose(); + }; + + return ( +
+
e.stopPropagation()}> +

{t("modal.addAccount")}

+
+ setLogin(e.target.value)} placeholder={t("ph.login")} className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + setPassword(e.target.value)} placeholder={t("ph.password")} className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + setProxy(e.target.value)} placeholder={t("ph.proxyOptional")} className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" /> + +
+
+
+ ); +} diff --git a/frontend/src/components/accounts/LogpassColumnSettingsDropdown.tsx b/frontend/src/components/accounts/LogpassColumnSettingsDropdown.tsx new file mode 100644 index 0000000..a51187e --- /dev/null +++ b/frontend/src/components/accounts/LogpassColumnSettingsDropdown.tsx @@ -0,0 +1,58 @@ +import { useState, useRef, useEffect } from "react"; +import { useUiStore } from "@/stores/uiStore"; +import type { LogpassColumnSettings } from "@/api/types"; +import { IconSettings } from "@/components/shared/Icons"; +import { useT } from "@/lib/i18n"; + +const COL_LABEL_KEYS: Record = { + browser: "col.browser", profile: "col.profile", last_online: "col.lastOnline", + steam_id: "col.steamId", login: "col.login", password: "col.password", + login_pass: "col.loginPass", status: "col.status", ban: "col.ban", + prime: "col.prime", trophy: "col.trophy", behavior: "col.behavior", + license: "col.license", proxy: "col.proxy", notes: "col.notes", actions: "col.actions", +}; + +export function LogpassColumnSettingsDropdown() { + const [open, setOpen] = useState(false); + const cols = useUiStore((s) => s.logpassColumnVisibility); + const toggleColumn = useUiStore((s) => s.toggleLogpassColumn); + const ref = useRef(null); + const t = useT(); + + useEffect(() => { + const handler = (e: MouseEvent) => { + if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); + }; + document.addEventListener("mousedown", handler); + return () => document.removeEventListener("mousedown", handler); + }, []); + + return ( +
+ + {open && ( +
+ {(Object.keys(COL_LABEL_KEYS) as (keyof LogpassColumnSettings)[]).map((key) => ( + + ))} +
+ )} +
+ ); +} diff --git a/frontend/src/components/accounts/LogpassEditModal.tsx b/frontend/src/components/accounts/LogpassEditModal.tsx new file mode 100644 index 0000000..302c22e --- /dev/null +++ b/frontend/src/components/accounts/LogpassEditModal.tsx @@ -0,0 +1,70 @@ +import { useState } from "react"; +import { api } from "@/api/client"; +import { useLogpassStore } from "@/stores/logpassStore"; +import type { LogpassAccount } from "@/api/types"; +import { useT } from "@/lib/i18n"; + +interface Props { + account: LogpassAccount; + onClose: () => void; +} + +export function LogpassEditModal({ account, onClose }: Props) { + const t = useT(); + const [login, setLogin] = useState(account.login); + const [password, setPassword] = useState(account.password); + const [proxy, setProxy] = useState(account.proxy ?? ""); + const [notes, setNotes] = useState(account.notes ?? ""); + const loadAccounts = useLogpassStore((s) => s.loadAccounts); + + const handleSave = async () => { + if (!login || !password) return; + await api.updateLogpassAccount(account.id, { + login, + password, + proxy: proxy || undefined, + notes: notes || undefined, + }); + await loadAccounts(); + onClose(); + }; + + return ( +
+
e.stopPropagation()}> +

{t("modal.editAccount")}

+
+ setLogin(e.target.value)} + placeholder={t("ph.login")} + className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" + /> + setPassword(e.target.value)} + placeholder={t("ph.password")} + className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" + /> + setProxy(e.target.value)} + placeholder={t("ph.proxyOptional")} + className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" + /> + setNotes(e.target.value)} + placeholder={t("ph.notes")} + className="w-full bg-dark-700 border border-dark-600 rounded px-3 py-2 text-sm" + /> +
+ + +
+
+
+
+ ); +} diff --git a/frontend/src/components/accounts/LogpassImportModal.tsx b/frontend/src/components/accounts/LogpassImportModal.tsx new file mode 100644 index 0000000..792e8c8 --- /dev/null +++ b/frontend/src/components/accounts/LogpassImportModal.tsx @@ -0,0 +1,78 @@ +import { useState, useRef } from "react"; +import { api } from "@/api/client"; +import { useLogpassStore } from "@/stores/logpassStore"; +import { useUiStore } from "@/stores/uiStore"; +import { IconUpload } from "@/components/shared/Icons"; +import { useT } from "@/lib/i18n"; + +interface Props { + onClose: () => void; +} + +export function LogpassImportModal({ onClose }: Props) { + const t = useT(); + const [file, setFile] = useState(null); + const [result, setResult] = useState(""); + const [uploading, setUploading] = useState(false); + const inputRef = useRef(null); + const addToast = useUiStore((s) => s.addToast); + const loadAccounts = useLogpassStore((s) => s.loadAccounts); + + const handleDrop = (e: React.DragEvent) => { + e.preventDefault(); + const f = e.dataTransfer.files[0]; + if (f) setFile(f); + }; + + const doImport = async () => { + if (!file) return; + setUploading(true); + try { + const text = await file.text(); + const lines = text.split("\n").map((l) => l.trim()).filter(Boolean); + if (!lines.length) { setResult(t("toast.fileEmpty")); setUploading(false); return; } + const res = await api.importLogpass(lines); + setResult(t("toast.importResult", { imported: res.imported, skipped: res.skipped })); + addToast("success", `${res.imported} ok, ${res.skipped} skip`); + await loadAccounts(); + } catch (e: unknown) { + setResult(e instanceof Error ? e.message : t("misc.errorStr")); + } finally { + setUploading(false); + } + }; + + return ( +
+
e.stopPropagation()}> +

{t("modal.importAccounts")}

+
+

{t("import.formatsColon")}

+

login:pass

+

login|pass

+

CSV: login,password,steam_id,ban,prime,trophy,behavior,license

+

⚠ Mafile-файлы и JSON не принимаются. Только log:pass / log|pass.

+
+
e.preventDefault()} + onDrop={handleDrop} + onClick={() => inputRef.current?.click()} + className="border-2 border-dashed border-dark-500 rounded-lg p-6 mb-3 text-center cursor-pointer transition-colors hover:border-accent" + > + +

+ {file ? t("import.selected", { name: file.name }) : t("import.dragTxtCsv")} +

+
+ { + const f = e.target.files?.[0]; + if (f) setFile(f); + }} /> + + {result &&

{result}

} +
+
+ ); +} diff --git a/frontend/src/components/accounts/LogpassTab.tsx b/frontend/src/components/accounts/LogpassTab.tsx new file mode 100644 index 0000000..cc0546a --- /dev/null +++ b/frontend/src/components/accounts/LogpassTab.tsx @@ -0,0 +1,658 @@ +import { useEffect, useState, useCallback, useMemo, useRef } from "react"; +import { api } from "@/api/client"; +import { useLogpassStore } from "@/stores/logpassStore"; +import { useUiStore } from "@/stores/uiStore"; +import { ConfirmModal } from "@/components/shared/Modals"; +import { LogpassImportModal } from "./LogpassImportModal"; +import { LogpassAddModal } from "./LogpassAddModal"; +import { LogpassEditModal } from "./LogpassEditModal"; +import { LogpassColumnSettingsDropdown } from "./LogpassColumnSettingsDropdown"; +import { StatusBadge, BanBadge } from "./Badges"; +import { SteamLevelBadge } from "./SteamLevelBadge"; +import { copyText } from "@/lib/clipboard"; +import { + IconDownload, IconPlus, IconPlay, IconTrash, IconCheckCircle, IconXCircle, + IconEye, IconEyeOff, IconGlobe, IconRefresh, IconBan, + IconCheck, IconAlertTriangle, IconEdit, +} from "@/components/shared/Icons"; +import type { Task, LogpassColumnSettings } from "@/api/types"; +import { useT } from "@/lib/i18n"; + +type AccResults = Record; +type AccSteps = Record; + +function parseAccResults(raw: Task["account_results"]): AccResults | null { + if (!raw) return null; + if (typeof raw === "string") { + try { return JSON.parse(raw) as AccResults; } catch { return null; } + } + return raw; +} + +export function LogpassTab() { + const accounts = useLogpassStore((s) => s.accounts); + const selectedIds = useLogpassStore((s) => s.selectedIds); + const loadAccounts = useLogpassStore((s) => s.loadAccounts); + const selectAll = useLogpassStore((s) => s.selectAll); + const clearSelection = useLogpassStore((s) => s.clearSelection); + const addToast = useUiStore((s) => s.addToast); + const cols = useUiStore((s) => s.logpassColumnVisibility); + const t = useT(); + + const [searchQuery, setSearchQuery] = useState(""); + const [showImport, setShowImport] = useState(false); + const [showAdd, setShowAdd] = useState(false); + const [editAccountId, setEditAccountId] = useState(null); + const [confirmModal, setConfirmModal] = useState<{ open: boolean; message: string; onConfirm: () => void }>({ open: false, message: "", onConfirm: () => {} }); + const [processingIds, setProcessingIds] = useState>(new Set()); + const [accountResults, setAccountResults] = useState({}); + const [accountSteps, setAccountSteps] = useState({}); + const [activeTask, setActiveTask] = useState(null); + const BATCH = 100; + const [visibleCount, setVisibleCount] = useState(BATCH); + + type SortField = "last_online" | "prime" | "trophy" | "behavior" | null; + type SortDir = "asc" | "desc"; + const [sortField, setSortField] = useState(null); + const [sortDir, setSortDir] = useState("asc"); + const toggleSort = (field: SortField) => { + if (sortField === field) { + if (sortDir === "asc") setSortDir("desc"); + else { setSortField(null); setSortDir("asc"); } + } else { + setSortField(field); + setSortDir("asc"); + } + }; + const sentinelRef = useRef(null); + + useEffect(() => { loadAccounts(); }, [loadAccounts]); + + const confirm = (msg: string, fn: () => void) => setConfirmModal({ open: true, message: msg, onConfirm: fn }); + + const watchTask = useCallback((taskId: string) => { + const es = new EventSource(`/api/tasks/${taskId}/stream`); + es.onmessage = (ev) => { + try { + const data = JSON.parse(ev.data) as Task; + setActiveTask(data); + if (data.account_results) { + const r = parseAccResults(data.account_results); + if (r) setAccountResults(r); + } + if (data.account_steps) setAccountSteps(data.account_steps as AccSteps); + if (data.status !== "running") { + es.close(); + setProcessingIds(new Set()); + setActiveTask(null); + loadAccounts(); + } + } catch { /* ignore */ } + }; + es.onerror = () => es.close(); + }, [loadAccounts]); + + const handleValidate = useCallback(async () => { + const ids = [...selectedIds]; + if (!ids.length) return; + clearSelection(); + setProcessingIds(new Set(ids)); + setAccountResults({}); + setAccountSteps({}); + try { + const { task_id } = await api.validateLogpass(ids); + setActiveTask({ id: task_id, type: "logpass_validate", status: "running", progress: 0, total: ids.length, result: null, error: null, created_at: "", updated_at: "" }); + watchTask(task_id); + } catch (err) { + setProcessingIds(new Set()); + addToast("error", String(err)); + } + }, [selectedIds, clearSelection, watchTask, addToast]); + + const handleValidateSingle = useCallback(async (id: number) => { + setProcessingIds(new Set([id])); + setAccountResults((r) => { const n = { ...r }; delete n[String(id)]; return n; }); + setAccountSteps((s) => { const n = { ...s }; delete n[String(id)]; return n; }); + try { + const { task_id } = await api.validateLogpass([id]); + setActiveTask({ id: task_id, type: "logpass_validate", status: "running", progress: 0, total: 1, result: null, error: null, created_at: "", updated_at: "" }); + watchTask(task_id); + } catch (err) { + setProcessingIds(new Set()); + addToast("error", String(err)); + } + }, [watchTask, addToast]); + + const handleFullParse = useCallback(async () => { + const ids = [...selectedIds]; + if (!ids.length) return; + clearSelection(); + setProcessingIds(new Set(ids)); + setAccountResults({}); + setAccountSteps({}); + try { + const { task_id } = await api.fullParseLogpass(ids); + setActiveTask({ id: task_id, type: "logpass_full_parse", status: "running", progress: 0, total: ids.length, result: null, error: null, created_at: "", updated_at: "" }); + watchTask(task_id); + } catch (err) { + setProcessingIds(new Set()); + addToast("error", String(err)); + } + }, [selectedIds, clearSelection, watchTask, addToast]); + + const handleDeleteSelected = () => { + const ids = [...selectedIds]; + if (!ids.length) return; + confirm(t("confirm.deleteLogpassSelected", { count: ids.length }), async () => { + await api.deleteLogpassBulk(ids); + clearSelection(); + loadAccounts(); + }); + }; + + const handleDeleteAll = () => { + confirm(t("confirm.deleteLogpassAll", { count: accounts.length }), async () => { + await api.deleteLogpassBulk(accounts.map((a) => a.id)); + clearSelection(); + loadAccounts(); + }); + }; + + const handleAssignProxies = () => { + confirm(t("confirm.assignProxies"), async () => { + try { + const r = await api.assignLogpassProxies(); + addToast("success", t("toast.proxiesAssignedShort", { count: r.assigned })); + loadAccounts(); + } catch (e: unknown) { addToast("error", e instanceof Error ? e.message : String(e)); } + }); + }; + + const handleReassignProxies = () => { + confirm(t("confirm.reassignProxiesAll"), async () => { + try { + const r = await api.reassignLogpassProxies(); + addToast("success", t("toast.proxiesReassignedShort", { count: r.assigned })); + loadAccounts(); + } catch (e: unknown) { addToast("error", e instanceof Error ? e.message : String(e)); } + }); + }; + + const handleClearProxies = () => { + confirm(t("confirm.clearProxies"), async () => { + try { + const r = await api.clearLogpassProxies(); + addToast("success", t("toast.proxiesClearedShort", { count: r.cleared })); + loadAccounts(); + } catch (e: unknown) { addToast("error", e instanceof Error ? e.message : String(e)); } + }); + }; + + const allSelected = accounts.length > 0 && selectedIds.size === accounts.length; + const filtered = useMemo(() => { + if (!searchQuery.trim()) return accounts; + const q = searchQuery.trim(); + + // lvl comparison syntax: lvl>10, lvl<10, lvl>=10, lvl<=10, lvl=10 + const lvlMatch = q.match(/^lvl\s*(>=|<=|>|<|=)\s*(\d+)$/i); + if (lvlMatch) { + const op = lvlMatch[1]; + const val = parseInt(lvlMatch[2], 10); + return accounts.filter((a) => { + const lvl = a.steam_level; + if (lvl == null) return false; + if (op === ">") return lvl > val; + if (op === ">=") return lvl >= val; + if (op === "<") return lvl < val; + if (op === "<=") return lvl <= val; + return lvl === val; + }); + } + + const ql = q.toLowerCase(); + return accounts.filter((a) => + a.login.toLowerCase().includes(ql) || + (a.steam_id ?? "").toLowerCase().includes(ql) || + (a.nickname ?? "").toLowerCase().includes(ql) || + (a.notes ?? "").toLowerCase().includes(ql) || + (a.license ?? "").toLowerCase().includes(ql) + ); + }, [accounts, searchQuery]); + + const sorted = useMemo(() => { + if (!sortField) return filtered; + const dir = sortDir === "asc" ? 1 : -1; + const EMPTY = Symbol(); + return [...filtered].sort((a, b) => { + let va: number | typeof EMPTY = EMPTY; + let vb: number | typeof EMPTY = EMPTY; + if (sortField === "last_online") { + const parseOnline = (v: string | null | undefined): number | typeof EMPTY => { + if (!v || v === "\u2014") return EMPTY; + if (v === "online") return -1; + const m = v.match(/^(\d+)([mhd])$/i); + if (!m) return EMPTY; + const n = parseInt(m[1], 10); + if (m[2] === "m") return n; + if (m[2] === "h") return n * 60; + return n * 1440; + }; + va = parseOnline(a.last_online); + vb = parseOnline(b.last_online); + } else if (sortField === "prime") { + va = a.prime === "Enabled" ? 0 : a.prime === "Disabled" ? 1 : EMPTY; + vb = b.prime === "Enabled" ? 0 : b.prime === "Disabled" ? 1 : EMPTY; + } else if (sortField === "trophy") { + va = a.trophy != null && a.trophy !== "\u2014" ? parseInt(a.trophy, 10) || 0 : EMPTY; + vb = b.trophy != null && b.trophy !== "\u2014" ? parseInt(b.trophy, 10) || 0 : EMPTY; + } else if (sortField === "behavior") { + va = a.behavior != null && a.behavior !== "\u2014" ? parseInt(a.behavior, 10) || 0 : EMPTY; + vb = b.behavior != null && b.behavior !== "\u2014" ? parseInt(b.behavior, 10) || 0 : EMPTY; + } + // Empty values always sink to the bottom + if (va === EMPTY && vb === EMPTY) return 0; + if (va === EMPTY) return 1; + if (vb === EMPTY) return -1; + if (va === vb) return 0; + return (va < vb ? -1 : 1) * dir; + }); + }, [filtered, sortField, sortDir]); + + useEffect(() => { setVisibleCount(BATCH); }, [searchQuery, sortField, sortDir]); + + const visible = useMemo(() => sorted.slice(0, visibleCount), [sorted, visibleCount]); + + useEffect(() => { + const el = sentinelRef.current; + if (!el) return; + const obs = new IntersectionObserver((entries) => { + if (entries[0].isIntersecting) setVisibleCount((c) => Math.min(c + BATCH, sorted.length)); + }, { rootMargin: "400px" }); + obs.observe(el); + return () => obs.disconnect(); + }, [sorted.length, visibleCount]); + + const proxyLabels = useMemo(() => { + const map = new Map(); + const unique: string[] = []; + for (const a of accounts) { + if (a.proxy && !unique.includes(a.proxy)) unique.push(a.proxy); + } + const proxyToNum = new Map(); + unique.forEach((p, i) => proxyToNum.set(p, i + 1)); + for (const a of accounts) { + if (a.proxy) map.set(a.id, t("proxy.label", { num: proxyToNum.get(a.proxy) ?? 0 })); + } + return map; + }, [accounts]); + + const handleOpenBrowser = async (id: number) => { + try { + const result = await api.openLogpassBrowser(id); + if (result.status === "revalidating") { + addToast("warn", t("toast.cookiesExpiredRevalidating")); + if (result.task_id) { + setProcessingIds(new Set([id])); + setActiveTask({ id: result.task_id, type: "logpass_validate", status: "running", progress: 0, total: 1, result: null, error: null, created_at: "", updated_at: "" }); + watchTask(result.task_id); + } + } else { + addToast("success", t("toast.browserOpening")); + } + } catch (e: unknown) { + addToast("error", e instanceof Error ? e.message : String(e)); + } + }; + + return ( +
+ {/* Toolbar */} +
+ + + + {/* Progress indicator — exact match to AccountsTab */} + {activeTask && ( + <> +
+
+ {t("task.validate")} +
+
1 + ? (activeTask.total > 0 ? Math.round((activeTask.progress / activeTask.total) * 100) : 0) + : (activeTask.total_steps ? Math.round(((activeTask.step ?? 0) / activeTask.total_steps) * 100) : 0)}%` }} + /> +
+ + {activeTask.total > 1 + ? `${activeTask.progress}/${activeTask.total}${activeTask.active_count ? ` (${activeTask.active_count})` : ""}` + : (activeTask.step_label || `${activeTask.progress}/${activeTask.total}`)} + {activeTask.total > 1 + ? ` (${activeTask.total > 0 ? Math.round((activeTask.progress / activeTask.total) * 100) : 0}%)` + : (activeTask.total_steps ? ` (${activeTask.step}/${activeTask.total_steps})` : "")} + + {activeTask.status === "completed" && } + {activeTask.status === "failed" && } +
+ + )} + +
+ +
+ + +
+
+ + {/* Table with action bar */} +
+ {/* Action bar */} +
+ + + {activeTask && activeTask.status === "running" && ( + + )} +
+ + + +
+ setSearchQuery(e.target.value)} + placeholder={t("ph.searchLogpass")} + className="bg-dark-700 border border-dark-600 rounded px-2 py-1.5 text-xs w-80 placeholder:text-gray-500 outline-none focus:border-accent" + /> +
+
+ + {/* Table */} +
+ + + + + } + {cols.profile && } + {cols.last_online && } + {cols.steam_id && } + {cols.login && } + {cols.password && } + {cols.login_pass && } + {cols.status && } + {cols.ban && } + {cols.prime && } + {cols.trophy && } + {cols.behavior && } + {cols.license && } + {cols.proxy && } + {cols.notes && } + {cols.actions && } + + + + {filtered.length === 0 ? ( + + ) : ( + <> + {visible.map((a) => ( + confirm(t("confirm.deleteLogpass", { name: a.login }), async () => { await api.deleteLogpassAccount(id); loadAccounts(); })} + onOpenBrowser={handleOpenBrowser} + onValidate={handleValidateSingle} + onEdit={(id) => setEditAccountId(id)} + /> + ))} + {visibleCount < filtered.length && ( + + )} + + )} + +
+
+ allSelected ? clearSelection() : selectAll()} /> + {selectedIds.size > 0 && {selectedIds.size}} +
+
+ {cols.browser && {t("col.browser")}{t("col.profile")} toggleSort("last_online")}>{t("col.lastOnline")}{sortField === "last_online" ? (sortDir === "asc" ? " ▲" : " ▼") : ""}Steam ID{t("col.login")}{t("col.password")}Login:Pass{t("col.status")}{t("col.ban")} toggleSort("prime")}>Prime{sortField === "prime" ? (sortDir === "asc" ? " ▲" : " ▼") : ""} toggleSort("trophy")}>Trophy{sortField === "trophy" ? (sortDir === "asc" ? " ▲" : " ▼") : ""} toggleSort("behavior")}>Behavior{sortField === "behavior" ? (sortDir === "asc" ? " ▲" : " ▼") : ""}{t("col.license")}{t("col.proxy")}{t("col.notes")}{t("col.actions")}
{t("empty.logpass")}
{t("paging.shown", { visible: visibleCount, total: filtered.length })}
+
+
+ + {editAccountId != null && (() => { + const acc = accounts.find((a) => a.id === editAccountId); + return acc ? setEditAccountId(null)} /> : null; + })()} + {showImport && setShowImport(false)} />} + {showAdd && setShowAdd(false)} />} + {confirmModal.open && ( + { confirmModal.onConfirm(); setConfirmModal((p) => ({ ...p, open: false })); }} + onCancel={() => setConfirmModal((p) => ({ ...p, open: false }))} + /> + )} +
+ ); +} + +/* ─── Row component ─── */ + +function LogpassRow({ account: a, cols, isProcessing, accountResult, accountStep, proxyLabel, onDelete, onOpenBrowser, onValidate, onEdit }: { + account: import("@/api/types").LogpassAccount; + cols: LogpassColumnSettings; + isProcessing: boolean; + accountResult?: { status: string; error?: string }; + accountStep?: { step: number; total: number }; + proxyLabel: string | null; + onDelete: (id: number) => void; + onOpenBrowser: (id: number) => void; + onValidate: (id: number) => void; + onEdit: (id: number) => void; +}) { + const selectedIds = useLogpassStore((s) => s.selectedIds); + const toggleSelect = useLogpassStore((s) => s.toggleSelect); + const addToast = useUiStore((s) => s.addToast); + const hidePasswords = useUiStore((s) => s.hidePasswords); + const loadAccounts = useLogpassStore((s) => s.loadAccounts); + const [revealed, setRevealed] = useState(false); + const [editingNotes, setEditingNotes] = useState(false); + const [notesValue, setNotesValue] = useState(a.notes || ""); + const [licExpanded, setLicExpanded] = useState(false); + + const t = useT(); + const masked = hidePasswords && !revealed; + const dots = "••••••••"; + + const handleCopy = async (text: string) => { + const ok = await copyText(text); + addToast(ok ? "success" : "error", ok ? t("toast.copied") : t("toast.copyFailed")); + }; + + return ( + + + toggleSelect(a.id)} /> + + {/* Progress/status icon */} + + {isProcessing ? ( +
+
+ {accountStep && [{accountStep.step}/{accountStep.total}]} +
+ ) : accountResult?.status === "ok" ? ( + + ) : accountResult?.status === "error" ? ( + + ) : null} + + {/* Browser login button */} + {cols.browser && ( + + {a.has_cookies ? ( + + ) : ( + + )} + + )} + {/* Profile — avatar + nickname + level */} + {cols.profile && ( + +
+ {a.avatar_url && } + {a.nickname || "—"} + {a.steam_level != null && } +
+ + )} + {/* Last online */} + {cols.last_online && ( + + {a.last_online || "—"} + + )} + {/* Steam ID */} + {cols.steam_id && ( + + {a.steam_id ? ( + + {a.steam_id} + + ) : "—"} + + )} + {/* Login */} + {cols.login && {a.login}} + {/* Password */} + {cols.password && ( + + handleCopy(a.password)} title={t("tip.copyPassword")}> + {masked ? dots : a.password} + + + + )} + {/* Login:Pass */} + {cols.login_pass && ( + + handleCopy(`${a.login}:${a.password}`)} title={t("tip.copyLoginPass")}> + {masked ? `${a.login}:${dots}` : `${a.login}:${a.password}`} + + + + )} + {/* Status */} + {cols.status && } + {/* Ban */} + {cols.ban && } + {/* Prime, Trophy, Behavior */} + {cols.prime && {a.prime ?? "—"}} + {cols.trophy && {a.trophy ?? "—"}} + {cols.behavior && {a.behavior ?? "—"}} + {/* License — expandable on click */} + {cols.license && ( + setLicExpanded((v) => !v)} + > + {a.license ?? "—"} + + )} + {/* Proxy */} + {cols.proxy && ( + + {a.proxy ? ( + handleCopy(a.proxy!)} title={a.proxy}> + {proxyLabel || a.proxy} + + ) : "—"} + + )} + {/* Notes — inline editable */} + {cols.notes && ( + + {editingNotes ? ( + setNotesValue(e.target.value)} + onBlur={async () => { + setEditingNotes(false); + if (notesValue !== (a.notes || "")) { + try { + await api.updateLogpassAccount(a.id, { notes: notesValue }); + addToast("success", t("toast.noteSaved")); + loadAccounts(); + } catch { addToast("error", t("toast.noteSaveError")); } + } + }} + onKeyDown={(e) => { if (e.key === "Enter") (e.target as HTMLInputElement).blur(); if (e.key === "Escape") { setNotesValue(a.notes || ""); setEditingNotes(false); } }} + /> + ) : ( + { setNotesValue(a.notes || ""); setEditingNotes(true); }} + title={a.notes || t("tip.addNote")} + > + {a.notes || "—"} + + )} + + )} + {/* Actions */} + {cols.actions && ( + +
+ + + +
+ + )} + + ); +} \ No newline at end of file diff --git a/frontend/src/components/accounts/SteamLevelBadge.tsx b/frontend/src/components/accounts/SteamLevelBadge.tsx new file mode 100644 index 0000000..62dce09 --- /dev/null +++ b/frontend/src/components/accounts/SteamLevelBadge.tsx @@ -0,0 +1,21 @@ +interface Props { + level: number; +} + +export function SteamLevelBadge({ level }: Props) { + if (level >= 100) { + const hundred = Math.floor(level / 100) * 100; + return ( +
+ {level} +
+ ); + } + + const ten = Math.floor(level / 10) * 10; + return ( +
+ {level} +
+ ); +} diff --git a/frontend/src/components/accounts/TokenAddModal.tsx b/frontend/src/components/accounts/TokenAddModal.tsx new file mode 100644 index 0000000..a0b4c32 --- /dev/null +++ b/frontend/src/components/accounts/TokenAddModal.tsx @@ -0,0 +1,53 @@ +import { useState } from "react"; +import { api } from "@/api/client"; +import { useTokenStore } from "@/stores/tokenStore"; +import type { TokenAccountCreate } from "@/api/types"; +import { useT } from "@/lib/i18n"; + +interface Props { + onClose: () => void; +} + +export function TokenAddModal({ onClose }: Props) { + const t = useT(); + const [token, setToken] = useState(""); + const [login, setLogin] = useState(""); + const [proxy, setProxy] = useState(""); + const [notes, setNotes] = useState(""); + const loadAccounts = useTokenStore((s) => s.loadAccounts); + + const handleSave = async () => { + if (!token.trim()) return; + const data: TokenAccountCreate = { + token: token.trim(), + login: login.trim() || undefined, + proxy: proxy.trim() || undefined, + notes: notes.trim() || undefined, + }; + await api.createTokenAccount(data); + await loadAccounts(); + onClose(); + }; + + return ( +
+
e.stopPropagation()}> +

{t("modal.addToken")}

+
+