From e009be83efee6579272afa911f9e6d9abf56fca1 Mon Sep 17 00:00:00 2001 From: bhadraagada Date: Fri, 9 Jan 2026 12:08:05 +0530 Subject: [PATCH 1/5] Add Windows/Linux port using Electron Initial scaffolding for cross-platform CodexBar port: - Electron 28 + React 18 + TypeScript 5.3 + Vite - System tray app with usage menu - All 12 providers ported (Codex, Claude, Cursor, Gemini, Copilot, Antigravity, Factory, z.ai, Kiro, Vertex AI, Augment, MiniMax) - Settings window with provider toggles - Auto-updates via electron-updater - CLI tool (codexbar status/list/refresh) - Persistent settings and usage history Addresses #151 --- codexbar-electron/.gitignore | 6 + codexbar-electron/README.md | 159 +++++++++ codexbar-electron/package.json | 91 ++++++ codexbar-electron/src/cli/index.ts | 156 +++++++++ codexbar-electron/src/main/index.ts | 202 ++++++++++++ codexbar-electron/src/main/preload.ts | 74 +++++ .../src/main/providers/BaseProvider.ts | 178 ++++++++++ .../src/main/providers/ProviderManager.ts | 203 ++++++++++++ .../antigravity/AntigravityProvider.ts | 28 ++ .../main/providers/augment/AugmentProvider.ts | 28 ++ .../main/providers/claude/ClaudeProvider.ts | 148 +++++++++ .../src/main/providers/codex/CodexProvider.ts | 96 ++++++ .../main/providers/copilot/CopilotProvider.ts | 60 ++++ .../main/providers/cursor/CursorProvider.ts | 135 ++++++++ .../main/providers/factory/FactoryProvider.ts | 28 ++ .../main/providers/gemini/GeminiProvider.ts | 96 ++++++ .../src/main/providers/kiro/KiroProvider.ts | 28 ++ .../main/providers/minimax/MiniMaxProvider.ts | 28 ++ .../providers/vertexai/VertexAIProvider.ts | 40 +++ .../src/main/providers/zai/ZaiProvider.ts | 58 ++++ .../src/main/store/SettingsStore.ts | 103 ++++++ .../src/main/store/UsageStore.ts | 107 ++++++ codexbar-electron/src/main/tray/TrayMenu.ts | 184 +++++++++++ codexbar-electron/src/main/updater.ts | 70 ++++ codexbar-electron/src/main/utils/logger.ts | 54 ++++ .../src/main/utils/subprocess.ts | 91 ++++++ codexbar-electron/src/renderer/App.tsx | 108 +++++++ .../renderer/components/GeneralSettings.tsx | 96 ++++++ .../src/renderer/components/ProviderList.tsx | 89 +++++ codexbar-electron/src/renderer/index.html | 13 + codexbar-electron/src/renderer/main.tsx | 14 + codexbar-electron/src/renderer/styles.css | 305 ++++++++++++++++++ codexbar-electron/tsconfig.json | 27 ++ codexbar-electron/tsconfig.main.json | 8 + codexbar-electron/tsconfig.renderer.json | 13 + codexbar-electron/vite.config.ts | 23 ++ 36 files changed, 3147 insertions(+) create mode 100644 codexbar-electron/.gitignore create mode 100644 codexbar-electron/README.md create mode 100644 codexbar-electron/package.json create mode 100644 codexbar-electron/src/cli/index.ts create mode 100644 codexbar-electron/src/main/index.ts create mode 100644 codexbar-electron/src/main/preload.ts create mode 100644 codexbar-electron/src/main/providers/BaseProvider.ts create mode 100644 codexbar-electron/src/main/providers/ProviderManager.ts create mode 100644 codexbar-electron/src/main/providers/antigravity/AntigravityProvider.ts create mode 100644 codexbar-electron/src/main/providers/augment/AugmentProvider.ts create mode 100644 codexbar-electron/src/main/providers/claude/ClaudeProvider.ts create mode 100644 codexbar-electron/src/main/providers/codex/CodexProvider.ts create mode 100644 codexbar-electron/src/main/providers/copilot/CopilotProvider.ts create mode 100644 codexbar-electron/src/main/providers/cursor/CursorProvider.ts create mode 100644 codexbar-electron/src/main/providers/factory/FactoryProvider.ts create mode 100644 codexbar-electron/src/main/providers/gemini/GeminiProvider.ts create mode 100644 codexbar-electron/src/main/providers/kiro/KiroProvider.ts create mode 100644 codexbar-electron/src/main/providers/minimax/MiniMaxProvider.ts create mode 100644 codexbar-electron/src/main/providers/vertexai/VertexAIProvider.ts create mode 100644 codexbar-electron/src/main/providers/zai/ZaiProvider.ts create mode 100644 codexbar-electron/src/main/store/SettingsStore.ts create mode 100644 codexbar-electron/src/main/store/UsageStore.ts create mode 100644 codexbar-electron/src/main/tray/TrayMenu.ts create mode 100644 codexbar-electron/src/main/updater.ts create mode 100644 codexbar-electron/src/main/utils/logger.ts create mode 100644 codexbar-electron/src/main/utils/subprocess.ts create mode 100644 codexbar-electron/src/renderer/App.tsx create mode 100644 codexbar-electron/src/renderer/components/GeneralSettings.tsx create mode 100644 codexbar-electron/src/renderer/components/ProviderList.tsx create mode 100644 codexbar-electron/src/renderer/index.html create mode 100644 codexbar-electron/src/renderer/main.tsx create mode 100644 codexbar-electron/src/renderer/styles.css create mode 100644 codexbar-electron/tsconfig.json create mode 100644 codexbar-electron/tsconfig.main.json create mode 100644 codexbar-electron/tsconfig.renderer.json create mode 100644 codexbar-electron/vite.config.ts diff --git a/codexbar-electron/.gitignore b/codexbar-electron/.gitignore new file mode 100644 index 00000000..60278539 --- /dev/null +++ b/codexbar-electron/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +dist/ +release/ +*.log +.env +.env.local diff --git a/codexbar-electron/README.md b/codexbar-electron/README.md new file mode 100644 index 00000000..d0e11f09 --- /dev/null +++ b/codexbar-electron/README.md @@ -0,0 +1,159 @@ +# CodexBar for Windows/Linux + +This is the cross-platform port of [CodexBar](https://github.com/steipete/CodexBar), originally a macOS menu bar app for monitoring AI provider API usage. + +## Features + +- **System tray app** with usage menu (like macOS menu bar) +- **12 AI providers** supported: + - Codex (OpenAI) + - Claude (Anthropic) + - Cursor + - Gemini (Google) + - GitHub Copilot + - Antigravity + - Factory/Droid + - z.ai + - Kiro + - Vertex AI + - Augment + - MiniMax +- **Usage meters** with session + weekly + monthly tracking +- **Settings window** for provider toggles and preferences +- **Auto-updates** via electron-updater +- **CLI** for terminal usage + +## Installation + +### Download + +Download the latest release from [GitHub Releases](https://github.com/steipete/CodexBar/releases). + +- **Windows**: Download `CodexBar-Setup-x.x.x.exe` (installer) or `CodexBar-x.x.x-portable.exe` +- **Linux**: Download `CodexBar-x.x.x.AppImage` or `CodexBar-x.x.x.deb` + +### Build from Source + +```bash +cd codexbar-electron + +# Install dependencies +npm install + +# Development mode +npm run dev + +# Build for production +npm run build + +# Package for distribution +npm run dist:win # Windows +npm run dist:linux # Linux +``` + +## Development + +### Prerequisites + +- Node.js 18+ +- npm 9+ + +### Project Structure + +``` +codexbar-electron/ +├── src/ +│ ├── main/ # Electron main process +│ │ ├── providers/ # AI provider implementations +│ │ ├── store/ # Settings & usage persistence +│ │ ├── tray/ # System tray menu +│ │ └── utils/ # Utilities (logger, subprocess) +│ ├── renderer/ # React UI (settings window) +│ ├── cli/ # Command-line interface +│ └── shared/ # Shared types +├── assets/ # Icons and images +├── dist/ # Build output +└── release/ # Packaged apps +``` + +### Scripts + +```bash +npm run dev # Start in development mode +npm run build # Build TypeScript +npm run start # Run built app +npm run dist # Package for current platform +npm run lint # Run ESLint +npm run typecheck # TypeScript check +npm run test # Run tests +``` + +### Adding a New Provider + +1. Create a new directory under `src/main/providers//` +2. Create `Provider.ts` extending `BaseProvider` +3. Implement `isConfigured()` and `fetchUsage()` +4. Register in `ProviderManager.ts` + +Example: + +```typescript +import { BaseProvider, ProviderUsage } from '../BaseProvider'; + +export class NewProvider extends BaseProvider { + readonly id = 'newprovider'; + readonly name = 'New Provider'; + readonly icon = '🆕'; + readonly websiteUrl = 'https://newprovider.ai'; + + async isConfigured(): Promise { + // Check if provider is set up + return true; + } + + async fetchUsage(): Promise { + // Fetch and return usage data + return null; + } +} +``` + +## CLI Usage + +```bash +# Show status for all providers +codexbar status + +# Show status for specific provider +codexbar status -p claude + +# Output as JSON +codexbar status -j + +# List all providers +codexbar list + +# Refresh data +codexbar refresh +``` + +## Architecture + +This port uses: + +- **Electron** - Cross-platform desktop framework +- **React** - Settings UI +- **TypeScript** - Type safety +- **electron-store** - Settings persistence +- **electron-updater** - Auto-updates +- **winston** - Logging + +The architecture mirrors the macOS app: +- Provider-based design for extensibility +- Background polling for usage updates +- System tray integration +- IPC for main/renderer communication + +## License + +MIT License - see [LICENSE](../LICENSE) diff --git a/codexbar-electron/package.json b/codexbar-electron/package.json new file mode 100644 index 00000000..d16f436f --- /dev/null +++ b/codexbar-electron/package.json @@ -0,0 +1,91 @@ +{ + "name": "codexbar", + "version": "0.1.0", + "description": "Monitor API usage limits for AI providers - Windows/Linux port", + "main": "dist/main/index.js", + "author": "CodexBar Contributors", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/steipete/CodexBar" + }, + "scripts": { + "dev": "concurrently \"npm run dev:main\" \"npm run dev:renderer\"", + "dev:main": "tsc -p tsconfig.main.json --watch", + "dev:renderer": "vite", + "build": "npm run build:main && npm run build:renderer", + "build:main": "tsc -p tsconfig.main.json", + "build:renderer": "vite build", + "start": "electron .", + "pack": "electron-builder --dir", + "dist": "electron-builder", + "dist:win": "electron-builder --win", + "dist:linux": "electron-builder --linux", + "dist:mac": "electron-builder --mac", + "lint": "eslint src --ext .ts,.tsx", + "typecheck": "tsc --noEmit", + "test": "vitest", + "cli": "node dist/cli/index.js" + }, + "dependencies": { + "electron-store": "^8.1.0", + "electron-updater": "^6.1.7", + "node-fetch": "^3.3.2", + "keytar": "^7.9.0", + "tough-cookie": "^4.1.3", + "winston": "^3.11.0", + "commander": "^11.1.0", + "node-pty": "^1.0.0" + }, + "devDependencies": { + "@types/node": "^20.10.0", + "@types/react": "^18.2.45", + "@types/react-dom": "^18.2.18", + "@types/tough-cookie": "^4.0.5", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "concurrently": "^8.2.2", + "electron": "^28.0.0", + "electron-builder": "^24.9.1", + "eslint": "^8.56.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.3.3", + "vite": "^5.0.10", + "vitest": "^1.1.0" + }, + "build": { + "appId": "com.codexbar.app", + "productName": "CodexBar", + "directories": { + "output": "release" + }, + "files": [ + "dist/**/*", + "assets/**/*" + ], + "win": { + "target": ["nsis", "portable"], + "icon": "assets/icon.ico" + }, + "linux": { + "target": ["AppImage", "deb"], + "icon": "assets/icon.png", + "category": "Utility" + }, + "mac": { + "target": ["dmg"], + "icon": "assets/icon.icns" + }, + "nsis": { + "oneClick": false, + "allowToChangeInstallationDirectory": true + }, + "publish": { + "provider": "github", + "owner": "steipete", + "repo": "CodexBar" + } + } +} diff --git a/codexbar-electron/src/cli/index.ts b/codexbar-electron/src/cli/index.ts new file mode 100644 index 00000000..51c0f5e0 --- /dev/null +++ b/codexbar-electron/src/cli/index.ts @@ -0,0 +1,156 @@ +#!/usr/bin/env node +/** + * CodexBar CLI + * + * Command-line interface for querying AI provider usage. + * Mirrors the functionality of the macOS bundled CLI. + */ + +import { Command } from 'commander'; +import { CodexProvider } from '../main/providers/codex/CodexProvider'; +import { ClaudeProvider } from '../main/providers/claude/ClaudeProvider'; +import { CursorProvider } from '../main/providers/cursor/CursorProvider'; +import { GeminiProvider } from '../main/providers/gemini/GeminiProvider'; +import { BaseProvider } from '../main/providers/BaseProvider'; + +const program = new Command(); + +// All available providers +const providers: Record = { + codex: new CodexProvider(), + claude: new ClaudeProvider(), + cursor: new CursorProvider(), + gemini: new GeminiProvider(), + // Add more as needed +}; + +program + .name('codexbar') + .description('Monitor API usage limits for AI providers') + .version('0.1.0'); + +program + .command('status') + .description('Show usage status for all configured providers') + .option('-p, --provider ', 'Specific provider to check') + .option('-j, --json', 'Output as JSON') + .action(async (options) => { + const providersToCheck = options.provider + ? [options.provider] + : Object.keys(providers); + + const results: Record = {}; + + for (const name of providersToCheck) { + const provider = providers[name]; + if (!provider) { + console.error(`Unknown provider: ${name}`); + continue; + } + + const configured = await provider.isConfigured(); + if (!configured) { + results[name] = { status: 'not configured' }; + continue; + } + + const result = await provider.refresh(); + results[name] = { + status: result.state, + usage: result.usage, + error: result.error, + }; + } + + if (options.json) { + console.log(JSON.stringify(results, null, 2)); + } else { + printStatus(results); + } + }); + +program + .command('list') + .description('List all available providers') + .action(() => { + console.log('Available providers:\n'); + for (const [id, provider] of Object.entries(providers)) { + console.log(` ${provider.icon} ${provider.name} (${id})`); + } + }); + +program + .command('refresh') + .description('Refresh usage data for all providers') + .option('-p, --provider ', 'Specific provider to refresh') + .action(async (options) => { + const providersToRefresh = options.provider + ? [options.provider] + : Object.keys(providers); + + console.log('Refreshing...\n'); + + for (const name of providersToRefresh) { + const provider = providers[name]; + if (!provider) continue; + + const configured = await provider.isConfigured(); + if (!configured) { + console.log(` ${provider.icon} ${provider.name}: not configured`); + continue; + } + + const result = await provider.refresh(); + const status = result.state === 'success' ? '✓' : '✗'; + console.log(` ${provider.icon} ${provider.name}: ${status}`); + } + }); + +function printStatus(results: Record) { + console.log('CodexBar Status\n'); + console.log('─'.repeat(50)); + + for (const [name, data] of Object.entries(results)) { + const provider = providers[name]; + if (!provider) continue; + + console.log(`\n${provider.icon} ${provider.name}`); + + if (data.status === 'not configured') { + console.log(' Status: Not configured'); + continue; + } + + if (data.status === 'error') { + console.log(` Status: Error - ${data.error}`); + continue; + } + + if (data.usage) { + if (data.usage.session) { + const s = data.usage.session; + console.log(` Session: ${s.displayString} (${s.percentage}%)`); + if (s.resetCountdown) { + console.log(` Resets: ${s.resetCountdown}`); + } + } + if (data.usage.weekly) { + const w = data.usage.weekly; + console.log(` Weekly: ${w.displayString} (${w.percentage}%)`); + } + if (data.usage.monthly) { + const m = data.usage.monthly; + console.log(` Monthly: ${m.displayString} (${m.percentage}%)`); + } + if (data.usage.cost) { + console.log(` Cost: ${data.usage.cost.displayString}`); + } + } else { + console.log(' No usage data available'); + } + } + + console.log('\n' + '─'.repeat(50)); +} + +program.parse(); diff --git a/codexbar-electron/src/main/index.ts b/codexbar-electron/src/main/index.ts new file mode 100644 index 00000000..fc66723e --- /dev/null +++ b/codexbar-electron/src/main/index.ts @@ -0,0 +1,202 @@ +/** + * CodexBar - Main Process Entry Point + * + * This is the Electron main process that handles: + * - System tray integration + * - Provider management and polling + * - IPC communication with renderer + * - Auto-updates + */ + +import { app, BrowserWindow, Tray, Menu, nativeImage, ipcMain } from 'electron'; +import path from 'path'; +import { ProviderManager } from './providers/ProviderManager'; +import { SettingsStore } from './store/SettingsStore'; +import { UsageStore } from './store/UsageStore'; +import { setupAutoUpdater } from './updater'; +import { createTrayMenu } from './tray/TrayMenu'; +import { logger } from './utils/logger'; + +// Keep references to prevent garbage collection +let tray: Tray | null = null; +let settingsWindow: BrowserWindow | null = null; +let providerManager: ProviderManager | null = null; +let settingsStore: SettingsStore | null = null; +let usageStore: UsageStore | null = null; + +// Prevent multiple instances +const gotTheLock = app.requestSingleInstanceLock(); +if (!gotTheLock) { + app.quit(); +} + +async function createTray(): Promise { + // Create tray icon - use a simple icon for now + const iconPath = path.join(__dirname, '../../assets/icon.png'); + let trayIcon: Electron.NativeImage; + + try { + trayIcon = nativeImage.createFromPath(iconPath); + // Resize for system tray (16x16 on Windows, 22x22 on Linux) + trayIcon = trayIcon.resize({ width: 16, height: 16 }); + } catch { + // Fallback to empty icon if asset not found + trayIcon = nativeImage.createEmpty(); + logger.warn('Tray icon not found, using empty icon'); + } + + tray = new Tray(trayIcon); + tray.setToolTip('CodexBar - AI Usage Monitor'); + + // Update tray menu + await updateTrayMenu(); + + // Handle click (Windows: show menu, Linux: might differ) + tray.on('click', () => { + tray?.popUpContextMenu(); + }); +} + +async function updateTrayMenu(): Promise { + if (!tray || !providerManager || !settingsStore || !usageStore) return; + + const menu = await createTrayMenu({ + providerManager, + settingsStore, + usageStore, + onSettingsClick: () => createSettingsWindow(), + onQuitClick: () => app.quit(), + onRefreshClick: () => providerManager?.refreshAll(), + }); + + tray.setContextMenu(menu); +} + +function createSettingsWindow(): void { + if (settingsWindow) { + settingsWindow.focus(); + return; + } + + settingsWindow = new BrowserWindow({ + width: 600, + height: 500, + title: 'CodexBar Settings', + resizable: true, + minimizable: true, + maximizable: false, + webPreferences: { + nodeIntegration: false, + contextIsolation: true, + preload: path.join(__dirname, 'preload.js'), + }, + }); + + // Load the renderer + if (process.env.NODE_ENV === 'development') { + settingsWindow.loadURL('http://localhost:5173'); + settingsWindow.webContents.openDevTools(); + } else { + settingsWindow.loadFile(path.join(__dirname, '../renderer/index.html')); + } + + settingsWindow.on('closed', () => { + settingsWindow = null; + }); +} + +function setupIPC(): void { + // Get all provider states + ipcMain.handle('get-providers', async () => { + return providerManager?.getAllProviderStates() ?? []; + }); + + // Get settings + ipcMain.handle('get-settings', async () => { + return settingsStore?.getAll() ?? {}; + }); + + // Update settings + ipcMain.handle('set-setting', async (_event, key: string, value: unknown) => { + settingsStore?.set(key, value); + await updateTrayMenu(); + }); + + // Toggle provider + ipcMain.handle('toggle-provider', async (_event, providerId: string, enabled: boolean) => { + settingsStore?.setProviderEnabled(providerId, enabled); + if (enabled) { + await providerManager?.refreshProvider(providerId); + } + await updateTrayMenu(); + }); + + // Manual refresh + ipcMain.handle('refresh-all', async () => { + await providerManager?.refreshAll(); + await updateTrayMenu(); + }); + + // Get usage data + ipcMain.handle('get-usage', async () => { + return usageStore?.getAll() ?? {}; + }); +} + +async function initialize(): Promise { + logger.info('CodexBar starting...'); + + // Initialize stores + settingsStore = new SettingsStore(); + usageStore = new UsageStore(); + + // Initialize provider manager + providerManager = new ProviderManager(settingsStore, usageStore); + + // Set up IPC handlers + setupIPC(); + + // Create system tray + await createTray(); + + // Start provider polling + providerManager.on('update', async () => { + await updateTrayMenu(); + }); + + await providerManager.startPolling(); + + // Set up auto-updater (production only) + if (process.env.NODE_ENV !== 'development') { + setupAutoUpdater(); + } + + logger.info('CodexBar initialized successfully'); +} + +// App lifecycle +app.on('ready', initialize); + +app.on('window-all-closed', () => { + // Don't quit on window close - we're a tray app +}); + +app.on('before-quit', () => { + providerManager?.stopPolling(); +}); + +app.on('second-instance', () => { + // Focus settings window if trying to launch second instance + if (settingsWindow) { + settingsWindow.focus(); + } +}); + +// Handle uncaught errors +process.on('uncaughtException', (error) => { + logger.error('Uncaught exception:', error); +}); + +process.on('unhandledRejection', (reason) => { + logger.error('Unhandled rejection:', reason); +}); diff --git a/codexbar-electron/src/main/preload.ts b/codexbar-electron/src/main/preload.ts new file mode 100644 index 00000000..e532859a --- /dev/null +++ b/codexbar-electron/src/main/preload.ts @@ -0,0 +1,74 @@ +/** + * Preload script - exposes safe APIs to renderer process + */ + +import { contextBridge, ipcRenderer } from 'electron'; + +// Expose protected methods to the renderer process +contextBridge.exposeInMainWorld('codexbar', { + // Provider methods + getProviders: () => ipcRenderer.invoke('get-providers'), + toggleProvider: (id: string, enabled: boolean) => + ipcRenderer.invoke('toggle-provider', id, enabled), + refreshAll: () => ipcRenderer.invoke('refresh-all'), + + // Settings methods + getSettings: () => ipcRenderer.invoke('get-settings'), + setSetting: (key: string, value: unknown) => + ipcRenderer.invoke('set-setting', key, value), + + // Usage methods + getUsage: () => ipcRenderer.invoke('get-usage'), + + // Event listeners + onUpdate: (callback: () => void) => { + ipcRenderer.on('providers-updated', callback); + return () => ipcRenderer.removeListener('providers-updated', callback); + }, +}); + +// Type definitions for the exposed API +export interface CodexBarAPI { + getProviders: () => Promise; + toggleProvider: (id: string, enabled: boolean) => Promise; + refreshAll: () => Promise; + getSettings: () => Promise; + setSetting: (key: string, value: unknown) => Promise; + getUsage: () => Promise; + onUpdate: (callback: () => void) => () => void; +} + +export interface ProviderState { + id: string; + name: string; + enabled: boolean; + status: 'ok' | 'loading' | 'error' | 'disabled'; + usage?: { + used: number; + limit: number; + percentage: number; + resetTime?: string; + }; + error?: string; +} + +export interface Settings { + enabledProviders: string[]; + refreshInterval: number; + showNotifications: boolean; + startAtLogin: boolean; +} + +export interface UsageData { + [providerId: string]: { + session: { used: number; limit: number }; + weekly: { used: number; limit: number }; + lastUpdated: string; + }; +} + +declare global { + interface Window { + codexbar: CodexBarAPI; + } +} diff --git a/codexbar-electron/src/main/providers/BaseProvider.ts b/codexbar-electron/src/main/providers/BaseProvider.ts new file mode 100644 index 00000000..33e275bb --- /dev/null +++ b/codexbar-electron/src/main/providers/BaseProvider.ts @@ -0,0 +1,178 @@ +/** + * Base Provider Interface + * + * All AI providers must implement this interface. + * Mirrors the Swift architecture from the macOS app. + */ + +export interface UsageInfo { + /** Amount used (requests, tokens, or credits depending on provider) */ + used: number; + /** Maximum limit */ + limit: number; + /** Percentage used (0-100) */ + percentage: number; + /** Human-readable usage string */ + displayString: string; + /** When the usage resets (ISO 8601) */ + resetTime?: string; + /** Human-readable reset countdown */ + resetCountdown?: string; +} + +export interface ProviderUsage { + /** Session/daily usage */ + session?: UsageInfo; + /** Weekly usage */ + weekly?: UsageInfo; + /** Monthly usage */ + monthly?: UsageInfo; + /** Cost in dollars (for cost-based providers) */ + cost?: { + amount: number; + currency: string; + displayString: string; + }; +} + +export interface ProviderStatus { + /** Provider is operational */ + operational: boolean; + /** Current status message */ + message?: string; + /** Active incidents */ + incidents?: Array<{ + title: string; + status: string; + url?: string; + }>; +} + +export type ProviderState = 'idle' | 'loading' | 'success' | 'error'; + +export interface ProviderResult { + state: ProviderState; + usage?: ProviderUsage; + status?: ProviderStatus; + error?: string; + lastUpdated: Date; +} + +/** + * Base class for all AI providers + */ +export abstract class BaseProvider { + /** Unique identifier for this provider */ + abstract readonly id: string; + + /** Display name */ + abstract readonly name: string; + + /** Provider icon (emoji or path) */ + abstract readonly icon: string; + + /** Provider website URL */ + abstract readonly websiteUrl: string; + + /** Status page URL (for incident checking) */ + abstract readonly statusPageUrl?: string; + + /** Current state */ + protected _result: ProviderResult = { + state: 'idle', + lastUpdated: new Date(), + }; + + get result(): ProviderResult { + return this._result; + } + + /** + * Fetch usage data from the provider + */ + abstract fetchUsage(): Promise; + + /** + * Fetch provider status (optional) + */ + async fetchStatus(): Promise { + return null; + } + + /** + * Check if the provider is configured/authenticated + */ + abstract isConfigured(): Promise; + + /** + * Refresh all data for this provider + */ + async refresh(): Promise { + this._result = { + ...this._result, + state: 'loading', + }; + + try { + const [usage, status] = await Promise.all([ + this.fetchUsage(), + this.fetchStatus(), + ]); + + this._result = { + state: 'success', + usage: usage ?? undefined, + status: status ?? undefined, + lastUpdated: new Date(), + }; + } catch (error) { + this._result = { + state: 'error', + error: error instanceof Error ? error.message : 'Unknown error', + lastUpdated: new Date(), + }; + } + + return this._result; + } +} + +/** + * Helper to calculate percentage + */ +export function calculatePercentage(used: number, limit: number): number { + if (limit <= 0) return 0; + return Math.min(100, Math.round((used / limit) * 100)); +} + +/** + * Helper to format usage string + */ +export function formatUsage(used: number, limit: number, unit = ''): string { + const suffix = unit ? ` ${unit}` : ''; + return `${used.toLocaleString()}${suffix} / ${limit.toLocaleString()}${suffix}`; +} + +/** + * Helper to format reset countdown + */ +export function formatResetCountdown(resetTime: Date): string { + const now = new Date(); + const diff = resetTime.getTime() - now.getTime(); + + if (diff <= 0) return 'Resetting...'; + + const hours = Math.floor(diff / (1000 * 60 * 60)); + const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); + + if (hours > 24) { + const days = Math.floor(hours / 24); + return `${days}d ${hours % 24}h`; + } + + if (hours > 0) { + return `${hours}h ${minutes}m`; + } + + return `${minutes}m`; +} diff --git a/codexbar-electron/src/main/providers/ProviderManager.ts b/codexbar-electron/src/main/providers/ProviderManager.ts new file mode 100644 index 00000000..2a7f8575 --- /dev/null +++ b/codexbar-electron/src/main/providers/ProviderManager.ts @@ -0,0 +1,203 @@ +/** + * Provider Manager + * + * Manages all AI providers, handles polling, and emits updates. + */ + +import { EventEmitter } from 'events'; +import { BaseProvider, ProviderResult } from './BaseProvider'; +import { SettingsStore } from '../store/SettingsStore'; +import { UsageStore } from '../store/UsageStore'; +import { logger } from '../utils/logger'; + +// Import all providers +import { CodexProvider } from './codex/CodexProvider'; +import { ClaudeProvider } from './claude/ClaudeProvider'; +import { CursorProvider } from './cursor/CursorProvider'; +import { GeminiProvider } from './gemini/GeminiProvider'; +import { CopilotProvider } from './copilot/CopilotProvider'; +import { AntigravityProvider } from './antigravity/AntigravityProvider'; +import { FactoryProvider } from './factory/FactoryProvider'; +import { ZaiProvider } from './zai/ZaiProvider'; +import { KiroProvider } from './kiro/KiroProvider'; +import { VertexAIProvider } from './vertexai/VertexAIProvider'; +import { AugmentProvider } from './augment/AugmentProvider'; +import { MiniMaxProvider } from './minimax/MiniMaxProvider'; + +export interface ProviderManagerEvents { + update: () => void; + error: (providerId: string, error: Error) => void; +} + +export class ProviderManager extends EventEmitter { + private providers: Map = new Map(); + private pollingInterval: NodeJS.Timeout | null = null; + private settingsStore: SettingsStore; + private usageStore: UsageStore; + + constructor(settingsStore: SettingsStore, usageStore: UsageStore) { + super(); + this.settingsStore = settingsStore; + this.usageStore = usageStore; + this.initializeProviders(); + } + + private initializeProviders(): void { + // Register all providers + const allProviders: BaseProvider[] = [ + new CodexProvider(), + new ClaudeProvider(), + new CursorProvider(), + new GeminiProvider(), + new CopilotProvider(), + new AntigravityProvider(), + new FactoryProvider(), + new ZaiProvider(), + new KiroProvider(), + new VertexAIProvider(), + new AugmentProvider(), + new MiniMaxProvider(), + ]; + + for (const provider of allProviders) { + this.providers.set(provider.id, provider); + logger.info(`Registered provider: ${provider.name} (${provider.id})`); + } + } + + /** + * Get all registered providers + */ + getAllProviders(): BaseProvider[] { + return Array.from(this.providers.values()); + } + + /** + * Get a specific provider by ID + */ + getProvider(id: string): BaseProvider | undefined { + return this.providers.get(id); + } + + /** + * Get enabled providers based on settings + */ + getEnabledProviders(): BaseProvider[] { + return this.getAllProviders().filter(p => + this.settingsStore.isProviderEnabled(p.id) + ); + } + + /** + * Get state for all providers (for IPC) + */ + getAllProviderStates(): Array<{ + id: string; + name: string; + icon: string; + enabled: boolean; + result: ProviderResult; + }> { + return this.getAllProviders().map(p => ({ + id: p.id, + name: p.name, + icon: p.icon, + enabled: this.settingsStore.isProviderEnabled(p.id), + result: p.result, + })); + } + + /** + * Refresh a specific provider + */ + async refreshProvider(id: string): Promise { + const provider = this.providers.get(id); + if (!provider) { + logger.warn(`Provider not found: ${id}`); + return null; + } + + if (!this.settingsStore.isProviderEnabled(id)) { + logger.debug(`Provider disabled, skipping: ${id}`); + return null; + } + + try { + const isConfigured = await provider.isConfigured(); + if (!isConfigured) { + logger.debug(`Provider not configured: ${id}`); + return null; + } + + logger.info(`Refreshing provider: ${provider.name}`); + const result = await provider.refresh(); + + // Store usage data + if (result.usage) { + this.usageStore.setProviderUsage(id, result.usage); + } + + this.emit('update'); + return result; + } catch (error) { + logger.error(`Error refreshing provider ${id}:`, error); + this.emit('error', id, error); + return null; + } + } + + /** + * Refresh all enabled providers + */ + async refreshAll(): Promise { + logger.info('Refreshing all providers...'); + + const enabledProviders = this.getEnabledProviders(); + + await Promise.allSettled( + enabledProviders.map(p => this.refreshProvider(p.id)) + ); + + logger.info('All providers refreshed'); + this.emit('update'); + } + + /** + * Start polling for updates + */ + async startPolling(): Promise { + // Initial refresh + await this.refreshAll(); + + // Set up polling interval + const intervalMs = this.settingsStore.getRefreshInterval() * 1000; + + this.pollingInterval = setInterval(() => { + this.refreshAll().catch(err => { + logger.error('Polling error:', err); + }); + }, intervalMs); + + logger.info(`Polling started with interval: ${intervalMs}ms`); + } + + /** + * Stop polling + */ + stopPolling(): void { + if (this.pollingInterval) { + clearInterval(this.pollingInterval); + this.pollingInterval = null; + logger.info('Polling stopped'); + } + } + + /** + * Update polling interval + */ + updatePollingInterval(seconds: number): void { + this.stopPolling(); + this.settingsStore.setRefreshInterval(seconds); + this.startPolling(); + } +} diff --git a/codexbar-electron/src/main/providers/antigravity/AntigravityProvider.ts b/codexbar-electron/src/main/providers/antigravity/AntigravityProvider.ts new file mode 100644 index 00000000..cc373081 --- /dev/null +++ b/codexbar-electron/src/main/providers/antigravity/AntigravityProvider.ts @@ -0,0 +1,28 @@ +/** + * Antigravity Provider + */ + +import { BaseProvider, ProviderUsage, ProviderStatus } from '../BaseProvider'; +import { logger } from '../../utils/logger'; + +export class AntigravityProvider extends BaseProvider { + readonly id = 'antigravity'; + readonly name = 'Antigravity'; + readonly icon = '🚀'; + readonly websiteUrl = 'https://antigravity.ai'; + readonly statusPageUrl = undefined; + + async isConfigured(): Promise { + // TODO: Implement configuration check + return false; + } + + async fetchUsage(): Promise { + logger.debug('Antigravity: Not yet implemented'); + return null; + } + + async fetchStatus(): Promise { + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/providers/augment/AugmentProvider.ts b/codexbar-electron/src/main/providers/augment/AugmentProvider.ts new file mode 100644 index 00000000..51ab16d4 --- /dev/null +++ b/codexbar-electron/src/main/providers/augment/AugmentProvider.ts @@ -0,0 +1,28 @@ +/** + * Augment Provider + */ + +import { BaseProvider, ProviderUsage, ProviderStatus } from '../BaseProvider'; +import { logger } from '../../utils/logger'; + +export class AugmentProvider extends BaseProvider { + readonly id = 'augment'; + readonly name = 'Augment'; + readonly icon = '🔮'; + readonly websiteUrl = 'https://augment.dev'; + readonly statusPageUrl = undefined; + + async isConfigured(): Promise { + // TODO: Implement configuration check + return false; + } + + async fetchUsage(): Promise { + logger.debug('Augment: Not yet implemented'); + return null; + } + + async fetchStatus(): Promise { + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/providers/claude/ClaudeProvider.ts b/codexbar-electron/src/main/providers/claude/ClaudeProvider.ts new file mode 100644 index 00000000..00ec47a2 --- /dev/null +++ b/codexbar-electron/src/main/providers/claude/ClaudeProvider.ts @@ -0,0 +1,148 @@ +/** + * Claude (Anthropic) Provider + * + * Fetches usage from: + * 1. Claude CLI (`claude --status` or `/status` command) + * 2. Claude web API (with OAuth) + * 3. Cost tracking from local logs + */ + +import { BaseProvider, ProviderUsage, ProviderStatus, calculatePercentage, formatUsage, formatResetCountdown } from '../BaseProvider'; +import { runCommand } from '../../utils/subprocess'; +import { logger } from '../../utils/logger'; +import path from 'path'; +import fs from 'fs/promises'; +import os from 'os'; + +export class ClaudeProvider extends BaseProvider { + readonly id = 'claude'; + readonly name = 'Claude'; + readonly icon = '🎭'; + readonly websiteUrl = 'https://claude.ai'; + readonly statusPageUrl = 'https://status.anthropic.com'; + + async isConfigured(): Promise { + try { + // Check if claude CLI is available + const result = await runCommand('claude', ['--version']); + return result.exitCode === 0; + } catch { + // Also check for config file + const configPath = path.join(os.homedir(), '.claude', 'config.json'); + try { + await fs.access(configPath); + return true; + } catch { + return false; + } + } + } + + async fetchUsage(): Promise { + try { + // Try running claude with status flag + // Note: The actual command depends on the Claude CLI version + const result = await runCommand('claude', ['--status'], { timeout: 10000 }); + + if (result.exitCode === 0 && result.stdout) { + return this.parseStatusOutput(result.stdout); + } + + // Fallback: try to read from local state file + return await this.readLocalState(); + } catch (error) { + logger.error('Failed to fetch Claude usage:', error); + return null; + } + } + + private parseStatusOutput(output: string): ProviderUsage | null { + // Strip ANSI codes + const cleanOutput = output.replace(/\x1b\[[0-9;]*m/g, ''); + + const usage: ProviderUsage = {}; + + // Parse various formats from Claude CLI output + // Format: "Session: X/Y requests" or "X of Y requests used" + + const sessionPatterns = [ + /session[:\s]+(\d+)\s*\/\s*(\d+)/i, + /(\d+)\s+of\s+(\d+)\s+requests?\s+used/i, + /requests?[:\s]+(\d+)\s*\/\s*(\d+)/i, + ]; + + for (const pattern of sessionPatterns) { + const match = cleanOutput.match(pattern); + if (match) { + const used = parseInt(match[1], 10); + const limit = parseInt(match[2], 10); + usage.session = { + used, + limit, + percentage: calculatePercentage(used, limit), + displayString: formatUsage(used, limit, 'requests'), + }; + break; + } + } + + // Parse reset time + const resetPatterns = [ + /reset[s]?\s+(?:in\s+)?(\d+[hm]?\s*\d*[hm]?)/i, + /(\d+)\s*(?:hours?|h)\s*(?:(\d+)\s*(?:minutes?|m))?/i, + ]; + + for (const pattern of resetPatterns) { + const match = cleanOutput.match(pattern); + if (match && usage.session) { + usage.session.resetCountdown = match[0].trim(); + break; + } + } + + // Parse cost if present + const costMatch = cleanOutput.match(/\$(\d+\.?\d*)/); + if (costMatch) { + usage.cost = { + amount: parseFloat(costMatch[1]), + currency: 'USD', + displayString: `$${costMatch[1]}`, + }; + } + + return Object.keys(usage).length > 0 ? usage : null; + } + + private async readLocalState(): Promise { + // Try to read Claude's local state file + const statePath = path.join(os.homedir(), '.claude', 'state.json'); + + try { + const content = await fs.readFile(statePath, 'utf-8'); + const state = JSON.parse(content); + + if (state.usage) { + const used = state.usage.used ?? 0; + const limit = state.usage.limit ?? 100; + + return { + session: { + used, + limit, + percentage: calculatePercentage(used, limit), + displayString: formatUsage(used, limit, 'requests'), + }, + }; + } + } catch { + // State file doesn't exist or is invalid + } + + return null; + } + + async fetchStatus(): Promise { + // TODO: Implement status page scraping + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/providers/codex/CodexProvider.ts b/codexbar-electron/src/main/providers/codex/CodexProvider.ts new file mode 100644 index 00000000..2b0b7b1a --- /dev/null +++ b/codexbar-electron/src/main/providers/codex/CodexProvider.ts @@ -0,0 +1,96 @@ +/** + * Codex (OpenAI) Provider + * + * Fetches usage from: + * 1. Codex CLI (`codex --status`) + * 2. OpenAI Dashboard (web scraping with cookies) + * 3. Cost tracking from local logs + */ + +import { BaseProvider, ProviderUsage, ProviderStatus, calculatePercentage, formatUsage } from '../BaseProvider'; +import { runCommand } from '../../utils/subprocess'; +import { logger } from '../../utils/logger'; + +export class CodexProvider extends BaseProvider { + readonly id = 'codex'; + readonly name = 'Codex'; + readonly icon = '🤖'; + readonly websiteUrl = 'https://platform.openai.com'; + readonly statusPageUrl = 'https://status.openai.com'; + + async isConfigured(): Promise { + try { + // Check if codex CLI is available + const result = await runCommand('codex', ['--version']); + return result.exitCode === 0; + } catch { + return false; + } + } + + async fetchUsage(): Promise { + try { + // Run codex --status to get usage info + const result = await runCommand('codex', ['--status']); + + if (result.exitCode !== 0) { + logger.warn('Codex CLI returned non-zero exit code'); + return null; + } + + return this.parseStatusOutput(result.stdout); + } catch (error) { + logger.error('Failed to fetch Codex usage:', error); + return null; + } + } + + private parseStatusOutput(output: string): ProviderUsage | null { + // Parse the codex --status output + // Format varies, but typically includes: + // - Requests used/limit + // - Session info + // - Reset time + + const usage: ProviderUsage = {}; + + // Try to parse session usage + const sessionMatch = output.match(/session[:\s]+(\d+)\s*\/\s*(\d+)/i); + if (sessionMatch) { + const used = parseInt(sessionMatch[1], 10); + const limit = parseInt(sessionMatch[2], 10); + usage.session = { + used, + limit, + percentage: calculatePercentage(used, limit), + displayString: formatUsage(used, limit, 'requests'), + }; + } + + // Try to parse weekly/monthly usage + const weeklyMatch = output.match(/week(?:ly)?[:\s]+(\d+)\s*\/\s*(\d+)/i); + if (weeklyMatch) { + const used = parseInt(weeklyMatch[1], 10); + const limit = parseInt(weeklyMatch[2], 10); + usage.weekly = { + used, + limit, + percentage: calculatePercentage(used, limit), + displayString: formatUsage(used, limit, 'requests'), + }; + } + + // Parse reset time if present + const resetMatch = output.match(/reset[s]?\s+(?:in\s+)?(.+)/i); + if (resetMatch && usage.session) { + usage.session.resetCountdown = resetMatch[1].trim(); + } + + return Object.keys(usage).length > 0 ? usage : null; + } + + async fetchStatus(): Promise { + // TODO: Implement status page scraping + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/providers/copilot/CopilotProvider.ts b/codexbar-electron/src/main/providers/copilot/CopilotProvider.ts new file mode 100644 index 00000000..215b1704 --- /dev/null +++ b/codexbar-electron/src/main/providers/copilot/CopilotProvider.ts @@ -0,0 +1,60 @@ +/** + * GitHub Copilot Provider + * + * Fetches usage from GitHub Copilot's usage API. + */ + +import { BaseProvider, ProviderUsage, ProviderStatus, calculatePercentage, formatUsage } from '../BaseProvider'; +import { logger } from '../../utils/logger'; +import path from 'path'; +import fs from 'fs/promises'; +import os from 'os'; + +export class CopilotProvider extends BaseProvider { + readonly id = 'copilot'; + readonly name = 'GitHub Copilot'; + readonly icon = '🐙'; + readonly websiteUrl = 'https://github.com/features/copilot'; + readonly statusPageUrl = 'https://www.githubstatus.com'; + + async isConfigured(): Promise { + // Check for GitHub CLI auth or Copilot extension config + const ghConfigPath = path.join(os.homedir(), '.config', 'gh', 'hosts.yml'); + const ghConfigPathWin = path.join(os.homedir(), 'AppData', 'Roaming', 'GitHub CLI', 'hosts.yml'); + + try { + await fs.access(ghConfigPath); + return true; + } catch { + try { + await fs.access(ghConfigPathWin); + return true; + } catch { + return false; + } + } + } + + async fetchUsage(): Promise { + // Copilot doesn't expose usage limits in the same way + // It's typically unlimited for paid subscribers + // We could track local completion counts if needed + + logger.debug('Copilot: Usage tracking not yet implemented'); + + // Return a placeholder indicating active status + return { + session: { + used: 0, + limit: -1, // Unlimited + percentage: 0, + displayString: 'Unlimited', + }, + }; + } + + async fetchStatus(): Promise { + // TODO: Check GitHub status page + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/providers/cursor/CursorProvider.ts b/codexbar-electron/src/main/providers/cursor/CursorProvider.ts new file mode 100644 index 00000000..e0e306c6 --- /dev/null +++ b/codexbar-electron/src/main/providers/cursor/CursorProvider.ts @@ -0,0 +1,135 @@ +/** + * Cursor Provider + * + * Fetches usage from Cursor's API endpoint. + */ + +import { BaseProvider, ProviderUsage, ProviderStatus, calculatePercentage, formatUsage } from '../BaseProvider'; +import { logger } from '../../utils/logger'; +import path from 'path'; +import fs from 'fs/promises'; +import os from 'os'; + +interface CursorUsageResponse { + 'gpt-4': { numRequests: number; maxRequestUsage: number | null }; + 'gpt-3.5-turbo': { numRequests: number; maxRequestUsage: number | null }; + 'gpt-4o'?: { numRequests: number; maxRequestUsage: number | null }; + startOfMonth?: string; +} + +export class CursorProvider extends BaseProvider { + readonly id = 'cursor'; + readonly name = 'Cursor'; + readonly icon = '📝'; + readonly websiteUrl = 'https://cursor.sh'; + readonly statusPageUrl = 'https://status.cursor.sh'; + + private readonly API_URL = 'https://www.cursor.com/api/usage'; + + async isConfigured(): Promise { + // Check if Cursor is installed and has auth + const authToken = await this.getAuthToken(); + return authToken !== null; + } + + private async getAuthToken(): Promise { + // Cursor stores auth in different locations per platform + const possiblePaths = [ + path.join(os.homedir(), '.cursor', 'auth.json'), + path.join(os.homedir(), 'AppData', 'Roaming', 'Cursor', 'auth.json'), + path.join(os.homedir(), '.config', 'Cursor', 'auth.json'), + ]; + + for (const authPath of possiblePaths) { + try { + const content = await fs.readFile(authPath, 'utf-8'); + const auth = JSON.parse(content); + if (auth.accessToken) { + return auth.accessToken; + } + } catch { + // Try next path + } + } + + return null; + } + + async fetchUsage(): Promise { + try { + const token = await this.getAuthToken(); + if (!token) { + logger.warn('Cursor: No auth token found'); + return null; + } + + const response = await fetch(this.API_URL, { + headers: { + 'Authorization': `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + }); + + if (!response.ok) { + logger.warn(`Cursor API returned ${response.status}`); + return null; + } + + const data = await response.json() as CursorUsageResponse; + return this.parseUsageResponse(data); + } catch (error) { + logger.error('Failed to fetch Cursor usage:', error); + return null; + } + } + + private parseUsageResponse(data: CursorUsageResponse): ProviderUsage { + // Combine usage across models + let totalUsed = 0; + let totalLimit = 0; + + // GPT-4 usage + if (data['gpt-4']) { + totalUsed += data['gpt-4'].numRequests; + if (data['gpt-4'].maxRequestUsage) { + totalLimit += data['gpt-4'].maxRequestUsage; + } + } + + // GPT-4o usage + if (data['gpt-4o']) { + totalUsed += data['gpt-4o'].numRequests; + if (data['gpt-4o'].maxRequestUsage) { + totalLimit += data['gpt-4o'].maxRequestUsage; + } + } + + // Default limit if not specified (Pro plan typically has 500/month) + if (totalLimit === 0) { + totalLimit = 500; + } + + // Calculate reset time (start of next month) + let resetTime: string | undefined; + if (data.startOfMonth) { + const start = new Date(data.startOfMonth); + const nextMonth = new Date(start); + nextMonth.setMonth(nextMonth.getMonth() + 1); + resetTime = nextMonth.toISOString(); + } + + return { + monthly: { + used: totalUsed, + limit: totalLimit, + percentage: calculatePercentage(totalUsed, totalLimit), + displayString: formatUsage(totalUsed, totalLimit, 'requests'), + resetTime, + }, + }; + } + + async fetchStatus(): Promise { + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/providers/factory/FactoryProvider.ts b/codexbar-electron/src/main/providers/factory/FactoryProvider.ts new file mode 100644 index 00000000..53acaac3 --- /dev/null +++ b/codexbar-electron/src/main/providers/factory/FactoryProvider.ts @@ -0,0 +1,28 @@ +/** + * Factory/Droid Provider + */ + +import { BaseProvider, ProviderUsage, ProviderStatus } from '../BaseProvider'; +import { logger } from '../../utils/logger'; + +export class FactoryProvider extends BaseProvider { + readonly id = 'factory'; + readonly name = 'Factory'; + readonly icon = '🏭'; + readonly websiteUrl = 'https://factory.ai'; + readonly statusPageUrl = undefined; + + async isConfigured(): Promise { + // TODO: Implement configuration check + return false; + } + + async fetchUsage(): Promise { + logger.debug('Factory: Not yet implemented'); + return null; + } + + async fetchStatus(): Promise { + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/providers/gemini/GeminiProvider.ts b/codexbar-electron/src/main/providers/gemini/GeminiProvider.ts new file mode 100644 index 00000000..73c17b9c --- /dev/null +++ b/codexbar-electron/src/main/providers/gemini/GeminiProvider.ts @@ -0,0 +1,96 @@ +/** + * Gemini (Google) Provider + * + * Fetches usage from: + * 1. Gemini CLI (`gemini --stats`) + * 2. Google Cloud API + */ + +import { BaseProvider, ProviderUsage, ProviderStatus, calculatePercentage, formatUsage } from '../BaseProvider'; +import { runCommand } from '../../utils/subprocess'; +import { logger } from '../../utils/logger'; +import path from 'path'; +import fs from 'fs/promises'; +import os from 'os'; + +export class GeminiProvider extends BaseProvider { + readonly id = 'gemini'; + readonly name = 'Gemini'; + readonly icon = '💎'; + readonly websiteUrl = 'https://gemini.google.com'; + readonly statusPageUrl = 'https://status.cloud.google.com'; + + async isConfigured(): Promise { + try { + // Check if gemini CLI exists + const result = await runCommand('gemini', ['--version']); + if (result.exitCode === 0) return true; + } catch { + // CLI not found + } + + // Check for Google Cloud credentials + const credPath = path.join(os.homedir(), '.config', 'gcloud', 'application_default_credentials.json'); + try { + await fs.access(credPath); + return true; + } catch { + return false; + } + } + + async fetchUsage(): Promise { + try { + // Try gemini CLI first + const result = await runCommand('gemini', ['--stats'], { timeout: 10000 }); + + if (result.exitCode === 0 && result.stdout) { + return this.parseStatsOutput(result.stdout); + } + } catch (error) { + logger.debug('Gemini CLI not available:', error); + } + + // TODO: Implement Google Cloud API fallback + return null; + } + + private parseStatsOutput(output: string): ProviderUsage | null { + // Parse gemini --stats output + // Format typically includes table with usage numbers + + const usage: ProviderUsage = {}; + + // Look for request counts + const requestMatch = output.match(/requests?[:\s]+(\d+)\s*\/\s*(\d+)/i); + if (requestMatch) { + const used = parseInt(requestMatch[1], 10); + const limit = parseInt(requestMatch[2], 10); + usage.session = { + used, + limit, + percentage: calculatePercentage(used, limit), + displayString: formatUsage(used, limit, 'requests'), + }; + } + + // Look for token counts + const tokenMatch = output.match(/tokens?[:\s]+(\d+)\s*\/\s*(\d+)/i); + if (tokenMatch) { + const used = parseInt(tokenMatch[1], 10); + const limit = parseInt(tokenMatch[2], 10); + usage.weekly = { + used, + limit, + percentage: calculatePercentage(used, limit), + displayString: formatUsage(used, limit, 'tokens'), + }; + } + + return Object.keys(usage).length > 0 ? usage : null; + } + + async fetchStatus(): Promise { + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/providers/kiro/KiroProvider.ts b/codexbar-electron/src/main/providers/kiro/KiroProvider.ts new file mode 100644 index 00000000..06731a50 --- /dev/null +++ b/codexbar-electron/src/main/providers/kiro/KiroProvider.ts @@ -0,0 +1,28 @@ +/** + * Kiro Provider + */ + +import { BaseProvider, ProviderUsage, ProviderStatus } from '../BaseProvider'; +import { logger } from '../../utils/logger'; + +export class KiroProvider extends BaseProvider { + readonly id = 'kiro'; + readonly name = 'Kiro'; + readonly icon = '🎯'; + readonly websiteUrl = 'https://kiro.dev'; + readonly statusPageUrl = undefined; + + async isConfigured(): Promise { + // TODO: Implement configuration check + return false; + } + + async fetchUsage(): Promise { + logger.debug('Kiro: Not yet implemented'); + return null; + } + + async fetchStatus(): Promise { + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/providers/minimax/MiniMaxProvider.ts b/codexbar-electron/src/main/providers/minimax/MiniMaxProvider.ts new file mode 100644 index 00000000..81877284 --- /dev/null +++ b/codexbar-electron/src/main/providers/minimax/MiniMaxProvider.ts @@ -0,0 +1,28 @@ +/** + * MiniMax Provider + */ + +import { BaseProvider, ProviderUsage, ProviderStatus } from '../BaseProvider'; +import { logger } from '../../utils/logger'; + +export class MiniMaxProvider extends BaseProvider { + readonly id = 'minimax'; + readonly name = 'MiniMax'; + readonly icon = '🎨'; + readonly websiteUrl = 'https://minimax.io'; + readonly statusPageUrl = undefined; + + async isConfigured(): Promise { + // TODO: Implement configuration check + return false; + } + + async fetchUsage(): Promise { + logger.debug('MiniMax: Not yet implemented'); + return null; + } + + async fetchStatus(): Promise { + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/providers/vertexai/VertexAIProvider.ts b/codexbar-electron/src/main/providers/vertexai/VertexAIProvider.ts new file mode 100644 index 00000000..32de8091 --- /dev/null +++ b/codexbar-electron/src/main/providers/vertexai/VertexAIProvider.ts @@ -0,0 +1,40 @@ +/** + * Vertex AI (Google Cloud) Provider + */ + +import { BaseProvider, ProviderUsage, ProviderStatus, calculatePercentage, formatUsage } from '../BaseProvider'; +import { logger } from '../../utils/logger'; +import path from 'path'; +import fs from 'fs/promises'; +import os from 'os'; + +export class VertexAIProvider extends BaseProvider { + readonly id = 'vertexai'; + readonly name = 'Vertex AI'; + readonly icon = '☁️'; + readonly websiteUrl = 'https://cloud.google.com/vertex-ai'; + readonly statusPageUrl = 'https://status.cloud.google.com'; + + async isConfigured(): Promise { + // Check for Google Cloud credentials + const credPath = path.join(os.homedir(), '.config', 'gcloud', 'application_default_credentials.json'); + try { + await fs.access(credPath); + return true; + } catch { + // Also check GOOGLE_APPLICATION_CREDENTIALS env var + return !!process.env.GOOGLE_APPLICATION_CREDENTIALS; + } + } + + async fetchUsage(): Promise { + // Vertex AI usage would typically come from Cloud Monitoring API + // This requires more complex OAuth and API setup + logger.debug('Vertex AI: Full implementation pending'); + return null; + } + + async fetchStatus(): Promise { + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/providers/zai/ZaiProvider.ts b/codexbar-electron/src/main/providers/zai/ZaiProvider.ts new file mode 100644 index 00000000..57b1d8a9 --- /dev/null +++ b/codexbar-electron/src/main/providers/zai/ZaiProvider.ts @@ -0,0 +1,58 @@ +/** + * z.ai Provider + */ + +import { BaseProvider, ProviderUsage, ProviderStatus, calculatePercentage, formatUsage } from '../BaseProvider'; +import { logger } from '../../utils/logger'; +import path from 'path'; +import fs from 'fs/promises'; +import os from 'os'; + +export class ZaiProvider extends BaseProvider { + readonly id = 'zai'; + readonly name = 'z.ai'; + readonly icon = '⚡'; + readonly websiteUrl = 'https://z.ai'; + readonly statusPageUrl = undefined; + + async isConfigured(): Promise { + // Check for z.ai config + const configPath = path.join(os.homedir(), '.zai', 'config.json'); + try { + await fs.access(configPath); + return true; + } catch { + return false; + } + } + + async fetchUsage(): Promise { + try { + const configPath = path.join(os.homedir(), '.zai', 'config.json'); + const content = await fs.readFile(configPath, 'utf-8'); + const config = JSON.parse(content); + + if (config.usage) { + const used = config.usage.current ?? 0; + const limit = config.usage.limit ?? 1000; + + return { + session: { + used, + limit, + percentage: calculatePercentage(used, limit), + displayString: formatUsage(used, limit, 'credits'), + }, + }; + } + } catch (error) { + logger.debug('z.ai: Could not read config:', error); + } + + return null; + } + + async fetchStatus(): Promise { + return { operational: true }; + } +} diff --git a/codexbar-electron/src/main/store/SettingsStore.ts b/codexbar-electron/src/main/store/SettingsStore.ts new file mode 100644 index 00000000..751de35a --- /dev/null +++ b/codexbar-electron/src/main/store/SettingsStore.ts @@ -0,0 +1,103 @@ +/** + * Settings Store + * + * Persists user settings using electron-store. + */ + +import Store from 'electron-store'; +import { logger } from '../utils/logger'; + +interface SettingsSchema { + enabledProviders: string[]; + refreshInterval: number; // seconds + showNotifications: boolean; + startAtLogin: boolean; + showInDock: boolean; + theme: 'system' | 'light' | 'dark'; +} + +const defaults: SettingsSchema = { + enabledProviders: ['codex', 'claude', 'cursor', 'gemini'], + refreshInterval: 300, // 5 minutes + showNotifications: true, + startAtLogin: false, + showInDock: false, + theme: 'system', +}; + +export class SettingsStore { + private store: Store; + + constructor() { + this.store = new Store({ + name: 'settings', + defaults, + }); + + logger.info('Settings loaded:', this.store.store); + } + + /** + * Get all settings + */ + getAll(): SettingsSchema { + return this.store.store; + } + + /** + * Get a specific setting + */ + get(key: K): SettingsSchema[K] { + return this.store.get(key); + } + + /** + * Set a specific setting + */ + set(key: K, value: SettingsSchema[K]): void { + this.store.set(key, value); + logger.debug(`Setting updated: ${key} = ${JSON.stringify(value)}`); + } + + /** + * Check if a provider is enabled + */ + isProviderEnabled(providerId: string): boolean { + return this.store.get('enabledProviders').includes(providerId); + } + + /** + * Enable or disable a provider + */ + setProviderEnabled(providerId: string, enabled: boolean): void { + const providers = this.store.get('enabledProviders'); + + if (enabled && !providers.includes(providerId)) { + this.store.set('enabledProviders', [...providers, providerId]); + } else if (!enabled && providers.includes(providerId)) { + this.store.set('enabledProviders', providers.filter(p => p !== providerId)); + } + } + + /** + * Get refresh interval in seconds + */ + getRefreshInterval(): number { + return this.store.get('refreshInterval'); + } + + /** + * Set refresh interval in seconds + */ + setRefreshInterval(seconds: number): void { + this.store.set('refreshInterval', Math.max(60, seconds)); // Minimum 1 minute + } + + /** + * Reset all settings to defaults + */ + reset(): void { + this.store.clear(); + logger.info('Settings reset to defaults'); + } +} diff --git a/codexbar-electron/src/main/store/UsageStore.ts b/codexbar-electron/src/main/store/UsageStore.ts new file mode 100644 index 00000000..2316b6a3 --- /dev/null +++ b/codexbar-electron/src/main/store/UsageStore.ts @@ -0,0 +1,107 @@ +/** + * Usage Store + * + * Stores and tracks usage data for all providers. + */ + +import Store from 'electron-store'; +import { ProviderUsage } from '../providers/BaseProvider'; +import { logger } from '../utils/logger'; + +interface UsageEntry { + usage: ProviderUsage; + lastUpdated: string; // ISO 8601 +} + +interface UsageSchema { + providers: Record; + history: Record>; +} + +const defaults: UsageSchema = { + providers: {}, + history: {}, +}; + +export class UsageStore { + private store: Store; + + constructor() { + this.store = new Store({ + name: 'usage', + defaults, + }); + } + + /** + * Get all usage data + */ + getAll(): Record { + return this.store.get('providers'); + } + + /** + * Get usage for a specific provider + */ + getProviderUsage(providerId: string): UsageEntry | null { + const providers = this.store.get('providers'); + return providers[providerId] ?? null; + } + + /** + * Set usage for a provider + */ + setProviderUsage(providerId: string, usage: ProviderUsage): void { + const providers = this.store.get('providers'); + const now = new Date().toISOString(); + + providers[providerId] = { + usage, + lastUpdated: now, + }; + + this.store.set('providers', providers); + + // Also add to history (keep last 100 entries per provider) + this.addToHistory(providerId, usage); + + logger.debug(`Usage updated for ${providerId}`); + } + + /** + * Add usage to history + */ + private addToHistory(providerId: string, usage: ProviderUsage): void { + const history = this.store.get('history'); + const providerHistory = history[providerId] ?? []; + + providerHistory.push({ + timestamp: new Date().toISOString(), + usage, + }); + + // Keep only last 100 entries + if (providerHistory.length > 100) { + providerHistory.shift(); + } + + history[providerId] = providerHistory; + this.store.set('history', history); + } + + /** + * Get usage history for a provider + */ + getHistory(providerId: string): Array<{ timestamp: string; usage: ProviderUsage }> { + const history = this.store.get('history'); + return history[providerId] ?? []; + } + + /** + * Clear all usage data + */ + clear(): void { + this.store.clear(); + logger.info('Usage data cleared'); + } +} diff --git a/codexbar-electron/src/main/tray/TrayMenu.ts b/codexbar-electron/src/main/tray/TrayMenu.ts new file mode 100644 index 00000000..bdfdfd85 --- /dev/null +++ b/codexbar-electron/src/main/tray/TrayMenu.ts @@ -0,0 +1,184 @@ +/** + * System Tray Menu Builder + * + * Creates the context menu shown when clicking the tray icon. + */ + +import { Menu, MenuItem, shell } from 'electron'; +import { ProviderManager } from '../providers/ProviderManager'; +import { SettingsStore } from '../store/SettingsStore'; +import { UsageStore } from '../store/UsageStore'; + +interface TrayMenuOptions { + providerManager: ProviderManager; + settingsStore: SettingsStore; + usageStore: UsageStore; + onSettingsClick: () => void; + onQuitClick: () => void; + onRefreshClick: () => void; +} + +export async function createTrayMenu(options: TrayMenuOptions): Promise { + const { providerManager, settingsStore, onSettingsClick, onQuitClick, onRefreshClick } = options; + + const menu = new Menu(); + + // Header + menu.append(new MenuItem({ + label: 'CodexBar', + enabled: false, + })); + + menu.append(new MenuItem({ type: 'separator' })); + + // Provider usage items + const providers = providerManager.getAllProviderStates(); + const enabledProviders = providers.filter(p => p.enabled); + + if (enabledProviders.length === 0) { + menu.append(new MenuItem({ + label: 'No providers enabled', + enabled: false, + })); + } else { + for (const provider of enabledProviders) { + const submenu = new Menu(); + + // Usage info + if (provider.result.usage) { + const { usage } = provider.result; + + if (usage.session) { + submenu.append(new MenuItem({ + label: `Session: ${usage.session.displayString} (${usage.session.percentage}%)`, + enabled: false, + })); + + if (usage.session.resetCountdown) { + submenu.append(new MenuItem({ + label: ` Resets in: ${usage.session.resetCountdown}`, + enabled: false, + })); + } + } + + if (usage.weekly) { + submenu.append(new MenuItem({ + label: `Weekly: ${usage.weekly.displayString} (${usage.weekly.percentage}%)`, + enabled: false, + })); + } + + if (usage.monthly) { + submenu.append(new MenuItem({ + label: `Monthly: ${usage.monthly.displayString} (${usage.monthly.percentage}%)`, + enabled: false, + })); + } + + if (usage.cost) { + submenu.append(new MenuItem({ + label: `Cost: ${usage.cost.displayString}`, + enabled: false, + })); + } + } else if (provider.result.state === 'loading') { + submenu.append(new MenuItem({ + label: 'Loading...', + enabled: false, + })); + } else if (provider.result.state === 'error') { + submenu.append(new MenuItem({ + label: `Error: ${provider.result.error}`, + enabled: false, + })); + } else { + submenu.append(new MenuItem({ + label: 'No data', + enabled: false, + })); + } + + submenu.append(new MenuItem({ type: 'separator' })); + + // Open website + submenu.append(new MenuItem({ + label: 'Open Website', + click: () => { + const p = providerManager.getProvider(provider.id); + if (p?.websiteUrl) { + shell.openExternal(p.websiteUrl); + } + }, + })); + + // Status indicator + let statusIcon = '⚪'; // idle + if (provider.result.state === 'success') statusIcon = '🟢'; + else if (provider.result.state === 'loading') statusIcon = '🟡'; + else if (provider.result.state === 'error') statusIcon = '🔴'; + + menu.append(new MenuItem({ + label: `${provider.icon} ${provider.name} ${statusIcon}`, + submenu, + })); + } + } + + menu.append(new MenuItem({ type: 'separator' })); + + // Actions + menu.append(new MenuItem({ + label: 'Refresh All', + accelerator: 'CmdOrCtrl+R', + click: onRefreshClick, + })); + + menu.append(new MenuItem({ type: 'separator' })); + + // Settings + menu.append(new MenuItem({ + label: 'Settings...', + accelerator: 'CmdOrCtrl+,', + click: onSettingsClick, + })); + + // Provider toggles submenu + const toggleSubmenu = new Menu(); + for (const provider of providers) { + toggleSubmenu.append(new MenuItem({ + label: `${provider.icon} ${provider.name}`, + type: 'checkbox', + checked: provider.enabled, + click: () => { + settingsStore.setProviderEnabled(provider.id, !provider.enabled); + if (!provider.enabled) { + providerManager.refreshProvider(provider.id); + } + }, + })); + } + + menu.append(new MenuItem({ + label: 'Providers', + submenu: toggleSubmenu, + })); + + menu.append(new MenuItem({ type: 'separator' })); + + // About & Quit + menu.append(new MenuItem({ + label: 'About CodexBar', + click: () => { + shell.openExternal('https://github.com/steipete/CodexBar'); + }, + })); + + menu.append(new MenuItem({ + label: 'Quit CodexBar', + accelerator: 'CmdOrCtrl+Q', + click: onQuitClick, + })); + + return menu; +} diff --git a/codexbar-electron/src/main/updater.ts b/codexbar-electron/src/main/updater.ts new file mode 100644 index 00000000..e8303b19 --- /dev/null +++ b/codexbar-electron/src/main/updater.ts @@ -0,0 +1,70 @@ +/** + * Auto-updater setup using electron-updater + */ + +import { autoUpdater } from 'electron-updater'; +import { logger } from './utils/logger'; + +export function setupAutoUpdater(): void { + // Configure auto-updater + autoUpdater.autoDownload = false; + autoUpdater.autoInstallOnAppQuit = true; + + // Event handlers + autoUpdater.on('checking-for-update', () => { + logger.info('Checking for updates...'); + }); + + autoUpdater.on('update-available', (info) => { + logger.info(`Update available: ${info.version}`); + // TODO: Show notification or prompt user + // For now, auto-download + autoUpdater.downloadUpdate(); + }); + + autoUpdater.on('update-not-available', () => { + logger.info('No updates available'); + }); + + autoUpdater.on('download-progress', (progress) => { + logger.debug(`Download progress: ${progress.percent.toFixed(1)}%`); + }); + + autoUpdater.on('update-downloaded', (info) => { + logger.info(`Update downloaded: ${info.version}`); + // TODO: Notify user that update is ready + // autoUpdater.quitAndInstall() to install immediately + }); + + autoUpdater.on('error', (error) => { + logger.error('Auto-updater error:', error); + }); + + // Check for updates on startup (after a delay) + setTimeout(() => { + autoUpdater.checkForUpdates().catch((err) => { + logger.warn('Failed to check for updates:', err); + }); + }, 10000); // 10 second delay + + // Check for updates every 4 hours + setInterval(() => { + autoUpdater.checkForUpdates().catch((err) => { + logger.warn('Failed to check for updates:', err); + }); + }, 4 * 60 * 60 * 1000); +} + +/** + * Manually check for updates + */ +export async function checkForUpdates(): Promise { + await autoUpdater.checkForUpdates(); +} + +/** + * Quit and install downloaded update + */ +export function installUpdate(): void { + autoUpdater.quitAndInstall(); +} diff --git a/codexbar-electron/src/main/utils/logger.ts b/codexbar-electron/src/main/utils/logger.ts new file mode 100644 index 00000000..1228ee03 --- /dev/null +++ b/codexbar-electron/src/main/utils/logger.ts @@ -0,0 +1,54 @@ +/** + * Logger utility using winston + */ + +import winston from 'winston'; +import path from 'path'; +import { app } from 'electron'; + +// Get user data path for log files +const getLogPath = (): string => { + try { + return path.join(app.getPath('userData'), 'logs'); + } catch { + // App not ready yet, use temp directory + return path.join(process.env.TEMP ?? '/tmp', 'codexbar', 'logs'); + } +}; + +export const logger = winston.createLogger({ + level: process.env.NODE_ENV === 'development' ? 'debug' : 'info', + format: winston.format.combine( + winston.format.timestamp(), + winston.format.errors({ stack: true }), + winston.format.printf(({ timestamp, level, message, stack }) => { + const msg = stack ?? message; + return `${timestamp} [${level.toUpperCase()}] ${msg}`; + }) + ), + transports: [ + // Console output + new winston.transports.Console({ + format: winston.format.combine( + winston.format.colorize(), + winston.format.printf(({ timestamp, level, message }) => { + return `${timestamp} [${level}] ${message}`; + }) + ), + }), + // File output (only when app is ready) + ...(process.type === 'browser' ? [ + new winston.transports.File({ + filename: path.join(getLogPath(), 'error.log'), + level: 'error', + maxsize: 5 * 1024 * 1024, // 5MB + maxFiles: 3, + }), + new winston.transports.File({ + filename: path.join(getLogPath(), 'combined.log'), + maxsize: 10 * 1024 * 1024, // 10MB + maxFiles: 5, + }), + ] : []), + ], +}); diff --git a/codexbar-electron/src/main/utils/subprocess.ts b/codexbar-electron/src/main/utils/subprocess.ts new file mode 100644 index 00000000..e4c27149 --- /dev/null +++ b/codexbar-electron/src/main/utils/subprocess.ts @@ -0,0 +1,91 @@ +/** + * Subprocess utilities for running CLI commands + */ + +import { spawn, SpawnOptions } from 'child_process'; +import { logger } from './logger'; + +export interface CommandResult { + stdout: string; + stderr: string; + exitCode: number; +} + +export interface CommandOptions { + timeout?: number; // milliseconds + cwd?: string; + env?: NodeJS.ProcessEnv; +} + +/** + * Run a command and capture output + */ +export async function runCommand( + command: string, + args: string[] = [], + options: CommandOptions = {} +): Promise { + const { timeout = 30000, cwd, env } = options; + + return new Promise((resolve, reject) => { + logger.debug(`Running command: ${command} ${args.join(' ')}`); + + const spawnOptions: SpawnOptions = { + cwd, + env: { ...process.env, ...env }, + shell: true, // Use shell on Windows for better compatibility + windowsHide: true, + }; + + const child = spawn(command, args, spawnOptions); + + let stdout = ''; + let stderr = ''; + let killed = false; + + // Set up timeout + const timer = setTimeout(() => { + killed = true; + child.kill('SIGTERM'); + reject(new Error(`Command timed out after ${timeout}ms`)); + }, timeout); + + child.stdout?.on('data', (data) => { + stdout += data.toString(); + }); + + child.stderr?.on('data', (data) => { + stderr += data.toString(); + }); + + child.on('error', (error) => { + clearTimeout(timer); + reject(error); + }); + + child.on('close', (code) => { + clearTimeout(timer); + if (!killed) { + resolve({ + stdout: stdout.trim(), + stderr: stderr.trim(), + exitCode: code ?? 0, + }); + } + }); + }); +} + +/** + * Check if a command exists in PATH + */ +export async function commandExists(command: string): Promise { + try { + // Use 'where' on Windows, 'which' on Unix + const checkCmd = process.platform === 'win32' ? 'where' : 'which'; + const result = await runCommand(checkCmd, [command], { timeout: 5000 }); + return result.exitCode === 0; + } catch { + return false; + } +} diff --git a/codexbar-electron/src/renderer/App.tsx b/codexbar-electron/src/renderer/App.tsx new file mode 100644 index 00000000..04702b25 --- /dev/null +++ b/codexbar-electron/src/renderer/App.tsx @@ -0,0 +1,108 @@ +import React, { useEffect, useState } from 'react'; +import { ProviderList } from './components/ProviderList'; +import { GeneralSettings } from './components/GeneralSettings'; + +type Tab = 'providers' | 'general' | 'about'; + +export function App() { + const [activeTab, setActiveTab] = useState('providers'); + const [providers, setProviders] = useState([]); + const [settings, setSettings] = useState({}); + + useEffect(() => { + // Load initial data + loadData(); + + // Subscribe to updates + const unsubscribe = window.codexbar.onUpdate(() => { + loadData(); + }); + + return unsubscribe; + }, []); + + async function loadData() { + const [providerData, settingsData] = await Promise.all([ + window.codexbar.getProviders(), + window.codexbar.getSettings(), + ]); + setProviders(providerData); + setSettings(settingsData); + } + + async function handleToggleProvider(id: string, enabled: boolean) { + await window.codexbar.toggleProvider(id, enabled); + await loadData(); + } + + async function handleSettingChange(key: string, value: any) { + await window.codexbar.setSetting(key, value); + await loadData(); + } + + async function handleRefresh() { + await window.codexbar.refreshAll(); + } + + return ( +
+
+

CodexBar Settings

+ +
+ + + +
+ {activeTab === 'providers' && ( + + )} + {activeTab === 'general' && ( + + )} + {activeTab === 'about' && ( +
+

CodexBar

+

Monitor API usage limits for AI providers

+

Version 0.1.0 (Windows Port)

+

+ + GitHub Repository + +

+

+ © 2024 CodexBar Contributors. MIT License. +

+
+ )} +
+
+ ); +} diff --git a/codexbar-electron/src/renderer/components/GeneralSettings.tsx b/codexbar-electron/src/renderer/components/GeneralSettings.tsx new file mode 100644 index 00000000..f83aa525 --- /dev/null +++ b/codexbar-electron/src/renderer/components/GeneralSettings.tsx @@ -0,0 +1,96 @@ +import React from 'react'; + +interface Settings { + refreshInterval: number; + showNotifications: boolean; + startAtLogin: boolean; + theme: 'system' | 'light' | 'dark'; +} + +interface Props { + settings: Partial; + onChange: (key: string, value: any) => void; +} + +export function GeneralSettings({ settings, onChange }: Props) { + return ( +
+
+

Refresh

+ +
+
+
Refresh Interval
+
How often to check for usage updates
+
+ +
+
+ +
+

Notifications

+ +
+
+
Show Notifications
+
Get notified when usage is high
+
+ +
+
+ +
+

System

+ +
+
+
Start at Login
+
Launch CodexBar when you log in
+
+ +
+ +
+
+
Theme
+
Application color scheme
+
+ +
+
+
+ ); +} diff --git a/codexbar-electron/src/renderer/components/ProviderList.tsx b/codexbar-electron/src/renderer/components/ProviderList.tsx new file mode 100644 index 00000000..4fa76d32 --- /dev/null +++ b/codexbar-electron/src/renderer/components/ProviderList.tsx @@ -0,0 +1,89 @@ +import React from 'react'; + +interface Provider { + id: string; + name: string; + icon: string; + enabled: boolean; + result: { + state: 'idle' | 'loading' | 'success' | 'error'; + usage?: { + session?: { used: number; limit: number; percentage: number; displayString: string }; + weekly?: { used: number; limit: number; percentage: number; displayString: string }; + monthly?: { used: number; limit: number; percentage: number; displayString: string }; + }; + error?: string; + }; +} + +interface Props { + providers: Provider[]; + onToggle: (id: string, enabled: boolean) => void; +} + +export function ProviderList({ providers, onToggle }: Props) { + return ( +
+ {providers.map((provider) => ( + + ))} +
+ ); +} + +function ProviderCard({ provider, onToggle }: { provider: Provider; onToggle: Props['onToggle'] }) { + const usage = provider.result.usage?.session || + provider.result.usage?.weekly || + provider.result.usage?.monthly; + + const getStatusText = () => { + if (!provider.enabled) return 'Disabled'; + if (provider.result.state === 'loading') return 'Loading...'; + if (provider.result.state === 'error') return provider.result.error || 'Error'; + if (provider.result.state === 'success' && usage) return usage.displayString; + return 'No data'; + }; + + const getBarClass = () => { + if (!usage) return ''; + if (usage.percentage >= 90) return 'critical'; + if (usage.percentage >= 70) return 'warning'; + return ''; + }; + + return ( +
+
{provider.icon}
+ +
+
{provider.name}
+
{getStatusText()}
+
+ + {provider.enabled && usage && ( +
+
+
+
+
{usage.percentage}%
+
+ )} + + +
+ ); +} diff --git a/codexbar-electron/src/renderer/index.html b/codexbar-electron/src/renderer/index.html new file mode 100644 index 00000000..a309a593 --- /dev/null +++ b/codexbar-electron/src/renderer/index.html @@ -0,0 +1,13 @@ + + + + + + + CodexBar Settings + + +
+ + + diff --git a/codexbar-electron/src/renderer/main.tsx b/codexbar-electron/src/renderer/main.tsx new file mode 100644 index 00000000..5c871087 --- /dev/null +++ b/codexbar-electron/src/renderer/main.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { createRoot } from 'react-dom/client'; +import { App } from './App'; +import './styles.css'; + +const container = document.getElementById('root'); +if (container) { + const root = createRoot(container); + root.render( + + + + ); +} diff --git a/codexbar-electron/src/renderer/styles.css b/codexbar-electron/src/renderer/styles.css new file mode 100644 index 00000000..f00b6f43 --- /dev/null +++ b/codexbar-electron/src/renderer/styles.css @@ -0,0 +1,305 @@ +:root { + --bg-primary: #1a1a2e; + --bg-secondary: #16213e; + --bg-tertiary: #0f3460; + --text-primary: #eaeaea; + --text-secondary: #a0a0a0; + --accent: #e94560; + --accent-hover: #ff6b6b; + --success: #4ade80; + --warning: #fbbf24; + --error: #f87171; + --border: #2a2a4a; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; + background: var(--bg-primary); + color: var(--text-primary); + font-size: 14px; + line-height: 1.5; +} + +.app { + min-height: 100vh; + display: flex; + flex-direction: column; +} + +.app-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 16px 20px; + background: var(--bg-secondary); + border-bottom: 1px solid var(--border); +} + +.app-header h1 { + font-size: 18px; + font-weight: 600; +} + +.refresh-btn { + background: var(--bg-tertiary); + color: var(--text-primary); + border: 1px solid var(--border); + padding: 6px 12px; + border-radius: 6px; + cursor: pointer; + font-size: 13px; + transition: all 0.2s; +} + +.refresh-btn:hover { + background: var(--accent); + border-color: var(--accent); +} + +.tabs { + display: flex; + gap: 0; + background: var(--bg-secondary); + border-bottom: 1px solid var(--border); + padding: 0 20px; +} + +.tabs button { + background: transparent; + color: var(--text-secondary); + border: none; + padding: 12px 20px; + cursor: pointer; + font-size: 14px; + border-bottom: 2px solid transparent; + transition: all 0.2s; +} + +.tabs button:hover { + color: var(--text-primary); +} + +.tabs button.active { + color: var(--accent); + border-bottom-color: var(--accent); +} + +.content { + flex: 1; + padding: 20px; + overflow-y: auto; +} + +/* Provider List */ +.provider-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.provider-card { + background: var(--bg-secondary); + border: 1px solid var(--border); + border-radius: 8px; + padding: 16px; + display: flex; + align-items: center; + gap: 16px; +} + +.provider-card.disabled { + opacity: 0.5; +} + +.provider-icon { + font-size: 24px; + width: 40px; + text-align: center; +} + +.provider-info { + flex: 1; +} + +.provider-name { + font-weight: 600; + margin-bottom: 4px; +} + +.provider-status { + font-size: 12px; + color: var(--text-secondary); +} + +.provider-usage { + text-align: right; +} + +.usage-bar { + width: 120px; + height: 6px; + background: var(--bg-tertiary); + border-radius: 3px; + overflow: hidden; + margin-bottom: 4px; +} + +.usage-bar-fill { + height: 100%; + background: var(--success); + transition: width 0.3s; +} + +.usage-bar-fill.warning { + background: var(--warning); +} + +.usage-bar-fill.critical { + background: var(--error); +} + +.usage-text { + font-size: 11px; + color: var(--text-secondary); +} + +.provider-toggle { + position: relative; + width: 44px; + height: 24px; +} + +.provider-toggle input { + opacity: 0; + width: 0; + height: 0; +} + +.toggle-slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: var(--bg-tertiary); + border-radius: 24px; + transition: 0.3s; +} + +.toggle-slider:before { + position: absolute; + content: ""; + height: 18px; + width: 18px; + left: 3px; + bottom: 3px; + background: white; + border-radius: 50%; + transition: 0.3s; +} + +.provider-toggle input:checked + .toggle-slider { + background: var(--accent); +} + +.provider-toggle input:checked + .toggle-slider:before { + transform: translateX(20px); +} + +/* General Settings */ +.settings-section { + margin-bottom: 24px; +} + +.settings-section h3 { + font-size: 14px; + font-weight: 600; + margin-bottom: 12px; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.setting-row { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 16px; + background: var(--bg-secondary); + border: 1px solid var(--border); + border-radius: 8px; + margin-bottom: 8px; +} + +.setting-label { + font-weight: 500; +} + +.setting-description { + font-size: 12px; + color: var(--text-secondary); + margin-top: 4px; +} + +.setting-input { + background: var(--bg-tertiary); + border: 1px solid var(--border); + color: var(--text-primary); + padding: 8px 12px; + border-radius: 6px; + font-size: 14px; +} + +.setting-input:focus { + outline: none; + border-color: var(--accent); +} + +select.setting-input { + cursor: pointer; +} + +/* About */ +.about { + text-align: center; + padding: 40px 20px; +} + +.about h2 { + font-size: 24px; + margin-bottom: 8px; +} + +.about p { + margin-bottom: 16px; + color: var(--text-secondary); +} + +.about .version { + font-family: monospace; + background: var(--bg-secondary); + display: inline-block; + padding: 4px 12px; + border-radius: 4px; +} + +.about a { + color: var(--accent); + text-decoration: none; +} + +.about a:hover { + text-decoration: underline; +} + +.about .copyright { + font-size: 12px; + margin-top: 32px; +} diff --git a/codexbar-electron/tsconfig.json b/codexbar-electron/tsconfig.json new file mode 100644 index 00000000..39116764 --- /dev/null +++ b/codexbar-electron/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022"], + "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "outDir": "./dist", + "rootDir": "./src", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"], + "@main/*": ["src/main/*"], + "@renderer/*": ["src/renderer/*"], + "@shared/*": ["src/shared/*"] + } + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "release"] +} diff --git a/codexbar-electron/tsconfig.main.json b/codexbar-electron/tsconfig.main.json new file mode 100644 index 00000000..ed5611e6 --- /dev/null +++ b/codexbar-electron/tsconfig.main.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist/main", + "rootDir": "./src/main" + }, + "include": ["src/main/**/*", "src/shared/**/*"] +} diff --git a/codexbar-electron/tsconfig.renderer.json b/codexbar-electron/tsconfig.renderer.json new file mode 100644 index 00000000..ff437289 --- /dev/null +++ b/codexbar-electron/tsconfig.renderer.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "outDir": "./dist/renderer", + "rootDir": "./src/renderer" + }, + "include": ["src/renderer/**/*", "src/shared/**/*"] +} diff --git a/codexbar-electron/vite.config.ts b/codexbar-electron/vite.config.ts new file mode 100644 index 00000000..95034c18 --- /dev/null +++ b/codexbar-electron/vite.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import path from 'path'; + +export default defineConfig({ + plugins: [react()], + root: './src/renderer', + base: './', + build: { + outDir: '../../dist/renderer', + emptyOutDir: true, + }, + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + '@renderer': path.resolve(__dirname, './src/renderer'), + '@shared': path.resolve(__dirname, './src/shared'), + }, + }, + server: { + port: 5173, + }, +}); From c4d469c6777db11cd0bab420709963b29a285864 Mon Sep 17 00:00:00 2001 From: bhadraagada Date: Fri, 9 Jan 2026 12:25:21 +0530 Subject: [PATCH 2/5] Fix TypeScript errors and pnpm build config - Add setAny() method to SettingsStore for IPC string keys - Add pnpm.onlyBuiltDependencies for electron, esbuild, keytar, node-pty - Add pnpm-lock.yaml --- codexbar-electron/package.json | 8 + codexbar-electron/pnpm-lock.yaml | 5225 +++++++++++++++++ codexbar-electron/src/main/index.ts | 2 +- .../src/main/store/SettingsStore.ts | 10 + 4 files changed, 5244 insertions(+), 1 deletion(-) create mode 100644 codexbar-electron/pnpm-lock.yaml diff --git a/codexbar-electron/package.json b/codexbar-electron/package.json index d16f436f..5d81d79e 100644 --- a/codexbar-electron/package.json +++ b/codexbar-electron/package.json @@ -9,6 +9,14 @@ "type": "git", "url": "https://github.com/steipete/CodexBar" }, + "pnpm": { + "onlyBuiltDependencies": [ + "electron", + "esbuild", + "keytar", + "node-pty" + ] + }, "scripts": { "dev": "concurrently \"npm run dev:main\" \"npm run dev:renderer\"", "dev:main": "tsc -p tsconfig.main.json --watch", diff --git a/codexbar-electron/pnpm-lock.yaml b/codexbar-electron/pnpm-lock.yaml new file mode 100644 index 00000000..05821dcb --- /dev/null +++ b/codexbar-electron/pnpm-lock.yaml @@ -0,0 +1,5225 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + commander: + specifier: ^11.1.0 + version: 11.1.0 + electron-store: + specifier: ^8.1.0 + version: 8.2.0 + electron-updater: + specifier: ^6.1.7 + version: 6.7.3 + keytar: + specifier: ^7.9.0 + version: 7.9.0 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + node-pty: + specifier: ^1.0.0 + version: 1.1.0 + tough-cookie: + specifier: ^4.1.3 + version: 4.1.4 + winston: + specifier: ^3.11.0 + version: 3.19.0 + devDependencies: + '@types/node': + specifier: ^20.10.0 + version: 20.19.27 + '@types/react': + specifier: ^18.2.45 + version: 18.3.27 + '@types/react-dom': + specifier: ^18.2.18 + version: 18.3.7(@types/react@18.3.27) + '@types/tough-cookie': + specifier: ^4.0.5 + version: 4.0.5 + '@typescript-eslint/eslint-plugin': + specifier: ^6.14.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^6.14.0 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.7.0(vite@5.4.21(@types/node@20.19.27)) + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + electron: + specifier: ^28.0.0 + version: 28.3.3 + electron-builder: + specifier: ^24.9.1 + version: 24.13.3(electron-builder-squirrel-windows@24.13.3) + eslint: + specifier: ^8.56.0 + version: 8.57.1 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + typescript: + specifier: ^5.3.3 + version: 5.9.3 + vite: + specifier: ^5.0.10 + version: 5.4.21(@types/node@20.19.27) + vitest: + specifier: ^1.1.0 + version: 1.6.1(@types/node@20.19.27) + +packages: + + 7zip-bin@5.2.0: + resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + + '@develar/schema-utils@2.6.5': + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} + engines: {node: '>=10.12.0'} + hasBin: true + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@electron/notarize@2.2.1': + resolution: {integrity: sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==} + engines: {node: '>= 10.0.0'} + + '@electron/osx-sign@1.0.5': + resolution: {integrity: sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/universal@1.5.1': + resolution: {integrity: sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==} + engines: {node: '>=8.6'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@malept/cross-spawn-promise@1.1.1': + resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} + engines: {node: '>= 10'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rollup/rollup-android-arm-eabi@4.55.1': + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.55.1': + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.55.1': + resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.55.1': + resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.55.1': + resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.55.1': + resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.55.1': + resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.55.1': + resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.55.1': + resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.55.1': + resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.55.1': + resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.55.1': + resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.55.1': + resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.55.1': + resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.55.1': + resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + + '@types/node@20.19.27': + resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} + + '@types/plist@3.0.5': + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react@18.3.27': + resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/verror@1.10.11': + resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} + + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + + '@xmldom/xmldom@0.8.11': + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + engines: {node: '>=10.0.0'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + app-builder-bin@4.0.0: + resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} + + app-builder-lib@24.13.3: + resolution: {integrity: sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 24.13.3 + electron-builder-squirrel-windows: 24.13.3 + + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atomically@1.7.0: + resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} + engines: {node: '>=10.12.0'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.9.13: + resolution: {integrity: sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ==} + hasBin: true + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird-lst@1.0.9: + resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builder-util-runtime@9.2.4: + resolution: {integrity: sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==} + engines: {node: '>=12.0.0'} + + builder-util-runtime@9.5.1: + resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} + engines: {node: '>=12.0.0'} + + builder-util@24.13.1: + resolution: {integrity: sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001763: + resolution: {integrity: sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-name@2.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} + engines: {node: '>=12.20'} + + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + + conf@10.2.0: + resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} + engines: {node: '>=12'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + config-file-ts@0.2.6: + resolution: {integrity: sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + debounce-fn@4.0.0: + resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} + engines: {node: '>=10'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dir-compare@3.3.0: + resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dmg-builder@24.13.3: + resolution: {integrity: sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==} + + dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + dotenv@9.0.2: + resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} + engines: {node: '>=10'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder-squirrel-windows@24.13.3: + resolution: {integrity: sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==} + + electron-builder@24.13.3: + resolution: {integrity: sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@24.13.1: + resolution: {integrity: sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==} + + electron-store@8.2.0: + resolution: {integrity: sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw==} + + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + + electron-updater@6.7.3: + resolution: {integrity: sha512-EgkT8Z9noqXKbwc3u5FkJA+r48jwZ5DTUiOkJMOTEEH//n5Am6wfQGz7nvSFEA2oIAMv9jRzn5JKTyWeSKOPgg==} + + electron@28.3.3: + resolution: {integrity: sha512-ObKMLSPNhomtCOBAxFS8P2DW/4umkh72ouZUlUKzXGtYuPzgr1SYhskhFWgzAsPtUzhL2CzyV2sfbHcEW4CXqw==} + engines: {node: '>= 12.20.55'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@7.0.3: + resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + keytar@7.9.0: + resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-abi@3.85.0: + resolution: {integrity: sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==} + engines: {node: '>=10'} + + node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + + node-addon-api@4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-pty@1.1.0: + resolution: {integrity: sha512-20JqtutY6JPXTUnL0ij1uad7Qe1baT46lyolh2sSENDd4sTzKZ4nmAFkeAARDKwmlLjPx6XKRlwRUxwjOy+lUg==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + + plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-config-file@6.3.2: + resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} + engines: {node: '>=12.0.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + + rollup@4.55.1: + resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tiny-typed-emitter@2.1.0: + resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.2: + resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + + vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} + engines: {node: '>= 12.0.0'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + +snapshots: + + 7zip-bin@5.2.0: {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/runtime@7.28.4': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@colors/colors@1.6.0': {} + + '@dabh/diagnostics@2.0.8': + dependencies: + '@so-ric/colorspace': 1.1.6 + enabled: 2.0.0 + kuler: 2.0.0 + + '@develar/schema-utils@2.6.5': + dependencies: + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + '@electron/asar@3.4.1': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@2.2.1': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.0.5': + dependencies: + compare-version: 0.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/universal@1.5.1': + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 1.1.1 + debug: 4.4.3 + dir-compare: 3.3.0 + fs-extra: 9.1.0 + minimatch: 3.1.2 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@malept/cross-spawn-promise@1.1.1': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + lodash: 4.17.21 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rollup/rollup-android-arm-eabi@4.55.1': + optional: true + + '@rollup/rollup-android-arm64@4.55.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.55.1': + optional: true + + '@rollup/rollup-darwin-x64@4.55.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.55.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.55.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.55.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.55.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.55.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.55.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.55.1': + optional: true + + '@sinclair/typebox@0.27.8': {} + + '@sindresorhus/is@4.6.0': {} + + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tootallnate/once@2.0.0': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.5 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.5 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.19.27 + '@types/responselike': 1.0.3 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.8': {} + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 20.19.27 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.19.27 + + '@types/ms@2.1.0': {} + + '@types/node@18.19.130': + dependencies: + undici-types: 5.26.5 + + '@types/node@20.19.27': + dependencies: + undici-types: 6.21.0 + + '@types/plist@3.0.5': + dependencies: + '@types/node': 20.19.27 + xmlbuilder: 15.1.1 + optional: true + + '@types/prop-types@15.7.15': {} + + '@types/react-dom@18.3.7(@types/react@18.3.27)': + dependencies: + '@types/react': 18.3.27 + + '@types/react@18.3.27': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.19.27 + + '@types/semver@7.7.1': {} + + '@types/tough-cookie@4.0.5': {} + + '@types/triple-beam@1.3.5': {} + + '@types/verror@1.10.11': + optional: true + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.19.27 + optional: true + + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.3 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.7.3 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.3 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.3 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.7.3 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + eslint: 8.57.1 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@20.19.27))': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 5.4.21(@types/node@20.19.27) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.1': + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + + '@vitest/runner@1.6.1': + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.1': + dependencies: + magic-string: 0.30.21 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.1': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.1': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@xmldom/xmldom@0.8.11': {} + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.3: {} + + app-builder-bin@4.0.0: {} + + app-builder-lib@24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/notarize': 2.2.1 + '@electron/osx-sign': 1.0.5 + '@electron/universal': 1.5.1 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + bluebird-lst: 1.0.9 + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chromium-pickle-js: 0.2.0 + debug: 4.4.3 + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) + ejs: 3.1.10 + electron-builder-squirrel-windows: 24.13.3(dmg-builder@24.13.3) + electron-publish: 24.13.1 + form-data: 4.0.5 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + is-ci: 3.0.1 + isbinaryfile: 5.0.7 + js-yaml: 4.1.1 + lazy-val: 1.0.5 + minimatch: 5.1.6 + read-config-file: 6.3.2 + sanitize-filename: 1.6.3 + semver: 7.7.3 + tar: 6.2.1 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + archiver-utils@2.1.0: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + + archiver-utils@3.0.4: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + archiver@5.3.2: + dependencies: + archiver-utils: 2.1.0 + async: 3.2.6 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + assert-plus@1.0.0: + optional: true + + assertion-error@1.1.0: {} + + astral-regex@2.0.0: + optional: true + + async-exit-hook@2.0.1: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + atomically@1.7.0: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.9.13: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird-lst@1.0.9: + dependencies: + bluebird: 3.7.2 + + bluebird@3.7.2: {} + + boolean@3.2.0: + optional: true + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.13 + caniuse-lite: 1.0.30001763 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + buffer-crc32@0.2.13: {} + + buffer-equal@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builder-util-runtime@9.2.4: + dependencies: + debug: 4.4.3 + sax: 1.4.4 + transitivePeerDependencies: + - supports-color + + builder-util-runtime@9.5.1: + dependencies: + debug: 4.4.3 + sax: 1.4.4 + transitivePeerDependencies: + - supports-color + + builder-util@24.13.1: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.12 + app-builder-bin: 4.0.0 + bluebird-lst: 1.0.9 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + fs-extra: 10.1.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-ci: 3.0.1 + js-yaml: 4.1.1 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + + cac@6.7.14: {} + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001763: {} + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chownr@1.1.4: {} + + chownr@2.0.0: {} + + chromium-pickle-js@0.2.0: {} + + ci-info@3.9.0: {} + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + optional: true + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-convert@3.1.3: + dependencies: + color-name: 2.1.0 + + color-name@1.1.4: {} + + color-name@2.1.0: {} + + color-string@2.1.4: + dependencies: + color-name: 2.1.0 + + color@5.0.3: + dependencies: + color-convert: 3.1.3 + color-string: 2.1.4 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@11.1.0: {} + + commander@5.1.0: {} + + compare-version@0.1.2: {} + + compress-commons@4.1.2: + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + concat-map@0.0.1: {} + + concurrently@8.2.2: + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.2 + shell-quote: 1.8.3 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + conf@10.2.0: + dependencies: + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + atomically: 1.7.0 + debounce-fn: 4.0.0 + dot-prop: 6.0.1 + env-paths: 2.2.1 + json-schema-typed: 7.0.3 + onetime: 5.1.2 + pkg-up: 3.1.0 + semver: 7.7.3 + + confbox@0.1.8: {} + + config-file-ts@0.2.6: + dependencies: + glob: 10.5.0 + typescript: 5.9.3 + + convert-source-map@2.0.0: {} + + core-util-is@1.0.2: + optional: true + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + crc32-stream@4.0.3: + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + + crc@3.8.0: + dependencies: + buffer: 5.7.1 + optional: true + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + data-uri-to-buffer@4.0.1: {} + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.28.4 + + debounce-fn@4.0.0: + dependencies: + mimic-fn: 3.1.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + optional: true + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + optional: true + + delayed-stream@1.0.0: {} + + detect-libc@2.1.2: {} + + detect-node@2.1.0: + optional: true + + diff-sequences@29.6.3: {} + + dir-compare@3.3.0: + dependencies: + buffer-equal: 1.0.1 + minimatch: 3.1.2 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.1 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + dmg-license@1.0.11: + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.11 + ajv: 6.12.6 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.0 + smart-buffer: 4.2.0 + verror: 1.10.1 + optional: true + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + + dotenv-expand@5.1.0: {} + + dotenv@9.0.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + archiver: 5.3.2 + builder-util: 24.13.1 + fs-extra: 10.1.0 + transitivePeerDependencies: + - dmg-builder + - supports-color + + electron-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): + dependencies: + app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) + fs-extra: 10.1.0 + is-ci: 3.0.1 + lazy-val: 1.0.5 + read-config-file: 6.3.2 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + electron-publish@24.13.1: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 24.13.1 + builder-util-runtime: 9.2.4 + chalk: 4.1.2 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + + electron-store@8.2.0: + dependencies: + conf: 10.2.0 + type-fest: 2.19.0 + + electron-to-chromium@1.5.267: {} + + electron-updater@6.7.3: + dependencies: + builder-util-runtime: 9.5.1 + fs-extra: 10.1.0 + js-yaml: 4.1.1 + lazy-val: 1.0.5 + lodash.escaperegexp: 4.1.2 + lodash.isequal: 4.5.0 + semver: 7.7.3 + tiny-typed-emitter: 2.1.0 + transitivePeerDependencies: + - supports-color + + electron@28.3.3: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 18.19.130 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + enabled@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + env-paths@2.2.1: {} + + err-code@2.0.3: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es6-error@4.1.1: + optional: true + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + expand-template@2.0.3: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + extsprintf@1.4.1: + optional: true + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.0: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fecha@4.2.3: {} + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + + fn.name@1.1.0: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + 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 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + get-stream@8.0.1: {} + + github-from-package@0.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.3 + serialize-error: 7.0.1 + optional: true + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + optional: true + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + optional: true + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + http-cache-semantics@4.2.0: {} + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-signals@5.0.0: {} + + iconv-corefoundation@1.1.7: + dependencies: + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + optional: true + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + is-ci@3.0.1: + dependencies: + ci-info: 3.9.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-path-inside@3.0.3: {} + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + isarray@1.0.0: {} + + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.7: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.4 + picocolors: 1.1.1 + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema-typed@7.0.3: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: + optional: true + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keytar@7.9.0: + dependencies: + node-addon-api: 4.3.0 + prebuild-install: 7.1.3 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kuler@2.0.0: {} + + lazy-val@1.0.5: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + local-pkg@0.5.1: + dependencies: + mlly: 1.8.0 + pkg-types: 1.3.1 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.defaults@4.2.0: {} + + lodash.difference@4.5.0: {} + + lodash.escaperegexp@4.1.2: {} + + lodash.flatten@4.4.0: {} + + lodash.isequal@4.5.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + lodash.union@4.6.0: {} + + lodash@4.17.21: {} + + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + + math-intrinsics@1.1.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@3.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.2 + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + napi-build-utils@2.0.0: {} + + natural-compare@1.4.0: {} + + node-abi@3.85.0: + dependencies: + semver: 7.7.3 + + node-addon-api@1.7.2: + optional: true + + node-addon-api@4.3.0: {} + + node-addon-api@7.1.1: {} + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-pty@1.1.0: + dependencies: + node-addon-api: 7.1.1 + + node-releases@2.0.27: {} + + normalize-path@3.0.0: {} + + normalize-url@6.1.0: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-keys@1.1.1: + optional: true + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-cancelable@2.1.1: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.2.2 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + pathval@1.1.1: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-up@3.1.0: + dependencies: + find-up: 3.0.0 + + plist@3.1.0: + dependencies: + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.1.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.85.0 + pump: 3.0.3 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.4 + tunnel-agent: 0.6.0 + + prelude-ls@1.2.1: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process-nextick-args@2.0.1: {} + + progress@2.0.3: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-is@18.3.1: {} + + react-refresh@0.17.0: {} + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-config-file@6.3.2: + dependencies: + config-file-ts: 0.2.6 + dotenv: 9.0.2 + dotenv-expand: 5.1.0 + js-yaml: 4.1.1 + json5: 2.2.3 + lazy-val: 1.0.5 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + retry@0.12.0: {} + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + + rollup@4.55.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.55.1 + '@rollup/rollup-android-arm64': 4.55.1 + '@rollup/rollup-darwin-arm64': 4.55.1 + '@rollup/rollup-darwin-x64': 4.55.1 + '@rollup/rollup-freebsd-arm64': 4.55.1 + '@rollup/rollup-freebsd-x64': 4.55.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 + '@rollup/rollup-linux-arm-musleabihf': 4.55.1 + '@rollup/rollup-linux-arm64-gnu': 4.55.1 + '@rollup/rollup-linux-arm64-musl': 4.55.1 + '@rollup/rollup-linux-loong64-gnu': 4.55.1 + '@rollup/rollup-linux-loong64-musl': 4.55.1 + '@rollup/rollup-linux-ppc64-gnu': 4.55.1 + '@rollup/rollup-linux-ppc64-musl': 4.55.1 + '@rollup/rollup-linux-riscv64-gnu': 4.55.1 + '@rollup/rollup-linux-riscv64-musl': 4.55.1 + '@rollup/rollup-linux-s390x-gnu': 4.55.1 + '@rollup/rollup-linux-x64-gnu': 4.55.1 + '@rollup/rollup-linux-x64-musl': 4.55.1 + '@rollup/rollup-openbsd-x64': 4.55.1 + '@rollup/rollup-openharmony-arm64': 4.55.1 + '@rollup/rollup-win32-arm64-msvc': 4.55.1 + '@rollup/rollup-win32-ia32-msvc': 4.55.1 + '@rollup/rollup-win32-x64-gnu': 4.55.1 + '@rollup/rollup-win32-x64-msvc': 4.55.1 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + + sax@1.4.4: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver-compare@1.0.0: + optional: true + + semver@6.3.1: {} + + semver@7.7.3: {} + + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.3 + + slash@3.0.0: {} + + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + optional: true + + smart-buffer@4.2.0: + optional: true + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spawn-command@0.0.2: {} + + sprintf-js@1.1.3: + optional: true + + stack-trace@0.0.10: {} + + stackback@0.0.2: {} + + stat-mode@1.0.0: {} + + std-env@3.10.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-final-newline@3.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + + sumchecker@3.0.1: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + tar-fs@2.1.4: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.3 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + temp-file@3.4.0: + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + + text-hex@1.0.0: {} + + text-table@0.2.0: {} + + tiny-typed-emitter@2.1.0: {} + + tinybench@2.9.0: {} + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.5 + + tmp@0.2.5: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tough-cookie@4.1.4: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tree-kill@1.2.2: {} + + triple-beam@1.4.1: {} + + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + + ts-api-utils@1.4.3(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.1.0: {} + + type-fest@0.13.1: + optional: true + + type-fest@0.20.2: {} + + type-fest@2.19.0: {} + + typescript@5.9.3: {} + + ufo@1.6.2: {} + + undici-types@5.26.5: {} + + undici-types@6.21.0: {} + + universalify@0.1.2: {} + + universalify@0.2.0: {} + + universalify@2.0.1: {} + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + utf8-byte-length@1.0.5: {} + + util-deprecate@1.0.2: {} + + verror@1.10.1: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + optional: true + + vite-node@1.6.1(@types/node@20.19.27): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.21(@types/node@20.19.27) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.21(@types/node@20.19.27): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.55.1 + optionalDependencies: + '@types/node': 20.19.27 + fsevents: 2.3.3 + + vitest@1.6.1(@types/node@20.19.27): + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.4.3 + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.21 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.10.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.21(@types/node@20.19.27) + vite-node: 1.6.1(@types/node@20.19.27) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.19.27 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + web-streams-polyfill@3.3.3: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.19.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.8 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + xmlbuilder@15.1.1: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} + + yocto-queue@1.2.2: {} + + zip-stream@4.1.1: + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 diff --git a/codexbar-electron/src/main/index.ts b/codexbar-electron/src/main/index.ts index fc66723e..550832f3 100644 --- a/codexbar-electron/src/main/index.ts +++ b/codexbar-electron/src/main/index.ts @@ -118,7 +118,7 @@ function setupIPC(): void { // Update settings ipcMain.handle('set-setting', async (_event, key: string, value: unknown) => { - settingsStore?.set(key, value); + settingsStore?.setAny(key, value); await updateTrayMenu(); }); diff --git a/codexbar-electron/src/main/store/SettingsStore.ts b/codexbar-electron/src/main/store/SettingsStore.ts index 751de35a..89b4646b 100644 --- a/codexbar-electron/src/main/store/SettingsStore.ts +++ b/codexbar-electron/src/main/store/SettingsStore.ts @@ -59,6 +59,16 @@ export class SettingsStore { logger.debug(`Setting updated: ${key} = ${JSON.stringify(value)}`); } + /** + * Set a setting by string key (for IPC) + */ + setAny(key: string, value: unknown): void { + if (key in defaults) { + this.store.set(key as keyof SettingsSchema, value as any); + logger.debug(`Setting updated: ${key} = ${JSON.stringify(value)}`); + } + } + /** * Check if a provider is enabled */ From 8abdc4d82954e9381b776c7ba453fcb90569087e Mon Sep 17 00:00:00 2001 From: bhadraagada Date: Fri, 9 Jan 2026 12:37:04 +0530 Subject: [PATCH 3/5] Redesign UI with modern dark theme - Clean, minimal dark design with smooth gradients - Card-based provider list with staggered animations - Large percentage display with color-coded warnings - Modern toggle switches with hover states - Custom scrollbars and proper typography - Polished About page with logo and links - Responsive hover effects throughout --- codexbar-electron/src/renderer/App.tsx | 97 +++- .../renderer/components/GeneralSettings.tsx | 30 +- .../src/renderer/components/ProviderList.tsx | 49 +- codexbar-electron/src/renderer/styles.css | 491 ++++++++++++++---- 4 files changed, 524 insertions(+), 143 deletions(-) diff --git a/codexbar-electron/src/renderer/App.tsx b/codexbar-electron/src/renderer/App.tsx index 04702b25..ef7bba52 100644 --- a/codexbar-electron/src/renderer/App.tsx +++ b/codexbar-electron/src/renderer/App.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from 'react'; import { ProviderList } from './components/ProviderList'; import { GeneralSettings } from './components/GeneralSettings'; +import './styles.css'; type Tab = 'providers' | 'general' | 'about'; @@ -8,48 +9,72 @@ export function App() { const [activeTab, setActiveTab] = useState('providers'); const [providers, setProviders] = useState([]); const [settings, setSettings] = useState({}); + const [isRefreshing, setIsRefreshing] = useState(false); useEffect(() => { - // Load initial data loadData(); - // Subscribe to updates - const unsubscribe = window.codexbar.onUpdate(() => { + const unsubscribe = window.codexbar?.onUpdate(() => { loadData(); }); - return unsubscribe; + return () => unsubscribe?.(); }, []); async function loadData() { - const [providerData, settingsData] = await Promise.all([ - window.codexbar.getProviders(), - window.codexbar.getSettings(), - ]); - setProviders(providerData); - setSettings(settingsData); + try { + const [providerData, settingsData] = await Promise.all([ + window.codexbar?.getProviders() ?? [], + window.codexbar?.getSettings() ?? {}, + ]); + setProviders(providerData); + setSettings(settingsData); + } catch (err) { + console.error('Failed to load data:', err); + } } async function handleToggleProvider(id: string, enabled: boolean) { - await window.codexbar.toggleProvider(id, enabled); + await window.codexbar?.toggleProvider(id, enabled); await loadData(); } async function handleSettingChange(key: string, value: any) { - await window.codexbar.setSetting(key, value); + await window.codexbar?.setSetting(key, value); await loadData(); } async function handleRefresh() { - await window.codexbar.refreshAll(); + setIsRefreshing(true); + try { + await window.codexbar?.refreshAll(); + await loadData(); + } finally { + setTimeout(() => setIsRefreshing(false), 500); + } } return (
-

CodexBar Settings

-
@@ -64,7 +89,7 @@ export function App() { className={activeTab === 'general' ? 'active' : ''} onClick={() => setActiveTab('general')} > - General + Settings
)} + +
); } diff --git a/codexbar-electron/src/renderer/components/GeneralSettings.tsx b/codexbar-electron/src/renderer/components/GeneralSettings.tsx index f83aa525..92628d57 100644 --- a/codexbar-electron/src/renderer/components/GeneralSettings.tsx +++ b/codexbar-electron/src/renderer/components/GeneralSettings.tsx @@ -16,24 +16,24 @@ export function GeneralSettings({ settings, onChange }: Props) { return (
-

Refresh

+

Data

Refresh Interval
-
How often to check for usage updates
+
How often to sync usage data
@@ -43,8 +43,8 @@ export function GeneralSettings({ settings, onChange }: Props) {
-
Show Notifications
-
Get notified when usage is high
+
Usage Alerts
+
Notify when usage exceeds 80%
diff --git a/codexbar-electron/src/renderer/components/ProviderList.tsx b/codexbar-electron/src/renderer/components/ProviderList.tsx index 4fa76d32..f2d4db4f 100644 --- a/codexbar-electron/src/renderer/components/ProviderList.tsx +++ b/codexbar-electron/src/renderer/components/ProviderList.tsx @@ -22,6 +22,15 @@ interface Props { } export function ProviderList({ providers, onToggle }: Props) { + if (providers.length === 0) { + return ( +
+
📡
+

Loading providers...

+
+ ); + } + return (
{providers.map((provider) => ( @@ -42,10 +51,27 @@ function ProviderCard({ provider, onToggle }: { provider: Provider; onToggle: Pr const getStatusText = () => { if (!provider.enabled) return 'Disabled'; - if (provider.result.state === 'loading') return 'Loading...'; - if (provider.result.state === 'error') return provider.result.error || 'Error'; - if (provider.result.state === 'success' && usage) return usage.displayString; - return 'No data'; + if (provider.result.state === 'loading') return 'Syncing...'; + if (provider.result.state === 'error') return provider.result.error || 'Connection error'; + if (provider.result.state === 'success' && usage) { + return usage.displayString; + } + if (provider.result.state === 'success') return 'Connected'; + return 'Not configured'; + }; + + const getStatusClass = () => { + if (!provider.enabled) return ''; + if (provider.result.state === 'success') return 'success'; + if (provider.result.state === 'error') return 'error'; + return ''; + }; + + const getPercentageClass = () => { + if (!usage) return ''; + if (usage.percentage >= 90) return 'critical'; + if (usage.percentage >= 70) return 'warning'; + return ''; }; const getBarClass = () => { @@ -61,18 +87,25 @@ function ProviderCard({ provider, onToggle }: { provider: Provider; onToggle: Pr
{provider.name}
-
{getStatusText()}
+
+ {getStatusText()} +
- {provider.enabled && usage && ( + {provider.enabled && usage && usage.limit > 0 && (
-
+
+ {usage.percentage}% +
+
-
{usage.percentage}%
+
+ {usage.used.toLocaleString()} / {usage.limit.toLocaleString()} +
)} diff --git a/codexbar-electron/src/renderer/styles.css b/codexbar-electron/src/renderer/styles.css index f00b6f43..a3327e55 100644 --- a/codexbar-electron/src/renderer/styles.css +++ b/codexbar-electron/src/renderer/styles.css @@ -1,15 +1,40 @@ :root { - --bg-primary: #1a1a2e; - --bg-secondary: #16213e; - --bg-tertiary: #0f3460; - --text-primary: #eaeaea; - --text-secondary: #a0a0a0; - --accent: #e94560; - --accent-hover: #ff6b6b; - --success: #4ade80; - --warning: #fbbf24; - --error: #f87171; - --border: #2a2a4a; + --bg-primary: #0a0a0b; + --bg-secondary: #111113; + --bg-tertiary: #18181b; + --bg-hover: #1f1f23; + --bg-active: #27272a; + + --text-primary: #fafafa; + --text-secondary: #a1a1aa; + --text-muted: #71717a; + + --accent: #3b82f6; + --accent-hover: #60a5fa; + --accent-subtle: rgba(59, 130, 246, 0.1); + + --success: #22c55e; + --success-subtle: rgba(34, 197, 94, 0.1); + --warning: #eab308; + --warning-subtle: rgba(234, 179, 8, 0.1); + --error: #ef4444; + --error-subtle: rgba(239, 68, 68, 0.1); + + --border: rgba(255, 255, 255, 0.06); + --border-subtle: rgba(255, 255, 255, 0.03); + + --radius-sm: 6px; + --radius-md: 10px; + --radius-lg: 14px; + --radius-xl: 20px; + + --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4); + --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.5); + --shadow-lg: 0 8px 30px rgba(0, 0, 0, 0.6); + + --transition-fast: 0.15s ease; + --transition-base: 0.2s ease; + --transition-slow: 0.3s ease; } * { @@ -18,161 +43,271 @@ box-sizing: border-box; } +html, body { + height: 100%; +} + body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; + font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', Roboto, sans-serif; background: var(--bg-primary); color: var(--text-primary); - font-size: 14px; + font-size: 13px; line-height: 1.5; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Scrollbar */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: var(--bg-active); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--text-muted); } +/* App Layout */ .app { - min-height: 100vh; + height: 100vh; display: flex; flex-direction: column; + background: var(--bg-primary); } +/* Header */ .app-header { display: flex; justify-content: space-between; align-items: center; - padding: 16px 20px; - background: var(--bg-secondary); + padding: 20px 24px; + background: linear-gradient(to bottom, var(--bg-secondary), var(--bg-primary)); border-bottom: 1px solid var(--border); + -webkit-app-region: drag; } .app-header h1 { - font-size: 18px; + font-size: 15px; font-weight: 600; + letter-spacing: -0.01em; + color: var(--text-primary); } .refresh-btn { + -webkit-app-region: no-drag; + display: flex; + align-items: center; + gap: 6px; background: var(--bg-tertiary); - color: var(--text-primary); + color: var(--text-secondary); border: 1px solid var(--border); - padding: 6px 12px; - border-radius: 6px; + padding: 8px 14px; + border-radius: var(--radius-md); cursor: pointer; - font-size: 13px; - transition: all 0.2s; + font-size: 12px; + font-weight: 500; + transition: all var(--transition-fast); } .refresh-btn:hover { - background: var(--accent); - border-color: var(--accent); + background: var(--bg-hover); + color: var(--text-primary); + border-color: var(--border); +} + +.refresh-btn:active { + transform: scale(0.98); +} + +.refresh-btn svg { + width: 14px; + height: 14px; } +/* Navigation Tabs */ .tabs { display: flex; - gap: 0; - background: var(--bg-secondary); - border-bottom: 1px solid var(--border); - padding: 0 20px; + gap: 4px; + padding: 12px 24px; + background: var(--bg-primary); + border-bottom: 1px solid var(--border-subtle); } .tabs button { + position: relative; background: transparent; - color: var(--text-secondary); + color: var(--text-muted); border: none; - padding: 12px 20px; + padding: 10px 16px; cursor: pointer; - font-size: 14px; - border-bottom: 2px solid transparent; - transition: all 0.2s; + font-size: 13px; + font-weight: 500; + border-radius: var(--radius-md); + transition: all var(--transition-fast); } .tabs button:hover { - color: var(--text-primary); + color: var(--text-secondary); + background: var(--bg-tertiary); } .tabs button.active { - color: var(--accent); - border-bottom-color: var(--accent); + color: var(--text-primary); + background: var(--bg-tertiary); +} + +.tabs button.active::after { + content: ''; + position: absolute; + bottom: -13px; + left: 50%; + transform: translateX(-50%); + width: 20px; + height: 2px; + background: var(--accent); + border-radius: 1px; } +/* Main Content */ .content { flex: 1; - padding: 20px; + padding: 24px; overflow-y: auto; + background: var(--bg-primary); } /* Provider List */ .provider-list { display: flex; flex-direction: column; - gap: 12px; + gap: 8px; } .provider-card { - background: var(--bg-secondary); - border: 1px solid var(--border); - border-radius: 8px; - padding: 16px; display: flex; align-items: center; gap: 16px; + padding: 16px 18px; + background: var(--bg-secondary); + border: 1px solid var(--border); + border-radius: var(--radius-lg); + transition: all var(--transition-fast); +} + +.provider-card:hover { + background: var(--bg-tertiary); + border-color: rgba(255, 255, 255, 0.08); } .provider-card.disabled { - opacity: 0.5; + opacity: 0.4; } .provider-icon { - font-size: 24px; width: 40px; - text-align: center; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + background: var(--bg-tertiary); + border-radius: var(--radius-md); + flex-shrink: 0; } .provider-info { flex: 1; + min-width: 0; } .provider-name { + font-size: 14px; font-weight: 600; - margin-bottom: 4px; + color: var(--text-primary); + margin-bottom: 2px; } .provider-status { font-size: 12px; - color: var(--text-secondary); + color: var(--text-muted); +} + +.provider-status.success { + color: var(--success); } +.provider-status.error { + color: var(--error); +} + +/* Usage Display */ .provider-usage { - text-align: right; + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 6px; } -.usage-bar { - width: 120px; - height: 6px; - background: var(--bg-tertiary); - border-radius: 3px; +.usage-percentage { + font-size: 20px; + font-weight: 700; + font-variant-numeric: tabular-nums; + color: var(--text-primary); + line-height: 1; +} + +.usage-percentage.warning { + color: var(--warning); +} + +.usage-percentage.critical { + color: var(--error); +} + +.usage-bar-container { + width: 100px; + height: 4px; + background: var(--bg-active); + border-radius: 2px; overflow: hidden; - margin-bottom: 4px; } .usage-bar-fill { height: 100%; - background: var(--success); - transition: width 0.3s; + background: linear-gradient(90deg, var(--accent), var(--accent-hover)); + border-radius: 2px; + transition: width var(--transition-slow); } .usage-bar-fill.warning { - background: var(--warning); + background: linear-gradient(90deg, var(--warning), #fbbf24); } .usage-bar-fill.critical { - background: var(--error); + background: linear-gradient(90deg, var(--error), #f87171); } -.usage-text { +.usage-details { font-size: 11px; - color: var(--text-secondary); + color: var(--text-muted); + font-variant-numeric: tabular-nums; } +/* Toggle Switch */ .provider-toggle { position: relative; width: 44px; - height: 24px; + height: 26px; + flex-shrink: 0; } .provider-toggle input { @@ -188,21 +323,22 @@ body { left: 0; right: 0; bottom: 0; - background: var(--bg-tertiary); - border-radius: 24px; - transition: 0.3s; + background: var(--bg-active); + border-radius: 13px; + transition: all var(--transition-fast); } .toggle-slider:before { position: absolute; content: ""; - height: 18px; - width: 18px; + height: 20px; + width: 20px; left: 3px; bottom: 3px; - background: white; + background: var(--text-secondary); border-radius: 50%; - transition: 0.3s; + transition: all var(--transition-fast); + box-shadow: var(--shadow-sm); } .provider-toggle input:checked + .toggle-slider { @@ -210,42 +346,67 @@ body { } .provider-toggle input:checked + .toggle-slider:before { - transform: translateX(20px); + transform: translateX(18px); + background: white; +} + +.provider-toggle:hover .toggle-slider { + background: var(--bg-hover); } -/* General Settings */ +.provider-toggle input:checked + .toggle-slider:hover { + background: var(--accent-hover); +} + +/* Settings Sections */ .settings-section { - margin-bottom: 24px; + margin-bottom: 32px; +} + +.settings-section:last-child { + margin-bottom: 0; } .settings-section h3 { - font-size: 14px; + font-size: 11px; font-weight: 600; - margin-bottom: 12px; - color: var(--text-secondary); text-transform: uppercase; - letter-spacing: 0.5px; + letter-spacing: 0.05em; + color: var(--text-muted); + margin-bottom: 12px; + padding-left: 2px; } .setting-row { display: flex; justify-content: space-between; align-items: center; - padding: 12px 16px; + padding: 14px 16px; background: var(--bg-secondary); border: 1px solid var(--border); - border-radius: 8px; + border-radius: var(--radius-lg); margin-bottom: 8px; + transition: all var(--transition-fast); +} + +.setting-row:hover { + background: var(--bg-tertiary); +} + +.setting-row:last-child { + margin-bottom: 0; } .setting-label { + font-size: 14px; font-weight: 500; + color: var(--text-primary); } .setting-description { font-size: 12px; - color: var(--text-secondary); - margin-top: 4px; + color: var(--text-muted); + margin-top: 2px; } .setting-input { @@ -253,53 +414,191 @@ body { border: 1px solid var(--border); color: var(--text-primary); padding: 8px 12px; - border-radius: 6px; - font-size: 14px; + border-radius: var(--radius-md); + font-size: 13px; + font-family: inherit; + min-width: 140px; + transition: all var(--transition-fast); +} + +.setting-input:hover { + border-color: rgba(255, 255, 255, 0.1); } .setting-input:focus { outline: none; border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-subtle); } select.setting-input { cursor: pointer; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2371717a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 10px center; + padding-right: 32px; } -/* About */ +/* About Page */ .about { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; text-align: center; - padding: 40px 20px; + padding: 48px 24px; + min-height: 300px; +} + +.about-logo { + width: 64px; + height: 64px; + background: linear-gradient(135deg, var(--accent), #8b5cf6); + border-radius: var(--radius-xl); + display: flex; + align-items: center; + justify-content: center; + font-size: 28px; + margin-bottom: 20px; + box-shadow: var(--shadow-lg); } .about h2 { - font-size: 24px; - margin-bottom: 8px; + font-size: 22px; + font-weight: 700; + margin-bottom: 6px; + letter-spacing: -0.02em; } -.about p { - margin-bottom: 16px; +.about-tagline { color: var(--text-secondary); + font-size: 14px; + margin-bottom: 24px; } .about .version { - font-family: monospace; + display: inline-flex; + align-items: center; + gap: 6px; + font-family: 'SF Mono', 'Fira Code', monospace; + font-size: 12px; background: var(--bg-secondary); - display: inline-block; - padding: 4px 12px; - border-radius: 4px; + border: 1px solid var(--border); + padding: 6px 12px; + border-radius: var(--radius-md); + color: var(--text-secondary); + margin-bottom: 24px; } -.about a { - color: var(--accent); +.about-links { + display: flex; + gap: 12px; +} + +.about-link { + display: flex; + align-items: center; + gap: 6px; + color: var(--text-secondary); text-decoration: none; + font-size: 13px; + padding: 8px 16px; + background: var(--bg-secondary); + border: 1px solid var(--border); + border-radius: var(--radius-md); + transition: all var(--transition-fast); } -.about a:hover { - text-decoration: underline; +.about-link:hover { + color: var(--text-primary); + background: var(--bg-tertiary); + border-color: rgba(255, 255, 255, 0.1); } .about .copyright { - font-size: 12px; + font-size: 11px; + color: var(--text-muted); margin-top: 32px; } + +/* Empty State */ +.empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 48px 24px; + text-align: center; + color: var(--text-muted); +} + +.empty-state-icon { + font-size: 32px; + margin-bottom: 12px; + opacity: 0.5; +} + +.empty-state-text { + font-size: 14px; +} + +/* Status Indicator */ +.status-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--text-muted); +} + +.status-dot.success { + background: var(--success); + box-shadow: 0 0 8px var(--success); +} + +.status-dot.loading { + background: var(--warning); + animation: pulse 1.5s infinite; +} + +.status-dot.error { + background: var(--error); +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +/* Animations */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.provider-card { + animation: fadeIn 0.3s ease backwards; +} + +.provider-card:nth-child(1) { animation-delay: 0.02s; } +.provider-card:nth-child(2) { animation-delay: 0.04s; } +.provider-card:nth-child(3) { animation-delay: 0.06s; } +.provider-card:nth-child(4) { animation-delay: 0.08s; } +.provider-card:nth-child(5) { animation-delay: 0.10s; } +.provider-card:nth-child(6) { animation-delay: 0.12s; } +.provider-card:nth-child(7) { animation-delay: 0.14s; } +.provider-card:nth-child(8) { animation-delay: 0.16s; } +.provider-card:nth-child(9) { animation-delay: 0.18s; } +.provider-card:nth-child(10) { animation-delay: 0.20s; } +.provider-card:nth-child(11) { animation-delay: 0.22s; } +.provider-card:nth-child(12) { animation-delay: 0.24s; } From fffdd9d32acce73c8556322ded3a32ef9c2c4d51 Mon Sep 17 00:00:00 2001 From: bhadraagada Date: Fri, 9 Jan 2026 13:13:47 +0530 Subject: [PATCH 4/5] UI Overhaul: Vercel-style dark theme, frameless window, and Copilot detection fix --- codexbar-electron/assets/icon.png | Bin 0 -> 230024 bytes codexbar-electron/src/main/index.ts | 56 +- .../main/providers/copilot/CopilotProvider.ts | 25 +- codexbar-electron/src/renderer/App.tsx | 261 +++---- .../src/renderer/components/ProviderList.tsx | 83 ++- codexbar-electron/src/renderer/styles.css | 674 +++++++----------- 6 files changed, 507 insertions(+), 592 deletions(-) create mode 100644 codexbar-electron/assets/icon.png diff --git a/codexbar-electron/assets/icon.png b/codexbar-electron/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd6ce5ad7e43cdc556261e0f1bca11f0789f364 GIT binary patch literal 230024 zcmV)BK*PU@P)Vv>bBSGux-J5idQ z2#N@exUp(f3Q^Fu8=)FanApdij zp8-8{2`&M^K6fEL_3BA@;501lm1U}5Tv_H@bm zaBUB+FR%mLG3*$2cg?!4hqMl3?GUzR&$~3N(poARFj9QuYE%gA&vN?zt`vnqU&x$+Ma%iDn~&f&GFR zBl;%52A3#-Z3NgF8Z zhbb#(D}jXDLSd{zQ{}u2i=do4qXq`r1oOxdz{U+)14?)?$drT%SbF>zm5_um>Ulyx za{!5AVM|bmlBg21VQO&CWbWS<+rW%DE^~4lj?Hky;%$>TG{d&U+!}{xalG)o+tP_G zU)#uEd18C=_Jn{Ra+jiW6rW-`1$^%moB{)z1IYOQhzLLX(*$QHH4l&?GYzfRI4xhuAPp;BH2J(h>v9T^`*8SDM`<@CyIC1Wbae z85U@PCXhhQAYmC>Fzj`O=!Xk5XUPJK_;>e@X$U9Zu5UyKA_y+ z#zVi2c-?~m$XGT=4AAvhvS~n-poIvffrls+#-)HNU6lV)hYl(lp*tH#3<3sl3I-@M z7@k1|X4o>e0>TDH?HeFtM461oyuc>4ktxRHuqUjMm$5_{8m8#$K=>Xs;u{3y9Bh!f z!Ct!}_tF>{Jd&{(y6VMg5;Bx~Jir1J27{$AyFo4_aPF|1Q3*z>L!~vEL?I-DgbCq+ zh7i*rI9B*>gAlnSrM`FMB|!FArFGv+h#9T#X*P?B#n5`(n+BSM7qi#QMulv^%!sM? zffHNe@rU4u;6%aCUtWH_r|I>F52JSI%@v-ncwi8FFeU~?qN27fLB?G zE;64vjo*I}oxe!q95w(PfYn64jLl!G7y^-bC}%Bfy5dngfo4G{RN?gzRy*lU^TyR;4N7Zci~$fV0ME;BAZtpbS7= zciQ+~fm0Wy22S%0;H7CsFU^nPW8LJG1QL4yJyK960I~wsn29ulDvK+k(Ixst8udba ztjU1`kXeWk;>)NPJ=+qvx}D~smb&8j(mF8{z;*IUs)Z@Gs_YMIO)Ue+0c#q`SCCC4PKEp?{^;0*XeZXxdiC8jhbWW?Dadyd z!oIc(NFnzk_3@evuG2AznHBLPx*{KfB}AO$ZYS@lU}-ECo()vPu5q5VKrIb+3^(@R z(7mv|1xE!ZkAbhjZ?E&KkG~y#?ta=2{>hg=aE$BUdM^e19U{8G#2E~57694-JiSo@ z@Z13bxJ#LTdK>}!5c%a(eE#b%bK=D-Jn__HeCgSj;MNS=GqeHwdny&pz`x8709G zg9%AP03{&QfnaGtv8X^OR0PCYs@S3}NKpbiP!$kR0coIxQniF6WfB(iZ~zH&7{d@k z0+~*7a*{Jodw=hJwUqZ>zxDjqO9zTFooB7H&bPns8Sde_uj_x!i?JWUBi0edGXibt zUCfESLZAW25NaJ;9e7_QwM^2`8}AKkkN~hoFJHXePJzClH!Kgm)}cg?N5PeeKt^D* zKWO>_0DvIY*XOZVgNCkfkA(Ri4$0W|=Wpxe5CPmuy4kOqEO0Y#u4eAo+m@T4f^Y{o zk0J(WaFWsjwgvDzo(tS))s+RxMt5pd#+rZ6^X~MO9(iCUhncfWH>4gq?!^Q5Cr>;} zKJY2YPuxELmwV6qr(W_OZWo@B{7902Ye4X2&(BD5^-*#4{}uo|>H^TkS^W85*YaPP zPC%CrT+Wl<^QUwDhhCS@{a@djKm3QU&3nH2LUQ}P$@xRcOed1#E| zI3-xR`uNUT)(_$gsPyHXBme(bD z)h@U&$@8C`dg=4ik6H&#Ucc^Bc@zMgxGoq)e(F>6F@NWEdFs>8=O?~$jwkeavRzCb zd@zS=N9HwKYU`XGj)J|z;T+Q7dTG<)?`R}YY7HI6?0kzvd2`^_K}XAstONxg@u8dv znp74DfRShHwG3Mt@TK$LmLN;Od8VliOWQW_Fd(s)=` z`MWzs5TFC{VBC5~+jLrsdonh;dNTyT(2&vMI?RVPw)+4fms7%e02G2H2U_-;uup(S zxraKkl4NJWVovhAFDXmV9P6>1(mg9R67J_a#BJdAm}{&ftY>%ncw>PaC1hoZDgjLc zh(IqBI?E`|NqMhj#jwji&3;cnP_`t~`!&NnI{@se^kgi_9=KKak!CA}1yAD@h*Inc zmn@9EQ)YZWyrUt6LnT|1vq~-`naTNi(hpuquAb$>wj~eGlA8Pi4G+P8La`E8 zhlw?@2mxf^8;1!nXUPc!Lzs6*nqv$|@E%}VM%WNAzXuVsF;VvM#b(k4W5-;rMX3(A zAmA8FG-iIm8nIve`#A3*V21UExe0i1$z4#B*a%+8dU07uF{Y{g^Hn?x-At=*VVt<8 zvLUw|afv`S_>!ebXy_#UmXI#scxM_%2&YpMK^lZpMk}5q7RHRNZIKaO68tF(hlMC} zh1NO}!aBna0A%k8O11lBW@+_+V+(P9W}NI5V9jwE;TseBlH12ji%-Mv;D@u4(fmHa zMR%6;HZnWOl}^3=;pFVrjO(vSUiYT_@<%*v9{%HN^Ak5dVSK@#OYTVW#=4x57p9-z z8P8AhXb@qtOgXmIkaYm?L)(JqxSC^OUvN}AbUk(S4le@@}G`<)P08h zj_D+I6lStm@J%s0)}xGILL5M$$td7RW_g~I$-3~RWAa5S56pJmG!5Jc!on>efM$(| zYyjpkM-snR!hO_!O$>_ozk=A%u+eyfuQ>>42hOd1V?TxjtjES2xKI9mz6DyUiNIuh zm4=p>Z|VFL`?LW-ct$8{6z;SU=2f#(Db60XB%piIW;0Q{3wUoccP{pEI4%Ydjn;A!#uxwZy#>Hz8?R|`|ELE_m+CM*IvyheD7Q5 zhyDDOx+Tf?CcxxB^Y~o&fTSM<0Dr))mwxToUiPx81mDnq^xx!9J?jJV4X=3T{QWyd z{^Bd|&n2GH|F4d)0+7FSJGkGM}Dk zAl%bD%Q~Tj0t7qNOwJmVHRv+w$W37YXAl(L15*d&36vs;iueP-lPx{g%=rXsl1hwV zO>509=^#{F_jyjmSR(*YAvh3FR%@LQz$0ks4Zx-56o(SP+-V5HF$)M;6@xPEG7iz} z5_|@ub7{rA^Y{;FHwEAoaP`?<@MpIC{Gva=k9ZfC_6cBzRmJEpLGbUNgZDtAfZ=ei zVm{EvG}g*_*VwAIv(CIZ>04{|?f2Gv<->LBFP`UlZ@rk0|JXmDkA3b_^2*Qnqj^k{ zHzmm*zMS#FZ_P;3j{<<-$5(G#J*n!#u`o}+=!5f)uS!1eYi`J2|JBateeWH4ha0ZX z%{kBcEoU=lRomfe*ZHj4Dg~nMW0ZI$_&3vWJ}zcmis7NDWN;Wx0flzznV5rxc4k1^ zL+NImA)Xx)IMTv7efHZ`Y%ZU}{$b%12??aMe8jR2jMxdTC~B>PKmqgey(O(@ZITdE zt#xD~FgOcw?NQb%yReQl@f8RIzR}VA5l-pWoB%Zl6PPEOn_V>sP+0;*Q?U?p&c03c z)|87i;1xV1pruR$ED^XW_&e*&@1@C4gcktMmV*(10B178bWoLeJw;>1I^buQFmu4^ z5O^HSk>`v3?#Oy#^SE6TrT7ZI%{=)g{7XPMj%R_6NF9a`rZ&I}mq32=!?1tj#2Qri z=4f6xk41@^+68rfn3asW{zArMDsw!NL!IT;AGkYz=uKz&_#e7+{+BmhTTgnoi}}eU z_a^Bdyp#)n@9F7B0l@D!jsNUyd)a3#Qp)_B&&Yee=9c{ZfBdGr=HW=utRpEFnrrBcFvI<4(-y!;Zu-+;8p-Y0O zAWX6=l*4aVRf#5>-=}1$8O#^pYw*XqF;|4xNgw&J>q+$7j1d88%f+fm&;pJ8d;Ln^ zvAaOg{DZg<#l2v?fnKvBFzGpcTeO+GSOS0~#%~0Ue?Txl~+% zaS2>iwKa-uvIYJ|B12)%nb?dP@CJlKYbM zkH0n-Uht0TM*+a^!Rs?$e(~%`HuKZoxt{yx$LEt@@an@?ee>Ppxxf5Swi`N!8!x0P z*$#({E$dL>Ya)^s=58(5rdZ3FvM*VAz6EnW?cERNolDC`g|kXmvz7>d2~6l|fl*#K0r=$P5603%GOu#lB(ME0 z@e6|c*54Iitbp9DS4uJ;@6z)qFN_x#21T);R|LE>Dr6<=E`UHeqlj;gA#fzOmd`Pj+ZS7ofj ztB!BhViv=eub${-BhtOEciK$L;YRauB($QTtu?H=;;}YBSyK)kseLeFN9Ci5IE@Se zPM&pI41g1^Ob2U~4s?`uQ0pDk);EJE_|l3d>$b*%WyEQDGPW=&r9Kj^4bx>!cK>gJ z@~F5d&1=fP2|ZcclOaXLY^ZQY&jA-o3ScMxUaT2222$ooQB)4MD*DOw;}XMsTlE?M zu+XA};Apvjpj&DDDrpVCVQvPNK98$0(69xCe*mmmM>oX^ZV%2B-$E$ER}`QszN2}n zR)fs*3MgpYf9wnV$v|(cwU*^8q%3m{eh*&&WJ6#oP6lt=0sMv!kgW*)1>VJGq7ZR! zL1&@+CKi%Zt-00Vka5#l`kKz+?gw+}Rh9Ss#@FVfuRY7V{m)Ozzg-rAFZ!-*N%~O$ z@VoHpOP4Cp(|pDg^Phd{Yx70l^ho~v&%LcLUg|pBc$QIz8i!eR7!?RZK6uxDhsXjW zb-7xjb`>d*VP#iB?;D4}w5*m} zU~u0MsB*biNBkQgA!MBMFW`bkB9O-ZYzQc?1seSf-&O8(50#T;j663SQEtuJ862lI zJ-b?p*Fmc)XcII|G%7J|nab%*rvTJRfg+!^2At+&!G zBiBw0Dgkr=QT}ENTqe)j9bn5UK%6lgAmnuKvydF?(=dgwp9ZHZaF8J0vrcBEx-)LP zkX(CZ9_~8SH9vhd@A}<$=f8f|AIZ%h_2esWOY)|_^_)?k{P{UcG9Lv1zgvR*uDy0k zGM|u~o#o*_^KJK>eZ_a&l}~xyAy3J}^ZYRvN6lnRB2-f+%uyLIg|enHlLF~ef7_AM z-teY24DD z-C!q*;xGHSW&V^@;XjFyx!}{&E=X)}gr82-+apC2M)Sr>A3N zmd|R#?(TuH-SfmipsnF=S_42w-diT=+BP7T8=#(XJ`J zIi-p39-Ias_Paw%fMa~CeZXx~t+_Kc&XNQZre>MERdo-ylR#wLu2_O}jZ?@o#TQ&mic#(vpNFH-^{9XDPBYI%v_^HMZiR3^;vKF$z{XoT@2T&AJ?v zNI;+VeBHMS1-0X65bOljQc<$X;JdP!e=i`W!cJpVCKUJ~J^NJekEXanGH$t;Tzq7n zzw(~C?pLnn{hd0tGhs`k=BGjfl6YfG&vCD2bGL}@i*)qCovI>D zPbau!x>%LdWR_OxR^D%L>4q@YlzK1hphfK;F$D%(_^mSlCJ~SzenU-)3bQ@0c2S_c zz!)xB3)46}sj-z3#L{zxp0DTCYqX4fA(Qs7Qs@J`&C-a%g z`}a9=T3vSrL65j#*7LFw*_+qmXMNm2WfZWU&Z}2UirrDfPw1TY?)PdWg+Qga z6389bsZ75=$>yr3scd5b4%|+(2$6cB^ zTsq5kNRP%($YkY1;~?1-ZEZy*FF9@yO$x!I#wYGLma#w3_>&Q6W(4JE>*;>*{JkbW zZ!%ksNE?>`Mk(A~r)!2w8w8E7_X+&)F)s4cGft(bp}EPGpujY=Q#5d!9M^rrq2mM! z^7DEIpW#pnU|_UMTVZcuPB6(r@P&Ow2(ui}-Z)kL&-+p-?TwPK739i0$OSJhIUsO_?^{d5(?b_GUE%XIN8)-4Dnr>izMrQFp~nFMV&pUvu( zbYms+*zLv`qX3GEl%G+|PXkt?f?^#c9@Yi;3*e55RW+1qNRuxD?;y^w^xR)@l}o_) zlJF&WMwi{12;?c=yOqGPdxdmx^QifiEM5e`ZURn=mZ2q;s;(HYo~Pi zjZ;zSN_BHl99$&`_dXI&m4tOum?y`7Biy*Wwyp%p8lJA=H|=8JJ!Wt)<`6Ka=b$Hs z&YB2VAqe@INx0_1%1&VI80YfkDt)!Yyj8+_h$f&V*2w^~Z1Ea)`w_r7hKp)J<8G$J z3k1>?7;GyH!*k4rtSJigP3`Hn6*!t^yi-<)QI*Dm#LwNSQMPz2>j`0)gp4HpC;<5FHu-=1O+I0IL`X&|E1hSi(-FgNh#h9Sh|8`o`ItKhL!t6A^HCSPO}@20 z(eVy#hW~~%Q-Fu76ebM{C#8qR8qAA%+PBI(nFqq&0a4tCf8XX%1zXCmiSIa#b{3@# z!H{i=Wqzwo>?kytg7HkU#D#H2_O#UUqru;1mJfRf^#w8N`}^1b@fLGtP1aR z4R)4TAcyk8v?s2SbZ}V=(z;-*{Lii?v@%zK6CeN#R!UVJ(QKg`&W1GgGO(11-zIk# zh!X8p?E}IX3m^lN@RBO5QS7QKKyD5R`$!`js%fH?Vm^k(N1Z4t1t1l`0YHVZ@%|!K z#K5g^&Cq0j&HZZvAPxk13uxg#SGrxrpe#xoJ?Uo$`O6}+cQuZb z*OK*tE&*MX@PR7!k@aD3 zS|ze81fsUju&s*9I5H5nyVhWs4awD1UB9Kz9!kIRO8)4#Kb*hzA5}WZ5B;(C&bZ;R zsU-a<0QfCleakKD?DyXshrju`cb$F1ZFkf&Ebr+)jBw`*D(M>%hUy@6)Q{} z#?^x{Q63i`w*wWkNmwfzg1wQJ0#Zk#mPN$HS=zA|HtTWm3%5;f_C>}3yL=d*_G+90 zZ7Nd2y(M0xhsU0-xL4q_(O9t}*bEP`LvxD>ljGh=`T#Id#J)NZik{}a&V0mB;|?|k zEF0;QampJO530OPtQ~2~O{lCh1FG zn31F(1pxnF{r$JzdY0sHOY+WN_S*c7|LKk6pZ)NgbLDZDl61DrLUXOyr^zM%=};ky zc2E?I76uQ2JMG2@7{+3zQ#MO-(D;T;rt&pvKJC91gx!t;wrSrQaAT)$ne)+HIFY4x zstCDGSAoJyT%}cG0N~_6MUX^mjxb-BFExT^4REzEE(MWU3&?PXLjcXt-%C~vAq{16 zFb-u@U_lZ{C};<*Qft$;=0IDlnXMw#=@h1Nn|GI%3cyo9s2TyqrIHKHub|O5y5IFO zT;OMVkIR}GZn?>OBe0SMY+2XDd!RDOE{D63QK5xrf7VAk791+M9rr45rAJvYQWzT4 z$dGTkF_ouoPB6(0dJGEGY?YXKu*d5p|fGZpEvN4d@DRMerny@o?CK zQ8U`AF#f4xOso$%@2(DK+G@GHMg=-TMhyuQ-Ya}9;j1c(FlRJkTMImIwBSLcx?)ne zWF_NKyFlnqKf2RG>Fu>jmhYRt4b>x1fGKn09OyF?J32J65Hq~bEtUbOfHDF5ZSanW zw>0ajmeU4YJAlTx-L|;Z2AKFIXjH(Xnz?u^X#o>uRES?`lbovUs;qmfNoBuIQQU`~ z719uZC;N+vnzQPfk#Tb!4&QmtcVF)rPqb2}-XY=@RQ((jv+xN3@y3vNA$| z(1wuZVy`nX@zKF;R5CFEk_&8W%s!RO(ZL*c#Ys3iy)`G(Uo&hkiroU%Vq3v(c6+c- z4zSbvWreXtr+E}}e0T@irT1Q$1LFvMl_Dsumc3v53rIA>Wqpo;odgA|YUx@Z-0{}Zl!X>70 zdp0yOg2r=5p-@PPsaP<(ZU{H>u&r0@pFkzFU|@(bg=Za8B}J~f0PVI!F+|rv;wqns zQ&!y0p(D%r*eE0(ojBiYG=im9FjBok#j{*QLckp}5<1Qw-dg0Z1 z*DrlTzVAEk%oA=s%lXAEXT2CcU9`ABulUJfYFyHcooCzBKL=p6QnW-o9B!Gkq`C4= zr?838<-eu+nBU_Z{7%h+8457CFFvN+=+eO`X>u|-)7QKfSkl~zLuYUj0;cRwB)41z zWTu11+-B6;uNZ@XR>@yzv%D=c>>Z52DVlN4zQH4O#4{12pQ0s9tvhfAXyLwfb9=u! z2u9S3?=T##)&*0=8BN zp|#5B zU3un@T*>$R+QWI`W0JWg+dMMGDI($ELl|3p*kIBK9+-ZO+A-L+Hbp)w0XHp#sLo?9 zI>Z?^;&euWx^Kx8Ce2W}$CcU?8E>G$?-+Ajf|YSOZ3iEjg(#QI#wYx+N~IE$MC0zP zy&3ypL-LscWp)=p1L8`<8b`Cv0Hsh?nYr6KLZ>cB^P-;H22MbUR^NlMk3m`hWiol%u3OD zN%|>I8C6N&mU^eBJRI)~hI3o)tI2UFkjKt1c(*BqXcubH*U%XD**Cz zTi{KR>wp;Uv6;6D+KK5*S{#M|18=#%+8UVF3HN}zQ1T9eEx;t;s-4f?Njq}A*l)lq zHR2f{v^|RTOk6n0^%vN8gYsCQv4(0*3&65vE>jALtpnzN;ajB2siBx_JV;0%SO+qF z7!Ul?N{`%S>dU}!6zw^7#evPPPCBi`5&2Bn=2oy{FE>&#b}j1dR zzCADd>#wfA^s8^0S8uwe$Dv1!B(n>&+h#uWS-0tt)3-;%QrzW(lMs<0 zH1Pm{dZ@$beeI;UJ@29^SUg|fE0uW>I?oXf5uEWENV?RW}{9|HY{HBdXz>OH+z=&f*dR&Kgf zp!<1Q8K&X>F5Da5| zQ$bCbpJfUaPy!%Ts&tQf4fK?6aE-||znuc4PH7Q3E;CX`(kC#og26YFK)4LoF{j@E zS_>e+fq%u|Ih^Dz+m}k+f?y4SkrhEdQ;bLfT`mJWSgR1bQt9mb%F`hd+RFkR2CAxi zaT>I$Zo$y8axgqq1$j=i6}4HV>LY$-yO7AsHuC1pwM(*BbooGt2jQC<4nAXwhYr5t zDYqc=*$G<@F9iH$9#l|i><%1N9jgMsISRH)(sDZ}pbsI-+Ng%aE>(Go{#q5W=FT`rC~8wsE2 zz`Hn%b5$k7r1d%#h4hv&j?FY+QshEIXn+jH4k6k6>M^)=F9*TtQ0mR?Vi-uL1~8_If;_aCNT<3C zL@1i#z%Bre{lpN}030+lp0Ui?q^+{8?60+c4!SE`jxY{)LBmdO4Vb^Xg|%H2@@F$V ze!vQ$-<4cr>*5;-{!sZ3b8MCc1)v5Wpc&J4i~?s}RTN82f&d%LbF$umN}2Mj(v**7 zIt3G!D-yR{V<7@muJy-SHxkU-z0iS5a#ul0lu^MR&nWVewK$Q5MLJ?3RG~S? z^E7Ce8gr92sAw_8$1D8T;~aTV~wnkB{{F; z#q1J#LSVjw34(UR(4WWSg z(F#@F4Z-O=aCeqtp3Em|^x_J2_M1Ds%6`XzDSjviyMA*GQAhxj+hFeU>xPTv4r6n6L8$_yn4|pCGsQZVgnMGsr=!Dh@fc{j zCV(r+!8p05K$9cngD`a634+DY4iQY+mx=@Xph3}ZwSK3ZcuK^AbnBSwRfnXuN=E>} z6*$S0OCLf<%_6v00u8gd`%KV#0Y7&i#}oxfGH?9KsxaDVvQG-|AYlT)8S5;Pal(CC z=g|O1|E+piqQqAn`6<^PJZ-n`Tdf5G$PDOr$KQIZ)L|bu*j1t3vDS{U!2hECZT*gQ z6K_=}%&9sbJgMMp042Am*qeBCPvV$nCpVwf_V#<{eCZwYeO~{j@vTYT{PL@m4gP%v z0N(EtUVN71>es$K@BXE4try<=KrTJzQqJaiicM}hn>ngq+7zAQ6j|J=>CI*WEXtdb z3?+?3Wp)!0h@!xp9v3k{ELL(qIOxWCe#0&heV~c>AKWIQR@%GLcihlsV1;l?WaqH+ z4Qm4KxMjKJ!XDP14G0E;eWg)Z3mL^8fT#kHr~=)KmST%VTsJ~ihyv*&psc9^)Bu2_ zIdPv#nM!+injYFU167*oiC{6Me(B$>*2Dshm{gf30>@qFA|g~OrgQ3B<3fAgmrV`< zf3#<9zY|)Wy#nX3?(lr22flFjoOvb$g%y@8mR59ETQH@OQaz z%BXV5(JaYL9-Xa0eC>9&r|P`>`%x~heX|mdM02wqM&dmkl`3W>A>8q|#Gs>eIOpTz z|I>lxZ)oNVG$5GVprq6|iQ+S2l#V_=5^53bz#&Zo23$5d`sEQ37FHQPAkDozwvsm6 zn5et?+bH#)kmjec!H`t^rUo|*7ix+vJhCEbKi2?lzVC7%BHy$o)V4U-WNK>#0D(9N z1>Fr{TwABo3bd6AWk}oQtWnU0ebu4^!dPp@7F-a;qXfrhtr0+b^$nREam4Ng33;+vuux zID*Au7$^&zC{Ucx1zQAQ+`MPq+nK~`0iM=!sm6o%9`I8Egn)BznDg++s2d--l#l$( z_t?HM$sIrWNG>FqzvltK^Dn=0OLG3-zi;0Ci{F^<{<#P8xa&KIL$Vdp5;7;JA4Y)& z#pOzSY7BvCPK|3owLB~Ix1|uC^6`=XY%`mC^NYJJg4))7A_T=aFdl>}zH%r7e=Y?p zIudGJiY9gu7ipx_Jm4T=w??3-jc&_78Rh~g8w4btDB$6i#%h`ZiYM4g>rbo&_q6UE z%86ghXec$xdHqf+MUXI23nw>KMx$JU0F7q-UK_~SuqG&m=Ui`@ca{5vTg08$e4o@M zK(&bV1PBHQI`*McqhOd`_rfQfD%$ z(T1U8HIu4T4!tTZVu6`Ql+>#1825}wah6PPNihA(GN(#>bVe*J9pb0ZD;XOr!(qz$ z!1-rv{&p4aj*(zhYTOG3n$4`!IxF}nv3fY`sbWRPDc&V|F_5jW2FLLSki$N6!TWt) zsnEGqXVw@uR1R;xGOl}D=OaG*nfcBnZ@T3bG!Xhd2>|+yZyYcC`P7&Fr+Ll`UY+lG z@$2&Vo43pw*}9U^l_+H*Vie$Sh}OQsseIn97ix}3J7@hL9B4AGIr znbzw0F0l#F&(OCx%n0KO*HpTs1Ow(V{ak}ox4|-+)I3em zWHrn>xyCU7DaO;4S)C-~=F#)V@2MN^%Y6QS^_2Ry7yf+S`VapcTl#wr0KEOvKJ8+X ztKV`*zW86hJ32*bS80aT?jwKi!(2;}b$Hps%EhqT3krk++H zk2I3Wp>@L|o|C!0Vea;ZIPx0eRlI|1^{?QfQ6~bEIJnFqK@*k>gS=;%!}agjeC%px z((bVU)ZT^Bh3WHj(+~Mt&3$F2=g}B6rCpF`30Yw1Do$0=r9B+wvBDIoO13~Nn_(aR z2%759`01h;ZQK%&j6F_OnJOLZl%^mIEm+IXS9snP-&)Oc$Z2Jp#ME6fw^KB@Q6ZkR zw9hyl%!1Uxg(?-h9wv3vC8TYl=VBYANxGt9?c*^A3lOah?^pxxrE5dcWJdT7OQL`J);7yAp3a*PdHb=#%mIHZ&_gW&x%O-eV`j_lmT z6@b|i=Flo@XPWJl_<=2K&?VnbP?lzQwquIxVN~5X^2o~{sT=QnAdgG(($~CGE+#qr zo&x~S|EdSJBv)^_lK<{2Z_g)QnCXin7rW82-1FH=9n26PSiC1Pxh={@|PJ^3b za@1KzXc_H>3*;vPRGdNE%HfK6F#|B))?q9&UTIcD%hC<2(9{uHg`l!Oc5k95kDdc2 zVJ-$8F^MG{dE;5=*ukjF%snC`2f&yTP z!RJT`zzblzAyxw5>V1|L3Mas?8(OOsUr~hxF2s3^HHJ|!kG2Z{3zS{O3lLO7@uQq2 zXJ-!`&VTr!@h%_!q&$@52fq1c*!J%U0Py4I=NFQk|5s1TM}Ns(dC~26&D?yJv-2)A zO*L_72!Y>KvK5u^IP@H9+&@Z>L8Bw!MkB-3xskgjyKaN5hQyhdUZJK^1s0Zuf`n-$ zem(3L{`C0&G_2px8_!_QC0EHxN934W(;ODZhT*2h|M$P zL<4+?b&xqzf*H_Y_l4UCt12N!Vdd;QJJQ;KD}DjqG*2d`NM)+FK~s$eIH6Yy6xZix zE83}%NPYH=UjZgmyMLVt0JAJ&m^Nn$+F?AI-c!IY8n}CM!0nkI`>McJ0Xui0ECqJq z!$p{?h2%-IyY|nSKx7kOsxDQk^SK_3C(NUE4Rm@vFzn)TQ7tkrgyks;HZ&dqE(e^_ z%l~Ndo(p8LP!;L`5IjrFLstRT6=0oWO*ZzILS8n7BOFf`7IW2B$0nU>umiAhoCS@Z z49Jx#St-u=WP)9_JAWH=MT~?%9M%xPwa?t4LJDoIU_w<$RBFZH(7E|S`c)5Af8*Qo zhdyfL#YrCdvp1%GR|A0VuG?|}!a&r>IX z$XqvWv6aJtTW*((R@kW&xzS-9MCQZHqAGBhXEZ<7Sh5y>pM^63T(J*jCTVVJz$U=} z!zQ)+8aAVh0X7X z-vYJ~#`f0_2l^TCz*~8Brvzl#KIV!Q1`7)SwE=Fu#zKYx^q$lJ;0)5WMUU!3SNQ!Y zl`UCf{tI6k*U#!VSKjIRYw{=l>XY(Kxh?1a;_2z%wE*C$A9wjuk}JRbP(J0QSL(07 z{q8(`?O86yKHHYxT^cZsTNR>k+evq{nw3%bc4QWYP-Lb-K5!w_gdG&ku1aTU1pJOM zj&N8Ja@00()OGQG3%MS<*1SAqAJm$sB<+>}rUVAC&{S&DaS>nZy3MFssGEjNdr&fV zrb9CmfQG)~pgMxf5RA>9(+x4UOY=?y1#|<*z#;(yBn`|_%6@0oyN(0hGbJ2!@G=*oh%#|KTVD6d-3ADjkcTggh zho+=4aWH7{amI{j6hNah=90Fkr355%9?>>=KlC?=V7EZG^~V6M5Ns#YPP++ITmE*0 zA$k4|21avMVjF7%PbF>y>mbdWPP@;-xQEuHiABLh1jBU@GIXoC(_$QA9}Qn+&*g3l zzZe2n0~aZ7lc|()ta&moy9%aDt#c--RQRg&&5mL&jt6P$ad@O2e$5Se#?6l$9!zrE zPd~A61^jLT0H4`Cl3aaCU;Ps=_~rV-JMXSbx18m|?9^Bm7YRrhZ%%ibY6V`2={Ej5 zo{|?CLk=AJ_)_LOJynFd77vZq}woe2k?31!^I2yQi3%&x3saGSezQ8AjJa)U(3)Mx`B>G2PrpfpOCZ6oE9MJ<7fs zsKnhHrAb#@Xa{S-+6$f`Px{mzG&E;WVZbw1Y>ToJD8b7&8Eg^{;@{pMLUO9O4zq!9oic7bo#=yX+Zl@PDcsa?SeGie^>qd-k`RH?clA zh1T;(vw~idsrjP)O2ej(!=NH4TeLJy;-yHB(%J%CP63eO>;P<(vWK<96+n~K2cN&s zp;G9iDJsyp*ElePABmm7Mp8p-y=Nqu4py#IW0wGwIW9;b!9k_Rn~P#}SQP0tD|ZQu zndvyTY=N^PkQqfJ^GGw>s9f#TtrxoQsO_fL-!tDQ$(Q`|r`7K`0C2g#3m^A{oPEYG zUVOnAW1^@%l((2|mWUVm&w{|j%_<*6{R4xVcDS}$~ z(oIbqD2Cg>WupN$iJ49bB&wkfbU^vi26eiUAdFq$#=)cpvtf;vMvB`HK|)|(ah7V2 zIlS>j=S2ia=vbJe#?%bZsb^H43zO+)O#q?*1RpG zlI0#a%)}OtXun6AbVCA|Sa+S<1?Yxcvz&jP?O-~GR(Otp<%0LD@eIuATSRl6%#_Y2 z8XWanlAcHRn5q^I6g>jElwAQ3#(JxYk$m>xR_h{3Cj~$#i|!E*4r##e%)7*gaFtg& zV_ZDX`42tRH~rOTjI(e4g8b0M_h+=fqX6JDKeI=Y^Pf579lqvm^{?N2Pv$k(H+?HL5mcKZFMD_J8!Zt4Il}x!Cnr-hz4@-N zr}8)DymOnR;#&0DM>DQgwXY z@0(q8S!WPmZKtw@_?VCah=8zG?--7Oo3Fx|sKD>iA?=O)GG#GTy12J+??98ThmY{Y z+DdkdgJIb#S7Eh@lrRN^aU&Az1IKNei?RcWKMWBX!}hxb$m`R%}^tsapjTaxq_No%q}Y8l)XNA)2w!HOtTWV(jHkh<)_&CKDi} zDCgpx9;1D9jCVI5xeE|Lt#Ko8Fpv5>j57@f!HPokI(}B3hw+59v=NQE?*bV%-G`T^ z1rlI9(0N#gna&DS?NL|)cA7{*W9nZKw{hi+Brdk}n-~2-q!$c#2<)KMx$QC8A+n|d zp4BS=8mge#>;quKco``3=W1dk2pH{D*l_pfV2nPyxDb|!y#R>3!|8dwN>b3mGitxnW&Hu6Sb7?H8j?cyZG*rnM*$dmixag-QC zhd{m=%$cz{jl~#MfPSZ-s7?SxrXa+1LT$R$ns-R83K#R63QDvF88R_&#VDOffpUrGc@3J$Q#&#IoFIby)WB)mGZE60QVT#r>&t zpo>-pYIq0pq!f5;g+R87Mg(L)q@?zaD$XwfU<45!Y#8CZyF*M$0m!-#rp=M_`Kyg$! z_q(-K96+q=shql9ki}UD7qp%A%}$E)uc0tNyT202crE=)1>$llI@yPZL z@3Ym9|I_!*>t69wY{|b@0MOkd$>EdU<>3!_;m=-t(a+zJvzspE?CN=C8;igs6m1T+ z6Ws2Ax%aQn24Yq#<;Q5SAQh1Hqi}s*h(0Nl)#ElXN zfs{FsT?OvSXJN=q02lmbq@UQ-g=P$A1gx~%4)b%0z&!iv7^h{iF9k}8O!f>>E%HaA zh9yolQtC|%=3w;IJVP)ZLdkO(0#&jqxRDG3jI>QzU9^8P6_T>FeEURvw;Bg^sYbjz zL~>@y&EG=Ps%E$7>bQiF0YwL-PdZtQ-&r#NBXvCx7$O#e8>Hz|4N>(pcxF`7)P?my z_}iu8x&ckf94qMskz0iT1QGuu#R~p*VftjOMVJp)ou@>_4 zxP-B+;RvlN+@1h)D=dKIf&0Rexr3QKare~9P;j&bvtEfZ2@O#giFeVe8h#+<3^0Sj zfi~X-3V~lQ`X^(6o(_OIg3tE>={2j)X4eB<*FCNdf8}pI`E{T3%4gql_@Zb0PFMgg zU*109#$5Q@Kbe31oez$u-E<*y&Wzf2f=>(nlT*D7vMm2gkVai(1hd)_)VGqqCG$78u=2! z2{(2sZlT(=Qbo%gqE}mripcj7BRFGF?k zO7WX=pYkGP0l&6Yivnzb-^#@C#9UW;;9UEumeCHXKS2C(x#g zrY;jE+fr?-N|q}?eqnNVF&NgNu#!=+Q&|bcKv4#u1!z|(w1fH~68wxq$_s$Z7S)}P zeEHld6*TDEACOR?a*;W6YC_P+0Hu<`H|-XOrh;3jw=MnC_vMewTgO+w;z}NQ-#^YV z|91`mo_G0jlFT1_Yyaz?xomb28Aq=q7s+aF>=`#kg68L1O>@@@526n8iMvsWgO}Skd z$>Sa{wGkJDaWuXe5*j?;P|+u%W)*#X^4<2|fv))gOfLd|0*`1l1dfq9g^8Q-iW!d+ ztyd>n;b^Jn?uyr{R4jltu*l%T2tsp2)fSm!wv~6UCMq4#IQ~(_;R<}LAJ1zoCIE%G z*z}6}dxLM!lBBOw`HwT7Rn6~B`$MQf-!UQP>z@C+vS_KWd z(-Mv&kWZOkt+&w@cB3Hyf{Op)Rc&M@`PR(^DPT$kW+=?MhJGNF;-}m3_$0w zssSAH;>Aj{oPf1mN^m(Xa6yAn@mX(z!RP=eWkc~YtOXe{)LPJ)uM*FWkOz+I&!wfAQESrvAMEfakxowTI(CY7wmb__!x{!BhjtfRSnpAoD;Bi-16ls=z0+pezC~Uv0J-u+N&#AD^U9 zg;M)uvg1;aCEx|$90x@AVY=D}KK3BE470pb%QzrzH)<1rvkijgPC%9V7Z+u28G||t zCh~EQ5>t$X(rO3kxz;mFAc_rJ z{F(EbW`0iF4bRzHi(=0_Q8XuJ-wv(3H(8IjHb?@vQtlVtOnRo22vuEmOwt(pW=`FO zBG*d>$YMsyqAy$l0(o6k7p~63uU)Bk_@Z~qk0*K64}KF}On#dI02Ti};$`U{{fGzN z?d#rt>3d#rR}ME`oLhHQ*mP@wMmY$msYSNwPIc1V5GNo)YkX#Sq~mlYgMWuqKbmN; z%P{zTUwgpEkYz$lfx7e-CSv-hnidJXh%rKpt-NLnu4!#tfrjMH%QPWDzMh#$8k3y_ zjmkMQ_Qp?0P}#r=fKWbW5Ul89r5Y`yZ)--kG!_dygT>+<(-x728`l(rhxW7)j%T3P zdd!@Y%xc=Nx<7zu8ezsjTIp4orY+#8px2`^t21ULqDw4WwbPom6$INzr*gUBiS{;C zFi8~(SuQ}1V_U2VyT!LHTT+tDHBp^8ON+LvGnUVJ zRS;C?%xwt`W$p~tpJjxT;$jK&pgsqJcEF|=-&7hV?;o3U`2vu2>Zbzq9OxINShlT% z0p*RcGC=Uv6aSI)a2G+P5=vmU6p8M*WHIN5VGtXWy+v=zJg>lTxdJ7JqKud>yW^mF z{hzEKOPMAhd2xPFa9CGJjuSbFUf$@iYP%&U3W|f$ADvN#k)_w_8LX%aRSgRY9n9Zai z4opK)^CnpGq^-WXtS1(XV9u7-Y0IeFrYe_pmNN*bI(SUWsVb^;B`Vk*R|({jzblgx zpfH0<4FnPU252mOs=_baUFYl!8p?b-y_fhLN{)l=JVjJ2nPeQf6gE>pW`g62o-{RjvD6= z&+~h(9Z$KT9{ItizxC|Zk9=sT4e;9u0J^)9^yR1Koj&cA+rRv^2Qsg_aK4?N7YD~0 zxPw{bH&JR6`IK!9wNB)?%5RB~K?8v~2zjY_NZX&NMnfq3(uzw#bSjT2jo(@%3Q$GiR;NFp^>4`>F7?UJO?yD zHhi4{zK^C%F)sIY5NE0KnE~AU9>9Jj2|`!Mxu7-Hu3@CS51N>)H?BF(7{cFTU+rGI zlbWk%2c}yBS@EN%@$bSv0;3Nupiu}|{OniW>;=F8}-I}GcII2JIVj}f~VEL z8yCQnE?>UzVM)L6mGg_g@!op&rOerLY-4aBZ0@V*cWH#T>R)5NbfFB0R*Bp~OFT4` zeKcGWv}or^ooQ{BdUjX4ou-JRqI}g3e(BR?Y+C_>L)u!xyGbhr5DnIR1$=RsWCdua zSjK{mpMAk#n6E7p6_}HKc5#)za8a;^_zF@bQRfEx?G#Bj;4wo0c^6U4ldZ%ZL7)&; z6=j+L&UWq?5fH+X3SY&aDR4tUmvY5K&WMR(I8wOEfRyG`4ZSnxgo`Fs0|o|-a0Zzh z3r$>1b#kas2HHWK{0;_Q8GsO5wa^krg1co2nF`qkecY=eE@#anL|}L0zi)Sx3*ZO& z=U}%=^;)k^b#}qar8p$!T1V41ykYIvWPV9J7ImPVd+oVrvJEw7B6ofT(g9XRVMQZz zgztCll$C8e_8^D~;nd#Jww*{%!eu3wDj6FH(=LR0Q@R^|$9bvh%sw5DFaWRsLzf6o z!i9^m*>~c{>>3joaBBB#-Zzzv0S*l{QX)k(##xG~Y651vj{lyiYepS@?L1HV#OKsc zCHckI+(<0IZwml;Y4`TAFH2v3cAoV)Z>Z1tg*WHo4HxTd9;(nBPZYixP9rMS4YweI z8B`B6K&07-n_2y3*^W{j=8bk+*Q zUr;375uJzYTw{Jmq^?l)mQWRp3BsrbbHwyrvgkMq&Tf)@YT%jnEr1=q?Nmz@f*N6N zW~7-3R*1m-lz!+r;7hjl?v}wOEjrz8aR8`zSn;5*a%$>sZ+(xlJX~eYYZC+}pp+W; zChx&HU~h^b%psq!T^8j%9&$73Uak}Q)P?!Gpy8B*8Y!wmu-GW9XR(`z(y=upm|1vg z?AziMuCf(!#Y>EG%CUo`i6PiD2C`t39RuPW#cya&gn(nRr$J!{KGn^7cpM3N@Cem? zYzJ;36e~a>H4*ywt!>l}VB^{#eOASY0Pdpi2B@&RYz8HW+Y$Hz^sTtG07#P1dU=%6 zdyz?qsyIt176=u)`o#1?R zyIVzUCtM7Ja-H@kliEk*a&f5e8}ni4hkN6w-oj@_YK#4u`wDq83-ACKh+OvE`7YXa>VF^~DJ-M%$cniU?||t`{lc2&@4KMFC|NVzh->#C4QsZI z2)u;AzybXehhRZ|fAHEo?beI=-cP(PuYDP;=C=v}@cqBA zlKvNY`rrTgyy&$Lrmh>kEhcJ{2ou>MCIvecCOhoYyBewx3w}5J$Dp{%K8owm*8JEM zgfo5IL2~lR811(5#^aQ*WTWRe>w<18(7Qme-xh}56<-Q0kQ~(|b_Cmt!^XQ%Tjmcj$?J=p)&7xl(a%vxY2iQFR z-8J(0&Lq!z=XZzZOI_PkWsb2ch_wh_6i8d3#cMP;`v&_wNA^T!L}z1_Z)L4dmWOre z;NjW(WT zqf`cfx_%BRm!lGbNTHEKC%0ahfj-3armB@NGzyl^Rs>L05AppP1}L#x@8koWQ~zF!^zcE`u4h?UB&DN zV`2Y?=}6TSRb<7fZwnxxk#5J%W}2rnPui{`qja})MQFjBDI|m}9CCThxX(Oe0x)HY zqgGTnsj(K=gqvW607yHl0XiDXs?z^aNHEa0V^XYL$1Hi9F+!#px94O zyf@yn%IKzj?K)#TzSc*9qXeho(h7eVjB7}VXz`)qr2%~K8V7m0Nf?tNo}(9Vfxa`U zj>4Nm%9yzN2z0mN-y=yoGl#hV#8v0G!p~jDN;p2P#bRCeDV=pO zHGgG}$6bDxdd+h#)z3ZsLJ3~z;TiQ5L<232v5J<4AC%%Az&G-v3B5U!}*XH20PN#@fz}6^6!kAri zKIO`9jtb>@_e7gi$SP>kMeX8j46JmUO(SXDUj52 zo)Vg)6j9ILVd}Cj&}$uYXrn%fuy6C*%e*@IeTktmK1H0f z?y}sh^~PU#Le}EuP{Wv+z19`?T`-WKXbZ6}xKOyUt;CiKD4|U@Ac)3Q_NzOEQ-#AC zhY=MO$(l~R9e`10b>RS0O5TS&j4dESj{vb&N=JVUdY0{N%tvU1JH`PJ)k@#o%Ob19ReT0Iu;ah+@sa%G4k<7WeTyMRkTuLc~9N9)we`$VG`!tZ_B-d4P{ zt4`OdSB+#e86vmGd$e1CdRWaba?D~wf)kf?77l(6Q@9N%WH zaX${PrNKRJiZKK>00*{YK|?;P1{jL=nm_3CEE3)b# z(017${AVqBpJZN~?-c(IsnLupwvus{cff0m7}Ud`jzNaAaZ#plS7?ow1qC-Cu2E=b zbZV*-W7PknIwPUj5A;P$N8BWBFZ^x&a5hPHGN7zr&|$HU09>+3J>R4t)$R{9aQ{XX zEnSAVTUM4T))f08V;_z|=^%yJ%Wb3{eCW{kXWaN9Ps`VR$~WY`=l*9$nu-x7-74mMwbF)(AN%MY~EE~~lb3kTj0BY{x zo&&>vn3hn1Y8j9JRt(dKsE0dJAs8BlK(#4^1`+EL&~XY`N0HEqVs)yeO7t2)MIFlG z+T1PX6-=6Z2BxNV%=TOIzF^@Y2$3~)tVHu}Ol6cHU3-uAe+b&mu9v$@2d}Xs+>bEPkfwaIXjd$+x>9bn_P^$%NuT z1M{3fEKOvN!dS1DGStw}>^Q3fAv6hk?S%PCpuz)fIXtc}_o==D7C{0#_ZogFU9bRi z1n+K1yIgV<+$tBraO$aR?9ZeO9D#z&Uy7PR-mvvL_~UUA?16nlH|snxey0?MGY@_4 zEh!3pTYRA|CiCrQ^@Mkxxjo6t|L0d`{FVSfcW;+3r=R}3{I!4hs{GXluV!2v8JVfF zMn3lCd0`mZJqNZWiOp}386IXKXR*wNGQ;)c-?8=`eejfzRngiut+h1vsQE*sW5PnP z;36?fPVa~n?BVf~8py%NmkYrJX3Qybp%>i`;)d}~TNT#bXwww9Aiun)%<_RjIoEX_ zeRs6-Ej-$4AuQAB5sa=Vb_LHMxDfJP$5*Q&QchkcU<2ALTOe(qBG<_YY{5lpTurn9Qt`C$5n zE${Wx56G9i@LhBDx8wr&`Db6gkmT^fSLLH#yXF0Ib)I+ES)Gbp)~-@YmaC&8IwiuD zFAL^{xlcZJ5Mrq_A-d&C_(7O;!Fc+)^>$RBQ ziDGsQ0ikTc;e%5TQ`wGHwyKJ`52cuy3Ar!CuvyswlCqMi*$}b=W;%0>MVS&*2x65c zmTA}lb&V!6<9GwcZ=l_-tf(|Sa-|Ef(3OJu;Z|ueYqao{qWhbdmR5I4{^o%aa5{#^ zz873$8nCYnAK-jdWgfy=E9P0UOOMjGYHz}A$>k_tob>@vlm(-@YaY)XfI4=SRKi-x z0-${Vxj?%B;AEU`W9?X!LvtU3zjsKpSwkx!JQ&ul=VIHqkqbXw20_YUzPxYB%~KUX zm3Y1_s!iMEG(ZXK5LB>A!J}+6@ijv(31*0#G-|S&_Au4KvQlR==XYJ3OCRvqnIzx) z+5faIuww=Qr?vn3h-YWM^a=T+U-hf`+@F2hyy>PbTX&WF;`^!+VXJ#zmCUySZ!}P$ zkxkbwZ&kIijXFW(4RYeYaoWe(nBA$+@8PdC^_&*v5N=p0QYT?bj9ry95A1nd7wPOys#HWh)D7feBy2X0#jGIIRfH zGbOFuGJ8NG98iNq#t@BfV}9(Pe}~qba`udY0eiF7o_j3>ng4NpY_4z+6Zb=s`+5;u zu^$W$5R}nzMocT?$C^GT4;q3oat0@Ue)E1ZCkEi2<#FfDCP-C$r=TmNLN|^&_F-s( z*n+0qaXgP)ld}HUgjIvc{MLP41TcvT|4do$70I8YXn+t07`K*kH81NO8m z#L##Mxb4hQ$TL0%cxQc2y0;Uoq?yQr>qh3CoeMvFN4@fY``G%f5BZ7Y{{aBl^?!ME zQqTGJJpPx@^XV53-Kq5{S2I(mEj8w8^B{LW+NZv-P?Kj1s{xk~TM!}y_DI-OKzG9p zEg%Aw0PT$C5Rg`*@wnxv5H`8@wNK3(`@p|BPB$hh9%bxh?H1X-)mVOQ|(iU z;&03AHagI@1e(Ds00HK2|0JN-+AM1$+Qu<6%B^Nyw%5V{x~3KcfCRzfU_HhX3BW?A zK_{GgQKUJ=?Q5R@?fa18-;#;p1c+UuQb z0&u5zo`OHLT%nER;|!Zt;6bx_ft*#&CRT;1PO0>5rs`~WdMuhE9e2V{TwjK4 z0iC(6vfXv>oX@(Y-uuIzl&?;5$7er7TuA^x*X2qw-`?}ff91h?=B2aBVW!47EjZfU zja03y0*!N71{_3tqH+WZUrVQyE!?6mWf6%k?i!s^qp6MP24v=BW z(hAf|KpM|vuFTs%yD;4`3VA^IoF4XuO~m|!r=^g>WuN0%gjWcGW&UoBG2tC8FbLyt z?|rm^1BY%Fe#)K(9d4)Uh&=rFk-$PgbB#^f4?$~aSXy`WamSSe{h`HF$Y(|X)BUgF z_mc?`S#8QGtV|df?KaBLDgNIOtKo9U%fy<_>~g&X*4rhf*Yf~5mF(@zsy$Phkmi;p z>>kdWLDt$;eo1KBcfalHx)Px{bT?`$t zWJU$E*8L&7$5qBAfzqle(n++p>+!LV>@R}4xfTtST)FBvSIwBQl0vPA)a*zyY@+gdknqs8U zGFTk;hkXQq71{-})?5*)_NzYEtWZNoHe~wn#pE?lkXqMUu%ADYy9b>IQsp|x7jF%N)!LA}l_J{il z`gJywdSnQ6bt|P(aZk7!lqA{s@Yh_6PKABECtV0$6|8A82B6#H{3qZj-HNpF+3WYp?n(ukRi;f90@nR2G~Pv*&NgeeIB&o`3RzS6Q>oPnV9C*g zkP#?@8X52&JrHX-Vsz34j#s4Qp6B{4f*dtyq#~uc$FznX67e zfR%L@@?}vuYFUTPg59Z6;zUD9v4%SyMljXUBJa>I>G7y&<|%}HSvMALEw|$byvm!z_Hz( zG2thJj)v(e`KNvyguj@#J@B%s`=#dJsf$xS(20csn3K(9`+{NVmd#rp%o9pI7aD zmx~3_qD4Z$weN_9kkcHA21l4`{!?1JQ*08_tOkglf*HzYNI4Ko)}RO^83Yx~a+eaM z0vZ^@?WflM>gVCqxfm2Fz0PT3OSlc_s-zJoJUa?t*%h7-ns*$6YE}O zAg0N=&2@NoRxf_LR z*Wip@e9&&{7&FymK;S~ybwfO^f5+}oDvh%4r&`TB+lU$2;tU~H}!D;@=CG?TfG1!d!(QD&wMx`vUmJ&nV4AufV#syXkgNGqU16pd(INpc-#ch=`)-jJ| z997hU83tUHIs(-$xr#P?`vxVQoi&p2QfX3P7de3ima^63IJs(DOyT<%w?p54b=2$b z&Z}SY?)jeg|I(a8DJKBH^K!Yq>f=(ce&hVK&;5n^4{y5AxpGup&p^#+Th41a zKx5gPJmx~e_I33SRf(<@m@1lc~G8HMK=zRzRenB>OKWU4E_eQE!7M^9uAxLt%)G4 zlYs!VsazQcJAi5AOs)5^z*4797tTQzxp9dZ0-zP&)R#2hiRWgW@8yXqljwAhXuWyj1rBlw`&~FiU49bl$^! z121%3Ru!6Php|FqQj`?Mo^o4bfNxmW;yg=xcQ7qL%o#kTIv#=la!I&38)(G50eTFe zW9Q!C5szEIV9|>7O%z8dLN=e4djP0xy=f#~OVz896}{_dMRBV2mW)o$D&v8ND$jgk zp8K?09(+-fyPx%A8eQ@5jk7_7@IdhJVGBTQc$ZUk zK+n{~Db<>Wp%0k6+sZ2SqIMcr8|`;k+#@rfL7n!VG6>;Win7 z8uzuwEG)CS^KJ2w7a0_a(9QBQ6A!TFK)~Sf{|Fs4EGz>8k#309fIHSs`TkBjn;~T~ z<-QjD>^90>04>fVz?k=NjeXD#-=m&LB-ouUTx0_+tI+Xp82PVsa`T1C z&)$`OeCEqP|9vn1()-_*2mny}_gMVr13%+c_0g|?AeU}f${ba>Ks{4Id4(_?`va>U z;3A5-uTVCWvngfvbf4{X2=3$l0ijEC-4i54Rrsu22*SQS1TFVhl9Jh65#nfH%G;F> zoUyax5UPNN(prp|X9axUi$r-pjDq(M2wVO&iZq!C+r&Z?cX7}#12PASfgJtGasLAc z-|ahb3CXs6*V=bgRpdP*2#sw8a*Bzr^=qP{S9M8z-PSa4@2HplGQl37mmgphbVcR4 zaIhxJ%^dczE~5xunhoQKgF1IbiV6^PWOfFvJr(`VoJAKfMR#{>n@Hg!DyG6s0!o|_ z&csP`yQ98i$9%&xTs@&3ST-2n$oeR0To@RT&|B!2Fx}2@JEd@Ka(#fUB$yzJd8g7BGMy$z9<-*9k zdNJF3+;sLIB>B<@AIxbBz<+xA@>!C@cym7VA(Q&CpCT)LVfmCJU;^6Roh~PwepUlqo53~5}8c0!Qz5P2Nh`11p>sOOz zsDw&0T?DkPF$e;B?`xjC&uRs3nu$ivi4;v{XbyrC;|*Uuys$mNrDt>)t%ioB+CjgcbRVnV0iPN~6rYfIA6$ zm1?dXQE2`&QF41)?jd-Otd0@>W-wU@#i3Xlz>4==+N4t=-3Ut>E=-g$&7&C~mygd! zCleLT<#P>AcwVi=VJMU&kIn6l7ud1)VKJ6;-SQr0&6^Pg*BjVbSN69Qg)_ zLH{fnmN@0@N3DAkS(F0UB8J7L6aFqwpzviLb^EuDXw|&IRa@VW>?z)S;$(KLr z^7iBJnLO`X^Cw^XP(I+ME%T6Uf#Euc$kDk}lp1jM(KKn{U3+2A&yFlbYq5r#gi@bX z$#z0~H{u?NnTXU)V6gRe9Rw4>(@IzxjN#}2suv)z{JYHOlv*RTe^JofY0$%B<=TVCu??6W#-W17LIv z#P%t`EnZfAqAtSdmD*W{tB3O^KYl#n-EYiWl6?O=ymQW$absKQe@PC{ds5! zy!^&^sF#lHGXF=PbCebi1X7+(fo9O#GSxW!qcTOVusXO z&yw&^s+XEuVL_8ntPyCA%6#n24s@!B44N_4KUpgP8V=lY3`DWEcI&j9v%}U4F>J+7 zsK<%QnImwBxnXVqdN+1r-G>yo9%{ZNfvI$EQaqcNw^Oa#)m@3HS*eo-Yc&EL9bZIK z9s;`OWGxR#hHIWc9HeBbqvfI-fb1^Fle5>D?3Yj85sge9nj(8Zjg@5T8B+Rep&KJ8 zEvnK;y1e?iguidc%(|}Ry2`x0YrN=}4lhpflb?QXZ2*AZsQq6_^4GrcZMpN|>;A!& zv*ZjKJ8eoGA~u`l-7XSggBim_PpMcAFpEanSBQ=?WR%6vGQWgA&Motnqb`f*m`qWF z8Fc3yUM@xdN;}7g#k^bx0WG0++6`wB($0vAdyKeNJ5lB?IgGg~U1}&IKNFo7Cktu>P*&Odf+<5Pf=A#>v)ns@huv7TF~*uy#bc%ahws;_UN%cgo$}39yF6}% zTl%-EB6XSR#AbWcAkGu%whD+shA?l$9L(46Ds`1~xI(Pqt$7bw#$-(zv9RE8G3aw) zpSZ~k3p~+MZC%^<-sirZpoDHajY${UtW`A+)3we0LubEL)CPfUKG@6goMuf`WJfO1 zk`V2t;Z752Z{9dWlVp!@-ew(v6+9_*To*D8P(+B+VNp<+DvVWSjVYieVuvoa5!{11 z7Hvz48yV3tl=~9KiLhO?KqeUnLT*Ddx!DNuYJFI$qS#9`+xeeRapSwGk+uhzb`-jx{vx_UYEag&4t;0 zqQh0L|}3}Un(iv8*sA+3_F-t`F?daaTBzXPBp~B!B^1Pl<-7T$9x2X zN*hclmB&mafq^;D1Ez!K0fI9kbeTv55?Tt{Y^p-=$-2b2@wc%z4Ws6g$=BHji3?Dy zMky-rf|W!Hg-zmXaG3E*Rs##3;;@f0k2gqUzw9f8RBD&4P*WNOdwMFU6%7IjDc1mu zWHDD5IrZ3U9>4F#S=xiHMQ5buZloyf1UG;#83ZjZ?Utbyj@l};KJg;$3GYAN%X-Ld zRPM1~>%7)!u)s6nUHqb`)E4r+18{F=0hs~2HUv4oH4#3*LY~8!j*#J;VU@|;cQ%cK zAd7&?iFZEGafJwU2N&=TS^={cArlI~KwO2jSKd`}bt)EWCTQ23Em@XafK4fUm6VE_ zq4X72E9fk=bv_*oigFkL2mF@#tKgNa%rfQ@FVP6|y_KTG`=xw#ni9*SaJ6{Rtk@1$ z^DO$TxEBxqXC0xjI?T#A%VVE@e*YIFx&K41-2ec2-sSBZ-X;Bwx92N=_};w3te&H5 z1i|PWN#}T~8Xo~%jyR4Nt&4?in@RK>b+BD5L3d$gfLSx(3V!AhM`E_kq^yBW*l4Hn zbBpl9J5dez=qa;k+4W*`SEjkl_p)q{Z2)y zQ$dZ^!X<>&Uz~g710~jEr{Q#DT3)_I=oxod}{)(Ds&H+8|6%wfF&^{ zq#NNg1PWK5ll9)v%@id^K!CMbT@!`&C7=dB*y2aF2?`cqu3g*>I-8wr>hkJ(AxULc zQgeNWbre_!$gLFi3X-B-Vb<b2#s(N57DVAG9g63 za0A}mG}%|DL{L5cbXibZrCy;w0-FNSps~2-fat0yr)-lb+Q(kwv|r8{C$2zO>Mss3 zlFMpTMwhgFOp@K0Hqpve0lL}$o(Nj#X=&X6WI#R_OWDxi5+b|4)GOW!Sh0jd%ZI7b z+xT6#{r3mpRWU&VTg^S@GgV6n_P$1i3t(lfhcwIe$Yjq6LRN&SJM_aE9=7n``or~7~_rCIE4fYW?HQEI+Zk*fE1>jZdVahnm z62g6G@eU4T&fK?#(-NSaT&O-=y;$1^JTcF?{LbU6a$B|}bL;N27d|zI+iuB+{=hx? zq+fbl#!aKP$+?g8BZ$@INaKiMMR~*hs1~Oxe1i=>S!AdbPvGD{0`@?-_;*lG=<)9y zd$|^*WyyxPKm6+>GcY|`yQ&hKfdwz$(G-kSTA!l0QBmn@AQPUn9o{nlMgx?8Li2VW zUNOho6+$6ZMzI?sFgSQ*v9uDRI^bkLl!WOh4xW9m;E^mWH62a;y=KW5ijQY$Q4$O{t6ss+c;;8L?&$Wzo7tF zcd=jR7Rwa0gc|@0QkEsN68OX}sB!>`IUi=4r8HU^x`ne!>K&KJ!mlm<(W~74AX^8} z)ft0c0JwmyO#EiW$+{00YW%>jtpc31<0C!=`4i%Zm&em8>2YxceXl6x+2NGi6}@W3&}=(wLV z$u=}smD9ye)hR`T$EHLC4>_g{O;lk{9xC8bY~Dic1X4}t5P?Z)+wyzj=;+17mKK4O zawZ2fCd)*ixhi#gRL8r)c$QXA41%l9;V-BAm?D=sqjY)OX?+JV+Tu*~+>aRnD>Jdn z^&;G{M5U-a$bAT^ft50QlPmiJR93M(rqeRB>-R2nb*Ez5mQsHq23!E`jEhuG3wL%Thp~DzGl0xU3E%6guk0=lQn-hVbe{NnkXow1RF?MVD$aPke&(o!|} z3u1MOQo=JJ(9YVxMnFpy1l4vRp17Cu01<;W*;G)hy%gM+-uq^mKLVJbM|$EjuQg8& zG@Az@fj=B6D$7SZUt9oT?C-GvE}J^>QzgeLcoV3?{vIGK_{Q=J7v^-gy;RxKm}!nq zH{VH0Ws~>Jxs{#JGGz|@z%U+l0fTArZx#13kmRreMt8!6{`jO21#QMr?eg^(shQ2j zkF305KvCo8cS&pps`kikwlmN!dBJ3?oxQMV*J^0u0;VI%OWi+5G6fu2m%ShbfF)_b z9l%($Ei*drb#N3nZE_*(;z*`l9!ZC|m07qj0pUKklu?Gb><%huqAQqq5f0?1E7L|A z@}O~=qR-aEDD%8>$tQdPbAMr#s2N%ihZr08;D}ro&{wanbQvfcxcmZrgFCTgRw%yH zSW=h##N1@DYQk3R7kIorPXt1e&sg7?S`Z+kGG^8;_GcfRJr zsGg}FJA}tXyFhmmm=-+SLPauT+Lv8zpA`MEM+GX8KWNo!-)b>y7Pn?W3}O^hDNU}n z)b1v@%x7rzl!!cpm$>HnVj2Jf+#IcHio!2+^IF0c=7AvFr_GUX4^iUp<06xR@peGK zmHm9DlTBl@Q)P&FiwVU@A8P`_sKdTOyqzIQxAs@j<=g_&7p*C+bv-*12O75P%nvcA z(GZN74Od~EkapT}Yzho9?kGKBNYE+cYr1^*Yr5l)saij6;`6L_b4|rH} z!b~dDzQ8p5NlM#^G~i5W`U==8MfEPQ$R|%0!l4(CdTp3y7z|^!wHSU!j14qKUytUT zVOl;e)KJP9ZWSu7!222k3);tFt^$TSMDRax+A zI$s7p%X#w}E=`(s2kh!+eo&nl_`w1MfKK%~ajEO>PBT`35>}gZH=Q$g&$@^g>%)G! z9QLxRc34+e~c#(2HRoNoQA~+`LU32&=CKJLCiofb8j~7vWZ&36D2=l zoG%ZW0^d1>r837FBi{iLb06u2ivE;lETF`*0`-f)=rE;XF@z8Agf=Ekf_^$S*_SLK zST9P1l@6%CIvrPVbLtJxBZEkB8WR)isLJGhtWTf~m?Ro0g*2qW+s}Bc)JRYdeI=p@ z^`_16zTy|=JdKgdZBeTTRsg&x5SE{%;@YyJmZDMLeSu0WBgOu?XcmGInh^sJ8ar_w z5U}C}s6CJS!0DoUW|qd}3)2MA?38z7nnuf0j}Z8i<_!<_1~OUQ50E8TP(2nzcdKz2 z>#;m%G%wS>;_}m)HSe7Zn0Dw_PLb;5`@8)X46$5(Z9K)Atpzz6n3{wh%Hf@^Uw;G;{4?>rjs?h<}5j;3sicu}a zuGp8!-$$@GkaqFN>@XV{>`mB}!% zDR5DmrF=OMlPb3fXv^P*|EegKqH@S0)YISNZ-t*zKw^eNLZA_O5HLdag?n5<%}qy~ zA`0U-u&MOkJx~%Ls)k4UpetOdbt!_Ayx}!o0HHQe?g_O%t)O~&E?uEg8M(U0)kK3F zjF7P_Rgdu_y;|tK1Z3N3ZGbGdh;?U40K)Mpw0czOq0+QN>7ndFf?E#2F^}uLv2gfL z*Eek$>SYyknQ!QclD;LYh0V*0=-~@n3QLGn6s-hI=#5T}0=-VjLm!q zO5=r|7Jp+6?cT`JGLI#>hiePSg4Bh(GAZT*ZEAgSvvDu`##QvQ5LPmsx?vC54eC0` z8WV&&lEEI}rZm54<_Z1d=H%Z2&ZxQAAbl>wfEZc01Kn!!1b}HYeW&6YjJn8O<2p;P z%$6WmoB0BGF=Zct6?A{LC68Q59)C?;`xl;^&rkBu_5CZ4(aH&g(;9r#QdY3vkq#Bs3wb|F1)f?U&?r3zQqCgT-_Tw#Z zISEjN>8P}&&CmGBRHk&-#mrzD2IeLpJ0ze!<{bcAFO({x^?snqT6=jc}6+jgQa%$$-5dMHw#_B>_<%|K=mc8F0e63Fc7^M!tT1l9&eRPc! zDqNO0#Xft4IImtb<}@=O3`L^zeN5Bqn_JTKTnJW-BKv|uIHXFJ=^kHp+iY)FL*XXv z06tnZ^X;!s6CGa#MUL#_vB>1Xt+VFRiu89@6X%XfikvC8u~x=W*z*Bb0(7{VVT+E2 zty+%h!1c`gac|%m-Bs8F7>juf0SW-VYHUb3(uG@Hyp61ay)f@|R*GRycn=c-aCbVZ zg!HV+>+hTAzkGXrZjy($B>CKz{ON!2vfH=!Pi5wiF<@ZQmO4FmsE{0G`_)UxENFr* zDO`bhz*u?DAQ~8fs{C#<1gdPQS2Q`=7PeR$l=qod2g9|=gHBtibuc(Iq;gp3a>4-_ z_>3B2&XiR}-LYVp#~Y@#=_ne$>SrM*#%>1K230GXxXMkg_5#-_YU+U=o~Iy=i}%d%Fl{lp!^1BIh97_|H_Fo94btY(4yfy=2#&c~~3g5-r=)h7U zswZJ$sV1j!QIZWpaHr$Wm2JRbBr9_jugH`SLU zxo=C7KlULX{~6zYXP$OtW@gl=suY?42w0u0T*KbNjZ;9tlDkIX2W7PuQ*zF~(fJ6b zzVe0*`JP?Mky_Cdf(QbRjZ~zpQ^L>)2~6YHNhyaKas#LYq+_cI8|p57FiCDG%F%-4 zdEu(|yHO*7G-cjwft*M~=fE%q z2hU-Vf!UDTY@h3Lt-$b7#9DMkQPnFwi{Z=xYV};pJ`#1#oPkJrCs(nd^a)_PZo-4h zBB3sYGIKb8nE4g)jj$8>VV({a2>>mCI=EYVpmBCXPqYz+kC0`gHoDM1v?F(3ve#zq znZOOEwGC@HBW>0IERmp6;9bPury}HQ?Ln!Pb|KW}PQj41i-Fk%#^1~`8sNO-P%F(- z>k;SMLL(JFlVRI=NGOYXP@(&!yifV z((PA&^;hd3{7nAxFFllJR_5$kWBEDDZE#)T$v&*2>YcUIlFtQ>2oRvxIb|v3OIHO- zMez~nJV_*OT^C1)Q=LE*cVyl)jzBUfEx(o_b*en{?v9}dLzQ}^%PZH|a zyRj%V%qUm|*k=bwEg>w;zXNb-r!}f~HFIK}J7|1VhT8?<2n51-H(PqdOjsKo`my(G zmm~BC43(xhDn2yVeeyT{dOl?x-}wc{QO^lj^%-G9yR zp=AMb04ryo6kS*1#ENTPA)3O%Tzpq0*j+axZT`rVSBpxvMMc5F{a9;ww2ud5VB6t4 z!M#H;W+;3#pqVIbx71UD_bp(++HG6HnL~+L_n}-Iv+xFPqKh@=!z1GzuQ|LX$yaYl z@{;SG_mPLQJo9YUoSm_a$~f88j14JuH!3BluK{z%B6=8p1_2Wk<6!Yy(ZGtnB?x9X z5*Xi|5gaZ6*=8(+IV9A#hRJ}^XbFs<7--q@Md=_RJgX6gnKWyeDdr}BTZRyQ_2WKAB{Vu96-wbbD0lqsatf>sV-au zYj_T(U3EMFMwl#>YN=MjWDanSGkG=RW=^E?s!&c(XmbX9zuXR85^}R>6C4GQnie_; z_$un`<0f$m7K10-h4~i&j(|XwX-0?u#5w;oy-9PX1q`u7VhKazbc~0DH9SzdliK#O zp;YP%Y08}cR(mCNw+sQ{2ETw?xfK~YW1R|^R{eltOwj#ANvM=NH7d=KIV)a(0$*~y z%vq_Wz_gq8oGiVJiy8Xa1L05^u?l(71U81Mwv|zHK9CxBJ#hG?BrmS+zWxa>%{M%F zp+Df-uJgm}vt>qb{=VhqzFXkhDbQfWL0)Q z5uANjDbCgs;&kmpGoYt{Ivsjo@`EpdG80P9qMc2suRTRSUIst;f1M8x$`)7unOvzX#k1v>@(;f|1B+J5|r1t@C?>ku>( z<@pNpsc;gT15jifh1Fq=pK*n2C~n|XhRkf5xug)tYZC3TVENcF6RJIOJJLgQ4fAEM z8;!h9n|AGb!-b|whbMfKu0_GQvvoSa?2T)g~jY6P=M7CH(-~d zkU%>)G|hm?`!--l(2p?hhPlHYlrDC{IyYG}+)Q$>b|F~8c;x1Q2UX(s(bO>+A#0DT95BCAa9D5l%+^1IRIU42n{CYV`!0;L@!-{O{`tRf;X}5|mtXLauef*o zcR%^YKEL6bI-98z75n%|`^Ae8N1f`;z0*SZt4yaenAWMiorzB@=U@{UQNa z&j5UfQW8s=d^hiy8msmz?S&XwMp3r>?1NGr2mG2WRKL^UD2KlY7rQ4_r;| zzgoHfJiqbtmCilK-`#iq>p$23b>F?e{_kIZ=4$8uL-NQW$>?0ORYsEYrFqjSkTTII zI#}=M)lUw70Dp%cXBn@(Gp|hY zlKRyLANebv@Ix2>^>^N$^P4Z_EHf-%k~u=|F=+@8oa(lB#Ju?Z(i90~vNm(lpQ^~; zL2YfLszCeDAet6TW(8Qxq}Vh?VM~Li)^n=)7J@^Tgd(>U4OixR)IRDN1Vo;FBq`}a zw>cH$#=!wxS~KUQ9DBR#fX!lzFohkeZ~A>_*s2rAr2Y@K z&NWukEUWAPwVzX`s`@hB^w8XAVB``(E@?z0XyP}62!eP;<&%mbF)`5)FoM*Wn3)e6 zCD9L(5HE>DBN-$_;|HP`6^NGr>Lilj&CUzmuM-I_G_# z_j&eSdtLwQzqSL+XB5TrT*_cf^^rSOYF>Y`BZ@F$Hy*>!C6QeN5k20xec#1<6H>=R zjuQktq5z$ghc2CHC?4QSCPt=cn*}VGty987n~2gCJ$YFRS;4TnB+xj4Il;&G(s|s; zhaV+gc@lNUo|fSD7%$ZOHObVxXkfNiH*)k7r(cbLQ2{kry9VKK;7# z+}-5%(t&q;IE(C~itei=GvP*v-c41_IStHvlss#H ze&k8n7mo>NkI~fxV%Ro}yljp3#Pe5hn#_R!sMC6hz$urWxgP0Xf86tHoaZ>I+!|)vHl>>W~@}1J3QO z)mjWpTx@~^dHeM5bgG72EC)mLv|Hd7)%Qg)N~-w0|0%o$5?L~0;0q2wiL7&jGQG50 z7dtEC2vOr%U$W83mcA}PIy_6NPKPEOnl8_1V9>{GP&Ld_U34 zQW)~wTc~lo<@A!5kSgy;8BW&fcuTo+5GTWQszW4rSqct;=qV>oj>ss|)&pM<=OZQ# z0ySL&$G|!L#_I=(zsot;9{SQLv9OLXONP%}W@zgw_Vj3VFbLR1wBmN(PM@2WVoJZUq9k`L+&J=Qss#Ds6v3Ch1fw+dwikm-L!$ zxiB0nkfVgz9e~L^D+l7F4;D{|usLs=9qDK;i33e&fZ=mF*lrI1f^MGd#Zil$Q(4X$ zsieluZ9n;B-jU?_7s1k+f^MnxU zwU?JViaytfRjymJ4O|ox*b9cS;(3Hu7@#Xr3_>Okz=Qj<%t}~8&BZ2#GtR^9Hp=<7 zQLNa=hC2!zC96!5Kye(Aad;gD*X$v%q1Iy*#(SubHl(!nT41tqEDUDxtM#og>fu?5 z*qiakbgFE0vF#7Kre14pG%A)bOH(f;e`;YgGT2uhTq*kk{6z>e8+n#Kl#zh|9-XdY4?)bnN*?Q z+-J=uu};*tHQ7^pJ{tPj#6Ua~a22=-)0#K(?D4qP(X-hjwh8ZTbdkB`oKqTDdsD1q z(B*ulO+$<9RLM)<#}32KQXY0yfmfenrM${qxK9llTW)T!Et zn0kVH5}h+^-UQ7l1EtQ@UZo+#)+?Xn*aVckYe)if8hpNB^M* zFMPc7hmT~=&KOySZLc{E84y^Pwu25M7!N}mgwp&?KQJleV|kDM?tT6>!p?v54DAh= zDS?)_ZlTZ(0Mq<_qwO+Keipo>R{qvkcAmQ)dECoMs0EfgC)X9xTyP?e z0l&zo&QY~7QI5s)(3P8+Jav_P>${SF@nZ7kZRh$l4hS5;LiAm&?BX^=OVd!*y<#Qd zNtrIIAX6=8jBP^Z;i02OdtAwb%kgI_+Y#-G8-~EE$jk}kI4+#%-NNZ zaGsnUSCr5G$7NSql4)h%$?W8GPyU_T%ba~Zj(1$=$Bs{Y`S-p1&Zm!WzZ#hbqvAK? zgHZ%R-Lco8J9yC;5ciu>_l@u_6_Bb#{6c)17-Q^|j^^Ahvueo^ zGETw9&(1@*E>3~lWGX3vesBs<0)TYlF`=Xp3n6#AQpbvh^(yn8t98!~#L(IdwUy0A z&}B7DKT0ZW<3(4=hIE(F>`X(&$a>Ea9MQ@ad3bKqL^Pzvd2aU|hiC+jeX>O;EFbQ5 z4LMs=vja>eov>eHSEN;?tb^L>sNryiJiJ8?p=Bekoo1zWd6_MbUxIfyGV_t&?ELW8 zC*S$o-ZIXW$`x|Dm6ocPk>|z$^=c2*qTHw9z8aOsv-0#+@~dym{M7$Vp1VJCd+Ag) z*InhTu<004D6csm?kEt@QTQdmwma@=3TH)EhN3)OV_pJ?5r>ZRwyr-w%(HHC*4H>* zrMrWSQAPmh=YdUbhei&oGL{VT5FvUOOKP*HaGacHO)QuNe#4n;O2?jjOV^k5l*sFb z+b5l&fvo}oXyGl5Cj#D@}d!-g;m5b2?@@3vA*Q7OaUtDR2yvZ?t^w^Hb4YK zS?gIc$^h-Coi_&x`5-)PuZ0b%4>}^X9SmhhP*Cfc<>=YSF}_-vgJx|#Eic`f$hK4F z(3oljCq{K+1S4BSuQ^C^&QyV+w2(NrYyH4w^o4wPk6# z=DHrOr^nzrJTp=1_2^Hf;NSN`@?Bp%a`U)y=PK^Vp%g2^gra4RK5f?$UGnNZa{TZc z$-nuv$~*6ME`x5H@U8Pd1*eZLyFWgsZb1Ien1%!to2&f^3f2oS;_?*Jfe2I&Nj0 zAExhe2LaA<3TQ?4wH?YHTZ9CuOM-{b=d?gd4=a*tlNIqMHg=%MOhs!tOOv~_$fhxn zd}zi58>G@I7|tROjBo)01l$NQhK!(w2id5Lei?dM2b{DWao=2*wnIlo8h31tfP|W2 z@4ZyCs%bq#>NJfkA=ChAnBKQz3Nj@JQq~~GZD3rUGA2Ofo#Cv6UgBaXb%g+e+P)K9 zjoB&@aHwlLU=z%Ew<4TNQb*3@)f}kDv|* zb!8@h?e)&T{BY%&>zPY4+a6B;l_u^J1W2nXExYVTZxc%~bft*BMzeMytsU)u3*a{m zB-<4}d;lKW)~u7KFA_)Osi5o z=PO5zkG*pF!0|T9`eI`Q8pn81e|uVXOT7FuxXsF$$bzc zUX1aSmr5V0=Fl%*fsSVavaWF2PYNbM z>F3R{*vXmjGKruRf#MiwUOeP7n~Y;)uaboj-FHOjMZ}DZtF%XHWVP+6jTK$K+bo$fY=FqLqF`@8 zTIY2CnjAVk+{$Ip2*=l8s;;W$qml9I8zF9%F8>~J1I#s?iM`G zilj6OdJ2C+o2W1frE#;HBewU#(U~Qs>Xxd4q{>bg{n^DoD;VHLu1%3Wvbs465ZQ_h ziIlyHjKfx45hFsl<1z^7Y*Lrq(U@=7oc(f^2;Is4%ea8tR$X*A3>_F8ua1#Vyf*W7 zpI!N@Us}1$%CQC@CDcwuFw<24??m&;w=V~-P94&uV~abzJq_=V{Bq@IKGu2miOQVG z$VgYgcXDPDd-d=)T`KLUQtQXf2BMD-g31tdu{Otmv}%-O-fVy= zNW+{RXt#%}e2%^~c#MD2CQV6%w(KRZFp#PYTgI<#6<7Xor{;WEHGbnm{g01#{mBOp zKJ;4U&b4|xp^sHcTY!ft0mtAn-x`Axb8@!%nBo1W6tI!x$Z+!~!w;zCa9|w4l&D6{ z#x|8kWgV0X4Ts0I?Dlo3Vc|U%>pDBLYBP3ZDue>&-os0ry?{73gneSiV8u2CpZf+1 z639?2p93#m<9F${sNPx^>CA9FpB76fmNmCsBiKNg%W}il&z_roZklqKtPZ6u$gMV- z>p{q&mR3_WZ#2-L)1iE}Q4qevDf&GfJWLC0uxm=j2Zbj&-CC2z`2*{%2y3Ea&3dX; zu8CFvprvx%Gaq>~`3EnIyyxl4Jb5lapf4i<@ED3*GBoI^0ivlAvraY>#q9f>s^2Cch;94 z_y5EXJowF<XHXH9YWz=#-5`sQ^l35tkE# z=cNsWSNsI5^zO-*j2!7r>MlXs*HMY|Et;dgBa)36a~-2a6oqs3--6t zln2yG+)2)}U&&P^|KsB`-~aQS&wjdc8zgjn=U9<`S6FXlCR;rC>z)E`YKkTnJtLI6 zvs`h>OU9?=@P$EBxc~<4BqL@_jDv)Ye*oEba;!G_>#(nxkoT16#;ZNavU3!Au+tf& zvAIVaeE~Z4YIPuBKyi#kiluA`#5h6+jsX59&{VD7V8@B8Qlk6i96|b}xjW(pIT=?M zh(2YyeLgpqjiOX|eJAznuXVodi^pdj_rLA0KX`K{S4Rb)$Ud1Uirz`LbEhmEQ7sB- zZ%ZS|6})qz7mOuJ$KV~M^^FE6rNrTpu&?wlQ5g4R+S#ZN+hH(>Rby z{1t{nRT^_12BA;}NEk!hqz+bv-e56|^I8A@dmo(n*^k}i)1Ii@Hl__jSHY33%$>Vj z(XK}VRv7qGX+@Won{@M;UhgOCA%F=%gra`)VhjX3W7Zj|cE%Y|ZBypv&XrFqA#JG~ z@y?v5%rR?a3rvQwAUy9XhtUFk-cRG0vp(X2m$B6N71;@7RzL9hmL4qJ3R=&7 zZXi+^0pO}o_PoUy7i$odU2l_;0RDI$dG_?!>_&+d*NZ@B+wsH2&aps>63zyMkFW~W ziV&-Hqjz$N3Ulsf7V*fc{WBM#&F{V39HsNabM8@pLBHCgGXRCjp>R(iIg2K04WcFFanF3DdHy53Z@4PbXIgClI24U72TAquxm`;h zH;NJ7bG2k*Wie3erHOWG(-LSFCuYm^w7nj;<%M6HN>#xs&yHa5b2eEHgJw1m2B{@c zL^-o_bEzDUFZnyaYvi4GDH(3rheb>VJ154ld*NuP@57Kt=F8vTI2EIk+fKgoXKr(K zUAc3N6IU^^0EFFm4}k2>tUzF^BmG@!pIqmcYYoV(_HyG44mxAfA=1gZW+C6(zI$5X zZbWPDY311!XLJaB{2eT=QW2?_sS*>wfHfVXfH8MvB%EBQIEmpli*ZDap-Wf z?YYw?$eqi%iHv)(M`J6Od$hMOT9gb7uVocG*`SC13Jv z)p7rm4#4ACxw@l4CNRy3m!F|0WAFtdoyi~<`eFw)xN@I1N+jlk$M_r0&cOg7jF9o5 zq}k{}b4tc4kfEI1)-aa2 zMGZ}F1Hm=L@+J&GiQOyUB}(3R?<7I)#W!h6bU&Sdb~n)m`%OlJdxw>fYj5qMEvLdD z9#_H!Q8mxK4rb`pZIeME$8ZCT&EdegSI9yvsJH{z@Bbf^YuUV(b_=1?3mU9waNT69GE~ni)Go z7{oUf(86YQ!w?~lyr6QH5>~d;n2hZE%-V~LsEC3y1|1&reC~r9>5|;-8Us`-SrG`p z0a-RO9k3$ljggRUkJd98AQ}_r6mma`tc^2IseMoh+zRT4$4HA1gFTq7ea29zT~uUE zi|bto=*pRya^@iM^P^EUUD5Q-(KNKgbK?P*-8t%0!+zfXLh@zL2H;_8BUEyBf^;lr zEx|buf|zzmUpvV>`>o&q-){3iAI>~~xAORGJsqc(Cv7}V!_C2JocMjO7T1Fj@G65w zQL)Q9-K6~+JOt0&=(f?EF^tU`ej~9`Upd5Ae7+}`s5C}A+nTEsh-hzVzG3k9((?=r zqf{U+hqQR{=PDl{yJ>S-W816|X4S;Ug2gMlt9LFXp1qvrY-RvT85pJUch!nnz zjnS3;GndK`z@1Hq+Z&mLyE+}v5mzI5{kI%|Co9MCtq&g55zyi-guFm1W(w;H1EJX5 z3`HqTMQtq<-X;$dhF5fYoSS5?M)lV~CKMalV;N}S0mx?5PO?J*h4hIdC=~k1I0zp& zDJ&wQP7~?5UW4IuIfFeQa@<e!giykNdNL`NG(eS7wS zZiWe-fK+5*9M*Hhf)_pq=X<)`@6Yu(*jxfru(P&N>!$sPXq(8IbZT)9cBDOh*h)oK z5uw?cm~#OZk$bXaZf#v{XdHeVaJLPz{!SGduvSL&Yt%L88)wu5UhI&}jrb=ydgiFg z>yMLn9LamXa^@Y^#kw*nGNyyA!i|EPqezt&2C>Wy(3K`Lm`f*Dqw?Y>Zu3|E^G!bM zsm`UBBR4WOWG%9?GLN%5N0JIHCEzWHzD#a5kUrA{3mdRw2NH}hPFRWBdS}ub=QK?+ zBpA-^>@yNvK^;zksm|S^N^d9SJb==Bc?()#xc8@NeAlv58rd?q>7v{bj56ihg0O7x zIkDxjCjwM*5B!(jcu7pni;WS7nuwUtJ94x~?U~DtaB%8olk>@|Jqd7k+#lX_p1YSE z^({Z};LcTY9JM`gcbhZZoj7JeS4R&A~EN>{ClG#Lt|2Qvv0 zFBFuKL)^*HI9v`~&J=$+n`sgqqUFM1z$H%&opK7N6Gg>o5;$b71!k!iet;;SG?iaC zHAM7cvnmmnRM2-sFYtUvG{eSwtj~F{&AAA9jOKl-6dKK<#dTxO@L&;0q)0Ru-BOOQ3czQ+Qf+Jd8d z0LQX^dQn1AkNHtcFM#h!$Tp&jG+KED4vQVNlR3zG4Lp<7pqv`fR)c2{wJa!HfXzV; z(T%}KPO=nBR?HemYip;@ItE5?r`7JU9R13SSS&doTZd8vQcaowiftrQI#iY@99qsL znV%tGZHX|CSp&jbWup;aKwmL}vc^u&w<(Cp@N8MwtExPD+rwrQls#`PfPz(fI|GX=fRIQS64>!N1zVE<6rQ~032j7n z#xT@IgKNU>qK2Cplov=Q#~WWJU4701Hv#kTfwu;1VDb(<0lc|K&^vzRb7 zaHLWIPOCNo4})$k&)H-TLorIxiY>f31Qe~L+<&dCS!sG9qDR?d5Q#?&b}Y!g#+U9q zx*2)j*Hk|LNzQ1L1rP#RX(==Ng-pTHkAR=t(sw$2mGAngn>-wyyGH?LOJ$&+meIgL z!LY9Xq4W_@6_)MXE6M~{vwidufSIe#JUftUss2l;Ky=_8fg%e48frc1Ek`DjHr4A-DcD-t<7roj_NKN0BAttEVvRq!_E7{z^*K|av#4l(Hw44ux=47P*LEF2f( ztQ?tkspDv^F(6kQ9*MmUx!OM8K9e*~+{U?p$4DMsI(M%t$MrXTG6Qh8mr;=8FHp*6 zF(u4o1=z&KWvWezjCQPzdztBEQqs!<2V4fo!ee7mKmnMjOoQ6Y+$K_`RHsNUGWiVi z=sAr=x{X??Sf<+K8xpuGwakd+DWF?S?7~2#>}%S?5oeKZ?p{I#<)pI}q>hQcG!5>+ zo97CE8$CMNlMwf3R_&cEm6T_DdY)2jl2^~)Jk-r`lqMm1Y;u%pmttxWCk3ycdurhh zbnrX=?gm_hw4P^(>_jnxJhf+0h&WJ^Ahwl#7^@#TWLzlC6bhNTHwz+M%Q9F;bzZ$4 z`P{pm_rGvPr&SvKMar80Z>D565jkbSX1%JE0onZ=jTbGjFE=!F)7*n3kYfQYDsp;cynzUW{@*DVJ|r2$zI1VpS7&k_NLFGp?PDP82%+~j2^LZ2%+ zh93MR;sz*)M{OJxrJAFa2(p3VE&AyVxTV9Ql_up}a{qg~7>;ORq^^(T!!LK<`xTw9 zdA@SHR5oUQog<1av>9UXJ)9*)2`PNx$TH@<_tKrCDu4UuZt@>LHuD)zCXX+baU`Qg z`i$_ai!4Hl@2D0LjkrRVPJ&u|%O;UgVExt4uJbD-zp^+)d)$wBOgu?++Y`3E5(QI~ z^qi_t-Y{X;-zEQMt~1Fn(5HM##X{k+GvYmIQgGL|jj zyk(~LGAQfm`8Y7HmJ$T$xGggaP`@)kV6x`IyWz9drq6FLl{qTM_+$p)?)?B>TZU#9 zMuF390u(bE@$WKytP~$cRP1T4$84M87c@;eA5xL-}g+8QTh18&UgQZhq-@mW>lS>!Xt%ji9w4F zmMZ>BH9P<#bVUeVSth^=jt(UN_mBfjo(V=G{N7;8F3GTUPthi8qOVN%_j`12!JXnt z(+KiA(CK5-BLrOlvE?wr4$3c5n*%+La|P$_P>tGKZgIZ724Jd|5w{bDe&&U|Gr%pW zG?5n*5XVM2jQ_r!FDuq$G+=Ex*gBV`pu}b5Mn*dsVc#ClnVTfX_yZ3f+`C^HmB3(x zqERm;QN;)^HawxX-he>B5N4$ln_SKE@3uo6yLmjUz+D&yBDUU$RC>FfJnE?C*)pV2 z$pIk)WTJ?_B}lEb^l-{9a%T~Mjf%9b9D-nzg)r*qY`N>=Py+;vYse@T&-vc3Z}Ja& zuU064AGsE~%RJ`hMmPU}q7`L6Of`&CSW9tnUou{4j2)ycWPdazP-#RR&{pXrj`(PO zqE2d7LZywJ4Jk$FRa+})!?Z>uf~?DN#Ywx#Z7& z$yIJH$<+v@iz?b+s~86!bq1)tur{Mli!XK(K9YqE_}9OBn;-h%!+hqml}B^r>Nv3h zJr>@B($yHL1!!jD*31g-7vUlpQ0%Z>Z)Fa|lVSja5=v zb(KolM(ApVjzqjMvvw#E(ZMktuB$7gt5jmlp&UYW)ueKmL$11VDlDhpKHuLz;I^CB z>-l^>p7+P|{d$UNRVIE}oZEK~T(!4~9Z5K!-Ygfa?CQsVp&d=4C7&3TbZezOf3J9L z`A@R3!Ns$8{*$!?A0EVS{BQpeJ^$|a_WQcWhsK3*agk!HxE)z}$K_#ndWzJX(`Y66 z5vjNCAuEXt!H2u9u!X$LhZS{C=Aw1Ik)oqoGxWkNJ??1k1D%Klwd>*PRAzcx*KrnD z`J{o-eF%3WO8aJJyO(3rB+J;_;1D_YHN~<%#S}ZR$`= zV#JAK*Hk!Rx<4rFFEb;nh#;lxullnCIk2++ z?@it4^0%?!6l>f4J=z#@f98$zO5kjc^Ed6JmHV%>96e*+-Xe7oo?2dzH~v0i^|za) zI?>G6Jl4M6&pP(PtQ;M{pM|F!TQ||+wRAQ7i#B0T=jj3b`E!4C6Lv`cXrI*k{pa8R z<0f$+feu}-1=F@vxpCoCq1{shIQWYi7vYm#=*YfwhjNa z%J{2Iv$h`P?d;lJm|Felm1pZuSLXM;+STzc2bcEd@SPnyd(4k--#m4vF~uQnWMko} z$J6UVqH>G=dfk0r4bfpX#%)$hZAHIQ5BA-iGMD1=9B11)d@$8+C%RYJh`t!Nfyx=3vxgkYwBhFmit(|z`AAk3b zxcHPo@7dRF9ZBCZBfhVAe5LYo)&1py)Zg8lal!YD5;x@#KWfjUmXMJ{vbTnWgg-}2 z)c^i@gz?OO<4fw~me0=guhZhN!{ytTeX29ePt89&aGjS4dH^d?$8*k}$b1{)d#=XO z_R7aC2ZMc{9R0Ana+D2Zb=_V5dTn9X+NYiwx~SVR z8?Oc!Vl8yt@}szYc2$JN=O!h6KRT=>cH@L=hF+f6mv8?z8KJ}9-xk2AQ`~(SY195m z^ZIAvklu&5+`L}3d{Ra$_QQd|`|q|jhJfsU<8*f4oaUF?nE3>HAgw_qzCUe?qPzE8 z(U7mI$+`k<3G|wLwrPcbMUMO>|7mqg2VA^R7Zz{`dh73TGAVcu{roh9)whWy{jp)3 zo@-4vU&%t{um8D_c0c?0+sAMIoXr1uh#VajwNmlNlu49zQonXbozGp#rqn7i`4p~bK=;zIDS$N3`$Z+bV~-dR|@ z=N&KdRQsQQ`X4&BZCjC`Q&Y4Uq#jA=E_tAM^LyG+8~@v*3h*$oH{!BW+UVB8-Td8M zzwI<$l>PaeF6Gpid1dD)eVBJ*%cqb^rJp}zbEwh#mI|bNwC$T2oNq?kBZRKnQr5M+ zJEh?t>g;{%uZ@fqOL6<1Etc7i8gFrsBIO(JIlcPFdo*VukaGI^;@}p&b?2MZy`gv4&+4Q`vbqKy z>mMv{n23+oN0r{5Q|N&QU(Jo^+`n<-`@YmarBJ#0ILztN(F;M*QuuiS+oN>t=lZQNMX*$N7EBN=-+Pjr6Mh<0kwr zAA0I#nc#nVu;G5qlKPp9tRro5YTV9p#WirpwB1@?>_R=V%I$ZcDDq_3-V zYW>op&V~CodF;O(@xZCGZVR5Gadq$s7CpCi`do3+ zvo-JQPIv|UU7ZYRho*S%dvWgfk8f{nUcb^Pb>?;bZT*6<$~Nq^8?PUC_sH+_oHeWP zB>bHIU;UqL5058sZ^t0pF zSES^P+xro=82=@oDFS^*{iaj8K4ilY292n~kvk954UXCz_>aB?-w>p`vSzJ3l=m=b znp09Xns&P8KT0>aQM%(-{?+ae*BvaG$G_gSs?B>GyW}%{XY%ik-)iRUY%A?Hs;znu zbn^`{s(NZ`jxaGcM&n-6m9xilbf2C)ByLIi<>N9o=cqTecFgPey6t<{PF16$17^QL zBga`!wy$EZ{dB_SKlPw%d11SE@AB{7XliVK%k1;?u+tJhC(oR|k zGavBOce3BV^ZX+m}$9fibTbZ z_kG@3)KvO#?dRNhL-+g9nC|Bb<#$Tq-6~menWq0+dG=@dn^M2;bhW)UJAosRjU(aq z4Uw~(X7cdo#=$-6PdCi%%i_Ltok+WGBYui?=y^G{b=vV;R_^dwtElsYt?@0ScjhB6 z^9*#$ZkNSG_KbRk(SEMCEckt;$2LHu+OB#3U3rdw$E#iYKXiV++FHG_bmh$Y=)g_g zt1#v?O2@co{l11F^S@`>&O3*HLf>#fU&@(Z79&nO_+E#28%~M#cG>zzeSw)V^N?`|m|jncJx5hu^BvE6f9 z7JuMIPj?>gOS!baiTnZkP3+WB-OQM2q25V1KbO2AbgRqDWB(aBU##}-=$7|vwu$&Q zD0a~UX34|2>$7jz%Y1Kc!=JS4Eb!y9L^=872 zPndWIcTd`1-FNGxf5fu(=04DV$1~geRqYty`1(Q!Km4k_dcdoR+v6S{z$bV(hx13f zyd*flJd7r^Iq7*a&kNBcjq5KfWuF%wD7pK*y)AX?rge(2zVj2GOimP%CF?5_Th3Et zX7Q$2#WBHkrWDd@+Yn-JZ4UnQG!_o}<;uM6Ndp-Vt_VLjduJTF<$HnDxo1UkfiyJh z{6SmtY4M84h*HT$;8eQ*g13TVq^dJ%98#r#h`Om(vSG??;*e0mMd43j-)1}Go|p;<)zC4>{E9; zfPnb=%YQZ{4h^Y3F#cBZG0yVIzy1Z6ysL^T)RChXKHO^w>U|tDwdzL8Z#VLa{-}=I zANL=7WGH=Vr#L+-e`M&@rtcTROwYC0zDlE*`({MFk1IhS|H(HMW-Sd*{(d;k_W$A+ zkaW-F58{>+Tdq^w%}&0*b9|M-g|er&118_eW~A%WFJ%4JRPv+cDgN)&^i3sW2Akg= z|NXaTw@*HNx>tAY$3PZqRr?mY<+XDIYybIK=XV8*tY>Q(KHdGv%6!`{#v^wZ(}RiC zRAl>#6CB^=B*&6dB#M*i%Wx9Qid$HzYO^{(EUUo)4JSsPIG;lKwdzO|uwR}=Ztrt@b{+F9J_ zd%_I&9qcyI>OS-kvc5X;e)UyOmg80{EmK)R`Xh^{Pv2(@ zZA_eCE_OS98az>86z63ZDn21$G#w@o#}5{&*!H@^?Uoj22mY9x+&Z$f45J4;TNRra z(J?af@sHoPcKjf_WQAS&`)JgIM@M^h|8=zI(b08B;@$JY#QERv$M-Is=}_+V$uCP< zNR5hfubqE}*TdxQp*Q@&Q zi5CN%T?mN_pMgwP1Y?-7d`g2H?E$EVZU`qRh;9I&Me((?M+sR1ldG(I7%NOwta;+> z`m#BR_ri}8y%>0%8xbx-4FELQu+2b2+P4{p1B94dYizWh%td!IIVC*}bfiMskYA9X zh)L0+;!|WeclZm3qSd_;Z+H_lD~cszqcM=0b*cpA_%M#Mg;byF2ckCJA)xLDY2m;W z3atW15oARGNGm_`Fi)aUgsfSe^(-!ab}3O@@L~RzPt@YAkfV!lL#BuH=KZGjFL^0- zl8z_-S#TzCq#&nv?sj|G($2}}Avcyr=Q`f!ME#1)pCER-?5Pi=ibNnzE0jzmFo;b+ zQDg={6-H$3(obh%*DIV|owI@Rt{6mOFoZ&34`A_L4@Z|by`B)$ov<1n_LtS4IK!l! z$&J|(yOx=SO^d}L{q2tPtK*giPbCL-lcAR|3T3TE$i`sso7qTwf_#4S(yRCLRm$0e zeE$n5!=J^3waZc=r-UCZM;C8fyxOj`P8xUgN?IsuvzQQ#%q*sLL@iDYKK>P_ypd#F z+q3;z?~LK#?Q_~oV|wjNKT6<`MV?+%w}(x>6OXpb7fqW`DHdY1hX;34dJGXLYHwNA zj}bP0CIftJCQLyz7)~^Hu(gQA^@?Fj1L1+Xqxy($N&oOAi8e%ef~a$Ol>#0!k(@-)@~zE|yJByCpR_w)D;(c{MiuM)ltuP`-XvtqPXUP5B8Ym9LwXYPFYp z7j91+Nq9f+*juplYi?5MIGo=d_=tphhm(_G6wNh7PG&KAI$Kd`DlvN}SlXEy+JP&j z0Q*dV^deXt(S{B77`Ii1on}r`;Vodgl&z6jyfj=azB?Tdf4$NP-;l0$r~I38zm>aO^0mk$RDOsok02QEi z3H`bt8ZkbP6h;PwbtrdnTGd2h3F*<^7+2e-#?(#^OxLYRv34v2k0N9N zG;jsBgDkznQ^z(IPWTce{q?v{84?nKkM#d0wos~0Rka$iXnO-?BCJO!NF=oi&62-}Z5$s| zoSDC8(N;FQRhgc&KJk4>U&2I5by8+`{l^L0Gg#3`f86Aon)AI1!+~a>Ye^$Z{Zker z4rus{ld*%z8Tun65`#!6grfxfJ`5o~8XjPAc@$S$Vm+IP%55NF@c>n-Lm{MoMEru{ z8r6A{;_-1`riqLgntRQDS<^eSOlg*AT>DRlY;INA9RRDwD<`{M&Ir3)7-?)r zXKprFGuHfUwsNr~YPO>`sz$jbE=Rad>#g<)vmjjP8QZJdy@%(LP-DvG#9vBuBHlZ3 zNJf-3niaS2eB>1?b6i|KGV?2KYH7Z6{?Db}gpn%`HV9w3-Q=IdvIN9wTs@Apg{%%R zrD-d8#Ux)n8kbOnL__P0ajbq&xEXI?XrcpdfRNN&W_{BIG_1?g_kcx#hj}Oi28CZ= zu>lav7+>T;uC(TW<0X;yzM*WX8hoLgqU*qrL$YzL2PC4DLGCMFpZLY3`tw3lLE^8M zh7le{28MxBK1{2C_~ZQ0Va%goLVOTH0Ww(vRo1z8mlA*c5~&C>CwAV>65=+F~R)atJ4oM0cc{ z54|QXzZ0omEZ?;<11#3;ko~F3mF5MDJwE*l&DHT6^`2kIth%DLiy$h|Hc|z&&s_8D zz+~A1V`R^-3vo-nPmZf9(~7sjPbT|ct}1Je`Z+cAx1KU$aYV0X>RNBId*$)tU!37I zAc)6N8G?{#RlQrb1{kgn8F8?>3Y4+x7GQpe)eJOnmRzi%i5fSwTf_&8nhtH!Qk;rq zUB(eLWq~kguz|9gULt3Dkq!Kus9hBr9@wUGj#s38gE~Mk3B;PY^Rwx(fv!}+dQ)FS za)DCY${!A7~2XAvjv+M^q{lO`@TFEmP#3)@FQ5 z8WPBrrbR+9V64U~;=qjq<&TxK*-IlD%1=q8#k!E03D5kYPof+(%~WDz15Qu3r+Rhm zyE6qBd)s}KwL|-T3iPTx*t@-UxfMbgBn_~>subd166jRn%0X1U8rBd;PyoeUBnN{F zCU&VzLLk&}QWF$P);;9{Z5h!{!PFrlEtWy9=T{7uw9cG6mH6M-Ri7V**G}BW8eOp_ zWcft{)-JRPymbj|rbZo-Wu0mEnX9dtabIXFQ|6B)jL7Dy&yKDEFCVk@yK*zuH(_Fp z&&;37;E|BIt&^gJw8yK)F0|?FD8b;U;_-hgUQLagED}CHf8{e->y`NW$}6@X1+u~P zn*8_AdI#TZ_xWXMf)eULDC6>5YWd7y)p?={gLoz)vsHb^accGm70i0?1gC>M5XV*5 zZ&+TT(P_=b8FB#Fwk^9Zh(K{oVM-erWR@((ssc;mt??&iZs4B8x(WLsxBbFC`O3Re z^QTyMX%_%+Vgo0q0e%&t$WY3}{`wLN|0-kTL5JCay|FCuyg zbtl{sZ;Z7p{S2LoT1cA8s)_YZfGRhA_p`DWm*-+)n;HQ#ktCH*V59?9(6yGj&L6(i z5-Zq66I%y~Md^GTheET=&8dePo9c1d{P5OB2FWAz=#4dmJ`+i{mm@LGJEG~?p))g6ibr_doIKY#t7nh&{E0j^;^0l*Z@MmQgj;r^hU=t9NAT6jK3R)u3gM3(ao!kEsa6rRD^LTQt_Gz7xnwG1vobz^CJ$W3pRA>Ya!9@CfN;0(=z{w z+^l2_6V{_aeYc2PU-LT3UyIt_?VKa!z?w5faln zfWl6sAWa5zX>s^#nagFMNz%y3Jqb%Jd6J%cQnetVhJ-VI6V7a!qMStJa0;ofyp-Y# zI9(S+R1XYl)aJkc>b~&f&Ba=ejx5e5eJ58I!s+S^ItT-2zcjXB;8K8102*;r!TCFz z#lbQ+5q1aUSYi*A-@U`ANihL@Dn``)xTKqcJ@i=K&RMd%9@lcBz(s=7NP~qW4aS-aLezvTf z0uZ}5*}8jGSvTRZr8rA0;8zl=KsgTv!VG-9d4rir|4j;ZBZR9b0$LMp-rkAtwyRR> zuEgGuNbhge#g`(FF=;`F1n1)E_kihyAgs%N#2z9U=?a6bC@8+in0i=va|eId;QZUVUsa zl-BqKB0;gZ%Y0;&u^P1kA)*Kwhc%BlY;)rQOhOT!cWrfXE>;7==%#{a5Kshk;`-|m zqA$X+!iuhD^_P#g>D7#!s(pF8AaOp8iinP88Xv;>$sr!8DDtHJSttX8$cjNf&?Jqi z+WaG^SCv)`k}p8ff{5Y^1FX=sgr;#{ii5y|lEr}-B(Y8v8nM=nk@Kb6qB4 zcd7>#6y~4|ir6OsY8PGdWq{qx)=w#tG9Y&714H)Yb03d_#pCmbYCkCATEFUJsE6oe z>k29pUd|^NZE0qtcp|c ziU}s{7toeSYNUY3!?QLysM9@ovF1Ydc%UF6%U-Jj;oovbNaFR?Dm2lo{4?=yrLu;w z#V@%rAdr^^A*WF;$kta_c=-+^)s<=r}Y2u92~fz3`vSy z{1qbVogPuhOvVnf>jxRRRMnZG0<%=_C>JTm2lp&F)Qo74jLlhCgeYm>59FugJk{}1 zFx?N03P@>R{vv<|vIt;GMU}!R=e?-ExPpvq=BIi9D&w{v;8X#yv@8>#yVUXEN)?J)o)-_1@ZivSv;1D6Aib)3)Vt=Vj)TiPZtTq zYO}Vfmw?t-HqPCYB>?s5REkiC{QD*-f3vY9#ojrGNaJJpyz+`+jOU}hqc1tQ9&2?t zx9HbEr{j(^U1-?dfrdGpFo%-AQecie=} zytK7oa?8-grP7gw69)}-Y_y8;zEIO0l~g~vdy~_y-Jbc6mCI{S)O?*9v6u}RwhL)% zth}pQ3_`+OYatQ^{S3=KVTFgPh(%8Tzi&&qwjQjY=*qJFC|D<6QB{l+)=Q6VS@o;dE zrsP7PW`BBZ-Pe-dFDebTsBdn75*Gp#jC$xwe4)K~9hIjB(>uK~2`PIYosc32)nsN!RzSK6qj#;kq#MF00-aTx5- z_r%l}+}z9xmY%@iS**+>g=qpRk4;EFdUoim#qg1k_TKqFy%+mJEG_b@pY3w>-$5-7 zgRsehe2A@pZoc52Xii_{qtu?S4oRHS zsUc3Nq2|in6w_?(ivw9`hXxduTu9bRzr-{)(+-6KL}agEujASRihy2qCqcaQb)!<2 z)YTj{p4AZ%U#-ogHV&AZ6g^NE=DY-oIZ$A@F?|L7zH-Zws*TR`8P9V}8jZcRuDXhH zb6vJ&<&BP{hNVUN{C%IXYqitwy)5!iTsczcmqD_z6_?V)4ynuvQW49o@6(Nr{P~vN zyn>}`7D;1CXKLn^%Gt)AFPrKqA7fjh5e`lVr&j3)c+{uWJ%p+r;O#}?0g{&owx45i zC4)3x&%vYMVnBh?-3}WDa$THU_XvsMLSK8nT@EP3Itf8vq;uscTv!rhD!nDzYDx8q zjI;;R#sNbWr1KT@b2bRb4)rWK!Dl>wPi@`*68Bav0W1XYZrfZt>aF#BTS-U-rM^ib z-Sr5w5qY_}0xzydWG;NpH6atAlBNrv3~bn$EbFgRfi~<~tPY-EPHc2r)n9kj8nVPn zcC-cAqoov06Fc=Fw?fuaFFiYru2ealDe#*Ri#l-urGDfrKPN&{k4ZA=;%MyBnwnpU zi!~upDtJO3yK?4|fZ_xR42q;Lt+SvCCewb6L0ZP1gz3R6%16pBy{R%4gJ?BWj{B0= z+*H_b5Y#bJ8lZ1HE=D=Cp2%aHiU8F%U3=lPiZq9+o+yDAAi=TZ{4;6b&(q`=r67&?J%g;2N-ki9M&ZR%eV=;nouexOD~D4u-3LueX^eMqoVb43wM7(`Ja z4@l3;2BLuq7z;YEc(P@nxZWj;ge}ugoIRqVCVUk&nYhx7Haa+Ax@NPy=@7#6&@FNz zl-FHXRoAesJ6sLii7KF@M#cH%h7rhap3d73XNbmMw7o1>l*3x!>Z?4wFT(sr+U16A z)|7U#xjU_0G(8-+ms6e;VblG{!VNYbg7M}ULU9+4ztTo}iDxFM!}aC8#JQdR(e~$5 zNl3?(WInVO{2!=t&!6hrfE@1P-9*m&y(O>lA2y=;mdN!BUr;9=&HMK@`po)_G#6Cc zp#=?OQ;8~;la21fG6qDygNyzV7-?Tja^uCs#O4IzbgjDD3g=2HJwQ~24g2mPm+5XQ5_90R=>#V#$Hs7BfWIzE+BVOFBuU=iI z7+cKi9pAn7n@Yiqy46 z#%O|GJqM!j7>zQwmm8o^@@15<2`3242T6qTJNLX4Qtrn_T;mkWz9D}?$V5oa#gksa zSd%i!>0l%VT&)NAhT`1$6bLjlaKfUUgpyRJx2}aNsLYQ+E{CN}Y5lLsG-!X~pv%Fs z-f>k@SKi_}c}mM6x|63qC;&NXa&Nb|*_4aP{nYz{3`cAZ6SByjKEW-6&^x%%Zc1O7)a+f55o)J?N( z?3vs;HvDJ7MA^J5wy(r~9{wJb!Z-{Q`Byg|KV;Pw$v12zUn2R50arD_0ALaUIDYdLusk9#J*x;Q?v=s$90(ak(AZ+WI>7N>Y^9&j?l zGN7-VX|s}_+I?Z7;r7zI?Xy0gJFfT)+o+8=gq1o68+k7Zmj0U??pVlv6*c$f)!gH1 zky;7Cpp+!onoIRVXwF)ixD>b$*)t_+cU;I;Hr5_r>|c_cX&>=vasPb0In_j)EH;20 zv^sX7s7_Y*5f7xCsZOsF$SAxfv6^a%&cKq|49LtKeB~aP9Y)01s%R-&U(7)_EN_k8 zh?9(q(ceJ+=JfPHKu{D3k^9u~=59Qa7P&rkofqDhkfs4*QatRXRV6_XoH+YGB+B@| z;O>?cSPz}~#5^$G`$c3V!ijSarFan`r!+sP$5MwoE zT2MW^7&SO$G3mH8d@*Ed-Bfpa^+7Mtuo$nuqjH5RYz4P0_0#Y<<&;g5@?GMARY~9H ze=e;LnV%0mKGbc0UmES?Arj5nUmn?1h+-m6avIorrEGc%339+lx8r zqYEiskI&;cu?8$npNuwF)W^Qk+H%+0; zu()s<8!o@3X)acCvF9_$>P;+aGN_K$QmkRg2I?ZEB#b1MXlh4nC@1BE4Ecj-SFB8C zNeINCzY}TS*g@Z5PXh+Y95w+&c@Z!LTLAE*H9Q0m|8GDxqXo_k!@Oxp^9 zKyi6R?10f{xva@t9Vco8B>jL1TkjJF0t+Yll3~7tB2e>+!RNDGrLuYtX_F3u6BoG~ z6Qy(yskzi67}lVhs-U&VkQYk}CNpHQP33q4PH3pr#Nesg36&IE6jdGqDx87|bTr&* zDOkUAmzx$z-|8FXa(TM8UNIsp0zN{G{c$*=^D-tcO=X&(Y}92qb6OWU+#W~6nRJ5M zDh5NMvt5#lssIWf;EeY{CRejotM+f28vrOR_;*6O#utik(5SxZ3&qViwXXW}#EC>N zpHZ`=;VAFg*~f#GkE`RmI)iQ8d|&Gm0$C0uHi`n5b zUK7rqS8sm|f54P7LMMcj5(3CCqL}8jxEK@#!RcvLEH7)ba*|uP!y}m3z}NyP28=pn zI$z`-_WULa=GGQxW+AQv?mLt?ctjbRn5R0k`W!o#Z0uc%!A5QC9t6;~qG}dy_D!?N zf84B^Jxgf+D*AXM$06Hv+ab}qHG?IJ=9-*>Uybv}YNNfyd!Q1svk;;krVA~*aLzWD z*W?7CwDAUwth?2A1jWVrb$3U3Ed~gxfI>F-MN{rywNbG?f#q@+Q+DKxIx9kysni`FKxtvYQH9 z;w+`A{7r&j*PL~3Fh`1$l2siCotp*WMC)kmsdFK%UlSGEeHLc7IMHAOcYZO%uG&%o zr62GGaq99IJwNh?ARg4Da>Y1w9w(BH5Jct;Xu2R*U(}D3djOPGbfgelgwzM^)a0mM%lm!b!HJ1y^Vcof zx6kD!O+8MSdQ+3|+0jBZikFfJ5H3Pn(0o*VSd9J);->Z#*v}aqh<&f}e=aH`mdf;M zekkGP;VY6?8?yP3Vw`0u2G}Yh9Ea=UC@8K(FOMhMu|WWY79apyacmz80@5fL48k`& z-xVZn#9^yuFLg|2`Q+91zt7!xFl{r8I-d#daM^1E_?D9kNjEPUd3#kqQ=N(;K4~dw z>GPhN>w4?T-iwAke-=|`9(a6-oveRftMb`J`5m=z3d|+q-Gro+2kVJsX~_dHEVOxp zW*|2M(|4+Rz0xKmw_tH2n}%pe#DH}H$%XY)I+hj8g;EJ< zO-2QtD4=i!L^lVqA4#hsUAxnITuf=>+3D%hVPi{zF1djd$*YTPq`{U1_Wy9RZzwF( z=|ZmZDqw0M03RcigY|TU76gF}>%Asr1u-P629&XgQmGMIqJ|}%o+x)(rkZ{+(T+8D zyKDxa38F?d1tfDxK~Z9>(iw6(z4BTgDYhJAm5dWc5LCvko0~u$+Zp7gx?Vs@IH>2w zV&$ht06#FtT;VQDOe{nP*{N7Io}l0Zu|NZ)!!mH69w+_2*lRIxML96vQ~Qr%MESaP z?y)jb@7noxgHZGf7w0B1U9*rJjb6EC)&Ae1FxQl1b#5pnNzsvzu=uI^YdgFBDl3a3 zQ$I`?pJpMXeAV36dtvLgoZy!?n!XKb|6c!5>K2y{9_li?H zt+lf5+V5LA-rui!#kY59)8hH1qX#G4Qo3&W-P060Wd-opvUB&ojZ-J&`J3P$?XA>_ zgyrF}hGSo!@_bY&N&xr))}jank;jyixd>nrOW6t zWCY~@uN3Mc5>60I^3sdPp}Ba=N@lfxYY)8yN+qRC^u>iwus~4AqRIg| z3#_b=#{%a;(J|X{zyzHit`{gZ=cgf{IiW94!|>R_vBXqWJb!c_io3-jkW@MqaG>&Z zaPIp)-c$LTpbkFYLqPKIjl}H0+~Rl;J;b6$1{1f#o>oeCMcLCz(0zPZNGx>vNR~pW zo#g#Oh6g6l6Xoh#!3^S4cJ6(PQ@DkBoWx34Qc!omD7}%r5)3V!5U(zXZ|+#An4b*E zOPY4SG4_k&9Y6ffW?xHvl6uvhU1CctsS6j#O$jOBYy2nCPC^659m2)uV)1P+=+MSOxPMzEA{mI&QhDwmc%q(#U|8hrJLb^gnk zhFr^J4&*mvwBc=cCYWmq1qiA4y`rZ6E9i)to*M6%w-||7@~!z#yE;k4B3Q+e`@qri zC$DiPX%q)(m7xg-)+O>m2V){ez)_S-cEBcvW=#VC(AY$Es8{E4a3&xYzuTBy!h|TE z7+1G?l`~mIE`(5-KoO)}PH4j9X1%NjN-r^KI5dF|1lfF>NbP;`^`}X~uhHfZ^X(~- z(o|nA2IPlt*OGg9=tF7DEPG)wlb(V<3xE;|?#ma@SC#yURLI1yOE$nkuAaxK?>rn? zSV}s}7WAWpma0x45c#pOAXU&5-Gvjz1d6qt1&wZ-aoYczKcJv?X~|;boe7i7#A&^$ zBj@JkwQH4%9`Chdy|c5~ewI8iZ7T=M+H4;1VnZB*21|5Djr?A6rOUy_9u-km*4DI) z&31Uz{3z9XYS^7OMWiA#>~a%m zfCH#>t;Iz;0c}9XSBfGS%2L z9EPa*vdK(^wC09G=0j@x_ty>$RjxX-+4Sa?OT3mGX+mtPp?CArPx}ArplZ}?$Rz3` z^DsV{a??_uOEI2fSQ9vr{*Pump*OFolH^IsC04W||* zb{o7(a5z+e0o@AA-UykQ&?{n^UHE%cb&x<553o*32h)loJ;W4V=ZjrZG9M@=r9{|* zrj4qz6xLOx;mxd500aKt$1}1V2GaYoU1bP!dOMv`!1L4zIwTi>-|;W<*l8jZsB!Z;7++0oB@{@5umR;?P&q7JU_ZW-X;E_(d1GZTXYdx>~U;A&D_qU1v zLRxBn)FzB8FTN_9+d28D`s(t`u*^1pbf!Pu>zc21#$LD>MMo?lvV9}#No!?-QZYYW z+ovc{`b;G)zL>x1*#6#UkVy0@iS0y0I!uJ6AKHa;#1@lOSQ1r8`W{c}d24rm|)^yrD zqpihT6v-a&MVo!Dngrmb8!wMQgD5Pd?n@Ay%?Axlj_8-5_Zb+aSw~lZDh1(mx0|h* zPI@yy_C+WdGVe966E5sWI3~`5mS>8kxuW?CKE3m3AH_uD#aDAf%h#@1jm6YUsX`&+ zC6&pxM-ga3FvSYaTh`no+gLU~KGz&IzdccwH205Q&0OnP!lS9+?+^T}8+oJWqd!Jg zHpT=(YYAEz2MkP#DahIkGj>TdHhtB$`pV76c#T(c+Fo)zfD&o`6I4IN6a_cwh7N~y zZDJ_~2L6mn7|pJoct4n>K(UIO8S6w1s!2&e2Z=|A^` z<~H;ztkm zLJJ!uoKO$Q%DzFoLgiPbbp>U$S(6BPkNpS($%tyK!i%7H42iUdBQ-DdtH9x!jvZ1) zGn&Ez{Q#A?Hk32ga=92fHIPptbf6eyajG2lrNimO#4lgtp8uaf9~5z`X*@RvpvXf2 zWE+*dCPw$8=y*O!K*yQ;HmZP1Qw~~{ZTuVMY7TDUw&p7{KE}Y})Zt54wRe0Y2~sNn zgbF-*GTES`<`ue^T7vLH!Jp_)c$fZh@wn zNI23e1SVnvzKF=@7a z`{KKc=N1-9iZd|(-V3vpQPs6ezUBE+FputHC4E(Fh{WuU_jOHyrNf`>dS|SrdKTwZ7g3_4X1sg{a2LNE{tnw}0@frT zAh)GQ_N+Bz+9Khfj`@Doj@-s85j!`&9hG0$^fYwuva@F8&EtjF9FwlsE+zH#co&5H z_v}^rNX!+j%Cx&})|L+iR6uC$0$u{{Ca3Tyug-2l< zn-~@4$*T_-@M9_fMe!t{iy|UWM{K}rP*Q|8|F{D7gZa92taz1~VfmfAUV4U|0PqD# zQw(nOR{a05lq^S-q$p5)^uEfUzxM>ygb@z(0eY6yE?l(S#m)~JpuuMJAXtscwl}5- ztO?OfEKYaLMa-dA)i?m#-WOs+ERTlOL?F}8iQYf~J_bR!@-8-(gdpmw!_!8mbb%=Z zme=#R8P5x23ybqzwH`^bGJ1y+Ide#xXF$RT9MTQIQ*N7>+|a6rUJSAU6Gv$%zBMFM z&3XFFcF(U|da-@hG3oNyVoS64+<5G#WK&Db;Q(wEhhTQI2&=12xJl_FrT|X7Xk6RN zXuZ@;LXv>vRASmN<@*E=95n3TfE`#dpo!<3&_O`fwgpO9+A~u2Yt7_TqD==K&jUG3 zO&~A`m8|J1%;rhYKS+N+v9uspTwHjc^l?v3!jA`~qHU$cCobsk)^9}B?FbS&COI$3 zmngl9PPHvF)l>awHMRgM4(hVjjvd7CPyxC3!d?jd&|$}&B8@GR9}kI|$L2+CwG&Al zNegJ@wBzuCM+Ut;+7e4A;IOf)DO6x%MJbL^avYJcRE>F+Lan?4%Ng%v2SX*e^@92; z3O`W5*qU}7VmO&LsT1nyWWbnc0QjNmQ>#MR)dK*X8H}x~z+VX>grZRw=e9% z8E;w1ixALwl4uWm?&oo)Q{t7a`p&SzH1YFL? zui6~$?qVPhU%6H@YF33We@!%(EzBg!I_6_)zS=3ryCa4tVk5(8<&_eKX?-PLvYxAY z_CI=A=75}S2R6=}-2E{bJ(dAeejV{edHlsNm zY}QN24*9w6mE+W3aW4K)3Ituvrezr10-Gd&NfSTZPv&KQHK{*osck07$|5P@bAIy_ zr@g=B=E^oNZS*R){qMAQhUKq6_^M+jTUoOBykq|FrJ;C>=dC@<7+_O*5L~?3c%*2v zF~f?K7s!1>UoYiI#Svo7JiMWvcaqXDQ8Zv<=Qt;BE{}pY=KmZswTEbQPMk!y+bp(xO=AG0$^&)%q`3D|%_u3ecsMqXt(Nq8v16{l;B?`+` zhCB|%h0vaS7U95jbbsCflvKj0BHPn(15~W6s$#ZE+3k~~`p6@3p5fDx5IgzwVHev# zHCvxU+Vu_riV&t1#=5ZW|M7G#{!I7(|9@|Wnc+PRbIQhIB<2tU;GK)la%EWj1pNq553us+><<9h^Fl!+x*p^ZWjOe?i@D z_I|ydugBs31S?~Gl{se1axlG@oh@<~2~Y-0zu%jlxK#IS&^c?`@NL?=<<)@As{?7h zUCX~IOF+ZGKs6JpWgFs)`p7%8Lsc{=Z{uz21bDi)CHb+dQZX?8 zM_Wg(j>OqUN2J{}w8fzJUXU~aQA@=lT#jnj5g-WCE~XQZP8uYFxrv&N0%Eygeg9EN zRgg zj7hKxC#_^VBgD4!Lg%&16`G8EpKuZVSyLS)nCH5@v{b!W`EB!xa_+asOFLdA(gR+N z_XH(pJ(W53v^Y&&x-Ar6dC(uQ*dJM*G1ry>5{Fyc{@TCUotuDAp`gmgQGfD#u2a=u z{~Sm~k3|ad#v(cuPkQD*YtEe9e6xBn!)5e~>PQ>O7E-A3NT2j3+Ytf*PBb{jj=`(A zh$j4phjH2hPM8a%t<{8}6Nr4oomb{Q2ytg8QpUFM)bT}#wGf>wDoRMgUKn-**Q^7- zKo-hl5>)Y8ntZX?&Ks{K*`qS{L;45f|NpUnWng_IsJrS2g)BQ9pPc~bRo%kMczJc< zA&zzkbcD16@}*utTxgQR4Y7H!LG~pnl1N}YlxJV!qTRU8GByQC+pFuo&joEOh1G<+ ztdS-nG4V7S=iYn^Z6U2;LN4X!mP`!HMxN@d2X1yox@HW6HE~-P3xsl#3I=!f@4gpr?&h)Z zzR~c`9aJ9h*hqvE7Wge_9f5Hz)i0VOHI)~rffogB+XqWrl#qdy$MY2J&k%LIL+cBN zR!bjed;MM3ceRoPsfLNvK*xelqWBU;CoD6uujKESUakjteHvX+?q2ybE`&F(StO7E{;zx2TMcNCH;yi9lFV^l)+v2Z>; z5X!qeQz-MXeWF-kuG_T@uDg1bXRMvPR=vJ=wKMQ3*wbjIKgNrqaok)`SeQuOc_H3; zD=nP2ICjMkn-l(l2Pq(A)sRDBXAZ)6g5AO!hiX+Y6pRj? z1LM%y&jAmkXjD{dBY2bQq-TQ|`NF{W&y)6zs$*=VOKE}AAI?OfY{u_}CvvKwj)Z{+ zk;QPwR#7c_9LDqxqW9y+i3bHC4i9lv)TjJLb0Z^7TMT3z>dfDZ^d~h(NE_Qxfg&q4 zG?)S9kS_%+uHakxj}sZRpiW|F{^i zu|4uzPubG%&mVngJd+b)|HMC8SeNwfY4ACS)l6y>EMA}79_g-}%UEl-0&~c6>+;u5 zz5d`Ey69r^7B!pgbfh2bjS3U_Xw)^e@JP>>)OzDKG^a9@A z(8h`uUM`@DPxP1Kt2NaJHR-%tUe1Zg67AuKHFj0?gA=vpzLYQUS>LgYmB+^s( zTN|m|f1^dt8cOwFY}lBuUcH(=b29zegUSaF9v%|7*Ll1qA4?SJ4(R=$lOK0@P0o7Fo5@&-;CA#Qm8kjpX_0brg7DFMRgO5KoKe8yw@d${x>Na8 zvTm&Wwi;Aj-E)RY6VN)g_`@nm=*4_knhGZaC~ZC~#` z`9G)m=bTr_T3=sn9V05gz>s;0N2!_gLHl5ax(kEb;ikz>BUyO9nj7+-m8mhTZ^beW zCDf7x^b~)P?A{d<2*C=KSo#o|A$8GnxSy-5kFe8MeMJ#4Xp1$JD4ZV)pLbL(nqud2 z@Kb5S`Oe&iX|qkO*$3ZG&A#71V(M*z@#dD~Fj*y{p>5Cot&^HLguCdUO#H&7=CUmV z@__l7$hF9k^=9SD$&ts@(e?V|$6vp6y|vDI`t}EAjYsxz3{i354nZV`y+3%PI~~tV z`+OKbjYns*XgoQrt@h3h4Hz?!1o*pweh8vAWTlDF0!NX5=EVu+T0(kPbzJ&vBn3nz z3uMR+%U23Y#}%@LO_c^o!;a5GDwe0tuF94FHv4i9L|k@P>)bRr9${nu>Je&>L2QC) z^u&$&C>|^Sbs?SLIiEIt)J)k2+_#rrldj)S&A0C2BaKcMU4WiJL@fFysus1^*vI*L z6olk^zbaq<(@QxCLjD=k%5kgnmvr_YyaO)hAnm%LOH6HFv^hcbIWn#VTC73%Kxb6d zm|S5{EngMI#ESE3A=q4~V4>-q<{}0a^;cLvy@@16vne9~{mu<1%)bsY5A$8NZ}rQi z^Wyp990wt!@NW+{@%pTF{G0JV<=@BUT9T+{ygwo@3Tx#D(Qq!!K}JT%C`vX$!xjq^ zmh0j8*YFLqY=x6?EVL?rG8n`7c2M z=N31$<_&b0ea~uPC@*6!W4&*FX&~*b)u?mi_lOa%iyoqoWSby^#uvAQ`9;eebYwgF z%4MPvvH6WTick#vL>#2=-y{IK^k3Xl*gQy+gC|N=I4(!DrG*g5tw!B-3U}3Nq|^0r zd*t%_O0eW1);&w>9@-qi3hVHDev_0%&hL2j-Xs8{2bEALRWO~Bt{F%)P<)YK*+RpUe$OQ`>pQiR8Od}zOuuqp^ z<5WuX*@I-T2+zz#Pt1GBwDjlIWo8)zplLSn;5rr4rYCKx1Bu|$((0@6hg3`S(AGhg>l zG8s3AHaljC}t`s&YIHAJ1a(eTmc#&(DN3hqw3pZ!@9of&*L zanJNCevMS0WYp-bU9gK^OX1>K_#7S*TfgX+OX4F;uOqyL#zYqsnG9mu1S0nhTJssT zIc@!l*+zck*wvLY>8hT5$bCX^Rl_hV{D(~aZJ8(@$7Nsnv5}D!(~Q}S#Vwnw%GpQr z>r1_B^x4)Vp?ffK-0Aw{@dAV+>O>SjdiF2d+)|7_&<$eG#nFN;Ulv*tZ} zoose)S92gVZEN8~@%+NesVrT!A`~hF(;K4tG^A?Ub^X@z>Gde%mwvvFgMVoe$qN#ltHAO`65c{iwXFTDG;dQI2ApB$kPg$I>T zD{vpz-fR*MLiFg&ns>EqAyIS^r9k`k>!TUiLZ(P-oR>%9kp!xqlXV2N1TXgCBmTNA z%rjp(`U>U&wE{-|7CGt1BJR{YB-+ zfR+Ew$UK05$t7o1kb)h84(du^WRW+lYGVZZ6P@&8>%Gf&w0+$V!t5Phn{6}8)eE0W z$A5a`W>^F36N{0$2*W&iY~px30_qFq6?mg~M84wEEhx!WTSRdAL}`BLhz%xT2_20p z+BzLtkP07Ns!;f&2SCdkjMg-e(?n6WYN#XR2uP4uM=gJ%lh*nEZQN&2+RwPOiwvpI zc$z$OLz8&)*f7H`znyYK#NOL$hqczPLqMj;?wq}~STS8Ue+;eg!Lo+X;Lt=-I@QoB zMx;zFv;duh$Sv*kCyYVnG|1ArhN4|OND=r@&&?DcO8!0fFIYGz0Jsk9g<$my!qf}JyLnQ3HTqhYK5p5ksDe){6&Ir-rV!$WuELO0tPFy$M z14+!0{OcUN4vGdD>k3SFRoZe(;#vn>zqD5`|5g>Z#_zd6P-Ag)8$oB#W|s9UuaQ)A z)bGT8_f6meWw$MPegCid^*@(A6CQe$5`RBnb>JiuHrB-JN8OS0`7t(vz1y0YwxcN? zqno9x4>m7;+blDy9Q|al(LMgt?Ei|o!NHe`?Lz2q_6Zz9*VUvAPSWtj=Qj*pA2* ziq~wwOxZd{`5|s|MYZi+>uBoEqyG{yXcqUhd*TJMyF`O1+ZoP2-S*o_J>hC~IIB2L z>+#iW<#fa9Z_0bFUSF&pwWfX$zijf+FT8h15WH#mkbh{{F!=yM5h`V@5c`;J-k}I zwq@OY^oNWU`?DkSi~FKrbz@TwM^K>UuU<*LoYK?wi{m|S zJq${{e@IA({#DmRZ5CN_Sys;D8Op+JPc}1Yt>??(;(bbju#~(pJU7nVfwvHQc11T|~ zzzsplCkgYnxq0Hj-zLh2wf9+eIqneFjfqmYwK{T3CmB$QZY{g3=x@y+RKES;bddWrtjE@4iX-)`8;W zd0@pkMJ_+scsak(>Xp;bR$c1;2fpS6oa$JK5@vIiQYi zAsxcs6tWqzLZLp%rMpmCSn+&rSl8Wd#A~)}-Ytv>ta>Pq>R5c7OS6#BCfj$4K+Z;paDD<7+M-E^owc>$C^U;u z7fn4K&3o2FLRDgSwc2$?IU^;v`4wbmKXl&9c#WM~sNFmAfR4U?d)}k%Q}W{ejf0>v z`*bb$<&S~G$c~oiNgq_FE=H5DsYPioLU5Klg5onTSbE-A8p<1eXQuqGw)u=J^P4>v zzm1l^eSxd=sW=15_q2l%0#wO@n-w+)bwEQlT+ih1C?tej;&;x9_=;$x7Q7|8f?W;qU=?}lC7es=<`#%g8xgQ0Sv=A=t8Jv8Zlxb9xKR8J+=MqUe_ z7NW)Uro91-uL~WfyFRoG%T=L&pgvk?g&K`Qbh^*Q4?yy8biZD-uk$AkVXRiOn0Dg? zQ!3cYEbMg3&oed7VMKL?Qbn;VLvd4IKDn-g3*xccg-gQP;cyznal_no!+M`V#@r05 z>Gs?c01dIMk;7rYRAdnO>gs3~!${tK<5{?aqX_)&JnZt3b^>wUuVjp83y9oNP_`Z3 zwj~qhg<1d`z||Fmmt)?f6z?DDANc;m>VK#21|6Tj7ZsBmM~{~UT_s|15m<9Ur}pqo zw0GXG?Qo4Em$z9@n4KXEQ#$-yBk|8b5w-)t2@({rI!#j!Q36-IK#Cy?bs= zwL}ZuVck$dj2uzd4kPRh1;snGbG_|E>f2ABewYVn5IB=44TV3QP)9{#rG@NCBtV!! zJ%f;gbmGkXN?QgcW6Hj2bYZsQfmMM#xRcTiyVzt>cj&2Md?B(+Uh$KPZv*SK%4dfj zo$m-Rs}9l*JNV}4!rqD2vsUQ9#?qyHWoW3NRZ4>HqCx1maR>)}B4EJNIsg&h zMMXWEfK|C?rZ4#3Y4N zu!GoaU8F@iEfheA+;M6#Uek4lJ{sT``3w1VP0^F)h2F(jaYYcv3FqTxlsgVR(UMS_ zX*}c@o8lL(c0^yi^NF8j!}{MV_;Q!QsE63c>*qnSV3pY>!(y-)wTXV}S9A2#P9L~{s}pLE5c-2426 zD7QD}*j~t#h)uZ?Jn0Q)L~Skcvm1Mc&c?H!I_K5^gf(iyXu=UvH8d&x_u%Xj7{<`f;YsQTGCz^rooj334Vf@-R zrh+7Luwoh3l7)BFPU6ZMb3eskCSA4{5A5~?Gyr?$%Zra!XE$fR0Tz*R`t{?5rOlr{ zHR3T4MFa1{7nx@YGLs5QzJ`qMCTavu8v1OD1k|&KF&TMY)<-R7|i`a zpm#An;b2vRcj>`ed*aRU*#JGI>O7_m=c?29>|GKJJeoXtJ|q1>BtK)$RrWOZLBw-~ zQ;@5kYJMr(w^F)O17C^_vk^Fip~&n#L*chP<61}hbuzxLd{j0ytQjarzokFf{|_|r zT5>|b;Jd-0reX=@P(+a*Memv*lpBVT1s>d+-bnxR)M=;Ku&@qK; z=zz-we{Gbrtc3_TsuO%e-l%N^MqgUm>S3?lZA%Xxtv=7FU;Y|jR!kI75m7`QuP{bx z{?{&dHa(t*vtC#(Mn&aSV|g9~Ejqxew8t>F)$ul&QLi3)Zx z%mlCX)A+o>a1^2kUg8*zls=gLHT~V<^Ni!01n-8+I@lE1D zD7MHy*IPvNVGz;VK2)HP*ojV6E-IeJp-}@_{Fex0(_*azL{7h7cz(g`c*hWw+aBiU zEzr~Z zn`^AVz9e`056OvH;b8($z>&>7Ie@+KjL_kYl|jStCRnCWJdWJg@!D5>Vq0M&2TgU! z&l^X&)PVN|)ie6)j>~_n&dn&-Hka3w6U)h)NxNH5>^k1{o@!$*75M+Uw=M{2sLR`t zMQt3M>XUw?6l*gNr>-r`y!~T6(ranv!FulQWwZ4+-_nQr`llSqFNec0+H;khgGQyrAZMpw$OH_Rf7xPQ-6SlxK~tU;(k_v#taA&$_arj}`0T60)KhE|=t5H4l$F!&z0 z#({HWD~c-fhwJtlP(^lXH2B=jcaB11fZT*+kQOf1=BQm3Wh)>BVPP2+3E@eel9mSv zEnNq8f4idmwl-k)eNXy=>&Exx@sFN~-Ke^-sP?&qo6rkzxkhm?Kzb{5Qt9)_MCLzO z1jvV8o%0Jvl^fNo4H+N$lQU)~?|oag`QsIn6m#u8_Nx&nJ^9$$_0*d>P zCvRLJ+DUP03IA}|uxK53Sxm2K!{WVk?Ti=pU6E_=m%g?NUrqO6mTUw%rTIMt4UlZF_>Rl~q#Clzf^(iwA$m zq{jy!ZWMrHXSf)tox=-4X2sYzZI3@e@PQ=d4uJ@7P{v|~Fb$qPNmd^27`4ace0T4Ed z{GPJgDPw*B@P4h@mNnCQ(_D@dv#5u#f%@K*9mS2r(g|7-NkwD@Xe~bl`m;W*EOaKH z&m8^x*J~Lo8GsU*)sSWvr=w$|P>~>`&^bXeA1=Y55i!947_>#do2N2?b2q#VCqVCj ze~A}rszlft=lb-8l|ZJ(+7fm|D!i3i8YNWZz+x7~DC$G34(9eP9!Z;}ij)c_J6*ii zwT?GbF9IDn4JVo7W!W0hVgEd86sR};Vor?lnKm3~i9M0PP(x}?(n|7(`NnlXRw~w{ zVC0TuBxFa>wX15X2cds@6N|5%K+OVN$q2qY8`_GYLhiKaOcMU5pAq&WE?z6Xt4S`K9Bdp~!y^%;(rDi{=(9hz5r6c;!AHuEE`+g1*( zP)F#2Tt8y|9MM0aNwoxt54}H3p_jL;dZo`TT5bI3_4m=XkBWUB+e^2*pDA&#WZ+6; zm^8SQ%sl`)ZyJ2+mLUN}Rl{9vu8%yGowgV~Qr5QI_FWM9@!awB_J&sQ=mQb#QiYKW zrHB&h@@vT|#dtqzPQAndM>n^9&{`3l#AHRUk!TpTyR6scprK9i^&O^JFAc(?6@oOax;Jn56_`^}fw!fsr zBV6pp(EO%WHH2#i#N@j9A+#3d)zjdx2ZLa-{dld)FEDEoG?=9R2^>^Yy=4Ux&o-fv zI{_;AWcT(gh!brss6%QccKQ2<=a1`wp0=#Tygay`Nr-a$#3E>qds6{Mj*f%Cj|XDl zJ16{vMB4p`w3JD8@ZS1&!vG)&&2A+2n;NU<;4UO;sss;maf(c5nGth{4-1)wMzYxK zw3Me^^Pt*pHowuVoIAODZ6(`2&0(!@d(NJ^sSlxuyTBAr!q?voM8h}3%C#-RL{ZpM zJ6BmeHQhtgI{U3f0Xw1a`Cxu zPh+nA!L#`F?qJgydRTrfTUs~W!K3l0riGOibJQxl06}je7QbBK0#RrA()uyw7l0wT z6#4n}@~hXa+H}O#Ete=-me$yML=CluY$$Q8AQ6vP7QP7kl%ia?7CH7{EoW&!*|4nK z2!H$~Z}o%9A-g~E7h0etnR%F92c)ReLO@g#1SSEYcpj#$aI!;jQRO5W@(kP7ha|!t zHjzP{3i={Vf@Ro#Xz~#OB3T9IevqYiSQQX)pdmRRU7>d>bd-MoQ=(hB%JDSLgZ=$+ zfHW7tvIQ~!>^-@vvM4vB(w}VPVz3PfF^AFF;KT0?UUayRFVP#y}62 zpbIf^Dc=A2wVSFXj17q$IA)|!FSL(Z0IhzlaU$RFx&CbogHP~9c=F=SWrb0Ru zoQ(H<(ff9Y^7hq@0&3R2@e7c7pl_-lM9>4lCc7$ij)vU;TL_8>ToZjdAoNkIx8_zno&8rWRSN0n{sVZxiX%%R<`m%F6>A_8U2XH%Z7bVF_<28I!1W~6A4{C#lJ>ut-K!|`8AxxvtoP^I~NPmWQ zC;J%(lF&k(SVwGf&DQe|d2RfIDS4I>n%PLQ5i|j-&>RH{JgPErtpyfgW86MO)x8uX z@`srBrP*TgOm=GbA zo?M;fp@6h6#;NJH%I>&|(ND9p8?RI8ckA~)b0C-xk;(VN2saHem$=q0fdO}YWKjM- z$;yIDby^ZArH*Hhj+<@t8MKw!r=^3<08Jj-Q*m!^836B(D1W~%d=|1R#)e5x%v>+$ z7e3U*aPTUqE+e`v62&6;U~?NuesB(4ESuwC6^gBX0K1v54a@alC#yR3p~NMw&3=dU zso&x@FGpSk$8FCPpK48O!as4LN$XiCx5Dw@enDMY`0n4=uPVFLGZY!0EB{b?Bp0QnT{%vJb1;yc3MAR!GESrJ+clbBULztn;MfFd^+cqr@5ZA9f) zQ2NWVLuLq;pTUVfV2fDmDHSU2^hBBga4At4{ zG9BrSWk|6a2pZYd2y%tK5{V#saV2I5BGT2-p#42_&7iXWQIk(lIX3Td%ILJdUHci91BBq@pxv^Ffxv$BhAcKaHl3v!!# zpAiCio&MPgq#Xvv1!_WLDqaOkN0;t6HwXnpSG${W|E{mSO`{A$P1l&i^1gqUL4 z(Nxbq5M*iCNoNU9Tt)t_(atE3dRNqBVKeWwuoy6FrZju}DS4%9WbMg=fdDfvAlr6Pyn&yb1hUM)d;Dt1<-gVTTQ6L zkYP>#<$No86VR&hzBo+wsTKm86IL}o+#PONwR#g&G0fV=lNZ%D9PN*aYWl*Wcu0Lf zodXCID$3Tw^T6#hXa!)_xUSoKEu9@*&oQ{BZs7hBcjgHC%{6jG%exDj2`pPx$N}3D zA0F$NLqHe0pWC(=vc%<29{y_z8*)u&|H!f9)nNIs@}G|QQg6e;F?&GBa4BKy7;HiK zcUl5A9i&Th(f~*)HBONaA--&OJkMTfQ zQTZasf@`boWR=4K-OL5x`qDIMtRznzD`Ziv8!eVj7(|ptxnT%0K{TnRDV#trKXq!^ zHV4*ndjYG&3KP_e33+*9vo+~&)tmp!ewU7-iqUAT;Y1b(AEiqXsb9gMhW#^ZVh(D@ zP8_ufsP#Q14*H zb~_nlOrc>BH?t9^Hb)guTOl2g0{^M?8N?&e$|-bouz!oQngd>paNI6{^%O0Tg(1>p zpI=w*lD5~kfaQR7$JPJUww9JML;TmwR1=+mC5Ple$igk6pj}7sfzAIw#|RlOyp++8 zr;pw{KIUH6J7s5RTHpU9_01eX3K{BnRQvRB@k%&U_Vm3&OXD3u)yT8r%+dnvx3X30fLi zfNSsLq;Zk&Z;Y&k<*Z@Y+|xqH3P^}2`0lC2XQQd;JgP~l*yC#rh*deKFE~8~Wi70= z4^LcsRh5i|EHLs;0@sr;E`tKUE{wrg2?F76H07;Q(}ct35}L8<7ELr3-|B1BhjDGO z11hBvaT3CIQGwy$;5_C}jc}Gx$Lh4K?L5;yGt5`F|@1F`wpIIg%=~idAV$y{vc!G{o{>uyA$n4=BLfW z$3%+lPu~6@d6Dp|hkIXqLtiDo-JfSgXWt`X>Jd?V^OU*aVHI1!Nv;V7hh=jkg#Kax zo@A7qH1e~lterJmBWcCk4|Q!(47Jia@9 zXuL;ogZBjCOi!3R?6|;fK9xdf9gG=aQ1*MyAi%RwYoT#bZIT+I=HRC9JERrv7!pme zqys%bo?T%+j5QD-8ng&nmmW$8enXwH=%2817D2Jag9b+r_q#N_+^+-{!TAHkcMvE8 z$dJ?s2g@A>)HB;MF?{_16%%h%v@c&9;$U+%c~B$l>H{|{dP?nbK?WzW3C-FA0_2c< zirqx=piJE*a9(&>7ZYWsEyX~A3|%u zB<_*!>qs`*v=Ikk`lq~O%L>d^{+@K*TwQsTKIA#jitKh#C;aXl>v!Ttbf67G9`YCU zn4r{nIexWs#Yy?4VfE70{Ug_c%GA#$egY8{^gZ2@8expD%CRxS9fj0gNttiqoXnVQ ztUp;rXI(IN+i|<15ek^!m3w3QXxqX{m-3IUkBjd&TkYdK{I`Yp6`@phi95;CU~?n$ zLO+&G$IanvnxHRiWNLc-Ac%afwS8SN*aXPmtIM9Ap|6a`FCZ;hzQwR*;kfs(fZ{@T ztmK|C2kB;JiIce=yOvQn6HB~k&0kav_%lzR`u zTBm4C8nA_J8(LCZ&|ha~ow?{Fg6XV=Q$tjkAC}Uaa(zBSNFoJ*U-dv(Y&>(3u&^Kie$ZMv*=zKV zuC}ip(+2A^X@F~>SxGj})aVOS+vW*y2IF`ayFu9CoUXoBDCMYM%2fa4~+V$^<2v#AN8OJx5^G;X{F4~xEv;6Px>FPT(LTp;{{%nv2KB%HCyD!dZZB6}f>caVH8eCYAO;*;V5V4MHC z+10hbbpS+M+sGG#xXlzJ7ETp%>IuONQH6?2);2ELjQ~S)%GR#CYCRTs$+;O>8Jii? zuiMIJdz`d?sl;l96!Y+AGAh-5=f@K_ zZ{4eR{^dF~ibV7-YCoBKKP(&0A!i_gc6YV4d(r;K- z&9#RbM07e#1;zgW@L4I^a=aD~O%;25YfNNduZn}C5r)XTsCNX%E#5XL{@o=}+xqC* z73I|0$lB$B>Qw8$=S)iUCZ3l5T(gvK7d-szF6V%QJC<(pd+HRM3D$xvPI>pc=+*Cy zD)JsCnUCMEpmpw@N!4C1wXX)X&hzWii{S6B+4@|by`8S+hn5FFt7AIG?4@7>)u7=- zZz83XhL~K#rO^0q(ESwc>K`=G1 zNWh7~89=6~{xXi>=S~3q1@7+5ad2{|K?AHB5PV^Sft5K)+NjRbo{Zl0?QL(@TSrU2 z?H}3cs~Emnn16z4`$5P^eFA#YLqt zVMp~Go`<{Wk|bPMU^(|!h}+-nfP3se7&?kIIK) zN&@V-HRiUd`0EaDkagLB2+EcI)_Q(SXMHwZ77*F}{;Bq(B-ZbgvE#Zab-nTQ5X@E6 zc!TI%E4?9J2gKW<>U8*kLpNPck6_A5chMAzyU(^B+bZqx6zp357}?$Sz3tIAuXVWX zi+xdY*~uhqkpD^5A~x{~Qbwaeo`EG!HDUVxNDK=c+E2mBFq67swQ2Bp@+!Lvt?lhD zpxG4X?b@Qo@nmE%vZ7nUxhMxRJ=|71Z`bqfVk!1$gdNrml{*f=hg1!kFF_H7&({%WP!nliI#OW(ZfeoqYX9(>@791hKo}cy%L{7+_OASiF-qnYzBI z>~mfJZ?9zlR5;ywO)S_~#;(6R-C>$={9sL@K^?cUg-brB)bFh{YvZ5)Tc-06n@y0`Y!IV~K0txiXW`kVky(;&2MlSsb zU`7_!C5`oS)PptqTFUvD=Pb7)pl}xA2-d6t8rn7G^veyoa?&+z&9(a5z(WuBoQbCz z59uVu#Pz403Lp;Vkbcy?;drlJ?TAR5Hzi{fu_gVqgQuO6gfXGEc*|3_UKk$P4FZBQ zWgtORrTlwsYumr=fk|1FV1T%ALq;|X6vQBdkr+I^H)gMnjQ3>AYko~%IFS4ooYJe( z-b|XU&aVVTcBV{W!d#HNZt?(ZccK0!7J()BqzLA~niHzuVz(CScDP8zxkEdiE2Tpa z5mKe0lhKNnra91v^{1O)5lBE~A?YK=7@YLa_gatt=Xzh&-GwE&@rQX&6xl>bMwgV^ zcH|@w{4NX{oCpEFKr4uZxeFRs2C?cJ{gKi7=kx{}k9M&dpV&T(JRNX@Vy?3cS&qp0RXQjylJ zzNDu66=*eH5)j5dU#VUx9DP^4-siOlK8v@bKY%~b`%5o89yyZU-ts-z@kK^{A9fIP z^=zzenG1$rtC9~ix7GB`s8w2MG>DTg%Hvx|m^kI|VZo&gIKh02dB{ zfVh@b%sVK^*W^#3vDu>~umPoPMSt^pB&+ILo?&-b^C=wBsPQI+s=6Sc(eoy`$un)#pcAumD;5LwK|0Tf0)Bw5d zsnfx%ZB7*?YR~GUCCr7Jt*)b+iuEq#w@I+a#I^0Yed6x)6Z^FVMSW-pqWBfPYRM+E z0>^?up_<%&a~NOR`5RbrcsAW8a)qoM%jkNLaUpr}=SmP@XGr4{p8>VX1ME(*k`~qt z-{=)Ul-O=92R_)ibmm0#;C&O37JMb%0QTk{aQL%O>jqNYmjJ7Ac*B4m)&g;OZnuAU z^ADZqf3jX}=m?15n?NBt18$|-IAJVaCr^=`XKZYDp%Gu8ua5t*h=HDL&tdVp!;a`n zxew8La*9oz_rHWQ2;I+wL@WSGDF*UGx^6z16#y7d|OKJ{d%PHv8JvGtSHRZw4)o z@ACNNg#8`<1rJ$)ht9?t)UNdGZ z^Q(Wx)t%g(-<3^W-2TvuNJ%NKq}sR+c#pFcOcg+XfLLAmfic1w!`kb$)fAYX!xyV0?H$j8}5 zZSUQorg1dXk$Cl7S@p6CVAaZ2J<=yv-&}j(dfZj67rPfy$fPh)7%W!rPMsiA#fTz1 z{hWtx(utqaK7*$~*67^)=I_e6H7{VHgHNBFWM91f%%9BP3qPsa#FVL^K(viHg*P5- z3Dm!gh;k!P`Seii&K|&$gT$sX2qE8jS-UAW+q+0M#}mNDba#|;RW`0 zz%`s~{`}Dv-mg)k-JdD&Ea zJ)uaX#ghHen|l)6nB%{uu{KAPvAdN)yOk67rnk|NQm&z`CIXoS>#K9o&=AzGXKtG< zX`*z%G}NTGKSE-l#n7K%JMitYYlCR~lfJPw-mf4Inx}<^)u5QYt)Toq;NOq9y_-9B_N)k3A)Q1UtQirBFp9BVfAH4DSmC{Zs4ek`6YhD%S zu@eX;wFnjLxJ)-o!ZPV_IXUvk!)tAJp=&d7*>zKGdFUEIQqe;l4h9b2xC>F8$p~E0 z6WCExMNs$DDT_@m9^c4aojR8O=b>5GwLdas8DA{S(gu>3Ht#*(Mk)RHV$a;*!^Syu z6Z_rMtPi#3KWpgo*uE$-_r9zQ%=nUmO1R=X$s*YZ}oEujv9`-Twy{rb~nU#tb5%(d38 z^MA+MD_OFA=_%>ovBe=}rjp@_>@=q(H-lB8zb?JXEvx=Kz5dPXTYuYkuYtI=yf&cU zEq`@s7{2x+4>Angr7OS}|ERA=Eip7FN@bxOTUDmbYm*T#K;1u|-V+C|eKVj5O&0gQ zcKT*?A|TMOR~1jiYU-$><>>!I()-6Vz5oCJ&;2k@45P)9i4AE<_4K1rCbKb=YO2>s z9o05M=d4gVkz$xxV3TM=YV_D+=GWuCTP%mWK|ibD*Vt$ZwHq78X%pRb^1ZgWZD<8H+0l zL7JCdwo0R=s>FLdRs1%~Ou*i-`%WtN6+kJj1U#l1&|mFwc7GIN)E1V$zodxBoa+5e zVnF1J1`SB?*p_c=rq0cs zZw?qsOMOw(Kw|7xb8W$8$Y*6PcYlOj!Sl|_zJRZ8+#l-}I|(qjADqU1HQWmv%KY|M z#iwsyX1?V$A9KC1!S?H+GmS~^yZttt<1RV#Jj#6~ z-Fo908n>N$CUO2XQ8FbTN9XXOeITJ7VOyd!%yxM+arIt#Gh$uh$Q9K`$QK3bf045 zwf!TL%>no4^TCQ>dOF@P_WjjA`NTGG=)mCyuM4U|v~)?Sg(X{JLN4s9bCoA_z+La+ z%cFFhO!}#w#qH1{tBSv)DV9zqS^y&r!iGHYKl7v595h24=-SOMrS#tb-n-R{l6w5 zXJi-!FiIDqG}6O<2~Ackb+fZD%S#{=Vs~Mg95Q3~rAUNFuA*rnBR?v>heY!u(xn#l zn8CXJCQ3{aoeg1(Jtdmq;oQpk!%mrBY6CMr)^_HN{y$eieJ+_{f)EQ2sOaj_4RK!E zz&=zN=1xGeZh(RMh%G2p1ZI320Qs5P+JO60FDDgW(*oj;x|e9zjnSn~FNWVEmrCGA zr*s`Wlh>!ruNVOU17ky!$~?+}pB%RpPsbC}>qoomlQl`MTofzumj;m4ao8XjE*TO= zvbtUU%T^FP_E#95?^yc%@#*{w#S}C8^e;Z9potd=b68n&ctef2G}qk6 z@$fltv7hraXe}pJ?tSo*@~UU&n0#~XYgWbDqdgtv%iWCpkfNPUI4Z0t!(ZzYTX1fX zm2SOpb+VPJ!e4&jFj=G6{?Zj#abxOJ>yL`A3yCwObCrRgr++ofcFi$b^zHZOI?@cx z{*n%cGd%=4=NMc!^gLE(O~^Ib5F>!#9>{ltzcz2w)^K~~Kljst&EQgEn{A+PVq$#W zR?nZXCg+X9?AA})d$apuV>#f$iXw{lh9TL@A>1!nLi5cNy|;ux)>)!HT~TDF7|aV23pF%+P}iUC#*;;SzErFx;4p&XjG2?yHa3rcCz z&oZ@h?gNisURBac*KEMb8_n&0-|y+(xo)hU`nUM%sWMPQ+Zj0b#&Ukg{WmKH4jsFg zelI2Kt~dRKRo&)%e>*O1&7w_gX&aQ_V*Lm&KZSLS?u(MpBBBx6JWhnmpP3nY$@q&@-8i~pSr@k}@q za&y#XO`8}x8YNv*9I(xV5@LLFDIRiB4GTFA1-sQeiGl`^6A$%3r1DU9Od}6FrP(`1 z6c5?qWZvoUunEj*cjW8Eb+*H4F-WsOM5cs9B9tvYjOK>;V^@v4!~#|LBon98)z#}4AhxAc_vkf>A?ZX_eV&49qx&bdcxcb*PxJTZ%v)L?IZds2^WF3! z@*=9ZZm#1VY`E)#ARVRr9VGvmV72QH$x8G5Wa0A3>G95GpC$)R49xwW`RK)QL;vy7 z6|48A2iBfST28QRc70V3v&Av{8=q|!LRR_Zm+NE3JD)KTn=ZY#R3P?ci9~wUIRCAH zWLY3c)DtZSO&;s`%$O)**R^osh#fc27&G)AuUf*T)J|%!J`Pv#V*wW~Q7qDHHK0Xf7_K{`7|LqE&p}pY~}i?m`{PzeaqT4!OuPY zyu0Eo-#h%SN4#I6;Wb7gQCtBb!h_-LgZ*H4HPx}-o`ZC8QBLZmwQGIYgw1k@()M;} ze@d9!P4i_RCguKnrh6;_B|UAX-)VO6#ccZesla)t7UUZ*sa6)4hZ7#34+;7~dLa9Z z{oR_oIr)h_HFtDHUXxdYXtCeo*94a3|ho9Fmsj z#9yMt5zMv`bAVZ4YW(bryZ?&-ngE;3xW`cz45-9dwt%emOJUK1Apu10#=ML+*>Da> zB&12UNC8$(!f$6GP*N1qDsaGyN%<%XJUAcKkmBgX!I`Fk^o4H&2@BnOOS}3Ht@g+@ z^O10^1j$I45{mv6mB!}or#lPCt>}_;i!^Xc_XkYsZ-c)YPVAi;`SgA3|9akc_|+q= z%i34_lSA#?j|u(=|I3HJ8qA|sqze!e4}Oq47F!4j-lA0iBrN73Nuh|E?OEl?`KV9m z1OBZ1l|WU;A?tV^Ke&a&sJ9nXfyoeN6+x^b?~tynY#xa>JeV=h_zC=oj6};%t5AVE z2UaZcWng0;u=nq*0cau?6QB((r{gm^cbr>&d|^~${a2%l`;ot{P}RJ@ZuRweWfgc` zU@j%*)?Wi2PSVoos6SlKo8BPfmOGLi*Ez=iAXQwbPAYbZBm3#*ln@Wnhp&nFtmrQ*_%D{-T3NYPMXueE$Q^!}L_^WVTJvBx%xjfX?J ziKR*e5ntw@r9xVpmf&ZvJHkBIo9&bQm`gSLsTi#q8+@gsHC z#F%}Ku08aXPG6=0jjIHBBHp)r{qOyWj*7&YL-!YGwT*k&oAdnFp*y3Okw#HfNpSHZ zxBN>cB_WSjR?+f+7gy-X01^C3KXQN{)>Y^N)Rl-&2@SmAJjvXvlY>0Y z=08X-+pK74aZ>$bqjE@9QoEoZ*)sE=nSJ+Nx~^>(_w4r=G^JtP*El?&mw1W z#W*@J+p>Q8{X%i=%qeUUkuYFNxFM3YMK$6v5h0S3kt|dtV3kEf zP3Y~WeAF}wvzfi>r!X&{LxiWp2{N;bcaoR(IyyN51Kr$%*|{9UKi~#f`Rz>Qr;4t; z_}|3T2r1n}T&*(qa$SR^-YAs2EmIxzJvyiJ%nKd+ltVlVR=Ls}}9Z*SV!n zW-Zh1VN30=CV2M%@DD!b3bG51b+e64hDf{dr-x0UDUcViGPGqH-W;6^%`8|QaDT>Z z^{2p%p%)8I?Fqi;-4yW4>Se6oN5VsT%D0D6NXz8;ZZveeeLk=%4N;+jQ$xANLufQP zw_dE{v1(8UK)6EJ*{tl2BGQPqP%J$g8)E%SR5rTDGfT+(fh8F_GB*tliNlFA=BdlV z70G#5NaYvoh1>kRPH$Il@XTVzy3xiwKds7qmHGKUhCdAc0~0HqX2%)#p0pi0>Q=05 zhzwnpe1S>LeG^MssYX`)Uk`t&79Itr%X)^y}SAW-CTW4~9u*hWhW*fUm+L|f-<_Gj)wO7Jf zXJZjL^`j(r6i7Wm=4%?fa!)LDRE{^T4!l1-bFQmDH6&^E(RgL@T9fzW_e-x&eGZel z)@-{~zP;!`@J44w8?RUlY5ZhpF%kkaH#zk+2}CL*8yX*khN`diHYm2T1WdX`5^4kG zp)Ayao7#<0=2405tr~s;v)6oP`qjv6Ml7hO&CQj9Rl8=9FQMFICFP|4D(b_QC_S>HBLuuD&SUyLfE?JpW->|76A?tDuTC!L`KDaAepPHV2d}2}mz=+dyIS9S@ zuLs-6d0>}cVYIxep-vXGzmuFVth3@siLG9-Md6MTxa>lC^Lb0a2(JMFLD=vYSTM|o zg6+~U#px<$6*f5Z5ecz2g<`g5bzTNDA4}s@s=XjNNToO=e#qtMffeYCsP2!e4}A>HAZSS!2zb6f8PI_2W;cyB|pXF-2)yCA4f@$B!ongEAZ?IQPHrF zYOAOQr5`JBZ^%J6JG6><(JF42S(ckGScYyexd*`utN7Sx#|)Mw*Tc?^MzG)sf6-87iUCea}X061-D1M}Lc6&YQRykQ4om=_x#;$v#tIXh|L`{euu}4{0Zaqz2 zeF#y5>w%lnm@efiswKlHj1W;9ppR738GC4hI?I;tlY)Pry%1;bZ!d_7MwWoBQhlU2 zii`skIXRr(?dlAqm8Yo0NS|O*J|umMFeI>1Cp}+^tdcWMYB;n4j492YC%T@dvs~aW zd>ObfFmGG&H8Jh0a|f9bTf>&hx1!+{i#O53w9@P6?0Q1BffnmB=7WN~)BTV4&Vh7= z)9mUKAY##;cCR9SY}Mt4t&QHslkBr6cRZnQ*ch}+W#s;IQFTLPvaJLS?v9u=Xp4?Sf=V#g+W}NIyrDyCg-? z{u?oAo!uAhibAi6>N~c-As44l-ah{M7>EWx3Y;D|{`hFdp^VYW$upLThx0-(d6>ms zr@2dVvP_@bvFd3*hq=*%pD87aH)2ZeE?u?0#5(4nex*6#EP)_0SVF}{D$2@-9PXTd28oN0q~n|FbkRh#Y}ED$fj5gEH} zxT&v0frt3tIZ^vwA>FhFky5x7C&Ai$kj)aS8z)$R47-luPKB}|wBS@-p7J{t@4RWJ zYu=Jv!8@4ZOtd8Th-pL;vBFgRw*2Voj3-~GZ0FYjv+vISmcZJY2CK7cdAEoK*q4$O zIZwSJ%LawaO*PiLpkQovv-xC?|HAXk`FmRo|5Sp0mv)b3SK1NluUkc-zwU83;-`Fi zMZZY972et#mi@Nl{Nft4Dh3FwnZWqUj!ABGCeX6Q<{Z2p!NOMTnjTCro}_F<*jA8y z$j+!w0EfkS7?Za61Y2cWweiu|M`L@A5A2vqpC6v07>+Soh&|L4DK(mhlN>;;ZJ>&RnF%C^z3*=%j66H%7Cgj26F9s8&qd~VmaN-kb?npQW0msg98OK8L#U`kCT@!!~x1e{cQFevoo^HTXm zNJM@5f zL1e;-bp5_NEn_n+YyC4{WKQ%4&bDN{`LSj4%-DgCr#2_WA3cO@O^)tdo_#GM&OJiN zdK(l?qf}cU#avOuZ9LNi{%5to zhjw_Or*bAPAmdw?VR9jSBjOOwalK%k>}Hjfa28|liZiNT9=tRrE1P_Idi=uP4=+JY z9xw!aLHuJf<8YZuFh0!R`P?=9>QgHZ8Z$w~#pLQ6c}${~Kn8(*I^R#yJ(Ts%%V%?& z_eYRIivs0lmd|agaGbiZybom`QqPUYgLB@uf6sZB&NK}J1zv(INOFE9sD-s*Su%bv zy{(&W!HIh292^8*>{bQCLa7fQQ=Ndh>dZKZ$K;GBwGZ{WR>$D%0nStQBHzidZs26* z@SPzur`+i0BoazfE^+HfQ1cQ}ygDue2WL>cyfPA$_o!%XeWdyuOb_@{WF zxuj!b^j}x@<(=BPEa^~De*3NRlA>l8 zC+s%=feJ#YMn2Zv$YrdN9iC$fub_NdwKv_+>h!s5p>e%o(qi?m{_>4ag5G+#ceuFH zRv0H>w$>1nJUi*OIEX1`cZz_93qwHF7E*A+xz%Lm-CI0P?c1uCv|an4=ibi_Yv$pd&cOMBnc` z1_s`!={1?AhNp)0fwS#XSGJ_4Z+;tx4G^R5j1u6(OQ%EY;&wRzjvZPh;D~-OjpCHW zlC)U+Q{k|t8{=4&Y)oE~PG470kV_{8BfB6ug!$K~GW&h=*JDe%49fYcVJyJlZAJ0} zWH>lMgeNJK^(0=FqOdc10s?GMkmt9yq1s5JqHn}{us!U}0IE9mGKbX&!FTZ^uZ=U& z%-O^FGT)I74sk%#Vg= zwX+{9J8#}hK6UC4V0j&i4r{PzHhrG<+B6bt#Up9OY~~PnXPAnG0u}K7;oBY(fbt>9 z6D=X6q|zaq;X2+f8!3#DYF-;*fG!^KDA8gVa*D7%5)B5gcIoq^^=YGHb8zND?acJj z`+qlQ`fU%khUqIc;J{T*TYU8?bj9iyyRi0_smv2^YUj7CpZ-#N!SczfSIM4#jhg-{ zRBfPp#1h|JXZ&YXJlU#CfmA$xUV;`Qq{ZYA6%8_@+y&mVRXs%b|tIpJqJ zv{X}TB0SUz;sFzhV~O+N#P`jpzw|B%&PCb0xU&il-GN&trr(Z~QnOvM?vh{jX&1pc z&ion#>$eB$f%AF5Bnw@uCx#?=@ZSPFIb|PRZJBuj^mhO4Ze+Nb(^*Kj#u?n|tiMo$ z#h~j3_9Me52_E)aqQyL^5CdTyNFO0fs=XSeVlY)%E2MedB;8bJiFvE22?53fPN1&# zbMf?}%!} zr?r&L`hngpnTbu$9KZ zG%}Pv9LTland?uI#HO8j(RQ4APV85~4jIQvtI*gyRCkqjeZc(ismm!^HJytc+C5Cmx{! zsAD1Y0Sn4*BUQ(f?$1_Cb}ifq{5Y2J_nb}3gV6rc%iR&g*0;#8Y5XSTa_ehkjVscz zo1lOC81rD!nje2_&YYgPf1z@QbJ{RB`{d~H^`8c?QY5%rWWrC=4v!N^6ytg;S%ODZ zUA;Uj>VNlH}T88G-0}rQo%fZ@C@GM9qH!Zfqi-iy!-TvDx*W9ONl2dXBkib60BLV8Xr7{WU4BN;fMC4`N*- zD^4jmkN|Lo9^=WBLs7(PG&?yD!xa?rSe`K$(690#U=%^ou2O`mDg=^s*kZDIV&XlJ zZyd|`Z)GK*e0R*|onFPRU+yM(PV6Y89U)YxpYq)ExpAYfd%+I(#p&bY=jMLg`)pbJ zU40Xn%YDq1y^r`ET1K*dkfkceSD|Xi861Dqy5gLi^5|63LmQ5RX+6CPRbdv_XzMot zLP;Zi8M-ZRXS-i?8e_w?{o!J(3opDYhx}XSFJ{iP7&~aY;v5Pdx zM$@UR-ypopE&5_lJg2Y0D~0?cJC(8H{?ydir|H@^KL&Q?9irQl2>I}00fZ+lp;9HN zw+W@hh)gmiz0LwtuW&JUVvt+C{C1R$0%K8d#YILSOM9X)7_3w{>EZ+yci+dc6Sn*D z#x*J$5fC}Wl&u~gHq9G8rZC!v3BjnM3aC|dpW+ZI<@^T9Q<4@V zA7@6ByEI0A2a7=w=R-TFH;p{5ocQ_mx>G-vDKt6uR&Ls=&vjdU9yn*I^;_4G}q+^wg}OE+kh&!cHZp{OAB;mrF5gdcXHWjH8A9sHAX(=C#tzHUIoNfYo-`5N0Zc{V>AiKgh?*D<}6YJT|x(x?Vg1 zMthAE02<%8-Uui5h^hQU7D=E};%gvKLk)stjMjZtcoraGu%qfF&Yg5E0f>Yh9a@vn zwyTeLNQjkB;J1GOWWE3UK`n$(6K0y=VNZEz;%6;@H;Q>I&bwTiMR8D*u0hX%NahK! zPKel+CxzQhVdGt3@-@Z;Ug`2Hx2|O#Ei{I6iUg73MX& z=hk+Q0&AJsw)UkgYjUF+VUGzhzW5u>CsLae7rHb5YM;Mnn0YaOw$c!@*YGXhrG3-e zJ>+vz|6;SvMI#Mxy7JkXrpYjZ3@$$CvD;%1Z4UpDKOv_;lvTT+skCbF#K{ z#d%ZoX#1NpV5C+M-m}kbyT^)$rKjY|USadPuKu}5!|;yz?w2DYThvW8r}8(3gs$}_ zH@kXw#QKH*v0ZhI$d?7nbaiioJgVqyakYjgRVWc@Z2cJ!4a=*elH9@fcF_>~)@w9h z5Mb(mz+pu{|LiY>E##3L;Am~0s$KY6Ib+Bu82D^E^I(ek8{M92R|K*le&Js1n?u$G zrZ>Xvy%!^1yWwq9{WGuE7&Mma7v?K3CeC7=9Ob6)MlLM~(PC|el&O~@i6J76*JWHm zHMch>L2`Lxou`{Q>6CW|0Rb?l#W>Tb7;yA1$d6oZ4NGzMTC>2<;1A$`WgINfZ2f#2 zgx{0`Zxf!+B~q@7I0{kVIKh$E>&Y*pmjkW~bGw7NuXYMAR}39t#w5t9VI{1^o7TAX zHgY|~LNS7v(9xM)3zEJ2GO80best#ud+%&fw4KeG;?n8>KZddzOeA9+B@%MU*Tkub z(3uy87hQAphRzprX92}7@p#T%^0LK7e*S*{Slg`nTU&jrQSry#7}NoYIgFzt!WRnU32}u zl?(6p{&R8Q3((tLc?5ufex2d>VhSbiN`Cyq2P?>){1RcSZ;Wz~6Fk_S4sn}-!Oq*2 zLR?<8Nhrw&Wxz;0aK|Q#$AY$zw47_Vi04&`0nMv z%nn0E*BpDGbnnMynXl8HEV%%khH(hlJ42vZMvMO;53a!OscvFy_0NUz1UT1&8<5N3wYA z_Cl+b=6pBCZngj+%$%tOt&D%a`N!76JyZpDm3`eNTLDB|tuI88Bpl1tNHsVdl+v3c zRto$W2R*DGX|Wa@aGPuO^8+1s0+LP6TglBMIcC3ELw4Mo+VyM8$C<0Aw~$UMP`uS} zEGF;0B#YP@h*9id8S)yc!LhZyBqc8wi|!YCCpd+p_qciyLTv?Q7uXx#BQa zjGe8^Ap8|L1iNAAL40gnlB zWYuL7EC}sIM|Zk{54jG+H($OS**JYO<1w%n#aHB*-8A|MevS~X!#T@~&Yz5oD5{QY zusr=@1$fGV9|H{wzI$ihoV#QByh)j|x?{JWcMvVF`bj|%tKEgW&q}-;W>suJvcuGu z>!~F)5-g~3CQ4ZoBI}Bki{WlaQAEU^EtjW9*e_WGw<(i7L(fv)U^fdK^GE!($=$|yP7KCs|DHdPsTDMDTxB;ku;%OcLX z4)dsJ7JxT^nxY5+sTc;qR8vw2xOa^Njhr!y^iezeNaM*% zgd^uq)fsEvW|?qCfYc64&Y55mt4U_{^-)AeDbx`Hxe)W~dJ-H=#b#Cv1~WAwjk->i z9NMnay*xfso^St*eHD~iuPdJTvkmk?NN!IvaBRn`7o*cuFDva}%7>VGKLMz?w z0_liVj9@!qD^PR@XaxsUZ+c~#g0U;w{06D&w(vsXpj(b{f$oMpWeVTFn#j!AV zO+?Jd{@^WD35BtG-Bqe1LmGa@wS(YS)WI;D9`-+`ecAck^(9%u1yM3cHYTXh>IC(V z9i=pKb&M{Dq~M)^0IDjCw7Ta zy8)50m1Hk=wpwFJK!Yj1Ivxn{oPn(lf~&WrZla)@j$ezEo6+06O;I^;YC%el7_|uS zxHJ^R)KK#s%U)d6qOerbIqt!w2*|Iq^l@|qWgr9}NP49);imYsvcFFOL`7H3LVGta zIT}rNX{uPE%R-cS0j!ZUkl4{s9H$sevaKbbl8O@R>ctd{O{*8spYpSWD4wX`j*|vY ztx9{%*CWu_(bP3H8OnTNJF$A}#d8OD@rqMMsX9|k*w>En#I z%Rn*1yBcFZ^0xpd=lKv~G-8xVmByr^h#)kEqL0E+_$-ul18REey=eFqQ-5H^zixnH-`~VWHv9Kb(jngmE@ITTE0%CyWG74$aC)|8% zhi)cVQiMYo`|>1>*qgz}R^bz5Lw1WX8b0$8jmeR8;MG&$Kp~0uk;i+8R4~rLf|3qm zGm3aw2bRIsNJp6+_bS(Tez}}mKU5g-VeQul?Zj=pYU*-c^;@7K2o~!~)Nkz4-{@Aj zIUYo+C&13e@)B@j`Px&=aKQ=WK>@`@LPJ_LB&oeybZTQB@OQ=FF6EiWRjW#K=`0aZ z>&;IF^lpth)luz8)TiE?{uV#S+?zUQAGkDN+jyhf2WkE1;BBEP9Usa=;cfAhQK3?@ zMn_DEcg&p4{Bor7_`AoxHlbdgDTF6C_0f8wSpxG3Q(8>$WQ6hgfB@D&U!`tEp=^al zpMxXl$CEtqP?_H6K~6b%)l0PAtqC|e_d`&4QS~E+w=jA0#g9pYt)&6XfS>*nr5V=m z{pQ-Hqv~S4^x{amylk4!7?(uRWh8ieMs3B($z4KQB7g5MNeTzttPzA<`NJ z3>=)q0zF@9f%^h+DugIslLOMu^}XnyuKhZ1J1^j*gUSI_YB{l{ehBJHkqqr5aF`>v z(?X!P`UJ_T_*4L_RdDq%&WGuv$^kxb4OEwRUJ)>X5;a(Wv(rJA1$-6P1;Byq`*k^a z+!}q3fY}93tH_t`FzG|aixEoYiSe5m*(cGs!P4Ea)bO4PFKyHW|w+9jH2seEZbZ$rH&vtG|-jYE``z%FVDc~dxkDgsd_tf}uw zAezAx$H5WX!1wKwcNdDr9#wY6cP;m$6yjdSD7518A-T@8lQa?}@ILHycw%rkJ@dna z)BLBYlEh4qVEk?Ib$5(D2Z%VECB}~A8st(WK>QF~YhN%&me(l@m0}?(%3cPnf?Env+3+P#Sac(+ zd`ZZ}?|Z-g+i0eQpu|W-F$f4j9zQuQC(s!D8u0;ZOf}rqsNOD#diE3{w%(GR2Z{G8 z5&&7{SBaxo7>xBb8aEk&6LFwY@M$&~wD0$3Jg!vd`F<=Sn`r?nmaW7{LEnrY)6>ZD zdKl}Hg((V{d!Cpvvt^;uav|T42>gw!oi44t?$SrYJ~$#@dBm$&vEgyImPA^`kYH%4 z1CDn59>0XJFn}t-LUP?=B-_dc9Qtz+cAS^1*5!bEl^uYa#B!c_k&oWIlImQ8HuzP#&DZQ(KF-?z(;u=0AZxfHB9V(*MDF)gI2ob3jMF68qT4FY_K z1Vuvj;RvvHkt2UAbQ9a*%uGIG(g9uOyJsc1b2pod1Sxz#qb`r!1eW^>7R#+=E zxoNzcCI?J(YFRuP6}Lj5wSZD#Im{e41OhZB%VDo&E zB9y_3zSV?W@|2jnurL8W2Z_}Rx4zNYmeReSS4{o)#Mq-*-}T3mLoNtxY=D&G=i8c; z8+si(`gB(&E&a(s8DAP7bt$Ar6y?`N-Jta@G--QUC*cVC z^w0#crmT0-7JCH^p{STK6gbaWwWwlE!Uhg`E0QmNH z?ed85^?qo({-I&!@bv$?|K26DJ#l{RrwtV=Ijy9pN)bX}MtxArTCpHKTwt>`!b7p_ zhaYY?4uMbj*zreW0B|{lx_A+-2FpY0#T*yCic12!r78}xNX+%sK&{XSNFR4QGx151 zllq*V)c#=%KW3c2TtesPiFMxg{x+pmk{9#Gz>KWJ76z$5lA@ZXrXKWQ_ZUgdP${QA z?i}GWbh_zU3dp&X8o{AGq*Ha(;nIU1U?tY-3a;mNPq+FE+WATnL^nVp{6JgI>Ah1e zhQYbbEz>ilUHdBTG7~f`CE4`)wwsYEUF%ihwnzwTtX_=e?cbJGx;m5DqFFt2GV|}u zjH$qkfk$^TrXJ-j(+sbgIwY-$P#eXok)u(6x>7*Y#0bRJ8;xvotqbzUgZ&UH8)J^L zBO?wHEk+F?6vtv=&>A0k?4!fS7iwm*oGt`@ z*fIKI`XkV{-;N-fTbUbW7qPBj7bDdDtSD6;NKuRiPG=6xni*cz&ikUFGUxp@qHv!MU3vU=K1U3w7!s_9?U0=kCvs=43Nw=8L^7oqD@kxEs;F;LfwAC9BLH;B< zU(YfH<9b*OCbsgEL5T6K;_&r@yJr&be|lW`_0x&*1AEseZtRjBz7&FNa1&VTq0qNj zRUv>fQ502?*5Xn%X-J4;!&RQUycVNiZbKs308F~jEeo6wi7*8k?mV3lQ2U~G{yVVh zq&W@zhO`6;AIUctAl@r6psZt(OIo>z1NzAriWZF2P^>HG3_i!FDpiWr8%VqY?8B@VIt zGX8sSeA=g+mUk~kDgxK)*!ZYhGTt*DzW2ceSZvl>Xiqr@9i1^-P*jc&95+;~J~8Cd zb@*e*z2~&Wo4+>ftMSjK8wuPQf-4-6RS3$Guz~OKEjMczWtF9%D|1i+6gq+->T*#T zn22c@yQ$0v$itI#pORk)zU6jCaleU(<-WjFG?qErd%ALA>K^d9O!@CU2I}Ztow=>CJJ;a@H48gL{Ta zx{{#+?BaTJ6YrHFVzx{e3DMTzrChoskF5fNIZkpzGK^){HtPI^>&y8qtH>V;b0manxwdyn1wpwYaKCN8sUfW0XtQZE`Q?l%uHvPv7_ zRV?8xCs)|6XC9we(lWbx_DSY=%UFEIr;5b+halc?o%94t@LgQ9Q5g-=#t0@GVrN|@tQJaY$y)= zm_IQ0^!>i4A+8poN>z0o-o+&L%=SM;h38igp3@0rf$piNE2kp9306GpCMlnC_mc@^ z+BTEANO((M-?)5e=m-X}IEfVqJWaJ%J;&B{Mwq!;emMRNJn!i}85Nbfzy<%~uSdp? ztCo}yV}B}m$jCFrM3Rc|!1#x`5TcFSoQwBLV(bB{n)NN8T0WZ(EIf|iV!iZ3(c0%$ z;rqk^9C894!OMiGI~V3&fwtIarDb-Y1&NbvD61zM!N4BYO0R;ob--%jK!nfVjV_*h zkiMsO?-)3=Em)_+9R4nT4%pLuL_|MO$tYmXu46j+sUrM7I45d9J{gm* zP@-{eoSOQI6%?}=TySHg4@&|W;qxNN;3G@C+7)Y%54G*`d5eCE1HjPg0GxTUOi zT#}CpF@0PpCIt~smA{}W?kqbxH~r$x7GM%v+A_kdSRqJ0Rra~AMu*K?Rem{&wCNg) z8)>>_{ot$7#OW<9e^nYPTRy%7$rQ^ja_PFop-=F?5!W8gdgy9pg9|&y!pg#HV#Gu{ z#Eg}XV<8x_k-K>hyyoQN%QOPLpnS#Uyj*(0Dc#_;>v+U^E1gmTisQ=bOvg%t%Zt|zIgA~ zmg6OfhUoRpOR%wQzw@zBPNcudT^a8%Dh-eCmjAT;DT2NpqlI7o7=Je0>#mwtdEhh{kf!_k11}3je z!Q0*PEb7RN5=>i2YIl94M8Q1=?0DfwfwN3QRp)SUQX?2Gph6(>nly4UAN5huO@*>x z54BEvv*{7-#^*sXL;|~f4cjyZN4UBy39x_t0f}So^6BZHGjjT#XdjjwFs*4wkgUo^ z3U7E4d%Q?B;`G#Y<(89U3;BU>40B2A4Nd3bo1Ro}JnC1ydEd3|teq<7?Ovs8jObcE zjH!;w5^h=5RQ;+Un-iBvko?dC##Phixd!4MOF+PR>FSinLcfG(wAvvzlnasu; zWh=1IDGSTh%VF;hx**}5wOlDkQJoLJw%nSQ@%jA)oJ6AstulQoMXFCggbkSV1aYJT zyTY8*c_~YP(cq#)H{Vw04NE5m2L(7Avv$4@)g#*&SM|28H^&$#hpzTuV)s#8P8SIG z18a(L%T(ax8pFKh{j?X%F2AzHF;O^PeR(erPc(|bmD&qyNZ0b}ptV*xS1Np`ew&%i zyn8P2?YWWo`M%KA%@)z81sXl_i=eGruh(lB-5N+8<(WNEFvN|CQh9&r26yqFZFpi# z9SR77-EZM7E^UraP+OyCbUeZUO*nAyGw0+95M$5hu%*xviyiEz}b75Q-%{$#rNNhrqy_b zj_tgZ7qt2%=UKhrW_{10gx;dH@5TpD3W>JWem-&i4Bbs&kxx}dt`+%M__B@3%P2Z+ z>s8tVbt<>Q2uM#G72~Ezd8hZD9J_+z@_0$^Qj~Fr-a5SI>&Lmofv?jp8BOO}7JQHO zP9B^1U39~4*B>cXj1`w3Lk~Mkv3w2P&HO1AO>_K-DPpCMr>0N8Eip`{56s3GN-TlO z`d)Kp#jgVDP2=IHDdf$nR^$g8ik3mcIm^^~7@~A>bdhjOw?wFcsaR2j6w9V`Nfe-Z z_9Ic71Lt#78R=2mJ_vZGRB$+-I5z+1_igt%)Pf?k!s1EY5UdFyg>c9eM;S^Dmv_fq zL94EbSTta`6;n3SReHrzqA&@m)u(bd233i3-kyvk`u-__>f$Xb@7Rrl@g-WZTyWhaTyPT&hVAQIk6oDZC=*^T9$X zy-~oQM71CwSex!^cq=Ll)p^Lx>)t(0>YL07{4)JMBWEgL@4CdRVw#7k*|Skyq1EL$ z?N#6}f@+ZWD%}!rup9?fldfZ*Uf!QOb7u@G*>G{sb=M^h!lq$Rt&qoBs*SvCQn@6q zfM&ZQURK|T`q)Its0^%3G5k8HF@cJaY`?Ewfy3gg^J{oG(WV2@t}J)`N3BG#GmK4cvp57$L{6y$oQ zfR6SEs!}Wo@^Q4=LsD~SYBV|vTFDWxt|3Omyw1x2?v}EgnL^}Dh(3DxltJgsYm~kn zd1DjW#C3*OhBbkc|M<4NTV2%E|KwGYjqn=Yl83p1E$rKesUig-RKoT@Zh8DhU*`QH z(ygVx%X{F9iD5dkDkgLgLzEWWf9e@yH3Mk$k7LuMb^z%kS0NdDS4@?_XeE51c;9`zY4L(2dD7;sd5e8NJ(aBF(WVeKfXxF{BCdpeXC1Ah8we zC&t-Wzn%}}4Y<)sx_%wDvt1=c?6J^CebnJd zz=8(JmUZ86?dSB+8IcSncN5O?U{Vs-&I0_#^9KdSK5Y-zybiK5)j+9QYOoZMlK3*L zT)0t;hO2NAK5>UlbsQ8^aiK1tD8J-R*PD$4UIty}tlif$l@n$cKvAUJ{t1m1q*{!I zsZ|^Hahf7!rK_A>L2m%dQlB@Q6wLg;jGrjnea!b+e}rN%ic_fQ zxoZ`Y?UNm~A2a>BW~M2Snc2PCJ8*vN@$8+ZjZz{P`vP|Hu)bPf6z*d~cgMD^NlZ+; zH{Jd{Q#HGAvv#&LF)fYc?y&EoV#7UR_a=Y*Du(+8lH;H=3u;8D{{6z>AY z3ndCy@P$(sO%#A~UzDjc@xgX}S<}hlK7nY2jj?3Y!gSFp$>V8Vs1|!5E`ky<5p_ zV(Wwo&QpYdLT!wdBpE|Pl({}B|36LdAJ6pu|NlRq+srUL$6|hOh#iUfaYj;R^E;Kv z`=nBBM(L#dNCzc`nKhJ1=!c)_$M@Cepn69qF&k5UJLkM!=~RB^N2UB&KgihU(fj@V zoWIYdb7FfwACLR}cDr6b&sK9hCsWhFNDHPw1FeQ~~jRCTyzWp+}rIHUM_{S{s;XGK#n zt{vpB41m=ezJ-E7g_&SFD8p1W^4nowD;$et2($|@2e6g}G$I7qmK5aWzz9PkMFL4W zQrrdYjaEey$1RrMZp)aAQ!dqAe4OH;PQ856ILagh1rwebht`HmgX_F)o>zioNttTA zYx-L2^3q(=^Squ;kK~7Yx)#Jwp@cx9jnSASxI>V>Q@G)oE)MbtM33Yfue4pwD2~vWf)2p9tC5I~HdZ>*`>Ru}b3F<YZ8n8+6fvUX4+RDW<-~P8y6lFyOm)}8ZfeudF8RFNHjB^oj7KQ1GAz9j=#G9eP zh?AgAF_yZ!l0Df1A+DO{;6U&28+ONU&Kb(%{OxH~?DF@V(d2>F&(jvG1Eau+&|kl< zXi;!yHguvdu?*-3>`HP7OtWmr+WV(p^crF7dsOa5mwTtCOa@l!+P1YVCEv*S+y)f2 z-!u-K8D^Jb0M5FW9br#))ojdlFrhHqacHreNdzw*DN1u7OcG91zZS>_b@32;NGA_s zMqQ?Nn+ph`Q))zMQJ>j{>B;r^GxmT{9A15XH zkZ)ev$BqSi_;1~+#q9YtC)LE!){h4cj|AW7eskCQliKSZ`kTh*jrM#Geo1BoD%pY30 z6xTcdSvT$9Uf%$MPb+O;>uAdEWF3d@O?KVhvpHM*tp%bJ_MJI2Kvoq)3H)&(sbi4K zPeH_>=ETGx+GtH4;Wx=3+z?}Akj(>O{c9!W28j3|evvl{Bx0xk$1Brs0CVAxLMbRh zGbRUN?Sx5=NR1T8cC8?E41zUkK8uT?h!;A*k{^PS8MU>P4k%9>He}LD)Oy44k?7}` zLpukEbXh4Vz;vxY&~5$DGqZQ)ZmR0HL*(-|!y1-G&P}*#TBMynpaSbSqN6*V_E?Q<5c=H?(*{TV=vc?se!V? z3$Kx1Ty=;!6>l9>a0ASv{g7)xQzu$3w9R;}2{S%roSWY?TGaII_KW9~FH$E_ zV(DhvO}=V>ggbAtbTy|Mp$f*ybPS;OurVC_8osw{6%Al(5Xw*asFS4L&5;O}0f#&! z=>kAOb?)1jX-X&HB53{k-%3T>UrMak;q7O)TD&O?p%{f?OzNs1(&E)LQ8h4__3_R8 z)PJ?VIsLI5Ouv+EUSFr1R#)5Jk1p?t7n0me?l%jNJ~TSki6^OWG9Ju^g@l%N z&tVe%D;~7h0M5fN8l7cZ#TQ1E<#9oh@a&DawLoRNYS~TMry4rCJ^kDALU436&)@Bd zb#_4`Iv>hve2EiuF^t9J5ZJ^7PQ}yfCm%Ge{5vCYJ!f>=;qNrBWh=#*#=giQ*#o{T zTDPEN8_68cS6BNCR{dOE?xLqF32AVnb9B#^y>pL!5VOU#BE_!&;tjLV6)7l=`$H#u z?J%h-g)_%Zkjb!~G%PP0c!soKUHXwR?Vr6C^pz8%&+C`>&<^z*=!$m^(q8e7SViF> zVa%g_b4HysyX?M9Zf`*5C@{a&&_TETwh*#@m~@u^3%hB#%pCHQ%Sjo*DLwjU}G%BptGH&7T>+)OkPw z;97%wAJi|^D=%C;{NZf>YE#RTyVeq#b>;>qR%}NvhllqBUKdQtAm5uSNvY~u%}uUX z0?USW+sdfozf>!_t=|;qX0}$Iqkp@4J0U`&P~R@!iL&MF#4yU2`_TRod`&KtJK+}b z{E45dY)G6WQGw8jF^Lyln4#d&kKI%Kb`G;@p~V15eGbxXaKcPV1Y}QAeRA6;5M)*Q zVrl$d>NhmM|*g|DJ=7Mzyvei=e1aQPS$j8Mfv}E4Rmckd+oT+rs`a?1}a$kfsX=8 zYD)cO4&K1sW34{~g|ZGUa>3BzFF?)+S%P%Lh#y*oTUNtW-Wrkk$SD8 z><1!a)0VEzueH0ibvY`RPoxiBY{@wLda9;jm@zzif8*c5`-wYyjG4byX)!vNzItvy z0|;?#=cePnU)-+PJnA|iJAJu3$SgM}qD$>jgpq*h{5*u;iT=sK{57bsl^4tOVbcb- zP=^o3={ezQ4x5q}xdVoxcI>>*zo1FwmVzp|@{_U`*lq!vFTGdw&1iJ3 zM6te>^!MYfK^H>r7FzC`lp1LsxkPHfWik?RL45fjJnr2LQs_)Py%>z$W2r1FNYW{7 zxEt&&)}|y23MPzv(cqN<8J1`#grv{9oTTB=kPTMko0}qU0KZk52>ulpi#K7hJ&&+F z311C>X8?w>M6ujNY{sw_yG2jMk&wV0Sf4i8e7ARXAEu9i)J zN1S(Vt4caAcU;I>sjggIerx5~Qr`Otu2u)fe9vPKKo(D~PtIBxgQeykObXtH7>Rbs zFDNLGyO;ut&O+4?5S$3)+29ji3nc7h5;q*(4qnDlxX3#%8eq?vWu(tgXDb4;<0Nnre>Ft8}&4{`QTQ_mM|%%=0-IdeoRH-vAF5YYH}7{vFF^ z4$*APg-uN>%Lmh^2fp{lttPAP%ooS4>5VSOeyXYE-^jeDVCd(2WDk*q2CTnvjYBkP zHu$e;Bd=oZO=ai;#3kPsZ(=yH*#K<3(5_=ICGsea4b}+oxq@Mc+lc&}XDb{x8W1in zfOBBl_jk63eemkw0QHk6-<>p}19x&8Vk1*yP%6F3ZE|N|0U`+}}vqJbyID@|< zq>A7JoQH^m5ARkFz)Udr+tFP%8*gLMif$7sBGOj!=9T)Ym9v#;%B2rVlw;+&vKI+` zmgwI!i=6Om+QIz{uFZ8Ob+Z{al-7CWs@ON;Wn!uB?$*h?l@sY2>u*$(eHp5AD_0z6 zWUoXoWDeO7R9jFJE79_f06{pZ4ibsRxY|(c$$T0!Uf}yIxXOuGO~J~B5C{=dNCVAQ zo`n5AP&37c#pn!xK9zfZI-NfIFU5}Z1M9tqH=7*X-ytEM!1!B%OK!m(S21(uN~fPw zY|GYG)xTzRS8X$-hOKFznc_o^A9CL9`m=89hgm4h;qpxsQZbeFSc_pv7Wjq}O~}S- z5quyb%|kJ8xNbj^54voVi7~+a5NO0svOxhl7`%r8KPlt#{Mx0J>AmY8M?dyCe*Zr+ zYsGsBl)zu?gaNJ_cGUXat?k7Sh(aoteB}a!k@`)oDVCQzGZs{7(@o1~Go*VDr@boe zKN_d_1g!RjLEhru5=Aw|U`FIaE71@L{hWNjM0=O1kU-oqOtPCmT=fZ{C(na9KcN_w zU^FTN_c=UVX3gl47hDkHyuR-{DdP&XAsJK)-c&3ePnTwY@-OO{VHzXWUMK_mZUO8_ zVhv(+<@#DQEcKZ%K;(4H)nH(e10H-6Msj-b_?Wgox`Y1w{1M%cg}%AkGgo?F$zE-1 zoxBaw;-Hwndv))~>RYQ3a~pLKfh;ic3zim=F0!3N?sjpG%?a&)jpa1cAkig&<^36a z9iFt6WqeQWi(7uPqDucy+NavT`u!$pc#5E;9cRMg#xkhJGAy4>WW|^YeL;$l1tNe_ zmJ>|UoHWwSCx0bFJ_K`;bkXDMf~Tv2iFrk%x`|^&Oax=Nj8BUg@pv)WmGR@!Z!vu$ zs*2l)c}8pJ=*evY^sK=?Q|9w3dlXULc)y`w`|NGMek#((%fj8A zfv;%>HU`lPJov-G{}N5;J@*6ADih+QPz(g|Ozj8c!^M{9JlgQwxc5+uzzsiMG2CKd zajs+F`}oRTfSLdD#4G(DH^9qS(%i{Ills1fNV8)1;86JM2syufm{eY_HpgWtp7|}$ zeFRM_05$@t@13eo^=DS!_U&ygYijE9|5g)x()Rh?UdjjJD|`OX^;rK0g9zH#BoE^Q ztj^vN1;e*yK2|h`r6-EvawFtkyUR-e9yp8D6^x*yx-GwQ~Hf5e_MP0UAl{1>E^7Ac!oPs3z zc-x_^&mg&7g-{I94+#l~fu%E3y6d+y zdUaD~CNJ)rIe0YLeuG*6+tWjL5kEY1&{%kXCkr0u!qBT=F;3Vuk4QlVX%Rty7k$n&(w%l zuDmJy*_%}0P;*pjJunL-yA)Ko*R zV9f|6lOQxie1XIy-D@;uBAfFqU2U%xpHU9}XrI6NfuPQVFp&ajO2ZJF54t&MmPc$w zBFtpm@)gzO7N9e;tsd;4#@awGnz$G~PJ1XCkmeAEha?-q(XLZmd|nrG?(%wD=v?zn zr+>RnDJkxnyw+NhG2WIozm}^oS+B8JffC(Vh+j_BFQQPAb|0_*E{InKr3BYlo7~LX ziGXLH~S=;3gAZy$Y)~q1WQaRTb5Pn?rl>8 ztIKQYIi>a66pPg~mf0YNCdd)xhZ^~W55>NV>~-Jn*>ZNVaxJ5Biv!o6f%O=Upw1@kA9ufzpgKCE%@3IYO zK3<3R3qH>eM*JxGnNAhcwT7w}-)3GY`@6grUu{eOb7o+*DJ{v=cx$X{p~gY}YfG}d zqzt#w2*2}2l|Ve?`xtj~a_v>xr#C%bYoi%&;=X~yK-}8bm5G_9b=Ien+oe~pd&p7~ zB5wBt<@{Afw05kb*!~=K%iA<32Cuf~CEu57+PiIEF!Twcj#(0oW2h!4^e$->qcmxn zGQg_@tBy=>4*@M}yaB(VF_AZ=-X{NF*i2U?z`qS67t9TOS*BG$&*!ayeJ9uB==$E5 z*$~=~UK^UZO$nOeaRx6bpOp&SQ8Dy9SF+RwF9Cs3BoH{b%@DH{$uShI}Mjp zM;dRO5Z0%;sH6jF^E1lX$)@icw@<*A5iFR1VR0Iz1mutrywgzMCOv`1y=aTX~-byT`kxHE?+yroAbLfSmG0Lhoe1H#BSELKyDQK%^KEDR&B{42x+)x9)WR}v1n&8@t`tAnd-HzZESD9R_D!XS23*-Se~$%aFBw&p5a6adfFa*NvF??N7@4Frry#7*UJYOoGYy9B1%y z1yfNF2p1m(VS_?6F&?Gsyg3hqw>oRkWzP$Y)ucCZ+XNs2ZD#s(<%g+w42Yu!u4O2b z0hjjelQyLxpn3G>OK$pwk;5RJO(wvO+fDar$(SroUOB7ksb4*~K5n77 zF{(Jfd;5e;R-%@A@Y%tn-!dJ17`vQ~Hoq`BNwgLP&Z2Uw8~NtXvL~cesG=?fmUb@W zYoV)#$p=I@2erB94rapPXH=P5Z#d&82CWmLBP)aiHSmIL9wd7HTXpY;Xb986WecE4 zGR|agZU;|$;?Fg=!9XPu9B*ftCp7^)wg)w8h>tSe~7gYIFx&^ zl1|I(<$}m&CmdCZ2-qZ6AIPW)Z3r@X&JX%7#gkYAJj?*W4v*>Z2;f|u)mT85FNo_w zUA^gC;`$$zgaI7$vixSsl`4(MoJ?^8wSxW3hsW63`Jn{-OW9tZE592b?*4E;QQh`v z_}xADNl_R7&CVy+McAJ^0|$vhyT3w~yXO`3xp@UWTOG8UIILDK-w*I4qx5Yb@l%Iq8Eb&F?}%1wRsi;C&Br9X&dCJCjh zmeqqW6Z@_>z`xpe#CuKx4Te|Rg4>#{*Z8Ye0G?s}@%PZaaJ?Hr{ijjyj`VxuZSywo z<;N6Nb1}J7IygZr5y&Z#K?Dd~^!@nEOhn*B1Ta!OR->2+v3K$Pr!rI{;1_ux7w-?ir zF6wUG`@2<cwIknKWbANoVA#kiWGiTJr{XDFuVLir|h@^IMK!O(|z zLj$J>Mrh$tQzoot57aWXxltf%?NUPiv8od3pdcU7Ca>>C|9^CI)#fW%NEYf?(E!d# zKA)GEuwJV=m##RR*!uZ7a4cv}`Q87Ms%PTs zy{z8hq(z8znY8s4va0g!@W?~`I3 zlkd4kBxxQA4IYD-g~D+vHeooNXjE%S2Q(&NMQEnw>o@_Xl@$gCf*2lRC_lO1pq(mp z`9xj6SShPqKfbVcEno4d_c}rU5^%6fkggz>{-Y#HiNPJB8k+Ntj74Wh;^US+eOc~N zWydY^)?ezTckiB_?0HrEDs{`D@nB-9;N7m$ZoyyChO|es?)H1>RkM2eooWnTb8TaY zbCA_Ln&b|KZ>B>VV`8}b_#`G*aT)cMhG~o;nw0D8=yIt_0R-4ifW*Wi-^l69CM_dt z`@zQdaoiCQwv`^FthO{QTUX9 zB9Mlp6oku*Hc9B@FZeY0hd!{$%oFU(eVIb9KbyKLDQ#O(y8TGbtY)MsT+$m$<5tr~ z%tzj&;@|yT4aIASg*cifFQn=SDu`1=7X)TCSYNel*|zc}_ z+IvM7WCBk7i)gR)<$t$*PzJW`AIW(3M22iJL0qrbI9oY?jM14e0$5&aHA38S02sKe zkJT@`wShh0^>4cM$+@Qt3u?l!b-Q#o74`~z3XvoG4Ngc6*aBI$$t!DzixDKbFZdxn zOeiFGK%%!0fKlRO^G6#pF+~ zC;G4CiS-hH5x>aM7y1O!%d|JTYH}XAJLCs8*jE9OO@2|J&LCHy<~iLE%3#MvaEnZ8 zc(92Ui)t`FuCo|xycg2MsX+{`qIUEdIPCq;0BFLfCLv`Ig0Mg7(@*E(RP^?Sn-Nus*PW#}# zpG(FkWG;tSoK>%Mr!7(~%_n;%@d;TRyGR(wl6Kz5`89&l0r^o_`dj}c|8+Y6oOiLPc%8@U zryplVHxz~(V{1B-l8{_t^W&S{yhA!)b~p8n z@+Xz_g>psp_3WtPO;T!uFTTXUtZr*=iG%Hx>Yl-zV#?nCcv`W3Wx(-UVg)~+50J_$ z-T_Bw0fj%b(Q`+N&?y3+&8ARDAb9VLkx}zsa53S6_JqcrHLm6&N(4zqUc6N@tv)*Q zzx%*i$4JaDgdo33C{Qpe2_nYB*(C8zXA*2!zu6F*REvk9U0AKT#5}a#t%>u_kL63_n@2y_rKw(6sAe<1w#R+Wdzv;-dU#|c z5p+o2Mq1&TQ)tIXh8sf4qR2m^iFqYaJ2*t{b^hW@leX^NTiPUUZ7VYwHkId+S{H`W zreDWr3Me%(1YKh{A=to%V`v702vBSaba-`04W)z2s~v6zUq8)e(r*ueVvPacq+~&` zx2H*Bm)rK`oG%5^Q&Xd{G^E$i6gvTNh*d*rc}|Ijh^jTd1p&)y4x(YFT<4?#5)gA+x*TpR_0d}5MZQA8gi zl+4GW?4`)U*r8%&rPtPswYVa$>AlkrzNLM>AooCB4o0E5uYa;JD|97>BZ*`e{aZbn z$CCDRl|4=|u^s5MQ0zW8?Wp?JI(}Puxy$6!mhpcF{t@;^@$AEW{_(C3FW6%n2SUi@ zrbX3x8;6OTX+({CQI~yvB{^*LrV!F@A^U2=22w_Ml`JVUTVB?|5A^ z3dV^sP7!b?5hko#h14MC&QWYv`d3;x7@)V#`-8+qR?-}r+yXXx$fe|DwwM3(tfN|c; zrHK6?#E&49lD!2|K0+4gn5dC9V)#<35KBZ88;0Qe$$jhf^B`=}x6Dd^3I0kip7@*X zFd>N{%@|EwrZuD~s7A8?yaT}Z2tRW2^u3j}^~ULZBk z@@u4Nh8X8o#S%67AP7{$76orq&Ysng%z^_FBCaNICclhv!(EN5xe{{$mt;cwi`0SD zcLi>VNh3-`ED1OoS@SeC`tsniWv3urS%gu>)%S58|x(kWvl+{VW@&QS6 zm}F2O%;nayNxgp1q$Pw8MuVSq7F$D&G+|@{=DmV)bxXWfSH*1&D`VvNj0cB^{u9~tNd@cnv|(8>=rvWQo60KX1xR*c|pi?JeY8yPm+Y{ zR`$lQL4%DwC)=LcNaOIR_Pgg`jxN~~Lwl5|UhtxMw!sMEuwC&q>lFs+q_%Vn+7_CEB!{o%;BEKv4p|nTyIDsy^_*^c-D^ z9vS)5CChX2bc`p#P{xfBHPD#3>BrJPbksTHKlR`AMtm&;+%}^aLySX}(I^IGRzen^iPzWz$33_|lQ0j~GhoSg6?_sZM-`=>^A_9B6x5Yn&piDP z#Hu!ZQTn0kDAxesxDN@C z#%E!5^tCmr3gf$0n^ykgxNtyKG;?@m-dxqCyRCJq2iOH}_Rx(YA0w6^Tg-L$B+y+o z@IlQn!5|Z)&JzkCa=s3)mWq#O$j~VSPJyogksxZsY+ISXMW624f^wuSD!ukFAJ9%v zS0gv_y>+0H_IQn4zZ^>5rtI*R6Cgl+bRAHH&Z#=x(q@`&=vpND8?HX17gU1Ax39w~-}>A~8G0hECS3IVLD!6rFfq9lJ*(giU_<0AyCHX&~Nu zVP189rB8LiLSeCk$)u%Oj3uijnhrOl~tti=^j` zqjhg1`jv^=IYRMb$KV~&;28UE@ITG3htcmgXbH-r2;_*^zfGT^416GaAKiAYr@K3T z2wde?F6jb_*;f$$Sn{QhNkO6;bl!c~5-jmaBgXCKH4KxaSqtaD1%qr7Qy@%%&>~vQ z8OyBNMmTRm9?7*g09-IISMzrYui{ruDn*|$p2=$l;2p2`wYBz|1?eDWBS{JA4sB9x(lMd1Q=EVn$XPKsTv}P-obV9um{Iq1oaD) zZ^pH<*5vK`?DLR~WrHEO@3^0=Z`b@ z6htoOpD>2MR=ou1KXv~2W+~1b>z}Z&fF*Qv0szj!0v`9YkAtqxMVX?*vtkmS8yT<~ z8+C5i?T8M|y<2PD3DhFrfX}maX`7O(>e#)Ur+NzbuN!t7lxxHY$i@ZUzlq>7?7f$M zR<0W1V-6qV?HUl{&ZRTp(~-7vYGrS_s`T*M0Sm8H0Qh=Zdt`@y42HrP2a*H?KY893 zI+OtMk4k8sx>$a$kT36S0FLYgE~7Er)KgGB1hQFVPk{-mv1#!PaJj#ATU9#*=%6zn z&ky39V($UGdy4sS`Yr~4o3XV3Dh0|ATGu5ntkD^x%;W+pWx^8r=j3nG9F^>fS4uP#}B=4FZuWZZ9@L^J3 z;I-S-0hh{_YZl9k%kq_@8LM4!i&}3V=(e2cwNJrdWAkYOS}gvmj+!UBMEe?y62U0I zmXZP&Uv2V?YGu5ue)Yv#vudSl`*KC)=Oz8ovHyCHSOqerFR=mjlSVrd68bNcpEuj# z^q}bNy+R7lNynsmCoWj+3~m6Y4li)f!oA$GaiglFxj@83S_V5YNXEY7&0NOtky=Y< z!^p1eLAeah;?8+L;L_Bq1y^1?`JV*%ie3omX*h-#L!?3WWV~C|EQCX2V(iT^aGn+) zn?S0by$`GLj)@QthGYVq#ejSQ!*bWeHRJ`1<>avWjVK103KMGs#8tdwcXOHU7p|Q6 z{4uxtX*k#+ogfAAk zD-(I6A4|_E4OMaL3e~r?m7a@Tj|(~pLMZ;0C7%uSNtUsu1{65u2H>H@E%NiiBtDMxOFrqa~|ASszH zrp*BT-J7X_mA!56z1Ch{1PS(@Ro$1H4!+J?1ft{Up68R*rK~#IFLs6a9K^&ghLz96 z#4}J_Z=s*MWIWypx{L3`-#td~jkYq{MUEm8vYcbnl)hN~;N z9S9TBOCZi&Q{hz%7KQ~o?H%*|zz-ivAU`t*-r z1N_?XB}rVMP0ep-lYonu4EPsZ*NT{8#xU1a>}!)sGZmW|l~?&q_h z=fV+rld2&WgQR2byh&G(P@s3xCG#Zxau5|y6JIfk|7(|SFSb#`@?|`j04IT{-}~&! z)qlISbvmwxI>ueQqN%~{(yqI8!96xX!ri&+h}8W*u7AkF%en_`8gcB*Jl!7u`TqIO zJ1SMUP@pjOTF@+xcnhha#!#)?vj<+qgsZr5*>TTRw$VY^_MT-4Jn`mAN4#Yup|B9PDIm(8aZK&(hYo zAeGfv(e{>Y&YskvnzzuO(*mm?R_0*i5vC8i;^>hx=9R0nAmZDxdp&BsbM$ojyZN!T z10zq%0`oQIV(=xx9(iE`+fG0TG7P&18#;p*%R#U-I z<$7gG#-aKat?267E%xst*q1*<3*$}odGO6V-1t6mx2ETvn6G02yO?FB_Q7h*p(D{{ zNucab6R5Meg#7zQcX8OJ`}3Gb21@vx<65b)iJmPsTv0iXnsPsRrS;r9 zf_HN8Y2@M(2B>mxYw-5@^Va`sC>mDf^venl9FW_?Gu=w{(7aN1sZ; zni*Xi?JsRjbv>&?+^dP8iTW`B5+DaTLGmt7Pn;Z;k1{UA0NA}Hs5Cbcj4w10#=tZS zdObVYrK=18TZqEZsnY8}YGKH#g9e%((#Gy5Iy`tv_x1G^*-N zPCL83rEY8YL7NR*&2j>Mc^^fla&QpR5jsQ_QX#0wHou?-?zB?ZgRnAO)KCpY$BKW= z2j8uYgtU}=T+F%HuljNh+)jGimY-xSC^8fvDnD}2{1|3uG~f7=2nAEq#JN9s5UdSe2UI zjR~D_!d|kejryO7bvw|2`KWGG#SPAqUM~dgnCh5e`iR&cs z<2Ca0!2DgPrxU_w&%pwUu{T~#Bp{k}xA%b|?w(8;<_s+4BiKv$n+<=14)(J>#?J*b zA5yXO{;YGv(WTh2ghxQBJ`QXf({0ObGfk?gQBY{!wui)k^5OlY>ey3Y!M-z(^*kjU zBn7e7tbh)`uK1p~wY+WVv$o4_>;A3EoeL==OMieWC+=q;#16-hvM3}&w1GMd8oc2W zZY>9=Aw|@A%?QFt2$w|Gl1}2`k+)sxo*+t5RQY|1`yP^96-Vc&hwE`nqb8-%NE46% zG!H&r{tIXkz8`K~T%MR2Nj>$8^sUFInEvu`JN=$39#Pj=YM@^P92IDwxyJfR)CAxG zNCYWGbw>E9P*Mmk5+ihnjyxJp`*d*q;{1T4%1q(7-Vf@-pO;>q+U{X~YNNfo!A1(V z7EQWC)ZU1f1yUfgKJixQF?5M8fW1CZ9#wsFQ`%&#?p^D!O`GajS$OGWr(R!rYne1gQ4o=baWAMJ0*aqH< zm?OVKF_$AvqH7ToW(3j9B+t@?Pzb%2Ipk?My^b#|uXvqsjd{$p%p$cCM8dv*{%dz@ z$Ai11C{`amTJz*9_93Z;Hr~b14SE3CiWQ!+n>Dsy!0NW~8=fQ5S-`}xf zBLiu_gBRk)#wQ|iH-Ya)(B6zTwu}jw^($vHFnpN2ClzJ9l}TXoZL|8G>`kArHE&yP zTC!DLO|#$16f*Rty^AafLgrXhC!)biaJd)%8X#}aDY}#oMi)BcD$dRxDm&zu>`10u5aFiZB$vXnEbR@{eksZ-#_w*KNS&-r zUTIo?QNIcFCR zOXT~bfk_ayBYx4kmY%dM3YZVah|Jt10oVkNO*Q2tUI@lgCPA!sM$X07u+4@>t7Dm; zknkvcQCP~uQ`yK$Qm7V zs}YT&hLpphgx(6zr^@eM1&$f(%3`l#$Mj<(&x4&YWZ*@n`Ow7LRsvfw4Fdy1L}4U( z5G7ZGA{b?Y1`4y0jT?54xCaLDKYX}OZ4;9(R#y(Uu5(A8Ch}2wPOqa`Va8yVnuW0> zGnQi&i&OQ=7j5qkuZ{lD-_Ecc3mkk}Jg!G!-@lCs*x^^W0WmpBM11)Gpk+yv%FJGc zacZqZ(4Z4BvbMHy7)S1ZNHi(g&d}S@Fe@#R1ht3+1kif!(v$%tx0xTQaA| zTKI{Y+*Q-8@BZT0JLgk3wrt?-7)Z(;pPQ~|wqDSTmetw3ytQP?MRRfrD}GpDv1$+MA^$TW z*f~extAhgqm7}YL3nA>K8?+;4SPTh}Bw~rj_m@49_!0ONO95F^x0(-d!|0n}VLZqR z2SK51cPRi1MY_ijcTk)+O<-K*gJVNO#l2Nd6@8T3cStU>E!=JYSy=#Ewxy*})jc=W zr;IP{abJ4UCw5d`AE@Yh($n2rz$I|dMViE%Auets?tX0@vkF|p(8o_E+@^h{x5)=i zrH|D2dVQ_z`;a&D<-$w>2trRX@nkY?r)54f0*}zMNGObzy@2g1fFUvff$-(=v?E2r z6cxAi^Vj9PjM}shGcOZ1Ui=7^Qv!KFOM=UySW@x}dfsM*wSLX?`gVBjkIGegW!jQ+ z7|;$CJz)M(tp8ieFttd7M?i2OG)v0K%@Jb4CD_M&nn-&xG6t{x%oF7eVzD$x5IHHI zFsfV?sTR-9G=0yRsa!ia!#i5ze}Sr3aEpnZ@~OS&YNv_hQ8A6k@Fm)2ahKUCw&2%`&T53?VI!3xS*%;SBb$wf8+DVq6Sm1y;dYXmRk36ID7Q`Ga>Ty7hwwkycTQ zXNB&?xV515Rf{ymz`Ei5+HY-h{;eygW@HL^O&B>iYgYl#XIN$e6go8*<1F~8$QV_f zlkhnDhVJBE<;nESxW3VEmD@+oZLhzWI+F54vPlRqRYIX)rdds>bFCwrpG_e%8gq3B zVnjf}4;GG9Qzc*llV@&oA-Nuq+Q#>;R4CbP#$ZB2*l)nh+;m*8wx}zph;58Ks|jJ6 z#k6d;cslL1;syM_D{igRui7SWfTy;@n;kWK3adl!i8k8?m6n{aL$Dk@r-!sCghCjg z=8vNwgM2kHtjV!?8)A=Z(_615-)mx@vj%@|Ake?JD+m&+E;T!#8T4J$B9| z8gBBqq7yn}FwE*qFywdOa`+{d_4r!q8Di_?ExoVz7xgXbF0`X+*l<>Ls zY!ZH$e-(9v42)FS1+W%L*tF;w>nd&t$DEH|w?*lgL(+yJTI{n(CjtE9 zF=2w0L~#G^+`+LwE|CRKo3$=d+CDfIXRIgpDNdOm zUVT4VyZ1Z8VgYglsHkvhHr5_h*v=JfW8ffpI|#)W9L2L_6fEsbJ6L#8@%)*ZmoA-d ztyjF3_EwDJWu(p6*i+J&Bj%Z3$R^m@zoY1k6m#P`b59_2o7-t|`^Hhv9a6%T({{YU`2uoO1O8wIzQ4FGZ%;)K8tM9!fnsJFaOZoGGV$?xjgy$-1+T zzI2J_MKTZ*lYww+lQ>o^egZm+uy~wDffydb$3nwV#=>D6iTNXfw**2No0DVlP-nwV zzF(c5LC7%i|K#_%@Ij$v?~<={eGb(r>`bb|$){Kg^R zB_nj?L{p5p2u!x_jE8D*W)KR;;yZclmj)%mSrHHK4qIOkX#8eZBD1Or`aYyO`j_BnUXr0qTYr#kTV=*p4&J z#4XI(*xP7g^qpD_gN>fIV%VfmOah-==ELW6ho~Sr`(y13-~s9cAp+^~5-5kZftXjZ z*ZaLGO6|7ilWPhcOesa(_w|} z+P@BeIXGI9967Y*;-~AiNsWIKJh<$@_sx&{J$&md`Qe(S!D{9$4)l`q>=c`3e#}ph zDO7;U&%@%4P&5XFP{Lg!^9Y=HS3z!24kcSJ-=PC1#YOJy5r;yi^vlTav`qylX|Ud| z^w0l~(70-;e(j(%Bmyt%gb+>mW;o=|DcfS?LokNStTCX<1h~B5`kaMB@I&M6?trC2 zLX*r~&W}@z3S6E~pp3QL=V%?2a1T3!Pkd{5=V@x{`$@2Lk4O~u>bb0$=_I0yc3yXUt4UNJEL_{lYT z1Raivo7?wzQYpa-C$BQ9rw2Ex-ZoT8lZA_Odvr4 z7}E}`cD|wMO|~Sy>&LIRx^^*N=aQ>%LW;o9WlKQBK_L1DF0NdScnKN@o~cN*wSf3sG<;167${J$){i$Bx<|NsBo%seqX zr^TE%7E59dNhM~pIhI2{uk^|*<`BKwE0jWsVPJnr|~?RuSfz2^d|8cTDHJuU3dp>&mm82@I+BCS>D z7dCD?2$e>sy-QoP&sy@F+qJ69`j%VssVD7Sbn^82-GWc*hp*4fgnj%o$@>9uZFO@f z?ovbibzv_K;h6qia*k8!itz^P05e%L6)i-Jp*#pQ=BTdNmgEp(9+~lEeB4VP%V~I{ zMl9UN3rYAzE9omB;Xb2zJBIN?n4?9mBdhKp4E*EDebw{bX%zwikE~1M&(XgEd$*xL zgC;`IZa9+wSgnjl6+~M>#6kEHz=Ce7D6AW}q$WaZJ#ns;04JS{9%Th5&^f~do9=oY zYJLxr5Gd^puA+3d9F|CY|A~<#uZvGUVdWaZbx+K=V6n=5s48k-1Tt@_=cjG$GlPdc zGTc)o;Nda}_rt0e2rRk2dEv*xxYxn%J1T5cE7n%FEh7VP;(k0y{4RE1eWh|&$y7Zr z+q>mtW8Ww|km3??aPII`a(>|<>tF&n4N8)IB&-+Dfm12gIv;wM_F&=Pn!Z6Wj?Q{| z!*fu+pq1)sYM`&*jR272gqPWlI0ib*c6<&bu@@|qiIGbas@^ZlRasxFizoiN6X4V6 z)D$>-IAF3~8wuEv>jp|M2w&a6u$eX*e3L~q)P@mbF-e+hXl>+VS^&7HE{`fS7LR9y ztk$T?+DBhzDe>)6#nQ2TJ?ViTX$&H>v2dnWq|blOF6r8ctD;MWIDYq=697Ouy?*lT zJ!K}i4K6=f{ic^$R5OvW)bTn=LP+unO}hJ{^crR-YfH+N%M3TaP<*r57{|>>#A%2d zSld{Kt2-MaQl~e#xic|D&{Rbpv6Be#uC|NDEgC3P2bB-wP%NOiS|}Jt|KhsUsduy+ z@Z7BNv71}pcy$nMJr!HPxf0YY-$1U-Pa-AUFZTFp2e%JA_Q0Q;I)m2j=I72YX_R>6L{p*_6Sjh zItA*?bNlu2@izA$kL9l!OD4##Yic2Q!?4$*Gc6s?ZXozONrB-t0Ri;%?tO(Hg=)CQDdiccnmw}tiMl; z#vK%L`;Jot1|r{fD`3ypa(b!i{TT~Is%h0k(2xHyZyz6AT^Q^Abea4Qg(JYJL(aR9 z;G9BUUq{=u!0U=5s;ZjrUse+>GA2LOq%Eh-w(Ps>V!f49$tJ_E4(H*2>&QhAEV)2j z*!@h#is4X!c?b4_2*Edaznl^Zn(@iNwt7H7glu%f1frZspq5 zNA17Xe|YMTnoW5hcAI=^%on?(!Kupc%3u7ii#dizx< zhBqF3?LtRIGi>biCJC^z%4jZ91N>cr4qKDM%$C->PvEv>qijvOq6pcFUWbLdk^inN z4?gUBhiF?N$xH(3P??*+hQuRdFw_DQHPCU;vKxg=N<#Jla;ydsa@t_X8cQHHwq)87$y{!@u@z~-`w-wxe8%90aW7Dt(QCusSbFRB&xD<2wJ{22 zXWmT7mVQ(&>|Kp628q*jFAuiAGqXWDl8Br66M#<6y4nF1YE!kEF?d%4 zv!8kP`Vii8M5nSi@y)bS(LN7A!q2u1wvm{5RaE1EJjxnt8=#=!%j#LqTR5{*VweCC*dGJ+ zYsZKf_q4^{4AlvFbxr@s*S&N1RQieU-tDt5IQQw6-`V=c{h(DU>efY7$fTrmYwBYK zC4|@XxGrC0TAH%FuuTeH^ ztx~7^o)yJM6d396#J~w|yolJH26fO?lx0By+R*5*ddD+rwvmr8J(ien%7|D1(kLWqLPPG!Uq#f6ujcBiXW10pBWdEz>^6o`i>kfkh02JDF( z$PH9Xi?H+tPzVm?@}pz$u3I7R03t+(siUXWZXTwQVAy7ZSs@v7I>b1SgJV(AxBd)g z;BC>jBWQga%QhPMnDG3uA4`CatnXs_;vtXay3MMNcE!-Wmx}){b2aGX{ON6_k1kWA zCLgtt%&;XC@cuE3lF}#D4z_9%)A%5FbUut7OH=;p0qwJf8dCc)cM(C zVc<3dU%dec1;2QDwl4y-@b~`z#O#_G4mZ6> ze#_grBXkc~CbsCpjV!f6lb;Uic9mMzi*{9B;tI}TuxA%iEt=U^u%-LAl;b2DhLMPc z$0e-SN<+DVc<>Yj4sj`k3K0OMlIFs@NyPC}NfSDrUk_w{+@@&yGL@(@Tlyo5?2+ky z!;mH3sdLTlR~HCP+S6l=!2XT;0+MYWTXStPwuW_eHU#6o2)dSfGT(W0<0NOdHzR2@p>?)Us%17&?W^ zIRjPoAq+Cty9<2^e346$u19UrJlMo6dTcD(@>tktMXwisx(=dsBoKBN^cl^Ud5(UY z-F;HE`r^i1!R|Ehnd9;_LU2eF6$gaGA+9-q7CJ*SX8M30!ze`Ndztbf$z^r>i$i!^ z2wf&-`x*;O)I~HN517#ES$6IzLMfsFlh%L zE*)BJi!6^Ej|VaTLl9%U+tQ9Tw7*`nl^c^BKPAvduP=@7S2n5UQbCSsazo_y#Grji zA9fm=)m4r$99)0fYVB&Mw*F!=%;4MTGDA#{xnF)h)d$g-U~%Dvfu&a^L}0dqW7>w7 zKEGAI*ISrBQJl4udVXYXdaH#8Fov7z>_5APE+HKCmEcS3hRDDu8CsRy#|DlU(}A9N zkMznfnX37{%1xe=HOem@Kkj6GSG=3<4G1ls4f{KwdPCW%fT0K1W>T)`HZ+CVbwMWH zZcd`+J*Xjl?_sJP2aoHyD3m4PPRm_#fx3g|-DOJo9iI1|HbNqEsX z+$MuL$mW7*@c-4>h8VTD@u*q}VbY+?i!WD!4khx%l;AQV91YRBuHGU_d6+ltd zAQvtHrD27m(Rp3xFlb`)X*lWDeC!VOjwCJyW>DD>(OdQmg9Zdjd@amuFk}XKN8bv& zeV|Fg*TS!Ld_kh@+7sqZj5a*)zhj#wd1T32HPgO4btQ9a`;f!;rs=|>r26%OqH!Zi zn5(U^(-5C>4Z-u_BU+*1w*B?dxQh3!KUg3)GkZR3%JXD~e6NGW@rjKNkP!pv98N~C zVEEs0)vrJ|*R-IXSBD>knrG&q#qldy9fNbd6E~C_pT75>@ZM9F0NJ0}$Rzb*lQC9+ z)ZDC?nV&tndS10SU@>2uF;c9=P0Nm4pSgA(R+L>;)VeC< z`USWF0=^B9^K~K=qHnLa>n0VTO{4XSNKSio589avg7HRZFP?@*OvWM;EdM8ezViL4 z0yZZCmydNZ)utH~q6L@Y$bwu{bayBU^vJM6b~v4c1nGUDQ$9a7i0L(a|=KOfRTq2sL(508v*J|6Rf%6#Ag zU!Fg|qF=+)k(_Rd>ESV6JmaCqj@9N4Q#G@@l3GyWOV)w^5VoY2Y**~a8dH8`r!b^O_} zrj$op6CNcEQB%47lsYtO^i{f9R&V?FlPYD_V&}{DA1&2ekNzEE`zcJTK4lL#sWkXi z8^Qvug9a*=$=AXEqNRrOfz3>w;k{!ZqJ7jvbNB&%>-_Alhbz_TCmlhg{b=T$nmh-O zg<17KxsvsdvAbT8PQf%IU4J#gc|PWJAVbpFO!8}X#Q*xxKPBDrZeDFtg?6(;I7MmCm7!?Oieys5sZl$&t~6IIX% z9(uNs{cW=D`BR4{PBHgChs|g>4i5m}!%a79k`(J)+7C(*FXpT}>)Y_1q> z!P8x~a(8}zzb&%=Q>JodIjCLQ%_bXc#?T#wh^rQd7tWW0cRv_(LmX6>4hn4^;Q}_o z+Ax}*9Kr>Q!YH8$O&Fc5hJmR$>Y{0|j6239l*^i72rYvAht@Qb)+Af)0dBwpcGrjb zEY5l%)HZqzpg+4?mkd{546dZAG=Ro={^{HM8(Xhg*}D{(>Jy;mJ?mitWH7lFBcf30 zPR3#r{j;q$?PCsK7yeN)Rpb$6x5V+T3*=PBnP3osD|aZtP747bA7K&_Mdl==0xb%7HY3g)< zo~r*#MdX6d^u%6|bT4CdBI4V^rg~M;#k$N#{(5=!vDi@N#b!9}ygeYa~zeaX3`%D z_P)$?v^&Q*;74pJttw$|7q+x2Hf62eKaslHne}C0cYCI-9)^$61u`x?iNNe(N0rv` z*a8SfAX@BWn=ec44`nwLH>ZH>D*b&~S`?Mcp&uyGHL3i=cbNRRoJ2}-1YbEn#w`@U zhq6ia&*I66_>Ad)tBTf4ZhgB)0*|Bp8reP04@zUfz<>;pno!h~KOjzO!P-Po9S0Yj zU>!xs)xVxz=5SJ~TKVna_rCU}6YmXIs-|Q;J@;N}6V1xX{X&H0dqv%d@G8G9nqEiX zgf@|xZ2lvy8=!V87e9yjXJ*g#AFn8)5^(ca#tj z1mp6X$3VBnFt;-d26H@Zy=^4BD6rT?APw@bT22@kG)8FqdP=X)oeJBPpxar9W6Bf&bN2S|3 zbM&@qa1WYnw*}?YGY8ZyQc=mNEZ31A>~|go6Fc@* zZrxhspK83g_0zhDp1rg6R@cLXxl~|{Y^>we!Fqp~mLV8CkVVhXTty_Qvp3mQddL;# zP3r1o3u0RG!H`}{Ehiaq?lsq!;O(&j7XvZ@B|2A#A<+Yfd|tEHZMq}BU!;L(Ounv> z-;MkRzTh89&9#Px!@mZ@F;wF*NB}Z(v?als1z^f@VL1 zm)!JVz!P<^$;^Sn4^TlGy(xj$=QF=MqcW8zb>!^6?pj%`hqZ=3!M*jc&twXl-#R+AYpP+^G*IwKIs zkE{QRea5#h>*KH`O`yFCG%K5INH~s*H^a%MBpbtTZZh3!Z0LLnRG^=X7g1o&5ibMt z*=QaFC-Jmi!JGs;(I2I3$qrTo0Yp-_2%{T@m!9gSJ;?lP5qN?AnvbQ4$nY4-l*1F{ zo8^1)83etpIXqbsUfKoz7%r>_>Y-$!CBYnn3$`Og5W&LC5=34wRPfD)8HUkCY}8ts zmIf62RKW`m_E@vz@nTn@OU*WMvo+eCNGkjl4gx)g1dGrnb0S5K>QX|T#-WkFf3 zdI~@?I}=}trELHbJr~TAARNdM5Wz@9#18R|IUk?#L(_A94LBQmWe!G8x$CjUqMfTu z2{4YJ-izv_kX$zQ<<8mNcrx-eakaw}q)xvMSfr=FyS!V}+gl#Zi1^G+xzgC;3%O_! zo$tAL!vKTM00V*iZIFN_tVf}un3N(cX5c-jZY}33zKTJ@|As>GP_dx!@wm4>g-d*H z4eJZk*4V1~UB3ldUM>d688YR!sO~ir;{3sP)mb0gSKlNmUS`d{-MzH1duk&8zG!Fa z$7?C;eLIKVhy8M!R`w~ba{C?Rf)=N=NTdPYSvr1#0(39imk%l^Nn_1KG5YsXU3?U} zmdb*2Cz~Nex`rw!yrgD~7TEJcqJXyr#4ZcT1oYOwk>EoUmIW9_ezXuh+CAR9^wbal zAAZm311I}_`6U_&B6bczuxlR&DcrQt%Z`pC!!VfV1=EMxWY(JEPM#VL^jr{>SATUERi0#h@Gc!MG6a$Lb_`wmNPwfQ>R$|8(JSS2o=7rEvYYJ zw}TD}=LZ?9*+C-%{!hTAmjS+mtoYF!c*c<&e2d!6xRvm0#BE0*Ksyh5Y*BS&eN}58 zh*X`7R9J&Xg1l?5?ePyq)m>{F>nZkY&9-fLS!Ed4kkqq=6K?t&^y@L6WocC(cD-xu z7?6uW&RZZ}xG?&OUhl2B5_On|qSHYcnHvqL=*Mo>2#YG-e!%`0c(?SeH& z5y91PmmI=9+J)XtK@jB|!i_`N5l^FoXkgxQNe4p;! zp*X(~ylms3?A~sW=AP9C!qtU44q4mx?qfAY>=`2Wtrd%TW75!DL~jgIAx1xvUPi0) zSv;(pbQ~~q@c?{N1mOSu6d;9&RMh}w!-o6dDw*PuF!GYGRlWXrc!4cmZ>bsELVhG-&|ULMqtAY@74cx$zY zFag>?gUB$cl&YCNicSEn*=}7cq|FJ#g6yP>YfXUsE=nM>p!t6-=I;JH?ca2`=_rKM zaj7o!gu8T_aVic0=LcRh8a2xch6sIF3WJCk16C5-5ddNQcq}HdnKuUR6_?ew;=(m` z#sGWgatl5x1WtfC9aZ*BUKAeJ{^W=9{kr3BlhmZ`dsaauu<_(xlW??DOzz-+6hl z@=C_H|H$trv*>W%Fk-{LO2+cfZC`I&$l&2I1kP01l#QxgS=7EXv3W&(N(L@nUHZ1p z>6uu5|L;^(o(Wt*E0&Z)xENrPW-VsYcy45(*Cbc=HG)EAAWn+{V%orXzA|!_kT9M zcbjD_9Il&*Fe21_eqLtJc!kbW=c{iu&O=^*4n>(vc0)5X0J6`rk`vnh44;hz{#zE*t?W zAMl#@T+uS09fncf39uuj%X$BqXPwu0@E|nSDYkTP+wbe@4pSjMxt0f}MpAIkPwO@t z^BSmULBu*YE~tapm!ou}snG2v=xZ&AHeU{g1i>lXzz!mAA{v}8oXacxP=}76rTNvn zpJz{=-u4(9aclm9XlZF|Krd^(#Vm+eD1F-B40bupIcI&886LUex8M2?;S&;u3Df+q zQq>5BYpvJg*3nU{@cTJ`D*mYi5R6ujAAP%@cGGi)hk5aQbV0r4S<$+i4K`RDJBq;5 zxB+JM`Gbo8WWKIUJgMpHqK)2~*Nw142^HtIfVgqPpTyww{!hSxH#)z(@~^5U=;6iL zHAe|%jVB~Yw$at6s&OGwK|t_+Uz%~r9!`Nbou&nKeiflm<}Mv=!~08lAvjn6iMY)1 zW%-7cnTcY>{|xr%-9Hgmn85Ed_MIa0Njf_&I}KqFimS5!Y^$ zh=YG!Qg7*fcD-+MkADmzKn(Lj?6lNM$q=)4u7d#bI9!}GZ2zy=^EnAop=)d_k|ZeB z;}RUDGfnDTOb9@{w{Rh5EXZopXaFQy6+WC zOCf@LaGpyoS5SVc- zs5)e{ZXy`dpcd6IY&qLPzWWM)NYljr=wnyZ*?X}Ce%4J9G1t<2!qHu-_z#C`PS+CdyjqCDIx8?`=ZgQcfCNwBInNR z+*#k>(8aTN?h{;Q`#9>>?Y^DHjP(sb?R5pzE8uY;j{;A8jLCR{i>RG?tB^?;qA<2oaGVGmW^_8w5eZ>A?Sh4s#{Fh>HnuAoagd7d;w= z)rhD^0suJfa$SpNkA)L0>3Vwh#w_aJ6m<-Wt>Gg2V_yr~(e*C*5!^3Ayfj&yp^lh0 znxe8=j_Zv6hhb>*WVdF85!#mNs(uH(ka!! z)juO0+P@C|SQx8H?a{h*D+S=f{0QhvP87N{>W)e9nbyg-^F7K3Bi|!cq{!v5)QfpH z148#ubmP#XfG$g|VJVd(vozo|P)E~|!a}A5kAuj%tR!42R~XF$QI*mN`O4t*^h&p) zI#csDp>F3@yF*5^Es`V`!uVy{G0C4{L~Sl%778mUA5Xt3p9R^yT_bXzRke}Do2wT% z7h6-VJT)_T5Yg1|Vx5uq_}bDpd2T{&yy5GV5QA|o{0)Ko6HZ~Md)ILH2CrAt9JDsG zf!BsoBUEW(!nY9E&%&e#&Jn{aL>uTP0^TCtxEzfIgXRRdzRJa3Kjbr~XN(4*jx0M- zp{|U*1s2dbZjb!ts~x~~?*EQwBa*D8H^dC;q;n`Ey3F`IYa#&0xgjN^?)@9K!ci~A_M5W#)dp!5n59bdCL zRP%kcX6a##qUUK;*uKVX*el!mj{Z`bWY(~aE}{#4osQNr3hrGa7OXQ8)tU;r**;Hb z5jY^(wbE>MgLO2E`RDquw2e6jQ2AqNg=7eqUmueI*HvL0T1iudXy>T6}-s&%s^f58D&NRO9|$Oa8fyX2y*nm}a}30yWUm z+D^3WKnP6QUi*Tv@pPK5tSeB=gIEb%J_DR>fiO#r*HFi`lOhEuG^lY)=L>Sl#KU;+ ziF8DrFF*_s4m-?l@2{n6d6rj(;on>dZPKAz!l?JSz5L{*w3Nim850MP&6&S*BlCFX zUo~Hwju*uiOf!6{_6nR@W?DYm4f91;tHqjYkM3#3 z2Z6R+A+~|AJ#d!&3RpFR3(%OfwpRtKeT8=B z6Zw(M6^yy5{^PZrkVk=)q^Ix0=sZ$c4k~SNHe>#Kr-d^0v(WF-_?hniP#g1eS*&`p|H&2%1CHocu900?evP^Y+gm zP0as;!5}$P1J%77y}a3+QuSRZef@!)&!=J*msV8YEdYS?o5j+r%+Kx*h&K%9O5X-- z-cs&2S>*HP&Ztn=O#D)l8JbQB+*%-&oF=o#-j2Kw_YeZgc2F%M{20_^bencc)@{ik z3Td_HV`b~;!(cNe8z)5_mXPf)s?&ifJHOeAD}=;sM`tpJd>a%&!%Mmu{9v3PP^p)l zt02cdZuJCYzWJXAcw3X*AX1cIS0+e^NMrB8gt&;L96;#c^4a+ibUJ*i>nLQ&#$(xV5-Bf0)^j-OoHXV9gNM%IP7oEwDi{uTH0_0|B!)4m}3d zU7rtzQEYq^FUn1dh> z)-l6FWAjn02Eh0bKN~{!V)Oj0yRzN8Eg!LVc1cU_N4!Y;bUz)0C*=-Go5a;+)u-H% znaZ^3uaHM z!(egs2stCx(1AhyvKhsIo9`@;!kn@(lYhtyEuMO=M1lp|q@q0QX{txYBeClx_!8C~ z?@f%gK4PYx^SrxFCRMn3q=SRh!t2#dBlC-@_?qQCS+`T)d0Z&paOC5g2PH+b^iI+w6UO(2r+{86AoR)j$v>&%0kT&Ch^JJH#!t?@BuZgUA-OW_%k%-Wqskx zjHR=K9w!y&Rn-#23pX4_)^WxLJ;9z4vJmgzX$mLv+QBm%2+Fp+>tIIXYH#I+sPc~aT{q%O|j(FRp zZTveY(l3;CZS4TYSllfkHug+m^aPsG)BQFOk``)oa)ezvR60>-$DDWer52s_Qde`Q z!Kwd5p39o?JQq1T4P1cn?ukLVFDYtZ&I!db#7<=xFG3>>-Y84G4(9Fik&53`&sB4s zgWqpH$jAstHLkEv^=XLcVa3N4l@5_N%~G?OkIk5M2~vS&fv!m$@4e=X;Oiw2cflY@ z`Q+chHr|9~)fn%9KG;+$ z6(CN4z=b7P3SDLX$*6l5I#NBR9%%}@q5#;HDndj?JS`(#j$T(CGL}wt0(>hvW*Cvp z(Sd1BocEX@>!xAU3dTAuiKGJa91gCKO@=yTYs9fK_*oL{=&nY$8byV75TVgI9;|Pi z_biR7U)gz;xG8TxdT<6@N5ZQNt0^TFfo4whfkn^$;#KZX*+6loto=PG=&9G3T3A@G z^`YK&EH#o0#Ee3(xq7)MqI>%C($85}NrQf85c!|9D62V1m>f z%{2v_X)%_|#i{X<2k(!)2wKW&mrqqL?@`2MP07cszL1Os(az3XVmX8M2QHW|z!0rB zZF>D?vPR`#p?VSI{_uzF!ym?be|6IPyQ%+Hb~&zz67-4&<8&K%Qa23mK}bn31T#N- zarvFp0y1vnUJUNvd0Z$i$m*jPcVEriUpM-{d~4148VNdQCl}7OPM-RsG>{V$L(FqZ zH?HgFjfTJzx%X%1vsV7}X&;OH0W!xb#ZsmqVFY6khgX=37X{O;h=$n&HB&UONachB z7#803m}#xV3Nr);5tAg;+M%(!VXCQ);{jYA1bX@?G!b3Pc@Y;t6(Crh_15AwJ=w!l zo8|#6rnEK&ll=71NB6|y#Edf4T-JD`GU(xSs-jKY4eW8 zwAP-~ht;5UGj6zQ^eWdRl%frH6+92l;ra7Koe0mkG(}_ear^SURlP6wm%oP3?)zQ; zMrz9MACYnRU%RbvN_ftIlxpkhO<>O#Y>P_Z3I%Nt?RViAQ6LjgrAg;SE!(%^q6sIY z!s)^wkPDoaZ&nRwbtJ9?+|QWEm(Qo)?}HdL`+7+fnt;H_!0V|p;AIIKxUo`s@@3YK zH5Mzw#Zwxd#OkeTSN7d~@rm-FD7tNz11r@$ETz<6=Sn^I!UWo{=jMk{O7r6g6#1V( zSFOu&IuX>|VWJk3+7%3@IMASTxlOIFab72)K_9q8E`T^1fZ^X`$-Rasgr6RQlE9@)ih%^Rr8*EZj3c zwg1RfecKWV2!0biccf2(_ZTsBQ9Gjfb!>pxER-SAXUW5D!)X;S#e<$TH!_^EIup+X zjjW@$G^0wZ-Y|SQR%gILVBT9SNHDc2yVsL7pXIT7ChKc%;_BlA^M2PS#@7}VKIJFb z_EL6nn>4jcBbvfpOLdtz&^95t*gqm+OwRxdd=GnOn8rZ%?sMe!^5c(SZ?ES*{4Oh2 zDeeK)-xcNUc0%NeU1HGAV>ZRdzusS?#et9nyEBYw@n(+`m8x&Aiz8JIKZ;ZzPbh~6 zA1`_Y-Kg|mm;8!F@wbea)eXDN(~dBL`)#0&+(n#KVU4bnik4uM$sT=}6 z%Bn=eklh)GLrUP`HY;w#EtqP69HZ-5!t9dnW*X$pvxIqMq8YR;M?fdq8=IJ|!5io# z0hLlS>R{=mgk44${@SbAI*z-xthd|!JDux%tBm{S{AjbC+o$=l32-pnxB4H|rz5K2 zcGaDc)ykFr-JVatHv)3WtH7%&cC_RgFF)$lzI_gvuiK|IR{v5hEBnF9CAWAw_G)GD zo9FBHq~OYf?a-VE?}<~ST588-w9fxVGFC@=ES3V~=ao_i3(u#YNUptrHH$|_)t9(x z>(h;-$m6-OvA5Np3XA23S)a19K&E6`#w-f{C!ld#d2T?Iw+4A_eYh6NYZo3>P(< zVc)Tj*QjrYQ1#pbrGvOu7M;r z(eBnC9Zz2DGX{0wG-A4aAJNjN z7kQh`6~?Eym=n94jY(4M3u3{>R(>n>5M<|i(UEHe4ISTs;+pjb7%FVpVQDWxzf(_ z$3hJt-5*r$8JQnZjueCSxM8ART=m-hjI*!P+-^#Cm;_Y6wo<$|YwsEP`eJon^`oKY z-}t2&x!!%(ilRWU5_gpjqYF86&(4yWYTS#608e*x{iUE)PhLK?d8KPAP?C3zS(?}F zMKGLOu>!w@Ge-MQrrN{~oD4 zIimP*=jFs7^dJTjUz?v7Fxgob@9}WENBRQ*qtj?#ja(>O{nDz~lleYlwX5v~dV~G( zH+f}nobMF1<2}99*)Hk~-42XGiO zHO-~t>4i8g_NF9XM>0>sY44v(PXl>9 zHWDSE0~M+z_jBjro~WD2ZPWAr|E_n96f)E^ttYARw+Wa)7F`DAg$fbx7`71_Ash74 z2!;$|U9fE~EY^jw1gTrNK^G)NMu*$**klr@3g;lTP1oq0KzmmPwRZn=9#Afs+t*GM z1v^^%TcNZQ7>DPfyYwd=@55X=&xY-%Q^sk5(hV*(S#BdsQ%_VsRus!W*8yEwpVzc^ z6hCxNoNGg~*8SO!m!8&4Jbx7EZS;QZ&FqU@PHb05YL+J_G}7XePs`ox#T!%Oi(p0x z${P&@A0T$4?Y~1^7s2}ddk_$4T1^Kne_OaeX>Z&X+ELfCj`_3%Wh*6>3nna4oloR* zz4zpUE7Orn+NxJymiJ_StsWealKm~E$9^XO*dODUsKRIhg9mq$wi~XkZ7kU}atlRZBtmSbcFQtRsy~Y|}$o8S>2I2B`$NT`> zG7wG3126Bq7&sc_0M3he<7=Byf_#Q18Hlb#g*gO`kXt-AN*&6qV4X{W?l80PFbI2! zLF8wtX5nXr$1cauoXPNsQM;bK5$JOtf!YSBoOEI7>xkQQySCF~@T2t-1W@z3&rygV z0HB>5Bhzl6y3WEf9Ui(iK^QHYneoCILcO`-?s^#b%G62(Y78)njt)s128%dGhpw-! z)J<)JYh7FQTXe-Xma{Y+w*RIK$W_bInjbVzg4|xQcX{d>!O`eQ{y|8Zsa`4w2H|XYg zoopzSi_>uTrmZBdw?icEJaiBa}jcd!cqDvCe!2ewsT9c`EhGyz5Ya}x!yr|M( z44(fuJIctGTjcP!(yyUampeWCL+B3L1aHK~bJDGmMeZgJ+Si3y+ zM&)3Q!dcbyWw}9hTJPbi6}T+P=VSJLsXsFIw7fQ^>CJ|6|Dw`023szLYg&SR@9+9k zr`VMR!_TQAbgf(9R$m&QvwjpP4}%}03m{D%isVYiRj?hw2StWzhnuNu@ll8&Cs{J^ zA9o+rAX_5r;I0=HM)MvaCwh!@CJpXTC#Tx3cPjFEs1%Ke3r&= zilYG;2Wi7esOXtaUo27>j6-V?YeDt|SV-f5lTbGoX`VnpVYE*Qmv`4*pq#tl3LQ84 z_!(jb{u2{=)AIL=n{6W%e=CYrFBN-N{|jc2D*5NK&7LEz`#coyhpJyrzWsFn(5!h4 zaQS}8`q5eQLr;0e^Fxht)W$vYa?OWH`QV-BU2=v#E21}DPu3f~KAEW&TNVFiotEEQb#hOnyhTnEe)^p~Iykh0<&v=br%)5wZs!e3I57=l z2@T5rh2_NqCBelN5gZzS}*e{7?|QBx8DHf*`xB~ z4*+87yq?AMjg{8+FU6}T!2Ni|Co%JOjiT{MzD8y2)$o*vGoRWjHwMQWnuYWncBB|R z-C!3e(H9PNm5D;!qa(@)0-2k;jE9H{a}mMN5R6F8fKRWUYzjdT6UfnkOT!z{CYh1G z2iu8gX-F-xGl`-@?Fa>vE5L`+N*jj`>N}cRZD3C-WIx)#m8!?9_Edm!5CmW8B8Uq9@L{UVu=0b5E zevU*tb+%WtS0GNHvRNg4ee&*}){LJH1EzAXN`5|TW<(*4oOj6j3W9uy| z$kwDDj{!w(=^9RgBs+Fs{Kdj9PsLJ9)_;2(=A9@1t$Hagq;vV`3I_QgPKt3Vqxr#V z?=SQi2E9`;N90-e2d>mS7!Ck3M%^l={X)wVkQFf=YMGPLbQ9S;yHfhCN_kGlCB zB9;~vk_=ECytOSlRky;hCY(3g+l+blGFIngH5UgTp2?bOpG;J3_E^+gv9SQ(QdO!6 z8;>7}s*#>7C3xXXtDX$5sH>!UN{MQ2QE8^~TKzH=zicEQ`}clfl37wyM2PJ%TV|s! zlIk7&xIC|MfqRB@Xb%QeU|9+{U^r%4Jp!7cb<_e~FhVY{w8P-U(aCzFbImaLImfM+ z7O0=~;}Gi;IyNQ6#lY&YnlwkkXMlu&^qIRp4r-IY0w-EUQS=VxdM;enVa0NKgZw|5 z&ONM&J8%0lNeDw2!UQ9X5a>)mjTmWyNF!p+fkaTNiSo2*OKlQ7#BOSXWfiO2ju3{J z1Enff)LIhM>h<($6Wh0?t*s#;@m#_B?8YtKa?pxf*J^d$b+!6_>GQsSb6s47%=`}b z_r5>3%`X1&z73SC`x6UvG|v z>~O`c;4(s_Y9#EeL$GloXNy^~18E(>tR@m2rjWnN@}j+FSC9+Ya-RBjH`@BlS#6^$ z!{(08UX*XFYG>xm=_fi5^vY&+wxXZku#V*|xclp&kH6Xa%g#F|-n!QF*3T#Qz4f0H zzYV|t+Y^6-C+ES~<45~{8`%2KyscwruX#V;eBhHUn=_VwF&f;&jGwD}vZ6}8dQ8|$ zSo5y(C>QEENKX4@<^7xR_R0a&|K!8-Pv6e{`ddrk`dXJr40S%vsZ;i>>LJwHd9Ur; z^vkcW{g(N}Z|fdkTK3@2Z@)SEkGVPf&%AMcrRR+qjs5X+`-REz9XQ9Mt3Rp7jCh73 z8$sHTRC8?!#}P@vM7{vkL5|w8_AEMEp3@&xbl%z!J@C}WXW!ns`oI%=AK!j(|AWW> z{r01e9^Yy?F}C1OcQ!p<_{76WkFV}~d~e>94=zss=KlFRmp|D2v{UoZinW7FS6|Iu z_^ojUU<0*%b*Vg+uyavRj96resI_iMlv4s!-BFe?I(S?US~Yl!!`IbG*jUuCZ5}SN zs6>R=T!)$_P(Q}5Mpu_K&4>}*yku{PUcY0sgVYn?3EN<=ts+mw1w`0>G~D>%Q8L!5 zI=A&2B+UNbqfo#Rhx%llEQU@?1vaR@55UPfcXZI~qFq4(OgTIRVFpDv3BsqB<$4jX zl!2(R1^fr$q>k{niV!%emXr%)zLzLU><6F@#*zXZ@u!}U$$Ov`x|&tZ~xE7?>+g})vIS;e)Il~ z?~bp$c7IQ1?C0ZW^zWXLY|2{A={(*z){a`ecAn+4A}v&)Lea12S(p($et6~ndvBeF z3ft!6Bb9%z{b&i|({AHb4<54=$Cn6GsiP-P-oE*3&cp8(T>bIiKmPkae_8qTo7L|c zuX)bS)~=Rjy%!Dt_-th8 zJ$f9QN-QjJLQ&?^Hz&Oegq+(tn9F|q`8Nk%+dB2-$A5n~koo>s$LGK1UK%L$>_1b| z`NouQ7vDM~S-wqR8on}P?G5>kSL^zX^1sSbB#xyU$rP{!Kpa=6%FRu8DL_NyHYQ~T zWgUvn?PJMm?u)!yPJn{I(OdYS04075u^)o)BZFwBs;2ueNGc$^WROBZ3;(B1`sj>|*#@`+?Eh)|^sL17L&mY7fnjFqKm5j9E6v|MkQp=ET^R|NMRW&CZg6{P!x(91uPC=c0=8_9`Wh3_}0I zAj63$Bq?P6q-rbzrIx_wj9RTi&TRlj-5nq_}0 zf8xic{hv?2@?XWim2B5dXZGA57ROf88&1_!Q#Ge{;|uF+cX^@V5U~5oI#Gt1j31yi zlfJ|u3p7)Q#S9F=A|(g}HgVeinY=i|a5)Lyld8-RkU8ymdZ9SR?_DSF&f<)vxopTY z$587y8MR;uY3WSb9SD4(Kewbr&}78+0cQT^f6hGd7T5>tft;RWP^zKl@Czg*f^pSm z_}&YVvTUeVQ;VPKSKKMK^+4D<+JfvW!iVh+1X1}0!gdJ`Xt491sctVCm5MDx==?}| zn%Hl(i&M5`$eK}2S;e!>O0idZBcRyTKj8LTAhi7{y=1`5+}OT+cCF*@+MT>N2!vJh0i-abb6rXcwD9%MZa+sD52Ar4q*dvr@f<&xqfzxLi+7)Yrf)gf zeov*yUABgIx%b$H_eRb{j_zOLUar2nv97-}1;)eOy!@OX*t4rR`kcaA3dO#!^(8nQ z*H^eV?+jq{`z>y7SB=S)agt>Q$Te7fEw1Yr6j&Ax5b6 z5olh5CxtLH5fA`WyJp(Reo&3`qt)t0F*}Yy517`$3oD{hd2SJd!0w+HXfQKP1LLD) zRO?C+``d$vwb9L*m3$FDvD1j)apSt@O+v5E;LLsw+0o^bW{vb6VrQHB4`xm4%!_%J zPw!$zmu^~GemvOY=5i}y9-9~$**-HP%OX=dDrJ>*4O_wO_3QM1_q^o?)@l9yTlao_ z!#{OOZppT^nf!CESHE1ss{2=s8K>-+|NLu@hTgid<W0F!Cjjl^CK5?6Jcrk;nd;aN7^n87wofi9 z)$azvJL>ADcd5u=?~0oKikhn)n@N1=Se9es(XetOoKcTmB%8z7u%fO6u`nSbhvnD? zi6DYm(!f(I^s-^bxf-~3bncuNtI$3fz)o8fC2X9-Az>QZh&!=4ZzJl}2)XAB-{rO0 zdC(>on$}Bh!_ydYcvO>w3-$jJ)_x!HuRaEYe_NsY{AA$M)HAljHat!{#5v93Mp!r5 zp@9x?p#ec7&X=(1OgfT;foCtJh@g~MszwnhX%%^vgfPrNP`(ia_2@Agn2u=wq&{pE zd1-wm5ubA!(UbuVv#@hYGPq9Gxs9$+Giu#jdDgfr@^jgSFE4GYnB^($sr~Fq-R8Wn zcYK$~-&bN-xG=`pXmtcw9`v-?>p{!f`lp9iPfUIJ4O1D_vG??3qDr@Z?fLfoy2C+J zR%^{JFl2rOrn(0U-vVge`~_nd8lU#4uKmy1ed51(moF@uJa!NXU~MLqFQ{OV8p0x$ zG9;g9wUg<{pqW95XwY7kJyKMJHcPWme#d(4;>9_Ims=yN%&)(9FnCGi_Z;aFAFmZG zlrF`33X2aClY7`z)r7T|@kY$qb2>Q@@KEp-(Y=fI&=zq!s#a{TmubV{<>ZJ>w%)ya z$_CSoKH5MVgAt+vKkxVXa|p6-wv3;h%?pUZg16y{f7<*!4|zfg2FWh z5&n4p&6WQeo3PaX&ker>dmf%vmUKsI7o>nQ2o~>!&=9T?0y8ZVY(437J#mp z)XGA+Fa``DJQahJuvzSbKq}STo1`EJ0Bt4eLU&x_N^N^}qbL!#l5ohN*UQDQWeZL(d-T?QKVURJI&o#|)~1(!J%Vp`%plvR_F$YeW~IZj zL0R|w>B@b7IsfvlkGI}^^3mt7eRD74-tL(%sb0DnEmJMF3DN zmkdAyyjtFDQoN{bkdYj8f_aZ`3ufU|9;ID}gV<1TR(+d$CPxCMe*9gLzC4V(H)AD#fi6v!LS--XCCmyVe z8i>Fgnn=3-pUaa@>Mf^scW<+-g9=AuovWR0I<+J_&u{tAmEg*tKXV9H-@I1To0lRU z5w={0nTtu)PgF9uZb3rcB3XK%A*}GV`wgL^tETDEIXq7~u+F@}CIdt;$Ef}gngbo< zbHMX8wjIkr_bwV_WgVh3S6pc?dL(Pcx(9IrCY&3Udc;Td{)zcZg=z$G?pssCZs z115?&lx#szc8q0GHBIKCRxA&O-38i{P)~gKT>ts)BX)H!;r;$YSEp_D7}6rOaJ3j9 z!u$K|_Gwl!I)|4V8!!rOJz3p^f7E5#B`rJP9ql`{L_4+X`LyoY+m>i~&lk;28yb8) zd(NV1&WhYE&a{evtp7}BjXx!;$1cZ3JO=l;d7FI`fr zOl8ya)Z!k!>^a{btFT!*qBHZt*mq|a+=UGCUmnkV|3TvI{a^Qa=S>%wP7PP9JF3(J zy|u#Ji?RdINb_872$6a6ym?VfFpGGW*GQ&jPNtD+>y)Uqz6pv`l*OI%U%wi? zm<;U4=YCHpc6mLEIg-I%DV%YRO6qV$aq#d|{4}e0WmlqG!mpO(ZF0Zbe>#pBBSF-N zElgL3$>vnJnRx?rMAmIbnXYWnE>@KmM3z&lsIqH2opi%d#HfE52wZZFTFVf8iM`} z@b^0vyJpR_?XxJJ!>j)+`}}g#-VRf@R^3zi+O;2MzIA%R{nodBd)##A{Kp60UiR$L zp|qE7G|t$Ve4f^>`|j%Hj_=LU>{GqG#U~R6)H+7JF;J9(^GQywZVx?gJ?8he1#gS} z)AQym3N?i1%D%dLjy)EidU^JywXKyhxf;{m)UTX2NhD}>3qDA{R+2zZRdhAaX5vTA z6>(Ks&L4IRGyVZ^|JGR!bDT{u!!R<+Ml6&5uqJA`WUgpNa}vXW`UXYTZJ(}8+_{(V@zA;%7M<&ZE(uHV?YH-CmwEgtpXkNyuP#NtB>ii_ zmkRA5XCOWPLRAOc%mBXlwXEd@h{tF`YO z#h-IEG%Z<bZ4wkNq-VxYA8c`!Za2wacx74;_I7pF zXN@TLm8YM+bMwJ{@0&m0AAI6Wkh=9sd9`y}vszKU=Z9^vqA6v_s!R}c7MytS#eyrp z{Ab&;6Yu<7sc)Qdx0Jq8^7;;^UgUu=cz#eOPOe$FSj2M)!LtcdwqZg;=GOoxBS}cj zu4&u2msLj*b!+e4C3||6aM)t;$NwCZYhJU zB619E3Kw0Rp@D`@ciu2&#e{|K5k(QA+f(Pj*(7FT^fHS{9Fxj8lFmuv8n-t?X5mJI zrb`_`Mj_^-)57$WcrR*9L-`HpyetLf&O1ny@7x{iMe#5Gee)WmL`Em@E^{vArK&J^ z7CijswcpOY z|DRj$oOx;E^vxaPdi1Jx?NhB&c>#BUMO0o{XXBqdbZ4b$t*t$gAG&JSXxoon^?h5F_D9#+U8e~##G>`_!)K$= znGIrj9Kws+jEK$?Od>J?+z1B4Z7ubM^1n8U+7&LM8Ea*v5%`z+z5Zr8V0U0xR5y-r zyA{nQkuQrSwB%CB!NJu%GVNi`0MQme1JC5-Wqo#?GqAdc@%n9NHCrG2{)WLh^WJ~? zjFEHB6ak?qbJ_9MunOmBl^rdBbxx5B`$}=6SSvOxbJ1+NEZ68tlR&dz1JqpQ6iE1= zWC=jtu+{se0{alOkelRDMcpd5LK4qUz`Za)3VK7A$E#oY zY*kfobCK8+v(2{uU94+oN@mVlvRZR$a&Ybk9FA}&T0N#QH8~~aTBR82Fk?V7-TU~# zTmF$)>OW-SX(bFZZ{9edqcIW2gUk zs;F@=eQ>U>k=FUJ6qH$q`(>lh-`=}IhT`@*SAE>vR;00)tClS$p=C|tjp zjm=KiOCn_18EZW;Nk)+YQr*$9YTBYy(ul}Q%6;v(-uvaw8~>X5^@L`k5ZsO|pK$<5 zs_=Y2Drkd7D0QJc->73Li62=8hHI-VSIG6X2iiFOoJ#mvZhD|gl8yXfDK8B{bK|yZ zPGlIdm$@1WU9?rK;JH|ATaCx)=DTQdU#WQSfkvS2ST98u5rzxBbwtla^mNG7wW@r_ zUe}#3XGbQ~S=*c?UDxgNTLl->~r<&Qg)v4^5^H?020E-^$~awnE8!mJQu-d6b{m2 zcI(JVD!DMvM);*Jzn(xWbq+~CrRA1&#)Dxjm?EerYI+#IP3HnY1h%CqrHOd8nk<*3 zB#Rc20!)jywsqqPCsZ=1e6;vVi0+@QmSy*l!ch8U49%+dZ(yYKxef<*XtD1350XEf zS#(xySzeTq){Y;?ul@9|2c0VcH}S*I0avqv z?y6x!96=1#dS;a+I<|*KuZkslx3h1bbog4^E%N=g$R6rEjL@w`@X?bl6pDihyRCsAh_3{~6gf&0F ziwm9P;cuZBH;h=bSUyH`ATj?+@dX)ZV=k)>EMmwPQ+(dEDN!wt$P^G#HO&UwJc&~GZmB#1ZE7;klzwa8 zSV>+UwQKf|_a{;iAZx9C*_x>lr#K`$kgGYKAj|=(dWdLjRN+F1?3@JfzhdA$iN)hw zd*woKrF@PHW$UrAXi`+g<*CEZ96}1gpIyPyl6zHRV?D-i2;GZ zN9ghrh}?n9GqbN(wvn{<+Qj)S*vy*Mt#hBB^poTbv+UrpxOca->vDXfl!l0zT=k9 zBAa)QaAP?d7_Pj;dJ`HH0rcUldy2WfpjiuPm+eIal`v z9OsDfQyp`jd!-sp#1%X%ZVl7X`6{f@0iuMpfr~U_)~g|GcBeNGC+2t;k$AXiMB~K! z=xkIg$};P4t5}EWQ9WUu8fon-GKv#Yhup)OA}J1;etD$)xo$I=f~Y~%m~6uRC8__u zmot~3B2AVuUj~+k@EO|EhuO$VMTY%5!iqiB98QI0*y4yN)PNs@CqQqX$|O98jvaocw5e&;zFWsH<}cp!#i&)kIW!WeC$ssRH?mZJc>+oB)%AsC{fXH= zw(Z)Q*D?$K#m04n@w?^Lx@q6L)4od@Id6AG4LdiNzxd7LcNScE?Y9{(|K~r`4{W)f zK}k|y*NfP-cY~*U%&%wMAU%DtP#8_zL1qUr1EiNDy@O4O)^Wz!b_~1KO}^j@nIbQW zQ|lG{UM#O|(lVE_*3vS!mTjLO6A2T0YKr|cH+5LKZtDtB9;KF1<&|Yo1iXN^hxeu< zA~q2~=Lur=x<=^e_UjcmSzhedCzGRnD*JI_r{G2aHCFxv^yZM&RS+TaS{TG;!ZL69 zGPsEEDYB)hfL#^1OgKSNHoN@=8FtVRJs{A&Xu-e-v3wn_agb8G1G^(mcapQnm`UE=6*-EctBfuWvl8dFx--9t9r%{ruYx$00HN-*;|)yJDBowCl>M zu<`>hJ#7<72)zMR=Tz&pjA3T=rovpc7x%i1O{ zwiapE(cAVbDpHh!caDDOK$q{YoLZ*!$DK1EhQR2Wp!Q%l&BI#T0<>UElNpyHWy4x- zrzOJ4ZH<|WTF?<26To&`6f^Z>+r2T)o>lf0s6xQXE4meqVhc!r9*w!g@ocuCA)HYQ zm*|2$yqh6)m~K{NA>;N4>d9C$wQ_p+JFX}YYj7$zLxi{n z8}`u=o@9zOO-FZgDK&Y|d9pn!@v)iaOb*MH~ZaBz1^MZRU+#et7GH*B<@+_`M(hlXKz1-T!*}>Eknv9i59z4YIkw zV_1Hp^zzg${E3s(KZf+p2fs~v|H14>UC^xY=4bD&JuUibC-39g`<>-OBUgnRjtw3n zsm974sPl+%9j?6KRK$T(5r$LABRTMw=3J0P2M`nJBH{sLPfd5UmSYtF5+`NPoJ}Uj z-yJ#&I(dg(sNpSsCdDO^eP;#(JAlkwmlk^7Ss-F(f0sF&WEKf5)}X1fyRB^s2}&{bIu{h(AhkZYCiA5nwN>3?hcj1R4vXm& zxl*~HJ}eS?^p*9!zxpWG>Oq+ni7CrG(#p^mi^B@Xw04EWg3{+|J@^zkiWH~RmiNcY zYm{SYp8#=Tf`om2!p%~;#TaRtGqW{3BC8Y+j4N3DdJ+*03vUfGvnY&dD4p&$Us zUnag4MP?u5QsTXxpcGv#kfirqG*9Xt)r>`DhTgMR66-&z^!C`q+tVRIe|n&LR|XU1 zMyOYcVaO1!cB>R`*B!loYujs&6pybzo;YY!EO>P1*V%8j{^j$vhihIs5V>@E<>8UP#jAN;7_BMp81so*E$-DAjh^4`fgY;A;z;iNWxD^@+kWFM> zzIEIR8Fh!a0O#fk$D&Ns$t0)EbyJe~Z~$zlqlhpRcC{P!bh+Vp6i4)oO=i*U6zj*C zB^!=7K53n6dPTlv+>Qgrb{BU^3ICZ=d&y^wNpewrz~#RpTrT_paM94q@wzcQV zb_1H(Y$E@#W38Aa|60qb>|s)KhH1vkYl7lk6z~xNv{WYs2f=M==1lt z-g*DgFRwlN;QgjMC$>HSAKAXw9xl0maqZ>@rxw?-6=$5vwJV1%g?m4(+}EzCg-COz zH-y>>-LctGr2F`ke;zA87PY_Ynp~G%#51Pb?8WD z9fXIh4fV)?*|YZbtZZanB`=J&P0!V#;94*uE-Tz@MidjkS*}_Mc4e!YEQ45_UMH_4 zzg9$tH7lMck-qRCQqO4Nrq?EwcPrssXvLPfkVO5`Y(V}gvQf(I571FxpbkJY;uhL6 zs3Y0*!>gJ6f>)x3L$?>a)wU@Ql*f?l9;?7}nm~9d&yc!A-O$S0g62ufs*ub-ybu*; zz6QFRtsV(&KA2Rjm#Z(Cc{fH{HS)@cb73;Z8E*fY_QVT3)8Akye&(hdFzzqIuTH5+ z>SW~-|1H;A%ss!6)S2b?2EwVmNKZJXqa7br4vq(sElhrf6_Fzr>7LUAh+*63YfB^p zj2~uL`3fCxCs;Db*;Pq14yp!By87(6#qo(he)zd>{(bAGwZCQm_}0F+ettafapLi} zcjEg_?kk_UMOA_QERcBNYECnQ&WOe3Un_A9 za&O!UsbHhw3@bmr*yN23%!X>yf$sFBnOHX}fdq~7Td~EIT^Chp~l(90?dNMJk^!2M#Y+1P9i}oS@=^ z7gY?I>y<3!na>O+$DIy&=>hdg#a%_DB@afgtLp(R27rQ7OMKnyE?bJdqf>0U`YE}9 zLjnk6%)B{h8mmd})RtL#mOXa=TE?Vls(8)hcUFg^`l3 zQYEkC!9ovfi4LYl8AL{yju3u*p`0CI&1DhY$rh-FRyx#ujPeUVC&aMKd@)oi25CGT zSoeJW4BxBAvwR@E_9k1LcS9IeKCHMg(%y=KSa9T7+p)`1J5m;&+VV z0#~SuSC4^Kkr<^8pdTl>awN*f0AFLR9Mh6EZj|6dCBwc>3Yg$Jhgj-x(VrXxU~e{j zAdu12r1o|tNS$n-%#})W9E#JR<79f+5z^!{vWx8Q=kbw z(e7svk^%>77{b>)vK2l|{F54=wh|82F)rTcgj(5(Tph-Z7+u#!+R^pyRQ=dC6)a=! zDT|SX$?*XAK;dKRm{-3fV{j;vWW(i|-=N@|>)_#lFqPW(L4!2|h1EVvzALNP#K32}(H&+){xAsj5FhYU*$ev_cP%U>PM4fQANYaMBP@LZn~| z(b@lwsOJ3SW4+5?Uma+i-tjYb>L_O1z_~6wjlQ?Nx>!5u*;g!j$*J7|S+s>FbK3n7 z9dn{6Qqn9_mu)1$hBZr=TIMo0$x2+9o)l`uRFz0g=D^%B=s(0Deg2Ewv>>vtU+LDP zEtrN!7N09}jAfM`OisMp`b=S=SjR1|f_qYhmej%-6~S{t=Tp*J#?EktIo(*SHFfYA zJvpFsh;^#6Y&2UVqq#BduCC{+68u6{w`rC9xl^tF zcOnG&ZAXOtNxI}&-i&FJGfpdu4V(VjK&;Hp-)?S@)hK0)>Pt6k)Gc4w+z2I{2h|y9 ziVKa#r8sChJe0rUXid3x#JaE$Tw5GGCr?V|*dS=uJ5j{7M%+`1OIOTz0r9ZUa2BC3 z(QnJQ+SMj8z0H`Gz8t``+D6FW$XG?4*m=@9Zf8W=Fe*Itp+sPmdjobwCj@K#$VA4T z_UH+JG*3995u<#&d&Gjl(vTaE{m_x$=J$pySrFXE%WJSa9m6GQ+=C^omKQj@U*CJ; z77RUqAITiB4gq<7Z;{F}2(^;UH0p4VYZz68@?6vK#zH2Hj(~nh0-*Jjtc6B$!QAbb z=*WZ217ZhPR!{v!or$#7kHfSGU`TsvOic{sVf8RwGh$euC^u6w-=Ufqu1Miv2_2?5 z>*U4GXA=-1$Q__g$?Y}L|utL&@OqWw4F@UEGr0jPgfJ*CAVJUmTFiTNtZ6))(QuGrjOAYhE* z-L^yU?i+z!q7)m4CSn=VyHq!tqnL~J7|gry%K(tnlIPt)*fCo2-U+b zi&{q#{UELNGV`%;8>b+`fuX?87N*Zhjwm}22BNnqW!WiYUMtXbN$_gC-za!!)v9 zmu-v?_(G=ZMUHDScFP6J=4F{jQAb)c^V>2|t1LR&4(1}4p^aEVzx=fF2>6zch+d3_I2F!7 z9^KdL&Pk}m( z66`zEkLigi8${2lc@X)5u#iQCzba-Wpq6B=XL35xl~+IbW}+ajX=0jk{!S56hwDyG zn$KGZ)#g?LswB5G5hX}@m6ZoAQ&okS$P*F?P{VBwA}LT4{y-^$$v7@)1la@+2UaL{ zT0d=cC5++$Lr1|2uz$s91bZivyBN_`_KY)qR`4}iklq@L0#B7gle^i`A;43V&ENyd zg;%OPI-x%q)#+sdQwI%}@*-7w8F5-y-4H(11<>QNW5KL;fraNV4YScnNf||>=Pn|uD}kr z4cc2|l?*AQ!Ms_yVjID4I61p2#dU1ZD$YT)E@Vn+(-Dju-p+T~l5mgBM|grkE55|L zZ?^^eX%!&2lbA+K?NAE<*BU5V&DEf!nBm7`&)zt5P7VpgFEK-*7 z>0u7I$McYoNG&TrlVab6aFFtnTrCg`v|`PwUHVuUXm}%0Q0`a)E@>1`ZLUvi&%lhe z{VkRrhuZSxs#8b`cAHwERExVh6UK=3wlC2-Ju35Q>^NlP)k$K+MnZv&3isy**NJps zI{dR);tzP0?mh&~E<|*o*R&jEXqSFcal#@FrnZruSkUB}5BrfaY7iASJJctwd))Xo z+U++g4iXxM{A({6=`GX#-mvjt;=8!l#IO(|Iu#uxz~rgR)vBrx zW)u=+5fQHu>q!UdPlVZfdJzcf*?xp8ZbiuIiGm&zskIjy;N;&Fw2Bek;4P>C?6o`U z@YZ*Z%5R)d`3(bu&(yW2V0^E$gb4l;T9Exp(lW~GE3 zpi5Y-d?kswI~Zl1+dxMtVGyIiQz*cC$sKSOVhS5SeO}ZGt=n`*s8`8gh(DU5MWZ|L z0K?&!LEI7dU;`i<1Tmy7NY#LpRzBRG3c78pD0e_PK~#78z*T5#2&q!#u3q zC!|_O7==#qoClTzM&UkpkYwB0v-*13y#XuUJ$IYh=k0GnH@P_MPUM12Qcwk#88VtC zzV(j@HtvM>dcWAvhQ3`RxD|vbI!lx11dOGa4ICfUn(+}?L8RTN5^!_1E@x5!c8D-y zRUz8Uc$BcAX!nLBM&U}Pfu>xxLNPMG62=#C;}90=Rlw|A1Mo(FJV1Acu^ia0&@(V* z=ZLq_PAsNR65tEjJF5+bG$fMQOoXsBT*^ZO3Qie2uiPi>!4Qj@R4bbcb?mwA^?8d2 zr}d)xRl7WXgK|ek&e9{e#IMXAYuszmlL*XT;7NhXhuUl)6CIFgQKXM(M^IeH0|o*w z5(?1H5m-iymE#(524h2WjL;RBBSMh!QeHPOfniiZ@Je6G%|k14{rap^3SL_n;Dg%a za`pKu?JelAtcu8yHjp|d#SIpR0g(^Jg{m9iMv(2wm=?Z&vke#oi+-;i*}HZqmM;}? zhhkLoQ!WKHBWehcL7f~gRQW>o57(vX!6?mx!Zj6z$z0IbUf){}P~yWI$O8>#7;^k! zSU_&7R8&+E`CAB0Bp`xA1x^gxus)(~?fyED>=ae-!3pvhtqoh%qKH%&vSZ^Q_LT1) z)yQ%o&mjdIl?f?}pap6~y)bVou(Mjtzzu3ON1Q5${pK-it&fcs9jq2-x%53f`&X#n zJ<}P`{{7R&bsc9s)u$3usP0wImL44IUY8adkPU10l^}t!&30VJ@WpwNx-a%%*cRfc zS58soVA<4`c`S8mB7uPL08g*_RFM@n!iov;@RiSMt1^QMA5!44jS1_Cr`EjSO3ECk zTA;d-AS`ja;*0@h8(^(V1i>P`x8EQ#h;V~L)KODW1s8#QD<{s0b|`j7n3R5l2~zp^ zjAq!He9<8zc{VD;^C$#3jb07#@Q<$BHm@Alxea0e)UoCGs~@=nw~8XaV}&62ed6w% zdjlx=01GOFQrA3aRbzBu8yr9;E{@1_BMxi4)(RG=0fI(c{#X!2Y?*!UFj!ZSSdT1z zHx!2bC;g&+3{P30BEiv~o< z^wwj8tH<6jRSyQs1Uc_6S-vDUjY*YSKrATTNpLrS%eaA`*n6c(>Z7Dbr7of#?~ z=P65!?$%ThDUyEn*hQI^_I2)-mQ|C2Or6;X@>4b zaU#gg=5#k1XimiNBnJmyOcaD6NUpWOpT>v!HySD34s!(^X=CgwX0ULp@}x+76f`=q zs>-AcFvCLBV0GJcxB_W(te64!xGFT%yEw+ggQhYzh_#H9E?9`cpP4(=om!Ah%e4(= zl0{;KKW??UrN|AN8Ukg_+-3re!gayHou!Z$YkHPw$1#2BcSjt@_qWo;c?aiJEHaW8 z!#j@3<+;@?)C`|QLgu>)w^o9u2s5)YvLqQIEiG1xSOt>3%~al>p9;UW)YF4C4W1uFhk9e{m;Sj!;Yz`&N=2FjP$i+OL70mw)%0gIP>k6Yx4bRUM>L`< ziT2ju<^w$Jt1v9aK0TVb(t6`mM>9|7=AZji9)*dl-Esfs!v7urK==7fmn zI&!KIET5&TXhhxU(v%HX!5w`httT%XOnHD$p8~?~uNBXF5dE)|8_pUiUyODqb>m5} z1)zQl0&6t*I;1ZCkcljkM}yp4uMk1TTN^~swaH_U0hteSmPZ_}kvTBgEn}mk1g#XQ5gz(PviFAVex!6RPRf!9A`ajI~4Lzpc-v*5u~H{?E(d;%E+w zRIdRuuCWJn1GPGxK=YwtaELfaB=jg^tkgvg9Cdq*+$$ktbV-UhZ@D;?iM78fPmQav zYG{E+g>XXAl~>5SF(|r0v#{CEm2@jAhQEh)(tpl8{?_9|ABRo2p3sG@ZX@a4sSlfy zl^3D34m4lrwh(dD=!J3Yf>S(Vi`J^eTM!e|5H5v{Ng!hVUK$U8Kt*u)29zn70C2^m zZi_30fol;MQuR!Fp~GbX&t1SCaiaSAHal)0*?CatOjYn9QMYD?whZ(z1cj+ovX>Du z`QW!iDsqY8S*5$6tSv9`3LLtfln`$G5G$%tO8?Liznp)c+Qn0rIv z5(y2dytdx3NbL%kK;KuoqRu8vDr1>D3+F;vA8nmTe3n1!Gk)jDd2eb^t6 zb*tb*9U*lw1l^)?Te)DJr6^Ud5Ji2X3Nmic)uA$%i3~Ks#7`434k`Kxge52!TprAl z2<_9tP$rPl1e21WReU2yrBln#bicQAWz+O8B+HEsPhYIx2I2yoJiv zlNGt0GIl4|l1_o^PMHC%WZBeLi!4x$S;tSRLw*y%Sh1Ea4e zLUwVm%~;k?aE8JraYEa8Lj(LiSw!S(kB+a|z+_wn>musysOjc*x6u(P84HlRI(3Tv z5e;^(O4Nqr=un84dH2rJ_pI^Kaw(aDcaT6{5s<^>XQYa>AuL_t8PyPZPs$Os3&x+KX^RCI%bs(d4cq(WOQ4y+EYB!er^Nqi%d zjkuPi5kxFS+)-VVkeiFN8`Ua|^uRz<4Js_aL&>O-bi#Lu5ecFSy@0g|>kG*M0laH4 zjzcFR+%2pKZ?J`kQKgf6-|33zWp6muECVTocmYqx8r=a*8gUjfW^vp}@w+@l@?A#hELWydKaesZ++tu!>B_@`gi4c|8Ut%Te?4 zj*#Gn%c$3VmsO?U@orI3g9gXifqkaJ?K9x4wmJCK9!csQY{T7 z3n>UD&evJhbO}zA%coezoO^gND$W-2WR}~$y^|0-z_l5pTL4bmL`!;zhvf$rlLCrG z6Zr_Y&h1x_(H4uCO8MlF-Tf|-me;0->4`gI%?`Qm+?kp33%z^pO2NDh`}f7)Nn0Vk zI0Mq=bo{wxe!AZ0_9Vb>kTp}CGVzPBQz!x#-wF@Q3L^oKde1s z3WrDp55xwTN!dR+Mrg!VtF9UJGe5+Da@#2j^aRkd&wvMW3@Ocf0ES)32u z3ItJ?GIlj7F{Cu3Q57Bo*CZdaam#k5GtG2o?ypq^XN=c1X+fjbpe(j!mBn{AH_AU# zNX^}ZmkZ~Fb&YVwV`VNnGA*q|({BJR9_j69h22ivp*G*>`btgcnDnp-ia!D90v^6{ zmJ(7t9w`i>1Zz3>soMW5C3ifF)WLWgW(f#pj%2{HY<1I)>x@4g)dB&;RF=)<*^lo{ z1MeVc6A-(iS(Z>hRcQ$NmEm7>8{x@48K$xde7wm?dMrb6h3ouo$lu})5$Xw;#0vbm zSLB8xkr3GW6Pwhp&XHExS65>Fhk6cxEC#ig2`9*#QgwE>)T) zZ|*^(_S$~yGl!Jw1|_f8te!T5hqyyn02}ZkTpZClu(1IX-eKaEeMG0C0aN9euyEB2 zS`)7)BP~ytvyUfECEls=UC9->8V1T>O24+>4P$#d zy>!HB?Z^e*?Q_{IF+dp46(MM)e9vy_4VwdAN9$pZ{>V{yw2)N{53|Bdu%}7psCYq3 zpaOGQ@iu$$k_{W4*};Qgl|N-C4)}@oM3DTF?wWjINKeAzBu1!mVXLU1u?`>Z8_ddv zES0g0ZLwsfO8E5)t>O%2q^kziS;sueS`#(QJI+HP*$@YJ9RZy&9?8%+#OZM-BAp9De((jLpd zrG2u*Gwj^2774x5#xHb7v4vNKJw39DW^BZR?fr@w3!c@}E76=eFZKJQSC{CAylVmX zKF~1M*ID9(JfaFWnJY?!FLg(U4iTGNBgVA+*6D%KQ$_95OFIFu*61q98FM<}hc9!xKc=V?tivV)9@FqsPjAfMD25`xo zK#X+3q=UbWB`LXw;>-9TT3A=ia3!+3Y2eJcsNx@gL;v(^+p8}>=-T`@r-YBxx4lE_ zthhlrG%~Uc2IBrv1zf4uNV}CVG?IBz2bivY89UON>PIS!w^j z6rGDBlYRfkuN}-VY%Df&*jOx~IV}l|F^5!6zdPNzYcr>6h3YP%3^NPMaww-9OL`tp zIX$IrWj33XGxyzeP!6F|Ig~?`-}U?lxaQjT`}w@zuNN2;)|P@{U6Bf$0}jt!kl;6$ zahB>m{qsww)>h+<8xy7J&=YA}c{rLnFNb865nVnM6~Hp@7N2}{C}D#7yMwhUDm{>| zD$f~|vwTXQ&4cXhJBfsY|L~uEUU+Jjc}0YeIXkLUNL}KuCova5g$CpPHs>7cVr#j< zP(obQLIjv@C)9Z9mN#8hBO0H1F143;#^L+StlGw#CKBnU>eGjO1Xeg5M6b0rcpu<5 zim2tSL!l1GX?Y-}3QVQRz%y_nv(&4p)EJ=S3N?*wI?@*;SHqeuPI+n*3RNM7<%haM z${&1)!9M~)=hw35i40JlGn>%k>SR+sq-+g!C=WzwDuP@%-VBFMmKnF;dVL~-{j|8j zuI1q(IO0G~|Czk_Y(hqejjeHU!lo;b`HJdZc$Ow;`GK%)+vWiP+$J}OKnhh{0(cYX zBBMK*IFR9suH>n*oG$Q;c1o9WIJZa!V8}>Gbzb(rK3_SgWCOvrov35M_?#2QyQrH> z50?7U!Ql=Kj4Azr;z1my8al{1DhP@crtO99wl~m(bnwtFbcpd6TqlgD%9IUKrEyIV z@VYDn*qlKSTHwLPDnObWfmMT=ZwrLOemKd(`@tW5<&xxlyKKqjb@B(@BVSt=43Zjy zM!3GToM#55>Z4;lyR^d-ms>qvGj=4^Mm5b;jdY{fg65}GnemZ~VyYiOcA}u1Yxa$G z*5%G9>z~js#wK$6BMFNxt=_j>@7L5EGrK>`q<*&bo`2VZIp^#^c;PacSltEDTj?oL zJt^eG+TYnlp`NL3T)27A&-21_kRR^8jT$Yx5x<8NGS>(Ec zrZzFT#Pe)c(P~RA1cy>eMq}fLE3Qu)oN`ZIxZxV?t*t>~#}4<}WS5V6AJ6F?5bc{U zdqAk2i8-=JTSQtX*}f(u$)jrb$L1O>6E7qt7hGQs&A zp1+5E`_tuU^1|x3%>IKZMfXw^+GEoZO8cx#-Ek$=oM1!#5iktL?!7 z1TNv&{?K8Il&8!8tq@)Gw8{~It1U3E&Lrhz!~oowQ}|9r#zLix2N3X0Jn$t?bpZ4_ z{+BcvXv{=d@j+g#3_Q<+SqrUf5dapm=%GAJIn@SCotGbL{Z_L1X|wl%+rW0@nyGySaJzP%?D6$2~QXYbey= zmQyV!M#Ts1Lpzzqh6<#1rJx5mW|iZAT?8z>6SJCw@=>ClJ(GUK+=sR@wlJ!6oNTXV z|L5_XlR6Yusp>8RPHkko+_*ns>L!}d0kG+|RJa4dzU)GTj~&;gMkfkTkJ6!8=3wY8 zD0_mVSke%qhH4vsmJy9rI>ngxgE!xCg`C#eOY7FtRK}?@l$^Yt5F9dsCq)QAC0)0I zdWJ1y8w*+6qKM>N)fpPyIM;ei?6j;B>%E*+0gks#)9yBa0!1}83mW)|WpK(VRnIH-%0M8HGgk0b=lxd)@oP@C%qz$ZK3eD5bN z3AEt=xOZp;6Wm2i;{UhD6?IV*DvU}cn4Vxl8mQ`KLQP~km=lpyXF7IQt76JqA>d{M z+fPuj0zKMe3L_S_JWxP7J6DC10!(DA_IdE%>cB?(%!4)go*!pYvNv4bx=4Wk#j3zt zGaY9PzO$fooB(VEAYt$XfFz-!AX+d06^8>hHgn$i)?a$_=+{#J%8~Uq_m7+WNhZe# z1$5}!tzd%jxvV&zGu{>tKmq>bsXF2C-kT>4d> zvZk6M>7Tj1=XtKSCfn+i3ol!f!^CLTte2_8)IT_EP~E=_NmzG9o)EfST$zS#vqCAs zRT6V&e|k7pz68AB4(|O26y(G>O$XmJF;41Yny}60c0Wn&O<5}aHr&qMoI$*MwbQxn z`!eO4&75rlV5+W9p042{#tG)PIb+=^hca)NtQQk4R#4v z&go>$6iXGg>(E>_G}JSJZl`VF$b>39-_D{A+ZZoxQILB^zD?OWYxYtlih~lp4scEx zIe^Q3IAaCMJL}avC9L7}CRyzwS1ad+JkIq#_S#9_NPPmcC*=2U4K#gjJrT2VDh#$4@Q>ynp0kJLrfk{UGvwUbZ1!-++EhoH<$_{ zJ3*0nHk!j^=N#4}I2N8nf%p9WI^18!{G|q^hK*N8DFVlGVR}=vC-2#$yN*D4*mK@L z7K;<9o{}=5#cE4FEG=#Rd)i-IZm`-bCar7&Cd3U_8%2}Cd--g zW{Zbe7hZ959Iu%Q*Y*>ZiD1P}BtXBa z>yOV(JCIPuJSIF@9#68;m^5`+>eGz*_3xtt2R3UzuWXtnUb?BAzfsqTB(|w3t24uk zNbZ|o)eLOjUDndpeEiKl001|11g7oC%&uPC>)rj216?4BlfTWqF-u-RIibR-r{?D0 zFj+NYL@j0MYW$_;{Iz?VrJzXj@}3`Eo2Q>#+%3EK{wgEtc@9SJ=Dyyg&aFz0PL7Se zJ#)7K;_Us=R!$7{+&^cVEnXRh-OpriEAUeAdX{hPSnhdNEFuNt^BP1rlt6OjFfF0X zg>lg`NM8g>5ooz(m}`llR*qD*jljCc^v;5$o^HpNMsd1~i*|G+oT}`#k##pe>~&t= zH0F5k&hYu#B?QxA}UM6l zgRcu2j7R#)y4JvMHKe_pz>jb5MC0~0>hJX(n1O(Nx=O^`rRI=8Od+D4noZvJFKy$*TCFg%BLD1Jfh;5q zQv|m|1RolKcZjze%%d<~*+@3Kc~CBMw?gsNW~tP@?JhR76_&dpk!GG3Kdm5eg zI_{Xzrcktu_*68&^U8~d9e(|dh-xJwzJ=c!Q&f-O{LEv7)GR*UW5?jfG=Cn>-dg@3 zbI;G*@robk`!>JrUVGd=T`FV%G76wW&4PYAWuo;R|KRXQ=rTex8=a!=(YG361L<7jQiOLh^Pq+^vFVCuIA3>X$S$a|0`yfU4DmL!46X4&LMs*+8 zjgsIshP13B^>J5r@~$rQDf<1rc03mIl6G}x%UC-emx3>tD!2H;$I3uDWs6K-Kt1<( zn!ufv%kb3;sEbW-npVH;z@?(ias9RC%~{ZfRhGPd?n{H3o~S9%|D*6^USYOqoXkds z1tJ1$;P|sT9PbOgouAD{rpRfpO)U|4-0YFLynV1NUmTb2`wswmjv6C;bbd$FlxAe_ zvm@n~L-k%_tAuXlZKII^|~4YMQ^mr(=le7z1aP92J%3vYtzcL~kE zZwf@XR^!Y?mwh^!Dmi!oMT9`{b<69pp7bHR5NB>)R-h1#${T4BAFg241;VJl1tR|{ zzC6Qr*EYem5~k)MH3Ou@HPe{B_y{MWj+aBdw*LdKV|dF5vl=U6;O|jb;$bT#Z>zb*W8qaJ=5B&qK#E+eFCes5#AaSYIvXQ!n?1jy?=tn$s_&(>x9`8MX3ykq$`Z>?a} zPa2WgsL(lXUTlDdJNSm@3-MkQ_lH9`k1Aig@ia^Th6ORTv&HpHZ>K5l z2f6l`$p^mu%_yCx?0u1fR$EJd0B7l#vpsn0mHl%jyv%(1jo^NgwN~HXgJPGJ91ihyJ#fZFNRoH1?cw%-`#l9 z^>*{#o=cM}n@zo2kQtG-uc6^cFw=^DH=l~!Y&od``lzD|tIQ8!r9o^T zyE9Dy26iXbOFrS!Y%L8+ zjo8@~^OJWs%43(bH~z}4_&G1X)eFA>X}>&{AN4r~sh#nd-aQe%&TmYtg9qaD<%0J) z?}> zd%kZD0bKfuuY*QXP4#!^-}uK<9@-x8mykDzi@#M3AAn$3BiDJNTz6aa7cV34KVxtKF>UnO!dUv>?7)Ej)qPJ zV-LeLuJ9DW{6OvZfV7@I9lF3AL7W`_Rig@g4V_yMDM)&V4rmcZ@#i-0V75hQMYI_y{TzPkxD)M ztqIq=kzz>5db2O#otueku#|J13;!4n$hyfqgs!pccJm@rEb)W3!4Dz$z+>J1E&V!4 z4?#emsb!Yy1;}~~6zf$3RT;j8K72f{K~CCFJMMV}dh%n>NQ?bs5IL2fC1^4GSZ3=f z%ERUZy1i?C_u+ADpU}ZjAF2cFHd5qB4z)gVGze@nUbni($?j4>MR{P*82TkI8Lza&iE6F zWE?>NI7FpC!@_X-edYH{xRf$76&Z#5jhF8%U%Z1YRyu*-3Y1^XXmGbQXw`% zCOkkt9`B_38$6$C3w*ZiW6Wn)9k%hZ$maW@E$iH5s>H@xOSWl{Wt z=(jSENe_NI`C+J3$c>?ai?HvIt7_FOEJ%7qVA2D{B9A~i_KX4DMo+Dnob6}l#4U)B zWgmE5-L2-S?Ur#q{3^xs;_~`+{MFY*R?yV>e=p>2zS>yyzVu@_6o7`=`W#h;sxuta zGfAvg^b&-dB!94jXv+t1aNdiU+kv#j?wS7epx|R-fDi#jwPB1l^zX3ZI~2A8sv;J} z={HDrTq?bH@8}8OK34x4kWHO>yung4PD7Wj$lF2Kiyoao-0dPnlHm;LZVYNw`G8!gig_E?vWIY9nWLJb; zR}02_94S+$z(+L7*U+Rg{j>3q+DJ?#2=~@dlcRG8c$ zPb+;4!fPo-H}}~M!^p0Te+H?{P_o|E2tCFD8n3wckQu8~y;(Ef3MuTN6;=h-FZgqy zvJ#I&)WTias;I!Z5SkS=WX|7VfCz)jqqNLeQeRX;C2yb@&&`V<@O;@^Ws5CJdkc?E zU^}1!%wYiTNE5kJkYSbMZ6#^BL+LlR*UhjhvhGQ@?k}?4uca+0VNpAHs@V{|Yg)*v z^BYu5c|495B~WEfj>dQ-5NXr8!(+Bq<$)o~(*<}{42=utqM!1rRx1DeB>TT8iMUc;>~s|x--uukGu27f>$+eEIq|n=FM*Pa5B$9l7s0@p|C<~ zOCY_%b=OvIa0rN)@XDt`EmwMO0@X3U&zdDUP&)G1AOBO8_I*Or%gVrD$fKxG_N)!_ ze|3Cvy{|!uT5z;x%iMGph6gLTmK7MNrAv5Er4(ug=!1Y-inYBNzBC%XxUwGX~LgS&1NvK zWiAV}^3YX}O6TT^cI@KjrpB1GzG<)k`lCWoZT2AmtvqIj#c4RenHP_O?NJUy(3tsZ zw}BfMB{K`}V&T|S%WL5ZszXCe7|tu8=t$jvm@omD^yqBD2x7I59&IP6Y&2JN>5|k# zvG2gDQA2B{2hW1aH)4i@7w61qwF~{hdhZKCw2LLoAq`f^vee)S?A)mGjKH~7N?1-+ zRsXMjp$WX|cnH2J;n*!$WAu}2?aTc={VDg7lb+U8g9}nq%K@Xt_^mh=c1w*86azI> z6KnbSOsWBu+TXWT{QP&s*5VM;9t&3HI2G|0R$C%~`U<**pJVdW z?J1wDnyJ6*bvGb0>OOGBOC7CCvYhb0I|OX|Ehj5--_;nCHIoO(s3qeQ2F229apLRM z|5$83ZNGYSV|g;uL|F~-*&+QBXrn_>N6){zFeB7sgKRG_49CoT4>ZKj1iM@idNBYY zB+X6xDt;)cZ6oavKSHSp-G)02)sP`~6CJ>M{W~OVseR)kcz8}>LO^HKO;x$^lfIel z(g25V9>!3IFUo8jm>-h|2xZ1&-S@XG6Zy)RFjRvMBD5z|i%0|jTD5E*!?xpzADsWScQlTY!n-aAb$!xDCH0-xrDCM@L@<`W%V(5 z36rVmlxmF<=i_UKbeVVff*<@7?#B-C-C>sl!??#_^5x6-ipfTrMp189e zc*5#$g1+yqqN(*>HO6j(2Dpm)5WARK9m(W8Br?#xMdZKFbJqXVcz3ko=r5-|8xl{( ze)TSzb$U%^;o{nby~p3U=m1~bGTuO?Qc70zYfTIZww=vk1UD9A9euCf0Wn=$8r;$} z)ZZ)Kg;U;5q+%P`H7$uYBrZSsrH*RpUmMP~koA~5iEKD43maGy2+F~-+7HUWbBoj;$(0Lh6 zJLnSnt7OmiJ)0j~4jj)zM4T27^)7}4U4eW%rF%lpH1jm6ASr`Lbwov zaDSxBEog`l7bfk>J9;P>wWSDN8w820$_IO#)waTKI=LwOutti!^Snokseh4wASPqT zwx$f%V|olvyn~B)TvxRBi1E#>VBy(Y>~BZU2$>qrTD_L3#oJEh`+0Mq&K@C_&-?>H z^m~vp1ip)8ZQ700JgcS|DYD&F50CT#QMX0`%Q?4#ID^8n?=gUyx)`u|CJsARV~AsS z;|nTr7aL@`Z;r7kZloJ7F zvIZ{w3cfESGz1uSOw1Atj803DNNPw9aP#qJzp24eqqb#zQ)tCeHz7K_^gu70lpzl7(Vj) zOM3eFew?M)KBRz_aWVGH?&4}9>JW#1D-fms>b86<$I3F>pBd=G*ma0n?Ln(FSIarg zIz*XFASYni`#!A0SGe#LwNGk>7oAnV@T-N;{|o85j=(Xy5_SWbOTCMNLAk3 z3AFzMyp9~RN}^QbxX=&b7uEYwe04M0BPB9}O22<+*ho=(1=$k}Rm-^wCU$|eqWNw2 zEoVjd|3%F4@!(aSF^TDu@pyi6J4OMRNVm+nK5r-;N$v2S`t0k0@Qkx^`{_NLCvivJ ztaejjDp!`q=v(bq=M4`uwIVg*o6J#uP-(z%1o0%|siacKAH`YbMD@c}aD64zh`cSV z{SJrk;?nb4P>v9F+a13h#TMioU=H+$5fc!02xf#Fe$Pl0q0d- z15ZN@3&YX9|NdA%nX-O0W%g(VsP&%wWHFk5<(y~UKy+&uJewB>O6bP^JtE4gI^YyW z72M;2$inq+pLKh`9s15x#e$F!OA$Ms;eZ-Uh(q`2-6}e?%eFEGz$hSA3{x6{y|D-~ zThyUHM*HzO<0aNIBO-_(2@I8*;7CGgVODoPMZ9XWTomVye>_O}rsr@cc7P}Zp6i+mWO7#NoTpxR0 zM`Dfk0{&8XRE>0WI;%EtR1o^bJenul(kS0*RS=FbcXx>yHYJAKk15D%lq9`9AoP%$ zG73s2N>Zn|jQzO176nxnD( z;SCSNXNS!!D~m{S<7sR9HiJRN!sl0WrEmWR%HFQxmniDH?L}J#i2zvK5!(vUzIH7r zFS%UD6AWY{d0JrdYTVtno8jGv5!^VLrCNL$>5djCZ=P5AcPQ~2q~sa3OeiWmr=y6Y zmX&O&7V_h=JQ9NLTx_|=_jwx7Jf!fjWH-PAOxO9$v!#JCkQY9$P0~CP#w(1Mj}$2Mu%EKBF;C^`6adBkK2dy(&Q`KPZDbtEH=Z$$-e+-7mn_9wG2dV>%p6KoWKxFTY7Tn-iu>58UH{Zs>bTS!~$G#N}7&xHD z=CNxM28!a3;RWQ@P>@+>IL<`lRXkaF)TQVD+wW{XK+Y%S4Gt3J(zfhubZ6pdqezQd zq=!L35Kb=j2O}QF4bGxL=Z0Xg5xrAgdjh?z<63{98gw=_G>Nu0o2F@(GT$Mv8Ofck z<|j_IY%D+6WWb-AtlBSIzgcLg6B{t^@NU`hkk@Vt?T2q??MC7Xy^tL$23oA&Dw1zE zw8X0#sL@3VoiH1kkGEn-Uex1&^;QH8!mP4Z>KKQb*O$_KLD+EGp($fVej>~AWhhQCQ^mz#=ONL3R8xbjw&!}8@1!QC$A zzVu*UL|rg%XIe=Q#kc6ggp))u5pcHS{0jmxTc!sdZMZ%esh-W%s5ppkB>FNhE9lH= zBgSww?wLQ#v$V=1s)*Qm)AgS_loOWLTS7-{ad}pPXNr=WUS(EyH)7j=uBvYSy`w$y z$)(dQLf4kkFEMQ&iO>N6Qe4Pnrhc}MZ)tntOfx5)u_Mn{)@I(u5v3VO1G}?^Z!cS? zf`I)uUFAFV`$6>(4~T`H6}nPT+oE(JM(rD}zf1^~sxgvfwO?utNFyds7T!oQlrqqM zOZ#^?!?B<~R($@;W*i$#?v7jEei(@0g)_cJlF%amx_SqYgH>j2xz-R>ck4X_eFAHB=2BhjZiYad^`AYt!?WXOZeXuNl@ye(OJXf~w# zrbil4oM3)2>}x>HyEA1-zmA02#IqZV585{_ZZ2;0^}aahd3BiCRTpDLb#SI-{ovwz zz@f$CN`iotmA1`TEh9AX3c&+DF@#Rg-jcUlPZQT!0-CoztjpU!43V;)Np`<<6KdAT z0QN)N;@b4vjrN_uo}X*cYj2o`+JJ1j)121+btORhgeZUcMqwpI=gu=$!SbN1u}h6+u-xbS@QS84ml{yvjm>q{rs zepEx4L440))8FhodGECda;Q5aOM1G?pK&wS;5Sa@kfN0lc--e!)ZWspS~fX1)uT9u zS8rud)x=z#Ut^B2bGD}mjRB`rq3+%;gHoG_P#iIB$d2*~cVV>N(Haj?pK>pHhu#%X ztOmeeuKJ~q-m)Eu_-9w@vjC;g*@b_rj(XtO86#UV+)|8+HU`Doegp=&5~~Z!Y`aVR zSVOAgIzZMI4VYh)&i&LQ%Ady0FVWr%fUgdcRj#3MzT+K@3W{Au0C840kF6b2n%=XV z*{&P2O2n$t?j?|Ok0Pj1k!&~ud8-YEFmbWo{@E$cjbSQ#qePt@K)`Jx~9774`AXp6L?YKz74K#{^ zB@(=zPN4u|#cy{SCyBM%2dLiK=?i)Idlb!gx_AvoKoPz*c;T_k!{LV%>${(1u$}M% zT|@kgrD-v7B1a~g_KK$|W-dz?Zi8%NO)@GZs)%`A+P%OsIbYWd*aM9qVona z|Gix#1=wd9o)G4&0_w*G&I&cR!fS8I#@?{UrL`V9xZ^IVUOt@&wREJk$k!tfh}HH7 z1<4VztG<_(Hsc}lZ4uV0457$|C1ITf3v8TKj~&DtnlP#I5+kofg|-lj-97F zFq^JM2>hBTS{;3~fDd^gPX4jq9tX{+p{=Dy_A?1h$q54oEyGLc3Bs~xEK1g3BN0?r zP=)3gcjS{-Wo*tqBWT0IpJEUUlCBZ|uxVc&P7WHoZv)v)4R=QSR4D#Y)jf1~DSC>- z#+)?ye9h=gLW`uNGftcqY6r`AI47Akj^GWnC|?f4=p{@V{j*J3`5^(UF=D-92DZ zKte7&d1>v{+M_-1H;+T;aq#spayHt7)X8SN=7opiG|=*e@`4eRH5gKrmE2n-;>M+n zu4;-DYPV${G~DfI#^V-?>Ur~>I4KY6$vlQ*1iD0-tDO|wt5~S`c{{g#>cE8dTH+JY z_V9iCuaf>Ox^~3$HZ)LDhkAw&LOJ)){!ZGw6oN#u^Lgv=#DkvCjo^LQEev>5(>^AK zDweb$zsC0pBn--c52B_4%aB-f?607Saa_AU^$yc1eqhyM!Z-}{MO8)e)Nv}Qv_HX8 z3p2Y)TvB{fu6YO^Ku;KgwsnkTVmlI8`ML?Cf5%#?M>w%n1R7qXn;2wps;GoIs=2KI z0n~HzvH2=s#^^5+XeYQT6g>%2BNWSX^2qiCzlLpCrh|DEs4XKiG+U{9y?(7g-GS=^ zm%}kGJ}OpXRF!La{b2m+I(lPss{QHFg=n`6tMR*X z(NWk^#}}!-z^%})Zl{4Ob`Ey0LRd&^Sa7Q6#n5kv(ll=Cw}>P@>Bz;R@k7Vc;`MpO z>h>+IDB}G)Le^Q5S`6qF38zo1Q?6~PVII=n>(eP3hzt)_Gwr4@cIuG~{A9OWk#Ol* zUz(n{#uvLcF4c?Tq^nuhBX)MbGr|pl;$OB(QkAo06^J7HPf=@Mv=SZS?c*`sml=Io~)XP})yEeXV&y)dkuq36~R@GY}$%=g-tjx8pUY0@B) zF7IYINk8iH6pk}to(nm<(_|neSzV#S8vko?Qyn?^EWi*k<`~&9Sjw^SDE&hKkT_s8 zjez1lY{hxTATuug2eO*Kd53W!=b^UI5)4-?bhz8 z^F$=Rs}DF2K!cA53d9=r#?pAS4)wb<;9{iR5`@JqaBF7V<0QtLNr zyRv*96~C@Sxr*Iu=+hVqcfUYmQbDDhvO4*Q8Y_ij@| z6~mW(jSL=)8aJ4jw7>njRFm>+&(zV4-09qPS;{x>pQJsj-TFt5=Kcj^FIpRXPf#?6 zMxjj0V_lM7E7)M&;^$X*hpiTE&iVe}pJV+ipWD|onpE6tu$W+5RQf>il>uC)km-@F zepQTIzj#;ndsx`6=D7Z5=(W_EyUx zEKutp6cv3pWcndeQ$E3ZA}#*Vr+L-TXTLF_`i>#3Ap6V_SVQD^>)sljf_#OS7WI`x z|F5+#l8mciAs&o{Tl-p7Pm;;EZNm zx@Z4wuIt&_w-PR{ipjkd58m=_O+TyN%`9c1RL-c*?wZN*HnmfTddmKCusnK}ecDbn z=nU-cw~W`-6k1$e@;=34iLTM}A3r9p!03~vKp5n?dvy7Qtn|#jiyV7h#5AB<^E_!O zv47@9#n@8+=7J2IP2JlVJvy^9rF+KyiGAj1o-GntR6LR(yu6dD%d=fZ`#(P=Q6TQ) z@8j*#7nUnp%wv%Ngm1**F zG)JQvyHb9x%;~56-oE_T8ZBD}fENHbt}{upb1d!~U<+DAs~f2XyDwlhIG_;TKwD9W zM{4U62-Qj+kp=<-YCy;-j+PdR8;Il5m2qtg83|^*K&zZ*SH@l`@GxCOz(_JL2?fX5!2S%bwvbr32gx()q!pW z>K70$yv!PO5)MRUhG$Y;5FeD;@7P$mB0DZ&Fag#%Ue)a%)&_CciUs?Sdezzt2oz!F zM1xACpw3D#3&X;W(~vkCkyis^)e-ZQZoS^(Xn2=XKVj{qG36hMpo(2VvPvvK(!3%hTV-~|K7=BIKV+_W85OmKT@7uTYl{iT27DNzDUM_8z*^GkzN%U5jD`#wh#2u7|R*jUB*woC7@lM zX*3X?D$4NIPbdw*X>f)RhJ=ZEV|Ok;(^LZfxo|R-IZ`JAE9N>J0q1$H1&&E@Rb2Qa zRj2@Do=ZD6uT~%?pR}=&;21bZ1+4v=;ymcuw)_bQEp2vT0tBe3f;~}pC8}dw#vnmK zfMX{3pxI_ZQt|*YTNJ>Zivhhp0Rr=FhOPb%(xC%@`xe*SoN+==$GzD4`(oJHHDIpxF`_QGU>_U%iHZo&rU z?dvDM`FmzRS=4>orcK-BcsSu~+u%qd(rtWHF<5nPY#w#s<%dRQO-nJ=b9lm4@car` zC8^2WQR-Fd=z8Jkx)k@<~r#2u#n22JuSwTkq7OlMv0&UxQr9*?DNnP9AEZn#Xa9WG{B;tRFbBXu5-?2SctlS? zanXYycxVLpi9)%0E}#Vnp;zt%NE#V;{emQD@TwOA7&MR2IZS6jf|-yb;8_x9 z$!}p|NqK{2yiPtK6C8Uu`R9@0>~TS3+fe8d{!>p&@rb1RMRoVwxHP2vp}v5$BrYqN zX+3seM^3grp`!lSsNgL7cZ6#4#olhyGdE^Z$HZ@5Pn`L2VNBpOSB!f6p^v>-k}X>K zj_rPRcH6Sku*KKy6_an;Rt$5JOpXR(zlyY`@c-c5GSrg#tE&>4_b27(K3{ifcskot zW^X^-XWCVMLBLEne>d@H!f>YMq>bYG!y6}_7(9<|F8z$k-cBG?D1gS^PlV(Tb5Fr$oDR z<`LL**=(b>f=vZI$eq~;5DLJPSK(-tAd-?X4r0dyldd*4zy8|f{8;XPeW~$i;xfY! z0ZJEPXBLTRjWI$I6akZhDeMlkVuC6`oSg#=UUW&^|bY+#t7HXLJ5 z@w4|IN=MBX*tyK!60j7wx|oa_El-9WAB)=Gd-C0ti@i_QRxk9c#tN^!a7pG!WdjVD z>pAb1uzJ~~C~7}%Y{|x?xOiS(9itT+P3W3w+WAQtVRw(CY&L75Xeb(DBp%WukGyeG zMmJyH5IH?u@6xiiT6DXyY1QhlQ5~Bj(KWEs?^GX7KHqhA7yX9OIk!e-MwqHV{lE=1 z5aWIxMF6Y3a0nm(2DsZ$z_@5HhZjzeGx2tQoElCHR-0|c*VjbC_+HAm1j&T)6%Zy4 zVoM+aT(JI$lVt=-Qa0Q7RK#8?{rY4*u|1Avpdvhgs%k=Jj)P>kRYL%9SCWlXAp|*_ z!&EaO;iy=V2>l48lTtytxB(1lhEu7bQw%ggAem;@SS!8t{Wz72G#f$hlQBlnrCD9H zZt=FU=Tl~d>X6;q*Q(MFQPliD;$Ai0Nl2{X21c2G`nH(kWnzE$zDqrKDdTcvI40J1 z+2`ziQp9subEF;VRa>8I``18jwEo_7e}3e1+BuuE0%u)~nX=Rt^71UNN#0l1eeJ+F zeX%U_SSSKN zKlj^$@n>?r{u^JP=V$INsnirDda+M0*Gfk()8z5nY2(wV=MC(*`;nclCyKt(vJpv%67t=z`nJ``mi&3VTJ|x>xUnC52}$;3!h!f>Lm)P z0=Wp%H>ZTO+5CAX*{%Ki`L{pQ+9^p+dg&Mdgn$}>9{?zTkU-OdP@trQEvm+4QbBkx zH_Qr-gCH8cF)UsjNuZT`GX@0ND`%aMt=YExY9!R=?y*Fvp_In&Mn9$CZHFg9n|-3J zDt-CT?}4K=Q5s~=xE#MGuVWO8E$=A#aKl{zjjt`bJp&(!$uqv!x8Dr%ee^BJw?NPI zZf*ei$`_CXtQ91iHH#C3KbL!^>ic?ey)gmaxQIaSJ0p$W+dN~oeIy&|Um3E!6JmbQ zQXJxOz0feyXB7yT4uPlodL0{Nt4C^V`{+WRD9(5O%oU!0*!2Gty?s2>d;I_Z-i3K% zcu$MjsEws1X+z6JC$rgHgiL;=lTMqfbXtXU=+w!u&Dw?JDxxqK@%#FAP@j&K>+`o;Znx~c*ZcW;JfF||-8yqULEbHNFXNA{w~BHG97Kow z?G-wg4CSW{Vaauztnu^+8{={A)Fa(0kMOK65nmd-7Xd0oT}6+wAz+`X_N9xm5Zozm+x4@}i)N4^HI&l8Tn> z5-XFfNe;Gxy138W;GunUDXFe&>;%~aabNM3?b9a@Jf1An@{=@Wnvb5p0JFW;3ReF$ z8d5cxka%DGNM!$A@cn)0u4w=sFqTkyBJ6s}`Al(4VuTkUwQoF(+w54tB2}7IV;&Z< zFZ!1|ro`~_4B5L*c1~-Ps=|2^V8O3~^RdX@w$eRwFstE|o| zKBVjZ>MZ*ie8W&$a@6(aMjskg4Hw*tj!`GEGQ7aC&rK1t8Lora5flbZf!dtTIq+E>0en9fDYUoiWr1YHK7aYEl1P_SQd*f${9 zxQ^h$I8mx8W|ZkVq=UWSOTsv@TUF^V$b!?;xaRcmd(2#a&D4afFzJE3xs~*rFkW@G zKfRy?^K3jhgntkzD^sD%x_8{m+m%im9GJ_jFS>m#Bifzs+?XJ|On3G#@N+J78hza` zbVAk8!E1?Ute$#s!p)`ganuFwTGd47uJx@&gU(48ptI10O{xHk_$vvSduNhDF4U=q z#6sdu8~Kh#t?f)Fi0&F;)#rG-n3la3e*4`v1#`@5hrYSo0z(-Ejfq2jL4Ho)?@e}b zf((c4UfLj2Oz@J*l1Pp>OFN z&mUQL^_z>WN5$9<0tb(X5RkUAohGC4-Oa)YZ(Mf-RSNiEC`yr!oL&$Z|#cEUmBbVmrR->2dc0?K1S(L4> z^jsBb<9)NZKJiTkA4zWRyq111p-`s`J}A6$N%b;(XnV^lrxU&Rgtuhj>tg4;X#1~% z4>lu<7#ez^`!%4i{uWl6SEP$kst3cf{4lawe;Se;!#aLSUjt2i;|B|cJPJq(#OUQYRyz3f711H zb$EqRmh@-6-7VKzb+WU=d**5f^=y=`B=b=E!4SI))nDLP5VscHPE!WB%&2s{_)xg4 z%-_#@ljUNsO+c9+B|L_uY>H`#HB4ECmA;L&-yfRwbhxF+D&`8K_^j6zug8xr39{Vy zQ5Sg0i4Q!>f-RgbSYB_1JA_2aAJ+l=k??$ceYp-JZP&XD%gUZ*#ywBdYceWiD2+>N z7&{b#n$*@|3QH`@gM7H3Ux2dDrz1d9!f6jdcuc2NFHwe-FW%d0Ui^Fe{h96q**9d} zh$0a}jf_gIT=1h1OvM4yi%7;K2Epgr0C;x70CFZo1z~(4%hXIH+7cEi4KN>5+tg@+ z`H7g_#n#3q>89?>17^UdL*}w~U&Tgl_uW_g8!~C<#?Pl`jkZYWujVpoKm17y*Ja)` z2!o?0i;MnC3%MRK_kig)8QWVPoZfP6$B-ZSg6AgBJvWfzq9pF0@$`m(jbZCr7=HUp z^BC&4^)W1XJ$<#;BtDNm_{zVm4$VDyDWP!IOBkF*+;K_wXr1}hu1o%Yhk?jMS1)Nn z3emrf6^|R6cdgB9&7ASyLcbEp4`aJ~$~ss1hFu!4xEZjg_XqbZdeZ%}zhbd7;qsoA z|CynR&hX?GxELmT)1C39h`mC(frcp%8snvc2jo!9A&`jj({ve`Kpiy@?yq%Z`BUD zY4j%LwP$VG)e^?>%;GKou--(OraG-WGH*6H_O_n zGnlJ9pOH&ttD1%6{m-Y7eloQoMuImmfA}bkem9wFVJmNk`-aQpkX5StGk~%dWhXMW z1D!m(Yztjqo6e$=oPmQoNHQEdfewz7eOSX)ep7K<3L97Ezn-4^WpVCy&4SfS@Vc~= zrrooLeDMfS$?*`T{Z=5|PQp-?n??XAlnb!v@vW5r_YRE$s!)&<1rRYOrnJri_^>-p z=Aez1Mc7Fhr(Eqv3Xxi({dplwq|*w+9qd9K)*W=N$PAgqQ%>wAB}d(}R3@~=?zWS+ zzM^Ypi+g}?*7?)TZAxz^#-A^Zt1k`smrX?Vhn4O;*u$U1@6oT{Q>yClO{;Khgf3VL z{fWBj_SRS;f99-9Y44?QlTBuPn#R&1Yb*`5E^{v`&1u}i7#?LbrX3>sk&_*UR-;yL z9RwiNS{Q}J{=YRK6ZY1Zwcc>roVd$ zuG6X1|LjZbbY=*_pH7r{xUas{5C;yAid8|>o9at%8LM@~KiV19mMH2R_L3qa<{&kx zxt`pDW(N84E?`qki0 z4S=RD?+7;gR0Ak%HBmH92^LwZTHq7zsz#q#DMn!+tf&J?OF+?23Mg{Yn*knP0v`?1}okNoa z?NYukht{7a)Yrvj6Ian}c%wjD6S1zx&tkxG!1wnJyWPv$oa^xWcb951E*#&j%$WYK zf}S;5zr)#TSIf1?nq7OZ(;OY*!ZJ#4BN^$Jf+}678Ch2X_W8SeIyH5okKalwz5Q|` zzoqrb8y$W9?O2uSfkoxx*Ro7hrQ2lIHR zkGtzTt20}M+tZ#}{Bg+pZ@;ps)7y4kv7&{It{d1Jml?d(Pd3g+Ib^vTtHVRG-i-^d zP#651&U1A1{a$}qlod`6VoRMuIzIV@-unZE4(k}Qb|^k)EVJn+%)z6VZrh?g!9_Nv z^<4OQTlubgV%o;CqIjC;mi-yZsgkgaWZxqHKWKZL1{y|Mh$r0tNDsR;DtzFP5l>dn z=|@0Y+*hLlHz?hqMP;#2ln&RvvBS0Z?buqTf+A_0aplNhi~ z5l$itvLx7dSG4G(oito2>;j{a-oAy+HEX~A3u>7An<3^vgc?Et)Gt`y)2hWiz6?Z^ zo=C&T`A|8CgY8Iq9Dtc|nNR7_z+G)h&AcAw32}V%Kr&_Sq;Y{r(b+^)Fi(;mMz$J3 z9dlQ+%@a0E-p$=c>zcDMDBMU2A6#)(qZjfx7X^w|1%nL;pA-mNc@H-9SD)^D z+>C_E+Nb&lDl^-|LRsrA!eb6LMO`ZAw(q)9{J8N_EnUnf$uAXdd}R>Q{lm7N*xj#- z{$jL%j((Y5;!?k zsh(U6?G3Lv7xB8xa>D~~_izbDN5{*8H{htzz<*cb;DD)y*FiGGO+m89_71Nm+1IsY z$CH4%1Ja>}%L@8*W(q)jW8%+C68&V(KcNtV0_+`2N89i1%wd1+x|{Yzenza)wwdZN z2HONj4>vP*?PZ6>P81*2ctrm1@_&igQ z93>{O6+88mqDsA(ghvVPkC3Lv?0%2^_n)rmsv+_*_uJL@XU8vS&mDZwr|Wagz7{Yy zz6SGDf^obs`JGR%DQ)cj>I0{b^c$<6bv2o$ar5QFHjnyPKA}~96CEF>^Ja#|KKHZB zDwzkmhzDLCw-8s1wiBK|d6zN7PC9q=2Bwmq_4M!QUH@)*|ER*k{&Lxta1`ie*}z`2y>Q`4n&INY<%EEms-Is^KKuATosyj?(ee_c5TA{?N#okDG)CXJsjUyXqnnDPxeYuYH{$FoUs>}`Z@D9A zX<0=zDc6e`zT3VbRv8<*dyv@#Np;u#!$(`j&{_3|4z79W{2i5X`0`A7ANjzWxa)gq zf`>GWJup?T3%s{SMrK9-dCDida|Q zb$LzYo}=cUWPN+mv9|X=RPQ{OOu7F&B=Yj6{He>7>Po+#Pj3Uk=JVG-;z7;zIQ1mu zl3_&O7j(Qsx}SXbd6m;oAB;`s-xca{D`cfO7e%=bKus)46}y}84y+9M^ec<)%1im6C| z1?_;1nO{k|*pLn6m?owZPuj;Lu)n_{bDsS5(3sFiW1K{xr6dD;HIu3bU_=c>h3rQl zo*q%Ob;nLjy*<4A{(a8K=H&}V-d8P-{xbG5zhFyw8%;sgi%PXR*FGW=SI)C)rId5BUTK4e^3nx-49;y=;whg37?p)aU`1Mbbk>|>~`_g8H zs{IHBiz3Um#SE3>=Lzwt-I^osUOtO+z3Ov^?Opccjd|Hk#kGa_y_mkqBfI@?kZMxI zq~Yqi2md}v&A|0k1zhfm1nnGojO4hj`tt2AYsWj^c`8Pl;#ximt}WEU1|3lG-^E^Jxp z+4=cJ&hpZ`^)m-wd>HzwJ07_G#R~I;mqs1pVz_AWBu-|kZ|Wed@fx&dc^vhQAgO(a zTgT%hSd_I`xz&cMPa`QvWET+G^0Rq9kbd$oadHyw>ydvP9?-Gyb=mM5If-r4r$e;g z{P*FXuS>6fdUN5+#^+}~eg1fEUcj^$`D&;*CKWFSY7w_FFr%UD`>pv3C3+p`nLDkeEqTcoTUSAuFQW~ z={vCeQKR>er|4TXZ_mMj{y~V}bPU9h{QY|1E=2@(+=@To#dgwR2g5+o$zt(kIaae^&4NervJF#wpbs#a z5nK`EW??%VlH$h1m`m3W4?y1LRBuRZr=WQ|8q#of+3@fM8OlZs>k+78y}4pC(G9Zo z9x%sX*Kkv$1CCxhy-*?pxLpgun9e(j?b4|{lFYf*FaPvp?>w_<5 z9^?1p(K=LsCgDR`k{e3V2Lu3O56^AEq?BTS+vdUbB(fon{@VEPr{0x+0lZUFJnv9Z}u$zpXbZ(*M2@3_}~jy@4X4#+t*D3 z_*v9iJcg6)S^@#yqo=*19TwMvF&rRp6T?h<1z0gg19BoxIh@4MfJ1mT+gA7v$gD}c zww5kbF6w{vLKkN4)y(94J`i~3>w(PW2Z4TfdwyP)^YDhQ`)}WUylGLs)o0_8qxD^l z2z$W6Yk+hP zpUZpwu2CsSZDgW@>E+Sqak=VWCvQGTdN~|S(!(81VxldjPIqr8EiREHHY;T(>{xTj zED=@p${9B<{W)Dr_1@xC)kf$Cqm}swqngJUY$@k{Fo_-EV1@5PR7XhY2GjJ^4zh80 zL>ES?`lT}|FMDWeJ`K+nBzOOvJ=*Lc>94)X0tlMFQ=)6Z49;lZC-m>F*c78%%gI^3 zbn*kDL)i*OC+|l*xLEF(jQL)9-#$_e7vlAIzrGl*S+bp9yK-Pjb@$cc*uulIw$}+_ zeW3t^^dH$-EPKe9mYoVz&1v{kr;neeNky<8w7UwBr<@K{8jIvzFGZ2=lBN$ny|Y1PN3R=)aOo|zw7{x0XAtiZ+XFHZNk$il#MrVl3*q!!m{ zhI%QaLb5oFijDcH-Wx$TskEFJjtk+Sq@{_*?zYwNt{sZkFYr-qq)m>cG0x$8-_GUByv zq}oxXsG=D8lTAo;XM~}QY@IY7FYOQ%3?%uyWjgR(YMWwQRU_K;`xpJU=zPVVSCs~o zyvlR3p|8_qrm+c$d}L1ZSx-xEX^{nRV|>wXrb@z5Y&k=@BgIu_6G^R1xbM7rvXf@# zwjth&-~FyRo)Iln?ueAF%j9ctok3%XO}>L(p8ae(Ke>?fCLK z9w#w`R!lZHVKX0(5Q7*O4cUYrlK%Ag{%Y(kuye7h6l+6PA%NnQkf(NLMS=-Y$1$&pAddF0t$;UFmzwfT*oS%Ghp=P;e zX6^Fh`Ksl?183$A&fI(PiVD+dMcZ_bP|+=>B!wVZyABKYV1wnUc3Qg$mG)9XzF*O{ z28P=}1R{XU+zM&|jw0xX5 z`K`jEFuH_dWQYhM2g5w`g zhT9NpT3)I}Pnt+&Uxz&p+jcTN@2un=mHw-NU`lMS_T>LEJ`dlkjAEJxQumkbY-C z-er7w`>vhsI-jSKT_}P+j7SRY)1YZMU$y*T~p@%x!QUybuWFJG8n zyR>lN%*O+>OCO@nXNuu>{d75sFa1Wv=aJ02>EP?e+CU{*F^&?UXgxnQ9=xN0RkMW2 zfrR=t;f8N(O%PC`V7MfeOOYighd=|hU3hx?(%)Ye`8nOE&;0XZ=I7=k}EP-sM$*z_u^Nr`Acv2{=M~J7?p*C`X z^@I;B_B1KMUOvjYe)`VIGs`Q61Iu47zxZ>H`oeaJ^ffv-*;ik?>sp5vsmo_VWn|XP z4zD<$hGIg3FPu=48OzDcJyPuAp>m>HS?$tW^59*g#Ja=`WYGDDf*hm(U3*Jm?v^r) zqagwbk87tDtnQwr^Wx%fdZEN9>-fegr8z!>E12TN0>Jxv|H zdhh+3T#u^^TZiMyNdEN}A0IKVNcX@6>*@$6{XjD-AzIhPS{k71benS*2RARNU#(r* z`boXwa&mKYZkicb)1`_!1uPpYQg6e3m$5YBJ`Pr@6T+$RsB|ib!Na6%??5FGfUk}k zRWZl|uy-li$(r5WnGm3|mfoE@Gf=ZIzWKkuy4K#&f1ui0+zpRnLj;x!Mn|bgzxA;N35wgzu9RGnV2pTM-{67B2&^u z(!5%oiosm#j=Mpd8J11~TZEC!>xr;GlGo(MF;%dRN)i)avPjQ3_m1GD;gHoBoFKA? zcmTY=e*R)am7clEm|b;Z{mn4OjGCXV;dBSYCz#cJ3JVFyMS1MRioFRC_ z8SMed>FKwJy^``PrA(q4f(?l~UbX>S*|4#J4`B)06G;lT@wp`RJIOdKPEGn3)};@P z&?X{CYb+U-DWM8my)>=cgeCkd?u^E zE5FUppULgoY(P=t;r4U_mK5#5c^m^npCDt8wlX}`+rps-NXZFKf=(0fdJCRUalk0b zT*ReEh>7XII!xs_DL~sa0c92K30Xqi>_j>`gHyrbYIUkVS%QuPcXr2?Gh>kgg|lbt8p*Tva+?TWQoCFBI% zDrvbUPA@7v65P!=MOd$3deLL;H~q-fT}Rp@FXiQKscWpLF5=hqq~-NZm|{bdX%f4p z1nfF#pBFP2^BcY7qBh)AY~rc52#lgyGlk03k8fxmL*v5~X-r5}3p_iHBr+cyu6jYJ z!ctP7N(_jQ6Vsx9Pj$Qa7B6#@5OJ0}6j(2hJnEL-xO(imF)kM=KZ~|th=meNIH-@S z=x-`~l*j=3>eAi7s+@@fUo&csjc*kb?by&!Wq`yT?2RMYaU=l>qlDyjK4e}Z_yTLW^q^e9B+6Nb5=lw2 zI-)kA24JVUNjKt)3W43330~YGV!UD04ZyO-O)S|?k~*Qv(%0j==XaLI?moM>dC}_C zPp`R-6)G>WCzV9rVbq>yids=Xr(*|ry5fUw-iHVRsSbsPv0Q`f$#vqXmg-p(!(Qxa zIqJn=H|#)LHK|9PLwm)BSY_mF3KiK+5@%Qlp%=ptfXQBpJfs43qkIF3~;VnkyF9Q3}t zp^F$X+T8tlSEQVN(ejDXI!5fqYfN^%zV{Hll9Iqre;gHE@fLO^cq8s={6NuQILew~ zue<*$PpB%l$W3B=Z~vEGWsq$G=h}S$;F-R%Iq*MLuUl@R*6K62eX2Xo$@y9QhT3&t z5|+~Gq8a3%Wjc~#r_#DW2t>>Zdx8uoSn={uDhZ9#uJe%fkiO5;IsL1H!G47&4xvOi zw157$XXVSTGnWpi9=`v24|G89E+4qR`Loshok!;-MDK9megXDWj;{t?G1x8DeL%{# z>LHUakq5StY5~;JGEP6@suX#EGF~d3Wa`WM=p34+2P*?d0uSB{d96pY?KNwsAO5%h z(~c$d!TKRQj43X0G_&7SD|_2I`Xo0z87|9ZB;B_l8a zpWXlVoqxhX%9A1u^doSq6cA78eGyYJ_%iWp-IO8D{j43wqO$CHtOEb88S8b;F7&nM zDpx5I%qXgCk%qcc1TO4e#|n71e=kAdHZcB)>Lsh>P^qd2U6Na+O2DH&VPIlOg*49_ zds!8RI6prNZgWU647^vOf+snIwoj24e;?h5Hp?nEF zVaGbWTIAt1D2VPwqWT*~uD1$*kFZ1WO(_?QWi@9$E-Y0&e0b;c^s}z5!HkFktLqy) zYGo++I!)|GU?M1Jy}B+H?_EywU>kI(XLLST6bTWGN(g8TWcChFqfaYghK8>V5HL38`>rw$Mk`nF=#;_3*Fn zOgwz<*r{dBi#IPXd^XEI<{susv+$1fxcCE6Fiuj1yF87xle04QK(Kj_GnW#?l}q`q zWdDr^?f0Q$`^B(WaGh8#qmPIgf_7*}%oDvrPKZD@J>%GsVvZ*w1A@s8kwHLH_Me;{ z+ypsx8W_WZ*CJkVWkWQ2L)31c^60&$>Q%ehmI*uvjoFlxvO^#h4pfHO3$*PC^+^+x zF1f={ctDVMk|$)3@|A~5eAAM}t9F+T7I7%iToy;(P8Vy>$AtU?{X5x~O%^w)ZJ};wg*!hz{(14s%0Ejvfv-YdOdlR) zYzma_+@Hdukr8{d@hHg+BtnuAOoCDqozWiCjTMFEq6( z6A**6Z4w}}%&>q?#0Z9YJ=w^wv>=j$LE6JEGmOOIQImxeKm?4FGC_5V?SX(mTVyAc zNb6Bk5ufgS{&8vV-Bou#Z!Y?ItAkq6=b}oGS`z(N*Yikyc}b%DmZaSeV*B^wQj4Nv zyBsYE|J&3q-)KSPL2fXvIP5-0@l489B_t9Q13_UG@&xcv!q zxVqZGymj8P1Q+ZEcM3;oCxxTQVxu&;s5jL~5p8b2S~@w1C%&R8wQh9Igo>Y}3`IM- zt;b5-O9Xr$DD&yH1RfP!Q(3Y0Cnkcz>_o*U|77GVVl_!SbkcUW>%NBIoeE45=bP2) zHl{`EA=+W=0G1gnb|g0CcQLWCGNjKCgI^t5`r&v$&WpS3mG=wt_s^xc9zwPb2v9cN zad;$wp+LYkh`ycR&$c`l#6h8YAyDoCVVR>!%&-)aY#PxD1VBGf7dPp8D#Cidfoes? zL3kG+b~n!KTYgxx@_J!$%csTsmD2ai|8LHxz>&?LtRC71zA8lF#K6@HB0N$wUZkW% z>;T4bK4HR!gl9Qv>U@z|@TL?Yt4XS)(bP=IOSC}b-Uk5tC16Q~RA|)lBZmN?DcLuv zpXzb(`TW@8wKKmhB?P7n?XRed(nh&~{Eb2MPDtJ#t`1yCCBsIgbDoHU8@MaeiqQA8i-gGIg^hj~E36VN3#}_0g z66{DIKY(5;;+$$tQiI)`^j9UtfHpM6eBAPEsq*gQMdO+0?+Cu#DUXDXIB_QH-;pAn zHLsQ`hs(l%T$YYXp|E^zUALeHqftZ#u7bJ$s06>Cy8~rGR{Sjh=5SB4uWTODF1FV4;xwO+t zbU}70#WECCY#3=g-vR+)&LF?e2aOa9HMPh(i`C4$xD8x`a#LlnP%{`2?Z&GL4kHn$ z7V4lRr3=@H9*p4D61Z|%rJ4qrZk-Nop8h~);dvA4NJHsV~tD(x%D2mY*>Yj!vVK8wCa z71^j$CN(qIGDb844|)$c4yhs`ok>}KL=`Od;7iSjg8~*XAF>6J36)PGG!e;)FgLs_ zxuHYRq7P2J`c6R_K)$zAB<&6jbsvCq-K`c$Qgm?{{U9Sa!Lb<4uHXbGw})Di+^Kfz zdQ+3`T4TH7x(6BPjfx7muHSMjv|En2v8xBe(@g?YeM~D+&`466J$Utm(MK+hfIB6` z?heFS)T^;N#Ou|#kdxqEv3J5Hslmosgc=M60??L_ z)Y%~kR#Vh~Z3&*Z?Z@nI|GM)2%UsUV`vu$Q$39a2o4yyA@*;4(If?A81FtWjU$QrY zF*wNdGKiEWAUaGUp5Ncd#j12tak^BIJ_@;};_9cT`pkTsD7+pR5|K2Cl(r4Q!U&O6 z8&nC$orM27nHc2eDG=q2GBihu)ix+f4?FFWXB)UB_29(tJeziiUJi=5_LFEP5p=iP zHr&YVHAw+@k!J_t?9R8sDLc&Y@Y!x61zRi39bgi}c$kP{JdMyt7MBPi5={Ap$bG^* z{pN3I)C=3*$~sv|c>O&&g5_K|rw@D%%pr%JHXVuY=>^l<7EFjKq=5m|dQ zwK<+! zHcr}Z!}zUzLw`{LfgiBP&eY+xOW(%C=VRf&7)LC#sb%GB2G@LGQy)N5FHW*oJW-BV zk>;!tF$z>g^pk85nQi6RyWpeW0Xr%|ZxYK;+j?;%QP);ywRP&d`#4UVgrshRXua!$ zO}{Pv+w=23hrdkEKU-qu{B>+8@auu)qMD!nnWOx|(9~w{a-1WfEz&|@5zNRlA&ACC z4O+c%K5naliHZOsGbCEdxUs>b=So)`$r?y`2^ynOEvWN>>G>ukw*^ld2W6|n$=*9~ z&h-201Mlw5v(2v4Hmh(P2cC&uZex(Z;7(-#41o?WdNiKtw>MGfWn>#tJ#0!MbaC!_ zV%ebR(BHYM+@_$n*^e7pCAu_ALBVceQliNBTl-DkW<ͧ`d{wwIxZX5+1~ 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 z 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튣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 G@c#j{8l*7* literal 0 HcmV?d00001 diff --git a/codexbar-electron/src/main/index.ts b/codexbar-electron/src/main/index.ts index 550832f3..5dd1337a 100644 --- a/codexbar-electron/src/main/index.ts +++ b/codexbar-electron/src/main/index.ts @@ -31,18 +31,33 @@ if (!gotTheLock) { } async function createTray(): Promise { - // Create tray icon - use a simple icon for now + // Create tray icon const iconPath = path.join(__dirname, '../../assets/icon.png'); let trayIcon: Electron.NativeImage; try { trayIcon = nativeImage.createFromPath(iconPath); - // Resize for system tray (16x16 on Windows, 22x22 on Linux) + if (trayIcon.isEmpty()) { + throw new Error('Icon loaded but is empty'); + } + // Resize for system tray (16x16 on Windows) + trayIcon = trayIcon.resize({ width: 16, height: 16 }); + logger.info('Tray icon loaded from:', iconPath); + } catch (err) { + // Create a simple colored icon as fallback + logger.warn('Tray icon not found, creating fallback icon:', err); + // Create a 16x16 icon with a simple design + const size = 16; + const canvas = ` + + + C + + `; + trayIcon = nativeImage.createFromDataURL( + `data:image/svg+xml;base64,${Buffer.from(canvas).toString('base64')}` + ); trayIcon = trayIcon.resize({ width: 16, height: 16 }); - } catch { - // Fallback to empty icon if asset not found - trayIcon = nativeImage.createEmpty(); - logger.warn('Tray icon not found, using empty icon'); } tray = new Tray(trayIcon); @@ -78,24 +93,42 @@ function createSettingsWindow(): void { return; } + const iconPath = path.join(__dirname, '../../assets/icon.png'); + settingsWindow = new BrowserWindow({ - width: 600, - height: 500, - title: 'CodexBar Settings', + width: 500, + height: 600, + title: 'CodexBar', + icon: iconPath, // Set the window icon explicitly for taskbar + backgroundColor: '#09090b', + titleBarStyle: 'hidden', + titleBarOverlay: { + color: '#09090b', + symbolColor: '#a1a1aa', + height: 36 + }, + trafficLightPosition: { x: 16, y: 16 }, resizable: true, minimizable: true, maximizable: false, + show: false, // Don't show until ready-to-show to prevent white flash webPreferences: { nodeIntegration: false, contextIsolation: true, preload: path.join(__dirname, 'preload.js'), + sandbox: false // Required for some electron-store operations in renderer if used directly }, }); + // Graceful showing + settingsWindow.once('ready-to-show', () => { + settingsWindow?.show(); + }); + // Load the renderer if (process.env.NODE_ENV === 'development') { settingsWindow.loadURL('http://localhost:5173'); - settingsWindow.webContents.openDevTools(); + // settingsWindow.webContents.openDevTools({ mode: 'detach' }); } else { settingsWindow.loadFile(path.join(__dirname, '../renderer/index.html')); } @@ -146,6 +179,9 @@ function setupIPC(): void { async function initialize(): Promise { logger.info('CodexBar starting...'); + // Remove default menu for a cleaner look + Menu.setApplicationMenu(null); + // Initialize stores settingsStore = new SettingsStore(); usageStore = new UsageStore(); diff --git a/codexbar-electron/src/main/providers/copilot/CopilotProvider.ts b/codexbar-electron/src/main/providers/copilot/CopilotProvider.ts index 215b1704..1635b6d8 100644 --- a/codexbar-electron/src/main/providers/copilot/CopilotProvider.ts +++ b/codexbar-electron/src/main/providers/copilot/CopilotProvider.ts @@ -18,43 +18,52 @@ export class CopilotProvider extends BaseProvider { readonly statusPageUrl = 'https://www.githubstatus.com'; async isConfigured(): Promise { - // Check for GitHub CLI auth or Copilot extension config + // 1. Check for GitHub CLI auth (existing check) const ghConfigPath = path.join(os.homedir(), '.config', 'gh', 'hosts.yml'); const ghConfigPathWin = path.join(os.homedir(), 'AppData', 'Roaming', 'GitHub CLI', 'hosts.yml'); + // 2. Check for VS Code Extension (Windows/Linux/Mac standard path) + const vscodeExtensions = path.join(os.homedir(), '.vscode', 'extensions'); + try { + // Check GH CLI (Unix) await fs.access(ghConfigPath); return true; } catch { try { + // Check GH CLI (Windows) await fs.access(ghConfigPathWin); return true; } catch { - return false; + try { + // Check VS Code Extensions + const extensions = await fs.readdir(vscodeExtensions); + const hasCopilot = extensions.some(ext => ext.startsWith('github.copilot')); + if (hasCopilot) return true; + } catch (err) { + // Ignore error (dir might not exist) + } } } + return false; } async fetchUsage(): Promise { // Copilot doesn't expose usage limits in the same way // It's typically unlimited for paid subscribers - // We could track local completion counts if needed - - logger.debug('Copilot: Usage tracking not yet implemented'); // Return a placeholder indicating active status return { session: { used: 0, - limit: -1, // Unlimited + limit: 0, // 0 limit often implies "unlimited" or "special" handling in UI logic percentage: 0, - displayString: 'Unlimited', + displayString: 'Active', // Changed from "Unlimited" to "Active" to sound more "connected" }, }; } async fetchStatus(): Promise { - // TODO: Check GitHub status page return { operational: true }; } } diff --git a/codexbar-electron/src/renderer/App.tsx b/codexbar-electron/src/renderer/App.tsx index ef7bba52..dacfd431 100644 --- a/codexbar-electron/src/renderer/App.tsx +++ b/codexbar-electron/src/renderer/App.tsx @@ -1,157 +1,176 @@ import React, { useEffect, useState } from 'react'; import { ProviderList } from './components/ProviderList'; -import { GeneralSettings } from './components/GeneralSettings'; import './styles.css'; -type Tab = 'providers' | 'general' | 'about'; +type Tab = 'providers' | 'settings' | 'about'; + +interface Provider { + id: string; + name: string; + icon: string; + enabled: boolean; + result: { + state: 'idle' | 'loading' | 'success' | 'error'; + usage?: { + session?: { used: number; limit: number; percentage: number; displayString: string }; + weekly?: { used: number; limit: number; percentage: number; displayString: string }; + monthly?: { used: number; limit: number; percentage: number; displayString: string }; + }; + error?: string; + }; +} + +interface Settings { + refreshInterval?: number; + showNotifications?: boolean; + startAtLogin?: boolean; + theme?: string; +} export function App() { - const [activeTab, setActiveTab] = useState('providers'); - const [providers, setProviders] = useState([]); - const [settings, setSettings] = useState({}); - const [isRefreshing, setIsRefreshing] = useState(false); + const [tab, setTab] = useState('providers'); + const [providers, setProviders] = useState([]); + const [settings, setSettings] = useState({}); + const [refreshing, setRefreshing] = useState(false); useEffect(() => { loadData(); - - const unsubscribe = window.codexbar?.onUpdate(() => { - loadData(); - }); - - return () => unsubscribe?.(); + const unsub = window.codexbar?.onUpdate(() => loadData()); + return () => unsub?.(); }, []); - async function loadData() { - try { - const [providerData, settingsData] = await Promise.all([ - window.codexbar?.getProviders() ?? [], - window.codexbar?.getSettings() ?? {}, - ]); - setProviders(providerData); - setSettings(settingsData); - } catch (err) { - console.error('Failed to load data:', err); - } - } + const loadData = async () => { + const [p, s] = await Promise.all([ + window.codexbar?.getProviders() ?? [], + window.codexbar?.getSettings() ?? {}, + ]); + setProviders(p); + setSettings(s); + }; - async function handleToggleProvider(id: string, enabled: boolean) { + const handleRefresh = async () => { + setRefreshing(true); + await window.codexbar?.refreshAll(); + await loadData(); + setTimeout(() => setRefreshing(false), 400); + }; + + const toggleProvider = async (id: string, enabled: boolean) => { await window.codexbar?.toggleProvider(id, enabled); await loadData(); - } + }; - async function handleSettingChange(key: string, value: any) { + const updateSetting = async (key: string, value: any) => { await window.codexbar?.setSetting(key, value); await loadData(); - } - - async function handleRefresh() { - setIsRefreshing(true); - try { - await window.codexbar?.refreshAll(); - await loadData(); - } finally { - setTimeout(() => setIsRefreshing(false), 500); - } - } + }; return (
-
-

CodexBar

- +
+ +
+
+
+
C
+ CodexBar +
+
+
+ + + +
- -
- {activeTab === 'providers' && ( - + {tab === 'providers' && ( + )} - {activeTab === 'general' && ( - + + {tab === 'settings' && ( + <> +
+
Sync
+
+
+
Refresh Interval
+
How often to sync usage data
+
+ +
+
+ +
- -
); } diff --git a/codexbar-electron/src/renderer/components/ProviderList.tsx b/codexbar-electron/src/renderer/components/ProviderList.tsx index f2d4db4f..8c7a29d0 100644 --- a/codexbar-electron/src/renderer/components/ProviderList.tsx +++ b/codexbar-electron/src/renderer/components/ProviderList.tsx @@ -24,15 +24,14 @@ interface Props { export function ProviderList({ providers, onToggle }: Props) { if (providers.length === 0) { return ( -
-
📡
-

Loading providers...

+
+ Loading providers...
); } return ( -
+
{providers.map((provider) => ( { - if (!provider.enabled) return 'Disabled'; - if (provider.result.state === 'loading') return 'Syncing...'; - if (provider.result.state === 'error') return provider.result.error || 'Connection error'; - if (provider.result.state === 'success' && usage) { - return usage.displayString; - } - if (provider.result.state === 'success') return 'Connected'; - return 'Not configured'; - }; + const percentage = usage ? Math.min(100, Math.max(0, usage.percentage)) : 0; + const radius = 13; // 32px box, ring needs to fit + const circumference = 2 * Math.PI * radius; + const strokeDashoffset = circumference - (percentage / 100) * circumference; const getStatusClass = () => { if (!provider.enabled) return ''; - if (provider.result.state === 'success') return 'success'; + if (provider.result.state === 'loading') return 'loading'; if (provider.result.state === 'error') return 'error'; - return ''; + if (provider.result.state === 'success') return 'connected'; + return ''; // idle }; - const getPercentageClass = () => { - if (!usage) return ''; - if (usage.percentage >= 90) return 'critical'; - if (usage.percentage >= 70) return 'warning'; - return ''; + const getStatusText = () => { + if (!provider.enabled) return 'Disabled'; + if (provider.result.state === 'loading') return 'Syncing...'; + if (provider.result.state === 'error') return provider.result.error || 'Error'; + if (provider.result.state === 'success' && usage) return usage.displayString; + if (provider.result.state === 'success') return 'Connected'; + return 'Idle'; }; - const getBarClass = () => { - if (!usage) return ''; - if (usage.percentage >= 90) return 'critical'; - if (usage.percentage >= 70) return 'warning'; + const getUsageColorClass = () => { + if (percentage >= 90) return 'critical'; + if (percentage >= 70) return 'warning'; return ''; }; return (
-
{provider.icon}
-
{provider.name}
-
- {getStatusText()} +
+ {provider.enabled &&
} + {getStatusText()}
{provider.enabled && usage && usage.limit > 0 && ( -
-
- {usage.percentage}% -
-
-
-
-
- {usage.used.toLocaleString()} / {usage.limit.toLocaleString()} +
+
+ + + + +
{percentage}%
)} -