ton-provider-system 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +144 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -2
- package/dist/index.d.ts +26 -2
- package/dist/index.js +144 -24
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
- package/rpc.json +4 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/config/schema.ts","../src/config/parser.ts","../src/core/registry.ts","../src/utils/endpoint.ts","../src/core/healthChecker.ts","../src/utils/timeout.ts","../src/core/rateLimiter.ts","../src/core/selector.ts","../src/core/manager.ts","../src/adapters/node.ts","../src/adapters/browser.ts"],"names":["z","consoleLogger","DEFAULT_CONFIG","config","TonClient"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Unified Provider System - Type Definitions\n *\n * Core types for the TON RPC provider management system.\n * These types are used across all components of the provider system.\n */\n\n// ============================================================================\n// Network Types\n// ============================================================================\n\n/**\n * Supported TON networks\n */\nexport type Network = 'testnet' | 'mainnet';\n\n/**\n * API version types supported by TON providers\n * - v2: TON Center HTTP API v2 (JSON-RPC style) - most common\n * - v4: TON API v4 (ton-community/ton-api-v4) - different format\n */\nexport type ApiVersion = 'v2' | 'v3' | 'v4';\n\n// ============================================================================\n// Provider Configuration Types (from rpc.json)\n// ============================================================================\n\n/**\n * Provider type identifier\n */\nexport type ProviderType =\n | 'chainstack'\n | 'quicknode'\n | 'toncenter'\n | 'orbs'\n | 'onfinality'\n | 'ankr'\n | 'getblock'\n | 'tatum'\n | 'tonhub'\n | 'custom';\n\n/**\n * Provider endpoint configuration\n */\nexport interface ProviderEndpoints {\n /** API v2 endpoint URL (may contain {key} placeholder) */\n v2?: string;\n /** API v3 endpoint URL (may contain {key} placeholder) */\n v3?: string;\n /** API v4 endpoint URL */\n v4?: string;\n /** WebSocket endpoint URL */\n ws?: string;\n}\n\n/**\n * Single provider definition from rpc.json config\n */\nexport interface ProviderConfig {\n /** Human-readable provider name */\n name: string;\n /** Provider type for special handling */\n type: ProviderType;\n /** Network this provider serves */\n network: Network;\n /** Endpoint URLs */\n endpoints: ProviderEndpoints;\n /** Environment variable name for API key (replaces {key} in endpoints) */\n keyEnvVar?: string;\n /** Environment variable name for separate API key header */\n apiKeyEnvVar?: string;\n /** Requests per second limit */\n rps: number;\n /** Priority for selection (lower = higher priority) */\n priority: number;\n /** Whether this provider is enabled */\n enabled: boolean;\n /** Whether this provider requires dynamic endpoint discovery (e.g., Orbs) */\n isDynamic?: boolean;\n /** Optional description or notes */\n description?: string;\n}\n\n/**\n * Default provider order per network\n */\nexport interface NetworkDefaults {\n testnet: string[];\n mainnet: string[];\n}\n\n/**\n * Complete rpc.json configuration file structure\n */\nexport interface RpcConfig {\n /** JSON Schema reference (optional) */\n $schema?: string;\n /** Config version */\n version: string;\n /** Provider definitions keyed by unique ID */\n providers: Record<string, ProviderConfig>;\n /** Default provider order per network */\n defaults: NetworkDefaults;\n}\n\n// ============================================================================\n// Runtime Provider Types\n// ============================================================================\n\n/**\n * Provider health status\n */\nexport type ProviderStatus = 'available' | 'degraded' | 'offline' | 'stale' | 'untested' | 'testing';\n\n/**\n * Resolved provider with actual endpoint URLs (env vars replaced)\n */\nexport interface ResolvedProvider {\n /** Unique provider ID */\n id: string;\n /** Human-readable name */\n name: string;\n /** Provider type */\n type: ProviderType;\n /** Network */\n network: Network;\n /** Resolved v2 endpoint URL (ready to use) */\n endpointV2: string;\n /** Resolved v3 endpoint URL (if available) */\n endpointV3?: string;\n /** Resolved v4 endpoint URL (if available) */\n endpointV4?: string;\n /** Resolved WebSocket URL (if available) */\n endpointWs?: string;\n /** API key (if separate from URL) */\n apiKey?: string;\n /** Requests per second limit */\n rps: number;\n /** Priority (lower = higher priority) */\n priority: number;\n /** Whether dynamic discovery is needed */\n isDynamic: boolean;\n}\n\n/**\n * Provider health check result\n */\nexport interface ProviderHealthResult {\n /** Provider ID */\n id: string;\n /** Network */\n network: Network;\n /** Test success */\n success: boolean;\n /** Current status */\n status: ProviderStatus;\n /** Latency in milliseconds */\n latencyMs: number | null;\n /** Current masterchain seqno (block height) */\n seqno: number | null;\n /** Blocks behind the best provider (0 = up to date) */\n blocksBehind: number;\n /** Timestamp of last test */\n lastTested: Date | null;\n /** Cached endpoint URL */\n cachedEndpoint?: string;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Provider state for runtime tracking\n */\nexport interface ProviderState {\n /** Provider ID */\n id: string;\n /** Current health result */\n health: ProviderHealthResult;\n /** Current rate limit state */\n rateLimit: RateLimitState;\n}\n\n// ============================================================================\n// Rate Limiting Types\n// ============================================================================\n\n/**\n * Rate limit configuration\n */\nexport interface RateLimitConfig {\n /** Requests per second */\n rps: number;\n /** Burst size (max tokens) */\n burstSize: number;\n /** Minimum delay between requests in ms */\n minDelayMs: number;\n /** Backoff multiplier on 429 errors */\n backoffMultiplier: number;\n /** Maximum backoff delay in ms */\n maxBackoffMs: number;\n}\n\n/**\n * Rate limit state for a provider\n */\nexport interface RateLimitState {\n /** Available tokens */\n tokens: number;\n /** Last refill timestamp */\n lastRefill: number;\n /** Current backoff delay (0 = no backoff) */\n currentBackoff: number;\n /** Consecutive error count */\n consecutiveErrors: number;\n /** Whether a request is currently being processed */\n processing: boolean;\n /** Pending request resolvers */\n queueLength: number;\n}\n\n// ============================================================================\n// Manager Types\n// ============================================================================\n\n/**\n * Provider manager configuration options\n */\nexport interface ProviderManagerOptions {\n /** @deprecated Unused - config is loaded from provider_system/rpc.json */\n configPath?: string;\n /** Adapter type: 'node' for Node.js, 'browser' for browser */\n adapter?: 'node' | 'browser';\n /** Whether to auto-initialize on first use */\n autoInit?: boolean;\n /** Request timeout in ms (default: 10000) */\n requestTimeoutMs?: number;\n /** Health check interval in ms (0 = disabled) */\n healthCheckIntervalMs?: number;\n /** Maximum blocks behind before marking as stale */\n maxBlocksBehind?: number;\n /** Custom logger (default: console) */\n logger?: Logger;\n}\n\n/**\n * Logger interface for custom logging\n */\nexport interface Logger {\n debug: (message: string, data?: Record<string, unknown>) => void;\n info: (message: string, data?: Record<string, unknown>) => void;\n warn: (message: string, data?: Record<string, unknown>) => void;\n error: (message: string, data?: Record<string, unknown>) => void;\n}\n\n/**\n * Provider manager state\n */\nexport interface ProviderManagerState {\n /** Current network */\n network: Network | null;\n /** Whether initialized */\n initialized: boolean;\n /** Whether testing is in progress */\n isTesting: boolean;\n /** All provider states */\n providers: Map<string, ProviderState>;\n /** Best provider ID per network */\n bestProviderByNetwork: Map<Network, string>;\n /** Manually selected provider ID (null = auto) */\n selectedProviderId: string | null;\n /** Whether auto-selection is enabled */\n autoSelect: boolean;\n /** Custom endpoint override */\n customEndpoint: string | null;\n}\n\n/**\n * State change listener\n */\nexport type StateListener = (state: ProviderManagerState) => void;\n\n// ============================================================================\n// API Response Types\n// ============================================================================\n\n/**\n * TON API getMasterchainInfo response\n */\nexport interface MasterchainInfo {\n /** Current masterchain block seqno */\n last: {\n seqno: number;\n workchain: number;\n shard: string;\n root_hash: string;\n file_hash: string;\n };\n /** State root hash */\n state_root_hash: string;\n /** Init block */\n init: {\n workchain: number;\n seqno: number;\n root_hash: string;\n file_hash: string;\n };\n}\n\n/**\n * Generic TON API response wrapper\n */\nexport interface TonApiResponse<T = unknown> {\n ok: boolean;\n result?: T;\n error?: string;\n code?: number;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Timeout error class\n */\nexport class TimeoutError extends Error {\n constructor(\n public readonly operation: string,\n public readonly timeoutMs: number,\n message?: string\n ) {\n super(message || `Operation \"${operation}\" timed out after ${timeoutMs}ms`);\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Provider error class\n */\nexport class ProviderError extends Error {\n constructor(\n public readonly providerId: string,\n public readonly operation: string,\n message: string,\n public readonly cause?: Error\n ) {\n super(`[${providerId}] ${operation}: ${message}`);\n this.name = 'ProviderError';\n }\n}\n\n/**\n * Rate limit error class\n */\nexport class RateLimitError extends Error {\n constructor(\n public readonly providerId: string,\n public readonly retryAfterMs?: number\n ) {\n super(`Provider ${providerId} rate limited${retryAfterMs ? `, retry after ${retryAfterMs}ms` : ''}`);\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Configuration error class\n */\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n","/**\n * Unified Provider System - Configuration Schema\n *\n * Zod schema for validating rpc.json configuration files.\n * Provides type-safe parsing and detailed error messages.\n */\n\nimport { z } from 'zod';\nimport type { RpcConfig, ProviderConfig, Network, ProviderType, ApiVersion } from '../types';\n\n// ============================================================================\n// Base Schemas\n// ============================================================================\n\n/**\n * Network schema\n */\nexport const NetworkSchema = z.enum(['testnet', 'mainnet']);\n\n/**\n * Provider type schema\n */\nexport const ProviderTypeSchema = z.enum([\n 'chainstack',\n 'quicknode',\n 'toncenter',\n 'orbs',\n 'onfinality',\n 'ankr',\n 'getblock',\n 'tatum',\n 'tonhub',\n 'custom',\n]);\n\n/**\n * API version schema\n */\nexport const ApiVersionSchema = z.enum(['v2', 'v3', 'v4']);\n\n// ============================================================================\n// Provider Schemas\n// ============================================================================\n\n/**\n * Provider endpoints schema\n */\nexport const ProviderEndpointsSchema = z.object({\n v2: z.string().url().optional(),\n v3: z.string().url().optional(),\n v4: z.string().url().optional(),\n ws: z.string().url().optional(),\n}).refine(\n (data) => data.v2 || data.v3 || data.v4,\n { message: 'At least one endpoint (v2, v3, or v4) must be provided' }\n);\n\n/**\n * Single provider configuration schema\n */\nexport const ProviderConfigSchema = z.object({\n name: z.string().min(1, 'Provider name is required'),\n type: ProviderTypeSchema,\n network: NetworkSchema,\n endpoints: ProviderEndpointsSchema,\n keyEnvVar: z.string().optional(),\n apiKeyEnvVar: z.string().optional(),\n rps: z.number().int().positive().default(1),\n priority: z.number().int().nonnegative().default(10),\n enabled: z.boolean().default(true),\n isDynamic: z.boolean().optional().default(false),\n description: z.string().optional(),\n});\n\n/**\n * Network defaults schema\n */\nexport const NetworkDefaultsSchema = z.object({\n testnet: z.array(z.string()).default([]),\n mainnet: z.array(z.string()).default([]),\n});\n\n/**\n * Complete RPC configuration schema\n */\nexport const RpcConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.string().default('1.0'),\n providers: z.record(z.string(), ProviderConfigSchema),\n defaults: NetworkDefaultsSchema,\n}).refine(\n (data) => {\n // Validate that default provider IDs exist\n const providerIds = Object.keys(data.providers);\n const allDefaults = [...data.defaults.testnet, ...data.defaults.mainnet];\n const invalidIds = allDefaults.filter((id) => !providerIds.includes(id));\n return invalidIds.length === 0;\n },\n {\n message: 'Default provider IDs must reference existing providers',\n }\n);\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\n/**\n * Parse and validate RPC configuration\n * @param data - Raw configuration data\n * @returns Validated RpcConfig\n * @throws ConfigError on validation failure\n */\nexport function parseRpcConfig(data: unknown): RpcConfig {\n const result = RpcConfigSchema.safeParse(data);\n\n if (!result.success) {\n const errors = result.error.errors.map((e) => {\n const path = e.path.join('.');\n return ` - ${path}: ${e.message}`;\n }).join('\\n');\n throw new Error(`Invalid rpc.json configuration:\\n${errors}`);\n }\n\n return result.data as RpcConfig;\n}\n\n/**\n * Validate a single provider configuration\n * @param id - Provider ID\n * @param data - Provider configuration data\n * @returns Validated ProviderConfig\n */\nexport function parseProviderConfig(id: string, data: unknown): ProviderConfig {\n const result = ProviderConfigSchema.safeParse(data);\n\n if (!result.success) {\n const errors = result.error.errors.map((e) => {\n const path = e.path.join('.');\n return `${path}: ${e.message}`;\n }).join(', ');\n throw new Error(`Invalid provider \"${id}\": ${errors}`);\n }\n\n return result.data as ProviderConfig;\n}\n\n/**\n * Create a minimal valid RpcConfig for testing\n */\nexport function createEmptyConfig(): RpcConfig {\n return {\n version: '1.0',\n providers: {},\n defaults: {\n testnet: [],\n mainnet: [],\n },\n };\n}\n\n/**\n * Merge two RPC configurations (useful for defaults + user config)\n * @param base - Base configuration\n * @param override - Override configuration\n * @returns Merged configuration\n */\nexport function mergeConfigs(base: RpcConfig, override: Partial<RpcConfig>): RpcConfig {\n return {\n ...base,\n ...override,\n providers: {\n ...base.providers,\n ...(override.providers || {}),\n },\n defaults: {\n testnet: override.defaults?.testnet || base.defaults.testnet,\n mainnet: override.defaults?.mainnet || base.defaults.mainnet,\n },\n };\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard for Network\n */\nexport function isNetwork(value: unknown): value is Network {\n return value === 'testnet' || value === 'mainnet';\n}\n\n/**\n * Type guard for ProviderType\n */\nexport function isProviderType(value: unknown): value is ProviderType {\n const types: ProviderType[] = [\n 'chainstack', 'quicknode', 'toncenter', 'orbs',\n 'onfinality', 'ankr', 'getblock', 'tatum', 'tonhub', 'custom',\n ];\n return typeof value === 'string' && types.includes(value as ProviderType);\n}\n\n/**\n * Type guard for ApiVersion\n */\nexport function isApiVersion(value: unknown): value is ApiVersion {\n return value === 'v2' || value === 'v3' || value === 'v4';\n}\n","/**\n * Unified Provider System - Configuration Parser\n *\n * Loads provider definitions from provider_system/rpc.json.\n * Resolves API keys from environment variables (.env).\n * Supports both Node.js (file system) and browser (fetch/embedded) environments.\n */\n\nimport type {\n RpcConfig,\n ProviderConfig,\n ResolvedProvider,\n Network,\n} from '../types';\nimport { parseRpcConfig, createEmptyConfig } from './schema';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Path to the RPC configuration file relative to provider_system folder\n */\nconst RPC_CONFIG_FILENAME = 'rpc.json';\n\n// ============================================================================\n// Environment Resolution\n// ============================================================================\n\n/**\n * Get environment variable value.\n * Works in both Node.js and browser environments.\n */\nexport function getEnvVar(name: string): string | undefined {\n // Node.js environment\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n // Browser environment - check for global config\n if (typeof window !== 'undefined' && (window as any).__ENV__) {\n return (window as any).__ENV__[name];\n }\n return undefined;\n}\n\n/**\n * Resolve {key} placeholder in URL with environment variable value\n */\nexport function resolveKeyPlaceholder(url: string, keyEnvVar?: string): string {\n if (!keyEnvVar || !url.includes('{key}')) {\n return url;\n }\n\n const key = getEnvVar(keyEnvVar);\n if (!key) {\n // Return URL without replacement - will fail at runtime if key is required\n console.warn(`[ConfigParser] Environment variable ${keyEnvVar} not set for URL: ${url}`);\n return url;\n }\n\n return url.replace('{key}', key);\n}\n\n/**\n * Resolve all placeholders in endpoint URLs\n */\nexport function resolveEndpoints(\n endpoints: ProviderConfig['endpoints'],\n keyEnvVar?: string\n): { v2?: string; v3?: string; v4?: string; ws?: string } {\n return {\n v2: endpoints.v2 ? resolveKeyPlaceholder(endpoints.v2, keyEnvVar) : undefined,\n v3: endpoints.v3 ? resolveKeyPlaceholder(endpoints.v3, keyEnvVar) : undefined,\n v4: endpoints.v4 ? resolveKeyPlaceholder(endpoints.v4, keyEnvVar) : undefined,\n ws: endpoints.ws ? resolveKeyPlaceholder(endpoints.ws, keyEnvVar) : undefined,\n };\n}\n\n// ============================================================================\n// Provider Resolution\n// ============================================================================\n\n/**\n * Convert a ProviderConfig to a ResolvedProvider with actual URLs\n */\nexport function resolveProvider(id: string, config: ProviderConfig): ResolvedProvider | null {\n // Skip disabled providers\n if (!config.enabled) {\n return null;\n }\n\n // Resolve endpoint URLs\n const resolved = resolveEndpoints(config.endpoints, config.keyEnvVar);\n\n // Must have at least v2 endpoint for most operations\n if (!resolved.v2 && !resolved.v3 && !resolved.v4) {\n console.warn(`[ConfigParser] Provider ${id} has no valid endpoints after resolution`);\n return null;\n }\n\n // Get API key - check both apiKeyEnvVar and keyEnvVar\n // For OnFinality, the key is in keyEnvVar (used in URL), but we also need it in apiKey field\n let apiKey = config.apiKeyEnvVar ? getEnvVar(config.apiKeyEnvVar) : undefined;\n \n // If no apiKeyEnvVar but keyEnvVar exists and was used, extract from resolved endpoint\n if (!apiKey && config.keyEnvVar && config.type === 'onfinality') {\n // For OnFinality, the API key might be in the resolved URL query params\n // Try to get it from environment variable directly\n apiKey = getEnvVar(config.keyEnvVar);\n }\n\n return {\n id,\n name: config.name,\n type: config.type,\n network: config.network,\n endpointV2: resolved.v2 || resolved.v3 || '', // Fallback to v3 if v2 not available\n endpointV3: resolved.v3,\n endpointV4: resolved.v4,\n endpointWs: resolved.ws,\n apiKey,\n rps: config.rps,\n priority: config.priority,\n isDynamic: config.isDynamic || false,\n };\n}\n\n/**\n * Resolve all providers from config\n */\nexport function resolveAllProviders(config: RpcConfig): ResolvedProvider[] {\n const resolved: ResolvedProvider[] = [];\n\n for (const [id, providerConfig] of Object.entries(config.providers)) {\n const provider = resolveProvider(id, providerConfig);\n if (provider) {\n resolved.push(provider);\n }\n }\n\n return resolved;\n}\n\n/**\n * Get providers for a specific network\n */\nexport function getProvidersForNetwork(\n config: RpcConfig,\n network: Network\n): ResolvedProvider[] {\n const all = resolveAllProviders(config);\n return all.filter((p) => p.network === network);\n}\n\n/**\n * Get providers in default order for a network\n */\nexport function getDefaultProvidersForNetwork(\n config: RpcConfig,\n network: Network\n): ResolvedProvider[] {\n const defaultOrder = config.defaults[network];\n const networkProviders = getProvidersForNetwork(config, network);\n\n // Sort by default order, then by priority\n const inOrder: ResolvedProvider[] = [];\n const remaining: ResolvedProvider[] = [];\n\n for (const provider of networkProviders) {\n const defaultIndex = defaultOrder.indexOf(provider.id);\n if (defaultIndex !== -1) {\n inOrder[defaultIndex] = provider;\n } else {\n remaining.push(provider);\n }\n }\n\n // Filter out empty slots and add remaining providers\n const orderedProviders = inOrder.filter(Boolean);\n remaining.sort((a, b) => a.priority - b.priority);\n\n return [...orderedProviders, ...remaining];\n}\n\n// ============================================================================\n// Configuration Loading\n// ============================================================================\n\n/**\n * Load RPC config from the built-in rpc.json file (Node.js)\n */\nexport async function loadBuiltinConfig(): Promise<RpcConfig> {\n // Dynamic import for Node.js modules\n const fs = await import('fs').then((m) => m.promises);\n const path = await import('path');\n const { fileURLToPath } = await import('url');\n\n // Get __dirname equivalent for ESM\n const getDirname = () => {\n try {\n // ESM: use import.meta.url\n if (import.meta.url) {\n return path.dirname(fileURLToPath(import.meta.url));\n }\n } catch {\n // Fallback for CommonJS (shouldn't happen in ESM)\n }\n return process.cwd();\n };\n const dirname = getDirname();\n\n // Find the rpc.json file - it's in the provider_system folder\n // Try multiple paths to handle different execution contexts\n const possiblePaths = [\n // When running from project root (e.g., ts-node scripts/...)\n path.resolve(process.cwd(), 'provider_system', RPC_CONFIG_FILENAME),\n // When running from provider_system folder\n path.resolve(process.cwd(), RPC_CONFIG_FILENAME),\n // Relative to this file (ESM style)\n path.resolve(dirname, '..', RPC_CONFIG_FILENAME),\n ];\n\n for (const configPath of possiblePaths) {\n try {\n const content = await fs.readFile(configPath, 'utf-8');\n const data = JSON.parse(content);\n return parseRpcConfig(data);\n } catch (error: any) {\n if (error.code !== 'ENOENT') {\n throw new Error(`Failed to load RPC config from ${configPath}: ${error.message}`);\n }\n // File not found, try next path\n }\n }\n\n // No config file found, use defaults\n console.warn(`[ConfigParser] Config file ${RPC_CONFIG_FILENAME} not found, using defaults`);\n return createDefaultConfig();\n}\n\n/**\n * Load RPC config from a URL (browser-compatible)\n */\nexport async function loadConfigFromUrl(url: string): Promise<RpcConfig> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n const data = await response.json();\n return parseRpcConfig(data);\n } catch (error: any) {\n throw new Error(`Failed to load RPC config from ${url}: ${error.message}`);\n }\n}\n\n/**\n * Load RPC config from raw JSON data\n */\nexport function loadConfigFromData(data: unknown): RpcConfig {\n return parseRpcConfig(data);\n}\n\n/**\n * Auto-detect and load config.\n * - Browser: checks for embedded __RPC_CONFIG__ or fetches from URL\n * - Node.js: loads from provider_system/rpc.json\n */\nexport async function loadConfig(): Promise<RpcConfig> {\n // Check for embedded config in browser\n if (typeof window !== 'undefined' && (window as any).__RPC_CONFIG__) {\n return parseRpcConfig((window as any).__RPC_CONFIG__);\n }\n\n // Node.js: load from built-in rpc.json\n if (typeof process !== 'undefined' && typeof process.cwd === 'function') {\n return loadBuiltinConfig();\n }\n\n // Fallback to default config\n console.warn('[ConfigParser] No config source available, using defaults');\n return createDefaultConfig();\n}\n\n// ============================================================================\n// Default Provider Configurations (fallback)\n// ============================================================================\n\n/**\n * Minimal default providers when rpc.json is not available.\n * These are free public endpoints that don't require API keys.\n */\nexport const DEFAULT_PROVIDERS: Record<string, ProviderConfig> = {\n toncenter_testnet: {\n name: 'TON Center Testnet',\n type: 'toncenter',\n network: 'testnet',\n endpoints: {\n v2: 'https://testnet.toncenter.com/api/v2',\n },\n rps: 1, // Without API key\n priority: 100,\n enabled: true,\n description: 'Official TON Center public endpoint',\n },\n orbs_testnet: {\n name: 'Orbs TON Access Testnet',\n type: 'orbs',\n network: 'testnet',\n endpoints: {\n v2: 'https://ton-testnet.orbs.network/api/v2',\n },\n rps: 10,\n priority: 50,\n enabled: true,\n isDynamic: true,\n description: 'Decentralized gateway - no API key needed',\n },\n toncenter_mainnet: {\n name: 'TON Center Mainnet',\n type: 'toncenter',\n network: 'mainnet',\n endpoints: {\n v2: 'https://toncenter.com/api/v2',\n },\n rps: 1, // Without API key\n priority: 100,\n enabled: true,\n description: 'Official TON Center public endpoint',\n },\n orbs_mainnet: {\n name: 'Orbs TON Access Mainnet',\n type: 'orbs',\n network: 'mainnet',\n endpoints: {\n v2: 'https://ton-mainnet.orbs.network/api/v2',\n },\n rps: 10,\n priority: 50,\n enabled: true,\n isDynamic: true,\n description: 'Decentralized gateway - no API key needed',\n },\n};\n\n/**\n * Create a default config with minimal providers (no API keys required)\n */\nexport function createDefaultConfig(): RpcConfig {\n return {\n version: '1.0',\n providers: { ...DEFAULT_PROVIDERS },\n defaults: {\n testnet: ['orbs_testnet', 'toncenter_testnet'],\n mainnet: ['orbs_mainnet', 'toncenter_mainnet'],\n },\n };\n}\n\n/**\n * Merge user config with defaults\n */\nexport function mergeWithDefaults(config: RpcConfig): RpcConfig {\n const defaults = createDefaultConfig();\n\n return {\n ...config,\n providers: {\n ...defaults.providers,\n ...config.providers,\n },\n defaults: {\n testnet: config.defaults.testnet.length > 0\n ? config.defaults.testnet\n : defaults.defaults.testnet,\n mainnet: config.defaults.mainnet.length > 0\n ? config.defaults.mainnet\n : defaults.defaults.mainnet,\n },\n };\n}\n","/**\n * Unified Provider System - Provider Registry\n *\n * Manages provider definitions, filtering, and lookup.\n * Acts as a central repository for all available providers.\n */\n\nimport type {\n RpcConfig,\n ResolvedProvider,\n Network,\n ProviderType,\n Logger,\n} from '../types';\nimport {\n loadConfig,\n resolveAllProviders,\n getProvidersForNetwork,\n getDefaultProvidersForNetwork,\n mergeWithDefaults,\n createDefaultConfig,\n} from '../config';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[ProviderRegistry] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[ProviderRegistry] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[ProviderRegistry] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[ProviderRegistry] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Provider Registry\n// ============================================================================\n\n/**\n * Provider Registry\n *\n * Manages all provider definitions and provides lookup/filtering capabilities.\n */\nexport class ProviderRegistry {\n private config: RpcConfig;\n private providers: Map<string, ResolvedProvider> = new Map();\n private logger: Logger;\n\n constructor(config?: RpcConfig, logger?: Logger) {\n this.config = config || createDefaultConfig();\n this.logger = logger || consoleLogger;\n this.loadProviders();\n }\n\n /**\n * Load and resolve all providers from config\n */\n private loadProviders(): void {\n this.providers.clear();\n\n const resolved = resolveAllProviders(this.config);\n for (const provider of resolved) {\n this.providers.set(provider.id, provider);\n }\n\n this.logger.info(`Loaded ${this.providers.size} providers`);\n }\n\n /**\n * Get a provider by ID\n */\n getProvider(id: string): ResolvedProvider | undefined {\n return this.providers.get(id);\n }\n\n /**\n * Get all providers\n */\n getAllProviders(): ResolvedProvider[] {\n return Array.from(this.providers.values());\n }\n\n /**\n * Get providers for a specific network\n */\n getProvidersForNetwork(network: Network): ResolvedProvider[] {\n return Array.from(this.providers.values()).filter(\n (p) => p.network === network\n );\n }\n\n /**\n * Get providers in default order for a network\n */\n getDefaultOrderForNetwork(network: Network): ResolvedProvider[] {\n return getDefaultProvidersForNetwork(this.config, network);\n }\n\n /**\n * Get providers by type\n */\n getProvidersByType(type: ProviderType): ResolvedProvider[] {\n return Array.from(this.providers.values()).filter(\n (p) => p.type === type\n );\n }\n\n /**\n * Get providers that have v2 API endpoints\n */\n getV2Providers(): ResolvedProvider[] {\n return Array.from(this.providers.values()).filter(\n (p) => p.endpointV2 && p.endpointV2.length > 0\n );\n }\n\n /**\n * Get v2 providers for a specific network\n */\n getV2ProvidersForNetwork(network: Network): ResolvedProvider[] {\n return this.getProvidersForNetwork(network).filter(\n (p) => p.endpointV2 && p.endpointV2.length > 0\n );\n }\n\n /**\n * Check if a provider exists\n */\n hasProvider(id: string): boolean {\n return this.providers.has(id);\n }\n\n /**\n * Get provider count\n */\n get size(): number {\n return this.providers.size;\n }\n\n /**\n * Get the underlying config\n */\n getConfig(): RpcConfig {\n return this.config;\n }\n\n /**\n * Update config and reload providers\n */\n updateConfig(config: RpcConfig): void {\n this.config = config;\n this.loadProviders();\n }\n\n /**\n * Add or update a provider at runtime\n */\n setProvider(id: string, provider: ResolvedProvider): void {\n this.providers.set(id, provider);\n this.logger.debug(`Provider ${id} added/updated`);\n }\n\n /**\n * Remove a provider\n */\n removeProvider(id: string): boolean {\n const removed = this.providers.delete(id);\n if (removed) {\n this.logger.debug(`Provider ${id} removed`);\n }\n return removed;\n }\n\n /**\n * Get provider IDs\n */\n getProviderIds(): string[] {\n return Array.from(this.providers.keys());\n }\n\n /**\n * Get network default provider IDs\n */\n getDefaultProviderIds(network: Network): string[] {\n return this.config.defaults[network];\n }\n\n /**\n * Find provider by endpoint URL (useful for error reporting)\n */\n findProviderByEndpoint(endpoint: string): ResolvedProvider | undefined {\n const normalizedEndpoint = endpoint.toLowerCase().replace(/\\/jsonrpc$/i, '');\n\n for (const provider of this.providers.values()) {\n const v2Normalized = provider.endpointV2?.toLowerCase().replace(/\\/jsonrpc$/i, '');\n const v3Normalized = provider.endpointV3?.toLowerCase().replace(/\\/jsonrpc$/i, '');\n\n if (v2Normalized && normalizedEndpoint.includes(v2Normalized.split('/api/')[0])) {\n return provider;\n }\n if (v3Normalized && normalizedEndpoint.includes(v3Normalized.split('/api/')[0])) {\n return provider;\n }\n }\n\n return undefined;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a registry by loading from provider_system/rpc.json\n */\nexport async function createRegistry(logger?: Logger): Promise<ProviderRegistry> {\n const config = await loadConfig();\n const mergedConfig = mergeWithDefaults(config);\n return new ProviderRegistry(mergedConfig, logger);\n}\n\n/**\n * @deprecated Use createRegistry() instead\n */\nexport async function createRegistryFromFile(\n _filePath?: string,\n logger?: Logger\n): Promise<ProviderRegistry> {\n return createRegistry(logger);\n}\n\n/**\n * Create a registry with default providers only\n */\nexport function createDefaultRegistry(logger?: Logger): ProviderRegistry {\n const config = createDefaultConfig();\n return new ProviderRegistry(config, logger);\n}\n\n/**\n * Create a registry from raw config data\n */\nexport function createRegistryFromData(\n data: RpcConfig,\n logger?: Logger\n): ProviderRegistry {\n const mergedConfig = mergeWithDefaults(data);\n return new ProviderRegistry(mergedConfig, logger);\n}\n","/**\n * Unified Provider System - Endpoint Utilities\n *\n * URL normalization and manipulation for TON RPC endpoints.\n */\n\n// ============================================================================\n// URL Normalization\n// ============================================================================\n\n/**\n * Normalize endpoint URL for TonClient v2 API.\n * Ensures the endpoint has /jsonRPC suffix for JSON-RPC POST requests.\n *\n * Different providers have different endpoint formats:\n * - toncenter.com: POST to /api/v2/jsonRPC\n * - Chainstack: POST to /api/v2/jsonRPC (needs /jsonRPC suffix!)\n * - TON Access (orbs): Already returns correct JSON-RPC endpoint\n * - QuickNode: Needs /jsonRPC appended to base URL\n * - GetBlock: Needs /jsonRPC appended to base URL\n * - Tatum: Gateway URLs need /jsonRPC appended (gateway.tatum.io/jsonRPC)\n * - OnFinality: Uses /public or /rpc path with query params - preserve query params\n */\nexport function normalizeV2Endpoint(endpoint: string): string {\n let normalized = endpoint.trim();\n\n // Remove trailing slash\n if (normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n\n // Already has /jsonRPC suffix (case-insensitive check)\n if (normalized.toLowerCase().endsWith('/jsonrpc')) {\n return normalized;\n }\n\n // Tatum gateway URLs - need /jsonRPC appended\n // Format: https://ton-testnet.gateway.tatum.io -> https://ton-testnet.gateway.tatum.io/jsonRPC\n if (normalized.includes('gateway.tatum.io')) {\n try {\n const url = new URL(normalized);\n // If pathname is empty or just '/', append /jsonRPC\n if (!url.pathname || url.pathname === '/') {\n return normalized + '/jsonRPC';\n }\n // If pathname doesn't end with /jsonRPC, append it\n if (!url.pathname.toLowerCase().endsWith('/jsonrpc')) {\n return normalized + '/jsonRPC';\n }\n } catch {\n // Not a valid URL, try simple append\n return normalized + '/jsonRPC';\n }\n }\n\n // OnFinality URLs - use /public for public access, /rpc for API key access\n // Format: https://ton-testnet.api.onfinality.io/public or /rpc\n // Note: API key should be passed in 'apikey' header, not query params\n if (normalized.includes('onfinality.io')) {\n try {\n const url = new URL(normalized);\n // Remove query params (API key goes in header, not URL)\n const baseUrl = normalized.split('?')[0];\n \n // If pathname is empty or just '/', determine correct path\n if (!url.pathname || url.pathname === '/') {\n // Check if API key exists in query (for backward compatibility)\n // But we'll use /rpc if key exists, /public if not\n const apikey = url.searchParams.get('apikey');\n if (apikey && apikey !== '{key}' && apikey.length > 0) {\n // API key is set, use /rpc (key will be in header)\n return baseUrl.replace(/\\/?$/, '/rpc');\n }\n // No API key or placeholder not resolved, use /public\n return baseUrl.replace(/\\/?$/, '/public');\n }\n // If pathname is /rpc or /public, use it (remove query params)\n if (url.pathname === '/rpc' || url.pathname === '/public') {\n return baseUrl;\n }\n // If pathname exists but is not /rpc or /public, preserve it\n return baseUrl;\n } catch {\n // Not a valid URL, check if it contains unresolved placeholder\n if (normalized.includes('{key}')) {\n // Key not resolved, use /public (remove query string)\n return normalized.split('?')[0].replace(/\\/?$/, '/public');\n }\n // Try to append /public as fallback\n if (!normalized.includes('/rpc') && !normalized.includes('/public')) {\n return normalized.split('?')[0] + '/public';\n }\n return normalized.split('?')[0];\n }\n }\n\n // Check if this is a v2 API endpoint that needs /jsonRPC suffix\n // Chainstack format: https://ton-testnet.core.chainstack.com/KEY/api/v2\n // Toncenter format: https://testnet.toncenter.com/api/v2\n if (normalized.endsWith('/api/v2')) {\n return normalized + '/jsonRPC';\n }\n\n // For v3 endpoints, convert to v2 base and add /jsonRPC\n if (normalized.endsWith('/api/v3')) {\n return normalized.replace('/api/v3', '/api/v2/jsonRPC');\n }\n\n // QuickNode and GetBlock: base URLs need /jsonRPC appended\n // QuickNode: https://{key}.ton-mainnet.quiknode.pro/ -> .../jsonRPC\n // GetBlock: https://go.getblock.io/{key}/ -> .../jsonRPC\n if (normalized.includes('quiknode.pro') || normalized.includes('getblock.io')) {\n try {\n const url = new URL(normalized);\n if (!url.pathname || url.pathname === '/') {\n return normalized + '/jsonRPC';\n }\n // If pathname exists but doesn't end with /jsonRPC, append it\n if (!url.pathname.toLowerCase().endsWith('/jsonrpc')) {\n return normalized + '/jsonRPC';\n }\n } catch {\n // Not a valid URL, try simple append\n return normalized + '/jsonRPC';\n }\n }\n\n // If it looks like a base URL without path, append /jsonRPC\n try {\n const url = new URL(normalized);\n if (!url.pathname || url.pathname === '/') {\n return normalized + '/jsonRPC';\n }\n } catch {\n // Not a valid URL, return as-is\n }\n\n return normalized;\n}\n\n/**\n * Convert any endpoint to v2 base URL (without /jsonRPC suffix).\n */\nexport function toV2Base(endpoint: string): string {\n let normalized = endpoint.trim();\n\n // Remove trailing slash\n if (normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n\n // Remove /jsonRPC suffix (case-insensitive)\n if (normalized.toLowerCase().endsWith('/jsonrpc')) {\n normalized = normalized.slice(0, -8);\n }\n\n // Convert v3 to v2\n normalized = normalized.replace(/\\/api\\/v3\\b/, '/api/v2');\n\n // Ensure ends with /api/v2\n if (!normalized.endsWith('/api/v2')) {\n // Check if it already has /api/v2 somewhere\n if (normalized.includes('/api/v2')) {\n // Remove everything after /api/v2\n const idx = normalized.indexOf('/api/v2');\n normalized = normalized.slice(0, idx + 7);\n }\n }\n\n return normalized;\n}\n\n/**\n * Convert any endpoint to v3 base URL.\n */\nexport function toV3Base(endpoint: string): string {\n const normalized = toV2Base(endpoint);\n return normalized.replace('/api/v2', '/api/v3');\n}\n\n/**\n * Extract the base URL (protocol + host) from an endpoint.\n */\nexport function getBaseUrl(endpoint: string): string {\n try {\n const url = new URL(endpoint);\n return `${url.protocol}//${url.host}`;\n } catch {\n return endpoint;\n }\n}\n\n/**\n * Check if an endpoint is a Chainstack URL.\n */\nexport function isChainstackUrl(url: string): boolean {\n try {\n const parsed = new URL(url.trim());\n return parsed.hostname.includes('chainstack.com');\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an endpoint is a QuickNode URL.\n */\nexport function isQuickNodeUrl(url: string): boolean {\n try {\n const parsed = new URL(url.trim());\n return parsed.hostname.includes('quiknode.pro');\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an endpoint is a TonCenter URL.\n */\nexport function isTonCenterUrl(url: string): boolean {\n try {\n const parsed = new URL(url.trim());\n return parsed.hostname.includes('toncenter.com');\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an endpoint is an Orbs URL.\n */\nexport function isOrbsUrl(url: string): boolean {\n try {\n const parsed = new URL(url.trim());\n return parsed.hostname.includes('orbs.network') || \n parsed.hostname.includes('ton-access');\n } catch {\n return false;\n }\n}\n\n// ============================================================================\n// URL Building\n// ============================================================================\n\n/**\n * Build a full endpoint URL for a specific API method (REST style).\n */\nexport function buildRestUrl(baseEndpoint: string, method: string): string {\n const base = toV2Base(baseEndpoint);\n return `${base}/${method}`;\n}\n\n/**\n * Build URL for getAddressState call.\n */\nexport function buildGetAddressStateUrl(baseEndpoint: string, address: string): string {\n const base = toV2Base(baseEndpoint);\n return `${base}/getAddressState?address=${encodeURIComponent(address)}`;\n}\n\n/**\n * Build URL for getAddressBalance call.\n */\nexport function buildGetAddressBalanceUrl(baseEndpoint: string, address: string): string {\n const base = toV2Base(baseEndpoint);\n return `${base}/getAddressBalance?address=${encodeURIComponent(address)}`;\n}\n\n/**\n * Build URL for getAddressInformation call.\n */\nexport function buildGetAddressInfoUrl(baseEndpoint: string, address: string): string {\n const base = toV2Base(baseEndpoint);\n return `${base}/getAddressInformation?address=${encodeURIComponent(address)}`;\n}\n\n// ============================================================================\n// Network Detection\n// ============================================================================\n\n/**\n * Detect network from endpoint URL.\n */\nexport function detectNetworkFromEndpoint(endpoint: string): 'testnet' | 'mainnet' | null {\n const lower = endpoint.toLowerCase();\n\n if (\n lower.includes('testnet') ||\n lower.includes('test') ||\n lower.includes('sandbox')\n ) {\n return 'testnet';\n }\n\n if (\n lower.includes('mainnet') ||\n lower.includes('main') ||\n // TonCenter mainnet doesn't have 'mainnet' in URL\n (lower.includes('toncenter.com') && !lower.includes('testnet'))\n ) {\n return 'mainnet';\n }\n\n return null;\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate that a string is a valid HTTP(S) URL.\n */\nexport function isValidHttpUrl(str: string): boolean {\n try {\n const url = new URL(str);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Validate that a string is a valid WebSocket URL.\n */\nexport function isValidWsUrl(str: string): boolean {\n try {\n const url = new URL(str);\n return url.protocol === 'ws:' || url.protocol === 'wss:';\n } catch {\n return false;\n }\n}\n","/**\n * Unified Provider System - Health Checker\n *\n * Tests provider connectivity, measures latency, and compares block heights.\n * Identifies stale, degraded, or offline providers.\n */\n\nimport type {\n ResolvedProvider,\n ProviderHealthResult,\n ProviderStatus,\n Network,\n MasterchainInfo,\n TonApiResponse,\n Logger,\n TimeoutError,\n} from '../types';\nimport { normalizeV2Endpoint } from '../utils/endpoint';\nimport type { RateLimiterManager } from './rateLimiter';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[HealthChecker] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[HealthChecker] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[HealthChecker] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[HealthChecker] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Health Check Configuration\n// ============================================================================\n\nexport interface HealthCheckConfig {\n /** Request timeout in milliseconds */\n timeoutMs: number;\n /** Maximum blocks behind before marking as stale */\n maxBlocksBehind: number;\n /** Latency threshold (ms) for degraded status */\n degradedLatencyMs: number;\n}\n\nconst DEFAULT_CONFIG: HealthCheckConfig = {\n timeoutMs: 10000,\n maxBlocksBehind: 10,\n degradedLatencyMs: 3000,\n};\n\n// ============================================================================\n// Health Checker Class\n// ============================================================================\n\n/**\n * Health Checker\n *\n * Tests provider health by calling getMasterchainInfo and measuring\n * latency and block height.\n */\nexport class HealthChecker {\n private config: HealthCheckConfig;\n private logger: Logger;\n private results: Map<string, ProviderHealthResult> = new Map();\n private highestSeqno: Map<Network, number> = new Map();\n private rateLimiter: RateLimiterManager | null = null;\n\n constructor(\n config?: Partial<HealthCheckConfig>,\n logger?: Logger,\n rateLimiter?: RateLimiterManager\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.logger = logger || consoleLogger;\n this.rateLimiter = rateLimiter || null;\n }\n\n /**\n * Set rate limiter (can be set after construction)\n */\n setRateLimiter(rateLimiter: RateLimiterManager | null): void {\n this.rateLimiter = rateLimiter;\n }\n\n /**\n * Test a single provider's health\n */\n async testProvider(provider: ResolvedProvider): Promise<ProviderHealthResult> {\n const startTime = performance.now();\n const key = this.getResultKey(provider.id, provider.network);\n\n // Mark as testing\n const testingResult: ProviderHealthResult = {\n id: provider.id,\n network: provider.network,\n success: false,\n status: 'testing',\n latencyMs: null,\n seqno: null,\n blocksBehind: 0,\n lastTested: null,\n };\n this.results.set(key, testingResult);\n\n try {\n // Acquire rate limit token if rate limiter is available\n if (this.rateLimiter) {\n const acquired = await this.rateLimiter.acquire(provider.id, this.config.timeoutMs);\n if (!acquired) {\n throw new Error('Rate limit timeout - unable to acquire token for health check');\n }\n }\n\n // Get endpoint URL\n const endpoint = await this.getEndpoint(provider);\n if (!endpoint) {\n throw new Error('No valid endpoint available');\n }\n\n // Check for required API keys\n if (provider.type === 'tatum' && !provider.apiKey) {\n throw new Error('Tatum provider requires API key (set TATUM_API_KEY_TESTNET or TATUM_API_KEY_MAINNET)');\n }\n\n // Normalize endpoint for v2 API (provider-specific handling)\n let normalizedEndpoint = this.normalizeEndpointForProvider(provider, endpoint);\n \n // Debug logging for OnFinality\n if (provider.type === 'onfinality') {\n this.logger.debug(`OnFinality endpoint: ${endpoint} -> ${normalizedEndpoint}, API key: ${provider.apiKey ? 'set' : 'not set'}`);\n }\n\n // Call getMasterchainInfo with provider-specific handling\n // For OnFinality, if /rpc fails, it will automatically retry with /public\n let info: MasterchainInfo;\n try {\n info = await this.callGetMasterchainInfo(normalizedEndpoint, provider);\n } catch (error: any) {\n // If OnFinality /rpc fails with backend error and we have an API key, try /public\n if (\n provider.type === 'onfinality' &&\n normalizedEndpoint.includes('/rpc') &&\n provider.apiKey &&\n error.message?.includes('backend error')\n ) {\n this.logger.debug(`OnFinality /rpc failed, retrying with /public endpoint`);\n const publicEndpoint = normalizedEndpoint.replace('/rpc', '/public');\n info = await this.callGetMasterchainInfo(publicEndpoint, { ...provider, apiKey: undefined });\n } else {\n throw error;\n }\n }\n\n const endTime = performance.now();\n const latencyMs = Math.round(endTime - startTime);\n\n // Extract seqno - validate it's a valid block number\n const infoWithLast = info as { last?: { seqno?: number } };\n const seqno = infoWithLast.last?.seqno;\n \n // seqno must be a positive integer (blocks start from 1)\n // seqno=0 or undefined means invalid/malformed response\n if (!seqno || seqno <= 0 || !Number.isInteger(seqno)) {\n throw new Error('Invalid seqno in response (must be positive integer)');\n }\n\n // Update highest known seqno for this network\n const currentHighest = this.highestSeqno.get(provider.network) || 0;\n if (seqno > currentHighest) {\n this.highestSeqno.set(provider.network, seqno);\n }\n\n // Calculate blocks behind\n const blocksBehind = Math.max(0, (this.highestSeqno.get(provider.network) || seqno) - seqno);\n\n // Determine status\n let status: ProviderStatus = 'available';\n if (blocksBehind > this.config.maxBlocksBehind) {\n status = 'stale';\n } else if (latencyMs > this.config.degradedLatencyMs) {\n status = 'degraded';\n }\n\n const result: ProviderHealthResult = {\n id: provider.id,\n network: provider.network,\n success: true,\n status,\n latencyMs,\n seqno,\n blocksBehind,\n lastTested: new Date(),\n cachedEndpoint: normalizedEndpoint,\n };\n\n this.results.set(key, result);\n this.logger.debug(\n `Provider ${provider.id} health check: ${status} (${latencyMs}ms, seqno=${seqno}, behind=${blocksBehind})`\n );\n\n return result;\n } catch (error: any) {\n const endTime = performance.now();\n const latencyMs = Math.round(endTime - startTime);\n\n const errorMsg = error.message || String(error) || 'Unknown error';\n\n // Detect specific HTTP status codes\n const is429 = errorMsg.includes('429') || errorMsg.toLowerCase().includes('rate limit');\n const is404 = errorMsg.includes('404') || errorMsg.toLowerCase().includes('not found');\n const is503 = errorMsg.includes('503') || errorMsg.toLowerCase().includes('service unavailable');\n const is502 = errorMsg.includes('502') || errorMsg.toLowerCase().includes('bad gateway');\n const isTimeout = error.name === 'AbortError' || errorMsg.includes('timeout');\n \n // Detect OnFinality backend errors\n const isOnFinalityBackendError = provider.type === 'onfinality' && \n (errorMsg.includes('Backend error') || errorMsg.includes('backend error'));\n\n // Determine status based on error type\n let status: ProviderStatus = 'offline';\n if (is429) {\n status = 'degraded';\n } else if (is404 || is503 || is502 || isOnFinalityBackendError) {\n status = 'offline'; // Service unavailable or backend errors\n } else if (isTimeout) {\n status = 'offline';\n }\n\n const result: ProviderHealthResult = {\n id: provider.id,\n network: provider.network,\n success: false,\n status,\n latencyMs: isTimeout ? null : latencyMs,\n seqno: null,\n blocksBehind: 0,\n lastTested: new Date(),\n error: errorMsg,\n };\n\n this.results.set(key, result);\n this.logger.warn(`Provider ${provider.id} health check failed: ${result.error}`);\n\n return result;\n }\n }\n\n /**\n * Test multiple providers in parallel with staggered batches\n * \n * @param batchSize - Number of providers to test in parallel (default: 2)\n * @param batchDelayMs - Delay between batches in milliseconds (default: 500 to avoid rate limits)\n */\n async testProviders(\n providers: ResolvedProvider[],\n batchSize: number = 2,\n batchDelayMs: number = 500\n ): Promise<ProviderHealthResult[]> {\n const results: ProviderHealthResult[] = [];\n\n for (let i = 0; i < providers.length; i += batchSize) {\n const batch = providers.slice(i, i + batchSize);\n const batchResults = await Promise.all(\n batch.map((p) => this.testProvider(p))\n );\n results.push(...batchResults);\n\n // Add delay between batches (except for last batch)\n if (i + batchSize < providers.length && batchDelayMs > 0) {\n await this.sleep(batchDelayMs);\n }\n }\n\n return results;\n }\n\n /**\n * Get the last health result for a provider\n */\n getResult(providerId: string, network: Network): ProviderHealthResult | undefined {\n const key = this.getResultKey(providerId, network);\n return this.results.get(key);\n }\n\n /**\n * Get all results for a network\n */\n getResultsForNetwork(network: Network): ProviderHealthResult[] {\n const results: ProviderHealthResult[] = [];\n for (const [key, result] of this.results) {\n if (result.network === network) {\n results.push(result);\n }\n }\n return results;\n }\n\n /**\n * Get available providers for a network (status = available or degraded)\n */\n getAvailableProviders(network: Network): ProviderHealthResult[] {\n return this.getResultsForNetwork(network).filter(\n (r) => r.status === 'available' || r.status === 'degraded'\n );\n }\n\n /**\n * Get the best provider for a network (lowest latency among available)\n */\n getBestProvider(network: Network): ProviderHealthResult | undefined {\n const available = this.getAvailableProviders(network)\n .filter((r) => r.latencyMs !== null)\n .sort((a, b) => (a.latencyMs ?? Infinity) - (b.latencyMs ?? Infinity));\n\n return available[0];\n }\n\n /**\n * Get highest known seqno for a network\n */\n getHighestSeqno(network: Network): number {\n return this.highestSeqno.get(network) || 0;\n }\n\n /**\n * Clear all results\n */\n clearResults(): void {\n this.results.clear();\n this.highestSeqno.clear();\n }\n\n /**\n * Mark a provider as degraded (e.g., on 429 error)\n */\n markDegraded(providerId: string, network: Network, error?: string): void {\n const key = this.getResultKey(providerId, network);\n const existing = this.results.get(key);\n\n const result: ProviderHealthResult = existing ? {\n ...existing,\n success: false, // CRITICAL: Always set success: false for degraded providers\n status: 'degraded',\n error: error || 'Marked as degraded',\n lastTested: new Date(),\n } : {\n id: providerId,\n network,\n success: false,\n status: 'degraded',\n latencyMs: null,\n seqno: null,\n blocksBehind: 0,\n lastTested: new Date(),\n error: error || 'Marked as degraded',\n };\n\n this.results.set(key, result);\n }\n\n /**\n * Mark a provider as offline\n */\n markOffline(providerId: string, network: Network, error?: string): void {\n const key = this.getResultKey(providerId, network);\n const existing = this.results.get(key);\n\n const result: ProviderHealthResult = existing ? {\n ...existing,\n status: 'offline',\n success: false, // Ensure success is false for offline providers\n error: error || 'Marked as offline',\n lastTested: new Date(),\n } : {\n id: providerId,\n network,\n success: false,\n status: 'offline',\n latencyMs: null,\n seqno: null,\n blocksBehind: 0,\n lastTested: new Date(),\n error: error || 'Marked as offline',\n };\n\n this.results.set(key, result);\n }\n\n // ========================================================================\n // Private Methods\n // ========================================================================\n\n private getResultKey(providerId: string, network: Network): string {\n return `${providerId}-${network}`;\n }\n\n /**\n * Get endpoint URL for a provider (handles dynamic providers like Orbs)\n */\n private async getEndpoint(provider: ResolvedProvider): Promise<string | null> {\n // For dynamic providers (Orbs), use ton-access discovery\n if (provider.isDynamic && provider.type === 'orbs') {\n try {\n const { getHttpEndpoint } = await import('@orbs-network/ton-access');\n const endpoint = await getHttpEndpoint({ network: provider.network });\n return endpoint;\n } catch (error: any) {\n this.logger.warn(`Failed to get Orbs endpoint: ${error.message}`);\n return null;\n }\n }\n\n // Use static endpoint\n return provider.endpointV2 || provider.endpointV3 || null;\n }\n\n /**\n * Normalize endpoint for provider-specific requirements\n * \n * Note: normalizeV2Endpoint now handles all provider-specific cases correctly,\n * including Tatum (/jsonRPC), OnFinality (/public or /rpc), QuickNode, and GetBlock.\n */\n private normalizeEndpointForProvider(provider: ResolvedProvider, endpoint: string): string {\n // Handle legacy Tatum API format conversion (if needed)\n if (provider.type === 'tatum' && endpoint.includes('api.tatum.io/v3/blockchain/node')) {\n const network = provider.network === 'testnet' ? 'testnet' : 'mainnet';\n endpoint = `https://ton-${network}.gateway.tatum.io`;\n }\n \n // Use the unified normalization function which handles all providers correctly\n return normalizeV2Endpoint(endpoint);\n }\n\n /**\n * Call getMasterchainInfo API with provider-specific handling\n */\n private async callGetMasterchainInfo(\n endpoint: string,\n provider: ResolvedProvider\n ): Promise<MasterchainInfo> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeoutMs);\n\n // Build headers with provider-specific API key handling\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Tatum requires API key in x-api-key header\n if (provider.type === 'tatum' && provider.apiKey) {\n headers['x-api-key'] = provider.apiKey;\n }\n\n // OnFinality supports API key in header (preferred) or query params\n // Use header method to avoid query string issues\n if (provider.type === 'onfinality' && provider.apiKey) {\n headers['apikey'] = provider.apiKey;\n }\n\n // Other providers (TonCenter, Chainstack) use apiKey in TonClient, not in health check\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n id: '1',\n jsonrpc: '2.0',\n method: 'getMasterchainInfo',\n params: {},\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Check content type before parsing\n const contentType = response.headers.get('content-type') || '';\n let text: string | null = null;\n let data: unknown;\n\n // Read response as text first to check for errors\n if (!contentType.includes('application/json')) {\n text = await response.text();\n \n // For non-JSON responses, throw error (fallback will be handled at higher level)\n this.logger.debug(`${provider.type} non-JSON response (${contentType}): ${text.substring(0, 200)}`);\n \n // Special error message for OnFinality backend errors\n if (provider.type === 'onfinality' && text.includes('Backend error')) {\n throw new Error(`OnFinality backend error: ${text}`);\n }\n \n throw new Error(`Invalid response type: expected JSON, got ${contentType}. Response: ${text.substring(0, 100)}`);\n }\n\n // Parse JSON response\n if (!response.ok) {\n // Try to parse error response as JSON first\n try {\n data = await response.json();\n const errorObj = data as { error?: { message?: string; code?: number } | string };\n const errorMsg = typeof errorObj.error === 'string' \n ? errorObj.error \n : errorObj.error?.message || `HTTP ${response.status}`;\n throw new Error(errorMsg);\n } catch {\n throw new Error(`HTTP ${response.status}`);\n }\n }\n\n data = await response.json();\n\n let info: MasterchainInfo;\n\n // Handle different response formats\n if (data && typeof data === 'object') {\n const dataObj = data as Record<string, unknown>;\n \n // Handle wrapped response { ok: true, result: ... } (GetBlock, some providers)\n if ('ok' in dataObj) {\n if (!dataObj.ok) {\n const error = (dataObj as { error?: string }).error;\n throw new Error(error || 'API returned ok=false');\n }\n const result = (dataObj as { result?: unknown }).result;\n info = (result || dataObj) as MasterchainInfo;\n }\n // Handle JSON-RPC response { result: ... } (standard JSON-RPC)\n else if ('result' in dataObj) {\n info = (dataObj as { result: unknown }).result as MasterchainInfo;\n }\n // Handle direct response (some providers return data directly)\n else if ('last' in dataObj || '@type' in dataObj) {\n info = dataObj as unknown as MasterchainInfo;\n }\n // Handle error response { error: ... }\n else if ('error' in dataObj) {\n const errorObj = dataObj.error as { message?: string; code?: string } | string;\n const errorMsg = typeof errorObj === 'string' \n ? errorObj \n : errorObj?.message || errorObj?.code || String(errorObj);\n throw new Error(`API error: ${errorMsg}`);\n }\n // Unknown format\n else {\n throw new Error(`Unknown response format from ${provider.type}`);\n }\n } else {\n throw new Error(`Invalid response type: ${typeof data}`);\n }\n\n // Validate response structure\n if (!info || typeof info !== 'object') {\n // Log the actual response for debugging\n this.logger.debug(`Invalid response structure from ${provider.type}: ${JSON.stringify(data)}`);\n throw new Error('Invalid response structure');\n }\n\n // Validate seqno exists and is valid (blocks start from 1)\n const infoObj = info as { last?: { seqno?: number } };\n const seqno = infoObj.last?.seqno;\n if (seqno === undefined || seqno === null || seqno <= 0 || !Number.isInteger(seqno)) {\n // Log the actual response for debugging\n this.logger.debug(`Invalid seqno from ${provider.type}:`, { seqno, info });\n throw new Error(`Invalid seqno: ${seqno} (must be positive integer)`);\n }\n\n return info;\n } catch (error: any) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a health checker with default configuration\n */\nexport function createHealthChecker(\n config?: Partial<HealthCheckConfig>,\n logger?: Logger,\n rateLimiter?: RateLimiterManager\n): HealthChecker {\n return new HealthChecker(config, logger, rateLimiter);\n}\n","/**\n * Unified Provider System - Timeout Utilities\n *\n * Promise timeout helpers for async operations.\n */\n\nimport { TimeoutError } from '../types';\n\n// ============================================================================\n// Default Timeouts\n// ============================================================================\n\n/** Default timeout for TON provider requests */\nexport const DEFAULT_PROVIDER_TIMEOUT_MS = 30000;\n\n/** Default timeout for contract calls */\nexport const DEFAULT_CONTRACT_TIMEOUT_MS = 45000;\n\n/** Default timeout for health checks */\nexport const DEFAULT_HEALTH_CHECK_TIMEOUT_MS = 10000;\n\n// ============================================================================\n// Timeout Functions\n// ============================================================================\n\n/**\n * Execute a promise with a timeout.\n *\n * @param promise - The promise to execute\n * @param timeoutMs - Timeout in milliseconds\n * @param operationName - Name of the operation (for error messages)\n * @returns The result of the promise\n * @throws TimeoutError if the operation times out\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n operationName: string\n): Promise<T> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new TimeoutError(operationName, timeoutMs));\n }, timeoutMs);\n\n // Clear timeout if promise resolves/rejects before timeout\n // This prevents memory leaks in Node.js\n promise.finally(() => clearTimeout(timeoutId));\n });\n\n return Promise.race([promise, timeoutPromise]);\n}\n\n/**\n * Execute a function with a timeout.\n *\n * @param fn - The async function to execute\n * @param timeoutMs - Timeout in milliseconds\n * @param operationName - Name of the operation (for error messages)\n * @returns The result of the function\n * @throws TimeoutError if the operation times out\n */\nexport async function withTimeoutFn<T>(\n fn: () => Promise<T>,\n timeoutMs: number,\n operationName: string\n): Promise<T> {\n return withTimeout(fn(), timeoutMs, operationName);\n}\n\n/**\n * Create an AbortController with automatic timeout.\n *\n * @param timeoutMs - Timeout in milliseconds\n * @returns AbortController that will abort after timeout\n */\nexport function createTimeoutController(timeoutMs: number): {\n controller: AbortController;\n clear: () => void;\n} {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n return {\n controller,\n clear: () => clearTimeout(timeoutId),\n };\n}\n\n/**\n * Execute a fetch request with timeout.\n *\n * @param url - The URL to fetch\n * @param options - Fetch options (excluding signal)\n * @param timeoutMs - Timeout in milliseconds\n * @returns Fetch response\n * @throws TimeoutError if the request times out\n */\nexport async function fetchWithTimeout(\n url: string,\n options: Omit<RequestInit, 'signal'>,\n timeoutMs: number\n): Promise<Response> {\n const { controller, clear } = createTimeoutController(timeoutMs);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(url, timeoutMs, `Fetch to ${url} timed out after ${timeoutMs}ms`);\n }\n throw error;\n } finally {\n clear();\n }\n}\n\n// ============================================================================\n// Retry Utilities\n// ============================================================================\n\n/**\n * Retry options for async operations.\n */\nexport interface RetryOptions {\n /** Maximum number of retry attempts */\n maxRetries: number;\n /** Base delay between retries in ms */\n baseDelayMs: number;\n /** Maximum delay between retries in ms */\n maxDelayMs: number;\n /** Backoff multiplier for exponential backoff */\n backoffMultiplier: number;\n /** Function to determine if error is retryable */\n isRetryable?: (error: Error) => boolean;\n}\n\nconst DEFAULT_RETRY_OPTIONS: RetryOptions = {\n maxRetries: 3,\n baseDelayMs: 1000,\n maxDelayMs: 10000,\n backoffMultiplier: 2,\n};\n\n/**\n * Execute a function with automatic retries on failure.\n *\n * @param fn - The async function to execute\n * @param options - Retry options\n * @returns The result of the function\n * @throws The last error if all retries fail\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options?: Partial<RetryOptions>\n): Promise<T> {\n const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n // Check if error is retryable\n if (opts.isRetryable && !opts.isRetryable(error)) {\n throw error;\n }\n\n // Don't wait after last attempt\n if (attempt < opts.maxRetries) {\n const delay = Math.min(\n opts.baseDelayMs * Math.pow(opts.backoffMultiplier, attempt),\n opts.maxDelayMs\n );\n await sleep(delay);\n }\n }\n }\n\n throw lastError || new Error('Retry failed');\n}\n\n/**\n * Execute a function with both timeout and retry.\n *\n * @param fn - The async function to execute\n * @param timeoutMs - Timeout per attempt in milliseconds\n * @param operationName - Name of the operation\n * @param retryOptions - Retry options\n * @returns The result of the function\n */\nexport async function withTimeoutAndRetry<T>(\n fn: () => Promise<T>,\n timeoutMs: number,\n operationName: string,\n retryOptions?: Partial<RetryOptions>\n): Promise<T> {\n return withRetry(\n () => withTimeout(fn(), timeoutMs, operationName),\n {\n ...retryOptions,\n isRetryable: (error) => {\n // Timeout errors are retryable\n if (error instanceof TimeoutError) {\n return true;\n }\n // Custom retryable check\n if (retryOptions?.isRetryable) {\n return retryOptions.isRetryable(error);\n }\n // Default: retry on network errors\n const message = error.message?.toLowerCase() || '';\n return (\n message.includes('network') ||\n message.includes('fetch') ||\n message.includes('econnrefused') ||\n message.includes('etimedout')\n );\n },\n }\n );\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Sleep for a specified duration.\n *\n * @param ms - Duration in milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Check if an error is a timeout error.\n */\nexport function isTimeoutError(error: unknown): error is TimeoutError {\n return error instanceof TimeoutError;\n}\n\n/**\n * Check if an error appears to be a rate limit error.\n */\nexport function isRateLimitError(error: unknown): boolean {\n if (!error) return false;\n const message = (error as any).message?.toLowerCase() || '';\n const status = (error as any).status || (error as any).response?.status;\n return status === 429 || message.includes('rate limit') || message.includes('429');\n}\n","/**\n * Unified Provider System - Rate Limiter\n *\n * Token bucket rate limiter with per-provider tracking.\n * Implements request queuing, serialization, and exponential backoff.\n */\n\nimport type { RateLimitConfig, RateLimitState, Logger } from '../types';\nimport { RateLimitError } from '../types';\nimport { sleep } from '../utils/timeout';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[RateLimiter] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[RateLimiter] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[RateLimiter] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[RateLimiter] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Default Rate Limit Configurations\n// ============================================================================\n\n/**\n * Default rate limit config (conservative for public endpoints)\n */\nexport const DEFAULT_RATE_LIMIT: RateLimitConfig = {\n rps: 1,\n burstSize: 3,\n minDelayMs: 1000,\n backoffMultiplier: 2,\n maxBackoffMs: 30000,\n};\n\n/**\n * Chainstack free plan limits (25 RPS)\n */\nexport const CHAINSTACK_RATE_LIMIT: RateLimitConfig = {\n rps: 25,\n burstSize: 30,\n minDelayMs: 40,\n backoffMultiplier: 2,\n maxBackoffMs: 10000,\n};\n\n/**\n * QuickNode free plan limits (10 RPS)\n */\nexport const QUICKNODE_RATE_LIMIT: RateLimitConfig = {\n rps: 10,\n burstSize: 15,\n minDelayMs: 100,\n backoffMultiplier: 2,\n maxBackoffMs: 10000,\n};\n\n/**\n * Orbs TON Access (decentralized, no hard limit)\n */\nexport const ORBS_RATE_LIMIT: RateLimitConfig = {\n rps: 10,\n burstSize: 20,\n minDelayMs: 100,\n backoffMultiplier: 2,\n maxBackoffMs: 10000,\n};\n\n/**\n * Get rate limit config by provider type\n */\nexport function getRateLimitForType(type: string): RateLimitConfig {\n switch (type.toLowerCase()) {\n case 'chainstack':\n return CHAINSTACK_RATE_LIMIT;\n case 'quicknode':\n return QUICKNODE_RATE_LIMIT;\n case 'orbs':\n return ORBS_RATE_LIMIT;\n default:\n return DEFAULT_RATE_LIMIT;\n }\n}\n\n// ============================================================================\n// Token Bucket Rate Limiter\n// ============================================================================\n\n/**\n * Token Bucket Rate Limiter\n *\n * Implements a token bucket algorithm with:\n * - Configurable RPS and burst size\n * - Request queuing (FIFO)\n * - Serialized request processing\n * - Exponential backoff on 429 errors\n */\nexport class TokenBucketRateLimiter {\n private config: RateLimitConfig;\n private tokens: number;\n private lastRefill: number;\n private currentBackoff: number = 0;\n private consecutiveErrors: number = 0;\n private requestQueue: Array<() => void> = [];\n private processing: boolean = false;\n private logger: Logger;\n\n constructor(config?: Partial<RateLimitConfig>, logger?: Logger) {\n this.config = { ...DEFAULT_RATE_LIMIT, ...config };\n this.tokens = this.config.burstSize;\n this.lastRefill = Date.now();\n this.logger = logger || consoleLogger;\n }\n\n /**\n * Get current state\n */\n getState(): RateLimitState {\n this.refill();\n return {\n tokens: this.tokens,\n lastRefill: this.lastRefill,\n currentBackoff: this.currentBackoff,\n consecutiveErrors: this.consecutiveErrors,\n processing: this.processing,\n queueLength: this.requestQueue.length,\n };\n }\n\n /**\n * Acquire a token (wait if necessary)\n *\n * @param timeoutMs - Maximum time to wait for a token (default: 60s)\n * @returns true if token acquired, false if timeout\n */\n async acquire(timeoutMs: number = 60000): Promise<boolean> {\n const startTime = Date.now();\n\n // If already processing, wait in queue\n if (this.processing) {\n const acquired = await new Promise<boolean>((resolve) => {\n const checkTimeout = () => {\n if (Date.now() - startTime > timeoutMs) {\n // Remove from queue and reject\n const idx = this.requestQueue.indexOf(resolveCallback);\n if (idx >= 0) {\n this.requestQueue.splice(idx, 1);\n }\n resolve(false);\n }\n };\n\n const resolveCallback = () => resolve(true);\n this.requestQueue.push(resolveCallback);\n\n // Set timeout to check periodically\n const timeoutInterval = setInterval(checkTimeout, 1000);\n const cleanup = () => clearInterval(timeoutInterval);\n\n // Cleanup when resolved\n Promise.resolve().then(() => {\n if (this.requestQueue.includes(resolveCallback)) {\n // Still in queue, wait for resolution\n } else {\n cleanup();\n }\n });\n });\n\n if (!acquired) {\n return false;\n }\n }\n\n // Mark as processing\n this.processing = true;\n\n try {\n // Refill tokens\n this.refill();\n\n // Apply backoff if active\n if (this.currentBackoff > 0) {\n this.logger.debug(`Applying backoff: ${this.currentBackoff}ms`);\n await sleep(this.currentBackoff);\n // After backoff, reset lastRefill to ensure proper delay calculation\n // This prevents getting tokens too quickly after backoff\n this.lastRefill = Date.now();\n // Clear backoff after applying it (it will be set again if we get another 429)\n this.currentBackoff = 0;\n }\n\n // Wait for token if none available\n while (this.tokens <= 0) {\n if (Date.now() - startTime > timeoutMs) {\n return false;\n }\n\n // Wait for minimum delay\n await sleep(Math.min(100, this.config.minDelayMs));\n this.refill();\n }\n\n // Consume token\n this.tokens--;\n\n // Apply minimum delay between requests (always enforce for rate limiting)\n // For very low RPS providers, we must always enforce the delay to prevent 429 errors\n // After backoff, we still need to ensure minDelayMs has passed since lastRefill\n const timeSinceLastRefill = Date.now() - this.lastRefill;\n if (timeSinceLastRefill < this.config.minDelayMs) {\n await sleep(this.config.minDelayMs - timeSinceLastRefill);\n }\n // Note: If timeSinceLastRefill >= minDelayMs, we've already waited long enough\n // due to the token refill mechanism, so no additional delay is needed\n // However, we still update lastRefill to track when this request was made\n\n // Update lastRefill AFTER the delay to ensure accurate timing for next request\n this.lastRefill = Date.now();\n return true;\n } finally {\n // Release lock and process next in queue\n this.processing = false;\n if (this.requestQueue.length > 0) {\n const next = this.requestQueue.shift()!;\n next();\n }\n }\n }\n\n /**\n * Release a token (call on request completion)\n */\n release(): void {\n // Token is automatically restored by refill()\n // This method can be used for custom logic if needed\n }\n\n /**\n * Report a successful request (resets backoff)\n */\n reportSuccess(): void {\n this.currentBackoff = 0;\n this.consecutiveErrors = 0;\n }\n\n /**\n * Report a rate limit error (applies backoff)\n */\n reportRateLimitError(): void {\n this.consecutiveErrors++;\n\n // Apply exponential backoff\n if (this.currentBackoff === 0) {\n this.currentBackoff = this.config.minDelayMs * this.config.backoffMultiplier;\n } else {\n this.currentBackoff = Math.min(\n this.currentBackoff * this.config.backoffMultiplier,\n this.config.maxBackoffMs\n );\n }\n\n // Reset tokens to 0 on rate limit error to prevent immediate retry\n // Reset lastRefill to now so that refill calculation is correct after backoff\n // This ensures we wait for backoff + proper token refill before next request\n this.tokens = 0;\n this.lastRefill = Date.now();\n\n this.logger.warn(`Rate limit hit, backoff: ${this.currentBackoff}ms, errors: ${this.consecutiveErrors}`);\n }\n\n /**\n * Report a general error\n */\n reportError(): void {\n this.consecutiveErrors++;\n\n // Less aggressive backoff for non-rate-limit errors\n if (this.consecutiveErrors >= 3) {\n this.currentBackoff = Math.min(\n this.config.minDelayMs * this.consecutiveErrors,\n this.config.maxBackoffMs / 2\n );\n }\n }\n\n /**\n * Reset rate limiter state\n */\n reset(): void {\n this.tokens = this.config.burstSize;\n this.lastRefill = Date.now();\n this.currentBackoff = 0;\n this.consecutiveErrors = 0;\n // Don't clear queue - let pending requests complete\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<RateLimitConfig>): void {\n this.config = { ...this.config, ...config };\n // Adjust burst size if needed\n if (this.tokens > this.config.burstSize) {\n this.tokens = this.config.burstSize;\n }\n }\n\n /**\n * Refill tokens based on time elapsed\n */\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n const tokensToAdd = Math.floor((elapsed / 1000) * this.config.rps);\n\n if (tokensToAdd > 0) {\n this.tokens = Math.min(this.config.burstSize, this.tokens + tokensToAdd);\n this.lastRefill = now;\n }\n }\n}\n\n// ============================================================================\n// Provider Rate Limiter Manager\n// ============================================================================\n\n/**\n * Provider Rate Limiter Manager\n *\n * Manages rate limiters for multiple providers.\n */\nexport class RateLimiterManager {\n private limiters: Map<string, TokenBucketRateLimiter> = new Map();\n private configs: Map<string, RateLimitConfig> = new Map();\n private logger: Logger;\n\n constructor(logger?: Logger) {\n this.logger = logger || consoleLogger;\n }\n\n /**\n * Get or create rate limiter for a provider\n */\n getLimiter(providerId: string, config?: Partial<RateLimitConfig>): TokenBucketRateLimiter {\n let limiter = this.limiters.get(providerId);\n\n if (!limiter) {\n const savedConfig = this.configs.get(providerId);\n limiter = new TokenBucketRateLimiter(\n { ...savedConfig, ...config },\n this.logger\n );\n this.limiters.set(providerId, limiter);\n }\n\n return limiter;\n }\n\n /**\n * Set rate limit config for a provider\n */\n setConfig(providerId: string, config: RateLimitConfig): void {\n this.configs.set(providerId, config);\n\n // Update existing limiter if present\n const limiter = this.limiters.get(providerId);\n if (limiter) {\n limiter.updateConfig(config);\n }\n }\n\n /**\n * Get rate limit state for a provider\n */\n getState(providerId: string): RateLimitState | null {\n const limiter = this.limiters.get(providerId);\n return limiter ? limiter.getState() : null;\n }\n\n /**\n * Acquire token for a provider\n */\n async acquire(providerId: string, timeoutMs?: number): Promise<boolean> {\n const limiter = this.getLimiter(providerId);\n return limiter.acquire(timeoutMs);\n }\n\n /**\n * Report success for a provider\n */\n reportSuccess(providerId: string): void {\n const limiter = this.limiters.get(providerId);\n if (limiter) {\n limiter.reportSuccess();\n }\n }\n\n /**\n * Report rate limit error for a provider\n */\n reportRateLimitError(providerId: string): void {\n const limiter = this.getLimiter(providerId);\n limiter.reportRateLimitError();\n }\n\n /**\n * Report general error for a provider\n */\n reportError(providerId: string): void {\n const limiter = this.getLimiter(providerId);\n limiter.reportError();\n }\n\n /**\n * Reset a provider's rate limiter\n */\n reset(providerId: string): void {\n const limiter = this.limiters.get(providerId);\n if (limiter) {\n limiter.reset();\n }\n }\n\n /**\n * Reset all rate limiters\n */\n resetAll(): void {\n for (const limiter of this.limiters.values()) {\n limiter.reset();\n }\n }\n\n /**\n * Remove a provider's rate limiter\n */\n remove(providerId: string): void {\n this.limiters.delete(providerId);\n this.configs.delete(providerId);\n }\n\n /**\n * Clear all limiters\n */\n clear(): void {\n this.limiters.clear();\n this.configs.clear();\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a rate limiter with RPS-based config\n */\nexport function createRateLimiter(rps: number, logger?: Logger): TokenBucketRateLimiter {\n return new TokenBucketRateLimiter(\n {\n rps,\n burstSize: Math.max(3, Math.ceil(rps * 1.5)),\n minDelayMs: Math.ceil(1000 / rps),\n backoffMultiplier: 2,\n maxBackoffMs: 30000,\n },\n logger\n );\n}\n\n/**\n * Create a rate limiter manager\n */\nexport function createRateLimiterManager(logger?: Logger): RateLimiterManager {\n return new RateLimiterManager(logger);\n}\n","/**\n * Unified Provider System - Provider Selector\n *\n * Selects the best available provider based on health, latency, and priority.\n * Supports auto-selection, manual override, and custom endpoint.\n */\n\nimport type {\n ResolvedProvider,\n ProviderHealthResult,\n ProviderStatus,\n Network,\n Logger,\n} from '../types';\nimport { ProviderRegistry } from './registry';\nimport { HealthChecker } from './healthChecker';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[ProviderSelector] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[ProviderSelector] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[ProviderSelector] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[ProviderSelector] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Selection Configuration\n// ============================================================================\n\nexport interface SelectionConfig {\n /** Prefer providers with latency below this threshold (ms) */\n preferredLatencyMs: number;\n /** Weight for latency in scoring (0-1) */\n latencyWeight: number;\n /** Weight for priority in scoring (0-1) */\n priorityWeight: number;\n /** Weight for block freshness in scoring (0-1) */\n freshnessWeight: number;\n /** Minimum acceptable provider status */\n minStatus: ProviderStatus[];\n}\n\nconst DEFAULT_CONFIG: SelectionConfig = {\n preferredLatencyMs: 1000,\n latencyWeight: 0.4,\n priorityWeight: 0.3,\n freshnessWeight: 0.3,\n minStatus: ['available', 'degraded'],\n};\n\n// ============================================================================\n// Provider Selector\n// ============================================================================\n\n/**\n * Provider Selector\n *\n * Selects the best provider based on multiple criteria:\n * - Health status (available > degraded > offline)\n * - Latency (lower is better)\n * - Priority (from config, lower is higher priority)\n * - Block freshness (fewer blocks behind is better)\n */\nexport class ProviderSelector {\n private registry: ProviderRegistry;\n private healthChecker: HealthChecker;\n private config: SelectionConfig;\n private logger: Logger;\n\n // Selection state\n private selectedProviderId: string | null = null;\n private autoSelect: boolean = true;\n private customEndpoint: string | null = null;\n private bestProviderByNetwork: Map<Network, string> = new Map();\n // Track currently active provider per network (the one actually being used)\n private activeProviderByNetwork: Map<Network, string> = new Map();\n\n constructor(\n registry: ProviderRegistry,\n healthChecker: HealthChecker,\n config?: Partial<SelectionConfig>,\n logger?: Logger\n ) {\n this.registry = registry;\n this.healthChecker = healthChecker;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.logger = logger || consoleLogger;\n }\n\n // ========================================================================\n // Selection Methods\n // ========================================================================\n\n /**\n * Get the best provider for a network\n */\n getBestProvider(network: Network): ResolvedProvider | null {\n // Custom endpoint override\n if (this.customEndpoint) {\n return this.createCustomProvider(network);\n }\n\n // Manual selection\n if (!this.autoSelect && this.selectedProviderId) {\n const provider = this.registry.getProvider(this.selectedProviderId);\n if (provider && provider.network === network) {\n // Track active provider\n this.activeProviderByNetwork.set(network, provider.id);\n return provider;\n }\n this.logger.warn(\n `Selected provider ${this.selectedProviderId} not found or wrong network, using auto-select`\n );\n }\n\n // Auto-selection: use cached best or find new\n const cachedBestId = this.bestProviderByNetwork.get(network);\n if (cachedBestId) {\n const cached = this.registry.getProvider(cachedBestId);\n const health = this.healthChecker.getResult(cachedBestId, network);\n\n // Verify cached provider is still healthy\n // CRITICAL: Must check success: false first - never use failed providers\n if (\n cached &&\n health &&\n health.success !== false &&\n health.success !== undefined && // Explicitly check for undefined\n this.config.minStatus.includes(health.status)\n ) {\n // Update active provider tracking\n this.activeProviderByNetwork.set(network, cachedBestId);\n return cached;\n } else {\n // Cached provider is no longer healthy, clear cache\n this.bestProviderByNetwork.delete(network);\n this.activeProviderByNetwork.delete(network);\n }\n }\n\n // Find new best provider\n return this.findBestProvider(network);\n }\n\n /**\n * Find the best provider for a network (recalculates)\n */\n findBestProvider(network: Network): ResolvedProvider | null {\n const providers = this.registry.getProvidersForNetwork(network);\n if (providers.length === 0) {\n this.logger.warn(`No providers available for ${network}`);\n return null;\n }\n\n // Score each provider\n const scored = providers\n .map((provider) => ({\n provider,\n score: this.scoreProvider(provider, network),\n }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score);\n\n if (scored.length === 0) {\n // Fall back to default order if no healthy providers\n // But only if the default provider hasn't been tested or has success: true\n const defaults = this.registry.getDefaultOrderForNetwork(network);\n for (const defaultProvider of defaults) {\n const health = this.healthChecker.getResult(defaultProvider.id, network);\n // CRITICAL: Only use default if it hasn't been tested OR if it succeeded\n // Never use providers with success: false\n if (!health || health.status === 'untested') {\n // Untested - safe to try\n this.logger.warn(\n `No healthy providers for ${network}, using untested default: ${defaultProvider.id}`\n );\n this.activeProviderByNetwork.set(network, defaultProvider.id);\n return defaultProvider;\n } else if (health.success === true) {\n // Explicitly succeeded - safe to use\n this.logger.warn(\n `No healthy providers for ${network}, using default: ${defaultProvider.id}`\n );\n this.activeProviderByNetwork.set(network, defaultProvider.id);\n return defaultProvider;\n }\n // If health.success === false, skip this provider\n }\n \n // If all defaults failed, try any untested provider (but not failed ones)\n for (const provider of providers) {\n const health = this.healthChecker.getResult(provider.id, network);\n // Only use untested providers, never failed ones\n if (!health || health.status === 'untested') {\n this.logger.warn(\n `No tested healthy providers for ${network}, using untested: ${provider.id}`\n );\n this.activeProviderByNetwork.set(network, provider.id);\n return provider;\n }\n }\n \n // Last resort: return null (caller should handle this)\n this.logger.error(`No available providers for ${network} (all tested and failed)`);\n return null;\n }\n\n const best = scored[0].provider;\n const bestHealth = this.healthChecker.getResult(best.id, network);\n \n // Only cache and log if provider has been tested and is healthy\n if (bestHealth && bestHealth.success === true) {\n this.bestProviderByNetwork.set(network, best.id);\n this.activeProviderByNetwork.set(network, best.id);\n this.logger.debug(\n `Best provider for ${network}: ${best.id} (score: ${scored[0].score.toFixed(2)})`\n );\n } else {\n // Don't cache untested providers, but still return them as fallback\n // Track active provider even if untested (so we know which one failed)\n this.activeProviderByNetwork.set(network, best.id);\n this.logger.debug(\n `Best provider for ${network}: ${best.id} (score: ${scored[0].score.toFixed(2)}, untested)`\n );\n }\n\n return best;\n }\n\n /**\n * Get all available providers for a network, sorted by score\n */\n getAvailableProviders(network: Network): ResolvedProvider[] {\n const providers = this.registry.getProvidersForNetwork(network);\n\n return providers\n .map((provider) => ({\n provider,\n score: this.scoreProvider(provider, network),\n }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score)\n .map((item) => item.provider);\n }\n\n /**\n * Get the next best provider (for failover)\n */\n getNextProvider(\n network: Network,\n excludeIds: string[]\n ): ResolvedProvider | null {\n const providers = this.registry.getProvidersForNetwork(network);\n\n const available = providers\n .filter((p) => !excludeIds.includes(p.id))\n .map((provider) => ({\n provider,\n score: this.scoreProvider(provider, network),\n }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score);\n\n if (available.length === 0) {\n return null;\n }\n\n return available[0].provider;\n }\n\n // ========================================================================\n // Scoring\n // ========================================================================\n\n /**\n * Calculate a score for a provider (higher is better)\n */\n private scoreProvider(provider: ResolvedProvider, network: Network): number {\n const health = this.healthChecker.getResult(provider.id, network);\n\n // No health data = untested = very low score (only used as last resort)\n // Prefer tested providers even if they're degraded over untested ones\n if (!health || health.status === 'untested') {\n return 0.01 * (1 / (provider.priority + 1));\n }\n\n // Providers that failed health check should not be selected\n // Even if status is 'degraded' (e.g., HTTP 429), if success=false, don't use it\n if (health.success === false) {\n return 0;\n }\n\n // Offline providers get zero score\n if (health.status === 'offline') {\n return 0;\n }\n\n // Check minimum status\n if (!this.config.minStatus.includes(health.status)) {\n return 0;\n }\n\n // Calculate component scores (0-1)\n const statusScore = this.getStatusScore(health.status);\n const latencyScore = this.getLatencyScore(health.latencyMs);\n const priorityScore = this.getPriorityScore(provider.priority);\n const freshnessScore = this.getFreshnessScore(health.blocksBehind);\n\n // Weighted combination\n const score =\n statusScore * 0.2 + // Base status score\n latencyScore * this.config.latencyWeight +\n priorityScore * this.config.priorityWeight +\n freshnessScore * this.config.freshnessWeight;\n\n return score;\n }\n\n private getStatusScore(status: ProviderStatus): number {\n switch (status) {\n case 'available':\n return 1.0;\n case 'degraded':\n return 0.5;\n case 'stale':\n return 0.3;\n default:\n return 0;\n }\n }\n\n private getLatencyScore(latencyMs: number | null): number {\n if (latencyMs === null) {\n return 0.5; // Unknown latency gets middle score\n }\n\n // Score based on preferred latency (exponential decay)\n const ratio = latencyMs / this.config.preferredLatencyMs;\n return Math.max(0, 1 - Math.log(ratio + 1) / Math.log(11));\n }\n\n private getPriorityScore(priority: number): number {\n // Priority 0 = score 1, priority 100 = score 0\n return Math.max(0, 1 - priority / 100);\n }\n\n private getFreshnessScore(blocksBehind: number): number {\n // 0 blocks behind = score 1, 10+ blocks = score 0\n return Math.max(0, 1 - blocksBehind / 10);\n }\n\n // ========================================================================\n // Selection Control\n // ========================================================================\n\n /**\n * Set manual provider selection\n */\n setSelectedProvider(providerId: string | null): void {\n this.selectedProviderId = providerId;\n if (providerId !== null) {\n this.autoSelect = false;\n }\n this.logger.info(`Selected provider: ${providerId || '(auto)'}`);\n }\n\n /**\n * Get currently selected provider ID\n */\n getSelectedProviderId(): string | null {\n return this.selectedProviderId;\n }\n\n /**\n * Enable/disable auto-selection\n */\n setAutoSelect(enabled: boolean): void {\n this.autoSelect = enabled;\n if (enabled) {\n this.selectedProviderId = null;\n }\n this.logger.info(`Auto-select: ${enabled}`);\n }\n\n /**\n * Check if auto-selection is enabled\n */\n isAutoSelectEnabled(): boolean {\n return this.autoSelect;\n }\n\n /**\n * Set custom endpoint override\n */\n setCustomEndpoint(endpoint: string | null): void {\n this.customEndpoint = endpoint?.trim() || null;\n this.logger.info(`Custom endpoint: ${this.customEndpoint || '(none)'}`);\n }\n\n /**\n * Get custom endpoint\n */\n getCustomEndpoint(): string | null {\n return this.customEndpoint;\n }\n\n /**\n * Check if using custom endpoint\n */\n isUsingCustomEndpoint(): boolean {\n return this.customEndpoint !== null && this.customEndpoint.length > 0;\n }\n\n /**\n * Clear cached best providers (forces recalculation)\n * @param network - Optional network to clear cache for. If not provided, clears all networks.\n */\n clearCache(network?: Network): void {\n if (network) {\n this.bestProviderByNetwork.delete(network);\n this.activeProviderByNetwork.delete(network);\n } else {\n this.bestProviderByNetwork.clear();\n this.activeProviderByNetwork.clear();\n }\n }\n\n /**\n * Update best provider after health check\n */\n updateBestProvider(network: Network): void {\n this.findBestProvider(network);\n }\n\n /**\n * Handle provider failure (switch to next best)\n */\n handleProviderFailure(providerId: string, network: Network): ResolvedProvider | null {\n // Clear cached best if it was the failing provider\n if (this.bestProviderByNetwork.get(network) === providerId) {\n this.bestProviderByNetwork.delete(network);\n }\n \n // Clear active provider cache for this network to force re-selection\n this.activeProviderByNetwork.delete(network);\n\n // Find next best\n return this.getNextProvider(network, [providerId]);\n }\n \n /**\n * Get the currently active provider ID for a network\n * (the one that was last selected and is being used)\n */\n getActiveProviderId(network: Network): string | null {\n return this.activeProviderByNetwork.get(network) || null;\n }\n\n // ========================================================================\n // Info\n // ========================================================================\n\n /**\n * Get active provider info\n */\n getActiveProviderInfo(\n network: Network\n ): { id: string; name: string; isCustom: boolean } | null {\n if (this.customEndpoint) {\n return { id: 'custom', name: 'Custom Endpoint', isCustom: true };\n }\n\n const provider = this.getBestProvider(network);\n if (provider) {\n return { id: provider.id, name: provider.name, isCustom: false };\n }\n\n return null;\n }\n\n // ========================================================================\n // Private Helpers\n // ========================================================================\n\n /**\n * Create a pseudo-provider for custom endpoint\n */\n private createCustomProvider(network: Network): ResolvedProvider {\n return {\n id: 'custom',\n name: 'Custom Endpoint',\n type: 'custom',\n network,\n endpointV2: this.customEndpoint!,\n rps: 10,\n priority: 0,\n isDynamic: false,\n };\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a provider selector\n */\nexport function createSelector(\n registry: ProviderRegistry,\n healthChecker: HealthChecker,\n config?: Partial<SelectionConfig>,\n logger?: Logger\n): ProviderSelector {\n return new ProviderSelector(registry, healthChecker, config, logger);\n}\n","/**\n * Unified Provider System - Provider Manager\n *\n * Main entry point for the provider system.\n * Coordinates registry, health checker, rate limiter, and selector.\n */\n\nimport type {\n Network,\n ResolvedProvider,\n ProviderHealthResult,\n ProviderManagerOptions,\n ProviderManagerState,\n ProviderState,\n RateLimitConfig,\n Logger,\n StateListener,\n} from '../types';\nimport { loadConfig, mergeWithDefaults, createDefaultConfig } from '../config';\nimport { ProviderRegistry, createRegistryFromFile } from './registry';\nimport { HealthChecker, createHealthChecker } from './healthChecker';\nimport { RateLimiterManager, createRateLimiterManager, getRateLimitForType } from './rateLimiter';\nimport { ProviderSelector, createSelector } from './selector';\nimport { normalizeV2Endpoint } from '../utils/endpoint';\nimport { isRateLimitError } from '../utils/timeout';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[ProviderManager] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[ProviderManager] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[ProviderManager] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[ProviderManager] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Default Options\n// ============================================================================\n\nconst DEFAULT_OPTIONS: Required<ProviderManagerOptions> = {\n configPath: '', // Unused - config is loaded from provider_system/rpc.json\n adapter: 'node',\n autoInit: true,\n requestTimeoutMs: 10000,\n healthCheckIntervalMs: 0, // Disabled by default\n maxBlocksBehind: 10,\n logger: consoleLogger,\n};\n\n// ============================================================================\n// Provider Manager\n// ============================================================================\n\n/**\n * Provider Manager\n *\n * Main entry point for the unified provider system.\n * Manages providers, health checks, rate limiting, and selection.\n *\n * Usage:\n * ```typescript\n * // Singleton pattern (Node.js)\n * const pm = ProviderManager.getInstance();\n * await pm.init('testnet');\n * const endpoint = await pm.getEndpoint();\n *\n * // Instance pattern (Browser/React)\n * const pm = new ProviderManager({ adapter: 'browser' });\n * await pm.init(network);\n * ```\n */\nexport class ProviderManager {\n // Singleton instance\n private static instance: ProviderManager | null = null;\n\n // Components\n private registry: ProviderRegistry | null = null;\n private healthChecker: HealthChecker | null = null;\n private rateLimiter: RateLimiterManager | null = null;\n private selector: ProviderSelector | null = null;\n\n // State\n private options: Required<ProviderManagerOptions>;\n private network: Network | null = null;\n private initialized: boolean = false;\n private isTesting: boolean = false;\n private healthCheckInterval: NodeJS.Timeout | null = null;\n private listeners: Set<StateListener> = new Set();\n\n constructor(options?: ProviderManagerOptions) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n // ========================================================================\n // Singleton Pattern\n // ========================================================================\n\n /**\n * Get singleton instance (recommended for Node.js)\n */\n static getInstance(options?: ProviderManagerOptions): ProviderManager {\n if (!ProviderManager.instance) {\n ProviderManager.instance = new ProviderManager(options);\n }\n return ProviderManager.instance;\n }\n\n /**\n * Reset singleton instance (for testing)\n */\n static resetInstance(): void {\n if (ProviderManager.instance) {\n ProviderManager.instance.destroy();\n ProviderManager.instance = null;\n }\n }\n\n // ========================================================================\n // Initialization\n // ========================================================================\n\n /**\n * Initialize the provider manager\n *\n * @param network - Network to initialize for\n * @param testProviders - Whether to test providers immediately (default: true)\n */\n async init(network: Network, testProviders: boolean = true): Promise<void> {\n if (this.initialized && this.network === network) {\n this.options.logger.debug('Already initialized for this network');\n return;\n }\n\n this.options.logger.info(`Initializing for ${network}...`);\n this.network = network;\n\n // Load configuration from provider_system/rpc.json\n const config = await loadConfig();\n const mergedConfig = mergeWithDefaults(config);\n\n // Create components\n this.registry = new ProviderRegistry(mergedConfig, this.options.logger);\n this.rateLimiter = createRateLimiterManager(this.options.logger);\n \n // Configure rate limiters for each provider BEFORE creating health checker\n for (const provider of this.registry.getAllProviders()) {\n const config = getRateLimitForType(provider.type);\n // Add buffer to minDelayMs to be more conservative and avoid hitting limits\n // For very low RPS (<=3), use 20% buffer; for others, use 10%\n const bufferMultiplier = provider.rps <= 3 ? 1.2 : 1.1;\n const minDelayMs = Math.ceil((1000 / provider.rps) * bufferMultiplier);\n // Calculate conservative burst size based on RPS:\n // - For very low RPS (<=3): burst size of 1 to be extremely conservative\n // - For low RPS (4-5): burst size of 2\n // - For higher RPS: use 1.5x RPS (standard token bucket pattern)\n let burstSize: number;\n if (provider.rps <= 3) {\n burstSize = 1; // Very conservative for low RPS providers like Tatum\n } else if (provider.rps <= 5) {\n burstSize = 2; // Conservative for low RPS\n } else {\n burstSize = Math.max(3, Math.ceil(provider.rps * 1.5)); // 150% for higher RPS\n }\n \n this.rateLimiter.setConfig(provider.id, {\n ...config,\n rps: provider.rps,\n minDelayMs,\n burstSize,\n });\n }\n \n // Create health checker with rate limiter\n this.healthChecker = createHealthChecker(\n {\n timeoutMs: this.options.requestTimeoutMs,\n maxBlocksBehind: this.options.maxBlocksBehind,\n },\n this.options.logger,\n this.rateLimiter\n );\n \n this.selector = createSelector(\n this.registry,\n this.healthChecker,\n undefined,\n this.options.logger\n );\n\n this.initialized = true;\n this.notifyListeners();\n\n // Test providers if requested\n if (testProviders) {\n await this.testAllProviders();\n }\n\n // Start health check interval if configured\n if (this.options.healthCheckIntervalMs > 0) {\n this.startHealthCheckInterval();\n }\n\n this.options.logger.info('Initialization complete');\n }\n\n /**\n * Check if manager is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Destroy the manager (cleanup)\n */\n destroy(): void {\n this.stopHealthCheckInterval();\n this.listeners.clear();\n this.registry = null;\n this.healthChecker = null;\n this.rateLimiter = null;\n this.selector = null;\n this.initialized = false;\n this.network = null;\n }\n\n // ========================================================================\n // Provider Testing\n // ========================================================================\n\n /**\n * Test all providers for current network\n */\n async testAllProviders(): Promise<ProviderHealthResult[]> {\n this.ensureInitialized();\n\n if (this.isTesting) {\n this.options.logger.debug('Already testing providers');\n return [];\n }\n\n this.isTesting = true;\n this.notifyListeners();\n\n this.options.logger.info(`Testing all providers for ${this.network}...`);\n\n try {\n const providers = this.registry!.getProvidersForNetwork(this.network!);\n const results = await this.healthChecker!.testProviders(providers);\n\n // Update selector with new best provider\n this.selector!.updateBestProvider(this.network!);\n\n const available = results.filter((r) => r.success);\n this.options.logger.info(\n `Provider testing complete: ${available.length}/${results.length} available`\n );\n\n return results;\n } finally {\n this.isTesting = false;\n this.notifyListeners();\n }\n }\n\n /**\n * Test a specific provider\n */\n async testProvider(providerId: string): Promise<ProviderHealthResult | null> {\n this.ensureInitialized();\n\n const provider = this.registry!.getProvider(providerId);\n if (!provider) {\n this.options.logger.warn(`Provider ${providerId} not found`);\n return null;\n }\n\n return this.healthChecker!.testProvider(provider);\n }\n\n /**\n * Check if testing is in progress\n */\n isTestingProviders(): boolean {\n return this.isTesting;\n }\n\n // ========================================================================\n // Endpoint Access\n // ========================================================================\n\n /**\n * Get endpoint URL for current network\n *\n * Handles: custom endpoint > manual selection > auto-selection > fallback\n */\n async getEndpoint(): Promise<string> {\n this.ensureInitialized();\n\n const provider = this.selector!.getBestProvider(this.network!);\n if (!provider) {\n // Fallback to public endpoint\n this.options.logger.warn('No providers available, using fallback');\n return this.getFallbackEndpoint();\n }\n \n // Track active provider for error reporting\n this.selector!.getActiveProviderId(this.network!) || this.selector!.getBestProvider(this.network!);\n\n // Handle dynamic providers (Orbs)\n if (provider.isDynamic && provider.type === 'orbs') {\n try {\n const { getHttpEndpoint } = await import('@orbs-network/ton-access');\n const endpoint = await getHttpEndpoint({ network: this.network! });\n return normalizeV2Endpoint(endpoint);\n } catch (error: any) {\n this.options.logger.warn(`Failed to get Orbs endpoint: ${error.message}`);\n // Fall through to static endpoint\n }\n }\n\n return normalizeV2Endpoint(provider.endpointV2);\n }\n\n /**\n * Get endpoint with rate limiting\n *\n * Waits for rate limit token before returning endpoint.\n * \n * @param forceRefresh - If true, clears cache and forces re-selection\n */\n async getEndpointWithRateLimit(timeoutMs?: number, forceRefresh: boolean = false): Promise<string> {\n this.ensureInitialized();\n\n // Clear cache if force refresh requested\n if (forceRefresh) {\n this.selector!.clearCache(this.network!);\n }\n\n const provider = this.selector!.getBestProvider(this.network!);\n if (!provider) {\n return this.getFallbackEndpoint();\n }\n\n // Acquire rate limit token\n const acquired = await this.rateLimiter!.acquire(provider.id, timeoutMs);\n if (!acquired) {\n this.options.logger.warn(`Rate limit timeout for ${provider.id}`);\n // Try next provider\n const next = this.selector!.getNextProvider(this.network!, [provider.id]);\n if (next) {\n return normalizeV2Endpoint(next.endpointV2);\n }\n return this.getFallbackEndpoint();\n }\n\n return normalizeV2Endpoint(provider.endpointV2);\n }\n\n /**\n * Get current active provider\n */\n getActiveProvider(): ResolvedProvider | null {\n if (!this.initialized || !this.network) {\n return null;\n }\n return this.selector!.getBestProvider(this.network);\n }\n\n /**\n * Get active provider info\n */\n getActiveProviderInfo(): { id: string; name: string; isCustom: boolean } | null {\n if (!this.initialized || !this.network) {\n return null;\n }\n return this.selector!.getActiveProviderInfo(this.network);\n }\n\n // ========================================================================\n // Error Reporting\n // ========================================================================\n\n /**\n * Report a successful request\n */\n reportSuccess(): void {\n if (!this.initialized || !this.network) return;\n\n const provider = this.selector!.getBestProvider(this.network);\n if (provider) {\n this.rateLimiter!.reportSuccess(provider.id);\n }\n }\n\n /**\n * Report an error (triggers provider switch if needed)\n */\n reportError(error: Error | string): void {\n if (!this.initialized || !this.network) return;\n\n // Get the ACTIVE provider (the one that just failed), not the \"best\" one\n // This ensures we mark the correct provider as failed\n const activeProviderId = this.selector!.getActiveProviderId(this.network);\n let provider: ResolvedProvider | null = null;\n \n if (activeProviderId) {\n provider = this.registry!.getProvider(activeProviderId) || null;\n }\n \n // Fallback to best provider if no active provider tracked\n if (!provider) {\n provider = this.selector!.getBestProvider(this.network);\n }\n \n if (!provider) return;\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n const errorMsgLower = errorMsg.toLowerCase();\n\n // Detect error types to determine how to mark the provider\n const is429 = errorMsgLower.includes('429') || errorMsgLower.includes('rate limit');\n const is503 = errorMsgLower.includes('503') || errorMsgLower.includes('service unavailable');\n const is502 = errorMsgLower.includes('502') || errorMsgLower.includes('bad gateway');\n const is404 = errorMsgLower.includes('404') || errorMsgLower.includes('not found');\n const isTimeout = errorMsgLower.includes('timeout') || errorMsgLower.includes('abort');\n\n if (isRateLimitError(error) || is429) {\n this.rateLimiter!.reportRateLimitError(provider.id);\n this.healthChecker!.markDegraded(provider.id, this.network, errorMsg);\n } else if (is503 || is502 || is404 || isTimeout) {\n // Server errors, timeouts, and not found should mark provider as offline\n this.rateLimiter!.reportError(provider.id);\n this.healthChecker!.markOffline(provider.id, this.network, errorMsg);\n } else {\n // Other errors - mark as degraded\n this.rateLimiter!.reportError(provider.id);\n this.healthChecker!.markDegraded(provider.id, this.network, errorMsg);\n }\n\n // CRITICAL: Clear cache and switch to next provider immediately\n // This ensures the next getEndpoint() call gets a different provider\n this.selector!.clearCache(this.network);\n this.selector!.handleProviderFailure(provider.id, this.network);\n this.notifyListeners();\n }\n\n // ========================================================================\n // Selection Control\n // ========================================================================\n\n /**\n * Set manual provider selection\n */\n setSelectedProvider(providerId: string | null): void {\n this.ensureInitialized();\n this.selector!.setSelectedProvider(providerId);\n this.notifyListeners();\n }\n\n /**\n * Get selected provider ID\n */\n getSelectedProviderId(): string | null {\n if (!this.initialized) return null;\n return this.selector!.getSelectedProviderId();\n }\n\n /**\n * Set auto-select mode\n */\n setAutoSelect(enabled: boolean): void {\n this.ensureInitialized();\n this.selector!.setAutoSelect(enabled);\n this.notifyListeners();\n }\n\n /**\n * Check if auto-select is enabled\n */\n isAutoSelectEnabled(): boolean {\n if (!this.initialized) return true;\n return this.selector!.isAutoSelectEnabled();\n }\n\n /**\n * Set custom endpoint override\n */\n setCustomEndpoint(endpoint: string | null): void {\n this.ensureInitialized();\n this.selector!.setCustomEndpoint(endpoint);\n this.notifyListeners();\n }\n\n /**\n * Get custom endpoint\n */\n getCustomEndpoint(): string | null {\n if (!this.initialized) return null;\n return this.selector!.getCustomEndpoint();\n }\n\n /**\n * Check if using custom endpoint\n */\n isUsingCustomEndpoint(): boolean {\n if (!this.initialized) return false;\n return this.selector!.isUsingCustomEndpoint();\n }\n\n // ========================================================================\n // State Access\n // ========================================================================\n\n /**\n * Get current network\n */\n getNetwork(): Network | null {\n return this.network;\n }\n\n /**\n * Get all providers for current network\n */\n getProviders(): ResolvedProvider[] {\n if (!this.initialized || !this.network) return [];\n return this.registry!.getProvidersForNetwork(this.network);\n }\n\n /**\n * Get provider health results for current network\n */\n getProviderHealthResults(): ProviderHealthResult[] {\n if (!this.initialized || !this.network) return [];\n return this.healthChecker!.getResultsForNetwork(this.network);\n }\n\n /**\n * Get registry (for advanced usage)\n */\n getRegistry(): ProviderRegistry | null {\n return this.registry;\n }\n\n /**\n * Get health checker (for advanced usage)\n */\n getHealthChecker(): HealthChecker | null {\n return this.healthChecker;\n }\n\n /**\n * Get rate limiter manager (for advanced usage)\n */\n getRateLimiter(): RateLimiterManager | null {\n return this.rateLimiter;\n }\n\n /**\n * Get current state (for UI)\n */\n getState(): ProviderManagerState {\n const providers = new Map<string, ProviderState>();\n\n if (this.initialized && this.network && this.registry) {\n for (const provider of this.registry.getProvidersForNetwork(this.network)) {\n const health = this.healthChecker?.getResult(provider.id, this.network);\n const rateLimit = this.rateLimiter?.getState(provider.id);\n\n providers.set(provider.id, {\n id: provider.id,\n health: health || {\n id: provider.id,\n network: this.network,\n success: false,\n status: 'untested',\n latencyMs: null,\n seqno: null,\n blocksBehind: 0,\n lastTested: null,\n },\n rateLimit: rateLimit || {\n tokens: 0,\n lastRefill: 0,\n currentBackoff: 0,\n consecutiveErrors: 0,\n processing: false,\n queueLength: 0,\n },\n });\n }\n }\n\n return {\n network: this.network,\n initialized: this.initialized,\n isTesting: this.isTesting,\n providers,\n bestProviderByNetwork: new Map(\n this.network && this.selector\n ? [[this.network, this.selector.getBestProvider(this.network)?.id || '']]\n : []\n ),\n selectedProviderId: this.selector?.getSelectedProviderId() || null,\n autoSelect: this.selector?.isAutoSelectEnabled() ?? true,\n customEndpoint: this.selector?.getCustomEndpoint() || null,\n };\n }\n\n // ========================================================================\n // State Listeners\n // ========================================================================\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Notify all listeners\n */\n private notifyListeners(): void {\n const state = this.getState();\n this.listeners.forEach((listener) => listener(state));\n }\n\n // ========================================================================\n // Private Helpers\n // ========================================================================\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('ProviderManager not initialized. Call init() first.');\n }\n }\n\n private getFallbackEndpoint(): string {\n if (this.network === 'mainnet') {\n return 'https://toncenter.com/api/v2/jsonRPC';\n }\n return 'https://testnet.toncenter.com/api/v2/jsonRPC';\n }\n\n private startHealthCheckInterval(): void {\n this.stopHealthCheckInterval();\n\n this.healthCheckInterval = setInterval(() => {\n this.testAllProviders().catch((error) => {\n this.options.logger.error(`Health check interval failed: ${error.message}`);\n });\n }, this.options.healthCheckIntervalMs);\n\n this.options.logger.debug(\n `Started health check interval: ${this.options.healthCheckIntervalMs}ms`\n );\n }\n\n private stopHealthCheckInterval(): void {\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n this.healthCheckInterval = null;\n }\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a new ProviderManager instance\n */\nexport function createProviderManager(options?: ProviderManagerOptions): ProviderManager {\n return new ProviderManager(options);\n}\n\n/**\n * Get singleton ProviderManager instance\n */\nexport function getProviderManager(options?: ProviderManagerOptions): ProviderManager {\n return ProviderManager.getInstance(options);\n}\n","/**\n * Unified Provider System - Node.js Adapter\n *\n * Provides TonClient integration for Node.js environments.\n * Handles client caching and endpoint changes.\n */\n\nimport { TonClient } from '@ton/ton';\nimport { Address, Cell } from '@ton/core';\nimport type { Network, ResolvedProvider, Logger } from '../types';\nimport { ProviderManager } from '../core/manager';\nimport { normalizeV2Endpoint, toV2Base } from '../utils/endpoint';\nimport { withTimeout, fetchWithTimeout, sleep } from '../utils/timeout';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[NodeAdapter] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[NodeAdapter] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[NodeAdapter] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[NodeAdapter] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// TonClient Cache\n// ============================================================================\n\ninterface CachedClient {\n client: TonClient;\n endpoint: string;\n network: Network;\n createdAt: number;\n}\n\nlet cachedClient: CachedClient | null = null;\n\n// ============================================================================\n// Node Adapter\n// ============================================================================\n\n/**\n * Node.js Adapter for Provider System\n *\n * Provides TonClient and direct REST API access for Node.js environments.\n */\nexport class NodeAdapter {\n private manager: ProviderManager;\n private logger: Logger;\n\n constructor(manager: ProviderManager, logger?: Logger) {\n this.manager = manager;\n this.logger = logger || consoleLogger;\n }\n\n /**\n * Get TonClient instance\n *\n * Creates a new client if endpoint changed, otherwise returns cached.\n * \n * NOTE: Direct TonClient calls bypass rate limiting. For rate-limited operations,\n * use adapter methods (getAddressState, runGetMethod, etc.) or wrap your calls\n * with rate limit token acquisition.\n * \n * Example with rate limiting:\n * ```typescript\n * const endpoint = await adapter.manager.getEndpointWithRateLimit();\n * // Make your TonClient call\n * adapter.manager.reportSuccess(); // or reportError() on failure\n * ```\n */\n async getClient(): Promise<TonClient> {\n // Use getEndpoint() (not getEndpointWithRateLimit) to avoid blocking on client creation\n // Rate limiting should be applied per-operation, not per-client-creation\n const endpoint = await this.manager.getEndpoint();\n const network = this.manager.getNetwork();\n\n if (!network) {\n throw new Error('ProviderManager not initialized');\n }\n\n // Check if cached client is still valid\n if (\n cachedClient &&\n cachedClient.endpoint === endpoint &&\n cachedClient.network === network\n ) {\n return cachedClient.client;\n }\n\n // Create new client\n const provider = this.manager.getActiveProvider();\n const apiKey = provider?.apiKey;\n\n const client = new TonClient({\n endpoint,\n apiKey,\n });\n\n cachedClient = {\n client,\n endpoint,\n network,\n createdAt: Date.now(),\n };\n\n this.logger.debug(`Created TonClient for ${network}`, { endpoint });\n\n return client;\n }\n\n /**\n * Get TonClient with rate limiting applied\n * \n * Acquires a rate limit token before returning the client.\n * Use this when you need to ensure rate limiting is respected.\n * \n * Note: This only acquires ONE token. For multiple operations,\n * you should acquire tokens before each operation or use adapter methods.\n */\n async getClientWithRateLimit(timeoutMs?: number): Promise<TonClient> {\n // Acquire rate limit token before creating/returning client\n await this.manager.getEndpointWithRateLimit(timeoutMs);\n return this.getClient();\n }\n\n /**\n * Reset client cache (forces new client creation)\n */\n resetClient(): void {\n cachedClient = null;\n this.logger.debug('Client cache cleared');\n }\n\n /**\n * Get cached client info (for debugging)\n */\n getClientInfo(): { endpoint: string; network: Network; age: number } | null {\n if (!cachedClient) return null;\n return {\n endpoint: cachedClient.endpoint,\n network: cachedClient.network,\n age: Date.now() - cachedClient.createdAt,\n };\n }\n\n // ========================================================================\n // Direct REST API Methods\n // ========================================================================\n\n /**\n * Get address state via REST API\n */\n async getAddressState(\n address: Address | string,\n timeoutMs: number = 10000\n ): Promise<'uninit' | 'active' | 'frozen'> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const addrStr = typeof address === 'string' ? address : address.toString();\n const url = `${baseV2}/getAddressState?address=${encodeURIComponent(addrStr)}`;\n\n try {\n const response = await fetchWithTimeout(\n url,\n { headers: { accept: 'application/json' } },\n timeoutMs\n );\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (typeof data === 'string') {\n this.manager.reportSuccess();\n return data as 'uninit' | 'active' | 'frozen';\n }\n\n if (data && typeof data === 'object' && typeof data.state === 'string') {\n this.manager.reportSuccess();\n return data.state as 'uninit' | 'active' | 'frozen';\n }\n\n throw new Error('Unexpected response format');\n } catch (error: any) {\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Get address balance via REST API\n */\n async getAddressBalance(\n address: Address | string,\n timeoutMs: number = 10000\n ): Promise<bigint> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const addrStr = typeof address === 'string' ? address : address.toString();\n const url = `${baseV2}/getAddressBalance?address=${encodeURIComponent(addrStr)}`;\n\n try {\n const response = await fetchWithTimeout(\n url,\n { headers: { accept: 'application/json' } },\n timeoutMs\n );\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (typeof data === 'string' || typeof data === 'number') {\n this.manager.reportSuccess();\n return BigInt(data);\n }\n\n if (data && typeof data === 'object' && data.balance !== undefined) {\n this.manager.reportSuccess();\n return BigInt(String(data.balance));\n }\n\n throw new Error('Unexpected response format');\n } catch (error: any) {\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Run a get method via REST API\n */\n async runGetMethod(\n address: Address | string,\n method: string,\n stack: unknown[] = [],\n timeoutMs: number = 15000\n ): Promise<{ exit_code: number; stack: unknown[] }> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const addrStr = typeof address === 'string' ? address : address.toString();\n const url = `${baseV2}/runGetMethod`;\n\n try {\n const response = await fetchWithTimeout(\n url,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n accept: 'application/json',\n },\n body: JSON.stringify({\n address: addrStr,\n method,\n stack,\n }),\n },\n timeoutMs\n );\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (data.exit_code === undefined) {\n throw new Error('Missing exit_code in response');\n }\n\n this.manager.reportSuccess();\n return {\n exit_code: data.exit_code,\n stack: data.stack || [],\n };\n } catch (error: any) {\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Send BOC via REST API\n */\n async sendBoc(\n boc: Buffer | string,\n timeoutMs: number = 30000\n ): Promise<void> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const url = `${baseV2}/sendBoc`;\n const bocBase64 = typeof boc === 'string' ? boc : boc.toString('base64');\n\n try {\n const response = await fetchWithTimeout(\n url,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ boc: bocBase64 }),\n },\n timeoutMs\n );\n\n const json = await response.json();\n this.unwrapResponse(json);\n this.manager.reportSuccess();\n } catch (error: any) {\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Check if contract is deployed\n */\n async isContractDeployed(\n address: Address | string,\n timeoutMs: number = 10000\n ): Promise<boolean> {\n try {\n const state = await this.getAddressState(address, timeoutMs);\n return state === 'active';\n } catch {\n return false;\n }\n }\n\n // ========================================================================\n // Private Helpers\n // ========================================================================\n\n /**\n * Unwrap TON API response\n */\n private unwrapResponse(json: unknown): any {\n if (json && typeof json === 'object' && 'ok' in json) {\n const resp = json as { ok: boolean; result?: unknown; error?: string };\n if (!resp.ok) {\n throw new Error(resp.error || 'API returned ok=false');\n }\n return resp.result ?? json;\n }\n\n // JSON-RPC response\n if (json && typeof json === 'object' && 'result' in json) {\n return (json as { result: unknown }).result;\n }\n\n return json;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a Node adapter\n */\nexport function createNodeAdapter(manager: ProviderManager, logger?: Logger): NodeAdapter {\n return new NodeAdapter(manager, logger);\n}\n\n/**\n * Get TonClient from ProviderManager (convenience function)\n * \n * WARNING: Direct TonClient API calls bypass rate limiting!\n * For rate-limited operations, use one of these approaches:\n * \n * 1. Use adapter methods (recommended):\n * ```typescript\n * const adapter = new NodeAdapter(manager);\n * const state = await adapter.getAddressState(address);\n * ```\n * \n * 2. Acquire rate limit tokens before operations:\n * ```typescript\n * await manager.getEndpointWithRateLimit(); // Acquire token\n * const result = await client.someMethod();\n * manager.reportSuccess(); // or reportError() on failure\n * ```\n * \n * 3. Use getTonClientWithRateLimit() for operations that need rate limiting\n */\nexport async function getTonClient(manager: ProviderManager): Promise<TonClient> {\n const adapter = new NodeAdapter(manager);\n return adapter.getClient();\n}\n\n/**\n * Get TonClient with rate limiting wrapper\n * \n * Returns a TonClient along with helper methods to ensure rate limiting.\n * Use this when you need to make multiple TonClient calls with rate limiting.\n * \n * Example:\n * ```typescript\n * const { client, withRateLimit } = await getTonClientWithRateLimit(manager);\n * \n * // Wrap your operations\n * const balance = await withRateLimit(() => client.getBalance(address));\n * const state = await withRateLimit(() => client.getContractState(address));\n * ```\n */\nexport async function getTonClientWithRateLimit(\n manager: ProviderManager\n): Promise<{\n client: TonClient;\n withRateLimit: <T>(fn: () => Promise<T>, maxRetries?: number) => Promise<T>;\n}> {\n const adapter = new NodeAdapter(manager);\n const client = await adapter.getClient();\n \n const withRateLimit = async <T>(\n fn: () => Promise<T>,\n maxRetries: number = 3\n ): Promise<T> => {\n let lastError: Error | unknown;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // Acquire rate limit token before operation\n await manager.getEndpointWithRateLimit(60000);\n \n // Execute the operation\n const result = await fn();\n \n // Report success (resets backoff)\n manager.reportSuccess();\n return result;\n } catch (error: any) {\n lastError = error;\n \n // Check if it's a rate limit error (429)\n const errorMsg = error?.message || String(error) || '';\n const is429 = \n errorMsg.includes('429') ||\n errorMsg.includes('rate limit') ||\n error?.status === 429 ||\n error?.response?.status === 429;\n \n if (is429 && attempt < maxRetries) {\n // Report rate limit error (applies backoff)\n manager.reportError(error);\n \n // Get current backoff from rate limiter state\n const managerState = manager.getState();\n const provider = manager.getActiveProvider();\n let backoff = 1000; // Default backoff\n \n if (provider && managerState.providers) {\n const providerState = managerState.providers.get(provider.id);\n if (providerState?.rateLimit?.currentBackoff) {\n backoff = providerState.rateLimit.currentBackoff;\n }\n }\n \n // Wait for backoff + additional delay based on attempt\n // For low RPS providers (like Tatum with 3 RPS = 334ms), we need longer waits\n const additionalDelay = Math.min(attempt * 500, 2000);\n const waitTime = backoff + additionalDelay;\n \n // Use console.warn since we can't access private logger\n console.warn(\n `[ProviderSystem] Rate limit error (429), retrying in ${waitTime}ms (attempt ${attempt + 1}/${maxRetries + 1})`\n );\n await sleep(waitTime);\n continue;\n }\n \n // Not a 429 error, or max retries reached\n manager.reportError(error);\n throw error;\n }\n }\n \n // Should never reach here, but TypeScript needs it\n throw lastError || new Error('Rate limit retries exhausted');\n };\n \n return { client, withRateLimit };\n}\n\n/**\n * Get TonClient for network (one-shot convenience)\n */\nexport async function getTonClientForNetwork(\n network: Network,\n configPath?: string\n): Promise<TonClient> {\n const manager = ProviderManager.getInstance({ configPath });\n\n if (!manager.isInitialized() || manager.getNetwork() !== network) {\n await manager.init(network);\n }\n\n return getTonClient(manager);\n}\n\n/**\n * Reset all cached state\n */\nexport function resetNodeAdapter(): void {\n cachedClient = null;\n ProviderManager.resetInstance();\n}\n","/**\n * Unified Provider System - Browser Adapter\n *\n * Provides browser-compatible TON client functionality.\n * Designed for use in React/Next.js applications.\n */\n\nimport type { Network, ResolvedProvider, Logger, ProviderHealthResult } from '../types';\nimport { ProviderManager } from '../core/manager';\nimport { normalizeV2Endpoint, toV2Base } from '../utils/endpoint';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[BrowserAdapter] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[BrowserAdapter] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[BrowserAdapter] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[BrowserAdapter] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Browser Adapter\n// ============================================================================\n\n/**\n * Browser Adapter for Provider System\n *\n * Provides fetch-based TON API access for browser environments.\n * Compatible with React, Next.js, and other browser frameworks.\n *\n * Note: TonClient from @ton/ton works in browser but requires polyfills.\n * This adapter provides a lighter alternative using fetch directly.\n */\nexport class BrowserAdapter {\n private manager: ProviderManager;\n private logger: Logger;\n\n constructor(manager: ProviderManager, logger?: Logger) {\n this.manager = manager;\n this.logger = logger || consoleLogger;\n }\n\n /**\n * Get current endpoint URL\n */\n async getEndpoint(): Promise<string> {\n return this.manager.getEndpoint();\n }\n\n /**\n * Get endpoint with rate limiting\n */\n async getEndpointWithRateLimit(timeoutMs?: number): Promise<string> {\n return this.manager.getEndpointWithRateLimit(timeoutMs);\n }\n\n // ========================================================================\n // JSON-RPC Methods\n // ========================================================================\n\n /**\n * Make a JSON-RPC call to the TON API\n */\n async jsonRpc<T = unknown>(\n method: string,\n params: Record<string, unknown> = {},\n timeoutMs: number = 10000\n ): Promise<T> {\n const endpoint = await this.manager.getEndpoint();\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n id: '1',\n jsonrpc: '2.0',\n method,\n params,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n this.manager.reportSuccess();\n return data as T;\n } catch (error: any) {\n clearTimeout(timeoutId);\n\n if (error.name === 'AbortError') {\n const timeoutError = new Error(`Request timed out after ${timeoutMs}ms`);\n this.manager.reportError(timeoutError);\n throw timeoutError;\n }\n\n this.manager.reportError(error);\n throw error;\n }\n }\n\n // ========================================================================\n // REST API Methods\n // ========================================================================\n\n /**\n * Get address state\n */\n async getAddressState(\n address: string,\n timeoutMs: number = 10000\n ): Promise<'uninit' | 'active' | 'frozen'> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const url = `${baseV2}/getAddressState?address=${encodeURIComponent(address)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (typeof data === 'string') {\n this.manager.reportSuccess();\n return data as 'uninit' | 'active' | 'frozen';\n }\n\n if (data && typeof data === 'object' && typeof data.state === 'string') {\n this.manager.reportSuccess();\n return data.state as 'uninit' | 'active' | 'frozen';\n }\n\n throw new Error('Unexpected response format');\n } catch (error: any) {\n clearTimeout(timeoutId);\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Get address balance\n */\n async getAddressBalance(\n address: string,\n timeoutMs: number = 10000\n ): Promise<bigint> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const url = `${baseV2}/getAddressBalance?address=${encodeURIComponent(address)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (typeof data === 'string' || typeof data === 'number') {\n this.manager.reportSuccess();\n return BigInt(data);\n }\n\n if (data && typeof data === 'object' && data.balance !== undefined) {\n this.manager.reportSuccess();\n return BigInt(String(data.balance));\n }\n\n throw new Error('Unexpected response format');\n } catch (error: any) {\n clearTimeout(timeoutId);\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Get address information\n */\n async getAddressInfo(\n address: string,\n timeoutMs: number = 10000\n ): Promise<{\n state: 'uninit' | 'active' | 'frozen';\n balance: bigint;\n lastTransactionLt?: string;\n lastTransactionHash?: string;\n }> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const url = `${baseV2}/getAddressInformation?address=${encodeURIComponent(address)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n this.manager.reportSuccess();\n\n return {\n state: data.state as 'uninit' | 'active' | 'frozen',\n balance: BigInt(String(data.balance || 0)),\n lastTransactionLt: data.last_transaction_id?.lt,\n lastTransactionHash: data.last_transaction_id?.hash,\n };\n } catch (error: any) {\n clearTimeout(timeoutId);\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Run get method\n */\n async runGetMethod(\n address: string,\n method: string,\n stack: unknown[] = [],\n timeoutMs: number = 15000\n ): Promise<{ exit_code: number; stack: unknown[] }> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const url = `${baseV2}/runGetMethod`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n accept: 'application/json',\n },\n body: JSON.stringify({\n address,\n method,\n stack,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (data.exit_code === undefined) {\n throw new Error('Missing exit_code in response');\n }\n\n this.manager.reportSuccess();\n return {\n exit_code: data.exit_code,\n stack: data.stack || [],\n };\n } catch (error: any) {\n clearTimeout(timeoutId);\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Get masterchain info\n */\n async getMasterchainInfo(\n timeoutMs: number = 10000\n ): Promise<{\n seqno: number;\n stateRootHash: string;\n }> {\n const data = await this.jsonRpc<{\n last: { seqno: number };\n state_root_hash: string;\n }>('getMasterchainInfo', {}, timeoutMs);\n\n return {\n seqno: data.last?.seqno || 0,\n stateRootHash: data.state_root_hash || '',\n };\n }\n\n // ========================================================================\n // Provider Management\n // ========================================================================\n\n /**\n * Get provider manager\n */\n getManager(): ProviderManager {\n return this.manager;\n }\n\n /**\n * Get active provider info\n */\n getActiveProviderInfo(): { id: string; name: string; isCustom: boolean } | null {\n return this.manager.getActiveProviderInfo();\n }\n\n /**\n * Get provider health results\n */\n getProviderHealthResults(): ProviderHealthResult[] {\n return this.manager.getProviderHealthResults();\n }\n\n /**\n * Test all providers\n */\n async testAllProviders(): Promise<ProviderHealthResult[]> {\n return this.manager.testAllProviders();\n }\n\n // ========================================================================\n // Private Helpers\n // ========================================================================\n\n /**\n * Unwrap TON API response\n */\n private unwrapResponse(json: unknown): any {\n if (json && typeof json === 'object' && 'ok' in json) {\n const resp = json as { ok: boolean; result?: unknown; error?: string };\n if (!resp.ok) {\n throw new Error(resp.error || 'API returned ok=false');\n }\n return resp.result ?? json;\n }\n\n // JSON-RPC response\n if (json && typeof json === 'object' && 'result' in json) {\n return (json as { result: unknown }).result;\n }\n\n return json;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a Browser adapter\n */\nexport function createBrowserAdapter(manager: ProviderManager, logger?: Logger): BrowserAdapter {\n return new BrowserAdapter(manager, logger);\n}\n\n/**\n * Create a Browser adapter with auto-initialized manager\n */\nexport async function createBrowserAdapterForNetwork(\n network: Network,\n configPath?: string,\n logger?: Logger\n): Promise<BrowserAdapter> {\n const manager = new ProviderManager({\n configPath,\n adapter: 'browser',\n logger,\n });\n\n await manager.init(network);\n return new BrowserAdapter(manager, logger);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/config/schema.ts","../src/config/parser.ts","../src/core/registry.ts","../src/utils/endpoint.ts","../src/core/healthChecker.ts","../src/utils/timeout.ts","../src/core/rateLimiter.ts","../src/core/selector.ts","../src/core/manager.ts","../src/adapters/node.ts","../src/adapters/browser.ts"],"names":["z","consoleLogger","DEFAULT_CONFIG","config","TonClient"],"mappings":";;;;;;;AA4UO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACpC,WAAA,CACoB,SAAA,EACA,SAAA,EAChB,OAAA,EACF;AACE,IAAA,KAAA,CAAM,OAAA,IAAW,CAAA,WAAA,EAAc,SAAS,CAAA,kBAAA,EAAqB,SAAS,CAAA,EAAA,CAAI,CAAA;AAJ1D,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAIhB,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EAChB;AACJ;AAKO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACrC,WAAA,CACoB,UAAA,EACA,SAAA,EAChB,OAAA,EACgB,KAAA,EAClB;AACE,IAAA,KAAA,CAAM,IAAI,UAAU,CAAA,EAAA,EAAK,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AALhC,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAEA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EAChB;AACJ;AAKO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACtC,WAAA,CACoB,YACA,YAAA,EAClB;AACE,IAAA,KAAA,CAAM,CAAA,SAAA,EAAY,UAAU,CAAA,aAAA,EAAgB,YAAA,GAAe,iBAAiB,YAAY,CAAA,EAAA,CAAA,GAAO,EAAE,CAAA,CAAE,CAAA;AAHnF,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EAChB;AACJ;AAKO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EACnC,YAAY,OAAA,EAAiB;AACzB,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EAChB;AACJ;AC1WO,IAAM,gBAAgBA,KAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,SAAS,CAAC;AAKnD,IAAM,kBAAA,GAAqBA,MAAE,IAAA,CAAK;AAAA,EACrC,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAC;AAKM,IAAM,mBAAmBA,KAAA,CAAE,IAAA,CAAK,CAAC,IAAA,EAAM,IAAA,EAAM,IAAI,CAAC;AASlD,IAAM,uBAAA,GAA0BA,MAAE,MAAA,CAAO;AAAA,EAC5C,IAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EAC9B,IAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EAC9B,IAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EAC9B,IAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA;AACzB,CAAC,CAAA,CAAE,MAAA;AAAA,EACC,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,MAAM,IAAA,CAAK,EAAA;AAAA,EACrC,EAAE,SAAS,wDAAA;AACf,CAAA;AAKO,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EACzC,MAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,2BAA2B,CAAA;AAAA,EACnD,IAAA,EAAM,kBAAA;AAAA,EACN,OAAA,EAAS,aAAA;AAAA,EACT,SAAA,EAAW,uBAAA;AAAA,EACX,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,YAAA,EAAcA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,GAAA,EAAKA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,EAC1C,QAAA,EAAUA,MAAE,MAAA,EAAO,CAAE,KAAI,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EACnD,OAAA,EAASA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,EACjC,WAAWA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EAC/C,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC5B,CAAC;AAKM,IAAM,qBAAA,GAAwBA,MAAE,MAAA,CAAO;AAAA,EAC1C,OAAA,EAASA,MAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EACvC,OAAA,EAASA,MAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE;AAC3C,CAAC,CAAA;AAKM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACpC,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,KAAK,CAAA;AAAA,EACjC,WAAWA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAU,oBAAoB,CAAA;AAAA,EACpD,QAAA,EAAU;AACd,CAAC,CAAA,CAAE,MAAA;AAAA,EACC,CAAC,IAAA,KAAS;AAEN,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,IAAA,CAAK,SAAS,OAAA,EAAS,GAAG,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACvE,IAAA,MAAM,UAAA,GAAa,YAAY,MAAA,CAAO,CAAC,OAAO,CAAC,WAAA,CAAY,QAAA,CAAS,EAAE,CAAC,CAAA;AACvE,IAAA,OAAO,WAAW,MAAA,KAAW,CAAA;AAAA,EACjC,CAAA;AAAA,EACA;AAAA,IACI,OAAA,EAAS;AAAA;AAEjB;AAYO,SAAS,eAAe,IAAA,EAA0B;AACrD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAE7C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACjB,IAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAC1C,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC5B,MAAA,OAAO,CAAA,IAAA,EAAO,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAA;AAAA,IACpC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA;AAAA,EAAoC,MAAM,CAAA,CAAE,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA;AAClB;AAQO,SAAS,mBAAA,CAAoB,IAAY,IAAA,EAA+B;AAC3E,EAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,SAAA,CAAU,IAAI,CAAA;AAElD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACjB,IAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAC1C,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC5B,MAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAA;AAAA,IAChC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,EAAE,CAAA,GAAA,EAAM,MAAM,CAAA,CAAE,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA;AAClB;AAKO,SAAS,iBAAA,GAA+B;AAC3C,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,KAAA;AAAA,IACT,WAAW,EAAC;AAAA,IACZ,QAAA,EAAU;AAAA,MACN,SAAS,EAAC;AAAA,MACV,SAAS;AAAC;AACd,GACJ;AACJ;AAQO,SAAS,YAAA,CAAa,MAAiB,QAAA,EAAyC;AACnF,EAAA,OAAO;AAAA,IACH,GAAG,IAAA;AAAA,IACH,GAAG,QAAA;AAAA,IACH,SAAA,EAAW;AAAA,MACP,GAAG,IAAA,CAAK,SAAA;AAAA,MACR,GAAI,QAAA,CAAS,SAAA,IAAa;AAAC,KAC/B;AAAA,IACA,QAAA,EAAU;AAAA,MACN,OAAA,EAAS,QAAA,CAAS,QAAA,EAAU,OAAA,IAAW,KAAK,QAAA,CAAS,OAAA;AAAA,MACrD,OAAA,EAAS,QAAA,CAAS,QAAA,EAAU,OAAA,IAAW,KAAK,QAAA,CAAS;AAAA;AACzD,GACJ;AACJ;AASO,SAAS,UAAU,KAAA,EAAkC;AACxD,EAAA,OAAO,KAAA,KAAU,aAAa,KAAA,KAAU,SAAA;AAC5C;AAKO,SAAS,eAAe,KAAA,EAAuC;AAClE,EAAA,MAAM,KAAA,GAAwB;AAAA,IAC1B,YAAA;AAAA,IAAc,WAAA;AAAA,IAAa,WAAA;AAAA,IAAa,MAAA;AAAA,IACxC,YAAA;AAAA,IAAc,MAAA;AAAA,IAAQ,UAAA;AAAA,IAAY,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU;AAAA,GACzD;AACA,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,SAAS,KAAqB,CAAA;AAC5E;AAKO,SAAS,aAAa,KAAA,EAAqC;AAC9D,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAA;AACzD;;;AC1LA,IAAM,mBAAA,GAAsB,UAAA;AAUrB,SAAS,UAAU,IAAA,EAAkC;AAExD,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK;AAC/C,IAAA,OAAO,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAgB,MAAA,CAAe,OAAA,EAAS;AAC1D,IAAA,OAAQ,MAAA,CAAe,QAAQ,IAAI,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACX;AAKO,SAAS,qBAAA,CAAsB,KAAa,SAAA,EAA4B;AAC3E,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,EAAG;AACtC,IAAA,OAAO,GAAA;AAAA,EACX;AAEA,EAAA,MAAM,GAAA,GAAM,UAAU,SAAS,CAAA;AAC/B,EAAA,IAAI,CAAC,GAAA,EAAK;AAEN,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oCAAA,EAAuC,SAAS,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAE,CAAA;AACvF,IAAA,OAAO,GAAA;AAAA,EACX;AAEA,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA;AACnC;AAKO,SAAS,gBAAA,CACZ,WACA,SAAA,EACsD;AACtD,EAAA,OAAO;AAAA,IACH,IAAI,SAAA,CAAU,EAAA,GAAK,sBAAsB,SAAA,CAAU,EAAA,EAAI,SAAS,CAAA,GAAI,MAAA;AAAA,IACpE,IAAI,SAAA,CAAU,EAAA,GAAK,sBAAsB,SAAA,CAAU,EAAA,EAAI,SAAS,CAAA,GAAI,MAAA;AAAA,IACpE,IAAI,SAAA,CAAU,EAAA,GAAK,sBAAsB,SAAA,CAAU,EAAA,EAAI,SAAS,CAAA,GAAI,MAAA;AAAA,IACpE,IAAI,SAAA,CAAU,EAAA,GAAK,sBAAsB,SAAA,CAAU,EAAA,EAAI,SAAS,CAAA,GAAI;AAAA,GACxE;AACJ;AASO,SAAS,eAAA,CAAgB,IAAY,MAAA,EAAiD;AAEzF,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACjB,IAAA,OAAO,IAAA;AAAA,EACX;AAGA,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,MAAA,CAAO,SAAA,EAAW,OAAO,SAAS,CAAA;AAGpE,EAAA,IAAI,CAAC,SAAS,EAAA,IAAM,CAAC,SAAS,EAAA,IAAM,CAAC,SAAS,EAAA,EAAI;AAC9C,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAA2B,EAAE,CAAA,wCAAA,CAA0C,CAAA;AACpF,IAAA,OAAO,IAAA;AAAA,EACX;AAIA,EAAA,IAAI,SAAS,MAAA,CAAO,YAAA,GAAe,SAAA,CAAU,MAAA,CAAO,YAAY,CAAA,GAAI,MAAA;AAGpE,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,SAAS,YAAA,EAAc;AAG7D,IAAA,MAAA,GAAS,SAAA,CAAU,OAAO,SAAS,CAAA;AAAA,EACvC;AAEA,EAAA,OAAO;AAAA,IACH,EAAA;AAAA,IACA,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAA,EAAY,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,EAAA,IAAM,EAAA;AAAA;AAAA,IAC1C,YAAY,QAAA,CAAS,EAAA;AAAA,IACrB,YAAY,QAAA,CAAS,EAAA;AAAA,IACrB,YAAY,QAAA,CAAS,EAAA;AAAA,IACrB,MAAA;AAAA,IACA,KAAK,MAAA,CAAO,GAAA;AAAA,IACZ,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,SAAA,EAAW,OAAO,SAAA,IAAa,KAAA;AAAA,IAC/B,iBAAA,EAAmB,MAAA,CAAO,iBAAA,KAAsB,MAAA,GAAY,OAAO,iBAAA,GAAoB;AAAA,GAC3F;AACJ;AAKO,SAAS,oBAAoB,MAAA,EAAuC;AACvE,EAAA,MAAM,WAA+B,EAAC;AAEtC,EAAA,KAAA,MAAW,CAAC,IAAI,cAAc,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AACjE,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,EAAA,EAAI,cAAc,CAAA;AACnD,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,IAC1B;AAAA,EACJ;AAEA,EAAA,OAAO,QAAA;AACX;AAKO,SAAS,sBAAA,CACZ,QACA,OAAA,EACkB;AAClB,EAAA,MAAM,GAAA,GAAM,oBAAoB,MAAM,CAAA;AACtC,EAAA,OAAO,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO,CAAA;AAClD;AAKO,SAAS,6BAAA,CACZ,QACA,OAAA,EACkB;AAClB,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AAC5C,EAAA,MAAM,gBAAA,GAAmB,sBAAA,CAAuB,MAAA,EAAQ,OAAO,CAAA;AAG/D,EAAA,MAAM,UAA8B,EAAC;AACrC,EAAA,MAAM,YAAgC,EAAC;AAEvC,EAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACrC,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA;AACrD,IAAA,IAAI,iBAAiB,EAAA,EAAI;AACrB,MAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,QAAA;AAAA,IAC5B,CAAA,MAAO;AACH,MAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,IAC3B;AAAA,EACJ;AAGA,EAAA,MAAM,gBAAA,GAAmB,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAC/C,EAAA,SAAA,CAAU,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAEhD,EAAA,OAAO,CAAC,GAAG,gBAAA,EAAkB,GAAG,SAAS,CAAA;AAC7C;AASA,eAAsB,iBAAA,GAAwC;AAE1D,EAAA,MAAM,EAAA,GAAK,MAAM,OAAO,IAAI,EAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA;AACpD,EAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAChC,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,KAAK,CAAA;AAG5C,EAAA,MAAM,aAAa,MAAM;AACrB,IAAA,IAAI;AAEA,MAAA,IAAI,2PAAY,EAAK;AACjB,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,2PAAe,CAAC,CAAA;AAAA,MACtD;AAAA,IACJ,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,QAAQ,GAAA,EAAI;AAAA,EACvB,CAAA;AACA,EAAA,MAAM,UAAU,UAAA,EAAW;AAI3B,EAAA,MAAM,aAAA,GAAgB;AAAA;AAAA,IAElB,KAAK,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAI,EAAG,mBAAmB,mBAAmB,CAAA;AAAA;AAAA,IAElE,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,GAAA,IAAO,mBAAmB,CAAA;AAAA;AAAA,IAE/C,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAM,mBAAmB;AAAA,GACnD;AAEA,EAAA,KAAA,MAAW,cAAc,aAAA,EAAe;AACpC,IAAA,IAAI;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA;AACrD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,MAAA,OAAO,eAAe,IAAI,CAAA;AAAA,IAC9B,SAAS,KAAA,EAAY;AACjB,MAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AACzB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,UAAU,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACpF;AAAA,IAEJ;AAAA,EACJ;AAGA,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2BAAA,EAA8B,mBAAmB,CAAA,0BAAA,CAA4B,CAAA;AAC1F,EAAA,OAAO,mBAAA,EAAoB;AAC/B;AAKA,eAAsB,kBAAkB,GAAA,EAAiC;AACrE,EAAA,IAAI;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,MAAA,MAAM,IAAI,MAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACrE;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,eAAe,IAAI,CAAA;AAAA,EAC9B,SAAS,KAAA,EAAY;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,GAAG,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,EAC7E;AACJ;AAKO,SAAS,mBAAmB,IAAA,EAA0B;AACzD,EAAA,OAAO,eAAe,IAAI,CAAA;AAC9B;AAOA,eAAsB,UAAA,GAAiC;AAEnD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAgB,MAAA,CAAe,cAAA,EAAgB;AACjE,IAAA,OAAO,cAAA,CAAgB,OAAe,cAAc,CAAA;AAAA,EACxD;AAGA,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAO,OAAA,CAAQ,QAAQ,UAAA,EAAY;AACrE,IAAA,OAAO,iBAAA,EAAkB;AAAA,EAC7B;AAGA,EAAA,OAAA,CAAQ,KAAK,2DAA2D,CAAA;AACxE,EAAA,OAAO,mBAAA,EAAoB;AAC/B;AAUO,IAAM,iBAAA,GAAoD;AAAA,EAC7D,iBAAA,EAAmB;AAAA,IACf,IAAA,EAAM,oBAAA;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW;AAAA,MACP,EAAA,EAAI;AAAA,KACR;AAAA,IACA,GAAA,EAAK,CAAA;AAAA;AAAA,IACL,QAAA,EAAU,GAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACjB;AAAA,EACA,YAAA,EAAc;AAAA,IACV,IAAA,EAAM,yBAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW;AAAA,MACP,EAAA,EAAI;AAAA,KACR;AAAA,IACA,GAAA,EAAK,EAAA;AAAA,IACL,QAAA,EAAU,EAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,SAAA,EAAW,IAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACjB;AAAA,EACA,iBAAA,EAAmB;AAAA,IACf,IAAA,EAAM,oBAAA;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW;AAAA,MACP,EAAA,EAAI;AAAA,KACR;AAAA,IACA,GAAA,EAAK,CAAA;AAAA;AAAA,IACL,QAAA,EAAU,GAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACjB;AAAA,EACA,YAAA,EAAc;AAAA,IACV,IAAA,EAAM,yBAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW;AAAA,MACP,EAAA,EAAI;AAAA,KACR;AAAA,IACA,GAAA,EAAK,EAAA;AAAA,IACL,QAAA,EAAU,EAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,SAAA,EAAW,IAAA;AAAA,IACX,WAAA,EAAa;AAAA;AAErB;AAKO,SAAS,mBAAA,GAAiC;AAC7C,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,KAAA;AAAA,IACT,SAAA,EAAW,EAAE,GAAG,iBAAA,EAAkB;AAAA,IAClC,QAAA,EAAU;AAAA,MACN,OAAA,EAAS,CAAC,cAAA,EAAgB,mBAAmB,CAAA;AAAA,MAC7C,OAAA,EAAS,CAAC,cAAA,EAAgB,mBAAmB;AAAA;AACjD,GACJ;AACJ;AAKO,SAAS,kBAAkB,MAAA,EAA8B;AAC5D,EAAA,MAAM,WAAW,mBAAA,EAAoB;AAErC,EAAA,OAAO;AAAA,IACH,GAAG,MAAA;AAAA,IACH,SAAA,EAAW;AAAA,MACP,GAAG,QAAA,CAAS,SAAA;AAAA,MACZ,GAAG,MAAA,CAAO;AAAA,KACd;AAAA,IACA,QAAA,EAAU;AAAA,MACN,OAAA,EAAS,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,IACpC,MAAA,CAAO,QAAA,CAAS,OAAA,GAChB,QAAA,CAAS,QAAA,CAAS,OAAA;AAAA,MACxB,OAAA,EAAS,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,IACpC,MAAA,CAAO,QAAA,CAAS,OAAA,GAChB,QAAA,CAAS,QAAA,CAAS;AAAA;AAC5B,GACJ;AACJ;;;AClWA,IAAM,aAAA,GAAwB;AAAA,EAC1B,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EAC3E,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACxE,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,KAAK,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACzE,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE;AAC/E,CAAA;AAWO,IAAM,mBAAN,MAAuB;AAAA,EAK1B,WAAA,CAAY,QAAoB,MAAA,EAAiB;AAHjD,IAAA,IAAA,CAAQ,SAAA,uBAA+C,GAAA,EAAI;AAIvD,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,mBAAA,EAAoB;AAC5C,IAAA,IAAA,CAAK,SAAS,MAAA,IAAU,aAAA;AACxB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAsB;AAC1B,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAErB,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,IAAA,CAAK,MAAM,CAAA;AAChD,IAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,EAAA,EAA0C;AAClD,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAsC;AAClC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,OAAA,EAAsC;AACzD,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MACvC,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY;AAAA,KACzB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,0BAA0B,OAAA,EAAsC;AAC5D,IAAA,OAAO,6BAAA,CAA8B,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,IAAA,EAAwC;AACvD,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MACvC,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS;AAAA,KACtB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAqC;AACjC,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MACvC,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,WAAW,MAAA,GAAS;AAAA,KACjD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,OAAA,EAAsC;AAC3D,IAAA,OAAO,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA,CAAE,MAAA;AAAA,MACxC,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,WAAW,MAAA,GAAS;AAAA,KACjD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,EAAA,EAAqB;AAC7B,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,KAAK,SAAA,CAAU,IAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAuB;AACnB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAyB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,IAAY,QAAA,EAAkC;AACtD,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAA,EAAI,QAAQ,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,SAAA,EAAY,EAAE,CAAA,cAAA,CAAgB,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,EAAA,EAAqB;AAChC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,EAAE,CAAA;AACxC,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,SAAA,EAAY,EAAE,CAAA,QAAA,CAAU,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAA2B;AACvB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,OAAA,EAA4B;AAC9C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,QAAA,EAAgD;AACnE,IAAA,MAAM,qBAAqB,QAAA,CAAS,WAAA,EAAY,CAAE,OAAA,CAAQ,eAAe,EAAE,CAAA;AAE3E,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC5C,MAAA,MAAM,eAAe,QAAA,CAAS,UAAA,EAAY,aAAY,CAAE,OAAA,CAAQ,eAAe,EAAE,CAAA;AACjF,MAAA,MAAM,eAAe,QAAA,CAAS,UAAA,EAAY,aAAY,CAAE,OAAA,CAAQ,eAAe,EAAE,CAAA;AAEjF,MAAA,IAAI,YAAA,IAAgB,mBAAmB,QAAA,CAAS,YAAA,CAAa,MAAM,OAAO,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG;AAC7E,QAAA,OAAO,QAAA;AAAA,MACX;AACA,MAAA,IAAI,YAAA,IAAgB,mBAAmB,QAAA,CAAS,YAAA,CAAa,MAAM,OAAO,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG;AAC7E,QAAA,OAAO,QAAA;AAAA,MACX;AAAA,IACJ;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AACJ;AASA,eAAsB,eAAe,MAAA,EAA4C;AAC7E,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,YAAA,GAAe,kBAAkB,MAAM,CAAA;AAC7C,EAAA,OAAO,IAAI,gBAAA,CAAiB,YAAA,EAAc,MAAM,CAAA;AACpD;AAKA,eAAsB,sBAAA,CAClB,WACA,MAAA,EACyB;AACzB,EAAA,OAAO,eAAe,MAAM,CAAA;AAChC;AAKO,SAAS,sBAAsB,MAAA,EAAmC;AACrE,EAAA,MAAM,SAAS,mBAAA,EAAoB;AACnC,EAAA,OAAO,IAAI,gBAAA,CAAiB,MAAA,EAAQ,MAAM,CAAA;AAC9C;AAKO,SAAS,sBAAA,CACZ,MACA,MAAA,EACgB;AAChB,EAAA,MAAM,YAAA,GAAe,kBAAkB,IAAI,CAAA;AAC3C,EAAA,OAAO,IAAI,gBAAA,CAAiB,YAAA,EAAc,MAAM,CAAA;AACpD;;;AClOO,SAAS,oBAAoB,QAAA,EAA0B;AAC1D,EAAA,IAAI,UAAA,GAAa,SAAS,IAAA,EAAK;AAG/B,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1B,IAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACvC;AAGA,EAAA,IAAI,UAAA,CAAW,WAAA,EAAY,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG;AAC/C,IAAA,OAAO,UAAA;AAAA,EACX;AAIA,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,kBAAkB,CAAA,EAAG;AACzC,IAAA,IAAI;AACA,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,UAAU,CAAA;AAE9B,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,aAAa,GAAA,EAAK;AACvC,QAAA,OAAO,UAAA,GAAa,UAAA;AAAA,MACxB;AAEA,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,aAAY,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG;AAClD,QAAA,OAAO,UAAA,GAAa,UAAA;AAAA,MACxB;AAAA,IACJ,CAAA,CAAA,MAAQ;AAEJ,MAAA,OAAO,UAAA,GAAa,UAAA;AAAA,IACxB;AAAA,EACJ;AAKA,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,eAAe,CAAA,EAAG;AACtC,IAAA,IAAI;AACA,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,UAAU,CAAA;AAE9B,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAGvC,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,aAAa,GAAA,EAAK;AAGvC,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA;AAC5C,QAAA,IAAI,MAAA,IAAU,MAAA,KAAW,OAAA,IAAW,MAAA,CAAO,SAAS,CAAA,EAAG;AAEnD,UAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,QACzC;AAEA,QAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC5C;AAEA,MAAA,IAAI,GAAA,CAAI,QAAA,KAAa,MAAA,IAAU,GAAA,CAAI,aAAa,SAAA,EAAW;AACvD,QAAA,OAAO,OAAA;AAAA,MACX;AAEA,MAAA,OAAO,OAAA;AAAA,IACX,CAAA,CAAA,MAAQ;AAEJ,MAAA,IAAI,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG;AAE9B,QAAA,OAAO,UAAA,CAAW,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,QAAQ,SAAS,CAAA;AAAA,MAC7D;AAEA,MAAA,IAAI,CAAC,WAAW,QAAA,CAAS,MAAM,KAAK,CAAC,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AACjE,QAAA,OAAO,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,SAAA;AAAA,MACtC;AACA,MAAA,OAAO,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAAA,IAClC;AAAA,EACJ;AAKA,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AAChC,IAAA,OAAO,UAAA,GAAa,UAAA;AAAA,EACxB;AAGA,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AAChC,IAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,SAAA,EAAW,iBAAiB,CAAA;AAAA,EAC1D;AAKA,EAAA,IAAI,WAAW,QAAA,CAAS,cAAc,KAAK,UAAA,CAAW,QAAA,CAAS,aAAa,CAAA,EAAG;AAC3E,IAAA,IAAI;AACA,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,UAAU,CAAA;AAC9B,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,aAAa,GAAA,EAAK;AACvC,QAAA,OAAO,UAAA,GAAa,UAAA;AAAA,MACxB;AAEA,MAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,aAAY,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG;AAClD,QAAA,OAAO,UAAA,GAAa,UAAA;AAAA,MACxB;AAAA,IACJ,CAAA,CAAA,MAAQ;AAEJ,MAAA,OAAO,UAAA,GAAa,UAAA;AAAA,IACxB;AAAA,EACJ;AAGA,EAAA,IAAI;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,UAAU,CAAA;AAC9B,IAAA,IAAI,CAAC,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,aAAa,GAAA,EAAK;AACvC,MAAA,OAAO,UAAA,GAAa,UAAA;AAAA,IACxB;AAAA,EACJ,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,UAAA;AACX;AAKO,SAAS,SAAS,QAAA,EAA0B;AAC/C,EAAA,IAAI,UAAA,GAAa,SAAS,IAAA,EAAK;AAG/B,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1B,IAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACvC;AAGA,EAAA,IAAI,UAAA,CAAW,WAAA,EAAY,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG;AAC/C,IAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACvC;AAGA,EAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,aAAA,EAAe,SAAS,CAAA;AAGxD,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AAEjC,IAAA,IAAI,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AAEhC,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA;AACxC,MAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA;AAAA,IAC5C;AAAA,EACJ;AAEA,EAAA,OAAO,UAAA;AACX;AAKO,SAAS,SAAS,QAAA,EAA0B;AAC/C,EAAA,MAAM,UAAA,GAAa,SAAS,QAAQ,CAAA;AACpC,EAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA;AAClD;AAKO,SAAS,WAAW,QAAA,EAA0B;AACjD,EAAA,IAAI;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK,IAAI,IAAI,CAAA,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,QAAA;AAAA,EACX;AACJ;AAKO,SAAS,gBAAgB,GAAA,EAAsB;AAClD,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AACjC,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,gBAAgB,CAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAKO,SAAS,eAAe,GAAA,EAAsB;AACjD,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AACjC,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,cAAc,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAKO,SAAS,eAAe,GAAA,EAAsB;AACjD,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AACjC,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,eAAe,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAKO,SAAS,UAAU,GAAA,EAAsB;AAC5C,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AACjC,IAAA,OAAO,MAAA,CAAO,SAAS,QAAA,CAAS,cAAc,KACvC,MAAA,CAAO,QAAA,CAAS,SAAS,YAAY,CAAA;AAAA,EAChD,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AASO,SAAS,YAAA,CAAa,cAAsB,MAAA,EAAwB;AACvE,EAAA,MAAM,IAAA,GAAO,SAAS,YAAY,CAAA;AAClC,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC5B;AAKO,SAAS,uBAAA,CAAwB,cAAsB,OAAA,EAAyB;AACnF,EAAA,MAAM,IAAA,GAAO,SAAS,YAAY,CAAA;AAClC,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,yBAAA,EAA4B,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AACzE;AAKO,SAAS,yBAAA,CAA0B,cAAsB,OAAA,EAAyB;AACrF,EAAA,MAAM,IAAA,GAAO,SAAS,YAAY,CAAA;AAClC,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,2BAAA,EAA8B,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAC3E;AAKO,SAAS,sBAAA,CAAuB,cAAsB,OAAA,EAAyB;AAClF,EAAA,MAAM,IAAA,GAAO,SAAS,YAAY,CAAA;AAClC,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,+BAAA,EAAkC,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAC/E;AASO,SAAS,0BAA0B,QAAA,EAAgD;AACtF,EAAA,MAAM,KAAA,GAAQ,SAAS,WAAA,EAAY;AAEnC,EAAA,IACI,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IACxB,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IACrB,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAC1B;AACE,IAAA,OAAO,SAAA;AAAA,EACX;AAEA,EAAA,IACI,MAAM,QAAA,CAAS,SAAS,CAAA,IACxB,KAAA,CAAM,SAAS,MAAM,CAAA;AAAA,EAEpB,KAAA,CAAM,SAAS,eAAe,CAAA,IAAK,CAAC,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAC/D;AACE,IAAA,OAAO,SAAA;AAAA,EACX;AAEA,EAAA,OAAO,IAAA;AACX;AASO,SAAS,eAAe,GAAA,EAAsB;AACjD,EAAA,IAAI;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAG,CAAA;AACvB,IAAA,OAAO,GAAA,CAAI,QAAA,KAAa,OAAA,IAAW,GAAA,CAAI,QAAA,KAAa,QAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AAKO,SAAS,aAAa,GAAA,EAAsB;AAC/C,EAAA,IAAI;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAG,CAAA;AACvB,IAAA,OAAO,GAAA,CAAI,QAAA,KAAa,KAAA,IAAS,GAAA,CAAI,QAAA,KAAa,MAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;;;ACrTA,IAAMC,cAAAA,GAAwB;AAAA,EAC1B,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACxE,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,IAAI,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACrE,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,KAAK,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACtE,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE;AAC5E,CAAA;AAeA,IAAM,cAAA,GAAoC;AAAA,EACtC,SAAA,EAAW,GAAA;AAAA,EACX,eAAA,EAAiB,EAAA;AAAA,EACjB,iBAAA,EAAmB;AACvB,CAAA;AAYO,IAAM,gBAAN,MAAoB;AAAA,EAOvB,WAAA,CACI,MAAA,EACA,MAAA,EACA,WAAA,EACF;AARF,IAAA,IAAA,CAAQ,OAAA,uBAAiD,GAAA,EAAI;AAC7D,IAAA,IAAA,CAAQ,YAAA,uBAAyC,GAAA,EAAI;AACrD,IAAA,IAAA,CAAQ,WAAA,GAAyC,IAAA;AAO7C,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,SAAS,MAAA,IAAUA,cAAAA;AACxB,IAAA,IAAA,CAAK,cAAc,WAAA,IAAe,IAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,WAAA,EAA8C;AACzD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAA,EAA2D;AAC1E,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAClC,IAAA,MAAM,MAAM,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,EAAA,EAAI,SAAS,OAAO,CAAA;AAG3D,IAAA,MAAM,aAAA,GAAsC;AAAA,MACxC,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,KAAA,EAAO,IAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,UAAA,EAAY,IAAA;AAAA,MACZ,mBAAmB,QAAA,CAAS;AAAA,KAChC;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,aAAa,CAAA;AAEnC,IAAA,IAAI;AAEA,MAAA,IAAI,KAAK,WAAA,EAAa;AAClB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,QAAA,CAAS,EAAA,EAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAClF,QAAA,IAAI,CAAC,QAAA,EAAU;AACX,UAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,QACnF;AAAA,MACJ;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAChD,MAAA,IAAI,CAAC,QAAA,EAAU;AACX,QAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,MACjD;AAGA,MAAA,IAAI,QAAA,CAAS,IAAA,KAAS,OAAA,IAAW,CAAC,SAAS,MAAA,EAAQ;AAC/C,QAAA,MAAM,IAAI,MAAM,sFAAsF,CAAA;AAAA,MAC1G;AAGA,MAAA,IAAI,kBAAA,GAAqB,IAAA,CAAK,4BAAA,CAA6B,QAAA,EAAU,QAAQ,CAAA;AAG7E,MAAA,IAAI,QAAA,CAAS,SAAS,YAAA,EAAc;AAChC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAQ,CAAA,IAAA,EAAO,kBAAkB,CAAA,WAAA,EAAc,QAAA,CAAS,MAAA,GAAS,KAAA,GAAQ,SAAS,CAAA,CAAE,CAAA;AAAA,MAClI;AAIA,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACA,QAAA,IAAA,GAAO,MAAM,IAAA,CAAK,sBAAA,CAAuB,kBAAA,EAAoB,QAAQ,CAAA;AAAA,MACzE,SAAS,KAAA,EAAY;AAEjB,QAAA,IACI,QAAA,CAAS,IAAA,KAAS,YAAA,IAClB,kBAAA,CAAmB,QAAA,CAAS,MAAM,CAAA,IAClC,QAAA,CAAS,MAAA,IACT,KAAA,CAAM,OAAA,EAAS,QAAA,CAAS,eAAe,CAAA,EACzC;AACE,UAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,sDAAA,CAAwD,CAAA;AAC1E,UAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,OAAA,CAAQ,MAAA,EAAQ,SAAS,CAAA;AACnE,UAAA,IAAA,GAAO,MAAM,KAAK,sBAAA,CAAuB,cAAA,EAAgB,EAAE,GAAG,QAAA,EAAU,MAAA,EAAQ,KAAA,CAAA,EAAW,CAAA;AAAA,QAC/F,CAAA,MAAO;AACH,UAAA,MAAM,KAAA;AAAA,QACV;AAAA,MACJ;AAEA,MAAA,MAAM,OAAA,GAAU,YAAY,GAAA,EAAI;AAChC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAGhD,MAAA,MAAM,YAAA,GAAe,IAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,aAAa,IAAA,EAAM,KAAA;AAIjC,MAAA,IAAI,CAAC,SAAS,KAAA,IAAS,CAAA,IAAK,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAClD,QAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,MAC1E;AAGA,MAAA,MAAM,iBAAiB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,IAAK,CAAA;AAClE,MAAA,IAAI,QAAQ,cAAA,EAAgB;AACxB,QAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,KAAK,CAAA;AAAA,MACjD;AAGA,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,IAAK,KAAA,IAAS,KAAK,CAAA;AAG3F,MAAA,IAAI,MAAA,GAAyB,WAAA;AAC7B,MAAA,IAAI,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,eAAA,EAAiB;AAC5C,QAAA,MAAA,GAAS,OAAA;AAAA,MACb,CAAA,MAAA,IAAW,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,iBAAA,EAAmB;AAClD,QAAA,MAAA,GAAS,UAAA;AAAA,MACb;AAEA,MAAA,MAAM,MAAA,GAA+B;AAAA,QACjC,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,OAAA,EAAS,IAAA;AAAA,QACT,MAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA,sBAAgB,IAAA,EAAK;AAAA,QACrB,cAAA,EAAgB,kBAAA;AAAA,QAChB,mBAAmB,QAAA,CAAS;AAAA,OAChC;AAEA,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACR,CAAA,SAAA,EAAY,QAAA,CAAS,EAAE,CAAA,eAAA,EAAkB,MAAM,KAAK,SAAS,CAAA,UAAA,EAAa,KAAK,CAAA,SAAA,EAAY,YAAY,CAAA,CAAA;AAAA,OAC3G;AAEA,MAAA,OAAO,MAAA;AAAA,IACX,SAAS,KAAA,EAAY;AACjB,MAAA,MAAM,OAAA,GAAU,YAAY,GAAA,EAAI;AAChC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,SAAS,CAAA;AAEhD,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,IAAW,MAAA,CAAO,KAAK,CAAA,IAAK,eAAA;AAGnD,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,QAAQ,CAAA;AAGpD,MAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,CAAS,KAAK,KAAK,QAAA,CAAS,WAAA,EAAY,CAAE,QAAA,CAAS,YAAY,CAAA;AACtF,MAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,CAAS,KAAK,KAAK,QAAA,CAAS,WAAA,EAAY,CAAE,QAAA,CAAS,WAAW,CAAA;AACrF,MAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,CAAS,KAAK,KAAK,QAAA,CAAS,WAAA,EAAY,CAAE,QAAA,CAAS,qBAAqB,CAAA;AAC/F,MAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,CAAS,KAAK,KAAK,QAAA,CAAS,WAAA,EAAY,CAAE,QAAA,CAAS,aAAa,CAAA;AACvF,MAAA,MAAM,YAAY,KAAA,CAAM,IAAA,KAAS,YAAA,IAAgB,QAAA,CAAS,SAAS,SAAS,CAAA;AAG5E,MAAA,MAAM,wBAAA,GAA2B,QAAA,CAAS,IAAA,KAAS,YAAA,KAC9C,QAAA,CAAS,SAAS,eAAe,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,eAAe,CAAA,CAAA;AAG5E,MAAA,IAAI,MAAA,GAAyB,SAAA;AAC7B,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,MAAA,GAAS,UAAA;AAAA,MACb,CAAA,MAAA,IAAW,KAAA,IAAS,KAAA,IAAS,KAAA,IAAS,wBAAA,EAA0B;AAC5D,QAAA,MAAA,GAAS,SAAA;AAAA,MACb,WAAW,SAAA,EAAW;AAClB,QAAA,MAAA,GAAS,SAAA;AAAA,MACb;AAIA,MAAA,MAAM,iBAAA,GAAoB,WAAA,GAAc,KAAA,GAAQ,QAAA,CAAS,iBAAA;AAEzD,MAAA,MAAM,MAAA,GAA+B;AAAA,QACjC,IAAI,QAAA,CAAS,EAAA;AAAA,QACb,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,OAAA,EAAS,KAAA;AAAA,QACT,MAAA;AAAA,QACA,SAAA,EAAW,YAAY,IAAA,GAAO,SAAA;AAAA,QAC9B,KAAA,EAAO,IAAA;AAAA,QACP,YAAA,EAAc,CAAA;AAAA,QACd,UAAA,sBAAgB,IAAA,EAAK;AAAA,QACrB,KAAA,EAAO,QAAA;AAAA,QACP;AAAA,OACJ;AAEA,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAC5B,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,SAAA,EAAY,QAAA,CAAS,EAAE,CAAA,sBAAA,EAAyB,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAE/E,MAAA,OAAO,MAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAA,CACF,SAAA,EACA,SAAA,GAAoB,CAAA,EACpB,eAAuB,GAAA,EACQ;AAC/B,IAAA,MAAM,UAAkC,EAAC;AAEzC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,MAAA,EAAQ,KAAK,SAAA,EAAW;AAClD,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AAC9C,MAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC/B,MAAM,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC;AAAA,OACzC;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,YAAY,CAAA;AAG5B,MAAA,IAAI,CAAA,GAAI,SAAA,GAAY,SAAA,CAAU,MAAA,IAAU,eAAe,CAAA,EAAG;AACtD,QAAA,MAAM,IAAA,CAAK,MAAM,YAAY,CAAA;AAAA,MACjC;AAAA,IACJ;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,YAAoB,OAAA,EAAoD;AAC9E,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,OAAA,EAA0C;AAC3D,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,CAAA,IAAK,KAAK,OAAA,EAAS;AACtC,MAAA,IAAI,MAAA,CAAO,YAAY,OAAA,EAAS;AAC5B,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MACvB;AAAA,IACJ;AACA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,OAAA,EAA0C;AAC5D,IAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA,CAAE,MAAA;AAAA,MACtC,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAA,IAAe,EAAE,MAAA,KAAW;AAAA,KACpD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAA,EAAoD;AAChE,IAAA,MAAM,SAAA,GAAY,KAAK,qBAAA,CAAsB,OAAO,EAC/C,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,KAAc,IAAI,CAAA,CAClC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,SAAA,IAAa,QAAA,KAAa,CAAA,CAAE,SAAA,IAAa,QAAA,CAAS,CAAA;AAEzE,IAAA,OAAO,UAAU,CAAC,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAA,EAA0B;AACtC,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA,IAAK,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACjB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,UAAA,EAAoB,OAAA,EAAkB,KAAA,EAAsB;AACrE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAIrC,IAAA,MAAM,SAA+B,QAAA,GAAW;AAAA,MAC5C,GAAG,QAAA;AAAA,MACH,OAAA,EAAS,IAAA;AAAA;AAAA,MACT,MAAA,EAAQ,UAAA;AAAA,MACR,OAAO,KAAA,IAAS,oBAAA;AAAA,MAChB,UAAA,sBAAgB,IAAA,EAAK;AAAA,MACrB,iBAAA,EAAmB,SAAS,iBAAA,IAAqB;AAAA,KACrD,GAAI;AAAA,MACA,EAAA,EAAI,UAAA;AAAA,MACJ,OAAA;AAAA,MACA,OAAA,EAAS,IAAA;AAAA;AAAA,MACT,MAAA,EAAQ,UAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,KAAA,EAAO,IAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,UAAA,sBAAgB,IAAA,EAAK;AAAA,MACrB,OAAO,KAAA,IAAS,oBAAA;AAAA,MAChB,iBAAA,EAAmB;AAAA;AAAA,KACvB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,UAAA,EAAoB,OAAA,EAAkB,KAAA,EAAsB;AACpE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAErC,IAAA,MAAM,SAA+B,QAAA,GAAW;AAAA,MAC5C,GAAG,QAAA;AAAA,MACH,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,KAAA;AAAA;AAAA,MACT,OAAO,KAAA,IAAS,mBAAA;AAAA,MAChB,UAAA,sBAAgB,IAAA,EAAK;AAAA,MACrB,iBAAA,EAAmB,SAAS,iBAAA,IAAqB;AAAA,KACrD,GAAI;AAAA,MACA,EAAA,EAAI,UAAA;AAAA,MACJ,OAAA;AAAA,MACA,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW,IAAA;AAAA,MACX,KAAA,EAAO,IAAA;AAAA,MACP,YAAA,EAAc,CAAA;AAAA,MACd,UAAA,sBAAgB,IAAA,EAAK;AAAA,MACrB,OAAO,KAAA,IAAS,mBAAA;AAAA,MAChB,iBAAA,EAAmB;AAAA;AAAA,KACvB;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAA,CAAa,YAAoB,OAAA,EAA0B;AAC/D,IAAA,OAAO,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,QAAA,EAAoD;AAE1E,IAAA,IAAI,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,IAAA,KAAS,MAAA,EAAQ;AAChD,MAAA,IAAI;AACA,QAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,OAAO,0BAA0B,CAAA;AACnE,QAAA,MAAM,WAAW,MAAM,eAAA,CAAgB,EAAE,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA;AACpE,QAAA,OAAO,QAAA;AAAA,MACX,SAAS,KAAA,EAAY;AACjB,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,6BAAA,EAAgC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAChE,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,IACJ;AAGA,IAAA,OAAO,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,UAAA,IAAc,IAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,4BAAA,CAA6B,UAA4B,QAAA,EAA0B;AAEvF,IAAA,IAAI,SAAS,IAAA,KAAS,OAAA,IAAW,QAAA,CAAS,QAAA,CAAS,iCAAiC,CAAA,EAAG;AACnF,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,KAAY,SAAA,GAAY,SAAA,GAAY,SAAA;AAC7D,MAAA,QAAA,GAAW,eAAe,OAAO,CAAA,iBAAA,CAAA;AAAA,IACrC;AAGA,IAAA,OAAO,oBAAoB,QAAQ,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBAAA,CACV,QAAA,EACA,QAAA,EACwB;AACxB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,SAAS,CAAA;AAG5E,IAAA,MAAM,OAAA,GAAkC;AAAA,MACpC,cAAA,EAAgB;AAAA,KACpB;AAGA,IAAA,IAAI,QAAA,CAAS,IAAA,KAAS,OAAA,IAAW,QAAA,CAAS,MAAA,EAAQ;AAC9C,MAAA,OAAA,CAAQ,WAAW,IAAI,QAAA,CAAS,MAAA;AAAA,IACpC;AAIA,IAAA,IAAI,QAAA,CAAS,IAAA,KAAS,YAAA,IAAgB,QAAA,CAAS,MAAA,EAAQ;AACnD,MAAA,OAAA,CAAQ,QAAQ,IAAI,QAAA,CAAS,MAAA;AAAA,IACjC;AAIA,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAA,EAAU;AAAA,QACnC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACjB,EAAA,EAAI,GAAA;AAAA,UACJ,OAAA,EAAS,KAAA;AAAA,UACT,MAAA,EAAQ,oBAAA;AAAA,UACR,QAAQ;AAAC,SACZ,CAAA;AAAA,QACD,QAAQ,UAAA,CAAW;AAAA,OACtB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAC5D,MAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,MAAA,IAAI,IAAA;AAGJ,MAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC3C,QAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAG3B,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,oBAAA,EAAuB,WAAW,CAAA,GAAA,EAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAGlG,QAAA,IAAI,SAAS,IAAA,KAAS,YAAA,IAAgB,IAAA,CAAK,QAAA,CAAS,eAAe,CAAA,EAAG;AAClE,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,IAAI,CAAA,CAAE,CAAA;AAAA,QACvD;AAEA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,WAAW,CAAA,YAAA,EAAe,KAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,MACnH;AAGA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAEd,QAAA,IAAI;AACA,UAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAC3B,UAAA,MAAM,QAAA,GAAW,IAAA;AACjB,UAAA,MAAM,QAAA,GAAW,OAAO,QAAA,CAAS,KAAA,KAAU,QAAA,GACrC,QAAA,CAAS,KAAA,GACT,QAAA,CAAS,KAAA,EAAO,OAAA,IAAW,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA;AACxD,UAAA,MAAM,IAAI,MAAM,QAAQ,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AACJ,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QAC7C;AAAA,MACJ;AAEA,MAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAE3B,MAAA,IAAI,IAAA;AAGJ,MAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AAClC,QAAA,MAAM,OAAA,GAAU,IAAA;AAGhB,QAAA,IAAI,QAAQ,OAAA,EAAS;AACjB,UAAA,IAAI,CAAC,QAAQ,EAAA,EAAI;AACb,YAAA,MAAM,QAAS,OAAA,CAA+B,KAAA;AAC9C,YAAA,MAAM,IAAI,KAAA,CAAM,KAAA,IAAS,uBAAuB,CAAA;AAAA,UACpD;AACA,UAAA,MAAM,SAAU,OAAA,CAAiC,MAAA;AACjD,UAAA,IAAA,GAAQ,MAAA,IAAU,OAAA;AAAA,QACtB,CAAA,MAAA,IAES,YAAY,OAAA,EAAS;AAC1B,UAAA,IAAA,GAAQ,OAAA,CAAgC,MAAA;AAAA,QAC5C,CAAA,MAAA,IAES,MAAA,IAAU,OAAA,IAAW,OAAA,IAAW,OAAA,EAAS;AAC9C,UAAA,IAAA,GAAO,OAAA;AAAA,QACX,CAAA,MAAA,IAES,WAAW,OAAA,EAAS;AACzB,UAAA,MAAM,WAAW,OAAA,CAAQ,KAAA;AACzB,UAAA,MAAM,QAAA,GAAW,OAAO,QAAA,KAAa,QAAA,GAC/B,QAAA,GACA,UAAU,OAAA,IAAW,QAAA,EAAU,IAAA,IAAQ,MAAA,CAAO,QAAQ,CAAA;AAC5D,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAE,CAAA;AAAA,QAC5C,CAAA,MAEK;AACD,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAAA,QACnE;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,OAAO,IAAI,CAAA,CAAE,CAAA;AAAA,MAC3D;AAGA,MAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AAEnC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAA,CAAS,IAAI,KAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,CAAA;AAC7F,QAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,MAChD;AAGA,MAAA,MAAM,OAAA,GAAU,IAAA;AAChB,MAAA,MAAM,KAAA,GAAQ,QAAQ,IAAA,EAAM,KAAA;AAC5B,MAAA,IAAI,KAAA,KAAU,KAAA,CAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,IAAS,KAAK,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAEjF,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,mBAAA,EAAsB,QAAA,CAAS,IAAI,CAAA,CAAA,CAAA,EAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AACzE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,KAAK,CAAA,2BAAA,CAA6B,CAAA;AAAA,MACxE;AAEA,MAAA,OAAO,IAAA;AAAA,IACX,SAAS,KAAA,EAAY;AACjB,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACrC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,WAAA,CAAY,OAAY,QAAA,EAA2B;AACvD,IAAA,MAAM,GAAA,GAAM,SAAS,WAAA,EAAY;AAGjC,IAAA,IACI,IAAI,QAAA,CAAS,MAAM,KACnB,GAAA,CAAI,QAAA,CAAS,gBAAgB,CAAA,IAC7B,GAAA,CAAI,SAAS,sBAAsB,CAAA,IACnC,IAAI,QAAA,CAAS,6CAA6C,KAC1D,GAAA,CAAI,QAAA,CAAS,wBAAwB,CAAA,EACvC;AACE,MAAA,OAAO,IAAA;AAAA,IACX;AAIA,IAAA,IACI,KAAA,CAAM,IAAA,KAAS,WAAA,KACd,GAAA,CAAI,QAAA,CAAS,iBAAiB,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,eAAe,CAAA,CAAA,EAClE;AAIE,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AACJ;AASO,SAAS,mBAAA,CACZ,MAAA,EACA,MAAA,EACA,WAAA,EACa;AACb,EAAA,OAAO,IAAI,aAAA,CAAc,MAAA,EAAQ,MAAA,EAAQ,WAAW,CAAA;AACxD;;;ACznBO,IAAM,2BAAA,GAA8B;AAGpC,IAAM,2BAAA,GAA8B;AAGpC,IAAM,+BAAA,GAAkC;AAe/C,eAAsB,WAAA,CAClB,OAAA,EACA,SAAA,EACA,aAAA,EACU;AACV,EAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACrD,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM;AAC/B,MAAA,MAAA,CAAO,IAAI,YAAA,CAAa,aAAA,EAAe,SAAS,CAAC,CAAA;AAAA,IACrD,GAAG,SAAS,CAAA;AAIZ,IAAA,OAAA,CAAQ,OAAA,CAAQ,MAAM,YAAA,CAAa,SAAS,CAAC,CAAA;AAAA,EACjD,CAAC,CAAA;AAED,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,OAAA,EAAS,cAAc,CAAC,CAAA;AACjD;AAWA,eAAsB,aAAA,CAClB,EAAA,EACA,SAAA,EACA,aAAA,EACU;AACV,EAAA,OAAO,WAAA,CAAY,EAAA,EAAG,EAAG,SAAA,EAAW,aAAa,CAAA;AACrD;AAQO,SAAS,wBAAwB,SAAA,EAGtC;AACE,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAEhE,EAAA,OAAO;AAAA,IACH,UAAA;AAAA,IACA,KAAA,EAAO,MAAM,YAAA,CAAa,SAAS;AAAA,GACvC;AACJ;AAWA,eAAsB,gBAAA,CAClB,GAAA,EACA,OAAA,EACA,SAAA,EACiB;AACjB,EAAA,MAAM,EAAE,UAAA,EAAY,KAAA,EAAM,GAAI,wBAAwB,SAAS,CAAA;AAE/D,EAAA,IAAI;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAC9B,GAAG,OAAA;AAAA,MACH,QAAQ,UAAA,CAAW;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,QAAA;AAAA,EACX,SAAS,KAAA,EAAY;AACjB,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC7B,MAAA,MAAM,IAAI,aAAa,GAAA,EAAK,SAAA,EAAW,YAAY,GAAG,CAAA,iBAAA,EAAoB,SAAS,CAAA,EAAA,CAAI,CAAA;AAAA,IAC3F;AACA,IAAA,MAAM,KAAA;AAAA,EACV,CAAA,SAAE;AACE,IAAA,KAAA,EAAM;AAAA,EACV;AACJ;AAsBA,IAAM,qBAAA,GAAsC;AAAA,EACxC,UAAA,EAAY,CAAA;AAAA,EACZ,WAAA,EAAa,GAAA;AAAA,EACb,UAAA,EAAY,GAAA;AAAA,EACZ,iBAAA,EAAmB;AACvB,CAAA;AAUA,eAAsB,SAAA,CAClB,IACA,OAAA,EACU;AACV,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,qBAAA,EAAuB,GAAG,OAAA,EAAQ;AACpD,EAAA,IAAI,SAAA,GAA0B,IAAA;AAE9B,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,YAAY,OAAA,EAAA,EAAW;AACzD,IAAA,IAAI;AACA,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IACpB,SAAS,KAAA,EAAY;AACjB,MAAA,SAAA,GAAY,KAAA;AAGZ,MAAA,IAAI,KAAK,WAAA,IAAe,CAAC,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,EAAG;AAC9C,QAAA,MAAM,KAAA;AAAA,MACV;AAGA,MAAA,IAAI,OAAA,GAAU,KAAK,UAAA,EAAY;AAC3B,QAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,UACf,KAAK,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,UAC3D,IAAA,CAAK;AAAA,SACT;AACA,QAAA,MAAM,MAAM,KAAK,CAAA;AAAA,MACrB;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,MAAM,SAAA,IAAa,IAAI,KAAA,CAAM,cAAc,CAAA;AAC/C;AAWA,eAAsB,mBAAA,CAClB,EAAA,EACA,SAAA,EACA,aAAA,EACA,YAAA,EACU;AACV,EAAA,OAAO,SAAA;AAAA,IACH,MAAM,WAAA,CAAY,EAAA,EAAG,EAAG,WAAW,aAAa,CAAA;AAAA,IAChD;AAAA,MACI,GAAG,YAAA;AAAA,MACH,WAAA,EAAa,CAAC,KAAA,KAAU;AAEpB,QAAA,IAAI,iBAAiB,YAAA,EAAc;AAC/B,UAAA,OAAO,IAAA;AAAA,QACX;AAEA,QAAA,IAAI,cAAc,WAAA,EAAa;AAC3B,UAAA,OAAO,YAAA,CAAa,YAAY,KAAK,CAAA;AAAA,QACzC;AAEA,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,EAAS,WAAA,EAAY,IAAK,EAAA;AAChD,QAAA,OACI,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAC1B,QAAQ,QAAA,CAAS,OAAO,CAAA,IACxB,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,IAC/B,OAAA,CAAQ,SAAS,WAAW,CAAA;AAAA,MAEpC;AAAA;AACJ,GACJ;AACJ;AAWO,SAAS,MAAM,EAAA,EAA2B;AAC7C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAC3D;AAKO,SAAS,eAAe,KAAA,EAAuC;AAClE,EAAA,OAAO,KAAA,YAAiB,YAAA;AAC5B;AAKO,SAAS,iBAAiB,KAAA,EAAyB;AACtD,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,MAAM,OAAA,GAAW,KAAA,CAAc,OAAA,EAAS,WAAA,EAAY,IAAK,EAAA;AACzD,EAAA,MAAM,MAAA,GAAU,KAAA,CAAc,MAAA,IAAW,KAAA,CAAc,QAAA,EAAU,MAAA;AACjE,EAAA,OAAO,MAAA,KAAW,OAAO,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,IAAK,OAAA,CAAQ,SAAS,KAAK,CAAA;AACrF;;;ACjPA,IAAMA,cAAAA,GAAwB;AAAA,EAC1B,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACtE,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,IAAI,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACnE,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,KAAK,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACpE,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE;AAC1E,CAAA;AASO,IAAM,kBAAA,GAAsC;AAAA,EAC/C,GAAA,EAAK,CAAA;AAAA,EACL,SAAA,EAAW,CAAA;AAAA,EACX,UAAA,EAAY,GAAA;AAAA,EACZ,iBAAA,EAAmB,CAAA;AAAA,EACnB,YAAA,EAAc;AAClB;AAKO,IAAM,qBAAA,GAAyC;AAAA,EAClD,GAAA,EAAK,EAAA;AAAA,EACL,SAAA,EAAW,EAAA;AAAA,EACX,UAAA,EAAY,EAAA;AAAA,EACZ,iBAAA,EAAmB,CAAA;AAAA,EACnB,YAAA,EAAc;AAClB;AAKO,IAAM,oBAAA,GAAwC;AAAA,EACjD,GAAA,EAAK,EAAA;AAAA,EACL,SAAA,EAAW,EAAA;AAAA,EACX,UAAA,EAAY,GAAA;AAAA,EACZ,iBAAA,EAAmB,CAAA;AAAA,EACnB,YAAA,EAAc;AAClB;AAKO,IAAM,eAAA,GAAmC;AAAA,EAC5C,GAAA,EAAK,EAAA;AAAA,EACL,SAAA,EAAW,EAAA;AAAA,EACX,UAAA,EAAY,GAAA;AAAA,EACZ,iBAAA,EAAmB,CAAA;AAAA,EACnB,YAAA,EAAc;AAClB;AAKO,SAAS,oBAAoB,IAAA,EAA+B;AAC/D,EAAA,QAAQ,IAAA,CAAK,aAAY;AAAG,IACxB,KAAK,YAAA;AACD,MAAA,OAAO,qBAAA;AAAA,IACX,KAAK,WAAA;AACD,MAAA,OAAO,oBAAA;AAAA,IACX,KAAK,MAAA;AACD,MAAA,OAAO,eAAA;AAAA,IACX;AACI,MAAA,OAAO,kBAAA;AAAA;AAEnB;AAeO,IAAM,yBAAN,MAA6B;AAAA,EAUhC,WAAA,CAAY,QAAmC,MAAA,EAAiB;AANhE,IAAA,IAAA,CAAQ,cAAA,GAAyB,CAAA;AACjC,IAAA,IAAA,CAAQ,iBAAA,GAA4B,CAAA;AACpC,IAAA,IAAA,CAAQ,eAAkC,EAAC;AAC3C,IAAA,IAAA,CAAQ,UAAA,GAAsB,KAAA;AAI1B,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,kBAAA,EAAoB,GAAG,MAAA,EAAO;AACjD,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,CAAO,SAAA;AAC1B,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAA,CAAK,SAAS,MAAA,IAAUA,cAAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA2B;AACvB,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,OAAO;AAAA,MACH,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,mBAAmB,IAAA,CAAK,iBAAA;AAAA,MACxB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,WAAA,EAAa,KAAK,YAAA,CAAa;AAAA,KACnC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAA,CAAQ,SAAA,GAAoB,GAAA,EAAyB;AACvD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,IAAA,IAAI,KAAK,UAAA,EAAY;AACjB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,OAAA,CAAiB,CAAC,OAAA,KAAY;AACrD,QAAA,MAAM,eAAe,MAAM;AACvB,UAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,SAAA,EAAW;AAEpC,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,eAAe,CAAA;AACrD,YAAA,IAAI,OAAO,CAAA,EAAG;AACV,cAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,CAAC,CAAA;AAAA,YACnC;AACA,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,UACjB;AAAA,QACJ,CAAA;AAEA,QAAA,MAAM,eAAA,GAAkB,MAAM,OAAA,CAAQ,IAAI,CAAA;AAC1C,QAAA,IAAA,CAAK,YAAA,CAAa,KAAK,eAAe,CAAA;AAGtC,QAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,YAAA,EAAc,GAAI,CAAA;AACtD,QAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,eAAe,CAAA;AAGnD,QAAA,OAAA,CAAQ,OAAA,EAAQ,CAAE,IAAA,CAAK,MAAM;AACzB,UAAA,IAAI,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,eAAe,CAAA,EAAG,CAEjD,MAAO;AACH,YAAA,OAAA,EAAQ;AAAA,UACZ;AAAA,QACJ,CAAC,CAAA;AAAA,MACL,CAAC,CAAA;AAED,MAAA,IAAI,CAAC,QAAA,EAAU;AACX,QAAA,OAAO,KAAA;AAAA,MACX;AAAA,IACJ;AAGA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAElB,IAAA,IAAI;AAEA,MAAA,IAAA,CAAK,MAAA,EAAO;AAGZ,MAAA,IAAI,IAAA,CAAK,iBAAiB,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,cAAc,CAAA,EAAA,CAAI,CAAA;AAC9D,QAAA,MAAM,KAAA,CAAM,KAAK,cAAc,CAAA;AAG/B,QAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAE3B,QAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AAAA,MAC1B;AAGA,MAAA,OAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AACrB,QAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,SAAA,EAAW;AACpC,UAAA,OAAO,KAAA;AAAA,QACX;AAGA,QAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,MAAA,CAAO,UAAU,CAAC,CAAA;AACjD,QAAA,IAAA,CAAK,MAAA,EAAO;AAAA,MAChB;AAGA,MAAA,IAAA,CAAK,MAAA,EAAA;AAKL,MAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAA;AAC9C,MAAA,IAAI,mBAAA,GAAsB,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AAC9C,QAAA,MAAM,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,UAAA,GAAa,mBAAmB,CAAA;AAAA,MAC5D;AAMA,MAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAC3B,MAAA,OAAO,IAAA;AAAA,IACX,CAAA,SAAE;AAEE,MAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,KAAA,EAAM;AACrC,QAAA,IAAA,EAAK;AAAA,MACT;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AAAA,EAGhB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,GAA6B;AACzB,IAAA,IAAA,CAAK,iBAAA,EAAA;AAGL,IAAA,IAAI,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAC3B,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,UAAA,GAAa,KAAK,MAAA,CAAO,iBAAA;AAAA,IAC/D,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,GAAA;AAAA,QACvB,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,iBAAA;AAAA,QAClC,KAAK,MAAA,CAAO;AAAA,OAChB;AAAA,IACJ;AAKA,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAE3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,yBAAA,EAA4B,IAAA,CAAK,cAAc,CAAA,YAAA,EAAe,IAAA,CAAK,iBAAiB,CAAA,CAAE,CAAA;AAAA,EAC3G;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAoB;AAChB,IAAA,IAAA,CAAK,iBAAA,EAAA;AAGL,IAAA,IAAI,IAAA,CAAK,qBAAqB,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,GAAA;AAAA,QACvB,IAAA,CAAK,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,iBAAA;AAAA,QAC9B,IAAA,CAAK,OAAO,YAAA,GAAe;AAAA,OAC/B;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACV,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,CAAO,SAAA;AAC1B,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAAA,EAE7B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAwC;AACjD,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAE1C,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AACrC,MAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,CAAO,SAAA;AAAA,IAC9B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAA,GAAe;AACnB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA;AAC3B,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAO,UAAU,GAAA,GAAQ,IAAA,CAAK,OAAO,GAAG,CAAA;AAEjE,IAAA,IAAI,cAAc,CAAA,EAAG;AACjB,MAAA,IAAA,CAAK,MAAA,GAAS,KAAK,GAAA,CAAI,IAAA,CAAK,OAAO,SAAA,EAAW,IAAA,CAAK,SAAS,WAAW,CAAA;AACvE,MAAA,IAAA,CAAK,UAAA,GAAa,GAAA;AAAA,IACtB;AAAA,EACJ;AACJ;AAWO,IAAM,qBAAN,MAAyB;AAAA,EAK5B,YAAY,MAAA,EAAiB;AAJ7B,IAAA,IAAA,CAAQ,QAAA,uBAAoD,GAAA,EAAI;AAChE,IAAA,IAAA,CAAQ,OAAA,uBAA4C,GAAA,EAAI;AAIpD,IAAA,IAAA,CAAK,SAAS,MAAA,IAAUA,cAAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,YAAoB,MAAA,EAA2D;AACtF,IAAA,IAAI,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAE1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAC/C,MAAA,OAAA,GAAU,IAAI,sBAAA;AAAA,QACV,EAAE,GAAG,WAAA,EAAa,GAAG,MAAA,EAAO;AAAA,QAC5B,IAAA,CAAK;AAAA,OACT;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,YAAoB,MAAA,EAA+B;AACzD,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,MAAM,CAAA;AAGnC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAC5C,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,OAAA,CAAQ,aAAa,MAAM,CAAA;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAAA,EAA2C;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAC5C,IAAA,OAAO,OAAA,GAAU,OAAA,CAAQ,QAAA,EAAS,GAAI,IAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,UAAA,EAAoB,SAAA,EAAsC;AACpE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA;AAC1C,IAAA,OAAO,OAAA,CAAQ,QAAQ,SAAS,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,UAAA,EAA0B;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAC5C,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,OAAA,CAAQ,aAAA,EAAc;AAAA,IAC1B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,UAAA,EAA0B;AAC3C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA;AAC1C,IAAA,OAAA,CAAQ,oBAAA,EAAqB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,UAAA,EAA0B;AAClC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA;AAC1C,IAAA,OAAA,CAAQ,WAAA,EAAY;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,EAA0B;AAC5B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAC5C,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,IAClB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACb,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AAC1C,MAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,IAClB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAA,EAA0B;AAC7B,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,UAAU,CAAA;AAC/B,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,UAAU,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACV,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACvB;AACJ;AASO,SAAS,iBAAA,CAAkB,KAAa,MAAA,EAAyC;AACpF,EAAA,OAAO,IAAI,sBAAA;AAAA,IACP;AAAA,MACI,GAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,GAAA,GAAM,GAAG,CAAC,CAAA;AAAA,MAC3C,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,GAAA,GAAO,GAAG,CAAA;AAAA,MAChC,iBAAA,EAAmB,CAAA;AAAA,MACnB,YAAA,EAAc;AAAA,KAClB;AAAA,IACA;AAAA,GACJ;AACJ;AAKO,SAAS,yBAAyB,MAAA,EAAqC;AAC1E,EAAA,OAAO,IAAI,mBAAmB,MAAM,CAAA;AACxC;;;ACxcA,IAAMA,cAAAA,GAAwB;AAAA,EAC1B,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EAC3E,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACxE,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,KAAK,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACzE,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE;AAC/E,CAAA;AAmBA,IAAMC,eAAAA,GAAkC;AAAA,EACpC,kBAAA,EAAoB,GAAA;AAAA,EACpB,aAAA,EAAe,GAAA;AAAA,EACf,cAAA,EAAgB,GAAA;AAAA,EAChB,eAAA,EAAiB,GAAA;AAAA,EACjB,SAAA,EAAW,CAAC,WAAA,EAAa,UAAU;AACvC,CAAA;AAeO,IAAM,mBAAN,MAAuB;AAAA,EAe1B,YACI,QAAA,EACA,aAAA,EACA,MAAA,EACA,MAAA,EACA,UAA8B,MAAA,EAChC;AAbF;AAAA,IAAA,IAAA,CAAQ,kBAAA,GAAoC,IAAA;AAC5C,IAAA,IAAA,CAAQ,UAAA,GAAsB,IAAA;AAC9B,IAAA,IAAA,CAAQ,cAAA,GAAgC,IAAA;AACxC,IAAA,IAAA,CAAQ,qBAAA,uBAAkD,GAAA,EAAI;AAE9D;AAAA,IAAA,IAAA,CAAQ,uBAAA,uBAAoD,GAAA,EAAI;AAS5D,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAGA,eAAAA,EAAgB,GAAG,MAAA,EAAO;AAC7C,IAAA,IAAA,CAAK,SAAS,MAAA,IAAUD,cAAAA;AACxB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAgB,OAAA,EAA2C;AAEvD,IAAA,IAAI,KAAK,cAAA,EAAgB;AACrB,MAAA,OAAO,IAAA,CAAK,qBAAqB,OAAO,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,kBAAA,EAAoB;AAC7C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,KAAK,kBAAkB,CAAA;AAClE,MAAA,IAAI,QAAA,IAAY,QAAA,CAAS,OAAA,KAAY,OAAA,EAAS;AAE1C,QAAA,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,EAAE,CAAA;AACrD,QAAA,OAAO,QAAA;AAAA,MACX;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,KAAK,kBAAkB,CAAA,8CAAA;AAAA,OAChD;AAAA,IACJ;AAGA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,OAAO,CAAA;AAC3D,IAAA,IAAI,YAAA,EAAc;AACd,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,YAAY,CAAA;AACrD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,cAAc,OAAO,CAAA;AAIjE,MAAA,IACI,UACA,MAAA,IACA,MAAA,CAAO,OAAA,KAAY,KAAA,IACnB,OAAO,OAAA,KAAY,MAAA;AAAA,MACnB,KAAK,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAC9C;AAEE,QAAA,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,OAAA,EAAS,YAAY,CAAA;AACtD,QAAA,OAAO,MAAA;AAAA,MACX,CAAA,MAAO;AAEH,QAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,OAAO,CAAA;AACzC,QAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,OAAO,CAAA;AAAA,MAC/C;AAAA,IACJ;AAGA,IAAA,OAAO,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,OAAA,EAA2C;AACxD,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,sBAAA,CAAuB,OAAO,CAAA;AAG5D,IAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC5B,MAAA,MAAM,cAAc,SAAA,CAAU,MAAA;AAC9B,MAAA,SAAA,GAAY,IAAA,CAAK,uBAAA,CAAwB,SAAA,EAAW,OAAO,CAAA;AAC3D,MAAA,MAAM,aAAA,GAAgB,cAAc,SAAA,CAAU,MAAA;AAC9C,MAAA,IAAI,gBAAgB,CAAA,EAAG;AACnB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACR,CAAA,aAAA,EAAgB,aAAa,CAAA,sCAAA,EAAyC,OAAO,CAAA;AAAA,SACjF;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AACxB,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,8CAAA,EAAiD,OAAO,CAAA,CAAE,CAAA;AAC3E,MAAA,OAAO,IAAA;AAAA,IACX;AAGA,IAAA,MAAM,MAAA,GAAS,SAAA,CACV,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,MAChB,QAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,OAAO;AAAA,MAC7C,CAAA,CACD,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,KAAA,GAAQ,CAAC,CAAA,CAC/B,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAErC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAGrB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,yBAAA,CAA0B,OAAO,CAAA;AAChE,MAAA,KAAA,MAAW,mBAAmB,QAAA,EAAU;AACpC,QAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,eAAA,CAAgB,IAAI,OAAO,CAAA;AAGvE,QAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AACzC,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,YACR,CAAA,yBAAA,EAA4B,OAAO,CAAA,0BAAA,EAA6B,eAAA,CAAgB,EAAE,CAAA;AAAA,WACtF;AACA,UAAA,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,OAAA,EAAS,eAAA,CAAgB,EAAE,CAAA;AAC5D,UAAA,OAAO,eAAA;AAAA,QACX;AAGA,QAAA,IAAI,MAAA,CAAO,YAAY,IAAA,EAAM;AACzB,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,YACR,CAAA,yBAAA,EAA4B,OAAO,CAAA,iBAAA,EAAoB,eAAA,CAAgB,EAAE,CAAA;AAAA,WAC7E;AACA,UAAA,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,OAAA,EAAS,eAAA,CAAgB,EAAE,CAAA;AAC5D,UAAA,OAAO,eAAA;AAAA,QACX;AAGA,QAAA,IAAI,MAAA,CAAO,OAAA,KAAY,KAAA,IAAS,MAAA,CAAO,UAAA,EAAY;AAC/C,UAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,WAAW,OAAA,EAAQ;AAChE,UAAA,MAAM,UAAA,GAAa,GAAA;AAEnB,UAAA,IAAI,mBAAmB,UAAA,EAAY;AAE/B,YAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,cACR,CAAA,yBAAA,EAA4B,OAAO,CAAA,0CAAA,EAA6C,eAAA,CAAgB,EAAE,CAAA;AAAA,aACtG;AACA,YAAA,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,OAAA,EAAS,eAAA,CAAgB,EAAE,CAAA;AAC5D,YAAA,OAAO,eAAA;AAAA,UACX;AAAA,QACJ;AAAA,MAEJ;AAGA,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAC9B,QAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,QAAA,CAAS,IAAI,OAAO,CAAA;AAGhE,QAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AACzC,UAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,YACR,CAAA,gCAAA,EAAmC,OAAO,CAAA,kBAAA,EAAqB,QAAA,CAAS,EAAE,CAAA;AAAA,WAC9E;AACA,UAAA,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,EAAE,CAAA;AACrD,UAAA,OAAO,QAAA;AAAA,QACX;AAGA,QAAA,IAAI,MAAA,CAAO,OAAA,KAAY,KAAA,IAAS,MAAA,CAAO,UAAA,EAAY;AAC/C,UAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,WAAW,OAAA,EAAQ;AAChE,UAAA,MAAM,UAAA,GAAa,GAAA;AAEnB,UAAA,IAAI,mBAAmB,UAAA,EAAY;AAE/B,YAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,cACR,CAAA,yBAAA,EAA4B,OAAO,CAAA,2CAAA,EAA8C,QAAA,CAAS,EAAE,CAAA;AAAA,aAChG;AACA,YAAA,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,EAAE,CAAA;AACrD,YAAA,OAAO,QAAA;AAAA,UACX;AAAA,QACJ;AAAA,MACJ;AAGA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,CAAA,yCAAA,CAA2C,CAAA;AAClG,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA;AACvB,IAAA,MAAM,aAAa,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,IAAA,CAAK,IAAI,OAAO,CAAA;AAGhE,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,OAAA,KAAY,IAAA,EAAM;AAC3C,MAAA,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AAC/C,MAAA,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AACjD,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,EAAE,CAAA,SAAA,EAAY,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,OAClF;AAAA,IACJ,CAAA,MAAO;AAGH,MAAA,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AACjD,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,EAAE,CAAA,SAAA,EAAY,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,WAAA;AAAA,OAClF;AAAA,IACJ;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,OAAA,EAAsC;AACxD,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,sBAAA,CAAuB,OAAO,CAAA;AAG5D,IAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC5B,MAAA,SAAA,GAAY,IAAA,CAAK,uBAAA,CAAwB,SAAA,EAAW,OAAO,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,SAAA,CACF,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,MAChB,QAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,OAAO;AAAA,KAC/C,CAAE,EACD,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,CAC/B,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAK,EAChC,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CACI,SACA,UAAA,EACuB;AACvB,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,sBAAA,CAAuB,OAAO,CAAA;AAG5D,IAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC5B,MAAA,SAAA,GAAY,IAAA,CAAK,uBAAA,CAAwB,SAAA,EAAW,OAAO,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,SAAA,GAAY,SAAA,CACb,MAAA,CAAO,CAAC,MAAM,CAAC,UAAA,CAAW,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA,CACxC,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,MAChB,QAAA;AAAA,MACA,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,OAAO;AAAA,MAC7C,CAAA,CACD,MAAA,CAAO,CAAC,IAAA,KAAS,KAAK,KAAA,GAAQ,CAAC,CAAA,CAC/B,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAErC,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,OAAO,SAAA,CAAU,CAAC,CAAA,CAAE,QAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,aAAA,CAAc,UAA4B,OAAA,EAA0B;AACxE,IAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,QAAA,CAAS,IAAI,OAAO,CAAA;AAIhE,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AACzC,MAAA,OAAO,IAAA,IAAQ,CAAA,IAAK,QAAA,CAAS,QAAA,GAAW,CAAA,CAAA,CAAA;AAAA,IAC5C;AAIA,IAAA,IAAI,MAAA,CAAO,YAAY,KAAA,EAAO;AAG1B,MAAA,IAAI,OAAO,UAAA,EAAY;AACnB,QAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,WAAW,OAAA,EAAQ;AAChE,QAAA,MAAM,UAAA,GAAa,GAAA;AAEnB,QAAA,IAAI,mBAAmB,UAAA,EAAY;AAG/B,UAAA,OAAO,IAAA,IAAS,CAAA,IAAK,QAAA,CAAS,QAAA,GAAW,CAAA,CAAA,CAAA;AAAA,QAC7C;AAAA,MACJ;AAEA,MAAA,OAAO,CAAA;AAAA,IACX;AAKA,IAAA,IAAI,MAAA,CAAO,WAAW,SAAA,EAAW;AAG7B,MAAA,OAAO,CAAA;AAAA,IACX;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,UAAU,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG;AAChD,MAAA,OAAO,CAAA;AAAA,IACX;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA;AACrD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,SAAS,CAAA;AAC1D,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,QAAA,CAAS,QAAQ,CAAA;AAC7D,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,YAAY,CAAA;AAGjE,IAAA,MAAM,QACF,WAAA,GAAc,GAAA;AAAA,IACd,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,aAAA,GAC3B,aAAA,GAAgB,KAAK,MAAA,CAAO,cAAA,GAC5B,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,eAAA;AAEjC,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEQ,eAAe,MAAA,EAAgC;AACnD,IAAA,QAAQ,MAAA;AAAQ,MACZ,KAAK,WAAA;AACD,QAAA,OAAO,CAAA;AAAA,MACX,KAAK,UAAA;AACD,QAAA,OAAO,GAAA;AAAA,MACX,KAAK,OAAA;AACD,QAAA,OAAO,GAAA;AAAA,MACX;AACI,QAAA,OAAO,CAAA;AAAA;AACf,EACJ;AAAA,EAEQ,gBAAgB,SAAA,EAAkC;AACtD,IAAA,IAAI,cAAc,IAAA,EAAM;AACpB,MAAA,OAAO,GAAA;AAAA,IACX;AAGA,IAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,kBAAA;AACtC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,EAC7D;AAAA,EAEQ,iBAAiB,QAAA,EAA0B;AAE/C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,WAAW,GAAG,CAAA;AAAA,EACzC;AAAA,EAEQ,kBAAkB,YAAA,EAA8B;AAEpD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,eAAe,EAAE,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,oBAAoB,UAAA,EAAiC;AACjD,IAAA,IAAA,CAAK,kBAAA,GAAqB,UAAA;AAC1B,IAAA,IAAI,eAAe,IAAA,EAAM;AACrB,MAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,mBAAA,EAAsB,UAAA,IAAc,QAAQ,CAAA,CAAE,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAAuC;AACnC,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC9B;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA+B;AAC3B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,QAAA,EAA+B;AAC7C,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAA,EAAU,IAAA,EAAK,IAAK,IAAA;AAC1C,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,IAAA,CAAK,cAAA,IAAkB,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAmC;AAC/B,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAAiC;AAC7B,IAAA,OAAO,IAAA,CAAK,cAAA,KAAmB,IAAA,IAAQ,IAAA,CAAK,eAAe,MAAA,GAAS,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,OAAA,EAAyB;AAChC,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,OAAO,CAAA;AACzC,MAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,OAAO,CAAA;AAAA,IAC/C,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,sBAAsB,KAAA,EAAM;AACjC,MAAA,IAAA,CAAK,wBAAwB,KAAA,EAAM;AAAA,IACvC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,OAAA,EAAwB;AACvC,IAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,CAAsB,YAAoB,OAAA,EAA2C;AAEjF,IAAA,IAAI,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,OAAO,MAAM,UAAA,EAAY;AACxD,MAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,OAAO,CAAA;AAAA,IAC7C;AAGA,IAAA,IAAA,CAAK,uBAAA,CAAwB,OAAO,OAAO,CAAA;AAG3C,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,CAAC,UAAU,CAAC,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,OAAA,EAAiC;AACjD,IAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,GAAA,CAAI,OAAO,CAAA,IAAK,IAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,sBACI,OAAA,EACsD;AACtD,IAAA,IAAI,KAAK,cAAA,EAAgB;AACrB,MAAA,OAAO,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,iBAAA,EAAmB,UAAU,IAAA,EAAK;AAAA,IACnE;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,OAAO,EAAE,IAAI,QAAA,CAAS,EAAA,EAAI,MAAM,QAAA,CAAS,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,IACnE;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,qBAAqB,OAAA,EAAoC;AAC7D,IAAA,OAAO;AAAA,MACH,EAAA,EAAI,QAAA;AAAA,MACJ,IAAA,EAAM,iBAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,OAAA;AAAA,MACA,YAAY,IAAA,CAAK,cAAA;AAAA,MACjB,GAAA,EAAK,EAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAW,KAAA;AAAA,MACX,iBAAA,EAAmB;AAAA;AAAA,KACvB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,uBAAA,CACJ,WACA,OAAA,EACkB;AAClB,IAAA,OAAO,SAAA,CAAU,MAAA,CAAO,CAAC,QAAA,KAAa;AAElC,MAAA,IAAI,CAAC,SAAS,iBAAA,EAAmB;AAC7B,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACR,CAAA,SAAA,EAAY,SAAS,EAAE,CAAA,yCAAA;AAAA,SAC3B;AACA,QAAA,OAAO,KAAA;AAAA,MACX;AAGA,MAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,QAAA,CAAS,IAAI,OAAO,CAAA;AAChE,MAAA,IAAI,MAAA,IAAU,MAAA,CAAO,iBAAA,KAAsB,KAAA,EAAO;AAC9C,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,UACR,CAAA,SAAA,EAAY,SAAS,EAAE,CAAA,qEAAA;AAAA,SAC3B;AACA,QAAA,OAAO,KAAA;AAAA,MACX;AAEA,MAAA,OAAO,IAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL;AACJ;AASO,SAAS,eACZ,QAAA,EACA,aAAA,EACA,MAAA,EACA,MAAA,EACA,UAA8B,MAAA,EACd;AAChB,EAAA,OAAO,IAAI,gBAAA,CAAiB,QAAA,EAAU,aAAA,EAAe,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAChF;;;ACtlBA,IAAMA,cAAAA,GAAwB;AAAA,EAC1B,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EAC1E,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,IAAI,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACvE,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,KAAK,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACxE,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE;AAC9E,CAAA;AAMA,IAAM,eAAA,GAAoD;AAAA,EACtD,UAAA,EAAY,EAAA;AAAA;AAAA,EACZ,OAAA,EAAS,MAAA;AAAA,EACT,QAAA,EAAU,IAAA;AAAA,EACV,gBAAA,EAAkB,GAAA;AAAA,EAClB,qBAAA,EAAuB,CAAA;AAAA;AAAA,EACvB,eAAA,EAAiB,EAAA;AAAA,EACjB,MAAA,EAAQA;AACZ,CAAA;AAwBO,IAAM,gBAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EAkBzB,YAAY,OAAA,EAAkC;AAb9C;AAAA,IAAA,IAAA,CAAQ,QAAA,GAAoC,IAAA;AAC5C,IAAA,IAAA,CAAQ,aAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,WAAA,GAAyC,IAAA;AACjD,IAAA,IAAA,CAAQ,QAAA,GAAoC,IAAA;AAI5C,IAAA,IAAA,CAAQ,OAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,WAAA,GAAuB,KAAA;AAC/B,IAAA,IAAA,CAAQ,SAAA,GAAqB,KAAA;AAC7B,IAAA,IAAA,CAAQ,mBAAA,GAA6C,IAAA;AACrD,IAAA,IAAA,CAAQ,SAAA,uBAAoC,GAAA,EAAI;AAG5C,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,YAAY,OAAA,EAAmD;AAClE,IAAA,IAAI,CAAC,iBAAgB,QAAA,EAAU;AAC3B,MAAA,gBAAA,CAAgB,QAAA,GAAW,IAAI,gBAAA,CAAgB,OAAO,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,gBAAA,CAAgB,QAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAA,GAAsB;AACzB,IAAA,IAAI,iBAAgB,QAAA,EAAU;AAC1B,MAAA,gBAAA,CAAgB,SAAS,OAAA,EAAQ;AACjC,MAAA,gBAAA,CAAgB,QAAA,GAAW,IAAA;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,IAAA,CAAK,OAAA,EAAkB,aAAA,GAAyB,IAAA,EAAqB;AACvE,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,OAAA,KAAY,OAAA,EAAS;AAC9C,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,sCAAsC,CAAA;AAChE,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,OAAO,CAAA,GAAA,CAAK,CAAA;AACzD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAGf,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,IAAA,MAAM,YAAA,GAAe,kBAAkB,MAAM,CAAA;AAG7C,IAAA,IAAA,CAAK,WAAW,IAAI,gBAAA,CAAiB,YAAA,EAAc,IAAA,CAAK,QAAQ,MAAM,CAAA;AACtE,IAAA,IAAA,CAAK,WAAA,GAAc,wBAAA,CAAyB,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAG/D,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,eAAA,EAAgB,EAAG;AACpD,MAAA,MAAME,OAAAA,GAAS,mBAAA,CAAoB,QAAA,CAAS,IAAI,CAAA;AAGhD,MAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,GAAA,IAAO,CAAA,GAAI,GAAA,GAAM,GAAA;AACnD,MAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CAAM,GAAA,GAAO,QAAA,CAAS,MAAO,gBAAgB,CAAA;AAKrE,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,QAAA,CAAS,OAAO,CAAA,EAAG;AACnB,QAAA,SAAA,GAAY,CAAA;AAAA,MAChB,CAAA,MAAA,IAAW,QAAA,CAAS,GAAA,IAAO,CAAA,EAAG;AAC1B,QAAA,SAAA,GAAY,CAAA;AAAA,MAChB,CAAA,MAAO;AACH,QAAA,SAAA,GAAY,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,KAAK,QAAA,CAAS,GAAA,GAAM,GAAG,CAAC,CAAA;AAAA,MACzD;AAEA,MAAA,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,QAAA,CAAS,EAAA,EAAI;AAAA,QACpC,GAAGA,OAAAA;AAAA,QACH,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,UAAA;AAAA,QACA;AAAA,OACH,CAAA;AAAA,IACL;AAGA,IAAA,IAAA,CAAK,aAAA,GAAgB,mBAAA;AAAA,MACjB;AAAA,QACI,SAAA,EAAW,KAAK,OAAA,CAAQ,gBAAA;AAAA,QACxB,eAAA,EAAiB,KAAK,OAAA,CAAQ;AAAA,OAClC;AAAA,MACA,KAAK,OAAA,CAAQ,MAAA;AAAA,MACb,IAAA,CAAK;AAAA,KACT;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,cAAA;AAAA,MACZ,IAAA,CAAK,QAAA;AAAA,MACL,IAAA,CAAK,aAAA;AAAA,MACL,MAAA;AAAA,MACA,KAAK,OAAA,CAAQ,MAAA;AAAA,MACb,KAAK,OAAA,CAAQ;AAAA,KACjB;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAGrB,IAAA,IAAI,aAAA,EAAe;AACf,MAAA,MAAM,KAAK,gBAAA,EAAiB;AAAA,IAChC;AAGA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,qBAAA,GAAwB,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,wBAAA,EAAyB;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,yBAAyB,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACrB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,GAAoD;AACtD,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,2BAA2B,CAAA;AACrD,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,0BAAA,EAA6B,IAAA,CAAK,OAAO,CAAA,GAAA,CAAK,CAAA;AAEvE,IAAA,IAAI;AACA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAU,sBAAA,CAAuB,KAAK,OAAQ,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,aAAA,CAAe,cAAc,SAAS,CAAA;AAGjE,MAAA,IAAA,CAAK,QAAA,CAAU,kBAAA,CAAmB,IAAA,CAAK,OAAQ,CAAA;AAE/C,MAAA,MAAM,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACjD,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AAAA,QAChB,CAAA,2BAAA,EAA8B,SAAA,CAAU,MAAM,CAAA,CAAA,EAAI,QAAQ,MAAM,CAAA,UAAA;AAAA,OACpE;AAEA,MAAA,OAAO,OAAA;AAAA,IACX,CAAA,SAAE;AACE,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACzB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,UAAA,EAA0D;AACzE,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAU,WAAA,CAAY,UAAU,CAAA;AACtD,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,UAAU,CAAA,UAAA,CAAY,CAAA;AAC3D,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAe,YAAA,CAAa,QAAQ,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA8B;AAC1B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,WAAA,GAA+B;AACjC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAEvB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAU,eAAA,CAAgB,KAAK,OAAQ,CAAA;AAC7D,IAAA,IAAI,CAAC,QAAA,EAAU;AAEX,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,wCAAwC,CAAA;AACjE,MAAA,OAAO,KAAK,mBAAA,EAAoB;AAAA,IACpC;AAGA,IAAA,IAAA,CAAK,QAAA,CAAU,oBAAoB,IAAA,CAAK,OAAQ,KAAK,IAAA,CAAK,QAAA,CAAU,eAAA,CAAgB,IAAA,CAAK,OAAQ,CAAA;AAGjG,IAAA,IAAI,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,IAAA,KAAS,MAAA,EAAQ;AAChD,MAAA,IAAI;AACA,QAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,OAAO,0BAA0B,CAAA;AACnE,QAAA,MAAM,WAAW,MAAM,eAAA,CAAgB,EAAE,OAAA,EAAS,IAAA,CAAK,SAAU,CAAA;AACjE,QAAA,OAAO,oBAAoB,QAAQ,CAAA;AAAA,MACvC,SAAS,KAAA,EAAY;AACjB,QAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,6BAAA,EAAgC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAE5E;AAAA,IACJ;AAEA,IAAA,OAAO,mBAAA,CAAoB,SAAS,UAAU,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,wBAAA,CAAyB,SAAA,EAAoB,YAAA,GAAwB,KAAA,EAAwB;AAC/F,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAGvB,IAAA,IAAI,YAAA,EAAc;AACd,MAAA,IAAA,CAAK,QAAA,CAAU,UAAA,CAAW,IAAA,CAAK,OAAQ,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAU,eAAA,CAAgB,KAAK,OAAQ,CAAA;AAC7D,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,OAAO,KAAK,mBAAA,EAAoB;AAAA,IACpC;AAGA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,YAAa,OAAA,CAAQ,QAAA,CAAS,IAAI,SAAS,CAAA;AACvE,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,uBAAA,EAA0B,QAAA,CAAS,EAAE,CAAA,CAAE,CAAA;AAEhE,MAAA,MAAM,IAAA,GAAO,KAAK,QAAA,CAAU,eAAA,CAAgB,KAAK,OAAA,EAAU,CAAC,QAAA,CAAS,EAAE,CAAC,CAAA;AACxE,MAAA,IAAI,IAAA,EAAM;AACN,QAAA,OAAO,mBAAA,CAAoB,KAAK,UAAU,CAAA;AAAA,MAC9C;AACA,MAAA,OAAO,KAAK,mBAAA,EAAoB;AAAA,IACpC;AAEA,IAAA,OAAO,mBAAA,CAAoB,SAAS,UAAU,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA6C;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,OAAA,EAAS;AACpC,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAU,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAAgF;AAC5E,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,OAAA,EAAS;AACpC,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAU,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAA,GAAsB;AAClB,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,OAAA,EAAS;AAExC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAU,eAAA,CAAgB,KAAK,OAAO,CAAA;AAC5D,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,IAAA,CAAK,WAAA,CAAa,aAAA,CAAc,QAAA,CAAS,EAAE,CAAA;AAAA,IAC/C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAA6B;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,OAAA,EAAS;AAIxC,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,QAAA,CAAU,mBAAA,CAAoB,KAAK,OAAO,CAAA;AACxE,IAAA,IAAI,QAAA,GAAoC,IAAA;AAExC,IAAA,IAAI,gBAAA,EAAkB;AAClB,MAAA,QAAA,GAAW,IAAA,CAAK,QAAA,CAAU,WAAA,CAAY,gBAAgB,CAAA,IAAK,IAAA;AAAA,IAC/D;AAGA,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,QAAA,GAAW,IAAA,CAAK,QAAA,CAAU,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,WAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACtE,IAAA,MAAM,aAAA,GAAgB,SAAS,WAAA,EAAY;AAG3C,IAAA,MAAM,QAAQ,aAAA,CAAc,QAAA,CAAS,KAAK,CAAA,IAAK,aAAA,CAAc,SAAS,YAAY,CAAA;AAClF,IAAA,MAAM,QAAQ,aAAA,CAAc,QAAA,CAAS,KAAK,CAAA,IAAK,aAAA,CAAc,SAAS,qBAAqB,CAAA;AAC3F,IAAA,MAAM,QAAQ,aAAA,CAAc,QAAA,CAAS,KAAK,CAAA,IAAK,aAAA,CAAc,SAAS,aAAa,CAAA;AACnF,IAAA,MAAM,QAAQ,aAAA,CAAc,QAAA,CAAS,KAAK,CAAA,IAAK,aAAA,CAAc,SAAS,WAAW,CAAA;AACjF,IAAA,MAAM,YAAY,aAAA,CAAc,QAAA,CAAS,SAAS,CAAA,IAAK,aAAA,CAAc,SAAS,OAAO,CAAA;AAErF,IAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,IAAK,KAAA,EAAO;AAClC,MAAA,IAAA,CAAK,WAAA,CAAa,oBAAA,CAAqB,QAAA,CAAS,EAAE,CAAA;AAClD,MAAA,IAAA,CAAK,cAAe,YAAA,CAAa,QAAA,CAAS,EAAA,EAAI,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,IACxE,CAAA,MAAA,IAAW,KAAA,IAAS,KAAA,IAAS,KAAA,IAAS,SAAA,EAAW;AAE7C,MAAA,IAAA,CAAK,WAAA,CAAa,WAAA,CAAY,QAAA,CAAS,EAAE,CAAA;AACzC,MAAA,IAAA,CAAK,cAAe,WAAA,CAAY,QAAA,CAAS,EAAA,EAAI,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,IACvE,CAAA,MAAO;AAEH,MAAA,IAAA,CAAK,WAAA,CAAa,WAAA,CAAY,QAAA,CAAS,EAAE,CAAA;AACzC,MAAA,IAAA,CAAK,cAAe,YAAA,CAAa,QAAA,CAAS,EAAA,EAAI,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,IACxE;AAIA,IAAA,IAAA,CAAK,QAAA,CAAU,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,QAAA,CAAU,qBAAA,CAAsB,QAAA,CAAS,EAAA,EAAI,KAAK,OAAO,CAAA;AAC9D,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,oBAAoB,UAAA,EAAiC;AACjD,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,QAAA,CAAU,oBAAoB,UAAU,CAAA;AAC7C,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAAuC;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,IAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,SAAU,qBAAA,EAAsB;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,OAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,QAAA,CAAU,cAAc,OAAO,CAAA;AACpC,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA+B;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,IAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,SAAU,mBAAA,EAAoB;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,QAAA,EAA+B;AAC7C,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,QAAA,CAAU,kBAAkB,QAAQ,CAAA;AACzC,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAmC;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,IAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,SAAU,iBAAA,EAAkB;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAAiC;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAa,OAAO,KAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,SAAU,qBAAA,EAAsB;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,GAA6B;AACzB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAmC;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,IAAA,CAAK,OAAA,SAAgB,EAAC;AAChD,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,QAAA,CAAU,sBAAA,CAAuB,KAAK,OAAO,CAAA;AAGlE,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,KAAY,SAAA,EAAW;AACpC,MAAA,SAAA,GAAY,SAAA,CAAU,MAAA,CAAO,CAAC,QAAA,KAAa;AAEvC,QAAA,IAAI,CAAC,SAAS,iBAAA,EAAmB;AAC7B,UAAA,OAAO,KAAA;AAAA,QACX;AAGA,QAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAe,UAAU,QAAA,CAAS,EAAA,EAAI,KAAK,OAAQ,CAAA;AACvE,QAAA,IAAI,MAAA,IAAU,MAAA,CAAO,iBAAA,KAAsB,KAAA,EAAO;AAC9C,UAAA,OAAO,KAAA;AAAA,QACX;AAEA,QAAA,OAAO,IAAA;AAAA,MACX,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,OAAO,SAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAA,GAAmD;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,IAAA,CAAK,OAAA,SAAgB,EAAC;AAChD,IAAA,OAAO,IAAA,CAAK,aAAA,CAAe,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuC;AACnC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAAyC;AACrC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAA4C;AACxC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiC;AAC7B,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAA2B;AAEjD,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,OAAA,IAAW,KAAK,QAAA,EAAU;AACnD,MAAA,KAAA,MAAW,YAAY,IAAA,CAAK,QAAA,CAAS,sBAAA,CAAuB,IAAA,CAAK,OAAO,CAAA,EAAG;AACvE,QAAA,MAAM,SAAS,IAAA,CAAK,aAAA,EAAe,UAAU,QAAA,CAAS,EAAA,EAAI,KAAK,OAAO,CAAA;AACtE,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,EAAa,QAAA,CAAS,SAAS,EAAE,CAAA;AAExD,QAAA,SAAA,CAAU,GAAA,CAAI,SAAS,EAAA,EAAI;AAAA,UACvB,IAAI,QAAA,CAAS,EAAA;AAAA,UACb,QAAQ,MAAA,IAAU;AAAA,YACd,IAAI,QAAA,CAAS,EAAA;AAAA,YACb,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,OAAA,EAAS,KAAA;AAAA,YACT,MAAA,EAAQ,UAAA;AAAA,YACR,SAAA,EAAW,IAAA;AAAA,YACX,KAAA,EAAO,IAAA;AAAA,YACP,YAAA,EAAc,CAAA;AAAA,YACd,UAAA,EAAY,IAAA;AAAA,YACZ,mBAAmB,QAAA,CAAS;AAAA,WAChC;AAAA,UACA,WAAW,SAAA,IAAa;AAAA,YACpB,MAAA,EAAQ,CAAA;AAAA,YACR,UAAA,EAAY,CAAA;AAAA,YACZ,cAAA,EAAgB,CAAA;AAAA,YAChB,iBAAA,EAAmB,CAAA;AAAA,YACnB,UAAA,EAAY,KAAA;AAAA,YACZ,WAAA,EAAa;AAAA;AACjB,SACH,CAAA;AAAA,MACL;AAAA,IACJ;AAEA,IAAA,OAAO;AAAA,MACH,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAA;AAAA,MACA,uBAAuB,IAAI,GAAA;AAAA,QACvB,KAAK,OAAA,IAAW,IAAA,CAAK,WACf,CAAC,CAAC,KAAK,OAAA,EAAS,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,KAAK,OAAO,CAAA,EAAG,MAAM,EAAE,CAAC,IACtE;AAAC,OACX;AAAA,MACA,kBAAA,EAAoB,IAAA,CAAK,QAAA,EAAU,qBAAA,EAAsB,IAAK,IAAA;AAAA,MAC9D,UAAA,EAAY,IAAA,CAAK,QAAA,EAAU,mBAAA,EAAoB,IAAK,IAAA;AAAA,MACpD,cAAA,EAAgB,IAAA,CAAK,QAAA,EAAU,iBAAA,EAAkB,IAAK;AAAA,KAC1D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,QAAA,EAAqC;AAC3C,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM;AACT,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAClC,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAAwB;AAC5B,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,CAAC,QAAA,KAAa,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAA0B;AAC9B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACnB,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACzE;AAAA,EACJ;AAAA,EAEQ,mBAAA,GAA8B;AAClC,IAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC5B,MAAA,OAAO,sCAAA;AAAA,IACX;AACA,IAAA,OAAO,8CAAA;AAAA,EACX;AAAA,EAEQ,wBAAA,GAAiC;AACrC,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAE7B,IAAA,IAAA,CAAK,mBAAA,GAAsB,YAAY,MAAM;AACzC,MAAA,IAAA,CAAK,gBAAA,EAAiB,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AACrC,QAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC9E,CAAC,CAAA;AAAA,IACL,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,qBAAqB,CAAA;AAErC,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AAAA,MAChB,CAAA,+BAAA,EAAkC,IAAA,CAAK,OAAA,CAAQ,qBAAqB,CAAA,EAAA;AAAA,KACxE;AAAA,EACJ;AAAA,EAEQ,uBAAA,GAAgC;AACpC,IAAA,IAAI,KAAK,mBAAA,EAAqB;AAC1B,MAAA,aAAA,CAAc,KAAK,mBAAmB,CAAA;AACtC,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAAA,IAC/B;AAAA,EACJ;AACJ,CAAA;AAAA;AA3mBa,gBAAA,CAEM,QAAA,GAAmC,IAAA;AAF/C,IAAM,eAAA,GAAN;AAonBA,SAAS,sBAAsB,OAAA,EAAmD;AACrF,EAAA,OAAO,IAAI,gBAAgB,OAAO,CAAA;AACtC;AAKO,SAAS,mBAAmB,OAAA,EAAmD;AAClF,EAAA,OAAO,eAAA,CAAgB,YAAY,OAAO,CAAA;AAC9C;ACprBA,IAAMF,cAAAA,GAAwB;AAAA,EAC1B,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACtE,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,IAAI,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACnE,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,KAAK,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACpE,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE;AAC1E,CAAA;AAaA,IAAI,YAAA,GAAoC,IAAA;AAWjC,IAAM,cAAN,MAAkB;AAAA,EAIrB,WAAA,CAAY,SAA0B,MAAA,EAAiB;AACnD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAS,MAAA,IAAUA,cAAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,SAAA,GAAgC;AAGlC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAW;AAExC,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACrD;AAGA,IAAA,IACI,gBACA,YAAA,CAAa,QAAA,KAAa,QAAA,IAC1B,YAAA,CAAa,YAAY,OAAA,EAC3B;AACE,MAAA,OAAO,YAAA,CAAa,MAAA;AAAA,IACxB;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,iBAAA,EAAkB;AAChD,IAAA,MAAM,SAAS,QAAA,EAAU,MAAA;AAEzB,IAAA,MAAM,MAAA,GAAS,IAAIG,aAAA,CAAU;AAAA,MACzB,QAAA;AAAA,MACA;AAAA,KACH,CAAA;AAED,IAAA,YAAA,GAAe;AAAA,MACX,MAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACxB;AAEA,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,sBAAA,EAAyB,OAAO,CAAA,CAAA,EAAI,EAAE,UAAU,CAAA;AAElE,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,uBAAuB,SAAA,EAAwC;AAEjE,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,wBAAA,CAAyB,SAAS,CAAA;AACrD,IAAA,OAAO,KAAK,SAAA,EAAU;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAoB;AAChB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,sBAAsB,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA4E;AACxE,IAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAC1B,IAAA,OAAO;AAAA,MACH,UAAU,YAAA,CAAa,QAAA;AAAA,MACvB,SAAS,YAAA,CAAa,OAAA;AAAA,MACtB,GAAA,EAAK,IAAA,CAAK,GAAA,EAAI,GAAI,YAAA,CAAa;AAAA,KACnC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAA,CACF,OAAA,EACA,SAAA,GAAoB,GAAA,EACmB;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAChD,IAAA,MAAM,MAAA,GAAS,SAAS,QAAQ,CAAA;AAChC,IAAA,MAAM,UAAU,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,QAAQ,QAAA,EAAS;AACzE,IAAA,MAAM,MAAM,CAAA,EAAG,MAAM,CAAA,yBAAA,EAA4B,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAE5E,IAAA,IAAI;AACA,MAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,QACnB,GAAA;AAAA,QACA,EAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,oBAAmB,EAAE;AAAA,QAC1C;AAAA,OACJ;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAErC,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC1B,QAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,QAAA,OAAO,IAAA;AAAA,MACX;AAEA,MAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,YAAY,OAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AACpE,QAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MAChB;AAEA,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAChD,SAAS,KAAA,EAAY;AACjB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACF,OAAA,EACA,SAAA,GAAoB,GAAA,EACL;AACf,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAChD,IAAA,MAAM,MAAA,GAAS,SAAS,QAAQ,CAAA;AAChC,IAAA,MAAM,UAAU,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,QAAQ,QAAA,EAAS;AACzE,IAAA,MAAM,MAAM,CAAA,EAAG,MAAM,CAAA,2BAAA,EAA8B,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAE9E,IAAA,IAAI;AACA,MAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,QACnB,GAAA;AAAA,QACA,EAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,oBAAmB,EAAE;AAAA,QAC1C;AAAA,OACJ;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAErC,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,SAAS,QAAA,EAAU;AACtD,QAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,QAAA,OAAO,OAAO,IAAI,CAAA;AAAA,MACtB;AAEA,MAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,YAAY,KAAA,CAAA,EAAW;AAChE,QAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,QAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,MACtC;AAEA,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAChD,SAAS,KAAA,EAAY;AACjB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACF,OAAA,EACA,MAAA,EACA,QAAmB,EAAC,EACpB,YAAoB,IAAA,EAC4B;AAChD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAChD,IAAA,MAAM,MAAA,GAAS,SAAS,QAAQ,CAAA;AAChC,IAAA,MAAM,UAAU,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,QAAQ,QAAA,EAAS;AACzE,IAAA,MAAM,GAAA,GAAM,GAAG,MAAM,CAAA,aAAA,CAAA;AAErB,IAAA,IAAI;AACA,MAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,QACnB,GAAA;AAAA,QACA;AAAA,UACI,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACL,cAAA,EAAgB,kBAAA;AAAA,YAChB,MAAA,EAAQ;AAAA,WACZ;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACjB,OAAA,EAAS,OAAA;AAAA,YACT,MAAA;AAAA,YACA;AAAA,WACH;AAAA,SACL;AAAA,QACA;AAAA,OACJ;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAErC,MAAA,IAAI,IAAA,CAAK,cAAc,KAAA,CAAA,EAAW;AAC9B,QAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,MACnD;AAEA,MAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,MAAA,OAAO;AAAA,QACH,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS;AAAC,OAC1B;AAAA,IACJ,SAAS,KAAA,EAAY;AACjB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACF,GAAA,EACA,SAAA,GAAoB,GAAA,EACP;AACb,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAChD,IAAA,MAAM,MAAA,GAAS,SAAS,QAAQ,CAAA;AAChC,IAAA,MAAM,GAAA,GAAM,GAAG,MAAM,CAAA,QAAA,CAAA;AACrB,IAAA,MAAM,YAAY,OAAO,GAAA,KAAQ,WAAW,GAAA,GAAM,GAAA,CAAI,SAAS,QAAQ,CAAA;AAEvE,IAAA,IAAI;AACA,MAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,QACnB,GAAA;AAAA,QACA;AAAA,UACI,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAK,WAAW;AAAA,SAC3C;AAAA,QACA;AAAA,OACJ;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AACxB,MAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAAA,IAC/B,SAAS,KAAA,EAAY;AACjB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACF,OAAA,EACA,SAAA,GAAoB,GAAA,EACJ;AAChB,IAAA,IAAI;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAS,SAAS,CAAA;AAC3D,MAAA,OAAO,KAAA,KAAU,QAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAO,KAAA;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAe,IAAA,EAAoB;AACvC,IAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,QAAQ,IAAA,EAAM;AAClD,MAAA,MAAM,IAAA,GAAO,IAAA;AACb,MAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACV,QAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,uBAAuB,CAAA;AAAA,MACzD;AACA,MAAA,OAAO,KAAK,MAAA,IAAU,IAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,EAAM;AACtD,MAAA,OAAQ,IAAA,CAA6B,MAAA;AAAA,IACzC;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AASO,SAAS,iBAAA,CAAkB,SAA0B,MAAA,EAA8B;AACtF,EAAA,OAAO,IAAI,WAAA,CAAY,OAAA,EAAS,MAAM,CAAA;AAC1C;AAuBA,eAAsB,aAAa,OAAA,EAA8C;AAC7E,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,CAAY,OAAO,CAAA;AACvC,EAAA,OAAO,QAAQ,SAAA,EAAU;AAC7B;AAiBA,eAAsB,0BAClB,OAAA,EAID;AACC,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,CAAY,OAAO,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,SAAA,EAAU;AAEvC,EAAA,MAAM,aAAA,GAAgB,OAClB,EAAA,EACA,UAAA,GAAqB,CAAA,KACR;AACb,IAAA,IAAI,SAAA;AAEJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACpD,MAAA,IAAI;AAEA,QAAA,MAAM,OAAA,CAAQ,yBAAyB,GAAK,CAAA;AAG5C,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,EAAG;AAGxB,QAAA,OAAA,CAAQ,aAAA,EAAc;AACtB,QAAA,OAAO,MAAA;AAAA,MACX,SAAS,KAAA,EAAY;AACjB,QAAA,SAAA,GAAY,KAAA;AAGZ,QAAA,MAAM,QAAA,GAAW,KAAA,EAAO,OAAA,IAAW,MAAA,CAAO,KAAK,CAAA,IAAK,EAAA;AACpD,QAAA,MAAM,KAAA,GACF,QAAA,CAAS,QAAA,CAAS,KAAK,KACvB,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,IAC9B,KAAA,EAAO,MAAA,KAAW,GAAA,IAClB,KAAA,EAAO,UAAU,MAAA,KAAW,GAAA;AAEhC,QAAA,IAAI,KAAA,IAAS,UAAU,UAAA,EAAY;AAE/B,UAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AAGzB,UAAA,MAAM,YAAA,GAAe,QAAQ,QAAA,EAAS;AACtC,UAAA,MAAM,QAAA,GAAW,QAAQ,iBAAA,EAAkB;AAC3C,UAAA,IAAI,OAAA,GAAU,GAAA;AAEd,UAAA,IAAI,QAAA,IAAY,aAAa,SAAA,EAAW;AACpC,YAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,SAAA,CAAU,GAAA,CAAI,SAAS,EAAE,CAAA;AAC5D,YAAA,IAAI,aAAA,EAAe,WAAW,cAAA,EAAgB;AAC1C,cAAA,OAAA,GAAU,cAAc,SAAA,CAAU,cAAA;AAAA,YACtC;AAAA,UACJ;AAIA,UAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,KAAK,GAAI,CAAA;AACpD,UAAA,MAAM,WAAW,OAAA,GAAU,eAAA;AAG3B,UAAA,OAAA,CAAQ,IAAA;AAAA,YACJ,wDAAwD,QAAQ,CAAA,YAAA,EAAe,UAAU,CAAC,CAAA,CAAA,EAAI,aAAa,CAAC,CAAA,CAAA;AAAA,WAChH;AACA,UAAA,MAAM,MAAM,QAAQ,CAAA;AACpB,UAAA;AAAA,QACJ;AAGA,QAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AACzB,QAAA,MAAM,KAAA;AAAA,MACV;AAAA,IACJ;AAGA,IAAA,MAAM,SAAA,IAAa,IAAI,KAAA,CAAM,8BAA8B,CAAA;AAAA,EAC/D,CAAA;AAEA,EAAA,OAAO,EAAE,QAAQ,aAAA,EAAc;AACnC;AAKA,eAAsB,sBAAA,CAClB,SACA,UAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,WAAA,CAAY,EAAE,YAAY,CAAA;AAE1D,EAAA,IAAI,CAAC,OAAA,CAAQ,aAAA,MAAmB,OAAA,CAAQ,UAAA,OAAiB,OAAA,EAAS;AAC9D,IAAA,MAAM,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,aAAa,OAAO,CAAA;AAC/B;AAKO,SAAS,gBAAA,GAAyB;AACrC,EAAA,YAAA,GAAe,IAAA;AACf,EAAA,eAAA,CAAgB,aAAA,EAAc;AAClC;;;ACzeA,IAAMH,cAAAA,GAAwB;AAAA,EAC1B,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,iBAAA,EAAoB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACzE,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,IAAI,CAAA,iBAAA,EAAoB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACtE,IAAA,EAAM,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,KAAK,CAAA,iBAAA,EAAoB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE,CAAA;AAAA,EACvE,KAAA,EAAO,CAAC,GAAA,EAAK,IAAA,KAAS,OAAA,CAAQ,MAAM,CAAA,iBAAA,EAAoB,GAAG,CAAA,CAAA,EAAI,IAAA,IAAQ,EAAE;AAC7E,CAAA;AAeO,IAAM,iBAAN,MAAqB;AAAA,EAIxB,WAAA,CAAY,SAA0B,MAAA,EAAiB;AACnD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAS,MAAA,IAAUA,cAAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAA+B;AACjC,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,EAAY;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBAAyB,SAAA,EAAqC;AAChE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,wBAAA,CAAyB,SAAS,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,CACF,MAAA,EACA,SAAkC,EAAC,EACnC,YAAoB,GAAA,EACV;AACV,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAEhD,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAEhE,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAA,EAAU;AAAA,QACnC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACjB,EAAA,EAAI,GAAA;AAAA,UACJ,OAAA,EAAS,KAAA;AAAA,UACT,MAAA;AAAA,UACA;AAAA,SACH,CAAA;AAAA,QACD,QAAQ,UAAA,CAAW;AAAA,OACtB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAC7C;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAErC,MAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,MAAA,OAAO,IAAA;AAAA,IACX,SAAS,KAAA,EAAY;AACjB,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC7B,QAAA,MAAM,YAAA,GAAe,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,SAAS,CAAA,EAAA,CAAI,CAAA;AACvE,QAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,YAAY,CAAA;AACrC,QAAA,MAAM,YAAA;AAAA,MACV;AAEA,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAA,CACF,OAAA,EACA,SAAA,GAAoB,GAAA,EACmB;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAChD,IAAA,MAAM,MAAA,GAAS,SAAS,QAAQ,CAAA;AAChC,IAAA,MAAM,MAAM,CAAA,EAAG,MAAM,CAAA,yBAAA,EAA4B,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAE5E,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAEhE,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC9B,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB;AAAA,QACtC,QAAQ,UAAA,CAAW;AAAA,OACtB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAErC,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC1B,QAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,QAAA,OAAO,IAAA;AAAA,MACX;AAEA,MAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,YAAY,OAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AACpE,QAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MAChB;AAEA,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAChD,SAAS,KAAA,EAAY;AACjB,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACF,OAAA,EACA,SAAA,GAAoB,GAAA,EACL;AACf,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAChD,IAAA,MAAM,MAAA,GAAS,SAAS,QAAQ,CAAA;AAChC,IAAA,MAAM,MAAM,CAAA,EAAG,MAAM,CAAA,2BAAA,EAA8B,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAE9E,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAEhE,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC9B,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB;AAAA,QACtC,QAAQ,UAAA,CAAW;AAAA,OACtB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAErC,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,SAAS,QAAA,EAAU;AACtD,QAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,QAAA,OAAO,OAAO,IAAI,CAAA;AAAA,MACtB;AAEA,MAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,YAAY,KAAA,CAAA,EAAW;AAChE,QAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,QAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,MACtC;AAEA,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAChD,SAAS,KAAA,EAAY;AACjB,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACF,OAAA,EACA,SAAA,GAAoB,GAAA,EAMrB;AACC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAChD,IAAA,MAAM,MAAA,GAAS,SAAS,QAAQ,CAAA;AAChC,IAAA,MAAM,MAAM,CAAA,EAAG,MAAM,CAAA,+BAAA,EAAkC,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAElF,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAEhE,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC9B,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB;AAAA,QACtC,QAAQ,UAAA,CAAW;AAAA,OACtB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAErC,MAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAE3B,MAAA,OAAO;AAAA,QACH,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,SAAS,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,CAAC,CAAC,CAAA;AAAA,QACzC,iBAAA,EAAmB,KAAK,mBAAA,EAAqB,EAAA;AAAA,QAC7C,mBAAA,EAAqB,KAAK,mBAAA,EAAqB;AAAA,OACnD;AAAA,IACJ,SAAS,KAAA,EAAY;AACjB,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACF,OAAA,EACA,MAAA,EACA,QAAmB,EAAC,EACpB,YAAoB,IAAA,EAC4B;AAChD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAChD,IAAA,MAAM,MAAA,GAAS,SAAS,QAAQ,CAAA;AAChC,IAAA,MAAM,GAAA,GAAM,GAAG,MAAM,CAAA,aAAA,CAAA;AAErB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAEhE,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC9B,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACL,cAAA,EAAgB,kBAAA;AAAA,UAChB,MAAA,EAAQ;AAAA,SACZ;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACjB,OAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACH,CAAA;AAAA,QACD,QAAQ,UAAA,CAAW;AAAA,OACtB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAErC,MAAA,IAAI,IAAA,CAAK,cAAc,KAAA,CAAA,EAAW;AAC9B,QAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,MACnD;AAEA,MAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,MAAA,OAAO;AAAA,QACH,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS;AAAC,OAC1B;AAAA,IACJ,SAAS,KAAA,EAAY;AACjB,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACF,SAAA,GAAoB,GAAA,EAIrB;AACC,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,QAGrB,oBAAA,EAAsB,IAAI,SAAS,CAAA;AAEtC,IAAA,OAAO;AAAA,MACH,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,KAAA,IAAS,CAAA;AAAA,MAC3B,aAAA,EAAe,KAAK,eAAA,IAAmB;AAAA,KAC3C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAA,GAA8B;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAAgF;AAC5E,IAAA,OAAO,IAAA,CAAK,QAAQ,qBAAA,EAAsB;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAA,GAAmD;AAC/C,IAAA,OAAO,IAAA,CAAK,QAAQ,wBAAA,EAAyB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAoD;AACtD,IAAA,OAAO,IAAA,CAAK,QAAQ,gBAAA,EAAiB;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAe,IAAA,EAAoB;AACvC,IAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,QAAQ,IAAA,EAAM;AAClD,MAAA,MAAM,IAAA,GAAO,IAAA;AACb,MAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACV,QAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,uBAAuB,CAAA;AAAA,MACzD;AACA,MAAA,OAAO,KAAK,MAAA,IAAU,IAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,YAAY,IAAA,EAAM;AACtD,MAAA,OAAQ,IAAA,CAA6B,MAAA;AAAA,IACzC;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AASO,SAAS,oBAAA,CAAqB,SAA0B,MAAA,EAAiC;AAC5F,EAAA,OAAO,IAAI,cAAA,CAAe,OAAA,EAAS,MAAM,CAAA;AAC7C;AAKA,eAAsB,8BAAA,CAClB,OAAA,EACA,UAAA,EACA,MAAA,EACuB;AACvB,EAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB;AAAA,IAChC,UAAA;AAAA,IACA,OAAA,EAAS,SAAA;AAAA,IACT;AAAA,GACH,CAAA;AAED,EAAA,MAAM,OAAA,CAAQ,KAAK,OAAO,CAAA;AAC1B,EAAA,OAAO,IAAI,cAAA,CAAe,OAAA,EAAS,MAAM,CAAA;AAC7C","file":"index.cjs","sourcesContent":["/**\n * Unified Provider System - Type Definitions\n *\n * Core types for the TON RPC provider management system.\n * These types are used across all components of the provider system.\n */\n\n// ============================================================================\n// Network Types\n// ============================================================================\n\n/**\n * Supported TON networks\n */\nexport type Network = 'testnet' | 'mainnet';\n\n/**\n * API version types supported by TON providers\n * - v2: TON Center HTTP API v2 (JSON-RPC style) - most common\n * - v4: TON API v4 (ton-community/ton-api-v4) - different format\n */\nexport type ApiVersion = 'v2' | 'v3' | 'v4';\n\n// ============================================================================\n// Provider Configuration Types (from rpc.json)\n// ============================================================================\n\n/**\n * Provider type identifier\n */\nexport type ProviderType =\n | 'chainstack'\n | 'quicknode'\n | 'toncenter'\n | 'orbs'\n | 'onfinality'\n | 'ankr'\n | 'getblock'\n | 'tatum'\n | 'tonhub'\n | 'custom';\n\n/**\n * Provider endpoint configuration\n */\nexport interface ProviderEndpoints {\n /** API v2 endpoint URL (may contain {key} placeholder) */\n v2?: string;\n /** API v3 endpoint URL (may contain {key} placeholder) */\n v3?: string;\n /** API v4 endpoint URL */\n v4?: string;\n /** WebSocket endpoint URL */\n ws?: string;\n}\n\n/**\n * Single provider definition from rpc.json config\n */\nexport interface ProviderConfig {\n /** Human-readable provider name */\n name: string;\n /** Provider type for special handling */\n type: ProviderType;\n /** Network this provider serves */\n network: Network;\n /** Endpoint URLs */\n endpoints: ProviderEndpoints;\n /** Environment variable name for API key (replaces {key} in endpoints) */\n keyEnvVar?: string;\n /** Environment variable name for separate API key header */\n apiKeyEnvVar?: string;\n /** Requests per second limit */\n rps: number;\n /** Priority for selection (lower = higher priority) */\n priority: number;\n /** Whether this provider is enabled */\n enabled: boolean;\n /** Whether this provider requires dynamic endpoint discovery (e.g., Orbs) */\n isDynamic?: boolean;\n /** Whether this provider is compatible with browser environments (default: true) */\n browserCompatible?: boolean;\n /** Optional description or notes */\n description?: string;\n}\n\n/**\n * Default provider order per network\n */\nexport interface NetworkDefaults {\n testnet: string[];\n mainnet: string[];\n}\n\n/**\n * Complete rpc.json configuration file structure\n */\nexport interface RpcConfig {\n /** JSON Schema reference (optional) */\n $schema?: string;\n /** Config version */\n version: string;\n /** Provider definitions keyed by unique ID */\n providers: Record<string, ProviderConfig>;\n /** Default provider order per network */\n defaults: NetworkDefaults;\n}\n\n// ============================================================================\n// Runtime Provider Types\n// ============================================================================\n\n/**\n * Provider health status\n */\nexport type ProviderStatus = 'available' | 'degraded' | 'offline' | 'stale' | 'untested' | 'testing';\n\n/**\n * Resolved provider with actual endpoint URLs (env vars replaced)\n */\nexport interface ResolvedProvider {\n /** Unique provider ID */\n id: string;\n /** Human-readable name */\n name: string;\n /** Provider type */\n type: ProviderType;\n /** Network */\n network: Network;\n /** Resolved v2 endpoint URL (ready to use) */\n endpointV2: string;\n /** Resolved v3 endpoint URL (if available) */\n endpointV3?: string;\n /** Resolved v4 endpoint URL (if available) */\n endpointV4?: string;\n /** Resolved WebSocket URL (if available) */\n endpointWs?: string;\n /** API key (if separate from URL) */\n apiKey?: string;\n /** Requests per second limit */\n rps: number;\n /** Priority (lower = higher priority) */\n priority: number;\n /** Whether dynamic discovery is needed */\n isDynamic: boolean;\n /** Whether this provider is compatible with browser environments */\n browserCompatible: boolean;\n}\n\n/**\n * Provider health check result\n */\nexport interface ProviderHealthResult {\n /** Provider ID */\n id: string;\n /** Network */\n network: Network;\n /** Test success */\n success: boolean;\n /** Current status */\n status: ProviderStatus;\n /** Latency in milliseconds */\n latencyMs: number | null;\n /** Current masterchain seqno (block height) */\n seqno: number | null;\n /** Blocks behind the best provider (0 = up to date) */\n blocksBehind: number;\n /** Timestamp of last test */\n lastTested: Date | null;\n /** Cached endpoint URL */\n cachedEndpoint?: string;\n /** Error message if failed */\n error?: string;\n /** Whether this provider is compatible with browser environments */\n browserCompatible: boolean;\n}\n\n/**\n * Provider state for runtime tracking\n */\nexport interface ProviderState {\n /** Provider ID */\n id: string;\n /** Current health result */\n health: ProviderHealthResult;\n /** Current rate limit state */\n rateLimit: RateLimitState;\n}\n\n// ============================================================================\n// Rate Limiting Types\n// ============================================================================\n\n/**\n * Rate limit configuration\n */\nexport interface RateLimitConfig {\n /** Requests per second */\n rps: number;\n /** Burst size (max tokens) */\n burstSize: number;\n /** Minimum delay between requests in ms */\n minDelayMs: number;\n /** Backoff multiplier on 429 errors */\n backoffMultiplier: number;\n /** Maximum backoff delay in ms */\n maxBackoffMs: number;\n}\n\n/**\n * Rate limit state for a provider\n */\nexport interface RateLimitState {\n /** Available tokens */\n tokens: number;\n /** Last refill timestamp */\n lastRefill: number;\n /** Current backoff delay (0 = no backoff) */\n currentBackoff: number;\n /** Consecutive error count */\n consecutiveErrors: number;\n /** Whether a request is currently being processed */\n processing: boolean;\n /** Pending request resolvers */\n queueLength: number;\n}\n\n// ============================================================================\n// Manager Types\n// ============================================================================\n\n/**\n * Provider manager configuration options\n */\nexport interface ProviderManagerOptions {\n /** @deprecated Unused - config is loaded from provider_system/rpc.json */\n configPath?: string;\n /** Adapter type: 'node' for Node.js, 'browser' for browser */\n adapter?: 'node' | 'browser';\n /** Whether to auto-initialize on first use */\n autoInit?: boolean;\n /** Request timeout in ms (default: 10000) */\n requestTimeoutMs?: number;\n /** Health check interval in ms (0 = disabled) */\n healthCheckIntervalMs?: number;\n /** Maximum blocks behind before marking as stale */\n maxBlocksBehind?: number;\n /** Custom logger (default: console) */\n logger?: Logger;\n}\n\n/**\n * Logger interface for custom logging\n */\nexport interface Logger {\n debug: (message: string, data?: Record<string, unknown>) => void;\n info: (message: string, data?: Record<string, unknown>) => void;\n warn: (message: string, data?: Record<string, unknown>) => void;\n error: (message: string, data?: Record<string, unknown>) => void;\n}\n\n/**\n * Provider manager state\n */\nexport interface ProviderManagerState {\n /** Current network */\n network: Network | null;\n /** Whether initialized */\n initialized: boolean;\n /** Whether testing is in progress */\n isTesting: boolean;\n /** All provider states */\n providers: Map<string, ProviderState>;\n /** Best provider ID per network */\n bestProviderByNetwork: Map<Network, string>;\n /** Manually selected provider ID (null = auto) */\n selectedProviderId: string | null;\n /** Whether auto-selection is enabled */\n autoSelect: boolean;\n /** Custom endpoint override */\n customEndpoint: string | null;\n}\n\n/**\n * State change listener\n */\nexport type StateListener = (state: ProviderManagerState) => void;\n\n// ============================================================================\n// API Response Types\n// ============================================================================\n\n/**\n * TON API getMasterchainInfo response\n */\nexport interface MasterchainInfo {\n /** Current masterchain block seqno */\n last: {\n seqno: number;\n workchain: number;\n shard: string;\n root_hash: string;\n file_hash: string;\n };\n /** State root hash */\n state_root_hash: string;\n /** Init block */\n init: {\n workchain: number;\n seqno: number;\n root_hash: string;\n file_hash: string;\n };\n}\n\n/**\n * Generic TON API response wrapper\n */\nexport interface TonApiResponse<T = unknown> {\n ok: boolean;\n result?: T;\n error?: string;\n code?: number;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Timeout error class\n */\nexport class TimeoutError extends Error {\n constructor(\n public readonly operation: string,\n public readonly timeoutMs: number,\n message?: string\n ) {\n super(message || `Operation \"${operation}\" timed out after ${timeoutMs}ms`);\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Provider error class\n */\nexport class ProviderError extends Error {\n constructor(\n public readonly providerId: string,\n public readonly operation: string,\n message: string,\n public readonly cause?: Error\n ) {\n super(`[${providerId}] ${operation}: ${message}`);\n this.name = 'ProviderError';\n }\n}\n\n/**\n * Rate limit error class\n */\nexport class RateLimitError extends Error {\n constructor(\n public readonly providerId: string,\n public readonly retryAfterMs?: number\n ) {\n super(`Provider ${providerId} rate limited${retryAfterMs ? `, retry after ${retryAfterMs}ms` : ''}`);\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Configuration error class\n */\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n","/**\n * Unified Provider System - Configuration Schema\n *\n * Zod schema for validating rpc.json configuration files.\n * Provides type-safe parsing and detailed error messages.\n */\n\nimport { z } from 'zod';\nimport type { RpcConfig, ProviderConfig, Network, ProviderType, ApiVersion } from '../types';\n\n// ============================================================================\n// Base Schemas\n// ============================================================================\n\n/**\n * Network schema\n */\nexport const NetworkSchema = z.enum(['testnet', 'mainnet']);\n\n/**\n * Provider type schema\n */\nexport const ProviderTypeSchema = z.enum([\n 'chainstack',\n 'quicknode',\n 'toncenter',\n 'orbs',\n 'onfinality',\n 'ankr',\n 'getblock',\n 'tatum',\n 'tonhub',\n 'custom',\n]);\n\n/**\n * API version schema\n */\nexport const ApiVersionSchema = z.enum(['v2', 'v3', 'v4']);\n\n// ============================================================================\n// Provider Schemas\n// ============================================================================\n\n/**\n * Provider endpoints schema\n */\nexport const ProviderEndpointsSchema = z.object({\n v2: z.string().url().optional(),\n v3: z.string().url().optional(),\n v4: z.string().url().optional(),\n ws: z.string().url().optional(),\n}).refine(\n (data) => data.v2 || data.v3 || data.v4,\n { message: 'At least one endpoint (v2, v3, or v4) must be provided' }\n);\n\n/**\n * Single provider configuration schema\n */\nexport const ProviderConfigSchema = z.object({\n name: z.string().min(1, 'Provider name is required'),\n type: ProviderTypeSchema,\n network: NetworkSchema,\n endpoints: ProviderEndpointsSchema,\n keyEnvVar: z.string().optional(),\n apiKeyEnvVar: z.string().optional(),\n rps: z.number().int().positive().default(1),\n priority: z.number().int().nonnegative().default(10),\n enabled: z.boolean().default(true),\n isDynamic: z.boolean().optional().default(false),\n description: z.string().optional(),\n});\n\n/**\n * Network defaults schema\n */\nexport const NetworkDefaultsSchema = z.object({\n testnet: z.array(z.string()).default([]),\n mainnet: z.array(z.string()).default([]),\n});\n\n/**\n * Complete RPC configuration schema\n */\nexport const RpcConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.string().default('1.0'),\n providers: z.record(z.string(), ProviderConfigSchema),\n defaults: NetworkDefaultsSchema,\n}).refine(\n (data) => {\n // Validate that default provider IDs exist\n const providerIds = Object.keys(data.providers);\n const allDefaults = [...data.defaults.testnet, ...data.defaults.mainnet];\n const invalidIds = allDefaults.filter((id) => !providerIds.includes(id));\n return invalidIds.length === 0;\n },\n {\n message: 'Default provider IDs must reference existing providers',\n }\n);\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\n/**\n * Parse and validate RPC configuration\n * @param data - Raw configuration data\n * @returns Validated RpcConfig\n * @throws ConfigError on validation failure\n */\nexport function parseRpcConfig(data: unknown): RpcConfig {\n const result = RpcConfigSchema.safeParse(data);\n\n if (!result.success) {\n const errors = result.error.errors.map((e) => {\n const path = e.path.join('.');\n return ` - ${path}: ${e.message}`;\n }).join('\\n');\n throw new Error(`Invalid rpc.json configuration:\\n${errors}`);\n }\n\n return result.data as RpcConfig;\n}\n\n/**\n * Validate a single provider configuration\n * @param id - Provider ID\n * @param data - Provider configuration data\n * @returns Validated ProviderConfig\n */\nexport function parseProviderConfig(id: string, data: unknown): ProviderConfig {\n const result = ProviderConfigSchema.safeParse(data);\n\n if (!result.success) {\n const errors = result.error.errors.map((e) => {\n const path = e.path.join('.');\n return `${path}: ${e.message}`;\n }).join(', ');\n throw new Error(`Invalid provider \"${id}\": ${errors}`);\n }\n\n return result.data as ProviderConfig;\n}\n\n/**\n * Create a minimal valid RpcConfig for testing\n */\nexport function createEmptyConfig(): RpcConfig {\n return {\n version: '1.0',\n providers: {},\n defaults: {\n testnet: [],\n mainnet: [],\n },\n };\n}\n\n/**\n * Merge two RPC configurations (useful for defaults + user config)\n * @param base - Base configuration\n * @param override - Override configuration\n * @returns Merged configuration\n */\nexport function mergeConfigs(base: RpcConfig, override: Partial<RpcConfig>): RpcConfig {\n return {\n ...base,\n ...override,\n providers: {\n ...base.providers,\n ...(override.providers || {}),\n },\n defaults: {\n testnet: override.defaults?.testnet || base.defaults.testnet,\n mainnet: override.defaults?.mainnet || base.defaults.mainnet,\n },\n };\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard for Network\n */\nexport function isNetwork(value: unknown): value is Network {\n return value === 'testnet' || value === 'mainnet';\n}\n\n/**\n * Type guard for ProviderType\n */\nexport function isProviderType(value: unknown): value is ProviderType {\n const types: ProviderType[] = [\n 'chainstack', 'quicknode', 'toncenter', 'orbs',\n 'onfinality', 'ankr', 'getblock', 'tatum', 'tonhub', 'custom',\n ];\n return typeof value === 'string' && types.includes(value as ProviderType);\n}\n\n/**\n * Type guard for ApiVersion\n */\nexport function isApiVersion(value: unknown): value is ApiVersion {\n return value === 'v2' || value === 'v3' || value === 'v4';\n}\n","/**\n * Unified Provider System - Configuration Parser\n *\n * Loads provider definitions from provider_system/rpc.json.\n * Resolves API keys from environment variables (.env).\n * Supports both Node.js (file system) and browser (fetch/embedded) environments.\n */\n\nimport type {\n RpcConfig,\n ProviderConfig,\n ResolvedProvider,\n Network,\n} from '../types';\nimport { parseRpcConfig, createEmptyConfig } from './schema';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Path to the RPC configuration file relative to provider_system folder\n */\nconst RPC_CONFIG_FILENAME = 'rpc.json';\n\n// ============================================================================\n// Environment Resolution\n// ============================================================================\n\n/**\n * Get environment variable value.\n * Works in both Node.js and browser environments.\n */\nexport function getEnvVar(name: string): string | undefined {\n // Node.js environment\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n // Browser environment - check for global config\n if (typeof window !== 'undefined' && (window as any).__ENV__) {\n return (window as any).__ENV__[name];\n }\n return undefined;\n}\n\n/**\n * Resolve {key} placeholder in URL with environment variable value\n */\nexport function resolveKeyPlaceholder(url: string, keyEnvVar?: string): string {\n if (!keyEnvVar || !url.includes('{key}')) {\n return url;\n }\n\n const key = getEnvVar(keyEnvVar);\n if (!key) {\n // Return URL without replacement - will fail at runtime if key is required\n console.warn(`[ConfigParser] Environment variable ${keyEnvVar} not set for URL: ${url}`);\n return url;\n }\n\n return url.replace('{key}', key);\n}\n\n/**\n * Resolve all placeholders in endpoint URLs\n */\nexport function resolveEndpoints(\n endpoints: ProviderConfig['endpoints'],\n keyEnvVar?: string\n): { v2?: string; v3?: string; v4?: string; ws?: string } {\n return {\n v2: endpoints.v2 ? resolveKeyPlaceholder(endpoints.v2, keyEnvVar) : undefined,\n v3: endpoints.v3 ? resolveKeyPlaceholder(endpoints.v3, keyEnvVar) : undefined,\n v4: endpoints.v4 ? resolveKeyPlaceholder(endpoints.v4, keyEnvVar) : undefined,\n ws: endpoints.ws ? resolveKeyPlaceholder(endpoints.ws, keyEnvVar) : undefined,\n };\n}\n\n// ============================================================================\n// Provider Resolution\n// ============================================================================\n\n/**\n * Convert a ProviderConfig to a ResolvedProvider with actual URLs\n */\nexport function resolveProvider(id: string, config: ProviderConfig): ResolvedProvider | null {\n // Skip disabled providers\n if (!config.enabled) {\n return null;\n }\n\n // Resolve endpoint URLs\n const resolved = resolveEndpoints(config.endpoints, config.keyEnvVar);\n\n // Must have at least v2 endpoint for most operations\n if (!resolved.v2 && !resolved.v3 && !resolved.v4) {\n console.warn(`[ConfigParser] Provider ${id} has no valid endpoints after resolution`);\n return null;\n }\n\n // Get API key - check both apiKeyEnvVar and keyEnvVar\n // For OnFinality, the key is in keyEnvVar (used in URL), but we also need it in apiKey field\n let apiKey = config.apiKeyEnvVar ? getEnvVar(config.apiKeyEnvVar) : undefined;\n \n // If no apiKeyEnvVar but keyEnvVar exists and was used, extract from resolved endpoint\n if (!apiKey && config.keyEnvVar && config.type === 'onfinality') {\n // For OnFinality, the API key might be in the resolved URL query params\n // Try to get it from environment variable directly\n apiKey = getEnvVar(config.keyEnvVar);\n }\n\n return {\n id,\n name: config.name,\n type: config.type,\n network: config.network,\n endpointV2: resolved.v2 || resolved.v3 || '', // Fallback to v3 if v2 not available\n endpointV3: resolved.v3,\n endpointV4: resolved.v4,\n endpointWs: resolved.ws,\n apiKey,\n rps: config.rps,\n priority: config.priority,\n isDynamic: config.isDynamic || false,\n browserCompatible: config.browserCompatible !== undefined ? config.browserCompatible : true,\n };\n}\n\n/**\n * Resolve all providers from config\n */\nexport function resolveAllProviders(config: RpcConfig): ResolvedProvider[] {\n const resolved: ResolvedProvider[] = [];\n\n for (const [id, providerConfig] of Object.entries(config.providers)) {\n const provider = resolveProvider(id, providerConfig);\n if (provider) {\n resolved.push(provider);\n }\n }\n\n return resolved;\n}\n\n/**\n * Get providers for a specific network\n */\nexport function getProvidersForNetwork(\n config: RpcConfig,\n network: Network\n): ResolvedProvider[] {\n const all = resolveAllProviders(config);\n return all.filter((p) => p.network === network);\n}\n\n/**\n * Get providers in default order for a network\n */\nexport function getDefaultProvidersForNetwork(\n config: RpcConfig,\n network: Network\n): ResolvedProvider[] {\n const defaultOrder = config.defaults[network];\n const networkProviders = getProvidersForNetwork(config, network);\n\n // Sort by default order, then by priority\n const inOrder: ResolvedProvider[] = [];\n const remaining: ResolvedProvider[] = [];\n\n for (const provider of networkProviders) {\n const defaultIndex = defaultOrder.indexOf(provider.id);\n if (defaultIndex !== -1) {\n inOrder[defaultIndex] = provider;\n } else {\n remaining.push(provider);\n }\n }\n\n // Filter out empty slots and add remaining providers\n const orderedProviders = inOrder.filter(Boolean);\n remaining.sort((a, b) => a.priority - b.priority);\n\n return [...orderedProviders, ...remaining];\n}\n\n// ============================================================================\n// Configuration Loading\n// ============================================================================\n\n/**\n * Load RPC config from the built-in rpc.json file (Node.js)\n */\nexport async function loadBuiltinConfig(): Promise<RpcConfig> {\n // Dynamic import for Node.js modules\n const fs = await import('fs').then((m) => m.promises);\n const path = await import('path');\n const { fileURLToPath } = await import('url');\n\n // Get __dirname equivalent for ESM\n const getDirname = () => {\n try {\n // ESM: use import.meta.url\n if (import.meta.url) {\n return path.dirname(fileURLToPath(import.meta.url));\n }\n } catch {\n // Fallback for CommonJS (shouldn't happen in ESM)\n }\n return process.cwd();\n };\n const dirname = getDirname();\n\n // Find the rpc.json file - it's in the provider_system folder\n // Try multiple paths to handle different execution contexts\n const possiblePaths = [\n // When running from project root (e.g., ts-node scripts/...)\n path.resolve(process.cwd(), 'provider_system', RPC_CONFIG_FILENAME),\n // When running from provider_system folder\n path.resolve(process.cwd(), RPC_CONFIG_FILENAME),\n // Relative to this file (ESM style)\n path.resolve(dirname, '..', RPC_CONFIG_FILENAME),\n ];\n\n for (const configPath of possiblePaths) {\n try {\n const content = await fs.readFile(configPath, 'utf-8');\n const data = JSON.parse(content);\n return parseRpcConfig(data);\n } catch (error: any) {\n if (error.code !== 'ENOENT') {\n throw new Error(`Failed to load RPC config from ${configPath}: ${error.message}`);\n }\n // File not found, try next path\n }\n }\n\n // No config file found, use defaults\n console.warn(`[ConfigParser] Config file ${RPC_CONFIG_FILENAME} not found, using defaults`);\n return createDefaultConfig();\n}\n\n/**\n * Load RPC config from a URL (browser-compatible)\n */\nexport async function loadConfigFromUrl(url: string): Promise<RpcConfig> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n const data = await response.json();\n return parseRpcConfig(data);\n } catch (error: any) {\n throw new Error(`Failed to load RPC config from ${url}: ${error.message}`);\n }\n}\n\n/**\n * Load RPC config from raw JSON data\n */\nexport function loadConfigFromData(data: unknown): RpcConfig {\n return parseRpcConfig(data);\n}\n\n/**\n * Auto-detect and load config.\n * - Browser: checks for embedded __RPC_CONFIG__ or fetches from URL\n * - Node.js: loads from provider_system/rpc.json\n */\nexport async function loadConfig(): Promise<RpcConfig> {\n // Check for embedded config in browser\n if (typeof window !== 'undefined' && (window as any).__RPC_CONFIG__) {\n return parseRpcConfig((window as any).__RPC_CONFIG__);\n }\n\n // Node.js: load from built-in rpc.json\n if (typeof process !== 'undefined' && typeof process.cwd === 'function') {\n return loadBuiltinConfig();\n }\n\n // Fallback to default config\n console.warn('[ConfigParser] No config source available, using defaults');\n return createDefaultConfig();\n}\n\n// ============================================================================\n// Default Provider Configurations (fallback)\n// ============================================================================\n\n/**\n * Minimal default providers when rpc.json is not available.\n * These are free public endpoints that don't require API keys.\n */\nexport const DEFAULT_PROVIDERS: Record<string, ProviderConfig> = {\n toncenter_testnet: {\n name: 'TON Center Testnet',\n type: 'toncenter',\n network: 'testnet',\n endpoints: {\n v2: 'https://testnet.toncenter.com/api/v2',\n },\n rps: 1, // Without API key\n priority: 100,\n enabled: true,\n description: 'Official TON Center public endpoint',\n },\n orbs_testnet: {\n name: 'Orbs TON Access Testnet',\n type: 'orbs',\n network: 'testnet',\n endpoints: {\n v2: 'https://ton-testnet.orbs.network/api/v2',\n },\n rps: 10,\n priority: 50,\n enabled: true,\n isDynamic: true,\n description: 'Decentralized gateway - no API key needed',\n },\n toncenter_mainnet: {\n name: 'TON Center Mainnet',\n type: 'toncenter',\n network: 'mainnet',\n endpoints: {\n v2: 'https://toncenter.com/api/v2',\n },\n rps: 1, // Without API key\n priority: 100,\n enabled: true,\n description: 'Official TON Center public endpoint',\n },\n orbs_mainnet: {\n name: 'Orbs TON Access Mainnet',\n type: 'orbs',\n network: 'mainnet',\n endpoints: {\n v2: 'https://ton-mainnet.orbs.network/api/v2',\n },\n rps: 10,\n priority: 50,\n enabled: true,\n isDynamic: true,\n description: 'Decentralized gateway - no API key needed',\n },\n};\n\n/**\n * Create a default config with minimal providers (no API keys required)\n */\nexport function createDefaultConfig(): RpcConfig {\n return {\n version: '1.0',\n providers: { ...DEFAULT_PROVIDERS },\n defaults: {\n testnet: ['orbs_testnet', 'toncenter_testnet'],\n mainnet: ['orbs_mainnet', 'toncenter_mainnet'],\n },\n };\n}\n\n/**\n * Merge user config with defaults\n */\nexport function mergeWithDefaults(config: RpcConfig): RpcConfig {\n const defaults = createDefaultConfig();\n\n return {\n ...config,\n providers: {\n ...defaults.providers,\n ...config.providers,\n },\n defaults: {\n testnet: config.defaults.testnet.length > 0\n ? config.defaults.testnet\n : defaults.defaults.testnet,\n mainnet: config.defaults.mainnet.length > 0\n ? config.defaults.mainnet\n : defaults.defaults.mainnet,\n },\n };\n}\n","/**\n * Unified Provider System - Provider Registry\n *\n * Manages provider definitions, filtering, and lookup.\n * Acts as a central repository for all available providers.\n */\n\nimport type {\n RpcConfig,\n ResolvedProvider,\n Network,\n ProviderType,\n Logger,\n} from '../types';\nimport {\n loadConfig,\n resolveAllProviders,\n getProvidersForNetwork,\n getDefaultProvidersForNetwork,\n mergeWithDefaults,\n createDefaultConfig,\n} from '../config';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[ProviderRegistry] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[ProviderRegistry] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[ProviderRegistry] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[ProviderRegistry] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Provider Registry\n// ============================================================================\n\n/**\n * Provider Registry\n *\n * Manages all provider definitions and provides lookup/filtering capabilities.\n */\nexport class ProviderRegistry {\n private config: RpcConfig;\n private providers: Map<string, ResolvedProvider> = new Map();\n private logger: Logger;\n\n constructor(config?: RpcConfig, logger?: Logger) {\n this.config = config || createDefaultConfig();\n this.logger = logger || consoleLogger;\n this.loadProviders();\n }\n\n /**\n * Load and resolve all providers from config\n */\n private loadProviders(): void {\n this.providers.clear();\n\n const resolved = resolveAllProviders(this.config);\n for (const provider of resolved) {\n this.providers.set(provider.id, provider);\n }\n\n this.logger.info(`Loaded ${this.providers.size} providers`);\n }\n\n /**\n * Get a provider by ID\n */\n getProvider(id: string): ResolvedProvider | undefined {\n return this.providers.get(id);\n }\n\n /**\n * Get all providers\n */\n getAllProviders(): ResolvedProvider[] {\n return Array.from(this.providers.values());\n }\n\n /**\n * Get providers for a specific network\n */\n getProvidersForNetwork(network: Network): ResolvedProvider[] {\n return Array.from(this.providers.values()).filter(\n (p) => p.network === network\n );\n }\n\n /**\n * Get providers in default order for a network\n */\n getDefaultOrderForNetwork(network: Network): ResolvedProvider[] {\n return getDefaultProvidersForNetwork(this.config, network);\n }\n\n /**\n * Get providers by type\n */\n getProvidersByType(type: ProviderType): ResolvedProvider[] {\n return Array.from(this.providers.values()).filter(\n (p) => p.type === type\n );\n }\n\n /**\n * Get providers that have v2 API endpoints\n */\n getV2Providers(): ResolvedProvider[] {\n return Array.from(this.providers.values()).filter(\n (p) => p.endpointV2 && p.endpointV2.length > 0\n );\n }\n\n /**\n * Get v2 providers for a specific network\n */\n getV2ProvidersForNetwork(network: Network): ResolvedProvider[] {\n return this.getProvidersForNetwork(network).filter(\n (p) => p.endpointV2 && p.endpointV2.length > 0\n );\n }\n\n /**\n * Check if a provider exists\n */\n hasProvider(id: string): boolean {\n return this.providers.has(id);\n }\n\n /**\n * Get provider count\n */\n get size(): number {\n return this.providers.size;\n }\n\n /**\n * Get the underlying config\n */\n getConfig(): RpcConfig {\n return this.config;\n }\n\n /**\n * Update config and reload providers\n */\n updateConfig(config: RpcConfig): void {\n this.config = config;\n this.loadProviders();\n }\n\n /**\n * Add or update a provider at runtime\n */\n setProvider(id: string, provider: ResolvedProvider): void {\n this.providers.set(id, provider);\n this.logger.debug(`Provider ${id} added/updated`);\n }\n\n /**\n * Remove a provider\n */\n removeProvider(id: string): boolean {\n const removed = this.providers.delete(id);\n if (removed) {\n this.logger.debug(`Provider ${id} removed`);\n }\n return removed;\n }\n\n /**\n * Get provider IDs\n */\n getProviderIds(): string[] {\n return Array.from(this.providers.keys());\n }\n\n /**\n * Get network default provider IDs\n */\n getDefaultProviderIds(network: Network): string[] {\n return this.config.defaults[network];\n }\n\n /**\n * Find provider by endpoint URL (useful for error reporting)\n */\n findProviderByEndpoint(endpoint: string): ResolvedProvider | undefined {\n const normalizedEndpoint = endpoint.toLowerCase().replace(/\\/jsonrpc$/i, '');\n\n for (const provider of this.providers.values()) {\n const v2Normalized = provider.endpointV2?.toLowerCase().replace(/\\/jsonrpc$/i, '');\n const v3Normalized = provider.endpointV3?.toLowerCase().replace(/\\/jsonrpc$/i, '');\n\n if (v2Normalized && normalizedEndpoint.includes(v2Normalized.split('/api/')[0])) {\n return provider;\n }\n if (v3Normalized && normalizedEndpoint.includes(v3Normalized.split('/api/')[0])) {\n return provider;\n }\n }\n\n return undefined;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a registry by loading from provider_system/rpc.json\n */\nexport async function createRegistry(logger?: Logger): Promise<ProviderRegistry> {\n const config = await loadConfig();\n const mergedConfig = mergeWithDefaults(config);\n return new ProviderRegistry(mergedConfig, logger);\n}\n\n/**\n * @deprecated Use createRegistry() instead\n */\nexport async function createRegistryFromFile(\n _filePath?: string,\n logger?: Logger\n): Promise<ProviderRegistry> {\n return createRegistry(logger);\n}\n\n/**\n * Create a registry with default providers only\n */\nexport function createDefaultRegistry(logger?: Logger): ProviderRegistry {\n const config = createDefaultConfig();\n return new ProviderRegistry(config, logger);\n}\n\n/**\n * Create a registry from raw config data\n */\nexport function createRegistryFromData(\n data: RpcConfig,\n logger?: Logger\n): ProviderRegistry {\n const mergedConfig = mergeWithDefaults(data);\n return new ProviderRegistry(mergedConfig, logger);\n}\n","/**\n * Unified Provider System - Endpoint Utilities\n *\n * URL normalization and manipulation for TON RPC endpoints.\n */\n\n// ============================================================================\n// URL Normalization\n// ============================================================================\n\n/**\n * Normalize endpoint URL for TonClient v2 API.\n * Ensures the endpoint has /jsonRPC suffix for JSON-RPC POST requests.\n *\n * Different providers have different endpoint formats:\n * - toncenter.com: POST to /api/v2/jsonRPC\n * - Chainstack: POST to /api/v2/jsonRPC (needs /jsonRPC suffix!)\n * - TON Access (orbs): Already returns correct JSON-RPC endpoint\n * - QuickNode: Needs /jsonRPC appended to base URL\n * - GetBlock: Needs /jsonRPC appended to base URL\n * - Tatum: Gateway URLs need /jsonRPC appended (gateway.tatum.io/jsonRPC)\n * - OnFinality: Uses /public or /rpc path with query params - preserve query params\n */\nexport function normalizeV2Endpoint(endpoint: string): string {\n let normalized = endpoint.trim();\n\n // Remove trailing slash\n if (normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n\n // Already has /jsonRPC suffix (case-insensitive check)\n if (normalized.toLowerCase().endsWith('/jsonrpc')) {\n return normalized;\n }\n\n // Tatum gateway URLs - need /jsonRPC appended\n // Format: https://ton-testnet.gateway.tatum.io -> https://ton-testnet.gateway.tatum.io/jsonRPC\n if (normalized.includes('gateway.tatum.io')) {\n try {\n const url = new URL(normalized);\n // If pathname is empty or just '/', append /jsonRPC\n if (!url.pathname || url.pathname === '/') {\n return normalized + '/jsonRPC';\n }\n // If pathname doesn't end with /jsonRPC, append it\n if (!url.pathname.toLowerCase().endsWith('/jsonrpc')) {\n return normalized + '/jsonRPC';\n }\n } catch {\n // Not a valid URL, try simple append\n return normalized + '/jsonRPC';\n }\n }\n\n // OnFinality URLs - use /public for public access, /rpc for API key access\n // Format: https://ton-testnet.api.onfinality.io/public or /rpc\n // Note: API key should be passed in 'apikey' header, not query params\n if (normalized.includes('onfinality.io')) {\n try {\n const url = new URL(normalized);\n // Remove query params (API key goes in header, not URL)\n const baseUrl = normalized.split('?')[0];\n \n // If pathname is empty or just '/', determine correct path\n if (!url.pathname || url.pathname === '/') {\n // Check if API key exists in query (for backward compatibility)\n // But we'll use /rpc if key exists, /public if not\n const apikey = url.searchParams.get('apikey');\n if (apikey && apikey !== '{key}' && apikey.length > 0) {\n // API key is set, use /rpc (key will be in header)\n return baseUrl.replace(/\\/?$/, '/rpc');\n }\n // No API key or placeholder not resolved, use /public\n return baseUrl.replace(/\\/?$/, '/public');\n }\n // If pathname is /rpc or /public, use it (remove query params)\n if (url.pathname === '/rpc' || url.pathname === '/public') {\n return baseUrl;\n }\n // If pathname exists but is not /rpc or /public, preserve it\n return baseUrl;\n } catch {\n // Not a valid URL, check if it contains unresolved placeholder\n if (normalized.includes('{key}')) {\n // Key not resolved, use /public (remove query string)\n return normalized.split('?')[0].replace(/\\/?$/, '/public');\n }\n // Try to append /public as fallback\n if (!normalized.includes('/rpc') && !normalized.includes('/public')) {\n return normalized.split('?')[0] + '/public';\n }\n return normalized.split('?')[0];\n }\n }\n\n // Check if this is a v2 API endpoint that needs /jsonRPC suffix\n // Chainstack format: https://ton-testnet.core.chainstack.com/KEY/api/v2\n // Toncenter format: https://testnet.toncenter.com/api/v2\n if (normalized.endsWith('/api/v2')) {\n return normalized + '/jsonRPC';\n }\n\n // For v3 endpoints, convert to v2 base and add /jsonRPC\n if (normalized.endsWith('/api/v3')) {\n return normalized.replace('/api/v3', '/api/v2/jsonRPC');\n }\n\n // QuickNode and GetBlock: base URLs need /jsonRPC appended\n // QuickNode: https://{key}.ton-mainnet.quiknode.pro/ -> .../jsonRPC\n // GetBlock: https://go.getblock.io/{key}/ -> .../jsonRPC\n if (normalized.includes('quiknode.pro') || normalized.includes('getblock.io')) {\n try {\n const url = new URL(normalized);\n if (!url.pathname || url.pathname === '/') {\n return normalized + '/jsonRPC';\n }\n // If pathname exists but doesn't end with /jsonRPC, append it\n if (!url.pathname.toLowerCase().endsWith('/jsonrpc')) {\n return normalized + '/jsonRPC';\n }\n } catch {\n // Not a valid URL, try simple append\n return normalized + '/jsonRPC';\n }\n }\n\n // If it looks like a base URL without path, append /jsonRPC\n try {\n const url = new URL(normalized);\n if (!url.pathname || url.pathname === '/') {\n return normalized + '/jsonRPC';\n }\n } catch {\n // Not a valid URL, return as-is\n }\n\n return normalized;\n}\n\n/**\n * Convert any endpoint to v2 base URL (without /jsonRPC suffix).\n */\nexport function toV2Base(endpoint: string): string {\n let normalized = endpoint.trim();\n\n // Remove trailing slash\n if (normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n\n // Remove /jsonRPC suffix (case-insensitive)\n if (normalized.toLowerCase().endsWith('/jsonrpc')) {\n normalized = normalized.slice(0, -8);\n }\n\n // Convert v3 to v2\n normalized = normalized.replace(/\\/api\\/v3\\b/, '/api/v2');\n\n // Ensure ends with /api/v2\n if (!normalized.endsWith('/api/v2')) {\n // Check if it already has /api/v2 somewhere\n if (normalized.includes('/api/v2')) {\n // Remove everything after /api/v2\n const idx = normalized.indexOf('/api/v2');\n normalized = normalized.slice(0, idx + 7);\n }\n }\n\n return normalized;\n}\n\n/**\n * Convert any endpoint to v3 base URL.\n */\nexport function toV3Base(endpoint: string): string {\n const normalized = toV2Base(endpoint);\n return normalized.replace('/api/v2', '/api/v3');\n}\n\n/**\n * Extract the base URL (protocol + host) from an endpoint.\n */\nexport function getBaseUrl(endpoint: string): string {\n try {\n const url = new URL(endpoint);\n return `${url.protocol}//${url.host}`;\n } catch {\n return endpoint;\n }\n}\n\n/**\n * Check if an endpoint is a Chainstack URL.\n */\nexport function isChainstackUrl(url: string): boolean {\n try {\n const parsed = new URL(url.trim());\n return parsed.hostname.includes('chainstack.com');\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an endpoint is a QuickNode URL.\n */\nexport function isQuickNodeUrl(url: string): boolean {\n try {\n const parsed = new URL(url.trim());\n return parsed.hostname.includes('quiknode.pro');\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an endpoint is a TonCenter URL.\n */\nexport function isTonCenterUrl(url: string): boolean {\n try {\n const parsed = new URL(url.trim());\n return parsed.hostname.includes('toncenter.com');\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an endpoint is an Orbs URL.\n */\nexport function isOrbsUrl(url: string): boolean {\n try {\n const parsed = new URL(url.trim());\n return parsed.hostname.includes('orbs.network') || \n parsed.hostname.includes('ton-access');\n } catch {\n return false;\n }\n}\n\n// ============================================================================\n// URL Building\n// ============================================================================\n\n/**\n * Build a full endpoint URL for a specific API method (REST style).\n */\nexport function buildRestUrl(baseEndpoint: string, method: string): string {\n const base = toV2Base(baseEndpoint);\n return `${base}/${method}`;\n}\n\n/**\n * Build URL for getAddressState call.\n */\nexport function buildGetAddressStateUrl(baseEndpoint: string, address: string): string {\n const base = toV2Base(baseEndpoint);\n return `${base}/getAddressState?address=${encodeURIComponent(address)}`;\n}\n\n/**\n * Build URL for getAddressBalance call.\n */\nexport function buildGetAddressBalanceUrl(baseEndpoint: string, address: string): string {\n const base = toV2Base(baseEndpoint);\n return `${base}/getAddressBalance?address=${encodeURIComponent(address)}`;\n}\n\n/**\n * Build URL for getAddressInformation call.\n */\nexport function buildGetAddressInfoUrl(baseEndpoint: string, address: string): string {\n const base = toV2Base(baseEndpoint);\n return `${base}/getAddressInformation?address=${encodeURIComponent(address)}`;\n}\n\n// ============================================================================\n// Network Detection\n// ============================================================================\n\n/**\n * Detect network from endpoint URL.\n */\nexport function detectNetworkFromEndpoint(endpoint: string): 'testnet' | 'mainnet' | null {\n const lower = endpoint.toLowerCase();\n\n if (\n lower.includes('testnet') ||\n lower.includes('test') ||\n lower.includes('sandbox')\n ) {\n return 'testnet';\n }\n\n if (\n lower.includes('mainnet') ||\n lower.includes('main') ||\n // TonCenter mainnet doesn't have 'mainnet' in URL\n (lower.includes('toncenter.com') && !lower.includes('testnet'))\n ) {\n return 'mainnet';\n }\n\n return null;\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate that a string is a valid HTTP(S) URL.\n */\nexport function isValidHttpUrl(str: string): boolean {\n try {\n const url = new URL(str);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n\n/**\n * Validate that a string is a valid WebSocket URL.\n */\nexport function isValidWsUrl(str: string): boolean {\n try {\n const url = new URL(str);\n return url.protocol === 'ws:' || url.protocol === 'wss:';\n } catch {\n return false;\n }\n}\n","/**\n * Unified Provider System - Health Checker\n *\n * Tests provider connectivity, measures latency, and compares block heights.\n * Identifies stale, degraded, or offline providers.\n */\n\nimport type {\n ResolvedProvider,\n ProviderHealthResult,\n ProviderStatus,\n Network,\n MasterchainInfo,\n TonApiResponse,\n Logger,\n TimeoutError,\n} from '../types';\nimport { normalizeV2Endpoint } from '../utils/endpoint';\nimport type { RateLimiterManager } from './rateLimiter';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[HealthChecker] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[HealthChecker] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[HealthChecker] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[HealthChecker] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Health Check Configuration\n// ============================================================================\n\nexport interface HealthCheckConfig {\n /** Request timeout in milliseconds */\n timeoutMs: number;\n /** Maximum blocks behind before marking as stale */\n maxBlocksBehind: number;\n /** Latency threshold (ms) for degraded status */\n degradedLatencyMs: number;\n}\n\nconst DEFAULT_CONFIG: HealthCheckConfig = {\n timeoutMs: 10000,\n maxBlocksBehind: 10,\n degradedLatencyMs: 3000,\n};\n\n// ============================================================================\n// Health Checker Class\n// ============================================================================\n\n/**\n * Health Checker\n *\n * Tests provider health by calling getMasterchainInfo and measuring\n * latency and block height.\n */\nexport class HealthChecker {\n private config: HealthCheckConfig;\n private logger: Logger;\n private results: Map<string, ProviderHealthResult> = new Map();\n private highestSeqno: Map<Network, number> = new Map();\n private rateLimiter: RateLimiterManager | null = null;\n\n constructor(\n config?: Partial<HealthCheckConfig>,\n logger?: Logger,\n rateLimiter?: RateLimiterManager\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.logger = logger || consoleLogger;\n this.rateLimiter = rateLimiter || null;\n }\n\n /**\n * Set rate limiter (can be set after construction)\n */\n setRateLimiter(rateLimiter: RateLimiterManager | null): void {\n this.rateLimiter = rateLimiter;\n }\n\n /**\n * Test a single provider's health\n */\n async testProvider(provider: ResolvedProvider): Promise<ProviderHealthResult> {\n const startTime = performance.now();\n const key = this.getResultKey(provider.id, provider.network);\n\n // Mark as testing\n const testingResult: ProviderHealthResult = {\n id: provider.id,\n network: provider.network,\n success: false,\n status: 'testing',\n latencyMs: null,\n seqno: null,\n blocksBehind: 0,\n lastTested: null,\n browserCompatible: provider.browserCompatible,\n };\n this.results.set(key, testingResult);\n\n try {\n // Acquire rate limit token if rate limiter is available\n if (this.rateLimiter) {\n const acquired = await this.rateLimiter.acquire(provider.id, this.config.timeoutMs);\n if (!acquired) {\n throw new Error('Rate limit timeout - unable to acquire token for health check');\n }\n }\n\n // Get endpoint URL\n const endpoint = await this.getEndpoint(provider);\n if (!endpoint) {\n throw new Error('No valid endpoint available');\n }\n\n // Check for required API keys\n if (provider.type === 'tatum' && !provider.apiKey) {\n throw new Error('Tatum provider requires API key (set TATUM_API_KEY_TESTNET or TATUM_API_KEY_MAINNET)');\n }\n\n // Normalize endpoint for v2 API (provider-specific handling)\n let normalizedEndpoint = this.normalizeEndpointForProvider(provider, endpoint);\n \n // Debug logging for OnFinality\n if (provider.type === 'onfinality') {\n this.logger.debug(`OnFinality endpoint: ${endpoint} -> ${normalizedEndpoint}, API key: ${provider.apiKey ? 'set' : 'not set'}`);\n }\n\n // Call getMasterchainInfo with provider-specific handling\n // For OnFinality, if /rpc fails, it will automatically retry with /public\n let info: MasterchainInfo;\n try {\n info = await this.callGetMasterchainInfo(normalizedEndpoint, provider);\n } catch (error: any) {\n // If OnFinality /rpc fails with backend error and we have an API key, try /public\n if (\n provider.type === 'onfinality' &&\n normalizedEndpoint.includes('/rpc') &&\n provider.apiKey &&\n error.message?.includes('backend error')\n ) {\n this.logger.debug(`OnFinality /rpc failed, retrying with /public endpoint`);\n const publicEndpoint = normalizedEndpoint.replace('/rpc', '/public');\n info = await this.callGetMasterchainInfo(publicEndpoint, { ...provider, apiKey: undefined });\n } else {\n throw error;\n }\n }\n\n const endTime = performance.now();\n const latencyMs = Math.round(endTime - startTime);\n\n // Extract seqno - validate it's a valid block number\n const infoWithLast = info as { last?: { seqno?: number } };\n const seqno = infoWithLast.last?.seqno;\n \n // seqno must be a positive integer (blocks start from 1)\n // seqno=0 or undefined means invalid/malformed response\n if (!seqno || seqno <= 0 || !Number.isInteger(seqno)) {\n throw new Error('Invalid seqno in response (must be positive integer)');\n }\n\n // Update highest known seqno for this network\n const currentHighest = this.highestSeqno.get(provider.network) || 0;\n if (seqno > currentHighest) {\n this.highestSeqno.set(provider.network, seqno);\n }\n\n // Calculate blocks behind\n const blocksBehind = Math.max(0, (this.highestSeqno.get(provider.network) || seqno) - seqno);\n\n // Determine status\n let status: ProviderStatus = 'available';\n if (blocksBehind > this.config.maxBlocksBehind) {\n status = 'stale';\n } else if (latencyMs > this.config.degradedLatencyMs) {\n status = 'degraded';\n }\n\n const result: ProviderHealthResult = {\n id: provider.id,\n network: provider.network,\n success: true,\n status,\n latencyMs,\n seqno,\n blocksBehind,\n lastTested: new Date(),\n cachedEndpoint: normalizedEndpoint,\n browserCompatible: provider.browserCompatible,\n };\n\n this.results.set(key, result);\n this.logger.debug(\n `Provider ${provider.id} health check: ${status} (${latencyMs}ms, seqno=${seqno}, behind=${blocksBehind})`\n );\n\n return result;\n } catch (error: any) {\n const endTime = performance.now();\n const latencyMs = Math.round(endTime - startTime);\n\n const errorMsg = error.message || String(error) || 'Unknown error';\n\n // Detect CORS errors (browser compatibility issue)\n const isCorsError = this.isCorsError(error, errorMsg);\n\n // Detect specific HTTP status codes\n const is429 = errorMsg.includes('429') || errorMsg.toLowerCase().includes('rate limit');\n const is404 = errorMsg.includes('404') || errorMsg.toLowerCase().includes('not found');\n const is503 = errorMsg.includes('503') || errorMsg.toLowerCase().includes('service unavailable');\n const is502 = errorMsg.includes('502') || errorMsg.toLowerCase().includes('bad gateway');\n const isTimeout = error.name === 'AbortError' || errorMsg.includes('timeout');\n \n // Detect OnFinality backend errors\n const isOnFinalityBackendError = provider.type === 'onfinality' && \n (errorMsg.includes('Backend error') || errorMsg.includes('backend error'));\n\n // Determine status based on error type\n let status: ProviderStatus = 'offline';\n if (is429) {\n status = 'degraded';\n } else if (is404 || is503 || is502 || isOnFinalityBackendError) {\n status = 'offline'; // Service unavailable or backend errors\n } else if (isTimeout) {\n status = 'offline';\n }\n\n // Browser compatibility: if CORS error detected, mark as incompatible\n // Otherwise, use provider's configured browserCompatible flag\n const browserCompatible = isCorsError ? false : provider.browserCompatible;\n\n const result: ProviderHealthResult = {\n id: provider.id,\n network: provider.network,\n success: false,\n status,\n latencyMs: isTimeout ? null : latencyMs,\n seqno: null,\n blocksBehind: 0,\n lastTested: new Date(),\n error: errorMsg,\n browserCompatible,\n };\n\n this.results.set(key, result);\n this.logger.warn(`Provider ${provider.id} health check failed: ${result.error}`);\n\n return result;\n }\n }\n\n /**\n * Test multiple providers in parallel with staggered batches\n * \n * @param batchSize - Number of providers to test in parallel (default: 2)\n * @param batchDelayMs - Delay between batches in milliseconds (default: 500 to avoid rate limits)\n */\n async testProviders(\n providers: ResolvedProvider[],\n batchSize: number = 2,\n batchDelayMs: number = 500\n ): Promise<ProviderHealthResult[]> {\n const results: ProviderHealthResult[] = [];\n\n for (let i = 0; i < providers.length; i += batchSize) {\n const batch = providers.slice(i, i + batchSize);\n const batchResults = await Promise.all(\n batch.map((p) => this.testProvider(p))\n );\n results.push(...batchResults);\n\n // Add delay between batches (except for last batch)\n if (i + batchSize < providers.length && batchDelayMs > 0) {\n await this.sleep(batchDelayMs);\n }\n }\n\n return results;\n }\n\n /**\n * Get the last health result for a provider\n */\n getResult(providerId: string, network: Network): ProviderHealthResult | undefined {\n const key = this.getResultKey(providerId, network);\n return this.results.get(key);\n }\n\n /**\n * Get all results for a network\n */\n getResultsForNetwork(network: Network): ProviderHealthResult[] {\n const results: ProviderHealthResult[] = [];\n for (const [key, result] of this.results) {\n if (result.network === network) {\n results.push(result);\n }\n }\n return results;\n }\n\n /**\n * Get available providers for a network (status = available or degraded)\n */\n getAvailableProviders(network: Network): ProviderHealthResult[] {\n return this.getResultsForNetwork(network).filter(\n (r) => r.status === 'available' || r.status === 'degraded'\n );\n }\n\n /**\n * Get the best provider for a network (lowest latency among available)\n */\n getBestProvider(network: Network): ProviderHealthResult | undefined {\n const available = this.getAvailableProviders(network)\n .filter((r) => r.latencyMs !== null)\n .sort((a, b) => (a.latencyMs ?? Infinity) - (b.latencyMs ?? Infinity));\n\n return available[0];\n }\n\n /**\n * Get highest known seqno for a network\n */\n getHighestSeqno(network: Network): number {\n return this.highestSeqno.get(network) || 0;\n }\n\n /**\n * Clear all results\n */\n clearResults(): void {\n this.results.clear();\n this.highestSeqno.clear();\n }\n\n /**\n * Mark a provider as degraded (e.g., on 429 error)\n */\n markDegraded(providerId: string, network: Network, error?: string): void {\n const key = this.getResultKey(providerId, network);\n const existing = this.results.get(key);\n\n // Degraded providers are still functional (e.g., 429 rate limit)\n // They should have success: true so they can still be used, just with lower priority\n const result: ProviderHealthResult = existing ? {\n ...existing,\n success: true, // Degraded providers are still usable, just slower/rate-limited\n status: 'degraded',\n error: error || 'Marked as degraded',\n lastTested: new Date(),\n browserCompatible: existing.browserCompatible ?? true,\n } : {\n id: providerId,\n network,\n success: true, // Degraded providers are still usable\n status: 'degraded',\n latencyMs: null,\n seqno: null,\n blocksBehind: 0,\n lastTested: new Date(),\n error: error || 'Marked as degraded',\n browserCompatible: true, // Default to compatible if unknown\n };\n\n this.results.set(key, result);\n }\n\n /**\n * Mark a provider as offline\n */\n markOffline(providerId: string, network: Network, error?: string): void {\n const key = this.getResultKey(providerId, network);\n const existing = this.results.get(key);\n\n const result: ProviderHealthResult = existing ? {\n ...existing,\n status: 'offline',\n success: false, // Ensure success is false for offline providers\n error: error || 'Marked as offline',\n lastTested: new Date(),\n browserCompatible: existing.browserCompatible ?? true,\n } : {\n id: providerId,\n network,\n success: false,\n status: 'offline',\n latencyMs: null,\n seqno: null,\n blocksBehind: 0,\n lastTested: new Date(),\n error: error || 'Marked as offline',\n browserCompatible: true, // Default to compatible if unknown\n };\n\n this.results.set(key, result);\n }\n\n // ========================================================================\n // Private Methods\n // ========================================================================\n\n private getResultKey(providerId: string, network: Network): string {\n return `${providerId}-${network}`;\n }\n\n /**\n * Get endpoint URL for a provider (handles dynamic providers like Orbs)\n */\n private async getEndpoint(provider: ResolvedProvider): Promise<string | null> {\n // For dynamic providers (Orbs), use ton-access discovery\n if (provider.isDynamic && provider.type === 'orbs') {\n try {\n const { getHttpEndpoint } = await import('@orbs-network/ton-access');\n const endpoint = await getHttpEndpoint({ network: provider.network });\n return endpoint;\n } catch (error: any) {\n this.logger.warn(`Failed to get Orbs endpoint: ${error.message}`);\n return null;\n }\n }\n\n // Use static endpoint\n return provider.endpointV2 || provider.endpointV3 || null;\n }\n\n /**\n * Normalize endpoint for provider-specific requirements\n * \n * Note: normalizeV2Endpoint now handles all provider-specific cases correctly,\n * including Tatum (/jsonRPC), OnFinality (/public or /rpc), QuickNode, and GetBlock.\n */\n private normalizeEndpointForProvider(provider: ResolvedProvider, endpoint: string): string {\n // Handle legacy Tatum API format conversion (if needed)\n if (provider.type === 'tatum' && endpoint.includes('api.tatum.io/v3/blockchain/node')) {\n const network = provider.network === 'testnet' ? 'testnet' : 'mainnet';\n endpoint = `https://ton-${network}.gateway.tatum.io`;\n }\n \n // Use the unified normalization function which handles all providers correctly\n return normalizeV2Endpoint(endpoint);\n }\n\n /**\n * Call getMasterchainInfo API with provider-specific handling\n */\n private async callGetMasterchainInfo(\n endpoint: string,\n provider: ResolvedProvider\n ): Promise<MasterchainInfo> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeoutMs);\n\n // Build headers with provider-specific API key handling\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Tatum requires API key in x-api-key header\n if (provider.type === 'tatum' && provider.apiKey) {\n headers['x-api-key'] = provider.apiKey;\n }\n\n // OnFinality supports API key in header (preferred) or query params\n // Use header method to avoid query string issues\n if (provider.type === 'onfinality' && provider.apiKey) {\n headers['apikey'] = provider.apiKey;\n }\n\n // Other providers (TonCenter, Chainstack) use apiKey in TonClient, not in health check\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n id: '1',\n jsonrpc: '2.0',\n method: 'getMasterchainInfo',\n params: {},\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Check content type before parsing\n const contentType = response.headers.get('content-type') || '';\n let text: string | null = null;\n let data: unknown;\n\n // Read response as text first to check for errors\n if (!contentType.includes('application/json')) {\n text = await response.text();\n \n // For non-JSON responses, throw error (fallback will be handled at higher level)\n this.logger.debug(`${provider.type} non-JSON response (${contentType}): ${text.substring(0, 200)}`);\n \n // Special error message for OnFinality backend errors\n if (provider.type === 'onfinality' && text.includes('Backend error')) {\n throw new Error(`OnFinality backend error: ${text}`);\n }\n \n throw new Error(`Invalid response type: expected JSON, got ${contentType}. Response: ${text.substring(0, 100)}`);\n }\n\n // Parse JSON response\n if (!response.ok) {\n // Try to parse error response as JSON first\n try {\n data = await response.json();\n const errorObj = data as { error?: { message?: string; code?: number } | string };\n const errorMsg = typeof errorObj.error === 'string' \n ? errorObj.error \n : errorObj.error?.message || `HTTP ${response.status}`;\n throw new Error(errorMsg);\n } catch {\n throw new Error(`HTTP ${response.status}`);\n }\n }\n\n data = await response.json();\n\n let info: MasterchainInfo;\n\n // Handle different response formats\n if (data && typeof data === 'object') {\n const dataObj = data as Record<string, unknown>;\n \n // Handle wrapped response { ok: true, result: ... } (GetBlock, some providers)\n if ('ok' in dataObj) {\n if (!dataObj.ok) {\n const error = (dataObj as { error?: string }).error;\n throw new Error(error || 'API returned ok=false');\n }\n const result = (dataObj as { result?: unknown }).result;\n info = (result || dataObj) as MasterchainInfo;\n }\n // Handle JSON-RPC response { result: ... } (standard JSON-RPC)\n else if ('result' in dataObj) {\n info = (dataObj as { result: unknown }).result as MasterchainInfo;\n }\n // Handle direct response (some providers return data directly)\n else if ('last' in dataObj || '@type' in dataObj) {\n info = dataObj as unknown as MasterchainInfo;\n }\n // Handle error response { error: ... }\n else if ('error' in dataObj) {\n const errorObj = dataObj.error as { message?: string; code?: string } | string;\n const errorMsg = typeof errorObj === 'string' \n ? errorObj \n : errorObj?.message || errorObj?.code || String(errorObj);\n throw new Error(`API error: ${errorMsg}`);\n }\n // Unknown format\n else {\n throw new Error(`Unknown response format from ${provider.type}`);\n }\n } else {\n throw new Error(`Invalid response type: ${typeof data}`);\n }\n\n // Validate response structure\n if (!info || typeof info !== 'object') {\n // Log the actual response for debugging\n this.logger.debug(`Invalid response structure from ${provider.type}: ${JSON.stringify(data)}`);\n throw new Error('Invalid response structure');\n }\n\n // Validate seqno exists and is valid (blocks start from 1)\n const infoObj = info as { last?: { seqno?: number } };\n const seqno = infoObj.last?.seqno;\n if (seqno === undefined || seqno === null || seqno <= 0 || !Number.isInteger(seqno)) {\n // Log the actual response for debugging\n this.logger.debug(`Invalid seqno from ${provider.type}:`, { seqno, info });\n throw new Error(`Invalid seqno: ${seqno} (must be positive integer)`);\n }\n\n return info;\n } catch (error: any) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Detect CORS errors (browser compatibility issues)\n * \n * CORS errors occur when:\n * - Request header field is not allowed by Access-Control-Allow-Headers\n * - Specifically, x-ton-client-version header is blocked by some providers\n * - Error message contains \"CORS\", \"Access-Control\", or \"x-ton-client-version\"\n */\n private isCorsError(error: any, errorMsg: string): boolean {\n const msg = errorMsg.toLowerCase();\n \n // Check for CORS-related error messages\n if (\n msg.includes('cors') ||\n msg.includes('access-control') ||\n msg.includes('x-ton-client-version') ||\n msg.includes('not allowed by access-control-allow-headers') ||\n msg.includes('blocked by cors policy')\n ) {\n return true;\n }\n\n // Check for network errors that might be CORS-related\n // (CORS errors often manifest as generic network errors in browsers)\n if (\n error.name === 'TypeError' &&\n (msg.includes('failed to fetch') || msg.includes('network error'))\n ) {\n // Additional check: if this is in a browser environment and the error\n // is a network error, it might be CORS (but we can't be 100% sure)\n // We'll be conservative and only mark as CORS if explicitly mentioned\n return false; // Don't assume network errors are CORS\n }\n\n return false;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a health checker with default configuration\n */\nexport function createHealthChecker(\n config?: Partial<HealthCheckConfig>,\n logger?: Logger,\n rateLimiter?: RateLimiterManager\n): HealthChecker {\n return new HealthChecker(config, logger, rateLimiter);\n}\n","/**\n * Unified Provider System - Timeout Utilities\n *\n * Promise timeout helpers for async operations.\n */\n\nimport { TimeoutError } from '../types';\n\n// ============================================================================\n// Default Timeouts\n// ============================================================================\n\n/** Default timeout for TON provider requests */\nexport const DEFAULT_PROVIDER_TIMEOUT_MS = 30000;\n\n/** Default timeout for contract calls */\nexport const DEFAULT_CONTRACT_TIMEOUT_MS = 45000;\n\n/** Default timeout for health checks */\nexport const DEFAULT_HEALTH_CHECK_TIMEOUT_MS = 10000;\n\n// ============================================================================\n// Timeout Functions\n// ============================================================================\n\n/**\n * Execute a promise with a timeout.\n *\n * @param promise - The promise to execute\n * @param timeoutMs - Timeout in milliseconds\n * @param operationName - Name of the operation (for error messages)\n * @returns The result of the promise\n * @throws TimeoutError if the operation times out\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n operationName: string\n): Promise<T> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new TimeoutError(operationName, timeoutMs));\n }, timeoutMs);\n\n // Clear timeout if promise resolves/rejects before timeout\n // This prevents memory leaks in Node.js\n promise.finally(() => clearTimeout(timeoutId));\n });\n\n return Promise.race([promise, timeoutPromise]);\n}\n\n/**\n * Execute a function with a timeout.\n *\n * @param fn - The async function to execute\n * @param timeoutMs - Timeout in milliseconds\n * @param operationName - Name of the operation (for error messages)\n * @returns The result of the function\n * @throws TimeoutError if the operation times out\n */\nexport async function withTimeoutFn<T>(\n fn: () => Promise<T>,\n timeoutMs: number,\n operationName: string\n): Promise<T> {\n return withTimeout(fn(), timeoutMs, operationName);\n}\n\n/**\n * Create an AbortController with automatic timeout.\n *\n * @param timeoutMs - Timeout in milliseconds\n * @returns AbortController that will abort after timeout\n */\nexport function createTimeoutController(timeoutMs: number): {\n controller: AbortController;\n clear: () => void;\n} {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n return {\n controller,\n clear: () => clearTimeout(timeoutId),\n };\n}\n\n/**\n * Execute a fetch request with timeout.\n *\n * @param url - The URL to fetch\n * @param options - Fetch options (excluding signal)\n * @param timeoutMs - Timeout in milliseconds\n * @returns Fetch response\n * @throws TimeoutError if the request times out\n */\nexport async function fetchWithTimeout(\n url: string,\n options: Omit<RequestInit, 'signal'>,\n timeoutMs: number\n): Promise<Response> {\n const { controller, clear } = createTimeoutController(timeoutMs);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } catch (error: any) {\n if (error.name === 'AbortError') {\n throw new TimeoutError(url, timeoutMs, `Fetch to ${url} timed out after ${timeoutMs}ms`);\n }\n throw error;\n } finally {\n clear();\n }\n}\n\n// ============================================================================\n// Retry Utilities\n// ============================================================================\n\n/**\n * Retry options for async operations.\n */\nexport interface RetryOptions {\n /** Maximum number of retry attempts */\n maxRetries: number;\n /** Base delay between retries in ms */\n baseDelayMs: number;\n /** Maximum delay between retries in ms */\n maxDelayMs: number;\n /** Backoff multiplier for exponential backoff */\n backoffMultiplier: number;\n /** Function to determine if error is retryable */\n isRetryable?: (error: Error) => boolean;\n}\n\nconst DEFAULT_RETRY_OPTIONS: RetryOptions = {\n maxRetries: 3,\n baseDelayMs: 1000,\n maxDelayMs: 10000,\n backoffMultiplier: 2,\n};\n\n/**\n * Execute a function with automatic retries on failure.\n *\n * @param fn - The async function to execute\n * @param options - Retry options\n * @returns The result of the function\n * @throws The last error if all retries fail\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options?: Partial<RetryOptions>\n): Promise<T> {\n const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error: any) {\n lastError = error;\n\n // Check if error is retryable\n if (opts.isRetryable && !opts.isRetryable(error)) {\n throw error;\n }\n\n // Don't wait after last attempt\n if (attempt < opts.maxRetries) {\n const delay = Math.min(\n opts.baseDelayMs * Math.pow(opts.backoffMultiplier, attempt),\n opts.maxDelayMs\n );\n await sleep(delay);\n }\n }\n }\n\n throw lastError || new Error('Retry failed');\n}\n\n/**\n * Execute a function with both timeout and retry.\n *\n * @param fn - The async function to execute\n * @param timeoutMs - Timeout per attempt in milliseconds\n * @param operationName - Name of the operation\n * @param retryOptions - Retry options\n * @returns The result of the function\n */\nexport async function withTimeoutAndRetry<T>(\n fn: () => Promise<T>,\n timeoutMs: number,\n operationName: string,\n retryOptions?: Partial<RetryOptions>\n): Promise<T> {\n return withRetry(\n () => withTimeout(fn(), timeoutMs, operationName),\n {\n ...retryOptions,\n isRetryable: (error) => {\n // Timeout errors are retryable\n if (error instanceof TimeoutError) {\n return true;\n }\n // Custom retryable check\n if (retryOptions?.isRetryable) {\n return retryOptions.isRetryable(error);\n }\n // Default: retry on network errors\n const message = error.message?.toLowerCase() || '';\n return (\n message.includes('network') ||\n message.includes('fetch') ||\n message.includes('econnrefused') ||\n message.includes('etimedout')\n );\n },\n }\n );\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Sleep for a specified duration.\n *\n * @param ms - Duration in milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Check if an error is a timeout error.\n */\nexport function isTimeoutError(error: unknown): error is TimeoutError {\n return error instanceof TimeoutError;\n}\n\n/**\n * Check if an error appears to be a rate limit error.\n */\nexport function isRateLimitError(error: unknown): boolean {\n if (!error) return false;\n const message = (error as any).message?.toLowerCase() || '';\n const status = (error as any).status || (error as any).response?.status;\n return status === 429 || message.includes('rate limit') || message.includes('429');\n}\n","/**\n * Unified Provider System - Rate Limiter\n *\n * Token bucket rate limiter with per-provider tracking.\n * Implements request queuing, serialization, and exponential backoff.\n */\n\nimport type { RateLimitConfig, RateLimitState, Logger } from '../types';\nimport { RateLimitError } from '../types';\nimport { sleep } from '../utils/timeout';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[RateLimiter] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[RateLimiter] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[RateLimiter] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[RateLimiter] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Default Rate Limit Configurations\n// ============================================================================\n\n/**\n * Default rate limit config (conservative for public endpoints)\n */\nexport const DEFAULT_RATE_LIMIT: RateLimitConfig = {\n rps: 1,\n burstSize: 3,\n minDelayMs: 1000,\n backoffMultiplier: 2,\n maxBackoffMs: 30000,\n};\n\n/**\n * Chainstack free plan limits (25 RPS)\n */\nexport const CHAINSTACK_RATE_LIMIT: RateLimitConfig = {\n rps: 25,\n burstSize: 30,\n minDelayMs: 40,\n backoffMultiplier: 2,\n maxBackoffMs: 10000,\n};\n\n/**\n * QuickNode free plan limits (10 RPS)\n */\nexport const QUICKNODE_RATE_LIMIT: RateLimitConfig = {\n rps: 10,\n burstSize: 15,\n minDelayMs: 100,\n backoffMultiplier: 2,\n maxBackoffMs: 10000,\n};\n\n/**\n * Orbs TON Access (decentralized, no hard limit)\n */\nexport const ORBS_RATE_LIMIT: RateLimitConfig = {\n rps: 10,\n burstSize: 20,\n minDelayMs: 100,\n backoffMultiplier: 2,\n maxBackoffMs: 10000,\n};\n\n/**\n * Get rate limit config by provider type\n */\nexport function getRateLimitForType(type: string): RateLimitConfig {\n switch (type.toLowerCase()) {\n case 'chainstack':\n return CHAINSTACK_RATE_LIMIT;\n case 'quicknode':\n return QUICKNODE_RATE_LIMIT;\n case 'orbs':\n return ORBS_RATE_LIMIT;\n default:\n return DEFAULT_RATE_LIMIT;\n }\n}\n\n// ============================================================================\n// Token Bucket Rate Limiter\n// ============================================================================\n\n/**\n * Token Bucket Rate Limiter\n *\n * Implements a token bucket algorithm with:\n * - Configurable RPS and burst size\n * - Request queuing (FIFO)\n * - Serialized request processing\n * - Exponential backoff on 429 errors\n */\nexport class TokenBucketRateLimiter {\n private config: RateLimitConfig;\n private tokens: number;\n private lastRefill: number;\n private currentBackoff: number = 0;\n private consecutiveErrors: number = 0;\n private requestQueue: Array<() => void> = [];\n private processing: boolean = false;\n private logger: Logger;\n\n constructor(config?: Partial<RateLimitConfig>, logger?: Logger) {\n this.config = { ...DEFAULT_RATE_LIMIT, ...config };\n this.tokens = this.config.burstSize;\n this.lastRefill = Date.now();\n this.logger = logger || consoleLogger;\n }\n\n /**\n * Get current state\n */\n getState(): RateLimitState {\n this.refill();\n return {\n tokens: this.tokens,\n lastRefill: this.lastRefill,\n currentBackoff: this.currentBackoff,\n consecutiveErrors: this.consecutiveErrors,\n processing: this.processing,\n queueLength: this.requestQueue.length,\n };\n }\n\n /**\n * Acquire a token (wait if necessary)\n *\n * @param timeoutMs - Maximum time to wait for a token (default: 60s)\n * @returns true if token acquired, false if timeout\n */\n async acquire(timeoutMs: number = 60000): Promise<boolean> {\n const startTime = Date.now();\n\n // If already processing, wait in queue\n if (this.processing) {\n const acquired = await new Promise<boolean>((resolve) => {\n const checkTimeout = () => {\n if (Date.now() - startTime > timeoutMs) {\n // Remove from queue and reject\n const idx = this.requestQueue.indexOf(resolveCallback);\n if (idx >= 0) {\n this.requestQueue.splice(idx, 1);\n }\n resolve(false);\n }\n };\n\n const resolveCallback = () => resolve(true);\n this.requestQueue.push(resolveCallback);\n\n // Set timeout to check periodically\n const timeoutInterval = setInterval(checkTimeout, 1000);\n const cleanup = () => clearInterval(timeoutInterval);\n\n // Cleanup when resolved\n Promise.resolve().then(() => {\n if (this.requestQueue.includes(resolveCallback)) {\n // Still in queue, wait for resolution\n } else {\n cleanup();\n }\n });\n });\n\n if (!acquired) {\n return false;\n }\n }\n\n // Mark as processing\n this.processing = true;\n\n try {\n // Refill tokens\n this.refill();\n\n // Apply backoff if active\n if (this.currentBackoff > 0) {\n this.logger.debug(`Applying backoff: ${this.currentBackoff}ms`);\n await sleep(this.currentBackoff);\n // After backoff, reset lastRefill to ensure proper delay calculation\n // This prevents getting tokens too quickly after backoff\n this.lastRefill = Date.now();\n // Clear backoff after applying it (it will be set again if we get another 429)\n this.currentBackoff = 0;\n }\n\n // Wait for token if none available\n while (this.tokens <= 0) {\n if (Date.now() - startTime > timeoutMs) {\n return false;\n }\n\n // Wait for minimum delay\n await sleep(Math.min(100, this.config.minDelayMs));\n this.refill();\n }\n\n // Consume token\n this.tokens--;\n\n // Apply minimum delay between requests (always enforce for rate limiting)\n // For very low RPS providers, we must always enforce the delay to prevent 429 errors\n // After backoff, we still need to ensure minDelayMs has passed since lastRefill\n const timeSinceLastRefill = Date.now() - this.lastRefill;\n if (timeSinceLastRefill < this.config.minDelayMs) {\n await sleep(this.config.minDelayMs - timeSinceLastRefill);\n }\n // Note: If timeSinceLastRefill >= minDelayMs, we've already waited long enough\n // due to the token refill mechanism, so no additional delay is needed\n // However, we still update lastRefill to track when this request was made\n\n // Update lastRefill AFTER the delay to ensure accurate timing for next request\n this.lastRefill = Date.now();\n return true;\n } finally {\n // Release lock and process next in queue\n this.processing = false;\n if (this.requestQueue.length > 0) {\n const next = this.requestQueue.shift()!;\n next();\n }\n }\n }\n\n /**\n * Release a token (call on request completion)\n */\n release(): void {\n // Token is automatically restored by refill()\n // This method can be used for custom logic if needed\n }\n\n /**\n * Report a successful request (resets backoff)\n */\n reportSuccess(): void {\n this.currentBackoff = 0;\n this.consecutiveErrors = 0;\n }\n\n /**\n * Report a rate limit error (applies backoff)\n */\n reportRateLimitError(): void {\n this.consecutiveErrors++;\n\n // Apply exponential backoff\n if (this.currentBackoff === 0) {\n this.currentBackoff = this.config.minDelayMs * this.config.backoffMultiplier;\n } else {\n this.currentBackoff = Math.min(\n this.currentBackoff * this.config.backoffMultiplier,\n this.config.maxBackoffMs\n );\n }\n\n // Reset tokens to 0 on rate limit error to prevent immediate retry\n // Reset lastRefill to now so that refill calculation is correct after backoff\n // This ensures we wait for backoff + proper token refill before next request\n this.tokens = 0;\n this.lastRefill = Date.now();\n\n this.logger.warn(`Rate limit hit, backoff: ${this.currentBackoff}ms, errors: ${this.consecutiveErrors}`);\n }\n\n /**\n * Report a general error\n */\n reportError(): void {\n this.consecutiveErrors++;\n\n // Less aggressive backoff for non-rate-limit errors\n if (this.consecutiveErrors >= 3) {\n this.currentBackoff = Math.min(\n this.config.minDelayMs * this.consecutiveErrors,\n this.config.maxBackoffMs / 2\n );\n }\n }\n\n /**\n * Reset rate limiter state\n */\n reset(): void {\n this.tokens = this.config.burstSize;\n this.lastRefill = Date.now();\n this.currentBackoff = 0;\n this.consecutiveErrors = 0;\n // Don't clear queue - let pending requests complete\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<RateLimitConfig>): void {\n this.config = { ...this.config, ...config };\n // Adjust burst size if needed\n if (this.tokens > this.config.burstSize) {\n this.tokens = this.config.burstSize;\n }\n }\n\n /**\n * Refill tokens based on time elapsed\n */\n private refill(): void {\n const now = Date.now();\n const elapsed = now - this.lastRefill;\n const tokensToAdd = Math.floor((elapsed / 1000) * this.config.rps);\n\n if (tokensToAdd > 0) {\n this.tokens = Math.min(this.config.burstSize, this.tokens + tokensToAdd);\n this.lastRefill = now;\n }\n }\n}\n\n// ============================================================================\n// Provider Rate Limiter Manager\n// ============================================================================\n\n/**\n * Provider Rate Limiter Manager\n *\n * Manages rate limiters for multiple providers.\n */\nexport class RateLimiterManager {\n private limiters: Map<string, TokenBucketRateLimiter> = new Map();\n private configs: Map<string, RateLimitConfig> = new Map();\n private logger: Logger;\n\n constructor(logger?: Logger) {\n this.logger = logger || consoleLogger;\n }\n\n /**\n * Get or create rate limiter for a provider\n */\n getLimiter(providerId: string, config?: Partial<RateLimitConfig>): TokenBucketRateLimiter {\n let limiter = this.limiters.get(providerId);\n\n if (!limiter) {\n const savedConfig = this.configs.get(providerId);\n limiter = new TokenBucketRateLimiter(\n { ...savedConfig, ...config },\n this.logger\n );\n this.limiters.set(providerId, limiter);\n }\n\n return limiter;\n }\n\n /**\n * Set rate limit config for a provider\n */\n setConfig(providerId: string, config: RateLimitConfig): void {\n this.configs.set(providerId, config);\n\n // Update existing limiter if present\n const limiter = this.limiters.get(providerId);\n if (limiter) {\n limiter.updateConfig(config);\n }\n }\n\n /**\n * Get rate limit state for a provider\n */\n getState(providerId: string): RateLimitState | null {\n const limiter = this.limiters.get(providerId);\n return limiter ? limiter.getState() : null;\n }\n\n /**\n * Acquire token for a provider\n */\n async acquire(providerId: string, timeoutMs?: number): Promise<boolean> {\n const limiter = this.getLimiter(providerId);\n return limiter.acquire(timeoutMs);\n }\n\n /**\n * Report success for a provider\n */\n reportSuccess(providerId: string): void {\n const limiter = this.limiters.get(providerId);\n if (limiter) {\n limiter.reportSuccess();\n }\n }\n\n /**\n * Report rate limit error for a provider\n */\n reportRateLimitError(providerId: string): void {\n const limiter = this.getLimiter(providerId);\n limiter.reportRateLimitError();\n }\n\n /**\n * Report general error for a provider\n */\n reportError(providerId: string): void {\n const limiter = this.getLimiter(providerId);\n limiter.reportError();\n }\n\n /**\n * Reset a provider's rate limiter\n */\n reset(providerId: string): void {\n const limiter = this.limiters.get(providerId);\n if (limiter) {\n limiter.reset();\n }\n }\n\n /**\n * Reset all rate limiters\n */\n resetAll(): void {\n for (const limiter of this.limiters.values()) {\n limiter.reset();\n }\n }\n\n /**\n * Remove a provider's rate limiter\n */\n remove(providerId: string): void {\n this.limiters.delete(providerId);\n this.configs.delete(providerId);\n }\n\n /**\n * Clear all limiters\n */\n clear(): void {\n this.limiters.clear();\n this.configs.clear();\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a rate limiter with RPS-based config\n */\nexport function createRateLimiter(rps: number, logger?: Logger): TokenBucketRateLimiter {\n return new TokenBucketRateLimiter(\n {\n rps,\n burstSize: Math.max(3, Math.ceil(rps * 1.5)),\n minDelayMs: Math.ceil(1000 / rps),\n backoffMultiplier: 2,\n maxBackoffMs: 30000,\n },\n logger\n );\n}\n\n/**\n * Create a rate limiter manager\n */\nexport function createRateLimiterManager(logger?: Logger): RateLimiterManager {\n return new RateLimiterManager(logger);\n}\n","/**\n * Unified Provider System - Provider Selector\n *\n * Selects the best available provider based on health, latency, and priority.\n * Supports auto-selection, manual override, and custom endpoint.\n */\n\nimport type {\n ResolvedProvider,\n ProviderHealthResult,\n ProviderStatus,\n Network,\n Logger,\n} from '../types';\nimport { ProviderRegistry } from './registry';\nimport { HealthChecker } from './healthChecker';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[ProviderSelector] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[ProviderSelector] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[ProviderSelector] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[ProviderSelector] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Selection Configuration\n// ============================================================================\n\nexport interface SelectionConfig {\n /** Prefer providers with latency below this threshold (ms) */\n preferredLatencyMs: number;\n /** Weight for latency in scoring (0-1) */\n latencyWeight: number;\n /** Weight for priority in scoring (0-1) */\n priorityWeight: number;\n /** Weight for block freshness in scoring (0-1) */\n freshnessWeight: number;\n /** Minimum acceptable provider status */\n minStatus: ProviderStatus[];\n}\n\nconst DEFAULT_CONFIG: SelectionConfig = {\n preferredLatencyMs: 1000,\n latencyWeight: 0.4,\n priorityWeight: 0.3,\n freshnessWeight: 0.3,\n minStatus: ['available', 'degraded'],\n};\n\n// ============================================================================\n// Provider Selector\n// ============================================================================\n\n/**\n * Provider Selector\n *\n * Selects the best provider based on multiple criteria:\n * - Health status (available > degraded > offline)\n * - Latency (lower is better)\n * - Priority (from config, lower is higher priority)\n * - Block freshness (fewer blocks behind is better)\n */\nexport class ProviderSelector {\n private registry: ProviderRegistry;\n private healthChecker: HealthChecker;\n private config: SelectionConfig;\n private logger: Logger;\n private adapter: 'node' | 'browser';\n\n // Selection state\n private selectedProviderId: string | null = null;\n private autoSelect: boolean = true;\n private customEndpoint: string | null = null;\n private bestProviderByNetwork: Map<Network, string> = new Map();\n // Track currently active provider per network (the one actually being used)\n private activeProviderByNetwork: Map<Network, string> = new Map();\n\n constructor(\n registry: ProviderRegistry,\n healthChecker: HealthChecker,\n config?: Partial<SelectionConfig>,\n logger?: Logger,\n adapter: 'node' | 'browser' = 'node'\n ) {\n this.registry = registry;\n this.healthChecker = healthChecker;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.logger = logger || consoleLogger;\n this.adapter = adapter;\n }\n\n // ========================================================================\n // Selection Methods\n // ========================================================================\n\n /**\n * Get the best provider for a network\n */\n getBestProvider(network: Network): ResolvedProvider | null {\n // Custom endpoint override\n if (this.customEndpoint) {\n return this.createCustomProvider(network);\n }\n\n // Manual selection\n if (!this.autoSelect && this.selectedProviderId) {\n const provider = this.registry.getProvider(this.selectedProviderId);\n if (provider && provider.network === network) {\n // Track active provider\n this.activeProviderByNetwork.set(network, provider.id);\n return provider;\n }\n this.logger.warn(\n `Selected provider ${this.selectedProviderId} not found or wrong network, using auto-select`\n );\n }\n\n // Auto-selection: use cached best or find new\n const cachedBestId = this.bestProviderByNetwork.get(network);\n if (cachedBestId) {\n const cached = this.registry.getProvider(cachedBestId);\n const health = this.healthChecker.getResult(cachedBestId, network);\n\n // Verify cached provider is still healthy\n // CRITICAL: Must check success: false first - never use failed providers\n if (\n cached &&\n health &&\n health.success !== false &&\n health.success !== undefined && // Explicitly check for undefined\n this.config.minStatus.includes(health.status)\n ) {\n // Update active provider tracking\n this.activeProviderByNetwork.set(network, cachedBestId);\n return cached;\n } else {\n // Cached provider is no longer healthy, clear cache\n this.bestProviderByNetwork.delete(network);\n this.activeProviderByNetwork.delete(network);\n }\n }\n\n // Find new best provider\n return this.findBestProvider(network);\n }\n\n /**\n * Find the best provider for a network (recalculates)\n */\n findBestProvider(network: Network): ResolvedProvider | null {\n let providers = this.registry.getProvidersForNetwork(network);\n \n // Filter browser-incompatible providers when running in browser\n if (this.adapter === 'browser') {\n const beforeCount = providers.length;\n providers = this.filterBrowserCompatible(providers, network);\n const filteredCount = beforeCount - providers.length;\n if (filteredCount > 0) {\n this.logger.debug(\n `Filtered out ${filteredCount} browser-incompatible provider(s) for ${network}`\n );\n }\n }\n \n if (providers.length === 0) {\n this.logger.warn(`No browser-compatible providers available for ${network}`);\n return null;\n }\n\n // Score each provider\n const scored = providers\n .map((provider) => ({\n provider,\n score: this.scoreProvider(provider, network),\n }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score);\n\n if (scored.length === 0) {\n // Fall back to default order if no healthy providers\n // Allow retrying failed providers after cooldown period\n const defaults = this.registry.getDefaultOrderForNetwork(network);\n for (const defaultProvider of defaults) {\n const health = this.healthChecker.getResult(defaultProvider.id, network);\n \n // Untested - safe to try\n if (!health || health.status === 'untested') {\n this.logger.warn(\n `No healthy providers for ${network}, using untested default: ${defaultProvider.id}`\n );\n this.activeProviderByNetwork.set(network, defaultProvider.id);\n return defaultProvider;\n }\n \n // Explicitly succeeded - safe to use\n if (health.success === true) {\n this.logger.warn(\n `No healthy providers for ${network}, using default: ${defaultProvider.id}`\n );\n this.activeProviderByNetwork.set(network, defaultProvider.id);\n return defaultProvider;\n }\n \n // Failed provider - check if cooldown expired\n if (health.success === false && health.lastTested) {\n const timeSinceFailure = Date.now() - health.lastTested.getTime();\n const cooldownMs = 30000; // 30 seconds cooldown\n \n if (timeSinceFailure > cooldownMs) {\n // Cooldown expired - allow retry\n this.logger.warn(\n `No healthy providers for ${network}, retrying failed default after cooldown: ${defaultProvider.id}`\n );\n this.activeProviderByNetwork.set(network, defaultProvider.id);\n return defaultProvider;\n }\n }\n // Still in cooldown - skip this provider\n }\n \n // If all defaults failed, try any untested provider or retry failed ones after cooldown\n for (const provider of providers) {\n const health = this.healthChecker.getResult(provider.id, network);\n \n // Untested providers\n if (!health || health.status === 'untested') {\n this.logger.warn(\n `No tested healthy providers for ${network}, using untested: ${provider.id}`\n );\n this.activeProviderByNetwork.set(network, provider.id);\n return provider;\n }\n \n // Failed provider - check if cooldown expired\n if (health.success === false && health.lastTested) {\n const timeSinceFailure = Date.now() - health.lastTested.getTime();\n const cooldownMs = 30000; // 30 seconds cooldown\n \n if (timeSinceFailure > cooldownMs) {\n // Cooldown expired - allow retry\n this.logger.warn(\n `No healthy providers for ${network}, retrying failed provider after cooldown: ${provider.id}`\n );\n this.activeProviderByNetwork.set(network, provider.id);\n return provider;\n }\n }\n }\n \n // Last resort: return null (caller should handle this)\n this.logger.error(`No available providers for ${network} (all tested and failed, cooldown active)`);\n return null;\n }\n\n const best = scored[0].provider;\n const bestHealth = this.healthChecker.getResult(best.id, network);\n \n // Only cache and log if provider has been tested and is healthy\n if (bestHealth && bestHealth.success === true) {\n this.bestProviderByNetwork.set(network, best.id);\n this.activeProviderByNetwork.set(network, best.id);\n this.logger.debug(\n `Best provider for ${network}: ${best.id} (score: ${scored[0].score.toFixed(2)})`\n );\n } else {\n // Don't cache untested providers, but still return them as fallback\n // Track active provider even if untested (so we know which one failed)\n this.activeProviderByNetwork.set(network, best.id);\n this.logger.debug(\n `Best provider for ${network}: ${best.id} (score: ${scored[0].score.toFixed(2)}, untested)`\n );\n }\n\n return best;\n }\n\n /**\n * Get all available providers for a network, sorted by score\n */\n getAvailableProviders(network: Network): ResolvedProvider[] {\n let providers = this.registry.getProvidersForNetwork(network);\n \n // Filter browser-incompatible providers when running in browser\n if (this.adapter === 'browser') {\n providers = this.filterBrowserCompatible(providers, network);\n }\n\n return providers\n .map((provider) => ({\n provider,\n score: this.scoreProvider(provider, network),\n }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score)\n .map((item) => item.provider);\n }\n\n /**\n * Get the next best provider (for failover)\n */\n getNextProvider(\n network: Network,\n excludeIds: string[]\n ): ResolvedProvider | null {\n let providers = this.registry.getProvidersForNetwork(network);\n \n // Filter browser-incompatible providers when running in browser\n if (this.adapter === 'browser') {\n providers = this.filterBrowserCompatible(providers, network);\n }\n\n const available = providers\n .filter((p) => !excludeIds.includes(p.id))\n .map((provider) => ({\n provider,\n score: this.scoreProvider(provider, network),\n }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score);\n\n if (available.length === 0) {\n return null;\n }\n\n return available[0].provider;\n }\n\n // ========================================================================\n // Scoring\n // ========================================================================\n\n /**\n * Calculate a score for a provider (higher is better)\n */\n private scoreProvider(provider: ResolvedProvider, network: Network): number {\n const health = this.healthChecker.getResult(provider.id, network);\n\n // No health data = untested = very low score (only used as last resort)\n // Prefer tested providers even if they're degraded over untested ones\n if (!health || health.status === 'untested') {\n return 0.01 * (1 / (provider.priority + 1));\n }\n\n // Providers that failed health check (success: false) - allow retry after cooldown\n // This allows providers to recover from temporary failures (503, network errors, etc.)\n if (health.success === false) {\n // If last tested was more than 30 seconds ago, allow retry with very low score\n // This gives providers a chance to recover from temporary failures\n if (health.lastTested) {\n const timeSinceFailure = Date.now() - health.lastTested.getTime();\n const cooldownMs = 30000; // 30 seconds cooldown\n \n if (timeSinceFailure > cooldownMs) {\n // Cooldown expired - allow retry with very low score\n // Lower priority = higher score multiplier (inverse relationship)\n return 0.001 * (1 / (provider.priority + 1));\n }\n }\n // Still in cooldown - don't use\n return 0;\n }\n\n // Offline providers (status: offline) - also allow retry after cooldown\n // Offline providers have success: false, so they're already handled above\n // But we check status here to be explicit\n if (health.status === 'offline') {\n // Already handled in the success: false check above, but if somehow\n // an offline provider has success: true, still don't use it\n return 0;\n }\n\n // Check minimum status\n if (!this.config.minStatus.includes(health.status)) {\n return 0;\n }\n\n // Calculate component scores (0-1)\n const statusScore = this.getStatusScore(health.status);\n const latencyScore = this.getLatencyScore(health.latencyMs);\n const priorityScore = this.getPriorityScore(provider.priority);\n const freshnessScore = this.getFreshnessScore(health.blocksBehind);\n\n // Weighted combination\n const score =\n statusScore * 0.2 + // Base status score\n latencyScore * this.config.latencyWeight +\n priorityScore * this.config.priorityWeight +\n freshnessScore * this.config.freshnessWeight;\n\n return score;\n }\n\n private getStatusScore(status: ProviderStatus): number {\n switch (status) {\n case 'available':\n return 1.0;\n case 'degraded':\n return 0.5;\n case 'stale':\n return 0.3;\n default:\n return 0;\n }\n }\n\n private getLatencyScore(latencyMs: number | null): number {\n if (latencyMs === null) {\n return 0.5; // Unknown latency gets middle score\n }\n\n // Score based on preferred latency (exponential decay)\n const ratio = latencyMs / this.config.preferredLatencyMs;\n return Math.max(0, 1 - Math.log(ratio + 1) / Math.log(11));\n }\n\n private getPriorityScore(priority: number): number {\n // Priority 0 = score 1, priority 100 = score 0\n return Math.max(0, 1 - priority / 100);\n }\n\n private getFreshnessScore(blocksBehind: number): number {\n // 0 blocks behind = score 1, 10+ blocks = score 0\n return Math.max(0, 1 - blocksBehind / 10);\n }\n\n // ========================================================================\n // Selection Control\n // ========================================================================\n\n /**\n * Set manual provider selection\n */\n setSelectedProvider(providerId: string | null): void {\n this.selectedProviderId = providerId;\n if (providerId !== null) {\n this.autoSelect = false;\n }\n this.logger.info(`Selected provider: ${providerId || '(auto)'}`);\n }\n\n /**\n * Get currently selected provider ID\n */\n getSelectedProviderId(): string | null {\n return this.selectedProviderId;\n }\n\n /**\n * Enable/disable auto-selection\n */\n setAutoSelect(enabled: boolean): void {\n this.autoSelect = enabled;\n if (enabled) {\n this.selectedProviderId = null;\n }\n this.logger.info(`Auto-select: ${enabled}`);\n }\n\n /**\n * Check if auto-selection is enabled\n */\n isAutoSelectEnabled(): boolean {\n return this.autoSelect;\n }\n\n /**\n * Set custom endpoint override\n */\n setCustomEndpoint(endpoint: string | null): void {\n this.customEndpoint = endpoint?.trim() || null;\n this.logger.info(`Custom endpoint: ${this.customEndpoint || '(none)'}`);\n }\n\n /**\n * Get custom endpoint\n */\n getCustomEndpoint(): string | null {\n return this.customEndpoint;\n }\n\n /**\n * Check if using custom endpoint\n */\n isUsingCustomEndpoint(): boolean {\n return this.customEndpoint !== null && this.customEndpoint.length > 0;\n }\n\n /**\n * Clear cached best providers (forces recalculation)\n * @param network - Optional network to clear cache for. If not provided, clears all networks.\n */\n clearCache(network?: Network): void {\n if (network) {\n this.bestProviderByNetwork.delete(network);\n this.activeProviderByNetwork.delete(network);\n } else {\n this.bestProviderByNetwork.clear();\n this.activeProviderByNetwork.clear();\n }\n }\n\n /**\n * Update best provider after health check\n */\n updateBestProvider(network: Network): void {\n this.findBestProvider(network);\n }\n\n /**\n * Handle provider failure (switch to next best)\n */\n handleProviderFailure(providerId: string, network: Network): ResolvedProvider | null {\n // Clear cached best if it was the failing provider\n if (this.bestProviderByNetwork.get(network) === providerId) {\n this.bestProviderByNetwork.delete(network);\n }\n \n // Clear active provider cache for this network to force re-selection\n this.activeProviderByNetwork.delete(network);\n\n // Find next best\n return this.getNextProvider(network, [providerId]);\n }\n \n /**\n * Get the currently active provider ID for a network\n * (the one that was last selected and is being used)\n */\n getActiveProviderId(network: Network): string | null {\n return this.activeProviderByNetwork.get(network) || null;\n }\n\n // ========================================================================\n // Info\n // ========================================================================\n\n /**\n * Get active provider info\n */\n getActiveProviderInfo(\n network: Network\n ): { id: string; name: string; isCustom: boolean } | null {\n if (this.customEndpoint) {\n return { id: 'custom', name: 'Custom Endpoint', isCustom: true };\n }\n\n const provider = this.getBestProvider(network);\n if (provider) {\n return { id: provider.id, name: provider.name, isCustom: false };\n }\n\n return null;\n }\n\n // ========================================================================\n // Private Helpers\n // ========================================================================\n\n /**\n * Create a pseudo-provider for custom endpoint\n */\n private createCustomProvider(network: Network): ResolvedProvider {\n return {\n id: 'custom',\n name: 'Custom Endpoint',\n type: 'custom',\n network,\n endpointV2: this.customEndpoint!,\n rps: 10,\n priority: 0,\n isDynamic: false,\n browserCompatible: true, // Custom endpoints are assumed compatible\n };\n }\n\n /**\n * Filter providers to only include browser-compatible ones\n * \n * Checks both:\n * 1. Provider config browserCompatible flag\n * 2. Health check result browserCompatible flag (if health check was performed)\n */\n private filterBrowserCompatible(\n providers: ResolvedProvider[],\n network: Network\n ): ResolvedProvider[] {\n return providers.filter((provider) => {\n // Check provider config flag\n if (!provider.browserCompatible) {\n this.logger.debug(\n `Provider ${provider.id} marked as browser-incompatible in config`\n );\n return false;\n }\n\n // Check health check result (if available)\n const health = this.healthChecker.getResult(provider.id, network);\n if (health && health.browserCompatible === false) {\n this.logger.debug(\n `Provider ${provider.id} marked as browser-incompatible by health check (CORS error detected)`\n );\n return false;\n }\n\n return true;\n });\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a provider selector\n */\nexport function createSelector(\n registry: ProviderRegistry,\n healthChecker: HealthChecker,\n config?: Partial<SelectionConfig>,\n logger?: Logger,\n adapter: 'node' | 'browser' = 'node'\n): ProviderSelector {\n return new ProviderSelector(registry, healthChecker, config, logger, adapter);\n}\n","/**\n * Unified Provider System - Provider Manager\n *\n * Main entry point for the provider system.\n * Coordinates registry, health checker, rate limiter, and selector.\n */\n\nimport type {\n Network,\n ResolvedProvider,\n ProviderHealthResult,\n ProviderManagerOptions,\n ProviderManagerState,\n ProviderState,\n RateLimitConfig,\n Logger,\n StateListener,\n} from '../types';\nimport { loadConfig, mergeWithDefaults, createDefaultConfig } from '../config';\nimport { ProviderRegistry, createRegistryFromFile } from './registry';\nimport { HealthChecker, createHealthChecker } from './healthChecker';\nimport { RateLimiterManager, createRateLimiterManager, getRateLimitForType } from './rateLimiter';\nimport { ProviderSelector, createSelector } from './selector';\nimport { normalizeV2Endpoint } from '../utils/endpoint';\nimport { isRateLimitError } from '../utils/timeout';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[ProviderManager] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[ProviderManager] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[ProviderManager] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[ProviderManager] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Default Options\n// ============================================================================\n\nconst DEFAULT_OPTIONS: Required<ProviderManagerOptions> = {\n configPath: '', // Unused - config is loaded from provider_system/rpc.json\n adapter: 'node',\n autoInit: true,\n requestTimeoutMs: 10000,\n healthCheckIntervalMs: 0, // Disabled by default\n maxBlocksBehind: 10,\n logger: consoleLogger,\n};\n\n// ============================================================================\n// Provider Manager\n// ============================================================================\n\n/**\n * Provider Manager\n *\n * Main entry point for the unified provider system.\n * Manages providers, health checks, rate limiting, and selection.\n *\n * Usage:\n * ```typescript\n * // Singleton pattern (Node.js)\n * const pm = ProviderManager.getInstance();\n * await pm.init('testnet');\n * const endpoint = await pm.getEndpoint();\n *\n * // Instance pattern (Browser/React)\n * const pm = new ProviderManager({ adapter: 'browser' });\n * await pm.init(network);\n * ```\n */\nexport class ProviderManager {\n // Singleton instance\n private static instance: ProviderManager | null = null;\n\n // Components\n private registry: ProviderRegistry | null = null;\n private healthChecker: HealthChecker | null = null;\n private rateLimiter: RateLimiterManager | null = null;\n private selector: ProviderSelector | null = null;\n\n // State\n private options: Required<ProviderManagerOptions>;\n private network: Network | null = null;\n private initialized: boolean = false;\n private isTesting: boolean = false;\n private healthCheckInterval: NodeJS.Timeout | null = null;\n private listeners: Set<StateListener> = new Set();\n\n constructor(options?: ProviderManagerOptions) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n // ========================================================================\n // Singleton Pattern\n // ========================================================================\n\n /**\n * Get singleton instance (recommended for Node.js)\n */\n static getInstance(options?: ProviderManagerOptions): ProviderManager {\n if (!ProviderManager.instance) {\n ProviderManager.instance = new ProviderManager(options);\n }\n return ProviderManager.instance;\n }\n\n /**\n * Reset singleton instance (for testing)\n */\n static resetInstance(): void {\n if (ProviderManager.instance) {\n ProviderManager.instance.destroy();\n ProviderManager.instance = null;\n }\n }\n\n // ========================================================================\n // Initialization\n // ========================================================================\n\n /**\n * Initialize the provider manager\n *\n * @param network - Network to initialize for\n * @param testProviders - Whether to test providers immediately (default: true)\n */\n async init(network: Network, testProviders: boolean = true): Promise<void> {\n if (this.initialized && this.network === network) {\n this.options.logger.debug('Already initialized for this network');\n return;\n }\n\n this.options.logger.info(`Initializing for ${network}...`);\n this.network = network;\n\n // Load configuration from provider_system/rpc.json\n const config = await loadConfig();\n const mergedConfig = mergeWithDefaults(config);\n\n // Create components\n this.registry = new ProviderRegistry(mergedConfig, this.options.logger);\n this.rateLimiter = createRateLimiterManager(this.options.logger);\n \n // Configure rate limiters for each provider BEFORE creating health checker\n for (const provider of this.registry.getAllProviders()) {\n const config = getRateLimitForType(provider.type);\n // Add buffer to minDelayMs to be more conservative and avoid hitting limits\n // For very low RPS (<=3), use 20% buffer; for others, use 10%\n const bufferMultiplier = provider.rps <= 3 ? 1.2 : 1.1;\n const minDelayMs = Math.ceil((1000 / provider.rps) * bufferMultiplier);\n // Calculate conservative burst size based on RPS:\n // - For very low RPS (<=3): burst size of 1 to be extremely conservative\n // - For low RPS (4-5): burst size of 2\n // - For higher RPS: use 1.5x RPS (standard token bucket pattern)\n let burstSize: number;\n if (provider.rps <= 3) {\n burstSize = 1; // Very conservative for low RPS providers like Tatum\n } else if (provider.rps <= 5) {\n burstSize = 2; // Conservative for low RPS\n } else {\n burstSize = Math.max(3, Math.ceil(provider.rps * 1.5)); // 150% for higher RPS\n }\n \n this.rateLimiter.setConfig(provider.id, {\n ...config,\n rps: provider.rps,\n minDelayMs,\n burstSize,\n });\n }\n \n // Create health checker with rate limiter\n this.healthChecker = createHealthChecker(\n {\n timeoutMs: this.options.requestTimeoutMs,\n maxBlocksBehind: this.options.maxBlocksBehind,\n },\n this.options.logger,\n this.rateLimiter\n );\n \n this.selector = createSelector(\n this.registry,\n this.healthChecker,\n undefined,\n this.options.logger,\n this.options.adapter\n );\n\n this.initialized = true;\n this.notifyListeners();\n\n // Test providers if requested\n if (testProviders) {\n await this.testAllProviders();\n }\n\n // Start health check interval if configured\n if (this.options.healthCheckIntervalMs > 0) {\n this.startHealthCheckInterval();\n }\n\n this.options.logger.info('Initialization complete');\n }\n\n /**\n * Check if manager is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Destroy the manager (cleanup)\n */\n destroy(): void {\n this.stopHealthCheckInterval();\n this.listeners.clear();\n this.registry = null;\n this.healthChecker = null;\n this.rateLimiter = null;\n this.selector = null;\n this.initialized = false;\n this.network = null;\n }\n\n // ========================================================================\n // Provider Testing\n // ========================================================================\n\n /**\n * Test all providers for current network\n */\n async testAllProviders(): Promise<ProviderHealthResult[]> {\n this.ensureInitialized();\n\n if (this.isTesting) {\n this.options.logger.debug('Already testing providers');\n return [];\n }\n\n this.isTesting = true;\n this.notifyListeners();\n\n this.options.logger.info(`Testing all providers for ${this.network}...`);\n\n try {\n const providers = this.registry!.getProvidersForNetwork(this.network!);\n const results = await this.healthChecker!.testProviders(providers);\n\n // Update selector with new best provider\n this.selector!.updateBestProvider(this.network!);\n\n const available = results.filter((r) => r.success);\n this.options.logger.info(\n `Provider testing complete: ${available.length}/${results.length} available`\n );\n\n return results;\n } finally {\n this.isTesting = false;\n this.notifyListeners();\n }\n }\n\n /**\n * Test a specific provider\n */\n async testProvider(providerId: string): Promise<ProviderHealthResult | null> {\n this.ensureInitialized();\n\n const provider = this.registry!.getProvider(providerId);\n if (!provider) {\n this.options.logger.warn(`Provider ${providerId} not found`);\n return null;\n }\n\n return this.healthChecker!.testProvider(provider);\n }\n\n /**\n * Check if testing is in progress\n */\n isTestingProviders(): boolean {\n return this.isTesting;\n }\n\n // ========================================================================\n // Endpoint Access\n // ========================================================================\n\n /**\n * Get endpoint URL for current network\n *\n * Handles: custom endpoint > manual selection > auto-selection > fallback\n */\n async getEndpoint(): Promise<string> {\n this.ensureInitialized();\n\n const provider = this.selector!.getBestProvider(this.network!);\n if (!provider) {\n // Fallback to public endpoint\n this.options.logger.warn('No providers available, using fallback');\n return this.getFallbackEndpoint();\n }\n \n // Track active provider for error reporting\n this.selector!.getActiveProviderId(this.network!) || this.selector!.getBestProvider(this.network!);\n\n // Handle dynamic providers (Orbs)\n if (provider.isDynamic && provider.type === 'orbs') {\n try {\n const { getHttpEndpoint } = await import('@orbs-network/ton-access');\n const endpoint = await getHttpEndpoint({ network: this.network! });\n return normalizeV2Endpoint(endpoint);\n } catch (error: any) {\n this.options.logger.warn(`Failed to get Orbs endpoint: ${error.message}`);\n // Fall through to static endpoint\n }\n }\n\n return normalizeV2Endpoint(provider.endpointV2);\n }\n\n /**\n * Get endpoint with rate limiting\n *\n * Waits for rate limit token before returning endpoint.\n * \n * @param forceRefresh - If true, clears cache and forces re-selection\n */\n async getEndpointWithRateLimit(timeoutMs?: number, forceRefresh: boolean = false): Promise<string> {\n this.ensureInitialized();\n\n // Clear cache if force refresh requested\n if (forceRefresh) {\n this.selector!.clearCache(this.network!);\n }\n\n const provider = this.selector!.getBestProvider(this.network!);\n if (!provider) {\n return this.getFallbackEndpoint();\n }\n\n // Acquire rate limit token\n const acquired = await this.rateLimiter!.acquire(provider.id, timeoutMs);\n if (!acquired) {\n this.options.logger.warn(`Rate limit timeout for ${provider.id}`);\n // Try next provider\n const next = this.selector!.getNextProvider(this.network!, [provider.id]);\n if (next) {\n return normalizeV2Endpoint(next.endpointV2);\n }\n return this.getFallbackEndpoint();\n }\n\n return normalizeV2Endpoint(provider.endpointV2);\n }\n\n /**\n * Get current active provider\n */\n getActiveProvider(): ResolvedProvider | null {\n if (!this.initialized || !this.network) {\n return null;\n }\n return this.selector!.getBestProvider(this.network);\n }\n\n /**\n * Get active provider info\n */\n getActiveProviderInfo(): { id: string; name: string; isCustom: boolean } | null {\n if (!this.initialized || !this.network) {\n return null;\n }\n return this.selector!.getActiveProviderInfo(this.network);\n }\n\n // ========================================================================\n // Error Reporting\n // ========================================================================\n\n /**\n * Report a successful request\n */\n reportSuccess(): void {\n if (!this.initialized || !this.network) return;\n\n const provider = this.selector!.getBestProvider(this.network);\n if (provider) {\n this.rateLimiter!.reportSuccess(provider.id);\n }\n }\n\n /**\n * Report an error (triggers provider switch if needed)\n */\n reportError(error: Error | string): void {\n if (!this.initialized || !this.network) return;\n\n // Get the ACTIVE provider (the one that just failed), not the \"best\" one\n // This ensures we mark the correct provider as failed\n const activeProviderId = this.selector!.getActiveProviderId(this.network);\n let provider: ResolvedProvider | null = null;\n \n if (activeProviderId) {\n provider = this.registry!.getProvider(activeProviderId) || null;\n }\n \n // Fallback to best provider if no active provider tracked\n if (!provider) {\n provider = this.selector!.getBestProvider(this.network);\n }\n \n if (!provider) return;\n\n const errorMsg = error instanceof Error ? error.message : String(error);\n const errorMsgLower = errorMsg.toLowerCase();\n\n // Detect error types to determine how to mark the provider\n const is429 = errorMsgLower.includes('429') || errorMsgLower.includes('rate limit');\n const is503 = errorMsgLower.includes('503') || errorMsgLower.includes('service unavailable');\n const is502 = errorMsgLower.includes('502') || errorMsgLower.includes('bad gateway');\n const is404 = errorMsgLower.includes('404') || errorMsgLower.includes('not found');\n const isTimeout = errorMsgLower.includes('timeout') || errorMsgLower.includes('abort');\n\n if (isRateLimitError(error) || is429) {\n this.rateLimiter!.reportRateLimitError(provider.id);\n this.healthChecker!.markDegraded(provider.id, this.network, errorMsg);\n } else if (is503 || is502 || is404 || isTimeout) {\n // Server errors, timeouts, and not found should mark provider as offline\n this.rateLimiter!.reportError(provider.id);\n this.healthChecker!.markOffline(provider.id, this.network, errorMsg);\n } else {\n // Other errors - mark as degraded\n this.rateLimiter!.reportError(provider.id);\n this.healthChecker!.markDegraded(provider.id, this.network, errorMsg);\n }\n\n // CRITICAL: Clear cache and switch to next provider immediately\n // This ensures the next getEndpoint() call gets a different provider\n this.selector!.clearCache(this.network);\n this.selector!.handleProviderFailure(provider.id, this.network);\n this.notifyListeners();\n }\n\n // ========================================================================\n // Selection Control\n // ========================================================================\n\n /**\n * Set manual provider selection\n */\n setSelectedProvider(providerId: string | null): void {\n this.ensureInitialized();\n this.selector!.setSelectedProvider(providerId);\n this.notifyListeners();\n }\n\n /**\n * Get selected provider ID\n */\n getSelectedProviderId(): string | null {\n if (!this.initialized) return null;\n return this.selector!.getSelectedProviderId();\n }\n\n /**\n * Set auto-select mode\n */\n setAutoSelect(enabled: boolean): void {\n this.ensureInitialized();\n this.selector!.setAutoSelect(enabled);\n this.notifyListeners();\n }\n\n /**\n * Check if auto-select is enabled\n */\n isAutoSelectEnabled(): boolean {\n if (!this.initialized) return true;\n return this.selector!.isAutoSelectEnabled();\n }\n\n /**\n * Set custom endpoint override\n */\n setCustomEndpoint(endpoint: string | null): void {\n this.ensureInitialized();\n this.selector!.setCustomEndpoint(endpoint);\n this.notifyListeners();\n }\n\n /**\n * Get custom endpoint\n */\n getCustomEndpoint(): string | null {\n if (!this.initialized) return null;\n return this.selector!.getCustomEndpoint();\n }\n\n /**\n * Check if using custom endpoint\n */\n isUsingCustomEndpoint(): boolean {\n if (!this.initialized) return false;\n return this.selector!.isUsingCustomEndpoint();\n }\n\n // ========================================================================\n // State Access\n // ========================================================================\n\n /**\n * Get current network\n */\n getNetwork(): Network | null {\n return this.network;\n }\n\n /**\n * Get all providers for current network\n */\n getProviders(): ResolvedProvider[] {\n if (!this.initialized || !this.network) return [];\n let providers = this.registry!.getProvidersForNetwork(this.network);\n \n // Filter browser-incompatible providers when running in browser\n if (this.options.adapter === 'browser') {\n providers = providers.filter((provider) => {\n // Check provider config flag\n if (!provider.browserCompatible) {\n return false;\n }\n \n // Check health check result (if available)\n const health = this.healthChecker!.getResult(provider.id, this.network!);\n if (health && health.browserCompatible === false) {\n return false;\n }\n \n return true;\n });\n }\n \n return providers;\n }\n\n /**\n * Get provider health results for current network\n */\n getProviderHealthResults(): ProviderHealthResult[] {\n if (!this.initialized || !this.network) return [];\n return this.healthChecker!.getResultsForNetwork(this.network);\n }\n\n /**\n * Get registry (for advanced usage)\n */\n getRegistry(): ProviderRegistry | null {\n return this.registry;\n }\n\n /**\n * Get health checker (for advanced usage)\n */\n getHealthChecker(): HealthChecker | null {\n return this.healthChecker;\n }\n\n /**\n * Get rate limiter manager (for advanced usage)\n */\n getRateLimiter(): RateLimiterManager | null {\n return this.rateLimiter;\n }\n\n /**\n * Get current state (for UI)\n */\n getState(): ProviderManagerState {\n const providers = new Map<string, ProviderState>();\n\n if (this.initialized && this.network && this.registry) {\n for (const provider of this.registry.getProvidersForNetwork(this.network)) {\n const health = this.healthChecker?.getResult(provider.id, this.network);\n const rateLimit = this.rateLimiter?.getState(provider.id);\n\n providers.set(provider.id, {\n id: provider.id,\n health: health || {\n id: provider.id,\n network: this.network,\n success: false,\n status: 'untested',\n latencyMs: null,\n seqno: null,\n blocksBehind: 0,\n lastTested: null,\n browserCompatible: provider.browserCompatible,\n },\n rateLimit: rateLimit || {\n tokens: 0,\n lastRefill: 0,\n currentBackoff: 0,\n consecutiveErrors: 0,\n processing: false,\n queueLength: 0,\n },\n });\n }\n }\n\n return {\n network: this.network,\n initialized: this.initialized,\n isTesting: this.isTesting,\n providers,\n bestProviderByNetwork: new Map(\n this.network && this.selector\n ? [[this.network, this.selector.getBestProvider(this.network)?.id || '']]\n : []\n ),\n selectedProviderId: this.selector?.getSelectedProviderId() || null,\n autoSelect: this.selector?.isAutoSelectEnabled() ?? true,\n customEndpoint: this.selector?.getCustomEndpoint() || null,\n };\n }\n\n // ========================================================================\n // State Listeners\n // ========================================================================\n\n /**\n * Subscribe to state changes\n */\n subscribe(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * Notify all listeners\n */\n private notifyListeners(): void {\n const state = this.getState();\n this.listeners.forEach((listener) => listener(state));\n }\n\n // ========================================================================\n // Private Helpers\n // ========================================================================\n\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error('ProviderManager not initialized. Call init() first.');\n }\n }\n\n private getFallbackEndpoint(): string {\n if (this.network === 'mainnet') {\n return 'https://toncenter.com/api/v2/jsonRPC';\n }\n return 'https://testnet.toncenter.com/api/v2/jsonRPC';\n }\n\n private startHealthCheckInterval(): void {\n this.stopHealthCheckInterval();\n\n this.healthCheckInterval = setInterval(() => {\n this.testAllProviders().catch((error) => {\n this.options.logger.error(`Health check interval failed: ${error.message}`);\n });\n }, this.options.healthCheckIntervalMs);\n\n this.options.logger.debug(\n `Started health check interval: ${this.options.healthCheckIntervalMs}ms`\n );\n }\n\n private stopHealthCheckInterval(): void {\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n this.healthCheckInterval = null;\n }\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a new ProviderManager instance\n */\nexport function createProviderManager(options?: ProviderManagerOptions): ProviderManager {\n return new ProviderManager(options);\n}\n\n/**\n * Get singleton ProviderManager instance\n */\nexport function getProviderManager(options?: ProviderManagerOptions): ProviderManager {\n return ProviderManager.getInstance(options);\n}\n","/**\n * Unified Provider System - Node.js Adapter\n *\n * Provides TonClient integration for Node.js environments.\n * Handles client caching and endpoint changes.\n */\n\nimport { TonClient } from '@ton/ton';\nimport { Address, Cell } from '@ton/core';\nimport type { Network, ResolvedProvider, Logger } from '../types';\nimport { ProviderManager } from '../core/manager';\nimport { normalizeV2Endpoint, toV2Base } from '../utils/endpoint';\nimport { withTimeout, fetchWithTimeout, sleep } from '../utils/timeout';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[NodeAdapter] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[NodeAdapter] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[NodeAdapter] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[NodeAdapter] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// TonClient Cache\n// ============================================================================\n\ninterface CachedClient {\n client: TonClient;\n endpoint: string;\n network: Network;\n createdAt: number;\n}\n\nlet cachedClient: CachedClient | null = null;\n\n// ============================================================================\n// Node Adapter\n// ============================================================================\n\n/**\n * Node.js Adapter for Provider System\n *\n * Provides TonClient and direct REST API access for Node.js environments.\n */\nexport class NodeAdapter {\n private manager: ProviderManager;\n private logger: Logger;\n\n constructor(manager: ProviderManager, logger?: Logger) {\n this.manager = manager;\n this.logger = logger || consoleLogger;\n }\n\n /**\n * Get TonClient instance\n *\n * Creates a new client if endpoint changed, otherwise returns cached.\n * \n * NOTE: Direct TonClient calls bypass rate limiting. For rate-limited operations,\n * use adapter methods (getAddressState, runGetMethod, etc.) or wrap your calls\n * with rate limit token acquisition.\n * \n * Example with rate limiting:\n * ```typescript\n * const endpoint = await adapter.manager.getEndpointWithRateLimit();\n * // Make your TonClient call\n * adapter.manager.reportSuccess(); // or reportError() on failure\n * ```\n */\n async getClient(): Promise<TonClient> {\n // Use getEndpoint() (not getEndpointWithRateLimit) to avoid blocking on client creation\n // Rate limiting should be applied per-operation, not per-client-creation\n const endpoint = await this.manager.getEndpoint();\n const network = this.manager.getNetwork();\n\n if (!network) {\n throw new Error('ProviderManager not initialized');\n }\n\n // Check if cached client is still valid\n if (\n cachedClient &&\n cachedClient.endpoint === endpoint &&\n cachedClient.network === network\n ) {\n return cachedClient.client;\n }\n\n // Create new client\n const provider = this.manager.getActiveProvider();\n const apiKey = provider?.apiKey;\n\n const client = new TonClient({\n endpoint,\n apiKey,\n });\n\n cachedClient = {\n client,\n endpoint,\n network,\n createdAt: Date.now(),\n };\n\n this.logger.debug(`Created TonClient for ${network}`, { endpoint });\n\n return client;\n }\n\n /**\n * Get TonClient with rate limiting applied\n * \n * Acquires a rate limit token before returning the client.\n * Use this when you need to ensure rate limiting is respected.\n * \n * Note: This only acquires ONE token. For multiple operations,\n * you should acquire tokens before each operation or use adapter methods.\n */\n async getClientWithRateLimit(timeoutMs?: number): Promise<TonClient> {\n // Acquire rate limit token before creating/returning client\n await this.manager.getEndpointWithRateLimit(timeoutMs);\n return this.getClient();\n }\n\n /**\n * Reset client cache (forces new client creation)\n */\n resetClient(): void {\n cachedClient = null;\n this.logger.debug('Client cache cleared');\n }\n\n /**\n * Get cached client info (for debugging)\n */\n getClientInfo(): { endpoint: string; network: Network; age: number } | null {\n if (!cachedClient) return null;\n return {\n endpoint: cachedClient.endpoint,\n network: cachedClient.network,\n age: Date.now() - cachedClient.createdAt,\n };\n }\n\n // ========================================================================\n // Direct REST API Methods\n // ========================================================================\n\n /**\n * Get address state via REST API\n */\n async getAddressState(\n address: Address | string,\n timeoutMs: number = 10000\n ): Promise<'uninit' | 'active' | 'frozen'> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const addrStr = typeof address === 'string' ? address : address.toString();\n const url = `${baseV2}/getAddressState?address=${encodeURIComponent(addrStr)}`;\n\n try {\n const response = await fetchWithTimeout(\n url,\n { headers: { accept: 'application/json' } },\n timeoutMs\n );\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (typeof data === 'string') {\n this.manager.reportSuccess();\n return data as 'uninit' | 'active' | 'frozen';\n }\n\n if (data && typeof data === 'object' && typeof data.state === 'string') {\n this.manager.reportSuccess();\n return data.state as 'uninit' | 'active' | 'frozen';\n }\n\n throw new Error('Unexpected response format');\n } catch (error: any) {\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Get address balance via REST API\n */\n async getAddressBalance(\n address: Address | string,\n timeoutMs: number = 10000\n ): Promise<bigint> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const addrStr = typeof address === 'string' ? address : address.toString();\n const url = `${baseV2}/getAddressBalance?address=${encodeURIComponent(addrStr)}`;\n\n try {\n const response = await fetchWithTimeout(\n url,\n { headers: { accept: 'application/json' } },\n timeoutMs\n );\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (typeof data === 'string' || typeof data === 'number') {\n this.manager.reportSuccess();\n return BigInt(data);\n }\n\n if (data && typeof data === 'object' && data.balance !== undefined) {\n this.manager.reportSuccess();\n return BigInt(String(data.balance));\n }\n\n throw new Error('Unexpected response format');\n } catch (error: any) {\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Run a get method via REST API\n */\n async runGetMethod(\n address: Address | string,\n method: string,\n stack: unknown[] = [],\n timeoutMs: number = 15000\n ): Promise<{ exit_code: number; stack: unknown[] }> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const addrStr = typeof address === 'string' ? address : address.toString();\n const url = `${baseV2}/runGetMethod`;\n\n try {\n const response = await fetchWithTimeout(\n url,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n accept: 'application/json',\n },\n body: JSON.stringify({\n address: addrStr,\n method,\n stack,\n }),\n },\n timeoutMs\n );\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (data.exit_code === undefined) {\n throw new Error('Missing exit_code in response');\n }\n\n this.manager.reportSuccess();\n return {\n exit_code: data.exit_code,\n stack: data.stack || [],\n };\n } catch (error: any) {\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Send BOC via REST API\n */\n async sendBoc(\n boc: Buffer | string,\n timeoutMs: number = 30000\n ): Promise<void> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const url = `${baseV2}/sendBoc`;\n const bocBase64 = typeof boc === 'string' ? boc : boc.toString('base64');\n\n try {\n const response = await fetchWithTimeout(\n url,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ boc: bocBase64 }),\n },\n timeoutMs\n );\n\n const json = await response.json();\n this.unwrapResponse(json);\n this.manager.reportSuccess();\n } catch (error: any) {\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Check if contract is deployed\n */\n async isContractDeployed(\n address: Address | string,\n timeoutMs: number = 10000\n ): Promise<boolean> {\n try {\n const state = await this.getAddressState(address, timeoutMs);\n return state === 'active';\n } catch {\n return false;\n }\n }\n\n // ========================================================================\n // Private Helpers\n // ========================================================================\n\n /**\n * Unwrap TON API response\n */\n private unwrapResponse(json: unknown): any {\n if (json && typeof json === 'object' && 'ok' in json) {\n const resp = json as { ok: boolean; result?: unknown; error?: string };\n if (!resp.ok) {\n throw new Error(resp.error || 'API returned ok=false');\n }\n return resp.result ?? json;\n }\n\n // JSON-RPC response\n if (json && typeof json === 'object' && 'result' in json) {\n return (json as { result: unknown }).result;\n }\n\n return json;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a Node adapter\n */\nexport function createNodeAdapter(manager: ProviderManager, logger?: Logger): NodeAdapter {\n return new NodeAdapter(manager, logger);\n}\n\n/**\n * Get TonClient from ProviderManager (convenience function)\n * \n * WARNING: Direct TonClient API calls bypass rate limiting!\n * For rate-limited operations, use one of these approaches:\n * \n * 1. Use adapter methods (recommended):\n * ```typescript\n * const adapter = new NodeAdapter(manager);\n * const state = await adapter.getAddressState(address);\n * ```\n * \n * 2. Acquire rate limit tokens before operations:\n * ```typescript\n * await manager.getEndpointWithRateLimit(); // Acquire token\n * const result = await client.someMethod();\n * manager.reportSuccess(); // or reportError() on failure\n * ```\n * \n * 3. Use getTonClientWithRateLimit() for operations that need rate limiting\n */\nexport async function getTonClient(manager: ProviderManager): Promise<TonClient> {\n const adapter = new NodeAdapter(manager);\n return adapter.getClient();\n}\n\n/**\n * Get TonClient with rate limiting wrapper\n * \n * Returns a TonClient along with helper methods to ensure rate limiting.\n * Use this when you need to make multiple TonClient calls with rate limiting.\n * \n * Example:\n * ```typescript\n * const { client, withRateLimit } = await getTonClientWithRateLimit(manager);\n * \n * // Wrap your operations\n * const balance = await withRateLimit(() => client.getBalance(address));\n * const state = await withRateLimit(() => client.getContractState(address));\n * ```\n */\nexport async function getTonClientWithRateLimit(\n manager: ProviderManager\n): Promise<{\n client: TonClient;\n withRateLimit: <T>(fn: () => Promise<T>, maxRetries?: number) => Promise<T>;\n}> {\n const adapter = new NodeAdapter(manager);\n const client = await adapter.getClient();\n \n const withRateLimit = async <T>(\n fn: () => Promise<T>,\n maxRetries: number = 3\n ): Promise<T> => {\n let lastError: Error | unknown;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // Acquire rate limit token before operation\n await manager.getEndpointWithRateLimit(60000);\n \n // Execute the operation\n const result = await fn();\n \n // Report success (resets backoff)\n manager.reportSuccess();\n return result;\n } catch (error: any) {\n lastError = error;\n \n // Check if it's a rate limit error (429)\n const errorMsg = error?.message || String(error) || '';\n const is429 = \n errorMsg.includes('429') ||\n errorMsg.includes('rate limit') ||\n error?.status === 429 ||\n error?.response?.status === 429;\n \n if (is429 && attempt < maxRetries) {\n // Report rate limit error (applies backoff)\n manager.reportError(error);\n \n // Get current backoff from rate limiter state\n const managerState = manager.getState();\n const provider = manager.getActiveProvider();\n let backoff = 1000; // Default backoff\n \n if (provider && managerState.providers) {\n const providerState = managerState.providers.get(provider.id);\n if (providerState?.rateLimit?.currentBackoff) {\n backoff = providerState.rateLimit.currentBackoff;\n }\n }\n \n // Wait for backoff + additional delay based on attempt\n // For low RPS providers (like Tatum with 3 RPS = 334ms), we need longer waits\n const additionalDelay = Math.min(attempt * 500, 2000);\n const waitTime = backoff + additionalDelay;\n \n // Use console.warn since we can't access private logger\n console.warn(\n `[ProviderSystem] Rate limit error (429), retrying in ${waitTime}ms (attempt ${attempt + 1}/${maxRetries + 1})`\n );\n await sleep(waitTime);\n continue;\n }\n \n // Not a 429 error, or max retries reached\n manager.reportError(error);\n throw error;\n }\n }\n \n // Should never reach here, but TypeScript needs it\n throw lastError || new Error('Rate limit retries exhausted');\n };\n \n return { client, withRateLimit };\n}\n\n/**\n * Get TonClient for network (one-shot convenience)\n */\nexport async function getTonClientForNetwork(\n network: Network,\n configPath?: string\n): Promise<TonClient> {\n const manager = ProviderManager.getInstance({ configPath });\n\n if (!manager.isInitialized() || manager.getNetwork() !== network) {\n await manager.init(network);\n }\n\n return getTonClient(manager);\n}\n\n/**\n * Reset all cached state\n */\nexport function resetNodeAdapter(): void {\n cachedClient = null;\n ProviderManager.resetInstance();\n}\n","/**\n * Unified Provider System - Browser Adapter\n *\n * Provides browser-compatible TON client functionality.\n * Designed for use in React/Next.js applications.\n */\n\nimport type { Network, ResolvedProvider, Logger, ProviderHealthResult } from '../types';\nimport { ProviderManager } from '../core/manager';\nimport { normalizeV2Endpoint, toV2Base } from '../utils/endpoint';\n\n// ============================================================================\n// Console Logger (default)\n// ============================================================================\n\nconst consoleLogger: Logger = {\n debug: (msg, data) => console.debug(`[BrowserAdapter] ${msg}`, data || ''),\n info: (msg, data) => console.log(`[BrowserAdapter] ${msg}`, data || ''),\n warn: (msg, data) => console.warn(`[BrowserAdapter] ${msg}`, data || ''),\n error: (msg, data) => console.error(`[BrowserAdapter] ${msg}`, data || ''),\n};\n\n// ============================================================================\n// Browser Adapter\n// ============================================================================\n\n/**\n * Browser Adapter for Provider System\n *\n * Provides fetch-based TON API access for browser environments.\n * Compatible with React, Next.js, and other browser frameworks.\n *\n * Note: TonClient from @ton/ton works in browser but requires polyfills.\n * This adapter provides a lighter alternative using fetch directly.\n */\nexport class BrowserAdapter {\n private manager: ProviderManager;\n private logger: Logger;\n\n constructor(manager: ProviderManager, logger?: Logger) {\n this.manager = manager;\n this.logger = logger || consoleLogger;\n }\n\n /**\n * Get current endpoint URL\n */\n async getEndpoint(): Promise<string> {\n return this.manager.getEndpoint();\n }\n\n /**\n * Get endpoint with rate limiting\n */\n async getEndpointWithRateLimit(timeoutMs?: number): Promise<string> {\n return this.manager.getEndpointWithRateLimit(timeoutMs);\n }\n\n // ========================================================================\n // JSON-RPC Methods\n // ========================================================================\n\n /**\n * Make a JSON-RPC call to the TON API\n */\n async jsonRpc<T = unknown>(\n method: string,\n params: Record<string, unknown> = {},\n timeoutMs: number = 10000\n ): Promise<T> {\n const endpoint = await this.manager.getEndpoint();\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n id: '1',\n jsonrpc: '2.0',\n method,\n params,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n this.manager.reportSuccess();\n return data as T;\n } catch (error: any) {\n clearTimeout(timeoutId);\n\n if (error.name === 'AbortError') {\n const timeoutError = new Error(`Request timed out after ${timeoutMs}ms`);\n this.manager.reportError(timeoutError);\n throw timeoutError;\n }\n\n this.manager.reportError(error);\n throw error;\n }\n }\n\n // ========================================================================\n // REST API Methods\n // ========================================================================\n\n /**\n * Get address state\n */\n async getAddressState(\n address: string,\n timeoutMs: number = 10000\n ): Promise<'uninit' | 'active' | 'frozen'> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const url = `${baseV2}/getAddressState?address=${encodeURIComponent(address)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (typeof data === 'string') {\n this.manager.reportSuccess();\n return data as 'uninit' | 'active' | 'frozen';\n }\n\n if (data && typeof data === 'object' && typeof data.state === 'string') {\n this.manager.reportSuccess();\n return data.state as 'uninit' | 'active' | 'frozen';\n }\n\n throw new Error('Unexpected response format');\n } catch (error: any) {\n clearTimeout(timeoutId);\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Get address balance\n */\n async getAddressBalance(\n address: string,\n timeoutMs: number = 10000\n ): Promise<bigint> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const url = `${baseV2}/getAddressBalance?address=${encodeURIComponent(address)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (typeof data === 'string' || typeof data === 'number') {\n this.manager.reportSuccess();\n return BigInt(data);\n }\n\n if (data && typeof data === 'object' && data.balance !== undefined) {\n this.manager.reportSuccess();\n return BigInt(String(data.balance));\n }\n\n throw new Error('Unexpected response format');\n } catch (error: any) {\n clearTimeout(timeoutId);\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Get address information\n */\n async getAddressInfo(\n address: string,\n timeoutMs: number = 10000\n ): Promise<{\n state: 'uninit' | 'active' | 'frozen';\n balance: bigint;\n lastTransactionLt?: string;\n lastTransactionHash?: string;\n }> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const url = `${baseV2}/getAddressInformation?address=${encodeURIComponent(address)}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n headers: { accept: 'application/json' },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n this.manager.reportSuccess();\n\n return {\n state: data.state as 'uninit' | 'active' | 'frozen',\n balance: BigInt(String(data.balance || 0)),\n lastTransactionLt: data.last_transaction_id?.lt,\n lastTransactionHash: data.last_transaction_id?.hash,\n };\n } catch (error: any) {\n clearTimeout(timeoutId);\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Run get method\n */\n async runGetMethod(\n address: string,\n method: string,\n stack: unknown[] = [],\n timeoutMs: number = 15000\n ): Promise<{ exit_code: number; stack: unknown[] }> {\n const endpoint = await this.manager.getEndpoint();\n const baseV2 = toV2Base(endpoint);\n const url = `${baseV2}/runGetMethod`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n accept: 'application/json',\n },\n body: JSON.stringify({\n address,\n method,\n stack,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const json = await response.json();\n const data = this.unwrapResponse(json);\n\n if (data.exit_code === undefined) {\n throw new Error('Missing exit_code in response');\n }\n\n this.manager.reportSuccess();\n return {\n exit_code: data.exit_code,\n stack: data.stack || [],\n };\n } catch (error: any) {\n clearTimeout(timeoutId);\n this.manager.reportError(error);\n throw error;\n }\n }\n\n /**\n * Get masterchain info\n */\n async getMasterchainInfo(\n timeoutMs: number = 10000\n ): Promise<{\n seqno: number;\n stateRootHash: string;\n }> {\n const data = await this.jsonRpc<{\n last: { seqno: number };\n state_root_hash: string;\n }>('getMasterchainInfo', {}, timeoutMs);\n\n return {\n seqno: data.last?.seqno || 0,\n stateRootHash: data.state_root_hash || '',\n };\n }\n\n // ========================================================================\n // Provider Management\n // ========================================================================\n\n /**\n * Get provider manager\n */\n getManager(): ProviderManager {\n return this.manager;\n }\n\n /**\n * Get active provider info\n */\n getActiveProviderInfo(): { id: string; name: string; isCustom: boolean } | null {\n return this.manager.getActiveProviderInfo();\n }\n\n /**\n * Get provider health results\n */\n getProviderHealthResults(): ProviderHealthResult[] {\n return this.manager.getProviderHealthResults();\n }\n\n /**\n * Test all providers\n */\n async testAllProviders(): Promise<ProviderHealthResult[]> {\n return this.manager.testAllProviders();\n }\n\n // ========================================================================\n // Private Helpers\n // ========================================================================\n\n /**\n * Unwrap TON API response\n */\n private unwrapResponse(json: unknown): any {\n if (json && typeof json === 'object' && 'ok' in json) {\n const resp = json as { ok: boolean; result?: unknown; error?: string };\n if (!resp.ok) {\n throw new Error(resp.error || 'API returned ok=false');\n }\n return resp.result ?? json;\n }\n\n // JSON-RPC response\n if (json && typeof json === 'object' && 'result' in json) {\n return (json as { result: unknown }).result;\n }\n\n return json;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a Browser adapter\n */\nexport function createBrowserAdapter(manager: ProviderManager, logger?: Logger): BrowserAdapter {\n return new BrowserAdapter(manager, logger);\n}\n\n/**\n * Create a Browser adapter with auto-initialized manager\n */\nexport async function createBrowserAdapterForNetwork(\n network: Network,\n configPath?: string,\n logger?: Logger\n): Promise<BrowserAdapter> {\n const manager = new ProviderManager({\n configPath,\n adapter: 'browser',\n logger,\n });\n\n await manager.init(network);\n return new BrowserAdapter(manager, logger);\n}\n"]}
|