framer-export 4.4.2 → 4.4.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../package.json","../../src/cli/theme.ts","../../src/cli/banner.ts","../../src/cli/cooking.ts","../../src/cli/box.ts","../../src/cli/select.ts","../../src/assets/asset-map.ts","../../src/config/index.ts","../../src/network/download.ts","../../src/logger/index.ts","../../src/platforms/framer.ts","../../src/platforms/webflow.ts","../../src/platforms/wix.ts","../../src/platforms/detect.ts","../../src/platforms/index.ts","../../src/exporter/capture.ts","../../src/network/pool.ts","../../src/exporter/download.ts","../../src/formatter/prettify.ts","../../src/server/template.ts","../../src/exporter/output.ts","../../src/exporter/summary.ts","../../src/ai/prompt-assistant.ts","../../src/exporter/index.ts","../../src/cli/setup.ts","../../src/cli/index.ts","../../src/cli/help.ts","../../src/cli/update-check.ts"],"sourcesContent":["{\n \"name\": \"framer-export\",\n \"version\": \"4.4.2\",\n \"description\": \"Export any Framer, Webflow, or Wix site into a fully working local mirror. Downloads all assets, strips badges, rewrites URLs, and pretty-prints JS.\",\n \"type\": \"module\",\n \"main\": \"dist/cli/index.js\",\n \"types\": \"dist/cli/index.d.ts\",\n \"bin\": {\n \"framer-export\": \"./bin/framer-export.js\",\n \"fexport\": \"./bin/fexport.js\",\n \"framerexport\": \"./bin/framerexport.js\"\n },\n \"files\": [\n \"dist/\",\n \"bin/\",\n \"LICENSE\",\n \"README.md\"\n ],\n \"scripts\": {\n \"start\": \"tsx src/cli/index.ts\",\n \"dev\": \"tsx src/cli/index.ts\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"prepublishOnly\": \"npm run build\",\n \"prepack\": \"npm run build\"\n },\n \"keywords\": [\n \"framer\",\n \"webflow\",\n \"wix\",\n \"exporter\",\n \"export\",\n \"scraper\",\n \"mirror\",\n \"site-downloader\",\n \"site-export\",\n \"cli\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/danbenba/FramerExport.git\"\n },\n \"homepage\": \"https://github.com/danbenba/FramerExport#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/danbenba/FramerExport/issues\"\n },\n \"license\": \"MIT\",\n \"author\": \"Dany (danbenba)\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.3.0\",\n \"ora\": \"^8.0.0\",\n \"prettier\": \"^3.2.0\",\n \"puppeteer\": \"^22.0.0\",\n \"readline-promise\": \"^1.0.5\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.4.0\"\n }\n}\n","import chalk from 'chalk';\n\nexport const THEME = {\n background: '#0A0A0A',\n panel: '#141414',\n element: '#1E1E1E',\n border: '#484848',\n borderActive: '#606060',\n text: '#EEEEEE',\n muted: '#808080',\n primary: '#FAB283',\n primarySoft: '#FFC09F',\n secondary: '#5C9CF5',\n accent: '#9D7CD8',\n success: '#7FD88F',\n warning: '#F5A742',\n error: '#E06C75',\n info: '#56B6C2',\n};\n\nexport const ui = {\n text: chalk.hex(THEME.text),\n muted: chalk.hex(THEME.muted),\n primary: chalk.hex(THEME.primary),\n primarySoft: chalk.hex(THEME.primarySoft),\n secondary: chalk.hex(THEME.secondary),\n accent: chalk.hex(THEME.accent),\n success: chalk.hex(THEME.success),\n warning: chalk.hex(THEME.warning),\n error: chalk.hex(THEME.error),\n info: chalk.hex(THEME.info),\n border: chalk.hex(THEME.border),\n borderActive: chalk.hex(THEME.borderActive),\n panel: chalk.hex(THEME.panel),\n};\n\nexport function stripAnsi(s: string): string {\n return s.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\nexport function softGradient(text: string): string {\n const colors = [THEME.primary, THEME.primarySoft, THEME.text, THEME.primarySoft, THEME.primary];\n let cursor = 0;\n return text\n .split('')\n .map((char) => {\n if (char === ' ') return char;\n const color = colors[cursor % colors.length];\n cursor++;\n return chalk.hex(color).bold(char);\n })\n .join('');\n}\n\nexport function chip(label: string): string {\n return `${ui.border('[')}${ui.primary(label)}${ui.border(']')}`;\n}\n\nexport function bullet(label: string = '•'): string {\n return ui.primary(label);\n}\n\nexport function centerText(text: string, width: number): string {\n const visible = stripAnsi(text).length;\n if (visible >= width) return text;\n const left = Math.floor((width - visible) / 2);\n return ' '.repeat(left) + text + ' '.repeat(width - visible - left);\n}\n\nexport function truncatePlain(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, Math.max(0, max - 2)) + '..';\n}\n","import pkg from '../../package.json';\nimport { chip, softGradient, ui } from './theme.js';\n\nfunction getWidth(): number {\n return process.stdout.columns || 80;\n}\n\nconst ASCII_ART = [\n '███████╗██████╗ █████╗ ███╗ ███╗███████╗██████╗ ',\n '██╔════╝██╔══██╗██╔══██╗████╗ ████║██╔════╝██╔══██╗',\n '█████╗ ██████╔╝███████║██╔████╔██║█████╗ ██████╔╝',\n '██╔══╝ ██╔══██╗██╔══██║██║╚██╔╝██║██╔══╝ ██╔══██╗',\n '██║ ██║ ██║██║ ██║██║ ╚═╝ ██║███████╗██║ ██║',\n '╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝',\n '███████╗██╗ ██╗██████╗ ██████╗ ██████╗ ████████╗',\n '██╔════╝╚██╗██╔╝██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝',\n '█████╗ ╚███╔╝ ██████╔╝██║ ██║██████╔╝ ██║ ',\n '██╔══╝ ██╔██╗ ██╔═══╝ ██║ ██║██╔══██╗ ██║ ',\n '███████╗██╔╝ ██╗██║ ╚██████╔╝██║ ██║ ██║ ',\n '╚══════╝╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ',\n];\n\nexport function showBanner(): void {\n const width = getWidth();\n const isSmall = width < 65;\n\n if (isSmall) {\n console.log(\n `\\n ${ui.primary.bold('f-export')} ${ui.muted(`v${pkg.version}`)} ${chip('beta ui')}`\n );\n console.log(` ${ui.text.bold('Framer Export')} ${ui.muted('for Framer, Webflow, and Wix')}\\n`);\n return;\n }\n\n console.log('');\n ASCII_ART.forEach((line) => {\n console.log(' ' + softGradient(line));\n });\n console.log('');\n console.log(\n ` ${ui.muted(`v${pkg.version}`)} ${ui.text.bold('Framer Export')} ${chip('fexport')} ${ui.muted('local mirror exporter')}`\n );\n console.log(\n ` ${ui.muted('Framer')} ${ui.border('/')} ${ui.muted('Webflow')} ${ui.border('/')} ${ui.muted('Wix')} ${ui.border('·')} ${ui.primary('clean assets')} ${ui.border('·')} ${ui.secondary('local serve')}\\n`\n );\n}\n","import chalk from 'chalk';\nimport { ui } from './theme.js';\n\nconst SHINE_WIDTH = 14;\nconst FRAME_INTERVAL = 70;\nconst INTRO_DURATION = 1400;\nconst SHINE_SPEED = 0.55;\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport async function showLoadingIntro(version: string): Promise<void> {\n if (!process.stdout.isTTY || process.env.CI) return;\n\n await new Promise<void>((resolve) => {\n let frame = 0;\n\n const draw = (): void => {\n const spinner = SPINNER_FRAMES[frame % SPINNER_FRAMES.length];\n const title = renderShinyText(`Framer Export v${version}`, frame, {\n baseColor: '#969696',\n shineColor: '#ffffff',\n shineWidth: 18,\n });\n const dots = '.'.repeat(frame % 4).padEnd(3, ' ');\n process.stdout.write(\n `\\r\\x1B[2K ${ui.primary(spinner)} ${title} ${ui.muted(`Loading${dots}`)}`\n );\n frame++;\n };\n\n process.stdout.write('\\x1B[?25l');\n draw();\n const interval = setInterval(draw, FRAME_INTERVAL);\n setTimeout(() => {\n clearInterval(interval);\n process.stdout.write('\\r\\x1B[2K\\x1B[?25h');\n resolve();\n }, INTRO_DURATION);\n });\n}\n\nexport class CookingSpinner {\n private interval: NodeJS.Timeout | null = null;\n private frame = 0;\n private phase = '';\n private active = false;\n\n start(phase: string = ''): void {\n this.phase = phase;\n this.frame = 0;\n this.active = true;\n this.draw();\n this.interval = setInterval(() => {\n this.frame++;\n this.draw();\n }, FRAME_INTERVAL);\n }\n\n update(phase: string): void {\n this.phase = phase;\n }\n\n log(message: string): void {\n if (this.active) {\n process.stdout.write('\\r\\x1B[2K');\n }\n process.stdout.write(message + '\\n');\n if (this.active) {\n this.draw();\n }\n }\n\n stop(): void {\n this.active = false;\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n process.stdout.write('\\r\\x1B[2K');\n }\n\n private draw(): void {\n if (!this.active) return;\n\n const spinner = SPINNER_FRAMES[this.frame % SPINNER_FRAMES.length];\n const shimmer = renderShinyText('Exporting', this.frame);\n const frameStr = ui.primary(spinner);\n const phaseStr = this.phase ? ` ${ui.muted(this.limitLen(this.phase, 52))}` : '';\n\n process.stdout.write(`\\r\\x1B[2K ${frameStr} ${shimmer}${phaseStr}`);\n }\n\n private limitLen(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 1) + '…';\n }\n}\n\nfunction renderShinyText(\n text: string,\n frame: number,\n options: { baseColor?: string; shineColor?: string; shineWidth?: number } = {}\n): string {\n const baseColor = options.baseColor || '#808080';\n const shineColor = options.shineColor || '#ffffff';\n const shineWidth = options.shineWidth || SHINE_WIDTH;\n const travel = text.length + shineWidth * 2;\n const pos = ((frame * SHINE_SPEED) % travel) - shineWidth;\n const base = hexToRgb(baseColor);\n const shine = hexToRgb(shineColor);\n\n let result = '';\n for (let i = 0; i < text.length; i++) {\n const dist = Math.abs(i - pos);\n const intensity = smoothstep(0, 1, 1 - Math.min(1, dist / shineWidth));\n const color = mixRgb(base, shine, intensity);\n const paint =\n intensity > 0.82\n ? chalk.rgb(color.r, color.g, color.b).bold\n : chalk.rgb(color.r, color.g, color.b);\n result += paint(text[i]);\n }\n return result;\n}\n\nfunction smoothstep(edge0: number, edge1: number, value: number): number {\n const t = Math.max(0, Math.min(1, (value - edge0) / (edge1 - edge0)));\n return t * t * (3 - 2 * t);\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n const clean = hex.replace('#', '');\n const normalized =\n clean.length === 3\n ? clean\n .split('')\n .map((char) => char + char)\n .join('')\n : clean.padEnd(6, '0').slice(0, 6);\n\n return {\n r: Number.parseInt(normalized.slice(0, 2), 16),\n g: Number.parseInt(normalized.slice(2, 4), 16),\n b: Number.parseInt(normalized.slice(4, 6), 16),\n };\n}\n\nfunction mixRgb(\n from: { r: number; g: number; b: number },\n to: { r: number; g: number; b: number },\n amount: number\n): { r: number; g: number; b: number } {\n return {\n r: Math.round(from.r + (to.r - from.r) * amount),\n g: Math.round(from.g + (to.g - from.g) * amount),\n b: Math.round(from.b + (to.b - from.b) * amount),\n };\n}\n","import chalk from 'chalk';\nimport { stripAnsi, ui } from './theme.js';\n\nexport function maxWidth(): number {\n return Math.min(process.stdout.columns || 80, 76);\n}\n\nfunction padRight(text: string, w: number): string {\n const visible = stripAnsi(text).length;\n if (visible >= w) return text;\n return text + ' '.repeat(w - visible);\n}\n\nexport function boxTop(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('╭─') + ui.border('─'.repeat(inner)) + ui.border('─╮');\n}\n\nexport function panelTop(w: number): string {\n const inner = w - 4;\n return ui.border('╭─') + ui.border('─'.repeat(inner)) + ui.border('─╮');\n}\n\nexport function boxBot(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('╰─') + ui.border('─'.repeat(inner)) + ui.border('─╯');\n}\n\nexport function panelBot(w: number): string {\n const inner = w - 4;\n return ui.border('╰─') + ui.border('─'.repeat(inner)) + ui.border('─╯');\n}\n\nexport function boxLine(w: number, text: string): string {\n const inner = w - 4;\n const padded = padRight(text, inner);\n return ' ' + ui.border('│ ') + padded + ui.border(' │');\n}\n\nexport function panelLine(w: number, text: string): string {\n const inner = w - 4;\n const padded = padRight(text, inner);\n return ui.border('│ ') + padded + ui.border(' │');\n}\n\nexport function boxSep(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('├─') + ui.border('─'.repeat(inner)) + ui.border('─┤');\n}\n\nexport function panelSep(w: number): string {\n const inner = w - 4;\n return ui.border('├─') + ui.border('─'.repeat(inner)) + ui.border('─┤');\n}\n\nexport function boxRow(w: number, label: string, value: string): string {\n const inner = w - 4;\n const labelPlain = stripAnsi(chalk.bold(label));\n const visible = labelPlain.length + 1 + value.length;\n if (visible > inner) {\n const avail = inner - labelPlain.length - 2;\n const truncated = value.length > avail ? value.slice(0, avail - 1) + '..' : value;\n return (\n ' ' +\n ui.border('│ ') +\n chalk.bold(label) +\n ': ' +\n ui.primary(truncated) +\n ' '.repeat(Math.max(0, inner - labelPlain.length - 1 - truncated.length)) +\n ui.border(' │')\n );\n }\n const right = inner - labelPlain.length - 1 - value.length;\n return (\n ' ' +\n ui.border('│ ') +\n chalk.bold(label) +\n ': ' +\n ui.primary(value) +\n ' '.repeat(right) +\n ui.border(' │')\n );\n}\n","import readline from 'node:readline';\nimport { stdin, stdout } from 'node:process';\nimport { maxWidth, panelBot, panelLine, panelSep, panelTop } from './box.js';\nimport { centerText, stripAnsi, truncatePlain, ui } from './theme.js';\n\nexport interface SelectOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface SelectAction {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface SelectConfig {\n headerLines?: string[];\n actions?: SelectAction[];\n footer?: string;\n}\n\nlet pipedLinesPromise: Promise<string[]> | null = null;\nlet pipedLineIndex = 0;\n\nexport async function select(\n question: string,\n options: SelectOption[],\n defaultIndex: number = 0,\n config: SelectConfig = {}\n): Promise<string> {\n const isTTY = stdin.isTTY && stdout.isTTY;\n\n if (!isTTY) {\n return fallbackPrompt(question, options, defaultIndex, config);\n }\n\n return arrowSelect(question, options, defaultIndex, config);\n}\n\nexport async function promptInput(\n question: string,\n defaultValue: string = '',\n config: Omit<SelectConfig, 'actions'> = {}\n): Promise<string> {\n if (!stdin.isTTY || !stdout.isTTY) {\n return fallbackInput(question, defaultValue);\n }\n\n return fullscreenInput(question, defaultValue, config);\n}\n\nasync function arrowSelect(\n question: string,\n options: SelectOption[],\n defaultIndex: number,\n config: SelectConfig\n): Promise<string> {\n const actions = config.actions ?? [];\n const headerLines = config.headerLines ?? [];\n const width = Math.max(44, Math.min(maxWidth(), 72));\n const inner = width - 4;\n const actionLineOffset = 2 + headerLines.length;\n const hasActions = actions.length > 0;\n const optionStartOffset = 3 + headerLines.length + (hasActions ? 1 : 0);\n const lineCount = options.length + 4 + headerLines.length + (hasActions ? 1 : 0);\n const rows = process.stdout.rows || 24;\n const columns = process.stdout.columns || 80;\n const panelTopRow = Math.max(2, Math.floor((rows - lineCount) / 2) + 1);\n const panelLeftCol = Math.max(1, Math.floor((columns - width) / 2) + 1);\n const footerRow = Math.min(rows, panelTopRow + lineCount + 1);\n\n return new Promise((resolve) => {\n const firstEnabled: number = options.findIndex((option) => !option.disabled);\n let selected: number = options[defaultIndex]?.disabled ? firstEnabled : defaultIndex;\n let selectedAction: number | null = null;\n if (selected < 0) selected = 0;\n\n const move = (direction: -1 | 1): void => {\n let next = selected + direction;\n while (next >= 0 && next < options.length) {\n if (!options[next].disabled) {\n selected = next;\n return;\n }\n next += direction;\n }\n };\n\n const render = (initial: boolean = false): void => {\n if (!initial) {\n stdout.write('\\x1B[2J');\n }\n const lines: string[] = [];\n lines.push(panelTop(width));\n lines.push(\n panelLine(width, centerText(`${ui.primary('●')} ${ui.text.bold(question)}`, inner))\n );\n for (const header of headerLines) {\n lines.push(panelLine(width, centerText(ui.muted(header), inner)));\n }\n if (hasActions) {\n lines.push(\n panelLine(width, centerText(renderActions(actions, selectedAction, inner), inner))\n );\n }\n lines.push(panelSep(width));\n for (let i = 0; i < options.length; i++) {\n lines.push(\n panelLine(\n width,\n centerText(\n renderOption(options[i], selectedAction === null && i === selected, inner),\n inner\n )\n )\n );\n }\n lines.push(panelBot(width));\n\n lines.forEach((line, index) => writeAt(panelTopRow + index, panelLeftCol, line));\n writeAt(\n footerRow,\n panelLeftCol,\n centerText(\n ui.muted(config.footer || '↑↓ move · enter select · mouse hover/click · esc close'),\n width\n )\n );\n };\n\n const choose = (value: string = options[selected].value): void => {\n cleanup();\n console.log(\n ` ${ui.success('✓')} ${ui.text.bold(question)} ${ui.primary(labelForValue(value, options, actions))}\\n`\n );\n\n resolve(value);\n };\n\n const onMouseData = (chunk: Buffer): void => {\n const mouse = parseMouseEvent(chunk);\n if (!mouse) return;\n\n if (mouse.kind === 'wheel-up') {\n move(-1);\n render();\n return;\n }\n\n if (mouse.kind === 'wheel-down') {\n move(1);\n render();\n return;\n }\n\n if (hasActions && mouse.y === panelTopRow + actionLineOffset) {\n const actionIdx = actionIndexAtX(actions, mouse.x, panelLeftCol, inner);\n if (actionIdx === null || actions[actionIdx].disabled) return;\n if (selectedAction !== actionIdx) {\n selectedAction = actionIdx;\n render();\n }\n if (mouse.kind === 'click') choose(actions[actionIdx].value);\n return;\n }\n\n const idx = mouse.y - panelTopRow - optionStartOffset;\n if (idx < 0 || idx >= options.length || options[idx].disabled) return;\n\n if (selected !== idx) {\n selected = idx;\n selectedAction = null;\n render();\n }\n\n if (mouse.kind === 'click') {\n choose();\n }\n };\n\n const cleanup = (): void => {\n leaveInteractiveScreen();\n stdin.setRawMode(false);\n stdin.removeListener('keypress', onKeypress);\n stdin.removeListener('data', onMouseData);\n stdin.pause();\n };\n\n readline.emitKeypressEvents(stdin);\n stdin.setRawMode(true);\n enterInteractiveScreen(true);\n render(true);\n\n const onKeypress = (_str: string | undefined, key: readline.Key): void => {\n if (!key) return;\n\n if (key.name === 'up' && selected > 0) {\n move(-1);\n selectedAction = null;\n render();\n } else if (key.name === 'down' && selected < options.length - 1) {\n move(1);\n selectedAction = null;\n render();\n } else if (key.name === 'tab' && hasActions) {\n selectedAction = selectedAction === null ? 0 : null;\n render();\n } else if (key.name === 'return') {\n choose(selectedAction === null ? options[selected].value : actions[selectedAction].value);\n } else if ((key.ctrl && key.name === 'c') || key.name === 'escape') {\n cleanup();\n process.exit(0);\n }\n };\n\n stdin.resume();\n stdin.on('data', onMouseData);\n stdin.on('keypress', onKeypress);\n });\n}\n\nasync function fallbackPrompt(\n question: string,\n options: SelectOption[],\n defaultIndex: number,\n config: SelectConfig\n): Promise<string> {\n if (!stdin.isTTY) {\n const firstEnabled: number = options.findIndex((option) => !option.disabled);\n const enabledDefault: number = options[defaultIndex]?.disabled ? firstEnabled : defaultIndex;\n const def = String(enabledDefault + 1);\n\n printFallbackOptions(question, options, enabledDefault, config);\n\n while (true) {\n const trimmed = (await readPipedLine()).trim();\n if (trimmed.toLowerCase() === 'a') {\n const action = config.actions?.find((item) => !item.disabled);\n if (action) return action.value;\n }\n if (!trimmed) {\n const label = stripAnsi(options[enabledDefault].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n return options[enabledDefault].value;\n }\n const idx = parseInt(trimmed, 10);\n if (idx >= 1 && idx <= options.length && !options[idx - 1].disabled) {\n const label = stripAnsi(options[idx - 1].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n return options[idx - 1].value;\n }\n console.log(` ${ui.error('✗')} ${ui.warning(`Enter 1-${options.length} or ${def}`)}\\n`);\n }\n }\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n const firstEnabled: number = options.findIndex((option) => !option.disabled);\n const enabledDefault: number = options[defaultIndex]?.disabled ? firstEnabled : defaultIndex;\n\n printFallbackOptions(question, options, enabledDefault, config);\n const def = String(enabledDefault + 1);\n\n const ask = (): void => {\n rl.question(\n ` ${ui.primary('>')} ${ui.muted(`Choose [1-${options.length}] (${def})`)}: `,\n (answer) => {\n const trimmed = answer.trim();\n if (trimmed.toLowerCase() === 'a') {\n const action = config.actions?.find((item) => !item.disabled);\n if (action) {\n rl.close();\n resolve(action.value);\n return;\n }\n }\n if (!trimmed) {\n rl.close();\n const label = stripAnsi(options[enabledDefault].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n resolve(options[enabledDefault].value);\n return;\n }\n const idx = parseInt(trimmed, 10);\n if (idx >= 1 && idx <= options.length && !options[idx - 1].disabled) {\n rl.close();\n const label = stripAnsi(options[idx - 1].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n resolve(options[idx - 1].value);\n } else if (idx >= 1 && idx <= options.length && options[idx - 1].disabled) {\n console.log(` ${ui.error('✗')} ${ui.warning('Option unavailable for now')}\\n`);\n ask();\n } else {\n console.log(` ${ui.error('✗')} ${ui.warning(`Enter 1-${options.length}`)}\\n`);\n ask();\n }\n }\n );\n };\n ask();\n });\n}\n\nfunction fullscreenInput(\n question: string,\n defaultValue: string,\n config: Omit<SelectConfig, 'actions'>\n): Promise<string> {\n const headerLines = config.headerLines ?? [];\n const width = Math.max(44, Math.min(maxWidth(), 72));\n const inner = width - 4;\n const lineCount = 6 + headerLines.length;\n const rows = process.stdout.rows || 24;\n const columns = process.stdout.columns || 80;\n const panelTopRow = Math.max(2, Math.floor((rows - lineCount) / 2) + 1);\n const panelLeftCol = Math.max(1, Math.floor((columns - width) / 2) + 1);\n const footerRow = Math.min(rows, panelTopRow + lineCount + 1);\n\n return new Promise((resolve) => {\n let value = defaultValue;\n\n const render = (): void => {\n stdout.write('\\x1B[2J');\n const shown = value || '';\n const clipped = truncatePlain(shown, Math.max(12, inner - 10));\n const input = `${ui.primary('>')} ${ui.text(clipped)}${ui.primary('▌')}`;\n const lines: string[] = [];\n lines.push(panelTop(width));\n lines.push(\n panelLine(width, centerText(`${ui.primary('●')} ${ui.text.bold(question)}`, inner))\n );\n for (const header of headerLines) {\n lines.push(panelLine(width, centerText(ui.muted(header), inner)));\n }\n lines.push(panelSep(width));\n lines.push(panelLine(width, centerText(input, inner)));\n lines.push(panelBot(width));\n\n lines.forEach((line, index) => writeAt(panelTopRow + index, panelLeftCol, line));\n writeAt(\n footerRow,\n panelLeftCol,\n centerText(ui.muted(config.footer || 'type value · enter confirm · esc close'), width)\n );\n };\n\n const cleanup = (): void => {\n leaveInteractiveScreen();\n stdin.setRawMode(false);\n stdin.removeListener('keypress', onKeypress);\n stdin.pause();\n };\n\n const submit = (): void => {\n const output = cleanInputValue(value.trim() || defaultValue);\n cleanup();\n resolve(output);\n };\n\n const onKeypress = (str: string | undefined, key: readline.Key): void => {\n if ((key.ctrl && key.name === 'c') || key.name === 'escape') {\n cleanup();\n process.exit(0);\n }\n if (key.name === 'return') {\n submit();\n return;\n }\n if (key.name === 'backspace') {\n value = value.slice(0, -1);\n render();\n return;\n }\n if (key.name === 'delete') {\n value = '';\n render();\n return;\n }\n if (str && !key.ctrl && !key.meta && str >= ' ' && !isTerminalSequence(str, key)) {\n value += cleanInputValue(str.replace(/[\\r\\n]/g, ''));\n render();\n }\n };\n\n readline.emitKeypressEvents(stdin);\n stdin.setRawMode(true);\n enterInteractiveScreen(false);\n render();\n stdin.resume();\n stdin.on('keypress', onKeypress);\n });\n}\n\nasync function fallbackInput(question: string, defaultValue: string): Promise<string> {\n if (!stdin.isTTY) {\n const suffix = defaultValue ? ui.muted(` (${defaultValue})`) : '';\n console.log(` ${ui.primary('>')} ${ui.text.bold(question)}${suffix}: `);\n const answer = await readPipedLine();\n return cleanInputValue(answer.trim() || defaultValue);\n }\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n const suffix = defaultValue ? ui.muted(` (${defaultValue})`) : '';\n rl.question(` ${ui.primary('>')} ${ui.text.bold(question)}${suffix}: `, (answer) => {\n rl.close();\n resolve(cleanInputValue(answer.trim() || defaultValue));\n });\n });\n}\n\nfunction printFallbackOptions(\n question: string,\n options: SelectOption[],\n enabledDefault: number,\n config: SelectConfig\n): void {\n console.log(` ${ui.primary('●')} ${ui.text.bold(question)}\\n`);\n for (const header of config.headerLines ?? []) {\n console.log(` ${ui.muted(header)}`);\n }\n for (const action of config.actions ?? []) {\n console.log(\n ` ${ui.muted('[A]')} ${action.disabled ? ui.muted(action.label) : ui.text(action.label)}`\n );\n }\n if ((config.headerLines?.length || 0) > 0 || (config.actions?.length || 0) > 0) {\n console.log('');\n }\n for (let i = 0; i < options.length; i++) {\n const marker = i === enabledDefault ? ui.success(' ◆') : ' ';\n const label = options[i].disabled\n ? ui.muted(stripAnsi(options[i].label))\n : ui.text(options[i].label);\n console.log(` ${ui.muted(`[${i + 1}]`)}${marker} ${label}`);\n }\n console.log('');\n}\n\nfunction readPipedLine(): Promise<string> {\n if (!pipedLinesPromise) {\n pipedLinesPromise = new Promise((resolve) => {\n let data = '';\n stdin.setEncoding('utf8');\n stdin.on('data', (chunk) => {\n data += chunk;\n });\n stdin.on('end', () => {\n resolve(data.split(/\\r?\\n/));\n });\n stdin.on('error', () => {\n resolve([]);\n });\n });\n }\n\n return pipedLinesPromise.then((lines) => lines[pipedLineIndex++] ?? '');\n}\n\nfunction renderActions(actions: SelectAction[], active: number | null, width: number): string {\n return actions\n .map((action, index) => {\n const label = truncatePlain(\n stripAnsi(action.label),\n Math.max(8, Math.floor(width / actions.length) - 8)\n );\n if (action.disabled) return `${ui.border('[')} ${ui.muted(label)} ${ui.border(']')}`;\n if (active === index)\n return `${ui.primary('›')} ${ui.primary('[')} ${ui.text.bold(label)} ${ui.primary(']')} ${ui.primary('‹')}`;\n return `${ui.border('[')} ${ui.primary(label)} ${ui.border(']')}`;\n })\n .join(` ${ui.muted('·')} `);\n}\n\nfunction actionIndexAtX(\n actions: SelectAction[],\n mouseX: number,\n panelLeftCol: number,\n inner: number\n): number | null {\n if (actions.length === 0) return null;\n const contentStart = panelLeftCol + 2;\n const relative = mouseX - contentStart;\n if (relative < 0 || relative > inner) return null;\n return Math.min(actions.length - 1, Math.floor((relative / Math.max(1, inner)) * actions.length));\n}\n\nfunction labelForValue(value: string, options: SelectOption[], actions: SelectAction[]): string {\n return stripAnsi(\n options.find((option) => option.value === value)?.label ||\n actions.find((action) => action.value === value)?.label ||\n value\n );\n}\n\ntype MouseEventInfo =\n | { kind: 'click'; x: number; y: number }\n | { kind: 'hover'; x: number; y: number }\n | { kind: 'wheel-up'; x: number; y: number }\n | { kind: 'wheel-down'; x: number; y: number };\n\nfunction renderOption(option: SelectOption, selected: boolean, width: number): string {\n const plain = truncatePlain(stripAnsi(option.label), Math.max(10, width - 12));\n if (option.disabled) {\n return `${ui.border('[')} ${ui.muted(plain)} ${ui.border(']')}`;\n }\n if (selected) {\n return `${ui.primary('›')} ${ui.primary('[')} ${ui.text.bold(plain)} ${ui.primary(']')} ${ui.primary('‹')}`;\n }\n return `${ui.muted(' ')} ${ui.border('[')} ${ui.muted(plain)} ${ui.border(']')} ${ui.muted(' ')}`;\n}\n\nfunction enterInteractiveScreen(enableMouse: boolean): void {\n stdout.write('\\x1B[?1049h' + '\\x1B[2J' + '\\x1B[H' + '\\x1B[?25l');\n if (enableMouse) {\n stdout.write('\\x1B[?1006h' + '\\x1B[?1000h' + '\\x1B[?1002h' + '\\x1B[?1003h');\n }\n}\n\nfunction leaveInteractiveScreen(): void {\n stdout.write(\n '\\x1B[?1003l' + '\\x1B[?1002l' + '\\x1B[?1000l' + '\\x1B[?1006l' + '\\x1B[?25h' + '\\x1B[?1049l'\n );\n}\n\nfunction parseMouseEvent(chunk: Buffer): MouseEventInfo | null {\n const text = chunk.toString('utf-8');\n const match = text.match(/\\x1B\\[<(\\d+);(\\d+);(\\d+)([mM])/);\n if (!match) return parseLegacyMouseEvent(text);\n\n const code = Number(match[1]);\n const x = Number(match[2]);\n const y = Number(match[3]);\n const state = match[4];\n if (code === 64) return { kind: 'wheel-up', x, y };\n if (code === 65) return { kind: 'wheel-down', x, y };\n if (state === 'm') return { kind: 'click', x, y };\n if ((code & 32) === 32 || code === 35) return { kind: 'hover', x, y };\n if ((code & 3) === 0) return { kind: 'hover', x, y };\n return null;\n}\n\nfunction parseLegacyMouseEvent(text: string): MouseEventInfo | null {\n const match = text.match(/\\x1B\\[M([\\s\\S])([\\s\\S])([\\s\\S])/);\n if (!match) return null;\n\n const code = match[1].charCodeAt(0) - 32;\n const x = match[2].charCodeAt(0) - 32;\n const y = match[3].charCodeAt(0) - 32;\n\n if (code === 64) return { kind: 'wheel-up', x, y };\n if (code === 65) return { kind: 'wheel-down', x, y };\n if ((code & 3) === 3) return { kind: 'click', x, y };\n if ((code & 32) === 32) return { kind: 'hover', x, y };\n return { kind: 'hover', x, y };\n}\n\nfunction writeAt(row: number, col: number, text: string): void {\n stdout.write(`\\x1B[${row};${col}H${text}`);\n}\n\nfunction isTerminalSequence(str: string, key: readline.Key): boolean {\n return (\n str.includes('\\x1B') || !!key.sequence?.includes('\\x1B') || /^(?:\\d+;){2}\\d+[mM]$/.test(str)\n );\n}\n\nfunction cleanInputValue(value: string): string {\n return value\n .replace(/\\x1B\\[<\\d+;\\d+;\\d+[mM]/g, '')\n .replace(/\\x1B\\[[0-?]*[ -/]*[@-~]/g, '')\n .replace(/(?:\\d+;){2}\\d+[mM]/g, '')\n .replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '');\n}\n","import path from 'path';\nimport crypto from 'crypto';\nimport { URL } from 'url';\nimport type { PlatformHandler } from '../platforms/types.js';\n\ninterface AssetEntry {\n localPath: string;\n}\n\nexport class AssetMap {\n entries: Map<string, AssetEntry> = new Map();\n buffers: Map<string, Buffer> = new Map();\n\n localPathFor(urlStr: string, platform?: PlatformHandler): string | null {\n if (this.entries.has(urlStr)) return this.entries.get(urlStr)!.localPath;\n\n let parsed: URL;\n try {\n parsed = new URL(urlStr);\n } catch {\n return null;\n }\n\n const host: string = parsed.hostname;\n const pathname: string = parsed.pathname;\n const ext: string = path.extname(pathname.split('?')[0]).toLowerCase();\n\n let dir: string | null = null;\n\n if (platform) {\n dir = platform.mapAssetDir(host, pathname, ext);\n }\n\n if (!dir) {\n dir = this.fallbackDir(host, ext);\n }\n\n let filename: string;\n const baseName: string = path.basename(pathname.split('?')[0]);\n const hash: string = crypto.createHash('md5').update(urlStr).digest('hex').slice(0, 6);\n\n if (baseName && baseName.length > 1 && baseName !== '/') {\n const clean: string = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n filename = clean.includes('.') ? clean : `${clean}-${hash}`;\n } else {\n filename = `asset-${hash}${ext || ''}`;\n }\n\n if (ext === '.mjs' || ext === '.js') {\n filename = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n }\n\n const localPath: string = `${dir}/${filename}`;\n this.entries.set(urlStr, { localPath });\n\n const base: string = urlStr.split('?')[0];\n if (base !== urlStr && !this.entries.has(base)) {\n this.entries.set(base, { localPath });\n }\n\n return localPath;\n }\n\n rewrite(text: string, fromDir: string = ''): string {\n const sorted = [...this.entries.entries()].sort((a, b) => b[0].length - a[0].length);\n let out: string = text;\n for (const [url, { localPath }] of sorted) {\n const rel: string = fromDir ? path.posix.relative(fromDir, localPath) : localPath;\n out = out.split(url).join(rel);\n if (url.includes('&')) {\n out = out.split(url.replace(/&/g, '&amp;')).join(rel);\n }\n }\n return out;\n }\n\n private fallbackDir(host: string, ext: string): string {\n if (host.includes('fonts.gstatic.com') || host.includes('fonts.googleapis.com')) {\n return 'assets/fonts';\n }\n return ext === '.mjs' || ext === '.js' ? 'scripts/vendor' : 'assets/misc';\n }\n}\n","import type { Config } from '../types.js';\n\nexport const CFG: Config = {\n viewport: { width: 1440, height: 900 },\n timeout: 90000,\n scrollStep: 250,\n scrollDelay: 60,\n concurrency: 12,\n retries: 3,\n dlTimeout: 30000,\n sharedStripDomains: [\n 'sentry.io', 'www.googletagmanager.com', 'connect.facebook.net',\n 'stats.g.doubleclick.net',\n 'google-analytics.com',\n ],\n};\n","import https from 'https';\nimport http from 'http';\nimport { URL } from 'url';\nimport { CFG } from '../config/index.js';\n\nexport function dlBuffer(url: string, retries: number = CFG.retries): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const proto = url.startsWith('https') ? https : http;\n const go = (left: number): void => {\n const req = proto.get(url, { timeout: CFG.dlTimeout }, (res) => {\n if (res.statusCode! >= 300 && res.statusCode! < 400 && res.headers.location) {\n return dlBuffer(new URL(res.headers.location, url).href, left).then(resolve, reject);\n }\n if (res.statusCode !== 200) {\n return left > 1\n ? setTimeout(() => go(left - 1), 500)\n : reject(new Error(`HTTP ${res.statusCode}`));\n }\n const ch: Buffer[] = [];\n res.on('data', (c: Buffer) => ch.push(c));\n res.on('end', () => resolve(Buffer.concat(ch)));\n res.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n });\n req.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n req.on('timeout', () => {\n req.destroy();\n left > 1 ? setTimeout(() => go(left - 1), 500) : reject(new Error('Timeout'));\n });\n };\n go(retries);\n });\n}\n","import chalk from 'chalk';\nimport type { CookingSpinner } from '../cli/cooking.js';\nimport { THEME } from '../cli/theme.js';\n\nlet _cooking: CookingSpinner | null = null;\n\nexport function setCooking(spinner: CookingSpinner | null): void {\n _cooking = spinner;\n}\n\nconst T = (): string => new Date().toISOString().slice(11, 19);\n\nfunction trunc(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 2) + '..';\n}\n\nfunction output(line: string): void {\n if (_cooking) _cooking.log(line);\n else console.log(line);\n}\n\nconst LOG_PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.primary)(s),\n (s) => chalk.hex(THEME.primarySoft)(s),\n (s) => chalk.hex(THEME.secondary)(s),\n (s) => chalk.hex(THEME.accent)(s),\n (s) => chalk.hex(THEME.info)(s),\n (s) => chalk.hex(THEME.text)(s),\n];\nlet _li = 0;\n\nexport const log = (m: string): void => {\n _li++;\n const c = LOG_PALETTE[_li % LOG_PALETTE.length];\n output(\n `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.primary)('[log]')} ${c(trunc(m, 120))}`\n );\n};\n\nconst INFO_PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.info)(s),\n (s) => chalk.hex(THEME.secondary)(s),\n (s) => chalk.hex(THEME.primarySoft)(s),\n];\nlet _ii = 0;\n\nexport const info = (m: string): void => {\n _ii++;\n const c = INFO_PALETTE[_ii % INFO_PALETTE.length];\n output(\n `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.info).bold('[info]')} ${c(trunc(m, 120))}`\n );\n};\n\nexport const warn = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.warning)(s),\n (s) => chalk.hex(THEME.primary)(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.warning).bold('[warn]')} ${c(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.warn(line);\n};\n\nexport const success = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.success)(s),\n (s) => chalk.hex(THEME.info)(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n output(\n `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.success)('[ok]')} ${c(trunc(m, 120))}`\n );\n};\n\nexport const error = (m: string): void => {\n const colors: Array<(s: string) => string> = [(s) => chalk.hex(THEME.error)(s)];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.error)('[error]')} ${c(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.error(line);\n};\n","import type { PlatformHandler } from './types.js';\n\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf'];\n\nexport const framer: PlatformHandler = {\n name: 'framer',\n displayName: 'Framer',\n\n detectByUrl(url: string): boolean {\n return /\\.framer\\.(app|website)|framercanvas\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('id=\"main\"') &&\n (html.includes('framerstatic.com') || html.includes('framerusercontent.com'))\n );\n },\n\n stripDomains: ['events.framer.com', 'api.framer.com', 'collect.frameranalytics.com'],\n\n stripSelectors: [\n 'script[src*=\"events.framer.com\"]',\n '#__framer-badge-container',\n '#__framer-badge',\n 'link[href*=\"canvas-sandbox\"]',\n 'script[src*=\"framer.com/bootstrap\"]',\n ],\n\n stripPatterns: [\n /<div id=\"__framer-badge-container\"[^>]*><\\/div>/g,\n /<script>try\\{if\\(localStorage\\.get\\(\"__framer_force_showing_editorbar_since\"\\)\\)[^<]*<\\/script>/g,\n ],\n\n hydrationTimeout: 10000,\n needsHydrationCheck: true,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host.includes('framerusercontent.com')) {\n if (pathname.startsWith('/images/')) return 'assets/images';\n if (pathname.startsWith('/assets/')) {\n return FONT_EXTS.includes(ext) ? 'assets/fonts' : 'assets/misc';\n }\n if (pathname.startsWith('/sites/')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.json') return 'data';\n if (ext === '.css') return 'styles';\n if (ext === '.framercms') return 'data';\n return 'assets/misc';\n }\n if (pathname.startsWith('/modules/')) {\n return ext === '.framercms' ? 'data' : 'scripts/modules';\n }\n return 'assets/misc';\n }\n\n if (host.includes('app.framerstatic.com')) {\n if (ext === '.css') return 'styles';\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.woff2' || ext === '.woff') return 'assets/fonts';\n if (ext === '.png' || ext === '.svg') return 'assets/images';\n return 'assets/misc';\n }\n\n if (host.includes('framercanvas.com') || host.includes('framer.com')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const webflow: PlatformHandler = {\n name: 'webflow',\n displayName: 'Webflow',\n\n detectByUrl(url: string): boolean {\n return /\\.webflow\\.(io|com)/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('data-wf-site') ||\n html.includes('w-webflow-badge') ||\n html.includes('Webflow') ||\n html.includes('webflow.js')\n );\n },\n\n stripDomains: ['js-agent.newrelic.com', 'cdn.heapanalytics.com', 'tr.snapchat.com'],\n\n stripSelectors: ['.w-webflow-badge', 'link[href*=\"editorbar\"]'],\n\n stripPatterns: [\n /<a[^>]*class=\"[^\"]*w-webflow-badge[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<a[^>]*href=\"[^\"]*webflow\\.com\\?utm_campaign=brandjs[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<style>[^<]*\\.w-webflow-badge[^<]*<\\/style>/g,\n /Powered by <a[^>]*href=\"[^\"]*webflow\\.com\"[^>]*>[^<]*<\\/a>/g,\n /<!-- This site was created in Webflow\\.[^>]*-->/g,\n /<html([^>]*) data-wf-domain=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-page=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-site=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-status=\"[^\"]*\"/g,\n /<meta[^>]*content=\"Webflow\"[^>]*>/g,\n ],\n\n hydrationTimeout: 2000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (\n host.includes('website-files.com') ||\n host.includes('webflow.com') ||\n host.includes('uploads-ssl.webflow.com')\n ) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (pathname.includes('/css/') || ext === '.css') return 'styles';\n if (pathname.includes('/js/') || ext === '.js') return 'scripts/vendor';\n if (pathname.includes('/gsap/') || pathname.includes('/plugins/')) return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('d3e54v103j8qbb.cloudfront.net')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif', '.ico'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const wix: PlatformHandler = {\n name: 'wix',\n displayName: 'Wix',\n\n detectByUrl(url: string): boolean {\n return /\\.wixsite\\.com|\\.wix\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('wix-viewer-model') ||\n html.includes('id=\"WIX_ADS\"') ||\n html.includes('X-Wix-') ||\n html.includes('Wix.com') ||\n html.includes('wixcode-sdk') ||\n html.includes('data-wix') ||\n html.includes('wix-code') ||\n html.includes('WixCode') ||\n /\\bwix\\.com\\b/.test(html) ||\n /meta\\s+name=[\"']generator[\"']\\s+content=[\"'][^\"']*Wix[^\"']*[\"']/i.test(html) ||\n /_wix_/i.test(html) ||\n /wix-ecom/i.test(html)\n );\n },\n\n stripDomains: [\n 'frog.wix.com',\n 'bi.wixapi.com',\n 'fed.wixcodescheduler.com',\n 'editor.wix.com',\n 'panorama.wixapps.net',\n ],\n\n stripSelectors: ['#WIX_ADS', '.wix-ads', '#wix-badge', '#SCROLL_TO_TOP'],\n\n stripPatterns: [\n /<div[^>]*class=\"[^\"]*wix-ads[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/g,\n ],\n\n hydrationTimeout: 3000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host === 'video.wixstatic.com') {\n return 'assets/videos';\n }\n\n if (host.includes('wixstatic.com')) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (ext === '.css') return 'styles';\n if (ext === '.js') return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('parastorage.com')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler, PlatformType } from './types.js';\nimport type { Page } from 'puppeteer';\nimport { framer } from './framer.js';\nimport { webflow } from './webflow.js';\nimport { wix } from './wix.js';\n\nconst ALL_PLATFORMS: PlatformHandler[] = [framer, webflow, wix];\n\nexport function detectByUrl(url: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByUrl(url)) return platform;\n }\n return null;\n}\n\nexport function detectByHtml(html: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByHtml(html)) return platform;\n }\n return null;\n}\n\nexport function detectPlatform(url: string, html?: string): PlatformHandler {\n const byUrl = detectByUrl(url);\n if (byUrl) return byUrl;\n\n if (html) {\n const byHtml = detectByHtml(html);\n if (byHtml) return byHtml;\n }\n\n return framer;\n}\n\nexport async function detectByDom(page: Page): Promise<PlatformHandler | null> {\n try {\n const signal: string = await page.evaluate(() => {\n const html: string = document.documentElement.outerHTML || '';\n\n if (/wix-viewer-model|_wix_|wix-ecom/i.test(html)) return 'wix';\n if (/data-wf-|w-webflow-badge|webflow\\.js/i.test(html)) return 'webflow';\n if (/framerusercontent|framercanvas|framerstatic/i.test(html)) return 'framer';\n\n const srcs: string[] = [];\n const scripts: NodeListOf<HTMLScriptElement> = document.querySelectorAll('script[src]');\n scripts.forEach((s) => { if (s.src) srcs.push(s.src); });\n const allSrcs: string = srcs.join(' ');\n if (/wixstatic\\.com|parastorage\\.com/.test(allSrcs)) return 'wix';\n if (/website-files\\.com|webflow\\.com/.test(allSrcs)) return 'webflow';\n if (/framerusercontent\\.com|framerstatic\\.com|framer\\.app/.test(allSrcs)) return 'framer';\n\n return '';\n });\n\n if (signal === 'wix') return wix;\n if (signal === 'webflow') return webflow;\n if (signal === 'framer') return framer;\n } catch {}\n return null;\n}\n\nexport function getPlatformByName(name: PlatformType): PlatformHandler {\n const map: Record<string, PlatformHandler> = { framer, webflow, wix };\n return map[name] || framer;\n}\n","export type { PlatformHandler, PlatformType } from './types.js';\nexport { framer } from './framer.js';\nexport { webflow } from './webflow.js';\nexport { wix } from './wix.js';\nexport { detectPlatform, detectByUrl, detectByHtml, detectByDom, getPlatformByName } from './detect.js';\n","import puppeteer, { type Page } from 'puppeteer';\nimport { CFG } from '../config/index.js';\nimport { log, success, info } from '../logger/index.js';\nimport { detectByDom } from '../platforms/index.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function launchAndCapture(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Launching browser...');\n log('Launching headless Chromium...');\n\n exporter.browser = await puppeteer.launch({\n headless: true,\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n success('Chromium launched');\n\n exporter.page = await exporter.browser.newPage();\n await exporter.page.setViewport(CFG.viewport);\n log('Viewport set to ' + CFG.viewport.width + 'x' + CFG.viewport.height);\n\n await exporter.page.setUserAgent(\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' +\n '(KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'\n );\n log('User agent set to Chrome 131');\n\n const allStripDomains: string[] = [\n ...CFG.sharedStripDomains,\n ...exporter.platform.stripDomains,\n ];\n log('Blocking ' + allStripDomains.length + ' tracking domains:');\n for (const domain of allStripDomains) {\n log(' - ' + domain);\n }\n\n let intercepted = 0;\n let blocked = 0;\n\n exporter.page.on('response', async (res) => {\n const url: string = res.url();\n if (url.startsWith('data:') || url.startsWith('blob:')) return;\n\n try {\n const host: string = new URL(url).hostname;\n if (allStripDomains.some((d) => host.includes(d))) {\n blocked++;\n return;\n }\n } catch {\n return;\n }\n\n exporter.assets.localPathFor(url, exporter.platform);\n try {\n exporter.assets.buffers.set(url, await res.buffer());\n intercepted++;\n } catch {}\n });\n\n log('Network interception enabled');\n\n exporter.cooking?.update('Navigating to site...');\n info('Navigating to ' + exporter.siteUrl);\n await exporter.page.goto(exporter.siteUrl, {\n waitUntil: 'networkidle2',\n timeout: CFG.timeout,\n });\n success('Page loaded (networkidle2)');\n log('Intercepted ' + intercepted + ' resources, blocked ' + blocked + ' tracking requests');\n\n log('Checking DOM-based platform detection...');\n const domDetected = await detectByDom(exporter.page);\n if (domDetected && domDetected.name !== exporter.platform.name) {\n log('Platform refined from DOM: ' + domDetected.displayName + ' (override: ' + exporter.platform.name + ')');\n exporter.platform = domDetected;\n }\n\n exporter.cooking?.update('Waiting for ' + exporter.platform.displayName + ' hydration...');\n\n if (exporter.platform.needsHydrationCheck) {\n log('Checking for #main element hydration...');\n log('Hydration timeout: ' + exporter.platform.hydrationTimeout + 'ms');\n const timeout = exporter.platform.hydrationTimeout;\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var start = Date.now();\n var tick = function() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 2000);\n else if (Date.now() - start > ${timeout}) r();\n else setTimeout(tick, 200);\n };\n tick();\n })\n `);\n success('Hydration complete (SPA rendered)');\n } else {\n log('Static site detected, waiting ' + exporter.platform.hydrationTimeout + 'ms for render...');\n await new Promise<void>((r) => setTimeout(r, exporter.platform.hydrationTimeout));\n success(exporter.platform.displayName + ' page rendered');\n }\n\n exporter.cooking?.update('Scrolling page...');\n log('Starting full-page scroll (step: ' + CFG.scrollStep + 'px, delay: ' + CFG.scrollDelay + 'ms)');\n\n const scrollStep = CFG.scrollStep;\n const scrollDelay = CFG.scrollDelay;\n\n const pageHeight: number = await exporter.page.evaluate(`\n Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)\n `) as number;\n log('Page height: ' + pageHeight + 'px (' + Math.ceil(pageHeight / scrollStep) + ' scroll steps)');\n\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var y = 0;\n var max = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n var step = function() {\n y += ${scrollStep};\n window.scrollTo({ top: y, behavior: 'instant' });\n y < max + 500 ? setTimeout(step, ${scrollDelay}) : (window.scrollTo(0, 0), r());\n };\n step();\n })\n `);\n success('Full-page scroll complete');\n\n exporter.cooking?.update('Waiting for lazy resources...');\n log('Waiting 2s for lazy-loaded resources...');\n await new Promise<void>((r) => setTimeout(r, 2000));\n\n log('Checking network idle (1.5s quiet, 8s timeout)...');\n try {\n await exporter.page.waitForNetworkIdle({ idleTime: 1500, timeout: 8000 });\n success('Network idle confirmed');\n } catch {\n log('Network idle timeout reached (continuing anyway)');\n }\n\n const totalCaptured: number = exporter.assets.buffers.size;\n success('Captured ' + totalCaptured + ' network resources total');\n\n const cssCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.css')).length;\n const jsCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.js') || e.localPath.endsWith('.mjs')).length;\n const imgCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/images')).length;\n const fontCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/fonts')).length;\n log(' CSS: ' + cssCount + ' | JS: ' + jsCount + ' | Images: ' + imgCount + ' | Fonts: ' + fontCount);\n}\n\nexport async function closeBrowser(exporter: { browser: import('puppeteer').Browser | null }): Promise<void> {\n if (exporter.browser) {\n await exporter.browser.close();\n exporter.browser = null;\n log('Browser closed');\n }\n}\n\nexport async function captureSubpage(\n page: Page,\n url: string,\n platform: { needsHydrationCheck: boolean; hydrationTimeout: number }\n): Promise<string> {\n log(' Navigating to sub-page: ' + url);\n await page.goto(url, { waitUntil: 'networkidle2', timeout: CFG.timeout });\n\n if (platform.needsHydrationCheck) {\n await page.evaluate(\n `new Promise(function(r) {\n var t = Date.now();\n (function tick() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 500);\n else if (Date.now() - t > ${platform.hydrationTimeout}) r();\n else setTimeout(tick, 200);\n })();\n })`\n );\n } else {\n await new Promise<void>((r) => setTimeout(r, 1000));\n }\n\n const html: string = await page.evaluate(() => document.documentElement.outerHTML || document.body.innerHTML);\n log(' Sub-page fetched: ' + (html.length / 1024).toFixed(1) + ' KB');\n return html;\n}\n","export async function pool(tasks: Array<() => Promise<void>>, n: number): Promise<void> {\n let i = 0;\n const run = async (): Promise<void> => {\n while (i < tasks.length) {\n const j = i++;\n await tasks[j]();\n }\n };\n await Promise.all(Array.from({ length: Math.min(n, tasks.length) }, () => run()));\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { CFG } from '../config/index.js';\nimport { log, warn, success } from '../logger/index.js';\nimport { dlBuffer } from '../network/download.js';\nimport { pool } from '../network/pool.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function downloadAll(exporter: ExporterContext): Promise<void> {\n const seen: Set<string> = new Set();\n const toDownload: Array<{ url: string; localPath: string }> = [];\n for (const [url, { localPath }] of exporter.assets.entries) {\n if (seen.has(localPath)) continue;\n seen.add(localPath);\n toDownload.push({ url, localPath });\n }\n\n const total: number = toDownload.length;\n log('Starting download of ' + total + ' unique assets');\n log('Concurrency: ' + CFG.concurrency + ' parallel downloads');\n log('Retry policy: ' + CFG.retries + ' attempts, ' + CFG.dlTimeout + 'ms timeout');\n\n let ok = 0;\n let cached = 0;\n let fail = 0;\n let completed = 0;\n let lastReported = 0;\n\n const tasks: Array<() => Promise<void>> = toDownload.map(\n ({ url, localPath }) =>\n async (): Promise<void> => {\n const dest: string = path.join(exporter.outDir, localPath);\n await fs.mkdir(path.dirname(dest), { recursive: true });\n\n try {\n const buf: Buffer | undefined =\n exporter.assets.buffers.get(url) ||\n exporter.assets.buffers.get(url.split('?')[0]);\n if (buf) {\n await fs.writeFile(dest, buf);\n cached++;\n ok++;\n } else {\n const data: Buffer = await dlBuffer(url);\n await fs.writeFile(dest, data);\n ok++;\n }\n } catch (e) {\n fail++;\n if (\n !url.includes('framer.com/edit') &&\n !url.includes('framerstatic.com/editorbar')\n ) {\n warn('Download failed: ' + path.basename(localPath) + ' - ' + (e as Error).message);\n }\n }\n\n completed++;\n const pct: number = Math.floor((completed / total) * 100);\n if (pct >= lastReported + 10 || completed === total) {\n exporter.cooking?.update('Downloading... ' + completed + '/' + total + ' (' + pct + '%)');\n log('Download progress: ' + completed + '/' + total + ' (' + pct + '%)');\n lastReported = pct;\n }\n }\n );\n\n await pool(tasks, CFG.concurrency);\n\n success('Downloads complete: ' + ok + ' succeeded, ' + cached + ' from cache, ' + fail + ' failed');\n\n const totalBytes: number = [...exporter.assets.entries.values()].length;\n log('Total unique assets written to disk: ' + totalBytes);\n\n exporter.assets.buffers.clear();\n log('Network buffer cache cleared');\n}\n","import prettier from 'prettier';\n\nexport async function prettifyJS(src: string): Promise<string> {\n try {\n return await prettier.format(src, {\n parser: 'babel',\n printWidth: 100,\n tabWidth: 2,\n useTabs: false,\n semi: true,\n singleQuote: false,\n trailingComma: 'es5',\n bracketSpacing: true,\n arrowParens: 'always',\n });\n } catch {\n return src;\n }\n}\n","export const SERVE_SCRIPT: string = `#!/usr/bin/env node\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst PORT = process.env.PORT || 3000;\nconst ROOT = path.dirname(fileURLToPath(import.meta.url));\n\nconst MIME = {\n '.html': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.otf': 'font/otf',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.ogg': 'video/ogg',\n '.framercms': 'application/octet-stream',\n};\n\nconst server = http.createServer((req, res) => {\n let url = decodeURIComponent(req.url.split('?')[0]);\n if (url === '/') url = '/index.html';\n\n let filePath = path.join(ROOT, url);\n if (!filePath.startsWith(ROOT)) {\n res.writeHead(403);\n res.end('Forbidden');\n return;\n }\n\n const serveFile = (pathToFile) => {\n fs.readFile(pathToFile, (err, data) => {\n if (err) {\n // SPA Fallback: if it's not a file, serve index.html\n if (url !== '/index.html' && !path.extname(url)) {\n return serveFile(path.join(ROOT, 'index.html'));\n }\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n const ext = path.extname(pathToFile).toLowerCase();\n const mime = MIME[ext] || 'application/octet-stream';\n res.writeHead(200, {\n 'Content-Type': mime,\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'public, max-age=3600',\n });\n res.end(data);\n });\n };\n\n serveFile(filePath);\n});\n\nconst ANSI = {\n reset: '\\\\x1b[0m',\n primary: '\\\\x1b[38;2;250;178;131m',\n soft: '\\\\x1b[38;2;255;192;159m',\n text: '\\\\x1b[38;2;238;238;238m',\n muted: '\\\\x1b[38;2;128;128;128m',\n border: '\\\\x1b[38;2;72;72;72m',\n success: '\\\\x1b[38;2;127;216;143m',\n info: '\\\\x1b[38;2;86;182;194m',\n error: '\\\\x1b[38;2;224;108;117m',\n};\n\nfunction color(name, value) {\n return ANSI[name] + value + ANSI.reset;\n}\n\nfunction frameLine(label, value) {\n const text = ' ' + label.padEnd(10) + value;\n const pad = Math.max(0, 56 - text.length);\n console.log(' ' + color('border', '│ ') + color('muted', label.padEnd(10)) + color('text', value) + ' '.repeat(pad) + color('border', ' │'));\n}\n\nfunction drawServerUi() {\n console.log('');\n console.log(' ' + color('border', '╭─' + '─'.repeat(56) + '─╮'));\n console.log(' ' + color('border', '│ ') + color('text', ' Framer Export preview server') + ' '.repeat(26) + color('border', ' │'));\n console.log(' ' + color('border', '├─' + '─'.repeat(56) + '─┤'));\n frameLine('URL', 'http://localhost:' + PORT);\n frameLine('Root', ROOT);\n frameLine('Run', 'node serve.js');\n frameLine('Mode', 'static mirror + SPA fallback');\n console.log(' ' + color('border', '╰─' + '─'.repeat(56) + '─╯'));\n console.log('');\n console.log(' ' + color('success', 'ready') + color('muted', ' press Ctrl+C to stop') + '\\\\n');\n}\n\nserver.listen(PORT, () => {\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n const steps = ['Preparing server', 'Checking exported files', 'Binding local port', 'Serving static mirror'];\n let i = 0;\n const timer = setInterval(() => {\n const step = steps[Math.min(steps.length - 1, Math.floor(i / 6))];\n const dots = color('error', '.'.repeat(i % 4).padEnd(3, ' '));\n process.stdout.write('\\\\r\\\\x1B[2K ' + color('primary', frames[i % frames.length]) + ' ' + color('text', step) + dots);\n i++;\n }, 80);\n\n setTimeout(() => {\n clearInterval(timer);\n process.stdout.write('\\\\r\\\\x1B[2K');\n drawServerUi();\n }, 1280);\n});\n`;\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { log, warn, success } from '../logger/index.js';\nimport { prettifyJS } from '../formatter/prettify.js';\nimport { SERVE_SCRIPT } from '../server/template.js';\nimport type { ExporterContext } from '../types.js';\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction stripBySelector(html: string, sel: string): string {\n if (sel.includes('[src*=\"')) {\n const match = sel.match(/\\[src\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const domain: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*>[^<]*<\\\\/script>`, 'g'), '');\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*><\\\\/script>`, 'g'), '');\n }\n } else if (sel.includes('[href*=\"')) {\n const match = sel.match(/\\[href\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const href: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<link[^>]*${href}[^>]*>`, 'g'), '');\n }\n } else if (sel.startsWith('.')) {\n const cls: string = escapeRegex(sel.slice(1));\n html = html.replace(\n new RegExp(`<[^>]*class=\"[^\"]*${cls}[^\"]*\"[^>]*>[\\\\s\\\\S]*?<\\\\/[^>]*>`, 'g'),\n ''\n );\n } else if (sel.startsWith('#')) {\n const id: string = sel.slice(1);\n html = removeElementById(html, id);\n }\n return html;\n}\n\nfunction removeElementById(html: string, id: string): string {\n const marker: string = `id=\"${id}\"`;\n let idx: number = html.indexOf(marker);\n while (idx !== -1) {\n const tagStart: number = html.lastIndexOf('<', idx);\n if (tagStart === -1) break;\n\n const tagNameEnd: number = html.indexOf(' ', tagStart + 1);\n const tagName: string = html.slice(tagStart + 1, tagNameEnd).toLowerCase();\n\n let depth = 0;\n let i: number = tagStart;\n while (i < html.length) {\n if (\n html.startsWith(`<${tagName}`, i) &&\n (html[i + tagName.length + 1] === ' ' || html[i + tagName.length + 1] === '>')\n ) {\n depth++;\n i += tagName.length + 1;\n } else if (html.startsWith(`</${tagName}>`, i)) {\n depth--;\n if (depth === 0) {\n html = html.slice(0, tagStart) + html.slice(i + tagName.length + 3);\n break;\n }\n i += tagName.length + 3;\n } else {\n i++;\n }\n }\n\n idx = html.indexOf(marker);\n }\n return html;\n}\n\nfunction processSEO(html: string, url: string): string {\n const canonical = url.split('?')[0].replace(/\\/$/, '');\n\n // Inject Canonical\n if (!html.includes('rel=\"canonical\"')) {\n html = html.replace('</head>', ` <link rel=\"canonical\" href=\"${canonical}\">\\n </head>`);\n }\n\n // Inject Meta Description if missing\n if (!html.includes('name=\"description\"')) {\n html = html.replace(\n '</head>',\n ` <meta name=\"description\" content=\"Exported with Framer Export - Fast, SEO-optimized, and clean.\">\\n </head>`\n );\n }\n\n // Inject OG Tags if missing\n if (!html.includes('property=\"og:')) {\n html = html.replace(\n '</head>',\n ` <meta property=\"og:type\" content=\"website\">\\n <meta property=\"og:url\" content=\"${canonical}\">\\n <meta property=\"og:title\" content=\"Exported Site\">\\n <meta property=\"og:description\" content=\"A fast, clean version of this site, exported for performance.\">\\n </head>`\n );\n }\n\n // Inject Robot tags\n if (!html.includes('name=\"robots\"')) {\n html = html.replace('</head>', ` <meta name=\"robots\" content=\"index, follow\">\\n </head>`);\n }\n\n return html;\n}\n\nfunction stripIntegrityAndCors(html: string): string {\n html = html.replace(/\\s+integrity=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin/g, '');\n html = html.replace(/<link[^>]*rel=\"preconnect\"[^>]*>/g, '');\n html = html.replace(/<link[^>]*rel=\"dns-prefetch\"[^>]*>/g, '');\n html = html.replace(/<meta[^>]*content-security-policy[^>]*>/gi, '');\n return html;\n}\n\nfunction stripSrcsetCdnUrls(html: string): string {\n html = html.replace(/srcset=\"([^\"]*)\"/g, (_match: string, srcset: string) => {\n const cleaned: string = srcset\n .split(',')\n .map((entry: string) => entry.trim())\n .filter((entry: string) => !entry.startsWith('http'))\n .join(', ');\n return cleaned ? 'srcset=\"' + cleaned + '\"' : '';\n });\n return html;\n}\n\nexport async function buildOutput(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Stripping platform badges...');\n log('Starting HTML post-processing...');\n log('HTML size: ' + (exporter.ssrHTML.length / 1024).toFixed(1) + ' KB');\n\n let html: string = exporter.ssrHTML;\n if (!html) {\n warn('No SSR HTML available, cannot build output');\n return;\n }\n\n exporter.cooking?.update('Removing integrity checks...');\n const beforeIntegrity: number = html.length;\n html = stripIntegrityAndCors(html);\n log('Stripped integrity/crossorigin/preconnect (' + (beforeIntegrity - html.length) + ' chars)');\n success('Integrity and CORS restrictions removed');\n\n if (typeof processSEO === 'function') {\n exporter.cooking?.update('Optimizing SEO...');\n html = processSEO(html, exporter.siteUrl);\n success('SEO meta tags optimized');\n }\n\n log('Stripping ' + exporter.platform.stripSelectors.length + ' selectors:');\n for (const sel of exporter.platform.stripSelectors) {\n const before: number = html.length;\n html = stripBySelector(html, sel);\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Stripped ' + sel + ' (' + removed + ' chars removed)');\n }\n }\n\n log('Applying ' + exporter.platform.stripPatterns.length + ' regex patterns...');\n for (const pattern of exporter.platform.stripPatterns) {\n const before: number = html.length;\n html = html.replace(new RegExp(pattern.source, pattern.flags), '');\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Pattern removed ' + removed + ' chars');\n }\n }\n success('Platform badges and tracking stripped');\n\n exporter.cooking?.update('Rewriting asset URLs...');\n log('Rewriting ' + exporter.assets.entries.size + ' CDN URLs to local paths...');\n const beforeRewrite: number = html.length;\n html = exporter.assets.rewrite(html, '');\n log('HTML rewrite delta: ' + (html.length - beforeRewrite) + ' chars');\n\n exporter.cooking?.update('Cleaning srcset references...');\n html = stripSrcsetCdnUrls(html);\n log('Cleaned remaining CDN URLs from srcset attributes');\n\n await rewriteDownloadedFiles(exporter);\n success('All URLs rewritten to local paths');\n\n exporter.cooking?.update('Pretty-printing JS files...');\n await prettifyDownloadedJS(exporter);\n\n exporter.cooking?.update('Writing final output...');\n log('Writing index.html (' + (html.length / 1024).toFixed(1) + ' KB)...');\n await fs.writeFile(path.join(exporter.outDir, 'index.html'), html);\n success('index.html written');\n\n await fs.writeFile(path.join(exporter.outDir, 'serve.js'), SERVE_SCRIPT);\n log('serve.js written');\n await fs.writeFile(\n path.join(exporter.outDir, 'package.json'),\n JSON.stringify({ type: 'module', scripts: { serve: 'node serve.js' } }, null, 2) + '\\n'\n );\n log('package.json written for serve.js');\n success('Output build complete');\n}\n\nasync function rewriteDownloadedFiles(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules', 'styles'];\n let rewritten = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n for (const file of files) {\n const ext: string = path.extname(file).toLowerCase();\n if (!['.mjs', '.js', '.css'].includes(ext)) continue;\n\n const filePath: string = path.join(fullDir, file);\n try {\n let content: string = await fs.readFile(filePath, 'utf-8');\n const before: string = content;\n content = exporter.assets.rewrite(content, dir);\n if (content !== before) {\n await fs.writeFile(filePath, content);\n rewritten++;\n }\n } catch {}\n }\n }\n log('Rewrote URLs in ' + rewritten + ' JS/CSS files');\n}\n\nasync function prettifyDownloadedJS(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules'];\n let count = 0;\n let total = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n const jsFiles: string[] = files.filter((f) => {\n const ext: string = path.extname(f).toLowerCase();\n return ext === '.mjs' || ext === '.js';\n });\n total += jsFiles.length;\n\n for (const file of jsFiles) {\n const filePath: string = path.join(fullDir, file);\n try {\n const raw: string = await fs.readFile(filePath, 'utf-8');\n\n const nlRatio: number = (raw.match(/\\n/g) || []).length / raw.length;\n if (nlRatio > 0.05) {\n count++;\n continue;\n }\n\n const pretty: string = await prettifyJS(raw);\n await fs.writeFile(filePath, pretty, 'utf-8');\n count++;\n\n if (count % 5 === 0) {\n exporter.cooking?.update('Pretty-printing... (' + count + '/' + total + ')');\n }\n } catch (e) {\n warn('Pretty-print skipped: ' + file + ' - ' + (e as Error).message);\n count++;\n }\n }\n }\n\n success('Formatted ' + count + '/' + total + ' JS/MJS files');\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport type { ExporterContext } from '../types.js';\nimport { boxTop, boxLine, boxBot, boxSep, boxRow, maxWidth } from '../cli/box.js';\nimport { chip, ui } from '../cli/theme.js';\n\nexport async function printSummary(exporter: ExporterContext): Promise<void> {\n const w = maxWidth();\n const isSmall = w < 50;\n\n const count = async (d: string): Promise<number> => {\n try {\n return (await fs.readdir(path.join(exporter.outDir, d))).length;\n } catch {\n return 0;\n }\n };\n const [imgs, fonts, videos, misc, scripts, vendor, styles, data, subpages] = await Promise.all([\n count('assets/images'),\n count('assets/fonts'),\n count('assets/videos'),\n count('assets/misc'),\n count('scripts/modules'),\n count('scripts/vendor'),\n count('styles'),\n count('data'),\n count('subpages'),\n ]);\n\n const G = ui.primary;\n const G2 = ui.primarySoft;\n const C2 = ui.secondary;\n const Y = ui.accent;\n const O = ui.warning;\n const Br = ui.info;\n const Gr = ui.muted;\n const Gn = ui.success;\n\n const entries: Array<[string, number, string, (s: string) => string]> = [\n ['styles/', styles, 'CSS', G],\n ['scripts/vendor/', vendor, 'JS vendor', G2],\n ['scripts/modules/', scripts, 'JS modules', C2],\n ['assets/images/', imgs, 'images', Y],\n ['assets/videos/', videos, 'videos', O],\n ['assets/fonts/', fonts, 'fonts', Br],\n ['assets/misc/', misc, 'misc', Gr],\n ['data/', data, 'data', Gr],\n ['subpages/', subpages, 'pages', Gn],\n ];\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, `${ui.text.bold(' Export Summary')} ${chip('done')}`));\n console.log(boxSep(w));\n } else {\n console.log(ui.text.bold(' Export Summary:'));\n }\n\n for (const [label, cnt, type, color] of entries) {\n if (cnt === 0) continue;\n const inner = w - 4;\n const l = label.padEnd(16);\n const c = String(cnt).padStart(3);\n const rowText = `${color(l)}${ui.text(c)} ${ui.muted(type)}`;\n const visible = 16 + 3 + 2 + type.length;\n const pad = Math.max(0, inner - visible);\n if (isSmall) {\n console.log(` ${color(label)} ${ui.text(String(cnt))} ${ui.muted(type)}`);\n } else {\n console.log(' ' + ui.border('│ ') + rowText + ' '.repeat(pad) + ui.border(' │'));\n }\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n\n console.log('');\n const cdCmd = 'cd ' + path.basename(exporter.outDir);\n const runCmd = 'node serve.js';\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' To serve locally')));\n console.log(boxSep(w));\n console.log(boxRow(w, 'Open', cdCmd));\n console.log(boxRow(w, 'Run', runCmd));\n console.log(boxBot(w));\n } else {\n console.log(ui.text.bold(' To serve locally:'));\n console.log(` ${G(cdCmd)}`);\n console.log(` ${G(runCmd)}`);\n }\n\n console.log('');\n console.log(ui.muted(' note: must be served via HTTP for JS modules to work.'));\n console.log('');\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { stdin, stdout } from 'node:process';\nimport { spawn } from 'node:child_process';\nimport type { ExporterContext } from '../types.js';\nimport { select, type SelectOption } from '../cli/select.js';\nimport { boxTop, boxLine, boxSep, boxBot, maxWidth } from '../cli/box.js';\nimport { stripAnsi, ui } from '../cli/theme.js';\n\ninterface ConversionTarget {\n id: string;\n label: string;\n stack: string;\n projectDir: string;\n staticDir: string;\n scaffold: string;\n entryFiles: string;\n routing: string;\n}\n\ninterface AiTool {\n id: string;\n label: string;\n displayName: string;\n agentName: string;\n}\n\ninterface ConversionGoal {\n id: string;\n label: string;\n instruction: string;\n priority: string;\n}\n\ninterface ExportFacts {\n sourceUrl: string;\n outputDir: string;\n platformName: string;\n rootEntries: string[];\n counts: Record<string, number>;\n}\n\nconst IMPORTANT_DIRS = [\n 'index.html',\n 'styles',\n 'scripts/vendor',\n 'scripts/modules',\n 'assets/images',\n 'assets/videos',\n 'assets/fonts',\n 'assets/misc',\n 'data',\n 'subpages',\n];\n\nconst AI_TOOLS: AiTool[] = [\n {\n id: 'claude-code',\n label: 'Claude Code',\n displayName: 'Claude Code',\n agentName: 'Claude Code',\n },\n {\n id: 'codex',\n label: 'Codex',\n displayName: 'Codex',\n agentName: 'Codex coding agent',\n },\n {\n id: 'opencode',\n label: 'OpenCode',\n displayName: 'OpenCode',\n agentName: 'OpenCode',\n },\n {\n id: 'other-ai',\n label: 'Other AI coding agent',\n displayName: 'Other AI',\n agentName: 'AI coding agent',\n },\n];\n\nconst TARGETS: ConversionTarget[] = [\n {\n id: 'react-vite',\n label: 'React + Vite + TypeScript',\n stack: 'React 18/19, TypeScript, Vite, CSS modules or plain CSS',\n projectDir: 'converted-react-vite',\n staticDir: 'public',\n scaffold: 'npm create vite@latest converted-react-vite -- --template react-ts',\n entryFiles: 'src/main.tsx, src/App.tsx, src/components/*, src/styles/*',\n routing: 'Use React Router only if multiple exported pages exist in subpages/.',\n },\n {\n id: 'nextjs-app-router',\n label: 'Next.js App Router',\n stack: 'Next.js App Router, TypeScript, React Server Components where useful',\n projectDir: 'converted-nextjs',\n staticDir: 'public',\n scaffold: 'npx create-next-app@latest converted-nextjs --ts --app --eslint',\n entryFiles: 'app/page.tsx, app/layout.tsx, components/*, public/*',\n routing: 'Map exported subpages to app routes and keep shared layout code reusable.',\n },\n {\n id: 'vue-vite',\n label: 'Vue + Vite + TypeScript',\n stack: 'Vue 3, TypeScript, Vite, single-file components',\n projectDir: 'converted-vue-vite',\n staticDir: 'public',\n scaffold: 'npm create vite@latest converted-vue-vite -- --template vue-ts',\n entryFiles: 'src/main.ts, src/App.vue, src/components/*.vue, src/styles/*',\n routing: 'Use Vue Router only if multiple exported pages exist in subpages/.',\n },\n {\n id: 'sveltekit',\n label: 'SvelteKit',\n stack: 'SvelteKit, TypeScript, componentized routes and assets',\n projectDir: 'converted-sveltekit',\n staticDir: 'static',\n scaffold: 'npm create svelte@latest converted-sveltekit',\n entryFiles: 'src/routes/+page.svelte, src/lib/components/*, static/*',\n routing: 'Create SvelteKit routes for meaningful exported pages when subpages/ exists.',\n },\n {\n id: 'astro',\n label: 'Astro',\n stack: 'Astro, TypeScript, island components only where interactivity is needed',\n projectDir: 'converted-astro',\n staticDir: 'public',\n scaffold: 'npm create astro@latest converted-astro',\n entryFiles: 'src/pages/index.astro, src/components/*, public/*',\n routing: 'Use Astro pages for exported subpages and avoid unnecessary client JavaScript.',\n },\n];\n\nconst GOALS: ConversionGoal[] = [\n {\n id: 'clean-rebuild',\n label: 'Clean professional rebuild',\n instruction:\n 'Rebuild the export as clean production code, not as a one-file HTML clone, while preserving the full page experience.',\n priority: 'Readable structure, maintainability, complete pages, and faithful visual result.',\n },\n {\n id: 'pixel-perfect',\n label: 'Pixel-perfect visual migration',\n instruction:\n 'Prioritize pixel-perfect fidelity before refactoring anything aggressively, even when the layout is difficult.',\n priority:\n 'Spacing, typography, responsive behavior, colors, media, animations, and page-by-page fidelity.',\n },\n {\n id: 'component-system',\n label: 'Reusable component system',\n instruction:\n 'Extract repeated UI blocks into reusable components with clean props without simplifying the original pages.',\n priority:\n 'Components, layout primitives, naming, future editability, and complete section coverage.',\n },\n {\n id: 'performance-seo',\n label: 'Performance and SEO rebuild',\n instruction:\n 'Rebuild the site while reducing unused vendor code and improving SEO basics without losing visual fidelity.',\n priority:\n 'Fast loading, semantic markup, metadata, accessibility, asset hygiene, and faithful pages.',\n },\n];\n\nexport async function runAiPromptAssistant(exporter: ExporterContext): Promise<void> {\n if (!stdin.isTTY || !stdout.isTTY) return;\n\n const serveCommand = buildServeCommand(exporter);\n const shouldConvert = await runExportCompletePrompt(exporter, serveCommand);\n if (!shouldConvert) return;\n\n printAssistantModal(`${ui.text.bold('AI conversion prompt')} ${ui.error('BETA')}`, [\n 'Choose a target stack, AI tool, and conversion situation.',\n 'Mouse clicks are supported in the terminal when available.',\n 'A detailed prompt file will be generated inside the export folder.',\n ]);\n\n const targetOptions: SelectOption[] = [\n ...TARGETS.map((target) => ({ label: target.label, value: target.id })),\n { label: 'Customize with AI - BETA in development', value: 'custom-ai', disabled: true },\n ];\n\n const targetId = await select('Choose target stack', targetOptions, 0);\n\n const aiToolId = await select(\n 'Choose the AI coding tool',\n AI_TOOLS.map((tool) => ({ label: tool.label, value: tool.id })),\n 0\n );\n\n const goalId = await select(\n 'Choose the conversion situation',\n GOALS.map((goal) => ({ label: goal.label, value: goal.id })),\n 0\n );\n\n const target = TARGETS.find((item) => item.id === targetId) || TARGETS[0];\n const aiTool = AI_TOOLS.find((item) => item.id === aiToolId) || AI_TOOLS[0];\n const goal = GOALS.find((item) => item.id === goalId) || GOALS[0];\n const facts = await collectExportFacts(exporter);\n const prompt = buildConversionPrompt(target, aiTool, goal, facts);\n const aiDir = path.join(exporter.outDir, 'ai');\n const promptPath = path.join(aiDir, `${aiTool.id}-${target.id}-${goal.id}-prompt.md`);\n\n await fs.mkdir(aiDir, { recursive: true });\n await fs.writeFile(promptPath, prompt, 'utf-8');\n\n const copyPrompt = await runPromptReadyPrompt(promptPath, target, aiTool, goal);\n if (copyPrompt) {\n try {\n await copyToClipboard(prompt);\n console.log(` ${ui.success('✓')} ${ui.text.bold('Prompt copied to clipboard')}\\n`);\n } catch (error) {\n console.log(\n ` ${ui.warning('!')} ${ui.warning('Clipboard copy unavailable:')} ${ui.muted((error as Error).message)}\\n`\n );\n }\n }\n}\n\nasync function collectExportFacts(exporter: ExporterContext): Promise<ExportFacts> {\n const counts: Record<string, number> = {};\n const rootEntries = await safeReadDir(exporter.outDir);\n\n for (const item of IMPORTANT_DIRS) {\n counts[item] =\n item === 'index.html'\n ? (await exists(path.join(exporter.outDir, item)))\n ? 1\n : 0\n : await countEntries(path.join(exporter.outDir, item));\n }\n\n return {\n sourceUrl: exporter.siteUrl,\n outputDir: exporter.outDir,\n platformName: exporter.platform.displayName,\n rootEntries,\n counts,\n };\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function safeReadDir(dir: string): Promise<string[]> {\n try {\n return (await fs.readdir(dir)).sort();\n } catch {\n return [];\n }\n}\n\nasync function countEntries(dir: string): Promise<number> {\n try {\n return (await fs.readdir(dir)).length;\n } catch {\n return 0;\n }\n}\n\nfunction buttonLabel(label: string): string {\n return `${ui.border('[')} ${ui.text.bold(label)} ${ui.border(']')}`;\n}\n\nfunction centerText(text: string, width: number): string {\n const visible = stripAnsi(text).length;\n if (visible >= width) return text;\n const left = Math.floor((width - visible) / 2);\n return ' '.repeat(left) + text + ' '.repeat(width - visible - left);\n}\n\nfunction buildServeCommand(exporter: ExporterContext): string {\n return `cd ${path.basename(exporter.outDir)} && node serve.js`;\n}\n\nasync function runExportCompletePrompt(\n exporter: ExporterContext,\n serveCommand: string\n): Promise<boolean> {\n let copyServeCommand = false;\n\n while (true) {\n const action = await select(\n 'Export complete',\n [\n {\n label: `${checkboxLabel(copyServeCommand)} Copy serve command when finishing`,\n value: 'toggle-copy',\n },\n {\n label: `${buttonLabel('Convert to AI code')} ${ui.error('BETA')}`,\n value: 'convert',\n },\n { label: buttonLabel('Finish'), value: 'finish' },\n ],\n 2,\n {\n headerLines: [\n `Output: ${path.basename(exporter.outDir)}`,\n `Run: ${serveCommand}`,\n 'Use Convert to open the AI conversion assistant.',\n ],\n footer: 'enter select · checkbox toggles copy · mouse hover/click',\n }\n );\n\n if (action === 'toggle-copy') {\n copyServeCommand = !copyServeCommand;\n continue;\n }\n\n if (action === 'finish') {\n if (copyServeCommand) {\n try {\n await copyToClipboard(serveCommand);\n console.log(` ${ui.success('✓')} ${ui.text.bold('Serve command copied')}\\n`);\n } catch (error) {\n console.log(\n ` ${ui.warning('!')} ${ui.warning('Clipboard copy unavailable:')} ${ui.muted((error as Error).message)}\\n`\n );\n }\n }\n return false;\n }\n\n return true;\n }\n}\n\nasync function runPromptReadyPrompt(\n promptPath: string,\n target: ConversionTarget,\n aiTool: AiTool,\n goal: ConversionGoal\n): Promise<boolean> {\n const relPath = path.relative(process.cwd(), promptPath) || promptPath;\n let copyPrompt = false;\n\n while (true) {\n const action = await select(\n `AI Prompt Ready ${ui.error('BETA')}`,\n [\n {\n label: `${checkboxLabel(copyPrompt)} Copy prompt when finishing`,\n value: 'toggle-copy',\n },\n { label: buttonLabel('Finish'), value: 'finish' },\n ],\n 1,\n {\n headerLines: [\n `Tool: ${aiTool.displayName}`,\n `Stack: ${target.label}`,\n `Mode: ${goal.label}`,\n `File: ${relPath}`,\n ],\n footer: 'enter finish · checkbox toggles copy · mouse hover/click',\n }\n );\n\n if (action === 'toggle-copy') {\n copyPrompt = !copyPrompt;\n continue;\n }\n\n return copyPrompt;\n }\n}\n\nfunction checkboxLabel(checked: boolean): string {\n return checked ? ui.success('☑') : ui.muted('☐');\n}\n\nfunction printConvertPanel(exporter: ExporterContext): void {\n const w = maxWidth();\n const inner = w - 4;\n const rows = [\n centerText(`${ui.text.bold('AI Convert')} ${ui.error('BETA')}`, inner),\n centerText(ui.muted('Generate a conversion prompt after the export.'), inner),\n centerText(`${buttonLabel('Convert')} ${ui.muted('or')} ${buttonLabel('Skip')}`, inner),\n centerText(ui.muted(path.basename(exporter.outDir)), inner),\n ];\n\n console.log('');\n console.log(boxTop(w));\n for (const row of rows) console.log(boxLine(w, row));\n console.log(boxBot(w));\n console.log('');\n}\n\nfunction printAssistantModal(title: string, lines: string[]): void {\n const w = maxWidth();\n const inner = w - 4;\n\n console.log('');\n console.log(boxTop(w));\n console.log(boxLine(w, centerText(`${ui.primary('◆')} ${title}`, inner)));\n console.log(boxSep(w));\n for (const line of lines) {\n console.log(boxLine(w, centerText(ui.muted(line), inner)));\n }\n console.log(boxBot(w));\n console.log('');\n}\n\nfunction buildConversionPrompt(\n target: ConversionTarget,\n aiTool: AiTool,\n goal: ConversionGoal,\n facts: ExportFacts\n): string {\n const rootEntries = facts.rootEntries.length\n ? facts.rootEntries.join(', ')\n : 'No root entries detected';\n const exportDir = quoteForPrompt(facts.outputDir);\n const projectDir = quoteForPrompt(path.join(facts.outputDir, target.projectDir));\n const scaffoldCommand = `cd ${exportDir}; ${target.scaffold}`;\n const sourceAssets = quoteForPrompt(path.join(facts.outputDir, 'assets', '*'));\n const destinationAssets = quoteForPrompt(\n path.join(facts.outputDir, target.projectDir, target.staticDir, 'assets')\n );\n const windowsAssetCopyCommand = `New-Item -ItemType Directory -Force -Path ${destinationAssets}; Copy-Item -Path ${sourceAssets} -Destination ${destinationAssets} -Recurse -Force`;\n const unixSourceAssets = quoteForPrompt(toPosixPath(path.join(facts.outputDir, 'assets')));\n const unixDestinationParent = quoteForPrompt(\n toPosixPath(path.join(facts.outputDir, target.projectDir, target.staticDir))\n );\n const unixAssetCopyCommand = `mkdir -p ${unixDestinationParent} && cp -R ${unixSourceAssets} ${unixDestinationParent}/assets`;\n const directoryLines = IMPORTANT_DIRS.map(\n (dir) => `Inspect ${dir}: ${facts.counts[dir]} item(s) detected in the export.`\n );\n const promptLines = [\n `You are ${aiTool.agentName} working inside a local export created by Framer Export.`,\n 'This brief was generated by the Framer Export AI Prompt Assistant BETA.',\n 'Treat this beta prompt as a strict conversion checklist, not as permission to skip inspection.',\n 'Your mission is to convert this exported static mirror into a clean production project.',\n `Target stack: ${target.stack}.`,\n `Selected AI coding tool: ${aiTool.displayName}.`,\n `Selected conversion situation: ${goal.label}.`,\n `Primary instruction for this situation: ${goal.instruction}`,\n `Main priority: ${goal.priority}`,\n `Source URL from the real export: ${facts.sourceUrl}`,\n `Detected platform from the real export: ${facts.platformName}`,\n `Export folder to inspect first: ${facts.outputDir}`,\n `Root entries actually present: ${rootEntries}`,\n `Create the converted project in: ${projectDir}`,\n `Recommended scaffold command: ${scaffoldCommand}`,\n `Expected important target files: ${target.entryFiles}`,\n `Routing guidance: ${target.routing}`,\n `Static assets destination for this stack: ${target.staticDir}/assets inside the converted project.`,\n `PowerShell command to copy exported assets after scaffolding: ${windowsAssetCopyCommand}`,\n `macOS/Linux command to copy exported assets after scaffolding: ${unixAssetCopyCommand}`,\n 'Run the asset copy command; do not recreate, redownload, rename randomly, or replace real exported assets with placeholders.',\n 'After copying assets, update every image, video, font, CSS url(), and script reference to the new local asset path.',\n 'Do not rush. Take time to inspect the export before writing the final implementation.',\n 'Do not invent brand names, copy, images, links, animations, colors, or sections.',\n 'Use only real information found in index.html, CSS files, JavaScript files, data files, and assets.',\n 'If a detail is missing, inspect more files instead of guessing.',\n 'If a vendor script is minified or hard to understand, identify what behavior it provides before replacing it.',\n 'Keep the final result professional, clean, responsive, and maintainable.',\n 'Do not simplify the site because a section, animation, page, or layout is difficult.',\n 'If something is hard, break it into smaller components and keep working until the result matches closely.',\n 'For every exported page, aim for the closest possible pixel-perfect result: spacing, typography, images, viewport behavior, and motion.',\n 'Do not merge multiple pages into one generic page unless the export proves they are duplicate routes.',\n 'Do not replace complex exported sections with summaries, cards, screenshots, or placeholder blocks.',\n 'If a page has visual depth, overlapping layers, sticky sections, galleries, or scroll effects, recreate those behaviors instead of flattening them.',\n 'Start by listing the files and directories that matter for the conversion.',\n ...directoryLines,\n 'Read index.html fully enough to understand page structure, metadata, linked assets, and scripts.',\n 'Read the CSS files that define layout, typography, responsive rules, and visual details.',\n 'Inspect scripts/vendor only to understand required interactions; do not blindly copy huge vendor bundles.',\n 'Inspect scripts/modules for page-specific logic, animations, sliders, menus, and dynamic behavior.',\n 'Inspect data files for CMS-like content, page data, configuration, or serialized props.',\n 'Inspect assets/images and preserve the real image files that are actually used.',\n 'Inspect assets/fonts and preserve font loading if the design depends on custom fonts.',\n 'Inspect subpages if it contains exported pages; map them to routes only when they represent real pages.',\n 'If subpages contains pages, convert each meaningful page with its own route and page component.',\n 'For each converted page, compare against the original exported HTML route and adjust until it is visually close.',\n 'Create a clean project structure instead of dumping everything into one component.',\n 'Separate global layout, page sections, shared components, data helpers, and styles.',\n 'Use semantic HTML for headings, navigation, buttons, forms, sections, and footer content.',\n 'Preserve the original hierarchy of visible content unless there is a clear bug to fix.',\n 'Preserve real URLs and links, but convert local asset paths to the new project structure.',\n 'Move static assets into the target framework public/static asset location when appropriate.',\n 'Do not keep broken CDN references if a local exported asset already exists.',\n 'Do not hardcode absolute machine paths into source files; use framework-relative public asset paths after copying.',\n 'Keep original filenames when possible so CSS and content references remain traceable.',\n 'Do not leave unused analytics, editor badges, platform badges, or export-only scripts in the new app.',\n 'Replace platform-specific runtime code with native framework components when possible.',\n 'Keep interactions that users can see: menus, hover states, forms, sliders, animations, and scroll effects.',\n 'If an interaction is too complex, implement a clean equivalent and document the difference briefly.',\n 'Keep responsive behavior for desktop, tablet, and mobile.',\n 'Check layout at small widths and avoid fixed desktop-only dimensions unless the original requires them.',\n 'Use CSS variables or a clear theme file for colors, spacing, radius, shadows, and typography.',\n 'Name components after their role: Hero, Header, FeatureGrid, Gallery, Pricing, Footer, and similar real sections.',\n 'Avoid generic placeholder components if the exported site has specific section meaning.',\n 'Use TypeScript types where they make the content or component props clearer.',\n 'Do not add unnecessary libraries unless they replace a real exported behavior cleanly.',\n 'If you add a library, explain why it is needed and where it is used.',\n 'Keep package.json scripts standard: dev, build, preview, lint when available.',\n 'Keep the build reproducible from a fresh install.',\n 'After implementing, run the install/build/typecheck commands available for the target project.',\n 'Fix any build errors instead of leaving TODOs.',\n 'Open the generated app locally if possible and compare against the exported index.html visually.',\n 'When there are subpages, compare every generated route against its matching exported file.',\n 'Verify that every visible image loads from the new project.',\n 'Verify that font rendering is close to the export.',\n 'Verify that navigation and internal links work.',\n 'Verify that responsive breakpoints do not overlap or hide important content.',\n 'Verify that there are no console errors caused by missing assets or copied platform scripts.',\n 'Keep accessibility basics: alt text when inferable, keyboard-reachable controls, visible focus states.',\n 'Keep SEO basics: title, meta description if present, canonical only if it is correct, Open Graph when present.',\n 'Do not fabricate SEO copy; reuse existing metadata or ask for missing copy if necessary.',\n 'Commit to a small number of high-quality files rather than many noisy fragments.',\n 'If a section repeats, extract a reusable component and data array.',\n 'If a section is unique, keep it simple and local to the page.',\n 'Document important migration decisions in a short README inside the converted project.',\n 'The README must mention the source export folder, target stack, setup command, and known limitations.',\n 'Do not delete the original export folder.',\n 'Do not modify unrelated files outside the new converted project unless required for setup.',\n 'If the worktree has existing changes, avoid reverting or overwriting them.',\n 'Before large edits, inspect first and explain the conversion plan briefly.',\n 'Then implement the conversion step by step until the app builds.',\n 'Final answer must summarize what was converted, where the new project lives, and which checks passed.',\n 'If something could not be converted, state the exact file or behavior and the reason.',\n 'Quality bar: the result should feel like a real hand-built production app, not an automated scrape or simplified demo.',\n ];\n\n return [\n `# ${aiTool.displayName} Conversion Prompt - ${target.label}`,\n '',\n 'Status: BETA assistant output. Review the export carefully and follow the real files.',\n `Generated from real export: ${facts.outputDir}`,\n `AI tool: ${aiTool.displayName}`,\n `Target: ${target.label}`,\n `Situation: ${goal.label}`,\n '',\n promptLines.map((line, index) => `${String(index + 1).padStart(2, '0')}. ${line}`).join('\\n'),\n '',\n ].join('\\n');\n}\n\nfunction quoteForPrompt(value: string): string {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction toPosixPath(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nasync function copyToClipboard(text: string): Promise<void> {\n const commands =\n process.platform === 'win32'\n ? [{ command: 'clip', args: [] }]\n : process.platform === 'darwin'\n ? [{ command: 'pbcopy', args: [] }]\n : [\n { command: 'wl-copy', args: [] },\n { command: 'xclip', args: ['-selection', 'clipboard'] },\n { command: 'xsel', args: ['--clipboard', '--input'] },\n ];\n\n let lastError: Error | null = null;\n for (const item of commands) {\n try {\n await pipeToCommand(item.command, item.args, text);\n return;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n throw lastError || new Error('No clipboard command found');\n}\n\nfunction pipeToCommand(command: string, args: string[], input: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: ['pipe', 'ignore', 'pipe'] });\n let stderr = '';\n let settled = false;\n\n const finish = (error?: Error): void => {\n if (settled) return;\n settled = true;\n if (error) reject(error);\n else resolve();\n };\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.on('error', finish);\n child.on('close', (code) => {\n if (code === 0) {\n finish();\n } else {\n finish(new Error(`${command} exited with ${code}${stderr ? `: ${stderr.trim()}` : ''}`));\n }\n });\n child.stdin?.end(input);\n });\n}\n\nfunction printPromptResult(\n promptPath: string,\n target: ConversionTarget,\n aiTool: AiTool,\n goal: ConversionGoal\n): void {\n const w = maxWidth();\n const isSmall = w < 50;\n const inner = w - 4;\n const relPath = path.relative(process.cwd(), promptPath) || promptPath;\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(\n boxLine(\n w,\n centerText(\n `${ui.success('✓')} ${ui.text.bold('AI Prompt Ready')} ${ui.error('BETA')}`,\n inner\n )\n )\n );\n console.log(boxSep(w));\n console.log(\n boxLine(w, centerText(`${ui.muted('Tool')} ${ui.primary(aiTool.displayName)}`, inner))\n );\n console.log(boxLine(w, centerText(`${ui.muted('Stack')} ${ui.primary(target.label)}`, inner)));\n console.log(boxLine(w, centerText(`${ui.muted('Mode')} ${ui.primary(goal.label)}`, inner)));\n console.log(boxLine(w, centerText(`${ui.muted('File')} ${ui.primary(relPath)}`, inner)));\n console.log(boxSep(w));\n console.log(\n boxLine(w, centerText(`${buttonLabel('Copy prompt')} ${buttonLabel('Done')}`, inner))\n );\n console.log(boxBot(w));\n } else {\n console.log(ui.text.bold(' AI Prompt Ready - BETA'));\n console.log(` Tool: ${ui.primary(aiTool.displayName)}`);\n console.log(` Stack: ${ui.primary(target.label)}`);\n console.log(` Situation: ${ui.primary(goal.label)}`);\n console.log(` File: ${ui.primary(relPath)}`);\n }\n console.log('');\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\nimport type { Browser, Page } from 'puppeteer';\nimport { AssetMap } from '../assets/asset-map.js';\nimport { dlBuffer } from '../network/download.js';\nimport { info, log, success, setCooking } from '../logger/index.js';\nimport { launchAndCapture, captureSubpage, closeBrowser } from './capture.js';\nimport { downloadAll } from './download.js';\nimport { buildOutput } from './output.js';\nimport { printSummary } from './summary.js';\nimport { runAiPromptAssistant } from '../ai/prompt-assistant.js';\nimport { detectPlatform, getPlatformByName } from '../platforms/index.js';\nimport type { PlatformHandler, PlatformType } from '../platforms/types.js';\nimport type { ExporterContext } from '../types.js';\nimport { CookingSpinner } from '../cli/cooking.js';\nimport { chip, ui } from '../cli/theme.js';\n\nexport function deriveOutputName(url: string, platformName: PlatformType): string {\n try {\n const parsed = new URL(url);\n const hostname: string = parsed.hostname;\n\n let siteName: string;\n if (hostname.endsWith('.webflow.io')) {\n siteName = hostname.replace('.webflow.io', '');\n } else if (hostname.includes('.wixsite.com')) {\n const parts: string[] = parsed.pathname.split('/').filter(Boolean);\n siteName = parts[0] || hostname.split('.')[0];\n } else if (hostname.match(/\\.framer\\.(app|website|ai)$/)) {\n siteName = hostname.split('.framer.')[0];\n } else {\n siteName = hostname.replace(/\\./g, '-');\n }\n\n const cleanName =\n siteName\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '') || 'site';\n\n return `${platformName}-${cleanName}-${randomOutputSuffix()}`;\n } catch {\n return `framer-export-output-${randomOutputSuffix()}`;\n }\n}\n\nfunction randomOutputSuffix(): string {\n const adjectives = ['clean', 'bright', 'swift', 'sharp', 'fresh', 'solid', 'tidy', 'prime'];\n const nouns = ['mirror', 'export', 'site', 'build', 'copy', 'page', 'stack', 'bundle'];\n const adjective = adjectives[Math.floor(Math.random() * adjectives.length)];\n const noun = nouns[Math.floor(Math.random() * nouns.length)];\n const id = Math.random().toString(36).slice(2, 6);\n return `${adjective}-${noun}-${id}`;\n}\n\nexport class FramerExporter implements ExporterContext {\n siteUrl: string;\n outDir: string;\n assets: AssetMap;\n browser: Browser | null;\n page: Page | null;\n ssrHTML: string;\n prettyPrint: boolean;\n platform: PlatformHandler;\n cooking?: CookingSpinner;\n\n constructor(siteUrl: string, outDir: string, platformOverride?: PlatformType) {\n this.siteUrl = siteUrl;\n this.outDir = outDir;\n this.assets = new AssetMap();\n this.browser = null;\n this.page = null;\n this.ssrHTML = '';\n this.prettyPrint = true;\n\n if (platformOverride && platformOverride !== 'unknown') {\n this.platform = getPlatformByName(platformOverride);\n } else {\n this.platform = detectPlatform(siteUrl);\n }\n }\n\n async run(includeSubpages: boolean = false): Promise<void> {\n console.log(\n `\\n ${ui.text.bold('Framer Export')} ${chip('mirror')} ${ui.muted('v4 pipeline')}\\n`\n );\n info('Source : ' + chalk.underline(this.siteUrl));\n info('Output : ' + ui.primary(this.outDir));\n info('Platform : ' + ui.primary(this.platform.displayName));\n if (includeSubpages) {\n info('Subpages : ' + ui.success('enabled'));\n }\n console.log('');\n\n this.cooking = new CookingSpinner();\n setCooking(this.cooking);\n this.cooking.start('Preparing directories...');\n\n for (const d of [\n '',\n 'assets/images',\n 'assets/fonts',\n 'assets/videos',\n 'assets/misc',\n 'styles',\n 'scripts/vendor',\n 'scripts/modules',\n 'data',\n 'subpages',\n ]) {\n await fs.mkdir(path.join(this.outDir, d), { recursive: true });\n }\n log('Output directory structure created');\n\n this.cooking.update('Fetching SSR HTML...');\n log('Fetching SSR HTML from ' + this.siteUrl);\n try {\n const buf: Buffer = await dlBuffer(this.siteUrl);\n this.ssrHTML = buf.toString('utf-8');\n success('SSR HTML fetched (' + (this.ssrHTML.length / 1024).toFixed(1) + ' KB)');\n } catch (e) {\n log(chalk.red('Could not fetch SSR HTML: ' + (e as Error).message));\n }\n\n const htmlDetected = detectPlatform(this.siteUrl, this.ssrHTML);\n if (htmlDetected.name !== this.platform.name) {\n this.platform = htmlDetected;\n log('Platform refined: ' + ui.primary(this.platform.displayName) + ' (from HTML analysis)');\n }\n\n await launchAndCapture(this);\n\n if (includeSubpages && this.page) {\n await this.crawlSubpages();\n }\n\n await closeBrowser(this);\n\n this.cooking.update('Downloading assets...');\n await downloadAll(this);\n\n this.cooking.update('Building output...');\n await buildOutput(this);\n\n this.cooking.stop();\n setCooking(null);\n\n console.log('');\n success('Export complete!');\n await printSummary(this);\n await runAiPromptAssistant(this);\n }\n\n private async crawlSubpages(): Promise<void> {\n this.cooking?.update('Discovering sub-pages...');\n log('Scanning page for internal links...');\n\n const page = this.page!;\n const baseUrl = new URL(this.siteUrl);\n const baseHost = baseUrl.hostname.replace(/^www\\./, '');\n\n const links: string[] = await page.evaluate((host: string) => {\n const anchors = Array.from(document.querySelectorAll('a[href]'));\n const hrefs = new Set<string>();\n for (const a of anchors) {\n const href = (a as HTMLAnchorElement).href;\n if (\n !href ||\n href.startsWith('javascript:') ||\n href.startsWith('mailto:') ||\n href.startsWith('tel:') ||\n href.startsWith('#')\n )\n continue;\n try {\n const u = new URL(href);\n const h = u.hostname.replace(/^www\\./, '');\n if (\n h === host &&\n u.pathname !== '/' &&\n u.pathname !== '' &&\n !u.pathname.startsWith('/#')\n ) {\n hrefs.add(href.split('#')[0]);\n }\n } catch {}\n }\n return Array.from(hrefs);\n }, baseHost);\n\n log('Found ' + links.length + ' sub-page links');\n const uniqueLinks = [...new Set(links)].slice(0, 50);\n\n if (uniqueLinks.length === 0) {\n log('No sub-pages to crawl');\n return;\n }\n\n for (let i = 0; i < uniqueLinks.length; i++) {\n const link = uniqueLinks[i];\n this.cooking?.update('Crawling sub-page ' + (i + 1) + '/' + uniqueLinks.length);\n try {\n const html = await captureSubpage(page, link, {\n needsHydrationCheck: this.platform.needsHydrationCheck,\n hydrationTimeout: this.platform.hydrationTimeout,\n });\n\n const slug = this.deriveSlug(link, baseUrl);\n const filename = slug + '.html';\n const filepath = path.join(this.outDir, 'subpages', filename);\n\n await fs.writeFile(filepath, html, 'utf-8');\n log(' Saved: subpages/' + filename);\n } catch (e) {\n log(' Skipped ' + link + ': ' + (e as Error).message);\n }\n }\n\n success('Sub-pages crawled: ' + uniqueLinks.length);\n }\n\n private deriveSlug(link: string, baseUrl: URL): string {\n try {\n const u = new URL(link);\n let pathname = u.pathname.replace(/\\/+$/, '').replace(/^\\//, '');\n if (!pathname) return 'index';\n return pathname.replace(/[^a-zA-Z0-9_-]/g, '_').replace(/_+/g, '_') || 'page';\n } catch {\n return 'page';\n }\n }\n}\n","import readline from 'node:readline/promises';\nimport { stdin, stdout } from 'node:process';\nimport path from 'node:path';\nimport { URL } from 'node:url';\nimport chalk from 'chalk';\nimport { showBanner } from './banner.js';\nimport { FramerExporter, deriveOutputName } from '../exporter/index.js';\nimport { detectPlatform } from '../platforms/index.js';\nimport { promptInput, select } from './select.js';\nimport type { PlatformType } from '../platforms/types.js';\nimport { boxTop, boxLine, boxSep, boxBot, boxRow, maxWidth } from './box.js';\nimport { bullet, chip, ui } from './theme.js';\n\nfunction drawHeader(title: string): void {\n const w = maxWidth();\n if (w < 50) {\n console.log(`\\n ${bullet('●')} ${ui.text.bold(title)}`);\n return;\n }\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' ' + title)));\n console.log(boxBot(w));\n console.log('');\n}\n\nexport async function runSetup(legacyMode: boolean = false): Promise<void> {\n showBanner();\n\n console.log(` ${ui.text.bold('Framer Export setup')} ${chip('interactive')}`);\n console.log(\n ` ${ui.muted('Export Framer, Webflow, and Wix sites into a clean local mirror.')}\\n`\n );\n\n const rl = legacyMode ? readline.createInterface({ input: stdin, output: stdout }) : null;\n\n const ask = async (\n question: string,\n defaultVal?: string,\n headerLines: string[] = []\n ): Promise<string> => {\n if (!legacyMode) {\n return promptInput(question, defaultVal || '', { headerLines });\n }\n\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${ui.primary('●')} ${ui.text.bold(question)}${suffix} ${ui.muted('>')} `;\n const answer: string = await rl!.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n if (legacyMode) drawHeader('Step 1 : Site URL');\n\n let siteUrl = '';\n let urlError = '';\n while (!siteUrl) {\n const input: string = await ask(\n 'Enter the site URL',\n '',\n ['Step 1 : Site URL', urlError].filter(Boolean)\n );\n try {\n new URL(input);\n siteUrl = input;\n urlError = '';\n } catch {\n urlError = 'Invalid URL. Enter a valid URL (https://...)';\n if (legacyMode) {\n console.log(` ${ui.error('✗')} ${ui.error(urlError)}\\n`);\n }\n }\n }\n if (legacyMode) {\n console.log(` ${ui.success('✓')} ${ui.success('URL:')} ${chalk.underline(siteUrl)}\\n`);\n }\n\n let platformName: PlatformType | null = null;\n\n if (legacyMode) {\n drawHeader('Step 2 : Platform');\n const detected = detectPlatform(siteUrl);\n console.log(` ${ui.info('i')} Auto-detected: ${ui.primary(detected.displayName)}`);\n const platformInput: string = await ask('Platform (framer/webflow/wix)', detected.name);\n platformName = (\n ['framer', 'webflow', 'wix'].includes(platformInput) ? platformInput : detected.name\n ) as PlatformType;\n console.log(` ${ui.success('✓')} ${ui.success('Platform:')} ${ui.primary(platformName)}\\n`);\n } else {\n while (!platformName) {\n const detected = detectPlatform(siteUrl);\n const platforms = [\n {\n label: `Framer${detected.name === 'framer' ? chalk.gray(' (detected)') : ''}`,\n value: 'framer',\n },\n {\n label: `Webflow${detected.name === 'webflow' ? chalk.gray(' (detected)') : ''}`,\n value: 'webflow',\n },\n { label: `Wix${detected.name === 'wix' ? chalk.gray(' (detected)') : ''}`, value: 'wix' },\n ];\n const defaultIdx = ['framer', 'webflow', 'wix'].indexOf(detected.name);\n const platformChoice = await select('Select platform', platforms, Math.max(0, defaultIdx), {\n headerLines: [`URL: ${siteUrl}`],\n actions: [{ label: 'Modify URL', value: 'modify-url' }],\n footer: 'tab focus button · mouse hover/click · enter select',\n });\n\n if (platformChoice === 'modify-url') {\n siteUrl = '';\n urlError = '';\n while (!siteUrl) {\n const input = await ask(\n 'Modify site URL',\n '',\n ['Step 1 : Site URL', urlError].filter(Boolean)\n );\n try {\n new URL(input);\n siteUrl = input;\n urlError = '';\n } catch {\n urlError = 'Invalid URL. Enter a valid URL (https://...)';\n }\n }\n continue;\n }\n\n platformName = platformChoice as PlatformType;\n }\n }\n\n if (!platformName) {\n throw new Error('Platform selection failed');\n }\n\n const rl2 = legacyMode ? rl! : null;\n\n const ask2 = async (\n question: string,\n defaultVal?: string,\n headerLines: string[] = []\n ): Promise<string> => {\n if (!legacyMode) {\n return promptInput(question, defaultVal || '', { headerLines });\n }\n\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${ui.primary('●')} ${ui.text.bold(question)}${suffix} ${ui.muted('>')} `;\n const answer: string = await rl2!.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n const derivedName: string = deriveOutputName(siteUrl, platformName);\n\n if (legacyMode) drawHeader('Step 3 : Output Directory');\n\n const outDir: string = await ask2('Output directory', './' + derivedName, [\n 'Step 3 : Output Directory',\n `URL: ${siteUrl}`,\n `Platform: ${platformName}`,\n ]);\n if (legacyMode) {\n console.log(` ${ui.success('✓')} ${ui.success('Output:')} ${ui.primary(outDir)}\\n`);\n }\n\n if (legacyMode) drawHeader('Step 4 : Options');\n\n let prettyPrint: boolean;\n let concurrency: number;\n let includeSubpages: boolean;\n\n if (legacyMode) {\n const prettyAnswer: string = await ask2('Pretty-print JS files? (y/n)', 'y');\n prettyPrint = prettyAnswer.toLowerCase().startsWith('y');\n console.log(\n ` ${ui.success('✓')} Pretty-print: ${prettyPrint ? ui.success('yes') : ui.error('no')}\\n`\n );\n\n const subpagesAnswer: string = await ask2('Export sub-pages? (y/n)', 'n');\n includeSubpages = subpagesAnswer.toLowerCase().startsWith('y');\n console.log(\n ` ${ui.success('✓')} Sub-pages: ${includeSubpages ? ui.success('yes') : ui.error('no')}\\n`\n );\n\n const concurrencyAnswer: string = await ask2('Download concurrency', '12');\n concurrency = parseInt(concurrencyAnswer, 10) || 12;\n console.log(` ${ui.success('✓')} Concurrency: ${ui.primary(String(concurrency))}\\n`);\n } else {\n const prettyVal = await select('Pretty-print JS files?', [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ]);\n prettyPrint = prettyVal === 'yes';\n\n const subpagesVal = await select(\n 'Export sub-pages?',\n [\n { label: 'No', value: 'no' },\n { label: 'Yes, crawl and export', value: 'yes' },\n ],\n 0\n );\n includeSubpages = subpagesVal === 'yes';\n\n const concurrencyVal = await select(\n 'Download concurrency',\n [\n { label: '6 (slow connection)', value: '6' },\n { label: '12 (default)', value: '12' },\n { label: '20 (fast connection)', value: '20' },\n ],\n 1\n );\n concurrency = parseInt(concurrencyVal, 10);\n }\n\n const w = maxWidth();\n const isSmall = w < 50;\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' Summary')));\n console.log(boxSep(w));\n } else {\n console.log(ui.text.bold(' Summary:'));\n }\n\n for (const [label, value] of [\n ['URL', siteUrl],\n ['Platform', platformName],\n ['Output', path.resolve(outDir)],\n ['Pretty-print', prettyPrint ? 'yes' : 'no'],\n ['Sub-pages', includeSubpages ? 'yes' : 'no'],\n ['Concurrency', String(concurrency)],\n ]) {\n console.log(boxRow(w, label, value));\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n console.log('');\n\n let startExport: boolean;\n\n if (legacyMode) {\n const confirm: string = await ask2('Start export? (y/n)', 'y');\n startExport = confirm.toLowerCase().startsWith('y');\n rl2!.close();\n } else {\n const confirmVal = await select('Start export?', [\n { label: 'Yes, start now', value: 'yes' },\n { label: 'Cancel', value: 'no' },\n ]);\n startExport = confirmVal === 'yes';\n }\n\n if (!startExport) {\n console.log(`\\n ${ui.warning('Export cancelled.')}\\n`);\n return;\n }\n\n console.log('');\n\n const { CFG } = await import('../config/index.js');\n CFG.concurrency = concurrency;\n\n const exporter = new FramerExporter(siteUrl, path.resolve(outDir), platformName);\n exporter.prettyPrint = prettyPrint;\n await exporter.run(includeSubpages);\n}\n","import path from 'path';\nimport { URL } from 'url';\nimport { spawnSync } from 'child_process';\nimport pkg from '../../package.json';\nimport { showHelp } from './help.js';\nimport { showBanner } from './banner.js';\nimport { showLoadingIntro } from './cooking.js';\nimport { checkForUpdates } from './update-check.js';\nimport { select } from './select.js';\nimport { ui } from './theme.js';\nimport type { PlatformType } from '../platforms/types.js';\n\nconst VERSION = pkg.version;\n\nfunction extractFlag(args: string[], flag: string): string | null {\n const idx: number = args.indexOf(flag);\n if (idx === -1 || idx + 1 >= args.length) return null;\n const value: string = args[idx + 1];\n args.splice(idx, 2);\n return value;\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n const idx: number = args.indexOf(flag);\n if (idx === -1) return false;\n args.splice(idx, 1);\n return true;\n}\n\nasync function showUpdateNotice(): Promise<void> {\n const latest = await checkForUpdates(VERSION);\n if (!latest) return;\n\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.log('');\n console.log(\n ` ${ui.warning('↳')} Update available: ${ui.muted(VERSION)} -> ${ui.success(latest)}`\n );\n console.log(` ${ui.primary(' Run:')} ${ui.primarySoft('npm i -g framer-export@latest')}`);\n console.log('');\n return;\n }\n\n const action = await select(\n 'Update available',\n [\n { label: 'Continue without updating', value: 'continue' },\n { label: 'Update now', value: 'update' },\n ],\n 0,\n {\n headerLines: [\n `Current version: ${VERSION}`,\n `Latest version: ${latest}`,\n 'You can continue now and update later.',\n ],\n footer: 'enter continue · mouse hover/click',\n }\n );\n\n if (action === 'update') {\n console.log(\n ` ${ui.primary('Updating:')} ${ui.primarySoft('npm i -g framer-export@latest')}\\n`\n );\n const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';\n const result = spawnSync(npmCommand, ['i', '-g', 'framer-export@latest'], {\n stdio: 'inherit',\n });\n\n if (result.status === 0) {\n console.log(`\\n ${ui.success('✓')} Updated. Re-run your command to use the new version.\\n`);\n process.exit(0);\n }\n\n console.log(\n `\\n ${ui.error('✗')} Update failed. Run manually: ${ui.primarySoft('npm i -g framer-export@latest')}\\n`\n );\n }\n}\n\nasync function main(): Promise<void> {\n const args: string[] = process.argv.slice(2);\n\n if (args.includes('--version') || args.includes('-v')) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (args.includes('--about')) {\n const chalk = (await import('chalk')).default;\n showBanner();\n console.log(` ${ui.text.bold('Framer Export')} ${ui.muted(`v${pkg.version}`)}`);\n console.log(` ${ui.text(pkg.description)}\\n`);\n console.log(` ${ui.text.bold('Author')} ${ui.primary('Dany (danbenba)')}`);\n console.log(\n ` ${ui.text.bold('Portfolio')} ${chalk.underline.hex('#FAB283')('https://github.com/danbenba')}`\n );\n console.log(\n ` ${ui.text.bold('GitHub')} ${chalk.underline.hex('#FAB283')(pkg.repository.url.replace('git+', '').replace('.git', ''))}`\n );\n console.log(\n ` ${ui.text.bold('npm')} ${chalk.underline.hex('#FAB283')(`https://www.npmjs.com/package/${pkg.name}`)}`\n );\n console.log(` ${ui.text.bold('License')} ${ui.success(pkg.license)}`);\n console.log(` ${ui.text.bold('Node')} ${ui.muted(`>=${pkg.engines.node}`)}`);\n console.log('');\n process.exit(0);\n }\n\n if (args.includes('--help') || args.includes('-h')) {\n showHelp();\n process.exit(0);\n }\n\n await showLoadingIntro(VERSION);\n await showUpdateNotice();\n\n if (args.includes('--setup')) {\n hasFlag(args, '--setup');\n const legacyMode: boolean = hasFlag(args, '--legacy-mode');\n const { runSetup } = await import('./setup.js');\n await runSetup(legacyMode);\n return;\n }\n\n if (!args.length) {\n const { runSetup } = await import('./setup.js');\n await runSetup(false);\n return;\n }\n\n const platformOverride = extractFlag(args, '--platform') as PlatformType | null;\n const includeSubpages: boolean = hasFlag(args, '--subpages');\n\n showBanner();\n\n const url: string = args[0];\n\n try {\n new URL(url);\n } catch {\n console.log(` ${ui.error('✗')} ${ui.error.bold('Invalid URL:')} ${ui.text(url)}`);\n console.log(` ${ui.muted('Expected: https://yoursite.framer.app')}\\n`);\n process.exit(1);\n }\n\n const { FramerExporter, deriveOutputName } = await import('../exporter/index.js');\n const { detectPlatform } = await import('../platforms/index.js');\n\n const detected = platformOverride || detectPlatform(url).name;\n const defaultDir: string = deriveOutputName(url, detected as PlatformType);\n const out: string = args[1] || `./${defaultDir}`;\n\n try {\n await new FramerExporter(url, path.resolve(out), platformOverride || undefined).run(\n includeSubpages\n );\n } catch (e) {\n const chalk = (await import('chalk')).default;\n console.log(\n `\\n ${ui.error('✗')} ${ui.error.bold('FAILED:')} ${ui.text((e as Error).message)}`\n );\n console.log(chalk.gray((e as Error).stack || ''));\n process.exit(1);\n }\n}\n\nmain();\n","import { showBanner } from './banner.js';\nimport { chip, ui } from './theme.js';\n\nexport function showHelp(): void {\n showBanner();\n\n console.log(`${ui.text.bold(' USAGE')} ${chip('cli')}\\n`);\n console.log(\n ` ${ui.primary('framer-export')} ${ui.warning('<url>')} ${ui.muted('[output-dir]')}`\n );\n console.log(\n ` ${ui.primary('fexport')} ${ui.warning('<url>')} ${ui.muted('[output-dir]')}`\n );\n\n console.log('');\n console.log(ui.text.bold(' OPTIONS\\n'));\n\n const opts: Array<[string, string]> = [\n ['--setup', 'Launch the interactive setup assistant'],\n ['--platform <p>', 'Force platform: framer, webflow, wix'],\n ['--subpages', 'Crawl and export sub-pages'],\n ['--legacy-mode', 'Use text input instead of arrow selection'],\n ['--help, -h', 'Show this help message'],\n ];\n\n for (const [flag, desc] of opts) {\n console.log(` ${ui.success(flag.padEnd(18))} ${ui.text(desc)}`);\n }\n\n console.log('');\n console.log(ui.text.bold(' SUPPORTED PLATFORMS\\n'));\n\n const platforms: Array<[string, string]> = [\n ['Framer', 'Auto-detected via .framer.app / .framer.website URLs'],\n ['Webflow', 'Auto-detected via .webflow.io URLs'],\n ['Wix', 'Auto-detected via .wixsite.com URLs + HTML analysis'],\n ];\n\n for (const [name, desc] of platforms) {\n console.log(` ${ui.primary(name.padEnd(12))} ${ui.muted(desc)}`);\n }\n\n console.log('');\n console.log(ui.text.bold(' EXAMPLES\\n'));\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://mysite.framer.app')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://mysite.webflow.io')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://user.wixsite.com/my-site')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--platform webflow')} ${ui.warning('https://custom.com')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--subpages')} ${ui.warning('https://mysite.com')}`\n );\n console.log(` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--setup')}`);\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--setup --legacy-mode')}`\n );\n console.log('');\n}\n","import https from 'https';\n\nexport async function checkForUpdates(currentVersion: string): Promise<string | null> {\n return new Promise((resolve) => {\n const req = https.get(\n 'https://registry.npmjs.org/framer-export/latest',\n { timeout: 3000 },\n (res) => {\n let data = '';\n res.on('data', (chunk) => (data += chunk));\n res.on('end', () => {\n try {\n const json = JSON.parse(data);\n const latest = json.version;\n if (!latest) return resolve(null);\n if (isNewerVersion(latest, currentVersion)) return resolve(latest);\n resolve(null);\n } catch {\n resolve(null);\n }\n });\n }\n );\n req.on('error', () => resolve(null));\n req.on('timeout', () => {\n req.destroy();\n resolve(null);\n });\n });\n}\n\nfunction isNewerVersion(latest: string, current: string): boolean {\n const latestParts = parseVersion(latest);\n const currentParts = parseVersion(current);\n\n for (let i = 0; i < Math.max(latestParts.length, currentParts.length); i++) {\n const latestPart = latestParts[i] ?? 0;\n const currentPart = currentParts[i] ?? 0;\n if (latestPart > currentPart) return true;\n if (latestPart < currentPart) return false;\n }\n\n return false;\n}\n\nfunction parseVersion(version: string): number[] {\n return version\n .replace(/^v/, '')\n .split(/[.-]/)\n .map((part) => Number.parseInt(part, 10))\n .filter((part) => Number.isFinite(part));\n}\n"],"mappings":";;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,MACE,MAAQ;AAAA,MACR,SAAW;AAAA,MACX,aAAe;AAAA,MACf,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,OAAS;AAAA,MACT,KAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,SAAW;AAAA,QACX,cAAgB;AAAA,MAClB;AAAA,MACA,OAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAW;AAAA,QACT,OAAS;AAAA,QACT,KAAO;AAAA,QACP,OAAS;AAAA,QACT,WAAa;AAAA,QACb,QAAU;AAAA,QACV,gBAAkB;AAAA,QAClB,SAAW;AAAA,MACb;AAAA,MACA,UAAY;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,YAAc;AAAA,QACZ,MAAQ;AAAA,QACR,KAAO;AAAA,MACT;AAAA,MACA,UAAY;AAAA,MACZ,MAAQ;AAAA,QACN,KAAO;AAAA,MACT;AAAA,MACA,SAAW;AAAA,MACX,QAAU;AAAA,MACV,SAAW;AAAA,QACT,MAAQ;AAAA,MACV;AAAA,MACA,cAAgB;AAAA,QACd,OAAS;AAAA,QACT,KAAO;AAAA,QACP,UAAY;AAAA,QACZ,WAAa;AAAA,QACb,oBAAoB;AAAA,MACtB;AAAA,MACA,iBAAmB;AAAA,QACjB,eAAe;AAAA,QACf,MAAQ;AAAA,QACR,KAAO;AAAA,QACP,YAAc;AAAA,MAChB;AAAA,IACF;AAAA;AAAA;;;ACjEA,OAAO,WAAW;AAoCX,SAAS,UAAU,GAAmB;AAC3C,SAAO,EAAE,QAAQ,0BAA0B,EAAE;AAC/C;AAEO,SAAS,aAAa,MAAsB;AACjD,QAAM,SAAS,CAAC,MAAM,SAAS,MAAM,aAAa,MAAM,MAAM,MAAM,aAAa,MAAM,OAAO;AAC9F,MAAI,SAAS;AACb,SAAO,KACJ,MAAM,EAAE,EACR,IAAI,CAAC,SAAS;AACb,QAAI,SAAS,IAAK,QAAO;AACzB,UAAM,QAAQ,OAAO,SAAS,OAAO,MAAM;AAC3C;AACA,WAAO,MAAM,IAAI,KAAK,EAAE,KAAK,IAAI;AAAA,EACnC,CAAC,EACA,KAAK,EAAE;AACZ;AAEO,SAAS,KAAK,OAAuB;AAC1C,SAAO,GAAG,GAAG,OAAO,GAAG,CAAC,GAAG,GAAG,QAAQ,KAAK,CAAC,GAAG,GAAG,OAAO,GAAG,CAAC;AAC/D;AAEO,SAAS,OAAO,QAAgB,UAAa;AAClD,SAAO,GAAG,QAAQ,KAAK;AACzB;AAEO,SAAS,WAAW,MAAc,OAAuB;AAC9D,QAAM,UAAU,UAAU,IAAI,EAAE;AAChC,MAAI,WAAW,MAAO,QAAO;AAC7B,QAAM,OAAO,KAAK,OAAO,QAAQ,WAAW,CAAC;AAC7C,SAAO,IAAI,OAAO,IAAI,IAAI,OAAO,IAAI,OAAO,QAAQ,UAAU,IAAI;AACpE;AAEO,SAAS,cAAc,MAAc,KAAqB;AAC/D,MAAI,KAAK,UAAU,IAAK,QAAO;AAC/B,SAAO,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI;AAC/C;AAxEA,IAEa,OAkBA;AApBb;AAAA;AAAA;AAEO,IAAM,QAAQ;AAAA,MACnB,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAEO,IAAM,KAAK;AAAA,MAChB,MAAM,MAAM,IAAI,MAAM,IAAI;AAAA,MAC1B,OAAO,MAAM,IAAI,MAAM,KAAK;AAAA,MAC5B,SAAS,MAAM,IAAI,MAAM,OAAO;AAAA,MAChC,aAAa,MAAM,IAAI,MAAM,WAAW;AAAA,MACxC,WAAW,MAAM,IAAI,MAAM,SAAS;AAAA,MACpC,QAAQ,MAAM,IAAI,MAAM,MAAM;AAAA,MAC9B,SAAS,MAAM,IAAI,MAAM,OAAO;AAAA,MAChC,SAAS,MAAM,IAAI,MAAM,OAAO;AAAA,MAChC,OAAO,MAAM,IAAI,MAAM,KAAK;AAAA,MAC5B,MAAM,MAAM,IAAI,MAAM,IAAI;AAAA,MAC1B,QAAQ,MAAM,IAAI,MAAM,MAAM;AAAA,MAC9B,cAAc,MAAM,IAAI,MAAM,YAAY;AAAA,MAC1C,OAAO,MAAM,IAAI,MAAM,KAAK;AAAA,IAC9B;AAAA;AAAA;;;AC/BA,SAAS,WAAmB;AAC1B,SAAO,QAAQ,OAAO,WAAW;AACnC;AAiBO,SAAS,aAAmB;AACjC,QAAM,QAAQ,SAAS;AACvB,QAAM,UAAU,QAAQ;AAExB,MAAI,SAAS;AACX,YAAQ;AAAA,MACN;AAAA,IAAO,GAAG,QAAQ,KAAK,UAAU,CAAC,IAAI,GAAG,MAAM,IAAI,gBAAI,OAAO,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;AAAA,IACtF;AACA,YAAQ,IAAI,KAAK,GAAG,KAAK,KAAK,eAAe,CAAC,IAAI,GAAG,MAAM,8BAA8B,CAAC;AAAA,CAAI;AAC9F;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AACd,YAAU,QAAQ,CAAC,SAAS;AAC1B,YAAQ,IAAI,OAAO,aAAa,IAAI,CAAC;AAAA,EACvC,CAAC;AACD,UAAQ,IAAI,EAAE;AACd,UAAQ;AAAA,IACN,KAAK,GAAG,MAAM,IAAI,gBAAI,OAAO,EAAE,CAAC,KAAK,GAAG,KAAK,KAAK,eAAe,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,GAAG,MAAM,uBAAuB,CAAC;AAAA,EAC7H;AACA,UAAQ;AAAA,IACN,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,OAAO,MAAG,CAAC,IAAI,GAAG,QAAQ,cAAc,CAAC,IAAI,GAAG,OAAO,MAAG,CAAC,IAAI,GAAG,UAAU,aAAa,CAAC;AAAA;AAAA,EACxM;AACF;AA7CA,IAOM;AAPN;AAAA;AAAA;AAAA;AACA;AAMA,IAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACpBA,OAAOA,YAAW;AAUlB,eAAsB,iBAAiB,SAAgC;AACrE,MAAI,CAAC,QAAQ,OAAO,SAAS,QAAQ,IAAI,GAAI;AAE7C,QAAM,IAAI,QAAc,CAAC,YAAY;AACnC,QAAI,QAAQ;AAEZ,UAAM,OAAO,MAAY;AACvB,YAAM,UAAU,eAAe,QAAQ,eAAe,MAAM;AAC5D,YAAM,QAAQ,gBAAgB,kBAAkB,OAAO,IAAI,OAAO;AAAA,QAChE,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,YAAY;AAAA,MACd,CAAC;AACD,YAAM,OAAO,IAAI,OAAO,QAAQ,CAAC,EAAE,OAAO,GAAG,GAAG;AAChD,cAAQ,OAAO;AAAA,QACb,cAAc,GAAG,QAAQ,OAAO,CAAC,IAAI,KAAK,IAAI,GAAG,MAAM,UAAU,IAAI,EAAE,CAAC;AAAA,MAC1E;AACA;AAAA,IACF;AAEA,YAAQ,OAAO,MAAM,WAAW;AAChC,SAAK;AACL,UAAM,WAAW,YAAY,MAAM,cAAc;AACjD,eAAW,MAAM;AACf,oBAAc,QAAQ;AACtB,cAAQ,OAAO,MAAM,oBAAoB;AACzC,cAAQ;AAAA,IACV,GAAG,cAAc;AAAA,EACnB,CAAC;AACH;AA2DA,SAAS,gBACP,MACA,OACA,UAA4E,CAAC,GACrE;AACR,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,SAAS,KAAK,SAAS,aAAa;AAC1C,QAAM,MAAQ,QAAQ,cAAe,SAAU;AAC/C,QAAM,OAAO,SAAS,SAAS;AAC/B,QAAM,QAAQ,SAAS,UAAU;AAEjC,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,OAAO,KAAK,IAAI,IAAI,GAAG;AAC7B,UAAM,YAAY,WAAW,GAAG,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,UAAU,CAAC;AACrE,UAAM,QAAQ,OAAO,MAAM,OAAO,SAAS;AAC3C,UAAM,QACJ,YAAY,OACRA,OAAM,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,OACrCA,OAAM,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AACzC,cAAU,MAAM,KAAK,CAAC,CAAC;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAe,OAAe,OAAuB;AACvE,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,UAAU,QAAQ,MAAM,CAAC;AACpE,SAAO,IAAI,KAAK,IAAI,IAAI;AAC1B;AAEA,SAAS,SAAS,KAAkD;AAClE,QAAM,QAAQ,IAAI,QAAQ,KAAK,EAAE;AACjC,QAAM,aACJ,MAAM,WAAW,IACb,MACG,MAAM,EAAE,EACR,IAAI,CAAC,SAAS,OAAO,IAAI,EACzB,KAAK,EAAE,IACV,MAAM,OAAO,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC;AAErC,SAAO;AAAA,IACL,GAAG,OAAO,SAAS,WAAW,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC7C,GAAG,OAAO,SAAS,WAAW,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC7C,GAAG,OAAO,SAAS,WAAW,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EAC/C;AACF;AAEA,SAAS,OACP,MACA,IACA,QACqC;AACrC,SAAO;AAAA,IACL,GAAG,KAAK,MAAM,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM;AAAA,IAC/C,GAAG,KAAK,MAAM,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM;AAAA,IAC/C,GAAG,KAAK,MAAM,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM;AAAA,EACjD;AACF;AA7JA,IAGM,aACA,gBACA,gBACA,aAEA,gBAiCO;AAzCb;AAAA;AAAA;AACA;AAEA,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,cAAc;AAEpB,IAAM,iBAAiB,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAiCjE,IAAM,iBAAN,MAAqB;AAAA,MAClB,WAAkC;AAAA,MAClC,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MAEjB,MAAM,QAAgB,IAAU;AAC9B,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,aAAK,SAAS;AACd,aAAK,KAAK;AACV,aAAK,WAAW,YAAY,MAAM;AAChC,eAAK;AACL,eAAK,KAAK;AAAA,QACZ,GAAG,cAAc;AAAA,MACnB;AAAA,MAEA,OAAO,OAAqB;AAC1B,aAAK,QAAQ;AAAA,MACf;AAAA,MAEA,IAAI,SAAuB;AACzB,YAAI,KAAK,QAAQ;AACf,kBAAQ,OAAO,MAAM,WAAW;AAAA,QAClC;AACA,gBAAQ,OAAO,MAAM,UAAU,IAAI;AACnC,YAAI,KAAK,QAAQ;AACf,eAAK,KAAK;AAAA,QACZ;AAAA,MACF;AAAA,MAEA,OAAa;AACX,aAAK,SAAS;AACd,YAAI,KAAK,UAAU;AACjB,wBAAc,KAAK,QAAQ;AAC3B,eAAK,WAAW;AAAA,QAClB;AACA,gBAAQ,OAAO,MAAM,WAAW;AAAA,MAClC;AAAA,MAEQ,OAAa;AACnB,YAAI,CAAC,KAAK,OAAQ;AAElB,cAAM,UAAU,eAAe,KAAK,QAAQ,eAAe,MAAM;AACjE,cAAM,UAAU,gBAAgB,aAAa,KAAK,KAAK;AACvD,cAAM,WAAW,GAAG,QAAQ,OAAO;AACnC,cAAM,WAAW,KAAK,QAAQ,KAAK,GAAG,MAAM,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC,KAAK;AAE/E,gBAAQ,OAAO,MAAM,cAAc,QAAQ,IAAI,OAAO,GAAG,QAAQ,EAAE;AAAA,MACrE;AAAA,MAEQ,SAAS,GAAW,KAAqB;AAC/C,YAAI,EAAE,UAAU,IAAK,QAAO;AAC5B,eAAO,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI;AAAA,MAC/B;AAAA,IACF;AAAA;AAAA;;;AChGA,OAAOC,YAAW;AAGX,SAAS,WAAmB;AACjC,SAAO,KAAK,IAAI,QAAQ,OAAO,WAAW,IAAI,EAAE;AAClD;AAEA,SAAS,SAAS,MAAc,GAAmB;AACjD,QAAM,UAAU,UAAU,IAAI,EAAE;AAChC,MAAI,WAAW,EAAG,QAAO;AACzB,SAAO,OAAO,IAAI,OAAO,IAAI,OAAO;AACtC;AAEO,SAAS,OAAO,GAAmB;AACxC,QAAM,QAAQ,IAAI;AAClB,SAAO,OAAO,GAAG,OAAO,cAAI,IAAI,GAAG,OAAO,SAAI,OAAO,KAAK,CAAC,IAAI,GAAG,OAAO,cAAI;AAC/E;AAEO,SAAS,SAAS,GAAmB;AAC1C,QAAM,QAAQ,IAAI;AAClB,SAAO,GAAG,OAAO,cAAI,IAAI,GAAG,OAAO,SAAI,OAAO,KAAK,CAAC,IAAI,GAAG,OAAO,cAAI;AACxE;AAEO,SAAS,OAAO,GAAmB;AACxC,QAAM,QAAQ,IAAI;AAClB,SAAO,OAAO,GAAG,OAAO,cAAI,IAAI,GAAG,OAAO,SAAI,OAAO,KAAK,CAAC,IAAI,GAAG,OAAO,cAAI;AAC/E;AAEO,SAAS,SAAS,GAAmB;AAC1C,QAAM,QAAQ,IAAI;AAClB,SAAO,GAAG,OAAO,cAAI,IAAI,GAAG,OAAO,SAAI,OAAO,KAAK,CAAC,IAAI,GAAG,OAAO,cAAI;AACxE;AAEO,SAAS,QAAQ,GAAW,MAAsB;AACvD,QAAM,QAAQ,IAAI;AAClB,QAAM,SAAS,SAAS,MAAM,KAAK;AACnC,SAAO,OAAO,GAAG,OAAO,SAAI,IAAI,SAAS,GAAG,OAAO,SAAI;AACzD;AAEO,SAAS,UAAU,GAAW,MAAsB;AACzD,QAAM,QAAQ,IAAI;AAClB,QAAM,SAAS,SAAS,MAAM,KAAK;AACnC,SAAO,GAAG,OAAO,SAAI,IAAI,SAAS,GAAG,OAAO,SAAI;AAClD;AAEO,SAAS,OAAO,GAAmB;AACxC,QAAM,QAAQ,IAAI;AAClB,SAAO,OAAO,GAAG,OAAO,cAAI,IAAI,GAAG,OAAO,SAAI,OAAO,KAAK,CAAC,IAAI,GAAG,OAAO,cAAI;AAC/E;AAEO,SAAS,SAAS,GAAmB;AAC1C,QAAM,QAAQ,IAAI;AAClB,SAAO,GAAG,OAAO,cAAI,IAAI,GAAG,OAAO,SAAI,OAAO,KAAK,CAAC,IAAI,GAAG,OAAO,cAAI;AACxE;AAEO,SAAS,OAAO,GAAW,OAAe,OAAuB;AACtE,QAAM,QAAQ,IAAI;AAClB,QAAM,aAAa,UAAUA,OAAM,KAAK,KAAK,CAAC;AAC9C,QAAM,UAAU,WAAW,SAAS,IAAI,MAAM;AAC9C,MAAI,UAAU,OAAO;AACnB,UAAM,QAAQ,QAAQ,WAAW,SAAS;AAC1C,UAAM,YAAY,MAAM,SAAS,QAAQ,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,OAAO;AAC5E,WACE,OACA,GAAG,OAAO,SAAI,IACdA,OAAM,KAAK,KAAK,IAChB,OACA,GAAG,QAAQ,SAAS,IACpB,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,WAAW,SAAS,IAAI,UAAU,MAAM,CAAC,IACxE,GAAG,OAAO,SAAI;AAAA,EAElB;AACA,QAAM,QAAQ,QAAQ,WAAW,SAAS,IAAI,MAAM;AACpD,SACE,OACA,GAAG,OAAO,SAAI,IACdA,OAAM,KAAK,KAAK,IAChB,OACA,GAAG,QAAQ,KAAK,IAChB,IAAI,OAAO,KAAK,IAChB,GAAG,OAAO,SAAI;AAElB;AAlFA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA,OAAO,cAAc;AACrB,SAAS,OAAO,cAAc;AAyB9B,eAAsB,OACpB,UACA,SACA,eAAuB,GACvB,SAAuB,CAAC,GACP;AACjB,QAAM,QAAQ,MAAM,SAAS,OAAO;AAEpC,MAAI,CAAC,OAAO;AACV,WAAO,eAAe,UAAU,SAAS,cAAc,MAAM;AAAA,EAC/D;AAEA,SAAO,YAAY,UAAU,SAAS,cAAc,MAAM;AAC5D;AAEA,eAAsB,YACpB,UACA,eAAuB,IACvB,SAAwC,CAAC,GACxB;AACjB,MAAI,CAAC,MAAM,SAAS,CAAC,OAAO,OAAO;AACjC,WAAO,cAAc,UAAU,YAAY;AAAA,EAC7C;AAEA,SAAO,gBAAgB,UAAU,cAAc,MAAM;AACvD;AAEA,eAAe,YACb,UACA,SACA,cACA,QACiB;AACjB,QAAM,UAAU,OAAO,WAAW,CAAC;AACnC,QAAM,cAAc,OAAO,eAAe,CAAC;AAC3C,QAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,IAAI,SAAS,GAAG,EAAE,CAAC;AACnD,QAAM,QAAQ,QAAQ;AACtB,QAAM,mBAAmB,IAAI,YAAY;AACzC,QAAM,aAAa,QAAQ,SAAS;AACpC,QAAM,oBAAoB,IAAI,YAAY,UAAU,aAAa,IAAI;AACrE,QAAM,YAAY,QAAQ,SAAS,IAAI,YAAY,UAAU,aAAa,IAAI;AAC9E,QAAM,OAAO,QAAQ,OAAO,QAAQ;AACpC,QAAM,UAAU,QAAQ,OAAO,WAAW;AAC1C,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,OAAO,OAAO,aAAa,CAAC,IAAI,CAAC;AACtE,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,OAAO,UAAU,SAAS,CAAC,IAAI,CAAC;AACtE,QAAM,YAAY,KAAK,IAAI,MAAM,cAAc,YAAY,CAAC;AAE5D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,eAAuB,QAAQ,UAAU,CAAC,WAAW,CAAC,OAAO,QAAQ;AAC3E,QAAI,WAAmB,QAAQ,YAAY,GAAG,WAAW,eAAe;AACxE,QAAI,iBAAgC;AACpC,QAAI,WAAW,EAAG,YAAW;AAE7B,UAAM,OAAO,CAAC,cAA4B;AACxC,UAAI,OAAO,WAAW;AACtB,aAAO,QAAQ,KAAK,OAAO,QAAQ,QAAQ;AACzC,YAAI,CAAC,QAAQ,IAAI,EAAE,UAAU;AAC3B,qBAAW;AACX;AAAA,QACF;AACA,gBAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,SAAS,CAAC,UAAmB,UAAgB;AACjD,UAAI,CAAC,SAAS;AACZ,eAAO,MAAM,SAAS;AAAA,MACxB;AACA,YAAM,QAAkB,CAAC;AACzB,YAAM,KAAK,SAAS,KAAK,CAAC;AAC1B,YAAM;AAAA,QACJ,UAAU,OAAO,WAAW,GAAG,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,KAAK,KAAK,QAAQ,CAAC,IAAI,KAAK,CAAC;AAAA,MACpF;AACA,iBAAW,UAAU,aAAa;AAChC,cAAM,KAAK,UAAU,OAAO,WAAW,GAAG,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC;AAAA,MAClE;AACA,UAAI,YAAY;AACd,cAAM;AAAA,UACJ,UAAU,OAAO,WAAW,cAAc,SAAS,gBAAgB,KAAK,GAAG,KAAK,CAAC;AAAA,QACnF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,KAAK,CAAC;AAC1B,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,cAAM;AAAA,UACJ;AAAA,YACE;AAAA,YACA;AAAA,cACE,aAAa,QAAQ,CAAC,GAAG,mBAAmB,QAAQ,MAAM,UAAU,KAAK;AAAA,cACzE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,YAAM,KAAK,SAAS,KAAK,CAAC;AAE1B,YAAM,QAAQ,CAAC,MAAM,UAAU,QAAQ,cAAc,OAAO,cAAc,IAAI,CAAC;AAC/E;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,UACE,GAAG,MAAM,OAAO,UAAU,iFAA8D;AAAA,UACxF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,CAAC,QAAgB,QAAQ,QAAQ,EAAE,UAAgB;AAChE,cAAQ;AACR,cAAQ;AAAA,QACN,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,KAAK,KAAK,QAAQ,CAAC,IAAI,GAAG,QAAQ,cAAc,OAAO,SAAS,OAAO,CAAC,CAAC;AAAA;AAAA,MACtG;AAEA,cAAQ,KAAK;AAAA,IACf;AAEA,UAAM,cAAc,CAAC,UAAwB;AAC3C,YAAM,QAAQ,gBAAgB,KAAK;AACnC,UAAI,CAAC,MAAO;AAEZ,UAAI,MAAM,SAAS,YAAY;AAC7B,aAAK,EAAE;AACP,eAAO;AACP;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,cAAc;AAC/B,aAAK,CAAC;AACN,eAAO;AACP;AAAA,MACF;AAEA,UAAI,cAAc,MAAM,MAAM,cAAc,kBAAkB;AAC5D,cAAM,YAAY,eAAe,SAAS,MAAM,GAAG,cAAc,KAAK;AACtE,YAAI,cAAc,QAAQ,QAAQ,SAAS,EAAE,SAAU;AACvD,YAAI,mBAAmB,WAAW;AAChC,2BAAiB;AACjB,iBAAO;AAAA,QACT;AACA,YAAI,MAAM,SAAS,QAAS,QAAO,QAAQ,SAAS,EAAE,KAAK;AAC3D;AAAA,MACF;AAEA,YAAM,MAAM,MAAM,IAAI,cAAc;AACpC,UAAI,MAAM,KAAK,OAAO,QAAQ,UAAU,QAAQ,GAAG,EAAE,SAAU;AAE/D,UAAI,aAAa,KAAK;AACpB,mBAAW;AACX,yBAAiB;AACjB,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,SAAS,SAAS;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,UAAU,MAAY;AAC1B,6BAAuB;AACvB,YAAM,WAAW,KAAK;AACtB,YAAM,eAAe,YAAY,UAAU;AAC3C,YAAM,eAAe,QAAQ,WAAW;AACxC,YAAM,MAAM;AAAA,IACd;AAEA,aAAS,mBAAmB,KAAK;AACjC,UAAM,WAAW,IAAI;AACrB,2BAAuB,IAAI;AAC3B,WAAO,IAAI;AAEX,UAAM,aAAa,CAAC,MAA0B,QAA4B;AACxE,UAAI,CAAC,IAAK;AAEV,UAAI,IAAI,SAAS,QAAQ,WAAW,GAAG;AACrC,aAAK,EAAE;AACP,yBAAiB;AACjB,eAAO;AAAA,MACT,WAAW,IAAI,SAAS,UAAU,WAAW,QAAQ,SAAS,GAAG;AAC/D,aAAK,CAAC;AACN,yBAAiB;AACjB,eAAO;AAAA,MACT,WAAW,IAAI,SAAS,SAAS,YAAY;AAC3C,yBAAiB,mBAAmB,OAAO,IAAI;AAC/C,eAAO;AAAA,MACT,WAAW,IAAI,SAAS,UAAU;AAChC,eAAO,mBAAmB,OAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,cAAc,EAAE,KAAK;AAAA,MAC1F,WAAY,IAAI,QAAQ,IAAI,SAAS,OAAQ,IAAI,SAAS,UAAU;AAClE,gBAAQ;AACR,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,OAAO;AACb,UAAM,GAAG,QAAQ,WAAW;AAC5B,UAAM,GAAG,YAAY,UAAU;AAAA,EACjC,CAAC;AACH;AAEA,eAAe,eACb,UACA,SACA,cACA,QACiB;AACjB,MAAI,CAAC,MAAM,OAAO;AAChB,UAAM,eAAuB,QAAQ,UAAU,CAAC,WAAW,CAAC,OAAO,QAAQ;AAC3E,UAAM,iBAAyB,QAAQ,YAAY,GAAG,WAAW,eAAe;AAChF,UAAM,MAAM,OAAO,iBAAiB,CAAC;AAErC,yBAAqB,UAAU,SAAS,gBAAgB,MAAM;AAE9D,WAAO,MAAM;AACX,YAAM,WAAW,MAAM,cAAc,GAAG,KAAK;AAC7C,UAAI,QAAQ,YAAY,MAAM,KAAK;AACjC,cAAM,SAAS,OAAO,SAAS,KAAK,CAAC,SAAS,CAAC,KAAK,QAAQ;AAC5D,YAAI,OAAQ,QAAO,OAAO;AAAA,MAC5B;AACA,UAAI,CAAC,SAAS;AACZ,cAAM,QAAQ,UAAU,QAAQ,cAAc,EAAE,KAAK;AACrD,gBAAQ,IAAI,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,QAAQ,KAAK,CAAC;AAAA,CAAI;AACzD,eAAO,QAAQ,cAAc,EAAE;AAAA,MACjC;AACA,YAAM,MAAM,SAAS,SAAS,EAAE;AAChC,UAAI,OAAO,KAAK,OAAO,QAAQ,UAAU,CAAC,QAAQ,MAAM,CAAC,EAAE,UAAU;AACnE,cAAM,QAAQ,UAAU,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC9C,gBAAQ,IAAI,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,QAAQ,KAAK,CAAC;AAAA,CAAI;AACzD,eAAO,QAAQ,MAAM,CAAC,EAAE;AAAA,MAC1B;AACA,cAAQ,IAAI,KAAK,GAAG,MAAM,QAAG,CAAC,IAAI,GAAG,QAAQ,WAAW,QAAQ,MAAM,OAAO,GAAG,EAAE,CAAC;AAAA,CAAI;AAAA,IACzF;AAAA,EACF;AAEA,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,OAAO,QAAQ,OAAO,CAAC;AACpE,UAAM,eAAuB,QAAQ,UAAU,CAAC,WAAW,CAAC,OAAO,QAAQ;AAC3E,UAAM,iBAAyB,QAAQ,YAAY,GAAG,WAAW,eAAe;AAEhF,yBAAqB,UAAU,SAAS,gBAAgB,MAAM;AAC9D,UAAM,MAAM,OAAO,iBAAiB,CAAC;AAErC,UAAM,MAAM,MAAY;AACtB,SAAG;AAAA,QACD,KAAK,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,MAAM,aAAa,QAAQ,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA,QACzE,CAAC,WAAW;AACV,gBAAM,UAAU,OAAO,KAAK;AAC5B,cAAI,QAAQ,YAAY,MAAM,KAAK;AACjC,kBAAM,SAAS,OAAO,SAAS,KAAK,CAAC,SAAS,CAAC,KAAK,QAAQ;AAC5D,gBAAI,QAAQ;AACV,iBAAG,MAAM;AACT,sBAAQ,OAAO,KAAK;AACpB;AAAA,YACF;AAAA,UACF;AACA,cAAI,CAAC,SAAS;AACZ,eAAG,MAAM;AACT,kBAAM,QAAQ,UAAU,QAAQ,cAAc,EAAE,KAAK;AACrD,oBAAQ,IAAI,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,QAAQ,KAAK,CAAC;AAAA,CAAI;AACzD,oBAAQ,QAAQ,cAAc,EAAE,KAAK;AACrC;AAAA,UACF;AACA,gBAAM,MAAM,SAAS,SAAS,EAAE;AAChC,cAAI,OAAO,KAAK,OAAO,QAAQ,UAAU,CAAC,QAAQ,MAAM,CAAC,EAAE,UAAU;AACnE,eAAG,MAAM;AACT,kBAAM,QAAQ,UAAU,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC9C,oBAAQ,IAAI,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,QAAQ,KAAK,CAAC;AAAA,CAAI;AACzD,oBAAQ,QAAQ,MAAM,CAAC,EAAE,KAAK;AAAA,UAChC,WAAW,OAAO,KAAK,OAAO,QAAQ,UAAU,QAAQ,MAAM,CAAC,EAAE,UAAU;AACzE,oBAAQ,IAAI,KAAK,GAAG,MAAM,QAAG,CAAC,IAAI,GAAG,QAAQ,4BAA4B,CAAC;AAAA,CAAI;AAC9E,gBAAI;AAAA,UACN,OAAO;AACL,oBAAQ,IAAI,KAAK,GAAG,MAAM,QAAG,CAAC,IAAI,GAAG,QAAQ,WAAW,QAAQ,MAAM,EAAE,CAAC;AAAA,CAAI;AAC7E,gBAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI;AAAA,EACN,CAAC;AACH;AAEA,SAAS,gBACP,UACA,cACA,QACiB;AACjB,QAAM,cAAc,OAAO,eAAe,CAAC;AAC3C,QAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,IAAI,SAAS,GAAG,EAAE,CAAC;AACnD,QAAM,QAAQ,QAAQ;AACtB,QAAM,YAAY,IAAI,YAAY;AAClC,QAAM,OAAO,QAAQ,OAAO,QAAQ;AACpC,QAAM,UAAU,QAAQ,OAAO,WAAW;AAC1C,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,OAAO,OAAO,aAAa,CAAC,IAAI,CAAC;AACtE,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,OAAO,UAAU,SAAS,CAAC,IAAI,CAAC;AACtE,QAAM,YAAY,KAAK,IAAI,MAAM,cAAc,YAAY,CAAC;AAE5D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,QAAQ;AAEZ,UAAM,SAAS,MAAY;AACzB,aAAO,MAAM,SAAS;AACtB,YAAM,QAAQ,SAAS;AACvB,YAAM,UAAU,cAAc,OAAO,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAC;AAC7D,YAAM,QAAQ,GAAG,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,GAAG,QAAQ,QAAG,CAAC;AACtE,YAAM,QAAkB,CAAC;AACzB,YAAM,KAAK,SAAS,KAAK,CAAC;AAC1B,YAAM;AAAA,QACJ,UAAU,OAAO,WAAW,GAAG,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,KAAK,KAAK,QAAQ,CAAC,IAAI,KAAK,CAAC;AAAA,MACpF;AACA,iBAAW,UAAU,aAAa;AAChC,cAAM,KAAK,UAAU,OAAO,WAAW,GAAG,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC;AAAA,MAClE;AACA,YAAM,KAAK,SAAS,KAAK,CAAC;AAC1B,YAAM,KAAK,UAAU,OAAO,WAAW,OAAO,KAAK,CAAC,CAAC;AACrD,YAAM,KAAK,SAAS,KAAK,CAAC;AAE1B,YAAM,QAAQ,CAAC,MAAM,UAAU,QAAQ,cAAc,OAAO,cAAc,IAAI,CAAC;AAC/E;AAAA,QACE;AAAA,QACA;AAAA,QACA,WAAW,GAAG,MAAM,OAAO,UAAU,kDAA4C,GAAG,KAAK;AAAA,MAC3F;AAAA,IACF;AAEA,UAAM,UAAU,MAAY;AAC1B,6BAAuB;AACvB,YAAM,WAAW,KAAK;AACtB,YAAM,eAAe,YAAY,UAAU;AAC3C,YAAM,MAAM;AAAA,IACd;AAEA,UAAM,SAAS,MAAY;AACzB,YAAMC,UAAS,gBAAgB,MAAM,KAAK,KAAK,YAAY;AAC3D,cAAQ;AACR,cAAQA,OAAM;AAAA,IAChB;AAEA,UAAM,aAAa,CAAC,KAAyB,QAA4B;AACvE,UAAK,IAAI,QAAQ,IAAI,SAAS,OAAQ,IAAI,SAAS,UAAU;AAC3D,gBAAQ;AACR,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI,IAAI,SAAS,UAAU;AACzB,eAAO;AACP;AAAA,MACF;AACA,UAAI,IAAI,SAAS,aAAa;AAC5B,gBAAQ,MAAM,MAAM,GAAG,EAAE;AACzB,eAAO;AACP;AAAA,MACF;AACA,UAAI,IAAI,SAAS,UAAU;AACzB,gBAAQ;AACR,eAAO;AACP;AAAA,MACF;AACA,UAAI,OAAO,CAAC,IAAI,QAAQ,CAAC,IAAI,QAAQ,OAAO,OAAO,CAAC,mBAAmB,KAAK,GAAG,GAAG;AAChF,iBAAS,gBAAgB,IAAI,QAAQ,WAAW,EAAE,CAAC;AACnD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,aAAS,mBAAmB,KAAK;AACjC,UAAM,WAAW,IAAI;AACrB,2BAAuB,KAAK;AAC5B,WAAO;AACP,UAAM,OAAO;AACb,UAAM,GAAG,YAAY,UAAU;AAAA,EACjC,CAAC;AACH;AAEA,eAAe,cAAc,UAAkB,cAAuC;AACpF,MAAI,CAAC,MAAM,OAAO;AAChB,UAAM,SAAS,eAAe,GAAG,MAAM,KAAK,YAAY,GAAG,IAAI;AAC/D,YAAQ,IAAI,KAAK,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,KAAK,KAAK,QAAQ,CAAC,GAAG,MAAM,IAAI;AACvE,UAAM,SAAS,MAAM,cAAc;AACnC,WAAO,gBAAgB,OAAO,KAAK,KAAK,YAAY;AAAA,EACtD;AAEA,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,OAAO,QAAQ,OAAO,CAAC;AACpE,UAAM,SAAS,eAAe,GAAG,MAAM,KAAK,YAAY,GAAG,IAAI;AAC/D,OAAG,SAAS,KAAK,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,KAAK,KAAK,QAAQ,CAAC,GAAG,MAAM,MAAM,CAAC,WAAW;AACnF,SAAG,MAAM;AACT,cAAQ,gBAAgB,OAAO,KAAK,KAAK,YAAY,CAAC;AAAA,IACxD,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,qBACP,UACA,SACA,gBACA,QACM;AACN,UAAQ,IAAI,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,KAAK,KAAK,QAAQ,CAAC;AAAA,CAAI;AAC9D,aAAW,UAAU,OAAO,eAAe,CAAC,GAAG;AAC7C,YAAQ,IAAI,KAAK,GAAG,MAAM,MAAM,CAAC,EAAE;AAAA,EACrC;AACA,aAAW,UAAU,OAAO,WAAW,CAAC,GAAG;AACzC,YAAQ;AAAA,MACN,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,OAAO,WAAW,GAAG,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,CAAC;AAAA,IAC3F;AAAA,EACF;AACA,OAAK,OAAO,aAAa,UAAU,KAAK,MAAM,OAAO,SAAS,UAAU,KAAK,GAAG;AAC9E,YAAQ,IAAI,EAAE;AAAA,EAChB;AACA,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,SAAS,MAAM,iBAAiB,GAAG,QAAQ,SAAI,IAAI;AACzD,UAAM,QAAQ,QAAQ,CAAC,EAAE,WACrB,GAAG,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,CAAC,IACpC,GAAG,KAAK,QAAQ,CAAC,EAAE,KAAK;AAC5B,YAAQ,IAAI,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE;AAAA,EAC9D;AACA,UAAQ,IAAI,EAAE;AAChB;AAEA,SAAS,gBAAiC;AACxC,MAAI,CAAC,mBAAmB;AACtB,wBAAoB,IAAI,QAAQ,CAAC,YAAY;AAC3C,UAAI,OAAO;AACX,YAAM,YAAY,MAAM;AACxB,YAAM,GAAG,QAAQ,CAAC,UAAU;AAC1B,gBAAQ;AAAA,MACV,CAAC;AACD,YAAM,GAAG,OAAO,MAAM;AACpB,gBAAQ,KAAK,MAAM,OAAO,CAAC;AAAA,MAC7B,CAAC;AACD,YAAM,GAAG,SAAS,MAAM;AACtB,gBAAQ,CAAC,CAAC;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO,kBAAkB,KAAK,CAAC,UAAU,MAAM,gBAAgB,KAAK,EAAE;AACxE;AAEA,SAAS,cAAc,SAAyB,QAAuB,OAAuB;AAC5F,SAAO,QACJ,IAAI,CAAC,QAAQ,UAAU;AACtB,UAAM,QAAQ;AAAA,MACZ,UAAU,OAAO,KAAK;AAAA,MACtB,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,QAAQ,MAAM,IAAI,CAAC;AAAA,IACpD;AACA,QAAI,OAAO,SAAU,QAAO,GAAG,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC;AAClF,QAAI,WAAW;AACb,aAAO,GAAG,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,KAAK,KAAK,KAAK,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,QAAQ,QAAG,CAAC;AAC3G,WAAO,GAAG,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,QAAQ,KAAK,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC;AAAA,EACjE,CAAC,EACA,KAAK,IAAI,GAAG,MAAM,MAAG,CAAC,GAAG;AAC9B;AAEA,SAAS,eACP,SACA,QACA,cACA,OACe;AACf,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,eAAe,eAAe;AACpC,QAAM,WAAW,SAAS;AAC1B,MAAI,WAAW,KAAK,WAAW,MAAO,QAAO;AAC7C,SAAO,KAAK,IAAI,QAAQ,SAAS,GAAG,KAAK,MAAO,WAAW,KAAK,IAAI,GAAG,KAAK,IAAK,QAAQ,MAAM,CAAC;AAClG;AAEA,SAAS,cAAc,OAAe,SAAyB,SAAiC;AAC9F,SAAO;AAAA,IACL,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK,GAAG,SAChD,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK,GAAG,SAClD;AAAA,EACJ;AACF;AAQA,SAAS,aAAa,QAAsB,UAAmB,OAAuB;AACpF,QAAM,QAAQ,cAAc,UAAU,OAAO,KAAK,GAAG,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAC;AAC7E,MAAI,OAAO,UAAU;AACnB,WAAO,GAAG,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC;AAAA,EAC/D;AACA,MAAI,UAAU;AACZ,WAAO,GAAG,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,KAAK,KAAK,KAAK,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,QAAQ,QAAG,CAAC;AAAA,EAC3G;AACA,SAAO,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC;AACjG;AAEA,SAAS,uBAAuB,aAA4B;AAC1D,SAAO,MAAM,mCAAkD;AAC/D,MAAI,aAAa;AACf,WAAO,MAAM,8CAA6D;AAAA,EAC5E;AACF;AAEA,SAAS,yBAA+B;AACtC,SAAO;AAAA,IACL;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAsC;AAC7D,QAAM,OAAO,MAAM,SAAS,OAAO;AACnC,QAAM,QAAQ,KAAK,MAAM,gCAAgC;AACzD,MAAI,CAAC,MAAO,QAAO,sBAAsB,IAAI;AAE7C,QAAM,OAAO,OAAO,MAAM,CAAC,CAAC;AAC5B,QAAM,IAAI,OAAO,MAAM,CAAC,CAAC;AACzB,QAAM,IAAI,OAAO,MAAM,CAAC,CAAC;AACzB,QAAM,QAAQ,MAAM,CAAC;AACrB,MAAI,SAAS,GAAI,QAAO,EAAE,MAAM,YAAY,GAAG,EAAE;AACjD,MAAI,SAAS,GAAI,QAAO,EAAE,MAAM,cAAc,GAAG,EAAE;AACnD,MAAI,UAAU,IAAK,QAAO,EAAE,MAAM,SAAS,GAAG,EAAE;AAChD,OAAK,OAAO,QAAQ,MAAM,SAAS,GAAI,QAAO,EAAE,MAAM,SAAS,GAAG,EAAE;AACpE,OAAK,OAAO,OAAO,EAAG,QAAO,EAAE,MAAM,SAAS,GAAG,EAAE;AACnD,SAAO;AACT;AAEA,SAAS,sBAAsB,MAAqC;AAClE,QAAM,QAAQ,KAAK,MAAM,iCAAiC;AAC1D,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,OAAO,MAAM,CAAC,EAAE,WAAW,CAAC,IAAI;AACtC,QAAM,IAAI,MAAM,CAAC,EAAE,WAAW,CAAC,IAAI;AACnC,QAAM,IAAI,MAAM,CAAC,EAAE,WAAW,CAAC,IAAI;AAEnC,MAAI,SAAS,GAAI,QAAO,EAAE,MAAM,YAAY,GAAG,EAAE;AACjD,MAAI,SAAS,GAAI,QAAO,EAAE,MAAM,cAAc,GAAG,EAAE;AACnD,OAAK,OAAO,OAAO,EAAG,QAAO,EAAE,MAAM,SAAS,GAAG,EAAE;AACnD,OAAK,OAAO,QAAQ,GAAI,QAAO,EAAE,MAAM,SAAS,GAAG,EAAE;AACrD,SAAO,EAAE,MAAM,SAAS,GAAG,EAAE;AAC/B;AAEA,SAAS,QAAQ,KAAa,KAAa,MAAoB;AAC7D,SAAO,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE;AAC3C;AAEA,SAAS,mBAAmB,KAAa,KAA4B;AACnE,SACE,IAAI,SAAS,MAAM,KAAK,CAAC,CAAC,IAAI,UAAU,SAAS,MAAM,KAAK,uBAAuB,KAAK,GAAG;AAE/F;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAO,MACJ,QAAQ,2BAA2B,EAAE,EACrC,QAAQ,4BAA4B,EAAE,EACtC,QAAQ,uBAAuB,EAAE,EACjC,QAAQ,qCAAqC,EAAE;AACpD;AA/jBA,IAuBI,mBACA;AAxBJ;AAAA;AAAA;AAEA;AACA;AAoBA,IAAI,oBAA8C;AAClD,IAAI,iBAAiB;AAAA;AAAA;;;ACxBrB,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,SAAS,OAAAC,YAAW;AAFpB,IASa;AATb;AAAA;AAAA;AASO,IAAM,WAAN,MAAe;AAAA,MACpB,UAAmC,oBAAI,IAAI;AAAA,MAC3C,UAA+B,oBAAI,IAAI;AAAA,MAEvC,aAAa,QAAgB,UAA2C;AACtE,YAAI,KAAK,QAAQ,IAAI,MAAM,EAAG,QAAO,KAAK,QAAQ,IAAI,MAAM,EAAG;AAE/D,YAAI;AACJ,YAAI;AACF,mBAAS,IAAIA,KAAI,MAAM;AAAA,QACzB,QAAQ;AACN,iBAAO;AAAA,QACT;AAEA,cAAM,OAAe,OAAO;AAC5B,cAAM,WAAmB,OAAO;AAChC,cAAM,MAAc,KAAK,QAAQ,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY;AAErE,YAAI,MAAqB;AAEzB,YAAI,UAAU;AACZ,gBAAM,SAAS,YAAY,MAAM,UAAU,GAAG;AAAA,QAChD;AAEA,YAAI,CAAC,KAAK;AACR,gBAAM,KAAK,YAAY,MAAM,GAAG;AAAA,QAClC;AAEA,YAAI;AACJ,cAAM,WAAmB,KAAK,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC;AAC7D,cAAM,OAAe,OAAO,WAAW,KAAK,EAAE,OAAO,MAAM,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AAErF,YAAI,YAAY,SAAS,SAAS,KAAK,aAAa,KAAK;AACvD,gBAAM,QAAgB,SAAS,QAAQ,oBAAoB,GAAG;AAC9D,qBAAW,MAAM,SAAS,GAAG,IAAI,QAAQ,GAAG,KAAK,IAAI,IAAI;AAAA,QAC3D,OAAO;AACL,qBAAW,SAAS,IAAI,GAAG,OAAO,EAAE;AAAA,QACtC;AAEA,YAAI,QAAQ,UAAU,QAAQ,OAAO;AACnC,qBAAW,SAAS,QAAQ,oBAAoB,GAAG;AAAA,QACrD;AAEA,cAAM,YAAoB,GAAG,GAAG,IAAI,QAAQ;AAC5C,aAAK,QAAQ,IAAI,QAAQ,EAAE,UAAU,CAAC;AAEtC,cAAM,OAAe,OAAO,MAAM,GAAG,EAAE,CAAC;AACxC,YAAI,SAAS,UAAU,CAAC,KAAK,QAAQ,IAAI,IAAI,GAAG;AAC9C,eAAK,QAAQ,IAAI,MAAM,EAAE,UAAU,CAAC;AAAA,QACtC;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,QAAQ,MAAc,UAAkB,IAAY;AAClD,cAAM,SAAS,CAAC,GAAG,KAAK,QAAQ,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM;AACnF,YAAI,MAAc;AAClB,mBAAW,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,QAAQ;AACzC,gBAAM,MAAc,UAAU,KAAK,MAAM,SAAS,SAAS,SAAS,IAAI;AACxE,gBAAM,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAC7B,cAAI,IAAI,SAAS,GAAG,GAAG;AACrB,kBAAM,IAAI,MAAM,IAAI,QAAQ,MAAM,OAAO,CAAC,EAAE,KAAK,GAAG;AAAA,UACtD;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MAEQ,YAAY,MAAc,KAAqB;AACrD,YAAI,KAAK,SAAS,mBAAmB,KAAK,KAAK,SAAS,sBAAsB,GAAG;AAC/E,iBAAO;AAAA,QACT;AACA,eAAO,QAAQ,UAAU,QAAQ,QAAQ,mBAAmB;AAAA,MAC9D;AAAA,IACF;AAAA;AAAA;;;AClFA;AAAA;AAAA;AAAA;AAAA,IAEa;AAFb;AAAA;AAAA;AAEO,IAAM,MAAc;AAAA,MACzB,UAAU,EAAE,OAAO,MAAM,QAAQ,IAAI;AAAA,MACrC,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,oBAAoB;AAAA,QAClB;AAAA,QAAa;AAAA,QAA4B;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACfA,OAAOC,YAAW;AAClB,OAAO,UAAU;AACjB,SAAS,OAAAC,YAAW;AAGb,SAAS,SAAS,KAAa,UAAkB,IAAI,SAA0B;AACpF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,IAAI,WAAW,OAAO,IAAID,SAAQ;AAChD,UAAM,KAAK,CAAC,SAAuB;AACjC,YAAM,MAAM,MAAM,IAAI,KAAK,EAAE,SAAS,IAAI,UAAU,GAAG,CAAC,QAAQ;AAC9D,YAAI,IAAI,cAAe,OAAO,IAAI,aAAc,OAAO,IAAI,QAAQ,UAAU;AAC3E,iBAAO,SAAS,IAAIC,KAAI,IAAI,QAAQ,UAAU,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,SAAS,MAAM;AAAA,QACrF;AACA,YAAI,IAAI,eAAe,KAAK;AAC1B,iBAAO,OAAO,IACV,WAAW,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAClC,OAAO,IAAI,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;AAAA,QAChD;AACA,cAAM,KAAe,CAAC;AACtB,YAAI,GAAG,QAAQ,CAAC,MAAc,GAAG,KAAK,CAAC,CAAC;AACxC,YAAI,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,EAAE,CAAC,CAAC;AAC9C,YAAI,GAAG,SAAS,CAAC,MAAc,OAAO,IAAI,WAAW,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,CAAE;AAAA,MAC5F,CAAC;AACD,UAAI,GAAG,SAAS,CAAC,MAAc,OAAO,IAAI,WAAW,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,CAAE;AAC1F,UAAI,GAAG,WAAW,MAAM;AACtB,YAAI,QAAQ;AACZ,eAAO,IAAI,WAAW,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,OAAO,IAAI,MAAM,SAAS,CAAC;AAAA,MAC9E,CAAC;AAAA,IACH;AACA,OAAG,OAAO;AAAA,EACZ,CAAC;AACH;AA/BA;AAAA;AAAA;AAGA;AAAA;AAAA;;;ACHA,OAAOC,YAAW;AAMX,SAAS,WAAW,SAAsC;AAC/D,aAAW;AACb;AAIA,SAAS,MAAM,MAAc,KAAqB;AAChD,MAAI,KAAK,UAAU,IAAK,QAAO;AAC/B,SAAO,KAAK,MAAM,GAAG,MAAM,CAAC,IAAI;AAClC;AAEA,SAAS,OAAO,MAAoB;AAClC,MAAI,SAAU,UAAS,IAAI,IAAI;AAAA,MAC1B,SAAQ,IAAI,IAAI;AACvB;AApBA,IAII,UAME,GAYA,aAQF,KAES,KAQP,cAKF,KAES,MAQA,MAWA;AAlEb;AAAA;AAAA;AAEA;AAEA,IAAI,WAAkC;AAMtC,IAAM,IAAI,OAAc,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,IAAI,EAAE;AAY7D,IAAM,cAA4C;AAAA,MAChD,CAAC,MAAMA,OAAM,IAAI,MAAM,OAAO,EAAE,CAAC;AAAA,MACjC,CAAC,MAAMA,OAAM,IAAI,MAAM,WAAW,EAAE,CAAC;AAAA,MACrC,CAAC,MAAMA,OAAM,IAAI,MAAM,SAAS,EAAE,CAAC;AAAA,MACnC,CAAC,MAAMA,OAAM,IAAI,MAAM,MAAM,EAAE,CAAC;AAAA,MAChC,CAAC,MAAMA,OAAM,IAAI,MAAM,IAAI,EAAE,CAAC;AAAA,MAC9B,CAAC,MAAMA,OAAM,IAAI,MAAM,IAAI,EAAE,CAAC;AAAA,IAChC;AACA,IAAI,MAAM;AAEH,IAAM,MAAM,CAAC,MAAoB;AACtC;AACA,YAAM,IAAI,YAAY,MAAM,YAAY,MAAM;AAC9C;AAAA,QACE,GAAGA,OAAM,IAAI,MAAM,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAIA,OAAM,IAAI,MAAM,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;AAAA,MAChG;AAAA,IACF;AAEA,IAAM,eAA6C;AAAA,MACjD,CAAC,MAAMA,OAAM,IAAI,MAAM,IAAI,EAAE,CAAC;AAAA,MAC9B,CAAC,MAAMA,OAAM,IAAI,MAAM,SAAS,EAAE,CAAC;AAAA,MACnC,CAAC,MAAMA,OAAM,IAAI,MAAM,WAAW,EAAE,CAAC;AAAA,IACvC;AACA,IAAI,MAAM;AAEH,IAAM,OAAO,CAAC,MAAoB;AACvC;AACA,YAAM,IAAI,aAAa,MAAM,aAAa,MAAM;AAChD;AAAA,QACE,GAAGA,OAAM,IAAI,MAAM,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAIA,OAAM,IAAI,MAAM,IAAI,EAAE,KAAK,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;AAAA,MACnG;AAAA,IACF;AAEO,IAAM,OAAO,CAAC,MAAoB;AACvC,YAAM,SAAuC;AAAA,QAC3C,CAAC,MAAMA,OAAM,IAAI,MAAM,OAAO,EAAE,CAAC;AAAA,QACjC,CAAC,MAAMA,OAAM,IAAI,MAAM,OAAO,EAAE,CAAC;AAAA,MACnC;AACA,YAAM,IAAI,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,CAAC;AAC1D,YAAM,OAAO,GAAGA,OAAM,IAAI,MAAM,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAIA,OAAM,IAAI,MAAM,OAAO,EAAE,KAAK,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;AACjH,UAAI,SAAU,UAAS,IAAI,IAAI;AAAA,UAC1B,SAAQ,KAAK,IAAI;AAAA,IACxB;AAEO,IAAM,UAAU,CAAC,MAAoB;AAC1C,YAAM,SAAuC;AAAA,QAC3C,CAAC,MAAMA,OAAM,IAAI,MAAM,OAAO,EAAE,CAAC;AAAA,QACjC,CAAC,MAAMA,OAAM,IAAI,MAAM,IAAI,EAAE,CAAC;AAAA,MAChC;AACA,YAAM,IAAI,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,MAAM,CAAC;AAC1D;AAAA,QACE,GAAGA,OAAM,IAAI,MAAM,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAIA,OAAM,IAAI,MAAM,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC;AAAA,MAC/F;AAAA,IACF;AAAA;AAAA;;;AC3EA,IAEM,WAEO;AAJb;AAAA;AAAA;AAEA,IAAM,YAAsB,CAAC,UAAU,SAAS,QAAQ,MAAM;AAEvD,IAAM,SAA0B;AAAA,MACrC,MAAM;AAAA,MACN,aAAa;AAAA,MAEb,YAAY,KAAsB;AAChC,eAAO,4CAA4C,KAAK,GAAG;AAAA,MAC7D;AAAA,MAEA,aAAa,MAAuB;AAClC,eACE,KAAK,SAAS,WAAW,MACxB,KAAK,SAAS,kBAAkB,KAAK,KAAK,SAAS,uBAAuB;AAAA,MAE/E;AAAA,MAEA,cAAc,CAAC,qBAAqB,kBAAkB,6BAA6B;AAAA,MAEnF,gBAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEA,eAAe;AAAA,QACb;AAAA,QACA;AAAA,MACF;AAAA,MAEA,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,MAErB,YAAY,MAAc,UAAkB,KAA4B;AACtE,YAAI,KAAK,SAAS,uBAAuB,GAAG;AAC1C,cAAI,SAAS,WAAW,UAAU,EAAG,QAAO;AAC5C,cAAI,SAAS,WAAW,UAAU,GAAG;AACnC,mBAAO,UAAU,SAAS,GAAG,IAAI,iBAAiB;AAAA,UACpD;AACA,cAAI,SAAS,WAAW,SAAS,GAAG;AAClC,gBAAI,QAAQ,UAAU,QAAQ,MAAO,QAAO;AAC5C,gBAAI,QAAQ,QAAS,QAAO;AAC5B,gBAAI,QAAQ,OAAQ,QAAO;AAC3B,gBAAI,QAAQ,aAAc,QAAO;AACjC,mBAAO;AAAA,UACT;AACA,cAAI,SAAS,WAAW,WAAW,GAAG;AACpC,mBAAO,QAAQ,eAAe,SAAS;AAAA,UACzC;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,KAAK,SAAS,sBAAsB,GAAG;AACzC,cAAI,QAAQ,OAAQ,QAAO;AAC3B,cAAI,QAAQ,UAAU,QAAQ,MAAO,QAAO;AAC5C,cAAI,QAAQ,YAAY,QAAQ,QAAS,QAAO;AAChD,cAAI,QAAQ,UAAU,QAAQ,OAAQ,QAAO;AAC7C,iBAAO;AAAA,QACT;AAEA,YAAI,KAAK,SAAS,kBAAkB,KAAK,KAAK,SAAS,YAAY,GAAG;AACpE,cAAI,QAAQ,UAAU,QAAQ,MAAO,QAAO;AAC5C,cAAI,QAAQ,OAAQ,QAAO;AAC3B,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACxEA,IAEM,UACAC,YACA,YAEO;AANb;AAAA;AAAA;AAEA,IAAM,WAAqB,CAAC,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,SAAS,OAAO;AACrF,IAAMA,aAAsB,CAAC,UAAU,SAAS,QAAQ,QAAQ,MAAM;AACtE,IAAM,aAAuB,CAAC,QAAQ,SAAS,MAAM;AAE9C,IAAM,UAA2B;AAAA,MACtC,MAAM;AAAA,MACN,aAAa;AAAA,MAEb,YAAY,KAAsB;AAChC,eAAO,sBAAsB,KAAK,GAAG;AAAA,MACvC;AAAA,MAEA,aAAa,MAAuB;AAClC,eACE,KAAK,SAAS,cAAc,KAC5B,KAAK,SAAS,iBAAiB,KAC/B,KAAK,SAAS,SAAS,KACvB,KAAK,SAAS,YAAY;AAAA,MAE9B;AAAA,MAEA,cAAc,CAAC,yBAAyB,yBAAyB,iBAAiB;AAAA,MAElF,gBAAgB,CAAC,oBAAoB,yBAAyB;AAAA,MAE9D,eAAe;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEA,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,MAErB,YAAY,MAAc,UAAkB,KAA4B;AACtE,YACE,KAAK,SAAS,mBAAmB,KACjC,KAAK,SAAS,aAAa,KAC3B,KAAK,SAAS,yBAAyB,GACvC;AACA,cAAI,WAAW,SAAS,GAAG,EAAG,QAAO;AACrC,cAAI,SAAS,SAAS,UAAU,KAAK,SAAS,SAAS,GAAG,EAAG,QAAO;AACpE,cAAI,SAAS,SAAS,OAAO,KAAK,QAAQ,OAAQ,QAAO;AACzD,cAAI,SAAS,SAAS,MAAM,KAAK,QAAQ,MAAO,QAAO;AACvD,cAAI,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,WAAW,EAAG,QAAO;AAC1E,cAAIA,WAAU,SAAS,GAAG,EAAG,QAAO;AACpC,iBAAO;AAAA,QACT;AAEA,YAAI,KAAK,SAAS,+BAA+B,GAAG;AAClD,cAAI,QAAQ,MAAO,QAAO;AAC1B,cAAI,QAAQ,OAAQ,QAAO;AAC3B,cAAI,SAAS,SAAS,GAAG,EAAG,QAAO;AACnC,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACnEA,IAEMC,WACAC,YACAC,aAEO;AANb;AAAA;AAAA;AAEA,IAAMF,YAAqB,CAAC,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,SAAS,SAAS,MAAM;AAC7F,IAAMC,aAAsB,CAAC,UAAU,SAAS,QAAQ,QAAQ,MAAM;AACtE,IAAMC,cAAuB,CAAC,QAAQ,SAAS,MAAM;AAE9C,IAAM,MAAuB;AAAA,MAClC,MAAM;AAAA,MACN,aAAa;AAAA,MAEb,YAAY,KAAsB;AAChC,eAAO,4BAA4B,KAAK,GAAG;AAAA,MAC7C;AAAA,MAEA,aAAa,MAAuB;AAClC,eACE,KAAK,SAAS,kBAAkB,KAChC,KAAK,SAAS,cAAc,KAC5B,KAAK,SAAS,QAAQ,KACtB,KAAK,SAAS,SAAS,KACvB,KAAK,SAAS,aAAa,KAC3B,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,SAAS,KACvB,eAAe,KAAK,IAAI,KACxB,mEAAmE,KAAK,IAAI,KAC5E,SAAS,KAAK,IAAI,KAClB,YAAY,KAAK,IAAI;AAAA,MAEzB;AAAA,MAEA,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEA,gBAAgB,CAAC,YAAY,YAAY,cAAc,gBAAgB;AAAA,MAEvE,eAAe;AAAA,QACb;AAAA,MACF;AAAA,MAEA,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,MAErB,YAAY,MAAc,UAAkB,KAA4B;AACtE,YAAI,SAAS,uBAAuB;AAClC,iBAAO;AAAA,QACT;AAEA,YAAI,KAAK,SAAS,eAAe,GAAG;AAClC,cAAIA,YAAW,SAAS,GAAG,EAAG,QAAO;AACrC,cAAI,SAAS,SAAS,UAAU,KAAKF,UAAS,SAAS,GAAG,EAAG,QAAO;AACpE,cAAI,QAAQ,OAAQ,QAAO;AAC3B,cAAI,QAAQ,MAAO,QAAO;AAC1B,cAAIC,WAAU,SAAS,GAAG,EAAG,QAAO;AACpC,iBAAO;AAAA,QACT;AAEA,YAAI,KAAK,SAAS,iBAAiB,GAAG;AACpC,cAAI,QAAQ,MAAO,QAAO;AAC1B,cAAI,QAAQ,OAAQ,QAAO;AAC3B,cAAIA,WAAU,SAAS,GAAG,EAAG,QAAO;AACpC,cAAID,UAAS,SAAS,GAAG,EAAG,QAAO;AACnC,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;AChEO,SAAS,YAAY,KAAqC;AAC/D,aAAW,YAAY,eAAe;AACpC,QAAI,SAAS,YAAY,GAAG,EAAG,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAEO,SAAS,aAAa,MAAsC;AACjE,aAAW,YAAY,eAAe;AACpC,QAAI,SAAS,aAAa,IAAI,EAAG,QAAO;AAAA,EAC1C;AACA,SAAO;AACT;AAEO,SAAS,eAAe,KAAa,MAAgC;AAC1E,QAAM,QAAQ,YAAY,GAAG;AAC7B,MAAI,MAAO,QAAO;AAElB,MAAI,MAAM;AACR,UAAM,SAAS,aAAa,IAAI;AAChC,QAAI,OAAQ,QAAO;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,eAAsB,YAAY,MAA6C;AAC7E,MAAI;AACF,UAAM,SAAiB,MAAM,KAAK,SAAS,MAAM;AAC/C,YAAM,OAAe,SAAS,gBAAgB,aAAa;AAE3D,UAAI,mCAAmC,KAAK,IAAI,EAAG,QAAO;AAC1D,UAAI,wCAAwC,KAAK,IAAI,EAAG,QAAO;AAC/D,UAAI,+CAA+C,KAAK,IAAI,EAAG,QAAO;AAEtE,YAAM,OAAiB,CAAC;AACxB,YAAM,UAAyC,SAAS,iBAAiB,aAAa;AACtF,cAAQ,QAAQ,CAAC,MAAM;AAAE,YAAI,EAAE,IAAK,MAAK,KAAK,EAAE,GAAG;AAAA,MAAG,CAAC;AACvD,YAAM,UAAkB,KAAK,KAAK,GAAG;AACrC,UAAI,kCAAkC,KAAK,OAAO,EAAG,QAAO;AAC5D,UAAI,kCAAkC,KAAK,OAAO,EAAG,QAAO;AAC5D,UAAI,uDAAuD,KAAK,OAAO,EAAG,QAAO;AAEjF,aAAO;AAAA,IACT,CAAC;AAED,QAAI,WAAW,MAAO,QAAO;AAC7B,QAAI,WAAW,UAAW,QAAO;AACjC,QAAI,WAAW,SAAU,QAAO;AAAA,EAClC,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEO,SAAS,kBAAkB,MAAqC;AACrE,QAAM,MAAuC,EAAE,QAAQ,SAAS,IAAI;AACpE,SAAO,IAAI,IAAI,KAAK;AACtB;AAhEA,IAMM;AANN;AAAA;AAAA;AAEA;AACA;AACA;AAEA,IAAM,gBAAmC,CAAC,QAAQ,SAAS,GAAG;AAAA;AAAA;;;ACN9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACJA,OAAO,eAA8B;AAMrC,eAAsB,iBAAiB,UAA0C;AAC/E,WAAS,SAAS,OAAO,sBAAsB;AAC/C,MAAI,gCAAgC;AAEpC,WAAS,UAAU,MAAM,UAAU,OAAO;AAAA,IACxC,UAAU;AAAA,IACV,MAAM,CAAC,gBAAgB,0BAA0B;AAAA,EACnD,CAAC;AACD,UAAQ,mBAAmB;AAE3B,WAAS,OAAO,MAAM,SAAS,QAAQ,QAAQ;AAC/C,QAAM,SAAS,KAAK,YAAY,IAAI,QAAQ;AAC5C,MAAI,qBAAqB,IAAI,SAAS,QAAQ,MAAM,IAAI,SAAS,MAAM;AAEvE,QAAM,SAAS,KAAK;AAAA,IAClB;AAAA,EAEF;AACA,MAAI,8BAA8B;AAElC,QAAM,kBAA4B;AAAA,IAChC,GAAG,IAAI;AAAA,IACP,GAAG,SAAS,SAAS;AAAA,EACvB;AACA,MAAI,cAAc,gBAAgB,SAAS,oBAAoB;AAC/D,aAAW,UAAU,iBAAiB;AACpC,QAAI,SAAS,MAAM;AAAA,EACrB;AAEA,MAAI,cAAc;AAClB,MAAI,UAAU;AAEd,WAAS,KAAK,GAAG,YAAY,OAAO,QAAQ;AAC1C,UAAM,MAAc,IAAI,IAAI;AAC5B,QAAI,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,OAAO,EAAG;AAExD,QAAI;AACF,YAAM,OAAe,IAAI,IAAI,GAAG,EAAE;AAClC,UAAI,gBAAgB,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,GAAG;AACjD;AACA;AAAA,MACF;AAAA,IACF,QAAQ;AACN;AAAA,IACF;AAEA,aAAS,OAAO,aAAa,KAAK,SAAS,QAAQ;AACnD,QAAI;AACF,eAAS,OAAO,QAAQ,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC;AACnD;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX,CAAC;AAED,MAAI,8BAA8B;AAElC,WAAS,SAAS,OAAO,uBAAuB;AAChD,OAAK,mBAAmB,SAAS,OAAO;AACxC,QAAM,SAAS,KAAK,KAAK,SAAS,SAAS;AAAA,IACzC,WAAW;AAAA,IACX,SAAS,IAAI;AAAA,EACf,CAAC;AACD,UAAQ,4BAA4B;AACpC,MAAI,iBAAiB,cAAc,yBAAyB,UAAU,oBAAoB;AAE1F,MAAI,0CAA0C;AAC9C,QAAM,cAAc,MAAM,YAAY,SAAS,IAAI;AACnD,MAAI,eAAe,YAAY,SAAS,SAAS,SAAS,MAAM;AAC9D,QAAI,gCAAgC,YAAY,cAAc,iBAAiB,SAAS,SAAS,OAAO,GAAG;AAC3G,aAAS,WAAW;AAAA,EACtB;AAEA,WAAS,SAAS,OAAO,iBAAiB,SAAS,SAAS,cAAc,eAAe;AAEzF,MAAI,SAAS,SAAS,qBAAqB;AACzC,QAAI,yCAAyC;AAC7C,QAAI,wBAAwB,SAAS,SAAS,mBAAmB,IAAI;AACrE,UAAM,UAAU,SAAS,SAAS;AAClC,UAAM,SAAS,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAMS,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,KAK5C;AACD,YAAQ,mCAAmC;AAAA,EAC7C,OAAO;AACL,QAAI,mCAAmC,SAAS,SAAS,mBAAmB,kBAAkB;AAC9F,UAAM,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,SAAS,SAAS,gBAAgB,CAAC;AAChF,YAAQ,SAAS,SAAS,cAAc,gBAAgB;AAAA,EAC1D;AAEA,WAAS,SAAS,OAAO,mBAAmB;AAC5C,MAAI,sCAAsC,IAAI,aAAa,gBAAgB,IAAI,cAAc,KAAK;AAElG,QAAM,aAAa,IAAI;AACvB,QAAM,cAAc,IAAI;AAExB,QAAM,aAAqB,MAAM,SAAS,KAAK,SAAS;AAAA;AAAA,GAEvD;AACD,MAAI,kBAAkB,aAAa,SAAS,KAAK,KAAK,aAAa,UAAU,IAAI,gBAAgB;AAEjG,QAAM,SAAS,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,eAKhB,UAAU;AAAA;AAAA,2CAEkB,WAAW;AAAA;AAAA;AAAA;AAAA,GAInD;AACD,UAAQ,2BAA2B;AAEnC,WAAS,SAAS,OAAO,+BAA+B;AACxD,MAAI,yCAAyC;AAC7C,QAAM,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAElD,MAAI,mDAAmD;AACvD,MAAI;AACF,UAAM,SAAS,KAAK,mBAAmB,EAAE,UAAU,MAAM,SAAS,IAAK,CAAC;AACxE,YAAQ,wBAAwB;AAAA,EAClC,QAAQ;AACN,QAAI,kDAAkD;AAAA,EACxD;AAEA,QAAM,gBAAwB,SAAS,OAAO,QAAQ;AACtD,UAAQ,cAAc,gBAAgB,0BAA0B;AAEhE,QAAM,WAAmB,CAAC,GAAG,SAAS,OAAO,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS,MAAM,CAAC,EAAE;AAC3G,QAAM,UAAkB,CAAC,GAAG,SAAS,OAAO,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS,KAAK,KAAK,EAAE,UAAU,SAAS,MAAM,CAAC,EAAE;AACzI,QAAM,WAAmB,CAAC,GAAG,SAAS,OAAO,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,WAAW,eAAe,CAAC,EAAE;AACtH,QAAM,YAAoB,CAAC,GAAG,SAAS,OAAO,QAAQ,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,WAAW,cAAc,CAAC,EAAE;AACtH,MAAI,YAAY,WAAW,YAAY,UAAU,gBAAgB,WAAW,eAAe,SAAS;AACtG;AAEA,eAAsB,aAAa,UAA0E;AAC3G,MAAI,SAAS,SAAS;AACpB,UAAM,SAAS,QAAQ,MAAM;AAC7B,aAAS,UAAU;AACnB,QAAI,gBAAgB;AAAA,EACtB;AACF;AAEA,eAAsB,eACpB,MACA,KACA,UACiB;AACjB,MAAI,+BAA+B,GAAG;AACtC,QAAM,KAAK,KAAK,KAAK,EAAE,WAAW,gBAAgB,SAAS,IAAI,QAAQ,CAAC;AAExE,MAAI,SAAS,qBAAqB;AAChC,UAAM,KAAK;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,sCAKgC,SAAS,gBAAgB;AAAA;AAAA;AAAA;AAAA,IAI3D;AAAA,EACF,OAAO;AACL,UAAM,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAAA,EACpD;AAEA,QAAM,OAAe,MAAM,KAAK,SAAS,MAAM,SAAS,gBAAgB,aAAa,SAAS,KAAK,SAAS;AAC5G,MAAI,0BAA0B,KAAK,SAAS,MAAM,QAAQ,CAAC,IAAI,KAAK;AACpE,SAAO;AACT;AAxLA;AAAA;AAAA;AACA;AACA;AACA;AAAA;AAAA;;;ACHA,eAAsB,KAAK,OAAmC,GAA0B;AACtF,MAAI,IAAI;AACR,QAAM,MAAM,YAA2B;AACrC,WAAO,IAAI,MAAM,QAAQ;AACvB,YAAM,IAAI;AACV,YAAM,MAAM,CAAC,EAAE;AAAA,IACjB;AAAA,EACF;AACA,QAAM,QAAQ,IAAI,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC;AAClF;AATA;AAAA;AAAA;AAAA;AAAA;;;ACAA,OAAO,QAAQ;AACf,OAAOG,WAAU;AAOjB,eAAsB,YAAY,UAA0C;AAC1E,QAAM,OAAoB,oBAAI,IAAI;AAClC,QAAM,aAAwD,CAAC;AAC/D,aAAW,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,SAAS,OAAO,SAAS;AAC1D,QAAI,KAAK,IAAI,SAAS,EAAG;AACzB,SAAK,IAAI,SAAS;AAClB,eAAW,KAAK,EAAE,KAAK,UAAU,CAAC;AAAA,EACpC;AAEA,QAAM,QAAgB,WAAW;AACjC,MAAI,0BAA0B,QAAQ,gBAAgB;AACtD,MAAI,kBAAkB,IAAI,cAAc,qBAAqB;AAC7D,MAAI,mBAAmB,IAAI,UAAU,gBAAgB,IAAI,YAAY,YAAY;AAEjF,MAAI,KAAK;AACT,MAAI,SAAS;AACb,MAAI,OAAO;AACX,MAAI,YAAY;AAChB,MAAI,eAAe;AAEnB,QAAM,QAAoC,WAAW;AAAA,IACnD,CAAC,EAAE,KAAK,UAAU,MAChB,YAA2B;AACzB,YAAM,OAAeA,MAAK,KAAK,SAAS,QAAQ,SAAS;AACzD,YAAM,GAAG,MAAMA,MAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAEtD,UAAI;AACF,cAAM,MACJ,SAAS,OAAO,QAAQ,IAAI,GAAG,KAC/B,SAAS,OAAO,QAAQ,IAAI,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;AAC/C,YAAI,KAAK;AACP,gBAAM,GAAG,UAAU,MAAM,GAAG;AAC5B;AACA;AAAA,QACF,OAAO;AACL,gBAAM,OAAe,MAAM,SAAS,GAAG;AACvC,gBAAM,GAAG,UAAU,MAAM,IAAI;AAC7B;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AACV;AACA,YACE,CAAC,IAAI,SAAS,iBAAiB,KAC/B,CAAC,IAAI,SAAS,4BAA4B,GAC1C;AACA,eAAK,sBAAsBA,MAAK,SAAS,SAAS,IAAI,QAAS,EAAY,OAAO;AAAA,QACpF;AAAA,MACF;AAEA;AACA,YAAM,MAAc,KAAK,MAAO,YAAY,QAAS,GAAG;AACxD,UAAI,OAAO,eAAe,MAAM,cAAc,OAAO;AACnD,iBAAS,SAAS,OAAO,oBAAoB,YAAY,MAAM,QAAQ,OAAO,MAAM,IAAI;AACxF,YAAI,wBAAwB,YAAY,MAAM,QAAQ,OAAO,MAAM,IAAI;AACvE,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACJ;AAEA,QAAM,KAAK,OAAO,IAAI,WAAW;AAEjC,UAAQ,yBAAyB,KAAK,iBAAiB,SAAS,kBAAkB,OAAO,SAAS;AAElG,QAAM,aAAqB,CAAC,GAAG,SAAS,OAAO,QAAQ,OAAO,CAAC,EAAE;AACjE,MAAI,0CAA0C,UAAU;AAExD,WAAS,OAAO,QAAQ,MAAM;AAC9B,MAAI,8BAA8B;AACpC;AA5EA,IAAAC,iBAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AAAA;AAAA;;;ACLA,OAAO,cAAc;AAErB,eAAsB,WAAW,KAA8B;AAC7D,MAAI;AACF,WAAO,MAAM,SAAS,OAAO,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACf,CAAC;AAAA,EACH,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAlBA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAa;AAAb;AAAA;AAAA;AAAO,IAAM,eAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACApC,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAMjB,SAAS,YAAY,KAAqB;AACxC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AAClD;AAEA,SAAS,gBAAgB,MAAc,KAAqB;AAC1D,MAAI,IAAI,SAAS,SAAS,GAAG;AAC3B,UAAM,QAAQ,IAAI,MAAM,qBAAqB;AAC7C,QAAI,OAAO;AACT,YAAM,SAAiB,YAAY,MAAM,CAAC,CAAC;AAC3C,aAAO,KAAK,QAAQ,IAAI,OAAO,eAAe,MAAM,0BAA0B,GAAG,GAAG,EAAE;AACtF,aAAO,KAAK,QAAQ,IAAI,OAAO,eAAe,MAAM,qBAAqB,GAAG,GAAG,EAAE;AAAA,IACnF;AAAA,EACF,WAAW,IAAI,SAAS,UAAU,GAAG;AACnC,UAAM,QAAQ,IAAI,MAAM,sBAAsB;AAC9C,QAAI,OAAO;AACT,YAAM,OAAe,YAAY,MAAM,CAAC,CAAC;AACzC,aAAO,KAAK,QAAQ,IAAI,OAAO,aAAa,IAAI,UAAU,GAAG,GAAG,EAAE;AAAA,IACpE;AAAA,EACF,WAAW,IAAI,WAAW,GAAG,GAAG;AAC9B,UAAM,MAAc,YAAY,IAAI,MAAM,CAAC,CAAC;AAC5C,WAAO,KAAK;AAAA,MACV,IAAI,OAAO,qBAAqB,GAAG,oCAAoC,GAAG;AAAA,MAC1E;AAAA,IACF;AAAA,EACF,WAAW,IAAI,WAAW,GAAG,GAAG;AAC9B,UAAM,KAAa,IAAI,MAAM,CAAC;AAC9B,WAAO,kBAAkB,MAAM,EAAE;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAc,IAAoB;AAC3D,QAAM,SAAiB,OAAO,EAAE;AAChC,MAAI,MAAc,KAAK,QAAQ,MAAM;AACrC,SAAO,QAAQ,IAAI;AACjB,UAAM,WAAmB,KAAK,YAAY,KAAK,GAAG;AAClD,QAAI,aAAa,GAAI;AAErB,UAAM,aAAqB,KAAK,QAAQ,KAAK,WAAW,CAAC;AACzD,UAAM,UAAkB,KAAK,MAAM,WAAW,GAAG,UAAU,EAAE,YAAY;AAEzE,QAAI,QAAQ;AACZ,QAAI,IAAY;AAChB,WAAO,IAAI,KAAK,QAAQ;AACtB,UACE,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,MAC/B,KAAK,IAAI,QAAQ,SAAS,CAAC,MAAM,OAAO,KAAK,IAAI,QAAQ,SAAS,CAAC,MAAM,MAC1E;AACA;AACA,aAAK,QAAQ,SAAS;AAAA,MACxB,WAAW,KAAK,WAAW,KAAK,OAAO,KAAK,CAAC,GAAG;AAC9C;AACA,YAAI,UAAU,GAAG;AACf,iBAAO,KAAK,MAAM,GAAG,QAAQ,IAAI,KAAK,MAAM,IAAI,QAAQ,SAAS,CAAC;AAClE;AAAA,QACF;AACA,aAAK,QAAQ,SAAS;AAAA,MACxB,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,QAAQ,MAAM;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAc,KAAqB;AACrD,QAAM,YAAY,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,QAAQ,OAAO,EAAE;AAGrD,MAAI,CAAC,KAAK,SAAS,iBAAiB,GAAG;AACrC,WAAO,KAAK,QAAQ,WAAW,iCAAiC,SAAS;AAAA,UAAe;AAAA,EAC1F;AAGA,MAAI,CAAC,KAAK,SAAS,oBAAoB,GAAG;AACxC,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,SAAS,eAAe,GAAG;AACnC,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,qCAAqF,SAAS;AAAA;AAAA;AAAA;AAAA,IAChG;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,SAAS,eAAe,GAAG;AACnC,WAAO,KAAK,QAAQ,WAAW;AAAA,UAA2D;AAAA,EAC5F;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,MAAsB;AACnD,SAAO,KAAK,QAAQ,yBAAyB,EAAE;AAC/C,SAAO,KAAK,QAAQ,2BAA2B,EAAE;AACjD,SAAO,KAAK,QAAQ,mBAAmB,EAAE;AACzC,SAAO,KAAK,QAAQ,qCAAqC,EAAE;AAC3D,SAAO,KAAK,QAAQ,uCAAuC,EAAE;AAC7D,SAAO,KAAK,QAAQ,6CAA6C,EAAE;AACnE,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAsB;AAChD,SAAO,KAAK,QAAQ,qBAAqB,CAAC,QAAgB,WAAmB;AAC3E,UAAM,UAAkB,OACrB,MAAM,GAAG,EACT,IAAI,CAAC,UAAkB,MAAM,KAAK,CAAC,EACnC,OAAO,CAAC,UAAkB,CAAC,MAAM,WAAW,MAAM,CAAC,EACnD,KAAK,IAAI;AACZ,WAAO,UAAU,aAAa,UAAU,MAAM;AAAA,EAChD,CAAC;AACD,SAAO;AACT;AAEA,eAAsB,YAAY,UAA0C;AAC1E,WAAS,SAAS,OAAO,8BAA8B;AACvD,MAAI,kCAAkC;AACtC,MAAI,iBAAiB,SAAS,QAAQ,SAAS,MAAM,QAAQ,CAAC,IAAI,KAAK;AAEvE,MAAI,OAAe,SAAS;AAC5B,MAAI,CAAC,MAAM;AACT,SAAK,4CAA4C;AACjD;AAAA,EACF;AAEA,WAAS,SAAS,OAAO,8BAA8B;AACvD,QAAM,kBAA0B,KAAK;AACrC,SAAO,sBAAsB,IAAI;AACjC,MAAI,iDAAiD,kBAAkB,KAAK,UAAU,SAAS;AAC/F,UAAQ,yCAAyC;AAEjD,MAAI,OAAO,eAAe,YAAY;AACpC,aAAS,SAAS,OAAO,mBAAmB;AAC5C,WAAO,WAAW,MAAM,SAAS,OAAO;AACxC,YAAQ,yBAAyB;AAAA,EACnC;AAEA,MAAI,eAAe,SAAS,SAAS,eAAe,SAAS,aAAa;AAC1E,aAAW,OAAO,SAAS,SAAS,gBAAgB;AAClD,UAAM,SAAiB,KAAK;AAC5B,WAAO,gBAAgB,MAAM,GAAG;AAChC,UAAM,UAAkB,SAAS,KAAK;AACtC,QAAI,UAAU,GAAG;AACf,UAAI,gBAAgB,MAAM,OAAO,UAAU,iBAAiB;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,SAAS,cAAc,SAAS,oBAAoB;AAC/E,aAAW,WAAW,SAAS,SAAS,eAAe;AACrD,UAAM,SAAiB,KAAK;AAC5B,WAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ,QAAQ,QAAQ,KAAK,GAAG,EAAE;AACjE,UAAM,UAAkB,SAAS,KAAK;AACtC,QAAI,UAAU,GAAG;AACf,UAAI,uBAAuB,UAAU,QAAQ;AAAA,IAC/C;AAAA,EACF;AACA,UAAQ,uCAAuC;AAE/C,WAAS,SAAS,OAAO,yBAAyB;AAClD,MAAI,eAAe,SAAS,OAAO,QAAQ,OAAO,6BAA6B;AAC/E,QAAM,gBAAwB,KAAK;AACnC,SAAO,SAAS,OAAO,QAAQ,MAAM,EAAE;AACvC,MAAI,0BAA0B,KAAK,SAAS,iBAAiB,QAAQ;AAErE,WAAS,SAAS,OAAO,+BAA+B;AACxD,SAAO,mBAAmB,IAAI;AAC9B,MAAI,mDAAmD;AAEvD,QAAM,uBAAuB,QAAQ;AACrC,UAAQ,mCAAmC;AAE3C,WAAS,SAAS,OAAO,6BAA6B;AACtD,QAAM,qBAAqB,QAAQ;AAEnC,WAAS,SAAS,OAAO,yBAAyB;AAClD,MAAI,0BAA0B,KAAK,SAAS,MAAM,QAAQ,CAAC,IAAI,SAAS;AACxE,QAAMD,IAAG,UAAUC,MAAK,KAAK,SAAS,QAAQ,YAAY,GAAG,IAAI;AACjE,UAAQ,oBAAoB;AAE5B,QAAMD,IAAG,UAAUC,MAAK,KAAK,SAAS,QAAQ,UAAU,GAAG,YAAY;AACvE,MAAI,kBAAkB;AACtB,QAAMD,IAAG;AAAA,IACPC,MAAK,KAAK,SAAS,QAAQ,cAAc;AAAA,IACzC,KAAK,UAAU,EAAE,MAAM,UAAU,SAAS,EAAE,OAAO,gBAAgB,EAAE,GAAG,MAAM,CAAC,IAAI;AAAA,EACrF;AACA,MAAI,mCAAmC;AACvC,UAAQ,uBAAuB;AACjC;AAEA,eAAe,uBAAuB,UAA0C;AAC9E,QAAM,OAAiB,CAAC,kBAAkB,mBAAmB,QAAQ;AACrE,MAAI,YAAY;AAEhB,aAAW,OAAO,MAAM;AACtB,UAAM,UAAkBA,MAAK,KAAK,SAAS,QAAQ,GAAG;AACtD,QAAI;AACJ,QAAI;AACF,cAAQ,MAAMD,IAAG,QAAQ,OAAO;AAAA,IAClC,QAAQ;AACN;AAAA,IACF;AAEA,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAcC,MAAK,QAAQ,IAAI,EAAE,YAAY;AACnD,UAAI,CAAC,CAAC,QAAQ,OAAO,MAAM,EAAE,SAAS,GAAG,EAAG;AAE5C,YAAM,WAAmBA,MAAK,KAAK,SAAS,IAAI;AAChD,UAAI;AACF,YAAI,UAAkB,MAAMD,IAAG,SAAS,UAAU,OAAO;AACzD,cAAM,SAAiB;AACvB,kBAAU,SAAS,OAAO,QAAQ,SAAS,GAAG;AAC9C,YAAI,YAAY,QAAQ;AACtB,gBAAMA,IAAG,UAAU,UAAU,OAAO;AACpC;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AACA,MAAI,qBAAqB,YAAY,eAAe;AACtD;AAEA,eAAe,qBAAqB,UAA0C;AAC5E,QAAM,OAAiB,CAAC,kBAAkB,iBAAiB;AAC3D,MAAI,QAAQ;AACZ,MAAI,QAAQ;AAEZ,aAAW,OAAO,MAAM;AACtB,UAAM,UAAkBC,MAAK,KAAK,SAAS,QAAQ,GAAG;AACtD,QAAI;AACJ,QAAI;AACF,cAAQ,MAAMD,IAAG,QAAQ,OAAO;AAAA,IAClC,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,UAAoB,MAAM,OAAO,CAAC,MAAM;AAC5C,YAAM,MAAcC,MAAK,QAAQ,CAAC,EAAE,YAAY;AAChD,aAAO,QAAQ,UAAU,QAAQ;AAAA,IACnC,CAAC;AACD,aAAS,QAAQ;AAEjB,eAAW,QAAQ,SAAS;AAC1B,YAAM,WAAmBA,MAAK,KAAK,SAAS,IAAI;AAChD,UAAI;AACF,cAAM,MAAc,MAAMD,IAAG,SAAS,UAAU,OAAO;AAEvD,cAAM,WAAmB,IAAI,MAAM,KAAK,KAAK,CAAC,GAAG,SAAS,IAAI;AAC9D,YAAI,UAAU,MAAM;AAClB;AACA;AAAA,QACF;AAEA,cAAM,SAAiB,MAAM,WAAW,GAAG;AAC3C,cAAMA,IAAG,UAAU,UAAU,QAAQ,OAAO;AAC5C;AAEA,YAAI,QAAQ,MAAM,GAAG;AACnB,mBAAS,SAAS,OAAO,yBAAyB,QAAQ,MAAM,QAAQ,GAAG;AAAA,QAC7E;AAAA,MACF,SAAS,GAAG;AACV,aAAK,2BAA2B,OAAO,QAAS,EAAY,OAAO;AACnE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,eAAe,QAAQ,MAAM,QAAQ,eAAe;AAC9D;AAzRA;AAAA;AAAA;AAEA;AACA;AACA;AAAA;AAAA;;;ACJA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAKjB,eAAsB,aAAa,UAA0C;AAC3E,QAAM,IAAI,SAAS;AACnB,QAAM,UAAU,IAAI;AAEpB,QAAM,QAAQ,OAAO,MAA+B;AAClD,QAAI;AACF,cAAQ,MAAMD,IAAG,QAAQC,MAAK,KAAK,SAAS,QAAQ,CAAC,CAAC,GAAG;AAAA,IAC3D,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,CAAC,MAAM,OAAO,QAAQ,MAAM,SAAS,QAAQ,QAAQ,MAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC7F,MAAM,eAAe;AAAA,IACrB,MAAM,cAAc;AAAA,IACpB,MAAM,eAAe;AAAA,IACrB,MAAM,aAAa;AAAA,IACnB,MAAM,iBAAiB;AAAA,IACvB,MAAM,gBAAgB;AAAA,IACtB,MAAM,QAAQ;AAAA,IACd,MAAM,MAAM;AAAA,IACZ,MAAM,UAAU;AAAA,EAClB,CAAC;AAED,QAAM,IAAI,GAAG;AACb,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,GAAG;AACd,QAAM,IAAI,GAAG;AACb,QAAM,IAAI,GAAG;AACb,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,GAAG;AAEd,QAAM,UAAkE;AAAA,IACtE,CAAC,WAAW,QAAQ,OAAO,CAAC;AAAA,IAC5B,CAAC,mBAAmB,QAAQ,aAAa,EAAE;AAAA,IAC3C,CAAC,oBAAoB,SAAS,cAAc,EAAE;AAAA,IAC9C,CAAC,kBAAkB,MAAM,UAAU,CAAC;AAAA,IACpC,CAAC,kBAAkB,QAAQ,UAAU,CAAC;AAAA,IACtC,CAAC,iBAAiB,OAAO,SAAS,EAAE;AAAA,IACpC,CAAC,gBAAgB,MAAM,QAAQ,EAAE;AAAA,IACjC,CAAC,SAAS,MAAM,QAAQ,EAAE;AAAA,IAC1B,CAAC,aAAa,UAAU,SAAS,EAAE;AAAA,EACrC;AAEA,UAAQ,IAAI,EAAE;AACd,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,YAAQ,IAAI,QAAQ,GAAG,GAAG,GAAG,KAAK,KAAK,kBAAkB,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;AAC7E,YAAQ,IAAI,OAAO,CAAC,CAAC;AAAA,EACvB,OAAO;AACL,YAAQ,IAAI,GAAG,KAAK,KAAK,mBAAmB,CAAC;AAAA,EAC/C;AAEA,aAAW,CAAC,OAAO,KAAK,MAAM,KAAK,KAAK,SAAS;AAC/C,QAAI,QAAQ,EAAG;AACf,UAAM,QAAQ,IAAI;AAClB,UAAM,IAAI,MAAM,OAAO,EAAE;AACzB,UAAM,IAAI,OAAO,GAAG,EAAE,SAAS,CAAC;AAChC,UAAM,UAAU,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC;AAC3D,UAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAClC,UAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,OAAO;AACvC,QAAI,SAAS;AACX,cAAQ,IAAI,KAAK,MAAM,KAAK,CAAC,IAAI,GAAG,KAAK,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;AAAA,IAC3E,OAAO;AACL,cAAQ,IAAI,OAAO,GAAG,OAAO,SAAI,IAAI,UAAU,IAAI,OAAO,GAAG,IAAI,GAAG,OAAO,SAAI,CAAC;AAAA,IAClF;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,OAAO,CAAC,CAAC;AAAA,EACvB;AAEA,UAAQ,IAAI,EAAE;AACd,QAAM,QAAQ,QAAQA,MAAK,SAAS,SAAS,MAAM;AACnD,QAAM,SAAS;AACf,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,YAAQ,IAAI,QAAQ,GAAG,GAAG,KAAK,KAAK,oBAAoB,CAAC,CAAC;AAC1D,YAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,YAAQ,IAAI,OAAO,GAAG,QAAQ,KAAK,CAAC;AACpC,YAAQ,IAAI,OAAO,GAAG,OAAO,MAAM,CAAC;AACpC,YAAQ,IAAI,OAAO,CAAC,CAAC;AAAA,EACvB,OAAO;AACL,YAAQ,IAAI,GAAG,KAAK,KAAK,qBAAqB,CAAC;AAC/C,YAAQ,IAAI,KAAK,EAAE,KAAK,CAAC,EAAE;AAC3B,YAAQ,IAAI,KAAK,EAAE,MAAM,CAAC,EAAE;AAAA,EAC9B;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,GAAG,MAAM,yDAAyD,CAAC;AAC/E,UAAQ,IAAI,EAAE;AAChB;AAjGA;AAAA;AAAA;AAGA;AACA;AAAA;AAAA;;;ACJA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,SAAAC,QAAO,UAAAC,eAAc;AAC9B,SAAS,aAAa;AAsKtB,eAAsB,qBAAqB,UAA0C;AACnF,MAAI,CAACD,OAAM,SAAS,CAACC,QAAO,MAAO;AAEnC,QAAM,eAAe,kBAAkB,QAAQ;AAC/C,QAAM,gBAAgB,MAAM,wBAAwB,UAAU,YAAY;AAC1E,MAAI,CAAC,cAAe;AAEpB,sBAAoB,GAAG,GAAG,KAAK,KAAK,sBAAsB,CAAC,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI;AAAA,IACjF;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,gBAAgC;AAAA,IACpC,GAAG,QAAQ,IAAI,CAACC,aAAY,EAAE,OAAOA,QAAO,OAAO,OAAOA,QAAO,GAAG,EAAE;AAAA,IACtE,EAAE,OAAO,2CAA2C,OAAO,aAAa,UAAU,KAAK;AAAA,EACzF;AAEA,QAAM,WAAW,MAAM,OAAO,uBAAuB,eAAe,CAAC;AAErE,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA,SAAS,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,OAAO,OAAO,KAAK,GAAG,EAAE;AAAA,IAC9D;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA,MAAM,IAAI,CAACC,WAAU,EAAE,OAAOA,MAAK,OAAO,OAAOA,MAAK,GAAG,EAAE;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,KAAK,QAAQ,CAAC;AACxE,QAAM,SAAS,SAAS,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,KAAK,SAAS,CAAC;AAC1E,QAAM,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM,KAAK,MAAM,CAAC;AAChE,QAAM,QAAQ,MAAM,mBAAmB,QAAQ;AAC/C,QAAM,SAAS,sBAAsB,QAAQ,QAAQ,MAAM,KAAK;AAChE,QAAM,QAAQJ,MAAK,KAAK,SAAS,QAAQ,IAAI;AAC7C,QAAM,aAAaA,MAAK,KAAK,OAAO,GAAG,OAAO,EAAE,IAAI,OAAO,EAAE,IAAI,KAAK,EAAE,YAAY;AAEpF,QAAMD,IAAG,MAAM,OAAO,EAAE,WAAW,KAAK,CAAC;AACzC,QAAMA,IAAG,UAAU,YAAY,QAAQ,OAAO;AAE9C,QAAM,aAAa,MAAM,qBAAqB,YAAY,QAAQ,QAAQ,IAAI;AAC9E,MAAI,YAAY;AACd,QAAI;AACF,YAAM,gBAAgB,MAAM;AAC5B,cAAQ,IAAI,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,KAAK,KAAK,4BAA4B,CAAC;AAAA,CAAI;AAAA,IACpF,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,KAAK,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,QAAQ,6BAA6B,CAAC,IAAI,GAAG,MAAO,MAAgB,OAAO,CAAC;AAAA;AAAA,MACzG;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,mBAAmB,UAAiD;AACjF,QAAM,SAAiC,CAAC;AACxC,QAAM,cAAc,MAAM,YAAY,SAAS,MAAM;AAErD,aAAW,QAAQ,gBAAgB;AACjC,WAAO,IAAI,IACT,SAAS,eACJ,MAAM,OAAOC,MAAK,KAAK,SAAS,QAAQ,IAAI,CAAC,IAC5C,IACA,IACF,MAAM,aAAaA,MAAK,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,WAAW,SAAS;AAAA,IACpB,WAAW,SAAS;AAAA,IACpB,cAAc,SAAS,SAAS;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,OAAO,UAAoC;AACxD,MAAI;AACF,UAAMD,IAAG,OAAO,QAAQ;AACxB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,YAAY,KAAgC;AACzD,MAAI;AACF,YAAQ,MAAMA,IAAG,QAAQ,GAAG,GAAG,KAAK;AAAA,EACtC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,aAAa,KAA8B;AACxD,MAAI;AACF,YAAQ,MAAMA,IAAG,QAAQ,GAAG,GAAG;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY,OAAuB;AAC1C,SAAO,GAAG,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,KAAK,KAAK,KAAK,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC;AACnE;AAEA,SAASM,YAAW,MAAc,OAAuB;AACvD,QAAM,UAAU,UAAU,IAAI,EAAE;AAChC,MAAI,WAAW,MAAO,QAAO;AAC7B,QAAM,OAAO,KAAK,OAAO,QAAQ,WAAW,CAAC;AAC7C,SAAO,IAAI,OAAO,IAAI,IAAI,OAAO,IAAI,OAAO,QAAQ,UAAU,IAAI;AACpE;AAEA,SAAS,kBAAkB,UAAmC;AAC5D,SAAO,MAAML,MAAK,SAAS,SAAS,MAAM,CAAC;AAC7C;AAEA,eAAe,wBACb,UACA,cACkB;AAClB,MAAI,mBAAmB;AAEvB,SAAO,MAAM;AACX,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,QACE;AAAA,UACE,OAAO,GAAG,cAAc,gBAAgB,CAAC;AAAA,UACzC,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,OAAO,GAAG,YAAY,oBAAoB,CAAC,IAAI,GAAG,MAAM,MAAM,CAAC;AAAA,UAC/D,OAAO;AAAA,QACT;AAAA,QACA,EAAE,OAAO,YAAY,QAAQ,GAAG,OAAO,SAAS;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,QACE,aAAa;AAAA,UACX,WAAWA,MAAK,SAAS,SAAS,MAAM,CAAC;AAAA,UACzC,QAAQ,YAAY;AAAA,UACpB;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,WAAW,eAAe;AAC5B,yBAAmB,CAAC;AACpB;AAAA,IACF;AAEA,QAAI,WAAW,UAAU;AACvB,UAAI,kBAAkB;AACpB,YAAI;AACF,gBAAM,gBAAgB,YAAY;AAClC,kBAAQ,IAAI,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,KAAK,KAAK,sBAAsB,CAAC;AAAA,CAAI;AAAA,QAC9E,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN,KAAK,GAAG,QAAQ,GAAG,CAAC,IAAI,GAAG,QAAQ,6BAA6B,CAAC,IAAI,GAAG,MAAO,MAAgB,OAAO,CAAC;AAAA;AAAA,UACzG;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AACF;AAEA,eAAe,qBACb,YACA,QACA,QACA,MACkB;AAClB,QAAM,UAAUA,MAAK,SAAS,QAAQ,IAAI,GAAG,UAAU,KAAK;AAC5D,MAAI,aAAa;AAEjB,SAAO,MAAM;AACX,UAAM,SAAS,MAAM;AAAA,MACnB,mBAAmB,GAAG,MAAM,MAAM,CAAC;AAAA,MACnC;AAAA,QACE;AAAA,UACE,OAAO,GAAG,cAAc,UAAU,CAAC;AAAA,UACnC,OAAO;AAAA,QACT;AAAA,QACA,EAAE,OAAO,YAAY,QAAQ,GAAG,OAAO,SAAS;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,QACE,aAAa;AAAA,UACX,SAAS,OAAO,WAAW;AAAA,UAC3B,UAAU,OAAO,KAAK;AAAA,UACtB,SAAS,KAAK,KAAK;AAAA,UACnB,SAAS,OAAO;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,WAAW,eAAe;AAC5B,mBAAa,CAAC;AACd;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,SAA0B;AAC/C,SAAO,UAAU,GAAG,QAAQ,QAAG,IAAI,GAAG,MAAM,QAAG;AACjD;AAmBA,SAAS,oBAAoB,OAAe,OAAuB;AACjE,QAAM,IAAI,SAAS;AACnB,QAAM,QAAQ,IAAI;AAElB,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,UAAQ,IAAI,QAAQ,GAAGK,YAAW,GAAG,GAAG,QAAQ,QAAG,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC;AACxE,UAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,aAAW,QAAQ,OAAO;AACxB,YAAQ,IAAI,QAAQ,GAAGA,YAAW,GAAG,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC;AAAA,EAC3D;AACA,UAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,UAAQ,IAAI,EAAE;AAChB;AAEA,SAAS,sBACP,QACA,QACA,MACA,OACQ;AACR,QAAM,cAAc,MAAM,YAAY,SAClC,MAAM,YAAY,KAAK,IAAI,IAC3B;AACJ,QAAM,YAAY,eAAe,MAAM,SAAS;AAChD,QAAM,aAAa,eAAeL,MAAK,KAAK,MAAM,WAAW,OAAO,UAAU,CAAC;AAC/E,QAAM,kBAAkB,MAAM,SAAS,KAAK,OAAO,QAAQ;AAC3D,QAAM,eAAe,eAAeA,MAAK,KAAK,MAAM,WAAW,UAAU,GAAG,CAAC;AAC7E,QAAM,oBAAoB;AAAA,IACxBA,MAAK,KAAK,MAAM,WAAW,OAAO,YAAY,OAAO,WAAW,QAAQ;AAAA,EAC1E;AACA,QAAM,0BAA0B,6CAA6C,iBAAiB,qBAAqB,YAAY,iBAAiB,iBAAiB;AACjK,QAAM,mBAAmB,eAAe,YAAYA,MAAK,KAAK,MAAM,WAAW,QAAQ,CAAC,CAAC;AACzF,QAAM,wBAAwB;AAAA,IAC5B,YAAYA,MAAK,KAAK,MAAM,WAAW,OAAO,YAAY,OAAO,SAAS,CAAC;AAAA,EAC7E;AACA,QAAM,uBAAuB,YAAY,qBAAqB,aAAa,gBAAgB,IAAI,qBAAqB;AACpH,QAAM,iBAAiB,eAAe;AAAA,IACpC,CAAC,QAAQ,WAAW,GAAG,KAAK,MAAM,OAAO,GAAG,CAAC;AAAA,EAC/C;AACA,QAAM,cAAc;AAAA,IAClB,WAAW,OAAO,SAAS;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,OAAO,KAAK;AAAA,IAC7B,4BAA4B,OAAO,WAAW;AAAA,IAC9C,kCAAkC,KAAK,KAAK;AAAA,IAC5C,2CAA2C,KAAK,WAAW;AAAA,IAC3D,kBAAkB,KAAK,QAAQ;AAAA,IAC/B,oCAAoC,MAAM,SAAS;AAAA,IACnD,2CAA2C,MAAM,YAAY;AAAA,IAC7D,mCAAmC,MAAM,SAAS;AAAA,IAClD,kCAAkC,WAAW;AAAA,IAC7C,oCAAoC,UAAU;AAAA,IAC9C,iCAAiC,eAAe;AAAA,IAChD,oCAAoC,OAAO,UAAU;AAAA,IACrD,qBAAqB,OAAO,OAAO;AAAA,IACnC,6CAA6C,OAAO,SAAS;AAAA,IAC7D,iEAAiE,uBAAuB;AAAA,IACxF,kEAAkE,oBAAoB;AAAA,IACtF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,KAAK,OAAO,WAAW,wBAAwB,OAAO,KAAK;AAAA,IAC3D;AAAA,IACA;AAAA,IACA,+BAA+B,MAAM,SAAS;AAAA,IAC9C,YAAY,OAAO,WAAW;AAAA,IAC9B,WAAW,OAAO,KAAK;AAAA,IACvB,cAAc,KAAK,KAAK;AAAA,IACxB;AAAA,IACA,YAAY,IAAI,CAAC,MAAM,UAAU,GAAG,OAAO,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI;AAAA,IAC5F;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,eAAe,OAAuB;AAC7C,SAAO,IAAI,MAAM,QAAQ,MAAM,KAAK,CAAC;AACvC;AAEA,SAAS,YAAY,OAAuB;AAC1C,SAAO,MAAM,QAAQ,OAAO,GAAG;AACjC;AAEA,eAAe,gBAAgB,MAA6B;AAC1D,QAAM,WACJ,QAAQ,aAAa,UACjB,CAAC,EAAE,SAAS,QAAQ,MAAM,CAAC,EAAE,CAAC,IAC9B,QAAQ,aAAa,WACnB,CAAC,EAAE,SAAS,UAAU,MAAM,CAAC,EAAE,CAAC,IAChC;AAAA,IACE,EAAE,SAAS,WAAW,MAAM,CAAC,EAAE;AAAA,IAC/B,EAAE,SAAS,SAAS,MAAM,CAAC,cAAc,WAAW,EAAE;AAAA,IACtD,EAAE,SAAS,QAAQ,MAAM,CAAC,eAAe,SAAS,EAAE;AAAA,EACtD;AAER,MAAI,YAA0B;AAC9B,aAAW,QAAQ,UAAU;AAC3B,QAAI;AACF,YAAM,cAAc,KAAK,SAAS,KAAK,MAAM,IAAI;AACjD;AAAA,IACF,SAAS,OAAO;AACd,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,MAAM,4BAA4B;AAC3D;AAEA,SAAS,cAAc,SAAiB,MAAgB,OAA8B;AACpF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,MAAM,SAAS,MAAM,EAAE,OAAO,CAAC,QAAQ,UAAU,MAAM,EAAE,CAAC;AACxE,QAAI,SAAS;AACb,QAAI,UAAU;AAEd,UAAM,SAAS,CAAC,UAAwB;AACtC,UAAI,QAAS;AACb,gBAAU;AACV,UAAI,MAAO,QAAO,KAAK;AAAA,UAClB,SAAQ;AAAA,IACf;AAEA,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AACD,UAAM,GAAG,SAAS,MAAM;AACxB,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACd,eAAO;AAAA,MACT,OAAO;AACL,eAAO,IAAI,MAAM,GAAG,OAAO,gBAAgB,IAAI,GAAG,SAAS,KAAK,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;AAAA,MACzF;AAAA,IACF,CAAC;AACD,UAAM,OAAO,IAAI,KAAK;AAAA,EACxB,CAAC;AACH;AApmBA,IA0CM,gBAaA,UA2BA,SAqDA;AAvIN;AAAA;AAAA;AAKA;AACA;AACA;AAmCA,IAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,IAAM,WAAqB;AAAA,MACzB;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,WAAW;AAAA,MACb;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,WAAW;AAAA,MACb;AAAA,IACF;AAEA,IAAM,UAA8B;AAAA,MAClC;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS;AAAA,MACX;AAAA,IACF;AAEA,IAAM,QAA0B;AAAA,MAC9B;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aACE;AAAA,QACF,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aACE;AAAA,QACF,UACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aACE;AAAA,QACF,UACE;AAAA,MACJ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aACE;AAAA,QACF,UACE;AAAA,MACJ;AAAA,IACF;AAAA;AAAA;;;ACvKA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAOM,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,YAAW;AAgBX,SAAS,iBAAiB,KAAa,cAAoC;AAChF,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAM,WAAmB,OAAO;AAEhC,QAAI;AACJ,QAAI,SAAS,SAAS,aAAa,GAAG;AACpC,iBAAW,SAAS,QAAQ,eAAe,EAAE;AAAA,IAC/C,WAAW,SAAS,SAAS,cAAc,GAAG;AAC5C,YAAM,QAAkB,OAAO,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AACjE,iBAAW,MAAM,CAAC,KAAK,SAAS,MAAM,GAAG,EAAE,CAAC;AAAA,IAC9C,WAAW,SAAS,MAAM,6BAA6B,GAAG;AACxD,iBAAW,SAAS,MAAM,UAAU,EAAE,CAAC;AAAA,IACzC,OAAO;AACL,iBAAW,SAAS,QAAQ,OAAO,GAAG;AAAA,IACxC;AAEA,UAAM,YACJ,SACG,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,QAAQ,OAAO,GAAG,EAClB,QAAQ,UAAU,EAAE,KAAK;AAE9B,WAAO,GAAG,YAAY,IAAI,SAAS,IAAI,mBAAmB,CAAC;AAAA,EAC7D,QAAQ;AACN,WAAO,wBAAwB,mBAAmB,CAAC;AAAA,EACrD;AACF;AAEA,SAAS,qBAA6B;AACpC,QAAM,aAAa,CAAC,SAAS,UAAU,SAAS,SAAS,SAAS,SAAS,QAAQ,OAAO;AAC1F,QAAM,QAAQ,CAAC,UAAU,UAAU,QAAQ,SAAS,QAAQ,QAAQ,SAAS,QAAQ;AACrF,QAAM,YAAY,WAAW,KAAK,MAAM,KAAK,OAAO,IAAI,WAAW,MAAM,CAAC;AAC1E,QAAM,OAAO,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,MAAM,CAAC;AAC3D,QAAM,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAChD,SAAO,GAAG,SAAS,IAAI,IAAI,IAAI,EAAE;AACnC;AAvDA,IAyDa;AAzDb;AAAA;AAAA;AAIA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA;AAGA;AACA;AAyCO,IAAM,iBAAN,MAAgD;AAAA,MACrD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA,YAAY,SAAiB,QAAgB,kBAAiC;AAC5E,aAAK,UAAU;AACf,aAAK,SAAS;AACd,aAAK,SAAS,IAAI,SAAS;AAC3B,aAAK,UAAU;AACf,aAAK,OAAO;AACZ,aAAK,UAAU;AACf,aAAK,cAAc;AAEnB,YAAI,oBAAoB,qBAAqB,WAAW;AACtD,eAAK,WAAW,kBAAkB,gBAAgB;AAAA,QACpD,OAAO;AACL,eAAK,WAAW,eAAe,OAAO;AAAA,QACxC;AAAA,MACF;AAAA,MAEA,MAAM,IAAI,kBAA2B,OAAsB;AACzD,gBAAQ;AAAA,UACN;AAAA,IAAO,GAAG,KAAK,KAAK,eAAe,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,GAAG,MAAM,aAAa,CAAC;AAAA;AAAA,QACnF;AACA,aAAK,gBAAgBD,OAAM,UAAU,KAAK,OAAO,CAAC;AAClD,aAAK,gBAAgB,GAAG,QAAQ,KAAK,MAAM,CAAC;AAC5C,aAAK,gBAAgB,GAAG,QAAQ,KAAK,SAAS,WAAW,CAAC;AAC1D,YAAI,iBAAiB;AACnB,eAAK,gBAAgB,GAAG,QAAQ,SAAS,CAAC;AAAA,QAC5C;AACA,gBAAQ,IAAI,EAAE;AAEd,aAAK,UAAU,IAAI,eAAe;AAClC,mBAAW,KAAK,OAAO;AACvB,aAAK,QAAQ,MAAM,0BAA0B;AAE7C,mBAAW,KAAK;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,GAAG;AACD,gBAAMF,IAAG,MAAMC,MAAK,KAAK,KAAK,QAAQ,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,QAC/D;AACA,YAAI,oCAAoC;AAExC,aAAK,QAAQ,OAAO,sBAAsB;AAC1C,YAAI,4BAA4B,KAAK,OAAO;AAC5C,YAAI;AACF,gBAAM,MAAc,MAAM,SAAS,KAAK,OAAO;AAC/C,eAAK,UAAU,IAAI,SAAS,OAAO;AACnC,kBAAQ,wBAAwB,KAAK,QAAQ,SAAS,MAAM,QAAQ,CAAC,IAAI,MAAM;AAAA,QACjF,SAAS,GAAG;AACV,cAAIC,OAAM,IAAI,+BAAgC,EAAY,OAAO,CAAC;AAAA,QACpE;AAEA,cAAM,eAAe,eAAe,KAAK,SAAS,KAAK,OAAO;AAC9D,YAAI,aAAa,SAAS,KAAK,SAAS,MAAM;AAC5C,eAAK,WAAW;AAChB,cAAI,uBAAuB,GAAG,QAAQ,KAAK,SAAS,WAAW,IAAI,uBAAuB;AAAA,QAC5F;AAEA,cAAM,iBAAiB,IAAI;AAE3B,YAAI,mBAAmB,KAAK,MAAM;AAChC,gBAAM,KAAK,cAAc;AAAA,QAC3B;AAEA,cAAM,aAAa,IAAI;AAEvB,aAAK,QAAQ,OAAO,uBAAuB;AAC3C,cAAM,YAAY,IAAI;AAEtB,aAAK,QAAQ,OAAO,oBAAoB;AACxC,cAAM,YAAY,IAAI;AAEtB,aAAK,QAAQ,KAAK;AAClB,mBAAW,IAAI;AAEf,gBAAQ,IAAI,EAAE;AACd,gBAAQ,kBAAkB;AAC1B,cAAM,aAAa,IAAI;AACvB,cAAM,qBAAqB,IAAI;AAAA,MACjC;AAAA,MAEA,MAAc,gBAA+B;AAC3C,aAAK,SAAS,OAAO,0BAA0B;AAC/C,YAAI,qCAAqC;AAEzC,cAAM,OAAO,KAAK;AAClB,cAAM,UAAU,IAAI,IAAI,KAAK,OAAO;AACpC,cAAM,WAAW,QAAQ,SAAS,QAAQ,UAAU,EAAE;AAEtD,cAAM,QAAkB,MAAM,KAAK,SAAS,CAAC,SAAiB;AAC5D,gBAAM,UAAU,MAAM,KAAK,SAAS,iBAAiB,SAAS,CAAC;AAC/D,gBAAM,QAAQ,oBAAI,IAAY;AAC9B,qBAAW,KAAK,SAAS;AACvB,kBAAM,OAAQ,EAAwB;AACtC,gBACE,CAAC,QACD,KAAK,WAAW,aAAa,KAC7B,KAAK,WAAW,SAAS,KACzB,KAAK,WAAW,MAAM,KACtB,KAAK,WAAW,GAAG;AAEnB;AACF,gBAAI;AACF,oBAAM,IAAI,IAAI,IAAI,IAAI;AACtB,oBAAM,IAAI,EAAE,SAAS,QAAQ,UAAU,EAAE;AACzC,kBACE,MAAM,QACN,EAAE,aAAa,OACf,EAAE,aAAa,MACf,CAAC,EAAE,SAAS,WAAW,IAAI,GAC3B;AACA,sBAAM,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,cAC9B;AAAA,YACF,QAAQ;AAAA,YAAC;AAAA,UACX;AACA,iBAAO,MAAM,KAAK,KAAK;AAAA,QACzB,GAAG,QAAQ;AAEX,YAAI,WAAW,MAAM,SAAS,iBAAiB;AAC/C,cAAM,cAAc,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE;AAEnD,YAAI,YAAY,WAAW,GAAG;AAC5B,cAAI,uBAAuB;AAC3B;AAAA,QACF;AAEA,iBAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,gBAAM,OAAO,YAAY,CAAC;AAC1B,eAAK,SAAS,OAAO,wBAAwB,IAAI,KAAK,MAAM,YAAY,MAAM;AAC9E,cAAI;AACF,kBAAM,OAAO,MAAM,eAAe,MAAM,MAAM;AAAA,cAC5C,qBAAqB,KAAK,SAAS;AAAA,cACnC,kBAAkB,KAAK,SAAS;AAAA,YAClC,CAAC;AAED,kBAAM,OAAO,KAAK,WAAW,MAAM,OAAO;AAC1C,kBAAM,WAAW,OAAO;AACxB,kBAAM,WAAWD,MAAK,KAAK,KAAK,QAAQ,YAAY,QAAQ;AAE5D,kBAAMD,IAAG,UAAU,UAAU,MAAM,OAAO;AAC1C,gBAAI,uBAAuB,QAAQ;AAAA,UACrC,SAAS,GAAG;AACV,gBAAI,eAAe,OAAO,OAAQ,EAAY,OAAO;AAAA,UACvD;AAAA,QACF;AAEA,gBAAQ,wBAAwB,YAAY,MAAM;AAAA,MACpD;AAAA,MAEQ,WAAW,MAAc,SAAsB;AACrD,YAAI;AACF,gBAAM,IAAI,IAAI,IAAI,IAAI;AACtB,cAAI,WAAW,EAAE,SAAS,QAAQ,QAAQ,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC/D,cAAI,CAAC,SAAU,QAAO;AACtB,iBAAO,SAAS,QAAQ,mBAAmB,GAAG,EAAE,QAAQ,OAAO,GAAG,KAAK;AAAA,QACzE,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACzOA;AAAA;AAAA;AAAA;AAAA,OAAOI,eAAc;AACrB,SAAS,SAAAC,QAAO,UAAAC,eAAc;AAC9B,OAAOC,WAAU;AACjB,SAAS,OAAAC,YAAW;AACpB,OAAOC,YAAW;AASlB,SAAS,WAAW,OAAqB;AACvC,QAAM,IAAI,SAAS;AACnB,MAAI,IAAI,IAAI;AACV,YAAQ,IAAI;AAAA,IAAO,OAAO,QAAG,CAAC,IAAI,GAAG,KAAK,KAAK,KAAK,CAAC,EAAE;AACvD;AAAA,EACF;AACA,UAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,UAAQ,IAAI,QAAQ,GAAG,GAAG,KAAK,KAAK,OAAO,KAAK,CAAC,CAAC;AAClD,UAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,UAAQ,IAAI,EAAE;AAChB;AAEA,eAAsB,SAAS,aAAsB,OAAsB;AACzE,aAAW;AAEX,UAAQ,IAAI,KAAK,GAAG,KAAK,KAAK,qBAAqB,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE;AAC7E,UAAQ;AAAA,IACN,KAAK,GAAG,MAAM,kEAAkE,CAAC;AAAA;AAAA,EACnF;AAEA,QAAM,KAAK,aAAaL,UAAS,gBAAgB,EAAE,OAAOC,QAAO,QAAQC,QAAO,CAAC,IAAI;AAErF,QAAM,MAAM,OACV,UACA,YACA,cAAwB,CAAC,MACL;AACpB,QAAI,CAAC,YAAY;AACf,aAAO,YAAY,UAAU,cAAc,IAAI,EAAE,YAAY,CAAC;AAAA,IAChE;AAEA,UAAM,SAAiB,aAAaG,OAAM,KAAK,KAAK,UAAU,GAAG,IAAI;AACrE,UAAM,SAAiB,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,KAAK,KAAK,QAAQ,CAAC,GAAG,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC;AAC/F,UAAM,SAAiB,MAAM,GAAI,SAAS,MAAM;AAChD,WAAO,OAAO,KAAK,KAAK,cAAc;AAAA,EACxC;AAEA,MAAI,WAAY,YAAW,mBAAmB;AAE9C,MAAI,UAAU;AACd,MAAI,WAAW;AACf,SAAO,CAAC,SAAS;AACf,UAAM,QAAgB,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,CAAC,qBAAqB,QAAQ,EAAE,OAAO,OAAO;AAAA,IAChD;AACA,QAAI;AACF,UAAID,KAAI,KAAK;AACb,gBAAU;AACV,iBAAW;AAAA,IACb,QAAQ;AACN,iBAAW;AACX,UAAI,YAAY;AACd,gBAAQ,IAAI,KAAK,GAAG,MAAM,QAAG,CAAC,IAAI,GAAG,MAAM,QAAQ,CAAC;AAAA,CAAI;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACA,MAAI,YAAY;AACd,YAAQ,IAAI,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,QAAQ,MAAM,CAAC,IAAIC,OAAM,UAAU,OAAO,CAAC;AAAA,CAAI;AAAA,EACxF;AAEA,MAAI,eAAoC;AAExC,MAAI,YAAY;AACd,eAAW,mBAAmB;AAC9B,UAAM,WAAW,eAAe,OAAO;AACvC,YAAQ,IAAI,KAAK,GAAG,KAAK,GAAG,CAAC,mBAAmB,GAAG,QAAQ,SAAS,WAAW,CAAC,EAAE;AAClF,UAAM,gBAAwB,MAAM,IAAI,iCAAiC,SAAS,IAAI;AACtF,mBACE,CAAC,UAAU,WAAW,KAAK,EAAE,SAAS,aAAa,IAAI,gBAAgB,SAAS;AAElF,YAAQ,IAAI,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,QAAQ,WAAW,CAAC,IAAI,GAAG,QAAQ,YAAY,CAAC;AAAA,CAAI;AAAA,EAC7F,OAAO;AACL,WAAO,CAAC,cAAc;AACpB,YAAM,WAAW,eAAe,OAAO;AACvC,YAAM,YAAY;AAAA,QAChB;AAAA,UACE,OAAO,SAAS,SAAS,SAAS,WAAWA,OAAM,KAAK,aAAa,IAAI,EAAE;AAAA,UAC3E,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,OAAO,UAAU,SAAS,SAAS,YAAYA,OAAM,KAAK,aAAa,IAAI,EAAE;AAAA,UAC7E,OAAO;AAAA,QACT;AAAA,QACA,EAAE,OAAO,MAAM,SAAS,SAAS,QAAQA,OAAM,KAAK,aAAa,IAAI,EAAE,IAAI,OAAO,MAAM;AAAA,MAC1F;AACA,YAAM,aAAa,CAAC,UAAU,WAAW,KAAK,EAAE,QAAQ,SAAS,IAAI;AACrE,YAAM,iBAAiB,MAAM,OAAO,mBAAmB,WAAW,KAAK,IAAI,GAAG,UAAU,GAAG;AAAA,QACzF,aAAa,CAAC,QAAQ,OAAO,EAAE;AAAA,QAC/B,SAAS,CAAC,EAAE,OAAO,cAAc,OAAO,aAAa,CAAC;AAAA,QACtD,QAAQ;AAAA,MACV,CAAC;AAED,UAAI,mBAAmB,cAAc;AACnC,kBAAU;AACV,mBAAW;AACX,eAAO,CAAC,SAAS;AACf,gBAAM,QAAQ,MAAM;AAAA,YAClB;AAAA,YACA;AAAA,YACA,CAAC,qBAAqB,QAAQ,EAAE,OAAO,OAAO;AAAA,UAChD;AACA,cAAI;AACF,gBAAID,KAAI,KAAK;AACb,sBAAU;AACV,uBAAW;AAAA,UACb,QAAQ;AACN,uBAAW;AAAA,UACb;AAAA,QACF;AACA;AAAA,MACF;AAEA,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,QAAM,MAAM,aAAa,KAAM;AAE/B,QAAM,OAAO,OACX,UACA,YACA,cAAwB,CAAC,MACL;AACpB,QAAI,CAAC,YAAY;AACf,aAAO,YAAY,UAAU,cAAc,IAAI,EAAE,YAAY,CAAC;AAAA,IAChE;AAEA,UAAM,SAAiB,aAAaC,OAAM,KAAK,KAAK,UAAU,GAAG,IAAI;AACrE,UAAM,SAAiB,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,KAAK,KAAK,QAAQ,CAAC,GAAG,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC;AAC/F,UAAM,SAAiB,MAAM,IAAK,SAAS,MAAM;AACjD,WAAO,OAAO,KAAK,KAAK,cAAc;AAAA,EACxC;AAEA,QAAM,cAAsB,iBAAiB,SAAS,YAAY;AAElE,MAAI,WAAY,YAAW,2BAA2B;AAEtD,QAAM,SAAiB,MAAM,KAAK,oBAAoB,OAAO,aAAa;AAAA,IACxE;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,aAAa,YAAY;AAAA,EAC3B,CAAC;AACD,MAAI,YAAY;AACd,YAAQ,IAAI,KAAK,GAAG,QAAQ,QAAG,CAAC,IAAI,GAAG,QAAQ,SAAS,CAAC,IAAI,GAAG,QAAQ,MAAM,CAAC;AAAA,CAAI;AAAA,EACrF;AAEA,MAAI,WAAY,YAAW,kBAAkB;AAE7C,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,YAAY;AACd,UAAM,eAAuB,MAAM,KAAK,gCAAgC,GAAG;AAC3E,kBAAc,aAAa,YAAY,EAAE,WAAW,GAAG;AACvD,YAAQ;AAAA,MACN,KAAK,GAAG,QAAQ,QAAG,CAAC,kBAAkB,cAAc,GAAG,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;AAAA;AAAA,IACxF;AAEA,UAAM,iBAAyB,MAAM,KAAK,2BAA2B,GAAG;AACxE,sBAAkB,eAAe,YAAY,EAAE,WAAW,GAAG;AAC7D,YAAQ;AAAA,MACN,KAAK,GAAG,QAAQ,QAAG,CAAC,eAAe,kBAAkB,GAAG,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;AAAA;AAAA,IACzF;AAEA,UAAM,oBAA4B,MAAM,KAAK,wBAAwB,IAAI;AACzE,kBAAc,SAAS,mBAAmB,EAAE,KAAK;AACjD,YAAQ,IAAI,KAAK,GAAG,QAAQ,QAAG,CAAC,iBAAiB,GAAG,QAAQ,OAAO,WAAW,CAAC,CAAC;AAAA,CAAI;AAAA,EACtF,OAAO;AACL,UAAM,YAAY,MAAM,OAAO,0BAA0B;AAAA,MACvD,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,MAC7B,EAAE,OAAO,MAAM,OAAO,KAAK;AAAA,IAC7B,CAAC;AACD,kBAAc,cAAc;AAE5B,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,QACE,EAAE,OAAO,MAAM,OAAO,KAAK;AAAA,QAC3B,EAAE,OAAO,yBAAyB,OAAO,MAAM;AAAA,MACjD;AAAA,MACA;AAAA,IACF;AACA,sBAAkB,gBAAgB;AAElC,UAAM,iBAAiB,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,QACE,EAAE,OAAO,uBAAuB,OAAO,IAAI;AAAA,QAC3C,EAAE,OAAO,gBAAgB,OAAO,KAAK;AAAA,QACrC,EAAE,OAAO,wBAAwB,OAAO,KAAK;AAAA,MAC/C;AAAA,MACA;AAAA,IACF;AACA,kBAAc,SAAS,gBAAgB,EAAE;AAAA,EAC3C;AAEA,QAAM,IAAI,SAAS;AACnB,QAAM,UAAU,IAAI;AACpB,UAAQ,IAAI,EAAE;AACd,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,OAAO,CAAC,CAAC;AACrB,YAAQ,IAAI,QAAQ,GAAG,GAAG,KAAK,KAAK,WAAW,CAAC,CAAC;AACjD,YAAQ,IAAI,OAAO,CAAC,CAAC;AAAA,EACvB,OAAO;AACL,YAAQ,IAAI,GAAG,KAAK,KAAK,YAAY,CAAC;AAAA,EACxC;AAEA,aAAW,CAAC,OAAO,KAAK,KAAK;AAAA,IAC3B,CAAC,OAAO,OAAO;AAAA,IACf,CAAC,YAAY,YAAY;AAAA,IACzB,CAAC,UAAUF,MAAK,QAAQ,MAAM,CAAC;AAAA,IAC/B,CAAC,gBAAgB,cAAc,QAAQ,IAAI;AAAA,IAC3C,CAAC,aAAa,kBAAkB,QAAQ,IAAI;AAAA,IAC5C,CAAC,eAAe,OAAO,WAAW,CAAC;AAAA,EACrC,GAAG;AACD,YAAQ,IAAI,OAAO,GAAG,OAAO,KAAK,CAAC;AAAA,EACrC;AAEA,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,OAAO,CAAC,CAAC;AAAA,EACvB;AACA,UAAQ,IAAI,EAAE;AAEd,MAAI;AAEJ,MAAI,YAAY;AACd,UAAM,UAAkB,MAAM,KAAK,uBAAuB,GAAG;AAC7D,kBAAc,QAAQ,YAAY,EAAE,WAAW,GAAG;AAClD,QAAK,MAAM;AAAA,EACb,OAAO;AACL,UAAM,aAAa,MAAM,OAAO,iBAAiB;AAAA,MAC/C,EAAE,OAAO,kBAAkB,OAAO,MAAM;AAAA,MACxC,EAAE,OAAO,UAAU,OAAO,KAAK;AAAA,IACjC,CAAC;AACD,kBAAc,eAAe;AAAA,EAC/B;AAEA,MAAI,CAAC,aAAa;AAChB,YAAQ,IAAI;AAAA,IAAO,GAAG,QAAQ,mBAAmB,CAAC;AAAA,CAAI;AACtD;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AAEd,QAAM,EAAE,KAAAG,KAAI,IAAI,MAAM;AACtB,EAAAA,KAAI,cAAc;AAElB,QAAM,WAAW,IAAI,eAAe,SAASH,MAAK,QAAQ,MAAM,GAAG,YAAY;AAC/E,WAAS,cAAc;AACvB,QAAM,SAAS,IAAI,eAAe;AACpC;AA9QA;AAAA;AAAA;AAKA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;;;ACRA;AAHA,OAAOI,WAAU;AACjB,SAAS,OAAAC,YAAW;AACpB,SAAS,iBAAiB;;;ACF1B;AACA;AAEO,SAAS,WAAiB;AAC/B,aAAW;AAEX,UAAQ,IAAI,GAAG,GAAG,KAAK,KAAK,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC;AAAA,CAAI;AACzD,UAAQ;AAAA,IACN,OAAO,GAAG,QAAQ,eAAe,CAAC,IAAI,GAAG,QAAQ,OAAO,CAAC,IAAI,GAAG,MAAM,cAAc,CAAC;AAAA,EACvF;AACA,UAAQ;AAAA,IACN,OAAO,GAAG,QAAQ,SAAS,CAAC,YAAY,GAAG,QAAQ,OAAO,CAAC,IAAI,GAAG,MAAM,cAAc,CAAC;AAAA,EACzF;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,GAAG,KAAK,KAAK,aAAa,CAAC;AAEvC,QAAM,OAAgC;AAAA,IACpC,CAAC,WAAW,wCAAwC;AAAA,IACpD,CAAC,kBAAkB,sCAAsC;AAAA,IACzD,CAAC,cAAc,4BAA4B;AAAA,IAC3C,CAAC,iBAAiB,2CAA2C;AAAA,IAC7D,CAAC,cAAc,wBAAwB;AAAA,EACzC;AAEA,aAAW,CAAC,MAAM,IAAI,KAAK,MAAM;AAC/B,YAAQ,IAAI,OAAO,GAAG,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,EAAE;AAAA,EACnE;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,GAAG,KAAK,KAAK,yBAAyB,CAAC;AAEnD,QAAM,YAAqC;AAAA,IACzC,CAAC,UAAU,sDAAsD;AAAA,IACjE,CAAC,WAAW,oCAAoC;AAAA,IAChD,CAAC,OAAO,qDAAqD;AAAA,EAC/D;AAEA,aAAW,CAAC,MAAM,IAAI,KAAK,WAAW;AACpC,YAAQ,IAAI,OAAO,GAAG,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE;AAAA,EACpE;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,GAAG,KAAK,KAAK,cAAc,CAAC;AACxC,UAAQ;AAAA,IACN,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,GAAG,QAAQ,eAAe,CAAC,IAAI,GAAG,QAAQ,2BAA2B,CAAC;AAAA,EAChG;AACA,UAAQ;AAAA,IACN,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,GAAG,QAAQ,eAAe,CAAC,IAAI,GAAG,QAAQ,2BAA2B,CAAC;AAAA,EAChG;AACA,UAAQ;AAAA,IACN,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,GAAG,QAAQ,eAAe,CAAC,IAAI,GAAG,QAAQ,kCAAkC,CAAC;AAAA,EACvG;AACA,UAAQ;AAAA,IACN,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,GAAG,QAAQ,eAAe,CAAC,IAAI,GAAG,QAAQ,oBAAoB,CAAC,IAAI,GAAG,QAAQ,oBAAoB,CAAC;AAAA,EAC7H;AACA,UAAQ;AAAA,IACN,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,GAAG,QAAQ,eAAe,CAAC,IAAI,GAAG,QAAQ,YAAY,CAAC,IAAI,GAAG,QAAQ,oBAAoB,CAAC;AAAA,EACrH;AACA,UAAQ,IAAI,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,GAAG,QAAQ,eAAe,CAAC,IAAI,GAAG,QAAQ,SAAS,CAAC,EAAE;AAC1F,UAAQ;AAAA,IACN,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,GAAG,QAAQ,eAAe,CAAC,IAAI,GAAG,QAAQ,uBAAuB,CAAC;AAAA,EAC5F;AACA,UAAQ,IAAI,EAAE;AAChB;;;AD3DA;AACA;;;AENA,OAAO,WAAW;AAElB,eAAsB,gBAAgB,gBAAgD;AACpF,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,MAAM,MAAM;AAAA,MAChB;AAAA,MACA,EAAE,SAAS,IAAK;AAAA,MAChB,CAAC,QAAQ;AACP,YAAI,OAAO;AACX,YAAI,GAAG,QAAQ,CAAC,UAAW,QAAQ,KAAM;AACzC,YAAI,GAAG,OAAO,MAAM;AAClB,cAAI;AACF,kBAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,kBAAM,SAAS,KAAK;AACpB,gBAAI,CAAC,OAAQ,QAAO,QAAQ,IAAI;AAChC,gBAAI,eAAe,QAAQ,cAAc,EAAG,QAAO,QAAQ,MAAM;AACjE,oBAAQ,IAAI;AAAA,UACd,QAAQ;AACN,oBAAQ,IAAI;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,GAAG,SAAS,MAAM,QAAQ,IAAI,CAAC;AACnC,QAAI,GAAG,WAAW,MAAM;AACtB,UAAI,QAAQ;AACZ,cAAQ,IAAI;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,eAAe,QAAgB,SAA0B;AAChE,QAAM,cAAc,aAAa,MAAM;AACvC,QAAM,eAAe,aAAa,OAAO;AAEzC,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,YAAY,QAAQ,aAAa,MAAM,GAAG,KAAK;AAC1E,UAAM,aAAa,YAAY,CAAC,KAAK;AACrC,UAAM,cAAc,aAAa,CAAC,KAAK;AACvC,QAAI,aAAa,YAAa,QAAO;AACrC,QAAI,aAAa,YAAa,QAAO;AAAA,EACvC;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,SAA2B;AAC/C,SAAO,QACJ,QAAQ,MAAM,EAAE,EAChB,MAAM,MAAM,EACZ,IAAI,CAAC,SAAS,OAAO,SAAS,MAAM,EAAE,CAAC,EACvC,OAAO,CAAC,SAAS,OAAO,SAAS,IAAI,CAAC;AAC3C;;;AF3CA;AACA;AAGA,IAAM,UAAU,gBAAI;AAEpB,SAAS,YAAY,MAAgB,MAA6B;AAChE,QAAM,MAAc,KAAK,QAAQ,IAAI;AACrC,MAAI,QAAQ,MAAM,MAAM,KAAK,KAAK,OAAQ,QAAO;AACjD,QAAM,QAAgB,KAAK,MAAM,CAAC;AAClC,OAAK,OAAO,KAAK,CAAC;AAClB,SAAO;AACT;AAEA,SAAS,QAAQ,MAAgB,MAAuB;AACtD,QAAM,MAAc,KAAK,QAAQ,IAAI;AACrC,MAAI,QAAQ,GAAI,QAAO;AACvB,OAAK,OAAO,KAAK,CAAC;AAClB,SAAO;AACT;AAEA,eAAe,mBAAkC;AAC/C,QAAM,SAAS,MAAM,gBAAgB,OAAO;AAC5C,MAAI,CAAC,OAAQ;AAEb,MAAI,CAAC,QAAQ,MAAM,SAAS,CAAC,QAAQ,OAAO,OAAO;AACjD,YAAQ,IAAI,EAAE;AACd,YAAQ;AAAA,MACN,KAAK,GAAG,QAAQ,QAAG,CAAC,sBAAsB,GAAG,MAAM,OAAO,CAAC,OAAO,GAAG,QAAQ,MAAM,CAAC;AAAA,IACtF;AACA,YAAQ,IAAI,KAAK,GAAG,QAAQ,QAAQ,CAAC,IAAI,GAAG,YAAY,+BAA+B,CAAC,EAAE;AAC1F,YAAQ,IAAI,EAAE;AACd;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,MACE,EAAE,OAAO,6BAA6B,OAAO,WAAW;AAAA,MACxD,EAAE,OAAO,cAAc,OAAO,SAAS;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,QACX,oBAAoB,OAAO;AAAA,QAC3B,oBAAoB,MAAM;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,WAAW,UAAU;AACvB,YAAQ;AAAA,MACN,KAAK,GAAG,QAAQ,WAAW,CAAC,IAAI,GAAG,YAAY,+BAA+B,CAAC;AAAA;AAAA,IACjF;AACA,UAAM,aAAa,QAAQ,aAAa,UAAU,YAAY;AAC9D,UAAM,SAAS,UAAU,YAAY,CAAC,KAAK,MAAM,sBAAsB,GAAG;AAAA,MACxE,OAAO;AAAA,IACT,CAAC;AAED,QAAI,OAAO,WAAW,GAAG;AACvB,cAAQ,IAAI;AAAA,IAAO,GAAG,QAAQ,QAAG,CAAC;AAAA,CAAyD;AAC3F,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,YAAQ;AAAA,MACN;AAAA,IAAO,GAAG,MAAM,QAAG,CAAC,iCAAiC,GAAG,YAAY,+BAA+B,CAAC;AAAA;AAAA,IACtG;AAAA,EACF;AACF;AAEA,eAAe,OAAsB;AACnC,QAAM,OAAiB,QAAQ,KAAK,MAAM,CAAC;AAE3C,MAAI,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,IAAI,GAAG;AACrD,YAAQ,IAAI,OAAO;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,UAAMC,UAAS,MAAM,OAAO,OAAO,GAAG;AACtC,eAAW;AACX,YAAQ,IAAI,KAAK,GAAG,KAAK,KAAK,eAAe,CAAC,KAAK,GAAG,MAAM,IAAI,gBAAI,OAAO,EAAE,CAAC,EAAE;AAChF,YAAQ,IAAI,KAAK,GAAG,KAAK,gBAAI,WAAW,CAAC;AAAA,CAAI;AAC7C,YAAQ,IAAI,KAAK,GAAG,KAAK,KAAK,QAAQ,CAAC,QAAQ,GAAG,QAAQ,iBAAiB,CAAC,EAAE;AAC9E,YAAQ;AAAA,MACN,KAAK,GAAG,KAAK,KAAK,WAAW,CAAC,KAAKA,OAAM,UAAU,IAAI,SAAS,EAAE,6BAA6B,CAAC;AAAA,IAClG;AACA,YAAQ;AAAA,MACN,KAAK,GAAG,KAAK,KAAK,QAAQ,CAAC,QAAQA,OAAM,UAAU,IAAI,SAAS,EAAE,gBAAI,WAAW,IAAI,QAAQ,QAAQ,EAAE,EAAE,QAAQ,QAAQ,EAAE,CAAC,CAAC;AAAA,IAC/H;AACA,YAAQ;AAAA,MACN,KAAK,GAAG,KAAK,KAAK,KAAK,CAAC,WAAWA,OAAM,UAAU,IAAI,SAAS,EAAE,iCAAiC,gBAAI,IAAI,EAAE,CAAC;AAAA,IAChH;AACA,YAAQ,IAAI,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,OAAO,GAAG,QAAQ,gBAAI,OAAO,CAAC,EAAE;AACxE,YAAQ,IAAI,KAAK,GAAG,KAAK,KAAK,MAAM,CAAC,UAAU,GAAG,MAAM,KAAK,gBAAI,QAAQ,IAAI,EAAE,CAAC,EAAE;AAClF,YAAQ,IAAI,EAAE;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAClD,aAAS;AACT,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,iBAAiB,OAAO;AAC9B,QAAM,iBAAiB;AAEvB,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,YAAQ,MAAM,SAAS;AACvB,UAAM,aAAsB,QAAQ,MAAM,eAAe;AACzD,UAAM,EAAE,UAAAC,UAAS,IAAI,MAAM;AAC3B,UAAMA,UAAS,UAAU;AACzB;AAAA,EACF;AAEA,MAAI,CAAC,KAAK,QAAQ;AAChB,UAAM,EAAE,UAAAA,UAAS,IAAI,MAAM;AAC3B,UAAMA,UAAS,KAAK;AACpB;AAAA,EACF;AAEA,QAAM,mBAAmB,YAAY,MAAM,YAAY;AACvD,QAAM,kBAA2B,QAAQ,MAAM,YAAY;AAE3D,aAAW;AAEX,QAAM,MAAc,KAAK,CAAC;AAE1B,MAAI;AACF,QAAIC,KAAI,GAAG;AAAA,EACb,QAAQ;AACN,YAAQ,IAAI,KAAK,GAAG,MAAM,QAAG,CAAC,IAAI,GAAG,MAAM,KAAK,cAAc,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE;AACjF,YAAQ,IAAI,KAAK,GAAG,MAAM,uCAAuC,CAAC;AAAA,CAAI;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,gBAAAC,iBAAgB,kBAAAC,kBAAiB,IAAI,MAAM;AACnD,QAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM;AAEjC,QAAM,WAAW,oBAAoBA,gBAAe,GAAG,EAAE;AACzD,QAAM,aAAqBD,kBAAiB,KAAK,QAAwB;AACzE,QAAM,MAAc,KAAK,CAAC,KAAK,KAAK,UAAU;AAE9C,MAAI;AACF,UAAM,IAAID,gBAAe,KAAKG,MAAK,QAAQ,GAAG,GAAG,oBAAoB,MAAS,EAAE;AAAA,MAC9E;AAAA,IACF;AAAA,EACF,SAAS,GAAG;AACV,UAAMN,UAAS,MAAM,OAAO,OAAO,GAAG;AACtC,YAAQ;AAAA,MACN;AAAA,IAAO,GAAG,MAAM,QAAG,CAAC,IAAI,GAAG,MAAM,KAAK,SAAS,CAAC,IAAI,GAAG,KAAM,EAAY,OAAO,CAAC;AAAA,IACnF;AACA,YAAQ,IAAIA,OAAM,KAAM,EAAY,SAAS,EAAE,CAAC;AAChD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,KAAK;","names":["chalk","chalk","output","URL","https","URL","chalk","FONT_EXTS","IMG_EXTS","FONT_EXTS","VIDEO_EXTS","path","init_download","fs","path","fs","path","fs","path","stdin","stdout","target","goal","centerText","fs","path","chalk","init_download","readline","stdin","stdout","path","URL","chalk","CFG","path","URL","chalk","runSetup","URL","FramerExporter","deriveOutputName","detectPlatform","path"]}
1
+ {"version":3,"sources":["../../package.json","../../src/cli/theme.ts","../../src/cli/banner.ts","../../src/cli/cooking.ts","../../src/cli/box.ts","../../src/cli/select.ts","../../src/assets/asset-map.ts","../../src/config/index.ts","../../src/network/download.ts","../../src/logger/index.ts","../../src/platforms/framer.ts","../../src/platforms/webflow.ts","../../src/platforms/wix.ts","../../src/platforms/detect.ts","../../src/platforms/index.ts","../../src/exporter/capture.ts","../../src/network/pool.ts","../../src/exporter/download.ts","../../src/formatter/prettify.ts","../../src/server/template.ts","../../src/exporter/output.ts","../../src/exporter/summary.ts","../../src/ai/prompt-assistant.ts","../../src/exporter/index.ts","../../src/cli/setup.ts","../../src/cli/index.ts","../../src/cli/help.ts","../../src/cli/update-check.ts"],"sourcesContent":["{\n \"name\": \"framer-export\",\n \"version\": \"4.4.3\",\n \"description\": \"Export any Framer, Webflow, or Wix site into a fully working local mirror. Downloads all assets, strips badges, rewrites URLs, and pretty-prints JS.\",\n \"type\": \"module\",\n \"main\": \"dist/cli/index.js\",\n \"types\": \"dist/cli/index.d.ts\",\n \"bin\": {\n \"framer-export\": \"./bin/framer-export.js\",\n \"fexport\": \"./bin/fexport.js\",\n \"framerexport\": \"./bin/framerexport.js\"\n },\n \"files\": [\n \"dist/\",\n \"bin/\",\n \"LICENSE\",\n \"README.md\"\n ],\n \"scripts\": {\n \"start\": \"tsx src/cli/index.ts\",\n \"dev\": \"tsx src/cli/index.ts\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"prepublishOnly\": \"npm run build\",\n \"prepack\": \"npm run build\"\n },\n \"keywords\": [\n \"framer\",\n \"webflow\",\n \"wix\",\n \"exporter\",\n \"export\",\n \"scraper\",\n \"mirror\",\n \"site-downloader\",\n \"site-export\",\n \"cli\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/danbenba/FramerExport.git\"\n },\n \"homepage\": \"https://github.com/danbenba/FramerExport#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/danbenba/FramerExport/issues\"\n },\n \"license\": \"MIT\",\n \"author\": \"Dany (danbenba)\",\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.3.0\",\n \"ora\": \"^8.0.0\",\n \"prettier\": \"^3.2.0\",\n \"puppeteer\": \"^22.0.0\",\n \"readline-promise\": \"^1.0.5\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.4.0\"\n }\n}\n","import chalk from 'chalk';\n\nexport const THEME = {\n background: '#0A0A0A',\n panel: '#141414',\n element: '#1E1E1E',\n border: '#484848',\n borderActive: '#606060',\n text: '#EEEEEE',\n muted: '#808080',\n primary: '#FAB283',\n primarySoft: '#FFC09F',\n secondary: '#5C9CF5',\n accent: '#9D7CD8',\n success: '#7FD88F',\n warning: '#F5A742',\n error: '#E06C75',\n info: '#56B6C2',\n};\n\nexport const ui = {\n text: chalk.hex(THEME.text),\n muted: chalk.hex(THEME.muted),\n primary: chalk.hex(THEME.primary),\n primarySoft: chalk.hex(THEME.primarySoft),\n secondary: chalk.hex(THEME.secondary),\n accent: chalk.hex(THEME.accent),\n success: chalk.hex(THEME.success),\n warning: chalk.hex(THEME.warning),\n error: chalk.hex(THEME.error),\n info: chalk.hex(THEME.info),\n border: chalk.hex(THEME.border),\n borderActive: chalk.hex(THEME.borderActive),\n panel: chalk.hex(THEME.panel),\n};\n\nexport function stripAnsi(s: string): string {\n return s.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n}\n\nexport function softGradient(text: string): string {\n const colors = [THEME.primary, THEME.primarySoft, THEME.text, THEME.primarySoft, THEME.primary];\n let cursor = 0;\n return text\n .split('')\n .map((char) => {\n if (char === ' ') return char;\n const color = colors[cursor % colors.length];\n cursor++;\n return chalk.hex(color).bold(char);\n })\n .join('');\n}\n\nexport function chip(label: string): string {\n return `${ui.border('[')}${ui.primary(label)}${ui.border(']')}`;\n}\n\nexport function bullet(label: string = '•'): string {\n return ui.primary(label);\n}\n\nexport function centerText(text: string, width: number): string {\n const visible = stripAnsi(text).length;\n if (visible >= width) return text;\n const left = Math.floor((width - visible) / 2);\n return ' '.repeat(left) + text + ' '.repeat(width - visible - left);\n}\n\nexport function truncatePlain(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, Math.max(0, max - 2)) + '..';\n}\n","import pkg from '../../package.json';\nimport { chip, softGradient, ui } from './theme.js';\n\nfunction getWidth(): number {\n return process.stdout.columns || 80;\n}\n\nconst ASCII_ART = [\n '███████╗██████╗ █████╗ ███╗ ███╗███████╗██████╗ ',\n '██╔════╝██╔══██╗██╔══██╗████╗ ████║██╔════╝██╔══██╗',\n '█████╗ ██████╔╝███████║██╔████╔██║█████╗ ██████╔╝',\n '██╔══╝ ██╔══██╗██╔══██║██║╚██╔╝██║██╔══╝ ██╔══██╗',\n '██║ ██║ ██║██║ ██║██║ ╚═╝ ██║███████╗██║ ██║',\n '╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝',\n '███████╗██╗ ██╗██████╗ ██████╗ ██████╗ ████████╗',\n '██╔════╝╚██╗██╔╝██╔══██╗██╔═══██╗██╔══██╗╚══██╔══╝',\n '█████╗ ╚███╔╝ ██████╔╝██║ ██║██████╔╝ ██║ ',\n '██╔══╝ ██╔██╗ ██╔═══╝ ██║ ██║██╔══██╗ ██║ ',\n '███████╗██╔╝ ██╗██║ ╚██████╔╝██║ ██║ ██║ ',\n '╚══════╝╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ',\n];\n\nexport function showBanner(): void {\n const width = getWidth();\n const isSmall = width < 65;\n\n if (isSmall) {\n console.log(\n `\\n ${ui.primary.bold('f-export')} ${ui.muted(`v${pkg.version}`)} ${chip('beta ui')}`\n );\n console.log(` ${ui.text.bold('Framer Export')} ${ui.muted('for Framer, Webflow, and Wix')}\\n`);\n return;\n }\n\n console.log('');\n ASCII_ART.forEach((line) => {\n console.log(' ' + softGradient(line));\n });\n console.log('');\n console.log(\n ` ${ui.muted(`v${pkg.version}`)} ${ui.text.bold('Framer Export')} ${chip('fexport')} ${ui.muted('local mirror exporter')}`\n );\n console.log(\n ` ${ui.muted('Framer')} ${ui.border('/')} ${ui.muted('Webflow')} ${ui.border('/')} ${ui.muted('Wix')} ${ui.border('·')} ${ui.primary('clean assets')} ${ui.border('·')} ${ui.secondary('local serve')}\\n`\n );\n}\n","import chalk from 'chalk';\nimport { ui } from './theme.js';\n\nconst SHINE_WIDTH = 14;\nconst FRAME_INTERVAL = 70;\nconst INTRO_DURATION = 1400;\nconst SHINE_SPEED = 0.55;\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport async function showLoadingIntro(version: string): Promise<void> {\n if (!process.stdout.isTTY || process.env.CI) return;\n\n await new Promise<void>((resolve) => {\n let frame = 0;\n\n const draw = (): void => {\n const spinner = SPINNER_FRAMES[frame % SPINNER_FRAMES.length];\n const title = renderShinyText(`Framer Export v${version}`, frame, {\n baseColor: '#969696',\n shineColor: '#ffffff',\n shineWidth: 18,\n speed: 1.2,\n });\n const dots = '.'.repeat(frame % 4).padEnd(3, ' ');\n process.stdout.write(\n `\\r\\x1B[2K ${ui.primary(spinner)} ${title} ${ui.muted(`Loading${dots}`)}`\n );\n frame++;\n };\n\n process.stdout.write('\\x1B[?25l');\n draw();\n const interval = setInterval(draw, FRAME_INTERVAL);\n setTimeout(() => {\n clearInterval(interval);\n process.stdout.write('\\r\\x1B[2K\\x1B[?25h');\n resolve();\n }, INTRO_DURATION);\n });\n}\n\nexport class CookingSpinner {\n private interval: NodeJS.Timeout | null = null;\n private frame = 0;\n private phase = '';\n private active = false;\n\n start(phase: string = ''): void {\n this.phase = phase;\n this.frame = 0;\n this.active = true;\n this.draw();\n this.interval = setInterval(() => {\n this.frame++;\n this.draw();\n }, FRAME_INTERVAL);\n }\n\n update(phase: string): void {\n this.phase = phase;\n }\n\n log(message: string): void {\n if (this.active) {\n process.stdout.write('\\r\\x1B[2K');\n }\n process.stdout.write(message + '\\n');\n if (this.active) {\n this.draw();\n }\n }\n\n stop(): void {\n this.active = false;\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n }\n process.stdout.write('\\r\\x1B[2K');\n }\n\n private draw(): void {\n if (!this.active) return;\n\n const spinner = SPINNER_FRAMES[this.frame % SPINNER_FRAMES.length];\n const shimmer = renderShinyText('Exporting', this.frame);\n const frameStr = ui.primary(spinner);\n const phaseStr = this.phase ? ` ${ui.muted(this.limitLen(this.phase, 52))}` : '';\n\n process.stdout.write(`\\r\\x1B[2K ${frameStr} ${shimmer}${phaseStr}`);\n }\n\n private limitLen(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max - 1) + '…';\n }\n}\n\nfunction renderShinyText(\n text: string,\n frame: number,\n options: { baseColor?: string; shineColor?: string; shineWidth?: number; speed?: number } = {}\n): string {\n const baseColor = options.baseColor || '#808080';\n const shineColor = options.shineColor || '#ffffff';\n const shineWidth = options.shineWidth || SHINE_WIDTH;\n const speed = options.speed ?? SHINE_SPEED;\n const travel = text.length + shineWidth * 2;\n const pos = ((frame * speed) % travel) - shineWidth;\n const base = hexToRgb(baseColor);\n const shine = hexToRgb(shineColor);\n\n let result = '';\n for (let i = 0; i < text.length; i++) {\n const dist = Math.abs(i - pos);\n const intensity = smoothstep(0, 1, 1 - Math.min(1, dist / shineWidth));\n const color = mixRgb(base, shine, intensity);\n const paint =\n intensity > 0.82\n ? chalk.rgb(color.r, color.g, color.b).bold\n : chalk.rgb(color.r, color.g, color.b);\n result += paint(text[i]);\n }\n return result;\n}\n\nfunction smoothstep(edge0: number, edge1: number, value: number): number {\n const t = Math.max(0, Math.min(1, (value - edge0) / (edge1 - edge0)));\n return t * t * (3 - 2 * t);\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n const clean = hex.replace('#', '');\n const normalized =\n clean.length === 3\n ? clean\n .split('')\n .map((char) => char + char)\n .join('')\n : clean.padEnd(6, '0').slice(0, 6);\n\n return {\n r: Number.parseInt(normalized.slice(0, 2), 16),\n g: Number.parseInt(normalized.slice(2, 4), 16),\n b: Number.parseInt(normalized.slice(4, 6), 16),\n };\n}\n\nfunction mixRgb(\n from: { r: number; g: number; b: number },\n to: { r: number; g: number; b: number },\n amount: number\n): { r: number; g: number; b: number } {\n return {\n r: Math.round(from.r + (to.r - from.r) * amount),\n g: Math.round(from.g + (to.g - from.g) * amount),\n b: Math.round(from.b + (to.b - from.b) * amount),\n };\n}\n","import chalk from 'chalk';\nimport { stripAnsi, ui } from './theme.js';\n\nexport function maxWidth(): number {\n return Math.min(process.stdout.columns || 80, 76);\n}\n\nfunction padRight(text: string, w: number): string {\n const fitted = fitAnsi(text, w);\n const visible = stripAnsi(fitted).length;\n if (visible >= w) return fitted;\n return fitted + ' '.repeat(w - visible);\n}\n\nfunction fitAnsi(text: string, width: number): string {\n if (stripAnsi(text).length <= width) return text;\n if (width <= 2) return '.'.repeat(Math.max(0, width));\n\n let out = '';\n let visible = 0;\n let i = 0;\n const limit = width - 2;\n\n while (i < text.length && visible < limit) {\n if (text[i] === '\\x1B') {\n const match = text.slice(i).match(/^\\x1B\\[[0-9;]*[a-zA-Z]/);\n if (match) {\n out += match[0];\n i += match[0].length;\n continue;\n }\n }\n\n out += text[i];\n visible++;\n i++;\n }\n\n return out + '..' + '\\x1B[0m';\n}\n\nfunction fitValue(value: string, width: number): string {\n if (value.length <= width) return value;\n\n const pathLike = value.includes('\\\\') || value.includes('/');\n if (pathLike) {\n const shortened = shortenPath(value, width);\n if (shortened.length <= width) return shortened;\n }\n\n if (width <= 3) return '.'.repeat(Math.max(0, width));\n return value.slice(0, width - 2) + '..';\n}\n\nfunction shortenPath(value: string, width: number): string {\n if (width <= 12) {\n return width <= 3 ? '.'.repeat(Math.max(0, width)) : value.slice(0, width - 2) + '..';\n }\n\n const separator = value.includes('\\\\') ? '\\\\' : '/';\n const parts = value.split(/[\\\\/]+/).filter(Boolean);\n const prefix = value.startsWith(separator) ? separator : '';\n const shortened = parts\n .map((part, index) => {\n const isLast = index === parts.length - 1;\n if (isLast) return part;\n if (/^[A-Za-z]:$/.test(part)) return part;\n return part.length > 5 ? part.slice(0, 3) + '..' : part;\n })\n .join(separator);\n\n const withPrefix = prefix + shortened;\n if (withPrefix.length <= width) return withPrefix;\n\n const last = parts.at(-1) || value;\n const first = parts\n .slice(0, -1)\n .map((part) => (/^[A-Za-z]:$/.test(part) ? part : part.slice(0, 3) + '..'));\n const compact = prefix + [...first, last].join(separator);\n if (compact.length <= width) return compact;\n\n const tailSpace = Math.max(8, Math.floor(width * 0.45));\n const headSpace = Math.max(0, width - tailSpace - 4);\n const middle =\n compact.slice(0, headSpace) + separator + '..' + separator + compact.slice(-tailSpace);\n return middle.length <= width ? middle : compact.slice(0, width - 2) + '..';\n}\n\nexport function boxTop(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('╭─') + ui.border('─'.repeat(inner)) + ui.border('─╮');\n}\n\nexport function panelTop(w: number): string {\n const inner = w - 4;\n return ui.border('╭─') + ui.border('─'.repeat(inner)) + ui.border('─╮');\n}\n\nexport function boxBot(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('╰─') + ui.border('─'.repeat(inner)) + ui.border('─╯');\n}\n\nexport function panelBot(w: number): string {\n const inner = w - 4;\n return ui.border('╰─') + ui.border('─'.repeat(inner)) + ui.border('─╯');\n}\n\nexport function boxLine(w: number, text: string): string {\n const inner = w - 4;\n const padded = padRight(text, inner);\n return ' ' + ui.border('│ ') + padded + ui.border(' │');\n}\n\nexport function panelLine(w: number, text: string): string {\n const inner = w - 4;\n const padded = padRight(text, inner);\n return ui.border('│ ') + padded + ui.border(' │');\n}\n\nexport function boxSep(w: number): string {\n const inner = w - 4;\n return ' ' + ui.border('├─') + ui.border('─'.repeat(inner)) + ui.border('─┤');\n}\n\nexport function panelSep(w: number): string {\n const inner = w - 4;\n return ui.border('├─') + ui.border('─'.repeat(inner)) + ui.border('─┤');\n}\n\nexport function boxRow(w: number, label: string, value: string): string {\n const inner = w - 4;\n const labelPlain = stripAnsi(chalk.bold(label));\n const avail = Math.max(0, inner - labelPlain.length - 2);\n const fittedValue = fitValue(value, avail);\n const right = Math.max(0, inner - labelPlain.length - 2 - fittedValue.length);\n return (\n ' ' +\n ui.border('│ ') +\n chalk.bold(label) +\n ': ' +\n ui.primary(fittedValue) +\n ' '.repeat(right) +\n ui.border(' │')\n );\n}\n","import readline from 'node:readline';\nimport { stdin, stdout } from 'node:process';\nimport { maxWidth, panelBot, panelLine, panelSep, panelTop } from './box.js';\nimport { centerText, stripAnsi, truncatePlain, ui } from './theme.js';\n\nexport interface SelectOption {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface SelectAction {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface SelectConfig {\n headerLines?: string[];\n actions?: SelectAction[];\n footer?: string;\n}\n\nlet pipedLinesPromise: Promise<string[]> | null = null;\nlet pipedLineIndex = 0;\n\nexport async function select(\n question: string,\n options: SelectOption[],\n defaultIndex: number = 0,\n config: SelectConfig = {}\n): Promise<string> {\n const isTTY = stdin.isTTY && stdout.isTTY;\n\n if (!isTTY) {\n return fallbackPrompt(question, options, defaultIndex, config);\n }\n\n return arrowSelect(question, options, defaultIndex, config);\n}\n\nexport async function promptInput(\n question: string,\n defaultValue: string = '',\n config: Omit<SelectConfig, 'actions'> = {}\n): Promise<string> {\n if (!stdin.isTTY || !stdout.isTTY) {\n return fallbackInput(question, defaultValue);\n }\n\n return fullscreenInput(question, defaultValue, config);\n}\n\nasync function arrowSelect(\n question: string,\n options: SelectOption[],\n defaultIndex: number,\n config: SelectConfig\n): Promise<string> {\n const actions = config.actions ?? [];\n const headerLines = config.headerLines ?? [];\n const width = Math.max(44, Math.min(maxWidth(), 72));\n const inner = width - 4;\n const actionLineOffset = 2 + headerLines.length;\n const hasActions = actions.length > 0;\n const optionStartOffset = 3 + headerLines.length + (hasActions ? 1 : 0);\n const lineCount = options.length + 4 + headerLines.length + (hasActions ? 1 : 0);\n const rows = process.stdout.rows || 24;\n const columns = process.stdout.columns || 80;\n const panelTopRow = Math.max(2, Math.floor((rows - lineCount) / 2) + 1);\n const panelLeftCol = Math.max(1, Math.floor((columns - width) / 2) + 1);\n const footerRow = Math.min(rows, panelTopRow + lineCount + 1);\n\n return new Promise((resolve) => {\n const firstEnabled: number = options.findIndex((option) => !option.disabled);\n let selected: number = options[defaultIndex]?.disabled ? firstEnabled : defaultIndex;\n let selectedAction: number | null = null;\n if (selected < 0) selected = 0;\n\n const move = (direction: -1 | 1): void => {\n let next = selected + direction;\n while (next >= 0 && next < options.length) {\n if (!options[next].disabled) {\n selected = next;\n return;\n }\n next += direction;\n }\n };\n\n const render = (initial: boolean = false): void => {\n if (!initial) {\n stdout.write('\\x1B[2J');\n }\n const lines: string[] = [];\n lines.push(panelTop(width));\n lines.push(\n panelLine(width, centerText(`${ui.primary('●')} ${ui.text.bold(question)}`, inner))\n );\n for (const header of headerLines) {\n lines.push(panelLine(width, centerText(ui.muted(header), inner)));\n }\n if (hasActions) {\n lines.push(\n panelLine(width, centerText(renderActions(actions, selectedAction, inner), inner))\n );\n }\n lines.push(panelSep(width));\n for (let i = 0; i < options.length; i++) {\n lines.push(\n panelLine(\n width,\n centerText(\n renderOption(options[i], selectedAction === null && i === selected, inner),\n inner\n )\n )\n );\n }\n lines.push(panelBot(width));\n\n lines.forEach((line, index) => writeAt(panelTopRow + index, panelLeftCol, line));\n writeAt(\n footerRow,\n panelLeftCol,\n centerText(\n ui.muted(config.footer || '↑↓ move · enter select · mouse hover/click · esc close'),\n width\n )\n );\n };\n\n const choose = (value: string = options[selected].value): void => {\n cleanup();\n console.log(\n ` ${ui.success('✓')} ${ui.text.bold(question)} ${ui.primary(labelForValue(value, options, actions))}\\n`\n );\n\n resolve(value);\n };\n\n const onMouseData = (chunk: Buffer): void => {\n const mouse = parseMouseEvent(chunk);\n if (!mouse) return;\n\n if (mouse.kind === 'wheel-up') {\n move(-1);\n render();\n return;\n }\n\n if (mouse.kind === 'wheel-down') {\n move(1);\n render();\n return;\n }\n\n if (hasActions && mouse.y === panelTopRow + actionLineOffset) {\n const actionIdx = actionIndexAtX(actions, mouse.x, panelLeftCol, inner);\n if (actionIdx === null || actions[actionIdx].disabled) return;\n if (selectedAction !== actionIdx) {\n selectedAction = actionIdx;\n render();\n }\n if (mouse.kind === 'click') choose(actions[actionIdx].value);\n return;\n }\n\n const idx = mouse.y - panelTopRow - optionStartOffset;\n if (idx < 0 || idx >= options.length || options[idx].disabled) return;\n\n if (selected !== idx) {\n selected = idx;\n selectedAction = null;\n render();\n }\n\n if (mouse.kind === 'click') {\n choose();\n }\n };\n\n const cleanup = (): void => {\n leaveInteractiveScreen();\n stdin.setRawMode(false);\n stdin.removeListener('keypress', onKeypress);\n stdin.removeListener('data', onMouseData);\n stdin.pause();\n };\n\n readline.emitKeypressEvents(stdin);\n stdin.setRawMode(true);\n enterInteractiveScreen(true);\n render(true);\n\n const onKeypress = (_str: string | undefined, key: readline.Key): void => {\n if (!key) return;\n\n if (key.name === 'up' && selected > 0) {\n move(-1);\n selectedAction = null;\n render();\n } else if (key.name === 'down' && selected < options.length - 1) {\n move(1);\n selectedAction = null;\n render();\n } else if (key.name === 'tab' && hasActions) {\n selectedAction = selectedAction === null ? 0 : null;\n render();\n } else if (key.name === 'return') {\n choose(selectedAction === null ? options[selected].value : actions[selectedAction].value);\n } else if ((key.ctrl && key.name === 'c') || key.name === 'escape') {\n cleanup();\n process.exit(0);\n }\n };\n\n stdin.resume();\n stdin.on('data', onMouseData);\n stdin.on('keypress', onKeypress);\n });\n}\n\nasync function fallbackPrompt(\n question: string,\n options: SelectOption[],\n defaultIndex: number,\n config: SelectConfig\n): Promise<string> {\n if (!stdin.isTTY) {\n const firstEnabled: number = options.findIndex((option) => !option.disabled);\n const enabledDefault: number = options[defaultIndex]?.disabled ? firstEnabled : defaultIndex;\n const def = String(enabledDefault + 1);\n\n printFallbackOptions(question, options, enabledDefault, config);\n\n while (true) {\n const trimmed = (await readPipedLine()).trim();\n if (trimmed.toLowerCase() === 'a') {\n const action = config.actions?.find((item) => !item.disabled);\n if (action) return action.value;\n }\n if (!trimmed) {\n const label = stripAnsi(options[enabledDefault].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n return options[enabledDefault].value;\n }\n const idx = parseInt(trimmed, 10);\n if (idx >= 1 && idx <= options.length && !options[idx - 1].disabled) {\n const label = stripAnsi(options[idx - 1].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n return options[idx - 1].value;\n }\n console.log(` ${ui.error('✗')} ${ui.warning(`Enter 1-${options.length} or ${def}`)}\\n`);\n }\n }\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n const firstEnabled: number = options.findIndex((option) => !option.disabled);\n const enabledDefault: number = options[defaultIndex]?.disabled ? firstEnabled : defaultIndex;\n\n printFallbackOptions(question, options, enabledDefault, config);\n const def = String(enabledDefault + 1);\n\n const ask = (): void => {\n rl.question(\n ` ${ui.primary('>')} ${ui.muted(`Choose [1-${options.length}] (${def})`)}: `,\n (answer) => {\n const trimmed = answer.trim();\n if (trimmed.toLowerCase() === 'a') {\n const action = config.actions?.find((item) => !item.disabled);\n if (action) {\n rl.close();\n resolve(action.value);\n return;\n }\n }\n if (!trimmed) {\n rl.close();\n const label = stripAnsi(options[enabledDefault].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n resolve(options[enabledDefault].value);\n return;\n }\n const idx = parseInt(trimmed, 10);\n if (idx >= 1 && idx <= options.length && !options[idx - 1].disabled) {\n rl.close();\n const label = stripAnsi(options[idx - 1].label);\n console.log(` ${ui.success('✓')} ${ui.primary(label)}\\n`);\n resolve(options[idx - 1].value);\n } else if (idx >= 1 && idx <= options.length && options[idx - 1].disabled) {\n console.log(` ${ui.error('✗')} ${ui.warning('Option unavailable for now')}\\n`);\n ask();\n } else {\n console.log(` ${ui.error('✗')} ${ui.warning(`Enter 1-${options.length}`)}\\n`);\n ask();\n }\n }\n );\n };\n ask();\n });\n}\n\nfunction fullscreenInput(\n question: string,\n defaultValue: string,\n config: Omit<SelectConfig, 'actions'>\n): Promise<string> {\n const headerLines = config.headerLines ?? [];\n const width = Math.max(44, Math.min(maxWidth(), 72));\n const inner = width - 4;\n const lineCount = 6 + headerLines.length;\n const rows = process.stdout.rows || 24;\n const columns = process.stdout.columns || 80;\n const panelTopRow = Math.max(2, Math.floor((rows - lineCount) / 2) + 1);\n const panelLeftCol = Math.max(1, Math.floor((columns - width) / 2) + 1);\n const footerRow = Math.min(rows, panelTopRow + lineCount + 1);\n\n return new Promise((resolve) => {\n let value = defaultValue;\n\n const render = (): void => {\n stdout.write('\\x1B[2J');\n const shown = value || '';\n const clipped = truncatePlain(shown, Math.max(12, inner - 10));\n const input = `${ui.primary('>')} ${ui.text(clipped)}${ui.primary('▌')}`;\n const lines: string[] = [];\n lines.push(panelTop(width));\n lines.push(\n panelLine(width, centerText(`${ui.primary('●')} ${ui.text.bold(question)}`, inner))\n );\n for (const header of headerLines) {\n lines.push(panelLine(width, centerText(ui.muted(header), inner)));\n }\n lines.push(panelSep(width));\n lines.push(panelLine(width, centerText(input, inner)));\n lines.push(panelBot(width));\n\n lines.forEach((line, index) => writeAt(panelTopRow + index, panelLeftCol, line));\n writeAt(\n footerRow,\n panelLeftCol,\n centerText(ui.muted(config.footer || 'type value · enter confirm · esc close'), width)\n );\n };\n\n const cleanup = (): void => {\n leaveInteractiveScreen();\n stdin.setRawMode(false);\n stdin.removeListener('keypress', onKeypress);\n stdin.pause();\n };\n\n const submit = (): void => {\n const output = cleanInputValue(value.trim() || defaultValue);\n cleanup();\n resolve(output);\n };\n\n const onKeypress = (str: string | undefined, key: readline.Key): void => {\n if ((key.ctrl && key.name === 'c') || key.name === 'escape') {\n cleanup();\n process.exit(0);\n }\n if (key.name === 'return') {\n submit();\n return;\n }\n if (key.name === 'backspace') {\n value = value.slice(0, -1);\n render();\n return;\n }\n if (key.name === 'delete') {\n value = '';\n render();\n return;\n }\n if (str && !key.ctrl && !key.meta && str >= ' ' && !isTerminalSequence(str, key)) {\n value += cleanInputValue(str.replace(/[\\r\\n]/g, ''));\n render();\n }\n };\n\n readline.emitKeypressEvents(stdin);\n stdin.setRawMode(true);\n enterInteractiveScreen(false);\n render();\n stdin.resume();\n stdin.on('keypress', onKeypress);\n });\n}\n\nasync function fallbackInput(question: string, defaultValue: string): Promise<string> {\n if (!stdin.isTTY) {\n const suffix = defaultValue ? ui.muted(` (${defaultValue})`) : '';\n console.log(` ${ui.primary('>')} ${ui.text.bold(question)}${suffix}: `);\n const answer = await readPipedLine();\n return cleanInputValue(answer.trim() || defaultValue);\n }\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: stdin, output: stdout });\n const suffix = defaultValue ? ui.muted(` (${defaultValue})`) : '';\n rl.question(` ${ui.primary('>')} ${ui.text.bold(question)}${suffix}: `, (answer) => {\n rl.close();\n resolve(cleanInputValue(answer.trim() || defaultValue));\n });\n });\n}\n\nfunction printFallbackOptions(\n question: string,\n options: SelectOption[],\n enabledDefault: number,\n config: SelectConfig\n): void {\n console.log(` ${ui.primary('●')} ${ui.text.bold(question)}\\n`);\n for (const header of config.headerLines ?? []) {\n console.log(` ${ui.muted(header)}`);\n }\n for (const action of config.actions ?? []) {\n console.log(\n ` ${ui.muted('[A]')} ${action.disabled ? ui.muted(action.label) : ui.text(action.label)}`\n );\n }\n if ((config.headerLines?.length || 0) > 0 || (config.actions?.length || 0) > 0) {\n console.log('');\n }\n for (let i = 0; i < options.length; i++) {\n const marker = i === enabledDefault ? ui.success(' ◆') : ' ';\n const label = options[i].disabled\n ? ui.muted(stripAnsi(options[i].label))\n : ui.text(options[i].label);\n console.log(` ${ui.muted(`[${i + 1}]`)}${marker} ${label}`);\n }\n console.log('');\n}\n\nfunction readPipedLine(): Promise<string> {\n if (!pipedLinesPromise) {\n pipedLinesPromise = new Promise((resolve) => {\n let data = '';\n stdin.setEncoding('utf8');\n stdin.on('data', (chunk) => {\n data += chunk;\n });\n stdin.on('end', () => {\n resolve(data.split(/\\r?\\n/));\n });\n stdin.on('error', () => {\n resolve([]);\n });\n });\n }\n\n return pipedLinesPromise.then((lines) => lines[pipedLineIndex++] ?? '');\n}\n\nfunction renderActions(actions: SelectAction[], active: number | null, width: number): string {\n return actions\n .map((action, index) => {\n const label = truncatePlain(\n stripAnsi(action.label),\n Math.max(8, Math.floor(width / actions.length) - 8)\n );\n if (action.disabled) return `${ui.border('[')} ${ui.muted(label)} ${ui.border(']')}`;\n if (active === index)\n return `${ui.primary('›')} ${ui.primary('[')} ${ui.text.bold(label)} ${ui.primary(']')} ${ui.primary('‹')}`;\n return `${ui.border('[')} ${ui.primary(label)} ${ui.border(']')}`;\n })\n .join(` ${ui.muted('·')} `);\n}\n\nfunction actionIndexAtX(\n actions: SelectAction[],\n mouseX: number,\n panelLeftCol: number,\n inner: number\n): number | null {\n if (actions.length === 0) return null;\n const contentStart = panelLeftCol + 2;\n const relative = mouseX - contentStart;\n if (relative < 0 || relative > inner) return null;\n return Math.min(actions.length - 1, Math.floor((relative / Math.max(1, inner)) * actions.length));\n}\n\nfunction labelForValue(value: string, options: SelectOption[], actions: SelectAction[]): string {\n return stripAnsi(\n options.find((option) => option.value === value)?.label ||\n actions.find((action) => action.value === value)?.label ||\n value\n );\n}\n\ntype MouseEventInfo =\n | { kind: 'click'; x: number; y: number }\n | { kind: 'hover'; x: number; y: number }\n | { kind: 'wheel-up'; x: number; y: number }\n | { kind: 'wheel-down'; x: number; y: number };\n\nfunction renderOption(option: SelectOption, selected: boolean, width: number): string {\n const plain = truncatePlain(stripAnsi(option.label), Math.max(10, width - 12));\n if (option.disabled) {\n return `${ui.border('[')} ${ui.muted(plain)} ${ui.border(']')}`;\n }\n if (selected) {\n return `${ui.primary('›')} ${ui.primary('[')} ${ui.text.bold(plain)} ${ui.primary(']')} ${ui.primary('‹')}`;\n }\n return `${ui.muted(' ')} ${ui.border('[')} ${ui.muted(plain)} ${ui.border(']')} ${ui.muted(' ')}`;\n}\n\nfunction enterInteractiveScreen(enableMouse: boolean): void {\n stdout.write('\\x1B[?1049h' + '\\x1B[2J' + '\\x1B[H' + '\\x1B[?25l');\n if (enableMouse) {\n stdout.write('\\x1B[?1006h' + '\\x1B[?1000h' + '\\x1B[?1002h' + '\\x1B[?1003h');\n }\n}\n\nfunction leaveInteractiveScreen(): void {\n stdout.write(\n '\\x1B[?1003l' + '\\x1B[?1002l' + '\\x1B[?1000l' + '\\x1B[?1006l' + '\\x1B[?25h' + '\\x1B[?1049l'\n );\n}\n\nfunction parseMouseEvent(chunk: Buffer): MouseEventInfo | null {\n const text = chunk.toString('utf-8');\n const match = text.match(/\\x1B\\[<(\\d+);(\\d+);(\\d+)([mM])/);\n if (!match) return parseLegacyMouseEvent(text);\n\n const code = Number(match[1]);\n const x = Number(match[2]);\n const y = Number(match[3]);\n const state = match[4];\n if (code === 64) return { kind: 'wheel-up', x, y };\n if (code === 65) return { kind: 'wheel-down', x, y };\n if (state === 'm') return { kind: 'click', x, y };\n if ((code & 32) === 32 || code === 35) return { kind: 'hover', x, y };\n if ((code & 3) === 0) return { kind: 'hover', x, y };\n return null;\n}\n\nfunction parseLegacyMouseEvent(text: string): MouseEventInfo | null {\n const match = text.match(/\\x1B\\[M([\\s\\S])([\\s\\S])([\\s\\S])/);\n if (!match) return null;\n\n const code = match[1].charCodeAt(0) - 32;\n const x = match[2].charCodeAt(0) - 32;\n const y = match[3].charCodeAt(0) - 32;\n\n if (code === 64) return { kind: 'wheel-up', x, y };\n if (code === 65) return { kind: 'wheel-down', x, y };\n if ((code & 3) === 3) return { kind: 'click', x, y };\n if ((code & 32) === 32) return { kind: 'hover', x, y };\n return { kind: 'hover', x, y };\n}\n\nfunction writeAt(row: number, col: number, text: string): void {\n stdout.write(`\\x1B[${row};${col}H${text}`);\n}\n\nfunction isTerminalSequence(str: string, key: readline.Key): boolean {\n return (\n str.includes('\\x1B') || !!key.sequence?.includes('\\x1B') || /^(?:\\d+;){2}\\d+[mM]$/.test(str)\n );\n}\n\nfunction cleanInputValue(value: string): string {\n return value\n .replace(/\\x1B\\[<\\d+;\\d+;\\d+[mM]/g, '')\n .replace(/\\x1B\\[[0-?]*[ -/]*[@-~]/g, '')\n .replace(/(?:\\d+;){2}\\d+[mM]/g, '')\n .replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '');\n}\n","import path from 'path';\nimport crypto from 'crypto';\nimport { URL } from 'url';\nimport type { PlatformHandler } from '../platforms/types.js';\n\ninterface AssetEntry {\n localPath: string;\n}\n\nexport class AssetMap {\n entries: Map<string, AssetEntry> = new Map();\n buffers: Map<string, Buffer> = new Map();\n\n localPathFor(urlStr: string, platform?: PlatformHandler): string | null {\n if (this.entries.has(urlStr)) return this.entries.get(urlStr)!.localPath;\n\n let parsed: URL;\n try {\n parsed = new URL(urlStr);\n } catch {\n return null;\n }\n\n const host: string = parsed.hostname;\n const pathname: string = parsed.pathname;\n const ext: string = path.extname(pathname.split('?')[0]).toLowerCase();\n\n let dir: string | null = null;\n\n if (platform) {\n dir = platform.mapAssetDir(host, pathname, ext);\n }\n\n if (!dir) {\n dir = this.fallbackDir(host, ext);\n }\n\n let filename: string;\n const baseName: string = path.basename(pathname.split('?')[0]);\n const hash: string = crypto.createHash('md5').update(urlStr).digest('hex').slice(0, 6);\n\n if (baseName && baseName.length > 1 && baseName !== '/') {\n const clean: string = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n filename = clean.includes('.') ? clean : `${clean}-${hash}`;\n } else {\n filename = `asset-${hash}${ext || ''}`;\n }\n\n if (ext === '.mjs' || ext === '.js') {\n filename = baseName.replace(/[^a-zA-Z0-9._-]/g, '_');\n }\n\n const localPath: string = `${dir}/${filename}`;\n this.entries.set(urlStr, { localPath });\n\n const base: string = urlStr.split('?')[0];\n if (base !== urlStr && !this.entries.has(base)) {\n this.entries.set(base, { localPath });\n }\n\n return localPath;\n }\n\n rewrite(text: string, fromDir: string = ''): string {\n const sorted = [...this.entries.entries()].sort((a, b) => b[0].length - a[0].length);\n let out: string = text;\n for (const [url, { localPath }] of sorted) {\n const rel: string = fromDir ? path.posix.relative(fromDir, localPath) : localPath;\n out = out.split(url).join(rel);\n if (url.includes('&')) {\n out = out.split(url.replace(/&/g, '&amp;')).join(rel);\n }\n }\n return out;\n }\n\n private fallbackDir(host: string, ext: string): string {\n if (host.includes('fonts.gstatic.com') || host.includes('fonts.googleapis.com')) {\n return 'assets/fonts';\n }\n return ext === '.mjs' || ext === '.js' ? 'scripts/vendor' : 'assets/misc';\n }\n}\n","import type { Config } from '../types.js';\n\nexport const CFG: Config = {\n viewport: { width: 1440, height: 900 },\n timeout: 90000,\n scrollStep: 250,\n scrollDelay: 60,\n concurrency: 12,\n retries: 3,\n dlTimeout: 30000,\n sharedStripDomains: [\n 'sentry.io', 'www.googletagmanager.com', 'connect.facebook.net',\n 'stats.g.doubleclick.net',\n 'google-analytics.com',\n ],\n};\n","import https from 'https';\nimport http from 'http';\nimport { URL } from 'url';\nimport { CFG } from '../config/index.js';\n\nexport function dlBuffer(url: string, retries: number = CFG.retries): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const proto = url.startsWith('https') ? https : http;\n const go = (left: number): void => {\n const req = proto.get(url, { timeout: CFG.dlTimeout }, (res) => {\n if (res.statusCode! >= 300 && res.statusCode! < 400 && res.headers.location) {\n return dlBuffer(new URL(res.headers.location, url).href, left).then(resolve, reject);\n }\n if (res.statusCode !== 200) {\n return left > 1\n ? setTimeout(() => go(left - 1), 500)\n : reject(new Error(`HTTP ${res.statusCode}`));\n }\n const ch: Buffer[] = [];\n res.on('data', (c: Buffer) => ch.push(c));\n res.on('end', () => resolve(Buffer.concat(ch)));\n res.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n });\n req.on('error', (e: Error) => (left > 1 ? setTimeout(() => go(left - 1), 500) : reject(e)));\n req.on('timeout', () => {\n req.destroy();\n left > 1 ? setTimeout(() => go(left - 1), 500) : reject(new Error('Timeout'));\n });\n };\n go(retries);\n });\n}\n","import chalk from 'chalk';\nimport type { CookingSpinner } from '../cli/cooking.js';\nimport { THEME } from '../cli/theme.js';\n\nlet _cooking: CookingSpinner | null = null;\n\nexport function setCooking(spinner: CookingSpinner | null): void {\n _cooking = spinner;\n}\n\nconst T = (): string => new Date().toISOString().slice(11, 19);\n\nfunction trunc(text: string, max: number): string {\n if (text.length <= max) return text;\n return text.slice(0, max - 2) + '..';\n}\n\nfunction output(line: string): void {\n if (_cooking) _cooking.log(line);\n else console.log(line);\n}\n\nconst LOG_PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.primary)(s),\n (s) => chalk.hex(THEME.primarySoft)(s),\n (s) => chalk.hex(THEME.secondary)(s),\n (s) => chalk.hex(THEME.accent)(s),\n (s) => chalk.hex(THEME.info)(s),\n (s) => chalk.hex(THEME.text)(s),\n];\nlet _li = 0;\n\nexport const log = (m: string): void => {\n _li++;\n const c = LOG_PALETTE[_li % LOG_PALETTE.length];\n output(\n `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.primary)('[log]')} ${c(trunc(m, 120))}`\n );\n};\n\nconst INFO_PALETTE: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.info)(s),\n (s) => chalk.hex(THEME.secondary)(s),\n (s) => chalk.hex(THEME.primarySoft)(s),\n];\nlet _ii = 0;\n\nexport const info = (m: string): void => {\n _ii++;\n const c = INFO_PALETTE[_ii % INFO_PALETTE.length];\n output(\n `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.info).bold('[info]')} ${c(trunc(m, 120))}`\n );\n};\n\nexport const warn = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.warning)(s),\n (s) => chalk.hex(THEME.primary)(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.warning).bold('[warn]')} ${c(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.warn(line);\n};\n\nexport const success = (m: string): void => {\n const colors: Array<(s: string) => string> = [\n (s) => chalk.hex(THEME.success)(s),\n (s) => chalk.hex(THEME.info)(s),\n ];\n const c = colors[Math.floor(Math.random() * colors.length)];\n output(\n `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.success)('[ok]')} ${c(trunc(m, 120))}`\n );\n};\n\nexport const error = (m: string): void => {\n const colors: Array<(s: string) => string> = [(s) => chalk.hex(THEME.error)(s)];\n const c = colors[Math.floor(Math.random() * colors.length)];\n const line = `${chalk.hex(THEME.muted)(`[${T()}]`)} ${chalk.hex(THEME.error)('[error]')} ${c(trunc(m, 120))}`;\n if (_cooking) _cooking.log(line);\n else console.error(line);\n};\n","import type { PlatformHandler } from './types.js';\n\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf'];\n\nexport const framer: PlatformHandler = {\n name: 'framer',\n displayName: 'Framer',\n\n detectByUrl(url: string): boolean {\n return /\\.framer\\.(app|website)|framercanvas\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('id=\"main\"') &&\n (html.includes('framerstatic.com') || html.includes('framerusercontent.com'))\n );\n },\n\n stripDomains: ['events.framer.com', 'api.framer.com', 'collect.frameranalytics.com'],\n\n stripSelectors: [\n 'script[src*=\"events.framer.com\"]',\n '#__framer-badge-container',\n '#__framer-badge',\n 'link[href*=\"canvas-sandbox\"]',\n 'script[src*=\"framer.com/bootstrap\"]',\n ],\n\n stripPatterns: [\n /<div id=\"__framer-badge-container\"[^>]*><\\/div>/g,\n /<script>try\\{if\\(localStorage\\.get\\(\"__framer_force_showing_editorbar_since\"\\)\\)[^<]*<\\/script>/g,\n ],\n\n hydrationTimeout: 10000,\n needsHydrationCheck: true,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host.includes('framerusercontent.com')) {\n if (pathname.startsWith('/images/')) return 'assets/images';\n if (pathname.startsWith('/assets/')) {\n return FONT_EXTS.includes(ext) ? 'assets/fonts' : 'assets/misc';\n }\n if (pathname.startsWith('/sites/')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.json') return 'data';\n if (ext === '.css') return 'styles';\n if (ext === '.framercms') return 'data';\n return 'assets/misc';\n }\n if (pathname.startsWith('/modules/')) {\n return ext === '.framercms' ? 'data' : 'scripts/modules';\n }\n return 'assets/misc';\n }\n\n if (host.includes('app.framerstatic.com')) {\n if (ext === '.css') return 'styles';\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.woff2' || ext === '.woff') return 'assets/fonts';\n if (ext === '.png' || ext === '.svg') return 'assets/images';\n return 'assets/misc';\n }\n\n if (host.includes('framercanvas.com') || host.includes('framer.com')) {\n if (ext === '.mjs' || ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const webflow: PlatformHandler = {\n name: 'webflow',\n displayName: 'Webflow',\n\n detectByUrl(url: string): boolean {\n return /\\.webflow\\.(io|com)/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('data-wf-site') ||\n html.includes('w-webflow-badge') ||\n html.includes('Webflow') ||\n html.includes('webflow.js')\n );\n },\n\n stripDomains: ['js-agent.newrelic.com', 'cdn.heapanalytics.com', 'tr.snapchat.com'],\n\n stripSelectors: ['.w-webflow-badge', 'link[href*=\"editorbar\"]'],\n\n stripPatterns: [\n /<a[^>]*class=\"[^\"]*w-webflow-badge[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<a[^>]*href=\"[^\"]*webflow\\.com\\?utm_campaign=brandjs[^\"]*\"[^>]*>[\\s\\S]*?<\\/a>/g,\n /<style>[^<]*\\.w-webflow-badge[^<]*<\\/style>/g,\n /Powered by <a[^>]*href=\"[^\"]*webflow\\.com\"[^>]*>[^<]*<\\/a>/g,\n /<!-- This site was created in Webflow\\.[^>]*-->/g,\n /<html([^>]*) data-wf-domain=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-page=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-site=\"[^\"]*\"/g,\n /<html([^>]*) data-wf-status=\"[^\"]*\"/g,\n /<meta[^>]*content=\"Webflow\"[^>]*>/g,\n ],\n\n hydrationTimeout: 2000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (\n host.includes('website-files.com') ||\n host.includes('webflow.com') ||\n host.includes('uploads-ssl.webflow.com')\n ) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (pathname.includes('/css/') || ext === '.css') return 'styles';\n if (pathname.includes('/js/') || ext === '.js') return 'scripts/vendor';\n if (pathname.includes('/gsap/') || pathname.includes('/plugins/')) return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('d3e54v103j8qbb.cloudfront.net')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler } from './types.js';\n\nconst IMG_EXTS: string[] = ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.avif', '.ico'];\nconst FONT_EXTS: string[] = ['.woff2', '.woff', '.ttf', '.otf', '.eot'];\nconst VIDEO_EXTS: string[] = ['.mp4', '.webm', '.ogg'];\n\nexport const wix: PlatformHandler = {\n name: 'wix',\n displayName: 'Wix',\n\n detectByUrl(url: string): boolean {\n return /\\.wixsite\\.com|\\.wix\\.com/.test(url);\n },\n\n detectByHtml(html: string): boolean {\n return (\n html.includes('wix-viewer-model') ||\n html.includes('id=\"WIX_ADS\"') ||\n html.includes('X-Wix-') ||\n html.includes('Wix.com') ||\n html.includes('wixcode-sdk') ||\n html.includes('data-wix') ||\n html.includes('wix-code') ||\n html.includes('WixCode') ||\n /\\bwix\\.com\\b/.test(html) ||\n /meta\\s+name=[\"']generator[\"']\\s+content=[\"'][^\"']*Wix[^\"']*[\"']/i.test(html) ||\n /_wix_/i.test(html) ||\n /wix-ecom/i.test(html)\n );\n },\n\n stripDomains: [\n 'frog.wix.com',\n 'bi.wixapi.com',\n 'fed.wixcodescheduler.com',\n 'editor.wix.com',\n 'panorama.wixapps.net',\n ],\n\n stripSelectors: ['#WIX_ADS', '.wix-ads', '#wix-badge', '#SCROLL_TO_TOP'],\n\n stripPatterns: [\n /<div[^>]*class=\"[^\"]*wix-ads[^\"]*\"[^>]*>[\\s\\S]*?<\\/div>/g,\n ],\n\n hydrationTimeout: 3000,\n needsHydrationCheck: false,\n\n mapAssetDir(host: string, pathname: string, ext: string): string | null {\n if (host === 'video.wixstatic.com') {\n return 'assets/videos';\n }\n\n if (host.includes('wixstatic.com')) {\n if (VIDEO_EXTS.includes(ext)) return 'assets/videos';\n if (pathname.includes('/images/') || IMG_EXTS.includes(ext)) return 'assets/images';\n if (ext === '.css') return 'styles';\n if (ext === '.js') return 'scripts/vendor';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n return 'assets/misc';\n }\n\n if (host.includes('parastorage.com')) {\n if (ext === '.js') return 'scripts/vendor';\n if (ext === '.css') return 'styles';\n if (FONT_EXTS.includes(ext)) return 'assets/fonts';\n if (IMG_EXTS.includes(ext)) return 'assets/images';\n return 'assets/misc';\n }\n\n return null;\n },\n};\n","import type { PlatformHandler, PlatformType } from './types.js';\nimport type { Page } from 'puppeteer';\nimport { framer } from './framer.js';\nimport { webflow } from './webflow.js';\nimport { wix } from './wix.js';\n\nconst ALL_PLATFORMS: PlatformHandler[] = [framer, webflow, wix];\n\nexport function detectByUrl(url: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByUrl(url)) return platform;\n }\n return null;\n}\n\nexport function detectByHtml(html: string): PlatformHandler | null {\n for (const platform of ALL_PLATFORMS) {\n if (platform.detectByHtml(html)) return platform;\n }\n return null;\n}\n\nexport function detectPlatform(url: string, html?: string): PlatformHandler {\n const byUrl = detectByUrl(url);\n if (byUrl) return byUrl;\n\n if (html) {\n const byHtml = detectByHtml(html);\n if (byHtml) return byHtml;\n }\n\n return framer;\n}\n\nexport async function detectByDom(page: Page): Promise<PlatformHandler | null> {\n try {\n const signal: string = await page.evaluate(() => {\n const html: string = document.documentElement.outerHTML || '';\n\n if (/wix-viewer-model|_wix_|wix-ecom/i.test(html)) return 'wix';\n if (/data-wf-|w-webflow-badge|webflow\\.js/i.test(html)) return 'webflow';\n if (/framerusercontent|framercanvas|framerstatic/i.test(html)) return 'framer';\n\n const srcs: string[] = [];\n const scripts: NodeListOf<HTMLScriptElement> = document.querySelectorAll('script[src]');\n scripts.forEach((s) => { if (s.src) srcs.push(s.src); });\n const allSrcs: string = srcs.join(' ');\n if (/wixstatic\\.com|parastorage\\.com/.test(allSrcs)) return 'wix';\n if (/website-files\\.com|webflow\\.com/.test(allSrcs)) return 'webflow';\n if (/framerusercontent\\.com|framerstatic\\.com|framer\\.app/.test(allSrcs)) return 'framer';\n\n return '';\n });\n\n if (signal === 'wix') return wix;\n if (signal === 'webflow') return webflow;\n if (signal === 'framer') return framer;\n } catch {}\n return null;\n}\n\nexport function getPlatformByName(name: PlatformType): PlatformHandler {\n const map: Record<string, PlatformHandler> = { framer, webflow, wix };\n return map[name] || framer;\n}\n","export type { PlatformHandler, PlatformType } from './types.js';\nexport { framer } from './framer.js';\nexport { webflow } from './webflow.js';\nexport { wix } from './wix.js';\nexport { detectPlatform, detectByUrl, detectByHtml, detectByDom, getPlatformByName } from './detect.js';\n","import puppeteer, { type Page } from 'puppeteer';\nimport { CFG } from '../config/index.js';\nimport { log, success, info } from '../logger/index.js';\nimport { detectByDom } from '../platforms/index.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function launchAndCapture(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Launching browser...');\n log('Launching headless Chromium...');\n\n exporter.browser = await puppeteer.launch({\n headless: true,\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n success('Chromium launched');\n\n exporter.page = await exporter.browser.newPage();\n await exporter.page.setViewport(CFG.viewport);\n log('Viewport set to ' + CFG.viewport.width + 'x' + CFG.viewport.height);\n\n await exporter.page.setUserAgent(\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' +\n '(KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'\n );\n log('User agent set to Chrome 131');\n\n const allStripDomains: string[] = [\n ...CFG.sharedStripDomains,\n ...exporter.platform.stripDomains,\n ];\n log('Blocking ' + allStripDomains.length + ' tracking domains:');\n for (const domain of allStripDomains) {\n log(' - ' + domain);\n }\n\n let intercepted = 0;\n let blocked = 0;\n\n exporter.page.on('response', async (res) => {\n const url: string = res.url();\n if (url.startsWith('data:') || url.startsWith('blob:')) return;\n\n try {\n const host: string = new URL(url).hostname;\n if (allStripDomains.some((d) => host.includes(d))) {\n blocked++;\n return;\n }\n } catch {\n return;\n }\n\n exporter.assets.localPathFor(url, exporter.platform);\n try {\n exporter.assets.buffers.set(url, await res.buffer());\n intercepted++;\n } catch {}\n });\n\n log('Network interception enabled');\n\n exporter.cooking?.update('Navigating to site...');\n info('Navigating to ' + exporter.siteUrl);\n await exporter.page.goto(exporter.siteUrl, {\n waitUntil: 'networkidle2',\n timeout: CFG.timeout,\n });\n success('Page loaded (networkidle2)');\n log('Intercepted ' + intercepted + ' resources, blocked ' + blocked + ' tracking requests');\n\n log('Checking DOM-based platform detection...');\n const domDetected = await detectByDom(exporter.page);\n if (domDetected && domDetected.name !== exporter.platform.name) {\n log('Platform refined from DOM: ' + domDetected.displayName + ' (override: ' + exporter.platform.name + ')');\n exporter.platform = domDetected;\n }\n\n exporter.cooking?.update('Waiting for ' + exporter.platform.displayName + ' hydration...');\n\n if (exporter.platform.needsHydrationCheck) {\n log('Checking for #main element hydration...');\n log('Hydration timeout: ' + exporter.platform.hydrationTimeout + 'ms');\n const timeout = exporter.platform.hydrationTimeout;\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var start = Date.now();\n var tick = function() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 2000);\n else if (Date.now() - start > ${timeout}) r();\n else setTimeout(tick, 200);\n };\n tick();\n })\n `);\n success('Hydration complete (SPA rendered)');\n } else {\n log('Static site detected, waiting ' + exporter.platform.hydrationTimeout + 'ms for render...');\n await new Promise<void>((r) => setTimeout(r, exporter.platform.hydrationTimeout));\n success(exporter.platform.displayName + ' page rendered');\n }\n\n exporter.cooking?.update('Scrolling page...');\n log('Starting full-page scroll (step: ' + CFG.scrollStep + 'px, delay: ' + CFG.scrollDelay + 'ms)');\n\n const scrollStep = CFG.scrollStep;\n const scrollDelay = CFG.scrollDelay;\n\n const pageHeight: number = await exporter.page.evaluate(`\n Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)\n `) as number;\n log('Page height: ' + pageHeight + 'px (' + Math.ceil(pageHeight / scrollStep) + ' scroll steps)');\n\n await exporter.page.evaluate(`\n new Promise(function(r) {\n var y = 0;\n var max = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n var step = function() {\n y += ${scrollStep};\n window.scrollTo({ top: y, behavior: 'instant' });\n y < max + 500 ? setTimeout(step, ${scrollDelay}) : (window.scrollTo(0, 0), r());\n };\n step();\n })\n `);\n success('Full-page scroll complete');\n\n exporter.cooking?.update('Waiting for lazy resources...');\n log('Waiting 2s for lazy-loaded resources...');\n await new Promise<void>((r) => setTimeout(r, 2000));\n\n log('Checking network idle (1.5s quiet, 8s timeout)...');\n try {\n await exporter.page.waitForNetworkIdle({ idleTime: 1500, timeout: 8000 });\n success('Network idle confirmed');\n } catch {\n log('Network idle timeout reached (continuing anyway)');\n }\n\n const totalCaptured: number = exporter.assets.buffers.size;\n success('Captured ' + totalCaptured + ' network resources total');\n\n const cssCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.css')).length;\n const jsCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.endsWith('.js') || e.localPath.endsWith('.mjs')).length;\n const imgCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/images')).length;\n const fontCount: number = [...exporter.assets.entries.values()].filter((e) => e.localPath.startsWith('assets/fonts')).length;\n log(' CSS: ' + cssCount + ' | JS: ' + jsCount + ' | Images: ' + imgCount + ' | Fonts: ' + fontCount);\n}\n\nexport async function closeBrowser(exporter: { browser: import('puppeteer').Browser | null }): Promise<void> {\n if (exporter.browser) {\n await exporter.browser.close();\n exporter.browser = null;\n log('Browser closed');\n }\n}\n\nexport async function captureSubpage(\n page: Page,\n url: string,\n platform: { needsHydrationCheck: boolean; hydrationTimeout: number }\n): Promise<string> {\n log(' Navigating to sub-page: ' + url);\n await page.goto(url, { waitUntil: 'networkidle2', timeout: CFG.timeout });\n\n if (platform.needsHydrationCheck) {\n await page.evaluate(\n `new Promise(function(r) {\n var t = Date.now();\n (function tick() {\n var m = document.getElementById('main') || document.body;\n if (m && m.children.length > 0) setTimeout(r, 500);\n else if (Date.now() - t > ${platform.hydrationTimeout}) r();\n else setTimeout(tick, 200);\n })();\n })`\n );\n } else {\n await new Promise<void>((r) => setTimeout(r, 1000));\n }\n\n const html: string = await page.evaluate(() => document.documentElement.outerHTML || document.body.innerHTML);\n log(' Sub-page fetched: ' + (html.length / 1024).toFixed(1) + ' KB');\n return html;\n}\n","export async function pool(tasks: Array<() => Promise<void>>, n: number): Promise<void> {\n let i = 0;\n const run = async (): Promise<void> => {\n while (i < tasks.length) {\n const j = i++;\n await tasks[j]();\n }\n };\n await Promise.all(Array.from({ length: Math.min(n, tasks.length) }, () => run()));\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { CFG } from '../config/index.js';\nimport { log, warn, success } from '../logger/index.js';\nimport { dlBuffer } from '../network/download.js';\nimport { pool } from '../network/pool.js';\nimport type { ExporterContext } from '../types.js';\n\nexport async function downloadAll(exporter: ExporterContext): Promise<void> {\n const seen: Set<string> = new Set();\n const toDownload: Array<{ url: string; localPath: string }> = [];\n for (const [url, { localPath }] of exporter.assets.entries) {\n if (seen.has(localPath)) continue;\n seen.add(localPath);\n toDownload.push({ url, localPath });\n }\n\n const total: number = toDownload.length;\n log('Starting download of ' + total + ' unique assets');\n log('Concurrency: ' + CFG.concurrency + ' parallel downloads');\n log('Retry policy: ' + CFG.retries + ' attempts, ' + CFG.dlTimeout + 'ms timeout');\n\n let ok = 0;\n let cached = 0;\n let fail = 0;\n let completed = 0;\n let lastReported = 0;\n\n const tasks: Array<() => Promise<void>> = toDownload.map(\n ({ url, localPath }) =>\n async (): Promise<void> => {\n const dest: string = path.join(exporter.outDir, localPath);\n await fs.mkdir(path.dirname(dest), { recursive: true });\n\n try {\n const buf: Buffer | undefined =\n exporter.assets.buffers.get(url) ||\n exporter.assets.buffers.get(url.split('?')[0]);\n if (buf) {\n await fs.writeFile(dest, buf);\n cached++;\n ok++;\n } else {\n const data: Buffer = await dlBuffer(url);\n await fs.writeFile(dest, data);\n ok++;\n }\n } catch (e) {\n fail++;\n if (\n !url.includes('framer.com/edit') &&\n !url.includes('framerstatic.com/editorbar')\n ) {\n warn('Download failed: ' + path.basename(localPath) + ' - ' + (e as Error).message);\n }\n }\n\n completed++;\n const pct: number = Math.floor((completed / total) * 100);\n if (pct >= lastReported + 10 || completed === total) {\n exporter.cooking?.update('Downloading... ' + completed + '/' + total + ' (' + pct + '%)');\n log('Download progress: ' + completed + '/' + total + ' (' + pct + '%)');\n lastReported = pct;\n }\n }\n );\n\n await pool(tasks, CFG.concurrency);\n\n success('Downloads complete: ' + ok + ' succeeded, ' + cached + ' from cache, ' + fail + ' failed');\n\n const totalBytes: number = [...exporter.assets.entries.values()].length;\n log('Total unique assets written to disk: ' + totalBytes);\n\n exporter.assets.buffers.clear();\n log('Network buffer cache cleared');\n}\n","import prettier from 'prettier';\n\nexport async function prettifyJS(src: string): Promise<string> {\n try {\n return await prettier.format(src, {\n parser: 'babel',\n printWidth: 100,\n tabWidth: 2,\n useTabs: false,\n semi: true,\n singleQuote: false,\n trailingComma: 'es5',\n bracketSpacing: true,\n arrowParens: 'always',\n });\n } catch {\n return src;\n }\n}\n","export const SERVE_SCRIPT: string = `#!/usr/bin/env node\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst PORT = process.env.PORT || 3000;\nconst ROOT = path.dirname(fileURLToPath(import.meta.url));\n\nconst MIME = {\n '.html': 'text/html; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.mjs': 'application/javascript; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n '.avif': 'image/avif',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.otf': 'font/otf',\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.ogg': 'video/ogg',\n '.framercms': 'application/octet-stream',\n};\n\nconst server = http.createServer((req, res) => {\n let url = decodeURIComponent(req.url.split('?')[0]);\n if (url === '/') url = '/index.html';\n\n let filePath = path.join(ROOT, url);\n if (!filePath.startsWith(ROOT)) {\n res.writeHead(403);\n res.end('Forbidden');\n return;\n }\n\n const serveFile = (pathToFile) => {\n fs.readFile(pathToFile, (err, data) => {\n if (err) {\n // SPA Fallback: if it's not a file, serve index.html\n if (url !== '/index.html' && !path.extname(url)) {\n return serveFile(path.join(ROOT, 'index.html'));\n }\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n const ext = path.extname(pathToFile).toLowerCase();\n const mime = MIME[ext] || 'application/octet-stream';\n res.writeHead(200, {\n 'Content-Type': mime,\n 'Access-Control-Allow-Origin': '*',\n 'Cache-Control': 'public, max-age=3600',\n });\n res.end(data);\n });\n };\n\n serveFile(filePath);\n});\n\nconst ANSI = {\n reset: '\\\\x1b[0m',\n primary: '\\\\x1b[38;2;250;178;131m',\n soft: '\\\\x1b[38;2;255;192;159m',\n text: '\\\\x1b[38;2;238;238;238m',\n muted: '\\\\x1b[38;2;128;128;128m',\n border: '\\\\x1b[38;2;72;72;72m',\n success: '\\\\x1b[38;2;127;216;143m',\n info: '\\\\x1b[38;2;86;182;194m',\n accent: '\\\\x1b[38;2;157;124;216m',\n warning: '\\\\x1b[38;2;245;167;66m',\n command: '\\\\x1b[38;2;255;192;159m',\n error: '\\\\x1b[38;2;224;108;117m',\n};\n\nfunction color(name, value) {\n return ANSI[name] + value + ANSI.reset;\n}\n\nfunction fitValue(value, width) {\n const text = String(value);\n if (text.length <= width) return text;\n if ((text.includes('\\\\\\\\') || text.includes('/')) && width > 12) {\n const separator = text.includes('\\\\\\\\') ? '\\\\\\\\' : '/';\n const prefix = text.startsWith(separator) ? separator : '';\n const parts = text.split(/[\\\\\\\\/]+/).filter(Boolean);\n const compact = prefix + parts.map((part, index) => {\n if (index === parts.length - 1) return part;\n if (/^[A-Za-z]:$/.test(part)) return part;\n return part.length > 5 ? part.slice(0, 3) + '..' : part;\n }).join(separator);\n if (compact.length <= width) return compact;\n const tail = Math.max(8, Math.floor(width * 0.45));\n const head = Math.max(0, width - tail - 4);\n return compact.slice(0, head) + separator + '..' + separator + compact.slice(-tail);\n }\n return width <= 3 ? '.'.repeat(Math.max(0, width)) : text.slice(0, width - 2) + '..';\n}\n\nfunction frameLine(label, value, colorName = 'text') {\n const labelText = label.padEnd(10);\n const valueWidth = Math.max(0, 56 - labelText.length);\n const shown = fitValue(value, valueWidth);\n const pad = Math.max(0, 56 - labelText.length - shown.length);\n console.log(' ' + color('border', '│ ') + color('muted', labelText) + color(colorName, shown) + ' '.repeat(pad) + color('border', ' │'));\n}\n\nfunction drawServerUi() {\n console.log('');\n console.log(' ' + color('border', '╭─' + '─'.repeat(56) + '─╮'));\n console.log(' ' + color('border', '│ ') + color('text', ' Framer Export preview server') + ' '.repeat(26) + color('border', ' │'));\n console.log(' ' + color('border', '├─' + '─'.repeat(56) + '─┤'));\n frameLine('URL', 'http://localhost:' + PORT, 'primary');\n frameLine('Root', ROOT, 'soft');\n frameLine('Run', 'node serve.js', 'command');\n frameLine('Mode', 'static mirror + SPA fallback', 'accent');\n console.log(' ' + color('border', '╰─' + '─'.repeat(56) + '─╯'));\n console.log('');\n console.log(' ' + color('success', 'ready') + color('muted', ' press Ctrl+C to stop') + '\\\\n');\n}\n\nserver.listen(PORT, () => {\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n const steps = ['Preparing server', 'Checking exported files', 'Binding local port', 'Serving static mirror'];\n const stepColors = ['text', 'info', 'warning', 'success'];\n let i = 0;\n const timer = setInterval(() => {\n const stepIndex = Math.min(steps.length - 1, Math.floor(i / 6));\n const step = steps[stepIndex];\n const dots = color('error', '.'.repeat(i % 4).padEnd(3, ' '));\n process.stdout.write('\\\\r\\\\x1B[2K ' + color('primary', frames[i % frames.length]) + ' ' + color(stepColors[stepIndex], step) + dots);\n i++;\n }, 80);\n\n setTimeout(() => {\n clearInterval(timer);\n process.stdout.write('\\\\r\\\\x1B[2K');\n drawServerUi();\n }, 1280);\n});\n`;\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { log, warn, success } from '../logger/index.js';\nimport { prettifyJS } from '../formatter/prettify.js';\nimport { SERVE_SCRIPT } from '../server/template.js';\nimport type { ExporterContext } from '../types.js';\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction stripBySelector(html: string, sel: string): string {\n if (sel.includes('[src*=\"')) {\n const match = sel.match(/\\[src\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const domain: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*>[^<]*<\\\\/script>`, 'g'), '');\n html = html.replace(new RegExp(`<script[^>]*${domain}[^>]*><\\\\/script>`, 'g'), '');\n }\n } else if (sel.includes('[href*=\"')) {\n const match = sel.match(/\\[href\\*=\"([^\"]+)\"\\]/);\n if (match) {\n const href: string = escapeRegex(match[1]);\n html = html.replace(new RegExp(`<link[^>]*${href}[^>]*>`, 'g'), '');\n }\n } else if (sel.startsWith('.')) {\n const cls: string = escapeRegex(sel.slice(1));\n html = html.replace(\n new RegExp(`<[^>]*class=\"[^\"]*${cls}[^\"]*\"[^>]*>[\\\\s\\\\S]*?<\\\\/[^>]*>`, 'g'),\n ''\n );\n } else if (sel.startsWith('#')) {\n const id: string = sel.slice(1);\n html = removeElementById(html, id);\n }\n return html;\n}\n\nfunction removeElementById(html: string, id: string): string {\n const marker: string = `id=\"${id}\"`;\n let idx: number = html.indexOf(marker);\n while (idx !== -1) {\n const tagStart: number = html.lastIndexOf('<', idx);\n if (tagStart === -1) break;\n\n const tagNameEnd: number = html.indexOf(' ', tagStart + 1);\n const tagName: string = html.slice(tagStart + 1, tagNameEnd).toLowerCase();\n\n let depth = 0;\n let i: number = tagStart;\n while (i < html.length) {\n if (\n html.startsWith(`<${tagName}`, i) &&\n (html[i + tagName.length + 1] === ' ' || html[i + tagName.length + 1] === '>')\n ) {\n depth++;\n i += tagName.length + 1;\n } else if (html.startsWith(`</${tagName}>`, i)) {\n depth--;\n if (depth === 0) {\n html = html.slice(0, tagStart) + html.slice(i + tagName.length + 3);\n break;\n }\n i += tagName.length + 3;\n } else {\n i++;\n }\n }\n\n idx = html.indexOf(marker);\n }\n return html;\n}\n\nfunction processSEO(html: string, url: string): string {\n const canonical = url.split('?')[0].replace(/\\/$/, '');\n\n // Inject Canonical\n if (!html.includes('rel=\"canonical\"')) {\n html = html.replace('</head>', ` <link rel=\"canonical\" href=\"${canonical}\">\\n </head>`);\n }\n\n // Inject Meta Description if missing\n if (!html.includes('name=\"description\"')) {\n html = html.replace(\n '</head>',\n ` <meta name=\"description\" content=\"Exported with Framer Export - Fast, SEO-optimized, and clean.\">\\n </head>`\n );\n }\n\n // Inject OG Tags if missing\n if (!html.includes('property=\"og:')) {\n html = html.replace(\n '</head>',\n ` <meta property=\"og:type\" content=\"website\">\\n <meta property=\"og:url\" content=\"${canonical}\">\\n <meta property=\"og:title\" content=\"Exported Site\">\\n <meta property=\"og:description\" content=\"A fast, clean version of this site, exported for performance.\">\\n </head>`\n );\n }\n\n // Inject Robot tags\n if (!html.includes('name=\"robots\"')) {\n html = html.replace('</head>', ` <meta name=\"robots\" content=\"index, follow\">\\n </head>`);\n }\n\n return html;\n}\n\nfunction stripIntegrityAndCors(html: string): string {\n html = html.replace(/\\s+integrity=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin=\"[^\"]*\"/g, '');\n html = html.replace(/\\s+crossorigin/g, '');\n html = html.replace(/<link[^>]*rel=\"preconnect\"[^>]*>/g, '');\n html = html.replace(/<link[^>]*rel=\"dns-prefetch\"[^>]*>/g, '');\n html = html.replace(/<meta[^>]*content-security-policy[^>]*>/gi, '');\n return html;\n}\n\nfunction stripSrcsetCdnUrls(html: string): string {\n html = html.replace(/srcset=\"([^\"]*)\"/g, (_match: string, srcset: string) => {\n const cleaned: string = srcset\n .split(',')\n .map((entry: string) => entry.trim())\n .filter((entry: string) => !entry.startsWith('http'))\n .join(', ');\n return cleaned ? 'srcset=\"' + cleaned + '\"' : '';\n });\n return html;\n}\n\nexport async function buildOutput(exporter: ExporterContext): Promise<void> {\n exporter.cooking?.update('Stripping platform badges...');\n log('Starting HTML post-processing...');\n log('HTML size: ' + (exporter.ssrHTML.length / 1024).toFixed(1) + ' KB');\n\n let html: string = exporter.ssrHTML;\n if (!html) {\n warn('No SSR HTML available, cannot build output');\n return;\n }\n\n exporter.cooking?.update('Removing integrity checks...');\n const beforeIntegrity: number = html.length;\n html = stripIntegrityAndCors(html);\n log('Stripped integrity/crossorigin/preconnect (' + (beforeIntegrity - html.length) + ' chars)');\n success('Integrity and CORS restrictions removed');\n\n if (typeof processSEO === 'function') {\n exporter.cooking?.update('Optimizing SEO...');\n html = processSEO(html, exporter.siteUrl);\n success('SEO meta tags optimized');\n }\n\n log('Stripping ' + exporter.platform.stripSelectors.length + ' selectors:');\n for (const sel of exporter.platform.stripSelectors) {\n const before: number = html.length;\n html = stripBySelector(html, sel);\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Stripped ' + sel + ' (' + removed + ' chars removed)');\n }\n }\n\n log('Applying ' + exporter.platform.stripPatterns.length + ' regex patterns...');\n for (const pattern of exporter.platform.stripPatterns) {\n const before: number = html.length;\n html = html.replace(new RegExp(pattern.source, pattern.flags), '');\n const removed: number = before - html.length;\n if (removed > 0) {\n log(' Pattern removed ' + removed + ' chars');\n }\n }\n success('Platform badges and tracking stripped');\n\n exporter.cooking?.update('Rewriting asset URLs...');\n log('Rewriting ' + exporter.assets.entries.size + ' CDN URLs to local paths...');\n const beforeRewrite: number = html.length;\n html = exporter.assets.rewrite(html, '');\n log('HTML rewrite delta: ' + (html.length - beforeRewrite) + ' chars');\n\n exporter.cooking?.update('Cleaning srcset references...');\n html = stripSrcsetCdnUrls(html);\n log('Cleaned remaining CDN URLs from srcset attributes');\n\n await rewriteDownloadedFiles(exporter);\n success('All URLs rewritten to local paths');\n\n exporter.cooking?.update('Pretty-printing JS files...');\n await prettifyDownloadedJS(exporter);\n\n exporter.cooking?.update('Writing final output...');\n log('Writing index.html (' + (html.length / 1024).toFixed(1) + ' KB)...');\n await fs.writeFile(path.join(exporter.outDir, 'index.html'), html);\n success('index.html written');\n\n await fs.writeFile(path.join(exporter.outDir, 'serve.js'), SERVE_SCRIPT);\n log('serve.js written');\n await fs.writeFile(\n path.join(exporter.outDir, 'package.json'),\n JSON.stringify({ type: 'module', scripts: { serve: 'node serve.js' } }, null, 2) + '\\n'\n );\n log('package.json written for serve.js');\n success('Output build complete');\n}\n\nasync function rewriteDownloadedFiles(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules', 'styles'];\n let rewritten = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n for (const file of files) {\n const ext: string = path.extname(file).toLowerCase();\n if (!['.mjs', '.js', '.css'].includes(ext)) continue;\n\n const filePath: string = path.join(fullDir, file);\n try {\n let content: string = await fs.readFile(filePath, 'utf-8');\n const before: string = content;\n content = exporter.assets.rewrite(content, dir);\n if (content !== before) {\n await fs.writeFile(filePath, content);\n rewritten++;\n }\n } catch {}\n }\n }\n log('Rewrote URLs in ' + rewritten + ' JS/CSS files');\n}\n\nasync function prettifyDownloadedJS(exporter: ExporterContext): Promise<void> {\n const dirs: string[] = ['scripts/vendor', 'scripts/modules'];\n let count = 0;\n let total = 0;\n\n for (const dir of dirs) {\n const fullDir: string = path.join(exporter.outDir, dir);\n let files: string[];\n try {\n files = await fs.readdir(fullDir);\n } catch {\n continue;\n }\n\n const jsFiles: string[] = files.filter((f) => {\n const ext: string = path.extname(f).toLowerCase();\n return ext === '.mjs' || ext === '.js';\n });\n total += jsFiles.length;\n\n for (const file of jsFiles) {\n const filePath: string = path.join(fullDir, file);\n try {\n const raw: string = await fs.readFile(filePath, 'utf-8');\n\n const nlRatio: number = (raw.match(/\\n/g) || []).length / raw.length;\n if (nlRatio > 0.05) {\n count++;\n continue;\n }\n\n const pretty: string = await prettifyJS(raw);\n await fs.writeFile(filePath, pretty, 'utf-8');\n count++;\n\n if (count % 5 === 0) {\n exporter.cooking?.update('Pretty-printing... (' + count + '/' + total + ')');\n }\n } catch (e) {\n warn('Pretty-print skipped: ' + file + ' - ' + (e as Error).message);\n count++;\n }\n }\n }\n\n success('Formatted ' + count + '/' + total + ' JS/MJS files');\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport type { ExporterContext } from '../types.js';\nimport { boxTop, boxLine, boxBot, boxSep, boxRow, maxWidth } from '../cli/box.js';\nimport { chip, ui } from '../cli/theme.js';\n\nexport async function printSummary(exporter: ExporterContext): Promise<void> {\n const w = maxWidth();\n const isSmall = w < 50;\n\n const count = async (d: string): Promise<number> => {\n try {\n return (await fs.readdir(path.join(exporter.outDir, d))).length;\n } catch {\n return 0;\n }\n };\n const [imgs, fonts, videos, misc, scripts, vendor, styles, data, subpages] = await Promise.all([\n count('assets/images'),\n count('assets/fonts'),\n count('assets/videos'),\n count('assets/misc'),\n count('scripts/modules'),\n count('scripts/vendor'),\n count('styles'),\n count('data'),\n count('subpages'),\n ]);\n\n const G = ui.primary;\n const G2 = ui.primarySoft;\n const C2 = ui.secondary;\n const Y = ui.accent;\n const O = ui.warning;\n const Br = ui.info;\n const Gr = ui.muted;\n const Gn = ui.success;\n\n const entries: Array<[string, number, string, (s: string) => string]> = [\n ['styles/', styles, 'CSS', G],\n ['scripts/vendor/', vendor, 'JS vendor', G2],\n ['scripts/modules/', scripts, 'JS modules', C2],\n ['assets/images/', imgs, 'images', Y],\n ['assets/videos/', videos, 'videos', O],\n ['assets/fonts/', fonts, 'fonts', Br],\n ['assets/misc/', misc, 'misc', Gr],\n ['data/', data, 'data', Gr],\n ['subpages/', subpages, 'pages', Gn],\n ];\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, `${ui.text.bold(' Export Summary')} ${chip('done')}`));\n console.log(boxSep(w));\n } else {\n console.log(ui.text.bold(' Export Summary:'));\n }\n\n for (const [label, cnt, type, color] of entries) {\n if (cnt === 0) continue;\n const inner = w - 4;\n const l = label.padEnd(16);\n const c = String(cnt).padStart(3);\n const rowText = `${color(l)}${ui.text(c)} ${ui.muted(type)}`;\n const visible = 16 + 3 + 2 + type.length;\n const pad = Math.max(0, inner - visible);\n if (isSmall) {\n console.log(` ${color(label)} ${ui.text(String(cnt))} ${ui.muted(type)}`);\n } else {\n console.log(' ' + ui.border('│ ') + rowText + ' '.repeat(pad) + ui.border(' │'));\n }\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n\n console.log('');\n const cdCmd = 'cd ' + path.basename(exporter.outDir);\n const runCmd = 'node serve.js';\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' To serve locally')));\n console.log(boxSep(w));\n console.log(boxRow(w, 'Open', cdCmd));\n console.log(boxRow(w, 'Run', runCmd));\n console.log(boxBot(w));\n } else {\n console.log(ui.text.bold(' To serve locally:'));\n console.log(` ${G(cdCmd)}`);\n console.log(` ${G(runCmd)}`);\n }\n\n console.log('');\n console.log(ui.muted(' note: must be served via HTTP for JS modules to work.'));\n console.log('');\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport { stdin, stdout } from 'node:process';\nimport { spawn } from 'node:child_process';\nimport type { ExporterContext } from '../types.js';\nimport { select, type SelectOption } from '../cli/select.js';\nimport { boxTop, boxLine, boxSep, boxBot, maxWidth } from '../cli/box.js';\nimport { stripAnsi, ui } from '../cli/theme.js';\n\ninterface ConversionTarget {\n id: string;\n label: string;\n stack: string;\n projectDir: string;\n staticDir: string;\n scaffold: string;\n entryFiles: string;\n routing: string;\n}\n\ninterface AiTool {\n id: string;\n label: string;\n displayName: string;\n agentName: string;\n}\n\ninterface ConversionGoal {\n id: string;\n label: string;\n instruction: string;\n priority: string;\n}\n\ninterface ExportFacts {\n sourceUrl: string;\n outputDir: string;\n platformName: string;\n rootEntries: string[];\n counts: Record<string, number>;\n}\n\nconst IMPORTANT_DIRS = [\n 'index.html',\n 'styles',\n 'scripts/vendor',\n 'scripts/modules',\n 'assets/images',\n 'assets/videos',\n 'assets/fonts',\n 'assets/misc',\n 'data',\n 'subpages',\n];\n\nconst AI_TOOLS: AiTool[] = [\n {\n id: 'claude-code',\n label: 'Claude Code',\n displayName: 'Claude Code',\n agentName: 'Claude Code',\n },\n {\n id: 'codex',\n label: 'Codex',\n displayName: 'Codex',\n agentName: 'Codex coding agent',\n },\n {\n id: 'opencode',\n label: 'OpenCode',\n displayName: 'OpenCode',\n agentName: 'OpenCode',\n },\n {\n id: 'other-ai',\n label: 'Other AI coding agent',\n displayName: 'Other AI',\n agentName: 'AI coding agent',\n },\n];\n\nconst TARGETS: ConversionTarget[] = [\n {\n id: 'react-vite',\n label: 'React + Vite + TypeScript',\n stack: 'React 18/19, TypeScript, Vite, CSS modules or plain CSS',\n projectDir: 'converted-react-vite',\n staticDir: 'public',\n scaffold: 'npm create vite@latest converted-react-vite -- --template react-ts',\n entryFiles: 'src/main.tsx, src/App.tsx, src/components/*, src/styles/*',\n routing: 'Use React Router only if multiple exported pages exist in subpages/.',\n },\n {\n id: 'nextjs-app-router',\n label: 'Next.js App Router',\n stack: 'Next.js App Router, TypeScript, React Server Components where useful',\n projectDir: 'converted-nextjs',\n staticDir: 'public',\n scaffold: 'npx create-next-app@latest converted-nextjs --ts --app --eslint',\n entryFiles: 'app/page.tsx, app/layout.tsx, components/*, public/*',\n routing: 'Map exported subpages to app routes and keep shared layout code reusable.',\n },\n {\n id: 'vue-vite',\n label: 'Vue + Vite + TypeScript',\n stack: 'Vue 3, TypeScript, Vite, single-file components',\n projectDir: 'converted-vue-vite',\n staticDir: 'public',\n scaffold: 'npm create vite@latest converted-vue-vite -- --template vue-ts',\n entryFiles: 'src/main.ts, src/App.vue, src/components/*.vue, src/styles/*',\n routing: 'Use Vue Router only if multiple exported pages exist in subpages/.',\n },\n {\n id: 'sveltekit',\n label: 'SvelteKit',\n stack: 'SvelteKit, TypeScript, componentized routes and assets',\n projectDir: 'converted-sveltekit',\n staticDir: 'static',\n scaffold: 'npm create svelte@latest converted-sveltekit',\n entryFiles: 'src/routes/+page.svelte, src/lib/components/*, static/*',\n routing: 'Create SvelteKit routes for meaningful exported pages when subpages/ exists.',\n },\n {\n id: 'astro',\n label: 'Astro',\n stack: 'Astro, TypeScript, island components only where interactivity is needed',\n projectDir: 'converted-astro',\n staticDir: 'public',\n scaffold: 'npm create astro@latest converted-astro',\n entryFiles: 'src/pages/index.astro, src/components/*, public/*',\n routing: 'Use Astro pages for exported subpages and avoid unnecessary client JavaScript.',\n },\n];\n\nconst GOALS: ConversionGoal[] = [\n {\n id: 'clean-rebuild',\n label: 'Clean professional rebuild',\n instruction:\n 'Rebuild the export as clean production code, not as a one-file HTML clone, while preserving the full page experience.',\n priority: 'Readable structure, maintainability, complete pages, and faithful visual result.',\n },\n {\n id: 'pixel-perfect',\n label: 'Pixel-perfect visual migration',\n instruction:\n 'Prioritize pixel-perfect fidelity before refactoring anything aggressively, even when the layout is difficult.',\n priority:\n 'Spacing, typography, responsive behavior, colors, media, animations, and page-by-page fidelity.',\n },\n {\n id: 'component-system',\n label: 'Reusable component system',\n instruction:\n 'Extract repeated UI blocks into reusable components with clean props without simplifying the original pages.',\n priority:\n 'Components, layout primitives, naming, future editability, and complete section coverage.',\n },\n {\n id: 'performance-seo',\n label: 'Performance and SEO rebuild',\n instruction:\n 'Rebuild the site while reducing unused vendor code and improving SEO basics without losing visual fidelity.',\n priority:\n 'Fast loading, semantic markup, metadata, accessibility, asset hygiene, and faithful pages.',\n },\n];\n\nexport async function runAiPromptAssistant(exporter: ExporterContext): Promise<void> {\n if (!stdin.isTTY || !stdout.isTTY) return;\n\n const serveCommand = buildServeCommand(exporter);\n const shouldConvert = await runExportCompletePrompt(exporter, serveCommand);\n if (!shouldConvert) return;\n\n printAssistantModal(`${ui.text.bold('AI conversion prompt')} ${ui.error('BETA')}`, [\n 'Choose a target stack, AI tool, and conversion situation.',\n 'Mouse clicks are supported in the terminal when available.',\n 'A detailed prompt file will be generated inside the export folder.',\n ]);\n\n const targetOptions: SelectOption[] = [\n ...TARGETS.map((target) => ({ label: target.label, value: target.id })),\n { label: 'Customize with AI - BETA in development', value: 'custom-ai', disabled: true },\n ];\n\n const targetId = await select('Choose target stack', targetOptions, 0);\n\n const aiToolId = await select(\n 'Choose the AI coding tool',\n AI_TOOLS.map((tool) => ({ label: tool.label, value: tool.id })),\n 0\n );\n\n const goalId = await select(\n 'Choose the conversion situation',\n GOALS.map((goal) => ({ label: goal.label, value: goal.id })),\n 0\n );\n\n const target = TARGETS.find((item) => item.id === targetId) || TARGETS[0];\n const aiTool = AI_TOOLS.find((item) => item.id === aiToolId) || AI_TOOLS[0];\n const goal = GOALS.find((item) => item.id === goalId) || GOALS[0];\n const facts = await collectExportFacts(exporter);\n const prompt = buildConversionPrompt(target, aiTool, goal, facts);\n const aiDir = path.join(exporter.outDir, 'ai');\n const promptPath = path.join(aiDir, `${aiTool.id}-${target.id}-${goal.id}-prompt.md`);\n\n await fs.mkdir(aiDir, { recursive: true });\n await fs.writeFile(promptPath, prompt, 'utf-8');\n\n const copyPrompt = await runPromptReadyPrompt(promptPath, target, aiTool, goal);\n if (copyPrompt) {\n try {\n await copyToClipboard(prompt);\n console.log(` ${ui.success('✓')} ${ui.text.bold('Prompt copied to clipboard')}\\n`);\n } catch (error) {\n console.log(\n ` ${ui.warning('!')} ${ui.warning('Clipboard copy unavailable:')} ${ui.muted((error as Error).message)}\\n`\n );\n }\n }\n}\n\nasync function collectExportFacts(exporter: ExporterContext): Promise<ExportFacts> {\n const counts: Record<string, number> = {};\n const rootEntries = await safeReadDir(exporter.outDir);\n\n for (const item of IMPORTANT_DIRS) {\n counts[item] =\n item === 'index.html'\n ? (await exists(path.join(exporter.outDir, item)))\n ? 1\n : 0\n : await countEntries(path.join(exporter.outDir, item));\n }\n\n return {\n sourceUrl: exporter.siteUrl,\n outputDir: exporter.outDir,\n platformName: exporter.platform.displayName,\n rootEntries,\n counts,\n };\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function safeReadDir(dir: string): Promise<string[]> {\n try {\n return (await fs.readdir(dir)).sort();\n } catch {\n return [];\n }\n}\n\nasync function countEntries(dir: string): Promise<number> {\n try {\n return (await fs.readdir(dir)).length;\n } catch {\n return 0;\n }\n}\n\nfunction buttonLabel(label: string): string {\n return `${ui.border('[')} ${ui.text.bold(label)} ${ui.border(']')}`;\n}\n\nfunction centerText(text: string, width: number): string {\n const visible = stripAnsi(text).length;\n if (visible >= width) return text;\n const left = Math.floor((width - visible) / 2);\n return ' '.repeat(left) + text + ' '.repeat(width - visible - left);\n}\n\nfunction buildServeCommand(exporter: ExporterContext): string {\n return `cd ${path.basename(exporter.outDir)} && node serve.js`;\n}\n\nasync function runExportCompletePrompt(\n exporter: ExporterContext,\n serveCommand: string\n): Promise<boolean> {\n let copyServeCommand = true;\n\n while (true) {\n const action = await select(\n 'Export complete',\n [\n {\n label: `${checkboxLabel(copyServeCommand)} Copy serve command when finishing`,\n value: 'toggle-copy',\n },\n {\n label: `${buttonLabel('Convert to AI code')} ${ui.error('BETA')}`,\n value: 'convert',\n },\n { label: buttonLabel('Finish'), value: 'finish' },\n ],\n 2,\n {\n headerLines: [\n `Output: ${path.basename(exporter.outDir)}`,\n `Run: ${serveCommand}`,\n 'Use Convert to open the AI conversion assistant.',\n ],\n footer: 'enter select · checkbox toggles copy · mouse hover/click',\n }\n );\n\n if (action === 'toggle-copy') {\n copyServeCommand = !copyServeCommand;\n continue;\n }\n\n if (action === 'finish') {\n if (copyServeCommand) {\n try {\n await copyToClipboard(serveCommand);\n console.log(` ${ui.success('✓')} ${ui.text.bold('Serve command copied')}\\n`);\n } catch (error) {\n console.log(\n ` ${ui.warning('!')} ${ui.warning('Clipboard copy unavailable:')} ${ui.muted((error as Error).message)}\\n`\n );\n }\n }\n return false;\n }\n\n return true;\n }\n}\n\nasync function runPromptReadyPrompt(\n promptPath: string,\n target: ConversionTarget,\n aiTool: AiTool,\n goal: ConversionGoal\n): Promise<boolean> {\n const relPath = path.relative(process.cwd(), promptPath) || promptPath;\n let copyPrompt = false;\n\n while (true) {\n const action = await select(\n `AI Prompt Ready ${ui.error('BETA')}`,\n [\n {\n label: `${checkboxLabel(copyPrompt)} Copy prompt when finishing`,\n value: 'toggle-copy',\n },\n { label: buttonLabel('Finish'), value: 'finish' },\n ],\n 1,\n {\n headerLines: [\n `Tool: ${aiTool.displayName}`,\n `Stack: ${target.label}`,\n `Mode: ${goal.label}`,\n `File: ${relPath}`,\n ],\n footer: 'enter finish · checkbox toggles copy · mouse hover/click',\n }\n );\n\n if (action === 'toggle-copy') {\n copyPrompt = !copyPrompt;\n continue;\n }\n\n return copyPrompt;\n }\n}\n\nfunction checkboxLabel(checked: boolean): string {\n return checked ? ui.success('☑') : ui.muted('☐');\n}\n\nfunction printConvertPanel(exporter: ExporterContext): void {\n const w = maxWidth();\n const inner = w - 4;\n const rows = [\n centerText(`${ui.text.bold('AI Convert')} ${ui.error('BETA')}`, inner),\n centerText(ui.muted('Generate a conversion prompt after the export.'), inner),\n centerText(`${buttonLabel('Convert')} ${ui.muted('or')} ${buttonLabel('Skip')}`, inner),\n centerText(ui.muted(path.basename(exporter.outDir)), inner),\n ];\n\n console.log('');\n console.log(boxTop(w));\n for (const row of rows) console.log(boxLine(w, row));\n console.log(boxBot(w));\n console.log('');\n}\n\nfunction printAssistantModal(title: string, lines: string[]): void {\n const w = maxWidth();\n const inner = w - 4;\n\n console.log('');\n console.log(boxTop(w));\n console.log(boxLine(w, centerText(`${ui.primary('◆')} ${title}`, inner)));\n console.log(boxSep(w));\n for (const line of lines) {\n console.log(boxLine(w, centerText(ui.muted(line), inner)));\n }\n console.log(boxBot(w));\n console.log('');\n}\n\nfunction buildConversionPrompt(\n target: ConversionTarget,\n aiTool: AiTool,\n goal: ConversionGoal,\n facts: ExportFacts\n): string {\n const rootEntries = facts.rootEntries.length\n ? facts.rootEntries.join(', ')\n : 'No root entries detected';\n const exportDir = quoteForPrompt(facts.outputDir);\n const projectDir = quoteForPrompt(path.join(facts.outputDir, target.projectDir));\n const scaffoldCommand = `cd ${exportDir}; ${target.scaffold}`;\n const sourceAssets = quoteForPrompt(path.join(facts.outputDir, 'assets', '*'));\n const destinationAssets = quoteForPrompt(\n path.join(facts.outputDir, target.projectDir, target.staticDir, 'assets')\n );\n const windowsAssetCopyCommand = `New-Item -ItemType Directory -Force -Path ${destinationAssets}; Copy-Item -Path ${sourceAssets} -Destination ${destinationAssets} -Recurse -Force`;\n const unixSourceAssets = quoteForPrompt(toPosixPath(path.join(facts.outputDir, 'assets')));\n const unixDestinationParent = quoteForPrompt(\n toPosixPath(path.join(facts.outputDir, target.projectDir, target.staticDir))\n );\n const unixAssetCopyCommand = `mkdir -p ${unixDestinationParent} && cp -R ${unixSourceAssets} ${unixDestinationParent}/assets`;\n const directoryLines = IMPORTANT_DIRS.map(\n (dir) => `Inspect ${dir}: ${facts.counts[dir]} item(s) detected in the export.`\n );\n const promptLines = [\n `You are ${aiTool.agentName} working inside a local export created by Framer Export.`,\n 'This brief was generated by the Framer Export AI Prompt Assistant BETA.',\n 'Treat this beta prompt as a strict conversion checklist, not as permission to skip inspection.',\n 'Your mission is to convert this exported static mirror into a clean production project.',\n `Target stack: ${target.stack}.`,\n `Selected AI coding tool: ${aiTool.displayName}.`,\n `Selected conversion situation: ${goal.label}.`,\n `Primary instruction for this situation: ${goal.instruction}`,\n `Main priority: ${goal.priority}`,\n `Source URL from the real export: ${facts.sourceUrl}`,\n `Detected platform from the real export: ${facts.platformName}`,\n `Export folder to inspect first: ${facts.outputDir}`,\n `Root entries actually present: ${rootEntries}`,\n `Create the converted project in: ${projectDir}`,\n `Recommended scaffold command: ${scaffoldCommand}`,\n `Expected important target files: ${target.entryFiles}`,\n `Routing guidance: ${target.routing}`,\n `Static assets destination for this stack: ${target.staticDir}/assets inside the converted project.`,\n `PowerShell command to copy exported assets after scaffolding: ${windowsAssetCopyCommand}`,\n `macOS/Linux command to copy exported assets after scaffolding: ${unixAssetCopyCommand}`,\n 'Run the asset copy command; do not recreate, redownload, rename randomly, or replace real exported assets with placeholders.',\n 'After copying assets, update every image, video, font, CSS url(), and script reference to the new local asset path.',\n 'Do not rush. Take time to inspect the export before writing the final implementation.',\n 'Do not invent brand names, copy, images, links, animations, colors, or sections.',\n 'Use only real information found in index.html, CSS files, JavaScript files, data files, and assets.',\n 'If a detail is missing, inspect more files instead of guessing.',\n 'If a vendor script is minified or hard to understand, identify what behavior it provides before replacing it.',\n 'Keep the final result professional, clean, responsive, and maintainable.',\n 'Do not simplify the site because a section, animation, page, or layout is difficult.',\n 'If something is hard, break it into smaller components and keep working until the result matches closely.',\n 'For every exported page, aim for the closest possible pixel-perfect result: spacing, typography, images, viewport behavior, and motion.',\n 'Do not merge multiple pages into one generic page unless the export proves they are duplicate routes.',\n 'Do not replace complex exported sections with summaries, cards, screenshots, or placeholder blocks.',\n 'If a page has visual depth, overlapping layers, sticky sections, galleries, or scroll effects, recreate those behaviors instead of flattening them.',\n 'Start by listing the files and directories that matter for the conversion.',\n ...directoryLines,\n 'Read index.html fully enough to understand page structure, metadata, linked assets, and scripts.',\n 'Read the CSS files that define layout, typography, responsive rules, and visual details.',\n 'Inspect scripts/vendor only to understand required interactions; do not blindly copy huge vendor bundles.',\n 'Inspect scripts/modules for page-specific logic, animations, sliders, menus, and dynamic behavior.',\n 'Inspect data files for CMS-like content, page data, configuration, or serialized props.',\n 'Inspect assets/images and preserve the real image files that are actually used.',\n 'Inspect assets/fonts and preserve font loading if the design depends on custom fonts.',\n 'Inspect subpages if it contains exported pages; map them to routes only when they represent real pages.',\n 'If subpages contains pages, convert each meaningful page with its own route and page component.',\n 'For each converted page, compare against the original exported HTML route and adjust until it is visually close.',\n 'Create a clean project structure instead of dumping everything into one component.',\n 'Separate global layout, page sections, shared components, data helpers, and styles.',\n 'Use semantic HTML for headings, navigation, buttons, forms, sections, and footer content.',\n 'Preserve the original hierarchy of visible content unless there is a clear bug to fix.',\n 'Preserve real URLs and links, but convert local asset paths to the new project structure.',\n 'Move static assets into the target framework public/static asset location when appropriate.',\n 'Do not keep broken CDN references if a local exported asset already exists.',\n 'Do not hardcode absolute machine paths into source files; use framework-relative public asset paths after copying.',\n 'Keep original filenames when possible so CSS and content references remain traceable.',\n 'Do not leave unused analytics, editor badges, platform badges, or export-only scripts in the new app.',\n 'Replace platform-specific runtime code with native framework components when possible.',\n 'Keep interactions that users can see: menus, hover states, forms, sliders, animations, and scroll effects.',\n 'If an interaction is too complex, implement a clean equivalent and document the difference briefly.',\n 'Keep responsive behavior for desktop, tablet, and mobile.',\n 'Check layout at small widths and avoid fixed desktop-only dimensions unless the original requires them.',\n 'Use CSS variables or a clear theme file for colors, spacing, radius, shadows, and typography.',\n 'Name components after their role: Hero, Header, FeatureGrid, Gallery, Pricing, Footer, and similar real sections.',\n 'Avoid generic placeholder components if the exported site has specific section meaning.',\n 'Use TypeScript types where they make the content or component props clearer.',\n 'Do not add unnecessary libraries unless they replace a real exported behavior cleanly.',\n 'If you add a library, explain why it is needed and where it is used.',\n 'Keep package.json scripts standard: dev, build, preview, lint when available.',\n 'Keep the build reproducible from a fresh install.',\n 'After implementing, run the install/build/typecheck commands available for the target project.',\n 'Fix any build errors instead of leaving TODOs.',\n 'Open the generated app locally if possible and compare against the exported index.html visually.',\n 'When there are subpages, compare every generated route against its matching exported file.',\n 'Verify that every visible image loads from the new project.',\n 'Verify that font rendering is close to the export.',\n 'Verify that navigation and internal links work.',\n 'Verify that responsive breakpoints do not overlap or hide important content.',\n 'Verify that there are no console errors caused by missing assets or copied platform scripts.',\n 'Keep accessibility basics: alt text when inferable, keyboard-reachable controls, visible focus states.',\n 'Keep SEO basics: title, meta description if present, canonical only if it is correct, Open Graph when present.',\n 'Do not fabricate SEO copy; reuse existing metadata or ask for missing copy if necessary.',\n 'Commit to a small number of high-quality files rather than many noisy fragments.',\n 'If a section repeats, extract a reusable component and data array.',\n 'If a section is unique, keep it simple and local to the page.',\n 'Document important migration decisions in a short README inside the converted project.',\n 'The README must mention the source export folder, target stack, setup command, and known limitations.',\n 'Do not delete the original export folder.',\n 'Do not modify unrelated files outside the new converted project unless required for setup.',\n 'If the worktree has existing changes, avoid reverting or overwriting them.',\n 'Before large edits, inspect first and explain the conversion plan briefly.',\n 'Then implement the conversion step by step until the app builds.',\n 'Final answer must summarize what was converted, where the new project lives, and which checks passed.',\n 'If something could not be converted, state the exact file or behavior and the reason.',\n 'Quality bar: the result should feel like a real hand-built production app, not an automated scrape or simplified demo.',\n ];\n\n return [\n `# ${aiTool.displayName} Conversion Prompt - ${target.label}`,\n '',\n 'Status: BETA assistant output. Review the export carefully and follow the real files.',\n `Generated from real export: ${facts.outputDir}`,\n `AI tool: ${aiTool.displayName}`,\n `Target: ${target.label}`,\n `Situation: ${goal.label}`,\n '',\n promptLines.map((line, index) => `${String(index + 1).padStart(2, '0')}. ${line}`).join('\\n'),\n '',\n ].join('\\n');\n}\n\nfunction quoteForPrompt(value: string): string {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction toPosixPath(value: string): string {\n return value.replace(/\\\\/g, '/');\n}\n\nasync function copyToClipboard(text: string): Promise<void> {\n const commands =\n process.platform === 'win32'\n ? [{ command: 'clip', args: [] }]\n : process.platform === 'darwin'\n ? [{ command: 'pbcopy', args: [] }]\n : [\n { command: 'wl-copy', args: [] },\n { command: 'xclip', args: ['-selection', 'clipboard'] },\n { command: 'xsel', args: ['--clipboard', '--input'] },\n ];\n\n let lastError: Error | null = null;\n for (const item of commands) {\n try {\n await pipeToCommand(item.command, item.args, text);\n return;\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n throw lastError || new Error('No clipboard command found');\n}\n\nfunction pipeToCommand(command: string, args: string[], input: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: ['pipe', 'ignore', 'pipe'] });\n let stderr = '';\n let settled = false;\n\n const finish = (error?: Error): void => {\n if (settled) return;\n settled = true;\n if (error) reject(error);\n else resolve();\n };\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n child.on('error', finish);\n child.on('close', (code) => {\n if (code === 0) {\n finish();\n } else {\n finish(new Error(`${command} exited with ${code}${stderr ? `: ${stderr.trim()}` : ''}`));\n }\n });\n child.stdin?.end(input);\n });\n}\n\nfunction printPromptResult(\n promptPath: string,\n target: ConversionTarget,\n aiTool: AiTool,\n goal: ConversionGoal\n): void {\n const w = maxWidth();\n const isSmall = w < 50;\n const inner = w - 4;\n const relPath = path.relative(process.cwd(), promptPath) || promptPath;\n\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(\n boxLine(\n w,\n centerText(\n `${ui.success('✓')} ${ui.text.bold('AI Prompt Ready')} ${ui.error('BETA')}`,\n inner\n )\n )\n );\n console.log(boxSep(w));\n console.log(\n boxLine(w, centerText(`${ui.muted('Tool')} ${ui.primary(aiTool.displayName)}`, inner))\n );\n console.log(boxLine(w, centerText(`${ui.muted('Stack')} ${ui.primary(target.label)}`, inner)));\n console.log(boxLine(w, centerText(`${ui.muted('Mode')} ${ui.primary(goal.label)}`, inner)));\n console.log(boxLine(w, centerText(`${ui.muted('File')} ${ui.primary(relPath)}`, inner)));\n console.log(boxSep(w));\n console.log(\n boxLine(w, centerText(`${buttonLabel('Copy prompt')} ${buttonLabel('Done')}`, inner))\n );\n console.log(boxBot(w));\n } else {\n console.log(ui.text.bold(' AI Prompt Ready - BETA'));\n console.log(` Tool: ${ui.primary(aiTool.displayName)}`);\n console.log(` Stack: ${ui.primary(target.label)}`);\n console.log(` Situation: ${ui.primary(goal.label)}`);\n console.log(` File: ${ui.primary(relPath)}`);\n }\n console.log('');\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport chalk from 'chalk';\nimport type { Browser, Page } from 'puppeteer';\nimport { AssetMap } from '../assets/asset-map.js';\nimport { dlBuffer } from '../network/download.js';\nimport { info, log, success, setCooking } from '../logger/index.js';\nimport { launchAndCapture, captureSubpage, closeBrowser } from './capture.js';\nimport { downloadAll } from './download.js';\nimport { buildOutput } from './output.js';\nimport { printSummary } from './summary.js';\nimport { runAiPromptAssistant } from '../ai/prompt-assistant.js';\nimport { detectPlatform, getPlatformByName } from '../platforms/index.js';\nimport type { PlatformHandler, PlatformType } from '../platforms/types.js';\nimport type { ExporterContext } from '../types.js';\nimport { CookingSpinner } from '../cli/cooking.js';\nimport { chip, ui } from '../cli/theme.js';\n\nexport function deriveOutputName(url: string, platformName: PlatformType): string {\n try {\n const parsed = new URL(url);\n const hostname: string = parsed.hostname;\n\n let siteName: string;\n if (hostname.endsWith('.webflow.io')) {\n siteName = hostname.replace('.webflow.io', '');\n } else if (hostname.includes('.wixsite.com')) {\n const parts: string[] = parsed.pathname.split('/').filter(Boolean);\n siteName = parts[0] || hostname.split('.')[0];\n } else if (hostname.match(/\\.framer\\.(app|website|ai)$/)) {\n siteName = hostname.split('.framer.')[0];\n } else {\n siteName = hostname.replace(/\\./g, '-');\n }\n\n const cleanName =\n siteName\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '') || 'site';\n\n return `${platformName}-${cleanName}-${randomOutputSuffix()}`;\n } catch {\n return `framer-export-output-${randomOutputSuffix()}`;\n }\n}\n\nfunction randomOutputSuffix(): string {\n const adjectives = ['clean', 'bright', 'swift', 'sharp', 'fresh', 'solid', 'tidy', 'prime'];\n const nouns = ['mirror', 'export', 'site', 'build', 'copy', 'page', 'stack', 'bundle'];\n const adjective = adjectives[Math.floor(Math.random() * adjectives.length)];\n const noun = nouns[Math.floor(Math.random() * nouns.length)];\n const id = Math.random().toString(36).slice(2, 6);\n return `${adjective}-${noun}-${id}`;\n}\n\nexport class FramerExporter implements ExporterContext {\n siteUrl: string;\n outDir: string;\n assets: AssetMap;\n browser: Browser | null;\n page: Page | null;\n ssrHTML: string;\n prettyPrint: boolean;\n platform: PlatformHandler;\n cooking?: CookingSpinner;\n\n constructor(siteUrl: string, outDir: string, platformOverride?: PlatformType) {\n this.siteUrl = siteUrl;\n this.outDir = outDir;\n this.assets = new AssetMap();\n this.browser = null;\n this.page = null;\n this.ssrHTML = '';\n this.prettyPrint = true;\n\n if (platformOverride && platformOverride !== 'unknown') {\n this.platform = getPlatformByName(platformOverride);\n } else {\n this.platform = detectPlatform(siteUrl);\n }\n }\n\n async run(includeSubpages: boolean = false): Promise<void> {\n console.log(\n `\\n ${ui.text.bold('Framer Export')} ${chip('mirror')} ${ui.muted('v4 pipeline')}\\n`\n );\n info('Source : ' + chalk.underline(this.siteUrl));\n info('Output : ' + ui.primary(this.outDir));\n info('Platform : ' + ui.primary(this.platform.displayName));\n if (includeSubpages) {\n info('Subpages : ' + ui.success('enabled'));\n }\n console.log('');\n\n this.cooking = new CookingSpinner();\n setCooking(this.cooking);\n this.cooking.start('Preparing directories...');\n\n for (const d of [\n '',\n 'assets/images',\n 'assets/fonts',\n 'assets/videos',\n 'assets/misc',\n 'styles',\n 'scripts/vendor',\n 'scripts/modules',\n 'data',\n 'subpages',\n ]) {\n await fs.mkdir(path.join(this.outDir, d), { recursive: true });\n }\n log('Output directory structure created');\n\n this.cooking.update('Fetching SSR HTML...');\n log('Fetching SSR HTML from ' + this.siteUrl);\n try {\n const buf: Buffer = await dlBuffer(this.siteUrl);\n this.ssrHTML = buf.toString('utf-8');\n success('SSR HTML fetched (' + (this.ssrHTML.length / 1024).toFixed(1) + ' KB)');\n } catch (e) {\n log(chalk.red('Could not fetch SSR HTML: ' + (e as Error).message));\n }\n\n const htmlDetected = detectPlatform(this.siteUrl, this.ssrHTML);\n if (htmlDetected.name !== this.platform.name) {\n this.platform = htmlDetected;\n log('Platform refined: ' + ui.primary(this.platform.displayName) + ' (from HTML analysis)');\n }\n\n await launchAndCapture(this);\n\n if (includeSubpages && this.page) {\n await this.crawlSubpages();\n }\n\n await closeBrowser(this);\n\n this.cooking.update('Downloading assets...');\n await downloadAll(this);\n\n this.cooking.update('Building output...');\n await buildOutput(this);\n\n this.cooking.stop();\n setCooking(null);\n\n console.log('');\n success('Export complete!');\n await printSummary(this);\n await runAiPromptAssistant(this);\n }\n\n private async crawlSubpages(): Promise<void> {\n this.cooking?.update('Discovering sub-pages...');\n log('Scanning page for internal links...');\n\n const page = this.page!;\n const baseUrl = new URL(this.siteUrl);\n const baseHost = baseUrl.hostname.replace(/^www\\./, '');\n\n const links: string[] = await page.evaluate((host: string) => {\n const anchors = Array.from(document.querySelectorAll('a[href]'));\n const hrefs = new Set<string>();\n for (const a of anchors) {\n const href = (a as HTMLAnchorElement).href;\n if (\n !href ||\n href.startsWith('javascript:') ||\n href.startsWith('mailto:') ||\n href.startsWith('tel:') ||\n href.startsWith('#')\n )\n continue;\n try {\n const u = new URL(href);\n const h = u.hostname.replace(/^www\\./, '');\n if (\n h === host &&\n u.pathname !== '/' &&\n u.pathname !== '' &&\n !u.pathname.startsWith('/#')\n ) {\n hrefs.add(href.split('#')[0]);\n }\n } catch {}\n }\n return Array.from(hrefs);\n }, baseHost);\n\n log('Found ' + links.length + ' sub-page links');\n const uniqueLinks = [...new Set(links)].slice(0, 50);\n\n if (uniqueLinks.length === 0) {\n log('No sub-pages to crawl');\n return;\n }\n\n for (let i = 0; i < uniqueLinks.length; i++) {\n const link = uniqueLinks[i];\n this.cooking?.update('Crawling sub-page ' + (i + 1) + '/' + uniqueLinks.length);\n try {\n const html = await captureSubpage(page, link, {\n needsHydrationCheck: this.platform.needsHydrationCheck,\n hydrationTimeout: this.platform.hydrationTimeout,\n });\n\n const slug = this.deriveSlug(link, baseUrl);\n const filename = slug + '.html';\n const filepath = path.join(this.outDir, 'subpages', filename);\n\n await fs.writeFile(filepath, html, 'utf-8');\n log(' Saved: subpages/' + filename);\n } catch (e) {\n log(' Skipped ' + link + ': ' + (e as Error).message);\n }\n }\n\n success('Sub-pages crawled: ' + uniqueLinks.length);\n }\n\n private deriveSlug(link: string, baseUrl: URL): string {\n try {\n const u = new URL(link);\n let pathname = u.pathname.replace(/\\/+$/, '').replace(/^\\//, '');\n if (!pathname) return 'index';\n return pathname.replace(/[^a-zA-Z0-9_-]/g, '_').replace(/_+/g, '_') || 'page';\n } catch {\n return 'page';\n }\n }\n}\n","import readline from 'node:readline/promises';\nimport { stdin, stdout } from 'node:process';\nimport path from 'node:path';\nimport { URL } from 'node:url';\nimport chalk from 'chalk';\nimport { showBanner } from './banner.js';\nimport { FramerExporter, deriveOutputName } from '../exporter/index.js';\nimport { detectPlatform } from '../platforms/index.js';\nimport { promptInput, select } from './select.js';\nimport type { PlatformType } from '../platforms/types.js';\nimport { boxTop, boxLine, boxSep, boxBot, boxRow, maxWidth } from './box.js';\nimport { bullet, chip, ui } from './theme.js';\n\nfunction drawHeader(title: string): void {\n const w = maxWidth();\n if (w < 50) {\n console.log(`\\n ${bullet('●')} ${ui.text.bold(title)}`);\n return;\n }\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' ' + title)));\n console.log(boxBot(w));\n console.log('');\n}\n\nexport async function runSetup(legacyMode: boolean = false): Promise<void> {\n showBanner();\n\n console.log(` ${ui.text.bold('Framer Export setup')} ${chip('interactive')}`);\n console.log(\n ` ${ui.muted('Export Framer, Webflow, and Wix sites into a clean local mirror.')}\\n`\n );\n\n const rl = legacyMode ? readline.createInterface({ input: stdin, output: stdout }) : null;\n\n const ask = async (\n question: string,\n defaultVal?: string,\n headerLines: string[] = []\n ): Promise<string> => {\n if (!legacyMode) {\n return promptInput(question, defaultVal || '', { headerLines });\n }\n\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${ui.primary('●')} ${ui.text.bold(question)}${suffix} ${ui.muted('>')} `;\n const answer: string = await rl!.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n if (legacyMode) drawHeader('Step 1 : Site URL');\n\n let siteUrl = '';\n let urlError = '';\n while (!siteUrl) {\n const input: string = await ask(\n 'Enter the site URL',\n '',\n ['Step 1 : Site URL', urlError].filter(Boolean)\n );\n try {\n new URL(input);\n siteUrl = input;\n urlError = '';\n } catch {\n urlError = 'Invalid URL. Enter a valid URL (https://...)';\n if (legacyMode) {\n console.log(` ${ui.error('✗')} ${ui.error(urlError)}\\n`);\n }\n }\n }\n if (legacyMode) {\n console.log(` ${ui.success('✓')} ${ui.success('URL:')} ${chalk.underline(siteUrl)}\\n`);\n }\n\n let platformName: PlatformType | null = null;\n\n if (legacyMode) {\n drawHeader('Step 2 : Platform');\n const detected = detectPlatform(siteUrl);\n console.log(` ${ui.info('i')} Auto-detected: ${ui.primary(detected.displayName)}`);\n const platformInput: string = await ask('Platform (framer/webflow/wix)', detected.name);\n platformName = (\n ['framer', 'webflow', 'wix'].includes(platformInput) ? platformInput : detected.name\n ) as PlatformType;\n console.log(` ${ui.success('✓')} ${ui.success('Platform:')} ${ui.primary(platformName)}\\n`);\n } else {\n while (!platformName) {\n const detected = detectPlatform(siteUrl);\n const platforms = [\n {\n label: `Framer${detected.name === 'framer' ? chalk.gray(' (detected)') : ''}`,\n value: 'framer',\n },\n {\n label: `Webflow${detected.name === 'webflow' ? chalk.gray(' (detected)') : ''}`,\n value: 'webflow',\n },\n { label: `Wix${detected.name === 'wix' ? chalk.gray(' (detected)') : ''}`, value: 'wix' },\n ];\n const defaultIdx = ['framer', 'webflow', 'wix'].indexOf(detected.name);\n const platformChoice = await select('Select platform', platforms, Math.max(0, defaultIdx), {\n headerLines: [`URL: ${siteUrl}`],\n actions: [{ label: 'Modify URL', value: 'modify-url' }],\n footer: 'tab focus button · mouse hover/click · enter select',\n });\n\n if (platformChoice === 'modify-url') {\n siteUrl = '';\n urlError = '';\n while (!siteUrl) {\n const input = await ask(\n 'Modify site URL',\n '',\n ['Step 1 : Site URL', urlError].filter(Boolean)\n );\n try {\n new URL(input);\n siteUrl = input;\n urlError = '';\n } catch {\n urlError = 'Invalid URL. Enter a valid URL (https://...)';\n }\n }\n continue;\n }\n\n platformName = platformChoice as PlatformType;\n }\n }\n\n if (!platformName) {\n throw new Error('Platform selection failed');\n }\n\n const rl2 = legacyMode ? rl! : null;\n\n const ask2 = async (\n question: string,\n defaultVal?: string,\n headerLines: string[] = []\n ): Promise<string> => {\n if (!legacyMode) {\n return promptInput(question, defaultVal || '', { headerLines });\n }\n\n const suffix: string = defaultVal ? chalk.gray(` (${defaultVal})`) : '';\n const prompt: string = ` ${ui.primary('●')} ${ui.text.bold(question)}${suffix} ${ui.muted('>')} `;\n const answer: string = await rl2!.question(prompt);\n return answer.trim() || defaultVal || '';\n };\n\n const derivedName: string = deriveOutputName(siteUrl, platformName);\n\n if (legacyMode) drawHeader('Step 3 : Output Directory');\n\n const outDir: string = await ask2('Output directory', './' + derivedName, [\n 'Step 3 : Output Directory',\n `URL: ${siteUrl}`,\n `Platform: ${platformName}`,\n ]);\n if (legacyMode) {\n console.log(` ${ui.success('✓')} ${ui.success('Output:')} ${ui.primary(outDir)}\\n`);\n }\n\n if (legacyMode) drawHeader('Step 4 : Options');\n\n let prettyPrint: boolean;\n let concurrency: number;\n let includeSubpages: boolean;\n\n if (legacyMode) {\n const prettyAnswer: string = await ask2('Pretty-print JS files? (y/n)', 'y');\n prettyPrint = prettyAnswer.toLowerCase().startsWith('y');\n console.log(\n ` ${ui.success('✓')} Pretty-print: ${prettyPrint ? ui.success('yes') : ui.error('no')}\\n`\n );\n\n const subpagesAnswer: string = await ask2('Export sub-pages? (y/n)', 'n');\n includeSubpages = subpagesAnswer.toLowerCase().startsWith('y');\n console.log(\n ` ${ui.success('✓')} Sub-pages: ${includeSubpages ? ui.success('yes') : ui.error('no')}\\n`\n );\n\n const concurrencyAnswer: string = await ask2('Download concurrency', '12');\n concurrency = parseInt(concurrencyAnswer, 10) || 12;\n console.log(` ${ui.success('✓')} Concurrency: ${ui.primary(String(concurrency))}\\n`);\n } else {\n const prettyVal = await select('Pretty-print JS files?', [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n ]);\n prettyPrint = prettyVal === 'yes';\n\n const subpagesVal = await select(\n 'Export sub-pages?',\n [\n { label: 'No', value: 'no' },\n { label: 'Yes, crawl and export', value: 'yes' },\n ],\n 0\n );\n includeSubpages = subpagesVal === 'yes';\n\n const concurrencyVal = await select(\n 'Download concurrency',\n [\n { label: '6 (slow connection)', value: '6' },\n { label: '12 (default)', value: '12' },\n { label: '20 (fast connection)', value: '20' },\n ],\n 1\n );\n concurrency = parseInt(concurrencyVal, 10);\n }\n\n const w = maxWidth();\n const isSmall = w < 50;\n console.log('');\n if (!isSmall) {\n console.log(boxTop(w));\n console.log(boxLine(w, ui.text.bold(' Summary')));\n console.log(boxSep(w));\n } else {\n console.log(ui.text.bold(' Summary:'));\n }\n\n for (const [label, value] of [\n ['URL', siteUrl],\n ['Platform', platformName],\n ['Output', path.resolve(outDir)],\n ['Pretty-print', prettyPrint ? 'yes' : 'no'],\n ['Sub-pages', includeSubpages ? 'yes' : 'no'],\n ['Concurrency', String(concurrency)],\n ]) {\n console.log(boxRow(w, label, value));\n }\n\n if (!isSmall) {\n console.log(boxBot(w));\n }\n console.log('');\n\n let startExport: boolean;\n\n if (legacyMode) {\n const confirm: string = await ask2('Start export? (y/n)', 'y');\n startExport = confirm.toLowerCase().startsWith('y');\n rl2!.close();\n } else {\n const confirmVal = await select('Start export?', [\n { label: 'Yes, start now', value: 'yes' },\n { label: 'Cancel', value: 'no' },\n ]);\n startExport = confirmVal === 'yes';\n }\n\n if (!startExport) {\n console.log(`\\n ${ui.warning('Export cancelled.')}\\n`);\n return;\n }\n\n console.log('');\n\n const { CFG } = await import('../config/index.js');\n CFG.concurrency = concurrency;\n\n const exporter = new FramerExporter(siteUrl, path.resolve(outDir), platformName);\n exporter.prettyPrint = prettyPrint;\n await exporter.run(includeSubpages);\n}\n","import path from 'path';\nimport { URL } from 'url';\nimport { spawnSync } from 'child_process';\nimport pkg from '../../package.json';\nimport { showHelp } from './help.js';\nimport { showBanner } from './banner.js';\nimport { showLoadingIntro } from './cooking.js';\nimport { checkForUpdates } from './update-check.js';\nimport { select } from './select.js';\nimport { ui } from './theme.js';\nimport type { PlatformType } from '../platforms/types.js';\n\nconst VERSION = pkg.version;\n\nfunction extractFlag(args: string[], flag: string): string | null {\n const idx: number = args.indexOf(flag);\n if (idx === -1 || idx + 1 >= args.length) return null;\n const value: string = args[idx + 1];\n args.splice(idx, 2);\n return value;\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n const idx: number = args.indexOf(flag);\n if (idx === -1) return false;\n args.splice(idx, 1);\n return true;\n}\n\nasync function showUpdateNotice(): Promise<void> {\n const latest = await checkForUpdates(VERSION);\n if (!latest) return;\n\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.log('');\n console.log(\n ` ${ui.warning('↳')} Update available: ${ui.muted(VERSION)} -> ${ui.success(latest)}`\n );\n console.log(` ${ui.primary(' Run:')} ${ui.primarySoft('npm i -g framer-export@latest')}`);\n console.log('');\n return;\n }\n\n const action = await select(\n 'Update available',\n [\n { label: 'Continue without updating', value: 'continue' },\n { label: 'Update now', value: 'update' },\n ],\n 0,\n {\n headerLines: [\n `Current version: ${VERSION}`,\n `Latest version: ${latest}`,\n 'You can continue now and update later.',\n ],\n footer: 'enter continue · mouse hover/click',\n }\n );\n\n if (action === 'update') {\n console.log(\n ` ${ui.primary('Updating:')} ${ui.primarySoft('npm i -g framer-export@latest')}\\n`\n );\n const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';\n const result = spawnSync(npmCommand, ['i', '-g', 'framer-export@latest'], {\n stdio: 'inherit',\n });\n\n if (result.status === 0) {\n console.log(`\\n ${ui.success('✓')} Updated. Re-run your command to use the new version.\\n`);\n process.exit(0);\n }\n\n console.log(\n `\\n ${ui.error('✗')} Update failed. Run manually: ${ui.primarySoft('npm i -g framer-export@latest')}\\n`\n );\n }\n}\n\nasync function main(): Promise<void> {\n const args: string[] = process.argv.slice(2);\n\n if (args.includes('--version') || args.includes('-v')) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (args.includes('--about')) {\n const chalk = (await import('chalk')).default;\n showBanner();\n console.log(` ${ui.text.bold('Framer Export')} ${ui.muted(`v${pkg.version}`)}`);\n console.log(` ${ui.text(pkg.description)}\\n`);\n console.log(` ${ui.text.bold('Author')} ${ui.primary('Dany (danbenba)')}`);\n console.log(\n ` ${ui.text.bold('Portfolio')} ${chalk.underline.hex('#FAB283')('https://github.com/danbenba')}`\n );\n console.log(\n ` ${ui.text.bold('GitHub')} ${chalk.underline.hex('#FAB283')(pkg.repository.url.replace('git+', '').replace('.git', ''))}`\n );\n console.log(\n ` ${ui.text.bold('npm')} ${chalk.underline.hex('#FAB283')(`https://www.npmjs.com/package/${pkg.name}`)}`\n );\n console.log(` ${ui.text.bold('License')} ${ui.success(pkg.license)}`);\n console.log(` ${ui.text.bold('Node')} ${ui.muted(`>=${pkg.engines.node}`)}`);\n console.log('');\n process.exit(0);\n }\n\n if (args.includes('--help') || args.includes('-h')) {\n showHelp();\n process.exit(0);\n }\n\n await showLoadingIntro(VERSION);\n await showUpdateNotice();\n\n if (args.includes('--setup')) {\n hasFlag(args, '--setup');\n const legacyMode: boolean = hasFlag(args, '--legacy-mode');\n const { runSetup } = await import('./setup.js');\n await runSetup(legacyMode);\n return;\n }\n\n if (!args.length) {\n const { runSetup } = await import('./setup.js');\n await runSetup(false);\n return;\n }\n\n const platformOverride = extractFlag(args, '--platform') as PlatformType | null;\n const includeSubpages: boolean = hasFlag(args, '--subpages');\n\n showBanner();\n\n const url: string = args[0];\n\n try {\n new URL(url);\n } catch {\n console.log(` ${ui.error('✗')} ${ui.error.bold('Invalid URL:')} ${ui.text(url)}`);\n console.log(` ${ui.muted('Expected: https://yoursite.framer.app')}\\n`);\n process.exit(1);\n }\n\n const { FramerExporter, deriveOutputName } = await import('../exporter/index.js');\n const { detectPlatform } = await import('../platforms/index.js');\n\n const detected = platformOverride || detectPlatform(url).name;\n const defaultDir: string = deriveOutputName(url, detected as PlatformType);\n const out: string = args[1] || `./${defaultDir}`;\n\n try {\n await new FramerExporter(url, path.resolve(out), platformOverride || undefined).run(\n includeSubpages\n );\n } catch (e) {\n const chalk = (await import('chalk')).default;\n console.log(\n `\\n ${ui.error('✗')} ${ui.error.bold('FAILED:')} ${ui.text((e as Error).message)}`\n );\n console.log(chalk.gray((e as Error).stack || ''));\n process.exit(1);\n }\n}\n\nmain();\n","import { showBanner } from './banner.js';\nimport { chip, ui } from './theme.js';\n\nexport function showHelp(): void {\n showBanner();\n\n console.log(`${ui.text.bold(' USAGE')} ${chip('cli')}\\n`);\n console.log(\n ` ${ui.primary('framer-export')} ${ui.warning('<url>')} ${ui.muted('[output-dir]')}`\n );\n console.log(\n ` ${ui.primary('fexport')} ${ui.warning('<url>')} ${ui.muted('[output-dir]')}`\n );\n\n console.log('');\n console.log(ui.text.bold(' OPTIONS\\n'));\n\n const opts: Array<[string, string]> = [\n ['--setup', 'Launch the interactive setup assistant'],\n ['--platform <p>', 'Force platform: framer, webflow, wix'],\n ['--subpages', 'Crawl and export sub-pages'],\n ['--legacy-mode', 'Use text input instead of arrow selection'],\n ['--help, -h', 'Show this help message'],\n ];\n\n for (const [flag, desc] of opts) {\n console.log(` ${ui.success(flag.padEnd(18))} ${ui.text(desc)}`);\n }\n\n console.log('');\n console.log(ui.text.bold(' SUPPORTED PLATFORMS\\n'));\n\n const platforms: Array<[string, string]> = [\n ['Framer', 'Auto-detected via .framer.app / .framer.website URLs'],\n ['Webflow', 'Auto-detected via .webflow.io URLs'],\n ['Wix', 'Auto-detected via .wixsite.com URLs + HTML analysis'],\n ];\n\n for (const [name, desc] of platforms) {\n console.log(` ${ui.primary(name.padEnd(12))} ${ui.muted(desc)}`);\n }\n\n console.log('');\n console.log(ui.text.bold(' EXAMPLES\\n'));\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://mysite.framer.app')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://mysite.webflow.io')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.warning('https://user.wixsite.com/my-site')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--platform webflow')} ${ui.warning('https://custom.com')}`\n );\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--subpages')} ${ui.warning('https://mysite.com')}`\n );\n console.log(` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--setup')}`);\n console.log(\n ` ${ui.muted('$')} ${ui.primary('framer-export')} ${ui.success('--setup --legacy-mode')}`\n );\n console.log('');\n}\n","import https from 'https';\n\nexport async function checkForUpdates(currentVersion: string): Promise<string | null> {\n return new Promise((resolve) => {\n const req = https.get(\n 'https://registry.npmjs.org/framer-export/latest',\n { timeout: 3000 },\n (res) => {\n let data = '';\n res.on('data', (chunk) => (data += chunk));\n res.on('end', () => {\n try {\n const json = JSON.parse(data);\n const latest = json.version;\n if (!latest) return resolve(null);\n if (isNewerVersion(latest, currentVersion)) return resolve(latest);\n resolve(null);\n } catch {\n resolve(null);\n }\n });\n }\n );\n req.on('error', () => resolve(null));\n req.on('timeout', () => {\n req.destroy();\n resolve(null);\n });\n });\n}\n\nfunction isNewerVersion(latest: string, current: string): boolean {\n const latestParts = parseVersion(latest);\n const currentParts = parseVersion(current);\n\n for (let i = 0; i < Math.max(latestParts.length, currentParts.length); i++) {\n const latestPart = latestParts[i] ?? 0;\n const currentPart = currentParts[i] ?? 0;\n if (latestPart > currentPart) return true;\n if (latestPart < currentPart) return false;\n }\n\n return false;\n}\n\nfunction parseVersion(version: string): number[] {\n return version\n .replace(/^v/, '')\n .split(/[.-]/)\n .map((part) => Number.parseInt(part, 10))\n .filter((part) => Number.isFinite(part));\n}\n"],"mappings":"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","names":["chalk","chalk","output","URL","https","URL","chalk","FONT_EXTS","IMG_EXTS","FONT_EXTS","VIDEO_EXTS","path","init_download","fs","path","fs","path","fs","path","stdin","stdout","target","goal","centerText","fs","path","chalk","init_download","readline","stdin","stdout","path","URL","chalk","CFG","path","URL","chalk","runSetup","URL","FramerExporter","deriveOutputName","detectPlatform","path"]}