@fragments-sdk/mcp 0.8.1 → 0.10.0
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/README.md +33 -17
- package/dist/bin.js +7 -21
- package/dist/bin.js.map +1 -1
- package/dist/chunk-7D4SUZUM.js +38 -0
- package/dist/{chunk-VV2PJ75X.js → chunk-WDQPNHZ2.js} +37 -6
- package/dist/chunk-WDQPNHZ2.js.map +1 -0
- package/dist/chunk-YJTMK4JY.js +4270 -0
- package/dist/chunk-YJTMK4JY.js.map +1 -0
- package/dist/{constants-YXOTMY3I.js → constants-BLN4SSNH.js} +2 -1
- package/dist/dist-TTCI6TME.js +60962 -0
- package/dist/dist-TTCI6TME.js.map +1 -0
- package/dist/index.js +75 -11
- package/dist/index.js.map +1 -1
- package/dist/init.js +36 -0
- package/dist/init.js.map +1 -1
- package/dist/rules-JUZ3RABB.js +8 -0
- package/dist/rules-JUZ3RABB.js.map +1 -0
- package/dist/{sass.node-4XJK6YBF-2NJM7G64.js → sass.node-4XJK6YBF-CPK77BO6.js} +2 -1
- package/dist/{sass.node-4XJK6YBF-2NJM7G64.js.map → sass.node-4XJK6YBF-CPK77BO6.js.map} +1 -1
- package/dist/server.js +2 -2
- package/package.json +7 -7
- package/dist/chunk-6JMX4AMO.js +0 -4885
- package/dist/chunk-6JMX4AMO.js.map +0 -1
- package/dist/chunk-VV2PJ75X.js.map +0 -1
- package/dist/chunk-YSRGQDEB.js +0 -93
- package/dist/chunk-YSRGQDEB.js.map +0 -1
- package/dist/dist-V7D67NXS.js +0 -1093
- package/dist/dist-V7D67NXS.js.map +0 -1
- package/dist/rules-CKBRD3UL.js +0 -8
- /package/dist/{constants-YXOTMY3I.js.map → chunk-7D4SUZUM.js.map} +0 -0
- /package/dist/{rules-CKBRD3UL.js.map → constants-BLN4SSNH.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server.ts","../src/config.ts","../src/version.ts","../src/catalog-meta.ts","../src/token-suggestions.ts","../src/tools/tokens-suggest.ts","../src/tools/spec-govern.ts","../src/tools/govern.ts","../src/tools/validate-and-fix.ts","../src/cloud-http.ts","../src/findings-service.ts","../src/tools/cloud-auth.ts","../src/tools/findings.ts","../src/tools/swap-to-canonical.ts","../src/canonical-mappings-service.ts","../src/tools/index.ts","../src/registry.ts","../src/middleware.ts","../src/source-selection.ts","../src/adapters/fragments-json.ts","../src/discovery.ts","../src/adapters/snapshot-converters.ts","../src/adapters/auto-extract.ts","../src/adapters/discover-components.ts","../src/adapters/scan-tokens.ts","../src/adapters/cloud-catalog.ts","../src/adapters/bundle.ts","../src/spec-schema.ts"],"sourcesContent":["/**\n * Standalone MCP server for Fragments design system.\n *\n * This is a lightweight extraction of the MCP server from @fragments-sdk/cli\n * that can run independently without Playwright or build tools. It provides:\n * - MCP tools for AI-output validation, deterministic repair, and token suggestions\n * - Cloud finding tools for planning fixes from real scan results\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ErrorCode,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n McpError,\n ReadResourceRequestSchema,\n type Tool,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { existsSync } from 'node:fs';\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { BRAND } from './constants.js';\nimport { loadConfigFile } from './config.js';\nimport { buildMcpTools, buildToolNames, MCP_TOOL_DEFINITIONS } from '@fragments-sdk/context/mcp-tools';\nimport { MCP_SERVER_VERSION } from './version.js';\nimport type { McpServerConfig, ToolContext } from './types.js';\nimport { CORE_TOOLS, VIEWER_TOOLS, INFRA_TOOLS, TOOL_CAPABILITIES } from './tools/index.js';\nimport { ToolRegistry } from './registry.js';\nimport { executeWithMiddleware } from './middleware.js';\nimport { resolveDataAdapter, resolveSearchApiKey } from './source-selection.js';\nimport {\n serializeUiSpecSchema,\n UI_SPEC_SCHEMA_MIME_TYPE,\n UI_SPEC_SCHEMA_NAME,\n UI_SPEC_SCHEMA_URI,\n} from './spec-schema.js';\n\nexport type { McpServerConfig } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Tool names & definitions (from shared source of truth)\n// ---------------------------------------------------------------------------\n\nconst TOOL_NAMES = buildToolNames() as Record<string, string> & {\n 'tokens.suggest': string;\n validate_and_fix: string;\n govern: string;\n findings_list: string;\n findings_for_file: string;\n};\n\nconst TOOLS = buildMcpTools() as Tool[];\nconst TOOL_DEFINITION_BY_KEY = new Map(\n MCP_TOOL_DEFINITIONS.map((definition) => [definition.key, definition]),\n);\n\n// ---------------------------------------------------------------------------\n// Server implementation\n// ---------------------------------------------------------------------------\n\nexport function createMcpServer(config: McpServerConfig): Server {\n const server = new Server(\n {\n name: `${BRAND.nameLower}-mcp`,\n version: MCP_SERVER_VERSION,\n },\n {\n capabilities: {\n tools: { listChanged: true },\n resources: { listChanged: false },\n logging: {},\n },\n }\n );\n\n // Create tool registry\n const registry = new ToolRegistry('', {\n onChanged: () => {\n server.notification({ method: 'notifications/tools/list_changed', params: {} });\n },\n });\n\n // Register built-in tools\n registry.registerBuiltins(\n { core: CORE_TOOLS, viewer: VIEWER_TOOLS, infra: INFRA_TOOLS },\n MCP_TOOL_DEFINITIONS,\n TOOL_CAPABILITIES,\n );\n\n // Load file config (user can pre-provide via config.fileConfig, or we auto-load)\n const fileConfig = config.fileConfig ?? loadConfigFile(config.projectRoot) ?? undefined;\n const mergedConfig: McpServerConfig = {\n ...(fileConfig ? { ...config, fileConfig } : config),\n searchApiKey: resolveSearchApiKey(config, fileConfig),\n };\n const adapter = config.adapter ?? resolveDataAdapter(mergedConfig, fileConfig).adapter;\n\n // Let consumers register custom tools\n config.onRegistry?.(registry);\n\n // Apply tool exclusions from config file\n if (fileConfig?.tools?.exclude) {\n for (const key of fileConfig.tools.exclude) {\n registry.unregister(key);\n }\n }\n\n // Lazy-loaded resources\n let cachedData: import('./types.js').DesignSystemData | null = null;\n let loadDataPromise: Promise<import('./types.js').DesignSystemData> | null = null;\n let resolvedRoot: string | null = null;\n let resolveProjectRootPromise: Promise<string> | null = null;\n\n /**\n * Resolve the project root directory.\n *\n * Layer 1: Try MCP roots/list (VS Code, Claude Code, and any client\n * that implements the MCP roots capability).\n * Layer 2: Fall back to the configured projectRoot (defaults to cwd).\n */\n async function resolveProjectRoot(): Promise<string> {\n if (resolvedRoot) return resolvedRoot;\n if (resolveProjectRootPromise) return resolveProjectRootPromise;\n\n resolveProjectRootPromise = (async () => {\n // Layer 1: Try MCP roots/list only when the client advertises it.\n // Scripted MCP clients often omit roots; calling listRoots anyway makes\n // their first tools/list wait for the SDK timeout.\n if (server.getClientCapabilities()?.roots) {\n try {\n const result = await server.listRoots();\n if (result.roots?.length > 0) {\n const rootUri = result.roots[0].uri;\n // Convert file:///path/to/workspace -> /path/to/workspace\n resolvedRoot = fileURLToPath(rootUri);\n return resolvedRoot;\n }\n } catch {\n // Client couldn't provide roots — fall through\n }\n }\n\n // Layer 2: Fall back to configured projectRoot (cwd)\n resolvedRoot = config.projectRoot;\n return resolvedRoot;\n })();\n\n try {\n return await resolveProjectRootPromise;\n } finally {\n resolveProjectRootPromise = null;\n }\n }\n\n async function loadData(): Promise<import('./types.js').DesignSystemData> {\n if (cachedData) return cachedData;\n if (loadDataPromise) return loadDataPromise;\n\n loadDataPromise = (async () => {\n const projectRoot = await resolveProjectRoot();\n const loaded = await adapter.load(projectRoot);\n\n cachedData = loaded;\n return loaded;\n })();\n\n try {\n return await loadDataPromise;\n } finally {\n loadDataPromise = null;\n }\n }\n\n // Register tool listing.\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n const data = await loadData();\n return {\n tools: registry.listTools(\n {\n hasViewer: false,\n hasPlayground: false,\n capabilities: data.capabilities,\n },\n TOOLS,\n ),\n };\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n {\n uri: UI_SPEC_SCHEMA_URI,\n name: UI_SPEC_SCHEMA_NAME,\n title: 'Fragments govern UI spec schema',\n description:\n 'JSON schema and examples for the spec argument accepted by govern and validate_and_fix.',\n mimeType: UI_SPEC_SCHEMA_MIME_TYPE,\n },\n ],\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n if (request.params.uri !== UI_SPEC_SCHEMA_URI) {\n throw new McpError(\n ErrorCode.InvalidParams,\n `Unknown resource URI: ${request.params.uri}`,\n );\n }\n\n return {\n contents: [\n {\n uri: UI_SPEC_SCHEMA_URI,\n mimeType: UI_SPEC_SCHEMA_MIME_TYPE,\n text: serializeUiSpecSchema(),\n },\n ],\n };\n });\n\n // Register tool execution\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n const data = await loadData();\n const toolContext: ToolContext = {\n data,\n config: mergedConfig,\n indexes: { componentIndex: null, blockIndex: null, tokenIndex: null },\n mcp: {\n server,\n clientCapabilities: server.getClientCapabilities(),\n },\n resolvePackageName: (name?: string) => {\n if (name) {\n const pkg = data.packageMap[name];\n if (pkg) return pkg;\n }\n if (data.defaultPackageName) return data.defaultPackageName;\n if (data.snapshot.sourceType === 'cloud') {\n return 'your-component-library';\n }\n const root = resolvedRoot ?? config.projectRoot;\n const packageJsonPath = join(root, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const content = readFileSync(packageJsonPath, 'utf-8');\n const pkg = JSON.parse(content) as { name?: string };\n if (pkg.name) {\n return pkg.name;\n }\n } catch { /* Fall through */ }\n }\n return 'your-component-library';\n },\n toolNames: TOOL_NAMES as Record<string, string>,\n };\n\n try {\n const toolKey = registry.resolveKey(name);\n const definition = TOOL_DEFINITION_BY_KEY.get(toolKey);\n const argumentKeys = Object.keys(args ?? {});\n const allowedKeys = new Set(Object.keys(definition?.params ?? {}));\n const unknownKeys = definition\n ? argumentKeys.filter((key) => !allowedKeys.has(key))\n : [];\n if (unknownKeys.length > 0) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error: `Unknown argument(s) for ${toolKey}: ${unknownKeys.join(', ')}`,\n }),\n },\n ],\n isError: true,\n };\n }\n const mCtx = {\n toolName: name,\n toolKey,\n args: args ?? {},\n ctx: toolContext,\n };\n\n return await executeWithMiddleware(\n config.middleware ?? [],\n mCtx,\n () => registry.execute(name, args ?? {}, toolContext),\n );\n } catch (error) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: error instanceof Error ? error.message : String(error) }) }],\n isError: true,\n };\n }\n });\n\n return server;\n}\n\n/**\n * Start the MCP server with stdio transport\n */\nexport async function startMcpServer(config: McpServerConfig): Promise<void> {\n const server = createMcpServer(config);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\n/**\n * Smithery sandbox server for capability scanning.\n * Returns a server instance with default config so Smithery can enumerate tools.\n */\nexport function createSandboxServer() {\n return createMcpServer({ projectRoot: process.cwd() });\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SearchConfig } from './search-config.js';\nimport type { Brand } from './constants.js';\n\nexport interface DsMcpConfigFile {\n /** Override source selection (defaults to auto-detect) */\n source?: 'auto' | 'fragments-json' | 'cloud' | 'bundle' | 'extract';\n /** Override branding (name, prefix, etc.) */\n brand?: Partial<Brand>;\n /** Search configuration overrides */\n search?: SearchConfig;\n /** Tool configuration */\n tools?: {\n /** Tool keys to exclude from registration */\n exclude?: string[];\n };\n /** Vector search configuration */\n vectorSearch?: {\n url?: string;\n /** Optional vector-search bearer token. There is no CLI alias for this. */\n apiKey?: string;\n };\n /** Fragments Cloud catalog configuration */\n cloud?: {\n /** Override Cloud catalog API URL */\n url?: string;\n /** Override Cloud API key (defaults to FRAGMENTS_API_KEY env var) */\n apiKey?: string;\n };\n /**\n * @deprecated The MCP v2 Cloud path uses `/api/catalog` and ignores this\n * configuration. It is retained only for backward compatibility with older\n * local enrichment workflows and should not be used for new setups.\n */\n enrichment?: {\n /** Override enrichment API URL (defaults to Fragments Cloud) */\n url?: string;\n /** Override Cloud API key (defaults to FRAGMENTS_API_KEY env var) */\n apiKey?: string;\n /** Disable enrichment fetching */\n disabled?: boolean;\n /** Cache TTL in ms (default: 600000 = 10 minutes) */\n ttlMs?: number;\n };\n}\n\n/**\n * Load config from ds-mcp.config.json or package.json \"dsMcp\" field.\n * Returns null if no config file is found (pure defaults).\n */\nexport function loadConfigFile(projectRoot: string): DsMcpConfigFile | null {\n // 1. Check for ds-mcp.config.json\n const configPath = join(projectRoot, 'ds-mcp.config.json');\n if (existsSync(configPath)) {\n try {\n const content = readFileSync(configPath, 'utf-8');\n return JSON.parse(content) as DsMcpConfigFile;\n } catch (e) {\n throw new Error(`Failed to parse ${configPath}: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n // 2. Check package.json \"dsMcp\" field\n const pkgPath = join(projectRoot, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const content = readFileSync(pkgPath, 'utf-8');\n const pkg = JSON.parse(content) as { dsMcp?: DsMcpConfigFile };\n if (pkg.dsMcp) return pkg.dsMcp;\n } catch {\n // Ignore parse errors in package.json\n }\n }\n\n return null;\n}\n","import { readFileSync } from 'node:fs';\n\ninterface PackageJson {\n version?: string;\n}\n\nfunction readPackageVersion(): string {\n try {\n const raw = readFileSync(new URL('../package.json', import.meta.url), 'utf-8');\n const pkg = JSON.parse(raw) as PackageJson;\n return pkg.version ?? '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nexport const MCP_SERVER_VERSION = readPackageVersion();\n","import type { DesignSystemData } from './types.js';\n\nexport interface CatalogMeta {\n catalogRevision?: string;\n updatedAt?: string;\n}\n\nexport function getCatalogMeta(data: DesignSystemData): CatalogMeta {\n const rawUpdatedAt =\n data.validateFixContext?.updatedAt ?? data.snapshot.metadata.updatedAt;\n const updatedAt =\n typeof rawUpdatedAt === 'number'\n ? new Date(rawUpdatedAt).toISOString()\n : rawUpdatedAt;\n\n return {\n catalogRevision:\n data.validateFixContext?.catalogRevision ?? data.snapshot.metadata.revision,\n updatedAt,\n };\n}\n","import type { McpToken, McpTokenData } from '@fragments-sdk/core';\n\nexport type TokenPropertyFamily =\n | 'color'\n | 'spacing'\n | 'radius'\n | 'border-width'\n | 'shadow'\n | 'typography'\n | 'duration'\n | 'z-index'\n | 'other';\n\nexport type TokenSuggestionReason =\n | 'exact-value-match'\n | 'family-match'\n | 'nearest-neighbor';\n\nexport interface TokenSuggestionCandidate {\n name: string;\n cssVar?: string;\n cssValue?: string;\n resolvedValue?: string;\n confidence: 'high' | 'medium' | 'low';\n reason: TokenSuggestionReason;\n score: number;\n token: McpToken;\n}\n\nexport interface SuggestTokenInput {\n tokens?: McpTokenData;\n property: string;\n value?: string;\n context?: 'component' | 'block' | 'global';\n limit?: number;\n}\n\nexport interface SuggestTokenResult {\n recommended?: Omit<TokenSuggestionCandidate, 'token' | 'score'>;\n alternatives: Array<Omit<TokenSuggestionCandidate, 'token' | 'score'>>;\n noSuggestion?: boolean;\n noSuggestionReason?: string;\n _meta: {\n propertyFamily: TokenPropertyFamily;\n catalogRevision?: string;\n updatedAt?: string;\n candidateCount: number;\n };\n}\n\ninterface ScoredCandidate {\n token: McpToken;\n family: TokenPropertyFamily;\n score: number;\n reason: TokenSuggestionReason;\n}\n\nexport function propertyFamilyFor(property: string, value?: string): TokenPropertyFamily {\n const prop = property.toLowerCase().trim();\n const normalizedValue = value?.toLowerCase().trim();\n\n if (prop.includes('shadow')) return 'shadow';\n if (prop.includes('z-index')) return 'z-index';\n if (prop.includes('transition') || prop.includes('duration') || prop.includes('animation')) {\n return 'duration';\n }\n if (prop.includes('font') || prop.includes('line-height') || prop === 'letter-spacing') {\n return 'typography';\n }\n if (prop.includes('radius')) return 'radius';\n if (\n prop.endsWith('border-width') ||\n prop === 'border-width' ||\n prop === 'outline-width' ||\n prop === 'stroke-width'\n ) {\n return 'border-width';\n }\n if (\n prop.includes('color') ||\n prop === 'background' ||\n prop.startsWith('background-') ||\n prop === 'fill' ||\n prop === 'stroke' ||\n prop === 'caret-color' ||\n prop === 'accent-color' ||\n ((prop === 'border' || prop === 'outline') && normalizedValue && looksLikeColor(normalizedValue))\n ) {\n return 'color';\n }\n if (\n prop === 'margin' ||\n prop.startsWith('margin-') ||\n prop === 'padding' ||\n prop.startsWith('padding-') ||\n prop === 'gap' ||\n prop === 'row-gap' ||\n prop === 'column-gap' ||\n prop === 'inset' ||\n prop === 'top' ||\n prop === 'right' ||\n prop === 'bottom' ||\n prop === 'left' ||\n prop.endsWith('width') ||\n prop.endsWith('height')\n ) {\n return 'spacing';\n }\n\n return 'other';\n}\n\nexport function suggestToken(input: SuggestTokenInput & {\n catalogRevision?: string;\n updatedAt?: string;\n}): SuggestTokenResult {\n const family = propertyFamilyFor(input.property, input.value);\n const limit = Math.min(Math.max(input.limit ?? 5, 1), 10);\n const candidates = input.tokens ? scoreCandidates(input.tokens, family, input) : [];\n const top = candidates.slice(0, limit).map((candidate) =>\n presentCandidate(candidate, input.tokens),\n );\n\n const meta = {\n propertyFamily: family,\n catalogRevision: input.catalogRevision,\n updatedAt: input.updatedAt,\n candidateCount: candidates.length,\n };\n\n if (family === 'other') {\n return {\n alternatives: [],\n noSuggestion: true,\n noSuggestionReason: `No token family is known for CSS property \"${input.property}\".`,\n _meta: meta,\n };\n }\n\n if (!input.tokens || input.tokens.total === 0) {\n return {\n alternatives: [],\n noSuggestion: true,\n noSuggestionReason: 'No design tokens are available in the active catalog.',\n _meta: meta,\n };\n }\n\n if (top.length === 0) {\n return {\n alternatives: [],\n noSuggestion: true,\n noSuggestionReason: `No ${family} tokens are available for CSS property \"${input.property}\".`,\n _meta: meta,\n };\n }\n\n const [recommended, ...alternatives] = top;\n return {\n recommended,\n alternatives,\n _meta: meta,\n };\n}\n\nfunction scoreCandidates(\n tokenData: McpTokenData,\n family: TokenPropertyFamily,\n input: SuggestTokenInput,\n): ScoredCandidate[] {\n if (family === 'other') return [];\n const value = normalizeComparableValue(input.value);\n const flatTokens =\n tokenData.flat.length > 0\n ? tokenData.flat\n : Object.values(tokenData.categories).flat();\n const familyTokens = flatTokens\n .filter((token) => !isGarbageToken(token))\n .map((token) => ({ token, family: tokenFamily(token) }))\n .filter((entry) => entry.family === family);\n\n const scored = familyTokens.map(({ token }) => {\n const tokenValue = normalizeComparableValue(token.value);\n let score = 50;\n let reason: TokenSuggestionReason = 'family-match';\n\n if (value && tokenValue && value === tokenValue) {\n score += 60;\n reason = 'exact-value-match';\n } else if (value && tokenValue && family !== 'color') {\n const distanceScore = lengthDistanceScore(value, tokenValue);\n if (distanceScore > 0) {\n score += distanceScore;\n reason = 'nearest-neighbor';\n }\n }\n\n score += nameRelevanceScore(token, input.property, input.context);\n return { token, family, score, reason };\n });\n\n return scored\n .filter((candidate) => candidate.score > 0)\n .sort((a, b) => b.score - a.score || a.token.name.localeCompare(b.token.name));\n}\n\nfunction presentCandidate(\n candidate: ScoredCandidate,\n tokenData?: McpTokenData,\n): Omit<TokenSuggestionCandidate, 'token' | 'score'> {\n const cssVar = cssVarForToken(candidate.token);\n const resolvedValue = resolvedValueForToken(candidate.token);\n const confidence =\n candidate.score >= 105 ? 'high' : candidate.score >= 65 ? 'medium' : 'low';\n\n return {\n name: dottedNameForToken(candidate.token, tokenData),\n ...(cssVar && { cssVar }),\n ...(cssVar && {\n cssValue: resolvedValue ? `var(${cssVar}, ${resolvedValue})` : `var(${cssVar})`,\n }),\n ...(resolvedValue && { resolvedValue }),\n confidence,\n reason: candidate.reason,\n };\n}\n\nexport function isGarbageToken(token: Pick<McpToken, 'name' | 'value'>): boolean {\n const value = token.value?.trim();\n if (!value) return false;\n if (value.includes('#{') || value.includes('$')) return true;\n if (/^\\$[\\w-]+/.test(token.name)) return true;\n return false;\n}\n\nfunction tokenFamily(token: McpToken): TokenPropertyFamily {\n const haystack = [\n token.type,\n token.category,\n ...(token.path ?? []),\n token.name,\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n\n if (/\\b(color|colour|background|foreground|surface|palette)\\b/.test(haystack)) {\n return 'color';\n }\n if (/\\b(radius|radii|rounded|corner)\\b/.test(haystack)) return 'radius';\n if (/\\b(border-width|border width|stroke-width|stroke width)\\b/.test(haystack)) {\n return 'border-width';\n }\n if (/\\b(shadow|elevation)\\b/.test(haystack)) return 'shadow';\n if (/\\b(font|type|typography|line-height|letter-spacing)\\b/.test(haystack)) {\n return 'typography';\n }\n if (/\\b(duration|transition|animation)\\b/.test(haystack)) return 'duration';\n if (/\\b(z-index|zindex)\\b/.test(haystack)) return 'z-index';\n if (/\\b(space|spacing|size|sizing|width|height|gap|padding|margin|inset)\\b/.test(haystack)) {\n return 'spacing';\n }\n if (/\\bborder\\b/.test(haystack)) return 'border-width';\n return 'other';\n}\n\nfunction cssVarForToken(token: McpToken): string | undefined {\n if (token.name.startsWith('--')) return token.name;\n const match = token.value?.match(/var\\((--[\\w-]+)/);\n return match?.[1];\n}\n\nfunction dottedNameForToken(token: McpToken, tokenData?: McpTokenData): string {\n if (!token.name.startsWith('--')) return token.name;\n let name = token.name.slice(2);\n const prefix = tokenData?.prefix?.replace(/^--/, '').replace(/-$/, '');\n if (prefix && name.startsWith(`${prefix}-`)) {\n name = name.slice(prefix.length + 1);\n }\n return name.replace(/-/g, '.');\n}\n\nfunction resolvedValueForToken(token: McpToken): string | undefined {\n const value = token.value?.trim();\n if (!value) return undefined;\n const fallback = value.match(/var\\(--[\\w-]+,\\s*([^)]+)\\)/)?.[1]?.trim();\n if (fallback) return fallback;\n if (value.startsWith('var(')) return undefined;\n return value;\n}\n\nfunction normalizeComparableValue(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim().toLowerCase();\n const color = normalizeColor(trimmed);\n if (color) return color;\n const length = parseLength(trimmed);\n if (length) return `${length.value}${length.unit}`;\n return trimmed.replace(/\\s+/g, ' ');\n}\n\nfunction looksLikeColor(value: string): boolean {\n return /^#([\\da-f]{3,8})$/i.test(value) || /^rgba?\\(/i.test(value) || /^hsla?\\(/i.test(value);\n}\n\nfunction normalizeColor(value: string): string | undefined {\n const hex = value.match(/^#([\\da-f]{3}|[\\da-f]{6}|[\\da-f]{8})$/i);\n if (!hex) return undefined;\n const body = hex[1].toLowerCase();\n if (body.length === 3) {\n return `#${body[0]}${body[0]}${body[1]}${body[1]}${body[2]}${body[2]}`;\n }\n return `#${body}`;\n}\n\nfunction parseLength(value: string): { value: number; unit: string } | undefined {\n const match = value.match(/^(-?\\d+(?:\\.\\d+)?)(px|rem|em|%)$/);\n if (!match) return undefined;\n return { value: Number(match[1]), unit: match[2] };\n}\n\nfunction lengthDistanceScore(inputValue: string, tokenValue: string): number {\n const input = parseLength(inputValue);\n const token = parseLength(tokenValue);\n if (!input || !token || input.unit !== token.unit) return 0;\n const distance = Math.abs(input.value - token.value);\n if (distance === 0) return 60;\n if (distance <= 2) return 35;\n if (distance <= 4) return 20;\n if (distance <= 8) return 10;\n return 0;\n}\n\nfunction nameRelevanceScore(\n token: McpToken,\n property: string,\n context: SuggestTokenInput['context'],\n): number {\n const haystack = [token.name, token.category, ...(token.path ?? [])]\n .join(' ')\n .toLowerCase();\n const prop = property.toLowerCase();\n let score = 0;\n for (const part of prop.split(/[^a-z0-9]+/).filter((part) => part.length > 2)) {\n if (haystack.includes(part)) score += 4;\n }\n if (context === 'component' && haystack.includes('component')) score += 3;\n if (context === 'global' && haystack.includes('global')) score += 3;\n return score;\n}\n","import type { ToolHandler } from '../types.js';\nimport { getCatalogMeta } from '../catalog-meta.js';\nimport { suggestToken } from '../token-suggestions.js';\n\nexport const tokensSuggestHandler: ToolHandler = async (args, ctx) => {\n const property = args.property;\n if (!property || typeof property !== 'string') {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: 'property is required.' }),\n },\n ],\n isError: true,\n };\n }\n\n const context = args.context;\n const catalogMeta = getCatalogMeta(ctx.data);\n const result = suggestToken({\n tokens: ctx.data.tokens,\n property,\n value: typeof args.value === 'string' ? args.value : undefined,\n context:\n context === 'component' || context === 'block' || context === 'global'\n ? context\n : undefined,\n catalogRevision: catalogMeta.catalogRevision,\n updatedAt: catalogMeta.updatedAt,\n });\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n _meta: result._meta,\n };\n};\n","type Severity = 'critical' | 'serious' | 'moderate' | 'minor';\ntype Verdict = 'pass' | 'warn' | 'fail';\n\nconst SEVERITY_WEIGHTS: Record<Severity, number> = {\n critical: 10,\n serious: 5,\n moderate: 2,\n minor: 1,\n};\n\nexport type UiSpecNode = {\n id?: string;\n type?: string;\n props?: Record<string, unknown>;\n children?: unknown[] | string;\n};\n\nexport type UiSpec = {\n nodes?: UiSpecNode[];\n root?: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type Violation = {\n nodeId: string;\n nodeType: string;\n rule: string;\n severity: Severity;\n message: string;\n suggestion?: string;\n prop?: string;\n rawValue?: string;\n};\n\ntype ValidatorResult = {\n validator: string;\n severity: Severity;\n passed: boolean;\n violations: Violation[];\n};\n\nexport type GovernanceVerdict = {\n verdict: Verdict;\n passed: boolean;\n score: number;\n results: ValidatorResult[];\n metadata: {\n runner: string;\n duration: number;\n nodeCount: number;\n componentTypes: string[];\n };\n};\n\ntype RuleConfig =\n | boolean\n | {\n enabled?: boolean;\n severity?: Severity;\n options?: Record<string, unknown>;\n };\n\ntype SpecGovernPolicy = {\n rules?: Record<string, RuleConfig | undefined>;\n};\n\nexport type ComponentPropSchema = {\n values?: string[];\n};\n\ntype SpecGovernOptions = {\n allowedComponents: string[];\n tokenPrefix?: string;\n policy?: SpecGovernPolicy;\n componentProps?: Record<string, Record<string, ComponentPropSchema | undefined>>;\n};\n\nfunction isRuleEnabled(rule: RuleConfig | undefined, defaultEnabled = true): boolean {\n if (rule === undefined) return defaultEnabled;\n if (typeof rule === 'boolean') return rule;\n return rule.enabled ?? defaultEnabled;\n}\n\nfunction ruleSeverity(\n rule: RuleConfig | undefined,\n fallback: Severity,\n): Severity {\n return typeof rule === 'object' && rule?.severity ? rule.severity : fallback;\n}\n\nfunction ruleOptions(rule: RuleConfig | undefined): Record<string, unknown> {\n return typeof rule === 'object' && rule?.options ? rule.options : {};\n}\n\nfunction nodeId(node: UiSpecNode, fallback: number): string {\n return typeof node.id === 'string' ? node.id : `node-${fallback}`;\n}\n\nfunction nodeType(node: UiSpecNode): string {\n return typeof node.type === 'string' ? node.type : '_unknown';\n}\n\nfunction parentType(type: string): string {\n const dotIndex = type.indexOf('.');\n return dotIndex > 0 ? type.slice(0, dotIndex) : type;\n}\n\nfunction walkNodes(\n nodes: unknown[] | string | undefined,\n visitor: (node: UiSpecNode, index: number) => void,\n): void {\n if (!Array.isArray(nodes)) return;\n for (const [index, node] of nodes.entries()) {\n if (typeof node !== 'object' || node === null || Array.isArray(node)) {\n continue;\n }\n const specNode = node as UiSpecNode;\n visitor(specNode, index);\n walkNodes(specNode.children, visitor);\n }\n}\n\nfunction flattenNodes(spec: UiSpec): UiSpecNode[] {\n const flattened: UiSpecNode[] = [];\n walkNodes(spec.nodes, (node) => flattened.push(node));\n return flattened;\n}\n\nfunction worstSeverity(violations: Violation[]): Severity {\n const order: Severity[] = ['critical', 'serious', 'moderate', 'minor'];\n return violations.reduce<Severity>(\n (worst, violation) =>\n order.indexOf(violation.severity) < order.indexOf(worst)\n ? violation.severity\n : worst,\n 'minor',\n );\n}\n\nfunction result(\n validator: string,\n violations: Violation[],\n): ValidatorResult {\n return {\n validator,\n severity: violations.length > 0 ? worstSeverity(violations) : 'minor',\n passed: violations.length === 0,\n violations,\n };\n}\n\nconst SEVERITY_SCORE_CAPS: Record<Severity, number> = {\n critical: 25,\n serious: 50,\n moderate: 80,\n minor: 95,\n};\n\nfunction verdictFor(violations: Violation[]): Verdict {\n if (violations.length === 0) return 'pass';\n const worst = worstSeverity(violations);\n return worst === 'critical' || worst === 'serious' ? 'fail' : 'warn';\n}\n\nfunction computeScore(violations: Violation[]): number {\n if (violations.length === 0) return 100;\n const penalty = violations.reduce(\n (sum, violation) => sum + SEVERITY_WEIGHTS[violation.severity],\n 0,\n );\n const cap = SEVERITY_SCORE_CAPS[worstSeverity(violations)];\n return Math.min(cap, Math.max(0, 100 - penalty));\n}\n\nfunction validateComponents(\n nodes: UiSpecNode[],\n options: SpecGovernOptions,\n): ValidatorResult {\n const rules = options.policy?.rules ?? {};\n const allowRule = rules['components/allow'];\n const denyRule = rules['components/deny'];\n const allowOptions = ruleOptions(allowRule);\n const denyOptions = ruleOptions(denyRule);\n const allowed = new Set(\n (\n (allowOptions.components as string[] | undefined) ??\n options.allowedComponents\n ).filter(Boolean),\n );\n const denied = new Set((denyOptions.components as string[] | undefined) ?? []);\n const violations: Violation[] = [];\n\n for (const [index, node] of nodes.entries()) {\n const type = nodeType(node);\n const parent = parentType(type);\n\n if (\n allowed.size > 0 &&\n isRuleEnabled(allowRule) &&\n !allowed.has(type) &&\n !allowed.has(parent)\n ) {\n violations.push({\n nodeId: nodeId(node, index),\n nodeType: type,\n rule: 'components/allow',\n severity: ruleSeverity(allowRule, 'serious'),\n message: `Component \"${type}\" is not in the allowed list`,\n suggestion: `Use one of the allowed components: ${[...allowed].slice(0, 10).join(', ')}${allowed.size > 10 ? '...' : ''}`,\n });\n }\n\n if (\n denied.size > 0 &&\n isRuleEnabled(denyRule) &&\n (denied.has(type) || denied.has(parent))\n ) {\n violations.push({\n nodeId: nodeId(node, index),\n nodeType: type,\n rule: 'components/deny',\n severity: ruleSeverity(denyRule, 'serious'),\n message: `Component \"${type}\" is blocked by the deny list`,\n suggestion: `Remove \"${type}\" or replace it with an allowed alternative`,\n });\n }\n }\n\n return result('components', violations);\n}\n\nfunction isEventHandlerProp(prop: string): boolean {\n return /^on[A-Z]/.test(prop);\n}\n\nfunction validateSafety(nodes: UiSpecNode[]): ValidatorResult {\n const violations: Violation[] = [];\n const dangerousProps = new Set(['dangerouslySetInnerHTML', 'innerHTML']);\n\n for (const [index, node] of nodes.entries()) {\n for (const [prop, value] of Object.entries(node.props ?? {})) {\n if (dangerousProps.has(prop)) {\n violations.push({\n nodeId: nodeId(node, index),\n nodeType: nodeType(node),\n rule: 'safety/no-dangerous-props',\n severity: 'critical',\n message: `Dangerous prop \"${prop}\" is not allowed`,\n suggestion: `Remove \"${prop}\" or use a safe rendering pattern`,\n prop,\n });\n }\n\n if (isEventHandlerProp(prop) && typeof value === 'string') {\n violations.push({\n nodeId: nodeId(node, index),\n nodeType: nodeType(node),\n rule: 'safety/no-string-handlers',\n severity: 'serious',\n message: `Event handler prop \"${prop}\" must not be a string`,\n suggestion: `Remove \"${prop}\" from generated specs`,\n prop,\n });\n }\n }\n }\n\n return result('safety', violations);\n}\n\nfunction editDistance(a: string, b: string): number {\n const rows = a.length + 1;\n const cols = b.length + 1;\n const distances = Array.from({ length: rows }, () => Array(cols).fill(0));\n\n for (let i = 0; i < rows; i++) distances[i][0] = i;\n for (let j = 0; j < cols; j++) distances[0][j] = j;\n\n for (let i = 1; i < rows; i++) {\n for (let j = 1; j < cols; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n distances[i][j] = Math.min(\n distances[i - 1][j] + 1,\n distances[i][j - 1] + 1,\n distances[i - 1][j - 1] + cost,\n );\n }\n }\n\n return distances[a.length][b.length];\n}\n\nfunction normalizePropValue(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\nfunction closestAllowedValue(\n rawValue: string,\n allowedValues: string[],\n): string | undefined {\n const normalizedRaw = normalizePropValue(rawValue);\n const ranked = allowedValues\n .map((value) => {\n const normalizedValue = normalizePropValue(value);\n const distance = editDistance(normalizedRaw, normalizedValue);\n const prefixMatch =\n normalizedRaw.length >= 4 &&\n (normalizedValue.startsWith(normalizedRaw) ||\n normalizedRaw.startsWith(normalizedValue));\n return { value, distance, prefixMatch };\n })\n .sort((a, b) => {\n if (a.prefixMatch !== b.prefixMatch) return a.prefixMatch ? -1 : 1;\n return a.distance - b.distance || a.value.localeCompare(b.value);\n });\n\n const best = ranked[0];\n if (!best) return undefined;\n if (best.prefixMatch || best.distance <= 2) return best.value;\n return undefined;\n}\n\nfunction validateProps(\n nodes: UiSpecNode[],\n options: SpecGovernOptions,\n): ValidatorResult {\n const rules = options.policy?.rules ?? {};\n const propRule = rules['props/valid-values'];\n const componentProps = options.componentProps ?? {};\n const violations: Violation[] = [];\n\n if (!isRuleEnabled(propRule)) {\n return result('props', violations);\n }\n\n for (const [index, node] of nodes.entries()) {\n const type = nodeType(node);\n const propSchema = componentProps[type] ?? componentProps[parentType(type)];\n if (!propSchema) continue;\n\n for (const [prop, value] of Object.entries(node.props ?? {})) {\n const allowedValues = propSchema[prop]?.values?.filter(Boolean) ?? [];\n if (allowedValues.length === 0) continue;\n const rawValue = typeof value === 'string' ? value : undefined;\n if (!rawValue || allowedValues.includes(rawValue)) continue;\n\n const closest = closestAllowedValue(rawValue, allowedValues);\n violations.push({\n nodeId: nodeId(node, index),\n nodeType: type,\n rule: 'props/invalid-value',\n severity: ruleSeverity(propRule, 'moderate'),\n message: `Prop \"${prop}\" on ${type} has invalid value \"${rawValue}\"`,\n suggestion: closest\n ? `Use \"${closest}\" for prop \"${prop}\" on ${type}.`\n : `Use one of: ${allowedValues.join(', ')}`,\n prop,\n rawValue,\n });\n }\n }\n\n return result('props', violations);\n}\n\nfunction hasHardcodedCssValue(value: string): boolean {\n if (value.includes('var(')) return false;\n return /#[0-9a-f]{3,8}\\b/i.test(value) || /\\b\\d+(?:px|rem|em)\\b/.test(value);\n}\n\nfunction validateTokens(\n nodes: UiSpecNode[],\n options: SpecGovernOptions,\n): ValidatorResult {\n const rules = options.policy?.rules ?? {};\n const requireRule = rules['tokens/require-design-tokens'];\n const prefixRule = rules['tokens/allowed-prefixes'];\n const requireTokens = isRuleEnabled(requireRule);\n const defaultTokenPrefix = options.tokenPrefix?.replace(/^--/, '');\n const allowedPrefixes = (\n ruleOptions(prefixRule).prefixes as string[] | undefined\n ) ?? (defaultTokenPrefix ? [defaultTokenPrefix] : []);\n const violations: Violation[] = [];\n\n for (const [index, node] of nodes.entries()) {\n for (const [prop, value] of Object.entries(node.props ?? {})) {\n if (typeof value !== 'string') continue;\n\n if (requireTokens && hasHardcodedCssValue(value)) {\n violations.push({\n nodeId: nodeId(node, index),\n nodeType: nodeType(node),\n rule: 'tokens/require-design-tokens',\n severity: ruleSeverity(requireRule, 'moderate'),\n message: `Hardcoded CSS value \"${value}\" in prop \"${prop}\" - use a design token instead`,\n suggestion: 'Use a design token instead of a hardcoded CSS value',\n prop,\n rawValue: value,\n });\n }\n\n if (\n allowedPrefixes.length > 0 &&\n isRuleEnabled(prefixRule, Boolean(options.tokenPrefix))\n ) {\n const matches = value.matchAll(/var\\(--([^)]+)\\)/g);\n for (const match of matches) {\n const tokenName = match[1];\n if (allowedPrefixes.some((prefix) => tokenName.startsWith(prefix))) {\n continue;\n }\n violations.push({\n nodeId: nodeId(node, index),\n nodeType: nodeType(node),\n rule: 'tokens/allowed-prefixes',\n severity: ruleSeverity(prefixRule, 'moderate'),\n message: `Token \"--${tokenName}\" does not use an allowed prefix (${allowedPrefixes.join(', ')})`,\n suggestion: `Use a token with one of the allowed prefixes: ${allowedPrefixes.map((prefix) => `--${prefix}*`).join(', ')}`,\n prop,\n rawValue: value,\n });\n }\n }\n }\n }\n\n return result('tokens', violations);\n}\n\nfunction textFromUnknown(value: unknown): string {\n if (typeof value === 'string') return value.trim();\n if (Array.isArray(value)) return textFromChildren(value);\n if (typeof value === 'object' && value !== null) {\n return textFromNode(value as UiSpecNode);\n }\n return '';\n}\n\nfunction textFromNode(node: UiSpecNode): string {\n const type = nodeType(node).toLowerCase();\n const props = node.props ?? {};\n const propText = [\n textFromUnknown(props.children),\n type === 'text' ? textFromUnknown(props.value) : '',\n ].filter(Boolean);\n const childText = textFromChildren(node.children);\n return [...propText, childText].join(' ').trim();\n}\n\nfunction textFromChildren(children: unknown[] | string | undefined): string {\n if (typeof children === 'string') return children.trim();\n if (!Array.isArray(children)) return '';\n return children\n .map((child) => {\n return textFromUnknown(child);\n })\n .join(' ')\n .trim();\n}\n\nfunction validateA11y(nodes: UiSpecNode[]): ValidatorResult {\n const violations: Violation[] = [];\n\n for (const [index, node] of nodes.entries()) {\n const type = nodeType(node);\n if (!/button/i.test(type)) continue;\n\n const props = node.props ?? {};\n const label = props['aria-label'] ?? props['aria-labelledby'] ?? props.title;\n const childText = textFromNode(node);\n if (typeof label === 'string' && label.trim().length > 0) continue;\n if (childText.length > 0) continue;\n\n violations.push({\n nodeId: nodeId(node, index),\n nodeType: type,\n rule: 'button-name',\n severity: 'serious',\n message: 'Buttons must have discernible text (button-name)',\n suggestion: 'Add visible text or an aria-label',\n });\n }\n\n return result('a11y', violations);\n}\n\nexport function runSpecGovern(\n spec: UiSpec,\n options: SpecGovernOptions,\n): GovernanceVerdict {\n const startedAt = Date.now();\n const nodes = flattenNodes(spec);\n const results = [\n validateSafety(nodes),\n validateComponents(nodes, options),\n validateProps(nodes, options),\n validateTokens(nodes, options),\n validateA11y(nodes),\n ];\n const violations = results.flatMap((entry) => entry.violations);\n const componentTypes = Array.from(\n new Set(nodes.map((node) => nodeType(node))),\n );\n\n return {\n verdict: verdictFor(violations),\n passed: results.every((entry) => entry.passed),\n score: computeScore(violations),\n results,\n metadata: {\n runner: 'mcp',\n duration: Date.now() - startedAt,\n nodeCount: nodes.length,\n componentTypes,\n },\n };\n}\n\nexport function formatVerdict(\n verdict: GovernanceVerdict,\n format: 'json' | 'summary' = 'summary',\n): string {\n if (format === 'json') {\n return JSON.stringify(verdict, null, 2);\n }\n\n const lines: string[] = [];\n const icon = verdict.passed ? 'ok' : 'fail';\n lines.push(`${icon} Governance check: verdict ${verdict.verdict}, score ${verdict.score}/100`);\n lines.push('');\n\n for (const entry of verdict.results) {\n const resultIcon = entry.passed ? 'ok' : 'fail';\n const count = entry.violations.length;\n lines.push(` ${resultIcon} ${entry.validator}: ${count === 0 ? 'passed' : `${count} violation(s)`}`);\n\n for (const violation of entry.violations) {\n lines.push(` - [${violation.severity}] ${violation.nodeType}#${violation.nodeId}: ${violation.message}`);\n if (violation.suggestion) {\n lines.push(` -> ${violation.suggestion}`);\n }\n }\n }\n\n lines.push('');\n lines.push(`Duration: ${verdict.metadata.duration.toFixed(0)}ms | Nodes: ${verdict.metadata.nodeCount}`);\n\n return lines.join('\\n');\n}\n","import type { ToolHandler } from '../types.js';\nimport { getCatalogMeta } from '../catalog-meta.js';\nimport {\n formatVerdict,\n runSpecGovern,\n type ComponentPropSchema,\n type UiSpec,\n} from './spec-govern.js';\n\nfunction buildComponentProps(ctx: Parameters<ToolHandler>[1]) {\n return Object.fromEntries(\n Object.values(ctx.data.components).map((component) => [\n component.name,\n component.props as Record<string, ComponentPropSchema | undefined>,\n ]),\n );\n}\n\nexport const governHandler: ToolHandler = async (args, ctx) => {\n const spec = args?.spec;\n if (!spec || typeof spec !== 'object') {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error:\n 'spec is required and must be an object with { nodes: [{ id, type, props, children }], root?, metadata? }. See the govern.schema MCP resource for the full schema.',\n }),\n },\n ],\n isError: true,\n };\n }\n\n const policyOverrides = args?.policy as Record<string, unknown> | undefined;\n const format = (args?.format as 'json' | 'summary') ?? 'json';\n const allowedComponents = Object.values(ctx.data.components).map(\n (component) => component.name,\n );\n\n try {\n const verdict = runSpecGovern(spec as UiSpec, {\n allowedComponents,\n tokenPrefix: ctx.data.tokens?.prefix,\n policy: policyOverrides,\n componentProps: buildComponentProps(ctx),\n });\n\n const text =\n format === 'summary'\n ? formatVerdict(verdict, 'summary')\n : JSON.stringify(verdict);\n\n return {\n content: [{ type: 'text' as const, text }],\n _meta: {\n ...getCatalogMeta(ctx.data),\n verdict: verdict.verdict,\n score: verdict.score,\n passed: verdict.passed,\n violationCount: verdict.results.reduce(\n (sum, r) => sum + r.violations.length,\n 0,\n ),\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const isSpecError =\n message.includes('Expected') || message.includes('Required');\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error: isSpecError\n ? `Invalid spec format: ${message}. Expected: { nodes: [{ id?: string, type: string, props?: object, children?: array|string }], root?: string, metadata?: object }. See the govern.schema MCP resource for examples.`\n : message,\n }),\n },\n ],\n isError: true,\n };\n }\n};\n","import type {\n McpComponent,\n} from '@fragments-sdk/core';\nimport type { ToolHandler } from '../types.js';\nimport { getCatalogMeta } from '../catalog-meta.js';\nimport {\n formatVerdict,\n runSpecGovern,\n type ComponentPropSchema,\n type GovernanceVerdict,\n type UiSpec,\n type UiSpecNode,\n} from './spec-govern.js';\n\ntype ValidateAndFixStatus =\n | 'pass'\n | 'fixed'\n | 'partial_fix'\n | 'fail';\n\ntype ResolutionMode = 'deterministic' | 'elicitation' | 'sampling';\n\ntype NextAction =\n | 'none'\n | 'apply_fixed_spec'\n | 'review_partial_fix'\n | 'resolve_ambiguities'\n | 'revise_input';\n\ntype ComponentSelection =\n | 'preferred'\n | 'allowed'\n | 'discouraged'\n | 'forbidden';\n\ntype Replacement = {\n nodeId: string;\n from: string;\n to: string;\n reason: 'deprecated_component';\n mode: ResolutionMode;\n};\n\ntype RankedCandidate = {\n name: string;\n score: number;\n reasons: string[];\n};\n\ntype AmbiguousReplacement = {\n nodeId: string;\n nodeRef: string;\n from: string;\n candidates: string[];\n rankedCandidates: RankedCandidate[];\n reason: 'ambiguous_preferred_components';\n};\n\ntype WouldFixIfAuthorized =\n | {\n action: 'replace_component';\n nodeId: string;\n from: string;\n to: string;\n reason: 'deprecated_component';\n requiredAuthorization: ['applyFixes'];\n }\n | {\n action: 'resolve_ambiguous_component';\n nodeId: string;\n from: string;\n candidates: string[];\n rankedCandidates: RankedCandidate[];\n reason: 'ambiguous_preferred_components';\n requiredAuthorization: string[];\n };\n\ntype EffectiveComponent = {\n component: McpComponent;\n selection: ComponentSelection;\n isActive: boolean;\n reasons: string[];\n};\n\nfunction classifyComponent(component: McpComponent): ComponentSelection {\n if (component.status === 'deprecated') return 'discouraged';\n if (component.isCanonical && component.tier === 'core') return 'preferred';\n return 'allowed';\n}\n\nfunction buildEffectiveComponents(\n ctx: Parameters<ToolHandler>[1],\n): EffectiveComponent[] {\n const validateFixByKey = new Map(\n (ctx.data.validateFixContext?.components ?? []).map((component) => [\n component.componentKey,\n component,\n ]),\n );\n\n return Object.entries(ctx.data.components).map(([componentKey, component]) => ({\n component,\n selection:\n validateFixByKey.get(componentKey)?.selection ?? classifyComponent(component),\n isActive: validateFixByKey.get(componentKey)?.isActive ?? true,\n reasons: validateFixByKey.get(componentKey)?.reasons ?? [],\n }));\n}\n\nfunction cloneSpec(spec: UiSpec): UiSpec {\n return structuredClone(spec);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction validateNodeShape(\n node: unknown,\n path: string,\n): string | null {\n if (!isPlainObject(node)) {\n return `${path} must be an object`;\n }\n\n if ('id' in node && node.id !== undefined && typeof node.id !== 'string') {\n return `${path}.id must be a string`;\n }\n\n if (\n 'type' in node &&\n node.type !== undefined &&\n typeof node.type !== 'string'\n ) {\n return `${path}.type must be a string`;\n }\n\n if (\n 'props' in node &&\n node.props !== undefined &&\n !isPlainObject(node.props)\n ) {\n return `${path}.props must be an object`;\n }\n\n if ('children' in node && node.children !== undefined) {\n if (typeof node.children === 'string') {\n return null;\n }\n\n if (!Array.isArray(node.children)) {\n return `${path}.children must be an array or string`;\n }\n\n for (const [index, child] of node.children.entries()) {\n if (!isPlainObject(child)) continue;\n const childError = validateNodeShape(\n child,\n `${path}.children[${index}]`,\n );\n if (childError) return childError;\n }\n }\n\n return null;\n}\n\nfunction validateSpecShape(spec: unknown): string | null {\n if (!isPlainObject(spec)) {\n return 'spec must be an object';\n }\n\n if ('root' in spec && spec.root !== undefined && typeof spec.root !== 'string') {\n return 'spec.root must be a string';\n }\n\n if (\n 'metadata' in spec &&\n spec.metadata !== undefined &&\n !isPlainObject(spec.metadata)\n ) {\n return 'spec.metadata must be an object';\n }\n\n if ('nodes' in spec && spec.nodes !== undefined) {\n if (!Array.isArray(spec.nodes)) {\n return 'spec.nodes must be an array';\n }\n\n for (const [index, node] of spec.nodes.entries()) {\n const error = validateNodeShape(node, `spec.nodes[${index}]`);\n if (error) return error;\n }\n }\n\n return null;\n}\n\nfunction getSelectionNames(\n effectiveComponents: EffectiveComponent[],\n selection: ComponentSelection | ComponentSelection[],\n): string[] {\n const selections = Array.isArray(selection) ? selection : [selection];\n return Array.from(\n new Set(\n effectiveComponents\n .filter((entry) => selections.includes(entry.selection))\n .map((entry) => entry.component.name),\n ),\n );\n}\n\nfunction normalizeTokens(value: string): string[] {\n return value\n .toLowerCase()\n .split(/[^a-z0-9]+/g)\n .map((token) => token.trim())\n .filter((token) => token.length >= 3);\n}\n\nfunction buildComponentText(component: McpComponent): string {\n return [\n component.name,\n component.category,\n component.description,\n component.guidance.usageGuidance,\n ...component.guidance.when,\n ...component.guidance.whenNot,\n ...component.guidance.dos,\n ...component.guidance.donts,\n ]\n .filter(Boolean)\n .join(' ');\n}\n\nfunction rankReplacementCandidates(args: {\n source: EffectiveComponent;\n candidates: EffectiveComponent[];\n node: UiSpecNode;\n}): RankedCandidate[] {\n const nodePropKeys = Object.keys(args.node.props ?? {});\n const sourcePropKeys = new Set(Object.keys(args.source.component.props ?? {}));\n const sourceTokens = new Set(normalizeTokens(buildComponentText(args.source.component)));\n\n return args.candidates\n .map((candidate) => {\n let score = 0;\n const reasons: string[] = [];\n const candidatePropKeys = new Set(Object.keys(candidate.component.props ?? {}));\n\n if (candidate.selection === 'preferred') {\n score += 12;\n reasons.push('preferred selection');\n }\n if (candidate.component.isCanonical) {\n score += 6;\n reasons.push('canonical component');\n }\n if (candidate.component.tier === 'core') {\n score += 4;\n reasons.push('core tier');\n }\n if (candidate.isActive) {\n score += 3;\n reasons.push('active component');\n }\n\n const supportedNodeProps = nodePropKeys.filter((key) =>\n candidatePropKeys.has(key),\n );\n if (supportedNodeProps.length > 0) {\n score += supportedNodeProps.length * 5;\n reasons.push(`supports node props: ${supportedNodeProps.join(', ')}`);\n }\n\n const missingNodeProps = nodePropKeys.filter(\n (key) => !candidatePropKeys.has(key),\n );\n if (missingNodeProps.length > 0) {\n score -= missingNodeProps.length * 6;\n reasons.push(`missing node props: ${missingNodeProps.join(', ')}`);\n }\n\n const sharedContractProps = [...sourcePropKeys].filter((key) =>\n candidatePropKeys.has(key),\n );\n if (sharedContractProps.length > 0) {\n score += sharedContractProps.length * 2;\n reasons.push(`shares source props: ${sharedContractProps.join(', ')}`);\n }\n\n const candidateTokens = new Set(\n normalizeTokens(buildComponentText(candidate.component)),\n );\n const tokenOverlap = [...candidateTokens].filter((token) =>\n sourceTokens.has(token),\n );\n if (tokenOverlap.length > 0) {\n score += Math.min(tokenOverlap.length, 4);\n reasons.push(`guidance overlap: ${tokenOverlap.join(', ')}`);\n }\n\n if (\n candidate.component.parentComponentId &&\n candidate.component.parentComponentId === args.source.component.parentComponentId\n ) {\n score += 2;\n reasons.push('matches parent component');\n }\n\n return {\n name: candidate.component.name,\n score,\n reasons,\n };\n })\n .sort((a, b) => b.score - a.score || a.name.localeCompare(b.name));\n}\n\nfunction chooseDeterministicCandidate(\n rankedCandidates: RankedCandidate[],\n): string | null {\n if (rankedCandidates.length === 0) return null;\n if (rankedCandidates.length === 1) return rankedCandidates[0].name;\n\n const [first, second] = rankedCandidates;\n if (first.score <= 0) return null;\n if (first.score - second.score < 4) return null;\n return first.name;\n}\n\nfunction countViolations(verdict: GovernanceVerdict): number {\n return verdict.results.reduce(\n (sum, result) => sum + result.violations.length,\n 0,\n );\n}\n\nfunction getNextAction(\n status: ValidateAndFixStatus,\n replacements: Replacement[],\n unresolvedAmbiguityCount: number,\n): NextAction {\n if (status === 'pass') return 'none';\n if (status === 'fixed') return 'apply_fixed_spec';\n if (status === 'partial_fix') return 'review_partial_fix';\n if (unresolvedAmbiguityCount > 0) return 'resolve_ambiguities';\n if (replacements.length > 0) return 'review_partial_fix';\n return 'revise_input';\n}\n\nfunction authorizationForAmbiguity(args: {\n applyFixes: boolean;\n allowElicitation: boolean;\n allowSampling: boolean;\n supportsElicitation: boolean;\n supportsSampling: boolean;\n}): string[] {\n const required: string[] = [];\n\n if (!args.applyFixes) {\n required.push('applyFixes');\n }\n\n if (!args.allowElicitation) {\n required.push('allowElicitation');\n } else if (!args.supportsElicitation) {\n required.push('clientCapabilities.elicitation.form');\n }\n\n if (!args.allowSampling) {\n required.push('allowSampling');\n } else if (!args.supportsSampling) {\n required.push('clientCapabilities.sampling');\n }\n\n return required;\n}\n\nfunction buildWouldFixIfAuthorized(args: {\n deterministicPreview: Replacement[];\n unresolvedAmbiguities: AmbiguousReplacement[];\n applyFixes: boolean;\n allowElicitation: boolean;\n allowSampling: boolean;\n supportsElicitation: boolean;\n supportsSampling: boolean;\n}): WouldFixIfAuthorized[] {\n const entries: WouldFixIfAuthorized[] = [];\n\n if (!args.applyFixes) {\n entries.push(\n ...args.deterministicPreview.map((replacement) => ({\n action: 'replace_component' as const,\n nodeId: replacement.nodeId,\n from: replacement.from,\n to: replacement.to,\n reason: replacement.reason,\n requiredAuthorization: ['applyFixes'] as ['applyFixes'],\n })),\n );\n }\n\n const requiredAuthorization = authorizationForAmbiguity({\n applyFixes: args.applyFixes,\n allowElicitation: args.allowElicitation,\n allowSampling: args.allowSampling,\n supportsElicitation: args.supportsElicitation,\n supportsSampling: args.supportsSampling,\n });\n\n if (requiredAuthorization.length > 0) {\n entries.push(\n ...args.unresolvedAmbiguities.map((ambiguity) => ({\n action: 'resolve_ambiguous_component' as const,\n nodeId: ambiguity.nodeId,\n from: ambiguity.from,\n candidates: ambiguity.candidates,\n rankedCandidates: ambiguity.rankedCandidates,\n reason: ambiguity.reason,\n requiredAuthorization,\n })),\n );\n }\n\n return entries;\n}\n\nasync function emitValidateAndFixTelemetry(args: {\n ctx: Parameters<ToolHandler>[1];\n status: ValidateAndFixStatus;\n resolutionPath: ResolutionMode[];\n evaluation: Record<string, unknown>;\n attestation: Record<string, unknown>;\n nextAction: NextAction;\n}): Promise<void> {\n if (!args.ctx.mcp?.server) return;\n try {\n await args.ctx.mcp.server.sendLoggingMessage({\n level: 'info',\n data: JSON.stringify({\n tool: 'validate_and_fix',\n status: args.status,\n nextAction: args.nextAction,\n resolutionPath: args.resolutionPath,\n evaluation: args.evaluation,\n attestation: args.attestation,\n }),\n logger: 'fragments-mcp',\n });\n } catch {\n // Best-effort only: client logging support is uneven.\n }\n}\n\nfunction buildAllowedComponents(ctx: Parameters<ToolHandler>[1]): string[] {\n return buildEffectiveComponents(ctx)\n .filter(({ selection }) => selection === 'preferred' || selection === 'allowed')\n .map(({ component }) => component.name);\n}\n\nfunction buildComponentProps(ctx: Parameters<ToolHandler>[1]) {\n return Object.fromEntries(\n Object.values(ctx.data.components).map((component) => [\n component.name,\n component.props as Record<string, ComponentPropSchema | undefined>,\n ]),\n );\n}\n\nfunction runGovern(\n spec: UiSpec,\n ctx: Parameters<ToolHandler>[1],\n policyOverrides?: Record<string, unknown>,\n): GovernanceVerdict {\n return runSpecGovern(spec, {\n allowedComponents: buildAllowedComponents(ctx),\n tokenPrefix: ctx.data.tokens?.prefix,\n policy: policyOverrides,\n componentProps: buildComponentProps(ctx),\n });\n}\n\nfunction walkNodes(\n nodes: unknown[],\n visitor: (node: UiSpecNode, nodeRef: string) => void,\n path = 'nodes',\n): void {\n for (const [index, node] of nodes.entries()) {\n if (!isPlainObject(node)) continue;\n\n const nodeRef = `${path}[${index}]`;\n visitor(node as UiSpecNode, nodeRef);\n\n if (Array.isArray(node.children)) {\n walkNodes(node.children, visitor, `${nodeRef}.children`);\n }\n }\n}\n\nfunction applyDeterministicReplacements(\n spec: UiSpec,\n ctx: Parameters<ToolHandler>[1],\n): {\n fixedSpec: UiSpec;\n replacements: Replacement[];\n ambiguities: AmbiguousReplacement[];\n} {\n const effectiveComponents = buildEffectiveComponents(ctx);\n const byName = new Map<string, EffectiveComponent[]>();\n const preferredByCategory = new Map<string, string[]>();\n\n for (const entry of effectiveComponents) {\n const list = byName.get(entry.component.name) ?? [];\n list.push(entry);\n byName.set(entry.component.name, list);\n\n if (entry.selection !== 'preferred') continue;\n const category = entry.component.category ?? 'uncategorized';\n const names = preferredByCategory.get(category) ?? [];\n if (!names.includes(entry.component.name)) {\n names.push(entry.component.name);\n }\n preferredByCategory.set(category, names);\n }\n\n const fixedSpec = cloneSpec(spec);\n const nodes = Array.isArray(fixedSpec.nodes) ? fixedSpec.nodes : [];\n const replacements: Replacement[] = [];\n const ambiguities: AmbiguousReplacement[] = [];\n\n walkNodes(nodes, (node, nodeRef) => {\n if (!node.type) return;\n const componentEntries = byName.get(node.type) ?? [];\n const component = componentEntries[0];\n if (\n !component ||\n (component.selection !== 'discouraged' &&\n component.selection !== 'forbidden')\n ) {\n return;\n }\n\n const candidateEntries = (\n preferredByCategory.get(component.component.category ?? 'uncategorized') ?? []\n )\n .filter((candidate) => candidate !== component.component.name)\n .map((candidateName) =>\n effectiveComponents.find(\n (entry) => entry.component.name === candidateName,\n ),\n )\n .filter((entry): entry is EffectiveComponent => Boolean(entry));\n const rankedCandidates = rankReplacementCandidates({\n source: component,\n candidates: candidateEntries,\n node,\n });\n const replacement = chooseDeterministicCandidate(rankedCandidates);\n\n if (!replacement) {\n if (rankedCandidates.length > 1) {\n ambiguities.push({\n nodeId: node.id ?? node.type,\n nodeRef,\n from: component.component.name,\n candidates: rankedCandidates.map((candidate) => candidate.name),\n rankedCandidates,\n reason: 'ambiguous_preferred_components',\n });\n }\n return;\n }\n\n replacements.push({\n nodeId: node.id ?? node.type,\n from: component.component.name,\n to: replacement,\n reason: 'deprecated_component',\n mode: 'deterministic',\n });\n node.type = replacement;\n });\n\n return {\n fixedSpec,\n replacements,\n ambiguities,\n };\n}\n\nfunction applyReplacementAtRef(\n spec: UiSpec,\n nodeRef: string,\n replacement: string,\n): boolean {\n const nodes = Array.isArray(spec.nodes) ? spec.nodes : [];\n let applied = false;\n\n walkNodes(nodes, (node, currentRef) => {\n if (applied || currentRef !== nodeRef) return;\n node.type = replacement;\n applied = true;\n });\n\n return applied;\n}\n\nfunction supportsFormElicitation(\n ctx: Parameters<ToolHandler>[1],\n): boolean {\n const capabilities = ctx.mcp?.clientCapabilities?.elicitation;\n if (!capabilities) return false;\n return capabilities.form !== undefined || capabilities.url === undefined;\n}\n\nfunction supportsSampling(\n ctx: Parameters<ToolHandler>[1],\n): boolean {\n return Boolean(ctx.mcp?.clientCapabilities?.sampling);\n}\n\nfunction getSamplingText(\n response: Awaited<ReturnType<NonNullable<Parameters<ToolHandler>[1]['mcp']>['server']['createMessage']>>,\n): string | undefined {\n if (Array.isArray(response.content)) {\n return response.content.find((item) => item.type === 'text')?.text;\n }\n\n return response.content.type === 'text'\n ? response.content.text\n : undefined;\n}\n\nfunction buildComponentGuidanceMap(\n ctx: Parameters<ToolHandler>[1],\n): Map<string, string[]> {\n return new Map(\n Object.values(ctx.data.components).map((component) => {\n const guidance: string[] = [];\n if (component.description) {\n guidance.push(`description: ${component.description}`);\n }\n if (component.guidance.usageGuidance) {\n guidance.push(`usage: ${component.guidance.usageGuidance}`);\n }\n if (component.guidance.dos.length > 0) {\n guidance.push(`dos: ${component.guidance.dos.join('; ')}`);\n }\n if (component.guidance.donts.length > 0) {\n guidance.push(`donts: ${component.guidance.donts.join('; ')}`);\n }\n return [component.name, guidance];\n }),\n );\n}\n\nfunction buildAmbiguityGuidanceLines(\n candidates: string[],\n guidanceByName: Map<string, string[]>,\n): string[] {\n return candidates.map((candidate) => {\n const guidance = guidanceByName.get(candidate) ?? [];\n return guidance.length > 0\n ? `${candidate}: ${guidance.join(' | ')}`\n : `${candidate}: no additional guidance available`;\n });\n}\n\nasync function resolveAmbiguitiesWithElicitation(\n ambiguities: AmbiguousReplacement[],\n spec: UiSpec,\n ctx: Parameters<ToolHandler>[1],\n): Promise<Replacement[]> {\n if (!ctx.mcp?.server || ambiguities.length === 0) return [];\n\n const replacements: Replacement[] = [];\n const guidanceByName = buildComponentGuidanceMap(ctx);\n\n for (const ambiguity of ambiguities) {\n const guidanceLines = buildAmbiguityGuidanceLines(\n ambiguity.candidates,\n guidanceByName,\n );\n const result = await ctx.mcp.server.elicitInput({\n mode: 'form',\n message: [\n `Fragments found multiple safe replacements for ${ambiguity.from} on node ${ambiguity.nodeId}.`,\n 'Choose the best replacement, or skip this change.',\n 'Candidate guidance:',\n ...guidanceLines,\n ].join('\\n'),\n requestedSchema: {\n type: 'object',\n properties: {\n replacement: {\n type: 'string',\n title: 'Replacement',\n description: [\n 'Select the best replacement for this node.',\n ...guidanceLines,\n 'Choose Skip to leave this component unchanged.',\n ].join('\\n'),\n oneOf: [\n ...ambiguity.candidates.map((candidate) => ({\n const: candidate,\n title: candidate,\n })),\n {\n const: '__skip__',\n title: 'Skip',\n },\n ],\n default: '__skip__',\n },\n },\n required: ['replacement'],\n },\n });\n\n if (\n result.action !== 'accept' ||\n !result.content ||\n typeof result.content.replacement !== 'string' ||\n result.content.replacement === '__skip__'\n ) {\n continue;\n }\n\n if (!ambiguity.candidates.includes(result.content.replacement)) {\n continue;\n }\n\n if (!applyReplacementAtRef(spec, ambiguity.nodeRef, result.content.replacement)) {\n continue;\n }\n\n replacements.push({\n nodeId: ambiguity.nodeId,\n from: ambiguity.from,\n to: result.content.replacement,\n reason: 'deprecated_component',\n mode: 'elicitation',\n });\n }\n\n return replacements;\n}\n\nasync function resolveAmbiguitiesWithSampling(\n ambiguities: AmbiguousReplacement[],\n spec: UiSpec,\n ctx: Parameters<ToolHandler>[1],\n): Promise<Replacement[]> {\n if (!ctx.mcp?.server || ambiguities.length === 0) return [];\n const guidanceByName = buildComponentGuidanceMap(ctx);\n\n const prompt = [\n 'You are choosing design-system component replacements.',\n 'Return strict JSON only in the form {\"choices\":[{\"nodeId\":\"...\",\"replacement\":\"...|__skip__\"}]}.',\n 'Only choose from the provided candidates.',\n 'Prefer the option whose guidance best matches the original component intent.',\n JSON.stringify(\n {\n ambiguities: ambiguities.map((ambiguity) => ({\n nodeId: ambiguity.nodeId,\n from: ambiguity.from,\n candidates: ambiguity.candidates.map((candidate) => ({\n name: candidate,\n guidance: guidanceByName.get(candidate) ?? [],\n })),\n })),\n },\n null,\n 2,\n ),\n ].join('\\n\\n');\n\n const response = await ctx.mcp.server.createMessage({\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: prompt,\n },\n },\n ],\n maxTokens: 600,\n });\n\n const text = getSamplingText(response);\n if (!text) return [];\n\n let parsed: {\n choices?: Array<{ nodeId?: string; replacement?: string }>;\n };\n try {\n parsed = JSON.parse(text) as {\n choices?: Array<{ nodeId?: string; replacement?: string }>;\n };\n } catch {\n return [];\n }\n\n const replacements: Replacement[] = [];\n\n for (const choice of parsed.choices ?? []) {\n if (\n !choice.nodeId ||\n !choice.replacement ||\n choice.replacement === '__skip__'\n ) {\n continue;\n }\n\n const ambiguity = ambiguities.find((entry) => entry.nodeId === choice.nodeId);\n if (!ambiguity || !ambiguity.candidates.includes(choice.replacement)) {\n continue;\n }\n\n if (!applyReplacementAtRef(spec, ambiguity.nodeRef, choice.replacement)) {\n continue;\n }\n\n replacements.push({\n nodeId: ambiguity.nodeId,\n from: ambiguity.from,\n to: choice.replacement,\n reason: 'deprecated_component',\n mode: 'sampling',\n });\n }\n\n return replacements;\n}\n\nfunction buildSummary(args: {\n status: ValidateAndFixStatus;\n originalVerdict: GovernanceVerdict;\n finalVerdict: GovernanceVerdict;\n replacements: Replacement[];\n}): string {\n const lines = [\n `status: ${args.status}`,\n `original: ${formatVerdict(args.originalVerdict, 'summary')}`,\n ];\n\n if (args.replacements.length > 0) {\n lines.push(\n `replacements: ${args.replacements.map((item) => `${item.from} -> ${item.to}`).join(', ')}`,\n );\n lines.push(`final: ${formatVerdict(args.finalVerdict, 'summary')}`);\n }\n\n return lines.join('\\n');\n}\n\nexport const validateAndFixHandler: ToolHandler = async (args, ctx) => {\n const spec = args?.spec;\n if (!spec || typeof spec !== 'object') {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error:\n 'spec is required and must be an object with { nodes: [{ id, type, props, children }] }',\n }),\n },\n ],\n isError: true,\n };\n }\n\n const specError = validateSpecShape(spec);\n if (specError) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error:\n `Invalid spec format: ${specError}. Expected: { nodes: [{ id?: string, type?: string, props?: object, children?: object[] }] }`,\n }),\n },\n ],\n isError: true,\n };\n }\n\n const policyOverrides = args?.policy as Record<string, unknown> | undefined;\n const applyFixes = args?.applyFixes !== false;\n const allowElicitation = args?.allowElicitation !== false;\n const allowSampling = args?.allowSampling !== false;\n const format = (args?.format as 'json' | 'summary') ?? 'json';\n const startedAt = Date.now();\n\n try {\n const effectiveComponents = buildEffectiveComponents(ctx);\n const originalVerdict = await runGovern(spec as UiSpec, ctx, policyOverrides);\n let finalVerdict = originalVerdict;\n let workingSpec: UiSpec | undefined;\n let fixedSpec: UiSpec | undefined;\n let replacements: Replacement[] = [];\n let ambiguities: AmbiguousReplacement[] = [];\n const resolutionPath: ResolutionMode[] = [];\n const supportsElicitation = supportsFormElicitation(ctx);\n const supportsModelSampling = supportsSampling(ctx);\n const preview =\n !originalVerdict.passed\n ? applyDeterministicReplacements(spec as UiSpec, ctx)\n : undefined;\n if (!applyFixes && preview) {\n ambiguities = preview.ambiguities;\n }\n\n if (!originalVerdict.passed && applyFixes) {\n const result = preview ?? applyDeterministicReplacements(spec as UiSpec, ctx);\n replacements = result.replacements;\n ambiguities = result.ambiguities;\n\n if (replacements.length > 0) {\n workingSpec = result.fixedSpec;\n resolutionPath.push('deterministic');\n }\n\n const unresolvedAmbiguities = ambiguities.filter(\n (ambiguity) =>\n !replacements.some((replacement) => replacement.nodeId === ambiguity.nodeId),\n );\n\n if (\n unresolvedAmbiguities.length > 0 &&\n allowElicitation &&\n supportsElicitation\n ) {\n workingSpec ??= cloneSpec(spec as UiSpec);\n const elicitedReplacements = await resolveAmbiguitiesWithElicitation(\n unresolvedAmbiguities,\n workingSpec,\n ctx,\n );\n if (elicitedReplacements.length > 0) {\n resolutionPath.push('elicitation');\n }\n replacements.push(...elicitedReplacements);\n }\n\n const remainingAmbiguities = ambiguities.filter(\n (ambiguity) =>\n !replacements.some((replacement) => replacement.nodeId === ambiguity.nodeId),\n );\n\n if (\n remainingAmbiguities.length > 0 &&\n allowSampling &&\n supportsModelSampling\n ) {\n workingSpec ??= cloneSpec(spec as UiSpec);\n const sampledReplacements = await resolveAmbiguitiesWithSampling(\n remainingAmbiguities,\n workingSpec,\n ctx,\n );\n if (sampledReplacements.length > 0) {\n resolutionPath.push('sampling');\n }\n replacements.push(...sampledReplacements);\n }\n\n fixedSpec = replacements.length > 0 ? workingSpec : undefined;\n\n if (fixedSpec) {\n finalVerdict = await runGovern(fixedSpec, ctx, policyOverrides);\n }\n }\n\n const status: ValidateAndFixStatus =\n originalVerdict.passed\n ? 'pass'\n : replacements.length > 0\n ? finalVerdict.passed\n ? 'fixed'\n : 'partial_fix'\n : 'fail';\n\n const unresolvedAmbiguities = ambiguities\n .filter(\n (ambiguity) =>\n !replacements.some((replacement) => replacement.nodeId === ambiguity.nodeId),\n )\n .map(({ nodeRef: _nodeRef, ...ambiguity }) => ambiguity);\n const unresolvedAmbiguitiesWithRefs = ambiguities.filter(\n (ambiguity) =>\n !replacements.some((replacement) => replacement.nodeId === ambiguity.nodeId),\n );\n const wouldFixIfAuthorized = buildWouldFixIfAuthorized({\n deterministicPreview: preview?.replacements ?? [],\n unresolvedAmbiguities: unresolvedAmbiguitiesWithRefs,\n applyFixes,\n allowElicitation,\n allowSampling,\n supportsElicitation,\n supportsSampling: supportsModelSampling,\n });\n const attestation = {\n sourceType: ctx.data.snapshot.sourceType,\n sourceLabel: ctx.data.snapshot.sourceLabel,\n designSystemName: ctx.data.snapshot.metadata.designSystemName,\n packageName: ctx.data.snapshot.metadata.packageName,\n importPath: ctx.data.snapshot.metadata.importPath,\n catalogRevision:\n ctx.data.validateFixContext?.catalogRevision ??\n ctx.data.snapshot.metadata.revision,\n catalogUpdatedAt:\n ctx.data.validateFixContext?.updatedAt ??\n ctx.data.snapshot.metadata.updatedAt,\n policy: {\n mode: ctx.data.validateFixContext?.policy.mode ?? 'embedded',\n endpoint: ctx.data.validateFixContext?.policy.endpoint,\n overrideApplied: Boolean(policyOverrides),\n },\n clientCapabilities: {\n sampling: supportsModelSampling,\n samplingTools: Boolean(ctx.mcp?.clientCapabilities?.sampling?.tools),\n elicitationForm: supportsElicitation,\n roots: Boolean(ctx.mcp?.clientCapabilities?.roots),\n },\n capabilitiesUsed: {\n deterministic: replacements.some((replacement) => replacement.mode === 'deterministic'),\n elicitation: replacements.some((replacement) => replacement.mode === 'elicitation'),\n sampling: replacements.some((replacement) => replacement.mode === 'sampling'),\n },\n };\n const evaluation = {\n durationMs: Date.now() - startedAt,\n originalViolationCount: countViolations(originalVerdict),\n finalViolationCount: countViolations(finalVerdict),\n originalPassed: originalVerdict.passed,\n finalPassed: finalVerdict.passed,\n replacementCount: replacements.length,\n replacementsByMode: {\n deterministic: replacements.filter((replacement) => replacement.mode === 'deterministic').length,\n elicitation: replacements.filter((replacement) => replacement.mode === 'elicitation').length,\n sampling: replacements.filter((replacement) => replacement.mode === 'sampling').length,\n },\n ambiguityCount: ambiguities.length,\n unresolvedAmbiguityCount: unresolvedAmbiguities.length,\n candidateRankingUsed: true,\n };\n const nextAction = getNextAction(\n status,\n replacements,\n unresolvedAmbiguities.length,\n );\n const catalogMeta = getCatalogMeta(ctx.data);\n\n const payload = {\n status,\n nextAction,\n applyFixes,\n allowElicitation,\n allowSampling,\n resolutionPath,\n replacements,\n originalVerdict,\n finalVerdict,\n ...(fixedSpec ? { fixedSpec } : {}),\n attestation,\n evaluation,\n preferredComponents: getSelectionNames(\n effectiveComponents,\n 'preferred',\n ),\n discouragedComponents: getSelectionNames(\n effectiveComponents,\n 'discouraged',\n ),\n forbiddenComponents: getSelectionNames(\n effectiveComponents,\n 'forbidden',\n ),\n unresolvedAmbiguities,\n wouldFixIfAuthorized,\n };\n\n await emitValidateAndFixTelemetry({\n ctx,\n status,\n resolutionPath,\n evaluation,\n attestation,\n nextAction,\n });\n\n return {\n content: [\n {\n type: 'text' as const,\n text:\n format === 'summary'\n ? buildSummary({\n status,\n originalVerdict,\n finalVerdict,\n replacements,\n })\n : JSON.stringify(payload),\n },\n ],\n _meta: {\n ...catalogMeta,\n status,\n nextAction,\n replacementCount: replacements.length,\n passed: finalVerdict.passed,\n unresolvedAmbiguityCount: unresolvedAmbiguities.length,\n wouldFixIfAuthorizedCount: wouldFixIfAuthorized.length,\n resolutionPath,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error: message,\n }),\n },\n ],\n isError: true,\n };\n }\n};\n","/**\n * Shared HTTP plumbing for tools that talk to Fragments Cloud\n * (findings-service, canonical-mappings-service, and any future siblings).\n */\n\nconst DEFAULT_CLOUD_URL = 'https://app.usefragments.com';\n\nexport function normalizeCloudUrl(url?: string): string {\n if (!url) return DEFAULT_CLOUD_URL;\n return url.replace(/\\/+$/, '');\n}\n\nexport async function cloudFetchJson<T>(args: {\n apiKey: string;\n cloudUrl?: string;\n path: string;\n resource: string;\n query?: Record<string, string | number | undefined>;\n}): Promise<T> {\n const base = normalizeCloudUrl(args.cloudUrl);\n const url = new URL(`${base}${args.path}`);\n if (args.query) {\n for (const [key, value] of Object.entries(args.query)) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n }\n\n const response = await fetch(url.toString(), {\n headers: { 'X-API-Key': args.apiKey },\n });\n\n if (!response.ok) {\n const body = await response.text();\n let message: string;\n try {\n const parsed = JSON.parse(body) as { error?: string };\n message = parsed.error ?? body;\n } catch {\n message = body;\n }\n throw new Error(\n `Cloud ${args.resource} API error (${response.status}): ${message}`,\n );\n }\n\n return (await response.json()) as T;\n}\n","/**\n * HTTP client for the Fragments Cloud findings API.\n *\n * Follows the same pattern as the Cloud catalog adapter: authenticates via\n * X-API-Key header against the Cloud `/api/findings` endpoint.\n */\nimport { cloudFetchJson } from './cloud-http.js';\n\nexport interface Finding {\n ruleId: string;\n severity: 'error' | 'warning' | 'info';\n filePath?: string;\n line?: number;\n column?: number;\n message: string;\n category?: string;\n status: 'open' | 'resolved' | 'ignored';\n prop?: string;\n rawValue?: string;\n suggestedToken?: string;\n suggestedTokenDetails?: {\n name: string;\n cssVar?: string;\n cssValue?: string;\n resolvedValue?: string;\n confidence: 'high' | 'medium' | 'low';\n reason: string;\n };\n repoFullName?: string;\n commitSha?: string;\n branch?: string;\n prNumber?: number;\n sourceUrl?: string;\n fingerprint: string;\n}\n\nexport interface FindingsListParams {\n status?: 'open' | 'resolved' | 'ignored';\n severity?: 'error' | 'warning' | 'info';\n category?: string;\n ruleId?: string;\n filePath?: string;\n limit?: number;\n}\n\nexport interface FindingsResponse {\n findings: Finding[];\n}\n\nexport interface FindingsSummaryParams extends FindingsListParams {}\n\nexport interface FindingsSummaryResponse {\n total: number;\n filters: Omit<FindingsSummaryParams, 'limit'>;\n bySeverity: Record<'error' | 'warning' | 'info', number>;\n byStatus: Record<'open' | 'resolved' | 'ignored', number>;\n byCategory: Record<string, number>;\n byRuleId: Record<string, number>;\n byFilePath: Record<string, number>;\n topFiles: Array<{ filePath: string; count: number }>;\n topRules: Array<{ ruleId: string; count: number }>;\n}\n\nexport async function fetchFindings(\n apiKey: string,\n params: FindingsListParams,\n cloudUrl?: string,\n): Promise<FindingsResponse> {\n return cloudFetchJson<FindingsResponse>({\n apiKey,\n cloudUrl,\n path: '/api/findings',\n resource: 'findings',\n query: {\n status: params.status,\n severity: params.severity,\n category: params.category,\n ruleId: params.ruleId,\n filePath: params.filePath,\n limit: params.limit,\n },\n });\n}\n\nexport async function fetchFindingsForFile(\n apiKey: string,\n filePath: string,\n cloudUrl?: string,\n): Promise<FindingsResponse> {\n return fetchFindings(\n apiKey,\n { status: 'open', filePath, limit: 200 },\n cloudUrl,\n );\n}\n\nexport function buildFindingSourceUrl(\n finding: Pick<Finding, 'repoFullName' | 'commitSha' | 'filePath' | 'line'>,\n): string | undefined {\n const { repoFullName, commitSha, filePath, line } = finding;\n if (!repoFullName || !commitSha || !filePath) return undefined;\n if (!/^[-\\w.]+\\/[-\\w.]+$/.test(repoFullName)) return undefined;\n if (!/^[a-fA-F0-9]{7,64}$/.test(commitSha)) return undefined;\n\n const normalizedPath = filePath.replace(/^\\/+/, '');\n if (!normalizedPath) return undefined;\n\n const encodedPath = normalizedPath\n .split('/')\n .map((segment) => encodeURIComponent(segment))\n .join('/');\n const lineSuffix = line != null && line > 0 ? `#L${Math.floor(line)}` : '';\n\n return `https://github.com/${repoFullName}/blob/${commitSha}/${encodedPath}${lineSuffix}`;\n}\n\nexport async function fetchFindingsSummary(\n apiKey: string,\n params: FindingsSummaryParams,\n cloudUrl?: string,\n): Promise<FindingsSummaryResponse> {\n const { findings } = await fetchFindings(\n apiKey,\n { ...params, limit: params.limit ?? 200 },\n cloudUrl,\n );\n return summarizeFindings(findings, params);\n}\n\nfunction summarizeFindings(\n findings: Finding[],\n params: FindingsSummaryParams,\n): FindingsSummaryResponse {\n const bySeverity = { error: 0, warning: 0, info: 0 };\n const byStatus = { open: 0, resolved: 0, ignored: 0 };\n const byCategory: Record<string, number> = {};\n const byRuleId: Record<string, number> = {};\n const byFilePath: Record<string, number> = {};\n\n for (const finding of findings) {\n bySeverity[finding.severity] += 1;\n byStatus[finding.status] += 1;\n increment(byRuleId, finding.ruleId);\n if (finding.category) increment(byCategory, finding.category);\n if (finding.filePath) increment(byFilePath, finding.filePath);\n }\n\n const { limit: _limit, ...filters } = params;\n return {\n total: findings.length,\n filters,\n bySeverity,\n byStatus,\n byCategory,\n byRuleId,\n byFilePath,\n topFiles: topEntries(byFilePath, 'filePath'),\n topRules: topEntries(byRuleId, 'ruleId'),\n };\n}\n\nfunction increment(counts: Record<string, number>, key: string): void {\n counts[key] = (counts[key] ?? 0) + 1;\n}\n\nfunction topEntries<T extends 'filePath' | 'ruleId'>(\n counts: Record<string, number>,\n keyName: T,\n): Array<Record<T, string> & { count: number }> {\n return Object.entries(counts)\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 10)\n .map(([key, count]) => ({ [keyName]: key, count }) as Record<T, string> & { count: number });\n}\n","/**\n * Shared API-key + cloud-URL resolution for Cloud-backed MCP tools\n * (findings, swap_to_canonical, and any future siblings).\n *\n * Resolution precedence (matches `init` flow + flag wiring):\n * 1. `--cloud-api-key` flag → `ctx.config.cloudApiKey`\n * 2. `cloud.apiKey` in ds-mcp.config.json → `ctx.config.fileConfig`\n * 3. `FRAGMENTS_API_KEY` env var\n */\nimport type { ToolContext, ToolResult } from '../types.js';\n\nexport function resolveCloudApiKey(ctx: ToolContext): string | undefined {\n return (\n ctx.config.cloudApiKey ??\n ctx.config.fileConfig?.cloud?.apiKey ??\n process.env.FRAGMENTS_API_KEY\n );\n}\n\nexport function resolveCloudUrl(ctx: ToolContext): string | undefined {\n return ctx.config.fileConfig?.cloud?.url ?? process.env.FRAGMENTS_CLOUD_URL;\n}\n\nexport function missingKeyError(): ToolResult {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error:\n 'Cloud API key required. Set FRAGMENTS_API_KEY env var, pass --cloud-api-key, or configure cloud.apiKey in ds-mcp.config.json.',\n }),\n },\n ],\n isError: true,\n };\n}\n","import type { ToolHandler } from '../types.js';\nimport {\n buildFindingSourceUrl,\n fetchFindings,\n fetchFindingsForFile,\n fetchFindingsSummary,\n type Finding,\n type FindingsListParams,\n type FindingsSummaryParams,\n} from '../findings-service.js';\nimport type { ToolContext } from '../types.js';\nimport { getCatalogMeta } from '../catalog-meta.js';\nimport { suggestToken } from '../token-suggestions.js';\nimport {\n missingKeyError,\n resolveCloudApiKey,\n resolveCloudUrl,\n} from './cloud-auth.js';\n\nfunction enrichFindings(findings: Finding[], ctx: ToolContext): Finding[] {\n return findings.map((finding) => {\n const sourceUrl = finding.sourceUrl ?? buildFindingSourceUrl(finding);\n const withSourceUrl = sourceUrl ? { ...finding, sourceUrl } : finding;\n\n if (!finding.prop || !finding.rawValue || !ctx.data.tokens) {\n return withSourceUrl;\n }\n\n const catalogMeta = getCatalogMeta(ctx.data);\n const suggestion = suggestToken({\n tokens: ctx.data.tokens,\n property: finding.prop,\n value: finding.rawValue,\n catalogRevision: catalogMeta.catalogRevision,\n updatedAt: catalogMeta.updatedAt,\n });\n\n if (!suggestion.recommended) {\n const {\n suggestedToken: _discarded,\n suggestedTokenDetails: _details,\n ...rest\n } = withSourceUrl;\n return rest;\n }\n\n return {\n ...withSourceUrl,\n suggestedToken:\n suggestion.recommended.cssVar ?? suggestion.recommended.name,\n suggestedTokenDetails: suggestion.recommended,\n };\n });\n}\n\nexport const findingsListHandler: ToolHandler = async (args, ctx) => {\n const apiKey = resolveCloudApiKey(ctx);\n if (!apiKey) return missingKeyError();\n\n const cloudUrl = resolveCloudUrl(ctx);\n const params: FindingsListParams = {};\n\n if (args.status) params.status = args.status as FindingsListParams['status'];\n if (args.severity)\n params.severity = args.severity as FindingsListParams['severity'];\n if (args.category) params.category = String(args.category);\n if (args.ruleId) params.ruleId = String(args.ruleId);\n if (args.filePath) params.filePath = String(args.filePath);\n if (args.limit != null) params.limit = Number(args.limit);\n\n try {\n const result = await fetchFindings(apiKey, params, cloudUrl);\n const findings = enrichFindings(result.findings, ctx);\n const catalogMeta = getCatalogMeta(ctx.data);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ ...result, findings }),\n },\n ],\n _meta: {\n ...catalogMeta,\n count: findings.length,\n tokenSuggestionCount: findings.filter(\n (finding) => finding.suggestedTokenDetails,\n ).length,\n },\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n }),\n },\n ],\n isError: true,\n };\n }\n};\n\nexport const findingsSummaryHandler: ToolHandler = async (args, ctx) => {\n const apiKey = resolveCloudApiKey(ctx);\n if (!apiKey) return missingKeyError();\n\n const cloudUrl = resolveCloudUrl(ctx);\n const params: FindingsSummaryParams = {};\n\n if (args.status) params.status = args.status as FindingsSummaryParams['status'];\n if (args.severity)\n params.severity = args.severity as FindingsSummaryParams['severity'];\n if (args.category) params.category = String(args.category);\n if (args.ruleId) params.ruleId = String(args.ruleId);\n if (args.filePath) params.filePath = String(args.filePath);\n if (args.limit != null) params.limit = Number(args.limit);\n\n try {\n const summary = await fetchFindingsSummary(apiKey, params, cloudUrl);\n const catalogMeta = getCatalogMeta(ctx.data);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(summary),\n },\n ],\n _meta: {\n ...catalogMeta,\n total: summary.total,\n topFileCount: summary.topFiles.length,\n topRuleCount: summary.topRules.length,\n },\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n }),\n },\n ],\n isError: true,\n };\n }\n};\n\nexport const findingsForFileHandler: ToolHandler = async (args, ctx) => {\n const apiKey = resolveCloudApiKey(ctx);\n if (!apiKey) return missingKeyError();\n\n const filePath = args.filePath;\n if (!filePath || typeof filePath !== 'string') {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: 'filePath is required.' }),\n },\n ],\n isError: true,\n };\n }\n\n const cloudUrl = resolveCloudUrl(ctx);\n\n try {\n const result = await fetchFindingsForFile(apiKey, filePath, cloudUrl);\n const findings = enrichFindings(\n result.findings.filter((f) => f.filePath === filePath),\n ctx,\n );\n const catalogMeta = getCatalogMeta(ctx.data);\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ findings, filePath }),\n },\n ],\n _meta: {\n ...catalogMeta,\n count: findings.length,\n filePath,\n tokenSuggestionCount: findings.filter(\n (finding) => finding.suggestedTokenDetails,\n ).length,\n },\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n }),\n },\n ],\n isError: true,\n };\n }\n};\n","/**\n * `swap_to_canonical` — given the user's currently-open file, return swap\n * suggestions for raw HTML elements that have a canonical primitive in the\n * project's map (auto/overridden bands only).\n *\n * Spec: `apps/cloud/docs/canonical-primitive-map/01-architecture.md` §16.1.\n */\nimport * as ts from 'typescript';\nimport {\n resolveCanonicalForHtmlElement,\n formatRawHtmlElement,\n} from '@fragments-sdk/classifier';\nimport type { ToolHandler } from '../types.js';\nimport {\n fetchCanonicalMappings,\n type CanonicalMapping,\n} from '../canonical-mappings-service.js';\nimport {\n missingKeyError,\n resolveCloudApiKey,\n resolveCloudUrl,\n} from './cloud-auth.js';\n\ninterface SwapPropMapping {\n rawProp: string;\n canonicalProp: string;\n transform?: string;\n}\n\ninterface SwapAlternate {\n name: string;\n importPath: string;\n confidence: number;\n}\n\ninterface SwapSuggestion {\n rawElement: string;\n canonical: string;\n componentName: string;\n importPath: string;\n propMapping: SwapPropMapping[];\n line: number;\n alternates?: SwapAlternate[];\n}\n\ninterface ParsedJsxElement {\n tagName: string;\n attrs: Map<string, { value: string; dynamic: boolean }>;\n line: number;\n}\n\nfunction errorResult(message: string) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: message }),\n },\n ],\n isError: true as const,\n };\n}\n\n// Re-export so existing callers / tests keep working.\nexport const resolveCanonicalForElement = resolveCanonicalForHtmlElement;\n\nexport function walkRawJsxElements(source: ts.SourceFile): ParsedJsxElement[] {\n const results: ParsedJsxElement[] = [];\n\n const visit = (node: ts.Node) => {\n let opening: ts.JsxOpeningLikeElement | undefined;\n if (ts.isJsxSelfClosingElement(node)) {\n opening = node;\n } else if (ts.isJsxElement(node)) {\n opening = node.openingElement;\n }\n\n if (opening) {\n const tagNameNode = opening.tagName;\n if (ts.isIdentifier(tagNameNode)) {\n const tagName = tagNameNode.text;\n // Lowercase first char = raw HTML; uppercase = component reference.\n if (/^[a-z]/.test(tagName)) {\n const attrs = new Map<string, { value: string; dynamic: boolean }>();\n for (const attr of opening.attributes.properties) {\n if (!ts.isJsxAttribute(attr)) continue;\n if (!attr.name || !ts.isIdentifier(attr.name)) continue;\n const name = attr.name.text;\n if (!attr.initializer) {\n attrs.set(name, { value: '', dynamic: false });\n continue;\n }\n if (ts.isStringLiteral(attr.initializer)) {\n attrs.set(name, {\n value: attr.initializer.text,\n dynamic: false,\n });\n } else if (ts.isJsxExpression(attr.initializer)) {\n attrs.set(name, { value: '', dynamic: true });\n }\n }\n const start = opening.getStart(source);\n const { line } = source.getLineAndCharacterOfPosition(start);\n results.push({ tagName, attrs, line: line + 1 });\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n\n visit(source);\n return results;\n}\n\nconst formatRawElement = formatRawHtmlElement;\n\nfunction buildPropMapping(\n attrs: Map<string, { value: string; dynamic: boolean }>,\n rowMapping: SwapPropMapping[],\n): SwapPropMapping[] {\n const transforms = new Map<string, SwapPropMapping>(\n rowMapping.map((m) => [m.rawProp, m]),\n );\n const mapping: SwapPropMapping[] = [];\n for (const rawProp of attrs.keys()) {\n // `type` is a resolver discriminator, not a prop to map.\n if (rawProp === 'type') continue;\n mapping.push(\n transforms.get(rawProp) ?? { rawProp, canonicalProp: rawProp },\n );\n }\n return mapping;\n}\n\nfunction groupMappingsByCanonical(\n mappings: CanonicalMapping[],\n): Map<string, CanonicalMapping[]> {\n const out = new Map<string, CanonicalMapping[]>();\n for (const m of mappings) {\n if (!m.importPath) continue;\n const list = out.get(m.canonical) ?? [];\n list.push(m);\n out.set(m.canonical, list);\n }\n for (const list of out.values()) {\n list.sort((a, b) => {\n const ac = a.confidence ?? 0;\n const bc = b.confidence ?? 0;\n if (ac !== bc) return bc - ac;\n return a.name.localeCompare(b.name);\n });\n }\n return out;\n}\n\nexport function buildSwapSuggestions(args: {\n filePath: string;\n fileContent: string;\n mappings: CanonicalMapping[];\n}): SwapSuggestion[] {\n const eligible = args.mappings.filter(\n (m) =>\n m.canonicalConfidence === 'auto' ||\n m.canonicalConfidence === 'overridden',\n );\n if (eligible.length === 0) return [];\n\n const byCanonical = groupMappingsByCanonical(eligible);\n if (byCanonical.size === 0) return [];\n\n const source = ts.createSourceFile(\n args.filePath,\n args.fileContent,\n ts.ScriptTarget.Latest,\n /* setParentNodes */ true,\n ts.ScriptKind.TSX,\n );\n\n const elements = walkRawJsxElements(source);\n const suggestions: SwapSuggestion[] = [];\n\n for (const el of elements) {\n const canonical = resolveCanonicalForElement(el.tagName, el.attrs);\n if (!canonical) continue;\n const candidates = byCanonical.get(canonical);\n if (!candidates || candidates.length === 0) continue;\n\n const primary = candidates[0];\n const importPath = primary.importPath;\n if (!importPath) continue;\n\n const suggestion: SwapSuggestion = {\n rawElement: formatRawElement(el.tagName, el.attrs),\n canonical,\n componentName: primary.name,\n importPath,\n propMapping: buildPropMapping(el.attrs, primary.propMapping),\n line: el.line,\n };\n\n if (candidates.length > 1) {\n suggestion.alternates = candidates\n .slice(1)\n .filter((c) => c.importPath)\n .map((c) => ({\n name: c.name,\n importPath: c.importPath!,\n confidence: c.confidence ?? 0,\n }));\n }\n\n suggestions.push(suggestion);\n }\n\n return suggestions;\n}\n\nexport const swapToCanonicalHandler: ToolHandler = async (args, ctx) => {\n const apiKey = resolveCloudApiKey(ctx);\n if (!apiKey) return missingKeyError();\n\n const filePath = typeof args.filePath === 'string' ? args.filePath : '';\n const fileContent =\n typeof args.fileContent === 'string' ? args.fileContent : '';\n if (!filePath || !fileContent) {\n return errorResult('filePath and fileContent are required.');\n }\n\n const cloudUrl = resolveCloudUrl(ctx);\n let mappings: CanonicalMapping[];\n try {\n mappings = await fetchCanonicalMappings(apiKey, cloudUrl);\n } catch (error) {\n return errorResult(error instanceof Error ? error.message : String(error));\n }\n\n const suggestions = buildSwapSuggestions({\n filePath,\n fileContent,\n mappings,\n });\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ suggestions, filePath }),\n },\n ],\n _meta: {\n count: suggestions.length,\n mappingCount: mappings.length,\n filePath,\n },\n };\n};\n","/**\n * Reads `canonicalMappings` from `/api/catalog` (per spec §16.6).\n * Strict band filter (auto/overridden only) is enforced server-side.\n */\nimport { cloudFetchJson } from './cloud-http.js';\n\nexport interface CanonicalMapping {\n componentId: string;\n componentKey: string;\n name: string;\n canonical: string;\n canonicalConfidence: 'auto' | 'overridden';\n htmlEquivalent?: string;\n importPath?: string | null;\n propMapping: Array<{\n rawProp: string;\n canonicalProp: string;\n transform?: string;\n }>;\n confidence?: number;\n}\n\ninterface CatalogShape {\n canonicalMappings?: CanonicalMapping[];\n}\n\nexport async function fetchCanonicalMappings(\n apiKey: string,\n cloudUrl?: string,\n): Promise<CanonicalMapping[]> {\n const catalog = await cloudFetchJson<CatalogShape>({\n apiKey,\n cloudUrl,\n path: '/api/catalog',\n resource: 'catalog',\n });\n return catalog.canonicalMappings ?? [];\n}\n","import type { ToolHandler } from '../types.js';\nimport type { McpCapability } from '@fragments-sdk/core';\nimport { tokensSuggestHandler } from './tokens-suggest.js';\nimport { governHandler } from './govern.js';\nimport { validateAndFixHandler } from './validate-and-fix.js';\nimport {\n findingsListHandler,\n findingsSummaryHandler,\n findingsForFileHandler,\n} from './findings.js';\nimport { swapToCanonicalHandler } from './swap-to-canonical.js';\n\n/** Public validator tools. */\nexport const CORE_TOOLS: Record<string, ToolHandler> = {\n 'tokens.suggest': tokensSuggestHandler,\n govern: governHandler,\n validate_and_fix: validateAndFixHandler,\n findings_list: findingsListHandler,\n findings_summary: findingsSummaryHandler,\n findings_for_file: findingsForFileHandler,\n swap_to_canonical: swapToCanonicalHandler,\n};\n\n/** Viewer tools were hard-deleted from the MCP public surface. */\nexport const VIEWER_TOOLS: Record<string, ToolHandler> = {};\n\n/** Infrastructure tools were hard-deleted from the MCP public surface. */\nexport const INFRA_TOOLS: Record<string, ToolHandler> = {};\n\n/** All built-in tools */\nexport const BUILTIN_TOOLS: Record<string, ToolHandler> = {\n ...CORE_TOOLS,\n ...VIEWER_TOOLS,\n ...INFRA_TOOLS,\n};\n\nexport const TOOL_CAPABILITIES: Partial<Record<string, McpCapability[]>> = {\n 'tokens.suggest': ['tokens'],\n validate_and_fix: ['components'],\n};\n","import type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { McpCapability } from '@fragments-sdk/core';\nimport type { ToolHandler, ToolResult, ToolContext } from './types.js';\nimport type { McpToolDefinition } from '@fragments-sdk/context/mcp-tools';\n\nexport type ToolAvailability = 'always' | 'viewer' | 'playground';\n\nexport interface AvailabilityContext {\n hasViewer: boolean;\n hasPlayground: boolean;\n capabilities: Set<McpCapability>;\n}\n\ninterface RegisteredTool {\n key: string;\n handler: ToolHandler;\n definition?: McpToolDefinition;\n availability: ToolAvailability;\n requiredCapabilities: McpCapability[];\n}\n\nexport class ToolRegistry {\n private tools = new Map<string, RegisteredTool>();\n private prefix: string;\n private onChanged?: () => void;\n\n constructor(prefix: string, opts?: { onChanged?: () => void }) {\n this.prefix = prefix;\n this.onChanged = opts?.onChanged;\n }\n\n /** Register a single tool */\n register(\n key: string,\n handler: ToolHandler,\n definition?: McpToolDefinition,\n availability: ToolAvailability = 'always',\n requiredCapabilities: McpCapability[] = [],\n ): void {\n this.tools.set(key, {\n key,\n handler,\n definition,\n availability,\n requiredCapabilities,\n });\n this.onChanged?.();\n }\n\n /** Unregister a tool by key */\n unregister(key: string): void {\n if (this.tools.delete(key)) {\n this.onChanged?.();\n }\n }\n\n /** Bulk register built-in tools with availability metadata */\n registerBuiltins(\n toolSets: { core: Record<string, ToolHandler>; viewer: Record<string, ToolHandler>; infra: Record<string, ToolHandler> },\n definitions: McpToolDefinition[],\n capabilityByKey: Partial<Record<string, McpCapability[]>> = {},\n ): void {\n const defMap = new Map(definitions.map(d => [d.key, d]));\n for (const [key, handler] of Object.entries(toolSets.core)) {\n this.tools.set(key, {\n key,\n handler,\n definition: defMap.get(key),\n availability: 'always',\n requiredCapabilities: capabilityByKey[key] ?? [],\n });\n }\n for (const [key, handler] of Object.entries(toolSets.viewer)) {\n this.tools.set(key, {\n key,\n handler,\n definition: defMap.get(key),\n availability: 'viewer',\n requiredCapabilities: capabilityByKey[key] ?? [],\n });\n }\n for (const [key, handler] of Object.entries(toolSets.infra)) {\n this.tools.set(key, {\n key,\n handler,\n definition: defMap.get(key),\n availability: 'playground',\n requiredCapabilities: capabilityByKey[key] ?? [],\n });\n }\n // Don't fire onChanged during bulk init\n }\n\n /** Get handler for a tool (by unprefixed key or prefixed name) */\n getHandler(nameOrKey: string): ToolHandler | undefined {\n // Try direct key first\n const direct = this.tools.get(nameOrKey);\n if (direct) return direct.handler;\n // Try stripping prefix (only if prefix is set)\n if (!this.prefix) return undefined;\n const prefixStr = this.prefix + '_';\n if (nameOrKey.startsWith(prefixStr)) {\n const key = nameOrKey.slice(prefixStr.length);\n return this.tools.get(key)?.handler;\n }\n return undefined;\n }\n\n /** Resolve unprefixed key from a potentially prefixed tool name */\n resolveKey(name: string): string {\n if (!this.prefix) return name;\n const prefixStr = this.prefix + '_';\n return name.startsWith(prefixStr) ? name.slice(prefixStr.length) : name;\n }\n\n /** List available tools as MCP Tool[] based on current availability context */\n listTools(ctx: AvailabilityContext, allToolSchemas: Tool[]): Tool[] {\n const availableKeys = new Set<string>();\n for (const [key, tool] of this.tools) {\n const hasCapabilities = tool.requiredCapabilities.every((capability) =>\n ctx.capabilities.has(capability),\n );\n if (!hasCapabilities) continue;\n\n if (tool.availability === 'always') {\n availableKeys.add(key);\n } else if (tool.availability === 'viewer' && ctx.hasViewer) {\n availableKeys.add(key);\n } else if (tool.availability === 'playground' && ctx.hasPlayground) {\n availableKeys.add(key);\n }\n }\n if (!this.prefix) {\n return allToolSchemas.filter(t => availableKeys.has(t.name));\n }\n const prefixStr = this.prefix + '_';\n return allToolSchemas.filter(t => {\n const key = t.name.startsWith(prefixStr) ? t.name.slice(prefixStr.length) : t.name;\n return availableKeys.has(key);\n });\n }\n\n /** Execute a tool by name, dispatching to its handler */\n async execute(name: string, args: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\n const key = this.resolveKey(name);\n const registered = this.tools.get(key);\n if (!registered) {\n throw new Error(`Unknown tool: ${name}`);\n }\n return registered.handler(args, ctx);\n }\n\n /** Get the number of registered tools */\n get size(): number {\n return this.tools.size;\n }\n\n /** Get all registered keys */\n keys(): string[] {\n return Array.from(this.tools.keys());\n }\n}\n","import type { ToolResult, ToolContext } from './types.js';\n\nexport type MiddlewareNext = () => Promise<ToolResult>;\n\nexport interface MiddlewareContext {\n /** Tool name as received from the MCP client (e.g., 'discover') */\n toolName: string;\n /** Tool key (e.g., 'discover') */\n toolKey: string;\n /** Arguments passed to the tool */\n args: Record<string, unknown>;\n /** Tool execution context */\n ctx: ToolContext;\n}\n\nexport type Middleware = (\n mCtx: MiddlewareContext,\n next: MiddlewareNext,\n) => Promise<ToolResult>;\n\n/**\n * Execute a handler through a middleware chain (onion pattern).\n * Middleware wraps the handler — first registered runs outermost.\n */\nexport function executeWithMiddleware(\n middlewares: Middleware[],\n mCtx: MiddlewareContext,\n handler: () => Promise<ToolResult>,\n): Promise<ToolResult> {\n const chain = [...middlewares].reverse().reduce<MiddlewareNext>(\n (next, mw) => () => mw(mCtx, next),\n handler,\n );\n return chain();\n}\n\n/**\n * Built-in telemetry middleware — logs tool name and execution time.\n */\nexport function telemetryMiddleware(\n logger: (msg: string) => void,\n): Middleware {\n return async (mCtx, next) => {\n const start = Date.now();\n const result = await next();\n logger(`${mCtx.toolKey}: ${Date.now() - start}ms`);\n return result;\n };\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { FragmentsJsonAdapter } from './adapters/fragments-json.js';\nimport { AutoExtractionAdapter } from './adapters/auto-extract.js';\nimport { CloudCatalogAdapter } from './adapters/cloud-catalog.js';\nimport { BundleAdapter } from './adapters/bundle.js';\nimport type { DataAdapter } from './adapters/types.js';\nimport { findBundleManifest, findFragmentsJson } from './discovery.js';\nimport type { McpServerConfig } from './types.js';\nimport type { DsMcpConfigFile } from './config.js';\n\nexport interface ResolvedSource {\n adapter: DataAdapter;\n mode: 'fragments-json' | 'cloud' | 'bundle' | 'extract';\n}\n\nfunction resolveCloudApiKey(\n config: McpServerConfig,\n fileConfig?: DsMcpConfigFile,\n): string | undefined {\n return (\n config.cloudApiKey ??\n fileConfig?.cloud?.apiKey ??\n process.env.FRAGMENTS_API_KEY\n );\n}\n\nfunction resolveCloudUrl(\n fileConfig?: DsMcpConfigFile,\n): string | undefined {\n return fileConfig?.cloud?.url ?? process.env.FRAGMENTS_CLOUD_URL;\n}\n\nfunction hasTsProject(projectRoot: string): boolean {\n return (\n existsSync(join(projectRoot, 'tsconfig.json')) ||\n existsSync(join(projectRoot, 'tsconfig.app.json'))\n );\n}\n\nexport function resolveDataAdapter(\n config: McpServerConfig,\n fileConfig?: DsMcpConfigFile,\n): ResolvedSource {\n const source = config.source ?? fileConfig?.source ?? 'auto';\n const fragmentsJsonPaths = findFragmentsJson(config.projectRoot);\n const bundleManifestPaths = findBundleManifest(config.projectRoot);\n const cloudApiKey = resolveCloudApiKey(config, fileConfig);\n const cloudUrl = resolveCloudUrl(fileConfig);\n\n switch (source) {\n case 'fragments-json':\n return { adapter: new FragmentsJsonAdapter(), mode: 'fragments-json' };\n case 'cloud':\n if (!cloudApiKey) {\n throw new Error(\n 'Cloud source requires a Cloud API key. Pass --cloud-api-key, set FRAGMENTS_API_KEY, or configure cloud.apiKey in ds-mcp.config.json.',\n );\n }\n return {\n adapter: new CloudCatalogAdapter({ apiKey: cloudApiKey, url: cloudUrl }),\n mode: 'cloud',\n };\n case 'bundle':\n return { adapter: new BundleAdapter(), mode: 'bundle' };\n case 'extract':\n return { adapter: new AutoExtractionAdapter(), mode: 'extract' };\n case 'auto':\n default:\n if (fragmentsJsonPaths.length > 0) {\n return {\n adapter: new FragmentsJsonAdapter(),\n mode: 'fragments-json',\n };\n }\n if (cloudApiKey) {\n return {\n adapter: new CloudCatalogAdapter({\n apiKey: cloudApiKey,\n url: cloudUrl,\n }),\n mode: 'cloud',\n };\n }\n if (bundleManifestPaths.length > 0) {\n return {\n adapter: new BundleAdapter(),\n mode: 'bundle',\n };\n }\n if (hasTsProject(config.projectRoot)) {\n return { adapter: new AutoExtractionAdapter(), mode: 'extract' };\n }\n return {\n adapter: new FragmentsJsonAdapter(),\n mode: 'fragments-json',\n };\n }\n}\n\nexport function resolveSearchApiKey(\n config: McpServerConfig,\n fileConfig?: DsMcpConfigFile,\n): string | undefined {\n return config.searchApiKey ?? fileConfig?.vectorSearch?.apiKey;\n}\n","import { readFile } from 'node:fs/promises';\nimport type { CompiledFragmentsFile } from '@fragments-sdk/context/types';\nimport type { McpSnapshot } from '@fragments-sdk/core';\nimport { findFragmentsJson } from '../discovery.js';\nimport { BRAND } from '../constants.js';\nimport type { DesignSystemData } from '../types.js';\nimport type { DataAdapter } from './types.js';\nimport {\n blockFromCompiledBlock,\n buildCapabilities,\n componentFromCompiledFragment,\n tokensFromCompiledTokenData,\n validateSnapshot,\n} from './snapshot-converters.js';\n\nexport class FragmentsJsonAdapter implements DataAdapter {\n readonly name = 'fragments-json';\n\n discover(startDir: string): string[] {\n return findFragmentsJson(startDir);\n }\n\n async load(projectRoot: string): Promise<DesignSystemData> {\n const paths = this.discover(projectRoot);\n\n if (paths.length === 0) {\n throw new Error(\n `No ${BRAND.outFile} found. Searched ${projectRoot} and package.json dependencies.\\n\\n` +\n `Fix: Add a project-level MCP config so the server runs from your workspace root:\\n\\n` +\n ` Cursor: .cursor/mcp.json\\n` +\n ` VS Code: .vscode/mcp.json\\n` +\n ` Claude: claude mcp add ${BRAND.nameLower} -- npx @fragments-sdk/mcp\\n` +\n ` Windsurf: .windsurf/mcp.json\\n\\n` +\n `Or pass --project-root: npx @fragments-sdk/mcp -p /path/to/project\\n\\n` +\n `If you're a library author, run \\`${BRAND.cliCommand} build\\` first.`\n );\n }\n\n // Load primary file\n const content = await readFile(paths[0], 'utf-8');\n const primary = JSON.parse(content) as CompiledFragmentsFile;\n\n // Normalize legacy \"recipes\" key\n if (!primary.blocks && primary.recipes) {\n primary.blocks = primary.recipes;\n }\n\n // Build package map from primary file\n const packageMap: Record<string, string> = {};\n if (primary.packageName) {\n for (const name of Object.keys(primary.fragments)) {\n packageMap[name] = primary.packageName;\n }\n }\n\n // Merge additional files (monorepo packages)\n for (let i = 1; i < paths.length; i++) {\n const extra = JSON.parse(await readFile(paths[i], 'utf-8')) as CompiledFragmentsFile;\n if (extra.packageName) {\n for (const name of Object.keys(extra.fragments)) {\n packageMap[name] = extra.packageName;\n }\n }\n Object.assign(primary.fragments, extra.fragments);\n const extraBlocks = extra.blocks ?? extra.recipes;\n if (extraBlocks) {\n primary.blocks = { ...primary.blocks, ...extraBlocks };\n }\n }\n\n const components = Object.fromEntries(\n Object.entries(primary.fragments).map(([key, fragment]) => [\n key,\n componentFromCompiledFragment({\n id: key,\n fragment,\n sourceType: 'fragments-json',\n packageName: packageMap[fragment.meta.name] ?? primary.packageName,\n importPath: packageMap[fragment.meta.name] ?? primary.packageName,\n }),\n ]),\n );\n const blocks = primary.blocks\n ? Object.fromEntries(\n Object.entries(primary.blocks).map(([key, block]) => [\n key,\n blockFromCompiledBlock(key, block),\n ]),\n )\n : undefined;\n const tokens = primary.tokens\n ? tokensFromCompiledTokenData(primary.tokens)\n : undefined;\n const snapshot: McpSnapshot = validateSnapshot({\n schemaVersion: 1,\n sourceType: 'fragments-json',\n sourceLabel: BRAND.outFile,\n capabilities: buildCapabilities({\n components,\n blocks,\n tokens,\n graph: primary.graph,\n performanceSummary: primary.performanceSummary,\n }),\n metadata: {\n designSystemName: primary.packageName,\n packageName: primary.packageName,\n importPath: primary.packageName,\n },\n components,\n blocks,\n tokens,\n graph: primary.graph,\n performanceSummary: primary.performanceSummary,\n packageMap,\n defaultPackageName: primary.packageName,\n });\n\n return {\n snapshot,\n components: snapshot.components,\n blocks: snapshot.blocks,\n tokens: snapshot.tokens,\n graph: primary.graph,\n performanceSummary: primary.performanceSummary,\n packageMap: snapshot.packageMap,\n defaultPackageName: snapshot.defaultPackageName,\n capabilities: new Set(snapshot.capabilities),\n };\n }\n}\n","/**\n * Fragment discovery — finds fragments.json files in the project.\n *\n * Extracted from @fragments-sdk/cli to avoid pulling in the full CLI dependency.\n */\n\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { createRequire } from 'node:module';\nimport { BRAND } from './constants.js';\n\n/**\n * Resolve workspace directory globs (e.g. \"apps/*\") into actual paths.\n */\nfunction resolveWorkspaceGlob(baseDir: string, pattern: string): string[] {\n const parts = pattern.split('/');\n let dirs = [baseDir];\n\n for (const part of parts) {\n if (part === '**') continue;\n const next: string[] = [];\n for (const d of dirs) {\n if (part === '*') {\n try {\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {\n next.push(join(d, entry.name));\n }\n }\n } catch { /* unreadable dir */ }\n } else {\n const candidate = join(d, part);\n if (existsSync(candidate)) next.push(candidate);\n }\n }\n dirs = next;\n }\n\n return dirs;\n}\n\n/**\n * Detect workspace directories from package.json \"workspaces\" or pnpm-workspace.yaml.\n */\nfunction getWorkspaceDirs(rootDir: string): string[] {\n const dirs: string[] = [];\n\n // npm/yarn: package.json \"workspaces\" field\n const rootPkgPath = join(rootDir, 'package.json');\n if (existsSync(rootPkgPath)) {\n try {\n const rootPkg = JSON.parse(readFileSync(rootPkgPath, 'utf-8'));\n const workspaces = Array.isArray(rootPkg.workspaces)\n ? rootPkg.workspaces\n : rootPkg.workspaces?.packages;\n if (Array.isArray(workspaces)) {\n for (const pattern of workspaces) {\n dirs.push(...resolveWorkspaceGlob(rootDir, pattern));\n }\n return dirs;\n }\n } catch { /* unreadable */ }\n }\n\n // pnpm: pnpm-workspace.yaml\n const pnpmWsPath = join(rootDir, 'pnpm-workspace.yaml');\n if (existsSync(pnpmWsPath)) {\n try {\n const content = readFileSync(pnpmWsPath, 'utf-8');\n const lines = content.split('\\n');\n let inPackages = false;\n for (const line of lines) {\n if (/^packages\\s*:/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const match = line.match(/^\\s+-\\s+['\"]?([^'\"#\\n]+)['\"]?/);\n if (match) {\n dirs.push(...resolveWorkspaceGlob(rootDir, match[1].trim()));\n } else if (/^\\S/.test(line) && line.trim()) {\n break;\n }\n }\n }\n } catch { /* unreadable */ }\n }\n\n return dirs;\n}\n\n/**\n * Resolve a dependency's package.json path. Tries the standard subpath first,\n * then falls back to resolving the package's main entry and walking up to\n * find package.json — necessary when the package's `exports` map doesn't\n * expose `./package.json`.\n */\nfunction resolveDepPackageJson(\n localRequire: NodeRequire,\n depName: string\n): string | null {\n // Fast path: package exposes ./package.json in exports\n try {\n return localRequire.resolve(`${depName}/package.json`);\n } catch {\n // Blocked by exports map\n }\n\n // Fallback: resolve the package's main entry and walk up to package.json\n try {\n const mainPath = localRequire.resolve(depName);\n let dir = dirname(mainPath);\n while (true) {\n const candidate = join(dir, 'package.json');\n if (existsSync(candidate)) {\n const pkg = JSON.parse(readFileSync(candidate, 'utf-8'));\n if (pkg.name === depName) return candidate;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n // Package not resolvable at all\n }\n\n return null;\n}\n\n/**\n * Scan a directory's package.json deps for packages with a given dep field.\n */\nfunction findFragmentsInDeps(dir: string, found: string[], depField: string): void {\n const pkgJsonPath = join(dir, 'package.json');\n if (!existsSync(pkgJsonPath)) return;\n\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.devDependencies,\n };\n const localRequire = createRequire(join(dir, 'noop.js'));\n for (const depName of Object.keys(allDeps)) {\n try {\n const depPkgPath = resolveDepPackageJson(localRequire, depName);\n if (!depPkgPath) continue;\n const depPkg = JSON.parse(readFileSync(depPkgPath, 'utf-8'));\n if (depPkg[depField]) {\n const fragmentsPath = join(dirname(depPkgPath), depPkg[depField]);\n if (existsSync(fragmentsPath) && !found.includes(fragmentsPath)) {\n found.push(fragmentsPath);\n }\n }\n } catch {\n // Package not resolvable or unreadable, skip\n }\n }\n } catch {\n // No package.json or unreadable\n }\n}\n\n/**\n * Find design system JSON files (parameterized version):\n * 1. Walk up from startDir looking for outFile\n * 2. Read package.json deps and resolve packages with a depField field\n * 3. Check workspace packages' deps (monorepo support)\n *\n * Uses Node.js module resolution (createRequire) to handle all package\n * managers: pnpm symlinks, yarn PnP, monorepo hoisting, etc.\n */\nexport function findDesignSystemJson(startDir: string, outFile: string, depField: string): string[] {\n const found: string[] = [];\n const resolvedStart = resolve(startDir);\n\n // 1. Walk upward from startDir (library author flow)\n let dir = resolvedStart;\n while (true) {\n const candidate = join(dir, outFile);\n if (existsSync(candidate)) {\n found.push(candidate);\n break;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n // 2. Check root package.json deps\n findFragmentsInDeps(resolvedStart, found, depField);\n\n // 3. Check workspace packages' deps (monorepo support)\n if (found.length === 0 || existsSync(join(resolvedStart, 'pnpm-workspace.yaml'))) {\n const workspaceDirs = getWorkspaceDirs(resolvedStart);\n for (const wsDir of workspaceDirs) {\n findFragmentsInDeps(wsDir, found, depField);\n }\n }\n\n return found;\n}\n\n/**\n * Find fragments.json files:\n * 1. Walk up from startDir (for library authors with a local build)\n * 2. Read package.json deps and resolve packages with a \"fragments\" field\n * 3. Check workspace packages' deps (monorepo support)\n *\n * Uses Node.js module resolution (createRequire) to handle all package\n * managers: pnpm symlinks, yarn PnP, monorepo hoisting, etc.\n *\n * Backward-compatible wrapper around findDesignSystemJson.\n */\nexport function findFragmentsJson(startDir: string): string[] {\n return findDesignSystemJson(startDir, BRAND.outFile, 'fragments');\n}\n\n/**\n * Find a local Fragments bundle manifest by walking upward from startDir.\n *\n * Unlike fragments.json discovery, bundles are local workspace artifacts and\n * are not currently resolved through package dependencies.\n */\nexport function findBundleManifest(startDir: string): string[] {\n const found: string[] = [];\n let dir = resolve(startDir);\n\n while (true) {\n const candidate = join(dir, BRAND.dataDir, BRAND.manifestFile);\n if (existsSync(candidate)) {\n found.push(candidate);\n break;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return found;\n}\n","import type {\n CompiledBlock,\n CompiledFragment,\n CompiledTokenData,\n} from '@fragments-sdk/context/types';\nimport type {\n McpBlock,\n McpCapability,\n McpComponent,\n McpSnapshot,\n McpToken,\n McpTokenData,\n McpSourceType,\n} from '@fragments-sdk/core';\nimport { mcpSnapshotSchema } from '@fragments-sdk/core';\nimport { isGarbageToken } from '../token-suggestions.js';\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 80);\n}\n\nexport function buildComponentId(args: {\n name: string;\n filePath?: string;\n packageName?: string;\n}): string {\n const base = args.filePath ?? args.packageName ?? args.name;\n return `${slugify(args.name)}:${base}`;\n}\n\nfunction valueToString(value: unknown): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value === 'string') return value;\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n\nfunction buildCompoundChildren(\n contract?: CompiledFragment['contract'],\n ai?: CompiledFragment['ai'],\n): McpComponent['compoundChildren'] {\n // Prefer detailed contract.compoundChildren when available\n const contractChildren = Object.entries(contract?.compoundChildren ?? {});\n if (contractChildren.length > 0) {\n return contractChildren.map(([childName, child]) => ({\n name: childName,\n description: child.description,\n required: child.required,\n accepts: child.accepts,\n visibility: 'public' as const,\n }));\n }\n // Fall back to ai.subComponents (string[]) with requiredChildren hints\n const subs = ai?.subComponents;\n if (!subs || subs.length === 0) return [];\n const requiredSet = new Set(ai?.requiredChildren ?? []);\n return subs.map((name) => ({\n name,\n required: requiredSet.has(name) || undefined,\n visibility: 'public' as const,\n }));\n}\n\nexport function componentFromCompiledFragment(args: {\n id?: string;\n fragment: CompiledFragment;\n sourceType: McpSourceType;\n packageName?: string;\n importPath?: string;\n}): McpComponent {\n const { fragment, sourceType } = args;\n const name = fragment.meta.name;\n const description = fragment.meta.description ?? '';\n const usage = fragment.usage ?? { when: [], whenNot: [] };\n const contract = fragment.contract;\n const ai = fragment.ai;\n const guidancePatterns = ((fragment as CompiledFragment & {\n _cloudPatterns?: Array<{ name?: string; description?: string }>;\n })._cloudPatterns ?? [])\n .map((pattern) => ({\n name: pattern.name ?? 'Pattern',\n description: pattern.description,\n }));\n\n return {\n id:\n args.id ??\n buildComponentId({\n name,\n filePath: fragment.sourcePath ?? fragment.filePath,\n packageName: args.packageName,\n }),\n name,\n description,\n category: fragment.meta.category ?? 'uncategorized',\n status: fragment.meta.status ?? 'stable',\n tags: fragment.meta.tags ?? [],\n props: Object.fromEntries(\n Object.entries(fragment.props ?? {}).map(([propName, prop]) => [\n propName,\n {\n type: prop.type,\n description: prop.description ?? '',\n required: prop.required ?? false,\n default: prop.default,\n values: prop.values ? [...prop.values] : undefined,\n constraints: prop.constraints ? [...prop.constraints] : undefined,\n },\n ]),\n ),\n propsSummary:\n fragment.propsSummary ??\n contract?.propsSummary ??\n Object.entries(fragment.props ?? {}).map(\n ([propName, prop]) =>\n `${propName}${prop.required ? ' (required)' : ''}: ${prop.type}`,\n ),\n examples: (fragment.variants ?? []).map((variant) => ({\n name: variant.name,\n description: variant.description,\n code: variant.code,\n kind: 'example',\n })),\n relations: (fragment.relations ?? []).map((relation) => ({\n componentName: relation.component,\n relationship: relation.relationship,\n note: relation.note,\n })),\n compoundChildren: buildCompoundChildren(contract, ai),\n guidance: {\n when: usage.when ?? [],\n whenNot: usage.whenNot ?? [],\n guidelines: usage.guidelines ?? [],\n accessibility: usage.accessibility ?? [],\n dos: usage.when ?? [],\n donts: usage.whenNot ?? [],\n patterns:\n guidancePatterns.length > 0\n ? guidancePatterns\n : (ai?.commonPatterns ?? []).map((pattern) => ({\n name: pattern,\n })),\n },\n sourceType,\n sourcePath: fragment.sourcePath ?? fragment.filePath,\n packageName: args.packageName,\n importPath: args.importPath ?? args.packageName,\n performance: fragment.performance\n ? {\n bundleSize: fragment.performance.bundleSize,\n rawSize: fragment.performance.rawSize,\n complexity: fragment.performance.complexity,\n budgetPercent: fragment.performance.budgetPercent,\n overBudget: fragment.performance.overBudget,\n measuredAt: fragment.performance.measuredAt,\n imports: fragment.performance.imports?.map((entry) => ({\n path: entry.path,\n bytes: entry.bytes,\n percent: entry.percent,\n })),\n }\n : undefined,\n metadata: {\n a11yRules: contract?.a11yRules ?? [],\n scenarioTags: contract?.scenarioTags ?? [],\n },\n };\n}\n\nexport function blockFromCompiledBlock(\n key: string,\n block: CompiledBlock,\n): McpBlock {\n return {\n id: key,\n name: block.name,\n description: block.description ?? '',\n category: block.category ?? 'uncategorized',\n components: block.components ?? [],\n tags: block.tags ?? [],\n code: block.code ?? '',\n };\n}\n\nexport function tokensFromCompiledTokenData(\n tokens: CompiledTokenData,\n): McpTokenData {\n const flat: McpToken[] = [];\n const categories: Record<string, McpToken[]> = {};\n\n for (const [category, entries] of Object.entries(tokens.categories)) {\n const normalized = entries\n .map((entry) => ({\n name: entry.name,\n category,\n value: valueToString(entry.value),\n description: entry.description,\n }))\n .filter((token) => !isGarbageToken(token));\n if (normalized.length > 0) {\n categories[category] = normalized;\n flat.push(...normalized);\n }\n }\n\n return {\n prefix: tokens.prefix,\n total: flat.length,\n categories,\n flat,\n };\n}\n\nexport function buildCapabilities(args: {\n components: Record<string, McpComponent>;\n blocks?: Record<string, McpBlock>;\n tokens?: McpTokenData;\n graph?: unknown;\n performanceSummary?: unknown;\n}): McpCapability[] {\n const capabilities = new Set<McpCapability>();\n\n if (Object.keys(args.components).length > 0) {\n capabilities.add('components');\n }\n if (args.tokens && args.tokens.total > 0) {\n capabilities.add('tokens');\n }\n if (args.blocks && Object.keys(args.blocks).length > 0) {\n capabilities.add('blocks');\n }\n if (args.graph) {\n capabilities.add('graph');\n }\n const hasPerformance =\n Boolean(args.performanceSummary) ||\n Object.values(args.components).some((component) => Boolean(component.performance));\n if (hasPerformance) {\n capabilities.add('performance');\n }\n\n return Array.from(capabilities);\n}\n\nexport function validateSnapshot(snapshot: McpSnapshot): McpSnapshot {\n return mcpSnapshotSchema.parse(snapshot);\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join, relative, sep, dirname, basename } from 'node:path';\nimport type { CompiledFragment, PropDefinition, FragmentMeta } from '@fragments-sdk/context/types';\nimport type { McpSnapshot } from '@fragments-sdk/core';\nimport type { DesignSystemData } from '../types.js';\nimport type { DataAdapter } from './types.js';\nimport { discoverComponentFiles } from './discover-components.js';\nimport { scanTokens } from './scan-tokens.js';\nimport {\n buildCapabilities,\n componentFromCompiledFragment,\n tokensFromCompiledTokenData,\n validateSnapshot,\n} from './snapshot-converters.js';\n\n/**\n * Auto-extract adapter: discovers and extracts component data\n * directly from source code without requiring fragments.json.\n *\n * Requires TypeScript to be installed (used by @fragments-sdk/extract\n * for LanguageService-based prop extraction).\n */\nexport class AutoExtractionAdapter implements DataAdapter {\n readonly name = 'auto-extract';\n\n discover(startDir: string): string[] {\n return discoverComponentFiles(startDir).map(f => f.filePath);\n }\n\n async load(projectRoot: string): Promise<DesignSystemData> {\n // Dynamic import — keeps startup fast when FragmentsJsonAdapter is used\n let extractMod: { createComponentExtractor: (tsconfigPath?: string) => {\n extract: (filePath: string, exportName?: string) => unknown | null;\n extractAll: (filePath: string) => unknown[];\n dispose: () => void;\n }};\n try {\n extractMod = await loadExtractorModule();\n } catch (e) {\n throw new Error(\n 'Auto-extraction requires @fragments-sdk/extract and TypeScript.\\n\\n' +\n 'If you see this error, the MCP server may not be installed correctly.\\n' +\n 'Alternative: pre-build your design system with `npx fragments build`'\n );\n }\n\n // Find tsconfig.json\n const tsconfigPath = findTsConfig(projectRoot);\n\n // Create extractor\n const extractor = extractMod.createComponentExtractor(tsconfigPath ?? undefined);\n\n try {\n // Discover component files\n const discovered = discoverComponentFiles(projectRoot);\n\n if (discovered.length === 0) {\n throw new Error(\n `No component files found in ${projectRoot}.\\n` +\n 'Searched: src/components/, components/, lib/components/, src/ui/\\n\\n' +\n 'If your components are elsewhere, create a fragments.json with:\\n' +\n ' npx fragments build'\n );\n }\n\n const components: Record<string, CompiledFragment> = {};\n const packageMap = new Map<string, string>();\n const defaultPackageName = readPackageName(projectRoot);\n let extractedCount = 0;\n\n // Track which file each component came from (for compound component detection)\n const fileToComponents = new Map<string, string[]>();\n\n for (const { filePath, componentName } of discovered) {\n try {\n const metas = extractor.extractAll(filePath) as ExtractedMeta[];\n\n for (const meta of metas) {\n const fragment = mapToCompiledFragment(meta, filePath, projectRoot);\n components[meta.name] = fragment;\n if (defaultPackageName) {\n packageMap.set(meta.name, defaultPackageName);\n }\n extractedCount++;\n // Track file → components for relationship inference\n const relPath = relative(projectRoot, filePath);\n if (!fileToComponents.has(relPath)) fileToComponents.set(relPath, []);\n fileToComponents.get(relPath)!.push(meta.name);\n }\n\n // If extractAll returns nothing, try with the inferred name\n if (metas.length === 0) {\n const meta = extractor.extract(filePath, componentName) as ExtractedMeta | null;\n if (meta) {\n const fragment = mapToCompiledFragment(meta, filePath, projectRoot);\n components[meta.name] = fragment;\n if (defaultPackageName) {\n packageMap.set(meta.name, defaultPackageName);\n }\n extractedCount++;\n const relPath = relative(projectRoot, filePath);\n if (!fileToComponents.has(relPath)) fileToComponents.set(relPath, []);\n fileToComponents.get(relPath)!.push(meta.name);\n }\n }\n } catch {\n // Skip files that fail extraction — non-fatal\n continue;\n }\n }\n\n // Infer compound component relationships from co-located exports\n inferRelations(components, fileToComponents);\n\n // Log progress to stderr (stdout is reserved for MCP JSON-RPC)\n console.error(`[fragments-mcp] Extracted ${extractedCount} components from ${discovered.length} files.`);\n\n if (extractedCount === 0) {\n throw new Error(\n `Found ${discovered.length} component files but could not extract any props.\\n` +\n 'This usually means TypeScript cannot parse the files.\\n' +\n 'Check that your tsconfig.json includes the component directories.'\n );\n }\n\n // Scan for CSS design tokens\n const tokens = scanTokens(projectRoot);\n if (tokens) {\n console.error(`[fragments-mcp] Found ${tokens.total} design tokens across ${Object.keys(tokens.categories).length} categories.`);\n }\n\n const snapshotComponents = Object.fromEntries(\n Object.entries(components).map(([key, fragment]) => [\n key,\n componentFromCompiledFragment({\n id: key,\n fragment,\n sourceType: 'auto-extract',\n packageName: packageMap.get(fragment.meta.name) ?? defaultPackageName,\n importPath:\n packageMap.get(fragment.meta.name) ?? defaultPackageName,\n }),\n ]),\n );\n const snapshotTokens = tokens\n ? tokensFromCompiledTokenData(tokens)\n : undefined;\n const packageMapRecord = Object.fromEntries(packageMap.entries());\n const snapshot: McpSnapshot = validateSnapshot({\n schemaVersion: 1,\n sourceType: 'auto-extract',\n sourceLabel: 'Auto-extracted source files',\n capabilities: buildCapabilities({\n components: snapshotComponents,\n tokens: snapshotTokens,\n }),\n metadata: {\n packageName: defaultPackageName,\n importPath: defaultPackageName,\n },\n components: snapshotComponents,\n tokens: snapshotTokens,\n packageMap: packageMapRecord,\n defaultPackageName,\n });\n\n return {\n snapshot,\n components: snapshot.components,\n blocks: snapshot.blocks,\n tokens: snapshot.tokens,\n graph: undefined,\n performanceSummary: undefined,\n packageMap: snapshot.packageMap,\n defaultPackageName: snapshot.defaultPackageName,\n capabilities: new Set(snapshot.capabilities),\n };\n } finally {\n extractor.dispose();\n }\n }\n}\n\nlet extractorModulePromise: Promise<{\n createComponentExtractor: (tsconfigPath?: string) => {\n extract: (filePath: string, exportName?: string) => unknown | null;\n extractAll: (filePath: string) => unknown[];\n dispose: () => void;\n };\n}> | null = null;\n\nasync function loadExtractorModule() {\n if (!extractorModulePromise) {\n extractorModulePromise = import('@fragments-sdk/extract');\n }\n return extractorModulePromise;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ninterface ExtractedPropMeta {\n name: string;\n type: string;\n typeKind: string;\n values?: string[];\n default?: string;\n description?: string;\n required: boolean;\n source: string;\n}\n\ninterface ExtractedMeta {\n name: string;\n filePath: string;\n description: string;\n props: Record<string, ExtractedPropMeta>;\n composition: { pattern: string } | null;\n exports: string[];\n dependencies: string[];\n}\n\n// Inherited props that AI agents commonly need, grouped by relevance.\n// Universal props apply to all components. Form props only apply to input-like components.\nconst UNIVERSAL_INHERITED = new Set(['children', 'className', 'id', 'disabled']);\nconst FORM_INPUT_INHERITED = new Set([\n 'placeholder', 'value', 'defaultValue', 'onChange', 'name', 'required',\n 'autoFocus', 'autoComplete', 'checked', 'defaultChecked', 'type',\n]);\nconst LABEL_INHERITED = new Set(['htmlFor']);\n\n// Component names that behave like form inputs\nconst INPUT_LIKE_NAMES = /input|select|textarea|checkbox|radio|switch|slider|combobox/i;\nconst LABEL_LIKE_NAMES = /label/i;\n\nfunction getRelevantInheritedProps(componentName: string): Set<string> {\n const allowed = new Set(UNIVERSAL_INHERITED);\n if (INPUT_LIKE_NAMES.test(componentName)) {\n for (const p of FORM_INPUT_INHERITED) allowed.add(p);\n }\n if (LABEL_LIKE_NAMES.test(componentName)) {\n for (const p of LABEL_INHERITED) allowed.add(p);\n }\n return allowed;\n}\n\nfunction mapToCompiledFragment(\n meta: ExtractedMeta,\n filePath: string,\n projectRoot: string,\n): CompiledFragment {\n // Map props: local props + context-appropriate inherited props\n const relevantInherited = getRelevantInheritedProps(meta.name);\n const props: Record<string, PropDefinition> = {};\n for (const [name, propMeta] of Object.entries(meta.props)) {\n if (propMeta.source === 'inherited' && !relevantInherited.has(name)) continue;\n props[name] = {\n type: propMeta.type,\n description: propMeta.description ?? '',\n required: propMeta.required,\n ...(propMeta.values && { values: propMeta.values }),\n ...(propMeta.default !== undefined && { default: propMeta.default }),\n };\n }\n\n const relativePath = relative(projectRoot, filePath);\n const category = inferCategory(relativePath);\n const importPath = buildImportPath(relativePath);\n const description = buildDescription(meta, props);\n const propsSummary = buildPropsSummary(props);\n const codeExample = buildCodeExample(meta.name, props);\n\n const fragmentMeta: FragmentMeta = {\n name: meta.name,\n description,\n category,\n };\n\n return {\n filePath: relativePath,\n meta: fragmentMeta,\n usage: {\n when: [`Use ${meta.name} when you need a ${category} ${meta.name.toLowerCase()} element.`],\n whenNot: [],\n guidelines: importPath ? [`import { ${meta.name} } from \"${importPath}\"`] : [],\n },\n props,\n propsSummary,\n variants: codeExample ? [{ name: 'Default', description: `Basic ${meta.name} usage`, code: codeExample }] : [],\n sourcePath: relativePath,\n exportName: meta.name,\n _generated: {\n source: 'extracted',\n verified: false,\n timestamp: new Date().toISOString(),\n },\n ...(meta.composition && {\n ai: {\n compositionPattern: meta.composition.pattern as 'compound' | 'simple' | 'controlled' | 'wrapper',\n },\n }),\n };\n}\n\n/**\n * Generate an import path from a relative file path.\n * Converts `src/components/ui/button.tsx` → `@/components/ui/button`\n */\nfunction buildImportPath(relativePath: string): string | null {\n // Strip extension\n const withoutExt = relativePath.replace(/\\.(tsx|jsx|ts|js)$/, '');\n // Common alias: src/ → @/\n if (withoutExt.startsWith(`src${sep}`)) {\n return '@/' + withoutExt.slice(4).split(sep).join('/');\n }\n // Relative path\n return './' + withoutExt.split(sep).join('/');\n}\n\n/**\n * Generate a useful description from extracted metadata.\n */\nfunction buildDescription(meta: ExtractedMeta, localProps: Record<string, PropDefinition>): string {\n // Use JSDoc description if the extractor found one\n if (meta.description && meta.description !== meta.name && !meta.description.endsWith(' component')) {\n return meta.description;\n }\n // Generate from props\n const propEntries = Object.entries(localProps);\n if (propEntries.length === 0) {\n return `${meta.name} component`;\n }\n const details: string[] = [];\n for (const [name, prop] of propEntries) {\n if (prop.values && prop.values.length > 0) {\n details.push(`${prop.values.length} ${name} options`);\n }\n }\n if (details.length > 0) {\n return `${meta.name} component with ${details.join(' and ')}.`;\n }\n return `${meta.name} component with ${propEntries.length} configurable prop${propEntries.length === 1 ? '' : 's'}.`;\n}\n\n/**\n * Generate human-readable prop summaries for AI agents.\n */\nfunction buildPropsSummary(props: Record<string, PropDefinition>): string[] {\n const summaries: string[] = [];\n for (const [name, prop] of Object.entries(props)) {\n let summary = `${name}`;\n if (prop.values && prop.values.length > 0) {\n summary += `: ${prop.values.map(v => `\"${v}\"`).join(' | ')}`;\n } else {\n summary += `: ${prop.type}`;\n }\n if (prop.default !== undefined) {\n summary += ` (default: ${JSON.stringify(prop.default)})`;\n }\n if (prop.required) {\n summary += ' (required)';\n }\n summaries.push(summary);\n }\n return summaries;\n}\n\n/**\n * Generate a basic JSX code example from props.\n */\nfunction buildCodeExample(name: string, props: Record<string, PropDefinition>): string | null {\n const propsStr: string[] = [];\n\n for (const [pName, prop] of Object.entries(props)) {\n if (pName === 'children' || pName === 'asChild' || pName === 'className') continue;\n if (pName === 'onChange' || pName === 'onSubmit' || pName === 'value' ||\n pName === 'defaultValue' || pName === 'checked' || pName === 'defaultChecked' ||\n pName === 'autoFocus' || pName === 'autoComplete' || pName === 'required' ||\n pName === 'disabled' || pName === 'name') continue; // skip state/handler props in examples\n\n if (prop.default !== undefined) {\n if (prop.values && prop.values.length > 1) {\n const nonDefault = prop.values.find(v => v !== String(prop.default));\n if (nonDefault) {\n propsStr.push(`${pName}=\"${nonDefault}\"`);\n continue;\n }\n }\n }\n // Show placeholder for Input-like components\n if (pName === 'placeholder' && INPUT_LIKE_NAMES.test(name)) {\n propsStr.push(`placeholder=\"Enter ${name.toLowerCase()}...\"`);\n continue;\n }\n // Show htmlFor for Label\n if (pName === 'htmlFor' && LABEL_LIKE_NAMES.test(name)) {\n propsStr.push(`htmlFor=\"field-id\"`);\n continue;\n }\n // Skip id/className/children in examples — they're boilerplate\n if (pName === 'id' || pName === 'className' || pName === 'children') continue;\n if (prop.required) {\n if (prop.values && prop.values.length > 0) {\n propsStr.push(`${pName}=\"${prop.values[0]}\"`);\n } else if (prop.type === 'string') {\n propsStr.push(`${pName}=\"...\"`);\n }\n }\n }\n\n const propsJsx = propsStr.length > 0 ? ' ' + propsStr.join(' ') : '';\n // Self-closing for input-like components\n const nameLower = name.toLowerCase();\n const selfClosing = nameLower.includes('input') || nameLower.includes('separator') ||\n nameLower.includes('slider') || nameLower.includes('switch');\n if (selfClosing) {\n return `<${name}${propsJsx} />`;\n }\n return `<${name}${propsJsx}>${name}</${name}>`;\n}\n\n/**\n * Generate a composition example showing how compound sub-components nest together.\n * Returns a JSX snippet like: <Card><CardHeader><CardTitle>Title</CardTitle></CardHeader>...</Card>\n */\nfunction buildCompositionExample(root: string, subs: string[]): string {\n // Group sub-components by likely nesting based on naming conventions\n const header = subs.filter(s => s.includes('Header'));\n const title = subs.filter(s => s.includes('Title'));\n const description = subs.filter(s => s.includes('Description'));\n const content = subs.filter(s => s.includes('Content') || s.includes('Body'));\n const footer = subs.filter(s => s.includes('Footer'));\n const action = subs.filter(s => s.includes('Action'));\n const other = subs.filter(s =>\n !header.includes(s) && !title.includes(s) && !description.includes(s) &&\n !content.includes(s) && !footer.includes(s) && !action.includes(s)\n );\n\n const lines: string[] = [`<${root}>`];\n\n // Header section (with title and description nested inside)\n if (header.length > 0) {\n lines.push(` <${header[0]}>`);\n for (const t of title) lines.push(` <${t}>Title</${t}>`);\n for (const d of description) lines.push(` <${d}>Description</${d}>`);\n lines.push(` </${header[0]}>`);\n } else {\n for (const t of title) lines.push(` <${t}>Title</${t}>`);\n for (const d of description) lines.push(` <${d}>Description</${d}>`);\n }\n\n // Content section\n for (const c of content) lines.push(` <${c}>Content</${c}>`);\n\n // Other sub-components\n for (const o of other) lines.push(` <${o}>...</${o}>`);\n\n // Footer section (with action inside)\n if (footer.length > 0) {\n lines.push(` <${footer[0]}>`);\n for (const a of action) lines.push(` <${a}>Action</${a}>`);\n lines.push(` </${footer[0]}>`);\n } else {\n for (const a of action) lines.push(` <${a}>Action</${a}>`);\n }\n\n lines.push(`</${root}>`);\n return lines.join('\\n');\n}\n\n/**\n * Infer compound component relationships from co-located exports.\n * If Card, CardHeader, CardContent all come from card.tsx, they're related.\n */\nfunction inferRelations(\n components: Record<string, CompiledFragment>,\n fileToComponents: Map<string, string[]>,\n): void {\n for (const [_file, names] of fileToComponents) {\n if (names.length <= 1) continue;\n\n // Find the \"root\" component (shortest name, or the one others are prefixed with)\n const sorted = [...names].sort((a, b) => a.length - b.length);\n const root = sorted[0];\n const subs = sorted.slice(1).filter(n => n.startsWith(root));\n\n if (subs.length === 0) continue;\n\n // Mark the root as a compound component\n const rootComp = components[root];\n if (rootComp) {\n rootComp.ai = {\n ...rootComp.ai,\n compositionPattern: 'compound',\n subComponents: subs,\n };\n // Add relations pointing subs → root\n rootComp.relations = subs.map(sub => ({\n component: sub,\n relationship: 'parent-of',\n note: `${sub} is a sub-component of ${root}`,\n }));\n // Add composition example as a variant\n const compositionCode = buildCompositionExample(root, subs);\n rootComp.variants = [\n ...(rootComp.variants ?? []),\n { name: 'Composition', description: `${root} with all sub-components`, code: compositionCode },\n ];\n }\n\n // Mark each sub-component with a relation back to root + consolidated import\n const rootImportPath = rootComp?.usage?.guidelines?.[0];\n for (const sub of subs) {\n const subComp = components[sub];\n if (subComp) {\n subComp.relations = [{\n component: root,\n relationship: 'child-of',\n note: `Use inside <${root}>`,\n }];\n // Override import to show consolidated multi-import from parent's file\n if (rootImportPath) {\n const allNames = [root, ...subs].join(', ');\n const fromPath = rootImportPath.match(/from\\s+\"([^\"]+)\"/)?.[1] ?? '';\n if (fromPath) {\n subComp.usage = {\n ...subComp.usage,\n guidelines: [`import { ${allNames} } from \"${fromPath}\"`],\n };\n }\n }\n }\n }\n\n // Also update root's import to show all sub-components\n if (rootComp && rootComp.usage?.guidelines?.[0]) {\n const fromPath = rootComp.usage.guidelines[0].match(/from\\s+\"([^\"]+)\"/)?.[1] ?? '';\n if (fromPath) {\n const allNames = [root, ...subs].join(', ');\n rootComp.usage.guidelines = [`import { ${allNames} } from \"${fromPath}\"`];\n }\n }\n }\n}\n\nfunction inferCategory(relativePath: string): string {\n const parts = relativePath.split(sep);\n const componentsIdx = parts.findIndex(p =>\n p === 'components' || p === 'ui'\n );\n if (componentsIdx >= 0 && componentsIdx + 1 < parts.length - 1) {\n const nextPart = parts[componentsIdx + 1];\n if (/^[A-Z]/.test(nextPart)) return parts[componentsIdx] || 'uncategorized';\n return nextPart;\n }\n return 'uncategorized';\n}\n\nfunction findTsConfig(projectRoot: string): string | null {\n const candidates = ['tsconfig.json', 'tsconfig.app.json'];\n for (const name of candidates) {\n const p = join(projectRoot, name);\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction readPackageName(projectRoot: string): string | undefined {\n try {\n const pkgPath = join(projectRoot, 'package.json');\n if (!existsSync(pkgPath)) return undefined;\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { name?: string };\n return pkg.name;\n } catch {\n return undefined;\n }\n}\n","import { readdirSync, existsSync } from 'node:fs';\nimport { join, extname, basename } from 'node:path';\n\nexport interface DiscoveredComponentFile {\n /** Absolute file path */\n filePath: string;\n /** Inferred PascalCase component name */\n componentName: string;\n}\n\nconst EXCLUDED_DIRS = new Set([\n 'node_modules', 'dist', 'build', '.next', '.nuxt', 'coverage',\n '__tests__', '__mocks__', '.git', '.cache', '.turbo', 'out',\n]);\n\nconst EXCLUDED_PATTERNS = [\n /\\.test\\./,\n /\\.spec\\./,\n /\\.stories\\./,\n /\\.story\\./,\n /\\.fragment\\./,\n /\\.d\\.ts$/,\n /\\.config\\./,\n /\\.mock\\./,\n /\\.fixture\\./,\n];\n\n/**\n * Discover component files by walking common directories.\n * Returns all .tsx/.jsx files (excluding tests, stories, etc.).\n * The extractor determines which files actually export React components.\n */\nexport function discoverComponentFiles(projectRoot: string): DiscoveredComponentFile[] {\n const results: DiscoveredComponentFile[] = [];\n const seen = new Set<string>();\n\n // Common component locations to scan\n const scanDirs = [\n 'src/components', 'components', 'lib/components',\n 'src/ui', 'lib/ui', 'packages',\n ].map(d => join(projectRoot, d)).filter(d => existsSync(d));\n\n // If no conventional dirs exist, scan src/ itself\n if (scanDirs.length === 0) {\n const srcDir = join(projectRoot, 'src');\n if (existsSync(srcDir)) scanDirs.push(srcDir);\n }\n\n for (const dir of scanDirs) {\n walkDir(dir, results, seen);\n }\n\n return results;\n}\n\nfunction walkDir(\n dir: string,\n results: DiscoveredComponentFile[],\n seen: Set<string>,\n depth = 0,\n): void {\n if (depth > 6) return; // prevent deep recursion\n\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch { return; }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.')) continue;\n\n if (entry.isDirectory()) {\n if (EXCLUDED_DIRS.has(entry.name)) continue;\n walkDir(join(dir, entry.name), results, seen, depth + 1);\n continue;\n }\n\n if (!entry.isFile()) continue;\n const ext = extname(entry.name);\n if (ext !== '.tsx' && ext !== '.jsx') continue;\n if (EXCLUDED_PATTERNS.some(p => p.test(entry.name))) continue;\n\n const filePath = join(dir, entry.name);\n if (seen.has(filePath)) continue;\n seen.add(filePath);\n\n // Infer component name — accept all files, let extractor determine if it's a component\n const name = inferComponentName(entry.name, dir);\n if (name) {\n results.push({ filePath, componentName: name });\n }\n }\n}\n\nfunction inferComponentName(fileName: string, dirPath: string): string | null {\n const withoutExt = fileName.replace(/\\.(tsx|jsx)$/, '');\n if (withoutExt === 'index') {\n // Use parent directory name\n return basename(dirPath);\n }\n return withoutExt;\n}\n","import { readdirSync, readFileSync, existsSync } from 'node:fs';\nimport { join, extname } from 'node:path';\nimport type { CompiledTokenData } from '@fragments-sdk/context/types';\n\ninterface TokenEntry {\n name: string;\n value?: string;\n description?: string;\n}\n\n/**\n * Scan a project for CSS custom property declarations and return them\n * as CompiledTokenData. Lightweight alternative to the full compiler\n * token pipeline — handles CSS custom properties in :root blocks.\n */\nexport function scanTokens(projectRoot: string): CompiledTokenData | undefined {\n // Find CSS files in common locations\n const cssFiles = discoverCssFiles(projectRoot);\n if (cssFiles.length === 0) return undefined;\n\n const allTokens: TokenEntry[] = [];\n let prefix = '';\n\n for (const filePath of cssFiles) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const tokens = extractCustomProperties(content);\n allTokens.push(...tokens);\n } catch {\n continue;\n }\n }\n\n if (allTokens.length === 0) return undefined;\n\n // Detect common prefix\n prefix = detectPrefix(allTokens.map(t => t.name));\n\n // Group by category (inferred from token name)\n const categories: Record<string, TokenEntry[]> = {};\n for (const token of allTokens) {\n const category = inferTokenCategory(token.name);\n if (!categories[category]) categories[category] = [];\n // Deduplicate by name (keep first occurrence — light mode)\n if (!categories[category].some(t => t.name === token.name)) {\n categories[category].push(token);\n }\n }\n\n return {\n prefix,\n total: Object.values(categories).reduce((sum, arr) => sum + arr.length, 0),\n categories,\n };\n}\n\n/**\n * Find CSS files in common project locations.\n */\nfunction discoverCssFiles(projectRoot: string): string[] {\n const files: string[] = [];\n const searchDirs = [\n 'src', 'styles', 'css', 'app',\n ].map(d => join(projectRoot, d)).filter(d => existsSync(d));\n\n // Also check root for standalone CSS files\n searchDirs.push(projectRoot);\n\n for (const dir of searchDirs) {\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n const ext = extname(entry.name);\n if (ext === '.css' || ext === '.scss') {\n files.push(join(dir, entry.name));\n }\n }\n } catch {\n continue;\n }\n }\n\n // Also check one level deep in src/\n const srcDir = join(projectRoot, 'src');\n if (existsSync(srcDir)) {\n try {\n for (const subEntry of readdirSync(srcDir, { withFileTypes: true })) {\n if (subEntry.isDirectory() && ['styles', 'css', 'theme', 'tokens'].includes(subEntry.name)) {\n const subDir = join(srcDir, subEntry.name);\n for (const file of readdirSync(subDir, { withFileTypes: true })) {\n if (file.isFile() && (file.name.endsWith('.css') || file.name.endsWith('.scss'))) {\n files.push(join(subDir, file.name));\n }\n }\n }\n }\n } catch {\n // ignore\n }\n }\n\n return [...new Set(files)]; // deduplicate\n}\n\n/**\n * Extract CSS custom property declarations from file content.\n * Handles :root { ... } blocks and extracts --name: value; pairs.\n * Only extracts from :root and top-level selectors (not nested component styles).\n */\nfunction extractCustomProperties(content: string): TokenEntry[] {\n const tokens: TokenEntry[] = [];\n // Only extract from :root, .dark, [data-theme], @theme blocks\n // Track if we're inside a relevant block\n let inRelevantBlock = false;\n let braceDepth = 0;\n const relevantSelectors = [':root', '.dark', '[data-theme', '@theme'];\n\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Check if entering a relevant block\n if (!inRelevantBlock && braceDepth === 0) {\n if (relevantSelectors.some(sel => trimmed.startsWith(sel) || trimmed.includes(sel))) {\n if (trimmed.includes('{')) {\n inRelevantBlock = true;\n braceDepth = 1;\n }\n }\n }\n\n // Track brace depth\n if (inRelevantBlock) {\n for (const ch of trimmed) {\n if (ch === '{') braceDepth++;\n else if (ch === '}') {\n braceDepth--;\n if (braceDepth <= 0) {\n inRelevantBlock = false;\n braceDepth = 0;\n }\n }\n }\n }\n\n // Only extract tokens from relevant blocks, or at top level in @theme\n if (!inRelevantBlock && braceDepth === 0) continue;\n\n const match = trimmed.match(/^(--[\\w-]+)\\s*:\\s*(.+?)\\s*;/);\n if (match) {\n const [, name, value] = match;\n // Extract inline comment as description\n const commentMatch = value.match(/\\/\\*\\s*(.+?)\\s*\\*\\//);\n const cleanValue = value.replace(/\\/\\*.*?\\*\\//, '').trim();\n tokens.push({\n name,\n value: cleanValue,\n description: commentMatch?.[1],\n });\n }\n }\n\n return tokens;\n}\n\n/**\n * Detect common prefix from token names.\n * e.g., [\"--fui-color-accent\", \"--fui-space-2\"] → \"--fui-\"\n * e.g., [\"--background\", \"--foreground\"] → \"--\"\n */\nfunction detectPrefix(names: string[]): string {\n if (names.length === 0) return '--';\n // Remove the leading -- for comparison\n const stripped = names.map(n => n.slice(2));\n // Find common prefix among stripped names\n let prefix = '';\n const first = stripped[0];\n for (let i = 0; i < first.length; i++) {\n const ch = first[i];\n if (stripped.every(n => n[i] === ch)) {\n prefix += ch;\n } else {\n break;\n }\n }\n // Only use prefix if it ends at a word boundary (-)\n const lastDash = prefix.lastIndexOf('-');\n if (lastDash > 0) {\n return '--' + prefix.slice(0, lastDash + 1);\n }\n return '--';\n}\n\n/**\n * Infer token category from its name using naming conventions.\n */\nfunction inferTokenCategory(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('color') || n.includes('background') || n.includes('foreground') ||\n n.includes('primary') || n.includes('secondary') || n.includes('accent') ||\n n.includes('muted') || n.includes('destructive') || n.includes('popover') ||\n n.includes('card') && !n.includes('card-') || n.includes('chart')) {\n return 'colors';\n }\n if (n.includes('font') || n.includes('text') || n.includes('letter') || n.includes('line-height')) {\n return 'typography';\n }\n if (n.includes('space') || n.includes('gap') || n.includes('padding') || n.includes('margin')) {\n return 'spacing';\n }\n if (n.includes('radius')) {\n return 'radius';\n }\n if (n.includes('shadow')) {\n return 'shadows';\n }\n if (n.includes('border')) {\n return 'borders';\n }\n if (n.includes('ring')) {\n return 'focus';\n }\n if (n.includes('sidebar')) {\n return 'sidebar';\n }\n if (n.includes('input')) {\n return 'forms';\n }\n return 'other';\n}\n","import type {\n McpComponent,\n McpSnapshot,\n McpToken,\n McpTokenData,\n} from '@fragments-sdk/core';\nimport type { DesignSystemData } from '../types.js';\nimport type { DataAdapter } from './types.js';\nimport { buildCapabilities, validateSnapshot } from './snapshot-converters.js';\nimport { isGarbageToken } from '../token-suggestions.js';\n\nconst DEFAULT_CLOUD_URL = 'https://app.usefragments.com/api/catalog';\n\ninterface CloudCatalogResponse {\n version: 1;\n org: {\n id: string;\n name: string;\n slug: string;\n };\n designSystem?: {\n name?: string;\n packageName?: string | null;\n importPath?: string | null;\n };\n sourceBinding?: {\n repoFullName?: string;\n };\n revision?: string;\n updatedAt?: number;\n components?: Array<{\n componentKey: string;\n publicRef?: string;\n publicSlug?: string | null;\n isCanonical?: boolean;\n name: string;\n category?: string;\n status?: string;\n tier?: string;\n description?: string;\n usageGuidance?: string;\n dos?: string[];\n donts?: string[];\n props?: Record<\n string,\n {\n type?: string;\n values?: string[];\n required?: boolean;\n default?: unknown;\n description?: string;\n }\n >;\n relations?: Array<{\n component?: string;\n componentKey?: string;\n relationship?: string;\n type?: string;\n note?: string;\n description?: string;\n }>;\n compoundChildren?: Array<{\n name: string;\n componentKey?: string;\n description?: string;\n required?: boolean;\n accepts?: string[];\n subcomponentVisibility?: 'public' | 'internal';\n }>;\n examples?: Array<{\n title?: string;\n kind?: string;\n code?: string;\n }>;\n sourcePath?: string;\n sourceRepoFullName?: string;\n packageName?: string | null;\n importPath?: string | null;\n parentComponentName?: string;\n parentComponentKey?: string;\n }>;\n tokens?: {\n flat?: Array<{\n name: string;\n value?: string;\n category?: string;\n path?: string[];\n type?: string;\n description?: string;\n }>;\n };\n}\n\ninterface CloudValidateFixResponse {\n target?: string;\n content?: {\n version: 1;\n catalogRevision: string;\n updatedAt: number;\n designSystem?: CloudCatalogResponse['designSystem'];\n policy?: {\n mode?: 'cloud';\n endpoint?: string;\n };\n components?: Array<\n NonNullable<CloudCatalogResponse['components']>[number] & {\n publicRef: string;\n isActive?: boolean;\n selection?: 'preferred' | 'allowed' | 'discouraged' | 'forbidden';\n reasons?: string[];\n }\n >;\n };\n}\n\nfunction mergeDesignSystemMetadata(\n catalogDesignSystem: CloudCatalogResponse['designSystem'],\n contextDesignSystem: CloudCatalogResponse['designSystem'],\n): CloudCatalogResponse['designSystem'] {\n return {\n name: catalogDesignSystem?.name ?? contextDesignSystem?.name,\n packageName:\n catalogDesignSystem?.packageName ?? contextDesignSystem?.packageName ?? null,\n importPath:\n catalogDesignSystem?.importPath ??\n contextDesignSystem?.importPath ??\n catalogDesignSystem?.packageName ??\n contextDesignSystem?.packageName ??\n null,\n };\n}\n\nfunction chooseComponentSource(args: {\n catalogComponents: NonNullable<CloudCatalogResponse['components']>;\n contextComponents: NonNullable<\n NonNullable<CloudValidateFixResponse['content']>['components']\n >;\n}) {\n if (args.contextComponents.length > args.catalogComponents.length) {\n return args.contextComponents;\n }\n return args.catalogComponents;\n}\n\nfunction dominantString(values: Array<string | null | undefined>): string | undefined {\n const counts = new Map<string, number>();\n for (const value of values) {\n const trimmed = typeof value === 'string' ? value.trim() : '';\n if (!trimmed) continue;\n counts.set(trimmed, (counts.get(trimmed) ?? 0) + 1);\n }\n\n const ranked = [...counts.entries()].sort(\n (a, b) => b[1] - a[1] || a[0].localeCompare(b[0]),\n );\n if (ranked.length === 0) return undefined;\n if (ranked[1] && ranked[1][1] === ranked[0][1]) return undefined;\n return ranked[0][0];\n}\n\nfunction inferDesignSystemMetadataFromComponents(\n components: NonNullable<CloudCatalogResponse['components']>,\n): Pick<NonNullable<CloudCatalogResponse['designSystem']>, 'packageName' | 'importPath'> {\n const packageName = dominantString(\n components.map((component) => component.packageName),\n );\n const packageComponents = packageName\n ? components.filter((component) => component.packageName === packageName)\n : components;\n const importPath = dominantString(\n packageComponents.map(\n (component) => component.importPath ?? component.packageName,\n ),\n );\n return {\n packageName: packageName ?? null,\n importPath: importPath ?? packageName ?? null,\n };\n}\n\ntype CloudCatalogToken = NonNullable<\n NonNullable<CloudCatalogResponse['tokens']>['flat']\n>[number];\n\nconst TOKEN_CATEGORY_ALIASES: Record<string, string[]> = {\n color: ['color', 'colors', 'accent', 'background', 'foreground', 'danger', 'brand'],\n spacing: ['spacing', 'space', 'padding', 'margin', 'gap', 'inset'],\n typography: ['typography', 'font', 'text', 'copy', 'line-height', 'letter'],\n border: ['border', 'borders', 'stroke', 'outline'],\n radius: ['radius', 'radii', 'corner', 'corners', 'rounded'],\n shadow: ['shadow', 'shadows', 'elevation'],\n layout: ['layout', 'grid', 'container', 'breakpoint'],\n focus: ['focus', 'ring', 'focus-ring'],\n surface: ['surface', 'surfaces', 'canvas', 'card', 'background'],\n};\n\nfunction normalizeCatalogUrl(url?: string): string {\n if (!url) return DEFAULT_CLOUD_URL;\n if (url.endsWith('/api/catalog')) return url;\n return `${url.replace(/\\/+$/, '')}/api/catalog`;\n}\n\nfunction normalizeValidateFixUrl(url?: string): string {\n const base = normalizeCatalogUrl(url).replace(/\\/api\\/catalog$/, '');\n return `${base}/api/context?target=validate-fix`;\n}\n\nfunction normalizeValue(value?: string) {\n return value?.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim() ?? '';\n}\n\nfunction canonicalizeTokenCategory(\n token: CloudCatalogToken,\n) {\n const candidates = [\n token.category,\n token.path?.[0],\n token.name.split(/[.:/-]/)[0],\n ]\n .map(normalizeValue)\n .filter(Boolean);\n\n for (const candidate of candidates) {\n for (const [canonical, aliases] of Object.entries(\n TOKEN_CATEGORY_ALIASES,\n )) {\n if (\n candidate === canonical ||\n aliases.some(\n (alias) =>\n candidate === alias ||\n candidate.includes(alias) ||\n alias.includes(candidate),\n )\n ) {\n return canonical;\n }\n }\n }\n\n return candidates[0] || 'other';\n}\n\nfunction groupTokens(flat: NonNullable<CloudCatalogResponse['tokens']>['flat']): McpTokenData {\n const categories: Record<string, McpToken[]> = {};\n const normalizedFlat = (flat ?? [])\n .filter((token) => !isGarbageToken(token))\n .map((token) => {\n const category = canonicalizeTokenCategory(token);\n const normalized: McpToken = {\n name: token.name,\n category,\n value: token.value,\n description: token.description,\n path: token.path,\n type: token.type,\n };\n if (!categories[category]) {\n categories[category] = [];\n }\n categories[category].push(normalized);\n return normalized;\n });\n\n return {\n prefix: '',\n total: normalizedFlat.length,\n categories,\n flat: normalizedFlat,\n };\n}\n\nfunction mapComponent(\n component: NonNullable<CloudCatalogResponse['components']>[number],\n designSystem: CloudCatalogResponse['designSystem'],\n): McpComponent {\n return {\n id: component.componentKey,\n name: component.name,\n description: component.description ?? '',\n category: component.category ?? 'uncategorized',\n status: component.status ?? 'stable',\n tags: [],\n props: Object.fromEntries(\n Object.entries(component.props ?? {}).map(([propName, prop]) => [\n propName,\n {\n type: prop.type ?? 'unknown',\n description: prop.description ?? '',\n required: prop.required ?? false,\n default: prop.default,\n values: prop.values,\n },\n ]),\n ),\n propsSummary: Object.entries(component.props ?? {}).map(\n ([propName, prop]) =>\n `${propName}${prop.required ? ' (required)' : ''}: ${prop.type ?? 'unknown'}`,\n ),\n examples: (component.examples ?? []).map((example) => ({\n name: example.title ?? 'Example',\n description: example.kind,\n code: example.code,\n kind: example.kind,\n })),\n relations: (component.relations ?? []).map((relation) => ({\n componentName: relation.component ?? relation.componentKey ?? 'Unknown',\n componentId: relation.componentKey,\n relationship: relation.relationship ?? relation.type ?? 'related',\n note: relation.note,\n description: relation.description,\n })),\n compoundChildren: (component.compoundChildren ?? [])\n .filter((child) => child.subcomponentVisibility !== 'internal')\n .map((child) => ({\n name: child.name,\n componentId: child.componentKey,\n description: child.description,\n required: child.required,\n accepts: child.accepts,\n visibility:\n child.subcomponentVisibility === 'internal'\n ? 'internal'\n : 'public',\n })),\n guidance: {\n when: component.usageGuidance ? [component.usageGuidance] : [],\n whenNot: component.donts ?? [],\n guidelines: component.usageGuidance ? [component.usageGuidance] : [],\n accessibility: [],\n usageGuidance: component.usageGuidance,\n dos: component.dos ?? [],\n donts: component.donts ?? [],\n patterns: [],\n },\n sourceType: 'cloud',\n sourcePath: component.sourcePath,\n sourceRepoFullName:\n component.sourceRepoFullName ?? undefined,\n packageName: component.packageName ?? designSystem?.packageName ?? undefined,\n importPath:\n component.importPath ??\n component.packageName ??\n designSystem?.importPath ??\n designSystem?.packageName ??\n undefined,\n publicRef: component.publicRef,\n publicSlug: component.publicSlug ?? null,\n isCanonical: component.isCanonical ?? false,\n tier: component.tier,\n parentComponentId: component.parentComponentKey,\n parentComponentName: component.parentComponentName,\n metadata: {\n a11yRules: [],\n scenarioTags: [],\n },\n } as McpComponent;\n}\n\nfunction normalizeValidateFixContext(\n raw: CloudValidateFixResponse,\n): DesignSystemData['validateFixContext'] | undefined {\n const content = raw.content;\n if (!content || !Array.isArray(content.components)) {\n return undefined;\n }\n\n const components = content.components\n .filter(\n (component): component is NonNullable<\n NonNullable<CloudValidateFixResponse['content']>['components']\n >[number] =>\n Boolean(component?.componentKey) &&\n Boolean(component?.publicRef) &&\n Boolean(component?.name) &&\n Boolean(component?.selection),\n )\n .map((component) => ({\n componentKey: component.componentKey,\n publicRef: component.publicRef,\n name: component.name,\n category: component.category ?? 'uncategorized',\n status: component.status ?? 'stable',\n tier: component.tier ?? 'composition',\n isCanonical: component.isCanonical ?? false,\n isActive: component.isActive ?? true,\n selection: component.selection ?? 'allowed',\n reasons: component.reasons ?? [],\n usageGuidance: component.usageGuidance,\n dos: component.dos ?? [],\n donts: component.donts ?? [],\n }));\n\n return {\n version: 1,\n catalogRevision: content.catalogRevision,\n updatedAt: content.updatedAt,\n policy: {\n mode: 'cloud',\n endpoint: content.policy?.endpoint ?? '/api/govern/policy',\n },\n components,\n };\n}\n\nexport class CloudCatalogAdapter implements DataAdapter {\n readonly name = 'cloud';\n\n constructor(\n private readonly options: {\n apiKey: string;\n url?: string;\n },\n ) {}\n\n async load(_projectRoot: string): Promise<DesignSystemData> {\n const headers = {\n 'X-API-Key': this.options.apiKey,\n };\n const [response, validateFixResponse] = await Promise.all([\n fetch(normalizeCatalogUrl(this.options.url), { headers }),\n fetch(normalizeValidateFixUrl(this.options.url), { headers }).catch(\n () => null,\n ),\n ]);\n\n if (!response.ok) {\n throw new Error(\n `Failed to load Cloud catalog (${response.status} ${response.statusText}).`,\n );\n }\n\n const raw = (await response.json()) as CloudCatalogResponse;\n const validateFixRaw =\n validateFixResponse && validateFixResponse.ok\n ? ((await validateFixResponse.json()) as CloudValidateFixResponse)\n : undefined;\n const sourceComponents = chooseComponentSource({\n catalogComponents: raw.components ?? [],\n contextComponents: validateFixRaw?.content?.components ?? [],\n });\n const inferredDesignSystem =\n inferDesignSystemMetadataFromComponents(sourceComponents);\n const designSystem = mergeDesignSystemMetadata(\n {\n ...raw.designSystem,\n packageName:\n raw.designSystem?.packageName ?? inferredDesignSystem.packageName,\n importPath:\n raw.designSystem?.importPath ?? inferredDesignSystem.importPath,\n },\n validateFixRaw?.content?.designSystem,\n );\n const components = Object.fromEntries(\n sourceComponents.map((component) => [\n component.componentKey,\n mapComponent(component, designSystem),\n ]),\n );\n const tokens = raw.tokens?.flat ? groupTokens(raw.tokens.flat) : undefined;\n const packageName = designSystem?.packageName ?? undefined;\n const importPath =\n designSystem?.importPath ?? designSystem?.packageName ?? undefined;\n const packageMap = Object.fromEntries(\n Object.values(components)\n .map((component) => [\n component.name,\n component.importPath ?? component.packageName ?? packageName,\n ])\n .filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === 'string' && entry[1].length > 0,\n ),\n );\n\n const snapshot: McpSnapshot = validateSnapshot({\n schemaVersion: 1,\n sourceType: 'cloud',\n sourceLabel: 'Fragments Cloud catalog',\n capabilities: buildCapabilities({\n components,\n tokens,\n }),\n metadata: {\n designSystemName: designSystem?.name ?? raw.org.name,\n packageName,\n importPath,\n revision: raw.revision,\n updatedAt:\n typeof raw.updatedAt === 'number'\n ? new Date(raw.updatedAt).toISOString()\n : undefined,\n },\n components,\n tokens,\n packageMap,\n defaultPackageName: packageName,\n });\n const validateFixContext = validateFixRaw\n ? normalizeValidateFixContext(validateFixRaw)\n : undefined;\n const hydratedComponents = Object.fromEntries(\n Object.entries(snapshot.components).map(([componentId, component]) => [\n componentId,\n {\n ...component,\n isCanonical:\n (components[componentId] as { isCanonical?: boolean } | undefined)\n ?.isCanonical ?? false,\n },\n ]),\n );\n\n return {\n snapshot: {\n ...snapshot,\n components: hydratedComponents,\n },\n components: hydratedComponents,\n blocks: snapshot.blocks,\n tokens: snapshot.tokens,\n graph: undefined,\n performanceSummary: undefined,\n packageMap: snapshot.packageMap,\n defaultPackageName: snapshot.defaultPackageName,\n validateFixContext,\n capabilities: new Set(snapshot.capabilities),\n };\n }\n}\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport type {\n BundleComponentShard,\n BundleManifest,\n BundleTokenFile,\n McpComponent,\n McpSnapshot,\n} from '@fragments-sdk/core';\nimport {\n bundleComponentShardSchema,\n bundleManifestSchema,\n bundleTokenFileSchema,\n} from '@fragments-sdk/core';\nimport { BRAND } from '../constants.js';\nimport { findBundleManifest } from '../discovery.js';\nimport type { DesignSystemData } from '../types.js';\nimport type { DataAdapter } from './types.js';\nimport { buildCapabilities, validateSnapshot } from './snapshot-converters.js';\n\nasync function readJsonFile<T>(\n path: string,\n parser: { parse(value: unknown): T },\n label: string,\n): Promise<T> {\n const content = await readFile(path, 'utf-8');\n try {\n return parser.parse(JSON.parse(content));\n } catch (error) {\n throw new Error(\n `Invalid ${label} at ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n\nfunction normalizeProps(\n props: BundleComponentShard['component']['props'],\n): McpComponent['props'] {\n return Object.fromEntries(\n Object.entries(props ?? {}).map(([propName, value]) => {\n const prop =\n value && typeof value === 'object' ? (value as Record<string, unknown>) : {};\n return [\n propName,\n {\n type:\n typeof prop.type === 'string' && prop.type.length > 0\n ? prop.type\n : 'unknown',\n description:\n typeof prop.description === 'string' ? prop.description : '',\n required: Boolean(prop.required),\n default: prop.default,\n values: Array.isArray(prop.values)\n ? prop.values.filter((entry): entry is string => typeof entry === 'string')\n : undefined,\n constraints: Array.isArray(prop.constraints)\n ? prop.constraints.filter(\n (entry): entry is string => typeof entry === 'string',\n )\n : undefined,\n },\n ];\n }),\n );\n}\n\nfunction normalizeExamples(\n examples: BundleComponentShard['component']['examples'],\n): McpComponent['examples'] {\n return examples.map((example) => {\n const record =\n example && typeof example === 'object'\n ? (example as Record<string, unknown>)\n : {};\n return {\n name:\n (typeof record.title === 'string' && record.title) ||\n (typeof record.name === 'string' && record.name) ||\n 'Example',\n description:\n typeof record.description === 'string'\n ? record.description\n : undefined,\n code: typeof record.code === 'string' ? record.code : undefined,\n kind: typeof record.kind === 'string' ? record.kind : undefined,\n };\n });\n}\n\nfunction normalizeRelations(\n relations: BundleComponentShard['component']['relations'],\n fallback: BundleManifest['components'][string]['relations'],\n): McpComponent['relations'] {\n if (relations.length > 0) {\n return relations.map((relation) => {\n const record =\n relation && typeof relation === 'object'\n ? (relation as Record<string, unknown>)\n : {};\n return {\n componentName:\n (typeof record.component === 'string' && record.component) ||\n (typeof record.name === 'string' && record.name) ||\n (typeof record.componentName === 'string' && record.componentName) ||\n (typeof record.componentId === 'string' && record.componentId) ||\n 'Unknown',\n componentId:\n typeof record.componentId === 'string'\n ? record.componentId\n : undefined,\n relationship:\n (typeof record.relationship === 'string' && record.relationship) ||\n (typeof record.type === 'string' && record.type) ||\n 'related',\n note: typeof record.note === 'string' ? record.note : undefined,\n description:\n typeof record.description === 'string'\n ? record.description\n : undefined,\n };\n });\n }\n\n return fallback.map((relation) => ({\n componentName: relation.name,\n componentId: relation.componentId,\n relationship: relation.type,\n }));\n}\n\nfunction buildComponent(\n manifest: BundleManifest,\n entry: BundleManifest['components'][string],\n shard: BundleComponentShard,\n): McpComponent {\n const sourcePackage =\n manifest.designSystem.importPath ?? manifest.designSystem.packageName ?? undefined;\n const component = shard.component;\n const componentRecord = component as typeof component & {\n isCanonical?: boolean;\n };\n const props = normalizeProps(component.props);\n\n return {\n id: shard.componentId,\n name: component.name,\n description: component.description,\n category: component.category,\n status: component.status,\n tags: [],\n props,\n propsSummary: Object.entries(props).map(([propName, prop]) =>\n `${propName}${prop.required ? ' (required)' : ''}: ${prop.type}`,\n ),\n examples: normalizeExamples(component.examples),\n relations: normalizeRelations(component.relations, entry.relations),\n compoundChildren: entry.compoundChildren.map((child) => ({\n name: child.name,\n componentId: child.componentId,\n visibility: 'public',\n })),\n guidance: {\n when: component.usageGuidance ? [component.usageGuidance] : [],\n whenNot: component.donts,\n guidelines: component.usageGuidance ? [component.usageGuidance] : [],\n accessibility: [],\n usageGuidance: component.usageGuidance || undefined,\n dos: component.dos,\n donts: component.donts,\n patterns: [],\n },\n sourceType: 'bundle',\n sourcePath: component.sourcePath,\n sourceRepoFullName: component.sourceRepoFullName,\n packageName: manifest.designSystem.packageName ?? undefined,\n importPath: sourcePackage,\n publicRef: component.publicRef,\n publicSlug: component.publicSlug,\n isCanonical: componentRecord.isCanonical ?? component.tier === 'core',\n tier: component.tier,\n parentComponentName: component.parentComponentName,\n metadata: {\n a11yRules: [],\n scenarioTags: [],\n },\n } as McpComponent;\n}\n\nexport class BundleAdapter implements DataAdapter {\n readonly name = 'bundle';\n\n discover(startDir: string): string[] {\n return findBundleManifest(startDir);\n }\n\n async load(projectRoot: string): Promise<DesignSystemData> {\n const manifests = this.discover(projectRoot);\n\n if (manifests.length === 0) {\n throw new Error(\n `No ${BRAND.dataDir}/${BRAND.manifestFile} found. Run \\`${BRAND.cliCommand} context install --cloud\\` or commit a Fragments bundle into your workspace.`,\n );\n }\n\n const manifestPath = manifests[0];\n const manifest = await readJsonFile(\n manifestPath,\n bundleManifestSchema,\n 'bundle manifest',\n );\n const bundleDir = dirname(manifestPath);\n const repoRoot = dirname(bundleDir);\n\n const tokensPath = resolve(bundleDir, 'tokens.json');\n const tokensFile = existsSync(tokensPath)\n ? await readJsonFile(tokensPath, bundleTokenFileSchema, 'bundle tokens')\n : undefined;\n\n const components = Object.fromEntries(\n await Promise.all(\n Object.values(manifest.components).map(async (entry) => {\n const shardPath = resolve(repoRoot, entry.file);\n const shard = await readJsonFile(\n shardPath,\n bundleComponentShardSchema,\n `bundle component shard (${entry.name})`,\n );\n return [entry.componentId, buildComponent(manifest, entry, shard)] as const;\n }),\n ),\n );\n\n const packageName =\n manifest.designSystem.importPath ?? manifest.designSystem.packageName ?? undefined;\n const packageMap = packageName\n ? Object.fromEntries(\n Object.values(components).map((component) => [component.name, packageName]),\n )\n : {};\n\n const tokens = tokensFile\n ? {\n prefix: '',\n total: tokensFile.flat.length,\n categories: Object.fromEntries(\n Object.entries(tokensFile.categories).map(([category, value]) => [\n category,\n value.tokens.map((token) => ({\n name: token.name,\n category: token.category,\n value: token.value,\n description: token.description,\n path: token.path,\n type: token.type,\n })),\n ]),\n ),\n flat: tokensFile.flat.map((token) => ({\n name: token.name,\n category: token.category,\n value: token.value,\n description: token.description,\n path: token.path,\n type: token.type,\n })),\n }\n : undefined;\n\n const snapshot: McpSnapshot = validateSnapshot({\n schemaVersion: 1,\n sourceType: 'bundle',\n sourceLabel: `${BRAND.dataDir}/${BRAND.manifestFile}`,\n capabilities: buildCapabilities({\n components,\n tokens,\n }),\n metadata: {\n designSystemName: manifest.designSystem.name,\n packageName: manifest.designSystem.packageName ?? undefined,\n importPath: manifest.designSystem.importPath ?? undefined,\n revision: manifest.catalogRevision,\n updatedAt: manifest.catalogUpdatedAt,\n },\n components,\n tokens,\n packageMap,\n defaultPackageName: packageName,\n });\n const hydratedComponents = Object.fromEntries(\n Object.entries(snapshot.components).map(([componentId, component]) => [\n componentId,\n {\n ...component,\n isCanonical:\n (components[componentId] as { isCanonical?: boolean } | undefined)\n ?.isCanonical ?? component.tier === 'core',\n },\n ]),\n );\n\n return {\n snapshot: {\n ...snapshot,\n components: hydratedComponents,\n },\n components: hydratedComponents,\n blocks: snapshot.blocks,\n tokens: snapshot.tokens,\n graph: snapshot.graph,\n performanceSummary: snapshot.performanceSummary,\n packageMap: snapshot.packageMap,\n defaultPackageName: snapshot.defaultPackageName,\n capabilities: new Set(snapshot.capabilities),\n };\n }\n}\n","export const UI_SPEC_SCHEMA_URI = 'fragments://schemas/govern.schema';\nexport const UI_SPEC_SCHEMA_NAME = 'govern.schema';\nexport const UI_SPEC_SCHEMA_MIME_TYPE = 'application/schema+json';\n\nexport const UI_SPEC_SCHEMA_RESOURCE = {\n $schema: 'https://json-schema.org/draft/2020-12/schema',\n $id: UI_SPEC_SCHEMA_URI,\n title: 'Fragments UI Spec',\n description:\n 'Input shape accepted by the Fragments govern and validate_and_fix MCP tools.',\n type: 'object',\n required: ['nodes'],\n additionalProperties: false,\n properties: {\n root: {\n type: 'string',\n description:\n 'Optional node id to treat as the root. When omitted, top-level nodes are evaluated in order.',\n },\n metadata: {\n type: 'object',\n description:\n 'Optional caller metadata. The validator stores and echoes only fields that downstream tools understand.',\n additionalProperties: true,\n },\n nodes: {\n type: 'array',\n description:\n 'Top-level UI nodes. Each node names a component type and may carry props plus nested children.',\n items: { $ref: '#/$defs/node' },\n },\n },\n $defs: {\n node: {\n type: 'object',\n required: ['type'],\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n description:\n 'Stable caller-provided id. Used in violations and fixedSpec patches.',\n },\n type: {\n type: 'string',\n description:\n 'Design-system component name, including compound names such as \"DatePicker.Trigger\".',\n },\n props: {\n type: 'object',\n description:\n 'Component props. Put simple text labels in props.children, e.g. { \"children\": \"Save\" }.',\n additionalProperties: true,\n },\n children: {\n description:\n 'Nested child nodes, or a string text child for leaf content. Prefer props.children for simple button labels.',\n oneOf: [\n { type: 'string' },\n {\n type: 'array',\n items: {\n oneOf: [{ type: 'string' }, { $ref: '#/$defs/node' }],\n },\n },\n ],\n },\n },\n },\n },\n examples: {\n valid: [\n {\n nodes: [\n {\n id: 'save',\n type: 'Button',\n props: { variant: 'primary', children: 'Save' },\n },\n ],\n },\n {\n root: 'card',\n metadata: { source: 'agent-draft' },\n nodes: [\n {\n id: 'card',\n type: 'Card',\n props: {},\n children: [\n {\n id: 'title',\n type: 'Heading',\n props: { level: 2, children: 'Billing' },\n },\n {\n id: 'submit',\n type: 'Button',\n props: { children: 'Update plan' },\n },\n ],\n },\n ],\n },\n ],\n invalid: [\n {\n reason: 'String event handlers are blocked by safety/no-string-handlers.',\n spec: {\n nodes: [\n {\n id: 'danger',\n type: 'Button',\n props: { children: 'Save', onClick: 'alert(\"saved\")' },\n },\n ],\n },\n },\n {\n reason:\n 'Raw CSS values should use design tokens; call tokens.suggest before writing them.',\n spec: {\n nodes: [\n {\n id: 'panel',\n type: 'Box',\n props: { style: { padding: '6px' } },\n },\n ],\n },\n },\n ],\n },\n notes: [\n 'Use component names from the active catalog; unknown components fail components/allow.',\n 'Use props.children for simple text labels, especially Button text.',\n 'Do not put JavaScript source strings in event handler props.',\n 'Run validate_and_fix after govern when the verdict asks for revision or deterministic repair.',\n ],\n} as const;\n\nexport function serializeUiSpecSchema(): string {\n return JSON.stringify(UI_SPEC_SCHEMA_RESOURCE, null, 2);\n}\n"],"mappings":";;;;;AASA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,QAAAC,aAAY;AACrB,SAAS,qBAAqB;;;ACvB9B,SAAS,cAAc,kBAAkB;AACzC,SAAS,YAAY;AAkDd,SAAS,eAAe,aAA6C;AAE1E,QAAM,aAAa,KAAK,aAAa,oBAAoB;AACzD,MAAI,WAAW,UAAU,GAAG;AAC1B,QAAI;AACF,YAAM,UAAU,aAAa,YAAY,OAAO;AAChD,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,SAAS,GAAG;AACV,YAAM,IAAI,MAAM,mBAAmB,UAAU,KAAK,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,IAChG;AAAA,EACF;AAGA,QAAM,UAAU,KAAK,aAAa,cAAc;AAChD,MAAI,WAAW,OAAO,GAAG;AACvB,QAAI;AACF,YAAM,UAAU,aAAa,SAAS,OAAO;AAC7C,YAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,UAAI,IAAI,MAAO,QAAO,IAAI;AAAA,IAC5B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;;;ADjDA,SAAS,eAAe,gBAAgB,4BAA4B;;;AE3BpE,SAAS,gBAAAC,qBAAoB;AAM7B,SAAS,qBAA6B;AACpC,MAAI;AACF,UAAM,MAAMA,cAAa,IAAI,IAAI,mBAAmB,YAAY,GAAG,GAAG,OAAO;AAC7E,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,WAAO,IAAI,WAAW;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,qBAAqB,mBAAmB;;;ACT9C,SAAS,eAAe,MAAqC;AAClE,QAAM,eACJ,KAAK,oBAAoB,aAAa,KAAK,SAAS,SAAS;AAC/D,QAAM,YACJ,OAAO,iBAAiB,WACpB,IAAI,KAAK,YAAY,EAAE,YAAY,IACnC;AAEN,SAAO;AAAA,IACL,iBACE,KAAK,oBAAoB,mBAAmB,KAAK,SAAS,SAAS;AAAA,IACrE;AAAA,EACF;AACF;;;ACqCO,SAAS,kBAAkB,UAAkB,OAAqC;AACvF,QAAM,OAAO,SAAS,YAAY,EAAE,KAAK;AACzC,QAAM,kBAAkB,OAAO,YAAY,EAAE,KAAK;AAElD,MAAI,KAAK,SAAS,QAAQ,EAAG,QAAO;AACpC,MAAI,KAAK,SAAS,SAAS,EAAG,QAAO;AACrC,MAAI,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,WAAW,GAAG;AAC1F,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,aAAa,KAAK,SAAS,kBAAkB;AACtF,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,QAAQ,EAAG,QAAO;AACpC,MACE,KAAK,SAAS,cAAc,KAC5B,SAAS,kBACT,SAAS,mBACT,SAAS,gBACT;AACA,WAAO;AAAA,EACT;AACA,MACE,KAAK,SAAS,OAAO,KACrB,SAAS,gBACT,KAAK,WAAW,aAAa,KAC7B,SAAS,UACT,SAAS,YACT,SAAS,iBACT,SAAS,mBACP,SAAS,YAAY,SAAS,cAAc,mBAAmB,eAAe,eAAe,GAC/F;AACA,WAAO;AAAA,EACT;AACA,MACE,SAAS,YACT,KAAK,WAAW,SAAS,KACzB,SAAS,aACT,KAAK,WAAW,UAAU,KAC1B,SAAS,SACT,SAAS,aACT,SAAS,gBACT,SAAS,WACT,SAAS,SACT,SAAS,WACT,SAAS,YACT,SAAS,UACT,KAAK,SAAS,OAAO,KACrB,KAAK,SAAS,QAAQ,GACtB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,OAGN;AACrB,QAAM,SAAS,kBAAkB,MAAM,UAAU,MAAM,KAAK;AAC5D,QAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE;AACxD,QAAM,aAAa,MAAM,SAAS,gBAAgB,MAAM,QAAQ,QAAQ,KAAK,IAAI,CAAC;AAClF,QAAM,MAAM,WAAW,MAAM,GAAG,KAAK,EAAE;AAAA,IAAI,CAAC,cAC1C,iBAAiB,WAAW,MAAM,MAAM;AAAA,EAC1C;AAEA,QAAM,OAAO;AAAA,IACX,gBAAgB;AAAA,IAChB,iBAAiB,MAAM;AAAA,IACvB,WAAW,MAAM;AAAA,IACjB,gBAAgB,WAAW;AAAA,EAC7B;AAEA,MAAI,WAAW,SAAS;AACtB,WAAO;AAAA,MACL,cAAc,CAAC;AAAA,MACf,cAAc;AAAA,MACd,oBAAoB,8CAA8C,MAAM,QAAQ;AAAA,MAChF,OAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,UAAU,MAAM,OAAO,UAAU,GAAG;AAC7C,WAAO;AAAA,MACL,cAAc,CAAC;AAAA,MACf,cAAc;AAAA,MACd,oBAAoB;AAAA,MACpB,OAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,IAAI,WAAW,GAAG;AACpB,WAAO;AAAA,MACL,cAAc,CAAC;AAAA,MACf,cAAc;AAAA,MACd,oBAAoB,MAAM,MAAM,2CAA2C,MAAM,QAAQ;AAAA,MACzF,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,CAAC,aAAa,GAAG,YAAY,IAAI;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT;AACF;AAEA,SAAS,gBACP,WACA,QACA,OACmB;AACnB,MAAI,WAAW,QAAS,QAAO,CAAC;AAChC,QAAM,QAAQ,yBAAyB,MAAM,KAAK;AAClD,QAAM,aACJ,UAAU,KAAK,SAAS,IACpB,UAAU,OACV,OAAO,OAAO,UAAU,UAAU,EAAE,KAAK;AAC/C,QAAM,eAAe,WAClB,OAAO,CAAC,UAAU,CAAC,eAAe,KAAK,CAAC,EACxC,IAAI,CAAC,WAAW,EAAE,OAAO,QAAQ,YAAY,KAAK,EAAE,EAAE,EACtD,OAAO,CAAC,UAAU,MAAM,WAAW,MAAM;AAE5C,QAAM,SAAS,aAAa,IAAI,CAAC,EAAE,MAAM,MAAM;AAC7C,UAAM,aAAa,yBAAyB,MAAM,KAAK;AACvD,QAAI,QAAQ;AACZ,QAAI,SAAgC;AAEpC,QAAI,SAAS,cAAc,UAAU,YAAY;AAC/C,eAAS;AACT,eAAS;AAAA,IACX,WAAW,SAAS,cAAc,WAAW,SAAS;AACpD,YAAM,gBAAgB,oBAAoB,OAAO,UAAU;AAC3D,UAAI,gBAAgB,GAAG;AACrB,iBAAS;AACT,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,aAAS,mBAAmB,OAAO,MAAM,UAAU,MAAM,OAAO;AAChE,WAAO,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EACxC,CAAC;AAED,SAAO,OACJ,OAAO,CAAC,cAAc,UAAU,QAAQ,CAAC,EACzC,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,KAAK,cAAc,EAAE,MAAM,IAAI,CAAC;AACjF;AAEA,SAAS,iBACP,WACA,WACmD;AACnD,QAAM,SAAS,eAAe,UAAU,KAAK;AAC7C,QAAM,gBAAgB,sBAAsB,UAAU,KAAK;AAC3D,QAAM,aACJ,UAAU,SAAS,MAAM,SAAS,UAAU,SAAS,KAAK,WAAW;AAEvE,SAAO;AAAA,IACL,MAAM,mBAAmB,UAAU,OAAO,SAAS;AAAA,IACnD,GAAI,UAAU,EAAE,OAAO;AAAA,IACvB,GAAI,UAAU;AAAA,MACZ,UAAU,gBAAgB,OAAO,MAAM,KAAK,aAAa,MAAM,OAAO,MAAM;AAAA,IAC9E;AAAA,IACA,GAAI,iBAAiB,EAAE,cAAc;AAAA,IACrC;AAAA,IACA,QAAQ,UAAU;AAAA,EACpB;AACF;AAEO,SAAS,eAAe,OAAkD;AAC/E,QAAM,QAAQ,MAAM,OAAO,KAAK;AAChC,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,GAAG,EAAG,QAAO;AACxD,MAAI,YAAY,KAAK,MAAM,IAAI,EAAG,QAAO;AACzC,SAAO;AACT;AAEA,SAAS,YAAY,OAAsC;AACzD,QAAM,WAAW;AAAA,IACf,MAAM;AAAA,IACN,MAAM;AAAA,IACN,GAAI,MAAM,QAAQ,CAAC;AAAA,IACnB,MAAM;AAAA,EACR,EACG,OAAO,OAAO,EACd,KAAK,GAAG,EACR,YAAY;AAEf,MAAI,2DAA2D,KAAK,QAAQ,GAAG;AAC7E,WAAO;AAAA,EACT;AACA,MAAI,oCAAoC,KAAK,QAAQ,EAAG,QAAO;AAC/D,MAAI,4DAA4D,KAAK,QAAQ,GAAG;AAC9E,WAAO;AAAA,EACT;AACA,MAAI,yBAAyB,KAAK,QAAQ,EAAG,QAAO;AACpD,MAAI,wDAAwD,KAAK,QAAQ,GAAG;AAC1E,WAAO;AAAA,EACT;AACA,MAAI,sCAAsC,KAAK,QAAQ,EAAG,QAAO;AACjE,MAAI,uBAAuB,KAAK,QAAQ,EAAG,QAAO;AAClD,MAAI,wEAAwE,KAAK,QAAQ,GAAG;AAC1F,WAAO;AAAA,EACT;AACA,MAAI,aAAa,KAAK,QAAQ,EAAG,QAAO;AACxC,SAAO;AACT;AAEA,SAAS,eAAe,OAAqC;AAC3D,MAAI,MAAM,KAAK,WAAW,IAAI,EAAG,QAAO,MAAM;AAC9C,QAAM,QAAQ,MAAM,OAAO,MAAM,iBAAiB;AAClD,SAAO,QAAQ,CAAC;AAClB;AAEA,SAAS,mBAAmB,OAAiB,WAAkC;AAC7E,MAAI,CAAC,MAAM,KAAK,WAAW,IAAI,EAAG,QAAO,MAAM;AAC/C,MAAI,OAAO,MAAM,KAAK,MAAM,CAAC;AAC7B,QAAM,SAAS,WAAW,QAAQ,QAAQ,OAAO,EAAE,EAAE,QAAQ,MAAM,EAAE;AACrE,MAAI,UAAU,KAAK,WAAW,GAAG,MAAM,GAAG,GAAG;AAC3C,WAAO,KAAK,MAAM,OAAO,SAAS,CAAC;AAAA,EACrC;AACA,SAAO,KAAK,QAAQ,MAAM,GAAG;AAC/B;AAEA,SAAS,sBAAsB,OAAqC;AAClE,QAAM,QAAQ,MAAM,OAAO,KAAK;AAChC,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,WAAW,MAAM,MAAM,4BAA4B,IAAI,CAAC,GAAG,KAAK;AACtE,MAAI,SAAU,QAAO;AACrB,MAAI,MAAM,WAAW,MAAM,EAAG,QAAO;AACrC,SAAO;AACT;AAEA,SAAS,yBAAyB,OAA+C;AAC/E,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,UAAU,MAAM,KAAK,EAAE,YAAY;AACzC,QAAM,QAAQ,eAAe,OAAO;AACpC,MAAI,MAAO,QAAO;AAClB,QAAM,SAAS,YAAY,OAAO;AAClC,MAAI,OAAQ,QAAO,GAAG,OAAO,KAAK,GAAG,OAAO,IAAI;AAChD,SAAO,QAAQ,QAAQ,QAAQ,GAAG;AACpC;AAEA,SAAS,eAAe,OAAwB;AAC9C,SAAO,qBAAqB,KAAK,KAAK,KAAK,YAAY,KAAK,KAAK,KAAK,YAAY,KAAK,KAAK;AAC9F;AAEA,SAAS,eAAe,OAAmC;AACzD,QAAM,MAAM,MAAM,MAAM,wCAAwC;AAChE,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,OAAO,IAAI,CAAC,EAAE,YAAY;AAChC,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,IAAI,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,EACtE;AACA,SAAO,IAAI,IAAI;AACjB;AAEA,SAAS,YAAY,OAA4D;AAC/E,QAAM,QAAQ,MAAM,MAAM,kCAAkC;AAC5D,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,EAAE,OAAO,OAAO,MAAM,CAAC,CAAC,GAAG,MAAM,MAAM,CAAC,EAAE;AACnD;AAEA,SAAS,oBAAoB,YAAoB,YAA4B;AAC3E,QAAM,QAAQ,YAAY,UAAU;AACpC,QAAM,QAAQ,YAAY,UAAU;AACpC,MAAI,CAAC,SAAS,CAAC,SAAS,MAAM,SAAS,MAAM,KAAM,QAAO;AAC1D,QAAM,WAAW,KAAK,IAAI,MAAM,QAAQ,MAAM,KAAK;AACnD,MAAI,aAAa,EAAG,QAAO;AAC3B,MAAI,YAAY,EAAG,QAAO;AAC1B,MAAI,YAAY,EAAG,QAAO;AAC1B,MAAI,YAAY,EAAG,QAAO;AAC1B,SAAO;AACT;AAEA,SAAS,mBACP,OACA,UACA,SACQ;AACR,QAAM,WAAW,CAAC,MAAM,MAAM,MAAM,UAAU,GAAI,MAAM,QAAQ,CAAC,CAAE,EAChE,KAAK,GAAG,EACR,YAAY;AACf,QAAM,OAAO,SAAS,YAAY;AAClC,MAAI,QAAQ;AACZ,aAAW,QAAQ,KAAK,MAAM,YAAY,EAAE,OAAO,CAACC,UAASA,MAAK,SAAS,CAAC,GAAG;AAC7E,QAAI,SAAS,SAAS,IAAI,EAAG,UAAS;AAAA,EACxC;AACA,MAAI,YAAY,eAAe,SAAS,SAAS,WAAW,EAAG,UAAS;AACxE,MAAI,YAAY,YAAY,SAAS,SAAS,QAAQ,EAAG,UAAS;AAClE,SAAO;AACT;;;ACzVO,IAAM,uBAAoC,OAAO,MAAM,QAAQ;AACpE,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU,EAAE,OAAO,wBAAwB,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,UAAU,KAAK;AACrB,QAAM,cAAc,eAAe,IAAI,IAAI;AAC3C,QAAMC,UAAS,aAAa;AAAA,IAC1B,QAAQ,IAAI,KAAK;AAAA,IACjB;AAAA,IACA,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,IACrD,SACE,YAAY,eAAe,YAAY,WAAW,YAAY,WAC1D,UACA;AAAA,IACN,iBAAiB,YAAY;AAAA,IAC7B,WAAW,YAAY;AAAA,EACzB,CAAC;AAED,SAAO;AAAA,IACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAUA,OAAM,EAAE,CAAC;AAAA,IACjE,OAAOA,QAAO;AAAA,EAChB;AACF;;;ACjCA,IAAM,mBAA6C;AAAA,EACjD,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AACT;AAqEA,SAAS,cAAc,MAA8B,iBAAiB,MAAe;AACnF,MAAI,SAAS,OAAW,QAAO;AAC/B,MAAI,OAAO,SAAS,UAAW,QAAO;AACtC,SAAO,KAAK,WAAW;AACzB;AAEA,SAAS,aACP,MACA,UACU;AACV,SAAO,OAAO,SAAS,YAAY,MAAM,WAAW,KAAK,WAAW;AACtE;AAEA,SAAS,YAAY,MAAuD;AAC1E,SAAO,OAAO,SAAS,YAAY,MAAM,UAAU,KAAK,UAAU,CAAC;AACrE;AAEA,SAAS,OAAO,MAAkB,UAA0B;AAC1D,SAAO,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK,QAAQ,QAAQ;AACjE;AAEA,SAAS,SAAS,MAA0B;AAC1C,SAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AACrD;AAEA,SAAS,WAAW,MAAsB;AACxC,QAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,SAAO,WAAW,IAAI,KAAK,MAAM,GAAG,QAAQ,IAAI;AAClD;AAEA,SAAS,UACP,OACA,SACM;AACN,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG;AAC3B,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,QAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,GAAG;AACpE;AAAA,IACF;AACA,UAAM,WAAW;AACjB,YAAQ,UAAU,KAAK;AACvB,cAAU,SAAS,UAAU,OAAO;AAAA,EACtC;AACF;AAEA,SAAS,aAAa,MAA4B;AAChD,QAAM,YAA0B,CAAC;AACjC,YAAU,KAAK,OAAO,CAAC,SAAS,UAAU,KAAK,IAAI,CAAC;AACpD,SAAO;AACT;AAEA,SAAS,cAAc,YAAmC;AACxD,QAAM,QAAoB,CAAC,YAAY,WAAW,YAAY,OAAO;AACrE,SAAO,WAAW;AAAA,IAChB,CAAC,OAAO,cACN,MAAM,QAAQ,UAAU,QAAQ,IAAI,MAAM,QAAQ,KAAK,IACnD,UAAU,WACV;AAAA,IACN;AAAA,EACF;AACF;AAEA,SAAS,OACP,WACA,YACiB;AACjB,SAAO;AAAA,IACL;AAAA,IACA,UAAU,WAAW,SAAS,IAAI,cAAc,UAAU,IAAI;AAAA,IAC9D,QAAQ,WAAW,WAAW;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,IAAM,sBAAgD;AAAA,EACpD,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AACT;AAEA,SAAS,WAAW,YAAkC;AACpD,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAM,QAAQ,cAAc,UAAU;AACtC,SAAO,UAAU,cAAc,UAAU,YAAY,SAAS;AAChE;AAEA,SAAS,aAAa,YAAiC;AACrD,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAM,UAAU,WAAW;AAAA,IACzB,CAAC,KAAK,cAAc,MAAM,iBAAiB,UAAU,QAAQ;AAAA,IAC7D;AAAA,EACF;AACA,QAAM,MAAM,oBAAoB,cAAc,UAAU,CAAC;AACzD,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,MAAM,OAAO,CAAC;AACjD;AAEA,SAAS,mBACP,OACA,SACiB;AACjB,QAAM,QAAQ,QAAQ,QAAQ,SAAS,CAAC;AACxC,QAAM,YAAY,MAAM,kBAAkB;AAC1C,QAAM,WAAW,MAAM,iBAAiB;AACxC,QAAM,eAAe,YAAY,SAAS;AAC1C,QAAM,cAAc,YAAY,QAAQ;AACxC,QAAM,UAAU,IAAI;AAAA,KAEf,aAAa,cACd,QAAQ,mBACR,OAAO,OAAO;AAAA,EAClB;AACA,QAAM,SAAS,IAAI,IAAK,YAAY,cAAuC,CAAC,CAAC;AAC7E,QAAM,aAA0B,CAAC;AAEjC,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,UAAM,OAAO,SAAS,IAAI;AAC1B,UAAM,SAAS,WAAW,IAAI;AAE9B,QACE,QAAQ,OAAO,KACf,cAAc,SAAS,KACvB,CAAC,QAAQ,IAAI,IAAI,KACjB,CAAC,QAAQ,IAAI,MAAM,GACnB;AACA,iBAAW,KAAK;AAAA,QACd,QAAQ,OAAO,MAAM,KAAK;AAAA,QAC1B,UAAU;AAAA,QACV,MAAM;AAAA,QACN,UAAU,aAAa,WAAW,SAAS;AAAA,QAC3C,SAAS,cAAc,IAAI;AAAA,QAC3B,YAAY,sCAAsC,CAAC,GAAG,OAAO,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG,QAAQ,OAAO,KAAK,QAAQ,EAAE;AAAA,MACzH,CAAC;AAAA,IACH;AAEA,QACE,OAAO,OAAO,KACd,cAAc,QAAQ,MACrB,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,MAAM,IACtC;AACA,iBAAW,KAAK;AAAA,QACd,QAAQ,OAAO,MAAM,KAAK;AAAA,QAC1B,UAAU;AAAA,QACV,MAAM;AAAA,QACN,UAAU,aAAa,UAAU,SAAS;AAAA,QAC1C,SAAS,cAAc,IAAI;AAAA,QAC3B,YAAY,WAAW,IAAI;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,OAAO,cAAc,UAAU;AACxC;AAEA,SAAS,mBAAmB,MAAuB;AACjD,SAAO,WAAW,KAAK,IAAI;AAC7B;AAEA,SAAS,eAAe,OAAsC;AAC5D,QAAM,aAA0B,CAAC;AACjC,QAAM,iBAAiB,oBAAI,IAAI,CAAC,2BAA2B,WAAW,CAAC;AAEvE,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,GAAG;AAC5D,UAAI,eAAe,IAAI,IAAI,GAAG;AAC5B,mBAAW,KAAK;AAAA,UACd,QAAQ,OAAO,MAAM,KAAK;AAAA,UAC1B,UAAU,SAAS,IAAI;AAAA,UACvB,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,mBAAmB,IAAI;AAAA,UAChC,YAAY,WAAW,IAAI;AAAA,UAC3B;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,mBAAmB,IAAI,KAAK,OAAO,UAAU,UAAU;AACzD,mBAAW,KAAK;AAAA,UACd,QAAQ,OAAO,MAAM,KAAK;AAAA,UAC1B,UAAU,SAAS,IAAI;AAAA,UACvB,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,uBAAuB,IAAI;AAAA,UACpC,YAAY,WAAW,IAAI;AAAA,UAC3B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,UAAU,UAAU;AACpC;AAEA,SAAS,aAAa,GAAW,GAAmB;AAClD,QAAM,OAAO,EAAE,SAAS;AACxB,QAAM,OAAO,EAAE,SAAS;AACxB,QAAM,YAAY,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,MAAM,MAAM,IAAI,EAAE,KAAK,CAAC,CAAC;AAExE,WAAS,IAAI,GAAG,IAAI,MAAM,IAAK,WAAU,CAAC,EAAE,CAAC,IAAI;AACjD,WAAS,IAAI,GAAG,IAAI,MAAM,IAAK,WAAU,CAAC,EAAE,CAAC,IAAI;AAEjD,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,YAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI;AACzC,gBAAU,CAAC,EAAE,CAAC,IAAI,KAAK;AAAA,QACrB,UAAU,IAAI,CAAC,EAAE,CAAC,IAAI;AAAA,QACtB,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA,QACtB,UAAU,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM;AACrC;AAEA,SAAS,mBAAmB,OAAuB;AACjD,SAAO,MAAM,YAAY,EAAE,QAAQ,cAAc,EAAE;AACrD;AAEA,SAAS,oBACP,UACA,eACoB;AACpB,QAAM,gBAAgB,mBAAmB,QAAQ;AACjD,QAAM,SAAS,cACZ,IAAI,CAAC,UAAU;AACd,UAAM,kBAAkB,mBAAmB,KAAK;AAChD,UAAM,WAAW,aAAa,eAAe,eAAe;AAC5D,UAAM,cACJ,cAAc,UAAU,MACvB,gBAAgB,WAAW,aAAa,KACvC,cAAc,WAAW,eAAe;AAC5C,WAAO,EAAE,OAAO,UAAU,YAAY;AAAA,EACxC,CAAC,EACA,KAAK,CAAC,GAAG,MAAM;AACd,QAAI,EAAE,gBAAgB,EAAE,YAAa,QAAO,EAAE,cAAc,KAAK;AACjE,WAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,EACjE,CAAC;AAEH,QAAM,OAAO,OAAO,CAAC;AACrB,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,eAAe,KAAK,YAAY,EAAG,QAAO,KAAK;AACxD,SAAO;AACT;AAEA,SAAS,cACP,OACA,SACiB;AACjB,QAAM,QAAQ,QAAQ,QAAQ,SAAS,CAAC;AACxC,QAAM,WAAW,MAAM,oBAAoB;AAC3C,QAAM,iBAAiB,QAAQ,kBAAkB,CAAC;AAClD,QAAM,aAA0B,CAAC;AAEjC,MAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,WAAO,OAAO,SAAS,UAAU;AAAA,EACnC;AAEA,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,UAAM,OAAO,SAAS,IAAI;AAC1B,UAAM,aAAa,eAAe,IAAI,KAAK,eAAe,WAAW,IAAI,CAAC;AAC1E,QAAI,CAAC,WAAY;AAEjB,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,GAAG;AAC5D,YAAM,gBAAgB,WAAW,IAAI,GAAG,QAAQ,OAAO,OAAO,KAAK,CAAC;AACpE,UAAI,cAAc,WAAW,EAAG;AAChC,YAAM,WAAW,OAAO,UAAU,WAAW,QAAQ;AACrD,UAAI,CAAC,YAAY,cAAc,SAAS,QAAQ,EAAG;AAEnD,YAAM,UAAU,oBAAoB,UAAU,aAAa;AAC3D,iBAAW,KAAK;AAAA,QACd,QAAQ,OAAO,MAAM,KAAK;AAAA,QAC1B,UAAU;AAAA,QACV,MAAM;AAAA,QACN,UAAU,aAAa,UAAU,UAAU;AAAA,QAC3C,SAAS,SAAS,IAAI,QAAQ,IAAI,uBAAuB,QAAQ;AAAA,QACjE,YAAY,UACR,QAAQ,OAAO,eAAe,IAAI,QAAQ,IAAI,MAC9C,eAAe,cAAc,KAAK,IAAI,CAAC;AAAA,QAC3C;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,OAAO,SAAS,UAAU;AACnC;AAEA,SAAS,qBAAqB,OAAwB;AACpD,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,SAAO,oBAAoB,KAAK,KAAK,KAAK,uBAAuB,KAAK,KAAK;AAC7E;AAEA,SAAS,eACP,OACA,SACiB;AACjB,QAAM,QAAQ,QAAQ,QAAQ,SAAS,CAAC;AACxC,QAAM,cAAc,MAAM,8BAA8B;AACxD,QAAM,aAAa,MAAM,yBAAyB;AAClD,QAAM,gBAAgB,cAAc,WAAW;AAC/C,QAAM,qBAAqB,QAAQ,aAAa,QAAQ,OAAO,EAAE;AACjE,QAAM,kBACJ,YAAY,UAAU,EAAE,aACpB,qBAAqB,CAAC,kBAAkB,IAAI,CAAC;AACnD,QAAM,aAA0B,CAAC;AAEjC,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,GAAG;AAC5D,UAAI,OAAO,UAAU,SAAU;AAE/B,UAAI,iBAAiB,qBAAqB,KAAK,GAAG;AAChD,mBAAW,KAAK;AAAA,UACd,QAAQ,OAAO,MAAM,KAAK;AAAA,UAC1B,UAAU,SAAS,IAAI;AAAA,UACvB,MAAM;AAAA,UACN,UAAU,aAAa,aAAa,UAAU;AAAA,UAC9C,SAAS,wBAAwB,KAAK,cAAc,IAAI;AAAA,UACxD,YAAY;AAAA,UACZ;AAAA,UACA,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAEA,UACE,gBAAgB,SAAS,KACzB,cAAc,YAAY,QAAQ,QAAQ,WAAW,CAAC,GACtD;AACA,cAAM,UAAU,MAAM,SAAS,mBAAmB;AAClD,mBAAW,SAAS,SAAS;AAC3B,gBAAM,YAAY,MAAM,CAAC;AACzB,cAAI,gBAAgB,KAAK,CAAC,WAAW,UAAU,WAAW,MAAM,CAAC,GAAG;AAClE;AAAA,UACF;AACA,qBAAW,KAAK;AAAA,YACd,QAAQ,OAAO,MAAM,KAAK;AAAA,YAC1B,UAAU,SAAS,IAAI;AAAA,YACvB,MAAM;AAAA,YACN,UAAU,aAAa,YAAY,UAAU;AAAA,YAC7C,SAAS,YAAY,SAAS,qCAAqC,gBAAgB,KAAK,IAAI,CAAC;AAAA,YAC7F,YAAY,iDAAiD,gBAAgB,IAAI,CAAC,WAAW,KAAK,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,YACvH;AAAA,YACA,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,UAAU,UAAU;AACpC;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK;AACjD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,iBAAiB,KAAK;AACvD,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO,aAAa,KAAmB;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAA0B;AAC9C,QAAM,OAAO,SAAS,IAAI,EAAE,YAAY;AACxC,QAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,QAAM,WAAW;AAAA,IACf,gBAAgB,MAAM,QAAQ;AAAA,IAC9B,SAAS,SAAS,gBAAgB,MAAM,KAAK,IAAI;AAAA,EACnD,EAAE,OAAO,OAAO;AAChB,QAAM,YAAY,iBAAiB,KAAK,QAAQ;AAChD,SAAO,CAAC,GAAG,UAAU,SAAS,EAAE,KAAK,GAAG,EAAE,KAAK;AACjD;AAEA,SAAS,iBAAiB,UAAkD;AAC1E,MAAI,OAAO,aAAa,SAAU,QAAO,SAAS,KAAK;AACvD,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,QAAO;AACrC,SAAO,SACJ,IAAI,CAAC,UAAU;AACd,WAAO,gBAAgB,KAAK;AAAA,EAC9B,CAAC,EACA,KAAK,GAAG,EACR,KAAK;AACV;AAEA,SAAS,aAAa,OAAsC;AAC1D,QAAM,aAA0B,CAAC;AAEjC,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,UAAM,OAAO,SAAS,IAAI;AAC1B,QAAI,CAAC,UAAU,KAAK,IAAI,EAAG;AAE3B,UAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,UAAM,QAAQ,MAAM,YAAY,KAAK,MAAM,iBAAiB,KAAK,MAAM;AACvE,UAAM,YAAY,aAAa,IAAI;AACnC,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,EAAG;AAC1D,QAAI,UAAU,SAAS,EAAG;AAE1B,eAAW,KAAK;AAAA,MACd,QAAQ,OAAO,MAAM,KAAK;AAAA,MAC1B,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,SAAO,OAAO,QAAQ,UAAU;AAClC;AAEO,SAAS,cACd,MACA,SACmB;AACnB,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,QAAQ,aAAa,IAAI;AAC/B,QAAM,UAAU;AAAA,IACd,eAAe,KAAK;AAAA,IACpB,mBAAmB,OAAO,OAAO;AAAA,IACjC,cAAc,OAAO,OAAO;AAAA,IAC5B,eAAe,OAAO,OAAO;AAAA,IAC7B,aAAa,KAAK;AAAA,EACpB;AACA,QAAM,aAAa,QAAQ,QAAQ,CAAC,UAAU,MAAM,UAAU;AAC9D,QAAM,iBAAiB,MAAM;AAAA,IAC3B,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,SAAS,IAAI,CAAC,CAAC;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,SAAS,WAAW,UAAU;AAAA,IAC9B,QAAQ,QAAQ,MAAM,CAAC,UAAU,MAAM,MAAM;AAAA,IAC7C,OAAO,aAAa,UAAU;AAAA,IAC9B;AAAA,IACA,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,UAAU,KAAK,IAAI,IAAI;AAAA,MACvB,WAAW,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,cACd,SACA,SAA6B,WACrB;AACR,MAAI,WAAW,QAAQ;AACrB,WAAO,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,EACxC;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAO,QAAQ,SAAS,OAAO;AACrC,QAAM,KAAK,GAAG,IAAI,8BAA8B,QAAQ,OAAO,WAAW,QAAQ,KAAK,MAAM;AAC7F,QAAM,KAAK,EAAE;AAEb,aAAW,SAAS,QAAQ,SAAS;AACnC,UAAM,aAAa,MAAM,SAAS,OAAO;AACzC,UAAM,QAAQ,MAAM,WAAW;AAC/B,UAAM,KAAK,KAAK,UAAU,IAAI,MAAM,SAAS,KAAK,UAAU,IAAI,WAAW,GAAG,KAAK,eAAe,EAAE;AAEpG,eAAW,aAAa,MAAM,YAAY;AACxC,YAAM,KAAK,UAAU,UAAU,QAAQ,KAAK,UAAU,QAAQ,IAAI,UAAU,MAAM,KAAK,UAAU,OAAO,EAAE;AAC1G,UAAI,UAAU,YAAY;AACxB,cAAM,KAAK,YAAY,UAAU,UAAU,EAAE;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,aAAa,QAAQ,SAAS,SAAS,QAAQ,CAAC,CAAC,eAAe,QAAQ,SAAS,SAAS,EAAE;AAEvG,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC3hBA,SAAS,oBAAoB,KAAiC;AAC5D,SAAO,OAAO;AAAA,IACZ,OAAO,OAAO,IAAI,KAAK,UAAU,EAAE,IAAI,CAAC,cAAc;AAAA,MACpD,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAEO,IAAM,gBAA6B,OAAO,MAAM,QAAQ;AAC7D,QAAM,OAAO,MAAM;AACnB,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OACE;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM;AAC9B,QAAM,SAAU,MAAM,UAAiC;AACvD,QAAM,oBAAoB,OAAO,OAAO,IAAI,KAAK,UAAU,EAAE;AAAA,IAC3D,CAAC,cAAc,UAAU;AAAA,EAC3B;AAEA,MAAI;AACF,UAAM,UAAU,cAAc,MAAgB;AAAA,MAC5C;AAAA,MACA,aAAa,IAAI,KAAK,QAAQ;AAAA,MAC9B,QAAQ;AAAA,MACR,gBAAgB,oBAAoB,GAAG;AAAA,IACzC,CAAC;AAED,UAAM,OACJ,WAAW,YACP,cAAc,SAAS,SAAS,IAChC,KAAK,UAAU,OAAO;AAE5B,WAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,QAAiB,KAAK,CAAC;AAAA,MACzC,OAAO;AAAA,QACL,GAAG,eAAe,IAAI,IAAI;AAAA,QAC1B,SAAS,QAAQ;AAAA,QACjB,OAAO,QAAQ;AAAA,QACf,QAAQ,QAAQ;AAAA,QAChB,gBAAgB,QAAQ,QAAQ;AAAA,UAC9B,CAAC,KAAK,MAAM,MAAM,EAAE,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,cACJ,QAAQ,SAAS,UAAU,KAAK,QAAQ,SAAS,UAAU;AAC7D,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO,cACH,wBAAwB,OAAO,wLAC/B;AAAA,UACN,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACF;;;ACDA,SAAS,kBAAkB,WAA6C;AACtE,MAAI,UAAU,WAAW,aAAc,QAAO;AAC9C,MAAI,UAAU,eAAe,UAAU,SAAS,OAAQ,QAAO;AAC/D,SAAO;AACT;AAEA,SAAS,yBACP,KACsB;AACtB,QAAM,mBAAmB,IAAI;AAAA,KAC1B,IAAI,KAAK,oBAAoB,cAAc,CAAC,GAAG,IAAI,CAAC,cAAc;AAAA,MACjE,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,OAAO,QAAQ,IAAI,KAAK,UAAU,EAAE,IAAI,CAAC,CAAC,cAAc,SAAS,OAAO;AAAA,IAC7E;AAAA,IACA,WACE,iBAAiB,IAAI,YAAY,GAAG,aAAa,kBAAkB,SAAS;AAAA,IAC9E,UAAU,iBAAiB,IAAI,YAAY,GAAG,YAAY;AAAA,IAC1D,SAAS,iBAAiB,IAAI,YAAY,GAAG,WAAW,CAAC;AAAA,EAC3D,EAAE;AACJ;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,gBAAgB,IAAI;AAC7B;AAEA,SAAS,cAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,kBACP,MACA,MACe;AACf,MAAI,CAAC,cAAc,IAAI,GAAG;AACxB,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,MAAI,QAAQ,QAAQ,KAAK,OAAO,UAAa,OAAO,KAAK,OAAO,UAAU;AACxE,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,MACE,UAAU,QACV,KAAK,SAAS,UACd,OAAO,KAAK,SAAS,UACrB;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,MACE,WAAW,QACX,KAAK,UAAU,UACf,CAAC,cAAc,KAAK,KAAK,GACzB;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,MAAI,cAAc,QAAQ,KAAK,aAAa,QAAW;AACrD,QAAI,OAAO,KAAK,aAAa,UAAU;AACrC,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACjC,aAAO,GAAG,IAAI;AAAA,IAChB;AAEA,eAAW,CAAC,OAAO,KAAK,KAAK,KAAK,SAAS,QAAQ,GAAG;AACpD,UAAI,CAAC,cAAc,KAAK,EAAG;AAC3B,YAAM,aAAa;AAAA,QACjB;AAAA,QACA,GAAG,IAAI,aAAa,KAAK;AAAA,MAC3B;AACA,UAAI,WAAY,QAAO;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAA8B;AACvD,MAAI,CAAC,cAAc,IAAI,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,QAAQ,KAAK,SAAS,UAAa,OAAO,KAAK,SAAS,UAAU;AAC9E,WAAO;AAAA,EACT;AAEA,MACE,cAAc,QACd,KAAK,aAAa,UAClB,CAAC,cAAc,KAAK,QAAQ,GAC5B;AACA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,QAAQ,KAAK,UAAU,QAAW;AAC/C,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,GAAG;AAC9B,aAAO;AAAA,IACT;AAEA,eAAW,CAAC,OAAO,IAAI,KAAK,KAAK,MAAM,QAAQ,GAAG;AAChD,YAAM,QAAQ,kBAAkB,MAAM,cAAc,KAAK,GAAG;AAC5D,UAAI,MAAO,QAAO;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,qBACA,WACU;AACV,QAAM,aAAa,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS;AACpE,SAAO,MAAM;AAAA,IACX,IAAI;AAAA,MACF,oBACG,OAAO,CAAC,UAAU,WAAW,SAAS,MAAM,SAAS,CAAC,EACtD,IAAI,CAAC,UAAU,MAAM,UAAU,IAAI;AAAA,IACxC;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAyB;AAChD,SAAO,MACJ,YAAY,EACZ,MAAM,aAAa,EACnB,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,CAAC,UAAU,MAAM,UAAU,CAAC;AACxC;AAEA,SAAS,mBAAmB,WAAiC;AAC3D,SAAO;AAAA,IACL,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU,SAAS;AAAA,IACnB,GAAG,UAAU,SAAS;AAAA,IACtB,GAAG,UAAU,SAAS;AAAA,IACtB,GAAG,UAAU,SAAS;AAAA,IACtB,GAAG,UAAU,SAAS;AAAA,EACxB,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AACb;AAEA,SAAS,0BAA0B,MAIb;AACpB,QAAM,eAAe,OAAO,KAAK,KAAK,KAAK,SAAS,CAAC,CAAC;AACtD,QAAM,iBAAiB,IAAI,IAAI,OAAO,KAAK,KAAK,OAAO,UAAU,SAAS,CAAC,CAAC,CAAC;AAC7E,QAAM,eAAe,IAAI,IAAI,gBAAgB,mBAAmB,KAAK,OAAO,SAAS,CAAC,CAAC;AAEvF,SAAO,KAAK,WACT,IAAI,CAAC,cAAc;AAClB,QAAI,QAAQ;AACZ,UAAM,UAAoB,CAAC;AAC3B,UAAM,oBAAoB,IAAI,IAAI,OAAO,KAAK,UAAU,UAAU,SAAS,CAAC,CAAC,CAAC;AAE9E,QAAI,UAAU,cAAc,aAAa;AACvC,eAAS;AACT,cAAQ,KAAK,qBAAqB;AAAA,IACpC;AACA,QAAI,UAAU,UAAU,aAAa;AACnC,eAAS;AACT,cAAQ,KAAK,qBAAqB;AAAA,IACpC;AACA,QAAI,UAAU,UAAU,SAAS,QAAQ;AACvC,eAAS;AACT,cAAQ,KAAK,WAAW;AAAA,IAC1B;AACA,QAAI,UAAU,UAAU;AACtB,eAAS;AACT,cAAQ,KAAK,kBAAkB;AAAA,IACjC;AAEA,UAAM,qBAAqB,aAAa;AAAA,MAAO,CAAC,QAC9C,kBAAkB,IAAI,GAAG;AAAA,IAC3B;AACA,QAAI,mBAAmB,SAAS,GAAG;AACjC,eAAS,mBAAmB,SAAS;AACrC,cAAQ,KAAK,wBAAwB,mBAAmB,KAAK,IAAI,CAAC,EAAE;AAAA,IACtE;AAEA,UAAM,mBAAmB,aAAa;AAAA,MACpC,CAAC,QAAQ,CAAC,kBAAkB,IAAI,GAAG;AAAA,IACrC;AACA,QAAI,iBAAiB,SAAS,GAAG;AAC/B,eAAS,iBAAiB,SAAS;AACnC,cAAQ,KAAK,uBAAuB,iBAAiB,KAAK,IAAI,CAAC,EAAE;AAAA,IACnE;AAEA,UAAM,sBAAsB,CAAC,GAAG,cAAc,EAAE;AAAA,MAAO,CAAC,QACtD,kBAAkB,IAAI,GAAG;AAAA,IAC3B;AACA,QAAI,oBAAoB,SAAS,GAAG;AAClC,eAAS,oBAAoB,SAAS;AACtC,cAAQ,KAAK,wBAAwB,oBAAoB,KAAK,IAAI,CAAC,EAAE;AAAA,IACvE;AAEA,UAAM,kBAAkB,IAAI;AAAA,MAC1B,gBAAgB,mBAAmB,UAAU,SAAS,CAAC;AAAA,IACzD;AACA,UAAM,eAAe,CAAC,GAAG,eAAe,EAAE;AAAA,MAAO,CAAC,UAChD,aAAa,IAAI,KAAK;AAAA,IACxB;AACA,QAAI,aAAa,SAAS,GAAG;AAC3B,eAAS,KAAK,IAAI,aAAa,QAAQ,CAAC;AACxC,cAAQ,KAAK,qBAAqB,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,IAC7D;AAEA,QACE,UAAU,UAAU,qBACpB,UAAU,UAAU,sBAAsB,KAAK,OAAO,UAAU,mBAChE;AACA,eAAS;AACT,cAAQ,KAAK,0BAA0B;AAAA,IACzC;AAEA,WAAO;AAAA,MACL,MAAM,UAAU,UAAU;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACrE;AAEA,SAAS,6BACP,kBACe;AACf,MAAI,iBAAiB,WAAW,EAAG,QAAO;AAC1C,MAAI,iBAAiB,WAAW,EAAG,QAAO,iBAAiB,CAAC,EAAE;AAE9D,QAAM,CAAC,OAAO,MAAM,IAAI;AACxB,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,MAAI,MAAM,QAAQ,OAAO,QAAQ,EAAG,QAAO;AAC3C,SAAO,MAAM;AACf;AAEA,SAAS,gBAAgB,SAAoC;AAC3D,SAAO,QAAQ,QAAQ;AAAA,IACrB,CAAC,KAAKC,YAAW,MAAMA,QAAO,WAAW;AAAA,IACzC;AAAA,EACF;AACF;AAEA,SAAS,cACP,QACA,cACA,0BACY;AACZ,MAAI,WAAW,OAAQ,QAAO;AAC9B,MAAI,WAAW,QAAS,QAAO;AAC/B,MAAI,WAAW,cAAe,QAAO;AACrC,MAAI,2BAA2B,EAAG,QAAO;AACzC,MAAI,aAAa,SAAS,EAAG,QAAO;AACpC,SAAO;AACT;AAEA,SAAS,0BAA0B,MAMtB;AACX,QAAM,WAAqB,CAAC;AAE5B,MAAI,CAAC,KAAK,YAAY;AACpB,aAAS,KAAK,YAAY;AAAA,EAC5B;AAEA,MAAI,CAAC,KAAK,kBAAkB;AAC1B,aAAS,KAAK,kBAAkB;AAAA,EAClC,WAAW,CAAC,KAAK,qBAAqB;AACpC,aAAS,KAAK,qCAAqC;AAAA,EACrD;AAEA,MAAI,CAAC,KAAK,eAAe;AACvB,aAAS,KAAK,eAAe;AAAA,EAC/B,WAAW,CAAC,KAAK,kBAAkB;AACjC,aAAS,KAAK,6BAA6B;AAAA,EAC7C;AAEA,SAAO;AACT;AAEA,SAAS,0BAA0B,MAQR;AACzB,QAAM,UAAkC,CAAC;AAEzC,MAAI,CAAC,KAAK,YAAY;AACpB,YAAQ;AAAA,MACN,GAAG,KAAK,qBAAqB,IAAI,CAAC,iBAAiB;AAAA,QACjD,QAAQ;AAAA,QACR,QAAQ,YAAY;AAAA,QACpB,MAAM,YAAY;AAAA,QAClB,IAAI,YAAY;AAAA,QAChB,QAAQ,YAAY;AAAA,QACpB,uBAAuB,CAAC,YAAY;AAAA,MACtC,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,wBAAwB,0BAA0B;AAAA,IACtD,YAAY,KAAK;AAAA,IACjB,kBAAkB,KAAK;AAAA,IACvB,eAAe,KAAK;AAAA,IACpB,qBAAqB,KAAK;AAAA,IAC1B,kBAAkB,KAAK;AAAA,EACzB,CAAC;AAED,MAAI,sBAAsB,SAAS,GAAG;AACpC,YAAQ;AAAA,MACN,GAAG,KAAK,sBAAsB,IAAI,CAAC,eAAe;AAAA,QAChD,QAAQ;AAAA,QACR,QAAQ,UAAU;AAAA,QAClB,MAAM,UAAU;AAAA,QAChB,YAAY,UAAU;AAAA,QACtB,kBAAkB,UAAU;AAAA,QAC5B,QAAQ,UAAU;AAAA,QAClB;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,4BAA4B,MAOzB;AAChB,MAAI,CAAC,KAAK,IAAI,KAAK,OAAQ;AAC3B,MAAI;AACF,UAAM,KAAK,IAAI,IAAI,OAAO,mBAAmB;AAAA,MAC3C,OAAO;AAAA,MACP,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,QACb,YAAY,KAAK;AAAA,QACjB,gBAAgB,KAAK;AAAA,QACrB,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,MACpB,CAAC;AAAA,MACD,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,uBAAuB,KAA2C;AACzE,SAAO,yBAAyB,GAAG,EAChC,OAAO,CAAC,EAAE,UAAU,MAAM,cAAc,eAAe,cAAc,SAAS,EAC9E,IAAI,CAAC,EAAE,UAAU,MAAM,UAAU,IAAI;AAC1C;AAEA,SAASC,qBAAoB,KAAiC;AAC5D,SAAO,OAAO;AAAA,IACZ,OAAO,OAAO,IAAI,KAAK,UAAU,EAAE,IAAI,CAAC,cAAc;AAAA,MACpD,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAEA,SAAS,UACP,MACA,KACA,iBACmB;AACnB,SAAO,cAAc,MAAM;AAAA,IACzB,mBAAmB,uBAAuB,GAAG;AAAA,IAC7C,aAAa,IAAI,KAAK,QAAQ;AAAA,IAC9B,QAAQ;AAAA,IACR,gBAAgBA,qBAAoB,GAAG;AAAA,EACzC,CAAC;AACH;AAEA,SAASC,WACP,OACA,SACA,OAAO,SACD;AACN,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,QAAI,CAAC,cAAc,IAAI,EAAG;AAE1B,UAAM,UAAU,GAAG,IAAI,IAAI,KAAK;AAChC,YAAQ,MAAoB,OAAO;AAEnC,QAAI,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAChC,MAAAA,WAAU,KAAK,UAAU,SAAS,GAAG,OAAO,WAAW;AAAA,IACzD;AAAA,EACF;AACF;AAEA,SAAS,+BACP,MACA,KAKA;AACA,QAAM,sBAAsB,yBAAyB,GAAG;AACxD,QAAM,SAAS,oBAAI,IAAkC;AACrD,QAAM,sBAAsB,oBAAI,IAAsB;AAEtD,aAAW,SAAS,qBAAqB;AACvC,UAAM,OAAO,OAAO,IAAI,MAAM,UAAU,IAAI,KAAK,CAAC;AAClD,SAAK,KAAK,KAAK;AACf,WAAO,IAAI,MAAM,UAAU,MAAM,IAAI;AAErC,QAAI,MAAM,cAAc,YAAa;AACrC,UAAM,WAAW,MAAM,UAAU,YAAY;AAC7C,UAAM,QAAQ,oBAAoB,IAAI,QAAQ,KAAK,CAAC;AACpD,QAAI,CAAC,MAAM,SAAS,MAAM,UAAU,IAAI,GAAG;AACzC,YAAM,KAAK,MAAM,UAAU,IAAI;AAAA,IACjC;AACA,wBAAoB,IAAI,UAAU,KAAK;AAAA,EACzC;AAEA,QAAM,YAAY,UAAU,IAAI;AAChC,QAAM,QAAQ,MAAM,QAAQ,UAAU,KAAK,IAAI,UAAU,QAAQ,CAAC;AAClE,QAAM,eAA8B,CAAC;AACrC,QAAM,cAAsC,CAAC;AAE7C,EAAAA,WAAU,OAAO,CAAC,MAAM,YAAY;AAClC,QAAI,CAAC,KAAK,KAAM;AAChB,UAAM,mBAAmB,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC;AACnD,UAAM,YAAY,iBAAiB,CAAC;AACpC,QACE,CAAC,aACA,UAAU,cAAc,iBACvB,UAAU,cAAc,aAC1B;AACA;AAAA,IACF;AAEA,UAAM,oBACJ,oBAAoB,IAAI,UAAU,UAAU,YAAY,eAAe,KAAK,CAAC,GAE5E,OAAO,CAAC,cAAc,cAAc,UAAU,UAAU,IAAI,EAC5D;AAAA,MAAI,CAAC,kBACJ,oBAAoB;AAAA,QAClB,CAAC,UAAU,MAAM,UAAU,SAAS;AAAA,MACtC;AAAA,IACF,EACC,OAAO,CAAC,UAAuC,QAAQ,KAAK,CAAC;AAChE,UAAM,mBAAmB,0BAA0B;AAAA,MACjD,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ;AAAA,IACF,CAAC;AACD,UAAM,cAAc,6BAA6B,gBAAgB;AAEjE,QAAI,CAAC,aAAa;AAChB,UAAI,iBAAiB,SAAS,GAAG;AAC/B,oBAAY,KAAK;AAAA,UACf,QAAQ,KAAK,MAAM,KAAK;AAAA,UACxB;AAAA,UACA,MAAM,UAAU,UAAU;AAAA,UAC1B,YAAY,iBAAiB,IAAI,CAAC,cAAc,UAAU,IAAI;AAAA,UAC9D;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,iBAAa,KAAK;AAAA,MAChB,QAAQ,KAAK,MAAM,KAAK;AAAA,MACxB,MAAM,UAAU,UAAU;AAAA,MAC1B,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AACD,SAAK,OAAO;AAAA,EACd,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,sBACP,MACA,SACA,aACS;AACT,QAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC;AACxD,MAAI,UAAU;AAEd,EAAAA,WAAU,OAAO,CAAC,MAAM,eAAe;AACrC,QAAI,WAAW,eAAe,QAAS;AACvC,SAAK,OAAO;AACZ,cAAU;AAAA,EACZ,CAAC;AAED,SAAO;AACT;AAEA,SAAS,wBACP,KACS;AACT,QAAM,eAAe,IAAI,KAAK,oBAAoB;AAClD,MAAI,CAAC,aAAc,QAAO;AAC1B,SAAO,aAAa,SAAS,UAAa,aAAa,QAAQ;AACjE;AAEA,SAAS,iBACP,KACS;AACT,SAAO,QAAQ,IAAI,KAAK,oBAAoB,QAAQ;AACtD;AAEA,SAAS,gBACP,UACoB;AACpB,MAAI,MAAM,QAAQ,SAAS,OAAO,GAAG;AACnC,WAAO,SAAS,QAAQ,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM,GAAG;AAAA,EAChE;AAEA,SAAO,SAAS,QAAQ,SAAS,SAC7B,SAAS,QAAQ,OACjB;AACN;AAEA,SAAS,0BACP,KACuB;AACvB,SAAO,IAAI;AAAA,IACT,OAAO,OAAO,IAAI,KAAK,UAAU,EAAE,IAAI,CAAC,cAAc;AACpD,YAAM,WAAqB,CAAC;AAC5B,UAAI,UAAU,aAAa;AACzB,iBAAS,KAAK,gBAAgB,UAAU,WAAW,EAAE;AAAA,MACvD;AACA,UAAI,UAAU,SAAS,eAAe;AACpC,iBAAS,KAAK,UAAU,UAAU,SAAS,aAAa,EAAE;AAAA,MAC5D;AACA,UAAI,UAAU,SAAS,IAAI,SAAS,GAAG;AACrC,iBAAS,KAAK,QAAQ,UAAU,SAAS,IAAI,KAAK,IAAI,CAAC,EAAE;AAAA,MAC3D;AACA,UAAI,UAAU,SAAS,MAAM,SAAS,GAAG;AACvC,iBAAS,KAAK,UAAU,UAAU,SAAS,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MAC/D;AACA,aAAO,CAAC,UAAU,MAAM,QAAQ;AAAA,IAClC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,4BACP,YACA,gBACU;AACV,SAAO,WAAW,IAAI,CAAC,cAAc;AACnC,UAAM,WAAW,eAAe,IAAI,SAAS,KAAK,CAAC;AACnD,WAAO,SAAS,SAAS,IACrB,GAAG,SAAS,KAAK,SAAS,KAAK,KAAK,CAAC,KACrC,GAAG,SAAS;AAAA,EAClB,CAAC;AACH;AAEA,eAAe,kCACb,aACA,MACA,KACwB;AACxB,MAAI,CAAC,IAAI,KAAK,UAAU,YAAY,WAAW,EAAG,QAAO,CAAC;AAE1D,QAAM,eAA8B,CAAC;AACrC,QAAM,iBAAiB,0BAA0B,GAAG;AAEpD,aAAW,aAAa,aAAa;AACnC,UAAM,gBAAgB;AAAA,MACpB,UAAU;AAAA,MACV;AAAA,IACF;AACA,UAAMF,UAAS,MAAM,IAAI,IAAI,OAAO,YAAY;AAAA,MAC9C,MAAM;AAAA,MACN,SAAS;AAAA,QACP,kDAAkD,UAAU,IAAI,YAAY,UAAU,MAAM;AAAA,QAC5F;AAAA,QACA;AAAA,QACA,GAAG;AAAA,MACL,EAAE,KAAK,IAAI;AAAA,MACX,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,YAAY;AAAA,UACV,aAAa;AAAA,YACX,MAAM;AAAA,YACN,OAAO;AAAA,YACP,aAAa;AAAA,cACX;AAAA,cACA,GAAG;AAAA,cACH;AAAA,YACF,EAAE,KAAK,IAAI;AAAA,YACX,OAAO;AAAA,cACL,GAAG,UAAU,WAAW,IAAI,CAAC,eAAe;AAAA,gBAC1C,OAAO;AAAA,gBACP,OAAO;AAAA,cACT,EAAE;AAAA,cACF;AAAA,gBACE,OAAO;AAAA,gBACP,OAAO;AAAA,cACT;AAAA,YACF;AAAA,YACA,SAAS;AAAA,UACX;AAAA,QACF;AAAA,QACA,UAAU,CAAC,aAAa;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,QACEA,QAAO,WAAW,YAClB,CAACA,QAAO,WACR,OAAOA,QAAO,QAAQ,gBAAgB,YACtCA,QAAO,QAAQ,gBAAgB,YAC/B;AACA;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,WAAW,SAASA,QAAO,QAAQ,WAAW,GAAG;AAC9D;AAAA,IACF;AAEA,QAAI,CAAC,sBAAsB,MAAM,UAAU,SAASA,QAAO,QAAQ,WAAW,GAAG;AAC/E;AAAA,IACF;AAEA,iBAAa,KAAK;AAAA,MAChB,QAAQ,UAAU;AAAA,MAClB,MAAM,UAAU;AAAA,MAChB,IAAIA,QAAO,QAAQ;AAAA,MACnB,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAe,+BACb,aACA,MACA,KACwB;AACxB,MAAI,CAAC,IAAI,KAAK,UAAU,YAAY,WAAW,EAAG,QAAO,CAAC;AAC1D,QAAM,iBAAiB,0BAA0B,GAAG;AAEpD,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,MACH;AAAA,QACE,aAAa,YAAY,IAAI,CAAC,eAAe;AAAA,UAC3C,QAAQ,UAAU;AAAA,UAClB,MAAM,UAAU;AAAA,UAChB,YAAY,UAAU,WAAW,IAAI,CAAC,eAAe;AAAA,YACnD,MAAM;AAAA,YACN,UAAU,eAAe,IAAI,SAAS,KAAK,CAAC;AAAA,UAC9C,EAAE;AAAA,QACJ,EAAE;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,EAAE,KAAK,MAAM;AAEb,QAAM,WAAW,MAAM,IAAI,IAAI,OAAO,cAAc;AAAA,IAClD,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAED,QAAM,OAAO,gBAAgB,QAAQ;AACrC,MAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,MAAI;AAGJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAG1B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,eAA8B,CAAC;AAErC,aAAW,UAAU,OAAO,WAAW,CAAC,GAAG;AACzC,QACE,CAAC,OAAO,UACR,CAAC,OAAO,eACR,OAAO,gBAAgB,YACvB;AACA;AAAA,IACF;AAEA,UAAM,YAAY,YAAY,KAAK,CAAC,UAAU,MAAM,WAAW,OAAO,MAAM;AAC5E,QAAI,CAAC,aAAa,CAAC,UAAU,WAAW,SAAS,OAAO,WAAW,GAAG;AACpE;AAAA,IACF;AAEA,QAAI,CAAC,sBAAsB,MAAM,UAAU,SAAS,OAAO,WAAW,GAAG;AACvE;AAAA,IACF;AAEA,iBAAa,KAAK;AAAA,MAChB,QAAQ,UAAU;AAAA,MAClB,MAAM,UAAU;AAAA,MAChB,IAAI,OAAO;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAKX;AACT,QAAM,QAAQ;AAAA,IACZ,WAAW,KAAK,MAAM;AAAA,IACtB,aAAa,cAAc,KAAK,iBAAiB,SAAS,CAAC;AAAA,EAC7D;AAEA,MAAI,KAAK,aAAa,SAAS,GAAG;AAChC,UAAM;AAAA,MACJ,iBAAiB,KAAK,aAAa,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,OAAO,KAAK,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IAC3F;AACA,UAAM,KAAK,UAAU,cAAc,KAAK,cAAc,SAAS,CAAC,EAAE;AAAA,EACpE;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,IAAM,wBAAqC,OAAO,MAAM,QAAQ;AACrE,QAAM,OAAO,MAAM;AACnB,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OACE;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,YAAY,kBAAkB,IAAI;AACxC,MAAI,WAAW;AACb,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OACE,wBAAwB,SAAS;AAAA,UACrC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM;AAC9B,QAAM,aAAa,MAAM,eAAe;AACxC,QAAM,mBAAmB,MAAM,qBAAqB;AACpD,QAAM,gBAAgB,MAAM,kBAAkB;AAC9C,QAAM,SAAU,MAAM,UAAiC;AACvD,QAAM,YAAY,KAAK,IAAI;AAE3B,MAAI;AACF,UAAM,sBAAsB,yBAAyB,GAAG;AACxD,UAAM,kBAAkB,MAAM,UAAU,MAAgB,KAAK,eAAe;AAC5E,QAAI,eAAe;AACnB,QAAI;AACJ,QAAI;AACJ,QAAI,eAA8B,CAAC;AACnC,QAAI,cAAsC,CAAC;AAC3C,UAAM,iBAAmC,CAAC;AAC1C,UAAM,sBAAsB,wBAAwB,GAAG;AACvD,UAAM,wBAAwB,iBAAiB,GAAG;AAClD,UAAM,UACJ,CAAC,gBAAgB,SACb,+BAA+B,MAAgB,GAAG,IAClD;AACN,QAAI,CAAC,cAAc,SAAS;AAC1B,oBAAc,QAAQ;AAAA,IACxB;AAEA,QAAI,CAAC,gBAAgB,UAAU,YAAY;AACzC,YAAMA,UAAS,WAAW,+BAA+B,MAAgB,GAAG;AAC5E,qBAAeA,QAAO;AACtB,oBAAcA,QAAO;AAErB,UAAI,aAAa,SAAS,GAAG;AAC3B,sBAAcA,QAAO;AACrB,uBAAe,KAAK,eAAe;AAAA,MACrC;AAEA,YAAMG,yBAAwB,YAAY;AAAA,QACxC,CAAC,cACC,CAAC,aAAa,KAAK,CAAC,gBAAgB,YAAY,WAAW,UAAU,MAAM;AAAA,MAC/E;AAEA,UACEA,uBAAsB,SAAS,KAC/B,oBACA,qBACA;AACA,wBAAgB,UAAU,IAAc;AACxC,cAAM,uBAAuB,MAAM;AAAA,UACjCA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,qBAAqB,SAAS,GAAG;AACnC,yBAAe,KAAK,aAAa;AAAA,QACnC;AACA,qBAAa,KAAK,GAAG,oBAAoB;AAAA,MAC3C;AAEA,YAAM,uBAAuB,YAAY;AAAA,QACvC,CAAC,cACC,CAAC,aAAa,KAAK,CAAC,gBAAgB,YAAY,WAAW,UAAU,MAAM;AAAA,MAC/E;AAEA,UACE,qBAAqB,SAAS,KAC9B,iBACA,uBACA;AACA,wBAAgB,UAAU,IAAc;AACxC,cAAM,sBAAsB,MAAM;AAAA,UAChC;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,oBAAoB,SAAS,GAAG;AAClC,yBAAe,KAAK,UAAU;AAAA,QAChC;AACA,qBAAa,KAAK,GAAG,mBAAmB;AAAA,MAC1C;AAEA,kBAAY,aAAa,SAAS,IAAI,cAAc;AAEpD,UAAI,WAAW;AACb,uBAAe,MAAM,UAAU,WAAW,KAAK,eAAe;AAAA,MAChE;AAAA,IACF;AAEA,UAAM,SACJ,gBAAgB,SACZ,SACA,aAAa,SAAS,IACpB,aAAa,SACX,UACA,gBACF;AAER,UAAM,wBAAwB,YAC3B;AAAA,MACC,CAAC,cACC,CAAC,aAAa,KAAK,CAAC,gBAAgB,YAAY,WAAW,UAAU,MAAM;AAAA,IAC/E,EACC,IAAI,CAAC,EAAE,SAAS,UAAU,GAAG,UAAU,MAAM,SAAS;AACzD,UAAM,gCAAgC,YAAY;AAAA,MAChD,CAAC,cACC,CAAC,aAAa,KAAK,CAAC,gBAAgB,YAAY,WAAW,UAAU,MAAM;AAAA,IAC/E;AACA,UAAM,uBAAuB,0BAA0B;AAAA,MACrD,sBAAsB,SAAS,gBAAgB,CAAC;AAAA,MAChD,uBAAuB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,IACpB,CAAC;AACD,UAAM,cAAc;AAAA,MAClB,YAAY,IAAI,KAAK,SAAS;AAAA,MAC9B,aAAa,IAAI,KAAK,SAAS;AAAA,MAC/B,kBAAkB,IAAI,KAAK,SAAS,SAAS;AAAA,MAC7C,aAAa,IAAI,KAAK,SAAS,SAAS;AAAA,MACxC,YAAY,IAAI,KAAK,SAAS,SAAS;AAAA,MACvC,iBACE,IAAI,KAAK,oBAAoB,mBAC7B,IAAI,KAAK,SAAS,SAAS;AAAA,MAC7B,kBACE,IAAI,KAAK,oBAAoB,aAC7B,IAAI,KAAK,SAAS,SAAS;AAAA,MAC7B,QAAQ;AAAA,QACN,MAAM,IAAI,KAAK,oBAAoB,OAAO,QAAQ;AAAA,QAClD,UAAU,IAAI,KAAK,oBAAoB,OAAO;AAAA,QAC9C,iBAAiB,QAAQ,eAAe;AAAA,MAC1C;AAAA,MACA,oBAAoB;AAAA,QAClB,UAAU;AAAA,QACV,eAAe,QAAQ,IAAI,KAAK,oBAAoB,UAAU,KAAK;AAAA,QACnE,iBAAiB;AAAA,QACjB,OAAO,QAAQ,IAAI,KAAK,oBAAoB,KAAK;AAAA,MACnD;AAAA,MACA,kBAAkB;AAAA,QAChB,eAAe,aAAa,KAAK,CAAC,gBAAgB,YAAY,SAAS,eAAe;AAAA,QACtF,aAAa,aAAa,KAAK,CAAC,gBAAgB,YAAY,SAAS,aAAa;AAAA,QAClF,UAAU,aAAa,KAAK,CAAC,gBAAgB,YAAY,SAAS,UAAU;AAAA,MAC9E;AAAA,IACF;AACA,UAAM,aAAa;AAAA,MACjB,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,wBAAwB,gBAAgB,eAAe;AAAA,MACvD,qBAAqB,gBAAgB,YAAY;AAAA,MACjD,gBAAgB,gBAAgB;AAAA,MAChC,aAAa,aAAa;AAAA,MAC1B,kBAAkB,aAAa;AAAA,MAC/B,oBAAoB;AAAA,QAClB,eAAe,aAAa,OAAO,CAAC,gBAAgB,YAAY,SAAS,eAAe,EAAE;AAAA,QAC1F,aAAa,aAAa,OAAO,CAAC,gBAAgB,YAAY,SAAS,aAAa,EAAE;AAAA,QACtF,UAAU,aAAa,OAAO,CAAC,gBAAgB,YAAY,SAAS,UAAU,EAAE;AAAA,MAClF;AAAA,MACA,gBAAgB,YAAY;AAAA,MAC5B,0BAA0B,sBAAsB;AAAA,MAChD,sBAAsB;AAAA,IACxB;AACA,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA,sBAAsB;AAAA,IACxB;AACA,UAAM,cAAc,eAAe,IAAI,IAAI;AAE3C,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC;AAAA,MACA;AAAA,MACA,qBAAqB;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAAA,MACA,uBAAuB;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,MACA,qBAAqB;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,4BAA4B;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MACE,WAAW,YACP,aAAa;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC,IACD,KAAK,UAAU,OAAO;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA,kBAAkB,aAAa;AAAA,QAC/B,QAAQ,aAAa;AAAA,QACrB,0BAA0B,sBAAsB;AAAA,QAChD,2BAA2B,qBAAqB;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACF;;;AC3mCA,IAAM,oBAAoB;AAEnB,SAAS,kBAAkB,KAAsB;AACtD,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,IAAI,QAAQ,QAAQ,EAAE;AAC/B;AAEA,eAAsB,eAAkB,MAMzB;AACb,QAAM,OAAO,kBAAkB,KAAK,QAAQ;AAC5C,QAAM,MAAM,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,IAAI,EAAE;AACzC,MAAI,KAAK,OAAO;AACd,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,GAAG;AACrD,UAAI,UAAU,OAAW,KAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,IAC3C,SAAS,EAAE,aAAa,KAAK,OAAO;AAAA,EACtC,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI;AACJ,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,gBAAU,OAAO,SAAS;AAAA,IAC5B,QAAQ;AACN,gBAAU;AAAA,IACZ;AACA,UAAM,IAAI;AAAA,MACR,SAAS,KAAK,QAAQ,eAAe,SAAS,MAAM,MAAM,OAAO;AAAA,IACnE;AAAA,EACF;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;;;ACiBA,eAAsB,cACpB,QACA,QACA,UAC2B;AAC3B,SAAO,eAAiC;AAAA,IACtC;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,OAAO,OAAO;AAAA,IAChB;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,qBACpB,QACA,UACA,UAC2B;AAC3B,SAAO;AAAA,IACL;AAAA,IACA,EAAE,QAAQ,QAAQ,UAAU,OAAO,IAAI;AAAA,IACvC;AAAA,EACF;AACF;AAEO,SAAS,sBACd,SACoB;AACpB,QAAM,EAAE,cAAc,WAAW,UAAU,KAAK,IAAI;AACpD,MAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAU,QAAO;AACrD,MAAI,CAAC,qBAAqB,KAAK,YAAY,EAAG,QAAO;AACrD,MAAI,CAAC,sBAAsB,KAAK,SAAS,EAAG,QAAO;AAEnD,QAAM,iBAAiB,SAAS,QAAQ,QAAQ,EAAE;AAClD,MAAI,CAAC,eAAgB,QAAO;AAE5B,QAAM,cAAc,eACjB,MAAM,GAAG,EACT,IAAI,CAAC,YAAY,mBAAmB,OAAO,CAAC,EAC5C,KAAK,GAAG;AACX,QAAM,aAAa,QAAQ,QAAQ,OAAO,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,KAAK;AAExE,SAAO,sBAAsB,YAAY,SAAS,SAAS,IAAI,WAAW,GAAG,UAAU;AACzF;AAEA,eAAsB,qBACpB,QACA,QACA,UACkC;AAClC,QAAM,EAAE,SAAS,IAAI,MAAM;AAAA,IACzB;AAAA,IACA,EAAE,GAAG,QAAQ,OAAO,OAAO,SAAS,IAAI;AAAA,IACxC;AAAA,EACF;AACA,SAAO,kBAAkB,UAAU,MAAM;AAC3C;AAEA,SAAS,kBACP,UACA,QACyB;AACzB,QAAM,aAAa,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,EAAE;AACnD,QAAM,WAAW,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,EAAE;AACpD,QAAM,aAAqC,CAAC;AAC5C,QAAM,WAAmC,CAAC;AAC1C,QAAM,aAAqC,CAAC;AAE5C,aAAW,WAAW,UAAU;AAC9B,eAAW,QAAQ,QAAQ,KAAK;AAChC,aAAS,QAAQ,MAAM,KAAK;AAC5B,cAAU,UAAU,QAAQ,MAAM;AAClC,QAAI,QAAQ,SAAU,WAAU,YAAY,QAAQ,QAAQ;AAC5D,QAAI,QAAQ,SAAU,WAAU,YAAY,QAAQ,QAAQ;AAAA,EAC9D;AAEA,QAAM,EAAE,OAAO,QAAQ,GAAG,QAAQ,IAAI;AACtC,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,WAAW,YAAY,UAAU;AAAA,IAC3C,UAAU,WAAW,UAAU,QAAQ;AAAA,EACzC;AACF;AAEA,SAAS,UAAU,QAAgC,KAAmB;AACpE,SAAO,GAAG,KAAK,OAAO,GAAG,KAAK,KAAK;AACrC;AAEA,SAAS,WACP,QACA,SAC8C;AAC9C,SAAO,OAAO,QAAQ,MAAM,EACzB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EACtD,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC,OAAO,GAAG,KAAK,MAAM,EAA2C;AAC/F;;;AClKO,SAAS,mBAAmB,KAAsC;AACvE,SACE,IAAI,OAAO,eACX,IAAI,OAAO,YAAY,OAAO,UAC9B,QAAQ,IAAI;AAEhB;AAEO,SAAS,gBAAgB,KAAsC;AACpE,SAAO,IAAI,OAAO,YAAY,OAAO,OAAO,QAAQ,IAAI;AAC1D;AAEO,SAAS,kBAA8B;AAC5C,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU;AAAA,UACnB,OACE;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;ACjBA,SAAS,eAAe,UAAqB,KAA6B;AACxE,SAAO,SAAS,IAAI,CAAC,YAAY;AAC/B,UAAM,YAAY,QAAQ,aAAa,sBAAsB,OAAO;AACpE,UAAM,gBAAgB,YAAY,EAAE,GAAG,SAAS,UAAU,IAAI;AAE9D,QAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ,YAAY,CAAC,IAAI,KAAK,QAAQ;AAC1D,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,eAAe,IAAI,IAAI;AAC3C,UAAM,aAAa,aAAa;AAAA,MAC9B,QAAQ,IAAI,KAAK;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,OAAO,QAAQ;AAAA,MACf,iBAAiB,YAAY;AAAA,MAC7B,WAAW,YAAY;AAAA,IACzB,CAAC;AAED,QAAI,CAAC,WAAW,aAAa;AAC3B,YAAM;AAAA,QACJ,gBAAgB;AAAA,QAChB,uBAAuB;AAAA,QACvB,GAAG;AAAA,MACL,IAAI;AACJ,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,gBACE,WAAW,YAAY,UAAU,WAAW,YAAY;AAAA,MAC1D,uBAAuB,WAAW;AAAA,IACpC;AAAA,EACF,CAAC;AACH;AAEO,IAAM,sBAAmC,OAAO,MAAM,QAAQ;AACnE,QAAM,SAAS,mBAAmB,GAAG;AACrC,MAAI,CAAC,OAAQ,QAAO,gBAAgB;AAEpC,QAAM,WAAW,gBAAgB,GAAG;AACpC,QAAM,SAA6B,CAAC;AAEpC,MAAI,KAAK,OAAQ,QAAO,SAAS,KAAK;AACtC,MAAI,KAAK;AACP,WAAO,WAAW,KAAK;AACzB,MAAI,KAAK,SAAU,QAAO,WAAW,OAAO,KAAK,QAAQ;AACzD,MAAI,KAAK,OAAQ,QAAO,SAAS,OAAO,KAAK,MAAM;AACnD,MAAI,KAAK,SAAU,QAAO,WAAW,OAAO,KAAK,QAAQ;AACzD,MAAI,KAAK,SAAS,KAAM,QAAO,QAAQ,OAAO,KAAK,KAAK;AAExD,MAAI;AACF,UAAMC,UAAS,MAAM,cAAc,QAAQ,QAAQ,QAAQ;AAC3D,UAAM,WAAW,eAAeA,QAAO,UAAU,GAAG;AACpD,UAAM,cAAc,eAAe,IAAI,IAAI;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU,EAAE,GAAGA,SAAQ,SAAS,CAAC;AAAA,QAC9C;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,SAAS;AAAA,QAChB,sBAAsB,SAAS;AAAA,UAC7B,CAAC,YAAY,QAAQ;AAAA,QACvB,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEO,IAAM,yBAAsC,OAAO,MAAM,QAAQ;AACtE,QAAM,SAAS,mBAAmB,GAAG;AACrC,MAAI,CAAC,OAAQ,QAAO,gBAAgB;AAEpC,QAAM,WAAW,gBAAgB,GAAG;AACpC,QAAM,SAAgC,CAAC;AAEvC,MAAI,KAAK,OAAQ,QAAO,SAAS,KAAK;AACtC,MAAI,KAAK;AACP,WAAO,WAAW,KAAK;AACzB,MAAI,KAAK,SAAU,QAAO,WAAW,OAAO,KAAK,QAAQ;AACzD,MAAI,KAAK,OAAQ,QAAO,SAAS,OAAO,KAAK,MAAM;AACnD,MAAI,KAAK,SAAU,QAAO,WAAW,OAAO,KAAK,QAAQ;AACzD,MAAI,KAAK,SAAS,KAAM,QAAO,QAAQ,OAAO,KAAK,KAAK;AAExD,MAAI;AACF,UAAM,UAAU,MAAM,qBAAqB,QAAQ,QAAQ,QAAQ;AACnE,UAAM,cAAc,eAAe,IAAI,IAAI;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU,OAAO;AAAA,QAC9B;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,QAAQ;AAAA,QACf,cAAc,QAAQ,SAAS;AAAA,QAC/B,cAAc,QAAQ,SAAS;AAAA,MACjC;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEO,IAAM,yBAAsC,OAAO,MAAM,QAAQ;AACtE,QAAM,SAAS,mBAAmB,GAAG;AACrC,MAAI,CAAC,OAAQ,QAAO,gBAAgB;AAEpC,QAAM,WAAW,KAAK;AACtB,MAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU,EAAE,OAAO,wBAAwB,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,WAAW,gBAAgB,GAAG;AAEpC,MAAI;AACF,UAAMA,UAAS,MAAM,qBAAqB,QAAQ,UAAU,QAAQ;AACpE,UAAM,WAAW;AAAA,MACfA,QAAO,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AAAA,MACrD;AAAA,IACF;AACA,UAAM,cAAc,eAAe,IAAI,IAAI;AAC3C,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU,EAAE,UAAU,SAAS,CAAC;AAAA,QAC7C;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,SAAS;AAAA,QAChB;AAAA,QACA,sBAAsB,SAAS;AAAA,UAC7B,CAAC,YAAY,QAAQ;AAAA,QACvB,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACF;;;ACvMA,YAAY,QAAQ;AACpB;AAAA,EACE;AAAA,EACA;AAAA,OACK;;;ACeP,eAAsB,uBACpB,QACA,UAC6B;AAC7B,QAAM,UAAU,MAAM,eAA6B;AAAA,IACjD;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AACD,SAAO,QAAQ,qBAAqB,CAAC;AACvC;;;ADcA,SAAS,YAAY,SAAiB;AACpC,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,EAAE,OAAO,QAAQ,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAGO,IAAM,6BAA6B;AAEnC,SAAS,mBAAmB,QAA2C;AAC5E,QAAM,UAA8B,CAAC;AAErC,QAAM,QAAQ,CAAC,SAAkB;AAC/B,QAAI;AACJ,QAAO,2BAAwB,IAAI,GAAG;AACpC,gBAAU;AAAA,IACZ,WAAc,gBAAa,IAAI,GAAG;AAChC,gBAAU,KAAK;AAAA,IACjB;AAEA,QAAI,SAAS;AACX,YAAM,cAAc,QAAQ;AAC5B,UAAO,gBAAa,WAAW,GAAG;AAChC,cAAM,UAAU,YAAY;AAE5B,YAAI,SAAS,KAAK,OAAO,GAAG;AAC1B,gBAAM,QAAQ,oBAAI,IAAiD;AACnE,qBAAW,QAAQ,QAAQ,WAAW,YAAY;AAChD,gBAAI,CAAI,kBAAe,IAAI,EAAG;AAC9B,gBAAI,CAAC,KAAK,QAAQ,CAAI,gBAAa,KAAK,IAAI,EAAG;AAC/C,kBAAM,OAAO,KAAK,KAAK;AACvB,gBAAI,CAAC,KAAK,aAAa;AACrB,oBAAM,IAAI,MAAM,EAAE,OAAO,IAAI,SAAS,MAAM,CAAC;AAC7C;AAAA,YACF;AACA,gBAAO,mBAAgB,KAAK,WAAW,GAAG;AACxC,oBAAM,IAAI,MAAM;AAAA,gBACd,OAAO,KAAK,YAAY;AAAA,gBACxB,SAAS;AAAA,cACX,CAAC;AAAA,YACH,WAAc,mBAAgB,KAAK,WAAW,GAAG;AAC/C,oBAAM,IAAI,MAAM,EAAE,OAAO,IAAI,SAAS,KAAK,CAAC;AAAA,YAC9C;AAAA,UACF;AACA,gBAAM,QAAQ,QAAQ,SAAS,MAAM;AACrC,gBAAM,EAAE,KAAK,IAAI,OAAO,8BAA8B,KAAK;AAC3D,kBAAQ,KAAK,EAAE,SAAS,OAAO,MAAM,OAAO,EAAE,CAAC;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AACA,IAAG,gBAAa,MAAM,KAAK;AAAA,EAC7B;AAEA,QAAM,MAAM;AACZ,SAAO;AACT;AAEA,IAAM,mBAAmB;AAEzB,SAAS,iBACP,OACA,YACmB;AACnB,QAAM,aAAa,IAAI;AAAA,IACrB,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;AAAA,EACtC;AACA,QAAM,UAA6B,CAAC;AACpC,aAAW,WAAW,MAAM,KAAK,GAAG;AAElC,QAAI,YAAY,OAAQ;AACxB,YAAQ;AAAA,MACN,WAAW,IAAI,OAAO,KAAK,EAAE,SAAS,eAAe,QAAQ;AAAA,IAC/D;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBACP,UACiC;AACjC,QAAM,MAAM,oBAAI,IAAgC;AAChD,aAAW,KAAK,UAAU;AACxB,QAAI,CAAC,EAAE,WAAY;AACnB,UAAM,OAAO,IAAI,IAAI,EAAE,SAAS,KAAK,CAAC;AACtC,SAAK,KAAK,CAAC;AACX,QAAI,IAAI,EAAE,WAAW,IAAI;AAAA,EAC3B;AACA,aAAW,QAAQ,IAAI,OAAO,GAAG;AAC/B,SAAK,KAAK,CAAC,GAAG,MAAM;AAClB,YAAM,KAAK,EAAE,cAAc;AAC3B,YAAM,KAAK,EAAE,cAAc;AAC3B,UAAI,OAAO,GAAI,QAAO,KAAK;AAC3B,aAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,IACpC,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,MAIhB;AACnB,QAAM,WAAW,KAAK,SAAS;AAAA,IAC7B,CAAC,MACC,EAAE,wBAAwB,UAC1B,EAAE,wBAAwB;AAAA,EAC9B;AACA,MAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AAEnC,QAAM,cAAc,yBAAyB,QAAQ;AACrD,MAAI,YAAY,SAAS,EAAG,QAAO,CAAC;AAEpC,QAAM,SAAY;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACF,gBAAa;AAAA;AAAA,IACK;AAAA,IAClB,cAAW;AAAA,EAChB;AAEA,QAAM,WAAW,mBAAmB,MAAM;AAC1C,QAAM,cAAgC,CAAC;AAEvC,aAAW,MAAM,UAAU;AACzB,UAAM,YAAY,2BAA2B,GAAG,SAAS,GAAG,KAAK;AACjE,QAAI,CAAC,UAAW;AAChB,UAAM,aAAa,YAAY,IAAI,SAAS;AAC5C,QAAI,CAAC,cAAc,WAAW,WAAW,EAAG;AAE5C,UAAM,UAAU,WAAW,CAAC;AAC5B,UAAM,aAAa,QAAQ;AAC3B,QAAI,CAAC,WAAY;AAEjB,UAAM,aAA6B;AAAA,MACjC,YAAY,iBAAiB,GAAG,SAAS,GAAG,KAAK;AAAA,MACjD;AAAA,MACA,eAAe,QAAQ;AAAA,MACvB;AAAA,MACA,aAAa,iBAAiB,GAAG,OAAO,QAAQ,WAAW;AAAA,MAC3D,MAAM,GAAG;AAAA,IACX;AAEA,QAAI,WAAW,SAAS,GAAG;AACzB,iBAAW,aAAa,WACrB,MAAM,CAAC,EACP,OAAO,CAAC,MAAM,EAAE,UAAU,EAC1B,IAAI,CAAC,OAAO;AAAA,QACX,MAAM,EAAE;AAAA,QACR,YAAY,EAAE;AAAA,QACd,YAAY,EAAE,cAAc;AAAA,MAC9B,EAAE;AAAA,IACN;AAEA,gBAAY,KAAK,UAAU;AAAA,EAC7B;AAEA,SAAO;AACT;AAEO,IAAM,yBAAsC,OAAO,MAAM,QAAQ;AACtE,QAAM,SAAS,mBAAmB,GAAG;AACrC,MAAI,CAAC,OAAQ,QAAO,gBAAgB;AAEpC,QAAM,WAAW,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AACrE,QAAM,cACJ,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAC5D,MAAI,CAAC,YAAY,CAAC,aAAa;AAC7B,WAAO,YAAY,wCAAwC;AAAA,EAC7D;AAEA,QAAM,WAAW,gBAAgB,GAAG;AACpC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,uBAAuB,QAAQ,QAAQ;AAAA,EAC1D,SAAS,OAAO;AACd,WAAO,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,EAC3E;AAEA,QAAM,cAAc,qBAAqB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,EAAE,aAAa,SAAS,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,OAAO,YAAY;AAAA,MACnB,cAAc,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;;;AElPO,IAAM,aAA0C;AAAA,EACrD,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,mBAAmB;AACrB;AAGO,IAAM,eAA4C,CAAC;AAGnD,IAAM,cAA2C,CAAC;AAGlD,IAAM,gBAA6C;AAAA,EACxD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEO,IAAM,oBAA8D;AAAA,EACzE,kBAAkB,CAAC,QAAQ;AAAA,EAC3B,kBAAkB,CAAC,YAAY;AACjC;;;AClBO,IAAM,eAAN,MAAmB;AAAA,EAChB,QAAQ,oBAAI,IAA4B;AAAA,EACxC;AAAA,EACA;AAAA,EAER,YAAY,QAAgB,MAAmC;AAC7D,SAAK,SAAS;AACd,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA;AAAA,EAGA,SACE,KACA,SACA,YACA,eAAiC,UACjC,uBAAwC,CAAC,GACnC;AACN,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA,EAGA,WAAW,KAAmB;AAC5B,QAAI,KAAK,MAAM,OAAO,GAAG,GAAG;AAC1B,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAGA,iBACE,UACA,aACA,kBAA4D,CAAC,GACvD;AACN,UAAM,SAAS,IAAI,IAAI,YAAY,IAAI,OAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACvD,eAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,SAAS,IAAI,GAAG;AAC1D,WAAK,MAAM,IAAI,KAAK;AAAA,QAClB;AAAA,QACA;AAAA,QACA,YAAY,OAAO,IAAI,GAAG;AAAA,QAC1B,cAAc;AAAA,QACd,sBAAsB,gBAAgB,GAAG,KAAK,CAAC;AAAA,MACjD,CAAC;AAAA,IACH;AACA,eAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,SAAS,MAAM,GAAG;AAC5D,WAAK,MAAM,IAAI,KAAK;AAAA,QAClB;AAAA,QACA;AAAA,QACA,YAAY,OAAO,IAAI,GAAG;AAAA,QAC1B,cAAc;AAAA,QACd,sBAAsB,gBAAgB,GAAG,KAAK,CAAC;AAAA,MACjD,CAAC;AAAA,IACH;AACA,eAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,SAAS,KAAK,GAAG;AAC3D,WAAK,MAAM,IAAI,KAAK;AAAA,QAClB;AAAA,QACA;AAAA,QACA,YAAY,OAAO,IAAI,GAAG;AAAA,QAC1B,cAAc;AAAA,QACd,sBAAsB,gBAAgB,GAAG,KAAK,CAAC;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,EAEF;AAAA;AAAA,EAGA,WAAW,WAA4C;AAErD,UAAM,SAAS,KAAK,MAAM,IAAI,SAAS;AACvC,QAAI,OAAQ,QAAO,OAAO;AAE1B,QAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,UAAM,YAAY,KAAK,SAAS;AAChC,QAAI,UAAU,WAAW,SAAS,GAAG;AACnC,YAAM,MAAM,UAAU,MAAM,UAAU,MAAM;AAC5C,aAAO,KAAK,MAAM,IAAI,GAAG,GAAG;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,WAAW,MAAsB;AAC/B,QAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,UAAM,YAAY,KAAK,SAAS;AAChC,WAAO,KAAK,WAAW,SAAS,IAAI,KAAK,MAAM,UAAU,MAAM,IAAI;AAAA,EACrE;AAAA;AAAA,EAGA,UAAU,KAA0B,gBAAgC;AAClE,UAAM,gBAAgB,oBAAI,IAAY;AACtC,eAAW,CAAC,KAAK,IAAI,KAAK,KAAK,OAAO;AACpC,YAAM,kBAAkB,KAAK,qBAAqB;AAAA,QAAM,CAAC,eACvD,IAAI,aAAa,IAAI,UAAU;AAAA,MACjC;AACA,UAAI,CAAC,gBAAiB;AAEtB,UAAI,KAAK,iBAAiB,UAAU;AAClC,sBAAc,IAAI,GAAG;AAAA,MACvB,WAAW,KAAK,iBAAiB,YAAY,IAAI,WAAW;AAC1D,sBAAc,IAAI,GAAG;AAAA,MACvB,WAAW,KAAK,iBAAiB,gBAAgB,IAAI,eAAe;AAClE,sBAAc,IAAI,GAAG;AAAA,MACvB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAO,eAAe,OAAO,OAAK,cAAc,IAAI,EAAE,IAAI,CAAC;AAAA,IAC7D;AACA,UAAM,YAAY,KAAK,SAAS;AAChC,WAAO,eAAe,OAAO,OAAK;AAChC,YAAM,MAAM,EAAE,KAAK,WAAW,SAAS,IAAI,EAAE,KAAK,MAAM,UAAU,MAAM,IAAI,EAAE;AAC9E,aAAO,cAAc,IAAI,GAAG;AAAA,IAC9B,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ,MAAc,MAA+B,KAAuC;AAChG,UAAM,MAAM,KAAK,WAAW,IAAI;AAChC,UAAM,aAAa,KAAK,MAAM,IAAI,GAAG;AACrC,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AAAA,IACzC;AACA,WAAO,WAAW,QAAQ,MAAM,GAAG;AAAA,EACrC;AAAA;AAAA,EAGA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,OAAiB;AACf,WAAO,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC;AAAA,EACrC;AACF;;;ACzIO,SAAS,sBACd,aACA,MACA,SACqB;AACrB,QAAM,QAAQ,CAAC,GAAG,WAAW,EAAE,QAAQ,EAAE;AAAA,IACvC,CAAC,MAAM,OAAO,MAAM,GAAG,MAAM,IAAI;AAAA,IACjC;AAAA,EACF;AACA,SAAO,MAAM;AACf;AAKO,SAAS,oBACd,QACY;AACZ,SAAO,OAAO,MAAM,SAAS;AAC3B,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAMC,UAAS,MAAM,KAAK;AAC1B,WAAO,GAAG,KAAK,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI;AACjD,WAAOA;AAAA,EACT;AACF;;;AChDA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,gBAAgB;;;ACMzB,SAAS,cAAAC,aAAY,gBAAAC,eAAc,mBAAmB;AACtD,SAAS,QAAAC,OAAM,SAAS,eAAe;AACvC,SAAS,qBAAqB;AAM9B,SAAS,qBAAqB,SAAiB,SAA2B;AACxE,QAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,MAAI,OAAO,CAAC,OAAO;AAEnB,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,KAAM;AACnB,UAAM,OAAiB,CAAC;AACxB,eAAW,KAAK,MAAM;AACpB,UAAI,SAAS,KAAK;AAChB,YAAI;AACF,qBAAW,SAAS,YAAY,GAAG,EAAE,eAAe,KAAK,CAAC,GAAG;AAC3D,gBAAI,MAAM,YAAY,KAAK,CAAC,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,SAAS,gBAAgB;AACvF,mBAAK,KAAKC,MAAK,GAAG,MAAM,IAAI,CAAC;AAAA,YAC/B;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAAuB;AAAA,MACjC,OAAO;AACL,cAAM,YAAYA,MAAK,GAAG,IAAI;AAC9B,YAAIC,YAAW,SAAS,EAAG,MAAK,KAAK,SAAS;AAAA,MAChD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKA,SAAS,iBAAiB,SAA2B;AACnD,QAAM,OAAiB,CAAC;AAGxB,QAAM,cAAcD,MAAK,SAAS,cAAc;AAChD,MAAIC,YAAW,WAAW,GAAG;AAC3B,QAAI;AACF,YAAM,UAAU,KAAK,MAAMC,cAAa,aAAa,OAAO,CAAC;AAC7D,YAAM,aAAa,MAAM,QAAQ,QAAQ,UAAU,IAC/C,QAAQ,aACR,QAAQ,YAAY;AACxB,UAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,mBAAW,WAAW,YAAY;AAChC,eAAK,KAAK,GAAG,qBAAqB,SAAS,OAAO,CAAC;AAAA,QACrD;AACA,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAAmB;AAAA,EAC7B;AAGA,QAAM,aAAaF,MAAK,SAAS,qBAAqB;AACtD,MAAIC,YAAW,UAAU,GAAG;AAC1B,QAAI;AACF,YAAM,UAAUC,cAAa,YAAY,OAAO;AAChD,YAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,UAAI,aAAa;AACjB,iBAAW,QAAQ,OAAO;AACxB,YAAI,gBAAgB,KAAK,IAAI,GAAG;AAC9B,uBAAa;AACb;AAAA,QACF;AACA,YAAI,YAAY;AACd,gBAAM,QAAQ,KAAK,MAAM,+BAA+B;AACxD,cAAI,OAAO;AACT,iBAAK,KAAK,GAAG,qBAAqB,SAAS,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AAAA,UAC7D,WAAW,MAAM,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG;AAC1C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAAmB;AAAA,EAC7B;AAEA,SAAO;AACT;AAQA,SAAS,sBACP,cACA,SACe;AAEf,MAAI;AACF,WAAO,aAAa,QAAQ,GAAG,OAAO,eAAe;AAAA,EACvD,QAAQ;AAAA,EAER;AAGA,MAAI;AACF,UAAM,WAAW,aAAa,QAAQ,OAAO;AAC7C,QAAI,MAAM,QAAQ,QAAQ;AAC1B,WAAO,MAAM;AACX,YAAM,YAAYF,MAAK,KAAK,cAAc;AAC1C,UAAIC,YAAW,SAAS,GAAG;AACzB,cAAM,MAAM,KAAK,MAAMC,cAAa,WAAW,OAAO,CAAC;AACvD,YAAI,IAAI,SAAS,QAAS,QAAO;AAAA,MACnC;AACA,YAAM,SAAS,QAAQ,GAAG;AAC1B,UAAI,WAAW,IAAK;AACpB,YAAM;AAAA,IACR;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAKA,SAAS,oBAAoB,KAAa,OAAiB,UAAwB;AACjF,QAAM,cAAcF,MAAK,KAAK,cAAc;AAC5C,MAAI,CAACC,YAAW,WAAW,EAAG;AAE9B,MAAI;AACF,UAAM,UAAU,KAAK,MAAMC,cAAa,aAAa,OAAO,CAAC;AAC7D,UAAM,UAAU;AAAA,MACd,GAAG,QAAQ;AAAA,MACX,GAAG,QAAQ;AAAA,IACb;AACA,UAAM,eAAe,cAAcF,MAAK,KAAK,SAAS,CAAC;AACvD,eAAW,WAAW,OAAO,KAAK,OAAO,GAAG;AAC1C,UAAI;AACF,cAAM,aAAa,sBAAsB,cAAc,OAAO;AAC9D,YAAI,CAAC,WAAY;AACjB,cAAM,SAAS,KAAK,MAAME,cAAa,YAAY,OAAO,CAAC;AAC3D,YAAI,OAAO,QAAQ,GAAG;AACpB,gBAAM,gBAAgBF,MAAK,QAAQ,UAAU,GAAG,OAAO,QAAQ,CAAC;AAChE,cAAIC,YAAW,aAAa,KAAK,CAAC,MAAM,SAAS,aAAa,GAAG;AAC/D,kBAAM,KAAK,aAAa;AAAA,UAC1B;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAWO,SAAS,qBAAqB,UAAkB,SAAiB,UAA4B;AAClG,QAAM,QAAkB,CAAC;AACzB,QAAM,gBAAgB,QAAQ,QAAQ;AAGtC,MAAI,MAAM;AACV,SAAO,MAAM;AACX,UAAM,YAAYD,MAAK,KAAK,OAAO;AACnC,QAAIC,YAAW,SAAS,GAAG;AACzB,YAAM,KAAK,SAAS;AACpB;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AAGA,sBAAoB,eAAe,OAAO,QAAQ;AAGlD,MAAI,MAAM,WAAW,KAAKA,YAAWD,MAAK,eAAe,qBAAqB,CAAC,GAAG;AAChF,UAAM,gBAAgB,iBAAiB,aAAa;AACpD,eAAW,SAAS,eAAe;AACjC,0BAAoB,OAAO,OAAO,QAAQ;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AACT;AAaO,SAAS,kBAAkB,UAA4B;AAC5D,SAAO,qBAAqB,UAAU,MAAM,SAAS,WAAW;AAClE;AAQO,SAAS,mBAAmB,UAA4B;AAC7D,QAAM,QAAkB,CAAC;AACzB,MAAI,MAAM,QAAQ,QAAQ;AAE1B,SAAO,MAAM;AACX,UAAM,YAAYA,MAAK,KAAK,MAAM,SAAS,MAAM,YAAY;AAC7D,QAAIC,YAAW,SAAS,GAAG;AACzB,YAAM,KAAK,SAAS;AACpB;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AAEA,SAAO;AACT;;;AClOA,SAAS,yBAAyB;AAGlC,SAAS,QAAQ,OAAuB;AACtC,SAAO,MACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE;AAChB;AAEO,SAAS,iBAAiB,MAItB;AACT,QAAM,OAAO,KAAK,YAAY,KAAK,eAAe,KAAK;AACvD,SAAO,GAAG,QAAQ,KAAK,IAAI,CAAC,IAAI,IAAI;AACtC;AAEA,SAAS,cAAc,OAAoC;AACzD,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MACE,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,UAAU,MACV;AACA,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,sBACP,UACA,IACkC;AAElC,QAAM,mBAAmB,OAAO,QAAQ,UAAU,oBAAoB,CAAC,CAAC;AACxE,MAAI,iBAAiB,SAAS,GAAG;AAC/B,WAAO,iBAAiB,IAAI,CAAC,CAAC,WAAW,KAAK,OAAO;AAAA,MACnD,MAAM;AAAA,MACN,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,YAAY;AAAA,IACd,EAAE;AAAA,EACJ;AAEA,QAAM,OAAO,IAAI;AACjB,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO,CAAC;AACxC,QAAM,cAAc,IAAI,IAAI,IAAI,oBAAoB,CAAC,CAAC;AACtD,SAAO,KAAK,IAAI,CAAC,UAAU;AAAA,IACzB;AAAA,IACA,UAAU,YAAY,IAAI,IAAI,KAAK;AAAA,IACnC,YAAY;AAAA,EACd,EAAE;AACJ;AAEO,SAAS,8BAA8B,MAM7B;AACf,QAAM,EAAE,UAAU,WAAW,IAAI;AACjC,QAAM,OAAO,SAAS,KAAK;AAC3B,QAAM,cAAc,SAAS,KAAK,eAAe;AACjD,QAAM,QAAQ,SAAS,SAAS,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE;AACxD,QAAM,WAAW,SAAS;AAC1B,QAAM,KAAK,SAAS;AACpB,QAAM,oBAAqB,SAExB,kBAAkB,CAAC,GACnB,IAAI,CAAC,aAAa;AAAA,IACjB,MAAM,QAAQ,QAAQ;AAAA,IACtB,aAAa,QAAQ;AAAA,EACvB,EAAE;AAEJ,SAAO;AAAA,IACL,IACE,KAAK,MACL,iBAAiB;AAAA,MACf;AAAA,MACA,UAAU,SAAS,cAAc,SAAS;AAAA,MAC1C,aAAa,KAAK;AAAA,IACpB,CAAC;AAAA,IACH;AAAA,IACA;AAAA,IACA,UAAU,SAAS,KAAK,YAAY;AAAA,IACpC,QAAQ,SAAS,KAAK,UAAU;AAAA,IAChC,MAAM,SAAS,KAAK,QAAQ,CAAC;AAAA,IAC7B,OAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,SAAS,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM;AAAA,QAC7D;AAAA,QACA;AAAA,UACE,MAAM,KAAK;AAAA,UACX,aAAa,KAAK,eAAe;AAAA,UACjC,UAAU,KAAK,YAAY;AAAA,UAC3B,SAAS,KAAK;AAAA,UACd,QAAQ,KAAK,SAAS,CAAC,GAAG,KAAK,MAAM,IAAI;AAAA,UACzC,aAAa,KAAK,cAAc,CAAC,GAAG,KAAK,WAAW,IAAI;AAAA,QAC1D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,cACE,SAAS,gBACT,UAAU,gBACV,OAAO,QAAQ,SAAS,SAAS,CAAC,CAAC,EAAE;AAAA,MACnC,CAAC,CAAC,UAAU,IAAI,MACd,GAAG,QAAQ,GAAG,KAAK,WAAW,gBAAgB,EAAE,KAAK,KAAK,IAAI;AAAA,IAClE;AAAA,IACF,WAAW,SAAS,YAAY,CAAC,GAAG,IAAI,CAAC,aAAa;AAAA,MACpD,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,MACrB,MAAM,QAAQ;AAAA,MACd,MAAM;AAAA,IACR,EAAE;AAAA,IACF,YAAY,SAAS,aAAa,CAAC,GAAG,IAAI,CAAC,cAAc;AAAA,MACvD,eAAe,SAAS;AAAA,MACxB,cAAc,SAAS;AAAA,MACvB,MAAM,SAAS;AAAA,IACjB,EAAE;AAAA,IACF,kBAAkB,sBAAsB,UAAU,EAAE;AAAA,IACpD,UAAU;AAAA,MACR,MAAM,MAAM,QAAQ,CAAC;AAAA,MACrB,SAAS,MAAM,WAAW,CAAC;AAAA,MAC3B,YAAY,MAAM,cAAc,CAAC;AAAA,MACjC,eAAe,MAAM,iBAAiB,CAAC;AAAA,MACvC,KAAK,MAAM,QAAQ,CAAC;AAAA,MACpB,OAAO,MAAM,WAAW,CAAC;AAAA,MACzB,UACE,iBAAiB,SAAS,IACtB,oBACC,IAAI,kBAAkB,CAAC,GAAG,IAAI,CAAC,aAAa;AAAA,QAC3C,MAAM;AAAA,MACR,EAAE;AAAA,IACV;AAAA,IACA;AAAA,IACA,YAAY,SAAS,cAAc,SAAS;AAAA,IAC5C,aAAa,KAAK;AAAA,IAClB,YAAY,KAAK,cAAc,KAAK;AAAA,IACpC,aAAa,SAAS,cAClB;AAAA,MACE,YAAY,SAAS,YAAY;AAAA,MACjC,SAAS,SAAS,YAAY;AAAA,MAC9B,YAAY,SAAS,YAAY;AAAA,MACjC,eAAe,SAAS,YAAY;AAAA,MACpC,YAAY,SAAS,YAAY;AAAA,MACjC,YAAY,SAAS,YAAY;AAAA,MACjC,SAAS,SAAS,YAAY,SAAS,IAAI,CAAC,WAAW;AAAA,QACrD,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,SAAS,MAAM;AAAA,MACjB,EAAE;AAAA,IACJ,IACA;AAAA,IACJ,UAAU;AAAA,MACR,WAAW,UAAU,aAAa,CAAC;AAAA,MACnC,cAAc,UAAU,gBAAgB,CAAC;AAAA,IAC3C;AAAA,EACF;AACF;AAEO,SAAS,uBACd,KACA,OACU;AACV,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM,eAAe;AAAA,IAClC,UAAU,MAAM,YAAY;AAAA,IAC5B,YAAY,MAAM,cAAc,CAAC;AAAA,IACjC,MAAM,MAAM,QAAQ,CAAC;AAAA,IACrB,MAAM,MAAM,QAAQ;AAAA,EACtB;AACF;AAEO,SAAS,4BACd,QACc;AACd,QAAM,OAAmB,CAAC;AAC1B,QAAM,aAAyC,CAAC;AAEhD,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AACnE,UAAM,aAAa,QAChB,IAAI,CAAC,WAAW;AAAA,MACf,MAAM,MAAM;AAAA,MACZ;AAAA,MACA,OAAO,cAAc,MAAM,KAAK;AAAA,MAChC,aAAa,MAAM;AAAA,IACrB,EAAE,EACD,OAAO,CAAC,UAAU,CAAC,eAAe,KAAK,CAAC;AAC3C,QAAI,WAAW,SAAS,GAAG;AACzB,iBAAW,QAAQ,IAAI;AACvB,WAAK,KAAK,GAAG,UAAU;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,OAAO,KAAK;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,MAMd;AAClB,QAAM,eAAe,oBAAI,IAAmB;AAE5C,MAAI,OAAO,KAAK,KAAK,UAAU,EAAE,SAAS,GAAG;AAC3C,iBAAa,IAAI,YAAY;AAAA,EAC/B;AACA,MAAI,KAAK,UAAU,KAAK,OAAO,QAAQ,GAAG;AACxC,iBAAa,IAAI,QAAQ;AAAA,EAC3B;AACA,MAAI,KAAK,UAAU,OAAO,KAAK,KAAK,MAAM,EAAE,SAAS,GAAG;AACtD,iBAAa,IAAI,QAAQ;AAAA,EAC3B;AACA,MAAI,KAAK,OAAO;AACd,iBAAa,IAAI,OAAO;AAAA,EAC1B;AACA,QAAM,iBACJ,QAAQ,KAAK,kBAAkB,KAC/B,OAAO,OAAO,KAAK,UAAU,EAAE,KAAK,CAAC,cAAc,QAAQ,UAAU,WAAW,CAAC;AACnF,MAAI,gBAAgB;AAClB,iBAAa,IAAI,aAAa;AAAA,EAChC;AAEA,SAAO,MAAM,KAAK,YAAY;AAChC;AAEO,SAAS,iBAAiB,UAAoC;AACnE,SAAO,kBAAkB,MAAM,QAAQ;AACzC;;;AFrPO,IAAM,uBAAN,MAAkD;AAAA,EAC9C,OAAO;AAAA,EAEhB,SAAS,UAA4B;AACnC,WAAO,kBAAkB,QAAQ;AAAA,EACnC;AAAA,EAEA,MAAM,KAAK,aAAgD;AACzD,UAAM,QAAQ,KAAK,SAAS,WAAW;AAEvC,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,IAAI;AAAA,QACR,MAAM,MAAM,OAAO,oBAAoB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAInB,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,oCAGT,MAAM,UAAU;AAAA,MACvD;AAAA,IACF;AAGA,UAAM,UAAU,MAAM,SAAS,MAAM,CAAC,GAAG,OAAO;AAChD,UAAM,UAAU,KAAK,MAAM,OAAO;AAGlC,QAAI,CAAC,QAAQ,UAAU,QAAQ,SAAS;AACtC,cAAQ,SAAS,QAAQ;AAAA,IAC3B;AAGA,UAAM,aAAqC,CAAC;AAC5C,QAAI,QAAQ,aAAa;AACvB,iBAAW,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AACjD,mBAAW,IAAI,IAAI,QAAQ;AAAA,MAC7B;AAAA,IACF;AAGA,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,QAAQ,KAAK,MAAM,MAAM,SAAS,MAAM,CAAC,GAAG,OAAO,CAAC;AAC1D,UAAI,MAAM,aAAa;AACrB,mBAAW,QAAQ,OAAO,KAAK,MAAM,SAAS,GAAG;AAC/C,qBAAW,IAAI,IAAI,MAAM;AAAA,QAC3B;AAAA,MACF;AACA,aAAO,OAAO,QAAQ,WAAW,MAAM,SAAS;AAChD,YAAM,cAAc,MAAM,UAAU,MAAM;AAC1C,UAAI,aAAa;AACf,gBAAQ,SAAS,EAAE,GAAG,QAAQ,QAAQ,GAAG,YAAY;AAAA,MACvD;AAAA,IACF;AAEA,UAAM,aAAa,OAAO;AAAA,MACxB,OAAO,QAAQ,QAAQ,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,QAAQ,MAAM;AAAA,QACzD;AAAA,QACA,8BAA8B;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,aAAa,WAAW,SAAS,KAAK,IAAI,KAAK,QAAQ;AAAA,UACvD,YAAY,WAAW,SAAS,KAAK,IAAI,KAAK,QAAQ;AAAA,QACxD,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA,UAAM,SAAS,QAAQ,SACnB,OAAO;AAAA,MACL,OAAO,QAAQ,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,QACnD;AAAA,QACA,uBAAuB,KAAK,KAAK;AAAA,MACnC,CAAC;AAAA,IACH,IACA;AACJ,UAAM,SAAS,QAAQ,SACnB,4BAA4B,QAAQ,MAAM,IAC1C;AACJ,UAAM,WAAwB,iBAAiB;AAAA,MAC7C,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,cAAc,kBAAkB;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,oBAAoB,QAAQ;AAAA,MAC9B,CAAC;AAAA,MACD,UAAU;AAAA,QACR,kBAAkB,QAAQ;AAAA,QAC1B,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,oBAAoB,QAAQ;AAAA,MAC5B;AAAA,MACA,oBAAoB,QAAQ;AAAA,IAC9B,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,YAAY,SAAS;AAAA,MACrB,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,OAAO,QAAQ;AAAA,MACf,oBAAoB,QAAQ;AAAA,MAC5B,YAAY,SAAS;AAAA,MACrB,oBAAoB,SAAS;AAAA,MAC7B,cAAc,IAAI,IAAI,SAAS,YAAY;AAAA,IAC7C;AAAA,EACF;AACF;;;AGlIA,SAAS,cAAAE,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,OAAM,UAAU,WAA8B;;;ACDvD,SAAS,eAAAC,cAAa,cAAAC,mBAAkB;AACxC,SAAS,QAAAC,OAAM,SAAS,gBAAgB;AASxC,IAAM,gBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EAAgB;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EACnD;AAAA,EAAa;AAAA,EAAa;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAU;AACxD,CAAC;AAED,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,SAAS,uBAAuB,aAAgD;AACrF,QAAM,UAAqC,CAAC;AAC5C,QAAM,OAAO,oBAAI,IAAY;AAG7B,QAAM,WAAW;AAAA,IACf;AAAA,IAAkB;AAAA,IAAc;AAAA,IAChC;AAAA,IAAU;AAAA,IAAU;AAAA,EACtB,EAAE,IAAI,OAAKA,MAAK,aAAa,CAAC,CAAC,EAAE,OAAO,OAAKD,YAAW,CAAC,CAAC;AAG1D,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,SAASC,MAAK,aAAa,KAAK;AACtC,QAAID,YAAW,MAAM,EAAG,UAAS,KAAK,MAAM;AAAA,EAC9C;AAEA,aAAW,OAAO,UAAU;AAC1B,YAAQ,KAAK,SAAS,IAAI;AAAA,EAC5B;AAEA,SAAO;AACT;AAEA,SAAS,QACP,KACA,SACA,MACA,QAAQ,GACF;AACN,MAAI,QAAQ,EAAG;AAEf,MAAI;AACJ,MAAI;AACF,cAAUD,aAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACpD,QAAQ;AAAE;AAAA,EAAQ;AAElB,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,KAAK,WAAW,GAAG,EAAG;AAEhC,QAAI,MAAM,YAAY,GAAG;AACvB,UAAI,cAAc,IAAI,MAAM,IAAI,EAAG;AACnC,cAAQE,MAAK,KAAK,MAAM,IAAI,GAAG,SAAS,MAAM,QAAQ,CAAC;AACvD;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,OAAO,EAAG;AACrB,UAAM,MAAM,QAAQ,MAAM,IAAI;AAC9B,QAAI,QAAQ,UAAU,QAAQ,OAAQ;AACtC,QAAI,kBAAkB,KAAK,OAAK,EAAE,KAAK,MAAM,IAAI,CAAC,EAAG;AAErD,UAAM,WAAWA,MAAK,KAAK,MAAM,IAAI;AACrC,QAAI,KAAK,IAAI,QAAQ,EAAG;AACxB,SAAK,IAAI,QAAQ;AAGjB,UAAM,OAAO,mBAAmB,MAAM,MAAM,GAAG;AAC/C,QAAI,MAAM;AACR,cAAQ,KAAK,EAAE,UAAU,eAAe,KAAK,CAAC;AAAA,IAChD;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,UAAkB,SAAgC;AAC5E,QAAM,aAAa,SAAS,QAAQ,gBAAgB,EAAE;AACtD,MAAI,eAAe,SAAS;AAE1B,WAAO,SAAS,OAAO;AAAA,EACzB;AACA,SAAO;AACT;;;ACrGA,SAAS,eAAAC,cAAa,gBAAAC,eAAc,cAAAC,mBAAkB;AACtD,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAcvB,SAAS,WAAW,aAAoD;AAE7E,QAAM,WAAW,iBAAiB,WAAW;AAC7C,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,QAAM,YAA0B,CAAC;AACjC,MAAI,SAAS;AAEb,aAAW,YAAY,UAAU;AAC/B,QAAI;AACF,YAAM,UAAUH,cAAa,UAAU,OAAO;AAC9C,YAAM,SAAS,wBAAwB,OAAO;AAC9C,gBAAU,KAAK,GAAG,MAAM;AAAA,IAC1B,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,EAAG,QAAO;AAGnC,WAAS,aAAa,UAAU,IAAI,OAAK,EAAE,IAAI,CAAC;AAGhD,QAAM,aAA2C,CAAC;AAClD,aAAW,SAAS,WAAW;AAC7B,UAAM,WAAW,mBAAmB,MAAM,IAAI;AAC9C,QAAI,CAAC,WAAW,QAAQ,EAAG,YAAW,QAAQ,IAAI,CAAC;AAEnD,QAAI,CAAC,WAAW,QAAQ,EAAE,KAAK,OAAK,EAAE,SAAS,MAAM,IAAI,GAAG;AAC1D,iBAAW,QAAQ,EAAE,KAAK,KAAK;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,OAAO,OAAO,UAAU,EAAE,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,QAAQ,CAAC;AAAA,IACzE;AAAA,EACF;AACF;AAKA,SAAS,iBAAiB,aAA+B;AACvD,QAAM,QAAkB,CAAC;AACzB,QAAM,aAAa;AAAA,IACjB;AAAA,IAAO;AAAA,IAAU;AAAA,IAAO;AAAA,EAC1B,EAAE,IAAI,OAAKE,MAAK,aAAa,CAAC,CAAC,EAAE,OAAO,OAAKD,YAAW,CAAC,CAAC;AAG1D,aAAW,KAAK,WAAW;AAE3B,aAAW,OAAO,YAAY;AAC5B,QAAI;AACF,YAAM,UAAUF,aAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AACxD,iBAAW,SAAS,SAAS;AAC3B,YAAI,CAAC,MAAM,OAAO,EAAG;AACrB,cAAM,MAAMI,SAAQ,MAAM,IAAI;AAC9B,YAAI,QAAQ,UAAU,QAAQ,SAAS;AACrC,gBAAM,KAAKD,MAAK,KAAK,MAAM,IAAI,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,IACF,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAASA,MAAK,aAAa,KAAK;AACtC,MAAID,YAAW,MAAM,GAAG;AACtB,QAAI;AACF,iBAAW,YAAYF,aAAY,QAAQ,EAAE,eAAe,KAAK,CAAC,GAAG;AACnE,YAAI,SAAS,YAAY,KAAK,CAAC,UAAU,OAAO,SAAS,QAAQ,EAAE,SAAS,SAAS,IAAI,GAAG;AAC1F,gBAAM,SAASG,MAAK,QAAQ,SAAS,IAAI;AACzC,qBAAW,QAAQH,aAAY,QAAQ,EAAE,eAAe,KAAK,CAAC,GAAG;AAC/D,gBAAI,KAAK,OAAO,MAAM,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,KAAK,SAAS,OAAO,IAAI;AAChF,oBAAM,KAAKG,MAAK,QAAQ,KAAK,IAAI,CAAC;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAC3B;AAOA,SAAS,wBAAwB,SAA+B;AAC9D,QAAM,SAAuB,CAAC;AAG9B,MAAI,kBAAkB;AACtB,MAAI,aAAa;AACjB,QAAM,oBAAoB,CAAC,SAAS,SAAS,eAAe,QAAQ;AAEpE,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAG1B,QAAI,CAAC,mBAAmB,eAAe,GAAG;AACxC,UAAI,kBAAkB,KAAK,SAAO,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,CAAC,GAAG;AACnF,YAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,4BAAkB;AAClB,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAGA,QAAI,iBAAiB;AACnB,iBAAW,MAAM,SAAS;AACxB,YAAI,OAAO,IAAK;AAAA,iBACP,OAAO,KAAK;AACnB;AACA,cAAI,cAAc,GAAG;AACnB,8BAAkB;AAClB,yBAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,mBAAmB,eAAe,EAAG;AAE1C,UAAM,QAAQ,QAAQ,MAAM,6BAA6B;AACzD,QAAI,OAAO;AACT,YAAM,CAAC,EAAE,MAAM,KAAK,IAAI;AAExB,YAAM,eAAe,MAAM,MAAM,qBAAqB;AACtD,YAAM,aAAa,MAAM,QAAQ,eAAe,EAAE,EAAE,KAAK;AACzD,aAAO,KAAK;AAAA,QACV;AAAA,QACA,OAAO;AAAA,QACP,aAAa,eAAe,CAAC;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAOA,SAAS,aAAa,OAAyB;AAC7C,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,WAAW,MAAM,IAAI,OAAK,EAAE,MAAM,CAAC,CAAC;AAE1C,MAAI,SAAS;AACb,QAAM,QAAQ,SAAS,CAAC;AACxB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,KAAK,MAAM,CAAC;AAClB,QAAI,SAAS,MAAM,OAAK,EAAE,CAAC,MAAM,EAAE,GAAG;AACpC,gBAAU;AAAA,IACZ,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,YAAY,GAAG;AACvC,MAAI,WAAW,GAAG;AAChB,WAAO,OAAO,OAAO,MAAM,GAAG,WAAW,CAAC;AAAA,EAC5C;AACA,SAAO;AACT;AAKA,SAAS,mBAAmB,MAAsB;AAChD,QAAM,IAAI,KAAK,YAAY;AAC3B,MAAI,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,YAAY,KAAK,EAAE,SAAS,YAAY,KAC1E,EAAE,SAAS,SAAS,KAAK,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,QAAQ,KACvE,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,aAAa,KAAK,EAAE,SAAS,SAAS,KACxE,EAAE,SAAS,MAAM,KAAK,CAAC,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,OAAO,GAAG;AACrE,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,aAAa,GAAG;AACjG,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,SAAS,KAAK,EAAE,SAAS,QAAQ,GAAG;AAC7F,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,QAAQ,GAAG;AACxB,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,QAAQ,GAAG;AACxB,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,QAAQ,GAAG;AACxB,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,MAAM,GAAG;AACtB,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,SAAS,GAAG;AACzB,WAAO;AAAA,EACT;AACA,MAAI,EAAE,SAAS,OAAO,GAAG;AACvB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AFhNO,IAAM,wBAAN,MAAmD;AAAA,EAC/C,OAAO;AAAA,EAEhB,SAAS,UAA4B;AACnC,WAAO,uBAAuB,QAAQ,EAAE,IAAI,OAAK,EAAE,QAAQ;AAAA,EAC7D;AAAA,EAEA,MAAM,KAAK,aAAgD;AAEzD,QAAI;AAKJ,QAAI;AACF,mBAAa,MAAM,oBAAoB;AAAA,IACzC,SAAS,GAAG;AACV,YAAM,IAAI;AAAA,QACR;AAAA,MAGF;AAAA,IACF;AAGA,UAAM,eAAe,aAAa,WAAW;AAG7C,UAAM,YAAY,WAAW,yBAAyB,gBAAgB,MAAS;AAE/E,QAAI;AAEF,YAAM,aAAa,uBAAuB,WAAW;AAErD,UAAI,WAAW,WAAW,GAAG;AAC3B,cAAM,IAAI;AAAA,UACR,+BAA+B,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,QAI5C;AAAA,MACF;AAEA,YAAM,aAA+C,CAAC;AACtD,YAAM,aAAa,oBAAI,IAAoB;AAC3C,YAAM,qBAAqB,gBAAgB,WAAW;AACtD,UAAI,iBAAiB;AAGrB,YAAM,mBAAmB,oBAAI,IAAsB;AAEnD,iBAAW,EAAE,UAAU,cAAc,KAAK,YAAY;AACpD,YAAI;AACF,gBAAM,QAAQ,UAAU,WAAW,QAAQ;AAE3C,qBAAW,QAAQ,OAAO;AACxB,kBAAM,WAAW,sBAAsB,MAAM,UAAU,WAAW;AAClE,uBAAW,KAAK,IAAI,IAAI;AACxB,gBAAI,oBAAoB;AACtB,yBAAW,IAAI,KAAK,MAAM,kBAAkB;AAAA,YAC9C;AACA;AAEA,kBAAM,UAAU,SAAS,aAAa,QAAQ;AAC9C,gBAAI,CAAC,iBAAiB,IAAI,OAAO,EAAG,kBAAiB,IAAI,SAAS,CAAC,CAAC;AACpE,6BAAiB,IAAI,OAAO,EAAG,KAAK,KAAK,IAAI;AAAA,UAC/C;AAGA,cAAI,MAAM,WAAW,GAAG;AACtB,kBAAM,OAAO,UAAU,QAAQ,UAAU,aAAa;AACtD,gBAAI,MAAM;AACR,oBAAM,WAAW,sBAAsB,MAAM,UAAU,WAAW;AAClE,yBAAW,KAAK,IAAI,IAAI;AACxB,kBAAI,oBAAoB;AACtB,2BAAW,IAAI,KAAK,MAAM,kBAAkB;AAAA,cAC9C;AACA;AACA,oBAAM,UAAU,SAAS,aAAa,QAAQ;AAC9C,kBAAI,CAAC,iBAAiB,IAAI,OAAO,EAAG,kBAAiB,IAAI,SAAS,CAAC,CAAC;AACpE,+BAAiB,IAAI,OAAO,EAAG,KAAK,KAAK,IAAI;AAAA,YAC/C;AAAA,UACF;AAAA,QACF,QAAQ;AAEN;AAAA,QACF;AAAA,MACF;AAGA,qBAAe,YAAY,gBAAgB;AAG3C,cAAQ,MAAM,6BAA6B,cAAc,oBAAoB,WAAW,MAAM,SAAS;AAEvG,UAAI,mBAAmB,GAAG;AACxB,cAAM,IAAI;AAAA,UACR,SAAS,WAAW,MAAM;AAAA;AAAA;AAAA,QAG5B;AAAA,MACF;AAGA,YAAM,SAAS,WAAW,WAAW;AACrC,UAAI,QAAQ;AACV,gBAAQ,MAAM,yBAAyB,OAAO,KAAK,yBAAyB,OAAO,KAAK,OAAO,UAAU,EAAE,MAAM,cAAc;AAAA,MACjI;AAEA,YAAM,qBAAqB,OAAO;AAAA,QAChC,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,QAAQ,MAAM;AAAA,UAClD;AAAA,UACA,8BAA8B;AAAA,YAC5B,IAAI;AAAA,YACJ;AAAA,YACA,YAAY;AAAA,YACZ,aAAa,WAAW,IAAI,SAAS,KAAK,IAAI,KAAK;AAAA,YACnD,YACE,WAAW,IAAI,SAAS,KAAK,IAAI,KAAK;AAAA,UAC1C,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AACA,YAAM,iBAAiB,SACnB,4BAA4B,MAAM,IAClC;AACJ,YAAM,mBAAmB,OAAO,YAAY,WAAW,QAAQ,CAAC;AAChE,YAAM,WAAwB,iBAAiB;AAAA,QAC7C,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,cAAc,kBAAkB;AAAA,UAC9B,YAAY;AAAA,UACZ,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,UAAU;AAAA,UACR,aAAa;AAAA,UACb,YAAY;AAAA,QACd;AAAA,QACA,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL;AAAA,QACA,YAAY,SAAS;AAAA,QACrB,QAAQ,SAAS;AAAA,QACjB,QAAQ,SAAS;AAAA,QACjB,OAAO;AAAA,QACP,oBAAoB;AAAA,QACpB,YAAY,SAAS;AAAA,QACrB,oBAAoB,SAAS;AAAA,QAC7B,cAAc,IAAI,IAAI,SAAS,YAAY;AAAA,MAC7C;AAAA,IACF,UAAE;AACA,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF;AACF;AAEA,IAAI,yBAMQ;AAEZ,eAAe,sBAAsB;AACnC,MAAI,CAAC,wBAAwB;AAC3B,6BAAyB,OAAO,oBAAwB;AAAA,EAC1D;AACA,SAAO;AACT;AA6BA,IAAM,sBAAsB,oBAAI,IAAI,CAAC,YAAY,aAAa,MAAM,UAAU,CAAC;AAC/E,IAAM,uBAAuB,oBAAI,IAAI;AAAA,EACnC;AAAA,EAAe;AAAA,EAAS;AAAA,EAAgB;AAAA,EAAY;AAAA,EAAQ;AAAA,EAC5D;AAAA,EAAa;AAAA,EAAgB;AAAA,EAAW;AAAA,EAAkB;AAC5D,CAAC;AACD,IAAM,kBAAkB,oBAAI,IAAI,CAAC,SAAS,CAAC;AAG3C,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAEzB,SAAS,0BAA0B,eAAoC;AACrE,QAAM,UAAU,IAAI,IAAI,mBAAmB;AAC3C,MAAI,iBAAiB,KAAK,aAAa,GAAG;AACxC,eAAW,KAAK,qBAAsB,SAAQ,IAAI,CAAC;AAAA,EACrD;AACA,MAAI,iBAAiB,KAAK,aAAa,GAAG;AACxC,eAAW,KAAK,gBAAiB,SAAQ,IAAI,CAAC;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,sBACP,MACA,UACA,aACkB;AAElB,QAAM,oBAAoB,0BAA0B,KAAK,IAAI;AAC7D,QAAM,QAAwC,CAAC;AAC/C,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,KAAK,KAAK,GAAG;AACzD,QAAI,SAAS,WAAW,eAAe,CAAC,kBAAkB,IAAI,IAAI,EAAG;AACrE,UAAM,IAAI,IAAI;AAAA,MACZ,MAAM,SAAS;AAAA,MACf,aAAa,SAAS,eAAe;AAAA,MACrC,UAAU,SAAS;AAAA,MACnB,GAAI,SAAS,UAAU,EAAE,QAAQ,SAAS,OAAO;AAAA,MACjD,GAAI,SAAS,YAAY,UAAa,EAAE,SAAS,SAAS,QAAQ;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,eAAe,SAAS,aAAa,QAAQ;AACnD,QAAM,WAAW,cAAc,YAAY;AAC3C,QAAM,aAAa,gBAAgB,YAAY;AAC/C,QAAM,cAAc,iBAAiB,MAAM,KAAK;AAChD,QAAM,eAAe,kBAAkB,KAAK;AAC5C,QAAM,cAAc,iBAAiB,KAAK,MAAM,KAAK;AAErD,QAAM,eAA6B;AAAA,IACjC,MAAM,KAAK;AAAA,IACX;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,MACL,MAAM,CAAC,OAAO,KAAK,IAAI,oBAAoB,QAAQ,IAAI,KAAK,KAAK,YAAY,CAAC,WAAW;AAAA,MACzF,SAAS,CAAC;AAAA,MACV,YAAY,aAAa,CAAC,YAAY,KAAK,IAAI,YAAY,UAAU,GAAG,IAAI,CAAC;AAAA,IAC/E;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,cAAc,CAAC,EAAE,MAAM,WAAW,aAAa,SAAS,KAAK,IAAI,UAAU,MAAM,YAAY,CAAC,IAAI,CAAC;AAAA,IAC7G,YAAY;AAAA,IACZ,YAAY,KAAK;AAAA,IACjB,YAAY;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,IACA,GAAI,KAAK,eAAe;AAAA,MACtB,IAAI;AAAA,QACF,oBAAoB,KAAK,YAAY;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,gBAAgB,cAAqC;AAE5D,QAAM,aAAa,aAAa,QAAQ,sBAAsB,EAAE;AAEhE,MAAI,WAAW,WAAW,MAAM,GAAG,EAAE,GAAG;AACtC,WAAO,OAAO,WAAW,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAAA,EACvD;AAEA,SAAO,OAAO,WAAW,MAAM,GAAG,EAAE,KAAK,GAAG;AAC9C;AAKA,SAAS,iBAAiB,MAAqB,YAAoD;AAEjG,MAAI,KAAK,eAAe,KAAK,gBAAgB,KAAK,QAAQ,CAAC,KAAK,YAAY,SAAS,YAAY,GAAG;AAClG,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,cAAc,OAAO,QAAQ,UAAU;AAC7C,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO,GAAG,KAAK,IAAI;AAAA,EACrB;AACA,QAAM,UAAoB,CAAC;AAC3B,aAAW,CAAC,MAAM,IAAI,KAAK,aAAa;AACtC,QAAI,KAAK,UAAU,KAAK,OAAO,SAAS,GAAG;AACzC,cAAQ,KAAK,GAAG,KAAK,OAAO,MAAM,IAAI,IAAI,UAAU;AAAA,IACtD;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO,GAAG,KAAK,IAAI,mBAAmB,QAAQ,KAAK,OAAO,CAAC;AAAA,EAC7D;AACA,SAAO,GAAG,KAAK,IAAI,mBAAmB,YAAY,MAAM,qBAAqB,YAAY,WAAW,IAAI,KAAK,GAAG;AAClH;AAKA,SAAS,kBAAkB,OAAiD;AAC1E,QAAM,YAAsB,CAAC;AAC7B,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,UAAU,GAAG,IAAI;AACrB,QAAI,KAAK,UAAU,KAAK,OAAO,SAAS,GAAG;AACzC,iBAAW,KAAK,KAAK,OAAO,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC;AAAA,IAC5D,OAAO;AACL,iBAAW,KAAK,KAAK,IAAI;AAAA,IAC3B;AACA,QAAI,KAAK,YAAY,QAAW;AAC9B,iBAAW,cAAc,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA,IACvD;AACA,QAAI,KAAK,UAAU;AACjB,iBAAW;AAAA,IACb;AACA,cAAU,KAAK,OAAO;AAAA,EACxB;AACA,SAAO;AACT;AAKA,SAAS,iBAAiB,MAAc,OAAsD;AAC5F,QAAM,WAAqB,CAAC;AAE5B,aAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,QAAI,UAAU,cAAc,UAAU,aAAa,UAAU,YAAa;AAC1E,QAAI,UAAU,cAAc,UAAU,cAAc,UAAU,WAC1D,UAAU,kBAAkB,UAAU,aAAa,UAAU,oBAC7D,UAAU,eAAe,UAAU,kBAAkB,UAAU,cAC/D,UAAU,cAAc,UAAU,OAAQ;AAE9C,QAAI,KAAK,YAAY,QAAW;AAC9B,UAAI,KAAK,UAAU,KAAK,OAAO,SAAS,GAAG;AACzC,cAAM,aAAa,KAAK,OAAO,KAAK,OAAK,MAAM,OAAO,KAAK,OAAO,CAAC;AACnE,YAAI,YAAY;AACd,mBAAS,KAAK,GAAG,KAAK,KAAK,UAAU,GAAG;AACxC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU,iBAAiB,iBAAiB,KAAK,IAAI,GAAG;AAC1D,eAAS,KAAK,sBAAsB,KAAK,YAAY,CAAC,MAAM;AAC5D;AAAA,IACF;AAEA,QAAI,UAAU,aAAa,iBAAiB,KAAK,IAAI,GAAG;AACtD,eAAS,KAAK,oBAAoB;AAClC;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ,UAAU,eAAe,UAAU,WAAY;AACrE,QAAI,KAAK,UAAU;AACjB,UAAI,KAAK,UAAU,KAAK,OAAO,SAAS,GAAG;AACzC,iBAAS,KAAK,GAAG,KAAK,KAAK,KAAK,OAAO,CAAC,CAAC,GAAG;AAAA,MAC9C,WAAW,KAAK,SAAS,UAAU;AACjC,iBAAS,KAAK,GAAG,KAAK,QAAQ;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,SAAS,IAAI,MAAM,SAAS,KAAK,GAAG,IAAI;AAElE,QAAM,YAAY,KAAK,YAAY;AACnC,QAAM,cAAc,UAAU,SAAS,OAAO,KAAK,UAAU,SAAS,WAAW,KAC7D,UAAU,SAAS,QAAQ,KAAK,UAAU,SAAS,QAAQ;AAC/E,MAAI,aAAa;AACf,WAAO,IAAI,IAAI,GAAG,QAAQ;AAAA,EAC5B;AACA,SAAO,IAAI,IAAI,GAAG,QAAQ,IAAI,IAAI,KAAK,IAAI;AAC7C;AAMA,SAAS,wBAAwB,MAAc,MAAwB;AAErE,QAAM,SAAS,KAAK,OAAO,OAAK,EAAE,SAAS,QAAQ,CAAC;AACpD,QAAM,QAAQ,KAAK,OAAO,OAAK,EAAE,SAAS,OAAO,CAAC;AAClD,QAAM,cAAc,KAAK,OAAO,OAAK,EAAE,SAAS,aAAa,CAAC;AAC9D,QAAM,UAAU,KAAK,OAAO,OAAK,EAAE,SAAS,SAAS,KAAK,EAAE,SAAS,MAAM,CAAC;AAC5E,QAAM,SAAS,KAAK,OAAO,OAAK,EAAE,SAAS,QAAQ,CAAC;AACpD,QAAM,SAAS,KAAK,OAAO,OAAK,EAAE,SAAS,QAAQ,CAAC;AACpD,QAAM,QAAQ,KAAK;AAAA,IAAO,OACxB,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,YAAY,SAAS,CAAC,KACpE,CAAC,QAAQ,SAAS,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC;AAAA,EACnE;AAEA,QAAM,QAAkB,CAAC,IAAI,IAAI,GAAG;AAGpC,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,KAAK,MAAM,OAAO,CAAC,CAAC,GAAG;AAC7B,eAAW,KAAK,MAAO,OAAM,KAAK,QAAQ,CAAC,WAAW,CAAC,GAAG;AAC1D,eAAW,KAAK,YAAa,OAAM,KAAK,QAAQ,CAAC,iBAAiB,CAAC,GAAG;AACtE,UAAM,KAAK,OAAO,OAAO,CAAC,CAAC,GAAG;AAAA,EAChC,OAAO;AACL,eAAW,KAAK,MAAO,OAAM,KAAK,MAAM,CAAC,WAAW,CAAC,GAAG;AACxD,eAAW,KAAK,YAAa,OAAM,KAAK,MAAM,CAAC,iBAAiB,CAAC,GAAG;AAAA,EACtE;AAGA,aAAW,KAAK,QAAS,OAAM,KAAK,MAAM,CAAC,aAAa,CAAC,GAAG;AAG5D,aAAW,KAAK,MAAO,OAAM,KAAK,MAAM,CAAC,SAAS,CAAC,GAAG;AAGtD,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,KAAK,MAAM,OAAO,CAAC,CAAC,GAAG;AAC7B,eAAW,KAAK,OAAQ,OAAM,KAAK,QAAQ,CAAC,YAAY,CAAC,GAAG;AAC5D,UAAM,KAAK,OAAO,OAAO,CAAC,CAAC,GAAG;AAAA,EAChC,OAAO;AACL,eAAW,KAAK,OAAQ,OAAM,KAAK,MAAM,CAAC,YAAY,CAAC,GAAG;AAAA,EAC5D;AAEA,QAAM,KAAK,KAAK,IAAI,GAAG;AACvB,SAAO,MAAM,KAAK,IAAI;AACxB;AAMA,SAAS,eACP,YACA,kBACM;AACN,aAAW,CAAC,OAAO,KAAK,KAAK,kBAAkB;AAC7C,QAAI,MAAM,UAAU,EAAG;AAGvB,UAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAC5D,UAAM,OAAO,OAAO,CAAC;AACrB,UAAM,OAAO,OAAO,MAAM,CAAC,EAAE,OAAO,OAAK,EAAE,WAAW,IAAI,CAAC;AAE3D,QAAI,KAAK,WAAW,EAAG;AAGvB,UAAM,WAAW,WAAW,IAAI;AAChC,QAAI,UAAU;AACZ,eAAS,KAAK;AAAA,QACZ,GAAG,SAAS;AAAA,QACZ,oBAAoB;AAAA,QACpB,eAAe;AAAA,MACjB;AAEA,eAAS,YAAY,KAAK,IAAI,UAAQ;AAAA,QACpC,WAAW;AAAA,QACX,cAAc;AAAA,QACd,MAAM,GAAG,GAAG,0BAA0B,IAAI;AAAA,MAC5C,EAAE;AAEF,YAAM,kBAAkB,wBAAwB,MAAM,IAAI;AAC1D,eAAS,WAAW;AAAA,QAClB,GAAI,SAAS,YAAY,CAAC;AAAA,QAC1B,EAAE,MAAM,eAAe,aAAa,GAAG,IAAI,4BAA4B,MAAM,gBAAgB;AAAA,MAC/F;AAAA,IACF;AAGA,UAAM,iBAAiB,UAAU,OAAO,aAAa,CAAC;AACtD,eAAW,OAAO,MAAM;AACtB,YAAM,UAAU,WAAW,GAAG;AAC9B,UAAI,SAAS;AACX,gBAAQ,YAAY,CAAC;AAAA,UACnB,WAAW;AAAA,UACX,cAAc;AAAA,UACd,MAAM,eAAe,IAAI;AAAA,QAC3B,CAAC;AAED,YAAI,gBAAgB;AAClB,gBAAM,WAAW,CAAC,MAAM,GAAG,IAAI,EAAE,KAAK,IAAI;AAC1C,gBAAM,WAAW,eAAe,MAAM,kBAAkB,IAAI,CAAC,KAAK;AAClE,cAAI,UAAU;AACZ,oBAAQ,QAAQ;AAAA,cACd,GAAG,QAAQ;AAAA,cACX,YAAY,CAAC,YAAY,QAAQ,YAAY,QAAQ,GAAG;AAAA,YAC1D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,YAAY,SAAS,OAAO,aAAa,CAAC,GAAG;AAC/C,YAAM,WAAW,SAAS,MAAM,WAAW,CAAC,EAAE,MAAM,kBAAkB,IAAI,CAAC,KAAK;AAChF,UAAI,UAAU;AACZ,cAAM,WAAW,CAAC,MAAM,GAAG,IAAI,EAAE,KAAK,IAAI;AAC1C,iBAAS,MAAM,aAAa,CAAC,YAAY,QAAQ,YAAY,QAAQ,GAAG;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAc,cAA8B;AACnD,QAAM,QAAQ,aAAa,MAAM,GAAG;AACpC,QAAM,gBAAgB,MAAM;AAAA,IAAU,OACpC,MAAM,gBAAgB,MAAM;AAAA,EAC9B;AACA,MAAI,iBAAiB,KAAK,gBAAgB,IAAI,MAAM,SAAS,GAAG;AAC9D,UAAM,WAAW,MAAM,gBAAgB,CAAC;AACxC,QAAI,SAAS,KAAK,QAAQ,EAAG,QAAO,MAAM,aAAa,KAAK;AAC5D,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,aAAa,aAAoC;AACxD,QAAM,aAAa,CAAC,iBAAiB,mBAAmB;AACxD,aAAW,QAAQ,YAAY;AAC7B,UAAM,IAAIE,MAAK,aAAa,IAAI;AAChC,QAAIC,YAAW,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,aAAyC;AAChE,MAAI;AACF,UAAM,UAAUD,MAAK,aAAa,cAAc;AAChD,QAAI,CAACC,YAAW,OAAO,EAAG,QAAO;AACjC,UAAM,MAAM,KAAK,MAAMC,cAAa,SAAS,OAAO,CAAC;AACrD,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AGtjBA,IAAMC,qBAAoB;AAwG1B,SAAS,0BACP,qBACA,qBACsC;AACtC,SAAO;AAAA,IACL,MAAM,qBAAqB,QAAQ,qBAAqB;AAAA,IACxD,aACE,qBAAqB,eAAe,qBAAqB,eAAe;AAAA,IAC1E,YACE,qBAAqB,cACrB,qBAAqB,cACrB,qBAAqB,eACrB,qBAAqB,eACrB;AAAA,EACJ;AACF;AAEA,SAAS,sBAAsB,MAK5B;AACD,MAAI,KAAK,kBAAkB,SAAS,KAAK,kBAAkB,QAAQ;AACjE,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK;AACd;AAEA,SAAS,eAAe,QAA8D;AACpF,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,SAAS,QAAQ;AAC1B,UAAM,UAAU,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI;AAC3D,QAAI,CAAC,QAAS;AACd,WAAO,IAAI,UAAU,OAAO,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,EACpD;AAEA,QAAM,SAAS,CAAC,GAAG,OAAO,QAAQ,CAAC,EAAE;AAAA,IACnC,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;AAAA,EAClD;AACA,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,OAAO,CAAC,KAAK,OAAO,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,EAAE,CAAC,EAAG,QAAO;AACvD,SAAO,OAAO,CAAC,EAAE,CAAC;AACpB;AAEA,SAAS,wCACP,YACuF;AACvF,QAAM,cAAc;AAAA,IAClB,WAAW,IAAI,CAAC,cAAc,UAAU,WAAW;AAAA,EACrD;AACA,QAAM,oBAAoB,cACtB,WAAW,OAAO,CAAC,cAAc,UAAU,gBAAgB,WAAW,IACtE;AACJ,QAAM,aAAa;AAAA,IACjB,kBAAkB;AAAA,MAChB,CAAC,cAAc,UAAU,cAAc,UAAU;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AAAA,IACL,aAAa,eAAe;AAAA,IAC5B,YAAY,cAAc,eAAe;AAAA,EAC3C;AACF;AAMA,IAAM,yBAAmD;AAAA,EACvD,OAAO,CAAC,SAAS,UAAU,UAAU,cAAc,cAAc,UAAU,OAAO;AAAA,EAClF,SAAS,CAAC,WAAW,SAAS,WAAW,UAAU,OAAO,OAAO;AAAA,EACjE,YAAY,CAAC,cAAc,QAAQ,QAAQ,QAAQ,eAAe,QAAQ;AAAA,EAC1E,QAAQ,CAAC,UAAU,WAAW,UAAU,SAAS;AAAA,EACjD,QAAQ,CAAC,UAAU,SAAS,UAAU,WAAW,SAAS;AAAA,EAC1D,QAAQ,CAAC,UAAU,WAAW,WAAW;AAAA,EACzC,QAAQ,CAAC,UAAU,QAAQ,aAAa,YAAY;AAAA,EACpD,OAAO,CAAC,SAAS,QAAQ,YAAY;AAAA,EACrC,SAAS,CAAC,WAAW,YAAY,UAAU,QAAQ,YAAY;AACjE;AAEA,SAAS,oBAAoB,KAAsB;AACjD,MAAI,CAAC,IAAK,QAAOA;AACjB,MAAI,IAAI,SAAS,cAAc,EAAG,QAAO;AACzC,SAAO,GAAG,IAAI,QAAQ,QAAQ,EAAE,CAAC;AACnC;AAEA,SAAS,wBAAwB,KAAsB;AACrD,QAAM,OAAO,oBAAoB,GAAG,EAAE,QAAQ,mBAAmB,EAAE;AACnE,SAAO,GAAG,IAAI;AAChB;AAEA,SAAS,eAAe,OAAgB;AACtC,SAAO,OAAO,YAAY,EAAE,QAAQ,eAAe,GAAG,EAAE,KAAK,KAAK;AACpE;AAEA,SAAS,0BACP,OACA;AACA,QAAM,aAAa;AAAA,IACjB,MAAM;AAAA,IACN,MAAM,OAAO,CAAC;AAAA,IACd,MAAM,KAAK,MAAM,QAAQ,EAAE,CAAC;AAAA,EAC9B,EACG,IAAI,cAAc,EAClB,OAAO,OAAO;AAEjB,aAAW,aAAa,YAAY;AAClC,eAAW,CAAC,WAAW,OAAO,KAAK,OAAO;AAAA,MACxC;AAAA,IACF,GAAG;AACD,UACE,cAAc,aACd,QAAQ;AAAA,QACN,CAAC,UACC,cAAc,SACd,UAAU,SAAS,KAAK,KACxB,MAAM,SAAS,SAAS;AAAA,MAC5B,GACA;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO,WAAW,CAAC,KAAK;AAC1B;AAEA,SAAS,YAAY,MAAyE;AAC5F,QAAM,aAAyC,CAAC;AAChD,QAAM,kBAAkB,QAAQ,CAAC,GAC9B,OAAO,CAAC,UAAU,CAAC,eAAe,KAAK,CAAC,EACxC,IAAI,CAAC,UAAU;AACd,UAAM,WAAW,0BAA0B,KAAK;AAChD,UAAM,aAAuB;AAAA,MAC3B,MAAM,MAAM;AAAA,MACZ;AAAA,MACA,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,IACd;AACA,QAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,iBAAW,QAAQ,IAAI,CAAC;AAAA,IAC1B;AACA,eAAW,QAAQ,EAAE,KAAK,UAAU;AACpC,WAAO;AAAA,EACT,CAAC;AAEH,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,eAAe;AAAA,IACtB;AAAA,IACA,MAAM;AAAA,EACR;AACF;AAEA,SAAS,aACP,WACA,cACc;AACd,SAAO;AAAA,IACL,IAAI,UAAU;AAAA,IACd,MAAM,UAAU;AAAA,IAChB,aAAa,UAAU,eAAe;AAAA,IACtC,UAAU,UAAU,YAAY;AAAA,IAChC,QAAQ,UAAU,UAAU;AAAA,IAC5B,MAAM,CAAC;AAAA,IACP,OAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,UAAU,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,IAAI,MAAM;AAAA,QAC9D;AAAA,QACA;AAAA,UACE,MAAM,KAAK,QAAQ;AAAA,UACnB,aAAa,KAAK,eAAe;AAAA,UACjC,UAAU,KAAK,YAAY;AAAA,UAC3B,SAAS,KAAK;AAAA,UACd,QAAQ,KAAK;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,cAAc,OAAO,QAAQ,UAAU,SAAS,CAAC,CAAC,EAAE;AAAA,MAClD,CAAC,CAAC,UAAU,IAAI,MACd,GAAG,QAAQ,GAAG,KAAK,WAAW,gBAAgB,EAAE,KAAK,KAAK,QAAQ,SAAS;AAAA,IAC/E;AAAA,IACA,WAAW,UAAU,YAAY,CAAC,GAAG,IAAI,CAAC,aAAa;AAAA,MACrD,MAAM,QAAQ,SAAS;AAAA,MACvB,aAAa,QAAQ;AAAA,MACrB,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,IAChB,EAAE;AAAA,IACF,YAAY,UAAU,aAAa,CAAC,GAAG,IAAI,CAAC,cAAc;AAAA,MACxD,eAAe,SAAS,aAAa,SAAS,gBAAgB;AAAA,MAC9D,aAAa,SAAS;AAAA,MACtB,cAAc,SAAS,gBAAgB,SAAS,QAAQ;AAAA,MACxD,MAAM,SAAS;AAAA,MACf,aAAa,SAAS;AAAA,IACxB,EAAE;AAAA,IACF,mBAAmB,UAAU,oBAAoB,CAAC,GAC/C,OAAO,CAAC,UAAU,MAAM,2BAA2B,UAAU,EAC7D,IAAI,CAAC,WAAW;AAAA,MACf,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,YACE,MAAM,2BAA2B,aAC7B,aACA;AAAA,IACR,EAAE;AAAA,IACJ,UAAU;AAAA,MACR,MAAM,UAAU,gBAAgB,CAAC,UAAU,aAAa,IAAI,CAAC;AAAA,MAC7D,SAAS,UAAU,SAAS,CAAC;AAAA,MAC7B,YAAY,UAAU,gBAAgB,CAAC,UAAU,aAAa,IAAI,CAAC;AAAA,MACnE,eAAe,CAAC;AAAA,MAChB,eAAe,UAAU;AAAA,MACzB,KAAK,UAAU,OAAO,CAAC;AAAA,MACvB,OAAO,UAAU,SAAS,CAAC;AAAA,MAC3B,UAAU,CAAC;AAAA,IACb;AAAA,IACA,YAAY;AAAA,IACZ,YAAY,UAAU;AAAA,IACtB,oBACE,UAAU,sBAAsB;AAAA,IAClC,aAAa,UAAU,eAAe,cAAc,eAAe;AAAA,IACnE,YACE,UAAU,cACV,UAAU,eACV,cAAc,cACd,cAAc,eACd;AAAA,IACF,WAAW,UAAU;AAAA,IACrB,YAAY,UAAU,cAAc;AAAA,IACpC,aAAa,UAAU,eAAe;AAAA,IACtC,MAAM,UAAU;AAAA,IAChB,mBAAmB,UAAU;AAAA,IAC7B,qBAAqB,UAAU;AAAA,IAC/B,UAAU;AAAA,MACR,WAAW,CAAC;AAAA,MACZ,cAAc,CAAC;AAAA,IACjB;AAAA,EACF;AACF;AAEA,SAAS,4BACP,KACoD;AACpD,QAAM,UAAU,IAAI;AACpB,MAAI,CAAC,WAAW,CAAC,MAAM,QAAQ,QAAQ,UAAU,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,WACxB;AAAA,IACC,CAAC,cAGC,QAAQ,WAAW,YAAY,KAC/B,QAAQ,WAAW,SAAS,KAC5B,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,SAAS;AAAA,EAChC,EACC,IAAI,CAAC,eAAe;AAAA,IACnB,cAAc,UAAU;AAAA,IACxB,WAAW,UAAU;AAAA,IACrB,MAAM,UAAU;AAAA,IAChB,UAAU,UAAU,YAAY;AAAA,IAChC,QAAQ,UAAU,UAAU;AAAA,IAC5B,MAAM,UAAU,QAAQ;AAAA,IACxB,aAAa,UAAU,eAAe;AAAA,IACtC,UAAU,UAAU,YAAY;AAAA,IAChC,WAAW,UAAU,aAAa;AAAA,IAClC,SAAS,UAAU,WAAW,CAAC;AAAA,IAC/B,eAAe,UAAU;AAAA,IACzB,KAAK,UAAU,OAAO,CAAC;AAAA,IACvB,OAAO,UAAU,SAAS,CAAC;AAAA,EAC7B,EAAE;AAEJ,SAAO;AAAA,IACL,SAAS;AAAA,IACT,iBAAiB,QAAQ;AAAA,IACzB,WAAW,QAAQ;AAAA,IACnB,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,UAAU,QAAQ,QAAQ,YAAY;AAAA,IACxC;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,sBAAN,MAAiD;AAAA,EAGtD,YACmB,SAIjB;AAJiB;AAAA,EAIhB;AAAA,EAJgB;AAAA,EAHV,OAAO;AAAA,EAShB,MAAM,KAAK,cAAiD;AAC1D,UAAM,UAAU;AAAA,MACd,aAAa,KAAK,QAAQ;AAAA,IAC5B;AACA,UAAM,CAAC,UAAU,mBAAmB,IAAI,MAAM,QAAQ,IAAI;AAAA,MACxD,MAAM,oBAAoB,KAAK,QAAQ,GAAG,GAAG,EAAE,QAAQ,CAAC;AAAA,MACxD,MAAM,wBAAwB,KAAK,QAAQ,GAAG,GAAG,EAAE,QAAQ,CAAC,EAAE;AAAA,QAC5D,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,iCAAiC,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,MACzE;AAAA,IACF;AAEA,UAAM,MAAO,MAAM,SAAS,KAAK;AACjC,UAAM,iBACJ,uBAAuB,oBAAoB,KACrC,MAAM,oBAAoB,KAAK,IACjC;AACN,UAAM,mBAAmB,sBAAsB;AAAA,MAC7C,mBAAmB,IAAI,cAAc,CAAC;AAAA,MACtC,mBAAmB,gBAAgB,SAAS,cAAc,CAAC;AAAA,IAC7D,CAAC;AACD,UAAM,uBACJ,wCAAwC,gBAAgB;AAC1D,UAAM,eAAe;AAAA,MACnB;AAAA,QACE,GAAG,IAAI;AAAA,QACP,aACE,IAAI,cAAc,eAAe,qBAAqB;AAAA,QACxD,YACE,IAAI,cAAc,cAAc,qBAAqB;AAAA,MACzD;AAAA,MACA,gBAAgB,SAAS;AAAA,IAC3B;AACA,UAAM,aAAa,OAAO;AAAA,MACxB,iBAAiB,IAAI,CAAC,cAAc;AAAA,QAClC,UAAU;AAAA,QACV,aAAa,WAAW,YAAY;AAAA,MACtC,CAAC;AAAA,IACH;AACA,UAAM,SAAS,IAAI,QAAQ,OAAO,YAAY,IAAI,OAAO,IAAI,IAAI;AACjE,UAAM,cAAc,cAAc,eAAe;AACjD,UAAM,aACJ,cAAc,cAAc,cAAc,eAAe;AAC3D,UAAM,aAAa,OAAO;AAAA,MACxB,OAAO,OAAO,UAAU,EACrB,IAAI,CAAC,cAAc;AAAA,QAClB,UAAU;AAAA,QACV,UAAU,cAAc,UAAU,eAAe;AAAA,MACnD,CAAC,EACA;AAAA,QACC,CAAC,UACC,OAAO,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,EAAE,SAAS;AAAA,MACtD;AAAA,IACJ;AAEA,UAAM,WAAwB,iBAAiB;AAAA,MAC7C,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,cAAc,kBAAkB;AAAA,QAC9B;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,UAAU;AAAA,QACR,kBAAkB,cAAc,QAAQ,IAAI,IAAI;AAAA,QAChD;AAAA,QACA;AAAA,QACA,UAAU,IAAI;AAAA,QACd,WACE,OAAO,IAAI,cAAc,WACrB,IAAI,KAAK,IAAI,SAAS,EAAE,YAAY,IACpC;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,oBAAoB;AAAA,IACtB,CAAC;AACD,UAAM,qBAAqB,iBACvB,4BAA4B,cAAc,IAC1C;AACJ,UAAM,qBAAqB,OAAO;AAAA,MAChC,OAAO,QAAQ,SAAS,UAAU,EAAE,IAAI,CAAC,CAAC,aAAa,SAAS,MAAM;AAAA,QACpE;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,aACG,WAAW,WAAW,GACnB,eAAe;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,QACR,GAAG;AAAA,QACH,YAAY;AAAA,MACd;AAAA,MACA,YAAY;AAAA,MACZ,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,OAAO;AAAA,MACP,oBAAoB;AAAA,MACpB,YAAY,SAAS;AAAA,MACrB,oBAAoB,SAAS;AAAA,MAC7B;AAAA,MACA,cAAc,IAAI,IAAI,SAAS,YAAY;AAAA,IAC7C;AAAA,EACF;AACF;;;ACjhBA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,WAAAC,UAAS,WAAAC,gBAAe;AAQjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAOP,eAAe,aACb,MACA,QACA,OACY;AACZ,QAAM,UAAU,MAAMC,UAAS,MAAM,OAAO;AAC5C,MAAI;AACF,WAAO,OAAO,MAAM,KAAK,MAAM,OAAO,CAAC;AAAA,EACzC,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,WAAW,KAAK,OAAO,IAAI,KACzB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eACP,OACuB;AACvB,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,MAAM;AACrD,YAAM,OACJ,SAAS,OAAO,UAAU,WAAY,QAAoC,CAAC;AAC7E,aAAO;AAAA,QACL;AAAA,QACA;AAAA,UACE,MACE,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,IAChD,KAAK,OACL;AAAA,UACN,aACE,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,UAC5D,UAAU,QAAQ,KAAK,QAAQ;AAAA,UAC/B,SAAS,KAAK;AAAA,UACd,QAAQ,MAAM,QAAQ,KAAK,MAAM,IAC7B,KAAK,OAAO,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IACxE;AAAA,UACJ,aAAa,MAAM,QAAQ,KAAK,WAAW,IACvC,KAAK,YAAY;AAAA,YACf,CAAC,UAA2B,OAAO,UAAU;AAAA,UAC/C,IACA;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,kBACP,UAC0B;AAC1B,SAAO,SAAS,IAAI,CAAC,YAAY;AAC/B,UAAM,SACJ,WAAW,OAAO,YAAY,WACzB,UACD,CAAC;AACP,WAAO;AAAA,MACL,MACG,OAAO,OAAO,UAAU,YAAY,OAAO,SAC3C,OAAO,OAAO,SAAS,YAAY,OAAO,QAC3C;AAAA,MACF,aACE,OAAO,OAAO,gBAAgB,WAC1B,OAAO,cACP;AAAA,MACN,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,MACtD,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,IACxD;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mBACP,WACA,UAC2B;AAC3B,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO,UAAU,IAAI,CAAC,aAAa;AACjC,YAAM,SACJ,YAAY,OAAO,aAAa,WAC3B,WACD,CAAC;AACP,aAAO;AAAA,QACL,eACG,OAAO,OAAO,cAAc,YAAY,OAAO,aAC/C,OAAO,OAAO,SAAS,YAAY,OAAO,QAC1C,OAAO,OAAO,kBAAkB,YAAY,OAAO,iBACnD,OAAO,OAAO,gBAAgB,YAAY,OAAO,eAClD;AAAA,QACF,aACE,OAAO,OAAO,gBAAgB,WAC1B,OAAO,cACP;AAAA,QACN,cACG,OAAO,OAAO,iBAAiB,YAAY,OAAO,gBAClD,OAAO,OAAO,SAAS,YAAY,OAAO,QAC3C;AAAA,QACF,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,QACtD,aACE,OAAO,OAAO,gBAAgB,WAC1B,OAAO,cACP;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,SAAS,IAAI,CAAC,cAAc;AAAA,IACjC,eAAe,SAAS;AAAA,IACxB,aAAa,SAAS;AAAA,IACtB,cAAc,SAAS;AAAA,EACzB,EAAE;AACJ;AAEA,SAAS,eACP,UACA,OACA,OACc;AACd,QAAM,gBACJ,SAAS,aAAa,cAAc,SAAS,aAAa,eAAe;AAC3E,QAAM,YAAY,MAAM;AACxB,QAAM,kBAAkB;AAGxB,QAAM,QAAQ,eAAe,UAAU,KAAK;AAE5C,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,UAAU;AAAA,IAChB,aAAa,UAAU;AAAA,IACvB,UAAU,UAAU;AAAA,IACpB,QAAQ,UAAU;AAAA,IAClB,MAAM,CAAC;AAAA,IACP;AAAA,IACA,cAAc,OAAO,QAAQ,KAAK,EAAE;AAAA,MAAI,CAAC,CAAC,UAAU,IAAI,MACtD,GAAG,QAAQ,GAAG,KAAK,WAAW,gBAAgB,EAAE,KAAK,KAAK,IAAI;AAAA,IAChE;AAAA,IACA,UAAU,kBAAkB,UAAU,QAAQ;AAAA,IAC9C,WAAW,mBAAmB,UAAU,WAAW,MAAM,SAAS;AAAA,IAClE,kBAAkB,MAAM,iBAAiB,IAAI,CAAC,WAAW;AAAA,MACvD,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,YAAY;AAAA,IACd,EAAE;AAAA,IACF,UAAU;AAAA,MACR,MAAM,UAAU,gBAAgB,CAAC,UAAU,aAAa,IAAI,CAAC;AAAA,MAC7D,SAAS,UAAU;AAAA,MACnB,YAAY,UAAU,gBAAgB,CAAC,UAAU,aAAa,IAAI,CAAC;AAAA,MACnE,eAAe,CAAC;AAAA,MAChB,eAAe,UAAU,iBAAiB;AAAA,MAC1C,KAAK,UAAU;AAAA,MACf,OAAO,UAAU;AAAA,MACjB,UAAU,CAAC;AAAA,IACb;AAAA,IACA,YAAY;AAAA,IACZ,YAAY,UAAU;AAAA,IACtB,oBAAoB,UAAU;AAAA,IAC9B,aAAa,SAAS,aAAa,eAAe;AAAA,IAClD,YAAY;AAAA,IACZ,WAAW,UAAU;AAAA,IACrB,YAAY,UAAU;AAAA,IACtB,aAAa,gBAAgB,eAAe,UAAU,SAAS;AAAA,IAC/D,MAAM,UAAU;AAAA,IAChB,qBAAqB,UAAU;AAAA,IAC/B,UAAU;AAAA,MACR,WAAW,CAAC;AAAA,MACZ,cAAc,CAAC;AAAA,IACjB;AAAA,EACF;AACF;AAEO,IAAM,gBAAN,MAA2C;AAAA,EACvC,OAAO;AAAA,EAEhB,SAAS,UAA4B;AACnC,WAAO,mBAAmB,QAAQ;AAAA,EACpC;AAAA,EAEA,MAAM,KAAK,aAAgD;AACzD,UAAM,YAAY,KAAK,SAAS,WAAW;AAE3C,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAM,IAAI;AAAA,QACR,MAAM,MAAM,OAAO,IAAI,MAAM,YAAY,iBAAiB,MAAM,UAAU;AAAA,MAC5E;AAAA,IACF;AAEA,UAAM,eAAe,UAAU,CAAC;AAChC,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,YAAYC,SAAQ,YAAY;AACtC,UAAM,WAAWA,SAAQ,SAAS;AAElC,UAAM,aAAaC,SAAQ,WAAW,aAAa;AACnD,UAAM,aAAaC,YAAW,UAAU,IACpC,MAAM,aAAa,YAAY,uBAAuB,eAAe,IACrE;AAEJ,UAAM,aAAa,OAAO;AAAA,MACxB,MAAM,QAAQ;AAAA,QACZ,OAAO,OAAO,SAAS,UAAU,EAAE,IAAI,OAAO,UAAU;AACtD,gBAAM,YAAYD,SAAQ,UAAU,MAAM,IAAI;AAC9C,gBAAM,QAAQ,MAAM;AAAA,YAClB;AAAA,YACA;AAAA,YACA,2BAA2B,MAAM,IAAI;AAAA,UACvC;AACA,iBAAO,CAAC,MAAM,aAAa,eAAe,UAAU,OAAO,KAAK,CAAC;AAAA,QACnE,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,cACJ,SAAS,aAAa,cAAc,SAAS,aAAa,eAAe;AAC3E,UAAM,aAAa,cACf,OAAO;AAAA,MACL,OAAO,OAAO,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,MAAM,WAAW,CAAC;AAAA,IAC5E,IACA,CAAC;AAEL,UAAM,SAAS,aACX;AAAA,MACE,QAAQ;AAAA,MACR,OAAO,WAAW,KAAK;AAAA,MACvB,YAAY,OAAO;AAAA,QACjB,OAAO,QAAQ,WAAW,UAAU,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,MAAM;AAAA,UAC/D;AAAA,UACA,MAAM,OAAO,IAAI,CAAC,WAAW;AAAA,YAC3B,MAAM,MAAM;AAAA,YACZ,UAAU,MAAM;AAAA,YAChB,OAAO,MAAM;AAAA,YACb,aAAa,MAAM;AAAA,YACnB,MAAM,MAAM;AAAA,YACZ,MAAM,MAAM;AAAA,UACd,EAAE;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,MACA,MAAM,WAAW,KAAK,IAAI,CAAC,WAAW;AAAA,QACpC,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,QACb,aAAa,MAAM;AAAA,QACnB,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,MACd,EAAE;AAAA,IACJ,IACA;AAEJ,UAAM,WAAwB,iBAAiB;AAAA,MAC7C,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,aAAa,GAAG,MAAM,OAAO,IAAI,MAAM,YAAY;AAAA,MACnD,cAAc,kBAAkB;AAAA,QAC9B;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,UAAU;AAAA,QACR,kBAAkB,SAAS,aAAa;AAAA,QACxC,aAAa,SAAS,aAAa,eAAe;AAAA,QAClD,YAAY,SAAS,aAAa,cAAc;AAAA,QAChD,UAAU,SAAS;AAAA,QACnB,WAAW,SAAS;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,oBAAoB;AAAA,IACtB,CAAC;AACD,UAAM,qBAAqB,OAAO;AAAA,MAChC,OAAO,QAAQ,SAAS,UAAU,EAAE,IAAI,CAAC,CAAC,aAAa,SAAS,MAAM;AAAA,QACpE;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,aACG,WAAW,WAAW,GACnB,eAAe,UAAU,SAAS;AAAA,QAC1C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,QACR,GAAG;AAAA,QACH,YAAY;AAAA,MACd;AAAA,MACA,YAAY;AAAA,MACZ,QAAQ,SAAS;AAAA,MACjB,QAAQ,SAAS;AAAA,MACjB,OAAO,SAAS;AAAA,MAChB,oBAAoB,SAAS;AAAA,MAC7B,YAAY,SAAS;AAAA,MACrB,oBAAoB,SAAS;AAAA,MAC7B,cAAc,IAAI,IAAI,SAAS,YAAY;AAAA,IAC7C;AAAA,EACF;AACF;;;AR/SA,SAASE,oBACP,QACA,YACoB;AACpB,SACE,OAAO,eACP,YAAY,OAAO,UACnB,QAAQ,IAAI;AAEhB;AAEA,SAASC,iBACP,YACoB;AACpB,SAAO,YAAY,OAAO,OAAO,QAAQ,IAAI;AAC/C;AAEA,SAAS,aAAa,aAA8B;AAClD,SACEC,YAAWC,MAAK,aAAa,eAAe,CAAC,KAC7CD,YAAWC,MAAK,aAAa,mBAAmB,CAAC;AAErD;AAEO,SAAS,mBACd,QACA,YACgB;AAChB,QAAM,SAAS,OAAO,UAAU,YAAY,UAAU;AACtD,QAAM,qBAAqB,kBAAkB,OAAO,WAAW;AAC/D,QAAM,sBAAsB,mBAAmB,OAAO,WAAW;AACjE,QAAM,cAAcH,oBAAmB,QAAQ,UAAU;AACzD,QAAM,WAAWC,iBAAgB,UAAU;AAE3C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,EAAE,SAAS,IAAI,qBAAqB,GAAG,MAAM,iBAAiB;AAAA,IACvE,KAAK;AACH,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,SAAS,IAAI,oBAAoB,EAAE,QAAQ,aAAa,KAAK,SAAS,CAAC;AAAA,QACvE,MAAM;AAAA,MACR;AAAA,IACF,KAAK;AACH,aAAO,EAAE,SAAS,IAAI,cAAc,GAAG,MAAM,SAAS;AAAA,IACxD,KAAK;AACH,aAAO,EAAE,SAAS,IAAI,sBAAsB,GAAG,MAAM,UAAU;AAAA,IACjE,KAAK;AAAA,IACL;AACE,UAAI,mBAAmB,SAAS,GAAG;AACjC,eAAO;AAAA,UACL,SAAS,IAAI,qBAAqB;AAAA,UAClC,MAAM;AAAA,QACR;AAAA,MACF;AACA,UAAI,aAAa;AACf,eAAO;AAAA,UACL,SAAS,IAAI,oBAAoB;AAAA,YAC/B,QAAQ;AAAA,YACR,KAAK;AAAA,UACP,CAAC;AAAA,UACD,MAAM;AAAA,QACR;AAAA,MACF;AACA,UAAI,oBAAoB,SAAS,GAAG;AAClC,eAAO;AAAA,UACL,SAAS,IAAI,cAAc;AAAA,UAC3B,MAAM;AAAA,QACR;AAAA,MACF;AACA,UAAI,aAAa,OAAO,WAAW,GAAG;AACpC,eAAO,EAAE,SAAS,IAAI,sBAAsB,GAAG,MAAM,UAAU;AAAA,MACjE;AACA,aAAO;AAAA,QACL,SAAS,IAAI,qBAAqB;AAAA,QAClC,MAAM;AAAA,MACR;AAAA,EACJ;AACF;AAEO,SAAS,oBACd,QACA,YACoB;AACpB,SAAO,OAAO,gBAAgB,YAAY,cAAc;AAC1D;;;ASzGO,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAC5B,IAAM,2BAA2B;AAEjC,IAAM,0BAA0B;AAAA,EACrC,SAAS;AAAA,EACT,KAAK;AAAA,EACL,OAAO;AAAA,EACP,aACE;AAAA,EACF,MAAM;AAAA,EACN,UAAU,CAAC,OAAO;AAAA,EAClB,sBAAsB;AAAA,EACtB,YAAY;AAAA,IACV,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,aACE;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,aACE;AAAA,MACF,sBAAsB;AAAA,IACxB;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aACE;AAAA,MACF,OAAO,EAAE,MAAM,eAAe;AAAA,IAChC;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU,CAAC,MAAM;AAAA,MACjB,sBAAsB;AAAA,MACtB,YAAY;AAAA,QACV,IAAI;AAAA,UACF,MAAM;AAAA,UACN,aACE;AAAA,QACJ;AAAA,QACA,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aACE;AAAA,QACJ;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aACE;AAAA,UACF,sBAAsB;AAAA,QACxB;AAAA,QACA,UAAU;AAAA,UACR,aACE;AAAA,UACF,OAAO;AAAA,YACL,EAAE,MAAM,SAAS;AAAA,YACjB;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,OAAO,CAAC,EAAE,MAAM,SAAS,GAAG,EAAE,MAAM,eAAe,CAAC;AAAA,cACtD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,OAAO,EAAE,SAAS,WAAW,UAAU,OAAO;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,UAAU,EAAE,QAAQ,cAAc;AAAA,QAClC,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,OAAO,CAAC;AAAA,YACR,UAAU;AAAA,cACR;AAAA,gBACE,IAAI;AAAA,gBACJ,MAAM;AAAA,gBACN,OAAO,EAAE,OAAO,GAAG,UAAU,UAAU;AAAA,cACzC;AAAA,cACA;AAAA,gBACE,IAAI;AAAA,gBACJ,MAAM;AAAA,gBACN,OAAO,EAAE,UAAU,cAAc;AAAA,cACnC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,OAAO;AAAA,YACL;AAAA,cACE,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,OAAO,EAAE,UAAU,QAAQ,SAAS,iBAAiB;AAAA,YACvD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,QACE;AAAA,QACF,MAAM;AAAA,UACJ,OAAO;AAAA,YACL;AAAA,cACE,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,OAAO,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE;AAAA,YACrC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,wBAAgC;AAC9C,SAAO,KAAK,UAAU,yBAAyB,MAAM,CAAC;AACxD;;;A3BhGA,IAAM,aAAa,eAAe;AAQlC,IAAM,QAAQ,cAAc;AAC5B,IAAM,yBAAyB,IAAI;AAAA,EACjC,qBAAqB,IAAI,CAAC,eAAe,CAAC,WAAW,KAAK,UAAU,CAAC;AACvE;AAMO,SAAS,gBAAgB,QAAiC;AAC/D,QAAM,SAAS,IAAI;AAAA,IACjB;AAAA,MACE,MAAM,GAAG,MAAM,SAAS;AAAA,MACxB,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,cAAc;AAAA,QACZ,OAAO,EAAE,aAAa,KAAK;AAAA,QAC3B,WAAW,EAAE,aAAa,MAAM;AAAA,QAChC,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,IAAI,aAAa,IAAI;AAAA,IACpC,WAAW,MAAM;AACf,aAAO,aAAa,EAAE,QAAQ,oCAAoC,QAAQ,CAAC,EAAE,CAAC;AAAA,IAChF;AAAA,EACF,CAAC;AAGD,WAAS;AAAA,IACP,EAAE,MAAM,YAAY,QAAQ,cAAc,OAAO,YAAY;AAAA,IAC7D;AAAA,IACA;AAAA,EACF;AAGA,QAAM,aAAa,OAAO,cAAc,eAAe,OAAO,WAAW,KAAK;AAC9E,QAAM,eAAgC;AAAA,IACpC,GAAI,aAAa,EAAE,GAAG,QAAQ,WAAW,IAAI;AAAA,IAC7C,cAAc,oBAAoB,QAAQ,UAAU;AAAA,EACtD;AACA,QAAM,UAAU,OAAO,WAAW,mBAAmB,cAAc,UAAU,EAAE;AAG/E,SAAO,aAAa,QAAQ;AAG5B,MAAI,YAAY,OAAO,SAAS;AAC9B,eAAW,OAAO,WAAW,MAAM,SAAS;AAC1C,eAAS,WAAW,GAAG;AAAA,IACzB;AAAA,EACF;AAGA,MAAI,aAA2D;AAC/D,MAAI,kBAAyE;AAC7E,MAAI,eAA8B;AAClC,MAAI,4BAAoD;AASxD,iBAAe,qBAAsC;AACnD,QAAI,aAAc,QAAO;AACzB,QAAI,0BAA2B,QAAO;AAEtC,iCAA6B,YAAY;AAIvC,UAAI,OAAO,sBAAsB,GAAG,OAAO;AACzC,YAAI;AACF,gBAAMG,UAAS,MAAM,OAAO,UAAU;AACtC,cAAIA,QAAO,OAAO,SAAS,GAAG;AAC5B,kBAAM,UAAUA,QAAO,MAAM,CAAC,EAAE;AAEhC,2BAAe,cAAc,OAAO;AACpC,mBAAO;AAAA,UACT;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAGA,qBAAe,OAAO;AACtB,aAAO;AAAA,IACT,GAAG;AAEH,QAAI;AACF,aAAO,MAAM;AAAA,IACf,UAAE;AACA,kCAA4B;AAAA,IAC9B;AAAA,EACF;AAEA,iBAAe,WAA2D;AACxE,QAAI,WAAY,QAAO;AACvB,QAAI,gBAAiB,QAAO;AAE5B,uBAAmB,YAAY;AAC7B,YAAM,cAAc,MAAM,mBAAmB;AAC7C,YAAM,SAAS,MAAM,QAAQ,KAAK,WAAW;AAE7C,mBAAa;AACb,aAAO;AAAA,IACT,GAAG;AAEH,QAAI;AACF,aAAO,MAAM;AAAA,IACf,UAAE;AACA,wBAAkB;AAAA,IACpB;AAAA,EACF;AAGA,SAAO,kBAAkB,wBAAwB,YAAY;AAC3D,UAAM,OAAO,MAAM,SAAS;AAC5B,WAAO;AAAA,MACL,OAAO,SAAS;AAAA,QACd;AAAA,UACE,WAAW;AAAA,UACX,eAAe;AAAA,UACf,cAAc,KAAK;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,kBAAkB,4BAA4B,aAAa;AAAA,IAChE,WAAW;AAAA,MACT;AAAA,QACE,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aACE;AAAA,QACF,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,EAAE;AAEF,SAAO,kBAAkB,2BAA2B,OAAO,YAAY;AACrE,QAAI,QAAQ,OAAO,QAAQ,oBAAoB;AAC7C,YAAM,IAAI;AAAA,QACR,UAAU;AAAA,QACV,yBAAyB,QAAQ,OAAO,GAAG;AAAA,MAC7C;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,KAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAM,sBAAsB;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,SAAO,kBAAkB,uBAAuB,OAAO,YAAY;AACjE,UAAM,EAAE,MAAM,WAAW,KAAK,IAAI,QAAQ;AAE1C,UAAM,OAAO,MAAM,SAAS;AAC5B,UAAM,cAA2B;AAAA,MAC/B;AAAA,MACA,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,MAAM,YAAY,MAAM,YAAY,KAAK;AAAA,MACpE,KAAK;AAAA,QACH;AAAA,QACA,oBAAoB,OAAO,sBAAsB;AAAA,MACnD;AAAA,MACA,oBAAoB,CAACC,UAAkB;AACrC,YAAIA,OAAM;AACR,gBAAM,MAAM,KAAK,WAAWA,KAAI;AAChC,cAAI,IAAK,QAAO;AAAA,QAClB;AACA,YAAI,KAAK,mBAAoB,QAAO,KAAK;AACzC,YAAI,KAAK,SAAS,eAAe,SAAS;AACxC,iBAAO;AAAA,QACT;AACA,cAAM,OAAO,gBAAgB,OAAO;AACpC,cAAM,kBAAkBC,MAAK,MAAM,cAAc;AACjD,YAAIC,YAAW,eAAe,GAAG;AAC/B,cAAI;AACF,kBAAM,UAAUC,cAAa,iBAAiB,OAAO;AACrD,kBAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,gBAAI,IAAI,MAAM;AACZ,qBAAO,IAAI;AAAA,YACb;AAAA,UACF,QAAQ;AAAA,UAAqB;AAAA,QAC/B;AACA,eAAO;AAAA,MACT;AAAA,MACA,WAAW;AAAA,IACb;AAEA,QAAI;AACF,YAAM,UAAU,SAAS,WAAW,IAAI;AACxC,YAAM,aAAa,uBAAuB,IAAI,OAAO;AACrD,YAAM,eAAe,OAAO,KAAK,QAAQ,CAAC,CAAC;AAC3C,YAAM,cAAc,IAAI,IAAI,OAAO,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC;AACjE,YAAM,cAAc,aAChB,aAAa,OAAO,CAAC,QAAQ,CAAC,YAAY,IAAI,GAAG,CAAC,IAClD,CAAC;AACL,UAAI,YAAY,SAAS,GAAG;AAC1B,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU;AAAA,gBACnB,OAAO,2BAA2B,OAAO,KAAK,YAAY,KAAK,IAAI,CAAC;AAAA,cACtE,CAAC;AAAA,YACH;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAM,OAAO;AAAA,QACX,UAAU;AAAA,QACV;AAAA,QACA,MAAM,QAAQ,CAAC;AAAA,QACf,KAAK;AAAA,MACP;AAEA,aAAO,MAAM;AAAA,QACX,OAAO,cAAc,CAAC;AAAA,QACtB;AAAA,QACA,MAAM,SAAS,QAAQ,MAAM,QAAQ,CAAC,GAAG,WAAW;AAAA,MACtD;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC,EAAE,CAAC;AAAA,QAC5H,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAKA,eAAsB,eAAe,QAAwC;AAC3E,QAAM,SAAS,gBAAgB,MAAM;AACrC,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;AAMO,SAAS,sBAAsB;AACpC,SAAO,gBAAgB,EAAE,aAAa,QAAQ,IAAI,EAAE,CAAC;AACvD;","names":["existsSync","readFileSync","join","readFileSync","part","result","result","buildComponentProps","walkNodes","unresolvedAmbiguities","result","result","existsSync","join","existsSync","readFileSync","join","join","existsSync","readFileSync","existsSync","readFileSync","join","readdirSync","existsSync","join","readdirSync","readFileSync","existsSync","join","extname","join","existsSync","readFileSync","DEFAULT_CLOUD_URL","existsSync","readFile","dirname","resolve","readFile","dirname","resolve","existsSync","resolveCloudApiKey","resolveCloudUrl","existsSync","join","result","name","join","existsSync","readFileSync"]}
|