@bridge-ds/core 0.12.0 → 0.15.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 +26 -2
- package/bridge.config.schema.json +22 -0
- package/dist/audit/index.js +3 -3
- package/dist/component-scan.d.ts +158 -0
- package/dist/config.d.ts +22 -0
- package/dist/contrast-model.d.ts +43 -0
- package/dist/github-client.d.ts +166 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +1377 -336
- package/dist/index.js.map +1 -1
- package/dist/node/fs-source.d.ts +5 -0
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.js +53 -4
- package/dist/node/index.js.map +1 -1
- package/dist/{prod-branch-BdMPKffE.js → prod-branch-BjXFIz74.js} +145 -115
- package/dist/prod-branch-BjXFIz74.js.map +1 -0
- package/dist/repo-access.d.ts +66 -0
- package/dist/repo-model.d.ts +142 -0
- package/dist/{suggestion-apply-DxXRGQrO.js → repo-source-CNZLq_xK.js} +483 -208
- package/dist/repo-source-CNZLq_xK.js.map +1 -0
- package/dist/repo-source-github.d.ts +43 -0
- package/dist/repo-source.d.ts +38 -0
- package/dist/{report-DOnKUw8G.js → report-DCPfvvoq.js} +2 -2
- package/dist/{report-DOnKUw8G.js.map → report-DCPfvvoq.js.map} +1 -1
- package/dist/review-gate.d.ts +8 -1
- package/dist/rights.d.ts +20 -0
- package/dist/snapshot.d.ts +132 -0
- package/dist/suggestion-review.d.ts +4 -1
- package/dist/token-rows.d.ts +122 -0
- package/dist/try-in-product.d.ts +4 -1
- package/package.json +1 -1
- package/dist/prod-branch-BdMPKffE.js.map +0 -1
- package/dist/suggestion-apply-DxXRGQrO.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-DOnKUw8G.js","sources":["../src/audit/types.ts","../src/audit/color.ts","../src/audit/tailwind.ts","../src/audit/scan-value.ts","../src/audit/css.ts","../src/audit/components.ts","../src/audit/ds-index.ts","../src/audit/code.ts","../src/audit/ignore.ts","../src/audit/style.ts","../src/audit/markup.ts","../src/audit/report.ts"],"sourcesContent":["// Types of the `bridge audit` report: design-system adoption and drift in a product codebase.\n// The JSON report is versioned (`schemaVersion`); packages/core/audit-report.schema.json describes it.\n\nexport const AUDIT_SCHEMA_VERSION = 1;\n\n/** What a hardcoded value stands for. */\nexport type FindingCategory =\n | 'color'\n | 'spacing'\n | 'size'\n | 'radius'\n | 'border-width'\n | 'shadow'\n | 'duration'\n | 'easing'\n | 'z-index'\n | 'font-family'\n | 'font-size'\n | 'font-weight'\n | 'line-height';\n\nexport const FINDING_CATEGORIES: FindingCategory[] = ['color', 'spacing', 'size', 'radius', 'border-width', 'shadow', 'duration', 'easing', 'z-index', 'font-family', 'font-size', 'font-weight', 'line-height'];\n\n/** Where a value was written. */\nexport type FindingSource = 'css' | 'style' | 'sx' | 'styled' | 'theme' | 'tailwind' | 'jsx-attr' | 'js';\n\nexport type Confidence = 'exact' | 'high' | 'medium' | 'low';\n\nexport interface TokenSuggestion {\n /** Token path, e.g. color.text.muted. */\n token: string;\n /** CSS variable, e.g. --color-text-muted. */\n cssVar: string;\n /** Resolved token value in the mode it matched. */\n value: string;\n /** Mode combination the value matched in (colors), e.g. \"theme=dark\". Absent for the default mode. */\n mode?: string;\n /** deltaE OK x 100 for colors, px for lengths, ms for durations, steps otherwise. 0 = exact. */\n distance: number;\n /** 0..1 */\n confidence: number;\n level: Confidence;\n}\n\nexport interface StyleFinding {\n line: number;\n column: number;\n category: FindingCategory;\n /** CSS property (kebab-case) or object key the value belongs to. */\n property?: string;\n /** The literal as written: \"#1976d2\", \"13px\", \"p-[13px]\". */\n value: string;\n source: FindingSource;\n suggestion?: TokenSuggestion;\n /** `bridge audit --fix` can replace it (exact token match in a CSS file). */\n autofix?: boolean;\n}\n\nexport type ComponentKind = 'ds' | 'foreign' | 'native' | 'recreated';\n\nexport interface ComponentFinding {\n line: number;\n column: number;\n /** JSX name as written: Button, Card.Header, button. */\n name: string;\n kind: Exclude<ComponentKind, 'ds'>;\n /** Package or origin: @mui/material, react-admin, shadcn/ui (local), native, local. */\n library: string;\n /** DS component to use instead, when one fits. */\n suggestion?: string;\n}\n\nexport interface FileReport {\n /** Path relative to the audited root, with forward slashes. */\n path: string;\n lang: 'css' | 'scss' | 'less' | 'tsx' | 'jsx' | 'ts' | 'js' | 'astro' | 'vue' | 'svelte';\n tokenUsages: number;\n /** References to another theme (MUI theme, Tailwind scale classes): not hardcoded, not the DS either. */\n themeRefs: number;\n hardcoded: number;\n dsComponents: number;\n /** Foreign, native and re-created component instances. */\n otherComponents: number;\n findings: StyleFinding[];\n components: ComponentFinding[];\n /** Findings and components left out of the counts on purpose, each with its reason. */\n ignored?: IgnoredItem[];\n /** `bridge-audit-ignore-next-line` comments that ignored nothing because they give no reason. */\n ignoreErrors?: { line: number; message: string }[];\n}\n\n/** Where an ignore comes from: an escape-hatch comment in the file, or an entry of the allowlist file. */\nexport type IgnoreVia = 'comment' | 'allowlist';\n\n/** A finding or component the audit saw but does not count, kept in the report so it stays visible. */\nexport interface IgnoredItem {\n line: number;\n column: number;\n kind: 'value' | 'component';\n /** The value as written (\"13px\") or the element or component name (\"select\"). */\n what: string;\n reason: string;\n via: IgnoreVia;\n}\n\n/** One entry of an allowlist file: a known violation, left out of the counts for a stated reason. */\nexport interface AllowlistEntry {\n /** Path relative to the audited folder, as in the report. */\n file: string;\n line: number;\n /** Element, component or value on that line (\"select\", \"13px\"). Absent: everything on the line. */\n what?: string;\n reason: string;\n}\n\nexport interface CategoryCount {\n hardcoded: number;\n /** Findings whose value equals a token (safe to replace). */\n exact: number;\n /** Findings with a token suggestion of any confidence. */\n suggested: number;\n}\n\nexport interface TopFix {\n category: FindingCategory;\n value: string;\n count: number;\n files: number;\n suggestion?: TokenSuggestion;\n}\n\nexport interface AuditMetrics {\n /** token usages / (token usages + hardcoded), in percent, one decimal. Null when the code has no style value at all. */\n tokenAdoption: number | null;\n /** DS component instances / all UI component instances, in percent, one decimal. Null without UI components. */\n componentAdoption: number | null;\n tokenUsages: number;\n hardcoded: number;\n themeRefs: number;\n dsComponentInstances: number;\n uiComponentInstances: number;\n}\n\nexport interface HistoryPoint {\n label?: string;\n generatedAt: string;\n tokenAdoption: number | null;\n componentAdoption: number | null;\n hardcoded: number;\n uiComponentInstances: number;\n dsComponentInstances: number;\n}\n\nexport interface BaselineDiff {\n label?: string;\n generatedAt: string;\n tokenAdoption: { before: number | null; after: number | null; delta: number | null };\n componentAdoption: { before: number | null; after: number | null; delta: number | null };\n hardcoded: { before: number; after: number; delta: number };\n byCategory: Partial<Record<FindingCategory, { before: number; after: number; delta: number }>>;\n /** Files with fewer hardcoded values or non-DS components than in the baseline. */\n improved: { path: string; before: number; after: number }[];\n regressed: { path: string; before: number; after: number }[];\n newFiles: string[];\n removedFiles: string[];\n}\n\nexport interface AuditReport {\n $schema?: string;\n schemaVersion: typeof AUDIT_SCHEMA_VERSION;\n tool: { name: 'bridge'; version: string };\n label?: string;\n generatedAt: string;\n target: { path: string; files: number; skipped: number };\n designSystem: { packages: string[]; components: number; tokens: number; modes: string[] };\n metrics: AuditMetrics;\n byCategory: Partial<Record<FindingCategory, CategoryCount>>;\n components: {\n ds: Record<string, number>;\n foreign: Record<string, { instances: number; components: Record<string, number> }>;\n native: Record<string, number>;\n recreated: { name: string; file: string; line: number; instances: number }[];\n };\n topFiles: { path: string; hardcoded: number; otherComponents: number; tokenUsages: number; dsComponents: number }[];\n topFixes: TopFix[];\n files: FileReport[];\n baseline?: BaselineDiff;\n /** What was left out of the counts on purpose (escape-hatch comments, allowlist), and allowlist entries that match nothing. */\n ignored?: {\n total: number;\n comment: number;\n allowlist: number;\n items: (IgnoredItem & { file: string })[];\n staleAllowlist: AllowlistEntry[];\n };\n /** Earlier runs, oldest first (carried over from the baseline). */\n history: HistoryPoint[];\n}\n","// CSS color parsing (hex, rgb, hsl, named) and perceptual distance in OKLab.\nimport { hexToRgba, type Rgba } from '../values';\n\n/** CSS named colors (CSS Color 4). `transparent` and `currentcolor` are not values to tokenize. */\nexport const NAMED_COLORS: Record<string, string> = {\n aliceblue: '#f0f8ff', antiquewhite: '#faebd7', aqua: '#00ffff', aquamarine: '#7fffd4', azure: '#f0ffff', beige: '#f5f5dc', bisque: '#ffe4c4',\n black: '#000000', blanchedalmond: '#ffebcd', blue: '#0000ff', blueviolet: '#8a2be2', brown: '#a52a2a', burlywood: '#deb887', cadetblue: '#5f9ea0',\n chartreuse: '#7fff00', chocolate: '#d2691e', coral: '#ff7f50', cornflowerblue: '#6495ed', cornsilk: '#fff8dc', crimson: '#dc143c', cyan: '#00ffff',\n darkblue: '#00008b', darkcyan: '#008b8b', darkgoldenrod: '#b8860b', darkgray: '#a9a9a9', darkgreen: '#006400', darkgrey: '#a9a9a9', darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b', darkolivegreen: '#556b2f', darkorange: '#ff8c00', darkorchid: '#9932cc', darkred: '#8b0000', darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f', darkslateblue: '#483d8b', darkslategray: '#2f4f4f', darkslategrey: '#2f4f4f', darkturquoise: '#00ced1', darkviolet: '#9400d3',\n deeppink: '#ff1493', deepskyblue: '#00bfff', dimgray: '#696969', dimgrey: '#696969', dodgerblue: '#1e90ff', firebrick: '#b22222', floralwhite: '#fffaf0',\n forestgreen: '#228b22', fuchsia: '#ff00ff', gainsboro: '#dcdcdc', ghostwhite: '#f8f8ff', gold: '#ffd700', goldenrod: '#daa520', gray: '#808080',\n green: '#008000', greenyellow: '#adff2f', grey: '#808080', honeydew: '#f0fff0', hotpink: '#ff69b4', indianred: '#cd5c5c', indigo: '#4b0082',\n ivory: '#fffff0', khaki: '#f0e68c', lavender: '#e6e6fa', lavenderblush: '#fff0f5', lawngreen: '#7cfc00', lemonchiffon: '#fffacd', lightblue: '#add8e6',\n lightcoral: '#f08080', lightcyan: '#e0ffff', lightgoldenrodyellow: '#fafad2', lightgray: '#d3d3d3', lightgreen: '#90ee90', lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1', lightsalmon: '#ffa07a', lightseagreen: '#20b2aa', lightskyblue: '#87cefa', lightslategray: '#778899', lightslategrey: '#778899',\n lightsteelblue: '#b0c4de', lightyellow: '#ffffe0', lime: '#00ff00', limegreen: '#32cd32', linen: '#faf0e6', magenta: '#ff00ff', maroon: '#800000',\n mediumaquamarine: '#66cdaa', mediumblue: '#0000cd', mediumorchid: '#ba55d3', mediumpurple: '#9370db', mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee', mediumspringgreen: '#00fa9a', mediumturquoise: '#48d1cc', mediumvioletred: '#c71585', midnightblue: '#191970',\n mintcream: '#f5fffa', mistyrose: '#ffe4e1', moccasin: '#ffe4b5', navajowhite: '#ffdead', navy: '#000080', oldlace: '#fdf5e6', olive: '#808000',\n olivedrab: '#6b8e23', orange: '#ffa500', orangered: '#ff4500', orchid: '#da70d6', palegoldenrod: '#eee8aa', palegreen: '#98fb98',\n paleturquoise: '#afeeee', palevioletred: '#db7093', papayawhip: '#ffefd5', peachpuff: '#ffdab9', peru: '#cd853f', pink: '#ffc0cb', plum: '#dda0dd',\n powderblue: '#b0e0e6', purple: '#800080', rebeccapurple: '#663399', red: '#ff0000', rosybrown: '#bc8f8f', royalblue: '#4169e1', saddlebrown: '#8b4513',\n salmon: '#fa8072', sandybrown: '#f4a460', seagreen: '#2e8b57', seashell: '#fff5ee', sienna: '#a0522d', silver: '#c0c0c0', skyblue: '#87ceeb',\n slateblue: '#6a5acd', slategray: '#708090', slategrey: '#708090', snow: '#fffafa', springgreen: '#00ff7f', steelblue: '#4682b4', tan: '#d2b48c',\n teal: '#008080', thistle: '#d8bfd8', tomato: '#ff6347', turquoise: '#40e0d0', violet: '#ee82ee', wheat: '#f5deb3', white: '#ffffff',\n whitesmoke: '#f5f5f5', yellow: '#ffff00', yellowgreen: '#9acd32',\n};\n\nconst num = (s: string, scale: number) => (s.endsWith('%') ? (parseFloat(s) / 100) * scale : parseFloat(s));\n\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n const hh = (((h % 360) + 360) % 360) / 360;\n if (s === 0) return [l, l, l];\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const f = (t: number) => {\n let x = t;\n if (x < 0) x += 1;\n if (x > 1) x -= 1;\n if (x < 1 / 6) return p + (q - p) * 6 * x;\n if (x < 1 / 2) return q;\n if (x < 2 / 3) return p + (q - p) * (2 / 3 - x) * 6;\n return p;\n };\n return [f(hh + 1 / 3), f(hh), f(hh - 1 / 3)];\n}\n\n/** Parse a CSS color: #rgb[a], #rrggbb[aa], rgb()/rgba(), hsl()/hsla(), a named color, or bare HSL channels (\"222 47% 11%\", shadcn style). */\nexport function parseCssColor(input: string): Rgba | undefined {\n const s = input.trim().toLowerCase();\n if (s.startsWith('#')) return hexToRgba(s);\n if (NAMED_COLORS[s]) return hexToRgba(NAMED_COLORS[s]!);\n const fn = /^(rgba?|hsla?)\\(\\s*([^)]*)\\)$/.exec(s);\n const bare = /^(-?[\\d.]+)(deg)?\\s+([\\d.]+)%\\s+([\\d.]+)%(\\s*\\/\\s*([\\d.]+%?))?$/.exec(s);\n if (bare) {\n const [r, g, b] = hslToRgb(parseFloat(bare[1]!), parseFloat(bare[3]!) / 100, parseFloat(bare[4]!) / 100);\n return { r, g, b, a: bare[6] ? num(bare[6], 1) : 1 };\n }\n if (!fn) return undefined;\n const parts = fn[2]!.split(/[\\s,/]+/).filter(Boolean);\n if (parts.length < 3 || parts.some((p) => !/^-?[\\d.]+(%|deg)?$/.test(p))) return undefined;\n const alpha = parts[3] !== undefined ? num(parts[3], 1) : 1;\n if (fn[1]!.startsWith('rgb')) {\n const [r, g, b] = parts.slice(0, 3).map((p) => num(p, 255) / 255) as [number, number, number];\n return { r, g, b, a: alpha };\n }\n const [r, g, b] = hslToRgb(parseFloat(parts[0]!), num(parts[1]!, 1), num(parts[2]!, 1));\n return { r, g, b, a: alpha };\n}\n\nconst lin = (c: number) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);\n\n/** sRGB (0..1) to OKLab (Björn Ottosson). */\nexport function toOklab(c: Rgba): { L: number; a: number; b: number } {\n const r = lin(c.r);\n const g = lin(c.g);\n const b = lin(c.b);\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return {\n L: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n };\n}\n\n/**\n * Perceptual distance: Euclidean deltaE in OKLab, x100 (about 2 is a just noticeable difference).\n * Alpha counts too: a fully transparent difference adds 50.\n */\nexport function deltaE(x: Rgba, y: Rgba): number {\n const p = toOklab(x);\n const q = toOklab(y);\n return Math.hypot(p.L - q.L, p.a - q.a, p.b - q.b) * 100 + Math.abs(x.a - y.a) * 50;\n}\n\n/** Hex and color functions in a CSS value. Named colors are matched separately (they need a color property). */\nexport const COLOR_LITERAL_RE = /#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\\b|\\b(?:rgba?|hsla?)\\([^()]*\\)/g;\n","// Tailwind class strings: arbitrary values (`text-[#123456]`, `p-[13px]`), default palette classes (`bg-blue-500`)\n// and scale classes (`p-4`, `rounded-lg`), which reference Tailwind's own scale rather than the design system.\nimport type { FindingCategory } from './types';\n\n/** Tailwind v3 default palette (50..950). Used to suggest the nearest DS token for `bg-blue-500`-style classes. */\nconst PALETTE_ROWS: Record<string, string> = {\n slate: 'f8fafc f1f5f9 e2e8f0 cbd5e1 94a3b8 64748b 475569 334155 1e293b 0f172a 020617',\n gray: 'f9fafb f3f4f6 e5e7eb d1d5db 9ca3af 6b7280 4b5563 374151 1f2937 111827 030712',\n zinc: 'fafafa f4f4f5 e4e4e7 d4d4d8 a1a1aa 71717a 52525b 3f3f46 27272a 18181b 09090b',\n neutral: 'fafafa f5f5f5 e5e5e5 d4d4d4 a3a3a3 737373 525252 404040 262626 171717 0a0a0a',\n stone: 'fafaf9 f5f5f4 e7e5e4 d6d3d1 a8a29e 78716c 57534e 44403c 292524 1c1917 0c0a09',\n red: 'fef2f2 fee2e2 fecaca fca5a5 f87171 ef4444 dc2626 b91c1c 991b1b 7f1d1d 450a0a',\n orange: 'fff7ed ffedd5 fed7aa fdba74 fb923c f97316 ea580c c2410c 9a3412 7c2d12 431407',\n amber: 'fffbeb fef3c7 fde68a fcd34d fbbf24 f59e0b d97706 b45309 92400e 78350f 451a03',\n yellow: 'fefce8 fef9c3 fef08a fde047 facc15 eab308 ca8a04 a16207 854d0e 713f12 422006',\n lime: 'f7fee7 ecfccb d9f99d bef264 a3e635 84cc16 65a30d 4d7c0f 3f6212 365314 1a2e05',\n green: 'f0fdf4 dcfce7 bbf7d0 86efac 4ade80 22c55e 16a34a 15803d 166534 14532d 052e16',\n emerald: 'ecfdf5 d1fae5 a7f3d0 6ee7b7 34d399 10b981 059669 047857 065f46 064e3b 022c22',\n teal: 'f0fdfa ccfbf1 99f6e4 5eead4 2dd4bf 14b8a6 0d9488 0f766e 115e59 134e4a 042f2e',\n cyan: 'ecfeff cffafe a5f3fc 67e8f9 22d3ee 06b6d4 0891b2 0e7490 155e75 164e63 083344',\n sky: 'f0f9ff e0f2fe bae6fd 7dd3fc 38bdf8 0ea5e9 0284c7 0369a1 075985 0c4a6e 082f49',\n blue: 'eff6ff dbeafe bfdbfe 93c5fd 60a5fa 3b82f6 2563eb 1d4ed8 1e40af 1e3a8a 172554',\n indigo: 'eef2ff e0e7ff c7d2fe a5b4fc 818cf8 6366f1 4f46e5 4338ca 3730a3 312e81 1e1b4b',\n violet: 'f5f3ff ede9fe ddd6fe c4b5fd a78bfa 8b5cf6 7c3aed 6d28d9 5b21b6 4c1d95 2e1065',\n purple: 'faf5ff f3e8ff e9d5ff d8b4fe c084fc a855f7 9333ea 7e22ce 6b21a8 581c87 3b0764',\n fuchsia: 'fdf4ff fae8ff f5d0fe f0abfc e879f9 d946ef c026d3 a21caf 86198f 701a75 4a044e',\n pink: 'fdf2f8 fce7f3 fbcfe8 f9a8d4 f472b6 ec4899 db2777 be185d 9d174d 831843 500724',\n rose: 'fff1f2 ffe4e6 fecdd3 fda4af fb7185 f43f5e e11d48 be123c 9f1239 881337 4c0519',\n};\nconst STEPS = ['50', '100', '200', '300', '400', '500', '600', '700', '800', '900', '950'];\n\nexport function tailwindColor(name: string, step?: string): string | undefined {\n if (name === 'white') return '#ffffff';\n if (name === 'black') return '#000000';\n const row = PALETTE_ROWS[name];\n const i = step ? STEPS.indexOf(step) : -1;\n return row && i >= 0 ? `#${row.split(' ')[i]}` : undefined;\n}\n\nconst COLOR_PREFIX = '(?:text|bg|border(?:-[trblxyse])?|ring(?:-offset)?|outline|fill|stroke|from|via|to|divide|placeholder|decoration|accent|caret|shadow)';\nconst PALETTE_RE = new RegExp(`^${COLOR_PREFIX}-(${Object.keys(PALETTE_ROWS).join('|')})-(\\\\d{2,3})(?:\\\\/\\\\d+)?$|^${COLOR_PREFIX}-(white|black)(?:\\\\/\\\\d+)?$`);\n\n/** Arbitrary value prefix -> category (the value decides between color and others for ambiguous prefixes). */\nconst ARBITRARY: [RegExp, FindingCategory | 'color-or-size' | 'color-or-width' | 'color-or-shadow' | 'font'][] = [\n [/^(bg|fill|stroke|from|via|to|accent|caret|placeholder|decoration|divide|ring-offset|outline-color)$/, 'color'],\n [/^text$/, 'color-or-size'],\n [/^(border(-[trblxyse])?|ring|outline)$/, 'color-or-width'],\n [/^shadow$/, 'color-or-shadow'],\n [/^(p|px|py|pt|pr|pb|pl|ps|pe|m|mx|my|mt|mr|mb|ml|ms|me|gap|gap-x|gap-y|space-x|space-y|inset|inset-x|inset-y|top|right|bottom|left|start|end|scroll-m|scroll-p|indent)$/, 'spacing'],\n [/^(w|h|min-w|min-h|max-w|max-h|size|basis)$/, 'size'],\n [/^rounded(-[trblse]{1,2})?$/, 'radius'],\n [/^z$/, 'z-index'],\n [/^(duration|delay)$/, 'duration'],\n [/^ease$/, 'easing'],\n [/^font$/, 'font'],\n [/^leading$/, 'line-height'],\n];\n\nconst SCALE_RE =\n /^-?(p|px|py|pt|pr|pb|pl|ps|pe|m|mx|my|mt|mr|mb|ml|ms|me|gap|gap-x|gap-y|space-x|space-y|inset|top|right|bottom|left|w|h|min-w|min-h|max-w|max-h|size|basis)-(\\d+(\\.5)?|px)$|^rounded(-[trblse]{1,2})?(-(none|sm|md|lg|xl|2xl|3xl|full))?$|^text-(xs|sm|base|lg|xl|[2-9]xl)$|^shadow(-(sm|md|lg|xl|2xl|inner|none))?$|^z-\\d+$|^duration-\\d+$|^font-(thin|extralight|light|normal|medium|semibold|bold|extrabold|black|sans|serif|mono)$|^leading-(none|tight|snug|normal|relaxed|loose|\\d+)$|^ease-(linear|in|out|in-out)$/;\n/** shadcn/ui semantic classes (CSS variables of the app's own theme). */\nconst SHADCN_RE = new RegExp(`^${COLOR_PREFIX}-(background|foreground|primary|secondary|muted|accent|destructive|border|input|ring|card|popover)(-foreground)?(\\\\/\\\\d+)?$`);\n\nexport interface TailwindHit {\n /** The class as written, without variants. */\n cls: string;\n /** Offset of the class in the string. */\n index: number;\n kind: 'arbitrary' | 'palette' | 'scale' | 'token';\n category?: FindingCategory | 'color-or-size' | 'color-or-width' | 'color-or-shadow' | 'font';\n /** The raw value (`#123456`, `13px`) for arbitrary and palette classes. */\n value?: string;\n}\n\n/** Classes of a class string that matter for adoption. Variants (`hover:`, `md:`), `!` and `-` are stripped. */\nexport function scanClassString(text: string): TailwindHit[] {\n const out: TailwindHit[] = [];\n for (const m of text.matchAll(/[^\\s\"'`]+/g)) {\n const raw = m[0];\n // Variants end at the last colon outside brackets: md:hover:text-[color:var(--x)].\n let cut = -1;\n let depth = 0;\n for (let i = 0; i < raw.length; i++) {\n if (raw[i] === '[') depth++;\n else if (raw[i] === ']') depth--;\n else if (raw[i] === ':' && depth === 0) cut = i;\n }\n const cls = raw.slice(cut + 1).replace(/^!/, '');\n const index = m.index! + raw.length - cls.length;\n const arb = /^-?([a-z][a-z-]*?)-\\[(.+)\\]$/.exec(cls);\n if (arb) {\n const value = arb[2]!.replace(/_/g, ' ').replace(/^(color|length|size|percentage|number|shadow|family|url|image|position|line-width|absolute-size|relative-size):/, '');\n if (/^var\\(--/.test(value) || /^--/.test(value)) {\n out.push({ cls, index, kind: 'token', value: value.startsWith('--') ? `var(${value})` : value });\n continue;\n }\n const cat = ARBITRARY.find(([re]) => re.test(arb[1]!))?.[1];\n if (cat) out.push({ cls, index, kind: 'arbitrary', category: cat, value });\n continue;\n }\n const pal = PALETTE_RE.exec(cls);\n if (pal) {\n const value = pal[3] ? tailwindColor(pal[3]) : tailwindColor(pal[1]!, pal[2]!);\n if (value) out.push({ cls, index, kind: 'palette', category: 'color', value });\n continue;\n }\n if (SCALE_RE.test(cls) || SHADCN_RE.test(cls)) out.push({ cls, index, kind: 'scale' });\n }\n return out;\n}\n","// Classifies one style declaration (CSS property + value, or a JS style object entry) into hardcoded values,\n// design-system token references and references to another theme. Shared by the audit scanners and the\n// stylelint and ESLint plugins.\nimport { COLOR_LITERAL_RE, NAMED_COLORS, parseCssColor } from './color';\nimport type { FindingCategory } from './types';\n\nexport interface ValueHit {\n category: FindingCategory;\n /** The literal as written. */\n text: string;\n /** Offset of the literal in the value. */\n index: number;\n}\n\nexport interface ValueScan {\n hits: ValueHit[];\n /** CSS variables referenced with var(--x), DS or not. */\n vars: string[];\n /** The value points at another theme (MUI palette path, sx spacing unit...). */\n themeRef: boolean;\n}\n\nconst COLOR_PROP = /^(color|background(-color|-image)?|border(-(top|right|bottom|left|block|inline)(-(start|end))?)?(-color)?|outline(-color)?|fill|stroke|text-decoration(-color)?|caret-color|accent-color|column-rule(-color)?|stop-color|flood-color|lighting-color|-webkit-text-fill-color|scrollbar-color|box-shadow|text-shadow)$/;\nconst SPACING_PROP = /^(padding|margin|gap|row-gap|column-gap|grid-gap|grid-row-gap|grid-column-gap|inset|top|right|bottom|left|scroll-margin|scroll-padding)(-(top|right|bottom|left|block|inline|x|y)(-(start|end))?)?$/;\nconst SIZE_PROP = /^(min-|max-)?(width|height|block-size|inline-size)$|^flex-basis$/;\nconst RADIUS_PROP = /radius$/;\nconst BORDER_WIDTH_PROP = /^(border|outline)(-(top|right|bottom|left|block|inline)(-(start|end))?)?(-width)?$|^outline-offset$|^column-rule(-width)?$/;\nconst MOTION_PROP = /^(transition|animation)(-duration|-delay)?$/;\nconst EASING_PROP = /^(transition|animation)(-timing-function)?$/;\nconst SKIP_PROP = /^(content|grid-template(-areas)?|grid-area|src|mask(-image)?|transform|translate|will-change|cursor|quotes|font-feature-settings|font-variation-settings|counter-(reset|increment)|clip-path|d|unicode-range)$/;\n\n/** Keys that are not CSS properties but hold theme values (MUI palette, SCSS and custom properties). */\nconst looseKey = (p: string) => p.startsWith('$') || p.startsWith('--') || !/^-?[a-z]+(-[a-z]+)*$/.test(p) || !KNOWN_PROPS.has(p);\nconst KNOWN_PROPS = new Set(\n 'color background background-color background-image border border-top border-right border-bottom border-left border-color border-width border-style border-radius border-top-left-radius border-top-right-radius border-bottom-left-radius border-bottom-right-radius border-top-color border-bottom-color border-left-color border-right-color border-top-width border-bottom-width border-left-width border-right-width border-block border-inline border-block-start border-block-end border-inline-start border-inline-end outline outline-color outline-width outline-offset fill stroke text-decoration text-decoration-color caret-color accent-color box-shadow text-shadow padding padding-top padding-right padding-bottom padding-left padding-block padding-inline padding-x padding-y padding-inline-start padding-inline-end padding-block-start padding-block-end margin margin-top margin-right margin-bottom margin-left margin-block margin-inline margin-x margin-y margin-inline-start margin-inline-end margin-block-start margin-block-end gap row-gap column-gap grid-gap inset top right bottom left width height min-width min-height max-width max-height flex-basis font font-family font-size font-weight line-height letter-spacing transition transition-duration transition-delay transition-timing-function animation animation-duration animation-delay animation-timing-function z-index opacity display position flex flex-direction flex-wrap flex-grow flex-shrink align-items justify-content overflow text-align white-space cursor content transform'.split(' '),\n);\n\n/** Replaces var(...) (with fallbacks, nested) and url(...) by spaces so offsets stay valid. */\nfunction mask(value: string): string {\n let out = value;\n for (const fn of ['var(', 'url(', 'env(']) {\n let i = out.indexOf(fn);\n while (i >= 0) {\n let depth = 0;\n let j = i + fn.length - 1;\n for (; j < out.length; j++) {\n if (out[j] === '(') depth++;\n else if (out[j] === ')' && --depth === 0) break;\n }\n out = out.slice(0, i) + ' '.repeat(j + 1 - i) + out.slice(j + 1);\n i = out.indexOf(fn, i);\n }\n }\n // Quoted strings (except for font-family, handled before) are not values to tokenize.\n return out.replace(/([\"'])(?:(?!\\1).)*\\1/g, (s) => ' '.repeat(s.length));\n}\n\nconst LENGTH_RE = /(?<![\\w.#-])(-?\\d*\\.?\\d+)(px|rem|em)\\b/g;\n\nfunction lengthCategory(prop: string): FindingCategory | undefined {\n if (RADIUS_PROP.test(prop)) return 'radius';\n if (SPACING_PROP.test(prop)) return 'spacing';\n if (SIZE_PROP.test(prop)) return 'size';\n if (BORDER_WIDTH_PROP.test(prop)) return 'border-width';\n if (prop === 'font-size') return 'font-size';\n if (prop === 'line-height') return 'line-height';\n if (looseKey(prop)) {\n const k = prop.toLowerCase();\n if (/radius|rounded/.test(k)) return 'radius';\n if (/space|spacing|gap|padding|margin|gutter|inset/.test(k)) return 'spacing';\n if (/font-?size|fontsize/.test(k)) return 'font-size';\n if (/width|height|size/.test(k)) return 'size';\n }\n return undefined;\n}\n\n/**\n * Scan one CSS declaration. `property` is kebab-case (`background-color`, `$brand`, `--x`, or a theme key\n * such as `main`); `value` is the raw value text.\n */\nexport function scanCssValue(property: string, value: string): ValueScan {\n const prop = property.trim().toLowerCase();\n const vars = [...value.matchAll(/var\\(\\s*(--[\\w-]+)/g)].map((m) => m[1]!);\n const hits: ValueHit[] = [];\n const out: ValueScan = { hits, vars, themeRef: false };\n if (SKIP_PROP.test(prop)) return out;\n const v = value.trim();\n if (!v || /^(inherit|initial|unset|revert|none|auto|0|normal|currentcolor|transparent)$/i.test(v)) return out;\n if (/^\\$[\\w-]+$/.test(v) || /^theme\\(/.test(v)) {\n out.themeRef = true;\n return out;\n }\n const masked = mask(value);\n\n if (prop === 'font-family') {\n if (masked.trim() && !/^(inherit|initial|unset)$/i.test(v)) hits.push({ category: 'font-family', text: v, index: value.indexOf(v) });\n return out;\n }\n if (prop === 'box-shadow' || prop === 'text-shadow') {\n // A ring built from tokens (`inset 0 0 0 var(--border-width-default) var(--color-border-default)`) is not\n // hardcoded: bare zero offsets carry no value. Any other number or a color literal is.\n const numbers = masked.replace(/(?<![\\w.])0(?![\\w.%])/g, ' ');\n if (/\\d/.test(numbers) || masked.search(COLOR_LITERAL_RE) >= 0) hits.push({ category: 'shadow', text: v, index: value.indexOf(v) });\n return out;\n }\n\n // Colors: hex and functions anywhere; named colors only where a color is expected.\n for (const m of masked.matchAll(COLOR_LITERAL_RE)) if (parseCssColor(m[0])) hits.push({ category: 'color', text: m[0], index: m.index! });\n if (COLOR_PROP.test(prop) || prop.startsWith('--') || prop.startsWith('$')) {\n for (const m of masked.matchAll(/(?<![\\w#.-])([a-z]+)(?![\\w(-])/gi)) {\n const n = m[1]!.toLowerCase();\n if (NAMED_COLORS[n] && !/^(transparent|currentcolor)$/.test(n)) hits.push({ category: 'color', text: m[1]!, index: m.index! });\n }\n // Bare HSL channels, the shadcn/ui theme form: --primary: 222.2 47.4% 11.2%;\n if (prop.startsWith('--') && /^-?[\\d.]+(deg)?\\s+[\\d.]+%\\s+[\\d.]+%/.test(v) && parseCssColor(v)) hits.push({ category: 'color', text: v, index: value.indexOf(v) });\n }\n\n if (prop === 'z-index') {\n const n = /^-?\\d+$/.test(v) ? Number(v) : NaN;\n if (Number.isFinite(n) && Math.abs(n) > 1) hits.push({ category: 'z-index', text: v, index: value.indexOf(v) });\n return out;\n }\n if (prop === 'font-weight') {\n if (/^(\\d{3}|bold|bolder|lighter)$/i.test(v)) hits.push({ category: 'font-weight', text: v, index: value.indexOf(v) });\n return out;\n }\n if (prop === 'line-height' && /^\\d*\\.?\\d+$/.test(v) && Number(v) !== 0) {\n hits.push({ category: 'line-height', text: v, index: value.indexOf(v) });\n return out;\n }\n if (MOTION_PROP.test(prop)) {\n for (const m of masked.matchAll(/(?<![\\w.-])(\\d*\\.?\\d+)(ms|s)\\b/g)) if (Number(m[1]) !== 0) hits.push({ category: 'duration', text: m[0], index: m.index! });\n }\n if (EASING_PROP.test(prop)) {\n for (const m of masked.matchAll(/cubic-bezier\\([^)]*\\)|(?<![\\w-])(ease-in-out|ease-in|ease-out|ease|linear)(?![\\w-])/g)) hits.push({ category: 'easing', text: m[0], index: m.index! });\n }\n const cat = lengthCategory(prop);\n if (cat) for (const m of masked.matchAll(LENGTH_RE)) if (Number(m[1]) !== 0) hits.push({ category: cat, text: m[0].replace(/^-/, ''), index: m.index! + (m[0].startsWith('-') ? 1 : 0) });\n hits.sort((a, b) => a.index - b.index);\n return out;\n}\n\n// --- JS style objects ---------------------------------------------------------------------------------------\n\nconst MUI_SHORTHAND: Record<string, string> = {\n m: 'margin', mt: 'margin-top', mr: 'margin-right', mb: 'margin-bottom', ml: 'margin-left', mx: 'margin-inline', my: 'margin-block',\n p: 'padding', pt: 'padding-top', pr: 'padding-right', pb: 'padding-bottom', pl: 'padding-left', px: 'padding-inline', py: 'padding-block',\n marginX: 'margin-inline', marginY: 'margin-block', paddingX: 'padding-inline', paddingY: 'padding-block', bgcolor: 'background-color',\n};\nconst UNITLESS = /^(opacity|flex|flex-grow|flex-shrink|order|zoom|column-count|fill-opacity|stroke-opacity|aspect-ratio|grid-row|grid-column|animation-iteration-count|tab-size|orphans|widows|scale)$/;\nconst MUI_SPACING_KEY = /^(margin|padding)(-.*)?$|^(gap|row-gap|column-gap)$/;\nconst MUI_PALETTE_PATH = /^(primary|secondary|error|warning|info|success|text|background|grey|action|common|divider)(\\.[\\w]+)*$/;\n\n/** camelCase or MUI shorthand key -> kebab-case CSS property. */\nexport function cssPropertyOf(key: string): string {\n if (MUI_SHORTHAND[key]) return MUI_SHORTHAND[key]!;\n if (key.startsWith('--') || key.startsWith('$')) return key;\n return key.replace(/^(Webkit|Moz|ms)(?=[A-Z])/, (p) => `-${p.toLowerCase()}`).replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n}\n\nexport type JsStyleContext = 'style' | 'sx' | 'styled' | 'theme';\n\n/**\n * Scan one entry of a JS style object (`style`, MUI `sx`, styled/makeStyles objects, theme objects).\n * Numbers follow React and MUI: px for lengths, theme spacing units for sx margins and paddings.\n */\nexport function scanJsStyle(key: string, value: string | number, ctx: JsStyleContext): ValueScan {\n const prop = cssPropertyOf(key);\n if (typeof value === 'number') {\n const none: ValueScan = { hits: [], vars: [], themeRef: false };\n if (ctx === 'sx' && (MUI_SPACING_KEY.test(prop) || RADIUS_PROP.test(prop) || MUI_SHORTHAND[key])) return { ...none, themeRef: true };\n if (prop === 'z-index' || prop === 'font-weight' || prop === 'line-height') return scanCssValue(prop, String(value));\n if (UNITLESS.test(prop) || value === 0 || looseKey(prop)) return none;\n if (ctx === 'sx' && SIZE_PROP.test(prop) && Math.abs(value) <= 1) return none; // MUI: fraction = percentage\n const scan = scanCssValue(prop, `${value}px`);\n // Report the number as written.\n scan.hits.forEach((h) => (h.text = String(value)));\n return scan;\n }\n const v = value.trim();\n if ((ctx === 'sx' || ctx === 'theme') && (MUI_PALETTE_PATH.test(v) || (prop === 'typography' && /^[a-z]+\\d?$/.test(v))) && !NAMED_COLORS[v.toLowerCase()]) {\n return { hits: [], vars: [], themeRef: true };\n }\n return scanCssValue(prop, value);\n}\n\n/** A whole string literal that is a color (`'#1976d2'`, `'rgba(0,0,0,.5)'`): counted wherever it appears in code. */\nexport function isColorLiteral(text: string): boolean {\n const t = text.trim();\n return /^(#[0-9a-f]{3,8}|(rgba?|hsla?)\\([^()]*\\))$/i.test(t) && Boolean(parseCssColor(t));\n}\n","// CSS, SCSS, Less and CSS-in-JS template text: declarations with their offsets, plus Tailwind @apply.\nimport { scanCssValue, type ValueScan } from './scan-value';\nimport { scanClassString, type TailwindHit } from './tailwind';\n\nexport interface CssDecl {\n property: string;\n value: string;\n /** Offset of the value in the text. */\n valueStart: number;\n scan: ValueScan;\n}\n\nexport interface CssScan {\n decls: CssDecl[];\n applies: { start: number; hits: TailwindHit[] }[];\n}\n\n/** Comments become spaces (offsets and line numbers stay put). `//` comments only for SCSS and Less. */\nexport function blankComments(text: string, lineComments: boolean): string {\n let out = text.replace(/\\/\\*[\\s\\S]*?\\*\\//g, (c) => c.replace(/[^\\n]/g, ' '));\n if (lineComments) out = out.replace(/(^|[^:\"'\\\\])\\/\\/[^\\n]*/g, (c, pre: string) => pre + ' '.repeat(c.length - pre.length));\n return out;\n}\n\nconst DECL_RE = /(?<=^|[;{}])(\\s*)([$@]?-{0,2}[A-Za-z_][\\w-]*)\\s*:\\s*([^;{}]*?)\\s*(?=;|}|$(?![\\s\\S]))/g;\n\nexport function scanCssText(text: string, lang: 'css' | 'scss' | 'less' = 'css'): CssScan {\n const clean = blankComments(text, lang !== 'css');\n const decls: CssDecl[] = [];\n for (const m of clean.matchAll(DECL_RE)) {\n const property = m[2]!;\n if (property.startsWith('@')) continue;\n const value = m[3]!;\n if (!value.trim()) continue;\n // Skip a selector with a pseudo-class that ends the text (no brace after it).\n const valueStart = m.index! + m[0].length - value.length;\n decls.push({ property, value, valueStart, scan: scanCssValue(property, value) });\n }\n const applies = [...clean.matchAll(/@apply\\s+([^;{}]+)/g)].map((m) => ({ start: m.index! + m[0].length - m[1]!.length, hits: scanClassString(m[1]!) }));\n return { decls, applies };\n}\n\n/** 1-based line and column of an offset. */\nexport function lineCol(text: string): (offset: number) => { line: number; column: number } {\n const starts = [0];\n for (let i = 0; i < text.length; i++) if (text.charCodeAt(i) === 10) starts.push(i + 1);\n return (offset) => {\n let lo = 0;\n let hi = starts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (starts[mid]! <= offset) lo = mid;\n else hi = mid - 1;\n }\n return { line: lo + 1, column: offset - starts[lo]! + 1 };\n };\n}\n","// Component classification: DS package, foreign UI libraries, native elements, re-created DS components.\n\nconst FOREIGN_PREFIXES = [\n '@mui/material', '@mui/joy', '@mui/lab', '@mui/x-', '@mui/base', '@material-ui/', 'antd', '@ant-design/pro-', '@chakra-ui/', '@radix-ui/react-',\n '@headlessui/', '@mantine/', 'react-bootstrap', 'reactstrap', '@nextui-org/', '@heroui/', 'react-admin', 'ra-ui-materialui', 'ra-input-rich-text',\n '@fluentui/', 'primereact', 'semantic-ui-react', '@blueprintjs/', '@ariakit/', 'react-aria-components', '@base-ui/react', '@base-ui-components/',\n '@ark-ui/', 'evergreen-ui', 'grommet', 'rsuite', '@adobe/react-spectrum', '@react-spectrum/', 'vaul', 'cmdk', 'sonner', 'react-select', 'react-modal',\n];\nconst ICON_PREFIXES = ['@mui/icons-material', '@material-ui/icons', '@ant-design/icons', '@radix-ui/react-icons', 'lucide-react', 'react-icons', '@heroicons/', '@tabler/icons-react', '@phosphor-icons/', 'react-feather'];\nconst SHADCN_RE = /(^|\\/)components\\/ui(\\/|$)/;\n/** Chart libraries: visible UI the design system does not provide, counted as foreign with no DS equivalent. */\nconst CHART_PREFIXES = ['recharts', 'react-chartjs-2', 'chart.js', '@nivo/', 'victory', '@visx/', 'echarts-for-react', 'react-apexcharts', '@tremor/react', '@mui/x-charts'];\n/**\n * Router links render a visible anchor. From a router or a headless admin core they are UI that the DS Link\n * covers, unless passed to a DS component as its render element (`render={<Link to=\"...\" />}`).\n */\nconst ROUTER_LINK_MODULES = ['react-router', 'react-router-dom', 'ra-core', 'next/link', '@tanstack/react-router', 'wouter', '@remix-run/react'];\nconst ROUTER_LINK_NAMES = new Set(['Link', 'NavLink', 'LinkBase']);\nexport const isRouterLink = (mod: string, name: string) => ROUTER_LINK_MODULES.some((p) => prefixMatch(mod, p)) && (ROUTER_LINK_NAMES.has(name) || (mod === 'next/link' && name === 'default'));\n\n/** Rendered by UI libraries but not UI: providers, routers, data wrappers. */\nconst NON_VISUAL = new Set(['Admin', 'AdminContext', 'AdminUI', 'Resource', 'CustomRoutes', 'Route', 'Routes', 'Router', 'BrowserRouter', 'Translate', 'CssBaseline', 'ScopedCssBaseline', 'GlobalStyles', 'ResponsiveContainer', 'StyledEngineProvider', 'Fragment', 'Suspense', 'StrictMode', 'ErrorBoundary', 'WithRecord', 'WithListContext', 'Portal', 'NoSsr', 'ClickAwayListener', 'Fade', 'Grow', 'Slide', 'Zoom', 'Collapse', 'Transition', 'TrapFocus', 'FocusTrap', 'Slot', 'VisuallyHidden']);\nexport const isNonVisual = (name: string) => NON_VISUAL.has(name) || /(Provider|Context|Consumer|Controller)$/.test(name);\n\nconst prefixMatch = (mod: string, p: string) => (p.endsWith('/') || p.endsWith('-') ? mod.startsWith(p) : mod === p || mod.startsWith(`${p}/`));\n\nexport type ModuleKind = 'ds' | 'foreign' | 'charts' | 'icons' | 'shadcn' | 'local' | 'other';\n\n/** Package name of an import specifier: @scope/name or name. */\nexport function packageName(mod: string): string {\n const parts = mod.split('/');\n return mod.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0]!;\n}\n\nexport function classifyModule(mod: string, dsPackages: string[], extraForeign: string[] = []): ModuleKind {\n if (dsPackages.some((p) => mod === p || mod.startsWith(`${p}/`))) return 'ds';\n if (ICON_PREFIXES.some((p) => prefixMatch(mod, p))) return 'icons';\n if (CHART_PREFIXES.some((p) => prefixMatch(mod, p))) return 'charts';\n if (SHADCN_RE.test(mod) && (mod.startsWith('.') || mod.startsWith('@/') || mod.startsWith('~/') || mod.startsWith('src/') || mod.startsWith('components/'))) return 'shadcn';\n if ([...FOREIGN_PREFIXES, ...extraForeign].some((p) => prefixMatch(mod, p))) return 'foreign';\n if (mod.startsWith('.') || mod.startsWith('@/') || mod.startsWith('~/') || mod.startsWith('src/')) return 'local';\n return 'other';\n}\n\n/** Library label used in the report. */\nexport function libraryLabel(mod: string, kind: ModuleKind): string {\n return kind === 'shadcn' ? 'shadcn/ui (local)' : kind === 'local' ? 'local' : packageName(mod);\n}\n\nconst EQUIVALENTS: [RegExp, string[]][] = [\n [/^(Icon)?Button$|^LoadingButton$|^SaveButton$|^(Create|Edit|Delete|Show|Export|List|Refresh|Clone)Button$/, ['Button']],\n [/^IconButton$|^Fab$/, ['IconButton', 'Button']],\n [/^(Toggle)?ButtonGroup$|^ToggleButton$/, ['ButtonGroup']],\n [/^Number(Input|Field)$/, ['NumberField', 'Input']],\n [/^(TextField|TextInput|Input|InputBase|OutlinedInput|FilledInput|PasswordInput|SearchInput|DateInput|DateTimeInput)$/, ['Input', 'Field']],\n [/^(Textarea|TextareaAutosize|RichTextInput)$/, ['Textarea']],\n [/^(Autocomplete|AutocompleteInput|AutocompleteArrayInput|Combobox|Command)$/, ['Combobox', 'Select']],\n [/^(Select|NativeSelect|SelectInput|SelectArrayInput)$/, ['Select']],\n [/^(Switch|BooleanInput|NullableBooleanInput)$/, ['Switch']],\n [/^(Checkbox|BooleanField)$/, ['Checkbox']],\n [/^CheckboxGroupInput$/, ['CheckboxGroup']],\n [/^(Radio|RadioGroup|RadioButtonGroupInput)$/, ['RadioGroup']],\n [/^Slider$/, ['Slider']],\n [/^(AlertDialog|Confirm)$/, ['AlertDialog', 'Dialog']],\n [/^(Dialog|Modal|DialogTitle|DialogContent|DialogActions|DialogContentText)$/, ['Dialog']],\n [/^(Drawer|SwipeableDrawer|Sheet)$/, ['Drawer']],\n [/^(Popover|Popper|HoverCard)$/, ['Popover']],\n [/^Tooltip$/, ['Tooltip']],\n [/^(Menu|MenuItem|MenuList|DropdownMenu.*)$/, ['Menu']],\n [/^(Tabs|Tab|TabList|TabPanel|TabbedForm|TabbedShowLayout)$/, ['Tabs']],\n [/^(Card|CardContent|CardHeader|CardActions|CardMedia|Paper)$/, ['Card']],\n [/^Avatar$/, ['Avatar']],\n [/^Badge$/, ['Badge']],\n [/^(Chip|Tag|ChipField)$/, ['Tag', 'Badge']],\n [/^(Alert|AlertTitle|Callout)$/, ['Alert']],\n [/^(Banner|AnnouncementBar|TopBanner)$/, ['Banner', 'Alert']],\n [/^(CodeBlock|Code|CodeSnippet|Snippet|Prism|SyntaxHighlighter|CopyBlock)$/, ['CodeBlock']],\n [/^(RadioCard|RadioCards|RadioTile|ChoiceCard|ChoiceCardGroup)$/, ['ChoiceCard', 'RadioGroup']],\n [/^(Checklist|ChecklistItem|StepList)$/, ['Checklist']],\n [/^(Snackbar|Toast|Toaster|Notification)$/, ['Toast']],\n [/^(CircularProgress|Spinner|Loading|LoadingIndicator)$/, ['Spinner', 'Progress']],\n [/^(LinearProgress|Progress)$/, ['Progress']],\n [/^Skeleton$/, ['Skeleton']],\n [/^(Divider|Separator)$/, ['Divider']],\n [/^(Accordion|AccordionSummary|AccordionDetails|Collapsible)$/, ['Accordion']],\n [/^(Table|TableBody|TableCell|TableRow|TableHead|TableContainer|TableFooter|Datagrid|DataGrid|DataTable)$/, ['Table']],\n [/^(Pagination|TablePagination)$/, ['Pagination']],\n [/^(Breadcrumbs|Breadcrumb)$/, ['Breadcrumb']],\n [/^Link$/, ['Link']],\n [/^Stack$/, ['Stack']],\n [/^(Grid|Grid2|ImageList)$/, ['Grid']],\n [/^Container$/, ['Container']],\n [/^(Form|SimpleForm)$/, ['Form']],\n [/^(FormControl|FormLabel|FormHelperText|FormControlLabel|InputLabel|Labeled|Label|FormField|FormItem)$/, ['Field']],\n [/^(Sidebar|SidebarNav|Menu|MenuItemLink|DashboardMenuItem)$/, ['SidebarNav']],\n [/^Kbd$/, ['Kbd']],\n];\n\n/** The DS component to use instead of a foreign one, when one fits. */\nexport function dsEquivalent(name: string, ds: Set<string>): string | undefined {\n const base = name.split('.').pop()!;\n if (ds.has(base)) return base;\n for (const [re, cands] of EQUIVALENTS) if (re.test(base)) return cands.find((c) => ds.has(c));\n return undefined;\n}\n\n/** The DS component that replaces a native element; undefined when the DS has none, and then the element is not a miss. */\nexport function nativeEquivalent(tag: string, type: string | undefined, ds: Set<string>): string | undefined {\n const pick = (...c: string[]) => c.find((x) => ds.has(x));\n switch (tag) {\n case 'button':\n return pick('Button');\n case 'input':\n if (type === 'checkbox') return pick('Checkbox', 'Switch');\n if (type === 'radio') return pick('RadioGroup');\n if (type === 'range') return pick('Slider');\n if (type === 'number') return pick('NumberField', 'Input');\n return pick('Input', 'Field');\n case 'select':\n return pick('Select', 'Combobox');\n case 'textarea':\n return pick('Textarea');\n case 'dialog':\n return pick('Dialog');\n case 'table':\n return pick('Table');\n case 'a':\n return pick('Link');\n case 'img':\n return pick('Image');\n default:\n return pick(tag[0]!.toUpperCase() + tag.slice(1));\n }\n}\n","// What the audit compares product code against: the design system's tokens (resolved in every mode),\n// its CSS variables, its component names and its package names.\nimport type { Rgba } from '../values';\nimport { comboKey, type Combo, type LayeredTokenSet } from '../layered';\nimport { deltaE, parseCssColor } from './color';\nimport type { Confidence, FindingCategory, TokenSuggestion } from './types';\n\nexport interface AuditDsOptions {\n /** Packages the DS components are imported from, e.g. [\"@bridge-ds/react\"]. */\n packages: string[];\n /** DS component names (PascalCase). */\n components: string[];\n /** Extra module prefixes counted as foreign UI libraries. */\n foreignLibraries?: string[];\n /** Native elements that should be DS components. */\n nativeElements?: string[];\n}\n\ninterface Entry {\n path: string;\n cssVar: string;\n type: string;\n tier: string;\n css: string;\n combo?: string;\n rgba?: Rgba;\n num?: number;\n}\n\nconst TIER_RANK_COLOR: Record<string, number> = { semantic: 0, base: 1, component: 2, brand: 3, density: 3, primitive: 4 };\nconst TIER_RANK_SCALE: Record<string, number> = { semantic: 0, base: 0, brand: 1, density: 2, primitive: 3, component: 5 };\n\n// CSS property -> token paths that fit its intent (a background wants a bg/surface token, not a text one).\nconst COLOR_HINTS: [RegExp, RegExp][] = [\n [/^(color|fill|stroke|-webkit-text-fill-color|caret-color|text-decoration(-color)?)$/, /(^|\\.)(text|fg|icon|foreground|link)(\\.|-|$)/],\n [/background|bgcolor/, /(^|\\.)(bg|surface|background|fill|solid|scrim|overlay)(\\.|-|$)/],\n [/border|outline|divider|column-rule/, /(^|\\.)(border|outline|ring|divider|line|separator)(\\.|-|$)/],\n];\n\nconst PATH_FOR: Partial<Record<FindingCategory, RegExp>> = {\n spacing: /(^|\\.)space(\\.|$)/,\n size: /(^|\\.)size(\\.|$)/,\n radius: /(^|\\.)radius(\\.|$)|-radius$|\\.radius$/,\n 'border-width': /border-width|border\\.width|(^|\\.)stroke(\\.|$)/,\n 'font-size': /font\\.size|font-size|text\\.size/,\n 'line-height': /line-height|leading/,\n duration: /duration/,\n 'z-index': /^(z|layer|z-index|zindex)\\./,\n 'font-weight': /weight/,\n};\n\nconst toPx = (css: string): number | undefined => {\n const m = /^(-?\\d*\\.?\\d+)(px|rem|em)?$/.exec(css.trim());\n if (!m) return undefined;\n return m[2] === 'rem' || m[2] === 'em' ? Number(m[1]) * 16 : Number(m[1]);\n};\nconst toMs = (css: string): number | undefined => {\n const m = /^(\\d*\\.?\\d+)(ms|s)$/.exec(css.trim());\n return m ? (m[2] === 's' ? Number(m[1]) * 1000 : Number(m[1])) : undefined;\n};\nconst EASE_KEYWORDS: Record<string, number[]> = { ease: [0.25, 0.1, 0.25, 1], 'ease-in': [0.42, 0, 1, 1], 'ease-out': [0, 0, 0.58, 1], 'ease-in-out': [0.42, 0, 0.58, 1], linear: [0, 0, 1, 1] };\nconst bezier = (css: string): number[] | undefined => {\n const k = EASE_KEYWORDS[css.trim()];\n if (k) return k;\n const m = /cubic-bezier\\(([^)]*)\\)/.exec(css);\n const n = m?.[1]!.split(',').map(Number);\n return n && n.length === 4 && n.every(Number.isFinite) ? n : undefined;\n};\nconst WEIGHT_WORDS: Record<string, number> = { normal: 400, bold: 700, bolder: 700, lighter: 300 };\nconst firstFamily = (css: string) => css.split(',')[0]!.trim().replace(/^[\"']|[\"']$/g, '').toLowerCase();\nconst shadowNums = (css: string) => [...css.replace(/rgba?\\([^)]*\\)|#[0-9a-f]+|hsla?\\([^)]*\\)/gi, '').matchAll(/-?\\d*\\.?\\d+/g)].map((m) => Number(m[0]));\n\nfunction level(conf: number): Confidence {\n return conf >= 0.999 ? 'exact' : conf >= 0.75 ? 'high' : conf >= 0.5 ? 'medium' : 'low';\n}\nconst round = (n: number, d = 2) => Math.round(n * 10 ** d) / 10 ** d;\n\n/** Native elements counted as UI instances that a DS component should render: controls, links and images. */\nexport const DEFAULT_NATIVE_ELEMENTS = ['button', 'input', 'select', 'textarea', 'dialog', 'table', 'a', 'img'];\n\nexport class DesignSystemIndex {\n readonly cssVars = new Set<string>();\n readonly packages: string[];\n readonly components: Set<string>;\n readonly foreignLibraries: string[];\n readonly nativeElements: string[];\n readonly tokenCount: number;\n readonly modes: string[];\n private colors: Entry[] = [];\n private byType = new Map<string, Entry[]>();\n private defaultCombo: Combo;\n\n constructor(set: LayeredTokenSet, opts: AuditDsOptions) {\n this.packages = opts.packages;\n this.components = new Set(opts.components);\n this.foreignLibraries = opts.foreignLibraries ?? [];\n this.nativeElements = opts.nativeElements ?? DEFAULT_NATIVE_ELEMENTS;\n this.defaultCombo = set.defaultCombo;\n this.modes = set.combos().map(comboKey);\n const paths = set.allPaths();\n this.tokenCount = paths.length;\n const defKey = comboKey(this.defaultCombo);\n const seenColor = new Set<string>();\n for (const combo of set.combos()) {\n const key = this.modeLabel(combo);\n const isDefault = comboKey(combo) === defKey;\n const view = set.view(combo);\n for (const p of view.keys()) {\n const r = set.resolve(p, combo);\n if (r.error || !r.css) continue;\n const base = { path: p, cssVar: set.cssVarName(p), type: r.type ?? '', tier: set.tierOf(p) ?? 'primitive', css: r.css };\n if (r.type === 'color') {\n const rgba = parseCssColor(r.css);\n const id = `${p}|${r.css}`;\n if (!rgba || seenColor.has(id)) continue;\n seenColor.add(id);\n this.colors.push({ ...base, rgba, ...(key ? { combo: key } : {}) });\n } else if (isDefault) {\n const list = this.byType.get(base.type) ?? [];\n list.push(base);\n this.byType.set(base.type, list);\n }\n }\n }\n for (const p of paths) this.cssVars.add(set.cssVarName(p));\n }\n\n private modeLabel(combo: Combo): string | undefined {\n const diff = Object.entries(combo).filter(([k, v]) => this.defaultCombo[k] !== v);\n return diff.length ? diff.map(([k, v]) => `${k}=${v}`).join(',') : undefined;\n }\n\n isDsVar(name: string): boolean {\n return this.cssVars.has(name);\n }\n\n isDsModule(mod: string): boolean {\n return this.packages.some((p) => mod === p || mod.startsWith(`${p}/`));\n }\n\n private entries(types: string[], pathRe?: RegExp): Entry[] {\n const all = types.flatMap((t) => this.byType.get(t) ?? []);\n if (!pathRe) return all;\n const narrowed = all.filter((e) => pathRe.test(e.path));\n return narrowed.length ? narrowed : all;\n }\n\n private make(e: Entry, distance: number, confidence: number): TokenSuggestion {\n return { token: e.path, cssVar: e.cssVar, value: e.css, ...(e.combo ? { mode: e.combo } : {}), distance: round(distance), confidence: round(confidence), level: level(confidence) };\n }\n\n /** Nearest color by deltaE OK across every mode; semantic tokens and tokens that fit the property win near-ties. */\n suggestColor(value: string, property?: string): TokenSuggestion | undefined {\n const target = parseCssColor(value);\n if (!target || !this.colors.length) return undefined;\n const hint = COLOR_HINTS.find(([re]) => property && re.test(property))?.[1];\n const scored = this.colors.map((e) => ({ e, d: deltaE(target, e.rgba!) }));\n const min = Math.min(...scored.map((s) => s.d));\n const tolerance = min <= 0.5 ? 0.5 : min + 2;\n const pick = scored\n .filter((s) => s.d <= Math.max(tolerance, min))\n .sort((a, b) => Number(hint ? !hint.test(a.e.path) : 0) - Number(hint ? !hint.test(b.e.path) : 0) || (TIER_RANK_COLOR[a.e.tier] ?? 5) - (TIER_RANK_COLOR[b.e.tier] ?? 5) || Number(Boolean(a.e.combo)) - Number(Boolean(b.e.combo)) || a.d - b.d)[0];\n if (!pick || pick.d > 15) return undefined;\n const conf = pick.d <= 0.5 ? 1 : pick.d <= 2 ? 0.85 : pick.d <= 5 ? 0.6 : 0.3;\n return this.make(pick.e, pick.d, conf);\n }\n\n private nearestNumber(cands: Entry[], target: number, read: (e: Entry) => number | undefined, rank = TIER_RANK_SCALE): { e: Entry; d: number } | undefined {\n const scored = cands.map((e) => ({ e, n: read(e) })).filter((s): s is { e: Entry; n: number } => s.n !== undefined).map((s) => ({ e: s.e, d: Math.abs(s.n - target) }));\n if (!scored.length) return undefined;\n const min = Math.min(...scored.map((s) => s.d));\n return scored.filter((s) => s.d === min).sort((a, b) => (rank[a.e.tier] ?? 5) - (rank[b.e.tier] ?? 5) || a.e.path.length - b.e.path.length)[0];\n }\n\n private ratioConfidence(d: number, target: number): number {\n if (d === 0) return 1;\n const rel = d / Math.max(Math.abs(target), 1);\n return d <= 1 || rel <= 0.05 ? 0.8 : rel <= 0.15 ? 0.55 : rel <= 0.4 ? 0.3 : 0;\n }\n\n /** Suggest a token for a hardcoded value of a category. Undefined when nothing is close. */\n suggest(category: FindingCategory, value: string, property?: string): TokenSuggestion | undefined {\n switch (category) {\n case 'color':\n return this.suggestColor(value, property);\n case 'spacing':\n case 'size':\n case 'radius':\n case 'border-width':\n case 'font-size': {\n const px = toPx(value);\n if (px === undefined) return undefined;\n const best = this.nearestNumber(this.entries(['dimension'], PATH_FOR[category]), Math.abs(px), (e) => toPx(e.css));\n if (!best) return undefined;\n let conf = this.ratioConfidence(best.d, px);\n if (conf && /em$/.test(value) && !/rem$/.test(value)) conf = Math.min(conf, 0.55); // em depends on the font size\n return conf ? this.make(best.e, best.d, conf) : undefined;\n }\n case 'line-height': {\n const n = Number(value);\n if (!Number.isFinite(n)) return undefined;\n const best = this.nearestNumber(this.entries(['number', 'dimension'], PATH_FOR['line-height']).filter((e) => PATH_FOR['line-height']!.test(e.path)), n, (e) => Number(e.css));\n if (!best) return undefined;\n const conf = best.d < 0.001 ? 1 : best.d <= 0.05 ? 0.8 : best.d <= 0.15 ? 0.5 : 0.25;\n return this.make(best.e, best.d, conf);\n }\n case 'duration': {\n const ms = toMs(value);\n if (ms === undefined) return undefined;\n const cands = this.entries(['duration']).filter((e) => toMs(e.css) !== 0 || ms === 0);\n const best = this.nearestNumber(cands, ms, (e) => toMs(e.css));\n const conf = best ? this.ratioConfidence(best.d, ms) || 0.25 : 0;\n return best ? this.make(best.e, best.d, conf) : undefined;\n }\n case 'easing': {\n const target = bezier(value);\n if (!target) return undefined;\n const scored = this.entries(['cubicBezier'])\n .map((e) => ({ e, b: bezier(e.css) }))\n .filter((s) => s.b)\n .map((s) => ({ e: s.e, d: s.b!.reduce((acc, x, i) => acc + Math.abs(x - target[i]!), 0) }))\n .sort((a, b) => a.d - b.d || (TIER_RANK_SCALE[a.e.tier] ?? 5) - (TIER_RANK_SCALE[b.e.tier] ?? 5));\n const best = scored.find((s) => s.d === scored[0]!.d && /motion/.test(s.e.path)) ?? scored[0];\n if (!best) return undefined;\n return this.make(best.e, best.d, best.d < 0.011 ? 1 : best.d <= 0.3 ? 0.55 : 0.3);\n }\n case 'z-index': {\n const n = Number(value);\n const cands = [...this.entries(['number']), ...this.entries([''])].filter((e) => PATH_FOR['z-index']!.test(e.path));\n const best = this.nearestNumber(cands, n, (e) => Number(e.css));\n if (!best) return undefined;\n return this.make(best.e, best.d, best.d === 0 ? 1 : best.d <= 10 ? 0.5 : 0.25);\n }\n case 'font-weight': {\n const n = WEIGHT_WORDS[value.toLowerCase()] ?? Number(value);\n if (!Number.isFinite(n)) return undefined;\n const cands = [...this.entries(['fontWeight']), ...this.entries(['number'])].filter((e) => PATH_FOR['font-weight']!.test(e.path));\n const best = this.nearestNumber(cands, n, (e) => Number(e.css));\n if (!best) return undefined;\n const conf = best.d === 0 ? (String(n) === value ? 1 : 0.9) : best.d <= 100 ? 0.6 : 0.3;\n return this.make(best.e, best.d / 100, conf);\n }\n case 'font-family': {\n const fam = firstFamily(value);\n const cands = this.entries(['fontFamily']);\n const exact = cands.filter((e) => firstFamily(e.css) === fam).sort((a, b) => (TIER_RANK_SCALE[a.tier] ?? 5) - (TIER_RANK_SCALE[b.tier] ?? 5))[0];\n if (exact) return this.make(exact, 0, value.replace(/\\s/g, '') === exact.css.replace(/\\s/g, '') ? 1 : 0.9);\n const mono = /mono|courier|consol|menlo/.test(value.toLowerCase());\n const generic = cands.filter((e) => (mono ? /mono/.test(e.path) : /sans/.test(e.path))).sort((a, b) => (TIER_RANK_SCALE[a.tier] ?? 5) - (TIER_RANK_SCALE[b.tier] ?? 5))[0];\n return generic ? this.make(generic, 1, 0.3) : undefined;\n }\n case 'shadow': {\n const norm = (s: string) => s.replace(/\\s+/g, ' ').replace(/\\s*,\\s*/g, ', ').trim().toLowerCase();\n const cands = this.entries(['shadow']);\n const exact = cands.find((e) => norm(e.css) === norm(value));\n if (exact) return this.make(exact, 0, 1);\n const t = shadowNums(value);\n const scored = cands\n .map((e) => {\n const n = shadowNums(e.css);\n const len = Math.max(n.length, t.length);\n let d = 0;\n for (let i = 0; i < len; i++) d += Math.abs((n[i] ?? 0) - (t[i] ?? 0));\n return { e, d };\n })\n .sort((a, b) => a.d - b.d || Number(!/elevation/.test(a.e.path)) - Number(!/elevation/.test(b.e.path)));\n const best = scored[0];\n if (!best) return undefined;\n return this.make(best.e, best.d, best.d <= 2 ? 0.75 : best.d <= 8 ? 0.5 : 0.25);\n }\n }\n }\n\n /** Same value as the token (safe to replace): exact level and, for lengths, the same unit. */\n static isExact(s: TokenSuggestion | undefined): boolean {\n return Boolean(s && s.level === 'exact');\n }\n}\n","// TSX/JSX/TS/JS scanner (TypeScript compiler API, syntax only): style objects (style, sx, styled, makeStyles,\n// theme objects), CSS-in-JS templates, Tailwind class strings, color literals, DS token references, and\n// component usage (DS, foreign UI libraries, native elements, re-created DS components).\nimport ts from 'typescript';\nimport { classifyModule, dsEquivalent, isNonVisual, isRouterLink, libraryLabel, nativeEquivalent } from './components';\nimport { scanCssText } from './css';\nimport { isColorLiteral, scanJsStyle, type JsStyleContext, type ValueHit } from './scan-value';\nimport { scanClassString, type TailwindHit } from './tailwind';\nimport type { DesignSystemIndex } from './ds-index';\nimport type { ComponentFinding, FindingCategory, FindingSource, StyleFinding } from './types';\nimport { parseCssColor } from './color';\n\nexport interface CodeScan {\n findings: StyleFinding[];\n tokenUsages: number;\n themeRefs: number;\n /** DS component instances by name. */\n ds: Record<string, number>;\n components: ComponentFinding[];\n /** Local component definitions (PascalCase functions, classes, consts). */\n definitions: { name: string; line: number }[];\n}\n\nconst CLASS_FNS = /^(cn|clsx|classnames|classNames|cva|twMerge|twJoin|tw|cx)$/;\nconst STYLE_FNS = /^(makeStyles|withStyles|createStyles|css|keyframes|globalCss|injectGlobal|sxProps)$/;\nconst THEME_FNS = /^(createTheme|extendTheme|createMuiTheme|responsiveFontSizes|experimental_extendTheme|deepmerge)$/;\nconst CSS_TAGS = /^(styled(\\.\\w+|\\(.*\\)(\\.attrs\\(.*\\))?)|css|keyframes|createGlobalStyle|injectGlobal|tw\\.\\w+)$/s;\nconst MUI_SPACING_ATTR = /^([mp][trblxy]?|(margin|padding)(Top|Bottom|Left|Right|X|Y)?|gap|rowGap|columnGap|spacing)$/;\nconst THEME_REF_RE = /\\btheme\\.(palette|spacing|shape|typography|shadows|zIndex|transitions|vars)\\b/g;\n\n/**\n * DS renderers for pages without React (`@bridge-ds/react/dom`): `badgeHtml()`, `codeBlockHtml()`,\n * `tooltipAttributes()`, `badgeClassName()`. A call imported from a DS package whose name is a component name plus one\n * of these suffixes counts as one instance of that component.\n */\nconst DOM_RENDERER_RE = /^([a-z][A-Za-z0-9]*?)(Html|HTML|HtmlAttributes|Attributes|ClassName)$/;\n\n/** The DS component a DOM renderer stands for: `checklistRowHtml` -> ChecklistRow, else the longest DS name it starts with. */\nexport function domRendererComponent(fn: string, components: Set<string>): string | undefined {\n const m = DOM_RENDERER_RE.exec(fn);\n if (!m) return undefined;\n const pascal = m[1]![0]!.toUpperCase() + m[1]!.slice(1);\n if (components.has(pascal)) return pascal;\n return [...components].filter((c) => pascal.startsWith(c)).sort((a, b) => b.length - a.length)[0];\n}\n\n/**\n * Homemade look-alikes in markup a script builds (`class=\"pill\"`, `data-tip=\"...\"`): the DS component they imitate.\n * Exact class tokens only, so app classes that merely contain the word (`cm-pill-row`) are not counted.\n */\nexport const LOOKALIKE_CLASSES: Record<string, string> = { pill: 'Badge', badge: 'Badge', chip: 'Tag', tooltip: 'Tooltip', tip: 'Tooltip', 'has-tip': 'Tooltip' };\nexport const LOOKALIKE_ATTRS: Record<string, string> = { 'data-tip': 'Tooltip' };\nconst HTML_CLASS_RE = /\\bclass(?:Name)?\\s*=\\s*[\"']([^\"'$]*)/g;\nconst HTML_ATTR_RE = /\\s(data-tip)\\s*=/g;\n\n/** Look-alikes in a class list (`pill is-pass`): one finding per imitated component. */\nexport function lookalikesInClassList(list: string, components: Set<string>): { token: string; component: string }[] {\n const out: { token: string; component: string }[] = [];\n for (const token of list.split(/\\s+/)) {\n const component = LOOKALIKE_CLASSES[token];\n if (component && components.has(component) && !out.some((o) => o.component === component)) out.push({ token, component });\n }\n return out;\n}\n\nfunction kindFor(path: string): ts.ScriptKind {\n return path.endsWith('.tsx') ? ts.ScriptKind.TSX : path.endsWith('.jsx') ? ts.ScriptKind.JSX : path.endsWith('.ts') || path.endsWith('.mts') || path.endsWith('.cts') ? ts.ScriptKind.TS : ts.ScriptKind.JSX;\n}\n\nconst RENDER_PROPS = new Set(['render', 'component', 'as', 'linkComponent', 'LinkComponent']);\n/** `<Comp render={<Link to=\"/x\" />} />`, `render={<a href=\"/x\" />}` or `{ render: <Link /> }`: the element only gives a component its tag or router. */\nfunction isRenderElement(node: ts.JsxOpeningElement | ts.JsxSelfClosingElement): boolean {\n let p: ts.Node = ts.isJsxOpeningElement(node) ? node.parent.parent : node.parent;\n while (ts.isParenthesizedExpression(p)) p = p.parent;\n if (ts.isJsxExpression(p) && ts.isJsxAttribute(p.parent)) return RENDER_PROPS.has(p.parent.name.getText());\n if (ts.isPropertyAssignment(p)) return RENDER_PROPS.has(p.name.getText());\n return false;\n}\n\nconst keyName = (n: ts.PropertyName | undefined): string | undefined =>\n !n ? undefined : ts.isIdentifier(n) || ts.isPrivateIdentifier(n) ? n.text : ts.isStringLiteral(n) || ts.isNumericLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n) ? n.text : undefined;\n\nfunction contextForDeclaration(name: string, typeText: string): JsStyleContext | null {\n if (/SxProps/.test(typeText)) return 'sx';\n if (/CSSProperties|CSSObject/.test(typeText)) return 'style';\n if (/Theme(Options)?\\b/.test(typeText) || /theme$/i.test(name)) return 'theme';\n if (/^(styles?|sx|classes)$|Styles?$|Sx$/.test(name)) return /sx$/i.test(name) ? 'sx' : 'styled';\n return null;\n}\n\n/** Imported name -> module and exported name ('default', '*' for a namespace). */\nexport type ImportMap = Map<string, { module: string; imported: string }>;\n\n/** Import declarations of a script (TS or JS), for markup files whose tags use what the script imports. */\nexport function importsOf(path: string, text: string): ImportMap {\n const sf = ts.createSourceFile(path, text, ts.ScriptTarget.Latest, false, kindFor(path));\n const imports: ImportMap = new Map();\n for (const node of sf.statements) {\n if (!ts.isImportDeclaration(node) || !ts.isStringLiteral(node.moduleSpecifier)) continue;\n const mod = node.moduleSpecifier.text;\n const c = node.importClause;\n if (c?.name) imports.set(c.name.text, { module: mod, imported: 'default' });\n if (c?.namedBindings && ts.isNamespaceImport(c.namedBindings)) imports.set(c.namedBindings.name.text, { module: mod, imported: '*' });\n if (c?.namedBindings && ts.isNamedImports(c.namedBindings)) for (const el of c.namedBindings.elements) imports.set(el.name.text, { module: mod, imported: (el.propertyName ?? el.name).text });\n }\n return imports;\n}\n\n/** One element as written in JSX or in a template (Astro, Vue, Svelte). */\nexport interface TagUse {\n name: string;\n line: number;\n column: number;\n /** Static `type` attribute. */\n type?: string;\n hasHref: boolean;\n /** The element only gives a component its tag or router (`render={<a href=\"/x\" />}`). */\n inRenderProp?: boolean;\n}\n\n/**\n * What an element is: a DS component instance, a foreign, native or re-created component, or nothing (providers,\n * hidden inputs, anchors without href). `localCandidate`: an unimported DS-named tag, re-created only when the file\n * defines it.\n */\nexport function classifyTag(t: TagUse, imports: ImportMap, ds: DesignSystemIndex): { ds?: string; component?: ComponentFinding; localCandidate?: ComponentFinding } {\n const { name } = t;\n const at = { line: t.line, column: t.column };\n if (/^[a-z][\\w-]*$/.test(name)) {\n if (!ds.nativeElements.includes(name)) return {};\n if (name === 'input' && t.type === 'hidden') return {};\n // An anchor without href is not a link (named anchor, placeholder).\n if (name === 'a' && !t.hasHref) return {};\n // `<Button render={<a href=\"/x\" />}>`: the element only gives the DS component its tag; the DS component is the UI.\n if (t.inRenderProp) return {};\n // A native element is a miss only when the design system has a component that replaces it: an <img> is fine in\n // a design system without Image, a <table> in one without Table.\n const suggestion = nativeEquivalent(name, t.type, ds.components);\n if (!suggestion) return {};\n return { component: { ...at, name, kind: 'native', library: 'native', suggestion } };\n }\n const root = name.split('.')[0]!;\n const imp = imports.get(root);\n const ns = imp?.imported === '*';\n // Named imports report the exported name (aliases resolved); namespace imports keep Dialog.Root.\n const shown = imp && !ns && imp.imported !== 'default' ? [imp.imported, ...name.split('.').slice(1)].join('.') : name;\n const leaf = ns && name.includes('.') ? name.split('.').slice(1).join('.') : shown;\n if (imp) {\n const kind = classifyModule(imp.module, ds.packages, ds.foreignLibraries);\n // Providers and other non-visual parts are not UI instances, from the DS or elsewhere.\n if (isNonVisual(leaf.split('.').pop()!)) return {};\n if (kind === 'ds') return { ds: leaf };\n if (kind === 'charts') return { component: { ...at, name: shown, kind: 'foreign', library: libraryLabel(imp.module, kind) } };\n if (kind === 'other' && isRouterLink(imp.module, imp.imported === 'default' ? 'default' : leaf)) {\n if (t.inRenderProp) return {};\n const suggestion = ds.components.has('Link') ? 'Link' : undefined;\n return { component: { ...at, name: shown, kind: 'foreign', library: libraryLabel(imp.module, kind), ...(suggestion ? { suggestion } : {}) } };\n }\n if (kind === 'foreign' || kind === 'shadcn') {\n const suggestion = (ns ? dsEquivalent(root, ds.components) : undefined) ?? dsEquivalent(leaf, ds.components);\n return { component: { ...at, name: shown, kind: 'foreign', library: libraryLabel(imp.module, kind), ...(suggestion ? { suggestion } : {}) } };\n }\n if (kind === 'local' && ds.components.has(leaf.split('.')[0]!)) return { component: { ...at, name: leaf, kind: 'recreated', library: 'local', suggestion: leaf.split('.')[0]! } };\n return {};\n }\n if (ds.components.has(root)) return { localCandidate: { ...at, name, kind: 'recreated', library: 'local', suggestion: root } };\n return {};\n}\n\n/** Findings for Tailwind classes (arbitrary values and palette classes); scale classes count as theme references. */\nexport function tailwindFindings(hits: TailwindHit[], offset: number, pos: (offset: number) => { line: number; column: number }, ds: DesignSystemIndex): { findings: StyleFinding[]; themeRefs: number } {\n const findings: StyleFinding[] = [];\n let themeRefs = 0;\n for (const h of hits) {\n if (h.kind === 'scale') {\n themeRefs++;\n continue;\n }\n if (h.kind === 'token') continue; // counted by the var() pass over every literal\n let cat = h.category!;\n const v = h.value!;\n const isColor = Boolean(parseCssColor(v));\n if (cat === 'color-or-size') cat = isColor ? 'color' : 'font-size';\n else if (cat === 'color-or-width') cat = isColor ? 'color' : 'border-width';\n else if (cat === 'color-or-shadow') cat = isColor ? 'color' : 'shadow';\n else if (cat === 'font') cat = /^\\d{3}$/.test(v) ? 'font-weight' : 'font-family';\n if (cat === 'color' && !isColor) continue;\n const suggestion = ds.suggest(cat as FindingCategory, v);\n const cap = h.kind === 'palette' && suggestion && suggestion.confidence > 0.6 ? { ...suggestion, confidence: 0.6, level: 'medium' as const } : suggestion;\n findings.push({ ...pos(offset + h.index), category: cat as FindingCategory, value: h.cls, source: 'tailwind', ...(cap ? { suggestion: cap } : {}) });\n }\n return { findings, themeRefs };\n}\n\nexport function scanCode(path: string, text: string, ds: DesignSystemIndex): CodeScan {\n const sf = ts.createSourceFile(path, text, ts.ScriptTarget.Latest, true, kindFor(path));\n const out: CodeScan = { findings: [], tokenUsages: 0, themeRefs: 0, ds: {}, components: [], definitions: [] };\n const handled = new Set<ts.Node>();\n const imports: ImportMap = new Map();\n const pos = (offset: number) => {\n const lc = sf.getLineAndCharacterOfPosition(offset);\n return { line: lc.line + 1, column: lc.character + 1 };\n };\n\n const addHit = (h: ValueHit, offset: number, source: FindingSource, property?: string) => {\n const suggestion = ds.suggest(h.category, h.text, property);\n out.findings.push({ ...pos(offset), category: h.category, ...(property ? { property } : {}), value: h.text, source, ...(suggestion ? { suggestion } : {}) });\n };\n\n const addTailwind = (hits: TailwindHit[], offset: number) => {\n const r = tailwindFindings(hits, offset, pos, ds);\n out.themeRefs += r.themeRefs;\n out.findings.push(...r.findings);\n };\n\n // A literal value in a style object: string, number, template parts, both branches of a condition.\n const styleValue = (key: string, node: ts.Expression, ctx: JsStyleContext) => {\n const source: FindingSource = ctx === 'sx' ? 'sx' : ctx === 'style' ? 'style' : ctx === 'theme' ? 'theme' : 'styled';\n if (ts.isParenthesizedExpression(node) || ts.isAsExpression(node) || ts.isSatisfiesExpression(node)) return styleValue(key, node.expression, ctx);\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n handled.add(node);\n const r = scanJsStyle(key, node.text, ctx);\n if (r.themeRef) out.themeRefs++;\n for (const h of r.hits) addHit(h, node.getStart(sf) + 1 + h.index, source, r.hits.length ? cssKey(key) : undefined);\n return;\n }\n if (ts.isNumericLiteral(node) || (ts.isPrefixUnaryExpression(node) && node.operator === ts.SyntaxKind.MinusToken && ts.isNumericLiteral(node.operand))) {\n const n = ts.isNumericLiteral(node) ? Number(node.text) : -Number((node.operand as ts.NumericLiteral).text);\n const r = scanJsStyle(key, n, ctx);\n if (r.themeRef) out.themeRefs++;\n for (const h of r.hits) addHit(h, node.getStart(sf), source, cssKey(key));\n return;\n }\n if (ts.isTemplateExpression(node)) {\n const parts: (ts.TemplateHead | ts.TemplateMiddle | ts.TemplateTail)[] = [node.head, ...node.templateSpans.map((s) => s.literal)];\n for (const p of parts) {\n handled.add(p);\n const r = scanJsStyle(key, p.text, ctx);\n for (const h of r.hits) addHit(h, p.getStart(sf) + 1 + h.index, source, cssKey(key));\n }\n node.templateSpans.forEach((s) => visit(s.expression, ctx, false));\n return;\n }\n if (ts.isConditionalExpression(node)) {\n visit(node.condition, null, false);\n styleValue(key, node.whenTrue, ctx);\n styleValue(key, node.whenFalse, ctx);\n return;\n }\n if (ts.isBinaryExpression(node) && [ts.SyntaxKind.BarBarToken, ts.SyntaxKind.QuestionQuestionToken, ts.SyntaxKind.AmpersandAmpersandToken].includes(node.operatorToken.kind)) {\n styleValue(key, node.left, ctx);\n styleValue(key, node.right, ctx);\n return;\n }\n visit(node, ctx, false);\n };\n const cssKey = (k: string) => k.replace(/^(Webkit|Moz|ms)(?=[A-Z])/, (p) => `-${p.toLowerCase()}`).replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\n const cssTemplate = (tpl: ts.TemplateLiteral) => {\n const start = tpl.getStart(sf) + 1;\n let body = text.slice(start, tpl.getEnd() - 1);\n // ${...} become spaces (keeping newlines) so offsets map back to the file.\n if (ts.isTemplateExpression(tpl)) for (const s of tpl.templateSpans) {\n const a = s.expression.getFullStart() - 2 - start;\n const b = s.literal.getStart(sf) + 1 - start;\n body = body.slice(0, a) + body.slice(a, b).replace(/[^\\n]/g, ' ') + body.slice(b);\n visit(s.expression, null, false);\n }\n const parts = ts.isTemplateExpression(tpl) ? [tpl.head, ...tpl.templateSpans.map((s) => s.literal)] : [tpl];\n parts.forEach((p) => handled.add(p));\n const scan = scanCssText(body, 'scss');\n for (const d of scan.decls) {\n if (d.scan.themeRef) out.themeRefs++;\n for (const h of d.scan.hits) addHit(h, start + d.valueStart + h.index, 'styled', d.property.toLowerCase());\n }\n for (const a of scan.applies) addTailwind(a.hits, start + a.start);\n };\n\n const lookalike = (list: string, offset: number) => {\n for (const l of lookalikesInClassList(list, ds.components)) out.components.push({ ...pos(offset), name: `.${l.token}`, kind: 'recreated', library: 'local', suggestion: l.component });\n };\n\n const classLiteral = (node: ts.Node) => {\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n handled.add(node);\n lookalike(node.text, node.getStart(sf) + 1);\n addTailwind(scanClassString(node.text), node.getStart(sf) + 1);\n } else if (ts.isTemplateExpression(node)) {\n for (const p of [node.head, ...node.templateSpans.map((s) => s.literal)]) {\n handled.add(p);\n lookalike(p.text, p.getStart(sf) + 1);\n addTailwind(scanClassString(p.text), p.getStart(sf) + 1);\n }\n node.templateSpans.forEach((s) => visit(s.expression, null, true));\n } else visit(node, null, true);\n };\n\n const jsxName = (n: ts.JsxTagNameExpression) => n.getText(sf);\n\n const element = (node: ts.JsxOpeningElement | ts.JsxSelfClosingElement) => {\n const name = jsxName(node.tagName);\n const typeAttr = node.attributes.properties.find((p): p is ts.JsxAttribute => ts.isJsxAttribute(p) && p.name.getText(sf) === 'type');\n const type = typeAttr?.initializer && ts.isStringLiteral(typeAttr.initializer) ? typeAttr.initializer.text : undefined;\n const hasHref = node.attributes.properties.some((p) => ts.isJsxAttribute(p) && p.name.getText(sf) === 'href');\n const r = classifyTag({ name, ...pos(node.getStart(sf)), ...(type !== undefined ? { type } : {}), hasHref, inRenderProp: isRenderElement(node) }, imports, ds);\n if (r.ds) out.ds[r.ds] = (out.ds[r.ds] ?? 0) + 1;\n if (r.component) out.components.push(r.component);\n if (r.localCandidate) pendingLocal.push(r.localCandidate);\n };\n const pendingLocal: ComponentFinding[] = [];\n\n function visit(node: ts.Node, ctx: JsStyleContext | null, classCtx: boolean): void {\n if (ts.isImportDeclaration(node)) {\n const mod = (node.moduleSpecifier as ts.StringLiteral).text;\n handled.add(node.moduleSpecifier);\n const c = node.importClause;\n if (c?.name) imports.set(c.name.text, { module: mod, imported: 'default' });\n if (c?.namedBindings && ts.isNamespaceImport(c.namedBindings)) imports.set(c.namedBindings.name.text, { module: mod, imported: '*' });\n if (c?.namedBindings && ts.isNamedImports(c.namedBindings)) for (const el of c.namedBindings.elements) imports.set(el.name.text, { module: mod, imported: (el.propertyName ?? el.name).text });\n return;\n }\n if ((ts.isExportDeclaration(node) && node.moduleSpecifier) || (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword)) {\n node.forEachChild((c) => handled.add(c));\n }\n if (ts.isFunctionDeclaration(node) && node.name && /^[A-Z]/.test(node.name.text)) out.definitions.push({ name: node.name.text, line: pos(node.getStart(sf)).line });\n if (ts.isClassDeclaration(node) && node.name && /^[A-Z]/.test(node.name.text)) out.definitions.push({ name: node.name.text, line: pos(node.getStart(sf)).line });\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)) {\n const name = node.name.text;\n const init = node.initializer;\n if (/^[A-Z]/.test(name) && init && (ts.isArrowFunction(init) || ts.isFunctionExpression(init) || (ts.isCallExpression(init) && /^(React\\.)?(forwardRef|memo)$/.test(init.expression.getText(sf)))))\n out.definitions.push({ name, line: pos(node.getStart(sf)).line });\n // const Root = styled(Card)(...): Root renders the imported component, same library.\n if (init && ts.isCallExpression(init) && ts.isCallExpression(init.expression) && init.expression.expression.getText(sf) === 'styled') {\n const base = init.expression.arguments[0];\n const from = base && ts.isIdentifier(base) ? imports.get(base.text) : undefined;\n if (from) imports.set(name, { ...from, imported: from.imported === 'default' || from.imported === '*' ? base!.getText(sf) : from.imported });\n }\n const declCtx = contextForDeclaration(name, node.type?.getText(sf) ?? '');\n if (declCtx && init) {\n visit(init, declCtx, classCtx);\n return;\n }\n }\n if (ts.isJsxAttribute(node)) {\n const name = node.name.getText(sf);\n const init = node.initializer;\n if (!init) return;\n const expr = ts.isJsxExpression(init) ? init.expression : init;\n if (!expr) return;\n if (/^(className|class|tw)$/.test(name)) return classLiteral(expr);\n if (name === 'style' || /Style$/.test(name)) return visit(expr, 'style', false);\n if (name === 'sx' || /Sx$/.test(name)) return visit(expr, 'sx', false);\n if (name === 'css') return visit(expr, 'style', false);\n if (ts.isStringLiteral(expr) && isColorLiteral(expr.text)) {\n handled.add(expr);\n addHit({ category: 'color', text: expr.text, index: 0 }, expr.getStart(sf) + 1, 'jsx-attr', name);\n return;\n }\n if (MUI_SPACING_ATTR.test(name) && ts.isNumericLiteral(expr)) {\n out.themeRefs++;\n return;\n }\n return visit(expr, ctx, classCtx);\n }\n if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) element(node);\n if (ts.isTaggedTemplateExpression(node) && CSS_TAGS.test(node.tag.getText(sf))) {\n cssTemplate(node.template);\n return;\n }\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {\n const imp = imports.get(node.expression.text);\n if (imp && imp.imported !== '*' && classifyModule(imp.module, ds.packages, ds.foreignLibraries) === 'ds') {\n const comp = domRendererComponent(imp.imported === 'default' ? node.expression.text : imp.imported, ds.components);\n if (comp) out.ds[comp] = (out.ds[comp] ?? 0) + 1;\n }\n }\n // el.className = 'pill is-pass': a class list set from a script.\n if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken && ts.isPropertyAccessExpression(node.left) && node.left.name.text === 'className') {\n visit(node.left, ctx, classCtx);\n return classLiteral(node.right);\n }\n if (ts.isCallExpression(node)) {\n const callee = node.expression.getText(sf);\n if (CLASS_FNS.test(callee)) {\n node.arguments.forEach((a) => visitClassArg(a));\n return;\n }\n const argCtx: JsStyleContext | null = /^styled(\\.|\\(|$)/.test(callee) || STYLE_FNS.test(callee) ? 'styled' : THEME_FNS.test(callee) ? 'theme' : null;\n if (argCtx) {\n visit(node.expression, ctx, classCtx);\n node.arguments.forEach((a) => visit(a, argCtx, false));\n return;\n }\n }\n if (ts.isPropertyAssignment(node)) {\n const key = keyName(node.name);\n if (key !== undefined) {\n if (key === 'className' || key === 'class') return classLiteral(node.initializer);\n if (key === 'sx' || key === 'style' || key === 'styleOverrides' || /Sx$/.test(key)) {\n return visit(node.initializer, key === 'style' ? 'style' : key === 'styleOverrides' ? 'styled' : 'sx', false);\n }\n if (ctx) {\n if (ts.isObjectLiteralExpression(node.initializer) || ts.isArrowFunction(node.initializer) || ts.isArrayLiteralExpression(node.initializer)) return visit(node.initializer, ctx, classCtx);\n return styleValue(key, node.initializer, ctx);\n }\n }\n }\n if (classCtx && (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node) || ts.isTemplateExpression(node))) return classLiteral(node);\n node.forEachChild((c) => visit(c, ctx, classCtx));\n }\n\n // cn(...), cva(...) arguments: strings, arrays, conditionals and the cva config object are class strings.\n const visitClassArg = (n: ts.Node): void => {\n if (ts.isStringLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n) || ts.isTemplateExpression(n)) return classLiteral(n);\n if (ts.isPropertyAssignment(n)) {\n if (ts.isStringLiteral(n.name)) {\n handled.add(n.name);\n addTailwind(scanClassString(n.name.text), n.name.getStart(sf) + 1);\n }\n return visitClassArg(n.initializer);\n }\n n.forEachChild(visitClassArg);\n };\n\n visit(sf, null, false);\n\n // Every remaining literal: DS token references, other CSS variables, color literals anywhere in code.\n const literal = (node: ts.Node) => {\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node) || ts.isTemplateHead(node) || ts.isTemplateMiddle(node) || ts.isTemplateTail(node)) {\n const t = (node as ts.LiteralLikeNode).text;\n // Markup built in strings (`<span class=\"pill\">`, `data-tip=\"...\"`): homemade look-alikes of DS components.\n if (!handled.has(node) && (t.includes('<') || ts.isTemplateMiddle(node) || ts.isTemplateTail(node))) {\n const base = node.getStart(sf) + 1;\n for (const m of t.matchAll(HTML_CLASS_RE)) for (const l of lookalikesInClassList(m[1]!, ds.components)) out.components.push({ ...pos(base + m.index!), name: `.${l.token}`, kind: 'recreated', library: 'local', suggestion: l.component });\n for (const m of t.matchAll(HTML_ATTR_RE)) {\n const component = LOOKALIKE_ATTRS[m[1]!];\n if (component && ds.components.has(component)) out.components.push({ ...pos(base + m.index! + 1), name: `[${m[1]}]`, kind: 'recreated', library: 'local', suggestion: component });\n }\n }\n for (const m of t.matchAll(/var\\(\\s*(--[\\w-]+)/g)) {\n if (ds.isDsVar(m[1]!)) out.tokenUsages++;\n else out.themeRefs++;\n }\n if (!handled.has(node) && ts.isStringLiteral(node) && isColorLiteral(t) && !ts.isImportDeclaration(node.parent) && !ts.isExternalModuleReference(node.parent)) {\n addHit({ category: 'color', text: t.trim(), index: 0 }, node.getStart(sf) + 1, 'js', ts.isPropertyAssignment(node.parent) ? keyName(node.parent.name) : undefined);\n }\n }\n node.forEachChild(literal);\n };\n literal(sf);\n out.themeRefs += [...text.matchAll(THEME_REF_RE)].length;\n\n // DS-named components defined in this file (hoisting: definitions may follow their use).\n const defined = new Set(out.definitions.map((d) => d.name));\n out.components.push(...pendingLocal.filter((f) => defined.has(f.suggestion!)));\n out.findings.sort((a, b) => a.line - b.line || a.column - b.column);\n out.components.sort((a, b) => a.line - b.line || a.column - b.column);\n return out;\n}\n","// Escape hatches that keep a known exception out of the counts without hiding it: a comment on the line above\n// (`bridge-audit-ignore-next-line: reason`, in any comment syntax) and an allowlist file of file:line entries.\n// Both need a reason, and both keep the ignored items in the report.\nimport { lineCol } from './css';\nimport type { AllowlistEntry, ComponentFinding, IgnoredItem, IgnoreVia, StyleFinding } from './types';\n\nexport const IGNORE_DIRECTIVE = 'bridge-audit-ignore-next-line';\n\nexport interface IgnoreDirective {\n /** Line of the comment (1-based). */\n line: number;\n /** Line it applies to: the one after the comment ends. */\n target: number;\n /** Empty when the comment gives none: such a comment ignores nothing. */\n reason: string;\n}\n\n/**\n * Every `bridge-audit-ignore-next-line` comment in a file: `<!-- ...: reason -->` (HTML, Astro, Vue, Svelte),\n * `{/* ...: reason *\\/}` (JSX, Astro expressions), `/* ...: reason *\\/` (CSS) and `// ...: reason` (scripts).\n * The text after the colon is the reason. A mention outside a comment is not a directive.\n */\nexport function ignoreDirectives(text: string): IgnoreDirective[] {\n const at = lineCol(text);\n const out: IgnoreDirective[] = [];\n for (const m of text.matchAll(new RegExp(`${IGNORE_DIRECTIVE}\\\\b`, 'g'))) {\n const start = m.index!;\n // Only white space between the comment opener and the directive (a block comment may open on the line above).\n const opener = /(<!--|\\/\\*|\\/\\/)(\\s*)$/.exec(text.slice(Math.max(0, start - 200), start));\n const open = opener?.[1];\n if (!open || (open === '//' && opener[2]!.includes('\\n'))) continue;\n const from = start + m[0].length;\n let end: number;\n if (open === '//') {\n end = text.indexOf('\\n', from);\n if (end < 0) end = text.length;\n } else {\n end = text.indexOf(open === '<!--' ? '-->' : '*/', from);\n if (end < 0) continue;\n }\n const reason = text.slice(from, end).replace(/^\\s*:?/, '').replace(/\\s+/g, ' ').trim();\n out.push({ line: at(start).line, target: at(end).line + 1, reason });\n }\n return out;\n}\n\nexport interface IgnoreResult {\n findings: StyleFinding[];\n components: ComponentFinding[];\n ignored: IgnoredItem[];\n}\n\nconst item = (x: StyleFinding | ComponentFinding, reason: string, via: IgnoreVia): IgnoredItem =>\n 'category' in x\n ? { line: x.line, column: x.column, kind: 'value', what: x.value, reason, via }\n : { line: x.line, column: x.column, kind: 'component', what: x.name, reason, via };\n\n/** Apply the file's ignore comments. Comments without a reason, or that match nothing, are reported as errors. */\nexport function applyIgnoreComments(text: string, findings: StyleFinding[], components: ComponentFinding[]): IgnoreResult & { errors: { line: number; message: string }[] } {\n const errors: { line: number; message: string }[] = [];\n const reasons = new Map<number, string>();\n for (const d of ignoreDirectives(text)) {\n if (!d.reason) {\n errors.push({ line: d.line, message: `${IGNORE_DIRECTIVE} needs a reason after a colon (${IGNORE_DIRECTIVE}: why this one stays); nothing was ignored` });\n continue;\n }\n if (!findings.some((f) => f.line === d.target) && !components.some((c) => c.line === d.target)) {\n errors.push({ line: d.line, message: `${IGNORE_DIRECTIVE} ignores nothing: line ${d.target} has no finding; remove the comment` });\n continue;\n }\n reasons.set(d.target, d.reason);\n }\n const ignored: IgnoredItem[] = [];\n const keep = <T extends StyleFinding | ComponentFinding>(xs: T[]) =>\n xs.filter((x) => {\n const r = reasons.get(x.line);\n if (r === undefined) return true;\n ignored.push(item(x, r, 'comment'));\n return false;\n });\n return { findings: keep(findings), components: keep(components), ignored, errors };\n}\n\n/** Apply allowlist entries for one file; returns what each entry matched (index in `entries`). */\nexport function applyAllowlist(entries: AllowlistEntry[], findings: StyleFinding[], components: ComponentFinding[]): IgnoreResult & { used: Set<number> } {\n const used = new Set<number>();\n const ignored: IgnoredItem[] = [];\n const keep = <T extends StyleFinding | ComponentFinding>(xs: T[]) =>\n xs.filter((x) => {\n const what = 'category' in x ? x.value : x.name;\n const fits = (e: AllowlistEntry) => e.line === x.line && (e.what === undefined || e.what === what);\n // One entry per item when the list has one per item (two links on a line); else one entry covers them all.\n let i = entries.findIndex((e, k) => fits(e) && !used.has(k));\n if (i < 0) i = entries.findIndex(fits);\n if (i < 0) return true;\n used.add(i);\n ignored.push(item(x, entries[i]!.reason, 'allowlist'));\n return false;\n });\n return { findings: keep(findings), components: keep(components), ignored, used };\n}\n\n/** Validate an allowlist file's JSON: `{ \"entries\": [{ \"file\", \"line\", \"what\"?, \"reason\" }] }`, a reason on each entry. */\nexport function parseAllowlist(json: unknown): AllowlistEntry[] {\n const fail = (msg: string): never => {\n throw new Error(`allowlist: ${msg}`);\n };\n if (!json || typeof json !== 'object' || !Array.isArray((json as { entries?: unknown }).entries)) fail('expected { \"entries\": [...] }');\n return ((json as { entries: unknown[] }).entries).map((e, i) => {\n const x = e as Partial<AllowlistEntry>;\n if (typeof x.file !== 'string' || !x.file) fail(`entry ${i} needs \"file\"`);\n if (typeof x.line !== 'number' || !Number.isInteger(x.line) || x.line < 1) fail(`entry ${i} (${x.file}) needs a \"line\" number`);\n if (typeof x.reason !== 'string' || !x.reason.trim()) fail(`entry ${i} (${x.file}:${x.line}) needs a \"reason\"`);\n if (x.what !== undefined && typeof x.what !== 'string') fail(`entry ${i} (${x.file}:${x.line}): \"what\" must be a string`);\n return { file: x.file!, line: x.line!, ...(x.what !== undefined ? { what: x.what } : {}), reason: x.reason!.trim() };\n });\n}\n","// Style sheets (CSS, SCSS, Less files and the <style> blocks of Astro, Vue and Svelte files): hardcoded values with\n// the closest token, DS token references, other theme references, and which literals the autofix may replace.\nimport { parseCssColor } from './color';\nimport { scanCssText } from './css';\nimport type { DesignSystemIndex } from './ds-index';\nimport type { FindingCategory, FindingSource, StyleFinding, TokenSuggestion } from './types';\n\n/** A literal the CSS autofix may replace: exact token value, same spelling for lengths and durations. */\nexport function isSafeFix(h: { category: FindingCategory; text: string }, s: TokenSuggestion | undefined): boolean {\n if (!s || s.level !== 'exact') return false;\n switch (h.category) {\n case 'color': {\n const a = parseCssColor(h.text);\n const b = parseCssColor(s.value);\n return Boolean(a && b && s.distance <= 0.5 && Math.abs(a.a - b.a) < 0.01);\n }\n case 'spacing':\n case 'size':\n case 'radius':\n case 'border-width':\n case 'font-size':\n case 'duration':\n case 'z-index':\n case 'font-weight':\n case 'line-height':\n return h.text.trim() === s.value.trim();\n case 'shadow':\n return s.distance === 0;\n default:\n return false;\n }\n}\n\nexport interface CssAudit {\n findings: StyleFinding[];\n tokenUsages: number;\n themeRefs: number;\n}\n\n/**\n * Audit style sheet text. `offset` places the text inside a larger file (a <style> block, a style attribute) and\n * `pos` maps a file offset to its line and column. `source` labels the findings (`css` for sheets, `style` for\n * style attributes); only `css` findings are marked for the autofix, which rewrites CSS files.\n */\nexport function auditCssText(\n text: string,\n lang: 'css' | 'scss' | 'less',\n ds: DesignSystemIndex,\n opts: { pos: (offset: number) => { line: number; column: number }; offset?: number; source?: FindingSource },\n): CssAudit {\n const base = opts.offset ?? 0;\n const source = opts.source ?? 'css';\n const at = (o: number) => opts.pos(base + o);\n const scan = scanCssText(text, lang);\n const findings: StyleFinding[] = [];\n let tokenUsages = 0;\n let themeRefs = 0;\n for (const d of scan.decls) {\n for (const v of d.scan.vars) ds.isDsVar(v) ? tokenUsages++ : themeRefs++;\n if (d.scan.themeRef) themeRefs++;\n else if (lang !== 'css' && !d.property.startsWith('$')) themeRefs += (d.value.match(/\\$[\\w-]+/g) ?? []).length;\n const property = d.property.toLowerCase();\n for (const h of d.scan.hits) {\n const suggestion = ds.suggest(h.category, h.text, property);\n const autofix = source === 'css' && isSafeFix(h, suggestion);\n findings.push({ ...at(d.valueStart + h.index), category: h.category, property, value: h.text, source, ...(suggestion ? { suggestion } : {}), ...(autofix ? { autofix: true } : {}) });\n }\n }\n for (const a of scan.applies) {\n for (const h of a.hits) {\n if (h.kind === 'scale') themeRefs++;\n else if (h.kind !== 'token' && h.value) {\n const cat: FindingCategory = parseCssColor(h.value) ? 'color' : h.category === 'color-or-size' ? 'font-size' : h.category === 'color-or-width' ? 'border-width' : h.category === 'color-or-shadow' ? 'shadow' : h.category === 'font' ? 'font-family' : (h.category as FindingCategory);\n const suggestion = ds.suggest(cat, h.value);\n findings.push({ ...at(a.start + h.index), category: cat, value: h.cls, source: 'tailwind', ...(suggestion ? { suggestion } : {}) });\n } else if (h.kind === 'token' && h.value) {\n const v = /var\\(\\s*(--[\\w-]+)/.exec(h.value)?.[1];\n if (v && ds.isDsVar(v)) tokenUsages++;\n else themeRefs++;\n }\n }\n }\n findings.sort((x, y) => x.line - y.line || x.column - y.column);\n return { findings, tokenUsages, themeRefs };\n}\n","// Astro, Vue and Svelte files: the frontmatter and <script> blocks go through the TS scanner, <style> blocks\n// through the style sheet audit, and the template markup is read here: DS components used as tags, native\n// elements a DS component should render, re-created DS components, style and class attributes, color attributes.\nimport { classifyTag, importsOf, LOOKALIKE_ATTRS, lookalikesInClassList, scanCode, tailwindFindings, type CodeScan, type ImportMap } from './code';\nimport { lineCol } from './css';\nimport type { DesignSystemIndex } from './ds-index';\nimport { isColorLiteral } from './scan-value';\nimport { auditCssText } from './style';\nimport { scanClassString } from './tailwind';\nimport type { ComponentFinding } from './types';\n\nexport type MarkupLang = 'astro' | 'vue' | 'svelte';\nexport const MARKUP_EXTENSIONS = ['.astro', '.vue', '.svelte'];\n\ninterface Range {\n start: number;\n end: number;\n}\ninterface Block extends Range {\n attrs: string;\n}\n\n/** Same length as `text`, with every character outside (or inside) the ranges blanked; newlines stay. */\nfunction mask(text: string, ranges: Range[], keepInside: boolean): string {\n const inside = new Uint8Array(text.length);\n for (const r of ranges) inside.fill(1, r.start, r.end);\n let out = '';\n for (let i = 0; i < text.length; i++) {\n const c = text[i]!;\n out += c === '\\n' || Boolean(inside[i]) === keepInside ? c : ' ';\n }\n return out;\n}\n\nconst attrOf = (attrs: string, name: string) => new RegExp(`(?:^|\\\\s)${name}\\\\s*=\\\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`, 'i').exec(attrs)?.slice(1).find((v) => v !== undefined);\n\n/** Script blocks that hold code (not JSON data or templates). */\nconst isCodeScript = (attrs: string) => {\n const type = attrOf(attrs, 'type')?.toLowerCase();\n return !type || ['module', 'text/javascript', 'application/javascript', 'text/typescript', 'ts', 'text/babel'].includes(type);\n};\n\n/** Frontmatter (Astro), script and style blocks, and the template ranges between them. */\nexport function markupBlocks(text: string, lang: MarkupLang): { frontmatter?: Range; scripts: Block[]; styles: Block[]; nonTemplate: Range[] } {\n const nonTemplate: Range[] = [];\n let frontmatter: Range | undefined;\n let from = 0;\n if (lang === 'astro') {\n const open = /^\\s*---[^\\S\\n]*\\n/.exec(text);\n if (open) {\n const close = /\\n---[^\\S\\n]*(\\n|$)/g;\n close.lastIndex = open[0].length - 1;\n const m = close.exec(text);\n if (m) {\n frontmatter = { start: open[0].length, end: m.index + 1 };\n from = m.index + m[0].length;\n nonTemplate.push({ start: 0, end: from });\n }\n }\n }\n const scripts: Block[] = [];\n const styles: Block[] = [];\n const re = /<(script|style)\\b((?:[^>\"']|\"[^\"]*\"|'[^']*')*)>([\\s\\S]*?)<\\/\\1\\s*>/gi;\n re.lastIndex = from;\n for (let m; (m = re.exec(text)); ) {\n const contentStart = m.index + m[0].indexOf('>', m[1]!.length + 1 + m[2]!.length) + 1;\n const block = { start: contentStart, end: contentStart + m[3]!.length, attrs: m[2]! };\n (m[1]!.toLowerCase() === 'script' ? scripts : styles).push(block);\n nonTemplate.push({ start: m.index, end: m.index + m[0].length });\n }\n for (const m of text.slice(from).matchAll(/<!--[\\s\\S]*?-->/g)) nonTemplate.push({ start: from + m.index!, end: from + m.index! + m[0].length });\n return { ...(frontmatter ? { frontmatter } : {}), scripts, styles, nonTemplate };\n}\n\n/** Index after the `}` that closes the `{` at `i` (strings, template literals and nesting included). */\nfunction closeBrace(s: string, i: number): number {\n let depth = 0;\n for (let k = i; k < s.length; k++) {\n const c = s[k]!;\n if (c === '{') depth++;\n else if (c === '}') {\n if (--depth === 0) return k + 1;\n } else if (c === '\"' || c === \"'\") {\n const e = s.indexOf(c, k + 1);\n if (e < 0) return s.length;\n k = e;\n } else if (c === '`') {\n for (k++; k < s.length && s[k] !== '`'; k++) {\n if (s[k] === '\\\\') k++;\n else if (s[k] === '$' && s[k + 1] === '{') k = closeBrace(s, k + 1) - 1;\n }\n }\n }\n return s.length;\n}\n\ninterface Attr {\n name: string;\n /** static: quoted or bare text; expr: a JS expression (`{...}` in Astro and Svelte, `:x=\"...\"` in Vue). */\n kind: 'static' | 'expr' | 'bare' | 'spread';\n value: string;\n valueStart: number;\n}\n\n/** Attributes of the tag whose name ends at `i`, up to its closing `>`. */\nfunction readTag(s: string, i: number, lang: MarkupLang): { attrs: Attr[]; end: number; selfClosing: boolean } {\n const attrs: Attr[] = [];\n let k = i;\n while (k < s.length) {\n while (k < s.length && /\\s/.test(s[k]!)) k++;\n const c = s[k];\n if (c === undefined) break;\n if (c === '>') return { attrs, end: k + 1, selfClosing: false };\n if (c === '/' && s[k + 1] === '>') return { attrs, end: k + 2, selfClosing: true };\n if (c === '{') {\n // `{...props}` spread or `{href}` shorthand.\n const e = closeBrace(s, k);\n const inner = s.slice(k + 1, e - 1).trim();\n attrs.push(inner.startsWith('...') ? { name: '', kind: 'spread', value: inner, valueStart: k + 1 } : { name: inner, kind: 'expr', value: inner, valueStart: k + 1 });\n k = e;\n continue;\n }\n const nm = /^[^\\s=>/\"'{]+/.exec(s.slice(k, k + 200));\n if (!nm) {\n k++;\n continue;\n }\n const name = nm[0];\n k += name.length;\n let j = k;\n while (j < s.length && /\\s/.test(s[j]!)) j++;\n if (s[j] !== '=') {\n attrs.push({ name, kind: 'bare', value: '', valueStart: k });\n continue;\n }\n j++;\n while (j < s.length && /\\s/.test(s[j]!)) j++;\n const q = s[j];\n const bound = lang === 'vue' && /^(:|v-bind:|v-on:|@|v-)/.test(name);\n if (q === '\"' || q === \"'\") {\n const e = s.indexOf(q, j + 1);\n const end = e < 0 ? s.length : e;\n attrs.push({ name, kind: bound ? 'expr' : 'static', value: s.slice(j + 1, end), valueStart: j + 1 });\n k = end + 1;\n } else if (q === '{') {\n const e = closeBrace(s, j);\n attrs.push({ name, kind: 'expr', value: s.slice(j + 1, e - 1), valueStart: j + 1 });\n k = e;\n } else {\n const m = /^[^\\s>]+/.exec(s.slice(j));\n const v = m?.[0].replace(/\\/$/, '') ?? '';\n attrs.push({ name, kind: 'static', value: v, valueStart: j });\n k = j + v.length;\n }\n }\n return { attrs, end: s.length, selfClosing: false };\n}\n\n/** `:href`, `v-bind:href`, `bind:value` -> `href`, `value`. */\nconst attrName = (n: string) => n.replace(/^(v-bind:|:|bind:)/, '');\nconst pascal = (kebab: string) => kebab.replace(/(^|-)([a-z0-9])/g, (_m, _d, c: string) => c.toUpperCase());\nconst NO_COLOR_ATTR_TAGS = new Set(['meta', 'link']);\n\n/** Audit an Astro, Vue or Svelte file. Line and column numbers are the file's own. */\nexport function scanMarkup(path: string, text: string, lang: MarkupLang, ds: DesignSystemIndex): CodeScan {\n const out: CodeScan = { findings: [], tokenUsages: 0, themeRefs: 0, ds: {}, components: [], definitions: [] };\n const pos = lineCol(text);\n const blocks = markupBlocks(text, lang);\n const imports: ImportMap = new Map();\n\n const merge = (c: CodeScan) => {\n out.findings.push(...c.findings);\n out.tokenUsages += c.tokenUsages;\n out.themeRefs += c.themeRefs;\n for (const [n, k] of Object.entries(c.ds)) out.ds[n] = (out.ds[n] ?? 0) + k;\n out.components.push(...c.components);\n out.definitions.push(...c.definitions);\n };\n\n // Frontmatter and scripts: the TS scanner on the file with everything else blanked, so positions stay put.\n const codeRanges = [...(blocks.frontmatter ? [{ ...blocks.frontmatter, attrs: '' }] : []), ...blocks.scripts.filter((b) => isCodeScript(b.attrs))];\n for (const r of codeRanges) {\n const jsx = /^(tsx|jsx)$/i.test(attrOf(r.attrs, 'lang') ?? '');\n const code = mask(text, [r], true);\n const file = `${path}.${jsx ? 'tsx' : 'ts'}`;\n merge(scanCode(file, code, ds));\n for (const [k, v] of importsOf(file, code)) imports.set(k, v);\n }\n\n for (const b of blocks.styles) {\n const l = (attrOf(b.attrs, 'lang') ?? 'css').toLowerCase();\n const r = auditCssText(text.slice(b.start, b.end), l === 'scss' || l === 'sass' ? 'scss' : l === 'less' ? 'less' : 'css', ds, { pos, offset: b.start });\n out.findings.push(...r.findings);\n out.tokenUsages += r.tokenUsages;\n out.themeRefs += r.themeRefs;\n }\n\n /** A JS expression from the template, scanned in place: a prefix line above it keeps its line and column. */\n const scanExpr = (prefix: string, expr: string, offset: number, suffix: string, keepLookalikes = false) => {\n const { line, column } = pos(offset);\n const src = line >= 2 ? `${'\\n'.repeat(line - 2)}${prefix}\\n${' '.repeat(column - 1)}${expr}${suffix}` : `${prefix}${expr}${suffix}`;\n const c = scanCode(`${path}.tsx`, src, ds);\n merge({ ...c, components: keepLookalikes ? c.components.filter((x) => x.kind === 'recreated' && x.name.startsWith('.')) : [], definitions: [], ds: {} });\n };\n\n const styleAttr = (a: Attr) => {\n if (a.kind === 'static') {\n const css = lang === 'svelte' ? a.value.replace(/\\{[^}]*\\}/g, (m) => ' '.repeat(m.length)) : a.value;\n const r = auditCssText(css, 'css', ds, { pos, offset: a.valueStart, source: 'style' });\n out.findings.push(...r.findings);\n out.tokenUsages += r.tokenUsages;\n out.themeRefs += r.themeRefs;\n return;\n }\n const str = /^(\\s*)([`'\"])([\\s\\S]*)\\2\\s*$/.exec(a.value);\n if (str) {\n // A string or template literal: its text is CSS; `${...}` parts are left out.\n const body = str[3]!.replace(/\\$\\{[^}]*\\}/g, (m) => ' '.repeat(m.length));\n const r = auditCssText(body, 'css', ds, { pos, offset: a.valueStart + str[1]!.length + 1, source: 'style' });\n out.findings.push(...r.findings);\n out.tokenUsages += r.tokenUsages;\n out.themeRefs += r.themeRefs;\n return;\n }\n scanExpr('const style: CSSProperties =', a.value, a.valueStart, ';');\n };\n\n // Template markup: the file with frontmatter, scripts, styles and comments blanked.\n const tpl = mask(text, blocks.nonTemplate, false);\n const pending: ComponentFinding[] = [];\n let noscript = 0;\n const TAG = /<(\\/?)([A-Za-z][\\w.:-]*)/g;\n for (let m; (m = TAG.exec(tpl)); ) {\n const raw = m[2]!;\n if (m[1]) {\n if (raw.toLowerCase() === 'noscript') noscript = Math.max(0, noscript - 1);\n continue;\n }\n const tag = readTag(tpl, m.index + m[0].length, lang);\n TAG.lastIndex = tag.end;\n const lower = raw.toLowerCase();\n if (lower === 'noscript' && !tag.selfClosing) {\n noscript++;\n continue;\n }\n const attrs = tag.attrs;\n const get = (n: string) => attrs.find((a) => attrName(a.name) === n);\n\n for (const a of attrs) {\n const n = attrName(a.name);\n if (n === 'style') styleAttr(a);\n else if (lang === 'svelte' && a.name.startsWith('style:') && a.kind === 'static') {\n const prop = a.name.slice(6).split('|')[0]!;\n const r = auditCssText(`${prop}:${a.value}`, 'css', ds, { pos, offset: a.valueStart - prop.length - 1, source: 'style' });\n out.findings.push(...r.findings);\n out.tokenUsages += r.tokenUsages;\n out.themeRefs += r.themeRefs;\n } else if (/^(class|className|class:list)$/.test(n)) {\n if (a.kind === 'static') {\n // Homemade look-alikes (`class=\"pill\"`, `class=\"tooltip\"`): the DS component they imitate.\n for (const l of lookalikesInClassList(a.value, ds.components)) out.components.push({ ...pos(a.valueStart), name: `.${l.token}`, kind: 'recreated', library: 'local', suggestion: l.component });\n const r = tailwindFindings(scanClassString(a.value), a.valueStart, pos, ds);\n out.findings.push(...r.findings);\n out.themeRefs += r.themeRefs;\n } else if (a.kind === 'expr') scanExpr('cn(', a.value, a.valueStart, ')', true);\n } else if (LOOKALIKE_ATTRS[n] && ds.components.has(LOOKALIKE_ATTRS[n]!)) {\n out.components.push({ ...pos(a.valueStart - a.name.length - 1), name: `[${n}]`, kind: 'recreated', library: 'local', suggestion: LOOKALIKE_ATTRS[n]! });\n } else if (a.kind === 'static' && !NO_COLOR_ATTR_TAGS.has(lower) && isColorLiteral(a.value)) {\n const suggestion = ds.suggest('color', a.value.trim(), n);\n out.findings.push({ ...pos(a.valueStart), category: 'color', property: n, value: a.value.trim(), source: 'jsx-attr', ...(suggestion ? { suggestion } : {}) });\n }\n }\n\n let name = raw;\n if (raw.includes(':')) continue; // svelte:head, Vue and Svelte directives as tags\n if (raw.includes('-')) {\n // Vue and Svelte may write imported components in kebab case; any other dashed tag is a custom element.\n if (!imports.has(pascal(raw))) continue;\n name = pascal(raw);\n }\n const isNative = /^[a-z]/.test(name) && !name.includes('.');\n if (isNative && noscript > 0) continue; // fallback markup for no-JS browsers\n const type = get('type');\n const r = classifyTag({ name, ...pos(m.index), ...(type?.kind === 'static' ? { type: type.value } : {}), hasHref: Boolean(get('href')) }, imports, ds);\n if (r.ds) out.ds[r.ds] = (out.ds[r.ds] ?? 0) + 1;\n if (r.component) out.components.push(r.component);\n if (r.localCandidate) pending.push(r.localCandidate);\n }\n\n // The file itself defines a component named after it (Button.vue, Card.astro).\n const base = /([^/]+)\\.(astro|vue|svelte)$/.exec(path)?.[1];\n if (base && /^[A-Z][A-Za-z0-9]*$/.test(base)) out.definitions.push({ name: base, line: 1 });\n const defined = new Set(out.definitions.map((d) => d.name));\n out.components.push(...pending.filter((f) => defined.has(f.suggestion!)));\n out.findings.sort((a, b) => a.line - b.line || a.column - b.column);\n out.components.sort((a, b) => a.line - b.line || a.column - b.column);\n return out;\n}\n","// Turns scanned files into the versioned audit report, compares it with a baseline, renders Markdown,\n// and plans the safe CSS autofix (exact token matches only).\nimport { scanCode } from './code';\nimport { lineCol, scanCssText } from './css';\nimport type { DesignSystemIndex } from './ds-index';\nimport { applyAllowlist, applyIgnoreComments } from './ignore';\nimport { MARKUP_EXTENSIONS, scanMarkup } from './markup';\nimport type { ValueHit } from './scan-value';\nimport { auditCssText, isSafeFix } from './style';\nimport {\n AUDIT_SCHEMA_VERSION,\n FINDING_CATEGORIES,\n type AuditReport,\n type BaselineDiff,\n type CategoryCount,\n type FileReport,\n type AllowlistEntry,\n type FindingCategory,\n type HistoryPoint,\n type IgnoredItem,\n type TopFix,\n} from './types';\n\nexport const AUDIT_EXTENSIONS = ['.css', '.scss', '.sass', '.less', '.tsx', '.jsx', '.ts', '.js', '.mjs', '.cjs', '.mts', '.cts', ...MARKUP_EXTENSIONS];\nexport const AUDIT_IGNORE_DIRS = ['node_modules', 'dist', 'build', 'out', 'coverage', '.git', '.next', '.nuxt', '.astro', '.turbo', '.cache', '.vercel', 'storybook-static', 'vendor', 'public'];\nconst IGNORE_FILE = /\\.d\\.[cm]?ts$|\\.(test|spec|stories|story)\\.[cm]?[jt]sx?$|\\.min\\.(css|js)$|(^|\\/)(vite|vitest|jest|webpack|rollup|eslint|postcss|tailwind|babel|next|astro|prettier|stylelint|tsup)\\.config\\.[cm]?[jt]s$/;\n\n/** Should the audit read this repo-relative path? */\nexport function isAuditable(path: string): boolean {\n if (!AUDIT_EXTENSIONS.some((e) => path.endsWith(e))) return false;\n if (IGNORE_FILE.test(path)) return false;\n return !path.split('/').some((seg) => AUDIT_IGNORE_DIRS.includes(seg));\n}\n\nconst langOf = (path: string): FileReport['lang'] => {\n const ext = path.slice(path.lastIndexOf('.') + 1);\n if (ext === 'css') return 'css';\n if (ext === 'scss' || ext === 'sass') return 'scss';\n if (ext === 'less') return 'less';\n if (ext === 'tsx') return 'tsx';\n if (ext === 'jsx') return 'jsx';\n if (/^[cm]?ts$/.test(ext)) return 'ts';\n if (ext === 'astro' || ext === 'vue' || ext === 'svelte') return ext;\n return 'js';\n};\n\nexport type AuditedFile = FileReport & { definitions: { name: string; line: number }[]; dsByName: Record<string, number> };\n\n/** Audit one file. `bridge-audit-ignore-next-line: reason` comments leave the next line's findings out of the counts. */\nexport function auditFile(path: string, text: string, ds: DesignSystemIndex): AuditedFile {\n const lang = langOf(path);\n if (lang === 'css' || lang === 'scss' || lang === 'less') {\n const r = auditCssText(text, lang, ds, { pos: lineCol(text) });\n return withIgnores(text, { path, lang, tokenUsages: r.tokenUsages, themeRefs: r.themeRefs, hardcoded: 0, dsComponents: 0, otherComponents: 0, findings: r.findings, components: [], definitions: [], dsByName: {} });\n }\n const c = lang === 'astro' || lang === 'vue' || lang === 'svelte' ? scanMarkup(path, text, lang, ds) : scanCode(path, text, ds);\n const dsCount = Object.values(c.ds).reduce((a, b) => a + b, 0);\n return withIgnores(text, { path, lang, tokenUsages: c.tokenUsages, themeRefs: c.themeRefs, hardcoded: 0, dsComponents: dsCount, otherComponents: 0, findings: c.findings, components: c.components, definitions: c.definitions, dsByName: c.ds });\n}\n\nfunction withIgnores(text: string, f: AuditedFile): AuditedFile {\n const r = applyIgnoreComments(text, f.findings, f.components);\n return {\n ...f,\n findings: r.findings,\n components: r.components,\n hardcoded: r.findings.length,\n otherComponents: r.components.length,\n ...(r.ignored.length ? { ignored: r.ignored } : {}),\n ...(r.errors.length ? { ignoreErrors: r.errors } : {}),\n };\n}\n\nconst pct = (num: number, den: number) => (den > 0 ? Math.round((num / den) * 1000) / 10 : null);\n\nexport interface AuditInput {\n files: { path: string; text: string }[];\n skipped?: number;\n target: string;\n label?: string;\n version?: string;\n generatedAt?: string;\n /** Known violations left out of the counts, each with a reason (an allowlist file, see parseAllowlist). */\n allowlist?: AllowlistEntry[];\n}\n\n/** Build the report for a set of files. */\nexport function buildAuditReport(input: AuditInput, ds: DesignSystemIndex): AuditReport {\n const allow = input.allowlist ?? [];\n const usedAllow = new Set<number>();\n const reports = input.files.map((f) => {\n const r = auditFile(f.path, f.text, ds);\n const idx = allow.flatMap((e, i) => (e.file === f.path ? [i] : []));\n if (!idx.length) return r;\n const a = applyAllowlist(idx.map((i) => allow[i]!), r.findings, r.components);\n a.used.forEach((k) => usedAllow.add(idx[k]!));\n if (!a.ignored.length) return r;\n const ignored = [...(r.ignored ?? []), ...a.ignored].sort((x, y) => x.line - y.line || x.column - y.column);\n return { ...r, findings: a.findings, components: a.components, hardcoded: a.findings.length, otherComponents: a.components.length, ignored };\n });\n const ignoredItems = reports.flatMap((r) => (r.ignored ?? []).map((x): IgnoredItem & { file: string } => ({ file: r.path, ...x })));\n const staleAllowlist = allow.filter((_e, i) => !usedAllow.has(i));\n const files: FileReport[] = reports.map(({ definitions: _d, dsByName: _n, ...r }) => r);\n const byCategory: Partial<Record<FindingCategory, CategoryCount>> = {};\n const fixes = new Map<string, TopFix & { fileSet: Set<string> }>();\n const components: AuditReport['components'] = { ds: {}, foreign: {}, native: {}, recreated: [] };\n let tokenUsages = 0;\n let hardcoded = 0;\n let themeRefs = 0;\n let dsInstances = 0;\n let uiInstances = 0;\n\n for (const r of reports) {\n tokenUsages += r.tokenUsages;\n hardcoded += r.hardcoded;\n themeRefs += r.themeRefs;\n dsInstances += r.dsComponents;\n uiInstances += r.dsComponents + r.otherComponents;\n for (const [n, k] of Object.entries(r.dsByName)) components.ds[n] = (components.ds[n] ?? 0) + k;\n for (const f of r.findings) {\n const c = (byCategory[f.category] ??= { hardcoded: 0, exact: 0, suggested: 0 });\n c.hardcoded++;\n if (f.suggestion) c.suggested++;\n if (f.suggestion?.level === 'exact') c.exact++;\n const key = `${f.category}|${f.value.toLowerCase()}|${f.suggestion?.token ?? ''}`;\n const fx = fixes.get(key) ?? { category: f.category, value: f.value, count: 0, files: 0, fileSet: new Set<string>(), ...(f.suggestion ? { suggestion: f.suggestion } : {}) };\n fx.count++;\n fx.fileSet.add(r.path);\n fixes.set(key, fx);\n }\n for (const comp of r.components) {\n if (comp.kind === 'native') components.native[comp.name] = (components.native[comp.name] ?? 0) + 1;\n else if (comp.kind === 'foreign') {\n const lib = (components.foreign[comp.library] ??= { instances: 0, components: {} });\n lib.instances++;\n lib.components[comp.name] = (lib.components[comp.name] ?? 0) + 1;\n }\n }\n }\n // Re-created DS components: local definitions named like a DS component (shadcn/ui files included).\n for (const r of reports) {\n for (const d of r.definitions) {\n if (!ds.components.has(d.name)) continue;\n const instances = reports.reduce((n, x) => n + x.components.filter((c) => (c.kind === 'recreated' || c.library === 'shadcn/ui (local)') && c.name.split('.')[0] === d.name).length, 0);\n components.recreated.push({ name: d.name, file: r.path, line: d.line, instances });\n }\n }\n const topFiles = files\n .filter((f) => f.hardcoded + f.otherComponents > 0)\n .sort((a, b) => b.hardcoded + b.otherComponents - (a.hardcoded + a.otherComponents) || a.path.localeCompare(b.path))\n .slice(0, 15)\n .map((f) => ({ path: f.path, hardcoded: f.hardcoded, otherComponents: f.otherComponents, tokenUsages: f.tokenUsages, dsComponents: f.dsComponents }));\n const topFixes = [...fixes.values()]\n .sort((a, b) => b.count - a.count || (b.suggestion?.confidence ?? 0) - (a.suggestion?.confidence ?? 0))\n .slice(0, 25)\n .map(({ fileSet, ...f }) => ({ ...f, files: fileSet.size }));\n return {\n $schema: 'https://raw.githubusercontent.com/peterbono/ai-design-system-demo/main/packages/core/audit-report.schema.json',\n schemaVersion: AUDIT_SCHEMA_VERSION,\n tool: { name: 'bridge', version: input.version ?? '0.1.0' },\n ...(input.label ? { label: input.label } : {}),\n generatedAt: input.generatedAt ?? new Date().toISOString(),\n target: { path: input.target, files: files.length, skipped: input.skipped ?? 0 },\n designSystem: { packages: ds.packages, components: ds.components.size, tokens: ds.tokenCount, modes: ds.modes },\n metrics: { tokenAdoption: pct(tokenUsages, tokenUsages + hardcoded), componentAdoption: pct(dsInstances, uiInstances), tokenUsages, hardcoded, themeRefs, dsComponentInstances: dsInstances, uiComponentInstances: uiInstances },\n byCategory: Object.fromEntries(FINDING_CATEGORIES.filter((c) => byCategory[c]).map((c) => [c, byCategory[c]!])),\n components: { ...components, recreated: components.recreated.sort((a, b) => b.instances - a.instances || a.name.localeCompare(b.name)) },\n topFiles,\n topFixes,\n files: files.sort((a, b) => a.path.localeCompare(b.path)),\n ...(ignoredItems.length || staleAllowlist.length\n ? {\n ignored: {\n total: ignoredItems.length,\n comment: ignoredItems.filter((x) => x.via === 'comment').length,\n allowlist: ignoredItems.filter((x) => x.via === 'allowlist').length,\n items: ignoredItems,\n staleAllowlist,\n },\n }\n : {}),\n history: [],\n };\n}\n\nconst delta = (a: number | null, b: number | null) => (a === null || b === null ? null : Math.round((b - a) * 10) / 10);\n\nexport function historyPoint(r: AuditReport): HistoryPoint {\n return {\n ...(r.label ? { label: r.label } : {}),\n generatedAt: r.generatedAt,\n tokenAdoption: r.metrics.tokenAdoption,\n componentAdoption: r.metrics.componentAdoption,\n hardcoded: r.metrics.hardcoded,\n uiComponentInstances: r.metrics.uiComponentInstances,\n dsComponentInstances: r.metrics.dsComponentInstances,\n };\n}\n\n/** Compare with an earlier report of the same codebase: progress, per category and per file. */\nexport function compareWithBaseline(report: AuditReport, baseline: AuditReport): AuditReport {\n if (baseline.schemaVersion !== AUDIT_SCHEMA_VERSION) throw new Error(`baseline schemaVersion ${String(baseline.schemaVersion)} is not supported (expected ${AUDIT_SCHEMA_VERSION})`);\n const before = new Map(baseline.files.map((f) => [f.path, f.hardcoded + f.otherComponents]));\n const after = new Map(report.files.map((f) => [f.path, f.hardcoded + f.otherComponents]));\n const byCategory: BaselineDiff['byCategory'] = {};\n for (const c of FINDING_CATEGORIES) {\n const b = baseline.byCategory[c]?.hardcoded ?? 0;\n const a = report.byCategory[c]?.hardcoded ?? 0;\n if (a || b) byCategory[c] = { before: b, after: a, delta: a - b };\n }\n const improved: BaselineDiff['improved'] = [];\n const regressed: BaselineDiff['regressed'] = [];\n for (const [path, a] of after) {\n const b = before.get(path);\n if (b === undefined) continue;\n if (a < b) improved.push({ path, before: b, after: a });\n else if (a > b) regressed.push({ path, before: b, after: a });\n }\n const diff: BaselineDiff = {\n ...(baseline.label ? { label: baseline.label } : {}),\n generatedAt: baseline.generatedAt,\n tokenAdoption: { before: baseline.metrics.tokenAdoption, after: report.metrics.tokenAdoption, delta: delta(baseline.metrics.tokenAdoption, report.metrics.tokenAdoption) },\n componentAdoption: { before: baseline.metrics.componentAdoption, after: report.metrics.componentAdoption, delta: delta(baseline.metrics.componentAdoption, report.metrics.componentAdoption) },\n hardcoded: { before: baseline.metrics.hardcoded, after: report.metrics.hardcoded, delta: report.metrics.hardcoded - baseline.metrics.hardcoded },\n byCategory,\n improved: improved.sort((x, y) => y.before - y.after - (x.before - x.after)),\n regressed: regressed.sort((x, y) => y.after - y.before - (x.after - x.before)),\n newFiles: [...after.keys()].filter((p) => !before.has(p)).sort(),\n removedFiles: [...before.keys()].filter((p) => !after.has(p)).sort(),\n };\n return { ...report, baseline: diff, history: [...(baseline.history ?? []), historyPoint(baseline)] };\n}\n\nconst fmtPct = (n: number | null) => (n === null ? 'n/a' : `${n}%`);\nconst fmtDelta = (n: number | null) => (n === null ? '' : ` (${n > 0 ? '+' : ''}${n} pts)`);\nconst esc = (s: string) => s.replace(/\\|/g, '\\\\|').replace(/`/g, \"'\");\n\n/** Short Markdown summary for a PR comment or a CI job summary. */\nexport function auditMarkdown(r: AuditReport, opts: { topFiles?: number; topFixes?: number; ignored?: number } = {}): string {\n const m = r.metrics;\n const b = r.baseline;\n const lines = [\n `## Design system adoption${r.label ? `: ${r.label}` : ''}`,\n '',\n `Audited ${r.target.files} files in \\`${r.target.path}\\` against ${r.designSystem.tokens} tokens and ${r.designSystem.components} components (${r.designSystem.packages.join(', ') || 'no DS package configured'}).`,\n '',\n '| Metric | Value |',\n '| --- | --- |',\n `| Token adoption | **${fmtPct(m.tokenAdoption)}**${fmtDelta(b?.tokenAdoption.delta ?? null)} |`,\n `| Component adoption | **${fmtPct(m.componentAdoption)}**${fmtDelta(b?.componentAdoption.delta ?? null)} |`,\n `| Token references | ${m.tokenUsages} |`,\n `| Hardcoded values | ${m.hardcoded}${b ? ` (${b.hardcoded.delta > 0 ? '+' : ''}${b.hardcoded.delta})` : ''} |`,\n `| Other theme references | ${m.themeRefs} |`,\n `| DS component instances | ${m.dsComponentInstances} of ${m.uiComponentInstances} |`,\n '',\n ];\n const cats = FINDING_CATEGORIES.filter((c) => r.byCategory[c]);\n if (cats.length) {\n lines.push('### Hardcoded values by category', '', '| Category | Hardcoded | Exact token | Suggested |', '| --- | ---: | ---: | ---: |');\n for (const c of cats) {\n const x = r.byCategory[c]!;\n lines.push(`| ${c} | ${x.hardcoded} | ${x.exact} | ${x.suggested} |`);\n }\n lines.push('');\n }\n const foreign = Object.entries(r.components.foreign).sort((a, b) => b[1].instances - a[1].instances);\n const native = Object.entries(r.components.native).sort((a, b) => b[1] - a[1]);\n if (foreign.length || native.length || r.components.recreated.length) {\n lines.push('### Components', '');\n for (const [lib, x] of foreign) {\n const top = Object.entries(x.components).sort((a, b) => b[1] - a[1]).slice(0, 6).map(([n, k]) => `${n} ${k}`).join(', ');\n lines.push(`- **${lib}**: ${x.instances} instances (${top})`);\n }\n if (native.length) lines.push(`- **Native elements**: ${native.map(([n, k]) => `<${n}> ${k}`).join(', ')}`);\n if (r.components.recreated.length) lines.push(`- **Re-created DS components**: ${r.components.recreated.map((x) => `${x.name} (${x.file}:${x.line})`).join(', ')}`);\n const dsUsed = Object.entries(r.components.ds).sort((a, b) => b[1] - a[1]);\n if (dsUsed.length) lines.push(`- **DS components used**: ${dsUsed.map(([n, k]) => `${n} ${k}`).join(', ')}`);\n lines.push('');\n }\n const files = r.topFiles.slice(0, opts.topFiles ?? 10);\n if (files.length) {\n lines.push('### Top files to migrate', '', '| File | Hardcoded | Non-DS components | Token refs |', '| --- | ---: | ---: | ---: |');\n for (const f of files) lines.push(`| \\`${esc(f.path)}\\` | ${f.hardcoded} | ${f.otherComponents} | ${f.tokenUsages} |`);\n lines.push('');\n }\n const fixes = r.topFixes.filter((f) => f.suggestion).slice(0, opts.topFixes ?? 10);\n if (fixes.length) {\n lines.push('### Top fixes', '', '| Value | Use | Confidence | Count |', '| --- | --- | --- | ---: |');\n for (const f of fixes) lines.push(`| \\`${esc(f.value)}\\` (${f.category}) | \\`var(${f.suggestion!.cssVar})\\` ${esc(f.suggestion!.value)}${f.suggestion!.mode ? ` [${f.suggestion!.mode}]` : ''} | ${f.suggestion!.level} | ${f.count} |`);\n lines.push('');\n }\n const ig = r.ignored;\n if (ig && (ig.total || ig.staleAllowlist.length)) {\n lines.push('### Ignored on purpose', '', `${ig.total} item(s) left out of the counts: ${ig.comment} by \\`bridge-audit-ignore-next-line\\` comments, ${ig.allowlist} by the allowlist.`, '');\n const shown = ig.items.slice(0, opts.ignored ?? 50);\n if (shown.length) {\n lines.push('| Where | What | Reason |', '| --- | --- | --- |');\n for (const x of shown) lines.push(`| \\`${esc(x.file)}:${x.line}\\` | \\`${esc(x.what)}\\` | ${esc(x.reason)} (${x.via}) |`);\n if (ig.items.length > shown.length) lines.push(`| ... | ${ig.items.length - shown.length} more | |`);\n lines.push('');\n }\n if (ig.staleAllowlist.length) {\n lines.push(`Allowlist entries that match nothing any more (remove them): ${ig.staleAllowlist.map((e) => `\\`${esc(e.file)}:${e.line}${e.what ? ` ${esc(e.what)}` : ''}\\``).join(', ')}.`, '');\n }\n }\n if (b) {\n lines.push(`### Progress since ${b.label ?? b.generatedAt}`, '');\n lines.push(`- ${b.improved.length} files improved, ${b.regressed.length} regressed, ${b.newFiles.length} new, ${b.removedFiles.length} removed.`);\n for (const f of b.regressed.slice(0, 5)) lines.push(`- Regressed: \\`${esc(f.path)}\\` ${f.before} -> ${f.after}`);\n lines.push('');\n }\n return lines.join('\\n');\n}\n\nexport interface CssFixEdit {\n line: number;\n column: number;\n from: string;\n to: string;\n token: string;\n}\n\n/** Safe autofix for a CSS/SCSS/Less file: exact token matches become var(--token). Returns the edits and the new text. */\nexport function planCssFixes(text: string, lang: 'css' | 'scss' | 'less', ds: DesignSystemIndex): { edits: CssFixEdit[]; output: string } {\n const at = lineCol(text);\n const scan = scanCssText(text, lang);\n const edits: (CssFixEdit & { start: number; end: number })[] = [];\n for (const d of scan.decls) {\n const property = d.property.toLowerCase();\n // A shadow is one value; other categories replace the literal inside the value.\n for (const h of d.scan.hits as ValueHit[]) {\n const s = ds.suggest(h.category, h.text, property);\n if (!isSafeFix(h, s)) continue;\n const start = d.valueStart + h.index;\n edits.push({ ...at(start), start, end: start + h.text.length, from: h.text, to: `var(${s!.cssVar})`, token: s!.token });\n }\n }\n let output = text;\n for (const e of [...edits].sort((a, b) => b.start - a.start)) output = output.slice(0, e.start) + e.to + output.slice(e.end);\n return { edits: edits.map(({ start: _s, end: _e, ...e }) => e), output };\n}\n"],"names":["r","g","b","SHADCN_RE","mask","pascal","num"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"report-DCPfvvoq.js","sources":["../src/audit/types.ts","../src/audit/color.ts","../src/audit/tailwind.ts","../src/audit/scan-value.ts","../src/audit/css.ts","../src/audit/components.ts","../src/audit/ds-index.ts","../src/audit/code.ts","../src/audit/ignore.ts","../src/audit/style.ts","../src/audit/markup.ts","../src/audit/report.ts"],"sourcesContent":["// Types of the `bridge audit` report: design-system adoption and drift in a product codebase.\n// The JSON report is versioned (`schemaVersion`); packages/core/audit-report.schema.json describes it.\n\nexport const AUDIT_SCHEMA_VERSION = 1;\n\n/** What a hardcoded value stands for. */\nexport type FindingCategory =\n | 'color'\n | 'spacing'\n | 'size'\n | 'radius'\n | 'border-width'\n | 'shadow'\n | 'duration'\n | 'easing'\n | 'z-index'\n | 'font-family'\n | 'font-size'\n | 'font-weight'\n | 'line-height';\n\nexport const FINDING_CATEGORIES: FindingCategory[] = ['color', 'spacing', 'size', 'radius', 'border-width', 'shadow', 'duration', 'easing', 'z-index', 'font-family', 'font-size', 'font-weight', 'line-height'];\n\n/** Where a value was written. */\nexport type FindingSource = 'css' | 'style' | 'sx' | 'styled' | 'theme' | 'tailwind' | 'jsx-attr' | 'js';\n\nexport type Confidence = 'exact' | 'high' | 'medium' | 'low';\n\nexport interface TokenSuggestion {\n /** Token path, e.g. color.text.muted. */\n token: string;\n /** CSS variable, e.g. --color-text-muted. */\n cssVar: string;\n /** Resolved token value in the mode it matched. */\n value: string;\n /** Mode combination the value matched in (colors), e.g. \"theme=dark\". Absent for the default mode. */\n mode?: string;\n /** deltaE OK x 100 for colors, px for lengths, ms for durations, steps otherwise. 0 = exact. */\n distance: number;\n /** 0..1 */\n confidence: number;\n level: Confidence;\n}\n\nexport interface StyleFinding {\n line: number;\n column: number;\n category: FindingCategory;\n /** CSS property (kebab-case) or object key the value belongs to. */\n property?: string;\n /** The literal as written: \"#1976d2\", \"13px\", \"p-[13px]\". */\n value: string;\n source: FindingSource;\n suggestion?: TokenSuggestion;\n /** `bridge audit --fix` can replace it (exact token match in a CSS file). */\n autofix?: boolean;\n}\n\nexport type ComponentKind = 'ds' | 'foreign' | 'native' | 'recreated';\n\nexport interface ComponentFinding {\n line: number;\n column: number;\n /** JSX name as written: Button, Card.Header, button. */\n name: string;\n kind: Exclude<ComponentKind, 'ds'>;\n /** Package or origin: @mui/material, react-admin, shadcn/ui (local), native, local. */\n library: string;\n /** DS component to use instead, when one fits. */\n suggestion?: string;\n}\n\nexport interface FileReport {\n /** Path relative to the audited root, with forward slashes. */\n path: string;\n lang: 'css' | 'scss' | 'less' | 'tsx' | 'jsx' | 'ts' | 'js' | 'astro' | 'vue' | 'svelte';\n tokenUsages: number;\n /** References to another theme (MUI theme, Tailwind scale classes): not hardcoded, not the DS either. */\n themeRefs: number;\n hardcoded: number;\n dsComponents: number;\n /** Foreign, native and re-created component instances. */\n otherComponents: number;\n findings: StyleFinding[];\n components: ComponentFinding[];\n /** Findings and components left out of the counts on purpose, each with its reason. */\n ignored?: IgnoredItem[];\n /** `bridge-audit-ignore-next-line` comments that ignored nothing because they give no reason. */\n ignoreErrors?: { line: number; message: string }[];\n}\n\n/** Where an ignore comes from: an escape-hatch comment in the file, or an entry of the allowlist file. */\nexport type IgnoreVia = 'comment' | 'allowlist';\n\n/** A finding or component the audit saw but does not count, kept in the report so it stays visible. */\nexport interface IgnoredItem {\n line: number;\n column: number;\n kind: 'value' | 'component';\n /** The value as written (\"13px\") or the element or component name (\"select\"). */\n what: string;\n reason: string;\n via: IgnoreVia;\n}\n\n/** One entry of an allowlist file: a known violation, left out of the counts for a stated reason. */\nexport interface AllowlistEntry {\n /** Path relative to the audited folder, as in the report. */\n file: string;\n line: number;\n /** Element, component or value on that line (\"select\", \"13px\"). Absent: everything on the line. */\n what?: string;\n reason: string;\n}\n\nexport interface CategoryCount {\n hardcoded: number;\n /** Findings whose value equals a token (safe to replace). */\n exact: number;\n /** Findings with a token suggestion of any confidence. */\n suggested: number;\n}\n\nexport interface TopFix {\n category: FindingCategory;\n value: string;\n count: number;\n files: number;\n suggestion?: TokenSuggestion;\n}\n\nexport interface AuditMetrics {\n /** token usages / (token usages + hardcoded), in percent, one decimal. Null when the code has no style value at all. */\n tokenAdoption: number | null;\n /** DS component instances / all UI component instances, in percent, one decimal. Null without UI components. */\n componentAdoption: number | null;\n tokenUsages: number;\n hardcoded: number;\n themeRefs: number;\n dsComponentInstances: number;\n uiComponentInstances: number;\n}\n\nexport interface HistoryPoint {\n label?: string;\n generatedAt: string;\n tokenAdoption: number | null;\n componentAdoption: number | null;\n hardcoded: number;\n uiComponentInstances: number;\n dsComponentInstances: number;\n}\n\nexport interface BaselineDiff {\n label?: string;\n generatedAt: string;\n tokenAdoption: { before: number | null; after: number | null; delta: number | null };\n componentAdoption: { before: number | null; after: number | null; delta: number | null };\n hardcoded: { before: number; after: number; delta: number };\n byCategory: Partial<Record<FindingCategory, { before: number; after: number; delta: number }>>;\n /** Files with fewer hardcoded values or non-DS components than in the baseline. */\n improved: { path: string; before: number; after: number }[];\n regressed: { path: string; before: number; after: number }[];\n newFiles: string[];\n removedFiles: string[];\n}\n\nexport interface AuditReport {\n $schema?: string;\n schemaVersion: typeof AUDIT_SCHEMA_VERSION;\n tool: { name: 'bridge'; version: string };\n label?: string;\n generatedAt: string;\n target: { path: string; files: number; skipped: number };\n designSystem: { packages: string[]; components: number; tokens: number; modes: string[] };\n metrics: AuditMetrics;\n byCategory: Partial<Record<FindingCategory, CategoryCount>>;\n components: {\n ds: Record<string, number>;\n foreign: Record<string, { instances: number; components: Record<string, number> }>;\n native: Record<string, number>;\n recreated: { name: string; file: string; line: number; instances: number }[];\n };\n topFiles: { path: string; hardcoded: number; otherComponents: number; tokenUsages: number; dsComponents: number }[];\n topFixes: TopFix[];\n files: FileReport[];\n baseline?: BaselineDiff;\n /** What was left out of the counts on purpose (escape-hatch comments, allowlist), and allowlist entries that match nothing. */\n ignored?: {\n total: number;\n comment: number;\n allowlist: number;\n items: (IgnoredItem & { file: string })[];\n staleAllowlist: AllowlistEntry[];\n };\n /** Earlier runs, oldest first (carried over from the baseline). */\n history: HistoryPoint[];\n}\n","// CSS color parsing (hex, rgb, hsl, named) and perceptual distance in OKLab.\nimport { hexToRgba, type Rgba } from '../values';\n\n/** CSS named colors (CSS Color 4). `transparent` and `currentcolor` are not values to tokenize. */\nexport const NAMED_COLORS: Record<string, string> = {\n aliceblue: '#f0f8ff', antiquewhite: '#faebd7', aqua: '#00ffff', aquamarine: '#7fffd4', azure: '#f0ffff', beige: '#f5f5dc', bisque: '#ffe4c4',\n black: '#000000', blanchedalmond: '#ffebcd', blue: '#0000ff', blueviolet: '#8a2be2', brown: '#a52a2a', burlywood: '#deb887', cadetblue: '#5f9ea0',\n chartreuse: '#7fff00', chocolate: '#d2691e', coral: '#ff7f50', cornflowerblue: '#6495ed', cornsilk: '#fff8dc', crimson: '#dc143c', cyan: '#00ffff',\n darkblue: '#00008b', darkcyan: '#008b8b', darkgoldenrod: '#b8860b', darkgray: '#a9a9a9', darkgreen: '#006400', darkgrey: '#a9a9a9', darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b', darkolivegreen: '#556b2f', darkorange: '#ff8c00', darkorchid: '#9932cc', darkred: '#8b0000', darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f', darkslateblue: '#483d8b', darkslategray: '#2f4f4f', darkslategrey: '#2f4f4f', darkturquoise: '#00ced1', darkviolet: '#9400d3',\n deeppink: '#ff1493', deepskyblue: '#00bfff', dimgray: '#696969', dimgrey: '#696969', dodgerblue: '#1e90ff', firebrick: '#b22222', floralwhite: '#fffaf0',\n forestgreen: '#228b22', fuchsia: '#ff00ff', gainsboro: '#dcdcdc', ghostwhite: '#f8f8ff', gold: '#ffd700', goldenrod: '#daa520', gray: '#808080',\n green: '#008000', greenyellow: '#adff2f', grey: '#808080', honeydew: '#f0fff0', hotpink: '#ff69b4', indianred: '#cd5c5c', indigo: '#4b0082',\n ivory: '#fffff0', khaki: '#f0e68c', lavender: '#e6e6fa', lavenderblush: '#fff0f5', lawngreen: '#7cfc00', lemonchiffon: '#fffacd', lightblue: '#add8e6',\n lightcoral: '#f08080', lightcyan: '#e0ffff', lightgoldenrodyellow: '#fafad2', lightgray: '#d3d3d3', lightgreen: '#90ee90', lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1', lightsalmon: '#ffa07a', lightseagreen: '#20b2aa', lightskyblue: '#87cefa', lightslategray: '#778899', lightslategrey: '#778899',\n lightsteelblue: '#b0c4de', lightyellow: '#ffffe0', lime: '#00ff00', limegreen: '#32cd32', linen: '#faf0e6', magenta: '#ff00ff', maroon: '#800000',\n mediumaquamarine: '#66cdaa', mediumblue: '#0000cd', mediumorchid: '#ba55d3', mediumpurple: '#9370db', mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee', mediumspringgreen: '#00fa9a', mediumturquoise: '#48d1cc', mediumvioletred: '#c71585', midnightblue: '#191970',\n mintcream: '#f5fffa', mistyrose: '#ffe4e1', moccasin: '#ffe4b5', navajowhite: '#ffdead', navy: '#000080', oldlace: '#fdf5e6', olive: '#808000',\n olivedrab: '#6b8e23', orange: '#ffa500', orangered: '#ff4500', orchid: '#da70d6', palegoldenrod: '#eee8aa', palegreen: '#98fb98',\n paleturquoise: '#afeeee', palevioletred: '#db7093', papayawhip: '#ffefd5', peachpuff: '#ffdab9', peru: '#cd853f', pink: '#ffc0cb', plum: '#dda0dd',\n powderblue: '#b0e0e6', purple: '#800080', rebeccapurple: '#663399', red: '#ff0000', rosybrown: '#bc8f8f', royalblue: '#4169e1', saddlebrown: '#8b4513',\n salmon: '#fa8072', sandybrown: '#f4a460', seagreen: '#2e8b57', seashell: '#fff5ee', sienna: '#a0522d', silver: '#c0c0c0', skyblue: '#87ceeb',\n slateblue: '#6a5acd', slategray: '#708090', slategrey: '#708090', snow: '#fffafa', springgreen: '#00ff7f', steelblue: '#4682b4', tan: '#d2b48c',\n teal: '#008080', thistle: '#d8bfd8', tomato: '#ff6347', turquoise: '#40e0d0', violet: '#ee82ee', wheat: '#f5deb3', white: '#ffffff',\n whitesmoke: '#f5f5f5', yellow: '#ffff00', yellowgreen: '#9acd32',\n};\n\nconst num = (s: string, scale: number) => (s.endsWith('%') ? (parseFloat(s) / 100) * scale : parseFloat(s));\n\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n const hh = (((h % 360) + 360) % 360) / 360;\n if (s === 0) return [l, l, l];\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const f = (t: number) => {\n let x = t;\n if (x < 0) x += 1;\n if (x > 1) x -= 1;\n if (x < 1 / 6) return p + (q - p) * 6 * x;\n if (x < 1 / 2) return q;\n if (x < 2 / 3) return p + (q - p) * (2 / 3 - x) * 6;\n return p;\n };\n return [f(hh + 1 / 3), f(hh), f(hh - 1 / 3)];\n}\n\n/** Parse a CSS color: #rgb[a], #rrggbb[aa], rgb()/rgba(), hsl()/hsla(), a named color, or bare HSL channels (\"222 47% 11%\", shadcn style). */\nexport function parseCssColor(input: string): Rgba | undefined {\n const s = input.trim().toLowerCase();\n if (s.startsWith('#')) return hexToRgba(s);\n if (NAMED_COLORS[s]) return hexToRgba(NAMED_COLORS[s]!);\n const fn = /^(rgba?|hsla?)\\(\\s*([^)]*)\\)$/.exec(s);\n const bare = /^(-?[\\d.]+)(deg)?\\s+([\\d.]+)%\\s+([\\d.]+)%(\\s*\\/\\s*([\\d.]+%?))?$/.exec(s);\n if (bare) {\n const [r, g, b] = hslToRgb(parseFloat(bare[1]!), parseFloat(bare[3]!) / 100, parseFloat(bare[4]!) / 100);\n return { r, g, b, a: bare[6] ? num(bare[6], 1) : 1 };\n }\n if (!fn) return undefined;\n const parts = fn[2]!.split(/[\\s,/]+/).filter(Boolean);\n if (parts.length < 3 || parts.some((p) => !/^-?[\\d.]+(%|deg)?$/.test(p))) return undefined;\n const alpha = parts[3] !== undefined ? num(parts[3], 1) : 1;\n if (fn[1]!.startsWith('rgb')) {\n const [r, g, b] = parts.slice(0, 3).map((p) => num(p, 255) / 255) as [number, number, number];\n return { r, g, b, a: alpha };\n }\n const [r, g, b] = hslToRgb(parseFloat(parts[0]!), num(parts[1]!, 1), num(parts[2]!, 1));\n return { r, g, b, a: alpha };\n}\n\nconst lin = (c: number) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);\n\n/** sRGB (0..1) to OKLab (Björn Ottosson). */\nexport function toOklab(c: Rgba): { L: number; a: number; b: number } {\n const r = lin(c.r);\n const g = lin(c.g);\n const b = lin(c.b);\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return {\n L: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n };\n}\n\n/**\n * Perceptual distance: Euclidean deltaE in OKLab, x100 (about 2 is a just noticeable difference).\n * Alpha counts too: a fully transparent difference adds 50.\n */\nexport function deltaE(x: Rgba, y: Rgba): number {\n const p = toOklab(x);\n const q = toOklab(y);\n return Math.hypot(p.L - q.L, p.a - q.a, p.b - q.b) * 100 + Math.abs(x.a - y.a) * 50;\n}\n\n/** Hex and color functions in a CSS value. Named colors are matched separately (they need a color property). */\nexport const COLOR_LITERAL_RE = /#(?:[0-9a-fA-F]{8}|[0-9a-fA-F]{6}|[0-9a-fA-F]{3,4})\\b|\\b(?:rgba?|hsla?)\\([^()]*\\)/g;\n","// Tailwind class strings: arbitrary values (`text-[#123456]`, `p-[13px]`), default palette classes (`bg-blue-500`)\n// and scale classes (`p-4`, `rounded-lg`), which reference Tailwind's own scale rather than the design system.\nimport type { FindingCategory } from './types';\n\n/** Tailwind v3 default palette (50..950). Used to suggest the nearest DS token for `bg-blue-500`-style classes. */\nconst PALETTE_ROWS: Record<string, string> = {\n slate: 'f8fafc f1f5f9 e2e8f0 cbd5e1 94a3b8 64748b 475569 334155 1e293b 0f172a 020617',\n gray: 'f9fafb f3f4f6 e5e7eb d1d5db 9ca3af 6b7280 4b5563 374151 1f2937 111827 030712',\n zinc: 'fafafa f4f4f5 e4e4e7 d4d4d8 a1a1aa 71717a 52525b 3f3f46 27272a 18181b 09090b',\n neutral: 'fafafa f5f5f5 e5e5e5 d4d4d4 a3a3a3 737373 525252 404040 262626 171717 0a0a0a',\n stone: 'fafaf9 f5f5f4 e7e5e4 d6d3d1 a8a29e 78716c 57534e 44403c 292524 1c1917 0c0a09',\n red: 'fef2f2 fee2e2 fecaca fca5a5 f87171 ef4444 dc2626 b91c1c 991b1b 7f1d1d 450a0a',\n orange: 'fff7ed ffedd5 fed7aa fdba74 fb923c f97316 ea580c c2410c 9a3412 7c2d12 431407',\n amber: 'fffbeb fef3c7 fde68a fcd34d fbbf24 f59e0b d97706 b45309 92400e 78350f 451a03',\n yellow: 'fefce8 fef9c3 fef08a fde047 facc15 eab308 ca8a04 a16207 854d0e 713f12 422006',\n lime: 'f7fee7 ecfccb d9f99d bef264 a3e635 84cc16 65a30d 4d7c0f 3f6212 365314 1a2e05',\n green: 'f0fdf4 dcfce7 bbf7d0 86efac 4ade80 22c55e 16a34a 15803d 166534 14532d 052e16',\n emerald: 'ecfdf5 d1fae5 a7f3d0 6ee7b7 34d399 10b981 059669 047857 065f46 064e3b 022c22',\n teal: 'f0fdfa ccfbf1 99f6e4 5eead4 2dd4bf 14b8a6 0d9488 0f766e 115e59 134e4a 042f2e',\n cyan: 'ecfeff cffafe a5f3fc 67e8f9 22d3ee 06b6d4 0891b2 0e7490 155e75 164e63 083344',\n sky: 'f0f9ff e0f2fe bae6fd 7dd3fc 38bdf8 0ea5e9 0284c7 0369a1 075985 0c4a6e 082f49',\n blue: 'eff6ff dbeafe bfdbfe 93c5fd 60a5fa 3b82f6 2563eb 1d4ed8 1e40af 1e3a8a 172554',\n indigo: 'eef2ff e0e7ff c7d2fe a5b4fc 818cf8 6366f1 4f46e5 4338ca 3730a3 312e81 1e1b4b',\n violet: 'f5f3ff ede9fe ddd6fe c4b5fd a78bfa 8b5cf6 7c3aed 6d28d9 5b21b6 4c1d95 2e1065',\n purple: 'faf5ff f3e8ff e9d5ff d8b4fe c084fc a855f7 9333ea 7e22ce 6b21a8 581c87 3b0764',\n fuchsia: 'fdf4ff fae8ff f5d0fe f0abfc e879f9 d946ef c026d3 a21caf 86198f 701a75 4a044e',\n pink: 'fdf2f8 fce7f3 fbcfe8 f9a8d4 f472b6 ec4899 db2777 be185d 9d174d 831843 500724',\n rose: 'fff1f2 ffe4e6 fecdd3 fda4af fb7185 f43f5e e11d48 be123c 9f1239 881337 4c0519',\n};\nconst STEPS = ['50', '100', '200', '300', '400', '500', '600', '700', '800', '900', '950'];\n\nexport function tailwindColor(name: string, step?: string): string | undefined {\n if (name === 'white') return '#ffffff';\n if (name === 'black') return '#000000';\n const row = PALETTE_ROWS[name];\n const i = step ? STEPS.indexOf(step) : -1;\n return row && i >= 0 ? `#${row.split(' ')[i]}` : undefined;\n}\n\nconst COLOR_PREFIX = '(?:text|bg|border(?:-[trblxyse])?|ring(?:-offset)?|outline|fill|stroke|from|via|to|divide|placeholder|decoration|accent|caret|shadow)';\nconst PALETTE_RE = new RegExp(`^${COLOR_PREFIX}-(${Object.keys(PALETTE_ROWS).join('|')})-(\\\\d{2,3})(?:\\\\/\\\\d+)?$|^${COLOR_PREFIX}-(white|black)(?:\\\\/\\\\d+)?$`);\n\n/** Arbitrary value prefix -> category (the value decides between color and others for ambiguous prefixes). */\nconst ARBITRARY: [RegExp, FindingCategory | 'color-or-size' | 'color-or-width' | 'color-or-shadow' | 'font'][] = [\n [/^(bg|fill|stroke|from|via|to|accent|caret|placeholder|decoration|divide|ring-offset|outline-color)$/, 'color'],\n [/^text$/, 'color-or-size'],\n [/^(border(-[trblxyse])?|ring|outline)$/, 'color-or-width'],\n [/^shadow$/, 'color-or-shadow'],\n [/^(p|px|py|pt|pr|pb|pl|ps|pe|m|mx|my|mt|mr|mb|ml|ms|me|gap|gap-x|gap-y|space-x|space-y|inset|inset-x|inset-y|top|right|bottom|left|start|end|scroll-m|scroll-p|indent)$/, 'spacing'],\n [/^(w|h|min-w|min-h|max-w|max-h|size|basis)$/, 'size'],\n [/^rounded(-[trblse]{1,2})?$/, 'radius'],\n [/^z$/, 'z-index'],\n [/^(duration|delay)$/, 'duration'],\n [/^ease$/, 'easing'],\n [/^font$/, 'font'],\n [/^leading$/, 'line-height'],\n];\n\nconst SCALE_RE =\n /^-?(p|px|py|pt|pr|pb|pl|ps|pe|m|mx|my|mt|mr|mb|ml|ms|me|gap|gap-x|gap-y|space-x|space-y|inset|top|right|bottom|left|w|h|min-w|min-h|max-w|max-h|size|basis)-(\\d+(\\.5)?|px)$|^rounded(-[trblse]{1,2})?(-(none|sm|md|lg|xl|2xl|3xl|full))?$|^text-(xs|sm|base|lg|xl|[2-9]xl)$|^shadow(-(sm|md|lg|xl|2xl|inner|none))?$|^z-\\d+$|^duration-\\d+$|^font-(thin|extralight|light|normal|medium|semibold|bold|extrabold|black|sans|serif|mono)$|^leading-(none|tight|snug|normal|relaxed|loose|\\d+)$|^ease-(linear|in|out|in-out)$/;\n/** shadcn/ui semantic classes (CSS variables of the app's own theme). */\nconst SHADCN_RE = new RegExp(`^${COLOR_PREFIX}-(background|foreground|primary|secondary|muted|accent|destructive|border|input|ring|card|popover)(-foreground)?(\\\\/\\\\d+)?$`);\n\nexport interface TailwindHit {\n /** The class as written, without variants. */\n cls: string;\n /** Offset of the class in the string. */\n index: number;\n kind: 'arbitrary' | 'palette' | 'scale' | 'token';\n category?: FindingCategory | 'color-or-size' | 'color-or-width' | 'color-or-shadow' | 'font';\n /** The raw value (`#123456`, `13px`) for arbitrary and palette classes. */\n value?: string;\n}\n\n/** Classes of a class string that matter for adoption. Variants (`hover:`, `md:`), `!` and `-` are stripped. */\nexport function scanClassString(text: string): TailwindHit[] {\n const out: TailwindHit[] = [];\n for (const m of text.matchAll(/[^\\s\"'`]+/g)) {\n const raw = m[0];\n // Variants end at the last colon outside brackets: md:hover:text-[color:var(--x)].\n let cut = -1;\n let depth = 0;\n for (let i = 0; i < raw.length; i++) {\n if (raw[i] === '[') depth++;\n else if (raw[i] === ']') depth--;\n else if (raw[i] === ':' && depth === 0) cut = i;\n }\n const cls = raw.slice(cut + 1).replace(/^!/, '');\n const index = m.index! + raw.length - cls.length;\n const arb = /^-?([a-z][a-z-]*?)-\\[(.+)\\]$/.exec(cls);\n if (arb) {\n const value = arb[2]!.replace(/_/g, ' ').replace(/^(color|length|size|percentage|number|shadow|family|url|image|position|line-width|absolute-size|relative-size):/, '');\n if (/^var\\(--/.test(value) || /^--/.test(value)) {\n out.push({ cls, index, kind: 'token', value: value.startsWith('--') ? `var(${value})` : value });\n continue;\n }\n const cat = ARBITRARY.find(([re]) => re.test(arb[1]!))?.[1];\n if (cat) out.push({ cls, index, kind: 'arbitrary', category: cat, value });\n continue;\n }\n const pal = PALETTE_RE.exec(cls);\n if (pal) {\n const value = pal[3] ? tailwindColor(pal[3]) : tailwindColor(pal[1]!, pal[2]!);\n if (value) out.push({ cls, index, kind: 'palette', category: 'color', value });\n continue;\n }\n if (SCALE_RE.test(cls) || SHADCN_RE.test(cls)) out.push({ cls, index, kind: 'scale' });\n }\n return out;\n}\n","// Classifies one style declaration (CSS property + value, or a JS style object entry) into hardcoded values,\n// design-system token references and references to another theme. Shared by the audit scanners and the\n// stylelint and ESLint plugins.\nimport { COLOR_LITERAL_RE, NAMED_COLORS, parseCssColor } from './color';\nimport type { FindingCategory } from './types';\n\nexport interface ValueHit {\n category: FindingCategory;\n /** The literal as written. */\n text: string;\n /** Offset of the literal in the value. */\n index: number;\n}\n\nexport interface ValueScan {\n hits: ValueHit[];\n /** CSS variables referenced with var(--x), DS or not. */\n vars: string[];\n /** The value points at another theme (MUI palette path, sx spacing unit...). */\n themeRef: boolean;\n}\n\nconst COLOR_PROP = /^(color|background(-color|-image)?|border(-(top|right|bottom|left|block|inline)(-(start|end))?)?(-color)?|outline(-color)?|fill|stroke|text-decoration(-color)?|caret-color|accent-color|column-rule(-color)?|stop-color|flood-color|lighting-color|-webkit-text-fill-color|scrollbar-color|box-shadow|text-shadow)$/;\nconst SPACING_PROP = /^(padding|margin|gap|row-gap|column-gap|grid-gap|grid-row-gap|grid-column-gap|inset|top|right|bottom|left|scroll-margin|scroll-padding)(-(top|right|bottom|left|block|inline|x|y)(-(start|end))?)?$/;\nconst SIZE_PROP = /^(min-|max-)?(width|height|block-size|inline-size)$|^flex-basis$/;\nconst RADIUS_PROP = /radius$/;\nconst BORDER_WIDTH_PROP = /^(border|outline)(-(top|right|bottom|left|block|inline)(-(start|end))?)?(-width)?$|^outline-offset$|^column-rule(-width)?$/;\nconst MOTION_PROP = /^(transition|animation)(-duration|-delay)?$/;\nconst EASING_PROP = /^(transition|animation)(-timing-function)?$/;\nconst SKIP_PROP = /^(content|grid-template(-areas)?|grid-area|src|mask(-image)?|transform|translate|will-change|cursor|quotes|font-feature-settings|font-variation-settings|counter-(reset|increment)|clip-path|d|unicode-range)$/;\n\n/** Keys that are not CSS properties but hold theme values (MUI palette, SCSS and custom properties). */\nconst looseKey = (p: string) => p.startsWith('$') || p.startsWith('--') || !/^-?[a-z]+(-[a-z]+)*$/.test(p) || !KNOWN_PROPS.has(p);\nconst KNOWN_PROPS = new Set(\n 'color background background-color background-image border border-top border-right border-bottom border-left border-color border-width border-style border-radius border-top-left-radius border-top-right-radius border-bottom-left-radius border-bottom-right-radius border-top-color border-bottom-color border-left-color border-right-color border-top-width border-bottom-width border-left-width border-right-width border-block border-inline border-block-start border-block-end border-inline-start border-inline-end outline outline-color outline-width outline-offset fill stroke text-decoration text-decoration-color caret-color accent-color box-shadow text-shadow padding padding-top padding-right padding-bottom padding-left padding-block padding-inline padding-x padding-y padding-inline-start padding-inline-end padding-block-start padding-block-end margin margin-top margin-right margin-bottom margin-left margin-block margin-inline margin-x margin-y margin-inline-start margin-inline-end margin-block-start margin-block-end gap row-gap column-gap grid-gap inset top right bottom left width height min-width min-height max-width max-height flex-basis font font-family font-size font-weight line-height letter-spacing transition transition-duration transition-delay transition-timing-function animation animation-duration animation-delay animation-timing-function z-index opacity display position flex flex-direction flex-wrap flex-grow flex-shrink align-items justify-content overflow text-align white-space cursor content transform'.split(' '),\n);\n\n/** Replaces var(...) (with fallbacks, nested) and url(...) by spaces so offsets stay valid. */\nfunction mask(value: string): string {\n let out = value;\n for (const fn of ['var(', 'url(', 'env(']) {\n let i = out.indexOf(fn);\n while (i >= 0) {\n let depth = 0;\n let j = i + fn.length - 1;\n for (; j < out.length; j++) {\n if (out[j] === '(') depth++;\n else if (out[j] === ')' && --depth === 0) break;\n }\n out = out.slice(0, i) + ' '.repeat(j + 1 - i) + out.slice(j + 1);\n i = out.indexOf(fn, i);\n }\n }\n // Quoted strings (except for font-family, handled before) are not values to tokenize.\n return out.replace(/([\"'])(?:(?!\\1).)*\\1/g, (s) => ' '.repeat(s.length));\n}\n\nconst LENGTH_RE = /(?<![\\w.#-])(-?\\d*\\.?\\d+)(px|rem|em)\\b/g;\n\nfunction lengthCategory(prop: string): FindingCategory | undefined {\n if (RADIUS_PROP.test(prop)) return 'radius';\n if (SPACING_PROP.test(prop)) return 'spacing';\n if (SIZE_PROP.test(prop)) return 'size';\n if (BORDER_WIDTH_PROP.test(prop)) return 'border-width';\n if (prop === 'font-size') return 'font-size';\n if (prop === 'line-height') return 'line-height';\n if (looseKey(prop)) {\n const k = prop.toLowerCase();\n if (/radius|rounded/.test(k)) return 'radius';\n if (/space|spacing|gap|padding|margin|gutter|inset/.test(k)) return 'spacing';\n if (/font-?size|fontsize/.test(k)) return 'font-size';\n if (/width|height|size/.test(k)) return 'size';\n }\n return undefined;\n}\n\n/**\n * Scan one CSS declaration. `property` is kebab-case (`background-color`, `$brand`, `--x`, or a theme key\n * such as `main`); `value` is the raw value text.\n */\nexport function scanCssValue(property: string, value: string): ValueScan {\n const prop = property.trim().toLowerCase();\n const vars = [...value.matchAll(/var\\(\\s*(--[\\w-]+)/g)].map((m) => m[1]!);\n const hits: ValueHit[] = [];\n const out: ValueScan = { hits, vars, themeRef: false };\n if (SKIP_PROP.test(prop)) return out;\n const v = value.trim();\n if (!v || /^(inherit|initial|unset|revert|none|auto|0|normal|currentcolor|transparent)$/i.test(v)) return out;\n if (/^\\$[\\w-]+$/.test(v) || /^theme\\(/.test(v)) {\n out.themeRef = true;\n return out;\n }\n const masked = mask(value);\n\n if (prop === 'font-family') {\n if (masked.trim() && !/^(inherit|initial|unset)$/i.test(v)) hits.push({ category: 'font-family', text: v, index: value.indexOf(v) });\n return out;\n }\n if (prop === 'box-shadow' || prop === 'text-shadow') {\n // A ring built from tokens (`inset 0 0 0 var(--border-width-default) var(--color-border-default)`) is not\n // hardcoded: bare zero offsets carry no value. Any other number or a color literal is.\n const numbers = masked.replace(/(?<![\\w.])0(?![\\w.%])/g, ' ');\n if (/\\d/.test(numbers) || masked.search(COLOR_LITERAL_RE) >= 0) hits.push({ category: 'shadow', text: v, index: value.indexOf(v) });\n return out;\n }\n\n // Colors: hex and functions anywhere; named colors only where a color is expected.\n for (const m of masked.matchAll(COLOR_LITERAL_RE)) if (parseCssColor(m[0])) hits.push({ category: 'color', text: m[0], index: m.index! });\n if (COLOR_PROP.test(prop) || prop.startsWith('--') || prop.startsWith('$')) {\n for (const m of masked.matchAll(/(?<![\\w#.-])([a-z]+)(?![\\w(-])/gi)) {\n const n = m[1]!.toLowerCase();\n if (NAMED_COLORS[n] && !/^(transparent|currentcolor)$/.test(n)) hits.push({ category: 'color', text: m[1]!, index: m.index! });\n }\n // Bare HSL channels, the shadcn/ui theme form: --primary: 222.2 47.4% 11.2%;\n if (prop.startsWith('--') && /^-?[\\d.]+(deg)?\\s+[\\d.]+%\\s+[\\d.]+%/.test(v) && parseCssColor(v)) hits.push({ category: 'color', text: v, index: value.indexOf(v) });\n }\n\n if (prop === 'z-index') {\n const n = /^-?\\d+$/.test(v) ? Number(v) : NaN;\n if (Number.isFinite(n) && Math.abs(n) > 1) hits.push({ category: 'z-index', text: v, index: value.indexOf(v) });\n return out;\n }\n if (prop === 'font-weight') {\n if (/^(\\d{3}|bold|bolder|lighter)$/i.test(v)) hits.push({ category: 'font-weight', text: v, index: value.indexOf(v) });\n return out;\n }\n if (prop === 'line-height' && /^\\d*\\.?\\d+$/.test(v) && Number(v) !== 0) {\n hits.push({ category: 'line-height', text: v, index: value.indexOf(v) });\n return out;\n }\n if (MOTION_PROP.test(prop)) {\n for (const m of masked.matchAll(/(?<![\\w.-])(\\d*\\.?\\d+)(ms|s)\\b/g)) if (Number(m[1]) !== 0) hits.push({ category: 'duration', text: m[0], index: m.index! });\n }\n if (EASING_PROP.test(prop)) {\n for (const m of masked.matchAll(/cubic-bezier\\([^)]*\\)|(?<![\\w-])(ease-in-out|ease-in|ease-out|ease|linear)(?![\\w-])/g)) hits.push({ category: 'easing', text: m[0], index: m.index! });\n }\n const cat = lengthCategory(prop);\n if (cat) for (const m of masked.matchAll(LENGTH_RE)) if (Number(m[1]) !== 0) hits.push({ category: cat, text: m[0].replace(/^-/, ''), index: m.index! + (m[0].startsWith('-') ? 1 : 0) });\n hits.sort((a, b) => a.index - b.index);\n return out;\n}\n\n// --- JS style objects ---------------------------------------------------------------------------------------\n\nconst MUI_SHORTHAND: Record<string, string> = {\n m: 'margin', mt: 'margin-top', mr: 'margin-right', mb: 'margin-bottom', ml: 'margin-left', mx: 'margin-inline', my: 'margin-block',\n p: 'padding', pt: 'padding-top', pr: 'padding-right', pb: 'padding-bottom', pl: 'padding-left', px: 'padding-inline', py: 'padding-block',\n marginX: 'margin-inline', marginY: 'margin-block', paddingX: 'padding-inline', paddingY: 'padding-block', bgcolor: 'background-color',\n};\nconst UNITLESS = /^(opacity|flex|flex-grow|flex-shrink|order|zoom|column-count|fill-opacity|stroke-opacity|aspect-ratio|grid-row|grid-column|animation-iteration-count|tab-size|orphans|widows|scale)$/;\nconst MUI_SPACING_KEY = /^(margin|padding)(-.*)?$|^(gap|row-gap|column-gap)$/;\nconst MUI_PALETTE_PATH = /^(primary|secondary|error|warning|info|success|text|background|grey|action|common|divider)(\\.[\\w]+)*$/;\n\n/** camelCase or MUI shorthand key -> kebab-case CSS property. */\nexport function cssPropertyOf(key: string): string {\n if (MUI_SHORTHAND[key]) return MUI_SHORTHAND[key]!;\n if (key.startsWith('--') || key.startsWith('$')) return key;\n return key.replace(/^(Webkit|Moz|ms)(?=[A-Z])/, (p) => `-${p.toLowerCase()}`).replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n}\n\nexport type JsStyleContext = 'style' | 'sx' | 'styled' | 'theme';\n\n/**\n * Scan one entry of a JS style object (`style`, MUI `sx`, styled/makeStyles objects, theme objects).\n * Numbers follow React and MUI: px for lengths, theme spacing units for sx margins and paddings.\n */\nexport function scanJsStyle(key: string, value: string | number, ctx: JsStyleContext): ValueScan {\n const prop = cssPropertyOf(key);\n if (typeof value === 'number') {\n const none: ValueScan = { hits: [], vars: [], themeRef: false };\n if (ctx === 'sx' && (MUI_SPACING_KEY.test(prop) || RADIUS_PROP.test(prop) || MUI_SHORTHAND[key])) return { ...none, themeRef: true };\n if (prop === 'z-index' || prop === 'font-weight' || prop === 'line-height') return scanCssValue(prop, String(value));\n if (UNITLESS.test(prop) || value === 0 || looseKey(prop)) return none;\n if (ctx === 'sx' && SIZE_PROP.test(prop) && Math.abs(value) <= 1) return none; // MUI: fraction = percentage\n const scan = scanCssValue(prop, `${value}px`);\n // Report the number as written.\n scan.hits.forEach((h) => (h.text = String(value)));\n return scan;\n }\n const v = value.trim();\n if ((ctx === 'sx' || ctx === 'theme') && (MUI_PALETTE_PATH.test(v) || (prop === 'typography' && /^[a-z]+\\d?$/.test(v))) && !NAMED_COLORS[v.toLowerCase()]) {\n return { hits: [], vars: [], themeRef: true };\n }\n return scanCssValue(prop, value);\n}\n\n/** A whole string literal that is a color (`'#1976d2'`, `'rgba(0,0,0,.5)'`): counted wherever it appears in code. */\nexport function isColorLiteral(text: string): boolean {\n const t = text.trim();\n return /^(#[0-9a-f]{3,8}|(rgba?|hsla?)\\([^()]*\\))$/i.test(t) && Boolean(parseCssColor(t));\n}\n","// CSS, SCSS, Less and CSS-in-JS template text: declarations with their offsets, plus Tailwind @apply.\nimport { scanCssValue, type ValueScan } from './scan-value';\nimport { scanClassString, type TailwindHit } from './tailwind';\n\nexport interface CssDecl {\n property: string;\n value: string;\n /** Offset of the value in the text. */\n valueStart: number;\n scan: ValueScan;\n}\n\nexport interface CssScan {\n decls: CssDecl[];\n applies: { start: number; hits: TailwindHit[] }[];\n}\n\n/** Comments become spaces (offsets and line numbers stay put). `//` comments only for SCSS and Less. */\nexport function blankComments(text: string, lineComments: boolean): string {\n let out = text.replace(/\\/\\*[\\s\\S]*?\\*\\//g, (c) => c.replace(/[^\\n]/g, ' '));\n if (lineComments) out = out.replace(/(^|[^:\"'\\\\])\\/\\/[^\\n]*/g, (c, pre: string) => pre + ' '.repeat(c.length - pre.length));\n return out;\n}\n\nconst DECL_RE = /(?<=^|[;{}])(\\s*)([$@]?-{0,2}[A-Za-z_][\\w-]*)\\s*:\\s*([^;{}]*?)\\s*(?=;|}|$(?![\\s\\S]))/g;\n\nexport function scanCssText(text: string, lang: 'css' | 'scss' | 'less' = 'css'): CssScan {\n const clean = blankComments(text, lang !== 'css');\n const decls: CssDecl[] = [];\n for (const m of clean.matchAll(DECL_RE)) {\n const property = m[2]!;\n if (property.startsWith('@')) continue;\n const value = m[3]!;\n if (!value.trim()) continue;\n // Skip a selector with a pseudo-class that ends the text (no brace after it).\n const valueStart = m.index! + m[0].length - value.length;\n decls.push({ property, value, valueStart, scan: scanCssValue(property, value) });\n }\n const applies = [...clean.matchAll(/@apply\\s+([^;{}]+)/g)].map((m) => ({ start: m.index! + m[0].length - m[1]!.length, hits: scanClassString(m[1]!) }));\n return { decls, applies };\n}\n\n/** 1-based line and column of an offset. */\nexport function lineCol(text: string): (offset: number) => { line: number; column: number } {\n const starts = [0];\n for (let i = 0; i < text.length; i++) if (text.charCodeAt(i) === 10) starts.push(i + 1);\n return (offset) => {\n let lo = 0;\n let hi = starts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (starts[mid]! <= offset) lo = mid;\n else hi = mid - 1;\n }\n return { line: lo + 1, column: offset - starts[lo]! + 1 };\n };\n}\n","// Component classification: DS package, foreign UI libraries, native elements, re-created DS components.\n\nconst FOREIGN_PREFIXES = [\n '@mui/material', '@mui/joy', '@mui/lab', '@mui/x-', '@mui/base', '@material-ui/', 'antd', '@ant-design/pro-', '@chakra-ui/', '@radix-ui/react-',\n '@headlessui/', '@mantine/', 'react-bootstrap', 'reactstrap', '@nextui-org/', '@heroui/', 'react-admin', 'ra-ui-materialui', 'ra-input-rich-text',\n '@fluentui/', 'primereact', 'semantic-ui-react', '@blueprintjs/', '@ariakit/', 'react-aria-components', '@base-ui/react', '@base-ui-components/',\n '@ark-ui/', 'evergreen-ui', 'grommet', 'rsuite', '@adobe/react-spectrum', '@react-spectrum/', 'vaul', 'cmdk', 'sonner', 'react-select', 'react-modal',\n];\nconst ICON_PREFIXES = ['@mui/icons-material', '@material-ui/icons', '@ant-design/icons', '@radix-ui/react-icons', 'lucide-react', 'react-icons', '@heroicons/', '@tabler/icons-react', '@phosphor-icons/', 'react-feather'];\nconst SHADCN_RE = /(^|\\/)components\\/ui(\\/|$)/;\n/** Chart libraries: visible UI the design system does not provide, counted as foreign with no DS equivalent. */\nconst CHART_PREFIXES = ['recharts', 'react-chartjs-2', 'chart.js', '@nivo/', 'victory', '@visx/', 'echarts-for-react', 'react-apexcharts', '@tremor/react', '@mui/x-charts'];\n/**\n * Router links render a visible anchor. From a router or a headless admin core they are UI that the DS Link\n * covers, unless passed to a DS component as its render element (`render={<Link to=\"...\" />}`).\n */\nconst ROUTER_LINK_MODULES = ['react-router', 'react-router-dom', 'ra-core', 'next/link', '@tanstack/react-router', 'wouter', '@remix-run/react'];\nconst ROUTER_LINK_NAMES = new Set(['Link', 'NavLink', 'LinkBase']);\nexport const isRouterLink = (mod: string, name: string) => ROUTER_LINK_MODULES.some((p) => prefixMatch(mod, p)) && (ROUTER_LINK_NAMES.has(name) || (mod === 'next/link' && name === 'default'));\n\n/** Rendered by UI libraries but not UI: providers, routers, data wrappers. */\nconst NON_VISUAL = new Set(['Admin', 'AdminContext', 'AdminUI', 'Resource', 'CustomRoutes', 'Route', 'Routes', 'Router', 'BrowserRouter', 'Translate', 'CssBaseline', 'ScopedCssBaseline', 'GlobalStyles', 'ResponsiveContainer', 'StyledEngineProvider', 'Fragment', 'Suspense', 'StrictMode', 'ErrorBoundary', 'WithRecord', 'WithListContext', 'Portal', 'NoSsr', 'ClickAwayListener', 'Fade', 'Grow', 'Slide', 'Zoom', 'Collapse', 'Transition', 'TrapFocus', 'FocusTrap', 'Slot', 'VisuallyHidden']);\nexport const isNonVisual = (name: string) => NON_VISUAL.has(name) || /(Provider|Context|Consumer|Controller)$/.test(name);\n\nconst prefixMatch = (mod: string, p: string) => (p.endsWith('/') || p.endsWith('-') ? mod.startsWith(p) : mod === p || mod.startsWith(`${p}/`));\n\nexport type ModuleKind = 'ds' | 'foreign' | 'charts' | 'icons' | 'shadcn' | 'local' | 'other';\n\n/** Package name of an import specifier: @scope/name or name. */\nexport function packageName(mod: string): string {\n const parts = mod.split('/');\n return mod.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0]!;\n}\n\nexport function classifyModule(mod: string, dsPackages: string[], extraForeign: string[] = []): ModuleKind {\n if (dsPackages.some((p) => mod === p || mod.startsWith(`${p}/`))) return 'ds';\n if (ICON_PREFIXES.some((p) => prefixMatch(mod, p))) return 'icons';\n if (CHART_PREFIXES.some((p) => prefixMatch(mod, p))) return 'charts';\n if (SHADCN_RE.test(mod) && (mod.startsWith('.') || mod.startsWith('@/') || mod.startsWith('~/') || mod.startsWith('src/') || mod.startsWith('components/'))) return 'shadcn';\n if ([...FOREIGN_PREFIXES, ...extraForeign].some((p) => prefixMatch(mod, p))) return 'foreign';\n if (mod.startsWith('.') || mod.startsWith('@/') || mod.startsWith('~/') || mod.startsWith('src/')) return 'local';\n return 'other';\n}\n\n/** Library label used in the report. */\nexport function libraryLabel(mod: string, kind: ModuleKind): string {\n return kind === 'shadcn' ? 'shadcn/ui (local)' : kind === 'local' ? 'local' : packageName(mod);\n}\n\nconst EQUIVALENTS: [RegExp, string[]][] = [\n [/^(Icon)?Button$|^LoadingButton$|^SaveButton$|^(Create|Edit|Delete|Show|Export|List|Refresh|Clone)Button$/, ['Button']],\n [/^IconButton$|^Fab$/, ['IconButton', 'Button']],\n [/^(Toggle)?ButtonGroup$|^ToggleButton$/, ['ButtonGroup']],\n [/^Number(Input|Field)$/, ['NumberField', 'Input']],\n [/^(TextField|TextInput|Input|InputBase|OutlinedInput|FilledInput|PasswordInput|SearchInput|DateInput|DateTimeInput)$/, ['Input', 'Field']],\n [/^(Textarea|TextareaAutosize|RichTextInput)$/, ['Textarea']],\n [/^(Autocomplete|AutocompleteInput|AutocompleteArrayInput|Combobox|Command)$/, ['Combobox', 'Select']],\n [/^(Select|NativeSelect|SelectInput|SelectArrayInput)$/, ['Select']],\n [/^(Switch|BooleanInput|NullableBooleanInput)$/, ['Switch']],\n [/^(Checkbox|BooleanField)$/, ['Checkbox']],\n [/^CheckboxGroupInput$/, ['CheckboxGroup']],\n [/^(Radio|RadioGroup|RadioButtonGroupInput)$/, ['RadioGroup']],\n [/^Slider$/, ['Slider']],\n [/^(AlertDialog|Confirm)$/, ['AlertDialog', 'Dialog']],\n [/^(Dialog|Modal|DialogTitle|DialogContent|DialogActions|DialogContentText)$/, ['Dialog']],\n [/^(Drawer|SwipeableDrawer|Sheet)$/, ['Drawer']],\n [/^(Popover|Popper|HoverCard)$/, ['Popover']],\n [/^Tooltip$/, ['Tooltip']],\n [/^(Menu|MenuItem|MenuList|DropdownMenu.*)$/, ['Menu']],\n [/^(Tabs|Tab|TabList|TabPanel|TabbedForm|TabbedShowLayout)$/, ['Tabs']],\n [/^(Card|CardContent|CardHeader|CardActions|CardMedia|Paper)$/, ['Card']],\n [/^Avatar$/, ['Avatar']],\n [/^Badge$/, ['Badge']],\n [/^(Chip|Tag|ChipField)$/, ['Tag', 'Badge']],\n [/^(Alert|AlertTitle|Callout)$/, ['Alert']],\n [/^(Banner|AnnouncementBar|TopBanner)$/, ['Banner', 'Alert']],\n [/^(CodeBlock|Code|CodeSnippet|Snippet|Prism|SyntaxHighlighter|CopyBlock)$/, ['CodeBlock']],\n [/^(RadioCard|RadioCards|RadioTile|ChoiceCard|ChoiceCardGroup)$/, ['ChoiceCard', 'RadioGroup']],\n [/^(Checklist|ChecklistItem|StepList)$/, ['Checklist']],\n [/^(Snackbar|Toast|Toaster|Notification)$/, ['Toast']],\n [/^(CircularProgress|Spinner|Loading|LoadingIndicator)$/, ['Spinner', 'Progress']],\n [/^(LinearProgress|Progress)$/, ['Progress']],\n [/^Skeleton$/, ['Skeleton']],\n [/^(Divider|Separator)$/, ['Divider']],\n [/^(Accordion|AccordionSummary|AccordionDetails|Collapsible)$/, ['Accordion']],\n [/^(Table|TableBody|TableCell|TableRow|TableHead|TableContainer|TableFooter|Datagrid|DataGrid|DataTable)$/, ['Table']],\n [/^(Pagination|TablePagination)$/, ['Pagination']],\n [/^(Breadcrumbs|Breadcrumb)$/, ['Breadcrumb']],\n [/^Link$/, ['Link']],\n [/^Stack$/, ['Stack']],\n [/^(Grid|Grid2|ImageList)$/, ['Grid']],\n [/^Container$/, ['Container']],\n [/^(Form|SimpleForm)$/, ['Form']],\n [/^(FormControl|FormLabel|FormHelperText|FormControlLabel|InputLabel|Labeled|Label|FormField|FormItem)$/, ['Field']],\n [/^(Sidebar|SidebarNav|Menu|MenuItemLink|DashboardMenuItem)$/, ['SidebarNav']],\n [/^Kbd$/, ['Kbd']],\n];\n\n/** The DS component to use instead of a foreign one, when one fits. */\nexport function dsEquivalent(name: string, ds: Set<string>): string | undefined {\n const base = name.split('.').pop()!;\n if (ds.has(base)) return base;\n for (const [re, cands] of EQUIVALENTS) if (re.test(base)) return cands.find((c) => ds.has(c));\n return undefined;\n}\n\n/** The DS component that replaces a native element; undefined when the DS has none, and then the element is not a miss. */\nexport function nativeEquivalent(tag: string, type: string | undefined, ds: Set<string>): string | undefined {\n const pick = (...c: string[]) => c.find((x) => ds.has(x));\n switch (tag) {\n case 'button':\n return pick('Button');\n case 'input':\n if (type === 'checkbox') return pick('Checkbox', 'Switch');\n if (type === 'radio') return pick('RadioGroup');\n if (type === 'range') return pick('Slider');\n if (type === 'number') return pick('NumberField', 'Input');\n return pick('Input', 'Field');\n case 'select':\n return pick('Select', 'Combobox');\n case 'textarea':\n return pick('Textarea');\n case 'dialog':\n return pick('Dialog');\n case 'table':\n return pick('Table');\n case 'a':\n return pick('Link');\n case 'img':\n return pick('Image');\n default:\n return pick(tag[0]!.toUpperCase() + tag.slice(1));\n }\n}\n","// What the audit compares product code against: the design system's tokens (resolved in every mode),\n// its CSS variables, its component names and its package names.\nimport type { Rgba } from '../values';\nimport { comboKey, type Combo, type LayeredTokenSet } from '../layered';\nimport { deltaE, parseCssColor } from './color';\nimport type { Confidence, FindingCategory, TokenSuggestion } from './types';\n\nexport interface AuditDsOptions {\n /** Packages the DS components are imported from, e.g. [\"@bridge-ds/react\"]. */\n packages: string[];\n /** DS component names (PascalCase). */\n components: string[];\n /** Extra module prefixes counted as foreign UI libraries. */\n foreignLibraries?: string[];\n /** Native elements that should be DS components. */\n nativeElements?: string[];\n}\n\ninterface Entry {\n path: string;\n cssVar: string;\n type: string;\n tier: string;\n css: string;\n combo?: string;\n rgba?: Rgba;\n num?: number;\n}\n\nconst TIER_RANK_COLOR: Record<string, number> = { semantic: 0, base: 1, component: 2, brand: 3, density: 3, primitive: 4 };\nconst TIER_RANK_SCALE: Record<string, number> = { semantic: 0, base: 0, brand: 1, density: 2, primitive: 3, component: 5 };\n\n// CSS property -> token paths that fit its intent (a background wants a bg/surface token, not a text one).\nconst COLOR_HINTS: [RegExp, RegExp][] = [\n [/^(color|fill|stroke|-webkit-text-fill-color|caret-color|text-decoration(-color)?)$/, /(^|\\.)(text|fg|icon|foreground|link)(\\.|-|$)/],\n [/background|bgcolor/, /(^|\\.)(bg|surface|background|fill|solid|scrim|overlay)(\\.|-|$)/],\n [/border|outline|divider|column-rule/, /(^|\\.)(border|outline|ring|divider|line|separator)(\\.|-|$)/],\n];\n\nconst PATH_FOR: Partial<Record<FindingCategory, RegExp>> = {\n spacing: /(^|\\.)space(\\.|$)/,\n size: /(^|\\.)size(\\.|$)/,\n radius: /(^|\\.)radius(\\.|$)|-radius$|\\.radius$/,\n 'border-width': /border-width|border\\.width|(^|\\.)stroke(\\.|$)/,\n 'font-size': /font\\.size|font-size|text\\.size/,\n 'line-height': /line-height|leading/,\n duration: /duration/,\n 'z-index': /^(z|layer|z-index|zindex)\\./,\n 'font-weight': /weight/,\n};\n\nconst toPx = (css: string): number | undefined => {\n const m = /^(-?\\d*\\.?\\d+)(px|rem|em)?$/.exec(css.trim());\n if (!m) return undefined;\n return m[2] === 'rem' || m[2] === 'em' ? Number(m[1]) * 16 : Number(m[1]);\n};\nconst toMs = (css: string): number | undefined => {\n const m = /^(\\d*\\.?\\d+)(ms|s)$/.exec(css.trim());\n return m ? (m[2] === 's' ? Number(m[1]) * 1000 : Number(m[1])) : undefined;\n};\nconst EASE_KEYWORDS: Record<string, number[]> = { ease: [0.25, 0.1, 0.25, 1], 'ease-in': [0.42, 0, 1, 1], 'ease-out': [0, 0, 0.58, 1], 'ease-in-out': [0.42, 0, 0.58, 1], linear: [0, 0, 1, 1] };\nconst bezier = (css: string): number[] | undefined => {\n const k = EASE_KEYWORDS[css.trim()];\n if (k) return k;\n const m = /cubic-bezier\\(([^)]*)\\)/.exec(css);\n const n = m?.[1]!.split(',').map(Number);\n return n && n.length === 4 && n.every(Number.isFinite) ? n : undefined;\n};\nconst WEIGHT_WORDS: Record<string, number> = { normal: 400, bold: 700, bolder: 700, lighter: 300 };\nconst firstFamily = (css: string) => css.split(',')[0]!.trim().replace(/^[\"']|[\"']$/g, '').toLowerCase();\nconst shadowNums = (css: string) => [...css.replace(/rgba?\\([^)]*\\)|#[0-9a-f]+|hsla?\\([^)]*\\)/gi, '').matchAll(/-?\\d*\\.?\\d+/g)].map((m) => Number(m[0]));\n\nfunction level(conf: number): Confidence {\n return conf >= 0.999 ? 'exact' : conf >= 0.75 ? 'high' : conf >= 0.5 ? 'medium' : 'low';\n}\nconst round = (n: number, d = 2) => Math.round(n * 10 ** d) / 10 ** d;\n\n/** Native elements counted as UI instances that a DS component should render: controls, links and images. */\nexport const DEFAULT_NATIVE_ELEMENTS = ['button', 'input', 'select', 'textarea', 'dialog', 'table', 'a', 'img'];\n\nexport class DesignSystemIndex {\n readonly cssVars = new Set<string>();\n readonly packages: string[];\n readonly components: Set<string>;\n readonly foreignLibraries: string[];\n readonly nativeElements: string[];\n readonly tokenCount: number;\n readonly modes: string[];\n private colors: Entry[] = [];\n private byType = new Map<string, Entry[]>();\n private defaultCombo: Combo;\n\n constructor(set: LayeredTokenSet, opts: AuditDsOptions) {\n this.packages = opts.packages;\n this.components = new Set(opts.components);\n this.foreignLibraries = opts.foreignLibraries ?? [];\n this.nativeElements = opts.nativeElements ?? DEFAULT_NATIVE_ELEMENTS;\n this.defaultCombo = set.defaultCombo;\n this.modes = set.combos().map(comboKey);\n const paths = set.allPaths();\n this.tokenCount = paths.length;\n const defKey = comboKey(this.defaultCombo);\n const seenColor = new Set<string>();\n for (const combo of set.combos()) {\n const key = this.modeLabel(combo);\n const isDefault = comboKey(combo) === defKey;\n const view = set.view(combo);\n for (const p of view.keys()) {\n const r = set.resolve(p, combo);\n if (r.error || !r.css) continue;\n const base = { path: p, cssVar: set.cssVarName(p), type: r.type ?? '', tier: set.tierOf(p) ?? 'primitive', css: r.css };\n if (r.type === 'color') {\n const rgba = parseCssColor(r.css);\n const id = `${p}|${r.css}`;\n if (!rgba || seenColor.has(id)) continue;\n seenColor.add(id);\n this.colors.push({ ...base, rgba, ...(key ? { combo: key } : {}) });\n } else if (isDefault) {\n const list = this.byType.get(base.type) ?? [];\n list.push(base);\n this.byType.set(base.type, list);\n }\n }\n }\n for (const p of paths) this.cssVars.add(set.cssVarName(p));\n }\n\n private modeLabel(combo: Combo): string | undefined {\n const diff = Object.entries(combo).filter(([k, v]) => this.defaultCombo[k] !== v);\n return diff.length ? diff.map(([k, v]) => `${k}=${v}`).join(',') : undefined;\n }\n\n isDsVar(name: string): boolean {\n return this.cssVars.has(name);\n }\n\n isDsModule(mod: string): boolean {\n return this.packages.some((p) => mod === p || mod.startsWith(`${p}/`));\n }\n\n private entries(types: string[], pathRe?: RegExp): Entry[] {\n const all = types.flatMap((t) => this.byType.get(t) ?? []);\n if (!pathRe) return all;\n const narrowed = all.filter((e) => pathRe.test(e.path));\n return narrowed.length ? narrowed : all;\n }\n\n private make(e: Entry, distance: number, confidence: number): TokenSuggestion {\n return { token: e.path, cssVar: e.cssVar, value: e.css, ...(e.combo ? { mode: e.combo } : {}), distance: round(distance), confidence: round(confidence), level: level(confidence) };\n }\n\n /** Nearest color by deltaE OK across every mode; semantic tokens and tokens that fit the property win near-ties. */\n suggestColor(value: string, property?: string): TokenSuggestion | undefined {\n const target = parseCssColor(value);\n if (!target || !this.colors.length) return undefined;\n const hint = COLOR_HINTS.find(([re]) => property && re.test(property))?.[1];\n const scored = this.colors.map((e) => ({ e, d: deltaE(target, e.rgba!) }));\n const min = Math.min(...scored.map((s) => s.d));\n const tolerance = min <= 0.5 ? 0.5 : min + 2;\n const pick = scored\n .filter((s) => s.d <= Math.max(tolerance, min))\n .sort((a, b) => Number(hint ? !hint.test(a.e.path) : 0) - Number(hint ? !hint.test(b.e.path) : 0) || (TIER_RANK_COLOR[a.e.tier] ?? 5) - (TIER_RANK_COLOR[b.e.tier] ?? 5) || Number(Boolean(a.e.combo)) - Number(Boolean(b.e.combo)) || a.d - b.d)[0];\n if (!pick || pick.d > 15) return undefined;\n const conf = pick.d <= 0.5 ? 1 : pick.d <= 2 ? 0.85 : pick.d <= 5 ? 0.6 : 0.3;\n return this.make(pick.e, pick.d, conf);\n }\n\n private nearestNumber(cands: Entry[], target: number, read: (e: Entry) => number | undefined, rank = TIER_RANK_SCALE): { e: Entry; d: number } | undefined {\n const scored = cands.map((e) => ({ e, n: read(e) })).filter((s): s is { e: Entry; n: number } => s.n !== undefined).map((s) => ({ e: s.e, d: Math.abs(s.n - target) }));\n if (!scored.length) return undefined;\n const min = Math.min(...scored.map((s) => s.d));\n return scored.filter((s) => s.d === min).sort((a, b) => (rank[a.e.tier] ?? 5) - (rank[b.e.tier] ?? 5) || a.e.path.length - b.e.path.length)[0];\n }\n\n private ratioConfidence(d: number, target: number): number {\n if (d === 0) return 1;\n const rel = d / Math.max(Math.abs(target), 1);\n return d <= 1 || rel <= 0.05 ? 0.8 : rel <= 0.15 ? 0.55 : rel <= 0.4 ? 0.3 : 0;\n }\n\n /** Suggest a token for a hardcoded value of a category. Undefined when nothing is close. */\n suggest(category: FindingCategory, value: string, property?: string): TokenSuggestion | undefined {\n switch (category) {\n case 'color':\n return this.suggestColor(value, property);\n case 'spacing':\n case 'size':\n case 'radius':\n case 'border-width':\n case 'font-size': {\n const px = toPx(value);\n if (px === undefined) return undefined;\n const best = this.nearestNumber(this.entries(['dimension'], PATH_FOR[category]), Math.abs(px), (e) => toPx(e.css));\n if (!best) return undefined;\n let conf = this.ratioConfidence(best.d, px);\n if (conf && /em$/.test(value) && !/rem$/.test(value)) conf = Math.min(conf, 0.55); // em depends on the font size\n return conf ? this.make(best.e, best.d, conf) : undefined;\n }\n case 'line-height': {\n const n = Number(value);\n if (!Number.isFinite(n)) return undefined;\n const best = this.nearestNumber(this.entries(['number', 'dimension'], PATH_FOR['line-height']).filter((e) => PATH_FOR['line-height']!.test(e.path)), n, (e) => Number(e.css));\n if (!best) return undefined;\n const conf = best.d < 0.001 ? 1 : best.d <= 0.05 ? 0.8 : best.d <= 0.15 ? 0.5 : 0.25;\n return this.make(best.e, best.d, conf);\n }\n case 'duration': {\n const ms = toMs(value);\n if (ms === undefined) return undefined;\n const cands = this.entries(['duration']).filter((e) => toMs(e.css) !== 0 || ms === 0);\n const best = this.nearestNumber(cands, ms, (e) => toMs(e.css));\n const conf = best ? this.ratioConfidence(best.d, ms) || 0.25 : 0;\n return best ? this.make(best.e, best.d, conf) : undefined;\n }\n case 'easing': {\n const target = bezier(value);\n if (!target) return undefined;\n const scored = this.entries(['cubicBezier'])\n .map((e) => ({ e, b: bezier(e.css) }))\n .filter((s) => s.b)\n .map((s) => ({ e: s.e, d: s.b!.reduce((acc, x, i) => acc + Math.abs(x - target[i]!), 0) }))\n .sort((a, b) => a.d - b.d || (TIER_RANK_SCALE[a.e.tier] ?? 5) - (TIER_RANK_SCALE[b.e.tier] ?? 5));\n const best = scored.find((s) => s.d === scored[0]!.d && /motion/.test(s.e.path)) ?? scored[0];\n if (!best) return undefined;\n return this.make(best.e, best.d, best.d < 0.011 ? 1 : best.d <= 0.3 ? 0.55 : 0.3);\n }\n case 'z-index': {\n const n = Number(value);\n const cands = [...this.entries(['number']), ...this.entries([''])].filter((e) => PATH_FOR['z-index']!.test(e.path));\n const best = this.nearestNumber(cands, n, (e) => Number(e.css));\n if (!best) return undefined;\n return this.make(best.e, best.d, best.d === 0 ? 1 : best.d <= 10 ? 0.5 : 0.25);\n }\n case 'font-weight': {\n const n = WEIGHT_WORDS[value.toLowerCase()] ?? Number(value);\n if (!Number.isFinite(n)) return undefined;\n const cands = [...this.entries(['fontWeight']), ...this.entries(['number'])].filter((e) => PATH_FOR['font-weight']!.test(e.path));\n const best = this.nearestNumber(cands, n, (e) => Number(e.css));\n if (!best) return undefined;\n const conf = best.d === 0 ? (String(n) === value ? 1 : 0.9) : best.d <= 100 ? 0.6 : 0.3;\n return this.make(best.e, best.d / 100, conf);\n }\n case 'font-family': {\n const fam = firstFamily(value);\n const cands = this.entries(['fontFamily']);\n const exact = cands.filter((e) => firstFamily(e.css) === fam).sort((a, b) => (TIER_RANK_SCALE[a.tier] ?? 5) - (TIER_RANK_SCALE[b.tier] ?? 5))[0];\n if (exact) return this.make(exact, 0, value.replace(/\\s/g, '') === exact.css.replace(/\\s/g, '') ? 1 : 0.9);\n const mono = /mono|courier|consol|menlo/.test(value.toLowerCase());\n const generic = cands.filter((e) => (mono ? /mono/.test(e.path) : /sans/.test(e.path))).sort((a, b) => (TIER_RANK_SCALE[a.tier] ?? 5) - (TIER_RANK_SCALE[b.tier] ?? 5))[0];\n return generic ? this.make(generic, 1, 0.3) : undefined;\n }\n case 'shadow': {\n const norm = (s: string) => s.replace(/\\s+/g, ' ').replace(/\\s*,\\s*/g, ', ').trim().toLowerCase();\n const cands = this.entries(['shadow']);\n const exact = cands.find((e) => norm(e.css) === norm(value));\n if (exact) return this.make(exact, 0, 1);\n const t = shadowNums(value);\n const scored = cands\n .map((e) => {\n const n = shadowNums(e.css);\n const len = Math.max(n.length, t.length);\n let d = 0;\n for (let i = 0; i < len; i++) d += Math.abs((n[i] ?? 0) - (t[i] ?? 0));\n return { e, d };\n })\n .sort((a, b) => a.d - b.d || Number(!/elevation/.test(a.e.path)) - Number(!/elevation/.test(b.e.path)));\n const best = scored[0];\n if (!best) return undefined;\n return this.make(best.e, best.d, best.d <= 2 ? 0.75 : best.d <= 8 ? 0.5 : 0.25);\n }\n }\n }\n\n /** Same value as the token (safe to replace): exact level and, for lengths, the same unit. */\n static isExact(s: TokenSuggestion | undefined): boolean {\n return Boolean(s && s.level === 'exact');\n }\n}\n","// TSX/JSX/TS/JS scanner (TypeScript compiler API, syntax only): style objects (style, sx, styled, makeStyles,\n// theme objects), CSS-in-JS templates, Tailwind class strings, color literals, DS token references, and\n// component usage (DS, foreign UI libraries, native elements, re-created DS components).\nimport ts from 'typescript';\nimport { classifyModule, dsEquivalent, isNonVisual, isRouterLink, libraryLabel, nativeEquivalent } from './components';\nimport { scanCssText } from './css';\nimport { isColorLiteral, scanJsStyle, type JsStyleContext, type ValueHit } from './scan-value';\nimport { scanClassString, type TailwindHit } from './tailwind';\nimport type { DesignSystemIndex } from './ds-index';\nimport type { ComponentFinding, FindingCategory, FindingSource, StyleFinding } from './types';\nimport { parseCssColor } from './color';\n\nexport interface CodeScan {\n findings: StyleFinding[];\n tokenUsages: number;\n themeRefs: number;\n /** DS component instances by name. */\n ds: Record<string, number>;\n components: ComponentFinding[];\n /** Local component definitions (PascalCase functions, classes, consts). */\n definitions: { name: string; line: number }[];\n}\n\nconst CLASS_FNS = /^(cn|clsx|classnames|classNames|cva|twMerge|twJoin|tw|cx)$/;\nconst STYLE_FNS = /^(makeStyles|withStyles|createStyles|css|keyframes|globalCss|injectGlobal|sxProps)$/;\nconst THEME_FNS = /^(createTheme|extendTheme|createMuiTheme|responsiveFontSizes|experimental_extendTheme|deepmerge)$/;\nconst CSS_TAGS = /^(styled(\\.\\w+|\\(.*\\)(\\.attrs\\(.*\\))?)|css|keyframes|createGlobalStyle|injectGlobal|tw\\.\\w+)$/s;\nconst MUI_SPACING_ATTR = /^([mp][trblxy]?|(margin|padding)(Top|Bottom|Left|Right|X|Y)?|gap|rowGap|columnGap|spacing)$/;\nconst THEME_REF_RE = /\\btheme\\.(palette|spacing|shape|typography|shadows|zIndex|transitions|vars)\\b/g;\n\n/**\n * DS renderers for pages without React (`@bridge-ds/react/dom`): `badgeHtml()`, `codeBlockHtml()`,\n * `tooltipAttributes()`, `badgeClassName()`. A call imported from a DS package whose name is a component name plus one\n * of these suffixes counts as one instance of that component.\n */\nconst DOM_RENDERER_RE = /^([a-z][A-Za-z0-9]*?)(Html|HTML|HtmlAttributes|Attributes|ClassName)$/;\n\n/** The DS component a DOM renderer stands for: `checklistRowHtml` -> ChecklistRow, else the longest DS name it starts with. */\nexport function domRendererComponent(fn: string, components: Set<string>): string | undefined {\n const m = DOM_RENDERER_RE.exec(fn);\n if (!m) return undefined;\n const pascal = m[1]![0]!.toUpperCase() + m[1]!.slice(1);\n if (components.has(pascal)) return pascal;\n return [...components].filter((c) => pascal.startsWith(c)).sort((a, b) => b.length - a.length)[0];\n}\n\n/**\n * Homemade look-alikes in markup a script builds (`class=\"pill\"`, `data-tip=\"...\"`): the DS component they imitate.\n * Exact class tokens only, so app classes that merely contain the word (`cm-pill-row`) are not counted.\n */\nexport const LOOKALIKE_CLASSES: Record<string, string> = { pill: 'Badge', badge: 'Badge', chip: 'Tag', tooltip: 'Tooltip', tip: 'Tooltip', 'has-tip': 'Tooltip' };\nexport const LOOKALIKE_ATTRS: Record<string, string> = { 'data-tip': 'Tooltip' };\nconst HTML_CLASS_RE = /\\bclass(?:Name)?\\s*=\\s*[\"']([^\"'$]*)/g;\nconst HTML_ATTR_RE = /\\s(data-tip)\\s*=/g;\n\n/** Look-alikes in a class list (`pill is-pass`): one finding per imitated component. */\nexport function lookalikesInClassList(list: string, components: Set<string>): { token: string; component: string }[] {\n const out: { token: string; component: string }[] = [];\n for (const token of list.split(/\\s+/)) {\n const component = LOOKALIKE_CLASSES[token];\n if (component && components.has(component) && !out.some((o) => o.component === component)) out.push({ token, component });\n }\n return out;\n}\n\nfunction kindFor(path: string): ts.ScriptKind {\n return path.endsWith('.tsx') ? ts.ScriptKind.TSX : path.endsWith('.jsx') ? ts.ScriptKind.JSX : path.endsWith('.ts') || path.endsWith('.mts') || path.endsWith('.cts') ? ts.ScriptKind.TS : ts.ScriptKind.JSX;\n}\n\nconst RENDER_PROPS = new Set(['render', 'component', 'as', 'linkComponent', 'LinkComponent']);\n/** `<Comp render={<Link to=\"/x\" />} />`, `render={<a href=\"/x\" />}` or `{ render: <Link /> }`: the element only gives a component its tag or router. */\nfunction isRenderElement(node: ts.JsxOpeningElement | ts.JsxSelfClosingElement): boolean {\n let p: ts.Node = ts.isJsxOpeningElement(node) ? node.parent.parent : node.parent;\n while (ts.isParenthesizedExpression(p)) p = p.parent;\n if (ts.isJsxExpression(p) && ts.isJsxAttribute(p.parent)) return RENDER_PROPS.has(p.parent.name.getText());\n if (ts.isPropertyAssignment(p)) return RENDER_PROPS.has(p.name.getText());\n return false;\n}\n\nconst keyName = (n: ts.PropertyName | undefined): string | undefined =>\n !n ? undefined : ts.isIdentifier(n) || ts.isPrivateIdentifier(n) ? n.text : ts.isStringLiteral(n) || ts.isNumericLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n) ? n.text : undefined;\n\nfunction contextForDeclaration(name: string, typeText: string): JsStyleContext | null {\n if (/SxProps/.test(typeText)) return 'sx';\n if (/CSSProperties|CSSObject/.test(typeText)) return 'style';\n if (/Theme(Options)?\\b/.test(typeText) || /theme$/i.test(name)) return 'theme';\n if (/^(styles?|sx|classes)$|Styles?$|Sx$/.test(name)) return /sx$/i.test(name) ? 'sx' : 'styled';\n return null;\n}\n\n/** Imported name -> module and exported name ('default', '*' for a namespace). */\nexport type ImportMap = Map<string, { module: string; imported: string }>;\n\n/** Import declarations of a script (TS or JS), for markup files whose tags use what the script imports. */\nexport function importsOf(path: string, text: string): ImportMap {\n const sf = ts.createSourceFile(path, text, ts.ScriptTarget.Latest, false, kindFor(path));\n const imports: ImportMap = new Map();\n for (const node of sf.statements) {\n if (!ts.isImportDeclaration(node) || !ts.isStringLiteral(node.moduleSpecifier)) continue;\n const mod = node.moduleSpecifier.text;\n const c = node.importClause;\n if (c?.name) imports.set(c.name.text, { module: mod, imported: 'default' });\n if (c?.namedBindings && ts.isNamespaceImport(c.namedBindings)) imports.set(c.namedBindings.name.text, { module: mod, imported: '*' });\n if (c?.namedBindings && ts.isNamedImports(c.namedBindings)) for (const el of c.namedBindings.elements) imports.set(el.name.text, { module: mod, imported: (el.propertyName ?? el.name).text });\n }\n return imports;\n}\n\n/** One element as written in JSX or in a template (Astro, Vue, Svelte). */\nexport interface TagUse {\n name: string;\n line: number;\n column: number;\n /** Static `type` attribute. */\n type?: string;\n hasHref: boolean;\n /** The element only gives a component its tag or router (`render={<a href=\"/x\" />}`). */\n inRenderProp?: boolean;\n}\n\n/**\n * What an element is: a DS component instance, a foreign, native or re-created component, or nothing (providers,\n * hidden inputs, anchors without href). `localCandidate`: an unimported DS-named tag, re-created only when the file\n * defines it.\n */\nexport function classifyTag(t: TagUse, imports: ImportMap, ds: DesignSystemIndex): { ds?: string; component?: ComponentFinding; localCandidate?: ComponentFinding } {\n const { name } = t;\n const at = { line: t.line, column: t.column };\n if (/^[a-z][\\w-]*$/.test(name)) {\n if (!ds.nativeElements.includes(name)) return {};\n if (name === 'input' && t.type === 'hidden') return {};\n // An anchor without href is not a link (named anchor, placeholder).\n if (name === 'a' && !t.hasHref) return {};\n // `<Button render={<a href=\"/x\" />}>`: the element only gives the DS component its tag; the DS component is the UI.\n if (t.inRenderProp) return {};\n // A native element is a miss only when the design system has a component that replaces it: an <img> is fine in\n // a design system without Image, a <table> in one without Table.\n const suggestion = nativeEquivalent(name, t.type, ds.components);\n if (!suggestion) return {};\n return { component: { ...at, name, kind: 'native', library: 'native', suggestion } };\n }\n const root = name.split('.')[0]!;\n const imp = imports.get(root);\n const ns = imp?.imported === '*';\n // Named imports report the exported name (aliases resolved); namespace imports keep Dialog.Root.\n const shown = imp && !ns && imp.imported !== 'default' ? [imp.imported, ...name.split('.').slice(1)].join('.') : name;\n const leaf = ns && name.includes('.') ? name.split('.').slice(1).join('.') : shown;\n if (imp) {\n const kind = classifyModule(imp.module, ds.packages, ds.foreignLibraries);\n // Providers and other non-visual parts are not UI instances, from the DS or elsewhere.\n if (isNonVisual(leaf.split('.').pop()!)) return {};\n if (kind === 'ds') return { ds: leaf };\n if (kind === 'charts') return { component: { ...at, name: shown, kind: 'foreign', library: libraryLabel(imp.module, kind) } };\n if (kind === 'other' && isRouterLink(imp.module, imp.imported === 'default' ? 'default' : leaf)) {\n if (t.inRenderProp) return {};\n const suggestion = ds.components.has('Link') ? 'Link' : undefined;\n return { component: { ...at, name: shown, kind: 'foreign', library: libraryLabel(imp.module, kind), ...(suggestion ? { suggestion } : {}) } };\n }\n if (kind === 'foreign' || kind === 'shadcn') {\n const suggestion = (ns ? dsEquivalent(root, ds.components) : undefined) ?? dsEquivalent(leaf, ds.components);\n return { component: { ...at, name: shown, kind: 'foreign', library: libraryLabel(imp.module, kind), ...(suggestion ? { suggestion } : {}) } };\n }\n if (kind === 'local' && ds.components.has(leaf.split('.')[0]!)) return { component: { ...at, name: leaf, kind: 'recreated', library: 'local', suggestion: leaf.split('.')[0]! } };\n return {};\n }\n if (ds.components.has(root)) return { localCandidate: { ...at, name, kind: 'recreated', library: 'local', suggestion: root } };\n return {};\n}\n\n/** Findings for Tailwind classes (arbitrary values and palette classes); scale classes count as theme references. */\nexport function tailwindFindings(hits: TailwindHit[], offset: number, pos: (offset: number) => { line: number; column: number }, ds: DesignSystemIndex): { findings: StyleFinding[]; themeRefs: number } {\n const findings: StyleFinding[] = [];\n let themeRefs = 0;\n for (const h of hits) {\n if (h.kind === 'scale') {\n themeRefs++;\n continue;\n }\n if (h.kind === 'token') continue; // counted by the var() pass over every literal\n let cat = h.category!;\n const v = h.value!;\n const isColor = Boolean(parseCssColor(v));\n if (cat === 'color-or-size') cat = isColor ? 'color' : 'font-size';\n else if (cat === 'color-or-width') cat = isColor ? 'color' : 'border-width';\n else if (cat === 'color-or-shadow') cat = isColor ? 'color' : 'shadow';\n else if (cat === 'font') cat = /^\\d{3}$/.test(v) ? 'font-weight' : 'font-family';\n if (cat === 'color' && !isColor) continue;\n const suggestion = ds.suggest(cat as FindingCategory, v);\n const cap = h.kind === 'palette' && suggestion && suggestion.confidence > 0.6 ? { ...suggestion, confidence: 0.6, level: 'medium' as const } : suggestion;\n findings.push({ ...pos(offset + h.index), category: cat as FindingCategory, value: h.cls, source: 'tailwind', ...(cap ? { suggestion: cap } : {}) });\n }\n return { findings, themeRefs };\n}\n\nexport function scanCode(path: string, text: string, ds: DesignSystemIndex): CodeScan {\n const sf = ts.createSourceFile(path, text, ts.ScriptTarget.Latest, true, kindFor(path));\n const out: CodeScan = { findings: [], tokenUsages: 0, themeRefs: 0, ds: {}, components: [], definitions: [] };\n const handled = new Set<ts.Node>();\n const imports: ImportMap = new Map();\n const pos = (offset: number) => {\n const lc = sf.getLineAndCharacterOfPosition(offset);\n return { line: lc.line + 1, column: lc.character + 1 };\n };\n\n const addHit = (h: ValueHit, offset: number, source: FindingSource, property?: string) => {\n const suggestion = ds.suggest(h.category, h.text, property);\n out.findings.push({ ...pos(offset), category: h.category, ...(property ? { property } : {}), value: h.text, source, ...(suggestion ? { suggestion } : {}) });\n };\n\n const addTailwind = (hits: TailwindHit[], offset: number) => {\n const r = tailwindFindings(hits, offset, pos, ds);\n out.themeRefs += r.themeRefs;\n out.findings.push(...r.findings);\n };\n\n // A literal value in a style object: string, number, template parts, both branches of a condition.\n const styleValue = (key: string, node: ts.Expression, ctx: JsStyleContext) => {\n const source: FindingSource = ctx === 'sx' ? 'sx' : ctx === 'style' ? 'style' : ctx === 'theme' ? 'theme' : 'styled';\n if (ts.isParenthesizedExpression(node) || ts.isAsExpression(node) || ts.isSatisfiesExpression(node)) return styleValue(key, node.expression, ctx);\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n handled.add(node);\n const r = scanJsStyle(key, node.text, ctx);\n if (r.themeRef) out.themeRefs++;\n for (const h of r.hits) addHit(h, node.getStart(sf) + 1 + h.index, source, r.hits.length ? cssKey(key) : undefined);\n return;\n }\n if (ts.isNumericLiteral(node) || (ts.isPrefixUnaryExpression(node) && node.operator === ts.SyntaxKind.MinusToken && ts.isNumericLiteral(node.operand))) {\n const n = ts.isNumericLiteral(node) ? Number(node.text) : -Number((node.operand as ts.NumericLiteral).text);\n const r = scanJsStyle(key, n, ctx);\n if (r.themeRef) out.themeRefs++;\n for (const h of r.hits) addHit(h, node.getStart(sf), source, cssKey(key));\n return;\n }\n if (ts.isTemplateExpression(node)) {\n const parts: (ts.TemplateHead | ts.TemplateMiddle | ts.TemplateTail)[] = [node.head, ...node.templateSpans.map((s) => s.literal)];\n for (const p of parts) {\n handled.add(p);\n const r = scanJsStyle(key, p.text, ctx);\n for (const h of r.hits) addHit(h, p.getStart(sf) + 1 + h.index, source, cssKey(key));\n }\n node.templateSpans.forEach((s) => visit(s.expression, ctx, false));\n return;\n }\n if (ts.isConditionalExpression(node)) {\n visit(node.condition, null, false);\n styleValue(key, node.whenTrue, ctx);\n styleValue(key, node.whenFalse, ctx);\n return;\n }\n if (ts.isBinaryExpression(node) && [ts.SyntaxKind.BarBarToken, ts.SyntaxKind.QuestionQuestionToken, ts.SyntaxKind.AmpersandAmpersandToken].includes(node.operatorToken.kind)) {\n styleValue(key, node.left, ctx);\n styleValue(key, node.right, ctx);\n return;\n }\n visit(node, ctx, false);\n };\n const cssKey = (k: string) => k.replace(/^(Webkit|Moz|ms)(?=[A-Z])/, (p) => `-${p.toLowerCase()}`).replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\n const cssTemplate = (tpl: ts.TemplateLiteral) => {\n const start = tpl.getStart(sf) + 1;\n let body = text.slice(start, tpl.getEnd() - 1);\n // ${...} become spaces (keeping newlines) so offsets map back to the file.\n if (ts.isTemplateExpression(tpl)) for (const s of tpl.templateSpans) {\n const a = s.expression.getFullStart() - 2 - start;\n const b = s.literal.getStart(sf) + 1 - start;\n body = body.slice(0, a) + body.slice(a, b).replace(/[^\\n]/g, ' ') + body.slice(b);\n visit(s.expression, null, false);\n }\n const parts = ts.isTemplateExpression(tpl) ? [tpl.head, ...tpl.templateSpans.map((s) => s.literal)] : [tpl];\n parts.forEach((p) => handled.add(p));\n const scan = scanCssText(body, 'scss');\n for (const d of scan.decls) {\n if (d.scan.themeRef) out.themeRefs++;\n for (const h of d.scan.hits) addHit(h, start + d.valueStart + h.index, 'styled', d.property.toLowerCase());\n }\n for (const a of scan.applies) addTailwind(a.hits, start + a.start);\n };\n\n const lookalike = (list: string, offset: number) => {\n for (const l of lookalikesInClassList(list, ds.components)) out.components.push({ ...pos(offset), name: `.${l.token}`, kind: 'recreated', library: 'local', suggestion: l.component });\n };\n\n const classLiteral = (node: ts.Node) => {\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n handled.add(node);\n lookalike(node.text, node.getStart(sf) + 1);\n addTailwind(scanClassString(node.text), node.getStart(sf) + 1);\n } else if (ts.isTemplateExpression(node)) {\n for (const p of [node.head, ...node.templateSpans.map((s) => s.literal)]) {\n handled.add(p);\n lookalike(p.text, p.getStart(sf) + 1);\n addTailwind(scanClassString(p.text), p.getStart(sf) + 1);\n }\n node.templateSpans.forEach((s) => visit(s.expression, null, true));\n } else visit(node, null, true);\n };\n\n const jsxName = (n: ts.JsxTagNameExpression) => n.getText(sf);\n\n const element = (node: ts.JsxOpeningElement | ts.JsxSelfClosingElement) => {\n const name = jsxName(node.tagName);\n const typeAttr = node.attributes.properties.find((p): p is ts.JsxAttribute => ts.isJsxAttribute(p) && p.name.getText(sf) === 'type');\n const type = typeAttr?.initializer && ts.isStringLiteral(typeAttr.initializer) ? typeAttr.initializer.text : undefined;\n const hasHref = node.attributes.properties.some((p) => ts.isJsxAttribute(p) && p.name.getText(sf) === 'href');\n const r = classifyTag({ name, ...pos(node.getStart(sf)), ...(type !== undefined ? { type } : {}), hasHref, inRenderProp: isRenderElement(node) }, imports, ds);\n if (r.ds) out.ds[r.ds] = (out.ds[r.ds] ?? 0) + 1;\n if (r.component) out.components.push(r.component);\n if (r.localCandidate) pendingLocal.push(r.localCandidate);\n };\n const pendingLocal: ComponentFinding[] = [];\n\n function visit(node: ts.Node, ctx: JsStyleContext | null, classCtx: boolean): void {\n if (ts.isImportDeclaration(node)) {\n const mod = (node.moduleSpecifier as ts.StringLiteral).text;\n handled.add(node.moduleSpecifier);\n const c = node.importClause;\n if (c?.name) imports.set(c.name.text, { module: mod, imported: 'default' });\n if (c?.namedBindings && ts.isNamespaceImport(c.namedBindings)) imports.set(c.namedBindings.name.text, { module: mod, imported: '*' });\n if (c?.namedBindings && ts.isNamedImports(c.namedBindings)) for (const el of c.namedBindings.elements) imports.set(el.name.text, { module: mod, imported: (el.propertyName ?? el.name).text });\n return;\n }\n if ((ts.isExportDeclaration(node) && node.moduleSpecifier) || (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword)) {\n node.forEachChild((c) => handled.add(c));\n }\n if (ts.isFunctionDeclaration(node) && node.name && /^[A-Z]/.test(node.name.text)) out.definitions.push({ name: node.name.text, line: pos(node.getStart(sf)).line });\n if (ts.isClassDeclaration(node) && node.name && /^[A-Z]/.test(node.name.text)) out.definitions.push({ name: node.name.text, line: pos(node.getStart(sf)).line });\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)) {\n const name = node.name.text;\n const init = node.initializer;\n if (/^[A-Z]/.test(name) && init && (ts.isArrowFunction(init) || ts.isFunctionExpression(init) || (ts.isCallExpression(init) && /^(React\\.)?(forwardRef|memo)$/.test(init.expression.getText(sf)))))\n out.definitions.push({ name, line: pos(node.getStart(sf)).line });\n // const Root = styled(Card)(...): Root renders the imported component, same library.\n if (init && ts.isCallExpression(init) && ts.isCallExpression(init.expression) && init.expression.expression.getText(sf) === 'styled') {\n const base = init.expression.arguments[0];\n const from = base && ts.isIdentifier(base) ? imports.get(base.text) : undefined;\n if (from) imports.set(name, { ...from, imported: from.imported === 'default' || from.imported === '*' ? base!.getText(sf) : from.imported });\n }\n const declCtx = contextForDeclaration(name, node.type?.getText(sf) ?? '');\n if (declCtx && init) {\n visit(init, declCtx, classCtx);\n return;\n }\n }\n if (ts.isJsxAttribute(node)) {\n const name = node.name.getText(sf);\n const init = node.initializer;\n if (!init) return;\n const expr = ts.isJsxExpression(init) ? init.expression : init;\n if (!expr) return;\n if (/^(className|class|tw)$/.test(name)) return classLiteral(expr);\n if (name === 'style' || /Style$/.test(name)) return visit(expr, 'style', false);\n if (name === 'sx' || /Sx$/.test(name)) return visit(expr, 'sx', false);\n if (name === 'css') return visit(expr, 'style', false);\n if (ts.isStringLiteral(expr) && isColorLiteral(expr.text)) {\n handled.add(expr);\n addHit({ category: 'color', text: expr.text, index: 0 }, expr.getStart(sf) + 1, 'jsx-attr', name);\n return;\n }\n if (MUI_SPACING_ATTR.test(name) && ts.isNumericLiteral(expr)) {\n out.themeRefs++;\n return;\n }\n return visit(expr, ctx, classCtx);\n }\n if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) element(node);\n if (ts.isTaggedTemplateExpression(node) && CSS_TAGS.test(node.tag.getText(sf))) {\n cssTemplate(node.template);\n return;\n }\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {\n const imp = imports.get(node.expression.text);\n if (imp && imp.imported !== '*' && classifyModule(imp.module, ds.packages, ds.foreignLibraries) === 'ds') {\n const comp = domRendererComponent(imp.imported === 'default' ? node.expression.text : imp.imported, ds.components);\n if (comp) out.ds[comp] = (out.ds[comp] ?? 0) + 1;\n }\n }\n // el.className = 'pill is-pass': a class list set from a script.\n if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken && ts.isPropertyAccessExpression(node.left) && node.left.name.text === 'className') {\n visit(node.left, ctx, classCtx);\n return classLiteral(node.right);\n }\n if (ts.isCallExpression(node)) {\n const callee = node.expression.getText(sf);\n if (CLASS_FNS.test(callee)) {\n node.arguments.forEach((a) => visitClassArg(a));\n return;\n }\n const argCtx: JsStyleContext | null = /^styled(\\.|\\(|$)/.test(callee) || STYLE_FNS.test(callee) ? 'styled' : THEME_FNS.test(callee) ? 'theme' : null;\n if (argCtx) {\n visit(node.expression, ctx, classCtx);\n node.arguments.forEach((a) => visit(a, argCtx, false));\n return;\n }\n }\n if (ts.isPropertyAssignment(node)) {\n const key = keyName(node.name);\n if (key !== undefined) {\n if (key === 'className' || key === 'class') return classLiteral(node.initializer);\n if (key === 'sx' || key === 'style' || key === 'styleOverrides' || /Sx$/.test(key)) {\n return visit(node.initializer, key === 'style' ? 'style' : key === 'styleOverrides' ? 'styled' : 'sx', false);\n }\n if (ctx) {\n if (ts.isObjectLiteralExpression(node.initializer) || ts.isArrowFunction(node.initializer) || ts.isArrayLiteralExpression(node.initializer)) return visit(node.initializer, ctx, classCtx);\n return styleValue(key, node.initializer, ctx);\n }\n }\n }\n if (classCtx && (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node) || ts.isTemplateExpression(node))) return classLiteral(node);\n node.forEachChild((c) => visit(c, ctx, classCtx));\n }\n\n // cn(...), cva(...) arguments: strings, arrays, conditionals and the cva config object are class strings.\n const visitClassArg = (n: ts.Node): void => {\n if (ts.isStringLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n) || ts.isTemplateExpression(n)) return classLiteral(n);\n if (ts.isPropertyAssignment(n)) {\n if (ts.isStringLiteral(n.name)) {\n handled.add(n.name);\n addTailwind(scanClassString(n.name.text), n.name.getStart(sf) + 1);\n }\n return visitClassArg(n.initializer);\n }\n n.forEachChild(visitClassArg);\n };\n\n visit(sf, null, false);\n\n // Every remaining literal: DS token references, other CSS variables, color literals anywhere in code.\n const literal = (node: ts.Node) => {\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node) || ts.isTemplateHead(node) || ts.isTemplateMiddle(node) || ts.isTemplateTail(node)) {\n const t = (node as ts.LiteralLikeNode).text;\n // Markup built in strings (`<span class=\"pill\">`, `data-tip=\"...\"`): homemade look-alikes of DS components.\n if (!handled.has(node) && (t.includes('<') || ts.isTemplateMiddle(node) || ts.isTemplateTail(node))) {\n const base = node.getStart(sf) + 1;\n for (const m of t.matchAll(HTML_CLASS_RE)) for (const l of lookalikesInClassList(m[1]!, ds.components)) out.components.push({ ...pos(base + m.index!), name: `.${l.token}`, kind: 'recreated', library: 'local', suggestion: l.component });\n for (const m of t.matchAll(HTML_ATTR_RE)) {\n const component = LOOKALIKE_ATTRS[m[1]!];\n if (component && ds.components.has(component)) out.components.push({ ...pos(base + m.index! + 1), name: `[${m[1]}]`, kind: 'recreated', library: 'local', suggestion: component });\n }\n }\n for (const m of t.matchAll(/var\\(\\s*(--[\\w-]+)/g)) {\n if (ds.isDsVar(m[1]!)) out.tokenUsages++;\n else out.themeRefs++;\n }\n if (!handled.has(node) && ts.isStringLiteral(node) && isColorLiteral(t) && !ts.isImportDeclaration(node.parent) && !ts.isExternalModuleReference(node.parent)) {\n addHit({ category: 'color', text: t.trim(), index: 0 }, node.getStart(sf) + 1, 'js', ts.isPropertyAssignment(node.parent) ? keyName(node.parent.name) : undefined);\n }\n }\n node.forEachChild(literal);\n };\n literal(sf);\n out.themeRefs += [...text.matchAll(THEME_REF_RE)].length;\n\n // DS-named components defined in this file (hoisting: definitions may follow their use).\n const defined = new Set(out.definitions.map((d) => d.name));\n out.components.push(...pendingLocal.filter((f) => defined.has(f.suggestion!)));\n out.findings.sort((a, b) => a.line - b.line || a.column - b.column);\n out.components.sort((a, b) => a.line - b.line || a.column - b.column);\n return out;\n}\n","// Escape hatches that keep a known exception out of the counts without hiding it: a comment on the line above\n// (`bridge-audit-ignore-next-line: reason`, in any comment syntax) and an allowlist file of file:line entries.\n// Both need a reason, and both keep the ignored items in the report.\nimport { lineCol } from './css';\nimport type { AllowlistEntry, ComponentFinding, IgnoredItem, IgnoreVia, StyleFinding } from './types';\n\nexport const IGNORE_DIRECTIVE = 'bridge-audit-ignore-next-line';\n\nexport interface IgnoreDirective {\n /** Line of the comment (1-based). */\n line: number;\n /** Line it applies to: the one after the comment ends. */\n target: number;\n /** Empty when the comment gives none: such a comment ignores nothing. */\n reason: string;\n}\n\n/**\n * Every `bridge-audit-ignore-next-line` comment in a file: `<!-- ...: reason -->` (HTML, Astro, Vue, Svelte),\n * `{/* ...: reason *\\/}` (JSX, Astro expressions), `/* ...: reason *\\/` (CSS) and `// ...: reason` (scripts).\n * The text after the colon is the reason. A mention outside a comment is not a directive.\n */\nexport function ignoreDirectives(text: string): IgnoreDirective[] {\n const at = lineCol(text);\n const out: IgnoreDirective[] = [];\n for (const m of text.matchAll(new RegExp(`${IGNORE_DIRECTIVE}\\\\b`, 'g'))) {\n const start = m.index!;\n // Only white space between the comment opener and the directive (a block comment may open on the line above).\n const opener = /(<!--|\\/\\*|\\/\\/)(\\s*)$/.exec(text.slice(Math.max(0, start - 200), start));\n const open = opener?.[1];\n if (!open || (open === '//' && opener[2]!.includes('\\n'))) continue;\n const from = start + m[0].length;\n let end: number;\n if (open === '//') {\n end = text.indexOf('\\n', from);\n if (end < 0) end = text.length;\n } else {\n end = text.indexOf(open === '<!--' ? '-->' : '*/', from);\n if (end < 0) continue;\n }\n const reason = text.slice(from, end).replace(/^\\s*:?/, '').replace(/\\s+/g, ' ').trim();\n out.push({ line: at(start).line, target: at(end).line + 1, reason });\n }\n return out;\n}\n\nexport interface IgnoreResult {\n findings: StyleFinding[];\n components: ComponentFinding[];\n ignored: IgnoredItem[];\n}\n\nconst item = (x: StyleFinding | ComponentFinding, reason: string, via: IgnoreVia): IgnoredItem =>\n 'category' in x\n ? { line: x.line, column: x.column, kind: 'value', what: x.value, reason, via }\n : { line: x.line, column: x.column, kind: 'component', what: x.name, reason, via };\n\n/** Apply the file's ignore comments. Comments without a reason, or that match nothing, are reported as errors. */\nexport function applyIgnoreComments(text: string, findings: StyleFinding[], components: ComponentFinding[]): IgnoreResult & { errors: { line: number; message: string }[] } {\n const errors: { line: number; message: string }[] = [];\n const reasons = new Map<number, string>();\n for (const d of ignoreDirectives(text)) {\n if (!d.reason) {\n errors.push({ line: d.line, message: `${IGNORE_DIRECTIVE} needs a reason after a colon (${IGNORE_DIRECTIVE}: why this one stays); nothing was ignored` });\n continue;\n }\n if (!findings.some((f) => f.line === d.target) && !components.some((c) => c.line === d.target)) {\n errors.push({ line: d.line, message: `${IGNORE_DIRECTIVE} ignores nothing: line ${d.target} has no finding; remove the comment` });\n continue;\n }\n reasons.set(d.target, d.reason);\n }\n const ignored: IgnoredItem[] = [];\n const keep = <T extends StyleFinding | ComponentFinding>(xs: T[]) =>\n xs.filter((x) => {\n const r = reasons.get(x.line);\n if (r === undefined) return true;\n ignored.push(item(x, r, 'comment'));\n return false;\n });\n return { findings: keep(findings), components: keep(components), ignored, errors };\n}\n\n/** Apply allowlist entries for one file; returns what each entry matched (index in `entries`). */\nexport function applyAllowlist(entries: AllowlistEntry[], findings: StyleFinding[], components: ComponentFinding[]): IgnoreResult & { used: Set<number> } {\n const used = new Set<number>();\n const ignored: IgnoredItem[] = [];\n const keep = <T extends StyleFinding | ComponentFinding>(xs: T[]) =>\n xs.filter((x) => {\n const what = 'category' in x ? x.value : x.name;\n const fits = (e: AllowlistEntry) => e.line === x.line && (e.what === undefined || e.what === what);\n // One entry per item when the list has one per item (two links on a line); else one entry covers them all.\n let i = entries.findIndex((e, k) => fits(e) && !used.has(k));\n if (i < 0) i = entries.findIndex(fits);\n if (i < 0) return true;\n used.add(i);\n ignored.push(item(x, entries[i]!.reason, 'allowlist'));\n return false;\n });\n return { findings: keep(findings), components: keep(components), ignored, used };\n}\n\n/** Validate an allowlist file's JSON: `{ \"entries\": [{ \"file\", \"line\", \"what\"?, \"reason\" }] }`, a reason on each entry. */\nexport function parseAllowlist(json: unknown): AllowlistEntry[] {\n const fail = (msg: string): never => {\n throw new Error(`allowlist: ${msg}`);\n };\n if (!json || typeof json !== 'object' || !Array.isArray((json as { entries?: unknown }).entries)) fail('expected { \"entries\": [...] }');\n return ((json as { entries: unknown[] }).entries).map((e, i) => {\n const x = e as Partial<AllowlistEntry>;\n if (typeof x.file !== 'string' || !x.file) fail(`entry ${i} needs \"file\"`);\n if (typeof x.line !== 'number' || !Number.isInteger(x.line) || x.line < 1) fail(`entry ${i} (${x.file}) needs a \"line\" number`);\n if (typeof x.reason !== 'string' || !x.reason.trim()) fail(`entry ${i} (${x.file}:${x.line}) needs a \"reason\"`);\n if (x.what !== undefined && typeof x.what !== 'string') fail(`entry ${i} (${x.file}:${x.line}): \"what\" must be a string`);\n return { file: x.file!, line: x.line!, ...(x.what !== undefined ? { what: x.what } : {}), reason: x.reason!.trim() };\n });\n}\n","// Style sheets (CSS, SCSS, Less files and the <style> blocks of Astro, Vue and Svelte files): hardcoded values with\n// the closest token, DS token references, other theme references, and which literals the autofix may replace.\nimport { parseCssColor } from './color';\nimport { scanCssText } from './css';\nimport type { DesignSystemIndex } from './ds-index';\nimport type { FindingCategory, FindingSource, StyleFinding, TokenSuggestion } from './types';\n\n/** A literal the CSS autofix may replace: exact token value, same spelling for lengths and durations. */\nexport function isSafeFix(h: { category: FindingCategory; text: string }, s: TokenSuggestion | undefined): boolean {\n if (!s || s.level !== 'exact') return false;\n switch (h.category) {\n case 'color': {\n const a = parseCssColor(h.text);\n const b = parseCssColor(s.value);\n return Boolean(a && b && s.distance <= 0.5 && Math.abs(a.a - b.a) < 0.01);\n }\n case 'spacing':\n case 'size':\n case 'radius':\n case 'border-width':\n case 'font-size':\n case 'duration':\n case 'z-index':\n case 'font-weight':\n case 'line-height':\n return h.text.trim() === s.value.trim();\n case 'shadow':\n return s.distance === 0;\n default:\n return false;\n }\n}\n\nexport interface CssAudit {\n findings: StyleFinding[];\n tokenUsages: number;\n themeRefs: number;\n}\n\n/**\n * Audit style sheet text. `offset` places the text inside a larger file (a <style> block, a style attribute) and\n * `pos` maps a file offset to its line and column. `source` labels the findings (`css` for sheets, `style` for\n * style attributes); only `css` findings are marked for the autofix, which rewrites CSS files.\n */\nexport function auditCssText(\n text: string,\n lang: 'css' | 'scss' | 'less',\n ds: DesignSystemIndex,\n opts: { pos: (offset: number) => { line: number; column: number }; offset?: number; source?: FindingSource },\n): CssAudit {\n const base = opts.offset ?? 0;\n const source = opts.source ?? 'css';\n const at = (o: number) => opts.pos(base + o);\n const scan = scanCssText(text, lang);\n const findings: StyleFinding[] = [];\n let tokenUsages = 0;\n let themeRefs = 0;\n for (const d of scan.decls) {\n for (const v of d.scan.vars) ds.isDsVar(v) ? tokenUsages++ : themeRefs++;\n if (d.scan.themeRef) themeRefs++;\n else if (lang !== 'css' && !d.property.startsWith('$')) themeRefs += (d.value.match(/\\$[\\w-]+/g) ?? []).length;\n const property = d.property.toLowerCase();\n for (const h of d.scan.hits) {\n const suggestion = ds.suggest(h.category, h.text, property);\n const autofix = source === 'css' && isSafeFix(h, suggestion);\n findings.push({ ...at(d.valueStart + h.index), category: h.category, property, value: h.text, source, ...(suggestion ? { suggestion } : {}), ...(autofix ? { autofix: true } : {}) });\n }\n }\n for (const a of scan.applies) {\n for (const h of a.hits) {\n if (h.kind === 'scale') themeRefs++;\n else if (h.kind !== 'token' && h.value) {\n const cat: FindingCategory = parseCssColor(h.value) ? 'color' : h.category === 'color-or-size' ? 'font-size' : h.category === 'color-or-width' ? 'border-width' : h.category === 'color-or-shadow' ? 'shadow' : h.category === 'font' ? 'font-family' : (h.category as FindingCategory);\n const suggestion = ds.suggest(cat, h.value);\n findings.push({ ...at(a.start + h.index), category: cat, value: h.cls, source: 'tailwind', ...(suggestion ? { suggestion } : {}) });\n } else if (h.kind === 'token' && h.value) {\n const v = /var\\(\\s*(--[\\w-]+)/.exec(h.value)?.[1];\n if (v && ds.isDsVar(v)) tokenUsages++;\n else themeRefs++;\n }\n }\n }\n findings.sort((x, y) => x.line - y.line || x.column - y.column);\n return { findings, tokenUsages, themeRefs };\n}\n","// Astro, Vue and Svelte files: the frontmatter and <script> blocks go through the TS scanner, <style> blocks\n// through the style sheet audit, and the template markup is read here: DS components used as tags, native\n// elements a DS component should render, re-created DS components, style and class attributes, color attributes.\nimport { classifyTag, importsOf, LOOKALIKE_ATTRS, lookalikesInClassList, scanCode, tailwindFindings, type CodeScan, type ImportMap } from './code';\nimport { lineCol } from './css';\nimport type { DesignSystemIndex } from './ds-index';\nimport { isColorLiteral } from './scan-value';\nimport { auditCssText } from './style';\nimport { scanClassString } from './tailwind';\nimport type { ComponentFinding } from './types';\n\nexport type MarkupLang = 'astro' | 'vue' | 'svelte';\nexport const MARKUP_EXTENSIONS = ['.astro', '.vue', '.svelte'];\n\ninterface Range {\n start: number;\n end: number;\n}\ninterface Block extends Range {\n attrs: string;\n}\n\n/** Same length as `text`, with every character outside (or inside) the ranges blanked; newlines stay. */\nfunction mask(text: string, ranges: Range[], keepInside: boolean): string {\n const inside = new Uint8Array(text.length);\n for (const r of ranges) inside.fill(1, r.start, r.end);\n let out = '';\n for (let i = 0; i < text.length; i++) {\n const c = text[i]!;\n out += c === '\\n' || Boolean(inside[i]) === keepInside ? c : ' ';\n }\n return out;\n}\n\nconst attrOf = (attrs: string, name: string) => new RegExp(`(?:^|\\\\s)${name}\\\\s*=\\\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\\\s>]+))`, 'i').exec(attrs)?.slice(1).find((v) => v !== undefined);\n\n/** Script blocks that hold code (not JSON data or templates). */\nconst isCodeScript = (attrs: string) => {\n const type = attrOf(attrs, 'type')?.toLowerCase();\n return !type || ['module', 'text/javascript', 'application/javascript', 'text/typescript', 'ts', 'text/babel'].includes(type);\n};\n\n/** Frontmatter (Astro), script and style blocks, and the template ranges between them. */\nexport function markupBlocks(text: string, lang: MarkupLang): { frontmatter?: Range; scripts: Block[]; styles: Block[]; nonTemplate: Range[] } {\n const nonTemplate: Range[] = [];\n let frontmatter: Range | undefined;\n let from = 0;\n if (lang === 'astro') {\n const open = /^\\s*---[^\\S\\n]*\\n/.exec(text);\n if (open) {\n const close = /\\n---[^\\S\\n]*(\\n|$)/g;\n close.lastIndex = open[0].length - 1;\n const m = close.exec(text);\n if (m) {\n frontmatter = { start: open[0].length, end: m.index + 1 };\n from = m.index + m[0].length;\n nonTemplate.push({ start: 0, end: from });\n }\n }\n }\n const scripts: Block[] = [];\n const styles: Block[] = [];\n const re = /<(script|style)\\b((?:[^>\"']|\"[^\"]*\"|'[^']*')*)>([\\s\\S]*?)<\\/\\1\\s*>/gi;\n re.lastIndex = from;\n for (let m; (m = re.exec(text)); ) {\n const contentStart = m.index + m[0].indexOf('>', m[1]!.length + 1 + m[2]!.length) + 1;\n const block = { start: contentStart, end: contentStart + m[3]!.length, attrs: m[2]! };\n (m[1]!.toLowerCase() === 'script' ? scripts : styles).push(block);\n nonTemplate.push({ start: m.index, end: m.index + m[0].length });\n }\n for (const m of text.slice(from).matchAll(/<!--[\\s\\S]*?-->/g)) nonTemplate.push({ start: from + m.index!, end: from + m.index! + m[0].length });\n return { ...(frontmatter ? { frontmatter } : {}), scripts, styles, nonTemplate };\n}\n\n/** Index after the `}` that closes the `{` at `i` (strings, template literals and nesting included). */\nfunction closeBrace(s: string, i: number): number {\n let depth = 0;\n for (let k = i; k < s.length; k++) {\n const c = s[k]!;\n if (c === '{') depth++;\n else if (c === '}') {\n if (--depth === 0) return k + 1;\n } else if (c === '\"' || c === \"'\") {\n const e = s.indexOf(c, k + 1);\n if (e < 0) return s.length;\n k = e;\n } else if (c === '`') {\n for (k++; k < s.length && s[k] !== '`'; k++) {\n if (s[k] === '\\\\') k++;\n else if (s[k] === '$' && s[k + 1] === '{') k = closeBrace(s, k + 1) - 1;\n }\n }\n }\n return s.length;\n}\n\ninterface Attr {\n name: string;\n /** static: quoted or bare text; expr: a JS expression (`{...}` in Astro and Svelte, `:x=\"...\"` in Vue). */\n kind: 'static' | 'expr' | 'bare' | 'spread';\n value: string;\n valueStart: number;\n}\n\n/** Attributes of the tag whose name ends at `i`, up to its closing `>`. */\nfunction readTag(s: string, i: number, lang: MarkupLang): { attrs: Attr[]; end: number; selfClosing: boolean } {\n const attrs: Attr[] = [];\n let k = i;\n while (k < s.length) {\n while (k < s.length && /\\s/.test(s[k]!)) k++;\n const c = s[k];\n if (c === undefined) break;\n if (c === '>') return { attrs, end: k + 1, selfClosing: false };\n if (c === '/' && s[k + 1] === '>') return { attrs, end: k + 2, selfClosing: true };\n if (c === '{') {\n // `{...props}` spread or `{href}` shorthand.\n const e = closeBrace(s, k);\n const inner = s.slice(k + 1, e - 1).trim();\n attrs.push(inner.startsWith('...') ? { name: '', kind: 'spread', value: inner, valueStart: k + 1 } : { name: inner, kind: 'expr', value: inner, valueStart: k + 1 });\n k = e;\n continue;\n }\n const nm = /^[^\\s=>/\"'{]+/.exec(s.slice(k, k + 200));\n if (!nm) {\n k++;\n continue;\n }\n const name = nm[0];\n k += name.length;\n let j = k;\n while (j < s.length && /\\s/.test(s[j]!)) j++;\n if (s[j] !== '=') {\n attrs.push({ name, kind: 'bare', value: '', valueStart: k });\n continue;\n }\n j++;\n while (j < s.length && /\\s/.test(s[j]!)) j++;\n const q = s[j];\n const bound = lang === 'vue' && /^(:|v-bind:|v-on:|@|v-)/.test(name);\n if (q === '\"' || q === \"'\") {\n const e = s.indexOf(q, j + 1);\n const end = e < 0 ? s.length : e;\n attrs.push({ name, kind: bound ? 'expr' : 'static', value: s.slice(j + 1, end), valueStart: j + 1 });\n k = end + 1;\n } else if (q === '{') {\n const e = closeBrace(s, j);\n attrs.push({ name, kind: 'expr', value: s.slice(j + 1, e - 1), valueStart: j + 1 });\n k = e;\n } else {\n const m = /^[^\\s>]+/.exec(s.slice(j));\n const v = m?.[0].replace(/\\/$/, '') ?? '';\n attrs.push({ name, kind: 'static', value: v, valueStart: j });\n k = j + v.length;\n }\n }\n return { attrs, end: s.length, selfClosing: false };\n}\n\n/** `:href`, `v-bind:href`, `bind:value` -> `href`, `value`. */\nconst attrName = (n: string) => n.replace(/^(v-bind:|:|bind:)/, '');\nconst pascal = (kebab: string) => kebab.replace(/(^|-)([a-z0-9])/g, (_m, _d, c: string) => c.toUpperCase());\nconst NO_COLOR_ATTR_TAGS = new Set(['meta', 'link']);\n\n/** Audit an Astro, Vue or Svelte file. Line and column numbers are the file's own. */\nexport function scanMarkup(path: string, text: string, lang: MarkupLang, ds: DesignSystemIndex): CodeScan {\n const out: CodeScan = { findings: [], tokenUsages: 0, themeRefs: 0, ds: {}, components: [], definitions: [] };\n const pos = lineCol(text);\n const blocks = markupBlocks(text, lang);\n const imports: ImportMap = new Map();\n\n const merge = (c: CodeScan) => {\n out.findings.push(...c.findings);\n out.tokenUsages += c.tokenUsages;\n out.themeRefs += c.themeRefs;\n for (const [n, k] of Object.entries(c.ds)) out.ds[n] = (out.ds[n] ?? 0) + k;\n out.components.push(...c.components);\n out.definitions.push(...c.definitions);\n };\n\n // Frontmatter and scripts: the TS scanner on the file with everything else blanked, so positions stay put.\n const codeRanges = [...(blocks.frontmatter ? [{ ...blocks.frontmatter, attrs: '' }] : []), ...blocks.scripts.filter((b) => isCodeScript(b.attrs))];\n for (const r of codeRanges) {\n const jsx = /^(tsx|jsx)$/i.test(attrOf(r.attrs, 'lang') ?? '');\n const code = mask(text, [r], true);\n const file = `${path}.${jsx ? 'tsx' : 'ts'}`;\n merge(scanCode(file, code, ds));\n for (const [k, v] of importsOf(file, code)) imports.set(k, v);\n }\n\n for (const b of blocks.styles) {\n const l = (attrOf(b.attrs, 'lang') ?? 'css').toLowerCase();\n const r = auditCssText(text.slice(b.start, b.end), l === 'scss' || l === 'sass' ? 'scss' : l === 'less' ? 'less' : 'css', ds, { pos, offset: b.start });\n out.findings.push(...r.findings);\n out.tokenUsages += r.tokenUsages;\n out.themeRefs += r.themeRefs;\n }\n\n /** A JS expression from the template, scanned in place: a prefix line above it keeps its line and column. */\n const scanExpr = (prefix: string, expr: string, offset: number, suffix: string, keepLookalikes = false) => {\n const { line, column } = pos(offset);\n const src = line >= 2 ? `${'\\n'.repeat(line - 2)}${prefix}\\n${' '.repeat(column - 1)}${expr}${suffix}` : `${prefix}${expr}${suffix}`;\n const c = scanCode(`${path}.tsx`, src, ds);\n merge({ ...c, components: keepLookalikes ? c.components.filter((x) => x.kind === 'recreated' && x.name.startsWith('.')) : [], definitions: [], ds: {} });\n };\n\n const styleAttr = (a: Attr) => {\n if (a.kind === 'static') {\n const css = lang === 'svelte' ? a.value.replace(/\\{[^}]*\\}/g, (m) => ' '.repeat(m.length)) : a.value;\n const r = auditCssText(css, 'css', ds, { pos, offset: a.valueStart, source: 'style' });\n out.findings.push(...r.findings);\n out.tokenUsages += r.tokenUsages;\n out.themeRefs += r.themeRefs;\n return;\n }\n const str = /^(\\s*)([`'\"])([\\s\\S]*)\\2\\s*$/.exec(a.value);\n if (str) {\n // A string or template literal: its text is CSS; `${...}` parts are left out.\n const body = str[3]!.replace(/\\$\\{[^}]*\\}/g, (m) => ' '.repeat(m.length));\n const r = auditCssText(body, 'css', ds, { pos, offset: a.valueStart + str[1]!.length + 1, source: 'style' });\n out.findings.push(...r.findings);\n out.tokenUsages += r.tokenUsages;\n out.themeRefs += r.themeRefs;\n return;\n }\n scanExpr('const style: CSSProperties =', a.value, a.valueStart, ';');\n };\n\n // Template markup: the file with frontmatter, scripts, styles and comments blanked.\n const tpl = mask(text, blocks.nonTemplate, false);\n const pending: ComponentFinding[] = [];\n let noscript = 0;\n const TAG = /<(\\/?)([A-Za-z][\\w.:-]*)/g;\n for (let m; (m = TAG.exec(tpl)); ) {\n const raw = m[2]!;\n if (m[1]) {\n if (raw.toLowerCase() === 'noscript') noscript = Math.max(0, noscript - 1);\n continue;\n }\n const tag = readTag(tpl, m.index + m[0].length, lang);\n TAG.lastIndex = tag.end;\n const lower = raw.toLowerCase();\n if (lower === 'noscript' && !tag.selfClosing) {\n noscript++;\n continue;\n }\n const attrs = tag.attrs;\n const get = (n: string) => attrs.find((a) => attrName(a.name) === n);\n\n for (const a of attrs) {\n const n = attrName(a.name);\n if (n === 'style') styleAttr(a);\n else if (lang === 'svelte' && a.name.startsWith('style:') && a.kind === 'static') {\n const prop = a.name.slice(6).split('|')[0]!;\n const r = auditCssText(`${prop}:${a.value}`, 'css', ds, { pos, offset: a.valueStart - prop.length - 1, source: 'style' });\n out.findings.push(...r.findings);\n out.tokenUsages += r.tokenUsages;\n out.themeRefs += r.themeRefs;\n } else if (/^(class|className|class:list)$/.test(n)) {\n if (a.kind === 'static') {\n // Homemade look-alikes (`class=\"pill\"`, `class=\"tooltip\"`): the DS component they imitate.\n for (const l of lookalikesInClassList(a.value, ds.components)) out.components.push({ ...pos(a.valueStart), name: `.${l.token}`, kind: 'recreated', library: 'local', suggestion: l.component });\n const r = tailwindFindings(scanClassString(a.value), a.valueStart, pos, ds);\n out.findings.push(...r.findings);\n out.themeRefs += r.themeRefs;\n } else if (a.kind === 'expr') scanExpr('cn(', a.value, a.valueStart, ')', true);\n } else if (LOOKALIKE_ATTRS[n] && ds.components.has(LOOKALIKE_ATTRS[n]!)) {\n out.components.push({ ...pos(a.valueStart - a.name.length - 1), name: `[${n}]`, kind: 'recreated', library: 'local', suggestion: LOOKALIKE_ATTRS[n]! });\n } else if (a.kind === 'static' && !NO_COLOR_ATTR_TAGS.has(lower) && isColorLiteral(a.value)) {\n const suggestion = ds.suggest('color', a.value.trim(), n);\n out.findings.push({ ...pos(a.valueStart), category: 'color', property: n, value: a.value.trim(), source: 'jsx-attr', ...(suggestion ? { suggestion } : {}) });\n }\n }\n\n let name = raw;\n if (raw.includes(':')) continue; // svelte:head, Vue and Svelte directives as tags\n if (raw.includes('-')) {\n // Vue and Svelte may write imported components in kebab case; any other dashed tag is a custom element.\n if (!imports.has(pascal(raw))) continue;\n name = pascal(raw);\n }\n const isNative = /^[a-z]/.test(name) && !name.includes('.');\n if (isNative && noscript > 0) continue; // fallback markup for no-JS browsers\n const type = get('type');\n const r = classifyTag({ name, ...pos(m.index), ...(type?.kind === 'static' ? { type: type.value } : {}), hasHref: Boolean(get('href')) }, imports, ds);\n if (r.ds) out.ds[r.ds] = (out.ds[r.ds] ?? 0) + 1;\n if (r.component) out.components.push(r.component);\n if (r.localCandidate) pending.push(r.localCandidate);\n }\n\n // The file itself defines a component named after it (Button.vue, Card.astro).\n const base = /([^/]+)\\.(astro|vue|svelte)$/.exec(path)?.[1];\n if (base && /^[A-Z][A-Za-z0-9]*$/.test(base)) out.definitions.push({ name: base, line: 1 });\n const defined = new Set(out.definitions.map((d) => d.name));\n out.components.push(...pending.filter((f) => defined.has(f.suggestion!)));\n out.findings.sort((a, b) => a.line - b.line || a.column - b.column);\n out.components.sort((a, b) => a.line - b.line || a.column - b.column);\n return out;\n}\n","// Turns scanned files into the versioned audit report, compares it with a baseline, renders Markdown,\n// and plans the safe CSS autofix (exact token matches only).\nimport { scanCode } from './code';\nimport { lineCol, scanCssText } from './css';\nimport type { DesignSystemIndex } from './ds-index';\nimport { applyAllowlist, applyIgnoreComments } from './ignore';\nimport { MARKUP_EXTENSIONS, scanMarkup } from './markup';\nimport type { ValueHit } from './scan-value';\nimport { auditCssText, isSafeFix } from './style';\nimport {\n AUDIT_SCHEMA_VERSION,\n FINDING_CATEGORIES,\n type AuditReport,\n type BaselineDiff,\n type CategoryCount,\n type FileReport,\n type AllowlistEntry,\n type FindingCategory,\n type HistoryPoint,\n type IgnoredItem,\n type TopFix,\n} from './types';\n\nexport const AUDIT_EXTENSIONS = ['.css', '.scss', '.sass', '.less', '.tsx', '.jsx', '.ts', '.js', '.mjs', '.cjs', '.mts', '.cts', ...MARKUP_EXTENSIONS];\nexport const AUDIT_IGNORE_DIRS = ['node_modules', 'dist', 'build', 'out', 'coverage', '.git', '.next', '.nuxt', '.astro', '.turbo', '.cache', '.vercel', 'storybook-static', 'vendor', 'public'];\nconst IGNORE_FILE = /\\.d\\.[cm]?ts$|\\.(test|spec|stories|story)\\.[cm]?[jt]sx?$|\\.min\\.(css|js)$|(^|\\/)(vite|vitest|jest|webpack|rollup|eslint|postcss|tailwind|babel|next|astro|prettier|stylelint|tsup)\\.config\\.[cm]?[jt]s$/;\n\n/** Should the audit read this repo-relative path? */\nexport function isAuditable(path: string): boolean {\n if (!AUDIT_EXTENSIONS.some((e) => path.endsWith(e))) return false;\n if (IGNORE_FILE.test(path)) return false;\n return !path.split('/').some((seg) => AUDIT_IGNORE_DIRS.includes(seg));\n}\n\nconst langOf = (path: string): FileReport['lang'] => {\n const ext = path.slice(path.lastIndexOf('.') + 1);\n if (ext === 'css') return 'css';\n if (ext === 'scss' || ext === 'sass') return 'scss';\n if (ext === 'less') return 'less';\n if (ext === 'tsx') return 'tsx';\n if (ext === 'jsx') return 'jsx';\n if (/^[cm]?ts$/.test(ext)) return 'ts';\n if (ext === 'astro' || ext === 'vue' || ext === 'svelte') return ext;\n return 'js';\n};\n\nexport type AuditedFile = FileReport & { definitions: { name: string; line: number }[]; dsByName: Record<string, number> };\n\n/** Audit one file. `bridge-audit-ignore-next-line: reason` comments leave the next line's findings out of the counts. */\nexport function auditFile(path: string, text: string, ds: DesignSystemIndex): AuditedFile {\n const lang = langOf(path);\n if (lang === 'css' || lang === 'scss' || lang === 'less') {\n const r = auditCssText(text, lang, ds, { pos: lineCol(text) });\n return withIgnores(text, { path, lang, tokenUsages: r.tokenUsages, themeRefs: r.themeRefs, hardcoded: 0, dsComponents: 0, otherComponents: 0, findings: r.findings, components: [], definitions: [], dsByName: {} });\n }\n const c = lang === 'astro' || lang === 'vue' || lang === 'svelte' ? scanMarkup(path, text, lang, ds) : scanCode(path, text, ds);\n const dsCount = Object.values(c.ds).reduce((a, b) => a + b, 0);\n return withIgnores(text, { path, lang, tokenUsages: c.tokenUsages, themeRefs: c.themeRefs, hardcoded: 0, dsComponents: dsCount, otherComponents: 0, findings: c.findings, components: c.components, definitions: c.definitions, dsByName: c.ds });\n}\n\nfunction withIgnores(text: string, f: AuditedFile): AuditedFile {\n const r = applyIgnoreComments(text, f.findings, f.components);\n return {\n ...f,\n findings: r.findings,\n components: r.components,\n hardcoded: r.findings.length,\n otherComponents: r.components.length,\n ...(r.ignored.length ? { ignored: r.ignored } : {}),\n ...(r.errors.length ? { ignoreErrors: r.errors } : {}),\n };\n}\n\nconst pct = (num: number, den: number) => (den > 0 ? Math.round((num / den) * 1000) / 10 : null);\n\nexport interface AuditInput {\n files: { path: string; text: string }[];\n skipped?: number;\n target: string;\n label?: string;\n version?: string;\n generatedAt?: string;\n /** Known violations left out of the counts, each with a reason (an allowlist file, see parseAllowlist). */\n allowlist?: AllowlistEntry[];\n}\n\n/** Build the report for a set of files. */\nexport function buildAuditReport(input: AuditInput, ds: DesignSystemIndex): AuditReport {\n const allow = input.allowlist ?? [];\n const usedAllow = new Set<number>();\n const reports = input.files.map((f) => {\n const r = auditFile(f.path, f.text, ds);\n const idx = allow.flatMap((e, i) => (e.file === f.path ? [i] : []));\n if (!idx.length) return r;\n const a = applyAllowlist(idx.map((i) => allow[i]!), r.findings, r.components);\n a.used.forEach((k) => usedAllow.add(idx[k]!));\n if (!a.ignored.length) return r;\n const ignored = [...(r.ignored ?? []), ...a.ignored].sort((x, y) => x.line - y.line || x.column - y.column);\n return { ...r, findings: a.findings, components: a.components, hardcoded: a.findings.length, otherComponents: a.components.length, ignored };\n });\n const ignoredItems = reports.flatMap((r) => (r.ignored ?? []).map((x): IgnoredItem & { file: string } => ({ file: r.path, ...x })));\n const staleAllowlist = allow.filter((_e, i) => !usedAllow.has(i));\n const files: FileReport[] = reports.map(({ definitions: _d, dsByName: _n, ...r }) => r);\n const byCategory: Partial<Record<FindingCategory, CategoryCount>> = {};\n const fixes = new Map<string, TopFix & { fileSet: Set<string> }>();\n const components: AuditReport['components'] = { ds: {}, foreign: {}, native: {}, recreated: [] };\n let tokenUsages = 0;\n let hardcoded = 0;\n let themeRefs = 0;\n let dsInstances = 0;\n let uiInstances = 0;\n\n for (const r of reports) {\n tokenUsages += r.tokenUsages;\n hardcoded += r.hardcoded;\n themeRefs += r.themeRefs;\n dsInstances += r.dsComponents;\n uiInstances += r.dsComponents + r.otherComponents;\n for (const [n, k] of Object.entries(r.dsByName)) components.ds[n] = (components.ds[n] ?? 0) + k;\n for (const f of r.findings) {\n const c = (byCategory[f.category] ??= { hardcoded: 0, exact: 0, suggested: 0 });\n c.hardcoded++;\n if (f.suggestion) c.suggested++;\n if (f.suggestion?.level === 'exact') c.exact++;\n const key = `${f.category}|${f.value.toLowerCase()}|${f.suggestion?.token ?? ''}`;\n const fx = fixes.get(key) ?? { category: f.category, value: f.value, count: 0, files: 0, fileSet: new Set<string>(), ...(f.suggestion ? { suggestion: f.suggestion } : {}) };\n fx.count++;\n fx.fileSet.add(r.path);\n fixes.set(key, fx);\n }\n for (const comp of r.components) {\n if (comp.kind === 'native') components.native[comp.name] = (components.native[comp.name] ?? 0) + 1;\n else if (comp.kind === 'foreign') {\n const lib = (components.foreign[comp.library] ??= { instances: 0, components: {} });\n lib.instances++;\n lib.components[comp.name] = (lib.components[comp.name] ?? 0) + 1;\n }\n }\n }\n // Re-created DS components: local definitions named like a DS component (shadcn/ui files included).\n for (const r of reports) {\n for (const d of r.definitions) {\n if (!ds.components.has(d.name)) continue;\n const instances = reports.reduce((n, x) => n + x.components.filter((c) => (c.kind === 'recreated' || c.library === 'shadcn/ui (local)') && c.name.split('.')[0] === d.name).length, 0);\n components.recreated.push({ name: d.name, file: r.path, line: d.line, instances });\n }\n }\n const topFiles = files\n .filter((f) => f.hardcoded + f.otherComponents > 0)\n .sort((a, b) => b.hardcoded + b.otherComponents - (a.hardcoded + a.otherComponents) || a.path.localeCompare(b.path))\n .slice(0, 15)\n .map((f) => ({ path: f.path, hardcoded: f.hardcoded, otherComponents: f.otherComponents, tokenUsages: f.tokenUsages, dsComponents: f.dsComponents }));\n const topFixes = [...fixes.values()]\n .sort((a, b) => b.count - a.count || (b.suggestion?.confidence ?? 0) - (a.suggestion?.confidence ?? 0))\n .slice(0, 25)\n .map(({ fileSet, ...f }) => ({ ...f, files: fileSet.size }));\n return {\n $schema: 'https://raw.githubusercontent.com/peterbono/ai-design-system-demo/main/packages/core/audit-report.schema.json',\n schemaVersion: AUDIT_SCHEMA_VERSION,\n tool: { name: 'bridge', version: input.version ?? '0.1.0' },\n ...(input.label ? { label: input.label } : {}),\n generatedAt: input.generatedAt ?? new Date().toISOString(),\n target: { path: input.target, files: files.length, skipped: input.skipped ?? 0 },\n designSystem: { packages: ds.packages, components: ds.components.size, tokens: ds.tokenCount, modes: ds.modes },\n metrics: { tokenAdoption: pct(tokenUsages, tokenUsages + hardcoded), componentAdoption: pct(dsInstances, uiInstances), tokenUsages, hardcoded, themeRefs, dsComponentInstances: dsInstances, uiComponentInstances: uiInstances },\n byCategory: Object.fromEntries(FINDING_CATEGORIES.filter((c) => byCategory[c]).map((c) => [c, byCategory[c]!])),\n components: { ...components, recreated: components.recreated.sort((a, b) => b.instances - a.instances || a.name.localeCompare(b.name)) },\n topFiles,\n topFixes,\n files: files.sort((a, b) => a.path.localeCompare(b.path)),\n ...(ignoredItems.length || staleAllowlist.length\n ? {\n ignored: {\n total: ignoredItems.length,\n comment: ignoredItems.filter((x) => x.via === 'comment').length,\n allowlist: ignoredItems.filter((x) => x.via === 'allowlist').length,\n items: ignoredItems,\n staleAllowlist,\n },\n }\n : {}),\n history: [],\n };\n}\n\nconst delta = (a: number | null, b: number | null) => (a === null || b === null ? null : Math.round((b - a) * 10) / 10);\n\nexport function historyPoint(r: AuditReport): HistoryPoint {\n return {\n ...(r.label ? { label: r.label } : {}),\n generatedAt: r.generatedAt,\n tokenAdoption: r.metrics.tokenAdoption,\n componentAdoption: r.metrics.componentAdoption,\n hardcoded: r.metrics.hardcoded,\n uiComponentInstances: r.metrics.uiComponentInstances,\n dsComponentInstances: r.metrics.dsComponentInstances,\n };\n}\n\n/** Compare with an earlier report of the same codebase: progress, per category and per file. */\nexport function compareWithBaseline(report: AuditReport, baseline: AuditReport): AuditReport {\n if (baseline.schemaVersion !== AUDIT_SCHEMA_VERSION) throw new Error(`baseline schemaVersion ${String(baseline.schemaVersion)} is not supported (expected ${AUDIT_SCHEMA_VERSION})`);\n const before = new Map(baseline.files.map((f) => [f.path, f.hardcoded + f.otherComponents]));\n const after = new Map(report.files.map((f) => [f.path, f.hardcoded + f.otherComponents]));\n const byCategory: BaselineDiff['byCategory'] = {};\n for (const c of FINDING_CATEGORIES) {\n const b = baseline.byCategory[c]?.hardcoded ?? 0;\n const a = report.byCategory[c]?.hardcoded ?? 0;\n if (a || b) byCategory[c] = { before: b, after: a, delta: a - b };\n }\n const improved: BaselineDiff['improved'] = [];\n const regressed: BaselineDiff['regressed'] = [];\n for (const [path, a] of after) {\n const b = before.get(path);\n if (b === undefined) continue;\n if (a < b) improved.push({ path, before: b, after: a });\n else if (a > b) regressed.push({ path, before: b, after: a });\n }\n const diff: BaselineDiff = {\n ...(baseline.label ? { label: baseline.label } : {}),\n generatedAt: baseline.generatedAt,\n tokenAdoption: { before: baseline.metrics.tokenAdoption, after: report.metrics.tokenAdoption, delta: delta(baseline.metrics.tokenAdoption, report.metrics.tokenAdoption) },\n componentAdoption: { before: baseline.metrics.componentAdoption, after: report.metrics.componentAdoption, delta: delta(baseline.metrics.componentAdoption, report.metrics.componentAdoption) },\n hardcoded: { before: baseline.metrics.hardcoded, after: report.metrics.hardcoded, delta: report.metrics.hardcoded - baseline.metrics.hardcoded },\n byCategory,\n improved: improved.sort((x, y) => y.before - y.after - (x.before - x.after)),\n regressed: regressed.sort((x, y) => y.after - y.before - (x.after - x.before)),\n newFiles: [...after.keys()].filter((p) => !before.has(p)).sort(),\n removedFiles: [...before.keys()].filter((p) => !after.has(p)).sort(),\n };\n return { ...report, baseline: diff, history: [...(baseline.history ?? []), historyPoint(baseline)] };\n}\n\nconst fmtPct = (n: number | null) => (n === null ? 'n/a' : `${n}%`);\nconst fmtDelta = (n: number | null) => (n === null ? '' : ` (${n > 0 ? '+' : ''}${n} pts)`);\nconst esc = (s: string) => s.replace(/\\|/g, '\\\\|').replace(/`/g, \"'\");\n\n/** Short Markdown summary for a PR comment or a CI job summary. */\nexport function auditMarkdown(r: AuditReport, opts: { topFiles?: number; topFixes?: number; ignored?: number } = {}): string {\n const m = r.metrics;\n const b = r.baseline;\n const lines = [\n `## Design system adoption${r.label ? `: ${r.label}` : ''}`,\n '',\n `Audited ${r.target.files} files in \\`${r.target.path}\\` against ${r.designSystem.tokens} tokens and ${r.designSystem.components} components (${r.designSystem.packages.join(', ') || 'no DS package configured'}).`,\n '',\n '| Metric | Value |',\n '| --- | --- |',\n `| Token adoption | **${fmtPct(m.tokenAdoption)}**${fmtDelta(b?.tokenAdoption.delta ?? null)} |`,\n `| Component adoption | **${fmtPct(m.componentAdoption)}**${fmtDelta(b?.componentAdoption.delta ?? null)} |`,\n `| Token references | ${m.tokenUsages} |`,\n `| Hardcoded values | ${m.hardcoded}${b ? ` (${b.hardcoded.delta > 0 ? '+' : ''}${b.hardcoded.delta})` : ''} |`,\n `| Other theme references | ${m.themeRefs} |`,\n `| DS component instances | ${m.dsComponentInstances} of ${m.uiComponentInstances} |`,\n '',\n ];\n const cats = FINDING_CATEGORIES.filter((c) => r.byCategory[c]);\n if (cats.length) {\n lines.push('### Hardcoded values by category', '', '| Category | Hardcoded | Exact token | Suggested |', '| --- | ---: | ---: | ---: |');\n for (const c of cats) {\n const x = r.byCategory[c]!;\n lines.push(`| ${c} | ${x.hardcoded} | ${x.exact} | ${x.suggested} |`);\n }\n lines.push('');\n }\n const foreign = Object.entries(r.components.foreign).sort((a, b) => b[1].instances - a[1].instances);\n const native = Object.entries(r.components.native).sort((a, b) => b[1] - a[1]);\n if (foreign.length || native.length || r.components.recreated.length) {\n lines.push('### Components', '');\n for (const [lib, x] of foreign) {\n const top = Object.entries(x.components).sort((a, b) => b[1] - a[1]).slice(0, 6).map(([n, k]) => `${n} ${k}`).join(', ');\n lines.push(`- **${lib}**: ${x.instances} instances (${top})`);\n }\n if (native.length) lines.push(`- **Native elements**: ${native.map(([n, k]) => `<${n}> ${k}`).join(', ')}`);\n if (r.components.recreated.length) lines.push(`- **Re-created DS components**: ${r.components.recreated.map((x) => `${x.name} (${x.file}:${x.line})`).join(', ')}`);\n const dsUsed = Object.entries(r.components.ds).sort((a, b) => b[1] - a[1]);\n if (dsUsed.length) lines.push(`- **DS components used**: ${dsUsed.map(([n, k]) => `${n} ${k}`).join(', ')}`);\n lines.push('');\n }\n const files = r.topFiles.slice(0, opts.topFiles ?? 10);\n if (files.length) {\n lines.push('### Top files to migrate', '', '| File | Hardcoded | Non-DS components | Token refs |', '| --- | ---: | ---: | ---: |');\n for (const f of files) lines.push(`| \\`${esc(f.path)}\\` | ${f.hardcoded} | ${f.otherComponents} | ${f.tokenUsages} |`);\n lines.push('');\n }\n const fixes = r.topFixes.filter((f) => f.suggestion).slice(0, opts.topFixes ?? 10);\n if (fixes.length) {\n lines.push('### Top fixes', '', '| Value | Use | Confidence | Count |', '| --- | --- | --- | ---: |');\n for (const f of fixes) lines.push(`| \\`${esc(f.value)}\\` (${f.category}) | \\`var(${f.suggestion!.cssVar})\\` ${esc(f.suggestion!.value)}${f.suggestion!.mode ? ` [${f.suggestion!.mode}]` : ''} | ${f.suggestion!.level} | ${f.count} |`);\n lines.push('');\n }\n const ig = r.ignored;\n if (ig && (ig.total || ig.staleAllowlist.length)) {\n lines.push('### Ignored on purpose', '', `${ig.total} item(s) left out of the counts: ${ig.comment} by \\`bridge-audit-ignore-next-line\\` comments, ${ig.allowlist} by the allowlist.`, '');\n const shown = ig.items.slice(0, opts.ignored ?? 50);\n if (shown.length) {\n lines.push('| Where | What | Reason |', '| --- | --- | --- |');\n for (const x of shown) lines.push(`| \\`${esc(x.file)}:${x.line}\\` | \\`${esc(x.what)}\\` | ${esc(x.reason)} (${x.via}) |`);\n if (ig.items.length > shown.length) lines.push(`| ... | ${ig.items.length - shown.length} more | |`);\n lines.push('');\n }\n if (ig.staleAllowlist.length) {\n lines.push(`Allowlist entries that match nothing any more (remove them): ${ig.staleAllowlist.map((e) => `\\`${esc(e.file)}:${e.line}${e.what ? ` ${esc(e.what)}` : ''}\\``).join(', ')}.`, '');\n }\n }\n if (b) {\n lines.push(`### Progress since ${b.label ?? b.generatedAt}`, '');\n lines.push(`- ${b.improved.length} files improved, ${b.regressed.length} regressed, ${b.newFiles.length} new, ${b.removedFiles.length} removed.`);\n for (const f of b.regressed.slice(0, 5)) lines.push(`- Regressed: \\`${esc(f.path)}\\` ${f.before} -> ${f.after}`);\n lines.push('');\n }\n return lines.join('\\n');\n}\n\nexport interface CssFixEdit {\n line: number;\n column: number;\n from: string;\n to: string;\n token: string;\n}\n\n/** Safe autofix for a CSS/SCSS/Less file: exact token matches become var(--token). Returns the edits and the new text. */\nexport function planCssFixes(text: string, lang: 'css' | 'scss' | 'less', ds: DesignSystemIndex): { edits: CssFixEdit[]; output: string } {\n const at = lineCol(text);\n const scan = scanCssText(text, lang);\n const edits: (CssFixEdit & { start: number; end: number })[] = [];\n for (const d of scan.decls) {\n const property = d.property.toLowerCase();\n // A shadow is one value; other categories replace the literal inside the value.\n for (const h of d.scan.hits as ValueHit[]) {\n const s = ds.suggest(h.category, h.text, property);\n if (!isSafeFix(h, s)) continue;\n const start = d.valueStart + h.index;\n edits.push({ ...at(start), start, end: start + h.text.length, from: h.text, to: `var(${s!.cssVar})`, token: s!.token });\n }\n }\n let output = text;\n for (const e of [...edits].sort((a, b) => b.start - a.start)) output = output.slice(0, e.start) + e.to + output.slice(e.end);\n return { edits: edits.map(({ start: _s, end: _e, ...e }) => e), output };\n}\n"],"names":["r","g","b","SHADCN_RE","mask","pascal","num"],"mappings":";;AAGO,MAAM,uBAAuB;AAkB7B,MAAM,qBAAwC,CAAC,SAAS,WAAW,QAAQ,UAAU,gBAAgB,UAAU,YAAY,UAAU,WAAW,eAAe,aAAa,eAAe,aAAa;ACjBxM,MAAM,eAAuC;AAAA,EAClD,WAAW;AAAA,EAAW,cAAc;AAAA,EAAW,MAAM;AAAA,EAAW,YAAY;AAAA,EAAW,OAAO;AAAA,EAAW,OAAO;AAAA,EAAW,QAAQ;AAAA,EACnI,OAAO;AAAA,EAAW,gBAAgB;AAAA,EAAW,MAAM;AAAA,EAAW,YAAY;AAAA,EAAW,OAAO;AAAA,EAAW,WAAW;AAAA,EAAW,WAAW;AAAA,EACxI,YAAY;AAAA,EAAW,WAAW;AAAA,EAAW,OAAO;AAAA,EAAW,gBAAgB;AAAA,EAAW,UAAU;AAAA,EAAW,SAAS;AAAA,EAAW,MAAM;AAAA,EACzI,UAAU;AAAA,EAAW,UAAU;AAAA,EAAW,eAAe;AAAA,EAAW,UAAU;AAAA,EAAW,WAAW;AAAA,EAAW,UAAU;AAAA,EAAW,WAAW;AAAA,EAC/I,aAAa;AAAA,EAAW,gBAAgB;AAAA,EAAW,YAAY;AAAA,EAAW,YAAY;AAAA,EAAW,SAAS;AAAA,EAAW,YAAY;AAAA,EACjI,cAAc;AAAA,EAAW,eAAe;AAAA,EAAW,eAAe;AAAA,EAAW,eAAe;AAAA,EAAW,eAAe;AAAA,EAAW,YAAY;AAAA,EAC7I,UAAU;AAAA,EAAW,aAAa;AAAA,EAAW,SAAS;AAAA,EAAW,SAAS;AAAA,EAAW,YAAY;AAAA,EAAW,WAAW;AAAA,EAAW,aAAa;AAAA,EAC/I,aAAa;AAAA,EAAW,SAAS;AAAA,EAAW,WAAW;AAAA,EAAW,YAAY;AAAA,EAAW,MAAM;AAAA,EAAW,WAAW;AAAA,EAAW,MAAM;AAAA,EACtI,OAAO;AAAA,EAAW,aAAa;AAAA,EAAW,MAAM;AAAA,EAAW,UAAU;AAAA,EAAW,SAAS;AAAA,EAAW,WAAW;AAAA,EAAW,QAAQ;AAAA,EAClI,OAAO;AAAA,EAAW,OAAO;AAAA,EAAW,UAAU;AAAA,EAAW,eAAe;AAAA,EAAW,WAAW;AAAA,EAAW,cAAc;AAAA,EAAW,WAAW;AAAA,EAC7I,YAAY;AAAA,EAAW,WAAW;AAAA,EAAW,sBAAsB;AAAA,EAAW,WAAW;AAAA,EAAW,YAAY;AAAA,EAAW,WAAW;AAAA,EACtI,WAAW;AAAA,EAAW,aAAa;AAAA,EAAW,eAAe;AAAA,EAAW,cAAc;AAAA,EAAW,gBAAgB;AAAA,EAAW,gBAAgB;AAAA,EAC5I,gBAAgB;AAAA,EAAW,aAAa;AAAA,EAAW,MAAM;AAAA,EAAW,WAAW;AAAA,EAAW,OAAO;AAAA,EAAW,SAAS;AAAA,EAAW,QAAQ;AAAA,EACxI,kBAAkB;AAAA,EAAW,YAAY;AAAA,EAAW,cAAc;AAAA,EAAW,cAAc;AAAA,EAAW,gBAAgB;AAAA,EACtH,iBAAiB;AAAA,EAAW,mBAAmB;AAAA,EAAW,iBAAiB;AAAA,EAAW,iBAAiB;AAAA,EAAW,cAAc;AAAA,EAChI,WAAW;AAAA,EAAW,WAAW;AAAA,EAAW,UAAU;AAAA,EAAW,aAAa;AAAA,EAAW,MAAM;AAAA,EAAW,SAAS;AAAA,EAAW,OAAO;AAAA,EACrI,WAAW;AAAA,EAAW,QAAQ;AAAA,EAAW,WAAW;AAAA,EAAW,QAAQ;AAAA,EAAW,eAAe;AAAA,EAAW,WAAW;AAAA,EACvH,eAAe;AAAA,EAAW,eAAe;AAAA,EAAW,YAAY;AAAA,EAAW,WAAW;AAAA,EAAW,MAAM;AAAA,EAAW,MAAM;AAAA,EAAW,MAAM;AAAA,EACzI,YAAY;AAAA,EAAW,QAAQ;AAAA,EAAW,eAAe;AAAA,EAAW,KAAK;AAAA,EAAW,WAAW;AAAA,EAAW,WAAW;AAAA,EAAW,aAAa;AAAA,EAC7I,QAAQ;AAAA,EAAW,YAAY;AAAA,EAAW,UAAU;AAAA,EAAW,UAAU;AAAA,EAAW,QAAQ;AAAA,EAAW,QAAQ;AAAA,EAAW,SAAS;AAAA,EACnI,WAAW;AAAA,EAAW,WAAW;AAAA,EAAW,WAAW;AAAA,EAAW,MAAM;AAAA,EAAW,aAAa;AAAA,EAAW,WAAW;AAAA,EAAW,KAAK;AAAA,EACtI,MAAM;AAAA,EAAW,SAAS;AAAA,EAAW,QAAQ;AAAA,EAAW,WAAW;AAAA,EAAW,QAAQ;AAAA,EAAW,OAAO;AAAA,EAAW,OAAO;AAAA,EAC1H,YAAY;AAAA,EAAW,QAAQ;AAAA,EAAW,aAAa;AACzD;AAEA,MAAM,MAAM,CAAC,GAAW,UAAmB,EAAE,SAAS,GAAG,IAAK,WAAW,CAAC,IAAI,MAAO,QAAQ,WAAW,CAAC;AAEzG,SAAS,SAAS,GAAW,GAAW,GAAqC;AAC3E,QAAM,MAAQ,IAAI,MAAO,OAAO,MAAO;AACvC,MAAI,MAAM,EAAG,QAAO,CAAC,GAAG,GAAG,CAAC;AAC5B,QAAM,IAAI,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI;AAC9C,QAAM,IAAI,IAAI,IAAI;AAClB,QAAM,IAAI,CAAC,MAAc;AACvB,QAAI,IAAI;AACR,QAAI,IAAI,EAAG,MAAK;AAChB,QAAI,IAAI,EAAG,MAAK;AAChB,QAAI,IAAI,IAAI,UAAU,KAAK,IAAI,KAAK,IAAI;AACxC,QAAI,IAAI,IAAI,EAAG,QAAO;AACtB,QAAI,IAAI,IAAI,EAAG,QAAO,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK;AAClD,WAAO;AAAA,EACT;AACA,SAAO,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC;AAC7C;AAGO,SAAS,cAAc,OAAiC;AAC7D,QAAM,IAAI,MAAM,KAAA,EAAO,YAAA;AACvB,MAAI,EAAE,WAAW,GAAG,EAAG,QAAO,UAAU,CAAC;AACzC,MAAI,aAAa,CAAC,UAAU,UAAU,aAAa,CAAC,CAAE;AACtD,QAAM,KAAK,gCAAgC,KAAK,CAAC;AACjD,QAAM,OAAO,kEAAkE,KAAK,CAAC;AACrF,MAAI,MAAM;AACR,UAAM,CAACA,IAAGC,IAAGC,EAAC,IAAI,SAAS,WAAW,KAAK,CAAC,CAAE,GAAG,WAAW,KAAK,CAAC,CAAE,IAAI,KAAK,WAAW,KAAK,CAAC,CAAE,IAAI,GAAG;AACvG,WAAO,EAAE,GAAAF,IAAG,GAAAC,IAAG,GAAAC,IAAG,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAA;AAAA,EACnD;AACA,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,QAAQ,GAAG,CAAC,EAAG,MAAM,SAAS,EAAE,OAAO,OAAO;AACpD,MAAI,MAAM,SAAS,KAAK,MAAM,KAAK,CAAC,MAAM,CAAC,qBAAqB,KAAK,CAAC,CAAC,EAAG,QAAO;AACjF,QAAM,QAAQ,MAAM,CAAC,MAAM,SAAY,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI;AAC1D,MAAI,GAAG,CAAC,EAAG,WAAW,KAAK,GAAG;AAC5B,UAAM,CAACF,IAAGC,IAAGC,EAAC,IAAI,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG;AAChE,WAAO,EAAE,GAAAF,IAAG,GAAAC,IAAG,GAAAC,IAAG,GAAG,MAAA;AAAA,EACvB;AACA,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,WAAW,MAAM,CAAC,CAAE,GAAG,IAAI,MAAM,CAAC,GAAI,CAAC,GAAG,IAAI,MAAM,CAAC,GAAI,CAAC,CAAC;AACtF,SAAO,EAAE,GAAG,GAAG,GAAG,GAAG,MAAA;AACvB;AAEA,MAAM,MAAM,CAAC,MAAe,KAAK,UAAU,IAAI,UAAU,IAAI,SAAS,UAAU;AAGzE,SAAS,QAAQ,GAA8C;AACpE,QAAM,IAAI,IAAI,EAAE,CAAC;AACjB,QAAM,IAAI,IAAI,EAAE,CAAC;AACjB,QAAM,IAAI,IAAI,EAAE,CAAC;AACjB,QAAM,IAAI,KAAK,KAAK,eAAe,IAAI,eAAe,IAAI,eAAe,CAAC;AAC1E,QAAM,IAAI,KAAK,KAAK,eAAe,IAAI,eAAe,IAAI,eAAe,CAAC;AAC1E,QAAM,IAAI,KAAK,KAAK,eAAe,IAAI,eAAe,IAAI,eAAe,CAAC;AAC1E,SAAO;AAAA,IACL,GAAG,eAAe,IAAI,cAAc,IAAI,eAAe;AAAA,IACvD,GAAG,eAAe,IAAI,cAAc,IAAI,eAAe;AAAA,IACvD,GAAG,eAAe,IAAI,eAAe,IAAI,cAAc;AAAA,EAAA;AAE3D;AAMO,SAAS,OAAO,GAAS,GAAiB;AAC/C,QAAM,IAAI,QAAQ,CAAC;AACnB,QAAM,IAAI,QAAQ,CAAC;AACnB,SAAO,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI;AACnF;AAGO,MAAM,mBAAmB;AC/FhC,MAAM,eAAuC;AAAA,EAC3C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AACR;AACA,MAAM,QAAQ,CAAC,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAElF,SAAS,cAAc,MAAc,MAAmC;AAC7E,MAAI,SAAS,QAAS,QAAO;AAC7B,MAAI,SAAS,QAAS,QAAO;AAC7B,QAAM,MAAM,aAAa,IAAI;AAC7B,QAAM,IAAI,OAAO,MAAM,QAAQ,IAAI,IAAI;AACvC,SAAO,OAAO,KAAK,IAAI,IAAI,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK;AACnD;AAEA,MAAM,eAAe;AACrB,MAAM,aAAa,IAAI,OAAO,IAAI,YAAY,KAAK,OAAO,KAAK,YAAY,EAAE,KAAK,GAAG,CAAC,8BAA8B,YAAY,6BAA6B;AAG7J,MAAM,YAA2G;AAAA,EAC/G,CAAC,uGAAuG,OAAO;AAAA,EAC/G,CAAC,UAAU,eAAe;AAAA,EAC1B,CAAC,yCAAyC,gBAAgB;AAAA,EAC1D,CAAC,YAAY,iBAAiB;AAAA,EAC9B,CAAC,0KAA0K,SAAS;AAAA,EACpL,CAAC,8CAA8C,MAAM;AAAA,EACrD,CAAC,8BAA8B,QAAQ;AAAA,EACvC,CAAC,OAAO,SAAS;AAAA,EACjB,CAAC,sBAAsB,UAAU;AAAA,EACjC,CAAC,UAAU,QAAQ;AAAA,EACnB,CAAC,UAAU,MAAM;AAAA,EACjB,CAAC,aAAa,aAAa;AAC7B;AAEA,MAAM,WACJ;AAEF,MAAMC,cAAY,IAAI,OAAO,IAAI,YAAY,6HAA6H;AAcnK,SAAS,gBAAgB,MAA6B;AAC3D,QAAM,MAAqB,CAAA;AAC3B,aAAW,KAAK,KAAK,SAAS,YAAY,GAAG;AAC3C,UAAM,MAAM,EAAE,CAAC;AAEf,QAAI,MAAM;AACV,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAI,IAAI,CAAC,MAAM,IAAK;AAAA,eACX,IAAI,CAAC,MAAM,IAAK;AAAA,eAChB,IAAI,CAAC,MAAM,OAAO,UAAU,EAAG,OAAM;AAAA,IAChD;AACA,UAAM,MAAM,IAAI,MAAM,MAAM,CAAC,EAAE,QAAQ,MAAM,EAAE;AAC/C,UAAM,QAAQ,EAAE,QAAS,IAAI,SAAS,IAAI;AAC1C,UAAM,MAAM,+BAA+B,KAAK,GAAG;AACnD,QAAI,KAAK;AACP,YAAM,QAAQ,IAAI,CAAC,EAAG,QAAQ,MAAM,GAAG,EAAE,QAAQ,mHAAmH,EAAE;AACtK,UAAI,WAAW,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,GAAG;AAC/C,YAAI,KAAK,EAAE,KAAK,OAAO,MAAM,SAAS,OAAO,MAAM,WAAW,IAAI,IAAI,OAAO,KAAK,MAAM,OAAO;AAC/F;AAAA,MACF;AACA,YAAM,MAAM,UAAU,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,IAAI,CAAC,CAAE,CAAC,IAAI,CAAC;AAC1D,UAAI,IAAK,KAAI,KAAK,EAAE,KAAK,OAAO,MAAM,aAAa,UAAU,KAAK,MAAA,CAAO;AACzE;AAAA,IACF;AACA,UAAM,MAAM,WAAW,KAAK,GAAG;AAC/B,QAAI,KAAK;AACP,YAAM,QAAQ,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,CAAC,IAAI,cAAc,IAAI,CAAC,GAAI,IAAI,CAAC,CAAE;AAC7E,UAAI,MAAO,KAAI,KAAK,EAAE,KAAK,OAAO,MAAM,WAAW,UAAU,SAAS,MAAA,CAAO;AAC7E;AAAA,IACF;AACA,QAAI,SAAS,KAAK,GAAG,KAAKA,YAAU,KAAK,GAAG,EAAG,KAAI,KAAK,EAAE,KAAK,OAAO,MAAM,SAAS;AAAA,EACvF;AACA,SAAO;AACT;ACvFA,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,YAAY;AAClB,MAAM,cAAc;AACpB,MAAM,oBAAoB;AAC1B,MAAM,cAAc;AACpB,MAAM,cAAc;AACpB,MAAM,YAAY;AAGlB,MAAM,WAAW,CAAC,MAAc,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC;AAChI,MAAM,cAAc,IAAI;AAAA,EACtB,8/CAA8/C,MAAM,GAAG;AACzgD;AAGA,SAASC,OAAK,OAAuB;AACnC,MAAI,MAAM;AACV,aAAW,MAAM,CAAC,QAAQ,QAAQ,MAAM,GAAG;AACzC,QAAI,IAAI,IAAI,QAAQ,EAAE;AACtB,WAAO,KAAK,GAAG;AACb,UAAI,QAAQ;AACZ,UAAI,IAAI,IAAI,GAAG,SAAS;AACxB,aAAO,IAAI,IAAI,QAAQ,KAAK;AAC1B,YAAI,IAAI,CAAC,MAAM,IAAK;AAAA,iBACX,IAAI,CAAC,MAAM,OAAO,EAAE,UAAU,EAAG;AAAA,MAC5C;AACA,YAAM,IAAI,MAAM,GAAG,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,CAAC;AAC/D,UAAI,IAAI,QAAQ,IAAI,CAAC;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,IAAI,QAAQ,yBAAyB,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,CAAC;AACzE;AAEA,MAAM,YAAY;AAElB,SAAS,eAAe,MAA2C;AACjE,MAAI,YAAY,KAAK,IAAI,EAAG,QAAO;AACnC,MAAI,aAAa,KAAK,IAAI,EAAG,QAAO;AACpC,MAAI,UAAU,KAAK,IAAI,EAAG,QAAO;AACjC,MAAI,kBAAkB,KAAK,IAAI,EAAG,QAAO;AACzC,MAAI,SAAS,YAAa,QAAO;AACjC,MAAI,SAAS,cAAe,QAAO;AACnC,MAAI,SAAS,IAAI,GAAG;AAClB,UAAM,IAAI,KAAK,YAAA;AACf,QAAI,iBAAiB,KAAK,CAAC,EAAG,QAAO;AACrC,QAAI,gDAAgD,KAAK,CAAC,EAAG,QAAO;AACpE,QAAI,sBAAsB,KAAK,CAAC,EAAG,QAAO;AAC1C,QAAI,oBAAoB,KAAK,CAAC,EAAG,QAAO;AAAA,EAC1C;AACA,SAAO;AACT;AAMO,SAAS,aAAa,UAAkB,OAA0B;AACvE,QAAM,OAAO,SAAS,KAAA,EAAO,YAAA;AAC7B,QAAM,OAAO,CAAC,GAAG,MAAM,SAAS,qBAAqB,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAE;AACxE,QAAM,OAAmB,CAAA;AACzB,QAAM,MAAiB,EAAE,MAAM,MAAM,UAAU,MAAA;AAC/C,MAAI,UAAU,KAAK,IAAI,EAAG,QAAO;AACjC,QAAM,IAAI,MAAM,KAAA;AAChB,MAAI,CAAC,KAAK,gFAAgF,KAAK,CAAC,EAAG,QAAO;AAC1G,MAAI,aAAa,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,GAAG;AAC9C,QAAI,WAAW;AACf,WAAO;AAAA,EACT;AACA,QAAM,SAASA,OAAK,KAAK;AAEzB,MAAI,SAAS,eAAe;AAC1B,QAAI,OAAO,UAAU,CAAC,6BAA6B,KAAK,CAAC,EAAG,MAAK,KAAK,EAAE,UAAU,eAAe,MAAM,GAAG,OAAO,MAAM,QAAQ,CAAC,GAAG;AACnI,WAAO;AAAA,EACT;AACA,MAAI,SAAS,gBAAgB,SAAS,eAAe;AAGnD,UAAM,UAAU,OAAO,QAAQ,0BAA0B,GAAG;AAC5D,QAAI,KAAK,KAAK,OAAO,KAAK,OAAO,OAAO,gBAAgB,KAAK,EAAG,MAAK,KAAK,EAAE,UAAU,UAAU,MAAM,GAAG,OAAO,MAAM,QAAQ,CAAC,GAAG;AAClI,WAAO;AAAA,EACT;AAGA,aAAW,KAAK,OAAO,SAAS,gBAAgB,EAAG,KAAI,cAAc,EAAE,CAAC,CAAC,QAAQ,KAAK,EAAE,UAAU,SAAS,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,OAAQ;AACxI,MAAI,WAAW,KAAK,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,GAAG,GAAG;AAC1E,eAAW,KAAK,OAAO,SAAS,kCAAkC,GAAG;AACnE,YAAM,IAAI,EAAE,CAAC,EAAG,YAAA;AAChB,UAAI,aAAa,CAAC,KAAK,CAAC,+BAA+B,KAAK,CAAC,EAAG,MAAK,KAAK,EAAE,UAAU,SAAS,MAAM,EAAE,CAAC,GAAI,OAAO,EAAE,OAAQ;AAAA,IAC/H;AAEA,QAAI,KAAK,WAAW,IAAI,KAAK,sCAAsC,KAAK,CAAC,KAAK,cAAc,CAAC,QAAQ,KAAK,EAAE,UAAU,SAAS,MAAM,GAAG,OAAO,MAAM,QAAQ,CAAC,GAAG;AAAA,EACnK;AAEA,MAAI,SAAS,WAAW;AACtB,UAAM,IAAI,UAAU,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI;AAC1C,QAAI,OAAO,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,EAAG,MAAK,KAAK,EAAE,UAAU,WAAW,MAAM,GAAG,OAAO,MAAM,QAAQ,CAAC,GAAG;AAC9G,WAAO;AAAA,EACT;AACA,MAAI,SAAS,eAAe;AAC1B,QAAI,iCAAiC,KAAK,CAAC,EAAG,MAAK,KAAK,EAAE,UAAU,eAAe,MAAM,GAAG,OAAO,MAAM,QAAQ,CAAC,GAAG;AACrH,WAAO;AAAA,EACT;AACA,MAAI,SAAS,iBAAiB,cAAc,KAAK,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG;AACtE,SAAK,KAAK,EAAE,UAAU,eAAe,MAAM,GAAG,OAAO,MAAM,QAAQ,CAAC,EAAA,CAAG;AACvE,WAAO;AAAA,EACT;AACA,MAAI,YAAY,KAAK,IAAI,GAAG;AAC1B,eAAW,KAAK,OAAO,SAAS,iCAAiC,OAAO,OAAO,EAAE,CAAC,CAAC,MAAM,QAAQ,KAAK,EAAE,UAAU,YAAY,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,OAAQ;AAAA,EAC7J;AACA,MAAI,YAAY,KAAK,IAAI,GAAG;AAC1B,eAAW,KAAK,OAAO,SAAS,sFAAsF,QAAQ,KAAK,EAAE,UAAU,UAAU,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,OAAQ;AAAA,EACxL;AACA,QAAM,MAAM,eAAe,IAAI;AAC/B,MAAI,KAAA;AAAK,eAAW,KAAK,OAAO,SAAS,SAAS,OAAO,OAAO,EAAE,CAAC,CAAC,MAAM,EAAG,MAAK,KAAK,EAAE,UAAU,KAAK,MAAM,EAAE,CAAC,EAAE,QAAQ,MAAM,EAAE,GAAG,OAAO,EAAE,SAAU,EAAE,CAAC,EAAE,WAAW,GAAG,IAAI,IAAI,IAAI;AAAA,EAAA;AACxL,OAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACrC,SAAO;AACT;AAIA,MAAM,gBAAwC;AAAA,EAC5C,GAAG;AAAA,EAAU,IAAI;AAAA,EAAc,IAAI;AAAA,EAAgB,IAAI;AAAA,EAAiB,IAAI;AAAA,EAAe,IAAI;AAAA,EAAiB,IAAI;AAAA,EACpH,GAAG;AAAA,EAAW,IAAI;AAAA,EAAe,IAAI;AAAA,EAAiB,IAAI;AAAA,EAAkB,IAAI;AAAA,EAAgB,IAAI;AAAA,EAAkB,IAAI;AAAA,EAC1H,SAAS;AAAA,EAAiB,SAAS;AAAA,EAAgB,UAAU;AAAA,EAAkB,UAAU;AAAA,EAAiB,SAAS;AACrH;AACA,MAAM,WAAW;AACjB,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AAGlB,SAAS,cAAc,KAAqB;AACjD,MAAI,cAAc,GAAG,EAAG,QAAO,cAAc,GAAG;AAChD,MAAI,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,GAAG,EAAG,QAAO;AACxD,SAAO,IAAI,QAAQ,6BAA6B,CAAC,MAAM,IAAI,EAAE,YAAA,CAAa,EAAE,EAAE,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,YAAA,CAAa,EAAE;AAC9H;AAQO,SAAS,YAAY,KAAa,OAAwB,KAAgC;AAC/F,QAAM,OAAO,cAAc,GAAG;AAC9B,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,OAAkB,EAAE,MAAM,CAAA,GAAI,MAAM,CAAA,GAAI,UAAU,MAAA;AACxD,QAAI,QAAQ,SAAS,gBAAgB,KAAK,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,cAAc,GAAG,GAAI,QAAO,EAAE,GAAG,MAAM,UAAU,KAAA;AAC9H,QAAI,SAAS,aAAa,SAAS,iBAAiB,SAAS,cAAe,QAAO,aAAa,MAAM,OAAO,KAAK,CAAC;AACnH,QAAI,SAAS,KAAK,IAAI,KAAK,UAAU,KAAK,SAAS,IAAI,EAAG,QAAO;AACjE,QAAI,QAAQ,QAAQ,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,EAAG,QAAO;AACzE,UAAM,OAAO,aAAa,MAAM,GAAG,KAAK,IAAI;AAE5C,SAAK,KAAK,QAAQ,CAAC,MAAO,EAAE,OAAO,OAAO,KAAK,CAAE;AACjD,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,KAAA;AAChB,OAAK,QAAQ,QAAQ,QAAQ,aAAa,iBAAiB,KAAK,CAAC,KAAM,SAAS,gBAAgB,cAAc,KAAK,CAAC,MAAO,CAAC,aAAa,EAAE,YAAA,CAAa,GAAG;AACzJ,WAAO,EAAE,MAAM,CAAA,GAAI,MAAM,CAAA,GAAI,UAAU,KAAA;AAAA,EACzC;AACA,SAAO,aAAa,MAAM,KAAK;AACjC;AAGO,SAAS,eAAe,MAAuB;AACpD,QAAM,IAAI,KAAK,KAAA;AACf,SAAO,8CAA8C,KAAK,CAAC,KAAK,QAAQ,cAAc,CAAC,CAAC;AAC1F;AC5KO,SAAS,cAAc,MAAc,cAA+B;AACzE,MAAI,MAAM,KAAK,QAAQ,qBAAqB,CAAC,MAAM,EAAE,QAAQ,UAAU,GAAG,CAAC;AAC3E,MAAI,aAAc,OAAM,IAAI,QAAQ,2BAA2B,CAAC,GAAG,QAAgB,MAAM,IAAI,OAAO,EAAE,SAAS,IAAI,MAAM,CAAC;AAC1H,SAAO;AACT;AAEA,MAAM,UAAU;AAET,SAAS,YAAY,MAAc,OAAgC,OAAgB;AACxF,QAAM,QAAQ,cAAc,MAAM,SAAS,KAAK;AAChD,QAAM,QAAmB,CAAA;AACzB,aAAW,KAAK,MAAM,SAAS,OAAO,GAAG;AACvC,UAAM,WAAW,EAAE,CAAC;AACpB,QAAI,SAAS,WAAW,GAAG,EAAG;AAC9B,UAAM,QAAQ,EAAE,CAAC;AACjB,QAAI,CAAC,MAAM,OAAQ;AAEnB,UAAM,aAAa,EAAE,QAAS,EAAE,CAAC,EAAE,SAAS,MAAM;AAClD,UAAM,KAAK,EAAE,UAAU,OAAO,YAAY,MAAM,aAAa,UAAU,KAAK,GAAG;AAAA,EACjF;AACA,QAAM,UAAU,CAAC,GAAG,MAAM,SAAS,qBAAqB,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,QAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAG,QAAQ,MAAM,gBAAgB,EAAE,CAAC,CAAE,IAAI;AACtJ,SAAO,EAAE,OAAO,QAAA;AAClB;AAGO,SAAS,QAAQ,MAAoE;AAC1F,QAAM,SAAS,CAAC,CAAC;AACjB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,KAAI,KAAK,WAAW,CAAC,MAAM,GAAI,QAAO,KAAK,IAAI,CAAC;AACtF,SAAO,CAAC,WAAW;AACjB,QAAI,KAAK;AACT,QAAI,KAAK,OAAO,SAAS;AACzB,WAAO,KAAK,IAAI;AACd,YAAM,MAAO,KAAK,KAAK,KAAM;AAC7B,UAAI,OAAO,GAAG,KAAM,OAAQ,MAAK;AAAA,gBACvB,MAAM;AAAA,IAClB;AACA,WAAO,EAAE,MAAM,KAAK,GAAG,QAAQ,SAAS,OAAO,EAAE,IAAK,EAAA;AAAA,EACxD;AACF;ACtDA,MAAM,mBAAmB;AAAA,EACvB;AAAA,EAAiB;AAAA,EAAY;AAAA,EAAY;AAAA,EAAW;AAAA,EAAa;AAAA,EAAiB;AAAA,EAAQ;AAAA,EAAoB;AAAA,EAAe;AAAA,EAC7H;AAAA,EAAgB;AAAA,EAAa;AAAA,EAAmB;AAAA,EAAc;AAAA,EAAgB;AAAA,EAAY;AAAA,EAAe;AAAA,EAAoB;AAAA,EAC7H;AAAA,EAAc;AAAA,EAAc;AAAA,EAAqB;AAAA,EAAiB;AAAA,EAAa;AAAA,EAAyB;AAAA,EAAkB;AAAA,EAC1H;AAAA,EAAY;AAAA,EAAgB;AAAA,EAAW;AAAA,EAAU;AAAA,EAAyB;AAAA,EAAoB;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAgB;AAC1I;AACA,MAAM,gBAAgB,CAAC,uBAAuB,sBAAsB,qBAAqB,yBAAyB,gBAAgB,eAAe,eAAe,uBAAuB,oBAAoB,eAAe;AAC1N,MAAM,YAAY;AAElB,MAAM,iBAAiB,CAAC,YAAY,mBAAmB,YAAY,UAAU,WAAW,UAAU,qBAAqB,oBAAoB,iBAAiB,eAAe;AAK3K,MAAM,sBAAsB,CAAC,gBAAgB,oBAAoB,WAAW,aAAa,0BAA0B,UAAU,kBAAkB;AAC/I,MAAM,oBAAoB,oBAAI,IAAI,CAAC,QAAQ,WAAW,UAAU,CAAC;AAC1D,MAAM,eAAe,CAAC,KAAa,SAAiB,oBAAoB,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,MAAM,kBAAkB,IAAI,IAAI,KAAM,QAAQ,eAAe,SAAS;AAGpL,MAAM,aAAa,oBAAI,IAAI,CAAC,SAAS,gBAAgB,WAAW,YAAY,gBAAgB,SAAS,UAAU,UAAU,iBAAiB,aAAa,eAAe,qBAAqB,gBAAgB,uBAAuB,wBAAwB,YAAY,YAAY,cAAc,iBAAiB,cAAc,mBAAmB,UAAU,SAAS,qBAAqB,QAAQ,QAAQ,SAAS,QAAQ,YAAY,cAAc,aAAa,aAAa,QAAQ,gBAAgB,CAAC;AACje,MAAM,cAAc,CAAC,SAAiB,WAAW,IAAI,IAAI,KAAK,0CAA0C,KAAK,IAAI;AAExH,MAAM,cAAc,CAAC,KAAa,MAAe,EAAE,SAAS,GAAG,KAAK,EAAE,SAAS,GAAG,IAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,KAAK,IAAI,WAAW,GAAG,CAAC,GAAG;AAKtI,SAAS,YAAY,KAAqB;AAC/C,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,SAAO,IAAI,WAAW,GAAG,IAAI,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC;AACpE;AAEO,SAAS,eAAe,KAAa,YAAsB,eAAyB,CAAA,GAAgB;AACzG,MAAI,WAAW,KAAK,CAAC,MAAM,QAAQ,KAAK,IAAI,WAAW,GAAG,CAAC,GAAG,CAAC,EAAG,QAAO;AACzE,MAAI,cAAc,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,EAAG,QAAO;AAC3D,MAAI,eAAe,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,EAAG,QAAO;AAC5D,MAAI,UAAU,KAAK,GAAG,MAAM,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,MAAM,KAAK,IAAI,WAAW,aAAa,GAAI,QAAO;AACpK,MAAI,CAAC,GAAG,kBAAkB,GAAG,YAAY,EAAE,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,EAAG,QAAO;AACpF,MAAI,IAAI,WAAW,GAAG,KAAK,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,MAAM,EAAG,QAAO;AAC1G,SAAO;AACT;AAGO,SAAS,aAAa,KAAa,MAA0B;AAClE,SAAO,SAAS,WAAW,sBAAsB,SAAS,UAAU,UAAU,YAAY,GAAG;AAC/F;AAEA,MAAM,cAAoC;AAAA,EACxC,CAAC,4GAA4G,CAAC,QAAQ,CAAC;AAAA,EACvH,CAAC,sBAAsB,CAAC,cAAc,QAAQ,CAAC;AAAA,EAC/C,CAAC,yCAAyC,CAAC,aAAa,CAAC;AAAA,EACzD,CAAC,yBAAyB,CAAC,eAAe,OAAO,CAAC;AAAA,EAClD,CAAC,uHAAuH,CAAC,SAAS,OAAO,CAAC;AAAA,EAC1I,CAAC,+CAA+C,CAAC,UAAU,CAAC;AAAA,EAC5D,CAAC,8EAA8E,CAAC,YAAY,QAAQ,CAAC;AAAA,EACrG,CAAC,wDAAwD,CAAC,QAAQ,CAAC;AAAA,EACnE,CAAC,gDAAgD,CAAC,QAAQ,CAAC;AAAA,EAC3D,CAAC,6BAA6B,CAAC,UAAU,CAAC;AAAA,EAC1C,CAAC,wBAAwB,CAAC,eAAe,CAAC;AAAA,EAC1C,CAAC,8CAA8C,CAAC,YAAY,CAAC;AAAA,EAC7D,CAAC,YAAY,CAAC,QAAQ,CAAC;AAAA,EACvB,CAAC,2BAA2B,CAAC,eAAe,QAAQ,CAAC;AAAA,EACrD,CAAC,8EAA8E,CAAC,QAAQ,CAAC;AAAA,EACzF,CAAC,oCAAoC,CAAC,QAAQ,CAAC;AAAA,EAC/C,CAAC,gCAAgC,CAAC,SAAS,CAAC;AAAA,EAC5C,CAAC,aAAa,CAAC,SAAS,CAAC;AAAA,EACzB,CAAC,6CAA6C,CAAC,MAAM,CAAC;AAAA,EACtD,CAAC,6DAA6D,CAAC,MAAM,CAAC;AAAA,EACtE,CAAC,+DAA+D,CAAC,MAAM,CAAC;AAAA,EACxE,CAAC,YAAY,CAAC,QAAQ,CAAC;AAAA,EACvB,CAAC,WAAW,CAAC,OAAO,CAAC;AAAA,EACrB,CAAC,0BAA0B,CAAC,OAAO,OAAO,CAAC;AAAA,EAC3C,CAAC,gCAAgC,CAAC,OAAO,CAAC;AAAA,EAC1C,CAAC,wCAAwC,CAAC,UAAU,OAAO,CAAC;AAAA,EAC5D,CAAC,4EAA4E,CAAC,WAAW,CAAC;AAAA,EAC1F,CAAC,iEAAiE,CAAC,cAAc,YAAY,CAAC;AAAA,EAC9F,CAAC,wCAAwC,CAAC,WAAW,CAAC;AAAA,EACtD,CAAC,2CAA2C,CAAC,OAAO,CAAC;AAAA,EACrD,CAAC,yDAAyD,CAAC,WAAW,UAAU,CAAC;AAAA,EACjF,CAAC,+BAA+B,CAAC,UAAU,CAAC;AAAA,EAC5C,CAAC,cAAc,CAAC,UAAU,CAAC;AAAA,EAC3B,CAAC,yBAAyB,CAAC,SAAS,CAAC;AAAA,EACrC,CAAC,+DAA+D,CAAC,WAAW,CAAC;AAAA,EAC7E,CAAC,2GAA2G,CAAC,OAAO,CAAC;AAAA,EACrH,CAAC,kCAAkC,CAAC,YAAY,CAAC;AAAA,EACjD,CAAC,8BAA8B,CAAC,YAAY,CAAC;AAAA,EAC7C,CAAC,UAAU,CAAC,MAAM,CAAC;AAAA,EACnB,CAAC,WAAW,CAAC,OAAO,CAAC;AAAA,EACrB,CAAC,4BAA4B,CAAC,MAAM,CAAC;AAAA,EACrC,CAAC,eAAe,CAAC,WAAW,CAAC;AAAA,EAC7B,CAAC,uBAAuB,CAAC,MAAM,CAAC;AAAA,EAChC,CAAC,yGAAyG,CAAC,OAAO,CAAC;AAAA,EACnH,CAAC,8DAA8D,CAAC,YAAY,CAAC;AAAA,EAC7E,CAAC,SAAS,CAAC,KAAK,CAAC;AACnB;AAGO,SAAS,aAAa,MAAc,IAAqC;AAC9E,QAAM,OAAO,KAAK,MAAM,GAAG,EAAE,IAAA;AAC7B,MAAI,GAAG,IAAI,IAAI,EAAG,QAAO;AACzB,aAAW,CAAC,IAAI,KAAK,KAAK,YAAa,KAAI,GAAG,KAAK,IAAI,EAAG,QAAO,MAAM,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAC5F,SAAO;AACT;AAGO,SAAS,iBAAiB,KAAa,MAA0B,IAAqC;AAC3G,QAAM,OAAO,IAAI,MAAgB,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AACxD,UAAQ,KAAA;AAAA,IACN,KAAK;AACH,aAAO,KAAK,QAAQ;AAAA,IACtB,KAAK;AACH,UAAI,SAAS,WAAY,QAAO,KAAK,YAAY,QAAQ;AACzD,UAAI,SAAS,QAAS,QAAO,KAAK,YAAY;AAC9C,UAAI,SAAS,QAAS,QAAO,KAAK,QAAQ;AAC1C,UAAI,SAAS,SAAU,QAAO,KAAK,eAAe,OAAO;AACzD,aAAO,KAAK,SAAS,OAAO;AAAA,IAC9B,KAAK;AACH,aAAO,KAAK,UAAU,UAAU;AAAA,IAClC,KAAK;AACH,aAAO,KAAK,UAAU;AAAA,IACxB,KAAK;AACH,aAAO,KAAK,QAAQ;AAAA,IACtB,KAAK;AACH,aAAO,KAAK,OAAO;AAAA,IACrB,KAAK;AACH,aAAO,KAAK,MAAM;AAAA,IACpB,KAAK;AACH,aAAO,KAAK,OAAO;AAAA,IACrB;AACE,aAAO,KAAK,IAAI,CAAC,EAAG,gBAAgB,IAAI,MAAM,CAAC,CAAC;AAAA,EAAA;AAEtD;ACxGA,MAAM,kBAA0C,EAAE,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,EAAA;AACvH,MAAM,kBAA0C,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,EAAA;AAGvH,MAAM,cAAkC;AAAA,EACtC,CAAC,sFAAsF,8CAA8C;AAAA,EACrI,CAAC,sBAAsB,gEAAgE;AAAA,EACvF,CAAC,sCAAsC,4DAA4D;AACrG;AAEA,MAAM,WAAqD;AAAA,EACzD,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,eAAe;AAAA,EACf,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AACjB;AAEA,MAAM,OAAO,CAAC,QAAoC;AAChD,QAAM,IAAI,8BAA8B,KAAK,IAAI,MAAM;AACvD,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,EAAE,CAAC,MAAM,SAAS,EAAE,CAAC,MAAM,OAAO,OAAO,EAAE,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;AAC1E;AACA,MAAM,OAAO,CAAC,QAAoC;AAChD,QAAM,IAAI,sBAAsB,KAAK,IAAI,MAAM;AAC/C,SAAO,IAAK,EAAE,CAAC,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,MAAO,OAAO,EAAE,CAAC,CAAC,IAAK;AACnE;AACA,MAAM,gBAA0C,EAAE,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,EAAA;AAC7L,MAAM,SAAS,CAAC,QAAsC;AACpD,QAAM,IAAI,cAAc,IAAI,KAAA,CAAM;AAClC,MAAI,EAAG,QAAO;AACd,QAAM,IAAI,0BAA0B,KAAK,GAAG;AAC5C,QAAM,IAAI,IAAI,CAAC,EAAG,MAAM,GAAG,EAAE,IAAI,MAAM;AACvC,SAAO,KAAK,EAAE,WAAW,KAAK,EAAE,MAAM,OAAO,QAAQ,IAAI,IAAI;AAC/D;AACA,MAAM,eAAuC,EAAE,QAAQ,KAAK,MAAM,KAAK,QAAQ,KAAK,SAAS,IAAA;AAC7F,MAAM,cAAc,CAAC,QAAgB,IAAI,MAAM,GAAG,EAAE,CAAC,EAAG,OAAO,QAAQ,gBAAgB,EAAE,EAAE,YAAA;AAC3F,MAAM,aAAa,CAAC,QAAgB,CAAC,GAAG,IAAI,QAAQ,8CAA8C,EAAE,EAAE,SAAS,cAAc,CAAC,EAAE,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;AAEvJ,SAAS,MAAM,MAA0B;AACvC,SAAO,QAAQ,QAAQ,UAAU,QAAQ,OAAO,SAAS,QAAQ,MAAM,WAAW;AACpF;AACA,MAAM,QAAQ,CAAC,GAAW,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM;AAG7D,MAAM,0BAA0B,CAAC,UAAU,SAAS,UAAU,YAAY,UAAU,SAAS,KAAK,KAAK;AAEvG,MAAM,kBAAkB;AAAA,EACpB,8BAAc,IAAA;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACD,SAAkB,CAAA;AAAA,EAClB,6BAAa,IAAA;AAAA,EACb;AAAA,EAER,YAAY,KAAsB,MAAsB;AACtD,SAAK,WAAW,KAAK;AACrB,SAAK,aAAa,IAAI,IAAI,KAAK,UAAU;AACzC,SAAK,mBAAmB,KAAK,oBAAoB,CAAA;AACjD,SAAK,iBAAiB,KAAK,kBAAkB;AAC7C,SAAK,eAAe,IAAI;AACxB,SAAK,QAAQ,IAAI,OAAA,EAAS,IAAI,QAAQ;AACtC,UAAM,QAAQ,IAAI,SAAA;AAClB,SAAK,aAAa,MAAM;AACxB,UAAM,SAAS,SAAS,KAAK,YAAY;AACzC,UAAM,gCAAgB,IAAA;AACtB,eAAW,SAAS,IAAI,UAAU;AAChC,YAAM,MAAM,KAAK,UAAU,KAAK;AAChC,YAAM,YAAY,SAAS,KAAK,MAAM;AACtC,YAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,iBAAW,KAAK,KAAK,QAAQ;AAC3B,cAAM,IAAI,IAAI,QAAQ,GAAG,KAAK;AAC9B,YAAI,EAAE,SAAS,CAAC,EAAE,IAAK;AACvB,cAAM,OAAO,EAAE,MAAM,GAAG,QAAQ,IAAI,WAAW,CAAC,GAAG,MAAM,EAAE,QAAQ,IAAI,MAAM,IAAI,OAAO,CAAC,KAAK,aAAa,KAAK,EAAE,IAAA;AAClH,YAAI,EAAE,SAAS,SAAS;AACtB,gBAAM,OAAO,cAAc,EAAE,GAAG;AAChC,gBAAM,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG;AACxB,cAAI,CAAC,QAAQ,UAAU,IAAI,EAAE,EAAG;AAChC,oBAAU,IAAI,EAAE;AAChB,eAAK,OAAO,KAAK,EAAE,GAAG,MAAM,MAAM,GAAI,MAAM,EAAE,OAAO,IAAA,IAAQ,CAAA,GAAK;AAAA,QACpE,WAAW,WAAW;AACpB,gBAAM,OAAO,KAAK,OAAO,IAAI,KAAK,IAAI,KAAK,CAAA;AAC3C,eAAK,KAAK,IAAI;AACd,eAAK,OAAO,IAAI,KAAK,MAAM,IAAI;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AACA,eAAW,KAAK,MAAO,MAAK,QAAQ,IAAI,IAAI,WAAW,CAAC,CAAC;AAAA,EAC3D;AAAA,EAEQ,UAAU,OAAkC;AAClD,UAAM,OAAO,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC;AAChF,WAAO,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI;AAAA,EACrE;AAAA,EAEA,QAAQ,MAAuB;AAC7B,WAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,EAC9B;AAAA,EAEA,WAAW,KAAsB;AAC/B,WAAO,KAAK,SAAS,KAAK,CAAC,MAAM,QAAQ,KAAK,IAAI,WAAW,GAAG,CAAC,GAAG,CAAC;AAAA,EACvE;AAAA,EAEQ,QAAQ,OAAiB,QAA0B;AACzD,UAAM,MAAM,MAAM,QAAQ,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,KAAK,EAAE;AACzD,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,WAAW,IAAI,OAAO,CAAC,MAAM,OAAO,KAAK,EAAE,IAAI,CAAC;AACtD,WAAO,SAAS,SAAS,WAAW;AAAA,EACtC;AAAA,EAEQ,KAAK,GAAU,UAAkB,YAAqC;AAC5E,WAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,EAAE,QAAQ,OAAO,EAAE,KAAK,GAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAA,IAAU,CAAA,GAAK,UAAU,MAAM,QAAQ,GAAG,YAAY,MAAM,UAAU,GAAG,OAAO,MAAM,UAAU,EAAA;AAAA,EAClL;AAAA;AAAA,EAGA,aAAa,OAAe,UAAgD;AAC1E,UAAM,SAAS,cAAc,KAAK;AAClC,QAAI,CAAC,UAAU,CAAC,KAAK,OAAO,OAAQ,QAAO;AAC3C,UAAM,OAAO,YAAY,KAAK,CAAC,CAAC,EAAE,MAAM,YAAY,GAAG,KAAK,QAAQ,CAAC,IAAI,CAAC;AAC1E,UAAM,SAAS,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,QAAQ,EAAE,IAAK,IAAI;AACzE,UAAM,MAAM,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9C,UAAM,YAAY,OAAO,MAAM,MAAM,MAAM;AAC3C,UAAM,OAAO,OACV,OAAO,CAAC,MAAM,EAAE,KAAK,KAAK,IAAI,WAAW,GAAG,CAAC,EAC7C,KAAK,CAAC,GAAG,MAAM,OAAO,OAAO,CAAC,KAAK,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,gBAAgB,EAAE,EAAE,IAAI,KAAK,MAAM,gBAAgB,EAAE,EAAE,IAAI,KAAK,MAAM,OAAO,QAAQ,EAAE,EAAE,KAAK,CAAC,IAAI,OAAO,QAAQ,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACrP,QAAI,CAAC,QAAQ,KAAK,IAAI,GAAI,QAAO;AACjC,UAAM,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,MAAM;AAC1E,WAAO,KAAK,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,EACvC;AAAA,EAEQ,cAAc,OAAgB,QAAgB,MAAwC,OAAO,iBAAsD;AACzJ,UAAM,SAAS,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,KAAK,CAAC,EAAA,EAAI,EAAE,OAAO,CAAC,MAAoC,EAAE,MAAM,MAAS,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,KAAK,IAAI,EAAE,IAAI,MAAM,IAAI;AACtK,QAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,UAAM,MAAM,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9C,WAAO,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,KAAK,CAAC,GAAG,OAAO,KAAK,EAAE,EAAE,IAAI,KAAK,MAAM,KAAK,EAAE,EAAE,IAAI,KAAK,MAAM,EAAE,EAAE,KAAK,SAAS,EAAE,EAAE,KAAK,MAAM,EAAE,CAAC;AAAA,EAC/I;AAAA,EAEQ,gBAAgB,GAAW,QAAwB;AACzD,QAAI,MAAM,EAAG,QAAO;AACpB,UAAM,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,CAAC;AAC5C,WAAO,KAAK,KAAK,OAAO,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO,MAAM,MAAM;AAAA,EAC/E;AAAA;AAAA,EAGA,QAAQ,UAA2B,OAAe,UAAgD;AAChG,YAAQ,UAAA;AAAA,MACN,KAAK;AACH,eAAO,KAAK,aAAa,OAAO,QAAQ;AAAA,MAC1C,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,aAAa;AAChB,cAAM,KAAK,KAAK,KAAK;AACrB,YAAI,OAAO,OAAW,QAAO;AAC7B,cAAM,OAAO,KAAK,cAAc,KAAK,QAAQ,CAAC,WAAW,GAAG,SAAS,QAAQ,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,CAAC,MAAM,KAAK,EAAE,GAAG,CAAC;AACjH,YAAI,CAAC,KAAM,QAAO;AAClB,YAAI,OAAO,KAAK,gBAAgB,KAAK,GAAG,EAAE;AAC1C,YAAI,QAAQ,MAAM,KAAK,KAAK,KAAK,CAAC,OAAO,KAAK,KAAK,EAAG,QAAO,KAAK,IAAI,MAAM,IAAI;AAChF,eAAO,OAAO,KAAK,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI,IAAI;AAAA,MAClD;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,IAAI,OAAO,KAAK;AACtB,YAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AAChC,cAAM,OAAO,KAAK,cAAc,KAAK,QAAQ,CAAC,UAAU,WAAW,GAAG,SAAS,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,SAAS,aAAa,EAAG,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,OAAO,EAAE,GAAG,CAAC;AAC5K,YAAI,CAAC,KAAM,QAAO;AAClB,cAAM,OAAO,KAAK,IAAI,OAAQ,IAAI,KAAK,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,MAAM;AAChF,eAAO,KAAK,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI;AAAA,MACvC;AAAA,MACA,KAAK,YAAY;AACf,cAAM,KAAK,KAAK,KAAK;AACrB,YAAI,OAAO,OAAW,QAAO;AAC7B,cAAM,QAAQ,KAAK,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,KAAK,OAAO,CAAC;AACpF,cAAM,OAAO,KAAK,cAAc,OAAO,IAAI,CAAC,MAAM,KAAK,EAAE,GAAG,CAAC;AAC7D,cAAM,OAAO,OAAO,KAAK,gBAAgB,KAAK,GAAG,EAAE,KAAK,OAAO;AAC/D,eAAO,OAAO,KAAK,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI,IAAI;AAAA,MAClD;AAAA,MACA,KAAK,UAAU;AACb,cAAM,SAAS,OAAO,KAAK;AAC3B,YAAI,CAAC,OAAQ,QAAO;AACpB,cAAM,SAAS,KAAK,QAAQ,CAAC,aAAa,CAAC,EACxC,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,GAAG,EAAA,EAAI,EACpC,OAAO,CAAC,MAAM,EAAE,CAAC,EACjB,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAG,OAAO,CAAC,KAAK,GAAG,MAAM,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,CAAE,GAAG,CAAC,EAAA,EAAI,EACzF,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,gBAAgB,EAAE,EAAE,IAAI,KAAK,MAAM,gBAAgB,EAAE,EAAE,IAAI,KAAK,EAAE;AAClG,cAAM,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,EAAG,KAAK,SAAS,KAAK,EAAE,EAAE,IAAI,CAAC,KAAK,OAAO,CAAC;AAC5F,YAAI,CAAC,KAAM,QAAO;AAClB,eAAO,KAAK,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,MAAM,OAAO,GAAG;AAAA,MAClF;AAAA,MACA,KAAK,WAAW;AACd,cAAM,IAAI,OAAO,KAAK;AACtB,cAAM,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,SAAS,SAAS,EAAG,KAAK,EAAE,IAAI,CAAC;AAClH,cAAM,OAAO,KAAK,cAAc,OAAO,GAAG,CAAC,MAAM,OAAO,EAAE,GAAG,CAAC;AAC9D,YAAI,CAAC,KAAM,QAAO;AAClB,eAAO,KAAK,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,KAAK,MAAM,IAAI;AAAA,MAC/E;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,IAAI,aAAa,MAAM,aAAa,KAAK,OAAO,KAAK;AAC3D,YAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AAChC,cAAM,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,YAAY,CAAC,GAAG,GAAG,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,SAAS,aAAa,EAAG,KAAK,EAAE,IAAI,CAAC;AAChI,cAAM,OAAO,KAAK,cAAc,OAAO,GAAG,CAAC,MAAM,OAAO,EAAE,GAAG,CAAC;AAC9D,YAAI,CAAC,KAAM,QAAO;AAClB,cAAM,OAAO,KAAK,MAAM,IAAK,OAAO,CAAC,MAAM,QAAQ,IAAI,MAAO,KAAK,KAAK,MAAM,MAAM;AACpF,eAAO,KAAK,KAAK,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI;AAAA,MAC7C;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,MAAM,YAAY,KAAK;AAC7B,cAAM,QAAQ,KAAK,QAAQ,CAAC,YAAY,CAAC;AACzC,cAAM,QAAQ,MAAM,OAAO,CAAC,MAAM,YAAY,EAAE,GAAG,MAAM,GAAG,EAAE,KAAK,CAAC,GAAG,OAAO,gBAAgB,EAAE,IAAI,KAAK,MAAM,gBAAgB,EAAE,IAAI,KAAK,EAAE,EAAE,CAAC;AAC/I,YAAI,MAAO,QAAO,KAAK,KAAK,OAAO,GAAG,MAAM,QAAQ,OAAO,EAAE,MAAM,MAAM,IAAI,QAAQ,OAAO,EAAE,IAAI,IAAI,GAAG;AACzG,cAAM,OAAO,4BAA4B,KAAK,MAAM,aAAa;AACjE,cAAM,UAAU,MAAM,OAAO,CAAC,MAAO,OAAO,OAAO,KAAK,EAAE,IAAI,IAAI,OAAO,KAAK,EAAE,IAAI,CAAE,EAAE,KAAK,CAAC,GAAG,OAAO,gBAAgB,EAAE,IAAI,KAAK,MAAM,gBAAgB,EAAE,IAAI,KAAK,EAAE,EAAE,CAAC;AACzK,eAAO,UAAU,KAAK,KAAK,SAAS,GAAG,GAAG,IAAI;AAAA,MAChD;AAAA,MACA,KAAK,UAAU;AACb,cAAM,OAAO,CAAC,MAAc,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,YAAY,IAAI,EAAE,KAAA,EAAO,YAAA;AACpF,cAAM,QAAQ,KAAK,QAAQ,CAAC,QAAQ,CAAC;AACrC,cAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,KAAK,KAAK,CAAC;AAC3D,YAAI,MAAO,QAAO,KAAK,KAAK,OAAO,GAAG,CAAC;AACvC,cAAM,IAAI,WAAW,KAAK;AAC1B,cAAM,SAAS,MACZ,IAAI,CAAC,MAAM;AACV,gBAAM,IAAI,WAAW,EAAE,GAAG;AAC1B,gBAAM,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;AACvC,cAAI,IAAI;AACR,mBAAS,IAAI,GAAG,IAAI,KAAK,IAAK,MAAK,KAAK,KAAK,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,KAAK,EAAE;AACrE,iBAAO,EAAE,GAAG,EAAA;AAAA,QACd,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,OAAO,CAAC,YAAY,KAAK,EAAE,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,YAAY,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;AACxG,cAAM,OAAO,OAAO,CAAC;AACrB,YAAI,CAAC,KAAM,QAAO;AAClB,eAAO,KAAK,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,MAAM,IAAI;AAAA,MAChF;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA,EAGA,OAAO,QAAQ,GAAyC;AACtD,WAAO,QAAQ,KAAK,EAAE,UAAU,OAAO;AAAA,EACzC;AACF;AC9PA,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,mBAAmB;AACzB,MAAM,eAAe;AAOrB,MAAM,kBAAkB;AAGjB,SAAS,qBAAqB,IAAY,YAA6C;AAC5F,QAAM,IAAI,gBAAgB,KAAK,EAAE;AACjC,MAAI,CAAC,EAAG,QAAO;AACf,QAAMC,UAAS,EAAE,CAAC,EAAG,CAAC,EAAG,YAAA,IAAgB,EAAE,CAAC,EAAG,MAAM,CAAC;AACtD,MAAI,WAAW,IAAIA,OAAM,EAAG,QAAOA;AACnC,SAAO,CAAC,GAAG,UAAU,EAAE,OAAO,CAAC,MAAMA,QAAO,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAClG;AAMO,MAAM,oBAA4C,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM,OAAO,SAAS,WAAW,KAAK,WAAW,WAAW,UAAA;AAC/I,MAAM,kBAA0C,EAAE,YAAY,UAAA;AACrE,MAAM,gBAAgB;AACtB,MAAM,eAAe;AAGd,SAAS,sBAAsB,MAAc,YAAiE;AACnH,QAAM,MAA8C,CAAA;AACpD,aAAW,SAAS,KAAK,MAAM,KAAK,GAAG;AACrC,UAAM,YAAY,kBAAkB,KAAK;AACzC,QAAI,aAAa,WAAW,IAAI,SAAS,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,cAAc,SAAS,EAAG,KAAI,KAAK,EAAE,OAAO,WAAW;AAAA,EAC1H;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,MAA6B;AAC5C,SAAO,KAAK,SAAS,MAAM,IAAI,GAAG,WAAW,MAAM,KAAK,SAAS,MAAM,IAAI,GAAG,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,MAAM,IAAI,GAAG,WAAW,KAAK,GAAG,WAAW;AAC3M;AAEA,MAAM,mCAAmB,IAAI,CAAC,UAAU,aAAa,MAAM,iBAAiB,eAAe,CAAC;AAE5F,SAAS,gBAAgB,MAAgE;AACvF,MAAI,IAAa,GAAG,oBAAoB,IAAI,IAAI,KAAK,OAAO,SAAS,KAAK;AAC1E,SAAO,GAAG,0BAA0B,CAAC,OAAO,EAAE;AAC9C,MAAI,GAAG,gBAAgB,CAAC,KAAK,GAAG,eAAe,EAAE,MAAM,EAAG,QAAO,aAAa,IAAI,EAAE,OAAO,KAAK,SAAS;AACzG,MAAI,GAAG,qBAAqB,CAAC,EAAG,QAAO,aAAa,IAAI,EAAE,KAAK,SAAS;AACxE,SAAO;AACT;AAEA,MAAM,UAAU,CAAC,MACf,CAAC,IAAI,SAAY,GAAG,aAAa,CAAC,KAAK,GAAG,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAAC,KAAK,GAAG,iBAAiB,CAAC,KAAK,GAAG,gCAAgC,CAAC,IAAI,EAAE,OAAO;AAElL,SAAS,sBAAsB,MAAc,UAAyC;AACpF,MAAI,UAAU,KAAK,QAAQ,EAAG,QAAO;AACrC,MAAI,0BAA0B,KAAK,QAAQ,EAAG,QAAO;AACrD,MAAI,oBAAoB,KAAK,QAAQ,KAAK,UAAU,KAAK,IAAI,EAAG,QAAO;AACvE,MAAI,sCAAsC,KAAK,IAAI,UAAU,OAAO,KAAK,IAAI,IAAI,OAAO;AACxF,SAAO;AACT;AAMO,SAAS,UAAU,MAAc,MAAyB;AAC/D,QAAM,KAAK,GAAG,iBAAiB,MAAM,MAAM,GAAG,aAAa,QAAQ,OAAO,QAAQ,IAAI,CAAC;AACvF,QAAM,8BAAyB,IAAA;AAC/B,aAAW,QAAQ,GAAG,YAAY;AAChC,QAAI,CAAC,GAAG,oBAAoB,IAAI,KAAK,CAAC,GAAG,gBAAgB,KAAK,eAAe,EAAG;AAChF,UAAM,MAAM,KAAK,gBAAgB;AACjC,UAAM,IAAI,KAAK;AACf,QAAI,GAAG,KAAM,SAAQ,IAAI,EAAE,KAAK,MAAM,EAAE,QAAQ,KAAK,UAAU,UAAA,CAAW;AAC1E,QAAI,GAAG,iBAAiB,GAAG,kBAAkB,EAAE,aAAa,EAAG,SAAQ,IAAI,EAAE,cAAc,KAAK,MAAM,EAAE,QAAQ,KAAK,UAAU,KAAK;AACpI,QAAI,GAAG,iBAAiB,GAAG,eAAe,EAAE,aAAa,EAAG,YAAW,MAAM,EAAE,cAAc,SAAU,SAAQ,IAAI,GAAG,KAAK,MAAM,EAAE,QAAQ,KAAK,WAAW,GAAG,gBAAgB,GAAG,MAAM,KAAA,CAAM;AAAA,EAC/L;AACA,SAAO;AACT;AAmBO,SAAS,YAAY,GAAW,SAAoB,IAAyG;AAClK,QAAM,EAAE,SAAS;AACjB,QAAM,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,EAAE,OAAA;AACrC,MAAI,gBAAgB,KAAK,IAAI,GAAG;AAC9B,QAAI,CAAC,GAAG,eAAe,SAAS,IAAI,UAAU,CAAA;AAC9C,QAAI,SAAS,WAAW,EAAE,SAAS,iBAAiB,CAAA;AAEpD,QAAI,SAAS,OAAO,CAAC,EAAE,gBAAgB,CAAA;AAEvC,QAAI,EAAE,aAAc,QAAO,CAAA;AAG3B,UAAM,aAAa,iBAAiB,MAAM,EAAE,MAAM,GAAG,UAAU;AAC/D,QAAI,CAAC,WAAY,QAAO,CAAA;AACxB,WAAO,EAAE,WAAW,EAAE,GAAG,IAAI,MAAM,MAAM,UAAU,SAAS,UAAU,aAAW;AAAA,EACnF;AACA,QAAM,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC;AAC9B,QAAM,MAAM,QAAQ,IAAI,IAAI;AAC5B,QAAM,KAAK,KAAK,aAAa;AAE7B,QAAM,QAAQ,OAAO,CAAC,MAAM,IAAI,aAAa,YAAY,CAAC,IAAI,UAAU,GAAG,KAAK,MAAM,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;AACjH,QAAM,OAAO,MAAM,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI;AAC7E,MAAI,KAAK;AACP,UAAM,OAAO,eAAe,IAAI,QAAQ,GAAG,UAAU,GAAG,gBAAgB;AAExE,QAAI,YAAY,KAAK,MAAM,GAAG,EAAE,IAAA,CAAM,EAAG,QAAO,CAAA;AAChD,QAAI,SAAS,KAAM,QAAO,EAAE,IAAI,KAAA;AAChC,QAAI,SAAS,SAAU,QAAO,EAAE,WAAW,EAAE,GAAG,IAAI,MAAM,OAAO,MAAM,WAAW,SAAS,aAAa,IAAI,QAAQ,IAAI,IAAE;AAC1H,QAAI,SAAS,WAAW,aAAa,IAAI,QAAQ,IAAI,aAAa,YAAY,YAAY,IAAI,GAAG;AAC/F,UAAI,EAAE,aAAc,QAAO,CAAA;AAC3B,YAAM,aAAa,GAAG,WAAW,IAAI,MAAM,IAAI,SAAS;AACxD,aAAO,EAAE,WAAW,EAAE,GAAG,IAAI,MAAM,OAAO,MAAM,WAAW,SAAS,aAAa,IAAI,QAAQ,IAAI,GAAG,GAAI,aAAa,EAAE,WAAA,IAAe,CAAA,IAAI;AAAA,IAC5I;AACA,QAAI,SAAS,aAAa,SAAS,UAAU;AAC3C,YAAM,cAAc,KAAK,aAAa,MAAM,GAAG,UAAU,IAAI,WAAc,aAAa,MAAM,GAAG,UAAU;AAC3G,aAAO,EAAE,WAAW,EAAE,GAAG,IAAI,MAAM,OAAO,MAAM,WAAW,SAAS,aAAa,IAAI,QAAQ,IAAI,GAAG,GAAI,aAAa,EAAE,WAAA,IAAe,CAAA,IAAI;AAAA,IAC5I;AACA,QAAI,SAAS,WAAW,GAAG,WAAW,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,CAAE,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI,MAAM,MAAM,MAAM,aAAa,SAAS,SAAS,YAAY,KAAK,MAAM,GAAG,EAAE,CAAC,IAAG;AAC9K,WAAO,CAAA;AAAA,EACT;AACA,MAAI,GAAG,WAAW,IAAI,IAAI,EAAG,QAAO,EAAE,gBAAgB,EAAE,GAAG,IAAI,MAAM,MAAM,aAAa,SAAS,SAAS,YAAY,OAAK;AAC3H,SAAO,CAAA;AACT;AAGO,SAAS,iBAAiB,MAAqB,QAAgB,KAA2D,IAAwE;AACvM,QAAM,WAA2B,CAAA;AACjC,MAAI,YAAY;AAChB,aAAW,KAAK,MAAM;AACpB,QAAI,EAAE,SAAS,SAAS;AACtB;AACA;AAAA,IACF;AACA,QAAI,EAAE,SAAS,QAAS;AACxB,QAAI,MAAM,EAAE;AACZ,UAAM,IAAI,EAAE;AACZ,UAAM,UAAU,QAAQ,cAAc,CAAC,CAAC;AACxC,QAAI,QAAQ,gBAAiB,OAAM,UAAU,UAAU;AAAA,aAC9C,QAAQ,iBAAkB,OAAM,UAAU,UAAU;AAAA,aACpD,QAAQ,kBAAmB,OAAM,UAAU,UAAU;AAAA,aACrD,QAAQ,OAAQ,OAAM,UAAU,KAAK,CAAC,IAAI,gBAAgB;AACnE,QAAI,QAAQ,WAAW,CAAC,QAAS;AACjC,UAAM,aAAa,GAAG,QAAQ,KAAwB,CAAC;AACvD,UAAM,MAAM,EAAE,SAAS,aAAa,cAAc,WAAW,aAAa,MAAM,EAAE,GAAG,YAAY,YAAY,KAAK,OAAO,aAAsB;AAC/I,aAAS,KAAK,EAAE,GAAG,IAAI,SAAS,EAAE,KAAK,GAAG,UAAU,KAAwB,OAAO,EAAE,KAAK,QAAQ,YAAY,GAAI,MAAM,EAAE,YAAY,QAAQ,CAAA,GAAK;AAAA,EACrJ;AACA,SAAO,EAAE,UAAU,UAAA;AACrB;AAEO,SAAS,SAAS,MAAc,MAAc,IAAiC;AACpF,QAAM,KAAK,GAAG,iBAAiB,MAAM,MAAM,GAAG,aAAa,QAAQ,MAAM,QAAQ,IAAI,CAAC;AACtF,QAAM,MAAgB,EAAE,UAAU,CAAA,GAAI,aAAa,GAAG,WAAW,GAAG,IAAI,CAAA,GAAI,YAAY,CAAA,GAAI,aAAa,CAAA,EAAC;AAC1G,QAAM,8BAAc,IAAA;AACpB,QAAM,8BAAyB,IAAA;AAC/B,QAAM,MAAM,CAAC,WAAmB;AAC9B,UAAM,KAAK,GAAG,8BAA8B,MAAM;AAClD,WAAO,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,EAAA;AAAA,EACrD;AAEA,QAAM,SAAS,CAAC,GAAa,QAAgB,QAAuB,aAAsB;AACxF,UAAM,aAAa,GAAG,QAAQ,EAAE,UAAU,EAAE,MAAM,QAAQ;AAC1D,QAAI,SAAS,KAAK,EAAE,GAAG,IAAI,MAAM,GAAG,UAAU,EAAE,UAAU,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA,GAAK,OAAO,EAAE,MAAM,QAAQ,GAAI,aAAa,EAAE,WAAA,IAAe,CAAA,EAAC,CAAI;AAAA,EAC7J;AAEA,QAAM,cAAc,CAAC,MAAqB,WAAmB;AAC3D,UAAM,IAAI,iBAAiB,MAAM,QAAQ,KAAK,EAAE;AAChD,QAAI,aAAa,EAAE;AACnB,QAAI,SAAS,KAAK,GAAG,EAAE,QAAQ;AAAA,EACjC;AAGA,QAAM,aAAa,CAAC,KAAa,MAAqB,QAAwB;AAC5E,UAAM,SAAwB,QAAQ,OAAO,OAAO,QAAQ,UAAU,UAAU,QAAQ,UAAU,UAAU;AAC5G,QAAI,GAAG,0BAA0B,IAAI,KAAK,GAAG,eAAe,IAAI,KAAK,GAAG,sBAAsB,IAAI,EAAG,QAAO,WAAW,KAAK,KAAK,YAAY,GAAG;AAChJ,QAAI,GAAG,gBAAgB,IAAI,KAAK,GAAG,gCAAgC,IAAI,GAAG;AACxE,cAAQ,IAAI,IAAI;AAChB,YAAM,IAAI,YAAY,KAAK,KAAK,MAAM,GAAG;AACzC,UAAI,EAAE,SAAU,KAAI;AACpB,iBAAW,KAAK,EAAE,aAAa,GAAG,KAAK,SAAS,EAAE,IAAI,IAAI,EAAE,OAAO,QAAQ,EAAE,KAAK,SAAS,OAAO,GAAG,IAAI,MAAS;AAClH;AAAA,IACF;AACA,QAAI,GAAG,iBAAiB,IAAI,KAAM,GAAG,wBAAwB,IAAI,KAAK,KAAK,aAAa,GAAG,WAAW,cAAc,GAAG,iBAAiB,KAAK,OAAO,GAAI;AACtJ,YAAM,IAAI,GAAG,iBAAiB,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,OAAQ,KAAK,QAA8B,IAAI;AAC1G,YAAM,IAAI,YAAY,KAAK,GAAG,GAAG;AACjC,UAAI,EAAE,SAAU,KAAI;AACpB,iBAAW,KAAK,EAAE,KAAM,QAAO,GAAG,KAAK,SAAS,EAAE,GAAG,QAAQ,OAAO,GAAG,CAAC;AACxE;AAAA,IACF;AACA,QAAI,GAAG,qBAAqB,IAAI,GAAG;AACjC,YAAM,QAAmE,CAAC,KAAK,MAAM,GAAG,KAAK,cAAc,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAChI,iBAAW,KAAK,OAAO;AACrB,gBAAQ,IAAI,CAAC;AACb,cAAM,IAAI,YAAY,KAAK,EAAE,MAAM,GAAG;AACtC,mBAAW,KAAK,EAAE,KAAM,QAAO,GAAG,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,OAAO,QAAQ,OAAO,GAAG,CAAC;AAAA,MACrF;AACA,WAAK,cAAc,QAAQ,CAAC,MAAM,MAAM,EAAE,YAAY,KAAK,KAAK,CAAC;AACjE;AAAA,IACF;AACA,QAAI,GAAG,wBAAwB,IAAI,GAAG;AACpC,YAAM,KAAK,WAAW,MAAM,KAAK;AACjC,iBAAW,KAAK,KAAK,UAAU,GAAG;AAClC,iBAAW,KAAK,KAAK,WAAW,GAAG;AACnC;AAAA,IACF;AACA,QAAI,GAAG,mBAAmB,IAAI,KAAK,CAAC,GAAG,WAAW,aAAa,GAAG,WAAW,uBAAuB,GAAG,WAAW,uBAAuB,EAAE,SAAS,KAAK,cAAc,IAAI,GAAG;AAC5K,iBAAW,KAAK,KAAK,MAAM,GAAG;AAC9B,iBAAW,KAAK,KAAK,OAAO,GAAG;AAC/B;AAAA,IACF;AACA,UAAM,MAAM,KAAK,KAAK;AAAA,EACxB;AACA,QAAM,SAAS,CAAC,MAAc,EAAE,QAAQ,6BAA6B,CAAC,MAAM,IAAI,EAAE,YAAA,CAAa,EAAE,EAAE,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,YAAA,CAAa,EAAE;AAEjJ,QAAM,cAAc,CAAC,QAA4B;AAC/C,UAAM,QAAQ,IAAI,SAAS,EAAE,IAAI;AACjC,QAAI,OAAO,KAAK,MAAM,OAAO,IAAI,OAAA,IAAW,CAAC;AAE7C,QAAI,GAAG,qBAAqB,GAAG,EAAG,YAAW,KAAK,IAAI,eAAe;AACnE,YAAM,IAAI,EAAE,WAAW,aAAA,IAAiB,IAAI;AAC5C,YAAM,IAAI,EAAE,QAAQ,SAAS,EAAE,IAAI,IAAI;AACvC,aAAO,KAAK,MAAM,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG,CAAC,EAAE,QAAQ,UAAU,GAAG,IAAI,KAAK,MAAM,CAAC;AAChF,YAAM,EAAE,YAAY,MAAM,KAAK;AAAA,IACjC;AACA,UAAM,QAAQ,GAAG,qBAAqB,GAAG,IAAI,CAAC,IAAI,MAAM,GAAG,IAAI,cAAc,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG;AAC1G,UAAM,QAAQ,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AACnC,UAAM,OAAO,YAAY,MAAM,MAAM;AACrC,eAAW,KAAK,KAAK,OAAO;AAC1B,UAAI,EAAE,KAAK,SAAU,KAAI;AACzB,iBAAW,KAAK,EAAE,KAAK,aAAa,GAAG,QAAQ,EAAE,aAAa,EAAE,OAAO,UAAU,EAAE,SAAS,aAAa;AAAA,IAC3G;AACA,eAAW,KAAK,KAAK,QAAS,aAAY,EAAE,MAAM,QAAQ,EAAE,KAAK;AAAA,EACnE;AAEA,QAAM,YAAY,CAAC,MAAc,WAAmB;AAClD,eAAW,KAAK,sBAAsB,MAAM,GAAG,UAAU,EAAG,KAAI,WAAW,KAAK,EAAE,GAAG,IAAI,MAAM,GAAG,MAAM,IAAI,EAAE,KAAK,IAAI,MAAM,aAAa,SAAS,SAAS,YAAY,EAAE,UAAA,CAAW;AAAA,EACvL;AAEA,QAAM,eAAe,CAAC,SAAkB;AACtC,QAAI,GAAG,gBAAgB,IAAI,KAAK,GAAG,gCAAgC,IAAI,GAAG;AACxE,cAAQ,IAAI,IAAI;AAChB,gBAAU,KAAK,MAAM,KAAK,SAAS,EAAE,IAAI,CAAC;AAC1C,kBAAY,gBAAgB,KAAK,IAAI,GAAG,KAAK,SAAS,EAAE,IAAI,CAAC;AAAA,IAC/D,WAAW,GAAG,qBAAqB,IAAI,GAAG;AACxC,iBAAW,KAAK,CAAC,KAAK,MAAM,GAAG,KAAK,cAAc,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;AACxE,gBAAQ,IAAI,CAAC;AACb,kBAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC;AACpC,oBAAY,gBAAgB,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC;AAAA,MACzD;AACA,WAAK,cAAc,QAAQ,CAAC,MAAM,MAAM,EAAE,YAAY,MAAM,IAAI,CAAC;AAAA,IACnE,MAAO,OAAM,MAAM,MAAM,IAAI;AAAA,EAC/B;AAEA,QAAM,UAAU,CAAC,MAA+B,EAAE,QAAQ,EAAE;AAE5D,QAAM,UAAU,CAAC,SAA0D;AACzE,UAAM,OAAO,QAAQ,KAAK,OAAO;AACjC,UAAM,WAAW,KAAK,WAAW,WAAW,KAAK,CAAC,MAA4B,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,MAAM;AACnI,UAAM,OAAO,UAAU,eAAe,GAAG,gBAAgB,SAAS,WAAW,IAAI,SAAS,YAAY,OAAO;AAC7G,UAAM,UAAU,KAAK,WAAW,WAAW,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,MAAM;AAC5G,UAAM,IAAI,YAAY,EAAE,MAAM,GAAG,IAAI,KAAK,SAAS,EAAE,CAAC,GAAG,GAAI,SAAS,SAAY,EAAE,KAAA,IAAS,CAAA,GAAK,SAAS,cAAc,gBAAgB,IAAI,EAAA,GAAK,SAAS,EAAE;AAC7J,QAAI,EAAE,GAAI,KAAI,GAAG,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,KAAK,KAAK;AAC/C,QAAI,EAAE,UAAW,KAAI,WAAW,KAAK,EAAE,SAAS;AAChD,QAAI,EAAE,eAAgB,cAAa,KAAK,EAAE,cAAc;AAAA,EAC1D;AACA,QAAM,eAAmC,CAAA;AAEzC,WAAS,MAAM,MAAe,KAA4B,UAAyB;AACjF,QAAI,GAAG,oBAAoB,IAAI,GAAG;AAChC,YAAM,MAAO,KAAK,gBAAqC;AACvD,cAAQ,IAAI,KAAK,eAAe;AAChC,YAAM,IAAI,KAAK;AACf,UAAI,GAAG,KAAM,SAAQ,IAAI,EAAE,KAAK,MAAM,EAAE,QAAQ,KAAK,UAAU,UAAA,CAAW;AAC1E,UAAI,GAAG,iBAAiB,GAAG,kBAAkB,EAAE,aAAa,EAAG,SAAQ,IAAI,EAAE,cAAc,KAAK,MAAM,EAAE,QAAQ,KAAK,UAAU,KAAK;AACpI,UAAI,GAAG,iBAAiB,GAAG,eAAe,EAAE,aAAa,EAAG,YAAW,MAAM,EAAE,cAAc,SAAU,SAAQ,IAAI,GAAG,KAAK,MAAM,EAAE,QAAQ,KAAK,WAAW,GAAG,gBAAgB,GAAG,MAAM,KAAA,CAAM;AAC7L;AAAA,IACF;AACA,QAAK,GAAG,oBAAoB,IAAI,KAAK,KAAK,mBAAqB,GAAG,iBAAiB,IAAI,KAAK,KAAK,WAAW,SAAS,GAAG,WAAW,eAAgB;AACjJ,WAAK,aAAa,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AAAA,IACzC;AACA,QAAI,GAAG,sBAAsB,IAAI,KAAK,KAAK,QAAQ,SAAS,KAAK,KAAK,KAAK,IAAI,EAAG,KAAI,YAAY,KAAK,EAAE,MAAM,KAAK,KAAK,MAAM,MAAM,IAAI,KAAK,SAAS,EAAE,CAAC,EAAE,KAAA,CAAM;AAClK,QAAI,GAAG,mBAAmB,IAAI,KAAK,KAAK,QAAQ,SAAS,KAAK,KAAK,KAAK,IAAI,EAAG,KAAI,YAAY,KAAK,EAAE,MAAM,KAAK,KAAK,MAAM,MAAM,IAAI,KAAK,SAAS,EAAE,CAAC,EAAE,KAAA,CAAM;AAC/J,QAAI,GAAG,sBAAsB,IAAI,KAAK,GAAG,aAAa,KAAK,IAAI,GAAG;AAChE,YAAM,OAAO,KAAK,KAAK;AACvB,YAAM,OAAO,KAAK;AAClB,UAAI,SAAS,KAAK,IAAI,KAAK,SAAS,GAAG,gBAAgB,IAAI,KAAK,GAAG,qBAAqB,IAAI,KAAM,GAAG,iBAAiB,IAAI,KAAK,gCAAgC,KAAK,KAAK,WAAW,QAAQ,EAAE,CAAC;AAC7L,YAAI,YAAY,KAAK,EAAE,MAAM,MAAM,IAAI,KAAK,SAAS,EAAE,CAAC,EAAE,KAAA,CAAM;AAElE,UAAI,QAAQ,GAAG,iBAAiB,IAAI,KAAK,GAAG,iBAAiB,KAAK,UAAU,KAAK,KAAK,WAAW,WAAW,QAAQ,EAAE,MAAM,UAAU;AACpI,cAAM,OAAO,KAAK,WAAW,UAAU,CAAC;AACxC,cAAM,OAAO,QAAQ,GAAG,aAAa,IAAI,IAAI,QAAQ,IAAI,KAAK,IAAI,IAAI;AACtE,YAAI,cAAc,IAAI,MAAM,EAAE,GAAG,MAAM,UAAU,KAAK,aAAa,aAAa,KAAK,aAAa,MAAM,KAAM,QAAQ,EAAE,IAAI,KAAK,UAAU;AAAA,MAC7I;AACA,YAAM,UAAU,sBAAsB,MAAM,KAAK,MAAM,QAAQ,EAAE,KAAK,EAAE;AACxE,UAAI,WAAW,MAAM;AACnB,cAAM,MAAM,SAAS,QAAQ;AAC7B;AAAA,MACF;AAAA,IACF;AACA,QAAI,GAAG,eAAe,IAAI,GAAG;AAC3B,YAAM,OAAO,KAAK,KAAK,QAAQ,EAAE;AACjC,YAAM,OAAO,KAAK;AAClB,UAAI,CAAC,KAAM;AACX,YAAM,OAAO,GAAG,gBAAgB,IAAI,IAAI,KAAK,aAAa;AAC1D,UAAI,CAAC,KAAM;AACX,UAAI,yBAAyB,KAAK,IAAI,EAAG,QAAO,aAAa,IAAI;AACjE,UAAI,SAAS,WAAW,SAAS,KAAK,IAAI,EAAG,QAAO,MAAM,MAAM,SAAS,KAAK;AAC9E,UAAI,SAAS,QAAQ,MAAM,KAAK,IAAI,EAAG,QAAO,MAAM,MAAM,MAAM,KAAK;AACrE,UAAI,SAAS,MAAO,QAAO,MAAM,MAAM,SAAS,KAAK;AACrD,UAAI,GAAG,gBAAgB,IAAI,KAAK,eAAe,KAAK,IAAI,GAAG;AACzD,gBAAQ,IAAI,IAAI;AAChB,eAAO,EAAE,UAAU,SAAS,MAAM,KAAK,KAAe,GAAG,KAAK,SAAS,EAAE,IAAI,GAAG,YAAY,IAAI;AAChG;AAAA,MACF;AACA,UAAI,iBAAiB,KAAK,IAAI,KAAK,GAAG,iBAAiB,IAAI,GAAG;AAC5D,YAAI;AACJ;AAAA,MACF;AACA,aAAO,MAAM,MAAM,KAAK,QAAQ;AAAA,IAClC;AACA,QAAI,GAAG,oBAAoB,IAAI,KAAK,GAAG,wBAAwB,IAAI,EAAG,SAAQ,IAAI;AAClF,QAAI,GAAG,2BAA2B,IAAI,KAAK,SAAS,KAAK,KAAK,IAAI,QAAQ,EAAE,CAAC,GAAG;AAC9E,kBAAY,KAAK,QAAQ;AACzB;AAAA,IACF;AACA,QAAI,GAAG,iBAAiB,IAAI,KAAK,GAAG,aAAa,KAAK,UAAU,GAAG;AACjE,YAAM,MAAM,QAAQ,IAAI,KAAK,WAAW,IAAI;AAC5C,UAAI,OAAO,IAAI,aAAa,OAAO,eAAe,IAAI,QAAQ,GAAG,UAAU,GAAG,gBAAgB,MAAM,MAAM;AACxG,cAAM,OAAO,qBAAqB,IAAI,aAAa,YAAY,KAAK,WAAW,OAAO,IAAI,UAAU,GAAG,UAAU;AACjH,YAAI,UAAU,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,KAAK;AAAA,MACjD;AAAA,IACF;AAEA,QAAI,GAAG,mBAAmB,IAAI,KAAK,KAAK,cAAc,SAAS,GAAG,WAAW,eAAe,GAAG,2BAA2B,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,SAAS,aAAa;AAC3K,YAAM,KAAK,MAAM,KAAK,QAAQ;AAC9B,aAAO,aAAa,KAAK,KAAK;AAAA,IAChC;AACA,QAAI,GAAG,iBAAiB,IAAI,GAAG;AAC7B,YAAM,SAAS,KAAK,WAAW,QAAQ,EAAE;AACzC,UAAI,UAAU,KAAK,MAAM,GAAG;AAC1B,aAAK,UAAU,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC;AAC9C;AAAA,MACF;AACA,YAAM,SAAgC,mBAAmB,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,IAAI,WAAW,UAAU,KAAK,MAAM,IAAI,UAAU;AAChJ,UAAI,QAAQ;AACV,cAAM,KAAK,YAAY,KAAK,QAAQ;AACpC,aAAK,UAAU,QAAQ,CAAC,MAAM,MAAM,GAAG,QAAQ,KAAK,CAAC;AACrD;AAAA,MACF;AAAA,IACF;AACA,QAAI,GAAG,qBAAqB,IAAI,GAAG;AACjC,YAAM,MAAM,QAAQ,KAAK,IAAI;AAC7B,UAAI,QAAQ,QAAW;AACrB,YAAI,QAAQ,eAAe,QAAQ,QAAS,QAAO,aAAa,KAAK,WAAW;AAChF,YAAI,QAAQ,QAAQ,QAAQ,WAAW,QAAQ,oBAAoB,MAAM,KAAK,GAAG,GAAG;AAClF,iBAAO,MAAM,KAAK,aAAa,QAAQ,UAAU,UAAU,QAAQ,mBAAmB,WAAW,MAAM,KAAK;AAAA,QAC9G;AACA,YAAI,KAAK;AACP,cAAI,GAAG,0BAA0B,KAAK,WAAW,KAAK,GAAG,gBAAgB,KAAK,WAAW,KAAK,GAAG,yBAAyB,KAAK,WAAW,EAAG,QAAO,MAAM,KAAK,aAAa,KAAK,QAAQ;AACzL,iBAAO,WAAW,KAAK,KAAK,aAAa,GAAG;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AACA,QAAI,aAAa,GAAG,gBAAgB,IAAI,KAAK,GAAG,gCAAgC,IAAI,KAAK,GAAG,qBAAqB,IAAI,GAAI,QAAO,aAAa,IAAI;AACjJ,SAAK,aAAa,CAAC,MAAM,MAAM,GAAG,KAAK,QAAQ,CAAC;AAAA,EAClD;AAGA,QAAM,gBAAgB,CAAC,MAAqB;AAC1C,QAAI,GAAG,gBAAgB,CAAC,KAAK,GAAG,gCAAgC,CAAC,KAAK,GAAG,qBAAqB,CAAC,EAAG,QAAO,aAAa,CAAC;AACvH,QAAI,GAAG,qBAAqB,CAAC,GAAG;AAC9B,UAAI,GAAG,gBAAgB,EAAE,IAAI,GAAG;AAC9B,gBAAQ,IAAI,EAAE,IAAI;AAClB,oBAAY,gBAAgB,EAAE,KAAK,IAAI,GAAG,EAAE,KAAK,SAAS,EAAE,IAAI,CAAC;AAAA,MACnE;AACA,aAAO,cAAc,EAAE,WAAW;AAAA,IACpC;AACA,MAAE,aAAa,aAAa;AAAA,EAC9B;AAEA,QAAM,IAAI,MAAM,KAAK;AAGrB,QAAM,UAAU,CAAC,SAAkB;AACjC,QAAI,GAAG,gBAAgB,IAAI,KAAK,GAAG,gCAAgC,IAAI,KAAK,GAAG,eAAe,IAAI,KAAK,GAAG,iBAAiB,IAAI,KAAK,GAAG,eAAe,IAAI,GAAG;AAC3J,YAAM,IAAK,KAA4B;AAEvC,UAAI,CAAC,QAAQ,IAAI,IAAI,MAAM,EAAE,SAAS,GAAG,KAAK,GAAG,iBAAiB,IAAI,KAAK,GAAG,eAAe,IAAI,IAAI;AACnG,cAAM,OAAO,KAAK,SAAS,EAAE,IAAI;AACjC,mBAAW,KAAK,EAAE,SAAS,aAAa,cAAc,KAAK,sBAAsB,EAAE,CAAC,GAAI,GAAG,UAAU,EAAG,KAAI,WAAW,KAAK,EAAE,GAAG,IAAI,OAAO,EAAE,KAAM,GAAG,MAAM,IAAI,EAAE,KAAK,IAAI,MAAM,aAAa,SAAS,SAAS,YAAY,EAAE,WAAW;AAC1O,mBAAW,KAAK,EAAE,SAAS,YAAY,GAAG;AACxC,gBAAM,YAAY,gBAAgB,EAAE,CAAC,CAAE;AACvC,cAAI,aAAa,GAAG,WAAW,IAAI,SAAS,EAAG,KAAI,WAAW,KAAK,EAAE,GAAG,IAAI,OAAO,EAAE,QAAS,CAAC,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,MAAM,aAAa,SAAS,SAAS,YAAY,WAAW;AAAA,QACnL;AAAA,MACF;AACA,iBAAW,KAAK,EAAE,SAAS,qBAAqB,GAAG;AACjD,YAAI,GAAG,QAAQ,EAAE,CAAC,CAAE,EAAG,KAAI;AAAA,YACtB,KAAI;AAAA,MACX;AACA,UAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,GAAG,gBAAgB,IAAI,KAAK,eAAe,CAAC,KAAK,CAAC,GAAG,oBAAoB,KAAK,MAAM,KAAK,CAAC,GAAG,0BAA0B,KAAK,MAAM,GAAG;AAC7J,eAAO,EAAE,UAAU,SAAS,MAAM,EAAE,KAAA,EAAiB,GAAG,KAAK,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,qBAAqB,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,MAAS;AAAA,MACnK;AAAA,IACF;AACA,SAAK,aAAa,OAAO;AAAA,EAC3B;AACA,UAAQ,EAAE;AACV,MAAI,aAAa,CAAC,GAAG,KAAK,SAAS,YAAY,CAAC,EAAE;AAGlD,QAAM,UAAU,IAAI,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC1D,MAAI,WAAW,KAAK,GAAG,aAAa,OAAO,CAAC,MAAM,QAAQ,IAAI,EAAE,UAAW,CAAC,CAAC;AAC7E,MAAI,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM;AAClE,MAAI,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM;AACpE,SAAO;AACT;ACpcO,MAAM,mBAAmB;AAgBzB,SAAS,iBAAiB,MAAiC;AAChE,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,MAAyB,CAAA;AAC/B,aAAW,KAAK,KAAK,SAAS,IAAI,OAAO,GAAG,gBAAgB,OAAO,GAAG,CAAC,GAAG;AACxE,UAAM,QAAQ,EAAE;AAEhB,UAAM,SAAS,yBAAyB,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG,QAAQ,GAAG,GAAG,KAAK,CAAC;AACxF,UAAM,OAAO,SAAS,CAAC;AACvB,QAAI,CAAC,QAAS,SAAS,QAAQ,OAAO,CAAC,EAAG,SAAS,IAAI,EAAI;AAC3D,UAAM,OAAO,QAAQ,EAAE,CAAC,EAAE;AAC1B,QAAI;AACJ,QAAI,SAAS,MAAM;AACjB,YAAM,KAAK,QAAQ,MAAM,IAAI;AAC7B,UAAI,MAAM,EAAG,OAAM,KAAK;AAAA,IAC1B,OAAO;AACL,YAAM,KAAK,QAAQ,SAAS,SAAS,QAAQ,MAAM,IAAI;AACvD,UAAI,MAAM,EAAG;AAAA,IACf;AACA,UAAM,SAAS,KAAK,MAAM,MAAM,GAAG,EAAE,QAAQ,UAAU,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAA;AAChF,QAAI,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,QAAQ,GAAG,GAAG,EAAE,OAAO,GAAG,QAAQ;AAAA,EACrE;AACA,SAAO;AACT;AAQA,MAAM,OAAO,CAAC,GAAoC,QAAgB,QAChE,cAAc,IACV,EAAE,MAAM,EAAE,MAAM,QAAQ,EAAE,QAAQ,MAAM,SAAS,MAAM,EAAE,OAAO,QAAQ,QACxE,EAAE,MAAM,EAAE,MAAM,QAAQ,EAAE,QAAQ,MAAM,aAAa,MAAM,EAAE,MAAM,QAAQ,IAAA;AAG1E,SAAS,oBAAoB,MAAc,UAA0B,YAAgG;AAC1K,QAAM,SAA8C,CAAA;AACpD,QAAM,8BAAc,IAAA;AACpB,aAAW,KAAK,iBAAiB,IAAI,GAAG;AACtC,QAAI,CAAC,EAAE,QAAQ;AACb,aAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,gBAAgB,kCAAkC,gBAAgB,6CAAA,CAA8C;AACxJ;AAAA,IACF;AACA,QAAI,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;AAC9F,aAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,gBAAgB,0BAA0B,EAAE,MAAM,sCAAA,CAAuC;AACjI;AAAA,IACF;AACA,YAAQ,IAAI,EAAE,QAAQ,EAAE,MAAM;AAAA,EAChC;AACA,QAAM,UAAyB,CAAA;AAC/B,QAAM,OAAO,CAA4C,OACvD,GAAG,OAAO,CAAC,MAAM;AACf,UAAM,IAAI,QAAQ,IAAI,EAAE,IAAI;AAC5B,QAAI,MAAM,OAAW,QAAO;AAC5B,YAAQ,KAAK,KAAK,GAAG,GAAG,SAAS,CAAC;AAClC,WAAO;AAAA,EACT,CAAC;AACH,SAAO,EAAE,UAAU,KAAK,QAAQ,GAAG,YAAY,KAAK,UAAU,GAAG,SAAS,OAAA;AAC5E;AAGO,SAAS,eAAe,SAA2B,UAA0B,YAAsE;AACxJ,QAAM,2BAAW,IAAA;AACjB,QAAM,UAAyB,CAAA;AAC/B,QAAM,OAAO,CAA4C,OACvD,GAAG,OAAO,CAAC,MAAM;AACf,UAAM,OAAO,cAAc,IAAI,EAAE,QAAQ,EAAE;AAC3C,UAAM,OAAO,CAAC,MAAsB,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,UAAa,EAAE,SAAS;AAE7F,QAAI,IAAI,QAAQ,UAAU,CAAC,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;AAC3D,QAAI,IAAI,EAAG,KAAI,QAAQ,UAAU,IAAI;AACrC,QAAI,IAAI,EAAG,QAAO;AAClB,SAAK,IAAI,CAAC;AACV,YAAQ,KAAK,KAAK,GAAG,QAAQ,CAAC,EAAG,QAAQ,WAAW,CAAC;AACrD,WAAO;AAAA,EACT,CAAC;AACH,SAAO,EAAE,UAAU,KAAK,QAAQ,GAAG,YAAY,KAAK,UAAU,GAAG,SAAS,KAAA;AAC5E;AAGO,SAAS,eAAe,MAAiC;AAC9D,QAAM,OAAO,CAAC,QAAuB;AACnC,UAAM,IAAI,MAAM,cAAc,GAAG,EAAE;AAAA,EACrC;AACA,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAS,KAA+B,OAAO,EAAG,MAAK,+BAA+B;AACtI,SAAS,KAAgC,QAAS,IAAI,CAAC,GAAG,MAAM;AAC9D,UAAM,IAAI;AACV,QAAI,OAAO,EAAE,SAAS,YAAY,CAAC,EAAE,KAAM,MAAK,SAAS,CAAC,eAAe;AACzE,QAAI,OAAO,EAAE,SAAS,YAAY,CAAC,OAAO,UAAU,EAAE,IAAI,KAAK,EAAE,OAAO,EAAG,MAAK,SAAS,CAAC,KAAK,EAAE,IAAI,yBAAyB;AAC9H,QAAI,OAAO,EAAE,WAAW,YAAY,CAAC,EAAE,OAAO,KAAA,EAAQ,MAAK,SAAS,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,IAAI,oBAAoB;AAC9G,QAAI,EAAE,SAAS,UAAa,OAAO,EAAE,SAAS,SAAU,MAAK,SAAS,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,IAAI,4BAA4B;AACxH,WAAO,EAAE,MAAM,EAAE,MAAO,MAAM,EAAE,MAAO,GAAI,EAAE,SAAS,SAAY,EAAE,MAAM,EAAE,SAAS,CAAA,GAAK,QAAQ,EAAE,OAAQ,OAAK;AAAA,EACnH,CAAC;AACH;AC5GO,SAAS,UAAU,GAAgD,GAAyC;AACjH,MAAI,CAAC,KAAK,EAAE,UAAU,QAAS,QAAO;AACtC,UAAQ,EAAE,UAAA;AAAA,IACR,KAAK,SAAS;AACZ,YAAM,IAAI,cAAc,EAAE,IAAI;AAC9B,YAAM,IAAI,cAAc,EAAE,KAAK;AAC/B,aAAO,QAAQ,KAAK,KAAK,EAAE,YAAY,OAAO,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI;AAAA,IAC1E;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,KAAK,KAAA,MAAW,EAAE,MAAM,KAAA;AAAA,IACnC,KAAK;AACH,aAAO,EAAE,aAAa;AAAA,IACxB;AACE,aAAO;AAAA,EAAA;AAEb;AAaO,SAAS,aACd,MACA,MACA,IACA,MACU;AACV,QAAM,OAAO,KAAK,UAAU;AAC5B,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,KAAK,CAAC,MAAc,KAAK,IAAI,OAAO,CAAC;AAC3C,QAAM,OAAO,YAAY,MAAM,IAAI;AACnC,QAAM,WAA2B,CAAA;AACjC,MAAI,cAAc;AAClB,MAAI,YAAY;AAChB,aAAW,KAAK,KAAK,OAAO;AAC1B,eAAW,KAAK,EAAE,KAAK,SAAS,QAAQ,CAAC,IAAI,gBAAgB;AAC7D,QAAI,EAAE,KAAK,SAAU;AAAA,aACZ,SAAS,SAAS,CAAC,EAAE,SAAS,WAAW,GAAG,EAAG,eAAc,EAAE,MAAM,MAAM,WAAW,KAAK,CAAA,GAAI;AACxG,UAAM,WAAW,EAAE,SAAS,YAAA;AAC5B,eAAW,KAAK,EAAE,KAAK,MAAM;AAC3B,YAAM,aAAa,GAAG,QAAQ,EAAE,UAAU,EAAE,MAAM,QAAQ;AAC1D,YAAM,UAAU,WAAW,SAAS,UAAU,GAAG,UAAU;AAC3D,eAAS,KAAK,EAAE,GAAG,GAAG,EAAE,aAAa,EAAE,KAAK,GAAG,UAAU,EAAE,UAAU,UAAU,OAAO,EAAE,MAAM,QAAQ,GAAI,aAAa,EAAE,WAAA,IAAe,IAAK,GAAI,UAAU,EAAE,SAAS,KAAA,IAAS,CAAA,GAAK;AAAA,IACtL;AAAA,EACF;AACA,aAAW,KAAK,KAAK,SAAS;AAC5B,eAAW,KAAK,EAAE,MAAM;AACtB,UAAI,EAAE,SAAS,QAAS;AAAA,eACf,EAAE,SAAS,WAAW,EAAE,OAAO;AACtC,cAAM,MAAuB,cAAc,EAAE,KAAK,IAAI,UAAU,EAAE,aAAa,kBAAkB,cAAc,EAAE,aAAa,mBAAmB,iBAAiB,EAAE,aAAa,oBAAoB,WAAW,EAAE,aAAa,SAAS,gBAAiB,EAAE;AAC3P,cAAM,aAAa,GAAG,QAAQ,KAAK,EAAE,KAAK;AAC1C,iBAAS,KAAK,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,KAAK,GAAG,UAAU,KAAK,OAAO,EAAE,KAAK,QAAQ,YAAY,GAAI,aAAa,EAAE,eAAe,CAAA,GAAK;AAAA,MACpI,WAAW,EAAE,SAAS,WAAW,EAAE,OAAO;AACxC,cAAM,IAAI,qBAAqB,KAAK,EAAE,KAAK,IAAI,CAAC;AAChD,YAAI,KAAK,GAAG,QAAQ,CAAC,EAAG;AAAA,YACnB;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACA,WAAS,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM;AAC9D,SAAO,EAAE,UAAU,aAAa,UAAA;AAClC;ACxEO,MAAM,oBAAoB,CAAC,UAAU,QAAQ,SAAS;AAW7D,SAAS,KAAK,MAAc,QAAiB,YAA6B;AACxE,QAAM,SAAS,IAAI,WAAW,KAAK,MAAM;AACzC,aAAW,KAAK,OAAQ,QAAO,KAAK,GAAG,EAAE,OAAO,EAAE,GAAG;AACrD,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,WAAO,MAAM,QAAQ,QAAQ,OAAO,CAAC,CAAC,MAAM,aAAa,IAAI;AAAA,EAC/D;AACA,SAAO;AACT;AAEA,MAAM,SAAS,CAAC,OAAe,SAAiB,IAAI,OAAO,YAAY,IAAI,+CAA+C,GAAG,EAAE,KAAK,KAAK,GAAG,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,MAAM,MAAS;AAGhL,MAAM,eAAe,CAAC,UAAkB;AACtC,QAAM,OAAO,OAAO,OAAO,MAAM,GAAG,YAAA;AACpC,SAAO,CAAC,QAAQ,CAAC,UAAU,mBAAmB,0BAA0B,mBAAmB,MAAM,YAAY,EAAE,SAAS,IAAI;AAC9H;AAGO,SAAS,aAAa,MAAc,MAAoG;AAC7I,QAAM,cAAuB,CAAA;AAC7B,MAAI;AACJ,MAAI,OAAO;AACX,MAAI,SAAS,SAAS;AACpB,UAAM,OAAO,oBAAoB,KAAK,IAAI;AAC1C,QAAI,MAAM;AACR,YAAM,QAAQ;AACd,YAAM,YAAY,KAAK,CAAC,EAAE,SAAS;AACnC,YAAM,IAAI,MAAM,KAAK,IAAI;AACzB,UAAI,GAAG;AACL,sBAAc,EAAE,OAAO,KAAK,CAAC,EAAE,QAAQ,KAAK,EAAE,QAAQ,EAAA;AACtD,eAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;AACtB,oBAAY,KAAK,EAAE,OAAO,GAAG,KAAK,MAAM;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAmB,CAAA;AACzB,QAAM,SAAkB,CAAA;AACxB,QAAM,KAAK;AACX,KAAG,YAAY;AACf,WAAS,GAAI,IAAI,GAAG,KAAK,IAAI,KAAM;AACjC,UAAM,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,KAAK,EAAE,CAAC,EAAG,SAAS,IAAI,EAAE,CAAC,EAAG,MAAM,IAAI;AACpF,UAAM,QAAQ,EAAE,OAAO,cAAc,KAAK,eAAe,EAAE,CAAC,EAAG,QAAQ,OAAO,EAAE,CAAC,EAAA;AACjF,KAAC,EAAE,CAAC,EAAG,YAAA,MAAkB,WAAW,UAAU,QAAQ,KAAK,KAAK;AAChE,gBAAY,KAAK,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAA,CAAQ;AAAA,EACjE;AACA,aAAW,KAAK,KAAK,MAAM,IAAI,EAAE,SAAS,kBAAkB,EAAG,aAAY,KAAK,EAAE,OAAO,OAAO,EAAE,OAAQ,KAAK,OAAO,EAAE,QAAS,EAAE,CAAC,EAAE,QAAQ;AAC9I,SAAO,EAAE,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA,GAAK,SAAS,QAAQ,YAAA;AACrE;AAGA,SAAS,WAAW,GAAW,GAAmB;AAChD,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,UAAM,IAAI,EAAE,CAAC;AACb,QAAI,MAAM,IAAK;AAAA,aACN,MAAM,KAAK;AAClB,UAAI,EAAE,UAAU,EAAG,QAAO,IAAI;AAAA,IAChC,WAAW,MAAM,OAAO,MAAM,KAAK;AACjC,YAAM,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;AAC5B,UAAI,IAAI,EAAG,QAAO,EAAE;AACpB,UAAI;AAAA,IACN,WAAW,MAAM,KAAK;AACpB,WAAK,KAAK,IAAI,EAAE,UAAU,EAAE,CAAC,MAAM,KAAK,KAAK;AAC3C,YAAI,EAAE,CAAC,MAAM,KAAM;AAAA,iBACV,EAAE,CAAC,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,IAAK,KAAI,WAAW,GAAG,IAAI,CAAC,IAAI;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE;AACX;AAWA,SAAS,QAAQ,GAAW,GAAW,MAAwE;AAC7G,QAAM,QAAgB,CAAA;AACtB,MAAI,IAAI;AACR,SAAO,IAAI,EAAE,QAAQ;AACnB,WAAO,IAAI,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC,CAAE,EAAG;AACzC,UAAM,IAAI,EAAE,CAAC;AACb,QAAI,MAAM,OAAW;AACrB,QAAI,MAAM,IAAK,QAAO,EAAE,OAAO,KAAK,IAAI,GAAG,aAAa,MAAA;AACxD,QAAI,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,IAAK,QAAO,EAAE,OAAO,KAAK,IAAI,GAAG,aAAa,KAAA;AAC5E,QAAI,MAAM,KAAK;AAEb,YAAM,IAAI,WAAW,GAAG,CAAC;AACzB,YAAM,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,KAAA;AACpC,YAAM,KAAK,MAAM,WAAW,KAAK,IAAI,EAAE,MAAM,IAAI,MAAM,UAAU,OAAO,OAAO,YAAY,IAAI,EAAA,IAAM,EAAE,MAAM,OAAO,MAAM,QAAQ,OAAO,OAAO,YAAY,IAAI,EAAA,CAAG;AACnK,UAAI;AACJ;AAAA,IACF;AACA,UAAM,KAAK,gBAAgB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC;AACnD,QAAI,CAAC,IAAI;AACP;AACA;AAAA,IACF;AACA,UAAM,OAAO,GAAG,CAAC;AACjB,SAAK,KAAK;AACV,QAAI,IAAI;AACR,WAAO,IAAI,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC,CAAE,EAAG;AACzC,QAAI,EAAE,CAAC,MAAM,KAAK;AAChB,YAAM,KAAK,EAAE,MAAM,MAAM,QAAQ,OAAO,IAAI,YAAY,GAAG;AAC3D;AAAA,IACF;AACA;AACA,WAAO,IAAI,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC,CAAE,EAAG;AACzC,UAAM,IAAI,EAAE,CAAC;AACb,UAAM,QAAQ,SAAS,SAAS,0BAA0B,KAAK,IAAI;AACnE,QAAI,MAAM,OAAO,MAAM,KAAK;AAC1B,YAAM,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;AAC5B,YAAM,MAAM,IAAI,IAAI,EAAE,SAAS;AAC/B,YAAM,KAAK,EAAE,MAAM,MAAM,QAAQ,SAAS,UAAU,OAAO,EAAE,MAAM,IAAI,GAAG,GAAG,GAAG,YAAY,IAAI,GAAG;AACnG,UAAI,MAAM;AAAA,IACZ,WAAW,MAAM,KAAK;AACpB,YAAM,IAAI,WAAW,GAAG,CAAC;AACzB,YAAM,KAAK,EAAE,MAAM,MAAM,QAAQ,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,YAAY,IAAI,GAAG;AAClF,UAAI;AAAA,IACN,OAAO;AACL,YAAM,IAAI,WAAW,KAAK,EAAE,MAAM,CAAC,CAAC;AACpC,YAAM,IAAI,IAAI,CAAC,EAAE,QAAQ,OAAO,EAAE,KAAK;AACvC,YAAM,KAAK,EAAE,MAAM,MAAM,UAAU,OAAO,GAAG,YAAY,GAAG;AAC5D,UAAI,IAAI,EAAE;AAAA,IACZ;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK,EAAE,QAAQ,aAAa,MAAA;AAC9C;AAGA,MAAM,WAAW,CAAC,MAAc,EAAE,QAAQ,sBAAsB,EAAE;AAClE,MAAM,SAAS,CAAC,UAAkB,MAAM,QAAQ,oBAAoB,CAAC,IAAI,IAAI,MAAc,EAAE,YAAA,CAAa;AAC1G,MAAM,qBAAqB,oBAAI,IAAI,CAAC,QAAQ,MAAM,CAAC;AAG5C,SAAS,WAAW,MAAc,MAAc,MAAkB,IAAiC;AACxG,QAAM,MAAgB,EAAE,UAAU,CAAA,GAAI,aAAa,GAAG,WAAW,GAAG,IAAI,CAAA,GAAI,YAAY,CAAA,GAAI,aAAa,CAAA,EAAC;AAC1G,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,aAAa,MAAM,IAAI;AACtC,QAAM,8BAAyB,IAAA;AAE/B,QAAM,QAAQ,CAAC,MAAgB;AAC7B,QAAI,SAAS,KAAK,GAAG,EAAE,QAAQ;AAC/B,QAAI,eAAe,EAAE;AACrB,QAAI,aAAa,EAAE;AACnB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,EAAE,EAAE,EAAG,KAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK;AAC1E,QAAI,WAAW,KAAK,GAAG,EAAE,UAAU;AACnC,QAAI,YAAY,KAAK,GAAG,EAAE,WAAW;AAAA,EACvC;AAGA,QAAM,aAAa,CAAC,GAAI,OAAO,cAAc,CAAC,EAAE,GAAG,OAAO,aAAa,OAAO,GAAA,CAAI,IAAI,IAAK,GAAG,OAAO,QAAQ,OAAO,CAAC,MAAM,aAAa,EAAE,KAAK,CAAC,CAAC;AACjJ,aAAW,KAAK,YAAY;AAC1B,UAAM,MAAM,eAAe,KAAK,OAAO,EAAE,OAAO,MAAM,KAAK,EAAE;AAC7D,UAAM,OAAO,KAAK,MAAM,CAAC,CAAC,GAAG,IAAI;AACjC,UAAM,OAAO,GAAG,IAAI,IAAI,MAAM,QAAQ,IAAI;AAC1C,UAAM,SAAS,MAAM,MAAM,EAAE,CAAC;AAC9B,eAAW,CAAC,GAAG,CAAC,KAAK,UAAU,MAAM,IAAI,EAAG,SAAQ,IAAI,GAAG,CAAC;AAAA,EAC9D;AAEA,aAAW,KAAK,OAAO,QAAQ;AAC7B,UAAM,KAAK,OAAO,EAAE,OAAO,MAAM,KAAK,OAAO,YAAA;AAC7C,UAAM,IAAI,aAAa,KAAK,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,MAAM,UAAU,MAAM,SAAS,SAAS,MAAM,SAAS,SAAS,OAAO,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAA,CAAO;AACtJ,QAAI,SAAS,KAAK,GAAG,EAAE,QAAQ;AAC/B,QAAI,eAAe,EAAE;AACrB,QAAI,aAAa,EAAE;AAAA,EACrB;AAGA,QAAM,WAAW,CAAC,QAAgB,MAAc,QAAgB,QAAgB,iBAAiB,UAAU;AACzG,UAAM,EAAE,MAAM,WAAW,IAAI,MAAM;AACnC,UAAM,MAAM,QAAQ,IAAI,GAAG,KAAK,OAAO,OAAO,CAAC,CAAC,GAAG,MAAM;AAAA,EAAK,IAAI,OAAO,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM;AAClI,UAAM,IAAI,SAAS,GAAG,IAAI,QAAQ,KAAK,EAAE;AACzC,UAAM,EAAE,GAAG,GAAG,YAAY,iBAAiB,EAAE,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,KAAK,WAAW,GAAG,CAAC,IAAI,CAAA,GAAI,aAAa,CAAA,GAAI,IAAI,CAAA,EAAC,CAAG;AAAA,EACzJ;AAEA,QAAM,YAAY,CAAC,MAAY;AAC7B,QAAI,EAAE,SAAS,UAAU;AACvB,YAAM,MAAM,SAAS,WAAW,EAAE,MAAM,QAAQ,cAAc,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE;AAC/F,YAAM,IAAI,aAAa,KAAK,OAAO,IAAI,EAAE,KAAK,QAAQ,EAAE,YAAY,QAAQ,QAAA,CAAS;AACrF,UAAI,SAAS,KAAK,GAAG,EAAE,QAAQ;AAC/B,UAAI,eAAe,EAAE;AACrB,UAAI,aAAa,EAAE;AACnB;AAAA,IACF;AACA,UAAM,MAAM,+BAA+B,KAAK,EAAE,KAAK;AACvD,QAAI,KAAK;AAEP,YAAM,OAAO,IAAI,CAAC,EAAG,QAAQ,gBAAgB,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,CAAC;AACxE,YAAM,IAAI,aAAa,MAAM,OAAO,IAAI,EAAE,KAAK,QAAQ,EAAE,aAAa,IAAI,CAAC,EAAG,SAAS,GAAG,QAAQ,SAAS;AAC3G,UAAI,SAAS,KAAK,GAAG,EAAE,QAAQ;AAC/B,UAAI,eAAe,EAAE;AACrB,UAAI,aAAa,EAAE;AACnB;AAAA,IACF;AACA,aAAS,gCAAgC,EAAE,OAAO,EAAE,YAAY,GAAG;AAAA,EACrE;AAGA,QAAM,MAAM,KAAK,MAAM,OAAO,aAAa,KAAK;AAChD,QAAM,UAA8B,CAAA;AACpC,MAAI,WAAW;AACf,QAAM,MAAM;AACZ,WAAS,GAAI,IAAI,IAAI,KAAK,GAAG,KAAM;AACjC,UAAM,MAAM,EAAE,CAAC;AACf,QAAI,EAAE,CAAC,GAAG;AACR,UAAI,IAAI,kBAAkB,uBAAuB,KAAK,IAAI,GAAG,WAAW,CAAC;AACzE;AAAA,IACF;AACA,UAAM,MAAM,QAAQ,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,IAAI;AACpD,QAAI,YAAY,IAAI;AACpB,UAAM,QAAQ,IAAI,YAAA;AAClB,QAAI,UAAU,cAAc,CAAC,IAAI,aAAa;AAC5C;AACA;AAAA,IACF;AACA,UAAM,QAAQ,IAAI;AAClB,UAAM,MAAM,CAAC,MAAc,MAAM,KAAK,CAAC,MAAM,SAAS,EAAE,IAAI,MAAM,CAAC;AAEnE,eAAW,KAAK,OAAO;AACrB,YAAM,IAAI,SAAS,EAAE,IAAI;AACzB,UAAI,MAAM,QAAS,WAAU,CAAC;AAAA,eACrB,SAAS,YAAY,EAAE,KAAK,WAAW,QAAQ,KAAK,EAAE,SAAS,UAAU;AAChF,cAAM,OAAO,EAAE,KAAK,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AACzC,cAAML,KAAI,aAAa,GAAG,IAAI,IAAI,EAAE,KAAK,IAAI,OAAO,IAAI,EAAE,KAAK,QAAQ,EAAE,aAAa,KAAK,SAAS,GAAG,QAAQ,SAAS;AACxH,YAAI,SAAS,KAAK,GAAGA,GAAE,QAAQ;AAC/B,YAAI,eAAeA,GAAE;AACrB,YAAI,aAAaA,GAAE;AAAA,MACrB,WAAW,iCAAiC,KAAK,CAAC,GAAG;AACnD,YAAI,EAAE,SAAS,UAAU;AAEvB,qBAAW,KAAK,sBAAsB,EAAE,OAAO,GAAG,UAAU,EAAG,KAAI,WAAW,KAAK,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,MAAM,IAAI,EAAE,KAAK,IAAI,MAAM,aAAa,SAAS,SAAS,YAAY,EAAE,UAAA,CAAW;AAC9L,gBAAMA,KAAI,iBAAiB,gBAAgB,EAAE,KAAK,GAAG,EAAE,YAAY,KAAK,EAAE;AAC1E,cAAI,SAAS,KAAK,GAAGA,GAAE,QAAQ;AAC/B,cAAI,aAAaA,GAAE;AAAA,QACrB,WAAW,EAAE,SAAS,OAAQ,UAAS,OAAO,EAAE,OAAO,EAAE,YAAY,KAAK,IAAI;AAAA,MAChF,WAAW,gBAAgB,CAAC,KAAK,GAAG,WAAW,IAAI,gBAAgB,CAAC,CAAE,GAAG;AACvE,YAAI,WAAW,KAAK,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,KAAK,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,MAAM,aAAa,SAAS,SAAS,YAAY,gBAAgB,CAAC,EAAA,CAAI;AAAA,MACxJ,WAAW,EAAE,SAAS,YAAY,CAAC,mBAAmB,IAAI,KAAK,KAAK,eAAe,EAAE,KAAK,GAAG;AAC3F,cAAM,aAAa,GAAG,QAAQ,SAAS,EAAE,MAAM,KAAA,GAAQ,CAAC;AACxD,YAAI,SAAS,KAAK,EAAE,GAAG,IAAI,EAAE,UAAU,GAAG,UAAU,SAAS,UAAU,GAAG,OAAO,EAAE,MAAM,KAAA,GAAQ,QAAQ,YAAY,GAAI,aAAa,EAAE,WAAA,IAAe,CAAA,EAAC,CAAI;AAAA,MAC9J;AAAA,IACF;AAEA,QAAI,OAAO;AACX,QAAI,IAAI,SAAS,GAAG,EAAG;AACvB,QAAI,IAAI,SAAS,GAAG,GAAG;AAErB,UAAI,CAAC,QAAQ,IAAI,OAAO,GAAG,CAAC,EAAG;AAC/B,aAAO,OAAO,GAAG;AAAA,IACnB;AACA,UAAM,WAAW,SAAS,KAAK,IAAI,KAAK,CAAC,KAAK,SAAS,GAAG;AAC1D,QAAI,YAAY,WAAW,EAAG;AAC9B,UAAM,OAAO,IAAI,MAAM;AACvB,UAAM,IAAI,YAAY,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,GAAG,GAAI,MAAM,SAAS,WAAW,EAAE,MAAM,KAAK,UAAU,CAAA,GAAK,SAAS,QAAQ,IAAI,MAAM,CAAC,KAAK,SAAS,EAAE;AACrJ,QAAI,EAAE,GAAI,KAAI,GAAG,EAAE,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,KAAK,KAAK;AAC/C,QAAI,EAAE,UAAW,KAAI,WAAW,KAAK,EAAE,SAAS;AAChD,QAAI,EAAE,eAAgB,SAAQ,KAAK,EAAE,cAAc;AAAA,EACrD;AAGA,QAAM,OAAO,+BAA+B,KAAK,IAAI,IAAI,CAAC;AAC1D,MAAI,QAAQ,sBAAsB,KAAK,IAAI,EAAG,KAAI,YAAY,KAAK,EAAE,MAAM,MAAM,MAAM,GAAG;AAC1F,QAAM,UAAU,IAAI,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC1D,MAAI,WAAW,KAAK,GAAG,QAAQ,OAAO,CAAC,MAAM,QAAQ,IAAI,EAAE,UAAW,CAAC,CAAC;AACxE,MAAI,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM;AAClE,MAAI,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM;AACpE,SAAO;AACT;AClRO,MAAM,mBAAmB,CAAC,QAAQ,SAAS,SAAS,SAAS,QAAQ,QAAQ,OAAO,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,GAAG,iBAAiB;AAC/I,MAAM,oBAAoB,CAAC,gBAAgB,QAAQ,SAAS,OAAO,YAAY,QAAQ,SAAS,SAAS,UAAU,UAAU,UAAU,WAAW,oBAAoB,UAAU,QAAQ;AAC/L,MAAM,cAAc;AAGb,SAAS,YAAY,MAAuB;AACjD,MAAI,CAAC,iBAAiB,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,EAAG,QAAO;AAC5D,MAAI,YAAY,KAAK,IAAI,EAAG,QAAO;AACnC,SAAO,CAAC,KAAK,MAAM,GAAG,EAAE,KAAK,CAAC,QAAQ,kBAAkB,SAAS,GAAG,CAAC;AACvE;AAEA,MAAM,SAAS,CAAC,SAAqC;AACnD,QAAM,MAAM,KAAK,MAAM,KAAK,YAAY,GAAG,IAAI,CAAC;AAChD,MAAI,QAAQ,MAAO,QAAO;AAC1B,MAAI,QAAQ,UAAU,QAAQ,OAAQ,QAAO;AAC7C,MAAI,QAAQ,OAAQ,QAAO;AAC3B,MAAI,QAAQ,MAAO,QAAO;AAC1B,MAAI,QAAQ,MAAO,QAAO;AAC1B,MAAI,YAAY,KAAK,GAAG,EAAG,QAAO;AAClC,MAAI,QAAQ,WAAW,QAAQ,SAAS,QAAQ,SAAU,QAAO;AACjE,SAAO;AACT;AAKO,SAAS,UAAU,MAAc,MAAc,IAAoC;AACxF,QAAM,OAAO,OAAO,IAAI;AACxB,MAAI,SAAS,SAAS,SAAS,UAAU,SAAS,QAAQ;AACxD,UAAM,IAAI,aAAa,MAAM,MAAM,IAAI,EAAE,KAAK,QAAQ,IAAI,GAAG;AAC7D,WAAO,YAAY,MAAM,EAAE,MAAM,MAAM,aAAa,EAAE,aAAa,WAAW,EAAE,WAAW,WAAW,GAAG,cAAc,GAAG,iBAAiB,GAAG,UAAU,EAAE,UAAU,YAAY,CAAA,GAAI,aAAa,CAAA,GAAI,UAAU,CAAA,GAAI;AAAA,EACrN;AACA,QAAM,IAAI,SAAS,WAAW,SAAS,SAAS,SAAS,WAAW,WAAW,MAAM,MAAM,MAAM,EAAE,IAAI,SAAS,MAAM,MAAM,EAAE;AAC9H,QAAM,UAAU,OAAO,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAC7D,SAAO,YAAY,MAAM,EAAE,MAAM,MAAM,aAAa,EAAE,aAAa,WAAW,EAAE,WAAW,WAAW,GAAG,cAAc,SAAS,iBAAiB,GAAG,UAAU,EAAE,UAAU,YAAY,EAAE,YAAY,aAAa,EAAE,aAAa,UAAU,EAAE,IAAI;AAClP;AAEA,SAAS,YAAY,MAAc,GAA6B;AAC9D,QAAM,IAAI,oBAAoB,MAAM,EAAE,UAAU,EAAE,UAAU;AAC5D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,EAAE;AAAA,IACZ,YAAY,EAAE;AAAA,IACd,WAAW,EAAE,SAAS;AAAA,IACtB,iBAAiB,EAAE,WAAW;AAAA,IAC9B,GAAI,EAAE,QAAQ,SAAS,EAAE,SAAS,EAAE,QAAA,IAAY,CAAA;AAAA,IAChD,GAAI,EAAE,OAAO,SAAS,EAAE,cAAc,EAAE,WAAW,CAAA;AAAA,EAAC;AAExD;AAEA,MAAM,MAAM,CAACM,MAAa,QAAiB,MAAM,IAAI,KAAK,MAAOA,OAAM,MAAO,GAAI,IAAI,KAAK;AAcpF,SAAS,iBAAiB,OAAmB,IAAoC;AACtF,QAAM,QAAQ,MAAM,aAAa,CAAA;AACjC,QAAM,gCAAgB,IAAA;AACtB,QAAM,UAAU,MAAM,MAAM,IAAI,CAAC,MAAM;AACrC,UAAM,IAAI,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;AACtC,UAAM,MAAM,MAAM,QAAQ,CAAC,GAAG,MAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAA,CAAG;AAClE,QAAI,CAAC,IAAI,OAAQ,QAAO;AACxB,UAAM,IAAI,eAAe,IAAI,IAAI,CAAC,MAAM,MAAM,CAAC,CAAE,GAAG,EAAE,UAAU,EAAE,UAAU;AAC5E,MAAE,KAAK,QAAQ,CAAC,MAAM,UAAU,IAAI,IAAI,CAAC,CAAE,CAAC;AAC5C,QAAI,CAAC,EAAE,QAAQ,OAAQ,QAAO;AAC9B,UAAM,UAAU,CAAC,GAAI,EAAE,WAAW,CAAA,GAAK,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM;AAC1G,WAAO,EAAE,GAAG,GAAG,UAAU,EAAE,UAAU,YAAY,EAAE,YAAY,WAAW,EAAE,SAAS,QAAQ,iBAAiB,EAAE,WAAW,QAAQ,QAAA;AAAA,EACrI,CAAC;AACD,QAAM,eAAe,QAAQ,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA,GAAI,IAAI,CAAC,OAAuC,EAAE,MAAM,EAAE,MAAM,GAAG,EAAA,EAAI,CAAC;AAClI,QAAM,iBAAiB,MAAM,OAAO,CAAC,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;AAChE,QAAM,QAAsB,QAAQ,IAAI,CAAC,EAAE,aAAa,IAAI,UAAU,IAAI,GAAG,EAAA,MAAQ,CAAC;AACtF,QAAM,aAA8D,CAAA;AACpE,QAAM,4BAAY,IAAA;AAClB,QAAM,aAAwC,EAAE,IAAI,IAAI,SAAS,CAAA,GAAI,QAAQ,CAAA,GAAI,WAAW,GAAC;AAC7F,MAAI,cAAc;AAClB,MAAI,YAAY;AAChB,MAAI,YAAY;AAChB,MAAI,cAAc;AAClB,MAAI,cAAc;AAElB,aAAW,KAAK,SAAS;AACvB,mBAAe,EAAE;AACjB,iBAAa,EAAE;AACf,iBAAa,EAAE;AACf,mBAAe,EAAE;AACjB,mBAAe,EAAE,eAAe,EAAE;AAClC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,EAAE,QAAQ,EAAG,YAAW,GAAG,CAAC,KAAK,WAAW,GAAG,CAAC,KAAK,KAAK;AAC9F,eAAW,KAAK,EAAE,UAAU;AAC1B,YAAM,IAAK,WAAW,EAAE,QAAQ,MAAM,EAAE,WAAW,GAAG,OAAO,GAAG,WAAW,EAAA;AAC3E,QAAE;AACF,UAAI,EAAE,WAAY,GAAE;AACpB,UAAI,EAAE,YAAY,UAAU,QAAS,GAAE;AACvC,YAAM,MAAM,GAAG,EAAE,QAAQ,IAAI,EAAE,MAAM,YAAA,CAAa,IAAI,EAAE,YAAY,SAAS,EAAE;AAC/E,YAAM,KAAK,MAAM,IAAI,GAAG,KAAK,EAAE,UAAU,EAAE,UAAU,OAAO,EAAE,OAAO,OAAO,GAAG,OAAO,GAAG,SAAS,oBAAI,IAAA,GAAe,GAAI,EAAE,aAAa,EAAE,YAAY,EAAE,WAAA,IAAe,CAAA,EAAC;AACxK,SAAG;AACH,SAAG,QAAQ,IAAI,EAAE,IAAI;AACrB,YAAM,IAAI,KAAK,EAAE;AAAA,IACnB;AACA,eAAW,QAAQ,EAAE,YAAY;AAC/B,UAAI,KAAK,SAAS,SAAU,YAAW,OAAO,KAAK,IAAI,KAAK,WAAW,OAAO,KAAK,IAAI,KAAK,KAAK;AAAA,eACxF,KAAK,SAAS,WAAW;AAChC,cAAM,MAAO,WAAW,QAAQ,KAAK,OAAO,MAAM,EAAE,WAAW,GAAG,YAAY,GAAC;AAC/E,YAAI;AACJ,YAAI,WAAW,KAAK,IAAI,KAAK,IAAI,WAAW,KAAK,IAAI,KAAK,KAAK;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAEA,aAAW,KAAK,SAAS;AACvB,eAAW,KAAK,EAAE,aAAa;AAC7B,UAAI,CAAC,GAAG,WAAW,IAAI,EAAE,IAAI,EAAG;AAChC,YAAM,YAAY,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,WAAW,OAAO,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,YAAY,wBAAwB,EAAE,KAAK,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;AACrL,iBAAW,UAAU,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,WAAW;AAAA,IACnF;AAAA,EACF;AACA,QAAM,WAAW,MACd,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,kBAAkB,CAAC,EACjD,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAClH,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,EAAE,WAAW,iBAAiB,EAAE,iBAAiB,aAAa,EAAE,aAAa,cAAc,EAAE,aAAA,EAAe;AACtJ,QAAM,WAAW,CAAC,GAAG,MAAM,OAAA,CAAQ,EAChC,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,cAAc,MAAM,EAAE,YAAY,cAAc,EAAE,EACrG,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,EAAE,SAAS,GAAG,EAAA,OAAS,EAAE,GAAG,GAAG,OAAO,QAAQ,OAAO;AAC7D,SAAO;AAAA,IACL,SAAS;AAAA,IACT,eAAe;AAAA,IACf,MAAM,EAAE,MAAM,UAAU,SAAS,MAAM,WAAW,QAAA;AAAA,IAClD,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAA,IAAU,CAAA;AAAA,IAC3C,aAAa,MAAM,gBAAe,oBAAI,KAAA,GAAO,YAAA;AAAA,IAC7C,QAAQ,EAAE,MAAM,MAAM,QAAQ,OAAO,MAAM,QAAQ,SAAS,MAAM,WAAW,EAAA;AAAA,IAC7E,cAAc,EAAE,UAAU,GAAG,UAAU,YAAY,GAAG,WAAW,MAAM,QAAQ,GAAG,YAAY,OAAO,GAAG,MAAA;AAAA,IACxG,SAAS,EAAE,eAAe,IAAI,aAAa,cAAc,SAAS,GAAG,mBAAmB,IAAI,aAAa,WAAW,GAAG,aAAa,WAAW,WAAW,sBAAsB,aAAa,sBAAsB,YAAA;AAAA,IACnN,YAAY,OAAO,YAAY,mBAAmB,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAE,CAAC,CAAC;AAAA,IAC9G,YAAY,EAAE,GAAG,YAAY,WAAW,WAAW,UAAU,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAAA;AAAA,IACrI;AAAA,IACA;AAAA,IACA,OAAO,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,IACxD,GAAI,aAAa,UAAU,eAAe,SACtC;AAAA,MACE,SAAS;AAAA,QACP,OAAO,aAAa;AAAA,QACpB,SAAS,aAAa,OAAO,CAAC,MAAM,EAAE,QAAQ,SAAS,EAAE;AAAA,QACzD,WAAW,aAAa,OAAO,CAAC,MAAM,EAAE,QAAQ,WAAW,EAAE;AAAA,QAC7D,OAAO;AAAA,QACP;AAAA,MAAA;AAAA,IACF,IAEF,CAAA;AAAA,IACJ,SAAS,CAAA;AAAA,EAAC;AAEd;AAEA,MAAM,QAAQ,CAAC,GAAkB,MAAsB,MAAM,QAAQ,MAAM,OAAO,OAAO,KAAK,OAAO,IAAI,KAAK,EAAE,IAAI;AAE7G,SAAS,aAAa,GAA8B;AACzD,SAAO;AAAA,IACL,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAA,IAAU,CAAA;AAAA,IACnC,aAAa,EAAE;AAAA,IACf,eAAe,EAAE,QAAQ;AAAA,IACzB,mBAAmB,EAAE,QAAQ;AAAA,IAC7B,WAAW,EAAE,QAAQ;AAAA,IACrB,sBAAsB,EAAE,QAAQ;AAAA,IAChC,sBAAsB,EAAE,QAAQ;AAAA,EAAA;AAEpC;AAGO,SAAS,oBAAoB,QAAqB,UAAoC;AAC3F,MAAI,SAAS,kBAAkB,qBAAsB,OAAM,IAAI,MAAM,0BAA0B,OAAO,SAAS,aAAa,CAAC,+BAA+B,oBAAoB,GAAG;AACnL,QAAM,SAAS,IAAI,IAAI,SAAS,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;AAC3F,QAAM,QAAQ,IAAI,IAAI,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;AACxF,QAAM,aAAyC,CAAA;AAC/C,aAAW,KAAK,oBAAoB;AAClC,UAAM,IAAI,SAAS,WAAW,CAAC,GAAG,aAAa;AAC/C,UAAM,IAAI,OAAO,WAAW,CAAC,GAAG,aAAa;AAC7C,QAAI,KAAK,EAAG,YAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,IAAI,EAAA;AAAA,EAChE;AACA,QAAM,WAAqC,CAAA;AAC3C,QAAM,YAAuC,CAAA;AAC7C,aAAW,CAAC,MAAM,CAAC,KAAK,OAAO;AAC7B,UAAM,IAAI,OAAO,IAAI,IAAI;AACzB,QAAI,MAAM,OAAW;AACrB,QAAI,IAAI,EAAG,UAAS,KAAK,EAAE,MAAM,QAAQ,GAAG,OAAO,GAAG;AAAA,aAC7C,IAAI,EAAG,WAAU,KAAK,EAAE,MAAM,QAAQ,GAAG,OAAO,GAAG;AAAA,EAC9D;AACA,QAAM,OAAqB;AAAA,IACzB,GAAI,SAAS,QAAQ,EAAE,OAAO,SAAS,MAAA,IAAU,CAAA;AAAA,IACjD,aAAa,SAAS;AAAA,IACtB,eAAe,EAAE,QAAQ,SAAS,QAAQ,eAAe,OAAO,OAAO,QAAQ,eAAe,OAAO,MAAM,SAAS,QAAQ,eAAe,OAAO,QAAQ,aAAa,EAAA;AAAA,IACvK,mBAAmB,EAAE,QAAQ,SAAS,QAAQ,mBAAmB,OAAO,OAAO,QAAQ,mBAAmB,OAAO,MAAM,SAAS,QAAQ,mBAAmB,OAAO,QAAQ,iBAAiB,EAAA;AAAA,IAC3L,WAAW,EAAE,QAAQ,SAAS,QAAQ,WAAW,OAAO,OAAO,QAAQ,WAAW,OAAO,OAAO,QAAQ,YAAY,SAAS,QAAQ,UAAA;AAAA,IACrI;AAAA,IACA,UAAU,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM;AAAA,IAC3E,WAAW,UAAU,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO;AAAA,IAC7E,UAAU,CAAC,GAAG,MAAM,KAAA,CAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,KAAA;AAAA,IAC1D,cAAc,CAAC,GAAG,OAAO,KAAA,CAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,KAAA;AAAA,EAAK;AAErE,SAAO,EAAE,GAAG,QAAQ,UAAU,MAAM,SAAS,CAAC,GAAI,SAAS,WAAW,CAAA,GAAK,aAAa,QAAQ,CAAC,EAAA;AACnG;AAEA,MAAM,SAAS,CAAC,MAAsB,MAAM,OAAO,QAAQ,GAAG,CAAC;AAC/D,MAAM,WAAW,CAAC,MAAsB,MAAM,OAAO,KAAK,KAAK,IAAI,IAAI,MAAM,EAAE,GAAG,CAAC;AACnF,MAAM,MAAM,CAAC,MAAc,EAAE,QAAQ,OAAO,KAAK,EAAE,QAAQ,MAAM,GAAG;AAG7D,SAAS,cAAc,GAAgB,OAAmE,IAAY;AAC3H,QAAM,IAAI,EAAE;AACZ,QAAM,IAAI,EAAE;AACZ,QAAM,QAAQ;AAAA,IACZ,4BAA4B,EAAE,QAAQ,KAAK,EAAE,KAAK,KAAK,EAAE;AAAA,IACzD;AAAA,IACA,WAAW,EAAE,OAAO,KAAK,eAAe,EAAE,OAAO,IAAI,cAAc,EAAE,aAAa,MAAM,eAAe,EAAE,aAAa,UAAU,gBAAgB,EAAE,aAAa,SAAS,KAAK,IAAI,KAAK,0BAA0B;AAAA,IAChN;AAAA,IACA;AAAA,IACA;AAAA,IACA,wBAAwB,OAAO,EAAE,aAAa,CAAC,KAAK,SAAS,GAAG,cAAc,SAAS,IAAI,CAAC;AAAA,IAC5F,4BAA4B,OAAO,EAAE,iBAAiB,CAAC,KAAK,SAAS,GAAG,kBAAkB,SAAS,IAAI,CAAC;AAAA,IACxG,wBAAwB,EAAE,WAAW;AAAA,IACrC,wBAAwB,EAAE,SAAS,GAAG,IAAI,KAAK,EAAE,UAAU,QAAQ,IAAI,MAAM,EAAE,GAAG,EAAE,UAAU,KAAK,MAAM,EAAE;AAAA,IAC3G,8BAA8B,EAAE,SAAS;AAAA,IACzC,8BAA8B,EAAE,oBAAoB,OAAO,EAAE,oBAAoB;AAAA,IACjF;AAAA,EAAA;AAEF,QAAM,OAAO,mBAAmB,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC7D,MAAI,KAAK,QAAQ;AACf,UAAM,KAAK,oCAAoC,IAAI,sDAAsD,8BAA8B;AACvI,eAAW,KAAK,MAAM;AACpB,YAAM,IAAI,EAAE,WAAW,CAAC;AACxB,YAAM,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,EAAE,SAAS,IAAI;AAAA,IACtE;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AACA,QAAM,UAAU,OAAO,QAAQ,EAAE,WAAW,OAAO,EAAE,KAAK,CAAC,GAAGJ,OAAMA,GAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS;AACnG,QAAM,SAAS,OAAO,QAAQ,EAAE,WAAW,MAAM,EAAE,KAAK,CAAC,GAAGA,OAAMA,GAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7E,MAAI,QAAQ,UAAU,OAAO,UAAU,EAAE,WAAW,UAAU,QAAQ;AACpE,UAAM,KAAK,kBAAkB,EAAE;AAC/B,eAAW,CAAC,KAAK,CAAC,KAAK,SAAS;AAC9B,YAAM,MAAM,OAAO,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,GAAGA,OAAMA,GAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI;AACvH,YAAM,KAAK,OAAO,GAAG,OAAO,EAAE,SAAS,eAAe,GAAG,GAAG;AAAA,IAC9D;AACA,QAAI,OAAO,OAAQ,OAAM,KAAK,0BAA0B,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAC1G,QAAI,EAAE,WAAW,UAAU,OAAQ,OAAM,KAAK,mCAAmC,EAAE,WAAW,UAAU,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE;AAClK,UAAM,SAAS,OAAO,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,GAAGA,OAAMA,GAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACzE,QAAI,OAAO,OAAQ,OAAM,KAAK,6BAA6B,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAC3G,UAAM,KAAK,EAAE;AAAA,EACf;AACA,QAAM,QAAQ,EAAE,SAAS,MAAM,GAAG,KAAK,YAAY,EAAE;AACrD,MAAI,MAAM,QAAQ;AAChB,UAAM,KAAK,4BAA4B,IAAI,yDAAyD,8BAA8B;AAClI,eAAW,KAAK,MAAO,OAAM,KAAK,OAAO,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,eAAe,MAAM,EAAE,WAAW,IAAI;AACrH,UAAM,KAAK,EAAE;AAAA,EACf;AACA,QAAM,QAAQ,EAAE,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,KAAK,YAAY,EAAE;AACjF,MAAI,MAAM,QAAQ;AAChB,UAAM,KAAK,iBAAiB,IAAI,wCAAwC,4BAA4B;AACpG,eAAW,KAAK,MAAO,OAAM,KAAK,OAAO,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,aAAa,EAAE,WAAY,MAAM,OAAO,IAAI,EAAE,WAAY,KAAK,CAAC,GAAG,EAAE,WAAY,OAAO,KAAK,EAAE,WAAY,IAAI,MAAM,EAAE,MAAM,EAAE,WAAY,KAAK,MAAM,EAAE,KAAK,IAAI;AACvO,UAAM,KAAK,EAAE;AAAA,EACf;AACA,QAAM,KAAK,EAAE;AACb,MAAI,OAAO,GAAG,SAAS,GAAG,eAAe,SAAS;AAChD,UAAM,KAAK,0BAA0B,IAAI,GAAG,GAAG,KAAK,oCAAoC,GAAG,OAAO,mDAAmD,GAAG,SAAS,sBAAsB,EAAE;AACzL,UAAM,QAAQ,GAAG,MAAM,MAAM,GAAG,KAAK,WAAW,EAAE;AAClD,QAAI,MAAM,QAAQ;AAChB,YAAM,KAAK,6BAA6B,qBAAqB;AAC7D,iBAAW,KAAK,MAAO,OAAM,KAAK,OAAO,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,UAAU,IAAI,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,KAAK;AACvH,UAAI,GAAG,MAAM,SAAS,MAAM,OAAQ,OAAM,KAAK,WAAW,GAAG,MAAM,SAAS,MAAM,MAAM,WAAW;AACnG,YAAM,KAAK,EAAE;AAAA,IACf;AACA,QAAI,GAAG,eAAe,QAAQ;AAC5B,YAAM,KAAK,gEAAgE,GAAG,eAAe,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,OAAO,IAAI,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA,IAC7L;AAAA,EACF;AACA,MAAI,GAAG;AACL,UAAM,KAAK,sBAAsB,EAAE,SAAS,EAAE,WAAW,IAAI,EAAE;AAC/D,UAAM,KAAK,KAAK,EAAE,SAAS,MAAM,oBAAoB,EAAE,UAAU,MAAM,eAAe,EAAE,SAAS,MAAM,SAAS,EAAE,aAAa,MAAM,WAAW;AAChJ,eAAW,KAAK,EAAE,UAAU,MAAM,GAAG,CAAC,SAAS,KAAK,kBAAkB,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,OAAO,EAAE,KAAK,EAAE;AAC/G,UAAM,KAAK,EAAE;AAAA,EACf;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAWO,SAAS,aAAa,MAAc,MAA+B,IAAgE;AACxI,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,OAAO,YAAY,MAAM,IAAI;AACnC,QAAM,QAAyD,CAAA;AAC/D,aAAW,KAAK,KAAK,OAAO;AAC1B,UAAM,WAAW,EAAE,SAAS,YAAA;AAE5B,eAAW,KAAK,EAAE,KAAK,MAAoB;AACzC,YAAM,IAAI,GAAG,QAAQ,EAAE,UAAU,EAAE,MAAM,QAAQ;AACjD,UAAI,CAAC,UAAU,GAAG,CAAC,EAAG;AACtB,YAAM,QAAQ,EAAE,aAAa,EAAE;AAC/B,YAAM,KAAK,EAAE,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,QAAQ,EAAE,KAAK,QAAQ,MAAM,EAAE,MAAM,IAAI,OAAO,EAAG,MAAM,KAAK,OAAO,EAAG,MAAA,CAAO;AAAA,IACxH;AAAA,EACF;AACA,MAAI,SAAS;AACb,aAAW,KAAK,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAG,UAAS,OAAO,MAAM,GAAG,EAAE,KAAK,IAAI,EAAE,KAAK,OAAO,MAAM,EAAE,GAAG;AAC3H,SAAO,EAAE,OAAO,MAAM,IAAI,CAAC,EAAE,OAAO,IAAI,KAAK,IAAI,GAAG,EAAA,MAAQ,CAAC,GAAG,OAAA;AAClE;"}
|