From 68f9a01ed512db48d101fdb6e41a9490fbf97036 Mon Sep 17 00:00:00 2001 From: kilyabin <65072190+kilyabin@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:26:26 +0400 Subject: [PATCH] Initial commit --- .gitignore | 123 ++ README.md | 249 +++ cmd/ids/main.go | 37 + configs/config.yaml | 42 + docs/architecture.md | 131 ++ docs/detection.md | 194 +++ docs/install.md | 110 ++ docs/modules.md | 172 ++ docs/testing.md | 356 +++++ docs/user-guide.md | 108 ++ frontend/app.config.ts | 6 + frontend/app.vue | 5 + frontend/bun.lock | 1822 ++++++++++++++++++++++ frontend/components/MetricCard.vue | 46 + frontend/components/SeverityBadge.vue | 26 + frontend/composables/useApi.ts | 38 + frontend/composables/useCaptureStatus.ts | 59 + frontend/layouts/default.vue | 116 ++ frontend/nuxt.config.ts | 31 + frontend/package.json | 17 + frontend/pages/alerts.vue | 266 ++++ frontend/pages/capture.vue | 251 +++ frontend/pages/index.vue | 252 +++ frontend/pages/stats.vue | 233 +++ go.mod | 54 + go.sum | 149 ++ internal/analyzer/arp.go | 101 ++ internal/analyzer/bruteforce.go | 109 ++ internal/analyzer/detector.go | 45 + internal/analyzer/dns.go | 147 ++ internal/analyzer/dos.go | 87 ++ internal/analyzer/engine.go | 124 ++ internal/analyzer/portscan.go | 121 ++ internal/api/handlers/alerts.go | 84 + internal/api/handlers/capture.go | 253 +++ internal/api/handlers/reports.go | 84 + internal/api/handlers/stats.go | 89 ++ internal/api/server.go | 77 + internal/capture/capture.go | 122 ++ internal/config/config.go | 84 + internal/report/pdf.go | 440 ++++++ internal/storage/db.go | 210 +++ internal/storage/models.go | 64 + nids.db | Bin 0 -> 761856 bytes 44 files changed, 7134 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 cmd/ids/main.go create mode 100644 configs/config.yaml create mode 100644 docs/architecture.md create mode 100644 docs/detection.md create mode 100644 docs/install.md create mode 100644 docs/modules.md create mode 100644 docs/testing.md create mode 100644 docs/user-guide.md create mode 100644 frontend/app.config.ts create mode 100644 frontend/app.vue create mode 100644 frontend/bun.lock create mode 100644 frontend/components/MetricCard.vue create mode 100644 frontend/components/SeverityBadge.vue create mode 100644 frontend/composables/useApi.ts create mode 100644 frontend/composables/useCaptureStatus.ts create mode 100644 frontend/layouts/default.vue create mode 100644 frontend/nuxt.config.ts create mode 100644 frontend/package.json create mode 100644 frontend/pages/alerts.vue create mode 100644 frontend/pages/capture.vue create mode 100644 frontend/pages/index.vue create mode 100644 frontend/pages/stats.vue create mode 100644 go.mod create mode 100644 go.sum create mode 100644 internal/analyzer/arp.go create mode 100644 internal/analyzer/bruteforce.go create mode 100644 internal/analyzer/detector.go create mode 100644 internal/analyzer/dns.go create mode 100644 internal/analyzer/dos.go create mode 100644 internal/analyzer/engine.go create mode 100644 internal/analyzer/portscan.go create mode 100644 internal/api/handlers/alerts.go create mode 100644 internal/api/handlers/capture.go create mode 100644 internal/api/handlers/reports.go create mode 100644 internal/api/handlers/stats.go create mode 100644 internal/api/server.go create mode 100644 internal/capture/capture.go create mode 100644 internal/config/config.go create mode 100644 internal/report/pdf.go create mode 100644 internal/storage/db.go create mode 100644 internal/storage/models.go create mode 100644 nids.db diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..82d4dcf --- /dev/null +++ b/.gitignore @@ -0,0 +1,123 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Code coverage profiles and other test artifacts +*.out +coverage.* +*.coverprofile +profile.cov + +# Go workspace file +go.work +go.work.sum + +# Go build artifacts +nids +cmd/*/ +!cmd/*/ + +# Dependency directories +# vendor/ + +# Environment variables +.env +.env.* +!.env.example + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Temp directories +.temp +.tmp +.tmp-* +.cache +.nyc_output +test-results/ +playwright-report/ + +# Node modules +node_modules/ +jspm_packages/ + +# Package manager files +package-lock.json +yarn.lock +pnpm-lock.yaml +.pnpm-store + +# Nuxt/Vue frontend (frontend/) +frontend/dist/ +frontend/.nuxt/ +frontend/.nuxt-*/ +frontend/.output/ +frontend/.output-*/ +frontend/.gen/ +frontend/.test/ +frontend/.eslintcache +frontend/eslint-typegen.d.ts +frontend/node_modules/ + +# Nuxt build outputs +.vercel +.vercel_build_output +.netlify +.build-* + +# Coverage +coverage/ +*.lcov + +# IDE/Editor +.vscode/ +*.iml +.idea/ +!.idea/nuxt.iml +!.idea/modules.xml +!.idea/inspectionProfiles/Project_Default.xml + +# AI assistants +.agents/ +.claude/ + +# OS files +.DS_Store +.AppleDouble +.LSOverride +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdrive + +# Lychee cache +.lycheecache + +# Junit reports +reports/ + +# Temp +temp/ +temp-* +fixtures-temp/ + +# Vue templates compile cache +frontend/packages/ui-templates/node-compile-cache/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..221f68e --- /dev/null +++ b/README.md @@ -0,0 +1,249 @@ +# DIP-IDS — Система обнаружения вторжений на основе анализа сетевого трафика + +Дипломная практическая работа. Сетевая IDS с веб-панелью управления и генерацией PDF-отчётов. + +--- + +## Быстрый старт + +### Требования + +| Компонент | Версия | +|-----------|--------| +| Go | ≥ 1.22 | +| Bun | ≥ 1.1 | +| libpcap | любая | +| Linux | — | + +```bash +# Debian/Ubuntu +sudo apt install libpcap-dev gcc + +# Arch +sudo pacman -S libpcap gcc +``` + +### Бэкенд + +```bash +cd /path/to/dip-ids +go mod tidy +go build -o nids ./cmd/ids +sudo ./nids # sudo нужен для live-захвата +``` + +По умолчанию API поднимается на `http://0.0.0.0:8080`. + +### Фронтенд (dev) + +```bash +cd frontend +bun install +bun run dev # http://localhost:3000 +``` + +Nuxt автоматически проксирует `/api/*` → `localhost:8080`. + +### Сборка для продакшена + +```bash +cd frontend +bun run generate # статические файлы в frontend/.output/public/ +``` + +Готовые файлы можно раздавать любым статическим сервером или встроить в Go-бинарник через `//go:embed`. + +--- + +## Архитектура + +``` +┌──────────────────────────────────────────────────────────────┐ +│ Nuxt 3 Frontend │ +│ Dashboard · Alerts · Capture · Stats │ +│ Nuxt UI · Chart.js · vue-chartjs │ +└─────────────────────────┬────────────────────────────────────┘ + │ HTTP / REST API +┌─────────────────────────▼────────────────────────────────────┐ +│ Go Backend │ +│ │ +│ ┌──────────┐ ┌──────────────┐ ┌──────────────────────┐ │ +│ │ Capture │──▶│ Engine │──▶│ Storage │ │ +│ │ │ │ │ │ SQLite (GORM) │ │ +│ │ Live │ │ PortScan │ └──────────────────────┘ │ +│ │ PCAP │ │ BruteForce │ │ +│ └──────────┘ │ DoS │ ┌──────────────────────┐ │ +│ │ ARPSpoof │──▶│ PDF Report │ │ +│ │ DNSAnomaly │ │ (maroto v2) │ │ +│ └──────────────┘ └──────────────────────┘ │ +└──────────────────────────────────────────────────────────────┘ +``` + +--- + +## REST API + +### Алерты + +| Метод | Путь | Описание | +|----------|--------------------|-------------------------------------| +| `GET` | `/api/alerts` | Список алертов (фильтрация, пагинация) | +| `DELETE` | `/api/alerts` | Удалить все алерты | +| `DELETE` | `/api/alerts/:id` | Удалить алерт по ID | + +**Параметры GET `/api/alerts`:** + +| Параметр | Тип | Описание | +|-------------|--------|---------------------------------------| +| `type` | string | Тип атаки (port_scan, brute_force...) | +| `severity` | string | Уровень (critical, high, medium, low) | +| `src_ip` | string | IP-адрес источника | +| `page` | int | Номер страницы (по умолч. 1) | +| `page_size` | int | Размер страницы (по умолч. 50) | + +### Статистика + +| Метод | Путь | Описание | +|-------|-------------------------|----------------------------------| +| `GET` | `/api/stats/summary` | Сводка: total, by_severity, by_type | +| `GET` | `/api/stats/timeline` | Алерты по часам (`?hours=24`) | +| `GET` | `/api/stats/top-ips` | Топ источников (`?limit=10`) | + +### Захват + +| Метод | Путь | Описание | +|--------|----------------------------|---------------------------------| +| `GET` | `/api/capture/interfaces` | Список сетевых интерфейсов | +| `GET` | `/api/capture/status` | Статус текущей сессии | +| `GET` | `/api/capture/sessions` | История сессий | +| `POST` | `/api/capture/start` | Начать live-захват | +| `POST` | `/api/capture/stop` | Остановить захват | +| `POST` | `/api/capture/upload` | Загрузить и анализировать PCAP | + +**POST `/api/capture/start` body:** +```json +{ "interface": "eth0" } +``` + +### Отчёты + +| Метод | Путь | Описание | +|-------|-------------------------|---------------------| +| `GET` | `/api/reports/generate` | Скачать PDF-отчёт | + +--- + +## Конфигурация + +Файл `configs/config.yaml`: + +```yaml +server: + host: "0.0.0.0" + port: 8080 + +database: + path: "nids.db" # путь к SQLite файлу + +capture: + default_interface: "eth0" + snaplen: 65535 + promiscuous: true + +detectors: + port_scan: + enabled: true + threshold: 15 # уникальных портов за window_seconds + window_seconds: 10 + severity: "high" + + brute_force: + enabled: true + threshold: 10 # попыток подключения за window_seconds + window_seconds: 30 + severity: "critical" + ports: [22, 21, 23, 3389, 5900, 25, 110, 143] + + dos: + enabled: true + pps_threshold: 1000 # пакетов в секунду + window_seconds: 1 + severity: "critical" + + arp_spoof: + enabled: true + severity: "critical" + + dns_anomaly: + enabled: true + max_label_length: 50 # макс. длина DNS-метки + query_threshold: 200 # запросов за window_seconds + window_seconds: 60 + severity: "medium" +``` + +--- + +## Алгоритмы обнаружения + +### Port Scan (Сканирование портов) + +Детектор ведёт таблицу `srcIP → {dstPort → []timestamp}`. Для каждого входящего TCP SYN-пакета регистрируется новое обращение к порту назначения. Устаревшие записи (старше `window_seconds`) удаляются (sliding window). Если количество уникальных портов назначения превышает `threshold` — генерируется алерт. + +### Brute Force (Перебор паролей) + +Мониторятся только соединения к портам из списка `ports` (SSH, FTP, RDP и др.). Счётчик SYN-пакетов от одного источника к одному порту назначения ведётся в скользящем окне. Превышение `threshold` за `window_seconds` — алерт. + +### DoS/DDoS + +Считается общий поток пакетов от каждого источника в окне `window_seconds`. При превышении `pps_threshold` пакетов в секунду генерируется алерт категории `critical`. + +### ARP Spoofing + +Ведётся таблица соответствия `IP → MAC`. При получении ARP Reply проверяется, не изменился ли MAC для уже известного IP-адреса. Изменение MAC — признак подмены ARP-записей (Man-in-the-Middle). + +### DNS Anomaly + +Два сценария: +1. **DNS-туннелирование** — проверяется длина каждой метки в имени запроса. Метка длиннее `max_label_length` символов — подозрение на туннелирование данных через DNS. +2. **Высокая частота** — если один хост генерирует более `query_threshold` DNS-запросов за `window_seconds` — алерт. + +--- + +## Структура проекта + +``` +dip-ids/ +├── cmd/ids/main.go # точка входа +├── internal/ +│ ├── config/config.go # загрузка конфигурации +│ ├── storage/ +│ │ ├── models.go # GORM модели +│ │ └── db.go # CRUD операции +│ ├── capture/capture.go # live и pcap захват +│ ├── analyzer/ +│ │ ├── engine.go # основной движок +│ │ ├── detector.go # интерфейс детектора +│ │ ├── portscan.go +│ │ ├── bruteforce.go +│ │ ├── dos.go +│ │ ├── arp.go +│ │ └── dns.go +│ ├── api/ +│ │ ├── server.go # Gin HTTP сервер +│ │ └── handlers/ # обработчики маршрутов +│ └── report/pdf.go # генерация PDF (maroto v2) +├── frontend/ # Nuxt 3 + Nuxt UI +│ ├── pages/ +│ │ ├── index.vue # дашборд +│ │ ├── alerts.vue # журнал алертов +│ │ ├── capture.vue # управление захватом +│ │ └── stats.vue # статистика +│ ├── components/ +│ ├── composables/ +│ ├── layouts/default.vue +│ ├── nuxt.config.ts +│ └── package.json +├── configs/config.yaml +└── README.md +``` diff --git a/cmd/ids/main.go b/cmd/ids/main.go new file mode 100644 index 0000000..a54d0cf --- /dev/null +++ b/cmd/ids/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "log" + "os" + + "dip-ids/internal/analyzer" + "dip-ids/internal/api" + "dip-ids/internal/config" + "dip-ids/internal/storage" +) + +func main() { + cfgPath := "configs/config.yaml" + if len(os.Args) > 1 { + cfgPath = os.Args[1] + } + + cfg, err := config.Load(cfgPath) + if err != nil { + log.Fatalf("load config: %v", err) + } + + db, err := storage.New(cfg.Database.Path) + if err != nil { + log.Fatalf("init database: %v", err) + } + + engine := analyzer.New(db, cfg.Detectors) + + srv := api.New(cfg.Server, db, engine, cfg.Capture) + + log.Printf("NIDS API запущен на http://%s:%d", cfg.Server.Host, cfg.Server.Port) + if err := srv.Run(); err != nil { + log.Fatalf("server: %v", err) + } +} diff --git a/configs/config.yaml b/configs/config.yaml new file mode 100644 index 0000000..7e6953c --- /dev/null +++ b/configs/config.yaml @@ -0,0 +1,42 @@ +server: + host: "0.0.0.0" + port: 8080 + +database: + path: "nids.db" + +capture: + default_interface: "eth0" + snaplen: 65535 + promiscuous: true + +detectors: + port_scan: + enabled: true + threshold: 15 + window_seconds: 10 + severity: "high" + + brute_force: + enabled: true + threshold: 10 + window_seconds: 30 + severity: "critical" + ports: [22, 21, 23, 3389, 5900, 25, 110, 143] + + dos: + enabled: true + pps_threshold: 1000 + window_seconds: 1 + severity: "critical" + + arp_spoof: + enabled: true + severity: "critical" + + dns_anomaly: + enabled: true + max_label_length: 50 + query_threshold: 200 + window_seconds: 60 + severity: "medium" diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..ecda651 --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,131 @@ +# Архитектура системы DIP-IDS + +## 1. Общая схема + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ Пользователь │ +│ браузер → localhost:3000 │ +└───────────────────────────┬─────────────────────────────────────────┘ + │ HTTP +┌───────────────────────────▼─────────────────────────────────────────┐ +│ Nuxt 3 Frontend │ +│ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ +│ │Dashboard │ │ Alerts │ │ Capture │ │ Stats │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────────────┘ │ +│ Nuxt UI · vue-chartjs · Chart.js │ +└───────────────────────────┬─────────────────────────────────────────┘ + │ REST API (proxy /api/*) +┌───────────────────────────▼─────────────────────────────────────────┐ +│ Go Backend (:8080) │ +│ │ +│ ┌──────────────────────────────────────────────────────────────┐ │ +│ │ Gin HTTP Router │ │ +│ │ /api/alerts /api/stats /api/capture /api/reports │ │ +│ └──────────────────────────┬───────────────────────────────────┘ │ +│ │ │ +│ ┌──────────────────────────▼───────────────────────────────────┐ │ +│ │ Analyzer Engine │ │ +│ │ │ │ +│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ +│ │ │PortScan │ │BruteForce │ │ DoS │ │ │ +│ │ │Detector │ │Detector │ │ Detector │ │ │ +│ │ └────────────┘ └────────────┘ └────────────┘ │ │ +│ │ ┌────────────┐ ┌────────────┐ │ │ +│ │ │ARPSpoof │ │DNS Anomaly │ │ │ +│ │ │Detector │ │Detector │ │ │ +│ │ └────────────┘ └────────────┘ │ │ +│ └──────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌──────────────┐ ┌─────────────┐ ┌─────────────────┐ │ +│ │ Capture │ │ Storage │ │ PDF Report │ │ +│ │ (gopacket) │ │ (SQLite) │ │ (maroto v2) │ │ +│ │ live / pcap │ │ GORM │ │ │ │ +│ └──────────────┘ └─────────────┘ └─────────────────┘ │ +└─────────────────────────────────────────────────────────────────────┘ + │ + ┌─────────────┴──────────────┐ + │ │ + ┌────────▼────────┐ ┌─────────▼────────┐ + │ Сетевой │ │ PCAP файлы │ + │ интерфейс │ │ (.pcap/.pcapng)│ + │ (eth0, wlan0) │ │ │ + └─────────────────┘ └──────────────────┘ +``` + +## 2. Поток данных + +``` +Сетевой интерфейс / PCAP файл + │ + ▼ + pcap.Handle (gopacket) + │ chan gopacket.Packet (буфер 1024) + ▼ + Analyzer Engine.Run() + │ fan-out: каждый пакет → все детекторы + ├──▶ PortScanDetector.Analyze(pkt) + ├──▶ BruteForceDetector.Analyze(pkt) + ├──▶ DoSDetector.Analyze(pkt) + ├──▶ ARPSpoofDetector.Analyze(pkt) + └──▶ DNSAnomalyDetector.Analyze(pkt) + │ []storage.Alert + ▼ + storage.DB.CreateAlert() + │ + ▼ + SQLite (nids.db) + │ + ┌─────┴──────┐ + ▼ ▼ + REST API PDF Report + (Gin) (maroto v2) + │ + ▼ + Nuxt Frontend +``` + +## 3. Компоненты и их ответственность + +| Компонент | Пакет | Ответственность | +|---|---|---| +| `Capturer` | `internal/capture` | Открывает pcap handle (live или файл), читает пакеты в канал | +| `Engine` | `internal/analyzer` | Принимает пакеты из канала, фанаутит детекторам, сохраняет алерты | +| `Detector` (интерфейс) | `internal/analyzer` | Контракт: `Analyze(pkt) []Alert`, `Reset()` | +| `DB` | `internal/storage` | CRUD алертов, статистики, сессий через GORM + SQLite | +| `Server` | `internal/api` | Gin HTTP сервер, CORS, маршрутизация | +| `handlers/*` | `internal/api/handlers` | Обработчики REST эндпоинтов | +| `report.Generate` | `internal/report` | Генерация структурированного PDF через maroto v2 | + +## 4. Модель конкурентности + +``` +main goroutine + │ + ├── srv.Run() ← HTTP сервер (Gin, внутренние goroutines) + │ + └── при старте захвата: + │ + ├── capture goroutine ← читает пакеты → chan + │ + └── engine goroutine ← engine.Run(ctx, pkts) + │ + └── обрабатывает пакеты синхронно (детекторы потокобезопасны через sync.Mutex) +``` + +Остановка захвата — через отмену `context.Context` (cancel функция хранится в `CaptureState`). + +## 5. Выбор технологий + +| Технология | Обоснование | +|---|---| +| **Go** | Системный язык, оптимален для сетевых инструментов; компилируется в один бинарник | +| **gopacket** | Стандарт де-факто для захвата пакетов в Go; оборачивает libpcap | +| **Gin** | Минималистичный HTTP фреймворк с высокой производительностью | +| **GORM + SQLite** | Не требует отдельного сервера БД; достаточно для демо и небольших сетей | +| **maroto v2** | Grid-based PDF генератор; создаёт структурированные деловые отчёты | +| **Nuxt 3** | SSR/SPA фреймворк на Vue 3; удобная файловая маршрутизация | +| **Nuxt UI** | Официальная UI библиотека Nuxt; Tailwind CSS, тёмная тема из коробки | +| **Chart.js + vue-chartjs** | Зрелая библиотека графиков; хорошая интеграция с Vue 3 | +| **Bun** | Быстрый JavaScript runtime и пакетный менеджер; замена npm/yarn | diff --git a/docs/detection.md b/docs/detection.md new file mode 100644 index 0000000..e04082d --- /dev/null +++ b/docs/detection.md @@ -0,0 +1,194 @@ +# Алгоритмы обнаружения угроз + +## Общие принципы + +Все детекторы реализуют **сигнатурный метод** обнаружения на основе скользящего временного окна (sliding window). Каждый детектор: +- Потокобезопасен (`sync.Mutex` на внутреннее состояние) +- Поддерживает дедупликацию — повторный алерт от одного источника не генерируется чаще заданного интервала +- Настраивается через `configs/config.yaml` без перекомпиляции + +--- + +## 1. Port Scan (Сканирование портов) + +### Метод обнаружения +Злоумышленник обычно последовательно обращается к множеству портов на одном или нескольких хостах для выявления открытых сервисов. Детектор отслеживает количество **уникальных портов назначения**, к которым обращается один источник за фиксированное время. + +### Алгоритм + +``` +Для каждого TCP SYN-пакета (SYN=1, ACK=0): + key = srcIP + ports[key][dstPort] += timestamp + + Удалить записи старше window_seconds + + uniquePorts = count(ports[key]) + if uniquePorts >= threshold: + если последний алерт был > 30 сек назад: + создать Alert(type=port_scan, severity=high) +``` + +### Параметры +| Параметр | По умолчанию | Описание | +|----------|-------------|----------| +| `threshold` | 15 | Уникальных портов за период | +| `window_seconds` | 10 | Длина окна в секундах | + +### Пример (Nmap): +``` +Nmap SYN scan (-sS) → пакеты SYN к портам 22, 80, 443, 3389... +После 15-го уникального порта за 10 секунд → алерт +``` + +--- + +## 2. Brute Force (Перебор паролей) + +### Метод обнаружения +При переборе паролей атакующий многократно устанавливает TCP-соединение на один и тот же порт аутентификации. Детектор считает количество SYN-пакетов от одного источника к одному порту/хосту назначения. + +### Мониторируемые порты +| Порт | Сервис | +|------|--------| +| 22 | SSH | +| 21 | FTP | +| 23 | Telnet | +| 3389 | RDP (Windows Remote Desktop) | +| 5900 | VNC | +| 25 | SMTP | +| 110 | POP3 | +| 143 | IMAP | + +### Алгоритм + +``` +Для каждого TCP SYN-пакета на порт из списка: + key = srcIP + ":" + dstIP + ":" + dstPort + timestamps[key] += now + + Удалить записи старше window_seconds + + count = len(timestamps[key]) + if count >= threshold: + если последний алерт был > 30 сек назад: + создать Alert(type=brute_force, severity=critical) +``` + +### Параметры +| Параметр | По умолчанию | Описание | +|----------|-------------|----------| +| `threshold` | 10 | Попыток подключения за период | +| `window_seconds` | 30 | Длина окна в секундах | + +--- + +## 3. DoS / DDoS + +### Метод обнаружения +Атака отказа в обслуживании характеризуется аномально высоким потоком пакетов от одного (DoS) или множества (DDoS) источников. Детектор измеряет скорость пакетов (PPS — Packets Per Second) от каждого IP в скользящем окне. + +### Алгоритм + +``` +Для каждого IP-пакета: + timestamps[srcIP] += now + + Удалить записи старше window_seconds (1 сек по умолчанию) + + pps = len(timestamps[srcIP]) / window_seconds + if pps >= pps_threshold: + если последний алерт был > 10 сек назад: + создать Alert(type=dos, severity=critical) +``` + +### Параметры +| Параметр | По умолчанию | Описание | +|----------|-------------|----------| +| `pps_threshold` | 1000 | Пакетов в секунду | +| `window_seconds` | 1 | Длина окна измерения | + +### Ограничение +Детектор срабатывает на отдельные источники. Для распределённого DDoS с тысячами источников необходим дополнительный анализ суммарного трафика к жертве (не реализован в текущей версии). + +--- + +## 4. ARP Spoofing (Подмена ARP) + +### Метод обнаружения +Протокол ARP не предусматривает аутентификации, что позволяет злоумышленнику отправить поддельные ARP Reply и связать чужой IP с собственным MAC-адресом (Man-in-the-Middle атака). + +Детектор ведёт доверенную таблицу соответствия `IP → MAC`. При получении ARP Reply проверяется, не изменился ли MAC для уже известного IP. + +### Алгоритм + +``` +Для каждого ARP Reply (operation=2): + srcIP = arp.SourceProtAddress + srcMAC = arp.SourceHwAddress + + if srcIP in table: + if table[srcIP] != srcMAC: + создать Alert(type=arp_spoof, severity=critical, + desc="IP X сменил MAC с A на B") + table[srcIP] = srcMAC // обновляем + else: + table[srcIP] = srcMAC // первичная запись +``` + +### Ограничения +- Таблица очищается при `Reset()` (смене сессии). При долгом мониторинге DHCP-обновления MAC не вызывают ложных срабатываний только если DHCP lease истёк. +- Не различает легитимное изменение MAC (замена сетевой карты) от атаки. + +--- + +## 5. DNS Anomaly (Аномалии DNS) + +### Сценарий A: DNS-туннелирование + +DNS-туннелирование — метод передачи данных через DNS-запросы для обхода фаерволов. Данные кодируются в имени запроса, что приводит к аномально длинным меткам. + +Нормальная метка (label): `www`, `mail`, `api` — 3–15 символов. +Подозрительная метка: `aGVsbG8gd29ybGQhIHRoaXMgaXMgYSB0ZXN0` — 38+ символов (base64-данные). + +``` +Для каждого DNS запроса (QR=0): + for label in split(queryName, "."): + if len(label) > max_label_length (50): + создать Alert(type=dns_anomaly, desc="DNS tunneling: label length N") +``` + +### Сценарий B: Высокая частота запросов + +Аномально высокое число DNS-запросов от одного хоста может указывать на: +- DNS-туннелирование с разбивкой данных на короткие запросы +- Активность вредоносного ПО (C2 beacon через DNS) +- DGA (Domain Generation Algorithm) — малварь генерирует случайные домены + +``` +Для каждого DNS запроса: + timestamps[srcIP] += now + Удалить записи старше window_seconds + + if len(timestamps[srcIP]) >= query_threshold: + создать Alert(type=dns_anomaly, desc="High DNS query rate: N queries/Xs") +``` + +### Параметры +| Параметр | По умолчанию | Описание | +|----------|-------------|----------| +| `max_label_length` | 50 | Максимальная длина DNS-метки | +| `query_threshold` | 200 | Запросов за период | +| `window_seconds` | 60 | Длина окна | + +--- + +## Сводная таблица детекторов + +| Детектор | Протокол | Метод | Ключ дедупл. | Severity | +|----------|----------|-------|--------------|----------| +| Port Scan | TCP | Sliding window, уникальные порты | srcIP | high | +| Brute Force | TCP | Sliding window, частота SYN | srcIP:dstIP:dstPort | critical | +| DoS | IP | Sliding window, PPS | srcIP | critical | +| ARP Spoof | ARP | Таблица IP→MAC | srcIP | critical | +| DNS Anomaly | DNS/UDP | Длина метки + частота | srcIP | medium | diff --git a/docs/install.md b/docs/install.md new file mode 100644 index 0000000..70f4c47 --- /dev/null +++ b/docs/install.md @@ -0,0 +1,110 @@ +# Руководство по установке + +## Требования + +| Компонент | Версия | Назначение | +|-----------|--------|-----------| +| Linux | любой дистрибутив | ОС (raw sockets доступны только на Linux) | +| Go | ≥ 1.22 | Компиляция бэкенда | +| GCC | любая | Компиляция CGO (go-sqlite3) | +| libpcap-dev | любая | Захват пакетов | +| Bun | ≥ 1.1 | Сборка фронтенда | + +## Установка зависимостей + +### Debian / Ubuntu +```bash +sudo apt update +sudo apt install -y golang gcc libpcap-dev +# Bun +curl -fsSL https://bun.sh/install | bash +``` + +### Arch Linux / CachyOS +```bash +sudo pacman -S go gcc libpcap +# Bun +yay -S bun-bin +# или +curl -fsSL https://bun.sh/install | bash +``` + +### Fedora / RHEL +```bash +sudo dnf install golang gcc libpcap-devel +curl -fsSL https://bun.sh/install | bash +``` + +## Сборка и запуск + +### 1. Клонирование репозитория +```bash +git clone dip-ids +cd dip-ids +``` + +### 2. Бэкенд +```bash +# Загрузить зависимости +go mod tidy + +# Собрать бинарник +go build -o nids ./cmd/ids + +# Запустить (sudo обязателен для live-захвата) +sudo ./nids +# API доступен на http://0.0.0.0:8080 +``` + +Конфигурация загружается из `configs/config.yaml`. Альтернативный путь: +```bash +sudo ./nids /path/to/custom-config.yaml +``` + +### 3. Фронтенд (dev-режим) +```bash +cd frontend +bun install +bun run dev +# Панель доступна на http://localhost:3000 +``` + +### 4. Фронтенд (production-сборка) +```bash +cd frontend +bun run generate +# Статические файлы в frontend/.output/public/ +``` + +## Настройка интерфейса + +Узнать имя сетевого интерфейса: +```bash +ip link show +# или +sudo tcpdump -D +``` + +Обновить в `configs/config.yaml`: +```yaml +capture: + default_interface: "enp3s0" # ← ваш интерфейс +``` + +## Права доступа + +Live-захват требует доступа к raw sockets. Варианты: + +**Вариант 1 (рекомендуется для разработки):** +```bash +sudo ./nids +``` + +**Вариант 2 — capabilities (без sudo):** +```bash +sudo setcap cap_net_raw,cap_net_admin=eip ./nids +./nids +``` + +**Вариант 3 — только PCAP анализ** (без специальных прав): +Загружайте готовые `.pcap` файлы через веб-панель, бэкенд можно запускать без sudo. diff --git a/docs/modules.md b/docs/modules.md new file mode 100644 index 0000000..8f8968a --- /dev/null +++ b/docs/modules.md @@ -0,0 +1,172 @@ +# Описание модулей DIP-IDS + +## 1. Модуль захвата трафика (`internal/capture`) + +### Назначение +Обеспечивает получение сетевых пакетов из двух источников: живой захват с сетевого интерфейса и чтение ранее записанных PCAP-файлов. + +### Файлы +| Файл | Описание | +|------|----------| +| `capture.go` | Структура `Capturer`, функции `New`, `Start`, `Stop`, `ListInterfaces` | + +### Ключевые типы + +```go +type Mode string // "live" или "pcap" + +type Config struct { + Interface string // имя интерфейса (для live) + PCAPFile string // путь к файлу (для pcap) + Mode Mode + Snaplen int32 // максимальный размер захватываемого пакета + Promiscuous bool // неразборчивый режим +} +``` + +### Принцип работы +`Start(ctx)` открывает `pcap.Handle` нужного типа (live или offline) и запускает горутину, которая читает пакеты в буферизованный канал `chan gopacket.Packet` ёмкостью 1024. При отмене контекста или достижении конца файла канал закрывается. + +--- + +## 2. Движок анализа (`internal/analyzer`) + +### Назначение +Центральный компонент, который принимает пакеты и распределяет их по детекторам. + +### Файлы +| Файл | Описание | +|------|----------| +| `engine.go` | Структура `Engine`, методы `Run`, `Reset`, `Stats` | +| `detector.go` | Интерфейс `Detector`, вспомогательная структура `timeWindow` | +| `portscan.go` | Детектор сканирования портов | +| `bruteforce.go` | Детектор перебора паролей | +| `dos.go` | Детектор DoS/DDoS атак | +| `arp.go` | Детектор ARP-спуфинга | +| `dns.go` | Детектор DNS-аномалий | + +### Интерфейс детектора + +```go +type Detector interface { + Name() string // уникальное имя + Analyze(pkt gopacket.Packet) []Alert // анализ пакета, возврат алертов + Reset() // сброс внутреннего состояния +} +``` + +### Sliding Window +Все детекторы используют скользящее временное окно (`timeWindow`) для хранения событий. При каждом обращении устаревшие записи автоматически удаляются: + +``` +Время: t-10s ... t-5s ... t-3s ... now +События: [old] [old] [keep] [keep] [keep] + ↑ + cutoff = now - window_size +``` + +### Дедупликация алертов +Каждый детектор хранит `alerted map[string]time.Time` — время последнего алерта по ключу (IP, IP:port и т.д.). Повторный алерт генерируется не чаще одного раза в 30–60 секунд на один источник. + +--- + +## 3. Модуль хранения данных (`internal/storage`) + +### Назначение +Персистентное хранение алертов, статистики пакетов и сессий захвата. + +### Файлы +| Файл | Описание | +|------|----------| +| `models.go` | GORM-модели: `Alert`, `PacketStat`, `CaptureSession` | +| `db.go` | Структура `DB`, CRUD-методы, агрегирующие запросы | + +### Модели данных + +**Alert** — запись об обнаруженной угрозе: +``` +ID | CreatedAt | Type | Severity | SrcIP | DstIP | SrcPort | DstPort | Protocol | Description | Count +``` + +**PacketStat** — статистика по пакетам (сохраняется каждый 10-й пакет): +``` +ID | CreatedAt | Protocol | SrcIP | DstIP | Bytes +``` + +**CaptureSession** — сессия захвата трафика: +``` +ID | CreatedAt | EndedAt | Source | Mode | Status | TotalPkts | TotalBytes +``` + +### Методы агрегации +| Метод | SQL-эквивалент | +|-------|---------------| +| `AlertsBySeverity()` | `SELECT severity, COUNT(*) GROUP BY severity` | +| `AlertsByType()` | `SELECT type, COUNT(*) GROUP BY type` | +| `TopSourceIPs(n)` | `SELECT src_ip, COUNT(*) GROUP BY src_ip ORDER BY count DESC LIMIT n` | +| `AlertsTimeline(h)` | `SELECT strftime('%H:00', created_at), COUNT(*) GROUP BY hour` | + +--- + +## 4. API сервер (`internal/api`) + +### Назначение +HTTP сервер на базе Gin, предоставляет REST API для фронтенда. + +### Файлы +| Файл | Описание | +|------|----------| +| `server.go` | Инициализация Gin, регистрация маршрутов, CORS middleware | +| `handlers/alerts.go` | GET /api/alerts, DELETE /api/alerts, DELETE /api/alerts/:id | +| `handlers/stats.go` | GET /api/stats/summary, /timeline, /top-ips | +| `handlers/capture.go` | Управление захватом: start, stop, upload, status, sessions | +| `handlers/reports.go` | GET /api/reports/generate — скачать PDF | + +### CORS +Сервер разрешает запросы с любого origin (`*`) для работы Nuxt dev-сервера на порту 3000. + +### Управление состоянием захвата +`CaptureHandler` хранит указатель `active *CaptureState`, который содержит `context.CancelFunc` для остановки текущей сессии. Одновременно может быть только одна активная сессия. + +--- + +## 5. Генератор отчётов (`internal/report`) + +### Назначение +Формирование PDF-отчёта по всем накопленным данным. + +### Файлы +| Файл | Описание | +|------|----------| +| `pdf.go` | Структура `Data`, функция `Generate(data) ([]byte, error)` | + +### Структура отчёта +1. **Заголовок** — название системы, дата формирования, версия +2. **Метаданные сессии** — источник трафика, режим, длительность, объём +3. **Сводка по критичности** — таблица с цветовой маркировкой (критический / высокий / средний / низкий) +4. **Типы угроз** — таблица по типам обнаруженных атак +5. **Топ источников** — 10 наиболее активных IP-адресов +6. **Журнал инцидентов** — детальная таблица до 200 алертов + +### Библиотека maroto v2 +Grid-based компоновка: страница делится на 12 колонок, строки (`row`) содержат колонки (`col`), в колонках размещаются компоненты (`text`, `line`). + +--- + +## 6. Фронтенд (`frontend/`) + +### Назначение +Веб-панель управления для мониторинга, управления захватом и просмотра статистики. + +### Структура +| Путь | Назначение | +|------|-----------| +| `pages/index.vue` | Дашборд: карточки метрик, графики, топ IP, последние алерты | +| `pages/alerts.vue` | Журнал алертов с фильтрацией и пагинацией | +| `pages/capture.vue` | Управление захватом (live + PCAP upload), история сессий | +| `pages/stats.vue` | Статистика: timeline, распределение по типам и критичности | +| `layouts/default.vue` | Боковое меню, заголовок, индикатор статуса захвата | +| `composables/useApi.ts` | Базовый HTTP клиент (get, post, del, upload) | +| `composables/useCaptureStatus.ts` | Глобальный polling статуса захвата (каждые 3 сек) | +| `components/MetricCard.vue` | Карточка числовой метрики с иконкой | +| `components/SeverityBadge.vue` | Цветной бейдж уровня критичности | diff --git a/docs/testing.md b/docs/testing.md new file mode 100644 index 0000000..eaea442 --- /dev/null +++ b/docs/testing.md @@ -0,0 +1,356 @@ +# Руководство по тестированию + +## Подготовка окружения + +Для тестирования нужны две машины в одной сети (или две VM), либо одна машина с loopback-интерфейсом. + +``` +[Машина A — NIDS] [Машина B — Атакующий] +192.168.1.100 192.168.1.200 +sudo ./nids nmap / hping3 / hydra +http://localhost:3000 +``` + +**Запуск системы перед каждым тестом:** +```bash +# Терминал 1 — бэкенд +sudo ./nids + +# Терминал 2 — фронтенд +cd frontend && bun run dev + +# Открыть в браузере: http://localhost:3000 +# Перейти на страницу «Захват» → выбрать интерфейс → «Начать захват» +``` + +--- + +## Тест 1: Сканирование портов (Port Scan) + +**Инструмент:** `nmap` + +**Установка:** +```bash +# Debian/Ubuntu +sudo apt install nmap + +# Arch +sudo pacman -S nmap +``` + +**Запуск атаки (с машины B):** +```bash +# SYN-scan — самый распространённый метод сканирования +sudo nmap -sS 192.168.1.100 + +# Агрессивное сканирование всех портов +sudo nmap -sS -p- --min-rate 1000 192.168.1.100 + +# Сканирование конкретного диапазона +sudo nmap -sS -p 1-1000 192.168.1.100 +``` + +**Ожидаемый результат:** +``` +Тип алерта: port_scan +Критичность: high +Описание: Port scan detected: 15 unique ports probed in 10s window +SrcIP: 192.168.1.200 +``` + +**Что проверить:** +- Алерт появляется в журнале (~10 секунд после начала сканирования) +- SrcIP совпадает с адресом машины B +- Счётчик `Count` отражает количество уникальных портов + +**Порог срабатывания:** 15 уникальных портов за 10 секунд (настраивается в `config.yaml`). + +--- + +## Тест 2: Перебор паролей (Brute Force) + +**Инструмент:** `hydra` или `medusa` + +**Установка:** +```bash +# Debian/Ubuntu +sudo apt install hydra + +# Arch +sudo pacman -S hydra +``` + +**Требование:** на машине A должен быть запущен SSH-сервер: +```bash +sudo systemctl start sshd +``` + +**Запуск атаки (с машины B):** +```bash +# Brute-force SSH с небольшим словарём +hydra -l root -P /usr/share/wordlists/rockyou.txt \ + -t 4 -V ssh://192.168.1.100 + +# Быстрый тест с inline паролями +hydra -l admin -p pass1,pass2,pass3,pass4,pass5,pass6,pass7,pass8,pass9,pass10,pass11 \ + ssh://192.168.1.100 + +# Только SYN-флуд на порт 22 (без hydra) +sudo hping3 -S -p 22 --flood 192.168.1.100 +``` + +**Ожидаемый результат:** +``` +Тип алерта: brute_force +Критичность: critical +Описание: Brute-force detected on port 22: 10 connection attempts in 30s +SrcIP: 192.168.1.200 +DstPort: 22 +``` + +**Другие мониторируемые порты:** +```bash +# FTP (21) +hydra -l admin -P wordlist.txt ftp://192.168.1.100 + +# RDP (3389) — если запущен xrdp +hydra -l administrator -P wordlist.txt rdp://192.168.1.100 + +# Telnet (23) +hydra -l root -P wordlist.txt telnet://192.168.1.100 +``` + +**Порог срабатывания:** 10 попыток за 30 секунд на один порт. + +--- + +## Тест 3: DoS / DDoS атака + +**Инструмент:** `hping3` + +**Установка:** +```bash +# Debian/Ubuntu +sudo apt install hping3 + +# Arch +sudo pacman -S hping3 +``` + +**Запуск атаки (с машины B):** +```bash +# SYN flood — классический DoS +sudo hping3 -S --flood -V -p 80 192.168.1.100 + +# ICMP flood +sudo hping3 --icmp --flood 192.168.1.100 + +# UDP flood +sudo hping3 --udp --flood -p 53 192.168.1.100 + +# С заданной скоростью (1500 пакетов/сек) +sudo hping3 -S -p 80 --faster -c 10000 192.168.1.100 +``` + +**Ожидаемый результат:** +``` +Тип алерта: dos +Критичность: critical +Описание: DoS attack detected from 192.168.1.200: 1234 pkt/s (threshold: 1000) +SrcIP: 192.168.1.200 +Count: 1234 +``` + +**Проверка без второй машины (loopback):** +```bash +# Флуд на локальный интерфейс (lo) +sudo hping3 -S --flood -V 127.0.0.1 +# Бэкенд при этом нужно запустить с захватом на интерфейсе lo +``` + +**Порог срабатывания:** 1000 пакетов/сек от одного источника. + +--- + +## Тест 4: ARP Spoofing + +**Инструмент:** `arpspoof` (пакет `dsniff`) или `ettercap` + +**Установка:** +```bash +# Debian/Ubuntu +sudo apt install dsniff + +# Arch +sudo pacman -S dsniff +``` + +**Запуск атаки (с машины B):** +```bash +# Подмена ARP: сообщаем машине A, что мы — шлюз (192.168.1.1) +sudo arpspoof -i eth0 -t 192.168.1.100 192.168.1.1 + +# Двусторонняя подмена (полный MITM) +# Терминал 1: +sudo arpspoof -i eth0 -t 192.168.1.100 192.168.1.1 +# Терминал 2: +sudo arpspoof -i eth0 -t 192.168.1.1 192.168.1.100 +``` + +**Альтернатива — вручную через `arping`:** +```bash +# Отправить ARP Reply с поддельным MAC +sudo arping -c 5 -A -I eth0 192.168.1.100 +``` + +**Ожидаемый результат:** +``` +Тип алерта: arp_spoof +Критичность: critical +Описание: ARP spoofing: IP 192.168.1.1 changed MAC from aa:bb:cc:dd:ee:ff to 11:22:33:44:55:66 +SrcIP: 192.168.1.1 +Protocol: ARP +``` + +**Важно:** детектор срабатывает только если IP уже известен из предыдущих ARP-пакетов. Первая запись в таблицу — штатная, второй пакет с другим MAC — алерт. + +--- + +## Тест 5: DNS Аномалии + +### 5A. DNS-туннелирование + +**Инструмент:** `iodine` или ручная генерация + +**Установка:** +```bash +# Debian/Ubuntu +sudo apt install iodine + +# Arch +sudo pacman -S iodine +``` + +**Имитация туннелирования вручную (через `dig`):** +```bash +# Запрос с очень длинной меткой (>50 символов) — триггер детектора +dig "aGVsbG8td29ybGQtdGhpcy1pcy1hLXZlcnktbG9uZy1zdWJkb21haW4.example.com" @8.8.8.8 + +# Скрипт для многократной отправки +for i in $(seq 1 20); do + dig "$(head -c 60 /dev/urandom | base64 | tr -d '\n/' | head -c 55).test.local" & +done +``` + +**Ожидаемый результат:** +``` +Тип алерта: dns_anomaly +Критичность: medium +Описание: DNS tunneling suspected: label length 55 in query 'aGVsbG8t...test.local' +``` + +### 5B. Высокая частота DNS-запросов + +**Инструмент:** `dnsperf` или bash-скрипт + +```bash +# Установка dnsperf +sudo apt install dnsperf # Debian/Ubuntu + +# Генерация файла запросов +for i in $(seq 1 500); do + echo "host$i.example.com A" +done > /tmp/dns-queries.txt + +# Flood (200+ запросов за 60 секунд) +dnsperf -s 8.8.8.8 -d /tmp/dns-queries.txt -Q 50 -l 30 + +# Простой bash-вариант без dnsperf +for i in $(seq 1 250); do + dig "sub$i.example.com" @8.8.8.8 +short & +done +``` + +**Ожидаемый результат:** +``` +Тип алерта: dns_anomaly +Критичность: medium +Описание: High DNS query rate from 192.168.1.200: 200 queries in 60s +``` + +--- + +## Тест через готовые PCAP файлы (без второй машины) + +Это самый простой способ протестировать все детекторы одновременно. + +**Рекомендуемые источники PCAP:** + +| Источник | Описание | +|----------|----------| +| [Wireshark Sample Captures](https://wiki.wireshark.org/SampleCaptures) | Коллекция тестовых захватов | +| [Malware Traffic Analysis](https://www.malware-traffic-analysis.net/) | Реальный вредоносный трафик | +| [NETRESEC](https://www.netresec.com/?page=PcapFiles) | Тематические PCAP с атаками | +| [CTF captures](https://github.com/ctfs) | Захваты с соревнований | + +**Скачать конкретные файлы:** +```bash +# Nmap scan capture +wget https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=nmap.pcap \ + -O test-portscan.pcap + +# ARP примеры +wget https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=arp-storm.pcap \ + -O test-arp.pcap +``` + +**Использование:** +1. Открыть `http://localhost:3000/capture` +2. Перейти на вкладку **PCAP файл** +3. Перетащить файл → нажать **Анализировать** +4. Алерты появятся в журнале через несколько секунд + +--- + +## Проверка API напрямую (без браузера) + +```bash +# Список интерфейсов +curl http://localhost:8080/api/capture/interfaces + +# Статус захвата +curl http://localhost:8080/api/capture/status + +# Начать захват на eth0 +curl -X POST http://localhost:8080/api/capture/start \ + -H "Content-Type: application/json" \ + -d '{"interface": "eth0"}' + +# Все алерты +curl http://localhost:8080/api/alerts | python3 -m json.tool + +# Алерты по типу +curl "http://localhost:8080/api/alerts?type=port_scan&page_size=10" + +# Сводка статистики +curl http://localhost:8080/api/stats/summary | python3 -m json.tool + +# Остановить захват +curl -X POST http://localhost:8080/api/capture/stop + +# Скачать PDF отчёт +curl http://localhost:8080/api/reports/generate -o report.pdf +``` + +--- + +## Таблица ожидаемых результатов + +| Тест | Инструмент | Алерт | Критичность | Время до срабатывания | +|------|------------|-------|-------------|----------------------| +| Port Scan | `nmap -sS` | `port_scan` | high | ~10 сек | +| Brute Force SSH | `hydra` | `brute_force` | critical | ~30 сек | +| SYN Flood | `hping3 --flood` | `dos` | critical | ~1 сек | +| ARP Spoof | `arpspoof` | `arp_spoof` | critical | мгновенно | +| DNS Tunnel | `dig` длинный | `dns_anomaly` | medium | мгновенно | +| DNS Flood | `dnsperf` | `dns_anomaly` | medium | ~60 сек | diff --git a/docs/user-guide.md b/docs/user-guide.md new file mode 100644 index 0000000..9f9036a --- /dev/null +++ b/docs/user-guide.md @@ -0,0 +1,108 @@ +# Руководство пользователя + +## Интерфейс веб-панели + +Панель управления доступна по адресу `http://localhost:3000` после запуска фронтенда. + +### Боковое меню + +| Пункт | Страница | Описание | +|-------|----------|----------| +| Обзор | `/` | Дашборд с метриками и графиками | +| Алерты | `/alerts` | Журнал всех обнаруженных угроз | +| Захват | `/capture` | Управление захватом трафика | +| Статистика | `/stats` | Детальные графики и сводные таблицы | + +В нижней части меню — индикатор состояния захвата (зелёный пульс = активен). + +--- + +## Страница «Обзор» (Dashboard) + +Главная страница отображает: + +**Карточки метрик** — количество алертов по уровню критичности: +- Критический (красный) +- Высокий (оранжевый) +- Средний (жёлтый) +- Низкий (зелёный) + +**График «Алерты за 24 часа»** — временная шкала событий с часовой детализацией. + +**Диаграмма «Типы атак»** — donut-чарт с распределением по типам угроз. + +**Топ источников** — 5 наиболее активных IP-адресов с прогресс-барами. + +**Последние инциденты** — 8 последних алертов с описанием. Данные обновляются автоматически каждые 10 секунд. + +--- + +## Страница «Алерты» + +### Фильтрация +- **Тип атаки** — Port Scan, Brute Force, DoS/DDoS, ARP Spoof, DNS Anomaly +- **Критичность** — критический, высокий, средний, низкий +- **IP источника** — фильтр по точному совпадению + +Нажмите **Найти** для применения фильтров, **Сбросить** — для очистки. + +### Таблица алертов +Колонки: Время · Критичность · Тип · Источник · Назначение · Описание + +- **Страница** — 25 записей, навигация внизу таблицы +- **Удалить алерт** — кнопка с иконкой корзины в строке +- **Очистить всё** — удаляет все алерты из БД (необратимо) + +--- + +## Страница «Захват» + +### Live захват + +1. Выберите сетевой интерфейс из выпадающего списка (кнопка ↺ обновляет список) +2. Нажмите **Начать захват** +3. Бэкенд должен быть запущен с правами root (`sudo ./nids`) +4. Для остановки — кнопка **Остановить захват** (в заголовке или на странице) + +### Анализ PCAP файла + +1. Перейдите на вкладку **PCAP файл** +2. Перетащите `.pcap` или `.pcapng` файл в зону загрузки (или нажмите «Выбрать файл») +3. Нажмите **Анализировать** +4. После завершения алерты появятся в журнале + +### История сессий + +Таблица последних 20 сессий захвата: источник, режим, статус, количество пакетов, объём трафика. + +--- + +## Страница «Статистика» + +### Период наблюдения +Кнопки: **6ч · 24ч · 2д · 7д** — переключают временной диапазон для всех графиков. + +### Графики +- **Динамика алертов** — столбчатая диаграмма по часам +- **По типам атак** — donut с легендой +- **По критичности** — donut с легендой +- **Топ-10 источников** — горизонтальная столбчатая диаграмма + +### Сводная таблица +Итоговые числа по критичности и типам атак, общее количество. + +--- + +## Генерация PDF-отчёта + +Кнопка **PDF отчёт** доступна в заголовке на любой странице. + +Отчёт содержит: +1. Заголовок с датой формирования +2. Метаданные последней сессии +3. Сводку по критичности +4. Таблицу типов угроз +5. Топ-10 источников атак +6. Журнал инцидентов (до 200 записей) + +Файл сохраняется как `nids-report-YYYY-MM-DD_HH-MM.pdf`. diff --git a/frontend/app.config.ts b/frontend/app.config.ts new file mode 100644 index 0000000..e629619 --- /dev/null +++ b/frontend/app.config.ts @@ -0,0 +1,6 @@ +export default defineAppConfig({ + ui: { + primary: 'blue', + gray: 'neutral', + }, +}) diff --git a/frontend/app.vue b/frontend/app.vue new file mode 100644 index 0000000..f8eacfa --- /dev/null +++ b/frontend/app.vue @@ -0,0 +1,5 @@ + diff --git a/frontend/bun.lock b/frontend/bun.lock new file mode 100644 index 0000000..595ff19 --- /dev/null +++ b/frontend/bun.lock @@ -0,0 +1,1822 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "dip-ids-frontend", + "dependencies": { + "@nuxt/ui": "^2.18.4", + "chart.js": "^4.4.4", + "nuxt": "^3.13.2", + "vue-chartjs": "^5.3.1", + }, + }, + }, + "packages": { + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], + + "@antfu/utils": ["@antfu/utils@8.1.1", "", {}, "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ=="], + + "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + + "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="], + + "@babel/core": ["@babel/core@7.29.0", "", { "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" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="], + + "@babel/generator": ["@babel/generator@7.29.1", "", { "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" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "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" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.28.6", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helpers": ["@babel/helpers@7.29.2", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.29.0" } }, "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw=="], + + "@babel/parser": ["@babel/parser@7.29.2", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw=="], + + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], + + "@babel/traverse": ["@babel/traverse@7.29.0", "", { "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" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="], + + "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "@bomb.sh/tab": ["@bomb.sh/tab@0.0.14", "", { "peerDependencies": { "cac": "^6.7.14", "citty": "^0.1.6 || ^0.2.0", "commander": "^13.1.0" }, "optionalPeers": ["cac", "citty", "commander"], "bin": { "tab": "dist/bin/cli.mjs" } }, "sha512-cHMk2LI430MVoX1unTt9oK1iZzQS4CYDz97MSxKLNErW69T43Z2QLFTpdS/3jVOIKrIADWfuxQ+nQNJkNV7E4w=="], + + "@clack/core": ["@clack/core@1.2.0", "", { "dependencies": { "fast-wrap-ansi": "^0.1.3", "sisteransi": "^1.0.5" } }, "sha512-qfxof/3T3t9DPU/Rj3OmcFyZInceqj/NVtO9rwIuJqCUgh32gwPjpFQQp/ben07qKlhpwq7GzfWpST4qdJ5Drg=="], + + "@clack/prompts": ["@clack/prompts@1.2.0", "", { "dependencies": { "@clack/core": "1.2.0", "fast-string-width": "^1.1.0", "fast-wrap-ansi": "^0.1.3", "sisteransi": "^1.0.5" } }, "sha512-4jmztR9fMqPMjz6H/UZXj0zEmE43ha1euENwkckKKel4XpSfokExPo5AiVStdHSAlHekz4d0CA/r45Ok1E4D3w=="], + + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.2", "", {}, "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ=="], + + "@colordx/core": ["@colordx/core@5.0.3", "", {}, "sha512-xBQ0MYRTNNxW3mS2sJtlQTT7C3Sasqgh1/PsHva7fyDb5uqYY+gv9V0utDdX8X80mqzbGz3u/IDJdn2d/uW09g=="], + + "@csstools/selector-resolve-nested": ["@csstools/selector-resolve-nested@3.1.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g=="], + + "@csstools/selector-specificity": ["@csstools/selector-specificity@5.0.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw=="], + + "@dxup/nuxt": ["@dxup/nuxt@0.4.0", "", { "dependencies": { "@dxup/unimport": "^0.1.2", "@nuxt/kit": "^4.2.2", "chokidar": "^5.0.0", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" }, "peerDependencies": { "typescript": "*" } }, "sha512-28LDotpr9G2knUse3cQYsOo6NJq5yhABv4ByRVRYJUmzf9Q31DI7rpRek4POlKy1aAcYyKgu5J2616pyqLohYg=="], + + "@dxup/unimport": ["@dxup/unimport@0.1.2", "", {}, "sha512-/B8YJGPzaYq1NbsQmwgP8EZqg40NpTw4ZB3suuI0TplbxKHeK94jeaawLmVhCv+YwUnOpiWEz9U6SeThku/8JQ=="], + + "@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], + + "@headlessui/tailwindcss": ["@headlessui/tailwindcss@0.2.2", "", { "peerDependencies": { "tailwindcss": "^3.0 || ^4.0" } }, "sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw=="], + + "@headlessui/vue": ["@headlessui/vue@1.7.23", "", { "dependencies": { "@tanstack/vue-virtual": "^3.0.0-beta.60" }, "peerDependencies": { "vue": "^3.2.0" } }, "sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg=="], + + "@iconify-json/heroicons": ["@iconify-json/heroicons@1.2.3", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-n+vmCEgTesRsOpp5AB5ILB6srsgsYK+bieoQBNlafvoEhjVXLq8nIGN4B0v/s4DUfa0dOrjwE/cKJgIKdJXOEg=="], + + "@iconify/collections": ["@iconify/collections@1.0.671", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-+UO1BvRCf2zpuKg6REnJfgDjKvtMGjmTFKIZSRhOLK3A6sAFo1ZDB+AjDE1g0lzhKZ4KZsYM7b5tCHFFvalQQA=="], + + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], + + "@iconify/utils": ["@iconify/utils@2.3.0", "", { "dependencies": { "@antfu/install-pkg": "^1.0.0", "@antfu/utils": "^8.1.0", "@iconify/types": "^2.0.0", "debug": "^4.4.0", "globals": "^15.14.0", "kolorist": "^1.8.0", "local-pkg": "^1.0.0", "mlly": "^1.7.4" } }, "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA=="], + + "@iconify/vue": ["@iconify/vue@5.0.0", "", { "dependencies": { "@iconify/types": "^2.0.0" }, "peerDependencies": { "vue": ">=3" } }, "sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg=="], + + "@ioredis/commands": ["@ioredis/commands@1.5.1", "", {}, "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@koa/router": ["@koa/router@12.0.2", "", { "dependencies": { "debug": "^4.3.4", "http-errors": "^2.0.0", "koa-compose": "^4.1.0", "methods": "^1.1.2", "path-to-regexp": "^6.3.0" } }, "sha512-sYcHglGKTxGF+hQ6x67xDfkE9o+NhVlRHBqq6gLywaMc6CojK/5vFZByphdonKinYlMLkEkacm+HEse9HzwgTA=="], + + "@kurkle/color": ["@kurkle/color@0.3.4", "", {}, "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w=="], + + "@kwsites/file-exists": ["@kwsites/file-exists@1.1.1", "", { "dependencies": { "debug": "^4.1.1" } }, "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw=="], + + "@kwsites/promise-deferred": ["@kwsites/promise-deferred@1.1.1", "", {}, "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="], + + "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@2.0.3", "", { "dependencies": { "consola": "^3.2.3", "detect-libc": "^2.0.0", "https-proxy-agent": "^7.0.5", "node-fetch": "^2.6.7", "nopt": "^8.0.0", "semver": "^7.5.3", "tar": "^7.4.0" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.3", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@nuxt/cli": ["@nuxt/cli@3.34.0", "", { "dependencies": { "@bomb.sh/tab": "^0.0.14", "@clack/prompts": "^1.1.0", "c12": "^3.3.3", "citty": "^0.2.1", "confbox": "^0.2.4", "consola": "^3.4.2", "debug": "^4.4.3", "defu": "^6.1.4", "exsolve": "^1.0.8", "fuse.js": "^7.1.0", "fzf": "^0.5.2", "giget": "^3.1.2", "jiti": "^2.6.1", "listhen": "^1.9.0", "nypm": "^0.6.5", "ofetch": "^1.5.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.1.0", "pkg-types": "^2.3.0", "scule": "^1.3.0", "semver": "^7.7.4", "srvx": "^0.11.9", "std-env": "^3.10.0", "tinyclip": "^0.1.12", "tinyexec": "^1.0.2", "ufo": "^1.6.3", "youch": "^4.1.0" }, "peerDependencies": { "@nuxt/schema": "^4.3.1" }, "optionalPeers": ["@nuxt/schema"], "bin": { "nuxi": "bin/nuxi.mjs", "nuxi-ng": "bin/nuxi.mjs", "nuxt": "bin/nuxi.mjs", "nuxt-cli": "bin/nuxi.mjs" } }, "sha512-KVI4xSo96UtUUbmxr9ouWTytbj1LzTw5alsM4vC/gSY/l8kPMRAlq0XpNSAVTDJyALzLY70WhaIMX24LJLpdFw=="], + + "@nuxt/devalue": ["@nuxt/devalue@2.0.2", "", {}, "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA=="], + + "@nuxt/devtools": ["@nuxt/devtools@3.2.4", "", { "dependencies": { "@nuxt/devtools-kit": "3.2.4", "@nuxt/devtools-wizard": "3.2.4", "@nuxt/kit": "^4.4.2", "@vue/devtools-core": "^8.1.0", "@vue/devtools-kit": "^8.1.0", "birpc": "^4.0.0", "consola": "^3.4.2", "destr": "^2.0.5", "error-stack-parser-es": "^1.0.5", "execa": "^8.0.1", "fast-npm-meta": "^1.4.2", "get-port-please": "^3.2.0", "hookable": "^6.1.0", "image-meta": "^0.2.2", "is-installed-globally": "^1.0.0", "launch-editor": "^2.13.1", "local-pkg": "^1.1.2", "magicast": "^0.5.2", "nypm": "^0.6.5", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.1.0", "pkg-types": "^2.3.0", "semver": "^7.7.4", "simple-git": "^3.33.0", "sirv": "^3.0.2", "structured-clone-es": "^2.0.0", "tinyglobby": "^0.2.15", "vite-plugin-inspect": "^11.3.3", "vite-plugin-vue-tracer": "^1.3.0", "which": "^6.0.1", "ws": "^8.19.0" }, "peerDependencies": { "@vitejs/devtools": "*", "vite": ">=6.0" }, "optionalPeers": ["@vitejs/devtools"], "bin": { "devtools": "cli.mjs" } }, "sha512-VPbFy7hlPzWpEZk4BsuVpNuHq1ZYGV9xezjb7/NGuePuNLqeNn74YZugU+PCtva7OwKhEeTXmMK0Mqo/6+nwNA=="], + + "@nuxt/devtools-kit": ["@nuxt/devtools-kit@2.7.0", "", { "dependencies": { "@nuxt/kit": "^3.19.3", "execa": "^8.0.1" }, "peerDependencies": { "vite": ">=6.0" } }, "sha512-MIJdah6CF6YOW2GhfKnb8Sivu6HpcQheqdjOlZqShBr+1DyjtKQbAKSCAyKPaoIzZP4QOo2SmTFV6aN8jBeEIQ=="], + + "@nuxt/devtools-wizard": ["@nuxt/devtools-wizard@3.2.4", "", { "dependencies": { "@clack/prompts": "^1.1.0", "consola": "^3.4.2", "diff": "^8.0.3", "execa": "^8.0.1", "magicast": "^0.5.2", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "semver": "^7.7.4" }, "bin": { "devtools-wizard": "cli.mjs" } }, "sha512-5tu2+Quu9XTxwtpzM8CUN0UKn/bzZIfJcoGd+at5Yy1RiUQJ4E52tRK0idW1rMSUDkbkvX3dSnu8Tpj7SAtWdQ=="], + + "@nuxt/icon": ["@nuxt/icon@1.15.0", "", { "dependencies": { "@iconify/collections": "^1.0.563", "@iconify/types": "^2.0.0", "@iconify/utils": "^2.3.0", "@iconify/vue": "^5.0.0", "@nuxt/devtools-kit": "^2.5.0", "@nuxt/kit": "^3.17.5", "consola": "^3.4.2", "local-pkg": "^1.1.1", "mlly": "^1.7.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinyglobby": "^0.2.14" } }, "sha512-kA0rxqr1B601zNJNcOXera8CyYcxUCEcT7dXEC7rwAz71PRCN5emf7G656eKEQgtqrD4JSj6NQqWDgrmFcf/GQ=="], + + "@nuxt/kit": ["@nuxt/kit@4.4.2", "", { "dependencies": { "c12": "^3.3.3", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.8", "ignore": "^7.0.5", "jiti": "^2.6.1", "klona": "^2.0.6", "mlly": "^1.8.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "rc9": "^3.0.0", "scule": "^1.3.0", "semver": "^7.7.4", "tinyglobby": "^0.2.15", "ufo": "^1.6.3", "unctx": "^2.5.0", "untyped": "^2.0.0" } }, "sha512-5+IPRNX2CjkBhuWUwz0hBuLqiaJPRoKzQ+SvcdrQDbAyE+VDeFt74VpSFr5/R0ujrK4b+XnSHUJWdS72w6hsog=="], + + "@nuxt/nitro-server": ["@nuxt/nitro-server@3.21.2", "", { "dependencies": { "@nuxt/devalue": "^2.0.2", "@nuxt/kit": "3.21.2", "@unhead/vue": "^2.1.12", "@vue/shared": "^3.5.30", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "devalue": "^5.6.3", "errx": "^0.1.0", "escape-string-regexp": "^5.0.0", "exsolve": "^1.0.8", "h3": "^1.15.6", "impound": "^1.1.5", "klona": "^2.0.6", "mocked-exports": "^0.1.1", "nitropack": "^2.13.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "rou3": "^0.8.1", "std-env": "^4.0.0", "ufo": "^1.6.3", "unctx": "^2.5.0", "unstorage": "^1.17.4", "vue": "^3.5.30", "vue-bundle-renderer": "^2.2.0", "vue-devtools-stub": "^0.1.0" }, "peerDependencies": { "nuxt": "^3.21.2" } }, "sha512-tJiyrG+chze1JP1JNDFR2Ib+EhnMzmZXW7AmW7Wbxz2LLTSapLzJCLgHcy4OBcBK22bs06bI/ivn95JNvvxWbQ=="], + + "@nuxt/schema": ["@nuxt/schema@3.21.2", "", { "dependencies": { "@vue/shared": "^3.5.30", "defu": "^6.1.4", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "std-env": "^4.0.0" } }, "sha512-yZaJrZizRP4OQVCM7qRG3xIJ1xZ59npgg9jd3ng+BDs5ZvLqYP9rXnFikShc8EPUtR6+zhSPgKgy6L8wWcBKzQ=="], + + "@nuxt/telemetry": ["@nuxt/telemetry@2.8.0", "", { "dependencies": { "citty": "^0.2.1", "consola": "^3.4.2", "ofetch": "^2.0.0-alpha.3", "rc9": "^3.0.0", "std-env": "^4.0.0" }, "peerDependencies": { "@nuxt/kit": ">=3.0.0" }, "bin": { "nuxt-telemetry": "bin/nuxt-telemetry.mjs" } }, "sha512-zAwXY24KYvpLTmiV+osagd2EHkfs5IF+7oDZYTQoit5r0kPlwaCNlzHp5I/wUAWT4LBw6lG8gZ6bWidAdv/erQ=="], + + "@nuxt/ui": ["@nuxt/ui@2.22.3", "", { "dependencies": { "@headlessui/tailwindcss": "^0.2.2", "@headlessui/vue": "^1.7.23", "@iconify-json/heroicons": "^1.2.2", "@nuxt/icon": "^1.15.0", "@nuxt/kit": "^4.0.3", "@nuxtjs/color-mode": "^3.5.2", "@nuxtjs/tailwindcss": "^6.14.0", "@popperjs/core": "^2.11.8", "@standard-schema/spec": "^1.0.0", "@tailwindcss/aspect-ratio": "^0.4.2", "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/forms": "^0.5.10", "@tailwindcss/typography": "^0.5.16", "@vueuse/core": "^13.8.0", "@vueuse/integrations": "^13.8.0", "@vueuse/math": "^13.8.0", "defu": "^6.1.4", "fuse.js": "^7.1.0", "ohash": "^2.0.11", "pathe": "^2.0.3", "scule": "^1.3.0", "tailwind-merge": "^2.6.0", "tailwindcss": "^3.4.17" }, "peerDependencies": { "joi": "^17.13.0", "superstruct": "^2.0.0", "valibot": "^1.0.0", "yup": "^1.6.0", "zod": "^3.24.0" }, "optionalPeers": ["joi", "superstruct", "valibot", "yup", "zod"] }, "sha512-895SAzqCCT5JAc1JQ8nAmmpwdKCJqArY8ifL/PNtD681FKSdXiSPxODGnpqpovM/ws6bvoRwglA7BtwAJ5ySBg=="], + + "@nuxt/vite-builder": ["@nuxt/vite-builder@3.21.2", "", { "dependencies": { "@nuxt/kit": "3.21.2", "@rollup/plugin-replace": "^6.0.3", "@vitejs/plugin-vue": "^6.0.4", "@vitejs/plugin-vue-jsx": "^5.1.4", "autoprefixer": "^10.4.27", "consola": "^3.4.2", "cssnano": "^7.1.3", "defu": "^6.1.4", "escape-string-regexp": "^5.0.0", "exsolve": "^1.0.8", "externality": "^1.0.2", "get-port-please": "^3.2.0", "jiti": "^2.6.1", "knitwork": "^1.3.0", "magic-string": "^0.30.21", "mlly": "^1.8.1", "mocked-exports": "^0.1.1", "nypm": "^0.6.5", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.1.0", "pkg-types": "^2.3.0", "postcss": "^8.5.8", "seroval": "^1.5.1", "std-env": "^4.0.0", "ufo": "^1.6.3", "unenv": "^2.0.0-rc.24", "vite": "^7.3.1", "vite-node": "^5.3.0", "vite-plugin-checker": "^0.12.0", "vue-bundle-renderer": "^2.2.0" }, "peerDependencies": { "nuxt": "3.21.2", "rolldown": "^1.0.0-beta.38", "rollup-plugin-visualizer": "^6.0.0 || ^7.0.1", "vue": "^3.3.4" }, "optionalPeers": ["rolldown", "rollup-plugin-visualizer"] }, "sha512-AwfvmogMzBmX8oS8QPjh9uZiUtnWmOV8w4Ei4DMukVELemkRugDOqWzCzuFneOFQ8khhOOMZ/lRcoTiPryZS5A=="], + + "@nuxtjs/color-mode": ["@nuxtjs/color-mode@3.5.2", "", { "dependencies": { "@nuxt/kit": "^3.13.2", "pathe": "^1.1.2", "pkg-types": "^1.2.1", "semver": "^7.6.3" } }, "sha512-cC6RfgZh3guHBMLLjrBB2Uti5eUoGM9KyauOaYS9ETmxNWBMTvpgjvSiSJp1OFljIXPIqVTJ3xtJpSNZiO3ZaA=="], + + "@nuxtjs/tailwindcss": ["@nuxtjs/tailwindcss@6.14.0", "", { "dependencies": { "@nuxt/kit": "^3.16.0", "autoprefixer": "^10.4.20", "c12": "^3.0.2", "consola": "^3.4.0", "defu": "^6.1.4", "h3": "^1.15.1", "klona": "^2.0.6", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.1.0", "postcss": "^8.5.3", "postcss-nesting": "^13.0.1", "tailwind-config-viewer": "^2.0.4", "tailwindcss": "~3.4.17", "ufo": "^1.5.4", "unctx": "^2.4.1" } }, "sha512-30RyDK++LrUVRgc2A85MktGWIZoRQgeQKjE4CjjD64OXNozyl+4ScHnnYgqVToMM6Ch2ZG2W4wV2J0EN6F0zkQ=="], + + "@oxc-minify/binding-android-arm-eabi": ["@oxc-minify/binding-android-arm-eabi@0.117.0", "", { "os": "android", "cpu": "arm" }, "sha512-5Hf2KsGRjxp3HnPU/mse7cQJa5tWfMFUPZQcgSMVsv2JZnGFFOIDzA0Oja2KDD+VPJqMpEJKc2dCHAGZgJxsGg=="], + + "@oxc-minify/binding-android-arm64": ["@oxc-minify/binding-android-arm64@0.117.0", "", { "os": "android", "cpu": "arm64" }, "sha512-uuxGwxA5J4Sap+gz4nxyM/rer6q2A4X1Oe8HpE0CZQyb5cSBULQ15btZiVG3xOBctI5O+c2dwR1aZAP4oGKcLw=="], + + "@oxc-minify/binding-darwin-arm64": ["@oxc-minify/binding-darwin-arm64@0.117.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lLBf75cxUSLydumToKtGTwbLqO/1urScblJ33Vx0uF38M2ZbL2x51AybBV5vlfLjYNrxvQ8ov0Bj/OhsVO/biA=="], + + "@oxc-minify/binding-darwin-x64": ["@oxc-minify/binding-darwin-x64@0.117.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-wBWwP1voLZMuN4hpe1HRtkPBd4/o/1qan5XssmmI/hewBvGHEHkyvVLS0zu+cKqXDxYzYvb/p+EqU+xSXhEl4A=="], + + "@oxc-minify/binding-freebsd-x64": ["@oxc-minify/binding-freebsd-x64@0.117.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-pYSacHw698oH2vb70iP1cHk6x0zhvAuOvdskvNtEqvfziu8MSjKXa699vA9Cx72+DH5rwVuj1I3f+7no2fWglA=="], + + "@oxc-minify/binding-linux-arm-gnueabihf": ["@oxc-minify/binding-linux-arm-gnueabihf@0.117.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Ugm4Qj7F2+bccjhHCjjnSNHBDPyvjPXWrntID4WJpSrPqt+Az/o0EGdty9sWOjQXRZiTVpa80uqCWZQUn94yTA=="], + + "@oxc-minify/binding-linux-arm-musleabihf": ["@oxc-minify/binding-linux-arm-musleabihf@0.117.0", "", { "os": "linux", "cpu": "arm" }, "sha512-qrY6ZviO9wVRI/jl4nRZO4B9os8jaJQemMeWIyFInZNk3lhqihId8iBqMKibJnRaf+JRxLM9j68atXkFRhOHrg=="], + + "@oxc-minify/binding-linux-arm64-gnu": ["@oxc-minify/binding-linux-arm64-gnu@0.117.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-2VLJHKEFBRhCihT/8uesuDPhXpbWu1OlHCxqQ7pdFVqKik1Maj5E9oSDcYzxqfaCRStvTHkmLVWJBK5CVcIadg=="], + + "@oxc-minify/binding-linux-arm64-musl": ["@oxc-minify/binding-linux-arm64-musl@0.117.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-C3zapJconWpl2Y7LR3GkRkH6jxpuV2iVUfkFcHT5Ffn4Zu7l88mZa2dhcfdULZDybN1Phka/P34YUzuskUUrXw=="], + + "@oxc-minify/binding-linux-ppc64-gnu": ["@oxc-minify/binding-linux-ppc64-gnu@0.117.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-2T/Bm+3/qTfuNS4gKSzL8qbiYk+ErHW2122CtDx+ilZAzvWcJ8IbqdZIbEWOlwwe03lESTxPwTBLFqVgQU2OeQ=="], + + "@oxc-minify/binding-linux-riscv64-gnu": ["@oxc-minify/binding-linux-riscv64-gnu@0.117.0", "", { "os": "linux", "cpu": "none" }, "sha512-MKLjpldYkeoB4T+yAi4aIAb0waifxUjLcKkCUDmYAY3RqBJTvWK34KtfaKZL0IBMIXfD92CbKkcxQirDUS9Xcg=="], + + "@oxc-minify/binding-linux-riscv64-musl": ["@oxc-minify/binding-linux-riscv64-musl@0.117.0", "", { "os": "linux", "cpu": "none" }, "sha512-UFVcbPvKUStry6JffriobBp8BHtjmLLPl4bCY+JMxIn/Q3pykCpZzRwFTcDurG/kY8tm+uSNfKKdRNa5Nh9A7g=="], + + "@oxc-minify/binding-linux-s390x-gnu": ["@oxc-minify/binding-linux-s390x-gnu@0.117.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-B9GyPQ1NKbvpETVAMyJMfRlD3c6UJ7kiuFUAlx9LTYiQL+YIyT6vpuRlq1zgsXxavZluVrfeJv6x0owV4KDx4Q=="], + + "@oxc-minify/binding-linux-x64-gnu": ["@oxc-minify/binding-linux-x64-gnu@0.117.0", "", { "os": "linux", "cpu": "x64" }, "sha512-fXfhtr+WWBGNy4M5GjAF5vu/lpulR4Me34FjTyaK9nDrTZs7LM595UDsP1wliksqp4hD/KdoqHGmbCrC+6d4vA=="], + + "@oxc-minify/binding-linux-x64-musl": ["@oxc-minify/binding-linux-x64-musl@0.117.0", "", { "os": "linux", "cpu": "x64" }, "sha512-jFBgGbx1oLadb83ntJmy1dWlAHSQanXTS21G4PgkxyONmxZdZ/UMKr7KsADzMuoPsd2YhJHxzRpwJd9U+4BFBw=="], + + "@oxc-minify/binding-openharmony-arm64": ["@oxc-minify/binding-openharmony-arm64@0.117.0", "", { "os": "none", "cpu": "arm64" }, "sha512-nxPd9vx1vYz8IlIMdl9HFdOK/ood1H5hzbSFsyO8JU55tkcJoBL8TLCbuFf9pHpOy27l2gcPyV6z3p4eAcTH5Q=="], + + "@oxc-minify/binding-wasm32-wasi": ["@oxc-minify/binding-wasm32-wasi@0.117.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-pSvjJ6cCCfEXSteWSiVfZhdRzvpmS3tLhlXrXTYiuTDFrkRCobRP39SRwAzK23rE9i/m2JAaES2xPEW6+xu85g=="], + + "@oxc-minify/binding-win32-arm64-msvc": ["@oxc-minify/binding-win32-arm64-msvc@0.117.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-9NoT9baFrWPdJRIZVQ1jzPZW9TjPT2sbzQyDdoK7uD1V8JXCe1L2y7sp9k2ldZZheaIcmtNwHc7jyD7kYz/0XQ=="], + + "@oxc-minify/binding-win32-ia32-msvc": ["@oxc-minify/binding-win32-ia32-msvc@0.117.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-E51LTjkRei5u2dpFiYSObuh+e43xg45qlmilSTd0XDGFdYJCOv62Q0MEn61TR+efQYPNleYwWdTS9t+tp9p/4w=="], + + "@oxc-minify/binding-win32-x64-msvc": ["@oxc-minify/binding-win32-x64-msvc@0.117.0", "", { "os": "win32", "cpu": "x64" }, "sha512-I8vniPOxWQdxfIbXNvQLaJ1n8SrnqES6wuiAX10CU72sKsizkds9kDaJ1KzWvDy39RKhTBmD1cJsU2uxPFgizQ=="], + + "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.117.0", "", { "os": "android", "cpu": "arm" }, "sha512-XarGPJpaobgKjfm7xRfCGWWszuPbm/OeP91NdMhxtcLZ/qLTmWF0P0z0gqmr0Uysi1F1v1BNtcST11THMrcEOw=="], + + "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.117.0", "", { "os": "android", "cpu": "arm64" }, "sha512-EPTs2EBijGmyhPso4rXAL0NSpECXER9IaVKFZEv83YcA6h4uhKW47kmYt+OZcSp130zhHx+lTWILDQ/LDkCRNA=="], + + "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.117.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-3bAEpyih6r/Kb+Xzn1em1qBMClOS7NsVWgF86k95jpysR5ix/HlKFKSy7cax6PcS96HeHR4kjlME20n/XK1zNg=="], + + "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.117.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-W7S99zFwVZhSbCxvjfZkioStFU249DBc4TJw/kK6kfKwx2Zew+jvizX5Y3ZPkAh7fBVUSNOdSeOqLBHLiP50tw=="], + + "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.117.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xH76lqSdjCSY0KUMPwLXlvQ3YEm3FFVEQmgiOCGNf+stZ6E4Mo3nC102Bo8yKd7aW0foIPAFLYsHgj7vVI/axw=="], + + "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.117.0", "", { "os": "linux", "cpu": "arm" }, "sha512-9Hdm1imzrn4RdMYnQKKcy+7p7QsSPIrgVIZmpGSJT02nYDuBWLdG1pdYMPFoEo46yiXry3tS3RoHIpNbT1IiyQ=="], + + "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.117.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Itszer/VCeYhYVJLcuKnHktlY8QyGnVxapltP68S1XRGlV6IsM9HQAElJRMwQhT6/GkMjOhANmkv2Qu/9v44lw=="], + + "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.117.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jBxD7DtlHQ36ivjjZdH0noQJgWNouenzpLmXNKnYaCsBfo3jY95m5iyjYQEiWkvkhJ3TJUAs7tQ1/kEpY7x/Kg=="], + + "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.117.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-QagKTDF4lrz8bCXbUi39Uq5xs7C7itAseKm51f33U+Dyar9eJY/zGKqfME9mKLOiahX7Fc1J3xMWVS0AdDXLPg=="], + + "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.117.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-RPddpcE/0xxWaommWy0c5i/JdrXcXAkxBS2GOrAUh5LKmyCh03hpJedOAWszG4ADsKQwoUQQ1/tZVGRhZIWtKA=="], + + "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.117.0", "", { "os": "linux", "cpu": "none" }, "sha512-ur/WVZF9FSOiZGxyP+nfxZzuv6r5OJDYoVxJnUR7fM/hhXLh4V/be6rjbzm9KLCDBRwYCEKJtt+XXNccwd06IA=="], + + "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.117.0", "", { "os": "linux", "cpu": "none" }, "sha512-ujGcAx8xAMvhy7X5sBFi3GXML1EtyORuJZ5z2T6UV3U416WgDX/4OCi3GnoteeenvxIf6JgP45B+YTHpt71vpA=="], + + "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.117.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hbsfKjUwRjcMZZvvmpZSc+qS0bHcHRu8aV/I3Ikn9BzOA0ZAgUE7ctPtce5zCU7bM8dnTLi4sJ1Pi9YHdx6Urw=="], + + "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.117.0", "", { "os": "linux", "cpu": "x64" }, "sha512-1QrTrf8rige7UPJrYuDKJLQOuJlgkt+nRSJLBMHWNm9TdivzP48HaK3f4q18EjNlglKtn03lgjMu4fryDm8X4A=="], + + "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.117.0", "", { "os": "linux", "cpu": "x64" }, "sha512-gRvK6HPzF5ITRL68fqb2WYYs/hGviPIbkV84HWCgiJX+LkaOpp+HIHQl3zVZdyKHwopXToTbXbtx/oFjDjl8pg=="], + + "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.117.0", "", { "os": "none", "cpu": "arm64" }, "sha512-QPJvFbnnDZZY7xc+xpbIBWLThcGBakwaYA9vKV8b3+oS5MGfAZUoTFJcix5+Zg2Ri46sOfrUim6Y6jsKNcssAQ=="], + + "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.117.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-+XRSNA0xt3pk/6CUHM7pykVe7M8SdifJk8LX1+fIp/zefvR3HBieZCbwG5un8gogNgh7srLycoh/cQA9uozv5g=="], + + "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.117.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-GpxeGS+Vo030DsrXeRPc7OSJOQIyAHkM3mzwBcnQjg/79XnOIDDMXJ5X6/aNdkVt/+Pv35pqKzGA4TQau97x8w=="], + + "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.117.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-tchWEYiso1+objTZirmlR+w3fcIel6PVBOJ8NuC2Jr30dxBOiKUfFLovJLANwHg1+TzeD6pVSLIIIEf2T5o5lQ=="], + + "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.117.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ysRJAjIbB4e5y+t9PZs7TwbgOV/GVT//s30AORLCT/pedYwpYzHq6ApXK7is9fvyfZtgT3anNir8+esurmyaDw=="], + + "@oxc-project/types": ["@oxc-project/types@0.117.0", "", {}, "sha512-C/kPXBphID44fXdsa2xSOCuzX8fKZiFxPsvucJ6Yfkr6CJlMA+kNLPNKyLoI+l9XlDsNxBrz6h7IIjKU8pB69w=="], + + "@oxc-transform/binding-android-arm-eabi": ["@oxc-transform/binding-android-arm-eabi@0.117.0", "", { "os": "android", "cpu": "arm" }, "sha512-17giX7h5VR9Eodru4OoSCFdgwLFIaUxeEn8JWe0vMZrAuRbT9NiDTy5dXdbGQBoO8aXPkbGS38FGlvbi31aujw=="], + + "@oxc-transform/binding-android-arm64": ["@oxc-transform/binding-android-arm64@0.117.0", "", { "os": "android", "cpu": "arm64" }, "sha512-1LrDd1CPochtLx04pAafdah6QtOQQj0/Evttevi+0u8rCI5FKucIG7pqBHkIQi/y7pycFYIj+GebhET80maeUg=="], + + "@oxc-transform/binding-darwin-arm64": ["@oxc-transform/binding-darwin-arm64@0.117.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-K1Xo52xJOvFfHSkz2ax9X5Qsku23RCfTIPbHZWdUCAQ1TQooI+sFcewSubhVUJ4DVK12/tYT//XXboumin+FHA=="], + + "@oxc-transform/binding-darwin-x64": ["@oxc-transform/binding-darwin-x64@0.117.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ftFT/8Laolfq49mRRWLkIhd1AbJ0MI5bW3LwddvdoAg9zXwkx4qhzTYyBPRZhvXWftts+NjlHfHsXCOqI4tPtw=="], + + "@oxc-transform/binding-freebsd-x64": ["@oxc-transform/binding-freebsd-x64@0.117.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-QDRyw0atg9BMnwOwnJeW6REzWPLEjiWtsCc2Sj612F1hCdvP+n0L3o8sHinEWM+BiOkOYtUxHA69WjUslc3G+g=="], + + "@oxc-transform/binding-linux-arm-gnueabihf": ["@oxc-transform/binding-linux-arm-gnueabihf@0.117.0", "", { "os": "linux", "cpu": "arm" }, "sha512-UvpvOjyQVgiIJahIpMT0qAsLJT8O1ibHTBgXGOsZkQgw1xmjARPQ07dpRcucPPn6cqCF3wrxfbqtr2vFHaMkdA=="], + + "@oxc-transform/binding-linux-arm-musleabihf": ["@oxc-transform/binding-linux-arm-musleabihf@0.117.0", "", { "os": "linux", "cpu": "arm" }, "sha512-cIhztGFjKk8ngP+/7EPkEhzWMGr2neezxgWirSn/f/MirjH234oHHGJ2diKIbGQEsy0aOuJMTkL9NLfzfmH51A=="], + + "@oxc-transform/binding-linux-arm64-gnu": ["@oxc-transform/binding-linux-arm64-gnu@0.117.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-mXbDfvDN0RZVg7v4LohNzU0kK3fMAZgkUKTkpFVgxEvzibEG5VpSznkypUwHI4a8U8pz+K6mGaLetX3Xt+CvvA=="], + + "@oxc-transform/binding-linux-arm64-musl": ["@oxc-transform/binding-linux-arm64-musl@0.117.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ykxpPQp0eAcSmhy0Y3qKvdanHY4d8THPonDfmCoktUXb6r0X6qnjpJB3V+taN1wevW55bOEZd97kxtjTKjqhmg=="], + + "@oxc-transform/binding-linux-ppc64-gnu": ["@oxc-transform/binding-linux-ppc64-gnu@0.117.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Rvspti4Kr7eq6zSrURK5WjscfWQPvmy/KjJZV45neRKW8RLonE3r9+NgrwSLGoHvQ3F24fbqlkplox1RtlhH5A=="], + + "@oxc-transform/binding-linux-riscv64-gnu": ["@oxc-transform/binding-linux-riscv64-gnu@0.117.0", "", { "os": "linux", "cpu": "none" }, "sha512-Dr2ZW9ZZ4l1eQ5JUEUY3smBh4JFPCPuybWaDZTLn3ADZjyd8ZtNXEjeMT8rQbbhbgSL9hEgbwaqraole3FNThQ=="], + + "@oxc-transform/binding-linux-riscv64-musl": ["@oxc-transform/binding-linux-riscv64-musl@0.117.0", "", { "os": "linux", "cpu": "none" }, "sha512-oD1Bnes1bIC3LVBSrWEoSUBj6fvatESPwAVWfJVGVQlqWuOs/ZBn1e4Nmbipo3KGPHK7DJY75r/j7CQCxhrOFQ=="], + + "@oxc-transform/binding-linux-s390x-gnu": ["@oxc-transform/binding-linux-s390x-gnu@0.117.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-qT//IAPLvse844t99Kff5j055qEbXfwzWgvCMb0FyjisnB8foy25iHZxZIocNBe6qwrCYWUP1M8rNrB/WyfS1Q=="], + + "@oxc-transform/binding-linux-x64-gnu": ["@oxc-transform/binding-linux-x64-gnu@0.117.0", "", { "os": "linux", "cpu": "x64" }, "sha512-2YEO5X+KgNzFqRVO5dAkhjcI5gwxus4NSWVl/+cs2sI6P0MNPjqE3VWPawl4RTC11LvetiiZdHcujUCPM8aaUw=="], + + "@oxc-transform/binding-linux-x64-musl": ["@oxc-transform/binding-linux-x64-musl@0.117.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3wqWbTSaIFZvDr1aqmTul4cg8PRWYh6VC52E8bLI7ytgS/BwJLW+sDUU2YaGIds4sAf/1yKeJRmudRCDPW9INg=="], + + "@oxc-transform/binding-openharmony-arm64": ["@oxc-transform/binding-openharmony-arm64@0.117.0", "", { "os": "none", "cpu": "arm64" }, "sha512-Ebxx6NPqhzlrjvx4+PdSqbOq+li0f7X59XtJljDghkbJsbnkHvhLmPR09ifHt5X32UlZN63ekjwcg/nbmHLLlA=="], + + "@oxc-transform/binding-wasm32-wasi": ["@oxc-transform/binding-wasm32-wasi@0.117.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-Nn8mmcBiQ0XKHLTb05QBlH+CDkn7jf5YDVv9FtKhy4zJT0NEU9y3dXVbfcurOpsVrG9me4ktzDQNCaAoJjUQyw=="], + + "@oxc-transform/binding-win32-arm64-msvc": ["@oxc-transform/binding-win32-arm64-msvc@0.117.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-15cbsF8diXWGnHrTsVgVeabETiT/KdMAfRAcot99xsaVecJs3pITNNjC6Qj+/TPNpehbgIFjlhhxOVSbQsTBgg=="], + + "@oxc-transform/binding-win32-ia32-msvc": ["@oxc-transform/binding-win32-ia32-msvc@0.117.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-I6DkhCuFX6p9rckdWiLuZfBWrrYUC7sNX+zLaCfa5zvrPNwo1/29KkefvqXVxu3AWT/6oZAbtc0A8/mqhETJPQ=="], + + "@oxc-transform/binding-win32-x64-msvc": ["@oxc-transform/binding-win32-x64-msvc@0.117.0", "", { "os": "win32", "cpu": "x64" }, "sha512-V7YzavQnYcRJBeJkp0qpb3FKrlm5I57XJetCYB4jsjStuboQmnFMZ/XQH55Szlf/kVyeU9ddQwv72gJJ5BrGjQ=="], + + "@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="], + + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.6", "", { "os": "android", "cpu": "arm64" }, "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A=="], + + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA=="], + + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg=="], + + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng=="], + + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ=="], + + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg=="], + + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA=="], + + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA=="], + + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ=="], + + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg=="], + + "@parcel/watcher-wasm": ["@parcel/watcher-wasm@2.5.6", "", { "dependencies": { "is-glob": "^4.0.3", "napi-wasm": "^1.1.0", "picomatch": "^4.0.3" } }, "sha512-byAiBZ1t3tXQvc8dMD/eoyE7lTXYorhn+6uVW5AC+JGI1KtJC/LvDche5cfUE+qiefH+Ybq0bUCJU0aB1cSHUA=="], + + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q=="], + + "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g=="], + + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.6", "", { "os": "win32", "cpu": "x64" }, "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], + + "@popperjs/core": ["@popperjs/core@2.11.8", "", {}, "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="], + + "@poppinss/colors": ["@poppinss/colors@4.1.6", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="], + + "@poppinss/dumper": ["@poppinss/dumper@0.7.0", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-0UTYalzk2t6S4rA2uHOz5bSSW2CHdv4vggJI6Alg90yvl0UgXs6XSXpH96OH+bRkX4J/06djv29pqXJ0lq5Kag=="], + + "@poppinss/exception": ["@poppinss/exception@1.2.3", "", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.2", "", {}, "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw=="], + + "@rollup/plugin-alias": ["@rollup/plugin-alias@6.0.0", "", { "peerDependencies": { "rollup": ">=4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g=="], + + "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@29.0.2", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg=="], + + "@rollup/plugin-inject": ["@rollup/plugin-inject@5.0.5", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg=="], + + "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], + + "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg=="], + + "@rollup/plugin-replace": ["@rollup/plugin-replace@6.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA=="], + + "@rollup/plugin-terser": ["@rollup/plugin-terser@1.0.0", "", { "dependencies": { "serialize-javascript": "^7.0.3", "smob": "^1.0.0", "terser": "^5.17.4" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.1", "", { "os": "android", "cpu": "arm" }, "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.1", "", { "os": "android", "cpu": "arm64" }, "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.1", "", { "os": "none", "cpu": "arm64" }, "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ=="], + + "@simple-git/args-pathspec": ["@simple-git/args-pathspec@1.0.3", "", {}, "sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA=="], + + "@simple-git/argv-parser": ["@simple-git/argv-parser@1.1.0", "", { "dependencies": { "@simple-git/args-pathspec": "^1.0.3" } }, "sha512-sUKOu2lb5vGIWADNNLpscyj07DAeQZU3KLbnE2Tj53tW6BbDQKMly2CCfnR4oYzqtRELCPWfwaPg+Q0T8qfKBg=="], + + "@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="], + + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], + + "@speed-highlight/core": ["@speed-highlight/core@1.2.15", "", {}, "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@tailwindcss/aspect-ratio": ["@tailwindcss/aspect-ratio@0.4.2", "", { "peerDependencies": { "tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" } }, "sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ=="], + + "@tailwindcss/container-queries": ["@tailwindcss/container-queries@0.1.1", "", { "peerDependencies": { "tailwindcss": ">=3.2.0" } }, "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA=="], + + "@tailwindcss/forms": ["@tailwindcss/forms@0.5.11", "", { "dependencies": { "mini-svg-data-uri": "^1.2.3" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" } }, "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA=="], + + "@tailwindcss/typography": ["@tailwindcss/typography@0.5.19", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg=="], + + "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.23", "", {}, "sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg=="], + + "@tanstack/vue-virtual": ["@tanstack/vue-virtual@3.13.23", "", { "dependencies": { "@tanstack/virtual-core": "3.13.23" }, "peerDependencies": { "vue": "^2.7.0 || ^3.0.0" } }, "sha512-b5jPluAR6U3eOq6GWAYSpj3ugnAIZgGR0e6aGAgyRse0Yu6MVQQ0ZWm9SArSXWtageogn6bkVD8D//c4IjW3xQ=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], + + "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="], + + "@unhead/vue": ["@unhead/vue@2.1.13", "", { "dependencies": { "hookable": "^6.0.1", "unhead": "2.1.13" }, "peerDependencies": { "vue": ">=3.5.18" } }, "sha512-HYy0shaHRnLNW9r85gppO8IiGz0ONWVV3zGdlT8CQ0tbTwixznJCIiyqV4BSV1aIF1jJIye0pd1p/k6Eab8Z/A=="], + + "@vercel/nft": ["@vercel/nft@1.5.0", "", { "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^13.0.0", "graceful-fs": "^4.2.9", "node-gyp-build": "^4.2.2", "picomatch": "^4.0.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA=="], + + "@vitejs/plugin-vue": ["@vitejs/plugin-vue@6.0.5", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.2" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vue": "^3.2.25" } }, "sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg=="], + + "@vitejs/plugin-vue-jsx": ["@vitejs/plugin-vue-jsx@5.1.5", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-syntax-typescript": "^7.28.6", "@babel/plugin-transform-typescript": "^7.28.6", "@rolldown/pluginutils": "^1.0.0-rc.2", "@vue/babel-plugin-jsx": "^2.0.1" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vue": "^3.0.0" } }, "sha512-jIAsvHOEtWpslLOI2MeElGFxH7M8pM83BU/Tor4RLyiwH0FM4nUW3xdvbw20EeU9wc5IspQwMq225K3CMnJEpA=="], + + "@volar/language-core": ["@volar/language-core@2.4.28", "", { "dependencies": { "@volar/source-map": "2.4.28" } }, "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ=="], + + "@volar/source-map": ["@volar/source-map@2.4.28", "", {}, "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ=="], + + "@vue-macros/common": ["@vue-macros/common@3.1.2", "", { "dependencies": { "@vue/compiler-sfc": "^3.5.22", "ast-kit": "^2.1.2", "local-pkg": "^1.1.2", "magic-string-ast": "^1.0.2", "unplugin-utils": "^0.3.0" }, "peerDependencies": { "vue": "^2.7.0 || ^3.2.25" }, "optionalPeers": ["vue"] }, "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng=="], + + "@vue/babel-helper-vue-transform-on": ["@vue/babel-helper-vue-transform-on@2.0.1", "", {}, "sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA=="], + + "@vue/babel-plugin-jsx": ["@vue/babel-plugin-jsx@2.0.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@vue/babel-helper-vue-transform-on": "2.0.1", "@vue/babel-plugin-resolve-type": "2.0.1", "@vue/shared": "^3.5.22" }, "peerDependencies": { "@babel/core": "^7.0.0-0" }, "optionalPeers": ["@babel/core"] }, "sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA=="], + + "@vue/babel-plugin-resolve-type": ["@vue/babel-plugin-resolve-type@2.0.1", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/parser": "^7.28.4", "@vue/compiler-sfc": "^3.5.22" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ=="], + + "@vue/compiler-core": ["@vue/compiler-core@3.5.32", "", { "dependencies": { "@babel/parser": "^7.29.2", "@vue/shared": "3.5.32", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ=="], + + "@vue/compiler-dom": ["@vue/compiler-dom@3.5.32", "", { "dependencies": { "@vue/compiler-core": "3.5.32", "@vue/shared": "3.5.32" } }, "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q=="], + + "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.32", "", { "dependencies": { "@babel/parser": "^7.29.2", "@vue/compiler-core": "3.5.32", "@vue/compiler-dom": "3.5.32", "@vue/compiler-ssr": "3.5.32", "@vue/shared": "3.5.32", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.8", "source-map-js": "^1.2.1" } }, "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg=="], + + "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.32", "", { "dependencies": { "@vue/compiler-dom": "3.5.32", "@vue/shared": "3.5.32" } }, "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw=="], + + "@vue/devtools-api": ["@vue/devtools-api@6.6.4", "", {}, "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="], + + "@vue/devtools-core": ["@vue/devtools-core@8.1.1", "", { "dependencies": { "@vue/devtools-kit": "^8.1.1", "@vue/devtools-shared": "^8.1.1" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-bCCsSABp1/ot4j8xJEycM6Mtt2wbuucfByr6hMgjbYhrtlscOJypZKvy8f1FyWLYrLTchB5Qz216Lm92wfbq0A=="], + + "@vue/devtools-kit": ["@vue/devtools-kit@8.1.1", "", { "dependencies": { "@vue/devtools-shared": "^8.1.1", "birpc": "^2.6.1", "hookable": "^5.5.3", "perfect-debounce": "^2.0.0" } }, "sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg=="], + + "@vue/devtools-shared": ["@vue/devtools-shared@8.1.1", "", {}, "sha512-+h4ttmJYl/txpxHKaoZcaKpC+pvckgLzIDiSQlaQ7kKthKh8KuwoLW2D8hPJEnqKzXOvu15UHEoGyngAXCz0EQ=="], + + "@vue/language-core": ["@vue/language-core@3.2.6", "", { "dependencies": { "@volar/language-core": "2.4.28", "@vue/compiler-dom": "^3.5.0", "@vue/shared": "^3.5.0", "alien-signals": "^3.0.0", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "picomatch": "^4.0.2" } }, "sha512-xYYYX3/aVup576tP/23sEUpgiEnujrENaoNRbaozC1/MA9I6EGFQRJb4xrt/MmUCAGlxTKL2RmT8JLTPqagCkg=="], + + "@vue/reactivity": ["@vue/reactivity@3.5.32", "", { "dependencies": { "@vue/shared": "3.5.32" } }, "sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ=="], + + "@vue/runtime-core": ["@vue/runtime-core@3.5.32", "", { "dependencies": { "@vue/reactivity": "3.5.32", "@vue/shared": "3.5.32" } }, "sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ=="], + + "@vue/runtime-dom": ["@vue/runtime-dom@3.5.32", "", { "dependencies": { "@vue/reactivity": "3.5.32", "@vue/runtime-core": "3.5.32", "@vue/shared": "3.5.32", "csstype": "^3.2.3" } }, "sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ=="], + + "@vue/server-renderer": ["@vue/server-renderer@3.5.32", "", { "dependencies": { "@vue/compiler-ssr": "3.5.32", "@vue/shared": "3.5.32" }, "peerDependencies": { "vue": "3.5.32" } }, "sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ=="], + + "@vue/shared": ["@vue/shared@3.5.32", "", {}, "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg=="], + + "@vueuse/core": ["@vueuse/core@13.9.0", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "13.9.0", "@vueuse/shared": "13.9.0" }, "peerDependencies": { "vue": "^3.5.0" } }, "sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA=="], + + "@vueuse/integrations": ["@vueuse/integrations@13.9.0", "", { "dependencies": { "@vueuse/core": "13.9.0", "@vueuse/shared": "13.9.0" }, "peerDependencies": { "async-validator": "^4", "axios": "^1", "change-case": "^5", "drauu": "^0.4", "focus-trap": "^7", "fuse.js": "^7", "idb-keyval": "^6", "jwt-decode": "^4", "nprogress": "^0.2", "qrcode": "^1.5", "sortablejs": "^1", "universal-cookie": "^7 || ^8", "vue": "^3.5.0" }, "optionalPeers": ["async-validator", "axios", "change-case", "drauu", "focus-trap", "fuse.js", "idb-keyval", "jwt-decode", "nprogress", "qrcode", "sortablejs", "universal-cookie"] }, "sha512-SDobKBbPIOe0cVL7QxMzGkuUGHvWTdihi9zOrrWaWUgFKe15cwEcwfWmgrcNzjT6kHnNmWuTajPHoIzUjYNYYQ=="], + + "@vueuse/math": ["@vueuse/math@13.9.0", "", { "dependencies": { "@vueuse/shared": "13.9.0" }, "peerDependencies": { "vue": "^3.5.0" } }, "sha512-Qk2jqlaEGKwwe2/MBGtUd8nPpzoQPSQTfm2d30NPywjpYdpbI+WqOAE99MuSq9kIRoU7Xq3IYBtxMaLTy6lpsA=="], + + "@vueuse/metadata": ["@vueuse/metadata@13.9.0", "", {}, "sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg=="], + + "@vueuse/shared": ["@vueuse/shared@13.9.0", "", { "peerDependencies": { "vue": "^3.5.0" } }, "sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g=="], + + "abbrev": ["abbrev@3.0.1", "", {}, "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + + "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "alien-signals": ["alien-signals@3.1.2", "", {}, "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="], + + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], + + "archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], + + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "ast-kit": ["ast-kit@2.2.0", "", { "dependencies": { "@babel/parser": "^7.28.5", "pathe": "^2.0.3" } }, "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw=="], + + "ast-walker-scope": ["ast-walker-scope@0.8.3", "", { "dependencies": { "@babel/parser": "^7.28.4", "ast-kit": "^2.1.3" } }, "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "async-sema": ["async-sema@3.1.1", "", {}, "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg=="], + + "at-least-node": ["at-least-node@1.0.0", "", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="], + + "autoprefixer": ["autoprefixer@10.4.27", "", { "dependencies": { "browserslist": "^4.28.1", "caniuse-lite": "^1.0.30001774", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA=="], + + "b4a": ["b4a@1.8.0", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="], + + "bare-fs": ["bare-fs@4.7.0", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-xzqKsCFxAek9aezYhjJuJRXBIaYlg/0OGDTZp+T8eYmYMlm66cs6cYko02drIyjN2CBbi+I6L7YfXyqpqtKRXA=="], + + "bare-os": ["bare-os@3.8.7", "", {}, "sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w=="], + + "bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="], + + "bare-stream": ["bare-stream@2.13.0", "", { "dependencies": { "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA=="], + + "bare-url": ["bare-url@2.4.0", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.18", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-VSnGQAOLtP5mib/DPyg2/t+Tlv65NTBz83BJBJvmLVHHuKJVaDOBvJJykiT5TR++em5nfAySPccDZDa4oSrn8A=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "birpc": ["birpc@4.0.0", "", {}, "sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "brace-expansion": ["brace-expansion@1.1.14", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], + + "c12": ["c12@3.3.4", "", { "dependencies": { "chokidar": "^5.0.0", "confbox": "^0.2.4", "defu": "^6.1.6", "dotenv": "^17.3.1", "exsolve": "^1.0.8", "giget": "^3.2.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.1.0", "pkg-types": "^2.3.0", "rc9": "^3.0.1" }, "peerDependencies": { "magicast": "*" }, "optionalPeers": ["magicast"] }, "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA=="], + + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + + "cache-content-type": ["cache-content-type@1.0.1", "", { "dependencies": { "mime-types": "^2.1.18", "ylru": "^1.2.0" } }, "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], + + "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001787", "", {}, "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chart.js": ["chart.js@4.5.1", "", { "dependencies": { "@kurkle/color": "^0.3.0" } }, "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw=="], + + "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "citty": ["citty@0.2.2", "", {}, "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], + + "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "commander": ["commander@6.2.1", "", {}, "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA=="], + + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], + + "compatx": ["compatx@0.2.0", "", {}, "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA=="], + + "compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "confbox": ["confbox@0.2.4", "", {}, "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ=="], + + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + + "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie-es": ["cookie-es@2.0.1", "", {}, "sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA=="], + + "cookies": ["cookies@0.9.1", "", { "dependencies": { "depd": "~2.0.0", "keygrip": "~1.1.0" } }, "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], + + "crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], + + "croner": ["croner@10.0.1", "", {}, "sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], + + "css-declaration-sorter": ["css-declaration-sorter@7.4.0", "", { "peerDependencies": { "postcss": "^8.0.9" } }, "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw=="], + + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], + + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "cssnano": ["cssnano@7.1.4", "", { "dependencies": { "cssnano-preset-default": "^7.0.12", "lilconfig": "^3.1.3" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-T9PNS7y+5Nc9Qmu9mRONqfxG1RVY7Vuvky0XN6MZ+9hqplesTEwnj9r0ROtVuSwUVfaDhVlavuzWIVLUgm4hkQ=="], + + "cssnano-preset-default": ["cssnano-preset-default@7.0.12", "", { "dependencies": { "browserslist": "^4.28.1", "css-declaration-sorter": "^7.2.0", "cssnano-utils": "^5.0.1", "postcss-calc": "^10.1.1", "postcss-colormin": "^7.0.7", "postcss-convert-values": "^7.0.9", "postcss-discard-comments": "^7.0.6", "postcss-discard-duplicates": "^7.0.2", "postcss-discard-empty": "^7.0.1", "postcss-discard-overridden": "^7.0.1", "postcss-merge-longhand": "^7.0.5", "postcss-merge-rules": "^7.0.8", "postcss-minify-font-values": "^7.0.1", "postcss-minify-gradients": "^7.0.2", "postcss-minify-params": "^7.0.6", "postcss-minify-selectors": "^7.0.6", "postcss-normalize-charset": "^7.0.1", "postcss-normalize-display-values": "^7.0.1", "postcss-normalize-positions": "^7.0.1", "postcss-normalize-repeat-style": "^7.0.1", "postcss-normalize-string": "^7.0.1", "postcss-normalize-timing-functions": "^7.0.1", "postcss-normalize-unicode": "^7.0.6", "postcss-normalize-url": "^7.0.1", "postcss-normalize-whitespace": "^7.0.1", "postcss-ordered-values": "^7.0.2", "postcss-reduce-initial": "^7.0.6", "postcss-reduce-transforms": "^7.0.1", "postcss-svgo": "^7.1.1", "postcss-unique-selectors": "^7.0.5" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-B3Eoouzw/sl2zANI0AL9KbacummJTCww+fkHaDBMZad/xuVx8bUduPLly6hKVQAlrmvYkS1jB1CVQEKm3gn0AA=="], + + "cssnano-utils": ["cssnano-utils@5.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg=="], + + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "db0": ["db0@0.3.4", "", { "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", "better-sqlite3": "*", "drizzle-orm": "*", "mysql2": "*", "sqlite3": "*" }, "optionalPeers": ["@electric-sql/pglite", "@libsql/client", "better-sqlite3", "drizzle-orm", "mysql2", "sqlite3"] }, "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "deep-equal": ["deep-equal@1.0.1", "", {}, "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="], + + "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], + + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], + + "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="], + + "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], + + "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "devalue": ["devalue@5.7.1", "", {}, "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA=="], + + "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], + + "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], + + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dot-prop": ["dot-prop@10.1.0", "", { "dependencies": { "type-fest": "^5.0.0" } }, "sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q=="], + + "dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.335", "", {}, "sha512-q9n5T4BR4Xwa2cwbrwcsDJtHD/enpQ5S1xF1IAtdqf5AAgqDFmR/aakqH3ChFdqd/QXJhS3rnnXFtexU7rax6Q=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "enhanced-resolve": ["enhanced-resolve@5.20.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA=="], + + "entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], + + "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="], + + "errx": ["errx@0.1.0", "", {}, "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-module-lexer": ["es-module-lexer@2.0.0", "", {}, "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], + + "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], + + "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], + + "externality": ["externality@1.0.2", "", { "dependencies": { "enhanced-resolve": "^5.14.1", "mlly": "^1.3.0", "pathe": "^1.1.1", "ufo": "^1.1.2" } }, "sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw=="], + + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-npm-meta": ["fast-npm-meta@1.4.2", "", { "bin": { "fast-npm-meta": "dist/cli.mjs" } }, "sha512-XXyd9d3ie/JeIIjm6WeKalvapGGFI4ShAjPJM78vgUFYzoEsuNSjvvVTuht0XZcwbVdOnEEGzhxwguRbxkIcDg=="], + + "fast-string-truncated-width": ["fast-string-truncated-width@1.2.1", "", {}, "sha512-Q9acT/+Uu3GwGj+5w/zsGuQjh9O1TyywhIwAxHudtWrgF09nHOPrvTLhQevPbttcxjr/SNN7mJmfOw/B1bXgow=="], + + "fast-string-width": ["fast-string-width@1.1.0", "", { "dependencies": { "fast-string-truncated-width": "^1.2.0" } }, "sha512-O3fwIVIH5gKB38QNbdg+3760ZmGz0SZMgvwJbA1b2TGXceKE6A2cOlfogh1iw8lr049zPyd7YADHy+B7U4W9bQ=="], + + "fast-wrap-ansi": ["fast-wrap-ansi@0.1.6", "", { "dependencies": { "fast-string-width": "^1.1.0" } }, "sha512-HlUwET7a5gqjURj70D5jl7aC3Zmy4weA1SHUfM0JFI0Ptq987NH2TwbBFLoERhfwk+E+eaq4EK3jXoT+R3yp3w=="], + + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], + + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "fuse.js": ["fuse.js@7.3.0", "", {}, "sha512-plz8RVjfcDedTGfVngWH1jmJvBvAwi1v2jecfDerbEnMcmOYUEEwKFTHbNoCiYyzaK2Ws8lABkTCcRSqCY1q4w=="], + + "fzf": ["fzf@0.5.2", "", {}, "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q=="], + + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-east-asian-width": ["get-east-asian-width@1.5.0", "", {}, "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-port-please": ["get-port-please@3.2.0", "", {}, "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], + + "giget": ["giget@3.2.0", "", { "bin": { "giget": "dist/cli.mjs" } }, "sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "global-directory": ["global-directory@4.0.1", "", { "dependencies": { "ini": "4.1.1" } }, "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q=="], + + "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], + + "globby": ["globby@16.2.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "fast-glob": "^3.3.3", "ignore": "^7.0.5", "is-path-inside": "^4.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.4.0" } }, "sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gzip-size": ["gzip-size@7.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA=="], + + "h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + + "http-assert": ["http-assert@1.5.0", "", { "dependencies": { "deep-equal": "~1.0.1", "http-errors": "~1.8.0" } }, "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w=="], + + "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + + "http-shutdown": ["http-shutdown@1.2.2", "", {}, "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "httpxy": ["httpxy@0.5.0", "", {}, "sha512-qwX7QX/rK2visT10/b7bSeZWQOMlSm3svTD0pZpU+vJjNUP0YHtNv4c3z+MO+MSnGuRFWJFdCZiV+7F7dXIOzg=="], + + "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "image-meta": ["image-meta@0.2.2", "", {}, "sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA=="], + + "impound": ["impound@1.1.5", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "es-module-lexer": "^2.0.0", "pathe": "^2.0.3", "unplugin": "^3.0.0", "unplugin-utils": "^0.3.1" } }, "sha512-5AUn+QE0UofqNHu5f2Skf6Svukdg4ehOIq8O0EtqIx4jta0CDZYBPqpIHt0zrlUTiFVYlLpeH39DoikXBjPKpA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@4.1.1", "", {}, "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g=="], + + "ioredis": ["ioredis@5.10.1", "", { "dependencies": { "@ioredis/commands": "1.5.1", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA=="], + + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-installed-globally": ["is-installed-globally@1.0.0", "", { "dependencies": { "global-directory": "^4.0.1", "is-path-inside": "^4.0.0" } }, "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ=="], + + "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], + + "is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], + + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + + "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + + "keygrip": ["keygrip@1.1.0", "", { "dependencies": { "tsscmp": "1.0.6" } }, "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ=="], + + "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + + "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="], + + "knitwork": ["knitwork@1.3.0", "", {}, "sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw=="], + + "koa": ["koa@2.16.4", "", { "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", "content-disposition": "~0.5.2", "content-type": "^1.0.4", "cookies": "~0.9.0", "debug": "^4.3.2", "delegates": "^1.0.0", "depd": "^2.0.0", "destroy": "^1.0.4", "encodeurl": "^1.0.2", "escape-html": "^1.0.3", "fresh": "~0.5.2", "http-assert": "^1.3.0", "http-errors": "^1.6.3", "is-generator-function": "^1.0.7", "koa-compose": "^4.1.0", "koa-convert": "^2.0.0", "on-finished": "^2.3.0", "only": "~0.0.2", "parseurl": "^1.3.2", "statuses": "^1.5.0", "type-is": "^1.6.16", "vary": "^1.1.2" } }, "sha512-3An0GCLDSR34tsCO4H8Tef8Pp2ngtaZDAZnsWJYelqXUK5wyiHvGItgK/xcSkmHLSTn1Jcho1mRQs2ehRzvKKw=="], + + "koa-compose": ["koa-compose@4.1.0", "", {}, "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw=="], + + "koa-convert": ["koa-convert@2.0.0", "", { "dependencies": { "co": "^4.6.0", "koa-compose": "^4.1.0" } }, "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA=="], + + "koa-send": ["koa-send@5.0.1", "", { "dependencies": { "debug": "^4.1.1", "http-errors": "^1.7.3", "resolve-path": "^1.4.0" } }, "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ=="], + + "koa-static": ["koa-static@5.0.0", "", { "dependencies": { "debug": "^3.1.0", "koa-send": "^5.0.0" } }, "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ=="], + + "kolorist": ["kolorist@1.8.0", "", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="], + + "launch-editor": ["launch-editor@2.13.2", "", { "dependencies": { "picocolors": "^1.1.1", "shell-quote": "^1.8.3" } }, "sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg=="], + + "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], + + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "listhen": ["listhen@1.9.1", "", { "dependencies": { "@parcel/watcher": "^2.5.6", "@parcel/watcher-wasm": "^2.5.6", "citty": "^0.2.2", "consola": "^3.4.2", "crossws": ">=0.2.0 <0.5.0", "defu": "^6.1.6", "get-port-please": "^3.2.0", "h3": "^1.15.11", "http-shutdown": "^1.2.2", "jiti": "^2.6.1", "mlly": "^1.8.2", "node-forge": "^1.4.0", "pathe": "^2.0.3", "std-env": "^4.0.0", "tinyclip": "^0.1.12", "ufo": "^1.6.3", "untun": "^0.1.3", "uqr": "^0.1.2" }, "bin": { "listen": "bin/listhen.mjs", "listhen": "bin/listhen.mjs" } }, "sha512-4EhoyVcXEpNlY5HJRSQpH7Rba94M8N2JmI62ePjl0lrJKXSfG0F1FAgHGxBoz/T3pe41sUEwkIRRIcaUL0/Ofw=="], + + "local-pkg": ["local-pkg@1.1.2", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A=="], + + "lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], + + "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], + + "lodash.isarguments": ["lodash.isarguments@3.1.0", "", {}, "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="], + + "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], + + "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="], + + "lru-cache": ["lru-cache@11.3.3", "", {}, "sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ=="], + + "magic-regexp": ["magic-regexp@0.10.0", "", { "dependencies": { "estree-walker": "^3.0.3", "magic-string": "^0.30.12", "mlly": "^1.7.2", "regexp-tree": "^0.1.27", "type-level-regexp": "~0.1.17", "ufo": "^1.5.4", "unplugin": "^2.0.0" } }, "sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "magic-string-ast": ["magic-string-ast@1.0.3", "", { "dependencies": { "magic-string": "^0.30.19" } }, "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA=="], + + "magicast": ["magicast@0.5.2", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], + + "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@4.1.0", "", { "bin": { "mime": "bin/cli.js" } }, "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + + "mini-svg-data-uri": ["mini-svg-data-uri@1.4.4", "", { "bin": { "mini-svg-data-uri": "cli.js" } }, "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg=="], + + "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="], + + "mocked-exports": ["mocked-exports@0.1.1", "", {}, "sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="], + + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "nanotar": ["nanotar@0.3.0", "", {}, "sha512-Kv2JYYiCzt16Kt5QwAc9BFG89xfPNBx+oQL4GQXD9nLqPkZBiNaqaCWtwnbk/q7UVsTYevvM1b0UF8zmEI4pCg=="], + + "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "nitropack": ["nitropack@2.13.3", "", { "dependencies": { "@cloudflare/kv-asset-handler": "^0.4.2", "@rollup/plugin-alias": "^6.0.0", "@rollup/plugin-commonjs": "^29.0.2", "@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-replace": "^6.0.3", "@rollup/plugin-terser": "^1.0.0", "@vercel/nft": "^1.5.0", "archiver": "^7.0.1", "c12": "^3.3.4", "chokidar": "^5.0.0", "citty": "^0.2.2", "compatx": "^0.2.0", "confbox": "^0.2.4", "consola": "^3.4.2", "cookie-es": "^2.0.1", "croner": "^10.0.1", "crossws": "^0.3.5", "db0": "^0.3.4", "defu": "^6.1.6", "destr": "^2.0.5", "dot-prop": "^10.1.0", "esbuild": "^0.27.5", "escape-string-regexp": "^5.0.0", "etag": "^1.8.1", "exsolve": "^1.0.8", "globby": "^16.2.0", "gzip-size": "^7.0.0", "h3": "^1.15.10", "hookable": "^5.5.3", "httpxy": "^0.5.0", "ioredis": "^5.10.1", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.3.0", "listhen": "^1.9.1", "magic-string": "^0.30.21", "magicast": "^0.5.2", "mime": "^4.1.0", "mlly": "^1.8.2", "node-fetch-native": "^1.6.7", "node-mock-http": "^1.0.4", "ofetch": "^1.5.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.1.0", "pkg-types": "^2.3.0", "pretty-bytes": "^7.1.0", "radix3": "^1.1.2", "rollup": "^4.60.1", "rollup-plugin-visualizer": "^7.0.1", "scule": "^1.3.0", "semver": "^7.7.4", "serve-placeholder": "^2.0.2", "serve-static": "^2.2.1", "source-map": "^0.7.6", "std-env": "^4.0.0", "ufo": "^1.6.3", "ultrahtml": "^1.6.0", "uncrypto": "^0.1.3", "unctx": "^2.5.0", "unenv": "2.0.0-rc.24", "unimport": "^6.0.2", "unplugin-utils": "^0.3.1", "unstorage": "^1.17.5", "untyped": "^2.0.0", "unwasm": "^0.5.3", "youch": "^4.1.1", "youch-core": "^0.3.3" }, "peerDependencies": { "xml2js": "^0.6.2" }, "optionalPeers": ["xml2js"], "bin": { "nitro": "dist/cli/index.mjs", "nitropack": "dist/cli/index.mjs" } }, "sha512-C8vO7RxkU0AQ3HbYUumuG6MVM5JjRaBchke/rYFOp3EvrLtTBHZYhDVGECdpa27vNuOYRzm3GtQMn2YDOjDJLA=="], + + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], + + "node-forge": ["node-forge@1.4.0", "", {}, "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ=="], + + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + + "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="], + + "node-releases": ["node-releases@2.0.37", "", {}, "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg=="], + + "nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "nuxt": ["nuxt@3.21.2", "", { "dependencies": { "@dxup/nuxt": "^0.4.0", "@nuxt/cli": "^3.34.0", "@nuxt/devtools": "^3.2.3", "@nuxt/kit": "3.21.2", "@nuxt/nitro-server": "3.21.2", "@nuxt/schema": "3.21.2", "@nuxt/telemetry": "^2.7.0", "@nuxt/vite-builder": "3.21.2", "@unhead/vue": "^2.1.12", "@vue/shared": "^3.5.30", "c12": "^3.3.3", "chokidar": "^5.0.0", "compatx": "^0.2.0", "consola": "^3.4.2", "cookie-es": "^2.0.0", "defu": "^6.1.4", "destr": "^2.0.5", "devalue": "^5.6.3", "errx": "^0.1.0", "escape-string-regexp": "^5.0.0", "exsolve": "^1.0.8", "h3": "^1.15.6", "hookable": "^5.5.3", "ignore": "^7.0.5", "impound": "^1.1.5", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.3.0", "magic-string": "^0.30.21", "mlly": "^1.8.1", "nanotar": "^0.3.0", "nypm": "^0.6.5", "ofetch": "^1.5.1", "ohash": "^2.0.11", "on-change": "^6.0.2", "oxc-minify": "^0.117.0", "oxc-parser": "^0.117.0", "oxc-transform": "^0.117.0", "oxc-walker": "^0.7.0", "pathe": "^2.0.3", "perfect-debounce": "^2.1.0", "pkg-types": "^2.3.0", "rou3": "^0.8.1", "scule": "^1.3.0", "semver": "^7.7.4", "std-env": "^4.0.0", "tinyglobby": "^0.2.15", "ufo": "^1.6.3", "ultrahtml": "^1.6.0", "uncrypto": "^0.1.3", "unctx": "^2.5.0", "unimport": "^6.0.1", "unplugin": "^3.0.0", "unplugin-vue-router": "^0.19.2", "untyped": "^2.0.0", "vue": "^3.5.30", "vue-router": "^4.6.4" }, "peerDependencies": { "@parcel/watcher": "^2.1.0", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "optionalPeers": ["@parcel/watcher", "@types/node"], "bin": { "nuxi": "bin/nuxt.mjs", "nuxt": "bin/nuxt.mjs" } }, "sha512-XzZFj2KMK16zE0TfrGpjvgc378wZWvDzIpunHOHOT0Jj8zbV5qT1uQKaJb+fAHv6lf1A4nOMMWHrTmjAK4u0Zg=="], + + "nypm": ["nypm@0.6.5", "", { "dependencies": { "citty": "^0.2.0", "pathe": "^2.0.3", "tinyexec": "^1.0.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], + + "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], + + "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], + + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + + "on-change": ["on-change@6.0.2", "", {}, "sha512-08+12qcOVEA0fS9g/VxKS27HaT94nRutUT77J2dr8zv/unzXopvhBuF8tNLWsoLQ5IgrQ6eptGeGqUYat82U1w=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], + + "only": ["only@0.0.2", "", {}, "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ=="], + + "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + + "oxc-minify": ["oxc-minify@0.117.0", "", { "optionalDependencies": { "@oxc-minify/binding-android-arm-eabi": "0.117.0", "@oxc-minify/binding-android-arm64": "0.117.0", "@oxc-minify/binding-darwin-arm64": "0.117.0", "@oxc-minify/binding-darwin-x64": "0.117.0", "@oxc-minify/binding-freebsd-x64": "0.117.0", "@oxc-minify/binding-linux-arm-gnueabihf": "0.117.0", "@oxc-minify/binding-linux-arm-musleabihf": "0.117.0", "@oxc-minify/binding-linux-arm64-gnu": "0.117.0", "@oxc-minify/binding-linux-arm64-musl": "0.117.0", "@oxc-minify/binding-linux-ppc64-gnu": "0.117.0", "@oxc-minify/binding-linux-riscv64-gnu": "0.117.0", "@oxc-minify/binding-linux-riscv64-musl": "0.117.0", "@oxc-minify/binding-linux-s390x-gnu": "0.117.0", "@oxc-minify/binding-linux-x64-gnu": "0.117.0", "@oxc-minify/binding-linux-x64-musl": "0.117.0", "@oxc-minify/binding-openharmony-arm64": "0.117.0", "@oxc-minify/binding-wasm32-wasi": "0.117.0", "@oxc-minify/binding-win32-arm64-msvc": "0.117.0", "@oxc-minify/binding-win32-ia32-msvc": "0.117.0", "@oxc-minify/binding-win32-x64-msvc": "0.117.0" } }, "sha512-JHsv/b+bmBJkAzkHXgTN7RThloVxLHPT0ojHfjqxVeHuQB7LPpLUbJ2qfwz37sto9stZ9+AVwUP4b3gtR7p/Tw=="], + + "oxc-parser": ["oxc-parser@0.117.0", "", { "dependencies": { "@oxc-project/types": "^0.117.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.117.0", "@oxc-parser/binding-android-arm64": "0.117.0", "@oxc-parser/binding-darwin-arm64": "0.117.0", "@oxc-parser/binding-darwin-x64": "0.117.0", "@oxc-parser/binding-freebsd-x64": "0.117.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.117.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.117.0", "@oxc-parser/binding-linux-arm64-gnu": "0.117.0", "@oxc-parser/binding-linux-arm64-musl": "0.117.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.117.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.117.0", "@oxc-parser/binding-linux-riscv64-musl": "0.117.0", "@oxc-parser/binding-linux-s390x-gnu": "0.117.0", "@oxc-parser/binding-linux-x64-gnu": "0.117.0", "@oxc-parser/binding-linux-x64-musl": "0.117.0", "@oxc-parser/binding-openharmony-arm64": "0.117.0", "@oxc-parser/binding-wasm32-wasi": "0.117.0", "@oxc-parser/binding-win32-arm64-msvc": "0.117.0", "@oxc-parser/binding-win32-ia32-msvc": "0.117.0", "@oxc-parser/binding-win32-x64-msvc": "0.117.0" } }, "sha512-l3cbgK5wUvWDVNWM/JFU77qDdGZK1wudnLsFcrRyNo/bL1CyU8pC25vDhMHikVY29lbK2InTWsX42RxVSutUdQ=="], + + "oxc-transform": ["oxc-transform@0.117.0", "", { "optionalDependencies": { "@oxc-transform/binding-android-arm-eabi": "0.117.0", "@oxc-transform/binding-android-arm64": "0.117.0", "@oxc-transform/binding-darwin-arm64": "0.117.0", "@oxc-transform/binding-darwin-x64": "0.117.0", "@oxc-transform/binding-freebsd-x64": "0.117.0", "@oxc-transform/binding-linux-arm-gnueabihf": "0.117.0", "@oxc-transform/binding-linux-arm-musleabihf": "0.117.0", "@oxc-transform/binding-linux-arm64-gnu": "0.117.0", "@oxc-transform/binding-linux-arm64-musl": "0.117.0", "@oxc-transform/binding-linux-ppc64-gnu": "0.117.0", "@oxc-transform/binding-linux-riscv64-gnu": "0.117.0", "@oxc-transform/binding-linux-riscv64-musl": "0.117.0", "@oxc-transform/binding-linux-s390x-gnu": "0.117.0", "@oxc-transform/binding-linux-x64-gnu": "0.117.0", "@oxc-transform/binding-linux-x64-musl": "0.117.0", "@oxc-transform/binding-openharmony-arm64": "0.117.0", "@oxc-transform/binding-wasm32-wasi": "0.117.0", "@oxc-transform/binding-win32-arm64-msvc": "0.117.0", "@oxc-transform/binding-win32-ia32-msvc": "0.117.0", "@oxc-transform/binding-win32-x64-msvc": "0.117.0" } }, "sha512-u1Stl2uhDh9bFuOGjGXQIqx46IRUNMyHQkq59LayXNGS2flNv7RpZpRSWs5S5deuNP6jJZ12gtMBze+m4dOhmw=="], + + "oxc-walker": ["oxc-walker@0.7.0", "", { "dependencies": { "magic-regexp": "^0.10.0" }, "peerDependencies": { "oxc-parser": ">=0.98.0" } }, "sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + + "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], + + "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], + + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], + + "portfinder": ["portfinder@1.0.38", "", { "dependencies": { "async": "^3.2.6", "debug": "^4.3.6" } }, "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg=="], + + "postcss": ["postcss@8.5.9", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw=="], + + "postcss-calc": ["postcss-calc@10.1.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.38" } }, "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw=="], + + "postcss-colormin": ["postcss-colormin@7.0.7", "", { "dependencies": { "@colordx/core": "^5.0.0", "browserslist": "^4.28.1", "caniuse-api": "^3.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-sBQ628lSj3VQpDquQel8Pen5mmjFPsO4pH9lDLaHB1AVkMRHtkl0pRB5DCWznc9upWsxint/kV+AveSj7W1tew=="], + + "postcss-convert-values": ["postcss-convert-values@7.0.9", "", { "dependencies": { "browserslist": "^4.28.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-l6uATQATZaCa0bckHV+r6dLXfWtUBKXxO3jK+AtxxJJtgMPD+VhhPCCx51I4/5w8U5uHV67g3w7PXj+V3wlMlg=="], + + "postcss-discard-comments": ["postcss-discard-comments@7.0.6", "", { "dependencies": { "postcss-selector-parser": "^7.1.1" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-Sq+Fzj1Eg5/CPf1ERb0wS1Im5cvE2gDXCE+si4HCn1sf+jpQZxDI4DXEp8t77B/ImzDceWE2ebJQFXdqZ6GRJw=="], + + "postcss-discard-duplicates": ["postcss-discard-duplicates@7.0.2", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w=="], + + "postcss-discard-empty": ["postcss-discard-empty@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg=="], + + "postcss-discard-overridden": ["postcss-discard-overridden@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg=="], + + "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], + + "postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="], + + "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], + + "postcss-merge-longhand": ["postcss-merge-longhand@7.0.5", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^7.0.5" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw=="], + + "postcss-merge-rules": ["postcss-merge-rules@7.0.8", "", { "dependencies": { "browserslist": "^4.28.1", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.1", "postcss-selector-parser": "^7.1.1" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-BOR1iAM8jnr7zoQSlpeBmCsWV5Uudi/+5j7k05D0O/WP3+OFMPD86c1j/20xiuRtyt45bhxw/7hnhZNhW2mNFA=="], + + "postcss-minify-font-values": ["postcss-minify-font-values@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ=="], + + "postcss-minify-gradients": ["postcss-minify-gradients@7.0.2", "", { "dependencies": { "@colordx/core": "^5.0.0", "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-fVY3AB8Um7SJR5usHqTY2Ngf9qh8IRN+FFzrBP0ONJy6yYXsP7xyjK2BvSAIrpgs1cST+H91V0TXi3diHLYJtw=="], + + "postcss-minify-params": ["postcss-minify-params@7.0.6", "", { "dependencies": { "browserslist": "^4.28.1", "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-YOn02gC68JijlaXVuKvFSCvQOhTpblkcfDre2hb/Aaa58r2BIaK4AtE/cyZf2wV7YKAG+UlP9DT+By0ry1E4VQ=="], + + "postcss-minify-selectors": ["postcss-minify-selectors@7.0.6", "", { "dependencies": { "cssesc": "^3.0.0", "postcss-selector-parser": "^7.1.1" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-lIbC0jy3AAwDxEgciZlBullDiMBeBCT+fz5G8RcA9MWqh/hfUkpOI3vNDUNEZHgokaoiv0juB9Y8fGcON7rU/A=="], + + "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], + + "postcss-nesting": ["postcss-nesting@13.0.2", "", { "dependencies": { "@csstools/selector-resolve-nested": "^3.1.0", "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.4" } }, "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ=="], + + "postcss-normalize-charset": ["postcss-normalize-charset@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ=="], + + "postcss-normalize-display-values": ["postcss-normalize-display-values@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ=="], + + "postcss-normalize-positions": ["postcss-normalize-positions@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ=="], + + "postcss-normalize-repeat-style": ["postcss-normalize-repeat-style@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ=="], + + "postcss-normalize-string": ["postcss-normalize-string@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ=="], + + "postcss-normalize-timing-functions": ["postcss-normalize-timing-functions@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg=="], + + "postcss-normalize-unicode": ["postcss-normalize-unicode@7.0.6", "", { "dependencies": { "browserslist": "^4.28.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-z6bwTV84YW6ZvvNoaNLuzRW4/uWxDKYI1iIDrzk6D2YTL7hICApy+Q1LP6vBEsljX8FM7YSuV9qI79XESd4ddQ=="], + + "postcss-normalize-url": ["postcss-normalize-url@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ=="], + + "postcss-normalize-whitespace": ["postcss-normalize-whitespace@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA=="], + + "postcss-ordered-values": ["postcss-ordered-values@7.0.2", "", { "dependencies": { "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw=="], + + "postcss-reduce-initial": ["postcss-reduce-initial@7.0.6", "", { "dependencies": { "browserslist": "^4.28.1", "caniuse-api": "^3.0.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-G6ZyK68AmrPdMB6wyeA37ejnnRG2S8xinJrZJnOv+IaRKf6koPAVbQsiC7MfkmXaGmF1UO+QCijb27wfpxuRNg=="], + + "postcss-reduce-transforms": ["postcss-reduce-transforms@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="], + + "postcss-svgo": ["postcss-svgo@7.1.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^4.0.1" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-zU9H9oEDrUFKa0JB7w+IYL7Qs9ey1mZyjhbf0KLxwJDdDRtoPvCmaEfknzqfHj44QS9VD6c5sJnBAVYTLRg/Sg=="], + + "postcss-unique-selectors": ["postcss-unique-selectors@7.0.5", "", { "dependencies": { "postcss-selector-parser": "^7.1.1" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-3QoYmEt4qg/rUWDn6Tc8+ZVPmbp4G1hXDtCNWDx0st8SjtCbRcxRXDDM1QrEiXGG3A45zscSJFb4QH90LViyxg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], + + "pretty-bytes": ["pretty-bytes@7.1.0", "", {}, "sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "rc9": ["rc9@3.0.1", "", { "dependencies": { "defu": "^6.1.6", "destr": "^2.0.5" } }, "sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ=="], + + "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], + + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + + "readdir-glob": ["readdir-glob@1.1.3", "", { "dependencies": { "minimatch": "^5.1.0" } }, "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA=="], + + "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + + "redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="], + + "redis-parser": ["redis-parser@3.0.0", "", { "dependencies": { "redis-errors": "^1.0.0" } }, "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A=="], + + "regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], + + "replace-in-file": ["replace-in-file@6.3.5", "", { "dependencies": { "chalk": "^4.1.2", "glob": "^7.2.0", "yargs": "^17.2.1" }, "bin": { "replace-in-file": "bin/cli.js" } }, "sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "resolve-path": ["resolve-path@1.4.0", "", { "dependencies": { "http-errors": "~1.6.2", "path-is-absolute": "1.0.1" } }, "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rollup": ["rollup@4.60.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.1", "@rollup/rollup-android-arm64": "4.60.1", "@rollup/rollup-darwin-arm64": "4.60.1", "@rollup/rollup-darwin-x64": "4.60.1", "@rollup/rollup-freebsd-arm64": "4.60.1", "@rollup/rollup-freebsd-x64": "4.60.1", "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", "@rollup/rollup-linux-arm-musleabihf": "4.60.1", "@rollup/rollup-linux-arm64-gnu": "4.60.1", "@rollup/rollup-linux-arm64-musl": "4.60.1", "@rollup/rollup-linux-loong64-gnu": "4.60.1", "@rollup/rollup-linux-loong64-musl": "4.60.1", "@rollup/rollup-linux-ppc64-gnu": "4.60.1", "@rollup/rollup-linux-ppc64-musl": "4.60.1", "@rollup/rollup-linux-riscv64-gnu": "4.60.1", "@rollup/rollup-linux-riscv64-musl": "4.60.1", "@rollup/rollup-linux-s390x-gnu": "4.60.1", "@rollup/rollup-linux-x64-gnu": "4.60.1", "@rollup/rollup-linux-x64-musl": "4.60.1", "@rollup/rollup-openbsd-x64": "4.60.1", "@rollup/rollup-openharmony-arm64": "4.60.1", "@rollup/rollup-win32-arm64-msvc": "4.60.1", "@rollup/rollup-win32-ia32-msvc": "4.60.1", "@rollup/rollup-win32-x64-gnu": "4.60.1", "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w=="], + + "rollup-plugin-visualizer": ["rollup-plugin-visualizer@7.0.1", "", { "dependencies": { "open": "^11.0.0", "picomatch": "^4.0.2", "source-map": "^0.7.4", "yargs": "^18.0.0" }, "peerDependencies": { "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc", "rollup": "2.x || 3.x || 4.x" }, "optionalPeers": ["rolldown", "rollup"], "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" } }, "sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg=="], + + "rou3": ["rou3@0.8.1", "", {}, "sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA=="], + + "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], + + "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], + + "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], + + "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], + + "serialize-javascript": ["serialize-javascript@7.0.5", "", {}, "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw=="], + + "seroval": ["seroval@1.5.2", "", {}, "sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q=="], + + "serve-placeholder": ["serve-placeholder@2.0.2", "", { "dependencies": { "defu": "^6.1.4" } }, "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ=="], + + "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-git": ["simple-git@3.36.0", "", { "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", "@simple-git/args-pathspec": "^1.0.3", "@simple-git/argv-parser": "^1.1.0", "debug": "^4.4.0" } }, "sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q=="], + + "sirv": ["sirv@3.0.2", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g=="], + + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], + + "smob": ["smob@1.6.1", "", {}, "sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g=="], + + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "srvx": ["srvx@0.11.15", "", { "bin": { "srvx": "bin/srvx.mjs" } }, "sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg=="], + + "standard-as-callback": ["standard-as-callback@2.1.0", "", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="], + + "statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], + + "std-env": ["std-env@4.0.0", "", {}, "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ=="], + + "streamx": ["streamx@2.25.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], + + "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], + + "structured-clone-es": ["structured-clone-es@2.0.0", "", {}, "sha512-5UuAHmBLXYPCl22xWJrFuGmIhBKQzxISPVz6E7nmTmTcAOpUzlbjKJsRrCE4vADmMQ0dzeCnlWn9XufnAGf76Q=="], + + "stylehacks": ["stylehacks@7.0.8", "", { "dependencies": { "browserslist": "^4.28.1", "postcss-selector-parser": "^7.1.1" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-I3f053GBLIiS5Fg6OMFhq/c+yW+5Hc2+1fgq7gElDMMSqwlRb3tBf2ef6ucLStYRpId4q//bQO1FjcyNyy4yDQ=="], + + "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], + + "supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "svgo": ["svgo@4.0.1", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w=="], + + "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], + + "tailwind-config-viewer": ["tailwind-config-viewer@2.0.4", "", { "dependencies": { "@koa/router": "^12.0.1", "commander": "^6.0.0", "fs-extra": "^9.0.1", "koa": "^2.14.2", "koa-static": "^5.0.0", "open": "^7.0.4", "portfinder": "^1.0.26", "replace-in-file": "^6.1.0" }, "peerDependencies": { "tailwindcss": "1 || 2 || 2.0.1-compat || 3" }, "bin": { "tailwind-config-viewer": "cli/index.js", "tailwindcss-config-viewer": "cli/index.js" } }, "sha512-icvcmdMmt9dphvas8wL40qttrHwAnW3QEN4ExJ2zICjwRsPj7gowd1cOceaWG3IfTuM/cTNGQcx+bsjMtmV+cw=="], + + "tailwind-merge": ["tailwind-merge@2.6.1", "", {}, "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ=="], + + "tailwindcss": ["tailwindcss@3.4.19", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ=="], + + "tapable": ["tapable@2.3.2", "", {}, "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA=="], + + "tar": ["tar@7.5.13", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng=="], + + "tar-stream": ["tar-stream@3.1.8", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ=="], + + "teex": ["teex@1.0.1", "", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="], + + "terser": ["terser@5.46.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ=="], + + "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], + + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], + + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tinyclip": ["tinyclip@0.1.12", "", {}, "sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA=="], + + "tinyexec": ["tinyexec@1.1.1", "", {}, "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="], + + "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tsscmp": ["tsscmp@1.0.6", "", {}, "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="], + + "type-fest": ["type-fest@5.5.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g=="], + + "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "type-level-regexp": ["type-level-regexp@0.1.17", "", {}, "sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg=="], + + "typescript": ["typescript@6.0.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ=="], + + "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], + + "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], + + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + + "unctx": ["unctx@2.5.0", "", { "dependencies": { "acorn": "^8.15.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.21", "unplugin": "^2.3.11" } }, "sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg=="], + + "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], + + "unhead": ["unhead@2.1.13", "", { "dependencies": { "hookable": "^6.0.1" } }, "sha512-jO9M1sI6b2h/1KpIu4Jeu+ptumLmUKboRRLxys5pYHFeT+lqTzfNHbYUX9bxVDhC1FBszAGuWcUVlmvIPsah8Q=="], + + "unicorn-magic": ["unicorn-magic@0.4.0", "", {}, "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw=="], + + "unimport": ["unimport@6.0.2", "", { "dependencies": { "acorn": "^8.16.0", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "local-pkg": "^1.1.2", "magic-string": "^0.30.21", "mlly": "^1.8.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "pkg-types": "^2.3.0", "scule": "^1.3.0", "strip-literal": "^3.1.0", "tinyglobby": "^0.2.15", "unplugin": "^3.0.0", "unplugin-utils": "^0.3.1" } }, "sha512-ZSOkrDw380w+KIPniY3smyXh2h7H9v2MNr9zejDuh239o5sdea44DRAYrv+rfUi2QGT186P2h0GPGKvy8avQ5g=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unplugin": ["unplugin@3.0.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg=="], + + "unplugin-utils": ["unplugin-utils@0.3.1", "", { "dependencies": { "pathe": "^2.0.3", "picomatch": "^4.0.3" } }, "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog=="], + + "unplugin-vue-router": ["unplugin-vue-router@0.19.2", "", { "dependencies": { "@babel/generator": "^7.28.5", "@vue-macros/common": "^3.1.1", "@vue/language-core": "^3.2.1", "ast-walker-scope": "^0.8.3", "chokidar": "^5.0.0", "json5": "^2.2.3", "local-pkg": "^1.1.2", "magic-string": "^0.30.21", "mlly": "^1.8.0", "muggle-string": "^0.4.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "scule": "^1.3.0", "tinyglobby": "^0.2.15", "unplugin": "^2.3.11", "unplugin-utils": "^0.3.1", "yaml": "^2.8.2" }, "peerDependencies": { "@vue/compiler-sfc": "^3.5.17", "vue-router": "^4.6.0" }, "optionalPeers": ["vue-router"] }, "sha512-u5dgLBarxE5cyDK/hzJGfpCTLIAyiTXGlo85COuD4Nssj6G7NxS+i9mhCWz/1p/ud1eMwdcUbTXehQe41jYZUA=="], + + "unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], + + "untun": ["untun@0.1.3", "", { "dependencies": { "citty": "^0.1.5", "consola": "^3.2.3", "pathe": "^1.1.1" }, "bin": { "untun": "bin/untun.mjs" } }, "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ=="], + + "untyped": ["untyped@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "defu": "^6.1.4", "jiti": "^2.4.2", "knitwork": "^1.2.0", "scule": "^1.3.0" }, "bin": { "untyped": "dist/cli.mjs" } }, "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g=="], + + "unwasm": ["unwasm@0.5.3", "", { "dependencies": { "exsolve": "^1.0.8", "knitwork": "^1.3.0", "magic-string": "^0.30.21", "mlly": "^1.8.0", "pathe": "^2.0.3", "pkg-types": "^2.3.0" } }, "sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "uqr": ["uqr@0.1.3", "", {}, "sha512-0rjE8iEJe4YmT9TOhwsZtqCMRLc5DXZUI2UEYUUg63ikBkqqE5EYWaI0etFe/5KUcmcYwLih2RND1kq+hrUJXA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "vite": ["vite@7.3.2", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg=="], + + "vite-dev-rpc": ["vite-dev-rpc@1.1.0", "", { "dependencies": { "birpc": "^2.4.0", "vite-hot-client": "^2.1.0" }, "peerDependencies": { "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0" } }, "sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A=="], + + "vite-hot-client": ["vite-hot-client@2.1.0", "", { "peerDependencies": { "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" } }, "sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ=="], + + "vite-node": ["vite-node@5.3.0", "", { "dependencies": { "cac": "^6.7.14", "es-module-lexer": "^2.0.0", "obug": "^2.1.1", "pathe": "^2.0.3", "vite": "^7.3.1" }, "bin": { "vite-node": "dist/cli.mjs" } }, "sha512-8f20COPYJujc3OKPX6OuyBy3ZIv2det4eRRU4GY1y2MjbeGSUmPjedxg1b72KnTagCofwvZ65ThzjxDW2AtQFQ=="], + + "vite-plugin-checker": ["vite-plugin-checker@0.12.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "chokidar": "^4.0.3", "npm-run-path": "^6.0.0", "picocolors": "^1.1.1", "picomatch": "^4.0.3", "tiny-invariant": "^1.3.3", "tinyglobby": "^0.2.15", "vscode-uri": "^3.1.0" }, "peerDependencies": { "@biomejs/biome": ">=1.7", "eslint": ">=9.39.1", "meow": "^13.2.0", "optionator": "^0.9.4", "oxlint": ">=1", "stylelint": ">=16", "typescript": "*", "vite": ">=5.4.21", "vls": "*", "vti": "*", "vue-tsc": "~2.2.10 || ^3.0.0" }, "optionalPeers": ["@biomejs/biome", "eslint", "meow", "optionator", "oxlint", "stylelint", "typescript", "vls", "vti", "vue-tsc"] }, "sha512-CmdZdDOGss7kdQwv73UyVgLPv0FVYe5czAgnmRX2oKljgEvSrODGuClaV3PDR2+3ou7N/OKGauDDBjy2MB07Rg=="], + + "vite-plugin-inspect": ["vite-plugin-inspect@11.3.3", "", { "dependencies": { "ansis": "^4.1.0", "debug": "^4.4.1", "error-stack-parser-es": "^1.0.5", "ohash": "^2.0.11", "open": "^10.2.0", "perfect-debounce": "^2.0.0", "sirv": "^3.0.1", "unplugin-utils": "^0.3.0", "vite-dev-rpc": "^1.1.0" }, "peerDependencies": { "vite": "^6.0.0 || ^7.0.0-0" } }, "sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA=="], + + "vite-plugin-vue-tracer": ["vite-plugin-vue-tracer@1.3.0", "", { "dependencies": { "estree-walker": "^3.0.3", "exsolve": "^1.0.8", "magic-string": "^0.30.21", "pathe": "^2.0.3", "source-map-js": "^1.2.1" }, "peerDependencies": { "vite": "^6.0.0 || ^7.0.0", "vue": "^3.5.0" } }, "sha512-Cgfce6VikzOw5MUJTpeg50s5rRjzU1Vr61ZjuHunVVHLjZZ5AUlgyExHthZ3r59vtoz9W2rDt23FYG81avYBKw=="], + + "vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="], + + "vue": ["vue@3.5.32", "", { "dependencies": { "@vue/compiler-dom": "3.5.32", "@vue/compiler-sfc": "3.5.32", "@vue/runtime-dom": "3.5.32", "@vue/server-renderer": "3.5.32", "@vue/shared": "3.5.32" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw=="], + + "vue-bundle-renderer": ["vue-bundle-renderer@2.2.0", "", { "dependencies": { "ufo": "^1.6.1" } }, "sha512-sz/0WEdYH1KfaOm0XaBmRZOWgYTEvUDt6yPYaUzl4E52qzgWLlknaPPTTZmp6benaPTlQAI/hN1x3tAzZygycg=="], + + "vue-chartjs": ["vue-chartjs@5.3.3", "", { "peerDependencies": { "chart.js": "^4.1.1", "vue": "^3.0.0-0 || ^2.7.0" } }, "sha512-jqxtL8KZ6YJ5NTv6XzrzLS7osyegOi28UGNZW0h9OkDL7Sh1396ht4Dorh04aKrl2LiSalQ84WtqiG0RIJb0tA=="], + + "vue-devtools-stub": ["vue-devtools-stub@0.1.0", "", {}, "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ=="], + + "vue-router": ["vue-router@4.6.4", "", { "dependencies": { "@vue/devtools-api": "^6.6.4" }, "peerDependencies": { "vue": "^3.5.0" } }, "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="], + + "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "ylru": ["ylru@1.4.0", "", {}, "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA=="], + + "youch": ["youch@4.1.1", "", { "dependencies": { "@poppinss/colors": "^4.1.6", "@poppinss/dumper": "^0.7.0", "@speed-highlight/core": "^1.2.14", "cookie-es": "^3.0.1", "youch-core": "^0.3.3" } }, "sha512-mxW3qiSnl+GRxXsaUMzv2Mbada1Y8CDltET9UxejDQe6DBYlSekghl5U5K0ReAikcHDi0G1vKZEmmo/NWAGKLA=="], + + "youch-core": ["youch-core@0.3.3", "", { "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="], + + "zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], + + "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@csstools/selector-resolve-nested/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "@csstools/selector-specificity/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "@nuxt/cli/std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], + + "@nuxt/devtools/@nuxt/devtools-kit": ["@nuxt/devtools-kit@3.2.4", "", { "dependencies": { "@nuxt/kit": "^4.4.2", "execa": "^8.0.1" }, "peerDependencies": { "vite": ">=6.0" } }, "sha512-Yxy2Xgmq5hf3dQy983V0xh0OJV2mYwRZz9eVIGc3EaribdFGPDNGMMbYqX9qCty3Pbxn/bCF3J0UyPaNlHVayQ=="], + + "@nuxt/devtools/hookable": ["hookable@6.1.0", "", {}, "sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw=="], + + "@nuxt/devtools-kit/@nuxt/kit": ["@nuxt/kit@3.21.2", "", { "dependencies": { "c12": "^3.3.3", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.8", "ignore": "^7.0.5", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.3.0", "mlly": "^1.8.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "rc9": "^3.0.0", "scule": "^1.3.0", "semver": "^7.7.4", "tinyglobby": "^0.2.15", "ufo": "^1.6.3", "unctx": "^2.5.0", "untyped": "^2.0.0" } }, "sha512-Bd6m6mrDrqpBEbX+g0rc66/ALd1sxlgdx5nfK9MAYO0yKLTOSK7McSYz1KcOYn3LQFCXOWfvXwaqih/b+REI1g=="], + + "@nuxt/icon/@nuxt/kit": ["@nuxt/kit@3.21.2", "", { "dependencies": { "c12": "^3.3.3", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.8", "ignore": "^7.0.5", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.3.0", "mlly": "^1.8.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "rc9": "^3.0.0", "scule": "^1.3.0", "semver": "^7.7.4", "tinyglobby": "^0.2.15", "ufo": "^1.6.3", "unctx": "^2.5.0", "untyped": "^2.0.0" } }, "sha512-Bd6m6mrDrqpBEbX+g0rc66/ALd1sxlgdx5nfK9MAYO0yKLTOSK7McSYz1KcOYn3LQFCXOWfvXwaqih/b+REI1g=="], + + "@nuxt/icon/std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], + + "@nuxt/nitro-server/@nuxt/kit": ["@nuxt/kit@3.21.2", "", { "dependencies": { "c12": "^3.3.3", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.8", "ignore": "^7.0.5", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.3.0", "mlly": "^1.8.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "rc9": "^3.0.0", "scule": "^1.3.0", "semver": "^7.7.4", "tinyglobby": "^0.2.15", "ufo": "^1.6.3", "unctx": "^2.5.0", "untyped": "^2.0.0" } }, "sha512-Bd6m6mrDrqpBEbX+g0rc66/ALd1sxlgdx5nfK9MAYO0yKLTOSK7McSYz1KcOYn3LQFCXOWfvXwaqih/b+REI1g=="], + + "@nuxt/telemetry/ofetch": ["ofetch@2.0.0-alpha.3", "", {}, "sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA=="], + + "@nuxt/vite-builder/@nuxt/kit": ["@nuxt/kit@3.21.2", "", { "dependencies": { "c12": "^3.3.3", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.8", "ignore": "^7.0.5", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.3.0", "mlly": "^1.8.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "rc9": "^3.0.0", "scule": "^1.3.0", "semver": "^7.7.4", "tinyglobby": "^0.2.15", "ufo": "^1.6.3", "unctx": "^2.5.0", "untyped": "^2.0.0" } }, "sha512-Bd6m6mrDrqpBEbX+g0rc66/ALd1sxlgdx5nfK9MAYO0yKLTOSK7McSYz1KcOYn3LQFCXOWfvXwaqih/b+REI1g=="], + + "@nuxtjs/color-mode/@nuxt/kit": ["@nuxt/kit@3.21.2", "", { "dependencies": { "c12": "^3.3.3", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.8", "ignore": "^7.0.5", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.3.0", "mlly": "^1.8.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "rc9": "^3.0.0", "scule": "^1.3.0", "semver": "^7.7.4", "tinyglobby": "^0.2.15", "ufo": "^1.6.3", "unctx": "^2.5.0", "untyped": "^2.0.0" } }, "sha512-Bd6m6mrDrqpBEbX+g0rc66/ALd1sxlgdx5nfK9MAYO0yKLTOSK7McSYz1KcOYn3LQFCXOWfvXwaqih/b+REI1g=="], + + "@nuxtjs/color-mode/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "@nuxtjs/color-mode/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "@nuxtjs/tailwindcss/@nuxt/kit": ["@nuxt/kit@3.21.2", "", { "dependencies": { "c12": "^3.3.3", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.8", "ignore": "^7.0.5", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.3.0", "mlly": "^1.8.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "rc9": "^3.0.0", "scule": "^1.3.0", "semver": "^7.7.4", "tinyglobby": "^0.2.15", "ufo": "^1.6.3", "unctx": "^2.5.0", "untyped": "^2.0.0" } }, "sha512-Bd6m6mrDrqpBEbX+g0rc66/ALd1sxlgdx5nfK9MAYO0yKLTOSK7McSYz1KcOYn3LQFCXOWfvXwaqih/b+REI1g=="], + + "@parcel/watcher-wasm/napi-wasm": ["napi-wasm@1.1.3", "", { "bundled": true }, "sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg=="], + + "@rollup/plugin-commonjs/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@rollup/plugin-inject/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@unhead/vue/hookable": ["hookable@6.1.0", "", {}, "sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw=="], + + "@vercel/nft/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@vercel/nft/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + + "@vue/compiler-core/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@vue/compiler-sfc/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "@vue/devtools-kit/birpc": ["birpc@2.9.0", "", {}, "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw=="], + + "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + + "archiver-utils/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "archiver-utils/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "compress-commons/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], + + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "externality/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], + + "http-assert/http-errors": ["http-errors@1.8.1", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.1" } }, "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g=="], + + "http-errors/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "koa/http-errors": ["http-errors@1.8.1", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.1" } }, "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g=="], + + "koa-send/http-errors": ["http-errors@1.8.1", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.1" } }, "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g=="], + + "koa-static/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "magic-regexp/unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], + + "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + + "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "nuxt/@nuxt/kit": ["@nuxt/kit@3.21.2", "", { "dependencies": { "c12": "^3.3.3", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.8", "ignore": "^7.0.5", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.3.0", "mlly": "^1.8.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "rc9": "^3.0.0", "scule": "^1.3.0", "semver": "^7.7.4", "tinyglobby": "^0.2.15", "ufo": "^1.6.3", "unctx": "^2.5.0", "untyped": "^2.0.0" } }, "sha512-Bd6m6mrDrqpBEbX+g0rc66/ALd1sxlgdx5nfK9MAYO0yKLTOSK7McSYz1KcOYn3LQFCXOWfvXwaqih/b+REI1g=="], + + "postcss-calc/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "postcss-discard-comments/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "postcss-merge-rules/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "postcss-minify-selectors/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "postcss-nested/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-nesting/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "postcss-unique-selectors/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "readdir-glob/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], + + "resolve-path/http-errors": ["http-errors@1.6.3", "", { "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", "statuses": ">= 1.4.0 < 2" } }, "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A=="], + + "rollup-plugin-visualizer/open": ["open@11.0.0", "", { "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.1.0", "wsl-utils": "^0.3.0" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="], + + "rollup-plugin-visualizer/yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], + + "send/encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "send/fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "send/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + + "send/statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "serve-static/encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "stylehacks/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + + "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + + "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + + "tailwindcss/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "tailwindcss/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "tailwindcss/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "unctx/unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], + + "unhead/hookable": ["hookable@6.1.0", "", {}, "sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw=="], + + "unplugin-vue-router/unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], + + "untun/citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], + + "untun/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "untyped/citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], + + "vite-dev-rpc/birpc": ["birpc@2.9.0", "", {}, "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw=="], + + "vite-plugin-checker/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "vite-plugin-checker/npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], + + "vite-plugin-inspect/open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], + + "wsl-utils/is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], + + "youch/cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="], + + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "@nuxtjs/color-mode/@nuxt/kit/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "@nuxtjs/color-mode/@nuxt/kit/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], + + "@nuxtjs/color-mode/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "@nuxtjs/color-mode/pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "@vercel/nft/glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + + "archiver-utils/glob/minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "archiver-utils/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + + "http-assert/http-errors/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], + + "koa-send/http-errors/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], + + "koa/http-errors/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], + + "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "readdir-glob/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="], + + "resolve-path/http-errors/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], + + "resolve-path/http-errors/inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="], + + "resolve-path/http-errors/setprototypeof": ["setprototypeof@1.1.0", "", {}, "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="], + + "rollup-plugin-visualizer/open/wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], + + "rollup-plugin-visualizer/yargs/cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], + + "rollup-plugin-visualizer/yargs/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "rollup-plugin-visualizer/yargs/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], + + "send/mime-types/mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "tailwindcss/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "vite-plugin-checker/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "vite-plugin-checker/npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "vite-plugin-checker/npm-run-path/unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + + "@vercel/nft/glob/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], + + "archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="], + + "archiver-utils/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "rollup-plugin-visualizer/open/wsl-utils/is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], + + "rollup-plugin-visualizer/yargs/cliui/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "rollup-plugin-visualizer/yargs/cliui/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + + "rollup-plugin-visualizer/yargs/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "rollup-plugin-visualizer/yargs/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], + + "@vercel/nft/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "rollup-plugin-visualizer/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "rollup-plugin-visualizer/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "rollup-plugin-visualizer/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + } +} diff --git a/frontend/components/MetricCard.vue b/frontend/components/MetricCard.vue new file mode 100644 index 0000000..494008e --- /dev/null +++ b/frontend/components/MetricCard.vue @@ -0,0 +1,46 @@ + + + diff --git a/frontend/components/SeverityBadge.vue b/frontend/components/SeverityBadge.vue new file mode 100644 index 0000000..41562e8 --- /dev/null +++ b/frontend/components/SeverityBadge.vue @@ -0,0 +1,26 @@ + + + diff --git a/frontend/composables/useApi.ts b/frontend/composables/useApi.ts new file mode 100644 index 0000000..ad284c9 --- /dev/null +++ b/frontend/composables/useApi.ts @@ -0,0 +1,38 @@ +// Базовый fetch к Go API +export function useApi() { + async function get(path: string, params?: Record) { + const url = new URL('/api' + path, window.location.origin) + if (params) { + Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, String(v))) + } + const res = await fetch(url.toString()) + if (!res.ok) throw new Error(await res.text()) + return res.json() as Promise + } + + async function post(path: string, body?: unknown) { + const res = await fetch('/api' + path, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: body ? JSON.stringify(body) : undefined, + }) + if (!res.ok) throw new Error(await res.text()) + return res.json() as Promise + } + + async function del(path: string) { + const res = await fetch('/api' + path, { method: 'DELETE' }) + if (!res.ok) throw new Error(await res.text()) + return res.json() + } + + async function upload(path: string, file: File) { + const form = new FormData() + form.append('file', file) + const res = await fetch('/api' + path, { method: 'POST', body: form }) + if (!res.ok) throw new Error(await res.text()) + return res.json() + } + + return { get, post, del, upload } +} diff --git a/frontend/composables/useCaptureStatus.ts b/frontend/composables/useCaptureStatus.ts new file mode 100644 index 0000000..ea6e7b0 --- /dev/null +++ b/frontend/composables/useCaptureStatus.ts @@ -0,0 +1,59 @@ +interface CaptureStatus { + running: boolean + session_id?: number + source?: string + mode?: string + pkts?: number + bytes?: number + last_session?: { + id: number + source: string + mode: string + status: string + total_pkts: number + total_bytes: number + created_at: string + ended_at?: string + } +} + +// Синглтон — один интервал на всё приложение +let interval: number | null = null +const status = ref({ running: false }) + +export function useCaptureStatus() { + const { get, post } = useApi() + + async function fetchStatus() { + try { + status.value = await get('/capture/status') + } catch {} + } + + function startPolling() { + if (interval || !import.meta.client) return + fetchStatus() + interval = window.setInterval(fetchStatus, 3000) + } + + function stopPolling() { + if (interval) { + clearInterval(interval) + interval = null + } + } + + async function stopCapture() { + try { + await post('/capture/stop') + await fetchStatus() + } catch {} + } + + onMounted(startPolling) + onUnmounted(() => { + // Не останавливаем polling при размонтировании layout'а + }) + + return { status, fetchStatus, stopCapture, startPolling, stopPolling } +} diff --git a/frontend/layouts/default.vue b/frontend/layouts/default.vue new file mode 100644 index 0000000..7ecab00 --- /dev/null +++ b/frontend/layouts/default.vue @@ -0,0 +1,116 @@ + + + diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts new file mode 100644 index 0000000..1077079 --- /dev/null +++ b/frontend/nuxt.config.ts @@ -0,0 +1,31 @@ +export default defineNuxtConfig({ + modules: ['@nuxt/ui'], + + ui: { + global: true, + }, + + colorMode: { + preference: 'dark', + }, + + // Проксируем только маршруты Go бэкенда (не трогаем /api/_nuxt_icon и др. внутренние) + routeRules: { + '/api/alerts/**': { proxy: 'http://localhost:8080/api/alerts/**' }, + '/api/alerts': { proxy: 'http://localhost:8080/api/alerts' }, + '/api/stats/**': { proxy: 'http://localhost:8080/api/stats/**' }, + '/api/capture/**': { proxy: 'http://localhost:8080/api/capture/**' }, + '/api/reports/**': { proxy: 'http://localhost:8080/api/reports/**' }, + }, + + app: { + head: { + title: 'DIP-IDS — Network Intrusion Detection System', + meta: [ + { name: 'description', content: 'Система обнаружения вторжений на основе анализа сетевого трафика' }, + ], + }, + }, + + compatibilityDate: '2024-10-01', +}) diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..10bc76b --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,17 @@ +{ + "name": "dip-ids-frontend", + "private": true, + "type": "module", + "scripts": { + "dev": "nuxt dev", + "build": "nuxt build", + "generate": "nuxt generate", + "preview": "nuxt preview" + }, + "dependencies": { + "@nuxt/ui": "^2.18.4", + "chart.js": "^4.4.4", + "vue-chartjs": "^5.3.1", + "nuxt": "^3.13.2" + } +} diff --git a/frontend/pages/alerts.vue b/frontend/pages/alerts.vue new file mode 100644 index 0000000..94e75f7 --- /dev/null +++ b/frontend/pages/alerts.vue @@ -0,0 +1,266 @@ + + + diff --git a/frontend/pages/capture.vue b/frontend/pages/capture.vue new file mode 100644 index 0000000..ca65c82 --- /dev/null +++ b/frontend/pages/capture.vue @@ -0,0 +1,251 @@ + + + diff --git a/frontend/pages/index.vue b/frontend/pages/index.vue new file mode 100644 index 0000000..53b1956 --- /dev/null +++ b/frontend/pages/index.vue @@ -0,0 +1,252 @@ + + + diff --git a/frontend/pages/stats.vue b/frontend/pages/stats.vue new file mode 100644 index 0000000..f3236b1 --- /dev/null +++ b/frontend/pages/stats.vue @@ -0,0 +1,233 @@ + + + diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b9f1df5 --- /dev/null +++ b/go.mod @@ -0,0 +1,54 @@ +module dip-ids + +go 1.22 + +require ( + github.com/gin-gonic/gin v1.9.1 + github.com/google/gopacket v1.1.19 + github.com/johnfercher/maroto/v2 v2.2.0 + gopkg.in/yaml.v3 v3.0.1 + gorm.io/driver/sqlite v1.5.5 + gorm.io/gorm v1.25.10 +) + +require ( + github.com/boombuler/barcode v1.0.1 // indirect + github.com/bytedance/sonic v1.9.1 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/f-amaral/go-async v0.3.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.14.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/google/uuid v1.5.0 // indirect + github.com/hhrutter/lzw v1.0.0 // indirect + github.com/hhrutter/tiff v1.0.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/johnfercher/go-tree v1.0.5 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/jung-kurt/gofpdf v1.16.2 // indirect + github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pdfcpu/pdfcpu v0.6.0 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + golang.org/x/arch v0.3.0 // indirect + golang.org/x/crypto v0.9.0 // indirect + golang.org/x/image v0.18.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/text v0.16.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..1ae5a65 --- /dev/null +++ b/go.sum @@ -0,0 +1,149 @@ +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/f-amaral/go-async v0.3.0 h1:h4kLsX7aKfdWaHvV0lf+/EE3OIeCzyeDYJDb/vDZUyg= +github.com/f-amaral/go-async v0.3.0/go.mod h1:Hz5Qr6DAWpbTTUjytnrg1WIsDgS7NtOei5y8SipYS7U= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hhrutter/lzw v1.0.0 h1:laL89Llp86W3rRs83LvKbwYRx6INE8gDn0XNb1oXtm0= +github.com/hhrutter/lzw v1.0.0/go.mod h1:2HC6DJSn/n6iAZfgM3Pg+cP1KxeWc3ezG8bBqW5+WEo= +github.com/hhrutter/tiff v1.0.1 h1:MIus8caHU5U6823gx7C6jrfoEvfSTGtEFRiM8/LOzC0= +github.com/hhrutter/tiff v1.0.1/go.mod h1:zU/dNgDm0cMIa8y8YwcYBeuEEveI4B0owqHyiPpJPHc= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/johnfercher/go-tree v1.0.5 h1:zpgVhJsChavzhKdxhQiCJJzcSY3VCT9oal2JoA2ZevY= +github.com/johnfercher/go-tree v1.0.5/go.mod h1:DUO6QkXIFh1K7jeGBIkLCZaeUgnkdQAsB64FDSoHswg= +github.com/johnfercher/maroto/v2 v2.2.0 h1:e+isvEIifODJs2eqatnfGDKC7JiorRbK0RxY9mlOP7E= +github.com/johnfercher/maroto/v2 v2.2.0/go.mod h1:/LfW6AQGZzsG6xUixcfyxkKztDoszdwC+G2jNRl8bss= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.16.2 h1:jgbatWHfRlPYiK85qgevsZTHviWXKwB1TTiKdz5PtRc= +github.com/jung-kurt/gofpdf v1.16.2/go.mod h1:1hl7y57EsiPAkLbOwzpzqgx1A30nQCk/YmFV8S2vmK0= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pdfcpu/pdfcpu v0.6.0 h1:z4kARP5bcWa39TTYMcN/kjBnm7MvhTWjXgeYmkdAGMI= +github.com/pdfcpu/pdfcpu v0.6.0/go.mod h1:kmpD0rk8YnZj0l3qSeGBlAB+XszHUgNv//ORH/E7EYo= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/phpdave11/gofpdi v1.0.7/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= +github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= +golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E= +gorm.io/driver/sqlite v1.5.5/go.mod h1:6NgQ7sQWAIFsPrJJl1lSNSu2TABh0ZZ/zm5fosATavE= +gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s= +gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/analyzer/arp.go b/internal/analyzer/arp.go new file mode 100644 index 0000000..05ec0e4 --- /dev/null +++ b/internal/analyzer/arp.go @@ -0,0 +1,101 @@ +package analyzer + +import ( + "fmt" + "sync" + "time" + + "dip-ids/internal/config" + "dip-ids/internal/storage" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +// arpSpoofDetector обнаруживает ARP-спуфинг. +// Алгоритм: ведёт таблицу соответствия IP→MAC; при обнаружении +// нового MAC для уже известного IP генерирует алерт. +type arpSpoofDetector struct { + mu sync.Mutex + cfg config.ARPSpoofConfig + ipToMAC map[string]string // IP -> MAC + alerted map[string]time.Time +} + +func NewARPSpoofDetector(cfg config.ARPSpoofConfig) Detector { + return &arpSpoofDetector{ + cfg: cfg, + ipToMAC: make(map[string]string), + alerted: make(map[string]time.Time), + } +} + +func (d *arpSpoofDetector) Name() string { return "arp_spoof" } + +func (d *arpSpoofDetector) Analyze(pkt gopacket.Packet) []storage.Alert { + if !d.cfg.Enabled { + return nil + } + + arpLayer := pkt.Layer(layers.LayerTypeARP) + if arpLayer == nil { + return nil + } + + arp := arpLayer.(*layers.ARP) + // Обрабатываем только ARP Reply (op=2) и Gratuitous ARP + if arp.Operation != layers.ARPReply { + return nil + } + + srcIP := fmt.Sprintf("%d.%d.%d.%d", arp.SourceProtAddress[0], arp.SourceProtAddress[1], + arp.SourceProtAddress[2], arp.SourceProtAddress[3]) + srcMAC := fmt.Sprintf("%02x:%02x:%02x:%02x:%02x:%02x", + arp.SourceHwAddress[0], arp.SourceHwAddress[1], arp.SourceHwAddress[2], + arp.SourceHwAddress[3], arp.SourceHwAddress[4], arp.SourceHwAddress[5]) + + now := pkt.Metadata().Timestamp + if now.IsZero() { + now = time.Now() + } + + d.mu.Lock() + defer d.mu.Unlock() + + knownMAC, exists := d.ipToMAC[srcIP] + if !exists { + d.ipToMAC[srcIP] = srcMAC + return nil + } + + if knownMAC == srcMAC { + return nil + } + + // MAC изменился — ARP спуфинг + key := srcIP + if last, ok := d.alerted[key]; ok && now.Sub(last) < 60*time.Second { + return nil + } + d.alerted[key] = now + + // Обновляем таблицу + d.ipToMAC[srcIP] = srcMAC + + return []storage.Alert{{ + CreatedAt: now, + Type: "arp_spoof", + Severity: d.cfg.Severity, + SrcIP: srcIP, + Protocol: "ARP", + Description: fmt.Sprintf("ARP spoofing: IP %s changed MAC from %s to %s", srcIP, knownMAC, srcMAC), + Count: 1, + }} +} + +func (d *arpSpoofDetector) Reset() { + d.mu.Lock() + defer d.mu.Unlock() + d.ipToMAC = make(map[string]string) + d.alerted = make(map[string]time.Time) +} diff --git a/internal/analyzer/bruteforce.go b/internal/analyzer/bruteforce.go new file mode 100644 index 0000000..516a424 --- /dev/null +++ b/internal/analyzer/bruteforce.go @@ -0,0 +1,109 @@ +package analyzer + +import ( + "fmt" + "sync" + "time" + + "dip-ids/internal/config" + "dip-ids/internal/storage" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +// bruteForceDetector обнаруживает перебор паролей (brute-force). +// Алгоритм: отслеживает количество SYN-пакетов от одного источника +// к одному порту назначения за скользящее временное окно. +type bruteForceDetector struct { + mu sync.Mutex + cfg config.BruteForceConfig + ports map[int32]struct{} + // ключ: "srcIP:dstIP:dstPort" + tracker map[string][]time.Time + alerted map[string]time.Time +} + +func NewBruteForceDetector(cfg config.BruteForceConfig) Detector { + ports := make(map[int32]struct{}, len(cfg.Ports)) + for _, p := range cfg.Ports { + ports[p] = struct{}{} + } + return &bruteForceDetector{ + cfg: cfg, + ports: ports, + tracker: make(map[string][]time.Time), + alerted: make(map[string]time.Time), + } +} + +func (d *bruteForceDetector) Name() string { return "brute_force" } + +func (d *bruteForceDetector) Analyze(pkt gopacket.Packet) []storage.Alert { + if !d.cfg.Enabled { + return nil + } + + netLayer := pkt.NetworkLayer() + tcpLayer := pkt.Layer(layers.LayerTypeTCP) + if netLayer == nil || tcpLayer == nil { + return nil + } + + tcp := tcpLayer.(*layers.TCP) + if !tcp.SYN || tcp.ACK { + return nil + } + + dstPort := int32(tcp.DstPort) + if _, monitored := d.ports[dstPort]; !monitored { + return nil + } + + srcIP := netLayer.NetworkFlow().Src().String() + dstIP := netLayer.NetworkFlow().Dst().String() + now := pkt.Metadata().Timestamp + if now.IsZero() { + now = time.Now() + } + + key := fmt.Sprintf("%s:%s:%d", srcIP, dstIP, dstPort) + + d.mu.Lock() + defer d.mu.Unlock() + + window := time.Duration(d.cfg.WindowSeconds) * time.Second + cutoff := now.Add(-window) + + d.tracker[key] = append(d.tracker[key], now) + d.tracker[key] = filterTimes(d.tracker[key], cutoff) + + count := len(d.tracker[key]) + if count < d.cfg.Threshold { + return nil + } + + if last, ok := d.alerted[key]; ok && now.Sub(last) < 30*time.Second { + return nil + } + d.alerted[key] = now + + return []storage.Alert{{ + CreatedAt: now, + Type: "brute_force", + Severity: d.cfg.Severity, + SrcIP: srcIP, + DstIP: dstIP, + DstPort: uint16(dstPort), + Protocol: "TCP", + Description: fmt.Sprintf("Brute-force detected on port %d: %d connection attempts in %ds", dstPort, count, d.cfg.WindowSeconds), + Count: count, + }} +} + +func (d *bruteForceDetector) Reset() { + d.mu.Lock() + defer d.mu.Unlock() + d.tracker = make(map[string][]time.Time) + d.alerted = make(map[string]time.Time) +} diff --git a/internal/analyzer/detector.go b/internal/analyzer/detector.go new file mode 100644 index 0000000..a60529c --- /dev/null +++ b/internal/analyzer/detector.go @@ -0,0 +1,45 @@ +package analyzer + +import ( + "time" + + "dip-ids/internal/storage" + + "github.com/google/gopacket" +) + +// Detector — интерфейс детектора атак +type Detector interface { + Name() string + Analyze(pkt gopacket.Packet) []storage.Alert + Reset() +} + +// timeWindow скользящее временное окно для хранения меток времени +type timeWindow struct { + entries []time.Time + size time.Duration +} + +func newTimeWindow(seconds int) *timeWindow { + return &timeWindow{size: time.Duration(seconds) * time.Second} +} + +func (w *timeWindow) add(t time.Time) { + w.entries = append(w.entries, t) + w.evict(t) +} + +func (w *timeWindow) evict(now time.Time) { + cutoff := now.Add(-w.size) + i := 0 + for i < len(w.entries) && w.entries[i].Before(cutoff) { + i++ + } + w.entries = w.entries[i:] +} + +func (w *timeWindow) count(now time.Time) int { + w.evict(now) + return len(w.entries) +} diff --git a/internal/analyzer/dns.go b/internal/analyzer/dns.go new file mode 100644 index 0000000..72f5d6c --- /dev/null +++ b/internal/analyzer/dns.go @@ -0,0 +1,147 @@ +package analyzer + +import ( + "fmt" + "strings" + "sync" + "time" + + "dip-ids/internal/config" + "dip-ids/internal/storage" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +// dnsAnomalyDetector обнаруживает аномалии DNS: +// 1. Слишком длинные метки (признак DNS-туннелирования) +// 2. Аномально высокая частота запросов от одного источника +type dnsAnomalyDetector struct { + mu sync.Mutex + cfg config.DNSAnomalyConfig + tracker map[string][]time.Time // srcIP -> query timestamps + alerted map[string]time.Time +} + +func NewDNSAnomalyDetector(cfg config.DNSAnomalyConfig) Detector { + return &dnsAnomalyDetector{ + cfg: cfg, + tracker: make(map[string][]time.Time), + alerted: make(map[string]time.Time), + } +} + +func (d *dnsAnomalyDetector) Name() string { return "dns_anomaly" } + +func (d *dnsAnomalyDetector) Analyze(pkt gopacket.Packet) []storage.Alert { + if !d.cfg.Enabled { + return nil + } + + netLayer := pkt.NetworkLayer() + dnsLayer := pkt.Layer(layers.LayerTypeDNS) + if netLayer == nil || dnsLayer == nil { + return nil + } + + dns := dnsLayer.(*layers.DNS) + if !dns.QR { // QR=0 — это запрос, QR=1 — ответ; анализируем запросы + return nil + } + + // Анализируем только запросы (QR=false в gopacket означает запрос) + if len(dns.Questions) == 0 { + return nil + } + + srcIP := netLayer.NetworkFlow().Src().String() + now := pkt.Metadata().Timestamp + if now.IsZero() { + now = time.Now() + } + + var alerts []storage.Alert + + for _, q := range dns.Questions { + name := string(q.Name) + + // Проверка 1: DNS-туннелирование по длине метки + if alert := d.checkTunneling(name, srcIP, now); alert != nil { + alerts = append(alerts, *alert) + } + } + + // Проверка 2: высокая частота запросов + if alert := d.checkFrequency(srcIP, now); alert != nil { + alerts = append(alerts, *alert) + } + + return alerts +} + +func (d *dnsAnomalyDetector) checkTunneling(name, srcIP string, now time.Time) *storage.Alert { + labels := strings.Split(name, ".") + for _, label := range labels { + if len(label) > d.cfg.MaxLabelLength { + key := "tunnel:" + srcIP + d.mu.Lock() + last, exists := d.alerted[key] + if exists && now.Sub(last) < 60*time.Second { + d.mu.Unlock() + return nil + } + d.alerted[key] = now + d.mu.Unlock() + + return &storage.Alert{ + CreatedAt: now, + Type: "dns_anomaly", + Severity: d.cfg.Severity, + SrcIP: srcIP, + Protocol: "DNS", + Description: fmt.Sprintf("DNS tunneling suspected: label length %d in query '%s'", len(label), name), + Count: 1, + } + } + } + return nil +} + +func (d *dnsAnomalyDetector) checkFrequency(srcIP string, now time.Time) *storage.Alert { + d.mu.Lock() + defer d.mu.Unlock() + + window := time.Duration(d.cfg.WindowSeconds) * time.Second + cutoff := now.Add(-window) + + d.tracker[srcIP] = append(d.tracker[srcIP], now) + d.tracker[srcIP] = filterTimes(d.tracker[srcIP], cutoff) + + count := len(d.tracker[srcIP]) + if count < d.cfg.QueryThreshold { + return nil + } + + key := "freq:" + srcIP + if last, ok := d.alerted[key]; ok && now.Sub(last) < 30*time.Second { + return nil + } + d.alerted[key] = now + + return &storage.Alert{ + CreatedAt: now, + Type: "dns_anomaly", + Severity: d.cfg.Severity, + SrcIP: srcIP, + Protocol: "DNS", + Description: fmt.Sprintf("High DNS query rate from %s: %d queries in %ds", srcIP, count, d.cfg.WindowSeconds), + Count: count, + } +} + +func (d *dnsAnomalyDetector) Reset() { + d.mu.Lock() + defer d.mu.Unlock() + d.tracker = make(map[string][]time.Time) + d.alerted = make(map[string]time.Time) +} diff --git a/internal/analyzer/dos.go b/internal/analyzer/dos.go new file mode 100644 index 0000000..ab6abca --- /dev/null +++ b/internal/analyzer/dos.go @@ -0,0 +1,87 @@ +package analyzer + +import ( + "fmt" + "sync" + "time" + + "dip-ids/internal/config" + "dip-ids/internal/storage" + + "github.com/google/gopacket" +) + +// dosDetector обнаруживает DoS/DDoS атаки по превышению порога PPS. +// Алгоритм: считает количество пакетов от каждого источника +// за скользящее временное окно; при превышении порога — алерт. +type dosDetector struct { + mu sync.Mutex + cfg config.DoSConfig + tracker map[string][]time.Time // srcIP -> timestamps + alerted map[string]time.Time +} + +func NewDoSDetector(cfg config.DoSConfig) Detector { + return &dosDetector{ + cfg: cfg, + tracker: make(map[string][]time.Time), + alerted: make(map[string]time.Time), + } +} + +func (d *dosDetector) Name() string { return "dos" } + +func (d *dosDetector) Analyze(pkt gopacket.Packet) []storage.Alert { + if !d.cfg.Enabled { + return nil + } + + netLayer := pkt.NetworkLayer() + if netLayer == nil { + return nil + } + + srcIP := netLayer.NetworkFlow().Src().String() + dstIP := netLayer.NetworkFlow().Dst().String() + now := pkt.Metadata().Timestamp + if now.IsZero() { + now = time.Now() + } + + d.mu.Lock() + defer d.mu.Unlock() + + window := time.Duration(d.cfg.WindowSeconds) * time.Second + cutoff := now.Add(-window) + + d.tracker[srcIP] = append(d.tracker[srcIP], now) + d.tracker[srcIP] = filterTimes(d.tracker[srcIP], cutoff) + + pps := len(d.tracker[srcIP]) + if pps < d.cfg.PPSThreshold { + return nil + } + + if last, ok := d.alerted[srcIP]; ok && now.Sub(last) < 10*time.Second { + return nil + } + d.alerted[srcIP] = now + + return []storage.Alert{{ + CreatedAt: now, + Type: "dos", + Severity: d.cfg.Severity, + SrcIP: srcIP, + DstIP: dstIP, + Protocol: "IP", + Description: fmt.Sprintf("DoS attack detected from %s: %d pkt/s (threshold: %d)", srcIP, pps, d.cfg.PPSThreshold), + Count: pps, + }} +} + +func (d *dosDetector) Reset() { + d.mu.Lock() + defer d.mu.Unlock() + d.tracker = make(map[string][]time.Time) + d.alerted = make(map[string]time.Time) +} diff --git a/internal/analyzer/engine.go b/internal/analyzer/engine.go new file mode 100644 index 0000000..2593479 --- /dev/null +++ b/internal/analyzer/engine.go @@ -0,0 +1,124 @@ +package analyzer + +import ( + "context" + "log" + "sync/atomic" + "time" + + "dip-ids/internal/config" + "dip-ids/internal/storage" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +// Engine — основной движок анализа трафика. +// Получает пакеты из канала, передаёт каждый всем детекторам, +// собирает алерты и передаёт их в хранилище. +type Engine struct { + db *storage.DB + detectors []Detector + totalPkts atomic.Int64 + totalBytes atomic.Int64 +} + +// New создаёт движок с детекторами, сконфигурированными из cfg +func New(db *storage.DB, cfg config.DetectorsConfig) *Engine { + return &Engine{ + db: db, + detectors: []Detector{ + NewPortScanDetector(cfg.PortScan), + NewBruteForceDetector(cfg.BruteForce), + NewDoSDetector(cfg.DoS), + NewARPSpoofDetector(cfg.ARPSpoof), + NewDNSAnomalyDetector(cfg.DNSAnomaly), + }, + } +} + +// Run запускает обработку пакетов из канала pkts до отмены ctx. +func (e *Engine) Run(ctx context.Context, pkts <-chan gopacket.Packet) { + for { + select { + case <-ctx.Done(): + return + case pkt, ok := <-pkts: + if !ok { + return + } + e.process(pkt) + } + } +} + +func (e *Engine) process(pkt gopacket.Packet) { + e.totalPkts.Add(1) + if meta := pkt.Metadata(); meta != nil { + e.totalBytes.Add(int64(meta.CaptureLength)) + } + + // Сохраняем статистику пакета + e.recordStat(pkt) + + for _, det := range e.detectors { + alerts := det.Analyze(pkt) + for i := range alerts { + if err := e.db.CreateAlert(&alerts[i]); err != nil { + log.Printf("[engine] save alert (%s): %v", det.Name(), err) + } + } + } +} + +func (e *Engine) recordStat(pkt gopacket.Packet) { + stat := &storage.PacketStat{ + CreatedAt: time.Now(), + } + + if netLayer := pkt.NetworkLayer(); netLayer != nil { + stat.SrcIP = netLayer.NetworkFlow().Src().String() + stat.DstIP = netLayer.NetworkFlow().Dst().String() + } + + // Определяем протокол + switch { + case pkt.Layer(layers.LayerTypeTCP) != nil: + stat.Protocol = "TCP" + case pkt.Layer(layers.LayerTypeUDP) != nil: + stat.Protocol = "UDP" + case pkt.Layer(layers.LayerTypeICMPv4) != nil: + stat.Protocol = "ICMP" + case pkt.Layer(layers.LayerTypeARP) != nil: + stat.Protocol = "ARP" + case pkt.Layer(layers.LayerTypeDNS) != nil: + stat.Protocol = "DNS" + default: + stat.Protocol = "OTHER" + } + + if meta := pkt.Metadata(); meta != nil { + stat.Bytes = int64(meta.CaptureLength) + } + + // Сохраняем не каждый пакет (каждый 10-й), чтобы не раздувать БД + if e.totalPkts.Load()%10 == 0 { + if err := e.db.CreatePacketStat(stat); err != nil { + log.Printf("[engine] save stat: %v", err) + } + } +} + +// Stats возвращает счётчики текущей сессии +func (e *Engine) Stats() (pkts, bytes int64) { + return e.totalPkts.Load(), e.totalBytes.Load() +} + +// Reset сбрасывает состояние всех детекторов и счётчики +func (e *Engine) Reset() { + for _, det := range e.detectors { + det.Reset() + } + e.totalPkts.Store(0) + e.totalBytes.Store(0) +} diff --git a/internal/analyzer/portscan.go b/internal/analyzer/portscan.go new file mode 100644 index 0000000..96fc332 --- /dev/null +++ b/internal/analyzer/portscan.go @@ -0,0 +1,121 @@ +package analyzer + +import ( + "fmt" + "sync" + "time" + + "dip-ids/internal/config" + "dip-ids/internal/storage" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +// portScanDetector обнаруживает сканирование портов методом sliding window. +// Алгоритм: если один источник обращается к N уникальным портам назначения +// за период T — это потенциальное сканирование. +type portScanDetector struct { + mu sync.Mutex + cfg config.PortScanConfig + // srcIP -> map[dstPort][]time.Time + tracker map[string]map[uint16][]time.Time + alerted map[string]time.Time // последний алерт по srcIP +} + +func NewPortScanDetector(cfg config.PortScanConfig) Detector { + return &portScanDetector{ + cfg: cfg, + tracker: make(map[string]map[uint16][]time.Time), + alerted: make(map[string]time.Time), + } +} + +func (d *portScanDetector) Name() string { return "port_scan" } + +func (d *portScanDetector) Analyze(pkt gopacket.Packet) []storage.Alert { + if !d.cfg.Enabled { + return nil + } + + netLayer := pkt.NetworkLayer() + tcpLayer := pkt.Layer(layers.LayerTypeTCP) + if netLayer == nil || tcpLayer == nil { + return nil + } + + tcp := tcpLayer.(*layers.TCP) + // Интересуют только SYN-пакеты (начало соединения) + if !tcp.SYN || tcp.ACK { + return nil + } + + srcIP := netLayer.NetworkFlow().Src().String() + dstIP := netLayer.NetworkFlow().Dst().String() + dstPort := uint16(tcp.DstPort) + now := pkt.Metadata().Timestamp + if now.IsZero() { + now = time.Now() + } + + d.mu.Lock() + defer d.mu.Unlock() + + if _, ok := d.tracker[srcIP]; !ok { + d.tracker[srcIP] = make(map[uint16][]time.Time) + } + + window := time.Duration(d.cfg.WindowSeconds) * time.Second + cutoff := now.Add(-window) + + // Добавляем текущий порт и очищаем устаревшие записи + d.tracker[srcIP][dstPort] = append(d.tracker[srcIP][dstPort], now) + + uniquePorts := 0 + for port, times := range d.tracker[srcIP] { + filtered := filterTimes(times, cutoff) + if len(filtered) == 0 { + delete(d.tracker[srcIP], port) + } else { + d.tracker[srcIP][port] = filtered + uniquePorts++ + } + } + + if uniquePorts < d.cfg.Threshold { + return nil + } + + // Дедупликация: не спамить алертами чаще чем раз в 30 сек на один IP + if last, ok := d.alerted[srcIP]; ok && now.Sub(last) < 30*time.Second { + return nil + } + d.alerted[srcIP] = now + + return []storage.Alert{{ + CreatedAt: now, + Type: "port_scan", + Severity: d.cfg.Severity, + SrcIP: srcIP, + DstIP: dstIP, + DstPort: dstPort, + Protocol: "TCP", + Description: fmt.Sprintf("Port scan detected: %d unique ports probed in %ds window", uniquePorts, d.cfg.WindowSeconds), + Count: uniquePorts, + }} +} + +func (d *portScanDetector) Reset() { + d.mu.Lock() + defer d.mu.Unlock() + d.tracker = make(map[string]map[uint16][]time.Time) + d.alerted = make(map[string]time.Time) +} + +func filterTimes(times []time.Time, cutoff time.Time) []time.Time { + i := 0 + for i < len(times) && times[i].Before(cutoff) { + i++ + } + return times[i:] +} diff --git a/internal/api/handlers/alerts.go b/internal/api/handlers/alerts.go new file mode 100644 index 0000000..68889df --- /dev/null +++ b/internal/api/handlers/alerts.go @@ -0,0 +1,84 @@ +package handlers + +import ( + "net/http" + "strconv" + "time" + + "dip-ids/internal/storage" + + "github.com/gin-gonic/gin" +) + +type AlertsHandler struct { + db *storage.DB +} + +func NewAlertsHandler(db *storage.DB) *AlertsHandler { + return &AlertsHandler{db: db} +} + +// GetAlerts GET /api/alerts +func (h *AlertsHandler) GetAlerts(c *gin.Context) { + filter := storage.AlertFilter{ + Type: c.Query("type"), + Severity: c.Query("severity"), + SrcIP: c.Query("src_ip"), + } + + if p := c.Query("page"); p != "" { + if v, err := strconv.Atoi(p); err == nil { + filter.Page = v + } + } + if ps := c.Query("page_size"); ps != "" { + if v, err := strconv.Atoi(ps); err == nil { + filter.PageSize = v + } + } + if from := c.Query("date_from"); from != "" { + if t, err := time.Parse(time.RFC3339, from); err == nil { + filter.DateFrom = &t + } + } + if to := c.Query("date_to"); to != "" { + if t, err := time.Parse(time.RFC3339, to); err == nil { + filter.DateTo = &t + } + } + + alerts, total, err := h.db.GetAlerts(filter) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, gin.H{ + "data": alerts, + "total": total, + "page": filter.Page, + }) +} + +// DeleteAlert DELETE /api/alerts/:id +func (h *AlertsHandler) DeleteAlert(c *gin.Context) { + id, err := strconv.ParseUint(c.Param("id"), 10, 64) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "invalid id"}) + return + } + if err := h.db.DeleteAlert(uint(id)); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"ok": true}) +} + +// ClearAlerts DELETE /api/alerts +func (h *AlertsHandler) ClearAlerts(c *gin.Context) { + if err := h.db.DeleteAllAlerts(); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"ok": true}) +} diff --git a/internal/api/handlers/capture.go b/internal/api/handlers/capture.go new file mode 100644 index 0000000..be908fb --- /dev/null +++ b/internal/api/handlers/capture.go @@ -0,0 +1,253 @@ +package handlers + +import ( + "context" + "log" + "mime/multipart" + "net/http" + "os" + "path/filepath" + "time" + + "dip-ids/internal/analyzer" + "dip-ids/internal/capture" + "dip-ids/internal/storage" + + "github.com/gin-gonic/gin" +) + +// CaptureState хранит состояние текущей сессии захвата +type CaptureState struct { + cancel context.CancelFunc + session *storage.CaptureSession + engine *analyzer.Engine +} + +type CaptureHandler struct { + db *storage.DB + engine *analyzer.Engine + defaultIface string + active *CaptureState +} + +func NewCaptureHandler(db *storage.DB, engine *analyzer.Engine, defaultIface string) *CaptureHandler { + return &CaptureHandler{ + db: db, + engine: engine, + defaultIface: defaultIface, + } +} + +// StartLive POST /api/capture/start +func (h *CaptureHandler) StartLive(c *gin.Context) { + if h.active != nil { + c.JSON(http.StatusConflict, gin.H{"error": "capture already running"}) + return + } + + var req struct { + Interface string `json:"interface"` + } + _ = c.ShouldBindJSON(&req) + if req.Interface == "" { + req.Interface = h.defaultIface + } + + sess := &storage.CaptureSession{ + CreatedAt: time.Now(), + Source: req.Interface, + Mode: "live", + Status: "running", + } + if err := h.db.CreateSession(sess); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + ctx, cancel := context.WithCancel(context.Background()) + cap, err := capture.New(capture.Config{ + Interface: req.Interface, + Mode: capture.ModeLive, + Snaplen: 65535, + Promiscuous: true, + }) + if err != nil { + cancel() + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + pkts, err := cap.Start(ctx) + if err != nil { + cancel() + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + h.engine.Reset() + h.active = &CaptureState{cancel: cancel, session: sess, engine: h.engine} + + go func() { + h.engine.Run(ctx, pkts) + // Обновляем сессию после завершения + now := time.Now() + pktsCount, bytesCount := h.engine.Stats() + sess.EndedAt = &now + sess.Status = "stopped" + sess.TotalPkts = pktsCount + sess.TotalBytes = bytesCount + if err := h.db.UpdateSession(sess); err != nil { + log.Printf("[capture] update session: %v", err) + } + h.active = nil + }() + + c.JSON(http.StatusOK, gin.H{"session_id": sess.ID, "interface": req.Interface}) +} + +// Stop POST /api/capture/stop +func (h *CaptureHandler) Stop(c *gin.Context) { + if h.active == nil { + c.JSON(http.StatusConflict, gin.H{"error": "no active capture"}) + return + } + h.active.cancel() + c.JSON(http.StatusOK, gin.H{"ok": true}) +} + +// UploadPCAP POST /api/capture/upload +func (h *CaptureHandler) UploadPCAP(c *gin.Context) { + if h.active != nil { + c.JSON(http.StatusConflict, gin.H{"error": "capture already running"}) + return + } + + file, err := c.FormFile("file") + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "file required"}) + return + } + + tmpPath, err := saveTempFile(file) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + sess := &storage.CaptureSession{ + CreatedAt: time.Now(), + Source: file.Filename, + Mode: "pcap", + Status: "running", + } + if err := h.db.CreateSession(sess); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + ctx, cancel := context.WithCancel(context.Background()) + cap, err := capture.New(capture.Config{ + PCAPFile: tmpPath, + Mode: capture.ModePCAP, + Snaplen: 65535, + }) + if err != nil { + cancel() + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + pkts, err := cap.Start(ctx) + if err != nil { + cancel() + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + h.engine.Reset() + h.active = &CaptureState{cancel: cancel, session: sess, engine: h.engine} + + go func() { + defer os.Remove(tmpPath) + h.engine.Run(ctx, pkts) + + now := time.Now() + pktsCount, bytesCount := h.engine.Stats() + sess.EndedAt = &now + sess.Status = "completed" + sess.TotalPkts = pktsCount + sess.TotalBytes = bytesCount + if err := h.db.UpdateSession(sess); err != nil { + log.Printf("[capture] update session: %v", err) + } + h.active = nil + }() + + c.JSON(http.StatusOK, gin.H{"session_id": sess.ID, "filename": file.Filename}) +} + +// Status GET /api/capture/status +func (h *CaptureHandler) Status(c *gin.Context) { + if h.active == nil { + last, _ := h.db.GetLastSession() + c.JSON(http.StatusOK, gin.H{"running": false, "last_session": last}) + return + } + + pkts, bytes := h.engine.Stats() + c.JSON(http.StatusOK, gin.H{ + "running": true, + "session_id": h.active.session.ID, + "source": h.active.session.Source, + "mode": h.active.session.Mode, + "pkts": pkts, + "bytes": bytes, + }) +} + +// GetInterfaces GET /api/capture/interfaces +func (h *CaptureHandler) GetInterfaces(c *gin.Context) { + ifaces, err := capture.ListInterfaces() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"interfaces": ifaces}) +} + +// GetSessions GET /api/capture/sessions +func (h *CaptureHandler) GetSessions(c *gin.Context) { + sessions, err := h.db.GetAllSessions() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"data": sessions}) +} + +func saveTempFile(fh *multipart.FileHeader) (string, error) { + src, err := fh.Open() + if err != nil { + return "", err + } + defer src.Close() + + tmp, err := os.CreateTemp("", "nids-*.pcap") + if err != nil { + return "", err + } + defer tmp.Close() + + buf := make([]byte, 32*1024) + for { + n, err := src.Read(buf) + if n > 0 { + tmp.Write(buf[:n]) + } + if err != nil { + break + } + } + + return filepath.Abs(tmp.Name()) +} diff --git a/internal/api/handlers/reports.go b/internal/api/handlers/reports.go new file mode 100644 index 0000000..ce4b684 --- /dev/null +++ b/internal/api/handlers/reports.go @@ -0,0 +1,84 @@ +package handlers + +import ( + "fmt" + "net/http" + "time" + + "dip-ids/internal/report" + "dip-ids/internal/storage" + + "github.com/gin-gonic/gin" +) + +type ReportsHandler struct { + db *storage.DB +} + +func NewReportsHandler(db *storage.DB) *ReportsHandler { + return &ReportsHandler{db: db} +} + +// Generate GET /api/reports/generate +func (h *ReportsHandler) Generate(c *gin.Context) { + // Собираем данные для отчёта + alerts, _, err := h.db.GetAlerts(storage.AlertFilter{PageSize: 500}) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + bySeverity, err := h.db.AlertsBySeverity() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + byType, err := h.db.AlertsByType() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + topIPs, err := h.db.TopSourceIPs(10) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + trafficByProto, err := h.db.TrafficByProtocol() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + recentStats, err := h.db.GetRecentPacketStats(100) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + session, _ := h.db.GetLastSession() + + data := report.Data{ + GeneratedAt: time.Now(), + Session: session, + Alerts: alerts, + BySeverity: bySeverity, + ByType: byType, + TopIPs: topIPs, + TrafficByProto: trafficByProto, + RecentStats: recentStats, + } + + pdf, err := report.Generate(data) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + filename := fmt.Sprintf("nids-report-%s.pdf", time.Now().Format("2006-01-02_15-04")) + c.Header("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename)) + c.Header("Content-Type", "application/pdf") + c.Data(http.StatusOK, "application/pdf", pdf) +} diff --git a/internal/api/handlers/stats.go b/internal/api/handlers/stats.go new file mode 100644 index 0000000..cd67a09 --- /dev/null +++ b/internal/api/handlers/stats.go @@ -0,0 +1,89 @@ +package handlers + +import ( + "net/http" + "strconv" + + "dip-ids/internal/storage" + + "github.com/gin-gonic/gin" +) + +type StatsHandler struct { + db *storage.DB +} + +func NewStatsHandler(db *storage.DB) *StatsHandler { + return &StatsHandler{db: db} +} + +// GetSummary GET /api/stats/summary +func (h *StatsHandler) GetSummary(c *gin.Context) { + total, err := h.db.TotalAlerts() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + bySeverity, err := h.db.AlertsBySeverity() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + byType, err := h.db.AlertsByType() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + // Нормализуем данные по severity в удобный map + severityMap := map[string]int64{ + "critical": 0, "high": 0, "medium": 0, "low": 0, + } + for _, s := range bySeverity { + severityMap[s.Severity] = s.Count + } + + c.JSON(http.StatusOK, gin.H{ + "total": total, + "by_severity": severityMap, + "by_type": byType, + }) +} + +// GetTimeline GET /api/stats/timeline?hours=24 +func (h *StatsHandler) GetTimeline(c *gin.Context) { + hours := 24 + if h := c.Query("hours"); h != "" { + if v, err := strconv.Atoi(h); err == nil && v > 0 { + hours = v + } + } + + timeline, err := h.db.AlertsTimeline(hours) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, gin.H{"data": timeline, "hours": hours}) +} + +// GetTopIPs GET /api/stats/top-ips?limit=10 +func (h *StatsHandler) GetTopIPs(c *gin.Context) { + limit := 10 + if l := c.Query("limit"); l != "" { + if v, err := strconv.Atoi(l); err == nil && v > 0 { + limit = v + } + } + + ips, err := h.db.TopSourceIPs(limit) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, gin.H{"data": ips}) +} diff --git a/internal/api/server.go b/internal/api/server.go new file mode 100644 index 0000000..03cacd9 --- /dev/null +++ b/internal/api/server.go @@ -0,0 +1,77 @@ +package api + +import ( + "fmt" + + "dip-ids/internal/analyzer" + "dip-ids/internal/api/handlers" + "dip-ids/internal/config" + "dip-ids/internal/storage" + + "github.com/gin-gonic/gin" +) + +type Server struct { + cfg config.ServerConfig + router *gin.Engine +} + +func New( + cfg config.ServerConfig, + db *storage.DB, + engine *analyzer.Engine, + captureCfg config.CaptureConfig, +) *Server { + gin.SetMode(gin.ReleaseMode) + r := gin.New() + r.Use(gin.Recovery()) + r.Use(corsMiddleware()) + r.Use(gin.LoggerWithConfig(gin.LoggerConfig{ + SkipPaths: []string{"/api/capture/status"}, + })) + + alertsH := handlers.NewAlertsHandler(db) + statsH := handlers.NewStatsHandler(db) + captureH := handlers.NewCaptureHandler(db, engine, captureCfg.DefaultInterface) + reportsH := handlers.NewReportsHandler(db) + + api := r.Group("/api") + + api.GET("/alerts", alertsH.GetAlerts) + api.DELETE("/alerts", alertsH.ClearAlerts) + api.DELETE("/alerts/:id", alertsH.DeleteAlert) + + api.GET("/stats/summary", statsH.GetSummary) + api.GET("/stats/timeline", statsH.GetTimeline) + api.GET("/stats/top-ips", statsH.GetTopIPs) + + api.GET("/capture/interfaces", captureH.GetInterfaces) + api.GET("/capture/status", captureH.Status) + api.GET("/capture/sessions", captureH.GetSessions) + api.POST("/capture/start", captureH.StartLive) + api.POST("/capture/stop", captureH.Stop) + api.POST("/capture/upload", captureH.UploadPCAP) + + api.GET("/reports/generate", reportsH.Generate) + + return &Server{cfg: cfg, router: r} +} + +func (s *Server) Run() error { + addr := fmt.Sprintf("%s:%d", s.cfg.Host, s.cfg.Port) + return s.router.Run(addr) +} + +// corsMiddleware разрешает запросы от Nuxt dev-сервера (localhost:3000) +func corsMiddleware() gin.HandlerFunc { + return func(c *gin.Context) { + c.Header("Access-Control-Allow-Origin", "*") + c.Header("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS") + c.Header("Access-Control-Allow-Headers", "Content-Type, Authorization") + if c.Request.Method == "OPTIONS" { + c.AbortWithStatus(204) + return + } + c.Next() + } +} diff --git a/internal/capture/capture.go b/internal/capture/capture.go new file mode 100644 index 0000000..8d6069a --- /dev/null +++ b/internal/capture/capture.go @@ -0,0 +1,122 @@ +package capture + +import ( + "context" + "fmt" + "io" + "log" + + "github.com/google/gopacket" + "github.com/google/gopacket/pcap" +) + +// Mode определяет режим захвата трафика +type Mode string + +const ( + ModeLive Mode = "live" + ModePCAP Mode = "pcap" +) + +// Config параметры захвата +type Config struct { + Interface string + PCAPFile string + Mode Mode + Snaplen int32 + Promiscuous bool +} + +// Capturer захватывает пакеты и отправляет их в канал +type Capturer struct { + cfg Config + handle *pcap.Handle +} + +// New создаёт новый захватчик трафика +func New(cfg Config) (*Capturer, error) { + return &Capturer{cfg: cfg}, nil +} + +// Start открывает источник пакетов и запускает захват. +// Пакеты отправляются в возвращаемый канал до отмены ctx. +func (c *Capturer) Start(ctx context.Context) (<-chan gopacket.Packet, error) { + var handle *pcap.Handle + var err error + + switch c.cfg.Mode { + case ModeLive: + handle, err = pcap.OpenLive( + c.cfg.Interface, + c.cfg.Snaplen, + c.cfg.Promiscuous, + pcap.BlockForever, + ) + if err != nil { + return nil, fmt.Errorf("open live capture on %s: %w", c.cfg.Interface, err) + } + case ModePCAP: + handle, err = pcap.OpenOffline(c.cfg.PCAPFile) + if err != nil { + return nil, fmt.Errorf("open pcap file %s: %w", c.cfg.PCAPFile, err) + } + default: + return nil, fmt.Errorf("unknown capture mode: %s", c.cfg.Mode) + } + + c.handle = handle + + pkts := make(chan gopacket.Packet, 1024) + go func() { + defer close(pkts) + defer handle.Close() + + src := gopacket.NewPacketSource(handle, handle.LinkType()) + src.NoCopy = true + + for { + select { + case <-ctx.Done(): + return + default: + } + + pkt, err := src.NextPacket() + if err != nil { + if err == io.EOF { + return + } + // pcap timeout или другая recoverable ошибка + log.Printf("[capture] packet read error: %v", err) + continue + } + select { + case pkts <- pkt: + case <-ctx.Done(): + return + } + } + }() + + return pkts, nil +} + +// Stop принудительно закрывает handle (используется при остановке из API) +func (c *Capturer) Stop() { + if c.handle != nil { + c.handle.Close() + } +} + +// ListInterfaces возвращает доступные сетевые интерфейсы +func ListInterfaces() ([]string, error) { + devs, err := pcap.FindAllDevs() + if err != nil { + return nil, err + } + names := make([]string, 0, len(devs)) + for _, d := range devs { + names = append(names, d.Name) + } + return names, nil +} diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100644 index 0000000..b4aa35c --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,84 @@ +package config + +import ( + "os" + + "gopkg.in/yaml.v3" +) + +type Config struct { + Server ServerConfig `yaml:"server"` + Database DatabaseConfig `yaml:"database"` + Capture CaptureConfig `yaml:"capture"` + Detectors DetectorsConfig `yaml:"detectors"` +} + +type ServerConfig struct { + Host string `yaml:"host"` + Port int `yaml:"port"` +} + +type DatabaseConfig struct { + Path string `yaml:"path"` +} + +type CaptureConfig struct { + DefaultInterface string `yaml:"default_interface"` + Snaplen int32 `yaml:"snaplen"` + Promiscuous bool `yaml:"promiscuous"` +} + +type DetectorsConfig struct { + PortScan PortScanConfig `yaml:"port_scan"` + BruteForce BruteForceConfig `yaml:"brute_force"` + DoS DoSConfig `yaml:"dos"` + ARPSpoof ARPSpoofConfig `yaml:"arp_spoof"` + DNSAnomaly DNSAnomalyConfig `yaml:"dns_anomaly"` +} + +type PortScanConfig struct { + Enabled bool `yaml:"enabled"` + Threshold int `yaml:"threshold"` + WindowSeconds int `yaml:"window_seconds"` + Severity string `yaml:"severity"` +} + +type BruteForceConfig struct { + Enabled bool `yaml:"enabled"` + Threshold int `yaml:"threshold"` + WindowSeconds int `yaml:"window_seconds"` + Severity string `yaml:"severity"` + Ports []int32 `yaml:"ports"` +} + +type DoSConfig struct { + Enabled bool `yaml:"enabled"` + PPSThreshold int `yaml:"pps_threshold"` + WindowSeconds int `yaml:"window_seconds"` + Severity string `yaml:"severity"` +} + +type ARPSpoofConfig struct { + Enabled bool `yaml:"enabled"` + Severity string `yaml:"severity"` +} + +type DNSAnomalyConfig struct { + Enabled bool `yaml:"enabled"` + MaxLabelLength int `yaml:"max_label_length"` + QueryThreshold int `yaml:"query_threshold"` + WindowSeconds int `yaml:"window_seconds"` + Severity string `yaml:"severity"` +} + +func Load(path string) (*Config, error) { + data, err := os.ReadFile(path) + if err != nil { + return nil, err + } + var cfg Config + if err := yaml.Unmarshal(data, &cfg); err != nil { + return nil, err + } + return &cfg, nil +} diff --git a/internal/report/pdf.go b/internal/report/pdf.go new file mode 100644 index 0000000..4eabfc6 --- /dev/null +++ b/internal/report/pdf.go @@ -0,0 +1,440 @@ +package report + +import ( + "fmt" + "log" + "os" + "time" + + "dip-ids/internal/storage" + + "github.com/johnfercher/maroto/v2" + "github.com/johnfercher/maroto/v2/pkg/components/col" + "github.com/johnfercher/maroto/v2/pkg/components/line" + "github.com/johnfercher/maroto/v2/pkg/components/row" + "github.com/johnfercher/maroto/v2/pkg/components/text" + "github.com/johnfercher/maroto/v2/pkg/config" + "github.com/johnfercher/maroto/v2/pkg/consts/align" + "github.com/johnfercher/maroto/v2/pkg/consts/fontstyle" + "github.com/johnfercher/maroto/v2/pkg/core" + "github.com/johnfercher/maroto/v2/pkg/props" + "github.com/johnfercher/maroto/v2/pkg/repository" +) + +// Data данные для генерации отчёта +type Data struct { + GeneratedAt time.Time + Session *storage.CaptureSession + Alerts []storage.Alert + BySeverity []storage.SeverityCount + ByType []storage.TypeCount + TopIPs []storage.IPCount + TrafficByProto []storage.ProtocolCount + RecentStats []storage.PacketStat +} + +// Пути к шрифту DejaVu Sans с поддержкой кириллицы +var cyrillicFontCandidates = []string{ + "/usr/share/fonts/TTF/DejaVuSans.ttf", + "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", + "/usr/share/fonts/dejavu-sans/DejaVuSans.ttf", + "/usr/share/fonts/dejavu/DejaVuSans.ttf", +} + +var cyrillicBoldCandidates = []string{ + "/usr/share/fonts/TTF/DejaVuSans-Bold.ttf", + "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", + "/usr/share/fonts/dejavu-sans/DejaVuSans-Bold.ttf", + "/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf", +} + +func findFont(candidates []string) string { + for _, p := range candidates { + if _, err := os.Stat(p); err == nil { + return p + } + } + return "" +} + +const fontFamily = "DejaVu" + +// Generate создаёт PDF-отчёт и возвращает байты +func Generate(d Data) ([]byte, error) { + normalFont := findFont(cyrillicFontCandidates) + boldFont := findFont(cyrillicBoldCandidates) + + builder := config.NewBuilder(). + WithLeftMargin(15). + WithRightMargin(15). + WithTopMargin(15). + WithBottomMargin(15) + + if normalFont != "" && boldFont != "" { + builder = builder. + WithCustomFonts([]*entity.CustomFont{ + {Family: fontFamily, Style: fontstyle.Normal, File: normalFont}, + {Family: fontFamily, Style: fontstyle.Bold, File: boldFont}, + {Family: fontFamily, Style: fontstyle.Italic, File: normalFont}, + {Family: fontFamily, Style: fontstyle.BoldItalic, File: boldFont}, + }). + WithDefaultFont(&props.Font{Family: fontFamily, Size: 9}) + } else { + log.Println("[report] DejaVu font not found, Cyrillic may not render. Install ttf-dejavu.") + } + + m := maroto.New(builder.Build()) + + // ── Заголовок ───────────────────────────────────────────────────────────── + m.AddRows(buildHeader(d)...) + m.AddRow(3, line.NewCol(12, props.Line{Color: &props.Color{Red: 37, Green: 99, Blue: 235}})) + m.AddRows(buildMeta(d)...) + m.AddRow(5) + + // ── Сводка по критичности ───────────────────────────────────────────────── + m.AddRows(buildSectionTitle("1. Сводка по уровням критичности")...) + m.AddRows(buildSeverityTable(d.BySeverity)...) + m.AddRow(4) + + // ── Типы угроз ──────────────────────────────────────────────────────────── + m.AddRows(buildSectionTitle("2. Типы обнаруженных угроз")...) + m.AddRows(buildTypeTable(d.ByType)...) + m.AddRow(4) + + // ── Топ источников ──────────────────────────────────────────────────────── + if len(d.TopIPs) > 0 { + m.AddRows(buildSectionTitle("3. Топ источников атак")...) + m.AddRows(buildTopIPsTable(d.TopIPs)...) + m.AddRow(4) + } + + // ── Статистика трафика по протоколам ────────────────────────────────────── + if len(d.TrafficByProto) > 0 { + m.AddRows(buildSectionTitle("4. Статистика трафика по протоколам")...) + m.AddRows(buildTrafficProtoTable(d.TrafficByProto)...) + m.AddRow(4) + } + + // ── Лог трафика (последние записи) ──────────────────────────────────────── + if len(d.RecentStats) > 0 { + m.AddRows(buildSectionTitle(fmt.Sprintf("5. Журнал трафика (последние %d записей)", len(d.RecentStats)))...) + m.AddRows(buildTrafficLogHeader()...) + for i, s := range d.RecentStats { + if i >= 100 { + break + } + m.AddRows(buildTrafficLogRow(s)...) + } + m.AddRow(4) + } + + // ── Журнал инцидентов ───────────────────────────────────────────────────── + sectionNum := 6 + if len(d.TrafficByProto) == 0 { + sectionNum = 4 + } + m.AddRows(buildSectionTitle(fmt.Sprintf("%d. Журнал инцидентов", sectionNum))...) + m.AddRows(buildAlertsTableHeader()...) + for i, a := range d.Alerts { + if i >= 200 { + break + } + m.AddRows(buildAlertRow(a)...) + } + + doc, err := m.Generate() + if err != nil { + return nil, fmt.Errorf("generate pdf: %w", err) + } + return doc.GetBytes(), nil +} + +// ── Секции отчёта ───────────────────────────────────────────────────────────── + +func buildHeader(d Data) []core.Row { + return []core.Row{ + row.New(14).Add( + col.New(8).Add( + text.New("СИСТЕМА ОБНАРУЖЕНИЯ ВТОРЖЕНИЙ", props.Text{ + Size: 16, + Style: fontstyle.Bold, + Color: &props.Color{Red: 37, Green: 99, Blue: 235}, + }), + text.New("Отчёт об инцидентах сетевой безопасности", props.Text{ + Size: 9, + Top: 8, + Color: &props.Color{Red: 100, Green: 100, Blue: 100}, + }), + ), + col.New(4).Add( + text.New("DIP-IDS v1.0", props.Text{ + Size: 9, + Align: align.Right, + Style: fontstyle.Bold, + Color: &props.Color{Red: 37, Green: 99, Blue: 235}, + }), + text.New(fmt.Sprintf("Дата: %s", d.GeneratedAt.Format("02.01.2006 15:04:05")), props.Text{ + Size: 8, + Top: 5, + Align: align.Right, + Color: &props.Color{Red: 120, Green: 120, Blue: 120}, + }), + ), + ), + } +} + +func buildMeta(d Data) []core.Row { + source, mode, duration, pkts, bytes := "—", "—", "—", "—", "—" + if d.Session != nil { + source = d.Session.Source + mode = modeLabel(d.Session.Mode) + pkts = fmt.Sprintf("%d", d.Session.TotalPkts) + bytes = humanBytes(d.Session.TotalBytes) + if d.Session.EndedAt != nil { + duration = fmt.Sprintf("%.0f сек", d.Session.EndedAt.Sub(d.Session.CreatedAt).Seconds()) + } else { + duration = "активна" + } + } + return []core.Row{ + row.New(5).Add( + col.New(3).Add(metaCell("Источник", source)), + col.New(3).Add(metaCell("Режим", mode)), + col.New(3).Add(metaCell("Длительность", duration)), + col.New(3).Add(metaCell("Пакетов / Объём", pkts+" / "+bytes)), + ), + } +} + +func metaCell(label, value string) core.Component { + return text.New(label+": "+value, props.Text{ + Size: 8, + Color: &props.Color{Red: 80, Green: 80, Blue: 80}, + }) +} + +func buildSectionTitle(title string) []core.Row { + return []core.Row{ + row.New(8).Add( + col.New(12).Add( + text.New(title, props.Text{ + Size: 11, + Style: fontstyle.Bold, + Color: &props.Color{Red: 37, Green: 99, Blue: 235}, + }), + ), + ), + } +} + +// ── Таблицы сводки ──────────────────────────────────────────────────────────── + +func buildSeverityTable(data []storage.SeverityCount) []core.Row { + rows := []core.Row{tableHeaderRow([]colDef{ + {w: 6, label: "Уровень критичности"}, + {w: 6, label: "Количество алертов"}, + })} + counts := map[string]int64{} + for _, s := range data { + counts[s.Severity] = s.Count + } + for _, sev := range []string{"critical", "high", "medium", "low"} { + rows = append(rows, row.New(6).Add( + col.New(6).Add(text.New(severityLabel(sev), props.Text{ + Size: 9, Style: fontstyle.Bold, Color: severityColor(sev), + })), + col.New(6).Add(text.New(fmt.Sprintf("%d", counts[sev]), props.Text{Size: 9})), + )) + } + return rows +} + +func buildTypeTable(data []storage.TypeCount) []core.Row { + rows := []core.Row{tableHeaderRow([]colDef{ + {w: 6, label: "Тип атаки"}, + {w: 6, label: "Количество"}, + })} + for _, t := range data { + rows = append(rows, row.New(6).Add( + col.New(6).Add(text.New(typeLabel(t.Type), props.Text{Size: 9})), + col.New(6).Add(text.New(fmt.Sprintf("%d", t.Count), props.Text{Size: 9})), + )) + } + return rows +} + +func buildTopIPsTable(data []storage.IPCount) []core.Row { + rows := []core.Row{tableHeaderRow([]colDef{ + {w: 1, label: "#"}, + {w: 7, label: "IP-адрес источника"}, + {w: 4, label: "Алертов"}, + })} + for i, ip := range data { + rows = append(rows, row.New(6).Add( + col.New(1).Add(text.New(fmt.Sprintf("%d", i+1), props.Text{Size: 8})), + col.New(7).Add(text.New(ip.SrcIP, props.Text{Size: 8})), + col.New(4).Add(text.New(fmt.Sprintf("%d", ip.Count), props.Text{Size: 8})), + )) + } + return rows +} + +// ── Таблица трафика по протоколам ───────────────────────────────────────────── + +func buildTrafficProtoTable(data []storage.ProtocolCount) []core.Row { + rows := []core.Row{tableHeaderRow([]colDef{ + {w: 4, label: "Протокол"}, + {w: 4, label: "Пакетов"}, + {w: 4, label: "Объём трафика"}, + })} + for _, p := range data { + rows = append(rows, row.New(6).Add( + col.New(4).Add(text.New(p.Protocol, props.Text{Size: 9, Style: fontstyle.Bold})), + col.New(4).Add(text.New(fmt.Sprintf("%d", p.Count), props.Text{Size: 9})), + col.New(4).Add(text.New(humanBytes(p.Bytes), props.Text{Size: 9})), + )) + } + return rows +} + +// ── Журнал трафика ──────────────────────────────────────────────────────────── + +func buildTrafficLogHeader() []core.Row { + return []core.Row{tableHeaderRow([]colDef{ + {w: 3, label: "Время"}, + {w: 2, label: "Протокол"}, + {w: 4, label: "Источник"}, + {w: 3, label: "Назначение"}, + })} +} + +func buildTrafficLogRow(s storage.PacketStat) []core.Row { + return []core.Row{ + row.New(5).Add( + col.New(3).Add(text.New(s.CreatedAt.Format("02.01 15:04:05"), props.Text{Size: 7})), + col.New(2).Add(text.New(s.Protocol, props.Text{Size: 7, Style: fontstyle.Bold})), + col.New(4).Add(text.New(s.SrcIP, props.Text{Size: 7})), + col.New(3).Add(text.New(s.DstIP+" "+humanBytes(s.Bytes), props.Text{Size: 7})), + ), + } +} + +// ── Журнал инцидентов ───────────────────────────────────────────────────────── + +func buildAlertsTableHeader() []core.Row { + return []core.Row{tableHeaderRow([]colDef{ + {w: 3, label: "Дата/Время"}, + {w: 2, label: "Тип"}, + {w: 2, label: "Критичность"}, + {w: 2, label: "Источник"}, + {w: 3, label: "Описание"}, + })} +} + +func buildAlertRow(a storage.Alert) []core.Row { + return []core.Row{ + row.New(6).Add( + col.New(3).Add(text.New(a.CreatedAt.Format("02.01.06 15:04:05"), props.Text{Size: 7})), + col.New(2).Add(text.New(typeLabel(a.Type), props.Text{Size: 7})), + col.New(2).Add(text.New(severityLabel(a.Severity), props.Text{ + Size: 7, Style: fontstyle.Bold, Color: severityColor(a.Severity), + })), + col.New(2).Add(text.New(a.SrcIP, props.Text{Size: 7})), + col.New(3).Add(text.New(truncate(a.Description, 60), props.Text{Size: 7})), + ), + } +} + +// ── Вспомогательные типы и функции ─────────────────────────────────────────── + +type colDef struct { + w int + label string +} + +func tableHeaderRow(cols []colDef) core.Row { + cells := make([]core.Col, 0, len(cols)) + for _, c := range cols { + cells = append(cells, col.New(c.w).Add( + text.New(c.label, props.Text{ + Size: 9, + Style: fontstyle.Bold, + Color: &props.Color{Red: 255, Green: 255, Blue: 255}, + }), + )) + } + return row.New(7).Add(cells...) +} + +func severityLabel(s string) string { + switch s { + case "critical": + return "Критический" + case "high": + return "Высокий" + case "medium": + return "Средний" + case "low": + return "Низкий" + default: + return s + } +} + +func severityColor(s string) *props.Color { + switch s { + case "critical": + return &props.Color{Red: 185, Green: 28, Blue: 28} + case "high": + return &props.Color{Red: 194, Green: 65, Blue: 12} + case "medium": + return &props.Color{Red: 161, Green: 98, Blue: 7} + default: + return &props.Color{Red: 21, Green: 128, Blue: 61} + } +} + +func typeLabel(t string) string { + switch t { + case "port_scan": + return "Port Scan" + case "brute_force": + return "Brute Force" + case "dos": + return "DoS/DDoS" + case "arp_spoof": + return "ARP Spoof" + case "dns_anomaly": + return "DNS Anomaly" + default: + return t + } +} + +func modeLabel(m string) string { + if m == "live" { + return "Live захват" + } + return "PCAP файл" +} + +func humanBytes(b int64) string { + switch { + case b >= 1<<30: + return fmt.Sprintf("%.2f GB", float64(b)/(1<<30)) + case b >= 1<<20: + return fmt.Sprintf("%.2f MB", float64(b)/(1<<20)) + case b >= 1<<10: + return fmt.Sprintf("%.2f KB", float64(b)/(1<<10)) + default: + return fmt.Sprintf("%d B", b) + } +} + +func truncate(s string, n int) string { + if len([]rune(s)) <= n { + return s + } + return string([]rune(s)[:n-3]) + "..." +} diff --git a/internal/storage/db.go b/internal/storage/db.go new file mode 100644 index 0000000..3644fb0 --- /dev/null +++ b/internal/storage/db.go @@ -0,0 +1,210 @@ +package storage + +import ( + "fmt" + "time" + + "gorm.io/driver/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +type DB struct { + db *gorm.DB +} + +func New(path string) (*DB, error) { + db, err := gorm.Open(sqlite.Open(path), &gorm.Config{ + Logger: logger.Default.LogMode(logger.Silent), + }) + if err != nil { + return nil, fmt.Errorf("open database: %w", err) + } + + if err := db.AutoMigrate(&Alert{}, &PacketStat{}, &CaptureSession{}); err != nil { + return nil, fmt.Errorf("migrate: %w", err) + } + + return &DB{db: db}, nil +} + +// ── Alerts ────────────────────────────────────────────────────────────────── + +func (d *DB) CreateAlert(a *Alert) error { + return d.db.Create(a).Error +} + +func (d *DB) GetAlerts(f AlertFilter) ([]Alert, int64, error) { + q := d.db.Model(&Alert{}) + + if f.Type != "" { + q = q.Where("type = ?", f.Type) + } + if f.Severity != "" { + q = q.Where("severity = ?", f.Severity) + } + if f.SrcIP != "" { + q = q.Where("src_ip = ?", f.SrcIP) + } + if f.DateFrom != nil { + q = q.Where("created_at >= ?", f.DateFrom) + } + if f.DateTo != nil { + q = q.Where("created_at <= ?", f.DateTo) + } + + var total int64 + q.Count(&total) + + if f.PageSize <= 0 { + f.PageSize = 50 + } + if f.Page <= 0 { + f.Page = 1 + } + + var alerts []Alert + err := q.Order("created_at desc"). + Offset((f.Page - 1) * f.PageSize). + Limit(f.PageSize). + Find(&alerts).Error + + return alerts, total, err +} + +func (d *DB) DeleteAlert(id uint) error { + return d.db.Delete(&Alert{}, id).Error +} + +func (d *DB) DeleteAllAlerts() error { + return d.db.Where("1 = 1").Delete(&Alert{}).Error +} + +// ── Stats ──────────────────────────────────────────────────────────────────── + +func (d *DB) CreatePacketStat(s *PacketStat) error { + return d.db.Create(s).Error +} + +type SeverityCount struct { + Severity string + Count int64 +} + +func (d *DB) AlertsBySeverity() ([]SeverityCount, error) { + var result []SeverityCount + err := d.db.Model(&Alert{}). + Select("severity, count(*) as count"). + Group("severity"). + Find(&result).Error + return result, err +} + +type TypeCount struct { + Type string + Count int64 +} + +func (d *DB) AlertsByType() ([]TypeCount, error) { + var result []TypeCount + err := d.db.Model(&Alert{}). + Select("type, count(*) as count"). + Group("type"). + Find(&result).Error + return result, err +} + +type IPCount struct { + SrcIP string + Count int64 +} + +func (d *DB) TopSourceIPs(limit int) ([]IPCount, error) { + var result []IPCount + err := d.db.Model(&Alert{}). + Select("src_ip, count(*) as count"). + Group("src_ip"). + Order("count desc"). + Limit(limit). + Find(&result).Error + return result, err +} + +type TimelinePoint struct { + Hour string + Count int64 +} + +func (d *DB) AlertsTimeline(hours int) ([]TimelinePoint, error) { + since := time.Now().Add(-time.Duration(hours) * time.Hour) + var result []TimelinePoint + err := d.db.Model(&Alert{}). + Select("strftime('%Y-%m-%dT%H:00:00', created_at) as hour, count(*) as count"). + Where("created_at >= ?", since). + Group("hour"). + Order("hour asc"). + Find(&result).Error + return result, err +} + +func (d *DB) TotalAlerts() (int64, error) { + var count int64 + err := d.db.Model(&Alert{}).Count(&count).Error + return count, err +} + +type ProtocolCount struct { + Protocol string + Count int64 + Bytes int64 +} + +func (d *DB) TrafficByProtocol() ([]ProtocolCount, error) { + var result []ProtocolCount + err := d.db.Model(&PacketStat{}). + Select("protocol, count(*) as count, sum(bytes) as bytes"). + Group("protocol"). + Order("count desc"). + Find(&result).Error + return result, err +} + +func (d *DB) GetRecentPacketStats(limit int) ([]PacketStat, error) { + var stats []PacketStat + err := d.db.Order("created_at desc").Limit(limit).Find(&stats).Error + return stats, err +} + +// ── Sessions ───────────────────────────────────────────────────────────────── + +func (d *DB) CreateSession(s *CaptureSession) error { + return d.db.Create(s).Error +} + +func (d *DB) UpdateSession(s *CaptureSession) error { + return d.db.Save(s).Error +} + +func (d *DB) GetActiveSession() (*CaptureSession, error) { + var s CaptureSession + err := d.db.Where("status = ?", "running").First(&s).Error + if err != nil { + return nil, err + } + return &s, nil +} + +func (d *DB) GetLastSession() (*CaptureSession, error) { + var s CaptureSession + err := d.db.Order("created_at desc").First(&s).Error + if err != nil { + return nil, err + } + return &s, nil +} + +func (d *DB) GetAllSessions() ([]CaptureSession, error) { + var sessions []CaptureSession + err := d.db.Order("created_at desc").Limit(20).Find(&sessions).Error + return sessions, err +} diff --git a/internal/storage/models.go b/internal/storage/models.go new file mode 100644 index 0000000..c916ee2 --- /dev/null +++ b/internal/storage/models.go @@ -0,0 +1,64 @@ +package storage + +import "time" + +type Alert struct { + ID uint `gorm:"primaryKey" json:"id"` + CreatedAt time.Time `json:"created_at"` + Type string `gorm:"index" json:"type"` + Severity string `gorm:"index" json:"severity"` + SrcIP string `gorm:"index" json:"src_ip"` + DstIP string `json:"dst_ip"` + SrcPort uint16 `json:"src_port"` + DstPort uint16 `json:"dst_port"` + Protocol string `json:"protocol"` + Description string `json:"description"` + Count int `json:"count"` +} + +type PacketStat struct { + ID uint `gorm:"primaryKey" json:"id"` + CreatedAt time.Time `json:"created_at"` + Protocol string `json:"protocol"` + SrcIP string `json:"src_ip"` + DstIP string `json:"dst_ip"` + Bytes int64 `json:"bytes"` +} + +type CaptureSession struct { + ID uint `gorm:"primaryKey" json:"id"` + CreatedAt time.Time `json:"created_at"` + EndedAt *time.Time `json:"ended_at"` + Source string `json:"source"` + Mode string `json:"mode"` + Status string `json:"status"` + TotalPkts int64 `json:"total_pkts"` + TotalBytes int64 `json:"total_bytes"` +} + +// AlertFilter используется для фильтрации алертов в запросах +type AlertFilter struct { + Type string + Severity string + SrcIP string + DateFrom *time.Time + DateTo *time.Time + Page int + PageSize int +} + +// SeverityOrder возвращает числовой приоритет для сортировки +func SeverityOrder(s string) int { + switch s { + case "critical": + return 4 + case "high": + return 3 + case "medium": + return 2 + case "low": + return 1 + default: + return 0 + } +} diff --git a/nids.db b/nids.db new file mode 100644 index 0000000000000000000000000000000000000000..4a0b4a6588aace84ed6cee939be5e12d242f44a2 GIT binary patch literal 761856 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 z zJ_@N_;Yd$))A4d%bpj!LH~mu8cTFv%@DJ5Z2sz`1qf@-R{6MHDE`?E?sc!ZuInQS$ zU77&->{7T11#PD{9Vch3MZPK;3Hm%V6yG!%IaDgfqZA>8UVLJ%j*+v(ppm1bjD|M3 zETvD!dDXEj&B+KShwfHcisR#q4MrLio%hMK3mg@e;&?b?DKzoM{3Y2r0KpXBO(?hv z{0Ekp#qu)o=iuGLLi!AxR~ZcXVVmj#gY@>gs=8@XaC}xtVJDM57-uM6QQbT-u+5if zUq{z_ZONtOxFXuTzj=E}S9AU+JlUyuQFZfvAu$*zMjJexc9Rz4g6igd0~iEcgp>@% z`ihrCoA(JUWl@|gCh`TgM)9&}^Mnutbx~qP1R&&~+&i=q-UIwaUFeh2h8&dRdl(+m zK}MNlpEK|}w97dt_X>%@6U#Kd;8`pDVrBE5J#Bc!kPsmqI77$vKy~vT0V&815TL^>K zU@x67LzhpXbI#^ntu77R91>g!8!WZe&AW&YUdxFD4RLCh7#21BC|=7+{QsrQCo?l2 zo4FqT|2xy~oW5jwV(L$(o;&rR%6BU7s9ao`WcuF?lk@%R|Kj*3#;+Yene6{JjGfEu zzpe7Y@}2SgUtBt)ct`P;;(=ne@R7pRh5O{cO7FjOa{rn8K<-Jo6SB8we?R;1Y=%Ge z|L!N+auiwmCBh*i&4ovm6hED?pZb=E;>{j4=JS2gB2m#Cqjv=$SlF(1V7W9bj# zq#-mw;X6(B!ylx!vI#}za}q$I@P_&WIML8i!^d>Ym^a!10)!T^4sABsOR8{a=e;_MOF;8I-0x*V8xq`U^BKU_W_kniDndubseEDcsA~-RCcw~JZWN!BxUJd z1p%?@n?1(Oz@o(lt@L#1c@V3|xfxh=0dxGv2)j#E@0d4hjcj>hhuZiF$^`{y>kINr zTHmOh8o-J-9T{hRMp6*DF!f;!eMZO08B4@MWZVRn_lW9pVly&?;Fww$Xn6$cmQhursLC9W+Roatp zq#_IUCyX~?>P#rI!|7(4=qn$Ba+IC1vBbEO#&;_GV?)(9q3+E6z9=(VNt9KOYe4Jq zrep6cu`u)SFLms~7OS?|r|>-H6|ItFN-%Tg)a$Cn8ki%|Wwp)A-0FN*8ZfgEtn;J- z`?tD=d2A4d6fqjMjv&or0x(j+!Mb$sCTmfT4#Chrk$|lA(hL{1w)rT5NjD63F9Y*f zcpR{(hq|%)FV)sIFAX8NMxulyM?i`%>f5sRVQ)S!4EXp_O?oG(yb z$CZR$$uT9aqb}TmR(5@lT5aBfs>!=g{N=>UCKkv4Y5ZN|7mgRk{`c53#_n7G zYWa2Lb4tG`ZIm8Q@4v4V-&(x5I8*p+;T46I{4euc`6uS@miuDv)%5=Vb#^CvD0`pG z?ffy%PrT)LAm8p|{2ze~>f93@)UEB8y`jG4$e?uVie;H3xI_jdi5@yCkoe5{Ol0p8 zZNUopKa@-*q+o>RAljEsf2erNu|i&V96FQ4P`=ZE&I~%g=dW!!cIf03$I3ScN^A$X z?7p*d1XR-bjkXMu$RSCRGk0{jgs{HlNFtw_5k^vtmdTt|29~Mj!lCMx!4^4jB$EpM zPG=yb)LgnY-g0b_ZwJj{_>c|5EC6jTm^6PZ{iqD9)`h3!nv1Op>hsENELh7W#)Q3B`vIU)F z1iXZJb@r5UMN$a0c+0U#-bWAwARtgQ>tNS4L|c$b{`1ayq>sL|y;0^uTAG!uKC9$a z3GpD;$9njkQV0j4tv;#bN9b9YI(xwf(dU%>5G+D^h6Ep&XbVcoP(`me6Vo(U!@!4e zl#=(uK!8ZBPAXW3x-fSdP>xx$pr9ale6^_@f`VW&Y$l;)$P6aESe>L06hxB^#Sz|1 zFlxjFLO2IsT47H>7i02{w7&%F&LO$*srZVz?P*Y7#{{s*b0?%lO3{dGyi*8^HjlK9(YYT1 zx#F#vz%@Z=5?We^d;(DQt?7_h42fkFp?)I*Sn<|WKrCrnPh+W3ZZG+Ym4H}S+@#Pm zwRuF%Plm8ak)^Yrb_D`UtZz+(u*BDE>qq(-Wl@B7pdXP)3v}__pTRB1U`u>pC)V>h3)i%RmIYZw+-pV@d_yR~k zKz=cB%nJA=E_2uae>wAZ$^U;g{QnQ9-#z`<>0_z?f92Gk%1epA>kTv51N z{)_q70eCimgoHMs|8f0XTHugu;z^9}ykQGcSXXIMI#>&>Slze`*6X&u$JdX$jo zSO^3cI4_HJ#0GHre~Y#p8|3?10z;p>Jv^K09T@!T@M~4K90}wjngxQDkSj8X)OZsz z3tz8pIr7KCkUIZl|FM)9g}0uw1?eLRb7`LdIVb?5noM0eDTD*nEywg2LU74T9%QiX zW#;DUmZNwq41Ak8vJ=!fN{NyAS#`@%I|ha@M3T7|T1w`p)h$QqSQv!Q5JNXSOUv=o zcnd1WZ~Ze{4fl$1&xt7%iKC}|@>;azs2uON0g3~?MC*c(TJVre5=W$ABH1DtjcTXb z(!^UPi6ch_(8bV|c6;O1(K@{?W|Nc*{{d z78b2mc}PZ8mg9J=6_Obyr4A!SKI&UNqQ}?|=v-1%M>*EwJoM?FG@~ltkX$Tj`Z?;} z>hnE*ELa3-F077qa6>r4$50m~xiZ6E%N4pJ4)lyauUObMlIg9X0%Fy-9v;FHFiKWN z+Y$Ax^LnqLUoMICE#Qlca0|+3tcT>9r->i*#AvFoZ^a=jd@TYNBV(-vu$H->8A37= zb31ucytTilFONA!IWbbOY>6w>$t?kiIm+3S zkqFv48vLsEdd})Wc&`H*Jg_ShiB2hq%*|_C5AD6ko+Hw$mYw6cji8uXb?Z!18j$1? zm|f6e#*{RLCsw!ig)nHr#nIQ|q%bmXjJNg*hL5BaZkpOYf-E{bZ0*3z&sMkg2$V0~ zT%e?3&~Sdtk?9Bn(fafMJ}&+LUpTXO`j^umn11H;gQk8k)tEXsb+5|TDsQP=P^nCQ zVe+QQb0>aF{r~ePP9q1PF@A9To@0ME_U5rij7^rmP`-&QfM1v1UwTsM9>u>ZzM{BX z_?Ns@#3E-=Yd&EnCQZ{HP&-qy7tPU054~ef7IjUsOy;9<_U4)2u3npg_I7vs#cN&2vWq+;F335cO$%vL68Gxu)MQdR zLp^AvPwq8qq2avFtW81S^LHIf=EY#fp`!uAGY<2gsdk~q6n{#k}eej9DpW(8ON~Rm^I`Em| zOD(ZiwX>N2P~3GSnAfT#0hC*ffVB4TOsrbHYjR+Sg=V?%M@{Tr>%xKgx{7lcz@j*6 zk-L9{6(W_%fC&;V6kgd#flh47uE~HotU0n9(fm*>^TH4;lK~SfCdu!U4zMF)nGBd< zp)2CbDnmqXfh6;bP1$t}n6V)w#7D)3mMgR&OactCm@`3>fJ9%sfV$$YBft!?WV!%+ zp(Y<~v1(oTFM0L6_W(0nxoQ(bg|%3N(+Jzq?QvfQ4B4g9pGi3@ewfv6kM=TPD4CUA z<=+MaVUFj1bc~mAx5=Pn+PMd_pBU-YbxfCWx6Kpko@WeB=nXp&9h2q7m?xepqaqX4JYEb(V_6u~SP)dw7qkaswd*)6ubqb+(rZ;bpztQc#&P_W z_u~o*`IW@nl#`K?gv;0wSKgNk2>czX&QLFxX_@5j6m=bgWr;)0JDXLvwoi*w?Pg4i z0C7lrp5rkOZCAeW)=L8zQeZH@u%K&wQeqSzv$A!gzYhVg9f`P7p{?21G{P0tts6p8 z(363rRefuxF|Mm_y(EM|bvCK0LFa_B`K=fCj2qA0Dp|=iAPqNVpozfNi$Y>Z;~n_> z5H(YLY<25}Aq;w#5O)ijdh%gk5W=98k|NPyqnzTQXzTes43C3>I>?TggYXZn1-JA1 zfEZ#favka@Y5L1Pxw`ed5XJ&c8wqi%rz(w6sctee$u>yRc{3pA++NRhdtm;X=wzxe;s z|L?uiS5H4+>K|SIzhf(3th}mn?&Pl~yOU3yy#K`CP5gfo(fGfQZ{hvlW$X)MH;&Dh ze^CB|@`dG6>9*1}rIU;QM=}8D0PshJYYGp^|8xF5`AhO+xliV<&7GS4Ccgh8vSa@b zI{?I8*fN8$k<@xx=uuhTTmKR1@JG7ctKA-1<|D@iYMw@yxXVLb`V2x|Sx1w3pEXd# zAtOsWbk1sV*Rf;X2oZVVWS&V!8MU>{2+^(et|Q014>nLZ6>vv7XT>zTGdugcjvVub zbHO6pU*4CYdMv4)S?~6#G0!8jkFXWRSfoR!JHQs|<#E?>V}`D%7bTenFZk$EW!m*F z)R=JjezAzf^InYPmSGD~P7miR!LO$D!jbJWUmin2%0>7gIYAl5 z=2yBf?mFVj`@w;dkwsLjscXoDLMq358BlmpXd07ll)V#o9qna7acHTE*EC^BD#v zthfv9<*%)o14+_Xp-+Y~C6=T^JK6iiUB`PF>m!2=w~w(OBVggWIpWJp{8Kwb#Sc{v z+E+5Qo_S}zYg1o)nUX7g(?+XQDE#+Y7wXH16oMsfya~mOvckCQh%ZA~Of#3}W7;k> z70(%Tg|evh)}=|I6*@M|TA`G~ zCsT$)P>vL{pa{tEL}~BDgyO<-+?WML6$W#h2OVUOk~Gupabv!e5@t^9g%D@5oHAET zz31wy-DT0cH~s>auuSBzsoPy+4IT?D!zDrSJ~J|!L$X}(YlmBX@SD4lvGe2ZV(*gj zm?%JSh-t{AUth}x%e=PUUFhv44-{p4?vbH>W+;vM)w17?y7T7B_P8#c+y*)7+WaKFU3>V_2BaAYwQW!Lc>^{I;3XSIoLAa^l0hO|p zlS5)iQ(C(0hVGQYXL|ns2QxDtp1FGFgz4L--!y%I{(oPXx^Zg0@}tUnEjxNKs2{4d5|HoiFa&tvZ%yLhZzzO8&s`Q*|!N^dBgTl`gVt9Y<@kHTLS zURl_i|4F`)e{}vXxi9B#&c(T6_S4M%+n4!O=7UG2_JjXIb=#3izEd^NY%TOo=0lK! zMfux~Me^Oof&pjBtE|0{)Ca6pw;h9IiLuN8=A(2eFCVCGLm&A`Z4rY&6c?v1PfCeF zq;uOOj|79QOrJ2_$|;3W_*ArQl1E@L*$cX4PFLHcFi=OIJWAg(KnQnC5`?xeQxJt0 zM%#V%DD6iHhSbADgN1G?#4yPtfpD3Am^Oh^MQOmcNgg>28m>~C6*^X#pT^scJo4Ex zffp|c6yDGxl!R39N#pI7pJc7|mxlEke8%OR;8tz=2Xa|^Ac?*<#{-0eQSl$U&)hs-WM zWN!Yx^YdrUE}zL4Bx6TP1aw=o)P~Od?sxUBQ~ugltqSbm5u& z_KjdIFbh@2bPPY9i6!|9j&ZW&nqOukkPb5vR@`;WlcjUijeR`Y{;YQ)pzI}b>WJs* z@M&;~j)}6C$RXxw)TDXkO@Q_%J#NUSGPy)lbq_zHEmqX+(^}qp zls;fk(c$zqd?;8g;{eX$7t)NLh?2v{GOZDzELSoSnjD9>iq#hLO>E_2ntobEreW{ZwY_V$HtDRV$Orm+9XlsrMrMIUR zYw+|)UenV;FpL(0eb;7~1@qJ(%&fFc(~0sH%u@m|c=dDxq&2{Bb6YS^4#7yTb*eR$ z*G%*A=oFpH~Gb zgJvWRT4ySyq`;+pLJuPCMhFCf1`c{K=c4eLxO=dtR6hom4LMgjBxxx%`{sK0@d9PA zf@Igq1wE2&lYRJF_i;V3()wj-^tP3`vD(bF#JaBDy*wb5kh<8FIwG0ab=ro=cE$hS zmwAcs|1U`J|L>W)Z0fkm?UgrG9$qO=erEDzlV?r*X5zyW*G`;1{x9S0@hivgJNB)y zcaA-BY^MC#^2^I-mVQk5#uF+vN>i>^+?fOVa5X;WNZaozucY>)Y^L{*%GKEqhP~ zn86SyFzM;0=W3qhq3GK-s9%P`N3W{jm3?!?3t-jqSu{_(DhAhO@r5r>( zR0*}}t1I*QXxp(^UIi_=srFbp!MB1h?$|3|0?9mMq9N_cCf7Hqbv`p6t#9|)E6>V+ za-qE4QHsHcPx+12ZAV{u59pFRpj0*m(+0CYinkqYb)wHqp^k_hhO*9 zu>E%L4Z?(d&dRf*h11D{hU}+vW&omaYi%3S%HM!@p7cS5Roc%yAcTX|PQ zRoDViPlAmh<+6)=Y?Y@H4oM`PhU7I(quaWzZbMla5ow^vs3t>4-xw*~=H_eLjU%3KOZhMovv8t~7e?LKMcQ7ChZ#k|5iSB6Y#DV*Mu%uOnzkC$;P zFMdYOktpo z`-a4zJr%9@bWL#zLY8u$00#W9behzTju+#E5C*075`Iu7xEJHzAq?_m2;dK1Ew3pk zYdJoIfg2#HKp~YDuZXtq)x+?97U`r!rD(8Q7N6ywAu(i175OY7E1Ob??R$hUNFv1( z3Da4qCYlOLaa z*5rv3Uz@m@?EhbmZ;n5H{Ft%NjlF2>^zt3$TgnH@nbJo}SC{TnyuJAP;!5G)3*EvK z3U|qWA^(#6Z0>ux!?`Eq?wbAU?CZ0u%>VmvklY{XzpQUNCd?O=S&-^m%1PF#-y|o>$}3XA-KBTBfmT@>;h&2 z@u4}Yz?50*Gn=?|9PQG@EYAf5&UH*D` zpy-0dGaEefSWk}S@_r!ca4!p5*2&eWO@3*8yH9SVt^I{r$arD{^Z`|xHTO&YL-lRP zZh5(%eJ~`1fyl{H`$d1H1THM>woPw=B@8T+?35i7z>2qRdJ8P<8CclCCJeftwfeSA zZxMram6c{XUTTSs-ZIpMbwsVl@`xnR+P34jyumc&q8B~wdo>IqS8xZAWuiNNfm- zDzqJIBE{Q|5U2fA+&(_Wo_harvfs%>zZ<^E_>iyim#69`$Xm8juMnI;cTjJb53a5HNH?%HHSse+g*v|KM8M3>WnX^jnl>wWD0MKskoX%i#ef ztQ*$MC=o-T9Lr@v@#$Q#`tXuV?8?Lf>)So1%NHg=Dr%9qz6T#r&W+MeGN*-6lG~2% zvc#hG91Q_a4 zJW~KG-iG@!#ljM#QGm|F3_#VlA-@c&d9OU;MBheh6eUZ92D7m^(t8LCj&>>6w;dto zz5S4jBy{4yI{pw?W4sMBW~&QTk&3QPPXMaE?FceUtR;fn*pA8t4`Mln%)*j7*koiP zfE91Ukl9P*=wWw^s(D9|Sz?i#2@z@aK}#G%ILDy?F*f*4H#0Iq%)#l*F%)r_5~qf=o-!F8O^-w zjig~75rW~6(7Z)Y$FpG055bT)OV>!tyw=j-;PN2&Rl{y(#8qMrl24kwU#)LHTwr`o ztB~E)r%^?zlbg+No_S}yeV$->X)CY@pF&Y<7R|C>GoSA9|1TH*|Js?;r|+14=kx{B zV^g1)dg0XRVz;@;j67p1f@GxQW{*-Zb&>iOl#X$6qwQXY7|_?;m^S*aKY$ zfXmBwE&X}vhSHhEe=Y75uP&Zi_*UV~g$oLm{GaDvoj)h{>)Z!&&&)kA`-5yV`hc-k zKnbla-hBTJNwJI9S~gy31S4wAc%}pcs89QxMtrR(JYbSK1K=12OPZX)-muW>OfX->mNR z$SzNq1Po~pg$sVPtEyJp5uVE%vst8h&@8P zoM^}7y1?Oil8o742%k@Ea$RJm&{vQ}B}RIubPI&Zbphe}kP$jkHl_~(uFL<>F7~1| z@I%_OPD8{yj_dNCoLT7}D7ANbyPFqfE#7gImjy+nhOQ2}=yFM%UjDOhLCW^kMP6Ik z=`&xR6T~1;O5mXtl!=sHSF~diU#JGEXfJ*5!|4jqPM`Sl3L#|VJ{lv1g2uJA9mjk5 zMu;vD8~}hvXizjS7o1W;@`j6c`s`O)7?7~ACF4+kr<6)At?xMU%l9TOV7vf ze(LP)@s4A`d1IL--{2F%MQRiQx~q%(eA61ojQ95KJ0w2(Fu%v zEnSbE(hj@VabdpQyFgkLVQxAw>heB1$+DB?rP&361|<|HyHAOEz7@5xJdwDx+A2>= zQ{Cw^V(GgZX^7zw3t9-)ndOSnPM;F+_ieSFn{$>HTG4@EnDKFkln+nkA;Lolv+zY+L;MK5RG4^qe1Ah zW{XURAjltG#$Zy!MM?@z{*(zJqr$j@j`nb^>{P@z^f}MuzQT7f1WN}RQbHVvb|wQt zNNPDHF1o!+3W9Y^gdn8WnROh+HW?2=xbhg>uz>Z+l{_X8-qS(=9gdE1uOqQPEU0Ws zv*^w)?ZCqes_&F~(s&LWeh*((8n%wcMb&nS4$I@^@}97)CCDha+9q$wb z#>a;U45=Gf=mWbt=|3IWk!}A@-a&afasefASlG}(lrjmGG*sf9oB;W}Wq`1|a61xB zq)l)6^U?oh?M>ihy^6a3UZ1ivlWnMfCmF>F()z<~en4 z``7v4hkPXSn>zKJQ>UtaRdv>~0_8mliQ%$E!D0A6~hmvQ~L&<=#_YnR-3(|77`-OaM4I`SZ!n+&_?|0eVQ@0tB<_BGi@WPZXQ{IC2p z)*N5w%jPaYZbGa`<;XZXBiFg+7(1U=C0Nq0MH*H)cL|**ysE~UW9%%kcz(f!kt2g* ze#*+twKYfD`FMK~iMSI*ByIKTRtX@%)A^ghL?)SQN*laVc>u}Lbe2pQ;R6eZHP-4N>1>(E z1~AG{*IJu0owEi6U2Ck#j!#3y64ROQf+B%^l zoSfgA5eU41FM%at^`xeSyLY7Bv=GsnW8l2&fR6wHCVY5Jdcz02ZAZL$ z4Tc+}$8_?XMhKh!ei3UtF1Yr%@9L$L5q_n?b2eL6|b2D8wzDG zF?S*@_I-tNs_l-exVGj9Hm^ASwj>@v(yVeyoXp#5YY=OqmGrf`MDGqIR6Ks5Te3YE z(He}Jp;@N;a9u6oHY@v*!ninEb4;3dkI>$N7`#@Z>m^bU*rox4mJTtO#Ho`9xP}EY zVlA}|pQR7t06s1My}W#6b{njtB4Z}6bSVhiH;dLBMdn=({m?jhvs@L*%}eR^;+3_A zoMB&2;nJ+DU1Y9_{xtgd4B_gHwb-F}DtRcIl=?+Z;c!Oru9LId{fXCB`&eoH2o}bg zS~Gq9X^9fL;u1S-87QEnUl!6W7z{URYme+hr0paS*eBT4aK49$!fW+_7&IM_1!KNq zVADWMt(aoS>{iKdB*sP#Kh2I$khv{dJI545I+1Y-=tK^gYjPa55Cko#4EoX2D^p^e zcW5oL4$vY}a0W@|DX%Ssz*jvK5CV1bO^(y>R9`zA2(MXNWSk>6I+^rg_k?ZNqP4S3 zNodFwW59aUQBE!9SZ(bQeF)F~qI;F!W|YOyE$})?ncE(@_He;?&;vauM)HY*F*^*{ zlc!IHjqc@~@1=VCs+F~a4#&qjQZ0wcK0#RKg~4 zX7%-)y|uo!zb}zTJ7nchFjesS0Q)4W{%?u@mop!g`F~gMIceteGdIudpZ?+WyQd#J zJz4!o_1fx#Dt}XX18@KR>(uX0J$dS`OHUy7|NO))6Y)f$ z_|f7^iw6q-TG%W+t#I%B7xJ&nujDhit=w~&|NqVGJF<_-R{3N9gFlU?W7X1e>b`@s zxD(>PCP@;lhJ<=6H`kkvUQ6>n11zD07j!76v4$U+87$2{#g_6P`!EbyhicIjg$45f z{|D~F$n#tH7s?!1Fpgt07A3PTF-Sg7%eG{&}cetEo~PZf}CX@G8%ftnFf=?Vyrv(0|7)-*`BJ_gxBo=ekaCMCzco?mMY zNVnZrn#0&9{cLlIa*Y(mfe=`Ofe-<=uxW5`ptvSCYM>ddInr%Pkb14@I5_XAq5B&rivCNTx=le4F*gU~ zn`fuVBj;}ZL-6F0JZn1k&3kh&y9?KnDqfvrP04XIZaUH}%|)OMMs7)uF|GaTHcadb zZTIVqrX$|Geh^TyN1#WQzinQGV)FM<#f@?Rigy?#iU>WMdg&>uZ7(ojwQMLbDf##9|nX)CDOc8(iXx0$9v4rcl5nJ9aIxvG&3c z7Dfg#$BF_{Sl5TJ#8IF{RQVghHNGH(Mau{$Xh`ab>VsI%4`GqdrLM~gu2XA#UI>eL zkP1hA!35>H&X2Wx5UPmbx>9j6R&Sv2sn>?E=-!fEjq&VrW9^y{7Pl9U+X5xp8L;yY38*vXHWlh`nKsyr|(q#pfd0XY&N@?m3r=C0Y!17nhuP@h# z|35hS6jw}OXkw>60CMBf>@40vapDj zrF(NsW72d?l8Hs-CK>+m4sE^ZC?#($0CtQS|Af1`-d3-1=)OpT16oNET6w)f&lftN<-Gpa4-%~Nim+B9E zT-I~DQvk=}rem4BZY;A9CC!cZsV+|QQ11IsEPxsiO_=H}lfrWBlZAz0XPB-|zXY+Mp`=35uO{iF zpi5aDE)%Qxow(@;Deu>#%9ZoZsUPp_HJU<9`NaYXACb7-s!-jfuDA(1^wIzYKW2-D}K|@M)k~;l~WoffkkDHFLvY<#Skk!-I znGMxwI@Zcsp-l0YVg4hV6j))S*=MbMdkbw*^31d9;|AW%eW49O?K58Wm~L>bxhz;- z(?ETTn>;{M$7qcy+aUMbl3*Ar7aE$b5}k^*RUS7NLr}b=#HFO~e;caNTnK21st&T$ zi8ig^*P9PvEm0Sh>^BKw&4sY!xdYmg26jEk%<`0lE>6lmHEzxdR=Vok9cSoj9*3aR zssHr^i|m?IB}ua%O;cnXabcL?y_D(3%`-z#ln2XH$H7KOLhWOW4%-5UijK{FnQo)G zH?%^WFS5vErR2npo)IuuLdEbA)g@>uo*Yy2VF9t^)fn2@hsru$hFI)b4+|B#SaL>1hI`nB?aSgXy`MDvDNC`%@OjV0A;^VATM zPHkogqWJjQ`haHgLtt#FHaO0x<7i!YCjU(= zhL!Xk7kh9eweWLz2!HRMd_tB6JiER%PG&2a%>go5g* z*VYFllXoeEEb^MT=1)9JiPmA6OpU@YQRu4UTQ7uTm%M=>bH5}x#?!hX+U|+9bw?_B zwQaBSEOASa?>_bX<|O5+=t>S$0Sng*Vrljw7-#aARB(Q$QPqZ$wQ; z4jD_q5W61!kn4;#94BN!%uC{Rr$b0wl9V>ii<*uKvLGnHnP=X6=({3?qks$uA%$f& zLdXKv_ck5#Gd=A&@pLi}?8+w@oRiu`7n~h89lhiAE*Ley-{jGHP083ddE9jDjs=DP zgbua%HdNGfkAg6z9D|KHxY1s@;hnpcFd@U~`2 zDk)DVpsq&q@(>n`FXgw|YYJekHjkOXBdQl>V9YQyZa!6{@)|CXxbqo@t!u&Tk63R$ z1t?Fi0EP=FDLSJ3Vz3|VqOeBu$pJl)Zf0sEFK>;!kbs^V&7&bK`YI{-*KTGI>q#Lj zNqS-(ltU22x-5jn?aXWx9oGc0E)8MHltr1dFqXdh@&D^Gdp@$~#e0@#em1i{^URsk zrvGmGccza{-@E#i>RYRit`;hPSh=Qh%G6&^y2-#+=+$rDPS zE4`u=P5jHm`ot9zCl>#*_^RT=>HdFz;nKpL@}JDVIKMad?cA-z|M_e$`>gE!GhfcU z&Kv&6>yEMVZOplOo{(R39PBtQ!v*oWBd#ncoDa&V#`HecA+Y?%MWmw2oUlbtld+FW zV|_qnrGq(v;^dLY({7asRlY4=hs(0XA`F5f)-kS$RbO3))ADDyL@c6q-ZdQSYL3?( zqh+X_l)`EH(mXHqc-`??mQ*O6H{SFho{&@~oh4E& zOZfzYpGGIogkp<2I?IwuI*euH${0}f#yV`4pBWRWc;k<8vSZz)*>mG{M`u}LEiz1# ztnOH1#p@=UC1R0+r94MxVMEF?*(`ygGnH3ZwL@e=vD;y@%-t?Y87kG4O}CNab;o5H zs)8nEf&>@y7+>(b#=1#mvA+Jesf3X+cYCf;Uw2fNuM$D9c;FgKstuOL8U}LNd&lc0 zn*qlwX)u4vpn4&KoQ*# zb}?>a2TIGalQqC140tS$adCq#C2L`+D6t_(B0Cz(7b+tV#z0D?b-T?_!#mO(jn^G} za zyYoqR{^6p=x?`ezJyak_N%0~jZc3Yp@2Pk13#xHcCbpalfKzrD$`F9LxuaSU!`=5}9D+S}IiZ6@ofNzMZ#f z!A_iq4=k{;{=k5;2ril4%{w-uofN=|*B{WwN}C>8A^wBZVqY zl^%xVC@`EFHt3EAk)*1VBRN*r?z6vV_6yV-U z7S%9i!}GWQi_!Xh1jcuCQ4%{-`mc1S$M9Eo4j!lf9xpoBYh=O_PhI@0Wh7^qA7*#78Esn>e-jwc?wKhYPiOE2GO;Qyo5-^Wt@r>Hauv<5nSFa&5Pi8(b8O_Zqg8xSGHNo~mj=>j2hsb6OZK{;y6kcu&` z6kaE4@l7an<(MrKil~EbqA@pvBepCk#^m5E3`-Nl2Q;NZ?T**7pg7A*)Xt6h1);Sh z4o!zcsGWJWIAh~=10$8mYYCK4`$T->7#Y+qyp}f%6)2&Ep882PV|nE9*~m+sc>eb+c@=JcN* zf}%a1x`eT=It=Bb15i{z5lSb*adU-8btD8OnIq^TrSA~bc_AnsWyZJHjTa%PbAwQ@ zVNCcQQ|*rmK?&hEn`p=kN!18J;i@p&LuYSoD2e}FUd> z^Oe7^{AT4M`u{&Xb?ww?<*$|BSUytDO@4Ipg)aVof9Y81q=_$2ylx_9_P^Bs&lY}I zcu(QUg_H81$={S;%zZ!i+quW)%2fZqA{%A?jX(C^{8`yBNgx;~o(!bQGBM;?8;apE zt*>nKNg&T1Av_kjIXpg#HQhmpHcb8p6pS6!=2XCrjMnfscg)0j(T3xHe8x&3xMAjS z%+wz9L72RcKoEUUA{k^V>hXr-eSDr65W;58Qi7qJI<3^i{sPMJKR&2A^2v0sk((a6 z<>4In>W1Ti(sQSwk|Z@v_b5!oz$)y5N+!AE4Mzugy$f>6AdxE{E5>Gh&_afLNJ^Gu z5Al%Zw-V~nb{#1AAwNsO`Uv#!4RqU~sr1Ut=WjTA=+McY8=Y~yoC>L<9;xc8EBDVH zJcxt#)PqZx?_WB2IWf+`#mg7>Uv<^&{K11)9eY}|;YcFi#zZ*k%Q+&v{u9{S^=QL! zLtY5iI3Qz~74^GwDt7*%zPbS?WO&fb_ho1DsI1zTrm`=qZ9ob6n>^=uB90R;gCo@y zlR9XntLq!W1^H7?j2z*IC~D|g1X52Mjt27Th4Hu)C{bmoL-UjQ5rAr=w z4z1>Byy1u+??Gk4E*%I`m8;w&bNlh39rNRrW_hn9WpM>`Oqf~_XTh;PhBU&JQe30& zT3ecx4afd?({fAhDKdGKL&eP+YA6{ugd>0q6v^p0k94&Ey(qPf0SDyq0-58_cOnZD zH1CBQqm2Ox1s!4(}n zyy3VYA9pz?FB6~?;nw@A4RM!;HXwuyik`=v0NS4@ogaSOk$s6b93AA{cD#+tS7u=E zcp1}Z!=!~+75NA9+X?zJCC!n>hNFeNpNSklCYQ%#bZw{kWNG%6#s>6|pX4XwzMski z9y%Sq{}Aje$iDUP#t9DVL7p857Pj*Ma~#wT9Llx(A=P-}PJN-gKwO@jD+Yb~4^_gp z?~gb32$c6qUw|5wAfKRU1f>`S<_xIQitU*RLGhZVP?Jh38)|i9+Ptrjil+y-WRydg zSko?{sv)5k8DvUut%Ne6E{HcOA*cni-AM{31T__cqAF7eAw_wZP-wjzg2HE|MQAt! z;5a$SjmZ#{43eT+P3;9!stZ;(N`Vh3Bj50&)J`{%Sl>iIC?1_7piR6o6@n^;ptxNR zFot6+tv5CbeJIaO0EM~_iinDxakf?YeXAS!kgg=>%7Zzh6Bt@xF0?=x`2!1c+EWZc zWkXOriAd{`E_bk@8XFmbGKgJ5Dmr-0P%{CWxp{T{rjV{&$ES9062G1_4C^b)yps=T&RuVkk_ z#00=o%70saXZiecaq@Ov064AmOoL>A!@h!zwDgf3CR}}7<|7`x( z@@M6Kl6zn73AyR)$FkRF7c$?={N}jfe`CWjMLy;8Gy@JCQ^yij{K}#y(~Kva5^tDP zkzi4;!DE|4ha+riq76qC`CMIrk|+zNA>?>t7@&y!VV^+ExuP`g$go=*#g$78Vn+XJv%f$ovJcq78^5f67|cNCyU0x4IKJKu+pyW#=#xaASyZBNru@(sGE7qi-D8ofPZe2MLKa|^$6TW$jI1@n7|5gqBX~_% zdXdX9Mi!R1we%>AV`&5n%E*5gioO`Nynu@}o?NRNCTS#Cv)ro;C>*IPv8?1>xB+S8 z4+21PZzxa^qIQ=JRo`%|k*{3JLCI_@5m?-78#{YVwBZONub%;yc-F!#jJD%&?~HOAD;tg|@@25*sY@iKHpU*pTZzphM*SZs z_$xY08^-PYx#itMp>LFN9{%R&P(>SO1t6%VCw!)KFmNtOygx!9e4~)ryJY2P_DgiBTLvfd z*~1$T7w5`ryMQ8b^70@H>af|BuFv{>SMr$bzEylc(vlF3s;!KfDQVbiOw)EmF}>pP2e#12r}sb>#JN z0OH-)g;|K*k)<&Y0kP_)qmT?NJV2%$j@R)gSa3;3BtR2_FtYd+HUC$<-?0mbC;3eguqCPSHYLNXv% zyy-Y5W1mU~C?8T=v(WZ(T$80PMq3}+z=~L~O-AZLo}rZJJX^_~|%v@k|H8vgNWXQ$s&jOcp#bN*}-ZUvEtRUGeP7j@nBYh=4oxbSm z@uo>R2^1|h)QIbsBW$SEO(-XSHHkn`1dp8`Yn#TKCgUVX?0ER5vC5U}tD7)R{svru zBAZMNwLUzSdjXPToV?zkAkkaQuncu$1dtrzWFSc-LSyilGC975D298IU=rcEgRyO-olP`({h;z)O zX+0`HpFOsTJXJkM6bZ>>xZt1&GfPFGI&~T)acl_M9LwZQ9`NV5mnmD(JfVi#5omSe zW#%_qrU-%Y^H6)r`?eHxQ)A<$g5>p_LBa`N0B)SKn|)5S@e;xEhJnj_g-(!QQmJXU zo}Do8SYzXcfH*Faq>*1m{R!=A`<7W>*?6&Fc~#BB;7mQ{f%EiFO=Qv)eEIP%%V;fgryJ~(Z=-wA*8Gp>Ok9#6a;(t1p?t4=TDN5 zS`(R?H=J#iEDqW|&cC+t{Ju0E&uful4EfGv(E=)&xFgzlp1C4081g9t*VPX8t>`*| z@Ono;NS!gAnQFV4dj;iO8-gNEXV}wN8AhP42|;nf=@eC+DM?OM?_kRRo*U4SJo8C9 zUyoJt>F7BDX~+zc5}DUQMMy`_4ngh1Por#KxoRP(XN91|gJIOO`uH}~>c%ro*8|d5 z;;(r}Pd~N18X0D!j(DXk~ zZ%kh~ePZ=X)i*K!Z>sXi%8M(@Q~xma{;5l+?o|Hc@~@W9p8Un+_T)8_4=H`SbSrNF z?h&SIS zj|?n^0n^E-cS!&%-gFF-&+3R=Jfp(v6*^;@*c*xSUE6dll5bG>0uM;@#L+zYK@}>d z6n$MU-gFd_R~#^Swi%K|J24hoObd zBCKx0Ao;@zL0MYhMPdC)t1VA`(=kXsqD_z>xS74JKbqbEL#^-qS$)%yM;45DCQIg9 zuS1yViL0BAK=S#?A`Ok`^5U7wf>_=gk%=RbOeAVvB&9q0WC0|{Az4UFp@SJ6%Xe>V z3Wemgqq4eLvMG=^Y8z=?CqAJZT*o8%Y%*B#Y{delgX*FPVAVGVgi_jT5iBekZMDNq zxw|r9`0+}gX>1M{B|i+2AY&oND(|n{9Bn#E$!jJN2}g=VimtC5im~G`V2f&Jia8b_#=O~@v^1rG+^TJt5>$qK;+wo1;@v+jP{DcO^jJUP=lf zSy0P_DwHf6yCrcj*uo2a>zbx(MJie|m=Hb| z8(6Px&I^>GB%xdx)e;QBvOj2S&h?MEX9LTmPN^bf&iEK7YT^gc=BykkuRJ_02a8P7 zP94tFXP>wu-aOOP&Ma>+6AVC0j&t|aS2p)LC{N~S0Vupz*~i8=8;XXG&oFfinMg|y z1?Iu*LH483=EM3Jo=*-2EEC0fL3aJT+UDsYF-VIq<4lEgTX=YF^PwROK96MgLWz*< zn;V-C5scG44KFB_I?A!wkM;z`Kd8H=Wd{F<7ra$Za zei@X7nPP^;=;);WXnpVIDdykgWgMB11_?j-to^_Fz`);>_YR11gBdyu&;ta*cZVV% z0E}%*son*@cshjGm8Snj^YzqlhhKh+!^;X7bZ_>ODzFi%_FJO%8WPf8(0{n zc*H*(*bziRg2cl5@&Bua@Be*a<_$CF&Sa)L)7MO&;->#MD!;63R<5j^$o#+8P8}-$ ztbAMf((<0kPtgB=dg=cw{buQs(p@J$Kk@pBdhy?i+r?)UPb+-AaBJb>!XE1XUztCU z`%&(9a*xaH$$mEbn(SHh|Nm*`RlB+UsO5Mk?^R6iG8>GFQ0+XYbn=9~Ek`%`Hub`O zDF?%T?Yu1OHdxD%O5VT8jwA)l&{`dirv7Fz?TaVAzf>JZ4covagI4M1d)wM1&oeghrc-zy*_FbSY6>9ma2YvOz39SsO0kN3zs_E;!RhAzraEva;Fyy+Mt zuQ*F?cs&VAs}wsaPPFL=Bd>;ehaQ(t94)1vlsF`0V2dP)?9nhR3(h%bYp{QJP1Z=h zzkKBICZv&n5H-WB=;Nky5Aw3VX_D?uaz;nAX>vyZ(FrOffKIljR@JC&I_}78N2x}} z)gt?^%|!}g;*Q#;Ng9zi#h)eyTGG8QDUAH5Ynubo$g^J-IMRe;yfLp#O$wv%^4g|j zjf}NWfXhowxSXTIn8L`uIo>qsBGw|sAq*YTCNHti60SmH)6qpqIpWB|l3N&$NU14^<(MM_ONMGt)S=(03t~Cy$ik9S z0dc6#Xb=nT$jDSuH%}mf&#s382eDv}Y%JQ8a6&B`zw0~3n@<-k??sPX%Oua4CZ=xZ z#P9FgURQ_2;Ta$NK4LAfpuV97{k#+Z*4)yOG47Q#Z~lCvCdw?~^#6)fZP z!KWRNG@&}tzR&lRkT~@8kj>C`FQ}#`hp>3bR7PKnx3t>k(f-oB_kz6DL}|ltpp_WW z)Y39PZfrg&BoCI85ez!)2&^sMysYm9_~pUJqHT2CLw9L^Xy0pIgX#aax{_s4O3 zqM26{h*_zHQ;PN|C*FL5NMTqcCI~G`ji15@S)@w>dZr$S>F^7h^bF{^vHAEA78xm` zyRps5+4zczKr)ZNQ}S$=i7KKXC(|1X%FEB!<1w$f##6PW?{`iXOj|3MDm zdGr8$yYTkHd4*hlJO8Zw{c?YudqeKr++_A6*&DKFW`4*Y{IC8*Eys!ZYy!jYNta66 zM9-{E?TvcWa(tK<0-sFYHKUAFT~;ZGV{yyTU_PgLiP;&FYF$nwqD|G`5Vaf~=9Pv? z?F2~#13~YO{KJ3+OP{zU<`iRaWvanAr}z4(eh8qCjGic~T*JHcg`NNh*Ph8aRh3XX0Sox`%B8ZF0)`D#58ie43&4yLX6FtfH# z3LUjynR!>e)n~^%%q3Vv8H_R@dpp`x`pgb@LitCBTaFp?jVu!wl1DO%UBT?*6l0la zG1KzoUR`TBUd$KP0VFkvVu@7dXeh&uFOa#d-g1PPk46;?;nt`SP{R1u#B(|=$B7xD zuq5JbQsg7mq(r&j>*E$&n4jF>qcCTe4nz!5A0rw4@2=K7+;W_lPsIWS3?o^G_ACjt zE0NH0jF``w0VFy0Ib!(ZShE2gmbR@x2qg=1u4_Y5s^L61Hq3WfEHb%L@_PFr&PUqS zA1QG*u&o1D%p(oSY9YJ{OVyR1mZshkQp}s$UBr5_=V-GULfEO@TFdcbzAXccT%x#X zI#-#Jq;TV*7JQh$$`}mE^N>hTdPzZ`j{yzl(Z{kwkQe3EMUjSBZNY;1?cO5UIQce- zN6!vGjZrT_bMCII<|$Fjq{l#F1|j8fkYuCpoE9c-IeN^;5H6BJBh@2$*TF$d?)=?{ zsMZ<~XK9ZfDEjgs6T;IOC+;}Zf;lrj5MvrRh+=|63)t+ZYgOnsUztjFytHIQq(} z*IM`LFUhl|fTE{Tn(sr_C-c5TtrN{HmDKH;Kx%vwxI6d#P27Rv(mbI|6_TTLy-XEq^!)`@MG=&;!5jop!lt`lp?wu z`ryRb#yM);wf~_!W)V+WGBC^d@}qA)6kx}-xVYB3i}|f_v}qz?{$cRm%e*~q-PzPG z-kZ1;^zN&VZEN>X>jZP#&@L~I4k`V>g4i~9>I>ufKGdYh7z=rEXavFa?tf1$d!*Ld zV=BjuYL|;E=r2*M)tV6upQ&HK$zi|HqBV@P!lpiIP4~q~e{P^8CdPjYhmaEgAIQ8% z;{O}=EYJLOW_{-Jnfp!ui4Vfsa{)saOJC&TU`d=Q&X>)+E@Nj`S;4l z%J-f8`sCXtA2T^!`grMur3GdHtW7*);=#pl7k{I8q&QXhMB!HokI4Vud?$Z({^ZYvR524xCH80;zT-@OYZwRYW}1eJyy8#`D$wV|I224gb6#}D zZTO2jwh-+=1d5Be+jR61gpZsZmTid`rsc@2HCm1jG@xV{v0Ps&r9H$-1+>|(pVNXD z^tlI!MM(r(2P35JE~VPh+M<>t2EF^Q-)<_|Folv*4_AdF1k<4aazL+31`7fx6lG;@ zi&~Bd^ojwm?s^vK5ePpZ`n6_lQ9@05O;}sa*@7J~CgAT8{ejN&=qAqLaMc)$ACfE*HDF_)A{7y?B}tf>%*$6>ea6qX_lO9j-hkt+A_9fA+tN6`&%3Zi z=N41$7xb*ptF;`>=l#+^P`3|rp?lp^x+%OeYB_$-5JTqR)7uhE?&De;w4T$i6gLr6 z1W9#lrla)?DHxVYm;oam*l&2lj?MEbgHh;GdqLTE$Q#c7AZ|Gp&uc94@Y(i4fU6ML zjy~g-Bk>FSHNk~ z*L4D^%~G$oguU~4!+i*XjRj@~46LQ?4j*bk+!;3j75+3+F}6e5+>{{4qSk<}+wEZ? z2nb|5a6Pmqn}T31eYVbLo=A(cTPP{eg{(fMX3wg%AnN>X(Ci?eEhXclZwY*1BEB*t&WabjNh6fh=f-<^tU&nEk3cXEfWDCV;cc|r zi%J*?pdKSoX&d9Dp%x0KgZk%@G>Ko=zFmE9>mq^jC5DhnUfqV|9p(=uF;s6|$S-(o z0e_pkrE^ht8X|35u(x%A`FF`%ihIg?1A`^>6H@2PFL<{C-VF(0$nkJ}@Jj2^0+IG( z5uNvSNJvqptqqWOD>Pb19Ey*EqSpY&1U_45Uo=YMLsV|w+d9wGf^)YdWEgsVXyIW| z>s(U{WJ%FJpG&7V()+N{dXyc9G8#94nFiLDV`NSPHenP&f&SD-9%hPX}K7YDe{Y3Re)uqZ$ zE9;f3D<@5TVd~XWweru)Yvs$!_niFft?l?TpF0T#**d~h z>b6JXr1nASIrX*>XC51g9N0+iEh=z_j+<>GqqaetIT(qg@OXkm#<95VXtVT9;UGv! z$??*K$q56MxG7fK&}V*cg+(!He3`cv)D37O#cju)Swivp12ez$L^&I((H0iXlZ5WC z4@$$$#T|VubMxH&la02c($Wd-J{Au{6Si8{Lqfz8PFZa`O3hj#r4Hfzhug4hzNwl{TQd47;YEiQ=(sjx zfz(ct;pVxSv4m>09oc4KG1GuI%ymQ>R2HP0tt?=mXLVc|#B%hTB^Q|;nJ;WOp$XN= zM|8}bg~ihpI1LG3AC`1^zw@q>BZJ^w+K!?#wyDGoNT%=age-}D8n>b9q<>-eJ?{1c z!~ofZaVyB%j9sXlJQ>iHrbx4Xz@=M zNgs*fe&Tj2T?LRF%V!`_AwWMb=4P}!6KSOl*C)wn?=i&v!D#8cw%!UuPlh=&ZD>AI zN6f}uk}(J>z%=EF+t7WcS&;I0T5l8ss^v+1L)qqz?KAch9jVmDC3-RgSoOAJ{VX+6 zt0hK8?I(>j)YD0~L~VodV+RmXN`?+!QElh`5~3=hsoRA3jm)h zy`pqr;$J7)WB?vg{BH3#ix(893!f?6SeVcMeg1dzPbCNNqufVwH{|wZf0o_IUX{If z<}WjE@Ff9iZAYN_Vqs`v=2%mA7N%AT3y0f|IP;kU!4P(o>d(Pd5;6yI+wo@UM<4bd z1jyx@n4P4)k98+yTB~ixpZTs^ps?D)=IO>(3+g#h+hox|!Y`rEinMNM)707n7A=C>OhAtq+k*GbO(bAb5AjsrlE$8$(N{Mmwj5aLV zg`Qk8Ur63Q5v>lxdY95|JF3igT=@4TTSJr5aBKJtz)} zX|iGb0=^Mhz8xyd|2LzyuwmX)4us@9sb2~bxa7QG!od!R)Y$%m{M%x`$i8bA zKZU`EcGQ^95C{ZUuXGxyeV2kby4r>k^Jgddm&Fic098K>`J9gF5YIg}?!uipYM$pp@D_77|A0ej~85@5(f zbyU=boCjvBwGH}=(+38$6&-qds$XjDxlGg^&}W`cfr|!7fE>f%&wnSzZO5Lat7s8J z;zu?Wxrf2|OL}=JPO)vUXbuW~lA0GP5CWRLc%@yJbLTaV{dkM?g-*Zgy){(O6;XS| zx_)>Z5#ojF1KxZJ2m<|bj%fg>E0VyED`@2WE-=)el1lhWiZByH>*AGm4Fl(mym-uw zm`fs^fr4#HX{8;RnvwoEK;+Th(VBdksjsvTnJARuxJM%sB}HD8TKnw2em&bC6seA< zwj-q9!i{IQ&$1%x`8g@3lTp~C)eOJwjv2z*Kf*1=!#)Ba`k14UOF`(RB+XFVez-t+ zFOES;5Y@F~S^KDcu&)}=iNvYHIP(6fekdumuw#w(f&Rig+NHQi8pD>kd`7x47nZ%t zN_)RtuD)y;kK_qWu*8}4Lk%U%o)NeAi9|l97ZgG_-gF}v9Kl#uSmw=9dpV#VDI3J_ zg*&3+_L4yOEEdc)X(}3kcOE4OTdcUfXe|sVxyopS8J=>npXS0gB>vx*c~fT3hxfc_ z&*IFFXWl#Wl$n#JzcT%X>DB7LS8uOgUp>9@&B~i9kFHdv{uKWI5#>9|o$|HiGbX<^ z`S!^pliAXTO4pT6o%s61TP9W~3dIik2ccqGws}Kg_k!v1I8?E{{@2nRnFU3BMCCE zSm`**%;!%D7KQZ7)T}GZ?fdri)edyogO8yCw+`i&{K?oNW6n!rH@xTP-a4OrLSxOl2Cd)Znz$Gpv?Sf z50IE`#BCe?`t?S~QDxrki~~&Gg&rTBmNXSqe&1>bs>~l*BMuKE@}#Y%xJ)QE0Bo6! zMCmpx#yDRM`|n6IV*}u@;aM{WYMc%5$PVNgyV8@2V|n7ClR#7cpEX9J-sv-FKKn>c z8E=Fvx9-XCosrDD8y&}<`4U!$Bdy+)E9;eMn1t#xZ(i*<0?n5*0E-$VnJKB_V#!!z z*OsYbrHVuWbF(=f&AYh?g>bfLH_?rj>X(x>CqOwm&HL%3v77~Bo5$G&^;!p7O%963 z#1UQLnaD<0Ik1$O%)Bk?IA+ajtosof#i!boq%e-wIs;nGD~4qADEicXe+r_oSnCL{ z=3j~%9RxGSyJVvcox;exC+;{>&HIs<8H7^|XRqB*`y(CdWaLnIwE~evRJ1^LF(6I- zP#ZSQKpp1J= zv{|R8SF%)8Xpb(ftFGKXd+^}?tFAb>csc*H?~0|_gI6(>?5e9~=MNsd>e$Ox+bK9vj0t!`gD4}A)s(z6PK_3BL z53#&vsM8-jZog0_4f5Zd6OkTNp!&TKSO8L&X%mUU(lDx z^YLj?;MG-1!u6@NBzktO{rtXq(l&w#-1GRCm@6HPr___VrPh940E0yl^oDy-vdyS{ zT_3}$e3I!5Z--9eILtVkV5=zb%hUqbH`iG-dJltCxk&JR!U7m#zs=H&kkacEM(J# zuA}T<^y7c#{|oY?v)bn@b{~-T# zrvH5@_uAZ{>_2BekbP?Q?wQY|=l|C_jy3aLtTH-|6fC;XrX{7(!owRK$CmkAP%va* z6SZ2p%r4=)XzwHQj<^F~=HGJSj^kS|!pkW8WMb9podIu_K8OMZQN(Spp?q8JZq-J| z5ogBgB*tUY>48V4MA@ad;|Mh0fns==Oy{RnPhWH<7S5F;(hMkZuHbJqFC%NFb22?e z2`C6PL+4ETz!4=iqED46)yv`zjGDg&kOfLI1GBCShE{n3wJ>?O;~2G5ADFgZK=BL= zSqM7a`!`kc`ot_jMF9raU8yyA-mD(4_ z_PJ`E0qf=w1sJrvK=MMZDkVy8`A`Si%?Lj5+vI!mGg3?n;^L?S+hznGJiH-w{&Kzp z5PV`swRsPKd%FX3JU1*C@qS`zD>{y7^B!fY8YsYno6^2kY9*wC9LwglEUs@>x@&a1 zh`DKVcd2z?+l(lcXWF@`_Dd;#Kr5MB4|O2ijBi89w4BF8uR?l7wT|Q2yoz0x(2{}V ziDyDn5Qo25>kJ4s&n^Q43&&9&1_<7dQ}{`(;}|we4zxj;yiV1m?|W7$>s1g?C7glQHnTPj#u-V6riMH3-zjPZ*CT@5XY~1x2`}D zW^f6HR#so>I9|;c9LDR0DTU<)cD2((P^X2U z2>uxDIM%Jfc0X01ylyfKG86H5?RHq5@v3WI}Z+tMK_sDb{$7qY^(=`prCwt zJrcN%L zCqmBSyu(@RI`S;-w>StXSD_1BGsDBHbSGa1U(tm%^Z6|fgNAe%5Ap+}ua&~c+!}Qq zW0v+1`WVhj4;T8?E@^l4`!S;uyD_%cS(7DLn(HS3Z)znVKxLwLYV{+%*NC@ z118L)T8bR;$jLSi?T6Q#<(O*uZ@xKGkAkpm&l|L zaGUz%m&b{g(PE5qq)~l1M{c(vOc>Q8hdYk_^3nDJCFL!16uI<|t3a7urX7>}0*G*j z7Ko+b)J#Ghllx+Z7N3TkGG6M)3Z*qu?+Ewhu|E4{zSt~7YY=1Dk!D+;s3W|Wm$wxd zsfwT-QeC2HNg5r;d8LmJlE7492cQ0Yjpw5dW%%dR$jp1OPGYI{vp-0AaQ zzVpDd3DA@%TPLbCNE)d@1ByU{dL@@D6odNSWy{XnY)|Y1Y&C3>|D;6Ju`$0pc zc47WihdNKSlBQtHvUSJ`gagubEYziWKW555u(~tjWXZ~^K4`!~OdC>GXr{6XG zgz39gzfgUBwNWiqK2f=;^6;rUraDvCOg*gpz4GstpHe<)@+*_SK6&BfOzAVF8%qb7 z0MKFrfYboIuXwC@kHQxVZz>$l|03VZzaan6+~4Nj;-&!pY4%mwhiC4{bV6}{_l0j1)v-2PEuJ z)OAFkFDOGAnVLtxOOS&)TI(7FpOc0+V|ddy(fXNI%8gOi5qw@TXyIW+Y;j$Bo5CPA z91wdRy*d_ODy4NEFAWiQh1c`kHmn4u9Q(zC9lDgyen_Cvb=+S1HYI=%#vH>;li=V& zKF)0#cj5T_V#ym45coK{+SN71LP-YM=ft93f=0jaROw5j?ttt|>ltaJ6ohi?;2T;O z$6d$urOP*+6ci6JYy;9{bOcOmMq0#ieg>4({>vmhWu|SYs5_wiybELcATKa6wtFO1 zdILpW7(ZW7!op}($Kua&eT99DuA}_Y*Rg{j83#n-Wfk)}eoNFHFn^u}@pKyr8fi8U z-lb7@K>Yb3+`GE89)@&M>l(bDTM(WzxEX@R3r z*YSM@1V!un$f)Z*m;So7?ttgpee1cEQ2fmRe`ZJrR>Hf7T}SkJb4PT;k|5;`9{naz zN{qs5YF$V3Ss3DGQP&mPWreRcx{l;a$G&bYOqiqV3U_$47V`?pyrR~1ET18dyj70J zHmp?gex1y>qb}^8kyDfL3_^G4TD7!V-WPQt^~}RJOWmAMgvzR;li7BmlPf#T5qDk;s!OB{7dGm6YjKR7 zg(0ap>P~zP*c?}WYg?9oarVWK`Y*WX=8DhxX046aV2!56;YTXC+ zPm9Nx@sy8@ZJww0XJi0U>d5~}t^0rw1_qI`e4VgLVPw92sC$2ZyoVt|4#|X*$_t2r zHtrXaLI&MaG8h(Tn=dxyd6;nrIB-XRQJacKWw2E6dcweGz_7|fR$DhEQER1sI&VUq8Ehcau?|M;Eu5rxXI~ zIPY-xZX!cEr{)d{J`g6ILZJ}^4yV-bp(P#hWzgwe&Bc(4WiiqUdK{hJ#ndS^WeY?R zGPz_VOG>AiTl?|<2m0^-?VtI{Oq2Kjg#W)~I-V|6KU#fR^D1 zZz}6Il3^N7&~wf2rhF*(3#cg!!KBm zwoIZB6lq0V#IFdM+heuvfGG6n0|@D{lt<|T`k)lB>zKmyPzz#p0&H={nJqK0w#gLp z?uzuNJ0J|xMn;BONDVm6Pa)%fEbhV=`a^Uepb+*+BfDCW=}r@(JLb^$p@G6%lDFW7 z<8Qp)bbY1k7(?HO1_Jv}*=eHSM+e0_AG+RkbYXfFiqkMYC~N@N^XM!2P_k!5U4t?N z2Fj52$P6xJw}t}jq#MaF31#R#KS0QqBN?mnT`34*+#O%&)d?Xa-n%FkHOwe_VVY;Q?=@z|W5lCB%u!b}r zex|+@@Sz-E=(A8F6qyf7IfA{xS#o%eC^U5Ani?5TtIj~`D^ZyuETM-LaqEGh=1}jX z5(BJA*D-`%NpP{Tm2)tb!5c2>8q6S)xR)-$IBv0u!3;VG*|kvR!M2c#YTW@dm^PI1 z5DA7-hS-HJj>5wab)g1*Rp^L8RlFpMshSyWkZy~nT79ngUuebCB}Bt(+BNg#1v^p4Nm9CZyo5WT>rgTZ1nJAr2Sx~k0(9%3?~qax5-@=e41}Wqjdh4sbM*ot zh`8&hKVKdeZMu2&GPS-Bu{+@7g9#yP_27$0E3axd=LWufI4FA2$L~P8n1P6l))4q3W-N%GPk?V?A zi9#Mg;ZGXfiv+`$n1*8Qm*gaz@nOqIs?{&|l(>6gAIr1X7y&7Xa&h`bsxhyNmqpzR z`b+adNr=GXGnyJq?YT?q-SY*)>rYcJD;>*p-YZMuy8`n+J=A@)d1FumOZdKz?uXHu zQi8Dgj|A2t^{dOtcLaP8=LI075{A+#O&_EoB>vx@X-WM5qCF3r`TorNXP(UbzrUV- z>-0s_rRpcEzcP6L?`Y*NQ=guC`P6dxr{#_EmF4?Setq)Iljl!XOMhB=W$B!W|D5>n z#5EIV6u)2m?c&A7J%!H}eyy-tDCBR?Ur+u24_y8K$=SckzAhVQe#syF|NRqhId;!? z$1yjaY8`2V)~8i}z{J+7$6Jo&GoT1LIVXvG--e2|OqLI++-r{5kkFy4H?|zh=R0#i z$ko7H7u`)WJaefwt?b=bwjAB(bM$1mJ|>MsmmYPhS2o-w_4<|&eqMtlD1@E#z7Hv- zfI-?CkbY?!&DeeN>}=D-q^h9+JFzEoM79R3U;5;OfrEwvJ|8Xws%@F19}rUAz}!V0 z@}<~XoD2(pG%-n+Fr+%NUjEl5A# zXg*SWWW@;Mg|O>uW0&ikY~?w!y5*=ppBFAj;)LUz_#OIPUig+t016Tw9}^XIiN zJBN^0Keh%0U|PXo@QsMncqlLMnU6HK9RKGtazHE-iQ_=)?nBeaO+P8x8t{N#aoDr+ zM1s!6rZd zPTv+tfraL0*e1#0u_u^ky0tBn3*_(0ew7xXkYN)HlM4hxRz!X~SY$~{!It9!eYRTG zPY##b8=V}mZS|ooC_!n7@o0zc1VX0cL>V{MwoF2Bo=g;9naYSDi0C^$kti@*y9_=A*vP#ZAD;_8pya%^FGm>(BG|E)bDpW#G*HgkWPAI~@(T%KE) zCo_Nfl?SglaNw%pG`}07Et53_P(B{UCYasjmK?B#o+C=G3yVpgOppne9Q?G4Jn@SLkLq&xo)dUiE&Z1RS7_dUg;1E5`;(UTT?)IBM6?fpp2JVE*$3mS+XODXsc{W zLW6~j-)9hEC~L;$HW`2rebDq4%pe|ZY?TDUYxP_J!O*P4OvQv=w0h6Vmj?6yKRNXxs{g-LzP0@5a$)jAlh2(zrS#XO*OzJ&|1$A=6Hl7B zbMa4#FDcFzzEilhaHNpUcbWcoa_$ScH{@2bKhOSwoBsD%{+Rk{Y&puy$HOtFl4Lal zZN}?JtK7W01@+~dCvxB*SiB_0^kMA|nxBU&Ko~G@3A!M0yHT#9Y040kW5LqBQ+=VB zKF>+kcYg@Vv0)a}GS9`&vc}P-v7s7UjukW1zC>alzeb1CdjBP0dDDB#(PNfa*opaN zvh(AJ6>Y(i`8`n4JF^|ciw!w!#~NFXCbL#1w+SOjl=(GRR{Tz5t527uo*3_cJL-hV zr070q6N|@$w;X9^$;Buiww2EA1hE`xW?zTOYvKdJ+rW|AUIBXQw8LTx1iCa zc`@vg!_e)>RiNm7r0G8Ni*!;T-E{d^{a0X*&OU|I<*etQgy>K;Yj?ES;-f~o%0Y(1> zGl&yUd)iQqEl0T-iiZ?sQVp~7$68@y%W-cO7W|*=({c8eYzRlfSy=c2L@=7r4{V6W zmLuaVEHuyd(!;faSdNu5v3ONGS!fWzinkm+XMIKjBE}=?vuJb<44K>Bk0~ai&;?Twh|MrPZQCy3TQTCK3Z{kxAXF0VHAY z=;HMnK*Cs(TZGr64Ie;qB%X!D*m6Xku|0XPPuw+~ z{tIl+#+GC9EG!hoC9MP509Jj=r1ZFUs7@y1lyE>a*3czB>6T~FP)I-8LMe#CjnUS*=1NFA zNX;OX4#&xAJ}LkqE1?iy2Pi2qI93gT@a3*~_(O8nlI$I9yj^MVWbQiJicMkMAOomU zmK4wl!mLVc;A`j;VaQOB^HK=bA;>eeF#%X>D# z;v%A%Mb8bh#Cp!^R^7#uKGzE*`Q-d(q#=C-5&}}6yy8BaCo*Myboj_j&f^i}pqvvz zk<2TVKZ+040uA>Paahfv_*X?VhlfO+^Ek_jx1tb~l&jD*q|SsED5;@n>ySWs**i2u zHiC#Qctlap*`|8P@ZdF2s;s$4EzOR4qOG$`K|sMEGe1)s>w;z}`7ST8)Q@R0m>^Y6_+HGiMnS95R79m(aX{C{@# zp_%Vw-mSv_TsASBhz<)Evsv>?en7;ih)$$*k3dB&v=8)#FLIGq4++IdNLry zRl?2DcW(;fqQ>@sa`I|sp5_61o5l*(viW%1aZcV7B%KYYXD%^}-abK(+IDQy=^iRp z9!L_hku0d%c{^l1V_0Z9Rmhni#oLZ|@`ir$0yR_sg%RrWCk&p(svq8le>&fvX95aq zjx`>g2PH=GZMgmMwqu_RUEvh63c{l?pe~EI9SLPX(e=&=;Zfc(pz8H)A)~yci99An z7($dh>^-tclX%+^QIZEU*3HKZ%YRasKu(37JdZ=c88jaN?Z>iFrkR{ zU)H}MJol+gcffBO+RtDuNUjlYy)>ZpflF%zY6$^}`Cj6ne1Y}8z0~&0By7w3ANmaN z*f$7@*V_OEg)??yJ`@l^JiJ&SPWNXiWs;QyBFZt|xz^?7K)4ca_hs%`Zrbx!wq6ui zlq4PK#ngrn@xV8BS z8s33m?m2h*$fW4CC18beczy^=rmx65yJKQKFN7t{rOZ}l&(@yj?KySk zYcp@0dDKj1dTaVw(+{YAwfe^DBP;(_*{EDuIdSUGss7(r{z3WO<%`SZ$v>LBZt~31 zcS^UG&MRe!|DQf_9~b{0Ed03ep2Fh_Q~Cd$e_sBy+}CsO%w3YJWf#K9i&^W@w&Q@j5R~aiwoJDA=z|PT;LffE!cjj4g!rJuX2DrD zxO&3)cwN0kW|{JsFwXjr1GHVem2F4%crzT7*+{5Mg|E8Z^-diwtlrpmJdZCYk1#mH zcvA~wrN}bB8f`nG$EzD^{w3Dqi3)WLhf<8xduSVi#~(Q_Qf|W&b#$AnHKh=a#oLb9 z@tGA6q$p6b&`OBJp-q~VZO7~wP?XwZj8_kA)?J;Fy-Lj8PEFkv|3& z1uMKiwV-neCRXt~@wQ`ujO`@^D~_VB%}so}!~tq-_t_x-XC(fZm#)NdqIT+XwjCd2 zEm20@;Y^Kp0mj=9Lw?tT?L~IYWp&3qL5>-+#A0>SRSgrVLBCT@kYk1{tOaK1$%~dF zdt-h@F%ob?_7bJ#pWYf}N$sx~Z98(vFzfvrBHSv(Ez@U)jEz8f7Ww8e3nt=i#}9e; zCqt&$oJ=s)MV=5^0>uOYXfHi`EU0it5LseTfJSl8@Kz57MFfzJD6*hj z78@Hl+6SQ(I=0BWrC1@AJ&QCUjB^5IOFhEeQiJKmR01cetx4~?$v4XyB? zKv^r48asLIZltWhH*9Pl2w))-{^ht1d%V3rutdB>3gZ@sJuTt=u)4iZoFZdCa6yv- z*F3hZtay7lBorwxN^x{PAq2G)f?^68uNCS-@etHv2uhfBu8Fa1RegIwpnScWoM`Fn zVttl59y*iJ6IZwA1;)qG3k+%^GpPMgi=(fvZqJ2~B-2G9jUXQ}tX^21seH0>LuGdAyHmeCb@9|p`H#ytl=n`4Yw~TA=T2ry9cKTXJn@$k zubMbm{BiNU#Y>9S!bb})C_FU(xA`~c59j_Zx1PH^caQ9!5&th{zL$B|eMx^-M^J&QA?`V<$7_SZV%j-ljy2&I5=*Ea z|BVF{F(uciE*K1m)#wfQ9{&>ONz2pNrS9Y)mLq(;Hz{%v@8ZkqBBvmhV|*+uG)3}j z%r(Y6lk(xAS6tkUp@hCF1!MMBLq29PMMRkhjVyx*hu~I^M^^qUv%#F@U;N179)jnZ%DQ5ydlpL(e4&Y0D8mhPjbu zU1q$D=Up{=j`%TF2mvThq-pXsu)@Z+V}2|wa?sqclt0Lmc*^Sw$Q5tH z{mAeI@42R@g7T*^V}N)Y^2df+MDshz+1)Np;(JOw-zR?zsTL?&pmRiBWq}nowjBjz zt&p<*T`xQau;OjU1zDSmDr{zM>r&ywx{{}Q+fhLV6jz31v$e6Yp&Hwc4>DE=`9x|y zF|;wT!p62Ege)xHYh{;ev4U78BgCnuM1ZEGM72-=E8cdDkfpALS%^4l8%G|At**n{ z5JFPi>~RMXi&-NK*H(7R@&=(Ju5<2)r$S5C=aQ|7HX^;gp_?ip)3v613JirXR8{HC z9uVl7fIzd1$Y!X8RaK(}dTu}<-htpvy~KAj1zO#HP6&yFD6bRgY;*wW*&!rKJ4o*6 z)O`TySs^6S3%n$(can(|Z9h|xyrBv6BblVf=vSTZ9jbUIG`Vzj`x&wqjctu%%%&di zYLB;{F2Yzy#DP2{rK?Hp0}^jvEl|FJ1?+1sJyHrBlm1zg64$`Mg6*gERph;1X6X=- z893_Lrc{(|Hny+ougrr%GXldC@HBMui@CDgA4l6)_T}-MeXw}M46_@q%dBr-ArRik z9S9nyL9jf|;qsy00u+L5L6@iHbg0XCf+_K!uT3Bpmv2g!kN~!Db{Ar zzO}La)R3BaMFtj1_jTE7K52FPDSZ>`{bVw~3{F!y(w0=2pTyfwcG~vzG_XMG(51dv zpD}G?6B0r|9~CI?aRrKs8PU2j{6jVG99LKWzfb!AJA0nK=f1@MzcKUZnW^bdO}}D# zfAxpe4^*F2y>sQyDzB+LV(Oo!)~22@b!z$V%I_&3E#H0e&n90pc~`cpke0r^e>NJ3uYfU1*VB4wuz^3 zVu+(HRikH8Jt7r#&3rUnqiI5AZeHy{_4r*Du&DK%lZ`aeRYE`d$X*clOrl4Sq;i`Q zO{J?46hx2T`w=L-j5#W<$AMxqm`smAQT4#i()YV56;LMA0~EI@J&Rsk3?^(De?)9l2&z%Yu@gm<9+x{GbHIdr^&jpj}&d_bfypD!667K zh+y+6gO-A*N4*DyAcV4(eAQ^br6C%GfVsV zx)N57SDBXiMAUnLxwQTAl}VrB?S+KHJ>{`;ecfbCs(yqfI zFuY>HEQMv|>8Tx`vZePGD4)|PP?#(kuBxCcr?K?wwcdUD`tg1@@nD$-q|0+spPsP0 zcd}r3xn*XJE$&}{GaqY6PUeodcao_ku-J+`GpH{@TT4;z-u z#tUiX9;Q~7Wl7TfA2b&iMZLS55KBxGlSyFA$qJpR)!yAK*O0`~66S_#1hs+9YnQw7 zt|E-@+7%?ZEJ+?JBWyxl-{{??uVv3!fSjdbk=sf4a+zAL+${Y6a^@Yv|6jl7%$dKN zdFRZ9GbQ-{8>aVGzg2yE_1wyT^7`M^m6NBwF!jo*gXMoLzqkDOa%J+PlP{QjXz3fJ zx0F^VemT*axN73w#n03K|A@j*3eCbZ3#aA(F8_}F`T0Wb6Sb>Qn=8uc8lWI%{TWaOhxv8Ij%pUq^GkU~1A8PK5; zhg#J<01w5-3pYggOPOxegH7^hYnB*wDpnOU7Bulu&#_3}1pz^gB5$MXAy}ye9gTYf z@+fU>kYZVi1h8J?IJoO0jN`lkL1m*Z4-{pyF zFgtK*5TgmHNHgGsN-w^`&AcM&!4H``kE?-lA=(5+Q0Z+G^&B%~C>aD=iAmc8An@KC zD`Y_s`7g=vuK>i+sORV)1A@Wv_*@+85JcQ_RFKaOqgLK66T(xsCL}(v)@yyW2Nz`I z4d_C`DWq$ip34={a`D!eSB~k+61KOl480-Gd!6vKhQ7Bbpz(QKIKq zB4azqThw$g>W(g3TXC8Gqs+ zLH0unF?4wZ6%eb@dt3mEat5kw8D%pTR@}QdutbLW!=fdo4TYBY*nn74Q4Xg!wuyL5 z2#YF<{j@raw^8f8iyW4RE+=SM;^JZOkRINqRX=plVBLEcx;<*ZaBlFSjSo0NS?ygQ z!gyIrp0mSgkj%I8WvomMPSN=xB&u~7zo5N_0MeraNL24L{)A-wXg>vzj)ahCa)95_ zJJUp}_s$a}U#SE{D$Oa2kh?mCVH71t!9wjhdcbHBB zQftH;VW(W;|9zPcW%k^@=efN9_syBN&OB=RKc_p>*G@l({{LI67gwh$e^Pl#W#804 zPi;E>|6Ap^mmga`Ve)g6ubYe~i=_{jUR*kJ;yV-XnRxQViN!A$Ut2s>_`l2md`98E z`M=J;As^>{ncL1iEBD~+*RpTRo|`T5=l%zN;@cgol_C@8W)IF%Il#~eYJau+tv^M= zT+~-?cdS;5y&XWw(|fcT70uGlYL{h6Ibt@MFID|k# z7RbU9Zg5BfAtWRr`F-kizv_DXJ$0t}Jy-D`JdX8MoqEryQ&r!pI^^*EY98D|j=%B> z1QZ()io}9a0yzrH5{MOv$6S3_Yv`Df3TM zRmBSKQwqzgU2@C+x#+^=>ZORp|K(%2dUe%LYjp)7e*gu-l}RyP2;^2s`4HW8g%CDZf9io((N`U#m70~>gW{r~`aZ5*8h{#@ zmAcv^v<8gx)V}@mLJgCfhKE<5JGHLE2Ui`Rb@u6A2;mI5CE~CtA&k@m^HP^23u%aW zc6HT}S*h*Pl|{-FB!#Lx_mnJrXp_WZIove7WRZyJeGoko%ex%OHPH#Djh_#q$6@&) z_&hZH>O-A^xTL!3C@e!4Tu~T2;)TGDZB$pGuKaUO=Yw#iGzKr`Mx5f2LDJ97T)zuRN5HP^3gev2} z2Rd9^J)sNX$;mJzjqX8tza?bXviCGr_XvhJ-^644 z&-#V5f|aav#qpdS_+PryAr^Hop*Kq6E@HP#1f(JPMLBt5WvOojL^%Kf`zL7*?UJV; zj;ySX3xqeOd@Co>8;h(QFCGP zHUr0qldYoK)WVKNtEH|uo-f5CkaXA3hM=PZQyf0}NC0Yq>F^O2+ zTWCWyRto~Hu-jr)S91d8HG=T&+^Iw_ zI<=VkboG_htUwrhQYxS6s@C}fYfskes~M*wU*3lXQ&dEQsWk*J7OeEeF8}|!%%1f< zFWB>l$-jdCf9m9kmEW(tjQ;=cPkdnFNfTq`&GHM&4_%_s{-m z_MO>FT=oC!Ji&i$)zMZd9$5S;Y0zQ1u-th4uN1Ff_kJn7t-9*?s?_J{VbH?@C9NyD zQyBHys^h6FF{oH#c(2~WDTu;fR9788vUgi3Zs7RD!i13(Uz6W;jxL= ztUT{DKy}s8QC=A!wkXq`rr0UuTw;J73uQp?#@w`&Uxe%w#s%_8j`4tD^+A8FeoZ^A2yDOF4+|*SE9dB{ZV4XbNM-PLcQ``so zcCw91wCY%=l&9B&5;jKWjP`fF4b@onlTKYIdR*yqq$#@(Whx08Wz|nQ^{{4%M`=_V zCKDl8j&w?y^BxvswJ12Tk~N9t3YKG?3@lbRE2aNRUFI4YBe&|Oow{-{(VTV!roRoT zFF)Xo(zp+87QDOJI+(K!BI~Z7A`Sfqwa$aEG=4fLO%PGpLhPw}=)q|#ehis(=gEs;6eQ1BgmDTeFDiu$3PatjN)B+}m88e<(S*?eV z$QR06Yf4uEq~#D2nZy|e5~wd2KsqmgMD$KFF7YBj0I3#2Vz-kS)DCd~sTx9JiY-&N zbSYZ^=|BK!n$(0WPPuC)Qe*X8K{Cz^eP+UN4|$a9tLHc@pLf;2)8$LjkOYVj|o$}M-U)>Gpj#O748-U=>;@?R!@XY#tqvn$`Je5i7H<>ZO4PrP;F0x|%< zUw&2jobmq{|K0H$$M^CEz(>c9j-5LC&C&OaK5;Z(`dsOz($vTgM?OXuz(c42csp5u zpBL5&FD}gGf0X}7{u%lEB zN-cy*)R%XSvqbgJS8m^Y#z$oxx5BHCd{lSA_fCi6_-Lu4q%0isEV0P>Y)ipmSCdYMwx==}5P#GHd!1eRi;KU4;c>yKLple;<=vzxY zT627uH`@S+%++A};ZWIzn^qs9z@sCZu@AlH|UMoHMT zdUefDk%>U$pLv*p4rg7$mO4a0_$jg;1hsiGc|lno9|RPcaXlb~%gXYaQC}@S2uG25 z_ZwMoAy0TwPFguuE3f97*PN3xOcXg;Oxy&;OaDL+Zj-QCO{eO5@+$wcLkmYmP1RrtKv8&b}pWryTGUL@rZZ^Rr~#jXO&d zo)mDZ@14S6C9q^3Znp#<`Vb4%u)Hg#r>==Qxd#=kYz96jds z_+)}6Ay+?yNKpUN66mYl?Kc>}8hlE2%@JkZ@(7^1 zEitj{KLC|1kEpHnXfm&o@Ulq~F>W+qATr-Mum(?NRF2R=h?*fqLp!EkTXXc7vFWf4 z6yfo1bWn=rHOGq?Cx}l?1#+T{)i^ zM~?yXe-#cg0Ku)B`A%)kQDBx%XQ6p8li)*Vd4PoFlIRhIwF2$!+S6>qNEW-TKSrT##M5VWc#Nfa|YwKCx zsig?Ui$fS36+-IZJci^?4x(vWe3;;-Sw1M|*t;f;Rw#rw!h4 z-TMEQ)c?PD&)npXC-0oR9RB|gE5BTcCjNWkQxnghcvSgs%kL^*ST2mOjz53=^szr1 zd*|52W0TDPd);WY^pn!ZO2H~zbW$SpJeUQBw!EK*ShSTC-)#w@(d$mZw#o|$Yk%|SaZakFVQD3EKc6U z97a!>S4C?*;?BD|G|ZHuxuN=RFK?{D+xhd4(+e_33NM!N(|twBI3{UBXJ$ll##z2v zU30{p&wT@noj@o?Sl7pjwX+*T)z4pZeBGIY1;Yd{K*+pddEu|;HYMG2Dv5XNg^yL& z9BJnjMdD@>MstZ;{*)+3s%ws`Ga#e_j&hygWq>p4C_0}LI4v=d9RBbmUWvsVH)mi7 z!$8GE(1K>aQeAVLoUs%sRU|hPyc-+Qn&aZU$DBxo@>+>GbBMnWY7#1Xt)m_kWE~S;VDTg&U=To+$j11-4g>mY|U;|jmd}Vd* zG1kJSm>9}-lt+q#p;&coZvcXWA=3$U1x89Y*sn(iAf)b>lvFUcb|hMRltB2-6$^ot zqyie|zQ13DmxN4*Y8l`ruZ`9o8GxcAj4LbgcBu))E`EeSd2`hJTtzfBRGJe}`!*R9 z)eo#a+{_9u(H0`#JZ?jhQYD|3A7*Nq{w`|XsOQqOQ3~RM18Zjogpiq!QUugjatfhd zUposSych4(5($1BJsS6V8_vFXyYWBo|9y7PbD01C^~u*yo>Td8<<80#m3vKme&Xd5 z)8+4#-`9)&ZytZd*xxbz|H`rZxat3oEB$lnF5dq;bL872?;3f+NTJv)zNEOf@PopK z3Re{F&;0+l=P$~S=l)Ob_S}K&zh^&_y*~Sh%=d?W18`;CF=0MBVb&dWM#j=js&s`EG|9hP=v1L!wmm+4U}t zw?OvMwRMvU14cSxX+#M+I+=IZ*M$o6ZXYn1yp1EgJAuO9KGk*TF#nZ+ywZrrygN;A z$E(;qR*l-aNr&+tOYE~qB}*_Z_^#Tzqr-eo*9;FUa9?8fbhC0wjLf^1*Sj>Br<`Vn zpcbDPLcpqckMZi&b;p2tcL^vggj!@>Cm8?cu0jsg)=lb51cCd)ga=DH@?SWxZc<-h zNaA@ZF`YIgMZLCeQePm*abW;lkoqe9V|Cq8UxqTs&IyqnycCbDtiyXxXj9I@WIQG zjRFnkCz2)8BD$H0JrD0SlzI30>#$%Ko^0ow-p>ybl_q_Xeh&Cqt@7-CETqQ7J zhAo(t!O`OX#>E)6Er`|}8|J&CXBcP%Z$n+A=3BKu372}QvF1oIUpfycvhz?{R7myL zmiTq;v=+ZxU4tAm6iry@a>RP>Zt5sx-d$bmabq4u6Vo9M51IwzvBvV6qsDxBgc+PC zb`DR~YsXhBCl(3crALl=1R*YvJ1A^ijyBdDH|F!6XPCl)!6xIS!&5CsLd&`B#+u{E z3@kzm*Sn-bivU)2t;dylS4QwJE_Ar6Ze027LKc8G~cYe0~Q? zlDf(%Y4{z+?^x^cW@(vtF96HM<;K<2-^lT&-n|Zv*49kgYVMs6O zJ<*z@&%EML49c-)IIeD2Pi$UoA_y)Vjpo}ph{MD6JRnQV-Tz4DK3<3O86tybpmBcMF%J(_E59bp&_2rh4Si~`Ebw~i7jLK)4MSs^GMOlC^vQ1e%Tx;6wwAw3+o=4?!<(EG6v6sI56>x797wX$}NSR`XN z%yA)7il7)?6N&XbGawX|88{1xCp=6j)^~LXiZ)tWY_zW&f;t+4VxBqkS9J-x4b@n? zN}zmq31?6$lgN4kid~p1~#y>fJ&G-YxzB2Zjv2#cNW%PGOuO59s=_{pQF0GXEBU>Z4j_fb~wD{@b zbBhlv{B7aa3YQh`o&Q4qwfQ*RG14XVI7k{@v*>nrlHy{lr{D=_ZK+5X2)U6$ErDA`vF}t==}~*wae>{1@nEN*?oIy zzohDn!RUQ))FIsUTRDv;5hf_YL^F9sp`_GOn5(XvL>L(2^X1#Iz(7!vW1@zp_O_A zPqrABCSxclvW$n~hVx|y*BzsEx`!JBN(Ld&OBElSBvdl@-dK0MmM@tD$%r+?=Df9_U&`?6$T3{LzzTWD@sbGS4V?b@(dI4TNi8j}JBG_^DcztR ztS*hbeyCWqdbIAyEuYUJEG(fJ#n(EYpAbUdW*0^4kX!!vQ=k|P#^=|8z6pg?j^(nX zf?(jSJ*}n?)Y&1ac*cgx6kMpK8fTqe}moh$2STH%>skuf4) zug;qZg|5yBERfP>QdbnT_4h#t>hus4mW15rP@4g%9x71AMkjYpZ(G7BnHwGV;xvKs zx#_c{wjoC_aIsq~W_CBPLGqh3ppXwW)*sScq2~G7HZtI514T7O`7Q+u>a(qBL*0PI7UJF$4Iy8ZxDG1L$_y(DULQ_AIrzkdiq zye}-9I<9Gm1M4SSzVWQ{uJ>_LgI_0Fzn=)l&n9+Mi zKQwxHbWiCIO1G6}NB-}~2SzR#DNzA%L-DM_UliV4SkC`@{^R*;@(<1ZY3_}=YWAnu z-_Bl>eL&{xnKyXK`J<+z)_fm{f@mtIC|o6S>u+59BP}kk$vNxRIF>*y=nst&xVu@1ZDzmGw}Y%;c-PRl-0LJ)l~WbRm5cQl(J6;;a& zc1!erSyH{IvF_M5pUWvyK_w9nYggKq>NVAMI5&TZ16VV((K3`@`*`sO+r47A9)xuB zUJn9+J?0sq>0V;Wz8)Iuj&CzoH7%n&4&&6g1oD7ZlC>GaiO zLS?Ur)*T1u^MwUVo_2t4R~NIXc|3GS#aU2H7pHbBP6LQ>GNDkG$;gRRBuCv;s=new zP>zwaq!RPXlzo+~2|<~}98!@dkw$%;_c5W+l_Ta1sl>EE>1q>fLZK^@m=md}LnL(2 zNxBe}BjzlrxL%}ZX~?*tN6e*NPo#47=E;r*bB`WcUU$5l_tJ9}^fDA$m#%B5*kpm? zC^-v-$D}X{I=u3splrv+d5sIQP?pV=pr?^*l!W4eGTAsZB#q6CB^&DGk&uLq^T!H6 zN#rP{-s-!>TG=(^rGKogJ08v#Z&17{_6b|A2SlbY7`LK~p> zPo?6Bl7y%3f%5Xi&HsA`*B#B~%Z!4<)8*oB#kq#0LrYCjKR0@PW8IN#UZc;$xH6Vk zGJ;)`m;}PcB|DZH>yBl!u!w32e&RTF0Bc~z#%CMrm&@L>u&5m6nabE^3}7XTQ+P*u z{psC(>@gbR{bPTqs#cd#>btRdF0(cdm$QQi*E4aLo@O1UIjX4fANCz*!gS`&+WJ!i z7}Cqlw+$|&Fn4hMDY6n@4IFY%Tf>30-do1%^o!uC>rb|{I>*#4JYp$(51j^da@brC z-JS%y!a;^UOy-TX^-BX7GS6$CY7})5r#^1sw(9zm%%$+~0d>7>Tz%K2Fj&eZrWinA zb}3K~_B2Xf<>HVSJSH&(1Ef+BJ~1u|h`|=4LWHS3eGexEL5t`5g&_>g{xp>|p|6t5 zG}fOe7{22>M=qRbg8V_;c{q4{2h2)!{Q^@ha}rnX<;Kd{6W^M6@5F@@`Esj#qnrQ#w($$cC&t=i zFB+Q~{od#YM=u?nEOkn^68-;>*Z(dbIkEWp;>(Ith3^*LS9ofnlK*`E<@xE{J-H9% zF3pW+TiKhkXJ@|29}E06nvUG^#yF55^f;1q)+w-ryP$8C?3<&eW4U}ia6H?A6Dp0l zI$*Zq$;{gtO-FWFVi7Pib4drxwpdS&nvV4{#A0Tv%<|EN$fj8DXfz%BWr!u7sHCG* z=w*tPdHqV$(O}-_n|5lh6$WH!x5N_b`bN`{VU|=}Zs{RF|R9$R16!U zN?OOfwkx^ZbljNN?*fXU{X7n3#g?&QsYgvmi&+BUxN%G9#n}QyO-GDbP&{6Z`=#r{ zY^dd?6BN!=vR@5Mpb zAj+UXjta8`BCenWLAM_1wJCvw4fFCXq99(Mlvz6JR?;Yg0y##^5{QAl%xlmuZ)qqc z5S*AT5MG76+dU+=;5ac$Af`7G%jqP7SD;4I(PBP-QZz*KHPL8XymlOaa-|7B#^QW2 zIKC-C2bV}ZWo!T|S*THMI-bm%5RjLPNC*I@^2@P;`$oIkH2E=D9LMcav8C)#8X{`K zj~O2e2${A4(J|D=YBU{B=5<79`NDK8aiysRB{rXSCNr-;*gQ#2z1PCxb7Rb?16FaF zW%pmuXx>ZKX9(pQtfl|Af3Mj>z4pB3iOv-H3|hAzjjm{w(K0sU2?2p{{HRJxyz~?h zXr;MFuna9pQ!+uHc4;g%J+IcB6eMq^jnW#&9P@5#UrniPjM1*hu!Yp8gUct_*rC4@lYWAh63 zaPo|W*VEIu76;uicgax9Sh9S9rC?(KHKp;YPP$*;d zqYMgE3<-p;<*6IB6}?|9Y8FBQNqrzsG7qJpsF@Ez3BfJTehjg;C5iv%GOH5*KY!1e zlYcS!=E>#C&nkCSu4elGmnU8|u~7a&`Ge)d>_)X(yk9~9OEo0}8{%rKF(W9gH zD}AZ-%F^7(-;ey73g_j2n*Z(mmHB(;zL2{$H%;aL`?D8i3;dz~ zS3gnH5jx%zNrs9kYPh_*YEyrd6iVC&MoA~v_HSw{i=@=a&KERAZ zeI$yTER&NvF>1o-NcWIeEIF2#QgxM@Qe_vSrlWN%sW=LhVCwD~ORD_Iji%#vEU6Ze ziENsR4@|K#?~a;|+_A)>eUHvGebOzlGXK$NI&#Mni}EYnP8|T5V&zVcnvUeL#Db}x znM;shmRQ-78coObSYlDg2V<|3DyCT3_eD(@AGuro`vKpau{XoGAh{Rv}D{js;A`zp2r5RFSnp3QOkTXolGjnV&^X#~B&>K@t-10XlVUODt0GaKyS~(%cXEPee^e zDOqCi0uv7XFds2XM&D6OmRJlo;gxdj(VJprKNB?_#bk*!2URRji4JjkKGJA9rpXeE zEH(2)mWJ9}Xv;B8mRQUrl~X;;M=Uj(J;up<_uyyoh%0^j{S}(p%6&X)J|S=tDbAyf zgTbPGEOT$&tI>SCKpEP?f1uMBz&?~IR_0HlW+NaLEeeaX)MY5mn_?YYX-3lMWr?)} zy{AJVTd4mPHCIAH$(&s%>|s9PM;pz9Azjg{y-0AbpiHr{4~UxQ3zlJ*d9Q#ub<}j}&iGUlLpUPvrXv`nB;JIfL)8%51p z2#S0m23}86vY>KA7u7&WAhv;*la!sY7x>zh<^h2+i~~J1!aoeN+wt1Y4XB;T3-m=& zsn_2Ord0V4Ma^>px}uT;5^GimJ(jMrXGG1%g`oI+i;GOD?u%tX7y z4$QsiBiXxsxw&72GSbI$xF7_GdW&i(mD|`CTAJKkkWk7kvX++F=<@%!WcK{-o)_#n zYw~X<-!b|4%70frQ+Zb9)QPW6ylLX`6C>qz`4#2Ij{p1kXUCs2{*bY+kKHl0Jo;aw zpB;VP=-H)jmfli2f8=K)pBTAnXWaC>0}$OgxTjiY4mmu{Yk&Nc%DSfr6`{K4Y{2eIrDxA4}5r42l{Gs<8ok zW7-HBa42h-)m}z$iH^Xr#FBvoq=$xaenedmIHp{T-Xm$An1mIOE86JsIG(!DMIi!Z zK9}yMw-0u-;b}4TCWi3@R@m5Ze2#_1du$XH4#jkf z=6j5ecXKhLlbR4zKh*AuHXNm6sf!kc1+p;;E2J)X9b-etiy_OcvE8b_{8Fl#-^-;}K}p%T_iVspF+i(G3w5 zFJ8y<7Nm^Ba_X?>xxgNhVU@I->1jXuVm8CPR+n-@l7tIWZN5UFyoCyk9-%&(A}pO2jK8@qRJbhwL7g@9>2cmutTk`#LU^|i zBP1v&!kg;v!ju%FS5})Z4~QY9Y0RJ3g9B0+^;+{~0Wri@%OK~F7*ygnUmC)YNde3z zQ*LicjKWg2`I5j=WN0QOf0}SjVL*-FA`sr_Xn}G3*qQz~{=rJ77_J^QU+hqPJ%pgp zk3ud^A0%`8!?M4~43Y&3o;|@aT1PT>xY4{>gz~0@K!ReYFL|hBefE}><_iVOdnTbi z88Jys>@a8Y6^-Uirc@v?1qdHsQ0|@|H5UAMFB|91444?#P3Re_VWB@v(&;6@IgDq;S9d zALZYWKQH&6xliVfrr0F8|v0W@f1r{%SB8r&%0r-7qyW6hO{ z$LAQJwD;J>!a=51O7o{dEJpzuSiJcqy)8qfghVb!0a;k&a;S6G$2lmM(e1lNCP%;2$ zMqg10Ni-5(gkyj#p$Nt0+03E5i28j{GrTxNVrS zljvBnU>xyd!4SMLp!s;Ud?JnGd@L9^bX*F3lUvd_zQ=-D*vBwkTsHr?i_MfsX={)|X1`C2?qbG|ym^?7lkJCMv>T@2||drf{=id3>Q- z7fFnhyyf0S8YsL?_J?M#iZ&e2lO|NUSiI-XquBAVf&r{#f9M4(8;<8m*8@8!ndVP( zkx^TmtOvee1D5CFlg>HCqbllwx$#Jx^gbRk9lK^}YX5$G@BIu%Keqqa+%>cNujYb1 zc5G^9|Ndh~Z>VlKsweHXBN>nH;if{k1|8-j7i~C-=fEkR`+zAiRKD>LUK~K~%Czt5 zXCB+XIDHJEuDN<<|IwvmSI0u-ZizM=)8n-$%y}U$S)_hmZHUB%N*JfchGTlX`;@UN zybL6j6vN$C(FRnHFI+-dV4-~KsC6%nEmpJv)nh}^WF$`o4dYK?etTSxXG<_x1@+5Z z@}ZzsHhNT#ABsX){Oe(;9uA^odeXzmoT{Xlngzy<+7dPd29VS@pn80xS{#-P31BzG zrIq%mmIE8`JihiPVB{?fMB+8{zLAMd=I*^xuWmSw$9q`1bG+b3!r@f3v1ERCo~=N` zgbF(5*wxG6>$6C+C{SK$WTLKHkM=lI3p!HUSm;7{j&Apry?N#*sH9B_B74`$#=Kyh zeYyvO@muntdELF2(Mp=h#GHW49o3CFb3s$`6cfgKL9-w!Y1nqN0+9~s_{LLiUZ>pH zYC+}+&Hi$AV5eC#(pX1;Kq~)lb-zP zkmLs8hE#@MK_xGcXyY*gl;)VbK;(`jZc?kV?%M2JZDVg&L4#j@YXAH`=}sjOzzGN_ zh<1RDM~jBimn;~(V1W}#OMA~cCpQmiYTCni7mIn$(~Hv=S2rHjJ>DK^mbzg{qQWD! zc{1;+Z#x66?BHB1xAkx>cTL|;O;l)vX{{x$+iA(CN5EO@rQhV*f|p? z?yvk~<$qP4TA5(_-^~*bFMo^a|L2eYZ2YeAtH)0syBqfZ;8<>SbM$4Si=}@keXMk4 z>Ew~SM}BqWX(N-xPVu(l{=&Z$?kqgBa9aM)^S_c`&iy?1sob@>hi1Q#eQWk$=07r@ z`~~9w)PK6tf==?4txU_iw%n@(o;p@GEy`G<<;WzT`R=~@N>Tj$P_9h&p;4-2eXZ zH&?D~%W+5s1Rdb=^oc&SX^2M4kw?DB3MpWHsqG_9>q;?jcMr~Ws&6><$d{CmM}N68 zX$H0qYb;v!irPkxK^pV{aBlVy?1_g@8F)Z3nRlPJ0fpp0TVU`WA-&ty&WR=Ax^ob@j^(;E$!BEc~R|>i_VQU9Dn511P`N%?POYj@?`AeQ{NC0$>W}(iQfCD zbZGZ1y6v8=Y&ZhRt5C*M$*A%~acfAQjzIDqqAA`xlP+C`{;I-&cz^WIVYK0RBd;(N z%8@)-pcG&2SX-Lfh9i#B-MOfTswl~&!_8Uph$X2CEUx@UEE*m`>!eYxWQdOdiT40HdjjKXf6glx8 zfK^+RSgueO&k!%cQkOi%oOnnn@#_g^uCZ}tNGdL6+VgbE%3PropdJw{ODb3iH<5a{ zk9b8uEP`V3d@Y(Nv06Dlmxr)0=L^(9Du2~nqU_VBJNGPAfa>h&EJvDj_b`!$ki3_L z#G(q4=7yp7>C-}3RFcTEgu@+0iT{@}ua@}#*?Uf<|NrfiE0e{_TIKnbGba9g;#Vf> z<)4-BDnGM)|M5Q@zk})jKOVbl?CP&7+4#bEV%aU0-_W$X}1Vf8?nn_bGn0 z_@?6Hiz9`0;kLqlW&nID|NQ(TbKlQ>ICmu#0N=>IJ$qrcocTO|u>VtQ9hBwxF5qbf z*l_uZuc(e)>f$SWsn&w3vN0fW_U#L&b2HzmwR-ea+M%D8@i&YtlCFgQhEB;L7>=Lv zt_2L9k&<_{)LrMraDtJY14BYJ-rUrgkTk~Asx9ax;f1_=O!DE$g0eKkrL`8+lCjm9k3?fT-7Y$OO=DbA zYxT$_zZg&r)CuSk_7sL}F~=@hOOap;l^$=4^=Ku(9K`g}zNrWTuN)??#Iao@)wRTV zQBIB*!|_VSS|n`EYReqi^NiL)N3urC|P1qx^F;pqYe2l5oGG7POHK zMF39i!cc=G>MJdwkNoL9q>|AV)cL5>XC=Zxatx9;Q3w*LHL$d2Vj@*r29ZR{k@^lQ zk(ZdX7dnY#za5d}O*Zp%&jL{y(X`rm+Ix$?9h=W_N#4x|3aJG~J?Kvs|K@H?%~wCm z{8T&&CM_K#EtMM?`sxOUgj(eF7g7{c#611G*oLaL9EapR61>{N_Mu}T$o3U(YqT7B zoL zS;t(cVUVKMDFLDA`QwB!yJtA42MLsqn@6a5E?z0{^d|$Uq3<&U#TT!%9@vHQ7+Ij$ z1$;RbH=AU`p{Vr$LGooN5enyuPKMz+5jnv3?<(E1HG#s=QtLa+p&Pq1YMmU=x)4s( z?(2BV-U?CcejzAv0GUIhOr#0L2EA_x%1!Ly75HKH!hzO(x?ZXG1L8g5mFf+eI(hX* z>)zcD=he0w(#w=p|87bW2f0SQb&|t6%`1)MmZkQzr=vlxXZL}TXVhBv5*V*N;el{^ z8)W#WvU90bW!@XLPBe842D5o!2zAAx`MGY6S|ArougyO;_fN$CPt8qax3f2AAD;OZf6o4Cw4lWNdD$6Cyl7#C6&Q-% zCF#;~%$V=06D$l979}nh6P+uwmejvs^{BD5(gh2W7h+cTcm}Z?H)hGj1RSiK&Ugf{ zqLw4cd}%o3qM2W&Q|K@(w67d}W{4%K;zeAm$uj{z)H?(8AXTjpA%QA~+Hr1%vSb*aOsH3`S@0X0ULZ+PIZ5qCS)1d@s516 z#NxH|c}D7};4UCmqvhB)3yWH4W_Rh*ya3ip%h7MXP*Ijh?JX_yLj|1&Td;4wY1;1W zAQP>X%44*9omX0pdNV{q>Gb9$Di+M>^!4l{kI|M^Uym6l`OERhJy=}^)& zg8?MRxmidwIm0UJEfqj=jGKid`Ctl*)J8Xvq85akdHQ665sr-Vssh`o-sNwp1KgIe&0}w^^u=n+QEk3x9~kPKq#P`mA0}9UVe`iwKw!q@rIEN?ZqVgSKB&CX z>QZc}DXng2%d2{HmdEMY0jOm4bhYIOHs88<{fl71GW+H%C20l~wG zQlk`1;U8UY!KYp9Ergktni?ju(w*29!mfj#1&E_!6P~f@Fc@J%Ya2dbh`apWXEo zLGj&v{8_FTYUnsLeH3Y;oDxr-WL2V(^4do0$=!{b_CkS@J`Ad)ji^28(dOC*T8HH% zdlkyO81aQj*Y%}}*VEr#wbrHGuj-M83LdO4eK&eoNeUu+b*=TJ00zaA(hsfkEGdl4 z8>_8Lx)`2_aenU-xjqss!Mu5+*1Fgf0|;`>*njQnq{JxPUTs|z5JOl5`ayyT>qCv! zg#zKbt>Ho$!3(dO;4$@vOE?snS5;e242VO@S{{oIE{PQU1p%$NV~ghJ3sQ>>k z_5YQL_QZ=PX3PIv{zUoO@+sqgI{x|HJ$&?Aqi-9%aI{?7EWNNaHS#_9 z|HIV(f4=z2;=aO<3%^}>M&aK1Kgi$8`+widy)XB~TrT^$>~pgZ$$UNYdSCG0*mTsF zZ{yE!{uUU}m2{fSjgMEq=_oJ@i{~})p!LNW#Bx-ag~db@Qk$Bx31CH=juZ3U1G2_B zdH0*i(f#k0IM9g*A=-4@m<7cIBy6{~cs5jH(@|vB3Mqo4?R%6rAWd;_0J*{zY-~Epm#Bzk0 zg+wgVY)P$FL*&3sG%v|U{Ud+ z1>+brLmCQ4$&)eGuCE^p#*t?h44a5R*sAo@i*o##1q0E+>@ZE7`lVUkggcYAhO}SE zmy#*;Qv7(lHLYwyoB1hjLBT&|9=En}cFekI(q@7rS3X7JD$ukyVQtgVW$Oc7Ge2R%3+r&pu;#R+_Oa4SyR*9Ks4`zn0fq~hm?))AMGB)HZJHDr5c0S&yIFI} zb~{UB(@|tzLnfsgK*DmK}|ahEncHGvE*p^fE7RI-bl|asd>@q*UG}M$Bs^#gg&W z98>0FZUqHZ4|G6il!U5Lk7LTb>Y?-kC~_8YGR9vzRNoYa%$u}88fgoGw2gD~cGhBL zb5g!}`f+)3IWv19eTjW$ta53!z^VH3X2l_S5(yx2pJFx=j|-^Z-nATPWy>~H1*Si;DG zWjR3!tm1bYo7oT+bT4Bl_3jMHl?h>yX_EoE!>m!bv{wk0vEzAE86?t7!)((=>$Z?s z67_RMs=Z|{vHY5D{Qs$L|Nny~|7h|}lTVn;R6bjIHuL}gc;a;vk1PMEd}sOc@`=>{ z|1$A^ajZS|im}% zxxVR$BcCfTNJNwvL`{q7y%ygc5_G{DVJ$onfxr-aGn_^zn=KfVF%lT2@zaK;gIo*7 zF-Dd&Qg#lpqHZt?rpp=`iz5Ex1q9voX~A?EBR>odm}{(4ccC9RKcYveQSf<&_>qp^oIdz;Wl=DA>cii|4JZQ%A1TiJ9RlC?lW6XyErRD!v{ z`lh3jjPK7p7aqK&dZTZPeHvf-dbH{2Bwrkdp4iUfNyQ;SIF37i6QYUXO&-=zprnLy zw*oJTG{6~dI;zQMJ7)H|QcPwo=t7eCi1t0i#-^i~ydmY1#9xdyVBS(+Ip!D3yl-U_ zipdD!!6HtP;(~j&kyCq#2|lJQ%1F4oKyQCrc_R z?S_3C=2FkRX?fEzP~JFfNzxq*HpJ2Euh6$Cxjak`inTGPpIC$9-abld101PtIu6Ra zhZvJZguuoQ?x7>~O`)Fr@fXt*AmbR)9v{_E{N?B;<3nNX8A?vVwZ9naL%pc6=}0K! zLv=@xB zlZ*mlj>H6Adf{-ny4fS6(){TR^Ykg7kOFnJqSU5g-}SgCF9hFuk(YsW=HCZ#P>h9l z-z~5Z2E1?zLQ)*6Zk`{4pqYiRMEgA{DGo=Qb%F3EGLQl~n?#1zg+7LfFO7S-EKol8 z61Bp7%77_dGMf1Hgr~Z)d7eOdPXbV6Fv+c{OoUltk5DyJC^tMFvOF;b+ZHO?tcIYL z=p$j{DT@_?IuL>)WE;A%p|N?cK>55EQljK$8GxNQ>gETeigoiGm&o=sfD0BaP4f6# z-~I%k8k>&`iACu!%$VNY0jy~Au_0|q9~n1=@)$#k-yejUp2w@w^XP4;1DpH0w#;J! zP?j{NBzkXBXAdK?B*J(t00?+x)V1rG94UxHjm^c7n%UYiB3!A)RI~8N3jr*$khCuk zPxZ}*uq3HX%4E2hy|FnL!lH6qHAozXv6c9LKGTx;{|4Uw`^(8UPcB#ft@7KIXH@Pz z@r8+(PfVA;SAJjliRIk*=fwn)Id&}7QqyI5_*XYsF`<1?2y1le8@`I6&j68kh zgyP-BJBo{ie<*y6>3^r@zm|VX{!l)X`)uy{xkqKcll}GV;p{kn>i^+SW6M!QzN?rl zw=na>JesmFcW?G*(Uv2Ld<{{8Mc#;_TRno+ayDp-+j1n4Ar`kfue{+%_w9x))|(G( zK^FO|v=EB~^b)y0*Y@^OQ+OcDo+aBxwb@pwVI!B_U4>Xyk3fkEpv)E7ZTUqLAh zv}1BZK*%%h)b{DBVOu-PTW~}E;!mLXR!laG-Ba6*KW__eNa$eCzM(5q=H%1+)L)X8 zCthB?x@EFLvoukPGev8VGVJkh?ke|iv?Z*N*R=y;PH13iT?|1I-@Sg(mScu|bLfGR z+DW!eT%pgI>dwXw&Y`bvIf}@4`OUgsGpVZ%7DA#UlOF;C(v0?C3}Ro?DIKwS96#jq zS%H8DWQZ8FS05sw7kwUpay*e2%FQ6fS|rqML)Eq%UF1DkGJ}+SH^(b!1lPD4>Y3ybY#Zaz&W6LCp1WKOd=3X6E?8hD<9_LvDG(UCSq9{ zhf1S>UbBxOjlVRsLd>|_+Dc1-6*e|s62g)jhD!2b0!9eK&07N6TI4p6-p(O5f^ecQ z4u~c1O7cp(-UxvuMw>4RXkKCuy1j?We$^YBH;2R`X@m_Ox|H&TAuRDt;bYXj6xRG*x&CB@3o1VrT;dBt zSYokw6K1%L+Sq)42#X9PSz0|nCMehQLRgpxT2l0@Hvz0@^LoKDYy{5KED43!N0Ttw zR(-Vj+z^z^Fq>ldX#X(UP}R-r1j_5?(KXCSBMK*iqo&vh&j~1rjJV8z8S>n8`Tvi} z`+qm=**kg9gOphn2rwes}o-G62o-8^#|w_FdlpyKpQ& z+8n)kbZ_bZmVUi-S!r@)XXGU#dyC&GeyDh9akS7ZyrA&t{I~P(&OagdKex^2qC|dD_DF#c`&hmfP!*4R>+cz^ntu6J}j2wg)A)Uo#{&-^1^Ox zIbO)ZqLy1IjN#;pwj3{HVZr7zT~7sa0d+-Njvw;wE>zFW$dFupZP>f3x@Gc2vp_Kn zQfLTu1Eu!*&5bR`6IlzR9G9UiRuO+fGTBs)FtV`d!QweTi!n`MIp)Z~!g=6!814}V zk*h}`dHjbZCNy$#h@I4J5%_x5Eyp2w%?ntPpOU!({ezQIIpziK$ltNeR}-#V<}>vX z0@6fVCV3=KQ{qa}TGhu&Xn7#QG|3~N$Wjo^B`Sh!sFf|qBmaD4fg)gn5< zI}#+`)xl4mR!{+5)wke|FnPYR9 z7L<{{B|}z5ti;(JLKw#uS!?2|lW~E@&h86S--0Q!RYUJ2BRlncNlP`3E;6KHD^e)O ze5U?~_ro-{Ov(t=@Nf@z08JTwn8dDRRQHynjC?$;U{O~_3&lPawOJ$rr?y8Jd6K4d z%#(nj{Y_V4=*1O0HhW*8`e9uW{of*?{rL!}i-n?GEjym#z^OrC^!X7Yc32gE|`QVT#lECfN7 z8^c0%<6H{jaBb`CE`-Nxpa_Qw8p@sYeUXC5u2;9t3W&k(W5~;_-hnBML$$3lLt>Ep zAOWI-krYJsZPC^lg5l-o796R@;C$VcrVnOf_bx?Sr<+i)vhs*2MKs3lO+Z~<-Fm30 z9H2-yF*`$_snp8&%%_DQu%tZNr~}6|L~ZLKT?o%-MhaeNA$HMGLJFcV8*M#UFf6K? z+e*sf)HQ6~GTCz_{$I>|uv`Cs%H$tUzHahym7i8VU3o#}(G!0=@oN)LnW&W8G7q)$o9xfM;=4`|DNLE;=Kx=FTAR- zkiRGYvHY?8gK~eA`=#9e>_25co_$vK%*?m>bHn~rw;dhjJDPLUJ>ir?{pcJ{N?Y~n zwxgje2nmP@WR zCJTyJvZVEND5)CTCfkHmL?BpE!kw;EQtY6mTH?Q$hfL-LtGW5iXIHknY?G%bTd*kE z!V<>GlmV=Pvg~cgH5p%y!XJK!Qu?||f4KwOa7_L>kU6?@DGZpM)6Q2KA=>IuOP*ak zCvC?v=V7Q^2kwbumb@QKpcv(ZbE?ji)^frs;|+8PCQoqy>w?80m&uLOSB-{>7l}Yn zOUAyYjDy>Afu}bNl%zn_Ek`YRzm<$2CoZLiTDiHg5ZW7Xl#&4<{sbvK&7P(pE{L`q zljO_V%<=p?H4}{W)JgTkBJ{4VH?|;>L^tUh2PknRrFvqRD-=>{%P~oYSfu)?!I+O5 z2sskTUSlm*RNoRJ$s3g*7Hy>LXfpKO4{t{$)h$ON8M>CE1y!c$yOgfkf?e*&w*_hQ zl^hGN^QhD5-GbFE#~OJB>CP{w6(F40U*2+Lk*`o@&K1g#VPP)fan8blEqEfsQcTO+ zuXGygP(Q7Z>Xu`Nyh{Orh9qJu9ees994TZ#NTm(FTik)|Z(@tKdR&mlUh(GqEQtml zdmqxsI4a1i*lEhnxO?}_>FRXv7ml_Z3*@zWOly-JyNHYK|2&EFiM?_xkoO!(sRm&% z(^}Np62Gp`5k9G7gS?ssN~THhwzQHe{jq9W&lU^ebxx$LLaJ_QJM1qk1yOolwDl~( zFjm9|$4jSJx{qP6sIhgeX|NDSUQ3{iSBay)RsvQG*0GRSRH#$kJe(bkwyp_5$s|?a zhFsw@Ln|bY&M;Ly3_Q5PtGig9V**>v{06GFhTD}ZTSo=Tm%W+;3MY)hd3|WDxPp|^ zRZb{R)>4qTzUZNd-LSzD<#=~7+H>m}0%PoL8M?v#j_(M+6=`f;*;S9{_M@{-iVv9^ z+1pG5PF!kq+}06GoY{TuqF7{doI17fO0;WmMF;|ahax{+y6=OyJOCkea7;=Ix`IcS zx1R2l;<@oyh|E}7U<8R;h~9s(M9+-2E)x{rkq2dZnqq|H?4rckOc=3f>uDhWpv*>Zt)JHZX$%ha?uFt*3;bctSwZOe(~&rD|+FS)hDQ7`oz#Szhi)EKqAa0W0+N z;Sd(gHB;7x3YShiqs#x_k=e5W|9>X+|8JdKsr z#<#{_I6gi0!?E8Od-7O$bZhj5qcf$yE4{yTVJScIxsmHe9$fs(;#-RK!p{nyC|p&z zZ~ja9SLM&m{b%lzx$ASMW&bMs{_LgM6Ek;b?(hfy)osTudCxi;!iOW$4?7*TZO18j z?=j)xWm_L-sN!waZOA0Uf6F1`8`|m?WC-hC_L%;lL60m z+Yv}!g)s0|GJ?WR_ixmcB;-CEdE|wly%1NBDchQ_OF>-H*oHWgL+-Jk#K{cdBNaVV zrCt8D)on)~8R9U|kDCfME3~3$+fhe8n?oLj0#G`#5?$_zvy-qn)on)~d8GkLcFWAP zK1M0!pkGHFSrEK`H_gkx%0Q$cR<>b`{N$x9h+Lj9B7K$E>xs4i{gMJUo$i&MNYIt)}}yUQB+qEC|RL|1dO%zx-ZnT8KyeY?jUdG?}9)H~CzPDB7J z+IHlTp)G<&Qag+S?8{{lKu%c}^C4b$9U{PwrMi}sx!7#@-+JNV=#xb6D?Ii64>h(=6&q)02OBU) z#$m{E^v3onAuQO+c`TigGD~PmzS@IASa7G96iqe-_vHfvc6>pYLU}8tucm}7iLch! zen3bpGVSCFhPIpc4`GogV6>0+zyeEbY@Zy!VuusY@VH@ri9xLU1+j30XzUp-<twZQv$1Q+TYo5_`f z+b4;kvXC&J^g=2x+5}qJzE?;jDwP;uqz!QZ>BJC{gtnM;rKbSW2_YmNw|3dT{;moj z?Fk_fZqTZtGm<7!V|!AN414g ze&b&rf7STH*gaz(8aq5TKH3_+Y4l;GZ7&HQ!do&F5K?!R5x?lM-Mm~&nzTA2X6TO%=$vl}E{ z9be_skRVYa%rFgr4_=z{7tbd;$Q$y&`MM(d>z3Z&qAbX5A%Jt$E6%+1gp&c2tv3Ab~OoeVtG&|{QxOm;(wp4o3i+a?9YT4?+rbpwOl$4ZEzS9nphZBkGI#p9O5w?m~*fifv5 zfs&UH<`a*2nNp#5M?o2%kSLPbc!~bB5LAzW^6t@jykWA#7QLH*MXF21AF!n2;YE30 zU2UwyuWPjf^`sCKWwpFH9Qy^bu}mn`en|+5fSbU7 z3J5hPq!RgDWg0^3yD$VrMFc%BL)D+4swak^7UY5S1RZTk#R4w~L6Jx2;0&krX!}qI ziW~qCWeYodE-KRDOQ}EdHs3YEAH;{)D-|lO)zDTx;{diFm)Q59^KZKa7q7W_`;}N&fo}qXfY` zRF)C{@;njB@HVIM zBNGoS|5^E6n9E3-LmU99jdk+3ui&#pTIQgkDY?3SKE$!GawjS%xheU6kQ6UQEMBd zn_CEv4dFxZ+H2q3ryvTitF|5KW{5$%0WM(TIgAtrD{)+#1%ZbyJ%6Fd<4B`zP;9J( z)CoNgjJS%EO9SBoombS_OM-<0^S5r>}83^!4EWNGzO+fZqS zhP&nX^3aS*nED_bh35UvKoB5um4qYssO^}uwE0IF%wu$iAYrqWl}`GG_2o9qnQsuH zgQ6dR=rDGd0vV^a!JRo2F%E(`66Z1DbHb1 zJd;Qh*`K%CcC?rw3=&yM$NDgF^-icga4?6LBgjv{GZZdenAYS32f#C}PqUgy!h4 zB{q+XJjY0Dz>Jugy^^Q{3bM-=A37*f@1%IB80bSK{I&#Cwe9FGuX;#;G5-;)VCuPk zuHYKFVr1U3 z*Ig^|*V%QMo?dM`Udw=x4aXc^o$^RQ)DN_wvwZ773K(0>M68;O*1?o=*vJq}nb8gpg)GykSiT$ih(4t?LI<3psS4oj0{f6EOoB2@QhZqt?!Kh4An^?)e2W=ad2j zR6+M{I~!OCbQ3-VTRnh*E;1$rz2kh5eQ1=KtWANy^JD@lvz)@SHg*3n%8kkiRv*FZWYs z0KOpii0ofye>MBG?0qv|&AeWR|C!9eHnbs|>CC|;&FtsJR$ic?ftS$={nG&x2=9fD zK#oHxy?$OB@(`!cp^oYda>; z!eAcCBJ58n`Y7C9YdZ?iz`(N5uN7{0FZ@!q?YKYhN9L_9u4#FmJ*1DLwYKB@3^8Q3 z8E?P@^R3yp)!L5ivoP4OOp*&mQiY{z8AN3*o!#4Q4a)9Nra+A`~&zqW5eL^upk~Z)pcKKA!=<$+<7;Q zd!2<(O+Q^=!({(CYQxz1C^8n(9XY|!!ni0X=y=y_ZFoCbk>?Zf#=Z2@Q6myM0;T6I zx6gOtc$|!B9zl`2gOWV;nZ52?qh0SV$|K3NY!;kjv-><@zO!Gewqfgx@5JZ`yaaNt zdgG58w;}D?yj`Po>(xutu6Fg3cCx2Ik$jId zu=h8NMoH*}18~4R0JttBp&x=D0wf0O6vZHv zyzor}DyGV{J!@(Q3@!j12Hi4|`b;GGW$rr;h(I@&EZ_KO4Ji?7FeDN541vUdR7` zxpYVAU@14UIdap;RPl$!j}?yZ^_&+kfnuYp&i;@#fKE$EIfX@1M?ma-{<~=;zcJ+#y3`%2-6wHnf*Yxq!8~}D}9^NWIr5rAPWhQQys%yEU~PM zOf2c&6?O?i)PXIOioUeoWqJw*mSK?UE>7r0+mXzxYMmZy=!N3afZHN~2^bPO2s+S) zeisgLgn=O*)MTuwrFyN?BM?2}VE4sw!eb9z9U_in5Pc~p8Ssoa$fJjtnd)H+IU3P- zWPy@rnK&cb>q&2+YRA!s1_VtvT&Ia%(-g$vYR9AvXWfg?;=av?l)^$BZRnL^fvbn- zW9AZF$|)%h)jAM{e(xG7WEMQCUu za!0K}e=GBz<&NVGed%*ze7HJVXA{-D+L**5u}ciCD!O- z9p@CTv>mBf+iH}sza_8K_|a{IvsP`H;{y5}Ihhi8}|At#Akc=#@Czc>IP?h5nS z!VtCgi@FeLbBh!>D0F!+GOm9PQYT4r&o_s}U_39y_`%qTTHhCj#E|xDiar3R%=O51AKOdsSw4Jz`#L$w247BD z9Q3kIo*8ucbrSzCWPT&Fr@7}PdmcUcgUMf?JTm!!%AZ!=R(WD&V&V@bUOTZ|{(1R# z%g-&JIsTX9?;L;PcnSXhhOx6ozd8Dr(eq0`D}ADLRq4JXUmUq@WTyCc#rGF4EanTJ zD_mE2aQ^H0H{{QO`~R)nk=#ky&u3qjoyvTVKlTg#R69M=ENyb;cv6QG!W(-*8+=LB zah#biBmshXMP#!QrIm^Ar6aa_)N$0A0VVOVD`oF*0~@N*aSWO_x?S4Kw#Jkuriq$6 zikg>>W6~@vyrr4>VTVOU9Y?8IOT@{*Ki8GHp(Q$I%@PZSgXb=+oM-}8mgpEZ3ybGx z=3&c~s~=ETy(3hc_fBR*Fw=}aGYE_0-N}uPW7{l|=rF@C)cK%*NKwb6-9#k9Ti(QXzNx4z8uR=z_J z3;xX?L!vF_YcctYhckzi%Q115T%2jNtF3WRE=S2(Sd93Q>gnM&Y1DDlob?%r)~UbL z^j_#QI%>`kOJIWB&7N-b7!cF&Nhf^O*RL_YIJ)1UD^i`bx9p7 zed@!i3j)tPLDV4F$MlTeIX882+9$BUMLtXVoI4apcWW{azvj6#qcNM zF`c=xq3Rt7Kh*Bw?&loO#+8p_)7O>WrEy4dpTDnn9OGxfFcXduGFs(6nCfNA9aul9 z;q>ftq?yMWPaRK~>SZe($M>b{ZTbA5kZ=`mP37s$dfR%((S4RYB!A&V^t==QvQ|2d z@v{V)SztbBq9;8dkR$#qfk>{=grbuHeu0)d(*ZrBoh2%U42v0mbcXbIreyEk2@~%1skPz_w9h`!wALu+<)ZtwS ziGCN)Yo(?TNYX#5D}-m`g22EPDQ*pB1a7Z&9vQ-LE+scmU?EhrbsiDG;CgmtoFRX~ez0@4+oPV`B9Cy%urH?X4V7B# zoMp;F1sOpg)zrb9^wCD=Oo8xaTI3}qXHTYe=cH+H^Ji5%XPDy5?&T#VYFE&4;4>es zbx!X>cy=2_XygD$VFk6Dy{B9Mzb^6rjeE|T{ENwVPac{atNfqJt1Aa4{&V7U6E{sf zy8Hv`|F14TnE3xaYldWa`JG1@^B>{Z@adpQe)fhY^ zm07dYJckZjy}HvQ)zbSD2zi6bO?nA@1RzXKtvmjRU~)kZ8cA7=dTpo2sinW8K;T{Q zK4Dzo;7tb=&Z+J|s)_CLV$d#4k}Pi4_d|TXx?^%_%)`U8qzQH^+-|VEZM=1a>Whm7MVsI>H&FhVHT@oK(HjtPI#6faC= z$nLOTq0{_i7!WLoS*YP`YUa-BPLELYd}9hd0U_g|J;n4lKClCy=D)7Vc1o=%GvI@} zq`Cv0=J#9#fnCCNJ*{G(ln{;Tj-%1M>ZHMjf=UuxK^uH1>Nxhy=f)!i6abUn@n8Bz zDDgpc=I7j%4)mE!2KHD13SY4T3$*z4kt_!@^BdKUW6_Lt$-EmHgM$@rjatVf&sZ0Q zYtaR>C~uAcI`^K&{iG&ioiqR&+@QYXk~EtaVK8jKPcY zwk5ttkoPKlui7!WGr?e@8PlwTa^NYO+?hadY#3am+xk-Em zKt78j&%D+dIUuEIb_!Y%!EmIRfkCw`Pv21xdYtXy*fI-4MiqK}?n1%C^XUGE(#Vc!_=Y%k%Vv4fQ&=xEFwAOic0E3+YH4`p`ES^y9JgbZ0F=8^7 z1InAGmCzQ$4qh9AAi71NItQHEVTYGH#{|Ob-XR6|H5o`Ph1b2Sb*>5NgSUejc&yV_ zDM4hbKQn+qPd2r1q_qRzw(vK#&eb6diux$p($Sn(j-w$A25>M4SGO&vFbcn4?OfHx z@P1of527Z6>_uQLeA{P)AaI3f?9h~5N(>;b3_wVD47;rvl{7@uIpRWfPpX?UE726K zcs+h+uy!C-*LQ^_4dprz9~6I4Mi$aZqjR}Hc!PByBwA;3zjE%(I-tx48l9(yusFU< z#L^qz#L7`&eVJ&<=kD=auBes3zrQlm+rz*;t*fN8ttP*{z%%D~;W{gw`ed2+O8mc= z`GCa#(*G~~|5GMUs(hvLhRS&p|32}FiK{10F5g|gqr6hij;#uSVWJ5*2@5{8aJU;(ZHWF1)tz*!(}|e=~nseoyYpxjS;p z+5gFYCVRb`|NjABIPdv)2X{?4 z%yT>`9+2WT$n{>9bYNQ#%%`dE2zBPAof(!R_3R{)W6NhprO}RK&AeW|ke}pju{-^| zE#;%QLHs{x(45urLjJni&a${I`Phv=srI5Dw`p508co-IhqONSvL zsZ3Ig1tJi60OT5CfrplN94Y2?EM$H-$CTW;a@BlW=<1an$A|g&6$Fx&8hN?AuO{sSxo_XGZd=W#SY~)MZK?5M&;=Tb{t1$L6F6e_oMrp zJcV#1+Hw4tH+d(IX|gSum_AJ13+Ke~WZrYa@CP2Yk`Da-4%fzhmu))~?KrB;5QxMX z)|z)q`)kstEun0(iBM)nen#FXL_6}bU>_=_9zM6@%)Fml-V+3Z$v^6rPe`Cw2$ZAF zjD^YIHmb4I#i)NdX)|w(b{vCdLh*RQH2?G$X6xwu9Y>^{?lZYClaj;YnOODF7UkU+ z$`biUq1Nj=j!g63v+{tLoC{2oU!+*?*}H2y5NbwPOz|`@6!OOYjQ7gVexWe z=R6pEGfD2LZx;Xg-A$O?sqHv2&6_0vL)cc56-vV?463JhAkhrgV?p{%_~v?eK?)+@ zS>8Ea)Zsl+%v8gZ(_saV;0kjz^3Rg1~+I@&Ub-2F!>0a|`dedmE9l=oP=F?ifEi3d@A z8|XoAT;6#=7slgqK$UZ(-28ICNb$agnz_HAcn=k9IiiqF2o@mZ7HT^uhcGC$m!L=4 ztN5?)9*5k_%Fg}doBO(LQLnrJMG8=*0{XT8gM(iV?%Y?T@wE{M5=-L6(pZ{M8$n~| zJ_6*+2f(t*bKfKcW1lYQH)XbJJNGtK1Qr^aU04XFeKPMpuyc|b@67QqHW>vnrTy=n z(lQ_WUI8h@20M}_08uzk;{W-~D`o!Q4SV)Ze%tZ?*~;fC&#jy`@h1~^OdKfxr2NtH z73F)4e}4RB<5Oeb8++f_g=2-$)zRmTo?iM!>CL73$iI(#eB`Q;`xd`cd}VRI@b|9s ze2xd3Hzcw0H7QXWk4-JRg!Jgk+u!Bvg7EebjuzKBv(fd7jb)BV>h7pM0?Js8#|7a z@~NHnb4F3(`%~rG--V`7#cxMDj-2xC1{#zpK@<;H_j+hsn!rU@j-&EIaTij+OSO-l zZ5)DfT$KSeL!SmIm)I8^&{eW2>IsbivERsf=V|2xKB5 z0RtIHAVFmAwnc)1EiFS3TwsKlfVe~9wd@S&LQF`_?|^x6e6y@9!Qwm)5>)f8e_`C@O8pCyToas=LME3AC32MOiRs z=b*+P>iP@pR}u=&XqBG$q-A>aVI$ukNU-E5NvS)))o#{yba=zD@J*y%pRo+(aNeUFYsikFGw?7 z$^@7ij}7m*;L)oc>tND=dmUSSku@CXH%_T~KyP`U4QegpTYBr5@+<>Dm6k zo@r98uI%Itx`MteFtBJE6bTy3gR|Pz1#+BW(^Ae{u|TQV8EmI#K?OEVlPb)C9LU#D zp;%y#RZA!++m1|G78WS;;}?Xa>wiL3Dlr@&)zrzf zrfe1y71npb(zsTb?Z4QPioB3rRD(J1zKaA(QFm%P86Z#YPk*yieV6C!LQAZb6?zVn zvC_w~HtR(e6m~M5m}AOCg+kviu%N`TCqu!t@A>}ot<9o407oZg_SMZQ|8lnfJWDKM zOyMi~HtSpi3W*334a`>2H*0hMIfapxJccV+3@ZbT991OL{cKApZg)OnoF!vH?K7Y- zA*pa#iSJ|;>WpmvSpt8r`v0HZcKx=e%zt(Mo%5&6{r%jp&AoJP`)r-=|2t+LX8PZmGo|SV zrmvYkdg?nSpVtFJGiryegucGmPUKj-?xND?vN}{v>Jb2o z>~jgS<6QN;7}KWPyQf}oHY0WzP^37EsmZ*@zIhlKgadZio_aypq;P1_M@bU4(^kZC z&<-2G$?Ac!8GV$H2b&Ljm4cBt164g*8(BS2HY$`XjdR-9VGBy3ZVIWWc9zZ@9uE|$ z0(GNFwTS&iGPcJ9-N@@b>Sp+a6;cuYWY9|7B`H2(1B>1M)VvAJipAwfR&S(SCKlvQ%H%2biy#8I&T(ML#41=GW$)o<=xi3Nmw}bl1J{#MRnZA@ zuJ|u**)yP1@s~jB;e1j~OtC~LMv_D#r8lI?>w){xcAm?RP*lu?saT@*f&9_1@EpZW zi_W!)1^c6ZMIqO)RAT2!#S-lb{Es3Rj)#x|@q1@tK>+D;k>yNiDYknItgId=AVni~ zu5mxpk1Eo7T_f^(K?9`~6(^x@&s`7f^hm;kP;Ym+~fzFoZ z3Iji+iAB;0RD>%Cx{=qRiBvtMJqF=al3`u9^NxBTjOONsy#}ru5=Jrf@sqc1uG7yu z=j6@$_Tqj@{y^yANbgd|zs)ipqb`HibJCmxj?=S@^4)oTn~DWhx6VwJy{)u)Oz4(rykI4>wR z%-?!UfU4&W<*KE{0!s2~@fHazdR)BH=koewA=dDAfkhgsG!YO^%c1k-yR-U)x>HHvHm(|CL%}VS$RyE2WQ>wtaTntF|3I|CRZ-&F`N3-rPs$E}5H~eQ5U9*=NoC&zbkmc zwNm+P<+{o-<*%0CQ9h;g2>;N(=~q?{3`^=gh1w^Avm%)ek)f=9QSOR@VM!QR0!6N& zu>#4GvOZ+A0Q4(?RF|VEVks=kiX=jyv&2D&I`q$y zwOg<(Y3oCvm<2%0%XLYMSPIQjh()M}-HKy+mRNyi(RNE(0rJap@rY9qc$Op=$2DYvpQ6Z`VmQBAXPu^|8K5Pp<2R6#JoWv$V>LDFslcu zMcFJm7f6@2cxt`ASy^3ST7pzE@mj*!QPjbL3QWr=eGs4)rR0mm;OJsjH)~_F4%5O7 zIP%m21$`joKCL->hKc#qW_6gBRAS7^Zb_8Fv8Pfry0g^fmEM)r1JjaPA5a)eLPNNY z&PG;On3f=w1kK6z*h+3PBZ)xun3iG7GC;BGI4#VU^r=-KT9OM4o+>XGae_XS{sH&Z zAzaQq?9`E39;CuKV1d%3qd?;O6{S48uDJ5*-Rp~CM9vjUyD#5)^%YySJa=XFz`7)5 zlc^*mODzwa9$mJ)o@vi32`4C*j1y9_@P^Yg_SHAlb<)d-H<3HO?-YC1xmScs9c_j< zh`EZL6ua!I!eZU*DWHZea=rmZ7Z(mUPF#DgLY3~z>n~8Tpa#)>dgyHpE-?L<(kHU| z^NamYXsjG=x_VP<)Vn8!4)m_2vuU3vXU?QGo?!<#k8ToNmJo+=i-yX3CN zfODPitbU3L1?z{ePApL?;26*|)bwP5N|BKaQC`7(qhxa{KE?|5jjujAt3Ov2E97WV z7ll%IZm_JryAW$sOPQyPnS|lYgxWsTz^aA_hg}vFmjrL))(XwT!)EO)7C5R7NVUdo zBkk8BFGJNVF?QDru@YF6l5$6r8|Hf(zmeD13@mAlNkf*{a8`G#^p3o~s$$7>2IQhG zWwb^Wt9(RWUs3mKm0`y`8$@3t^G4mTiPvn_mjhP9C}FTJF*t56f;b0nh*$>(qd|rL zPyPP`+pgJmq>q{}*d#2LJz6lSfZ{W#VlUyT`vfe$V(tkfe)%Tr%XmpImO*UpQwCl?_2IxHd^mb_KpR@`lQW2oz2b<6V6fQiuf` zqIfP~N&2ta6nNl3$qEA-lCnueEa^H$uj$B@9r*e97_h=XhA11)@gdZUebc{H&5sCA zqJ&8h3;%#p_^qe$kRK7IMBgnj$eo?-(Rr09VYgt%c>NEWmxmB5Z$Ol&OT^LRex{d^ zYrC?B%9My)5@RQkD#Eh9qRNyARCvt>N*>j(NSLJ2V@gKfS-~PVOS1Z1?`+-(M2VtY z;-Ar=*%i(foexBbqVwd}h+P>+m8{(gM2R96Rx{zsHCJM!T&N0Bf@3W2zu0fk8!m;& z8$F_A^!*nsdVLWX+@j$Qsi*~0k_zyGMa+zMHf|ZHYJ{vYa3#uq;hYg^=izX!Q6Wph zelawGjuNmXF08BpS(0|m*e~v7`keUcbv8B|kR_=?*g`CtxA=wXQ6hHJ!dr$|1C6F)FT&y!r zc;%|)-B-{KX)9Jzf&zWLA>2;VAeaK?vU=IF+YBgP4UBQP8^-|x>Q)1aJAyH1#Gido zx2RCG`?+pOOdq)Ipl5QG#K%P5pB z!feP_A9N7TuHPs~NtK{0G*1SlU|XKLQzc#}h{^YidLj-aR$SaNS6wIH@wEmNHQ4xi zbQ0}(rE72 zwH6l4r2gw^f-Xo2L$w{iE(}&L*D)Aw5;Yv#LtLQP;uc53Fh>z6eC{Scq5pwq> z`sWRZkF*gbP*n9$t`e8(8ETR@dYngkw}d{%%J3Plc|#>Vkc&Y>6tYo!>pSiZNDp<5 z%q!qCLj1b0vWCich+JGl)WOI5rGLe|5%`Xj-yl#6^b96>-FG`?jUL}IYIK5y##0YG zFydSnYqJsPj?o5rE4u{>Mu+mvp)7dP1F0z{eR&{wa!w<#9j7J?MUY@=>EMf7TI~Bl ztH5B@Dz{{f9_x`DML!eP!PO=35(ra6{`HxS)<2#B*h}i zM-bCO*1KpuPt@5_g%H5@+d1Fa^FxV?D28_Cxrd9W<{H3h1C|H_U zlxc8wyq|Evg2Fb(TXV&=*{tVSQ1p7k^NYJetNV^N>@cC=wAaZ)@4v1(RNgpAppq{l z19`AUh#$v?P~G>+X4ZIift6HJDq1A05If2$7At&~1%)rl{ot}F;S)|QHY;HwF<6J{ z5y|(C_&s&AO7F}Y&or>4c@edcu>+}Ny*+Q7U|>lElNZdTTD4!<=H;%Q$BIZboKxf@s-gt_I zMO8h?!R{pm)ptH?9Bn}f9Y=6HatbV{qb#U(U`T3nscF_Y(t_d! zgfZF5H4=`)lIqD86rKvXpuPnb{{Q{r|6jZ9sDt_c_sm@s^8arM`TxH#BmVzqre8IE z%+yz>-Z^zj?fbP~tG%@L*vZ!98zvVf{$k>nCiYEK@&B(IKW6NY#@;@5GIRfawR%Z) zuJT~zmdc6cub1yG=S=;(f5fN%@&6!e2J&On+*y?}e@W=0JGAS(Z)8o#4|$b_Zy}&) z87M_3YrX=O+cukl{W$(Ee&~ zf}SuH%<<~pkvDqW$EZ*X(x(@pr151RO1*>1ugDuc@*{yoNEyzFo!<)E4lZ!0>aKiQ z)==0FmbgNvejHK4hmj|w%EdJs*pE?P52(Vrr(I7Rw^ff-^}f6j=#Nn&C18A(x1?nTIT}0oJOXk%%Z#1Zn zRHg#kg*Ct%E{tX&)v!VgFyZDWwXREk8V``BR-Nh0`HN;k_pSy z@L>={x1fqO_0i1+yhm!P5IZlmg)kKZkv$cPjSs9xQXN1d#fsZzi#j}%of1e74T^kW z+$-NV%o;t;BcWMjPfEa%fLC;Fso#){hpWS*pK@Y&$T)`*hU?v?L-*F86O%WtO5a*x z(=o}Vu*!97jXjz*u2l7%evI^5XJG9X&uVTv2l@&NiZI+R0(u_30_t)TioKFCQ~j66 z(yLb(Pzx|~AjMx$huUnsTvc{jXHz&%E47H1(~+{qWvWmh5n3mf5Yw0z)XOX=X0q_) zJ1e0YFSVegCoFld(R*)6^%4sTeuS}-G1+24y*T~cqwN@NqyfnIpuQ@oC-Crx^2Vhi z)u^FWK#?`UjTN^+Hn6hBCB_PgPm%Vz=8Gh3HZC^witJz-^7xb?Z(L+8kQPYr4{>6G zxI&or^t`2$Q0!yr=W%xz52rspedY8KQ-3h^GgIre zzo~twc0sK+`T5BkCZ9g>ClfzA@%-_B8ozh^^6@7y`|nL-tJS}*ez1Ceb+YpL$_fB+bLHok{;~AQAK%?S_!D`vM{^9@ysNwELyUSz1jX5cC~pRyWAp+lu-14UDWQm- zNcC%=yv;y#XjqbNvPMk0|1}J(tf?>^gU;1yQ6VhFF_T zn2wZnSzu8?Mzv|AyOvae=ukEbPo2okzFf7YGutH z)iG?02dN}ISBN2(eUdi=(~;bGVhH$Ck>fICj1O19X3fBKB%^uc?}LTkABQ&7jVCZz z5FM$&U{Rp}s}NK57F1w5G^yAu>M&f4BU1I4j?sOWk~^FhENCxOAUcv#Q58+r3}k(r zvZOC?vkB3Wz8oNYq(WY%i1x2P{c^~f3e7D6pu~mck?7O`10Y&5_b~mPn0|m~-w&Ebtr}7PdXLP+kkH8Hf%Ai?(Gn zs-WFV|0}BdB^O{|Iy5Zu5ts%UyRrsW)>NpDu=nEklRzH7V!C$a%_GtlSOJAw%o^iZ zo*`D=e3FSJ9Upo4o!j+93yX(ZM*2p1--cXS^9co3;)Wo$Ax%{n?w5{j3>CC*HV+R_ z$16~TB$zLy*yMWTw;pSWMZ(|88dIX3OWbZ?F?nT?`C{=cXy`-Ue2j%f7gy%XJFzyK+tQUn;ru|B z(Wg5y9}KBBoAVZuT!QYiGiR-jdUmo>oo6R+&RSSf`^NxA?=?STU`ev~PAcSl*J;+A zPRCuszGF;sZ@HH^Wr;;j!WwyXzK@tUYX;T=wUW35aaRIEA@b&=g|#kKT0D%dfXJ+s8KL`K+NmKuI>Mc{dYTv1Sq;_F#X7US@ zH%=Zu@#hnFPi&6=aQrvNUpao{*q6uNI<~v|z3M%I|9=Sn|JmhlmVW{M|6fY?9rWh^ zt^Xr$LUg2=LW-oQz9UiO;5J-kvvmTt^a1 zC{+?Cw^}mTa(ydr2C`$67+T$pTo~tMYWvDN#YryMj)W&eC75)jB{&gh6R0}8vDplC z$7m}o#Das7t`q$hWJA8%5OLD%ksXQ6LV+PpNbrp{Sl{>$W=)0dKq|=;=DcIo_52T; zzRa6Fwj&|dA_d^k|M1X}C8mm1*}mC??htZ()O@0E7(Dwbahx91&|VE0VtEs`Bdzf? z`+_pTO!1|emhQ=#f$vC31(ujR>yQf`yA@|t;X77$!w}QXjJh;Z+WU95x>-O4z9T7B zXlF`qTe`pYp>!S1n?1f`^b;s3bQ73M|yorC>E!X&5A7xb$z^) z3g1CQ2q23$>2w$wPU=>b-jp{3*^$KJMrN<5&E3kIF<*-6{dqHx z9Vu5^dUAm*|Si-9So71Z8e}riuj?IYBf4 ziZhIKCC!?f7L;Vw5%qU{!MwTGS|R);LlK=(y{x&%5{ptx0*+hhDdzQXVb*+s0TpJi z@a%YQEufxnLE!~0O9q?c6keD&H;m1q#7`Wd7|KwGym`8XC2@pB^r0`7iFKNVMNR@Y zM4YXpVv&Q`Jk`SDS|&mm@4Sj7H_h_|D|s(VVF|nqp{3|DwN(BT1Bw)mRYnB6dS`N% zo@}g;Nv@LF73ZKEE6khEwXldR(Xl+XyG^X!7M8sFoS*16HL-SCSa|H@k;bWTCe}_1 z3yzq!MDeR{U}ep9&Hsl9hdyN(s57;=@c%zA{r~#;|BuXleD1|_kBR3075V?yGXL)@ zQ*WEvUHe|`p4!E=*~u?X-aL8Y#5X41JCTq7>-hcS*Nz`e{{K72o>%>T_2bo-R3BIA zRPL;-l)qj6mGb%JTIuuuR<}R(b9pQ9A1OnMQ61DhO8;Ef1z!4K)(ZSb>X4BmD$QlM zlj3pl#vyA3`a^>vwSab=&hy$**$FESaQoweXS()sb=h&9G5;4yp3KcBY( z?UCFldNC8J5*Ed^QSGb+?V*T83x6>ZQHTDXs~c7NX4dM_9;0sU>S7phvx^(jbJ=ce zwhGoGrBt}J(vnG1`5a1>wF2jn)O0Fwq%J|KwEGKGm1-kvL3yN~UMVdkh`&Z5X0$#X zYO@9Bk!HyQ)B^OjkH^eff%DMTCy6~2OZe=8R-imIC{$F;6pvc5Re|wHK^66T4B7Rj zjkh2?(z`BDq{%H(OdG|w^|yb zQt#-IDsKh0BjwV{UdfPTyvJyP>S-p?w58G=f`#csyu@VyZ+~jm3Ur6IMEqHhTmh4f zyan5l_S!`(l9mXb#T&0K5nH-d(e6IMq7yn%`sh3xPhI+-Yo=uwUE`&h2Wx(GUxdPqKyMG2F)1Z#Lhc-KBg*=}kN(O86*AKXVUC#zE*NClx>%$P4r&&>H7`V@~E02 zG7$#|jpgOdpE9tBNiflq^8dbA23FR5jqwH7@CxzUU8XW$@YR-BRD;lX*)_jWuF~sO zv8d`6tBr@urS5t2x&msHAb}nxpocTSY?l6RsrO&${e}PkfujH4*8IQk&V7XZ|Jm6G z$^Sob=Iep~e{}j&%>O$A{{M|ri?zS3{Zj2L`u~4s^4iIxCjQXq|Nk46%PWVMJLS8| z%cZ|6eIVt>Yk!uv6mnxt3jHzT!xU<#RciuSLc`NW6np_a{JlL)bZ{FBeAUG5(>D{zWNG>`>rd$fc5!OgcL)?{tYt_KY zS}+_b_q@Q8j911R_Yb!LmA3-Jp)FCGdC}F@XA0&mh2kj0Vn!H=Xs)gsVudRdM}b9H zi@Y130hhM|#i1;bEL@sX(@NX5U0Dl`L*04YAL1`n^)T@R^T{B zU+e;lCPENs@d2{#2!-MZP^A3tq9sMlEt$%tP#irhB6sk5kttzdWi5r`D6q&SWD;a- zDp^Ym6o;Y^(x!x%P3-X-V&yG`<0!0$UUAj# zD|hX>daK?3ZFy^107t{b0FuClN5#DNc%kY!V$NP`NyQ>%iME-MO32ATGR|*wN_WdNmN?l+Juq#aLqgrgsjvLyn!OX$(WqIq_78XV? z?aQ{}^TSxf=|Qb$6>CgveaMCjV=p7cSJ!w`-a1j;E~ZLj;w&vtp5@rC@@KNvGgYw` zci`?x`lqY>|E8>ULg8c&`&B5{;tuQ^hN{Ldhq}P>hqBi3s#F{vF;wZo>ER&m$Xm}4 zsH8qDgmf_(SbTOJZ~MRZhRP0NfPe>_oFUR^z`XzELbu|w35Mrp1K%~(kJrP z(=4ozYJ?-?PzciNT2HmGaI{I=j~_>Ujc?0a#~N6)l3FIiHNNb1ER5c#2v#b|mHnd8 z2)-e`T@QfMx(%&vsB{mBG|JRH8f71W&?eiOR|2X%_xy$Abn{Ca$VRmWe zf6e^onX_lA)1RBZe)=i&|9c1h{~rnc|K}$kn!E-6|LYU)nbP`4l9GOBs>k^Odu9pgK~fzF^Tyll1f0VbjIR+Atld z@M^I@>GOuI;yF^RP+>ZFy&+9_BzbmY!ckQ>T)%c;I#MeXES^bDRczK7D{KX#LxaKy zCUoy5FX1`TnO<)WuJ&ptJ>JrO$Z?-NgqU57-fW@7(m>_OKoqYfNs8Abu>t*T+naqiaN^~_g zNz~0MeK~8rRP)`DDopttFe7xR&*iO`sA3TqlK#PK14mKEdRN|hv4thow^+Q_%nx}?BLe8eKiM9ke)Msw3f>*C4MS%)1rk}b zj60h+ai{m-_!d z9D7^n|NpV-rPXbf{gu~OPWtz(|8J|@2c?B14PhU`!FEtm62niKTKMf<^TJ_u^K0{Goivw#t2gMUyX_4G7aKp4lg-D5pQFS7t8GWBLZ8(qg zi5IEXa7JYuX{JGo@sM4Ih#~tmwwlxh z5<&}%N9y_)C@T1NQcN3#Ce#ne_1_MRhk_+jX&ETuB;NBjl!vOMQj)f`K)-jFlIHEe zd1!LU#A9UhxiDE9(j%RU!G6)>kUpVKUps5}IFF>l^HP%EJ5VC3f5oibqdd}3c*Z0u z#-UynYTsrX#zQ?jxQ%o?_T4jCyT^B=g@QYgSe*09Qs|Cw&0t+pRY;J%uMO(@=sVL6 zbcb>drSHrF6HueKLdD|B3Ur4Cg>jFq8b5~?)X}2v3KTOlnG`mVmt#R4WkK;8((%W4 zk!I~9EhuO-hDy3EMjEL9c3P)Y6$*`*8xLC_D|I<>iyANBX}Rd>>LYu)7&R~EDOw&HqEB9SFTki^B~ zl|GZV=Zp0vp}3Hl&O<(-V}0d`tUaf0JEPNxngJGTgSzdU!`T8VAy$~eMs5&+v%Xj= zlvp$~78W4{>e=JShJlr}r;F`MoE>IQ(#4zBgicnYJ!Oa`DI6rvIK$3)yQX3-Nz{xx zkYobKb}@;qJy|RDzVu+>|9`gV|F@O@|Gl}7&RsG$Kl`QG+h$Li zc{uR@W7EGq{hH~gP5sH#&rY3Q`-j>mYnRm?H`$)Nb8>0ouO>b)an8ip_~*v2AAic& zSE>I$h53IUtG>AUm`c5Jd*wOhZrfXtU4ijPy_g~uj0ZK$ z&KEOl2g)P$oCp@FkJJyvbgi|*z<6j-6k}kB#m|Wa6$lRviX7HJvi5h&f(m?x0wpY; zj1!E^3kxdH9Z4v0A9(|uohs3Wz;>kk{}uWqknlsgVtlEoO3J+**p5^Z4N#K!vdDkY zMWimU`WJaSupLRw;;vE8L#7RoVkA=~O|9n=8kfD+1ah{a^?bsa|ZAM=E&{p*_+*gFs1n4$Z4QVE}HM zKzpQ)&ob@WNOagam>j2mLWwB!Xphkw0xapKNj0V^A=#_bO(>oT#+7+E8!o=n1S<8?6QW0{;B4IePuiziScK>4 z;2mcLtH*{eHtpwGSkOp2N#XE>spw+UK1F*}WsPg(cnxGpm|~r5i6sTqs6_Or8dzET zxdqnf^Ce;Lx-{QtiX{r|RC8u< zS|GI@lbk-q9+MmstfNvMbPMAJf#75GMF06#<=U5bdXz^}ENM5*IE*;gRD~*iIPdg0 zk0h2jp&SU;c2(b>cLM2=x<6PV1MS%^-`JzluV9$ zV3|zj2uj_qeOX6kJp@WdbV`bw<0Ecloxpme3@3r&E8_3PCtj5bs6cvXQ0M~@a~IhJ zRFCr*y@!x0B=EtmMlY{=51o;90_BmCN?JN$gHaLaI@CxND36pf2o#1B49Zqcnwjwe zRG>T*sjvo?uu@_x+S+!N@jxoMX=DIEbUUbfg;Xlzv9gnhCAzT7S9u2%j7Qoa7buEp zaf@T3-C7`&hYrO8*{V1JN{8C)KzXFe@f9Wt(zb%olIQYceSz>uen3GYw87}HNJDj@ zvQ8j86eyS>W>%B_v_PMjuw>B4Ej|Feafol#8aUovL~e!6L~)95t7XpLHr06!bAPW;}XaKR%nC zvT>%Rf&-Q%y8d*eyi>CFUAo6(Yei7jzPIl(vG|7c6Nv0T6YEX`i!dIy4eUYx8yZ+y z`;D68fj*G@#CsU`Ff*X?_8Tm*#GfVq%%k$OwQt{HVbKhi&5zTTOu241v3SKGF{4}F zz{=XM7cAvMCA*G!OWuyL?b}Q!nY}pBGs#fY_N~?mspcgk#KqbOiFb>M#Y{+wv%I@? zv$aI&DlU^R`--YBF>BwXLP5k*sVC#4qVuCeZMJVzF9@J$B}Ag0>mke9uTu{XNNa>~ zpt$Bh!R#PdT~{a+sHeC zXjn3rTk1KTSb^uzurMl!E4g|?$kqp8mEm51JNPQP*PE;MB_q>Sub_d8fyAq<4$l25LCm z%GIMg(pc2J(s#$D5aPu2_>LqNHaW9528=^>je^x9JknU9lQtn7htf-+F)$vAqLRSJ zP>{v=09l{0$9Sa0!hc+qcJvOh1R6=Nj;V1KOXLcq zhoY(k24$Q;to16EY<-XPNJP(==^+{N3j-9Gwe^AX(8R(Xkp9;m<4Lp&&O?1a~$~c3Vqi=a=Xw;DM6u z+GSu7OjyFba(V8RS7e=?1y)icLTNSqV?5R-QU7&;N(D{WEs_w4qS0c#zgwzum3}+# ztXWtj4D%sfS;J$GW}Q`IiJZiBiqBlzMRx zWI~a&M2TwTsOeC9JB#U7?Q6UFhLDBy`0^}|;QE3k6OM;8!1TEuo#$9kMB`8^mpQ_w z@35e_{z&_FIz*k53@Fr-wk1pg>}$Ke=~?I52GjzHV({axs>VC=&a(tcIfGp8)NPVl z*Oy8^ga4RyPAsqzR|7+vAd;5I0`Qz?H1wGklw=vv{LCX3P$#IHwI~G>G9u3zN$4DJ zNX5H~+2$K+k5tdFpeUChb{0>TQ1>0E<1DCk^qn<2xBclB)EZtpXD~94EUBJmK?#Mo zHo)5GP=){h=_3DM`v1Lc{<(91NB;lC2kZa8G4tM;qW=G?=_k?u|IJhDwZEx-uy#Rh zYVr${H%=Zu@n;k7o_N9dKaJlze);&}W8JYgjjdF_UHz5n`PEwGcPp=}oKXH+`90;$ z(hp0Yw%mKq|Ce`re8;dcx4wG;%2ArWIh$6MelF|w2#?`2)x+Xp6DP)TJ~y&%kMBrB zF~d$mzrK&#?a>`+C~A8N-ftxo9)iB?_SlXzl*|?&{Xe?*bv@baLUu@c=`a*;5vhro zIShdH-5K3Lbtp)5ab(YZeZ$%Hz;q;`X!^3YOtLY3+I$}{FdZ5cM~a3hPKUh<(;?S> zVylG9;bD^t)+beVo8&!MbPikI<$T$$(P z`K%Lo4&@u-662fE{iVM`^&4U_sWb=UKuP=JxdqPwbz$BKG)K}l0ZIacc#M&&q3*l5 zKq}86V&Q9Gez};OY9s3eoFXo*d&oTV$ zaQ%@)D|ua#N9)-6@?_qD=upf;>VhQ92)XAuiRDK&J5U{9rGkU2G8dG*NvcW;xdxMj zheokxoxpS?Z!PMA2qEmEIbL+ts0xA6q%s}MJ*75+8-Ad8P1Se~VqiLw-%vU*p{As= zNBgcyC2IN_b>G2~APL>ZJo_%eh*zuE79(OgJ~$k%89*%YdVxybH5AhFJ}*(d7Hzz` zTM~A@&Jb&fd}B#qi?Gz~LabL=Vo{rdq2)>wlc?FX78XGup+ch|+nI&eejIJU`UJ$qgat@%`Vxbf!dxc9%e}%E8!KGLY9qMeq!+W!rN#1FEm``U>;TC6-vE zVPl)dXIfP)`G^-=SZg%#A}kTTWCm8&xyV|gjK-nPD8ka0Sor@BjPn04oqKG^|6dIK z|Ie8jr~d!d)5lKz@zlGfo>%*R?c=qV)V9O_-#)p6{(rw1`u_?4e-!=y-a59s`rYb1 z)r+fhm4_;~R-R4&zh5k$LH_>(9v}Zue<$nq*pA^7kKaxOCiW(^BF?0YE@VflYO;W0 z8zGuJx^m>@c{gw!qozuLl0rZ-P2(7{`caO&JnJf42Uu88WI|Kn;0q#W-5%GG*esx^ z&>`p)JGQFc;coY+jx-eQXdy9OJS|WP(@`vt5UVt;jx^YkDli?R9zy}e5hcqit~j=! z0@0yCNiHqde`G#cPzuixq$24~W)-=-KK4rCISME-cW~dM$5NLn?*^VDsiT;{(xQzC zH<5Rx>geGQWnG2nD8wR(d8gRH{d?9D3!)?C5fxC>Mq#GJ46P~_w}cOA>e8Z<08&8@Sv9EZuOw~HZ5Q`uHxih{hbU8jpTUgi+1ejb= zRlz#S!XnX#qG1=CCRj&WSVV;|MO?{^vh`0EEJaa?I7(`1Y`Wcp>+kA=#kfbyoDtLxYh@1(be^ppOkeUSL}P@dLZipev!i4xHEye z?;Bb7FawI{3p4_xi{ldl^;iQ+$_Lj;CGgzKKy6o{NF|UwJ=%YBY%R=?1y@K2spf%t!to=WGf>gR&})wtURy8g*%xGc&V%caBC8#X6!?-Ta&Rue z$ys+!m1;q9^tc#yZUqyD;_HLMIM2+wvj!CM(1?wOSw3Z$v7o5PT9eWe4^-j*Q~&?K zwrjWb`~Teo|35qX;Oxz_C(e9*<~=ieryrgEjp@s$pD@*(dehWu?XLs>KRx+-@c$<; z|L?sM+4v8~KRtfs_!Gx|f9%a;>(##v`Tw((2P?Pq{QrNq`u}d=JVpcNeBLnXgWP>8 zVEe1r5Bs@!H?ST_ENOj3@LkwG2iDX_v#vsWAQxB!Wh6l{vQbpI(BK~Jk+_3o1PNp& z9f6&vJ+L0hw+*OOnqgAs5b268)n*scBUP4LEO3Pw)>`aY=}1|($9bgJhdE9pA--c( zsC`*CP#)U)q=^7mwr71n^(c?DRK!_n#^nu_^casMl(-zkO5!_KUEs!M7s4Zzc@cJ9 zX7}(+MjG0`$}owgsnQNSUg;NfM%L}o9SNbi1$@x1f4#M`D3U#i@~}+hykD-9UCE?Kq%F*e5+PW);+J zub!TFAv=`t23SOpxvX8`4KaHI+o8!tJ`aYD(<;onJ-Q=dfgu-^_8OVXz1Q1(+?X`o z4Sa_t7j`{;)wfa;hOvewO>cGs-!V#Rqw&ZkW)qpcX}Jb_^=)=xJCw7tD*g2+(RNj| zqot4?ii@x+tuAS2zq}IN$d;D&$d06zhJi`Dd;^L%@@|joNPa;qdYJ^_vcG2DyxE29 zP;PhWF-kJQKqa)bz#i3+SRhDrO_GkKk=biO1*Ri;IRHg&5W$T&K4n2&sD449xEb(+ z;+T>J^&$(3^d|{lM`o`Db%6yXb(}<$TzZvv&ljlV5oCeHfFza|*&phaB_8p4mRRUI zwyKM!#9G6~BJUzLu~e}Re<<&sV`1ST(7((T29iMW*(Mh0**H{@8L7%8So4rB*Z8ic6_u)s2)Gfr1f?U#-G zK#v9)b;D_ZPKk%iN!v<{Iz;dzKM;73R79HQ`=p#uNkLw+BO=Xwjsrr3Bt63AFrR~v z7=(TwOI>35?(BfdgwTDT>>T(RO3EErY*%1Ho^{-4d|+8xtP+yJLW|tzUAtgsh_Wox z_nh3|NXm`ufJ%idturW+Kr0k{jCGLd848c?%MMHzyEQ5nU6m!RkSf%zw3^|sNLn6Q zrHHr8KYC_%U`mCOVGI;o5e@Tf{91mXrhP+rDhWK%g)jDRqTLyc|CT?Q9helXlnb{6 z<%$!5)gE*Cs#9`Peqcfqi+Srz!I04}aoj=|tDGGe*Th;}-$78C-vexiDi-Q6WWE1-sybSO4@prpk{7ncc^3pu^jy>bX>aH_-ES@$k=c{DQNYM}R_&)3bmcUn-Z zw1`}xw~%9}HnQ#;EhzdD6M6SVZ1e6L!lplS^nPDtfs({TpSvhXrz*R+x_1~@D+GQa z@?8f