asciify-engine 1.0.11 → 1.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +43 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +33 -10
- package/dist/index.d.ts +33 -10
- package/dist/index.js +43 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/ascii-engine.ts","../src/webgl-engine.ts"],"names":["parseGIF","decompressFrames","render"],"mappings":"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","file":"index.cjs","sourcesContent":["// ─── Asciify Types ────────────────────────────────────────────────\n\nexport type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';\nexport type RenderMode = 'ascii' | 'dots';\nexport type AnimationStyle = 'none' | 'wave' | 'pulse' | 'rain' | 'breathe' | 'sparkle' | 'glitch' | 'spiral' | 'typewriter' | 'scatter' | 'waveField';\nexport type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal' | 'box' | 'lines';\nexport type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift';\nexport type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice';\nexport type SourceType = 'image' | 'video' | 'gif' | null;\n\nexport interface AsciiOptions {\n fontSize: number;\n charSpacing: number;\n brightness: number;\n contrast: number;\n charset: string;\n colorMode: ColorMode;\n accentColor: string;\n invert: boolean;\n renderMode: RenderMode;\n animationStyle: AnimationStyle;\n animationSpeed: number;\n dotSizeRatio: number;\n ditherStrength: number;\n hoverStrength: number;\n hoverRadius: number;\n hoverEffect: HoverEffect;\n hoverColor: string;\n artStyle: ArtStyle;\n customText: string;\n}\n\nexport interface AsciiCell {\n char: string;\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport type AsciiFrame = AsciiCell[][];\n\nexport interface AsciiResult {\n frames: AsciiFrame[];\n cols: number;\n rows: number;\n fps: number;\n}\n\nexport const CHARSETS = {\n standard: ' .:-=+*#%@',\n blocks: ' ░▒▓█',\n minimal: ' .:+',\n dense: ' .\\'`^\",:;Il!i><~+_-?][}{1)(|\\\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$',\n binary: '01',\n dots: ' ⠁⠃⠇⡇⣇⣧⣷⣿',\n letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n claudeCode: ' ╔╗╚╝║═╠╣╦╩╬░▒▓█│─┌┐└┘├┤┬┴┼',\n box: ' ▪◾◼■█',\n lines: ' ˗‐–—―━',\n} as const;\n\nexport type CharsetKey = keyof typeof CHARSETS;\n\n/**\n * Art Style presets — each one sets render mode, charset, color mode, etc.\n */\nexport const ART_STYLE_PRESETS: Record<ArtStyle, Partial<AsciiOptions>> = {\n classic: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n },\n particles: {\n renderMode: 'dots',\n colorMode: 'fullcolor',\n dotSizeRatio: 0.8,\n },\n letters: {\n renderMode: 'ascii',\n charset: CHARSETS.letters,\n colorMode: 'fullcolor',\n },\n claudeCode: {\n renderMode: 'ascii',\n charset: CHARSETS.claudeCode,\n colorMode: 'accent',\n accentColor: '#f97316',\n },\n art: {\n renderMode: 'ascii',\n charset: CHARSETS.dense,\n colorMode: 'fullcolor',\n },\n terminal: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'matrix',\n },\n box: {\n renderMode: 'ascii',\n charset: CHARSETS.box,\n colorMode: 'grayscale',\n },\n lines: {\n renderMode: 'ascii',\n charset: CHARSETS.lines,\n colorMode: 'fullcolor',\n },\n};\n\nexport const DEFAULT_OPTIONS: AsciiOptions = {\n fontSize: 10,\n charSpacing: 1,\n brightness: 0,\n contrast: 0,\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n accentColor: '#d4ff00',\n invert: false,\n renderMode: 'ascii',\n animationStyle: 'none',\n animationSpeed: 1,\n dotSizeRatio: 0.8,\n ditherStrength: 0,\n hoverStrength: 0,\n hoverRadius: 0.2,\n hoverEffect: 'spotlight',\n hoverColor: '#ffffff',\n artStyle: 'classic',\n customText: '',\n};\n\n/**\n * Hover presets — one-click configurations for the hover system.\n */\nexport const HOVER_PRESETS: Record<HoverPreset, { label: string; options: Partial<AsciiOptions> }> = {\n none: {\n label: 'Off',\n options: { hoverStrength: 0, hoverEffect: 'spotlight', hoverRadius: 0.2, hoverColor: '#ffffff' },\n },\n subtle: {\n label: 'Subtle',\n options: { hoverStrength: 0.25, hoverEffect: 'glow', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n flashlight: {\n label: 'Flashlight',\n options: { hoverStrength: 0.6, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#fffbe6' },\n },\n magnifier: {\n label: 'Magnifier',\n options: { hoverStrength: 0.7, hoverEffect: 'magnify', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n forceField: {\n label: 'Force Field',\n options: { hoverStrength: 0.7, hoverEffect: 'repel', hoverRadius: 0.15, hoverColor: '#a0e8ff' },\n },\n neon: {\n label: 'Neon',\n options: { hoverStrength: 0.6, hoverEffect: 'colorShift', hoverRadius: 0.15, hoverColor: '#d946ef' },\n },\n fire: {\n label: 'Fire',\n options: { hoverStrength: 0.7, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#ff6b2b' },\n },\n ice: {\n label: 'Ice',\n options: { hoverStrength: 0.5, hoverEffect: 'glow', hoverRadius: 0.15, hoverColor: '#60d5f7' },\n },\n};\n","// ─── Asciify Engine ───────────────────────────────────────────────\n// Framework-agnostic. Pure TypeScript.\n// Converts image/video/GIF pixel data to ASCII character grids.\n// Supports: ASCII text mode, Dots mode, Animation effects, Transparency.\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame, AnimationStyle, ArtStyle } from './types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from './types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\n\n/**\n * Create an offscreen canvas for pixel sampling.\n */\nfunction createOffscreenCanvas(width: number, height: number): {\n canvas: HTMLCanvasElement | OffscreenCanvas;\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n} {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n return { canvas, ctx };\n}\n\n/**\n * Apply brightness and contrast adjustments to a luminance value.\n */\nfunction adjustLuminance(lum: number, brightness: number, contrast: number): number {\n let adjusted = lum + brightness * 255;\n const factor = (259 * (contrast * 255 + 255)) / (255 * (259 - contrast * 255));\n adjusted = factor * (adjusted - 128) + 128;\n return Math.max(0, Math.min(255, adjusted));\n}\n\n/**\n * Map a luminance value (0-255) to a character from the charset.\n */\nfunction luminanceToChar(lum: number, charset: string, invert: boolean): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n const index = Math.floor(normalized * (charset.length - 1));\n return charset[Math.max(0, Math.min(charset.length - 1, index))];\n}\n\n/**\n * Map a cell position to a character from custom text, tiled across the image.\n * Only shows characters where brightness is above a threshold; otherwise space.\n * This makes the custom text readable as a repeating pattern across the image.\n */\nfunction customTextToChar(\n lum: number, text: string, x: number, y: number, cols: number, invert: boolean\n): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n // Below threshold → space (dark/empty areas stay blank)\n if (normalized < 0.12) return ' ';\n // Tile the full text across positions so it reads naturally left-to-right\n const pos = y * cols + x;\n return text[pos % text.length];\n}\n\n/**\n * Simple ordered-dither noise based on Bayer 4x4 matrix.\n */\nconst BAYER_4X4 = [\n [ 0, 8, 2,10],\n [12, 4,14, 6],\n [ 3,11, 1, 9],\n [15, 7,13, 5],\n];\n\n// ─── Pre-computed Color LUTs ───\n// Avoid per-cell string allocation for grayscale and matrix modes.\nconst _GRAY_LUT: string[] = new Array(256);\nconst _GREEN_LUT: string[] = new Array(256);\nfor (let _i = 0; _i < 256; _i++) {\n _GRAY_LUT[_i] = `rgb(${_i},${_i},${_i})`;\n _GREEN_LUT[_i] = `rgb(0,${_i},0)`;\n}\n\n// ─── Cached Hover Glow Sprite ───\n// Avoids createRadialGradient() every frame.\nlet _glowCache: { canvas: HTMLCanvasElement; size: number; r: number; g: number; b: number } | null = null;\n\n// @ts-ignore: reserved for future hover-glow feature\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction _getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4; // quantize to reduce cache misses\n if (_glowCache && _glowCache.size === size && _glowCache.r === r && _glowCache.g === g && _glowCache.b === b) {\n return _glowCache.canvas;\n }\n const dim = size * 2;\n const canvas = document.createElement('canvas');\n canvas.width = dim;\n canvas.height = dim;\n const gCtx = canvas.getContext('2d')!;\n const gradient = gCtx.createRadialGradient(size, size, 0, size, size, size);\n gradient.addColorStop(0, `rgba(${r},${g},${b},1)`);\n gradient.addColorStop(0.4, `rgba(${r},${g},${b},0.4)`);\n gradient.addColorStop(1, `rgba(${r},${g},${b},0)`);\n gCtx.fillStyle = gradient;\n gCtx.fillRect(0, 0, dim, dim);\n _glowCache = { canvas, size, r, g, b };\n return canvas;\n}\n\nfunction applyDither(lum: number, x: number, y: number, strength: number): number {\n if (strength <= 0) return lum;\n const threshold = (BAYER_4X4[y % 4][x % 4] / 16 - 0.5) * strength * 128;\n return Math.max(0, Math.min(255, lum + threshold));\n}\n\n/**\n * Resolve a cell's fill color as a string — uses LUT for grayscale/matrix.\n * colorMode is passed directly to avoid per-cell object property lookup.\n */\nfunction getCellColorStr(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): string {\n switch (colorMode) {\n case 'fullcolor':\n return `rgb(${cell.r},${cell.g},${cell.b})`;\n case 'matrix':\n return _GREEN_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n return `rgb(${(acR * ab) | 0},${(acG * ab) | 0},${(acB * ab) | 0})`;\n }\n default:\n return _GRAY_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n }\n}\n\n/**\n * Resolve a cell's fill color as numeric [r, g, b] — avoids string allocation.\n * Uses the shared _colorRGB array to avoid per-call allocation.\n * colorMode passed directly to avoid per-cell object property lookup.\n */\nconst _colorRGB = [0, 0, 0];\nfunction getCellColorRGB(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): number[] {\n switch (colorMode) {\n case 'fullcolor':\n _colorRGB[0] = cell.r; _colorRGB[1] = cell.g; _colorRGB[2] = cell.b;\n break;\n case 'matrix': {\n const mb = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = 0; _colorRGB[1] = mb; _colorRGB[2] = 0;\n break;\n }\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n _colorRGB[0] = (acR * ab) | 0; _colorRGB[1] = (acG * ab) | 0; _colorRGB[2] = (acB * ab) | 0;\n break;\n }\n default: {\n const gray = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = gray; _colorRGB[1] = gray; _colorRGB[2] = gray;\n break;\n }\n }\n return _colorRGB;\n}\n\n/**\n * Get animation multiplier for a cell based on animation style.\n * Returns a value between 0 and 1 that modulates the cell's visibility/size.\n */\nfunction getAnimationMultiplier(\n x: number,\n y: number,\n cols: number,\n rows: number,\n time: number,\n style: AnimationStyle,\n speed: number\n): number {\n if (style === 'none') return 1;\n\n const t = time * speed;\n\n switch (style) {\n case 'wave': {\n const wave = Math.sin((x / cols) * Math.PI * 4 + t * 3) * 0.5 + 0.5;\n const wave2 = Math.sin((y / rows) * Math.PI * 3 + t * 2) * 0.5 + 0.5;\n return 0.3 + 0.7 * (wave * 0.6 + wave2 * 0.4);\n }\n case 'pulse': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dist = Math.sqrt((x - cx) ** 2 + (y - cy) ** 2);\n const maxDist = Math.sqrt(cx ** 2 + cy ** 2);\n const ring = Math.sin(dist / maxDist * Math.PI * 6 - t * 4) * 0.5 + 0.5;\n return 0.2 + 0.8 * ring;\n }\n case 'rain': {\n const drop = Math.sin(y / rows * Math.PI * 8 - t * 5 + x * 0.3) * 0.5 + 0.5;\n const fade = Math.sin(x / cols * Math.PI * 2 + t) * 0.3 + 0.7;\n return 0.1 + 0.9 * drop * fade;\n }\n case 'breathe': {\n const breathe = Math.sin(t * 2) * 0.3 + 0.7;\n const subtle = Math.sin((x + y) * 0.1 + t) * 0.1;\n return Math.max(0.1, Math.min(1, breathe + subtle));\n }\n case 'sparkle': {\n // Random-looking sparkle using pseudo-random hash\n const hash = Math.sin(x * 127.1 + y * 311.7 + Math.floor(t * 8) * 43758.5453) * 43758.5453;\n const sparkle = (hash - Math.floor(hash));\n return sparkle > 0.7 ? 1 : 0.15 + sparkle * 0.4;\n }\n case 'glitch': {\n // Horizontal glitch bands that shift randomly\n const band = Math.floor(y / (rows * 0.05));\n const glitchHash = Math.sin(band * 43.23 + Math.floor(t * 6) * 17.89) * 43758.5453;\n const glitchVal = glitchHash - Math.floor(glitchHash);\n if (glitchVal > 0.85) {\n // This band glitches — offset or blank\n const flicker = Math.sin(t * 30 + band) * 0.5 + 0.5;\n return flicker < 0.3 ? 0 : flicker;\n }\n return 1;\n }\n case 'spiral': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dx = x - cx;\n const dy = y - cy;\n const angle = Math.atan2(dy, dx);\n const dist = Math.sqrt(dx * dx + dy * dy);\n const maxDist = Math.sqrt(cx * cx + cy * cy);\n const spiral = Math.sin(angle * 3 + dist / maxDist * Math.PI * 8 - t * 3) * 0.5 + 0.5;\n return 0.15 + 0.85 * spiral;\n }\n case 'typewriter': {\n // Reveals characters left-to-right, top-to-bottom in a looping sweep\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1); // 0-1 sweep\n const revealPoint = progress * totalCells * 1.3; // overshoot for full coverage\n const dist = cellIndex - revealPoint;\n if (dist > 0) return 0;\n const fade = Math.max(0, 1 + dist / (totalCells * 0.15));\n return Math.min(1, fade);\n }\n case 'scatter': {\n // Particles scatter outward from center then reform\n const scx = cols / 2;\n const scy = rows / 2;\n const sdx = x - scx;\n const sdy = y - scy;\n const sdist = Math.sqrt(sdx * sdx + sdy * sdy) / Math.sqrt(scx * scx + scy * scy);\n const phase = Math.sin(t * 1.5) * 0.5 + 0.5; // 0-1 oscillation\n const threshold = phase;\n if (sdist > threshold) {\n return Math.max(0, 1 - (sdist - threshold) * 3);\n }\n return 0.7 + 0.3 * Math.sin(sdist * 10 - t * 2);\n }\n case 'waveField':\n // waveField is handled as a full short-circuit in renderFrameToCanvas — never reaches here\n return 1;\n default:\n return 1;\n }\n}\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n * Now reads alpha channel for transparency support.\n */\nexport function imageToAsciiFrame(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: AsciiOptions,\n targetWidth?: number,\n targetHeight?: number\n): { frame: AsciiFrame; cols: number; rows: number } {\n const srcWidth = source instanceof HTMLVideoElement ? source.videoWidth : source.width;\n const srcHeight = source instanceof HTMLVideoElement ? source.videoHeight : source.height;\n\n if (srcWidth === 0 || srcHeight === 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const charAspect = 0.55;\n const cellW = options.fontSize * options.charSpacing;\n const cellH = options.fontSize / charAspect * options.charSpacing;\n\n const renderW = targetWidth || srcWidth;\n const renderH = targetHeight || srcHeight;\n const cols = Math.floor(renderW / cellW);\n const rows = Math.floor(renderH / cellH);\n\n if (cols <= 0 || rows <= 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const { ctx } = createOffscreenCanvas(cols, rows);\n ctx.drawImage(source, 0, 0, cols, rows);\n const imageData = ctx.getImageData(0, 0, cols, rows);\n const pixels = imageData.data;\n\n const frame: AsciiFrame = [];\n\n for (let y = 0; y < rows; y++) {\n const row: AsciiCell[] = [];\n for (let x = 0; x < cols; x++) {\n const i = (y * cols + x) * 4;\n const r = pixels[i];\n const g = pixels[i + 1];\n const b = pixels[i + 2];\n const a = pixels[i + 3]; // Alpha channel\n\n const lum = 0.299 * r + 0.587 * g + 0.114 * b;\n const adjustedLum = adjustLuminance(lum, options.brightness, options.contrast);\n const ditheredLum = applyDither(adjustedLum, x, y, options.ditherStrength);\n const char = options.customText\n ? customTextToChar(ditheredLum, options.customText, x, y, cols, options.invert)\n : luminanceToChar(ditheredLum, options.charset, options.invert);\n\n row.push({ char, r, g, b, a });\n }\n frame.push(row);\n }\n\n return { frame, cols, rows };\n}\n\n/**\n * Extract frames from a video element for ASCII animation.\n */\nexport async function videoToAsciiFrames(\n video: HTMLVideoElement,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n targetFps: number = 12,\n maxDuration: number = 10,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const duration = Math.min(video.duration, maxDuration);\n const totalFrames = Math.ceil(duration * targetFps);\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n for (let i = 0; i < totalFrames; i++) {\n const time = (i / targetFps);\n if (time > duration) break;\n\n video.currentTime = time;\n await new Promise<void>((resolve) => {\n const handler = () => {\n video.removeEventListener('seeked', handler);\n resolve();\n };\n video.addEventListener('seeked', handler);\n });\n\n const result = imageToAsciiFrame(video, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n onProgress?.((i + 1) / totalFrames);\n }\n\n return { frames, cols, rows, fps: targetFps };\n}\n\n/**\n * Extract frames from an animated GIF file buffer.\n * Uses gifuct-js to parse and decompress GIF frames, then composites\n * them onto a canvas (handling disposal methods) to produce full frames.\n */\nexport async function gifToAsciiFrames(\n buffer: ArrayBuffer,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const gif = parseGIF(buffer);\n const rawFrames = decompressFrames(gif, true);\n\n if (rawFrames.length === 0) {\n return { frames: [], cols: 0, rows: 0, fps: 10 };\n }\n\n const gifW = rawFrames[0].dims.width;\n const gifH = rawFrames[0].dims.height;\n\n // Use the full GIF logical screen size for compositing\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n // Compositing canvas (full GIF size)\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n // Previous frame canvas for restore-to-previous disposal\n const prevCanvas = document.createElement('canvas');\n prevCanvas.width = logicalW;\n prevCanvas.height = logicalH;\n const prevCtx = prevCanvas.getContext('2d')!;\n\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n // Calculate average delay to determine FPS\n let totalDelay = 0;\n for (const f of rawFrames) {\n totalDelay += (f.delay || 100);\n }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n // Limit frames to avoid memory issues (cap at ~300 frames)\n const maxFrames = Math.min(rawFrames.length, 300);\n\n for (let i = 0; i < maxFrames; i++) {\n const f = rawFrames[i];\n const { dims, patch, disposalType } = f;\n\n // Save state before drawing (for disposal type 3 = restore to previous)\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n // Create ImageData for this frame's patch\n const frameImageData = new ImageData(patch, dims.width, dims.height);\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = dims.width;\n tempCanvas.height = dims.height;\n const tempCtx = tempCanvas.getContext('2d')!;\n tempCtx.putImageData(frameImageData, 0, 0);\n\n // Draw patch onto compositing canvas at the correct position\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n // Now sample the composited canvas\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n // Handle disposal\n if (disposalType === 2) {\n // Dispose to background (clear the patch area)\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n // Restore to previous\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n // disposalType 0 or 1 = leave as is (do nothing)\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Smoothstep easing for premium falloff curves.\n */\nfunction smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\n/**\n * Compute premium hover effects for a cell — writes results into\n * the reusable _hoverResult object to avoid per-cell allocation.\n * Uses the HoverEffect mode to vary the behaviour.\n */\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nfunction computeHoverEffect(\n nx: number,\n ny: number,\n hoverX: number,\n hoverY: number,\n hoverIntensity: number,\n strength: number,\n cellW: number,\n cellH: number,\n effect: import('./types').HoverEffect = 'spotlight',\n radiusFactor: number = 0.5\n): typeof _hoverResult {\n const dx = nx - hoverX;\n const dy = ny - hoverY;\n const distSq = dx * dx + dy * dy;\n\n // Dynamic radius — radiusFactor (0-1) maps to visual influence area\n const radius = (0.08 + radiusFactor * 0.35) + strength * 0.04;\n\n if (distSq >= radius * radius) {\n _hoverResult.scale = 1;\n _hoverResult.offsetX = 0;\n _hoverResult.offsetY = 0;\n _hoverResult.glow = 0;\n _hoverResult.colorBlend = 0;\n _hoverResult.proximity = 0;\n return _hoverResult;\n }\n\n const dist = Math.sqrt(distSq);\n const t = 1 - dist / radius;\n const eased = smoothstep(t) * hoverIntensity;\n\n let scale = 1;\n let offsetX = 0;\n let offsetY = 0;\n let glow = 0;\n let colorBlend = 0;\n\n switch (effect) {\n case 'spotlight': {\n scale = 1 + eased * strength * 1.8;\n const angle = Math.atan2(dy, dx);\n const pushForce = eased * eased * strength * 0.6;\n offsetX = Math.cos(angle) * pushForce * cellW;\n offsetY = Math.sin(angle) * pushForce * cellH;\n glow = eased * strength * 0.4;\n colorBlend = eased * eased * strength * 0.25;\n break;\n }\n case 'magnify':\n scale = 1 + eased * strength * 2.5;\n glow = eased * strength * 0.15;\n break;\n case 'repel': {\n scale = 1 + eased * strength * 0.3;\n const angle2 = Math.atan2(dy, dx);\n const push = eased * eased * strength * 1.2;\n offsetX = Math.cos(angle2) * push * cellW;\n offsetY = Math.sin(angle2) * push * cellH;\n break;\n }\n case 'glow':\n glow = eased * strength * 0.8;\n colorBlend = eased * strength * 0.4;\n break;\n case 'colorShift':\n scale = 1 + eased * strength * 0.4;\n glow = eased * strength * 0.2;\n colorBlend = eased * strength * 0.7;\n break;\n }\n\n _hoverResult.scale = scale;\n _hoverResult.offsetX = offsetX;\n _hoverResult.offsetY = offsetY;\n _hoverResult.glow = glow;\n _hoverResult.colorBlend = colorBlend;\n _hoverResult.proximity = eased;\n return _hoverResult;\n}\n\n/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n * Always renders every cell at full quality.\n *\n * Performance strategy:\n * - fillRect fast path for sub-6px text (30x faster than fillText)\n * - Auto-scaling hover radius: at high cell counts, the hover area\n * is proportionally smaller so fewer cells compute hover effects\n * - Hover bounding box early-exit skips cells outside the hover zone\n *\n * @param time - elapsed time in seconds for animation effects\n * @param hoverPos - optional smoothed mouse position {x, y, intensity} for hover effect\n */\nexport function renderFrameToCanvas(\n ctx: CanvasRenderingContext2D,\n frame: AsciiFrame,\n options: AsciiOptions,\n canvasWidth: number,\n canvasHeight: number,\n time: number = 0,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n) {\n // ── waveField short-circuit: render procedurally, ignore frame ──\n if (options.animationStyle === 'waveField') {\n const mouseNorm = hoverPos ? { x: hoverPos.x, y: hoverPos.y } : { x: 0.5, y: 0.5 };\n const acHexWF = (options.accentColor || '#d4ff00').replace('#', '');\n const wfAccentR = parseInt(acHexWF.substring(0, 2), 16) || 212;\n const wfAccentG = parseInt(acHexWF.substring(2, 4), 16) || 255;\n const wfAccentB = parseInt(acHexWF.substring(4, 6), 16) || 0;\n renderWaveBackground(ctx, canvasWidth, canvasHeight, time, mouseNorm, {\n accentColor: `#${acHexWF}`,\n accentThreshold: 0.52,\n mouseInfluence: options.hoverStrength > 0 ? Math.min(1, 0.3 + options.hoverStrength * 0.5) : 0.55,\n mouseFalloff: 2.8,\n speed: options.animationSpeed,\n vortex: options.hoverStrength > 0,\n sparkles: true,\n breathe: true,\n });\n void wfAccentR; void wfAccentG; void wfAccentB;\n return;\n }\n\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n\n ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n\n // Quick transparency check — sparse sample\n let hasTransparency = false;\n const sampleStepY = Math.max(1, rows >> 2);\n const sampleStepX = Math.max(1, cols >> 2);\n outer:\n for (let sampleY = 0; sampleY < rows; sampleY += sampleStepY) {\n const row = frame[sampleY];\n for (let sampleX = 0; sampleX < cols; sampleX += sampleStepX) {\n if (row[sampleX].a < 200) { hasTransparency = true; break outer; }\n }\n }\n\n if (!hasTransparency) {\n ctx.fillStyle = '#0a0a0a';\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n }\n\n const cellW = canvasWidth / cols;\n const cellH = canvasHeight / rows;\n const totalCells = rows * cols;\n\n const hoverIntensity = hoverPos?.intensity ?? 1;\n // When animation is active at high cell counts, disable hover to keep FPS up.\n // Animation already re-renders every cell every frame (expensive trig per cell);\n // adding hover on top doubles the math for cells in the hover zone.\n const animationActive = options.animationStyle !== 'none';\n const suppressHover = animationActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!(hoverPos && options.hoverStrength > 0 && hoverIntensity > 0.005);\n\n // Parse hover color once\n const hc = options.hoverColor || '#ffffff';\n const hcR = parseInt(hc.slice(1, 3), 16) || 255;\n const hcG = parseInt(hc.slice(3, 5), 16) || 255;\n const hcB = parseInt(hc.slice(5, 7), 16) || 255;\n\n // Pre-parse accent color once\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n const acR = parseInt(acHex.substring(0, 2), 16) || 255;\n const acG = parseInt(acHex.substring(2, 4), 16) || 255;\n const acB = parseInt(acHex.substring(4, 6), 16) || 255;\n\n // Auto-scale hover radius based on cell count for consistent performance.\n // At high cell counts the user's radius slider value is scaled down so the\n // hover zone stays a reasonable size (fewer cells to compute effects for).\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6\n : 1;\n const effectiveHoverRadius = options.hoverRadius * radiusScale;\n\n // Pre-compute hover bounding box in grid coords for early-exit\n let hoverMinCol = 0, hoverMaxCol = cols, hoverMinRow = 0, hoverMaxRow = rows;\n let hoverPosX = 0, hoverPosY = 0;\n if (hoverActive && hoverPos) {\n hoverPosX = hoverPos.x;\n hoverPosY = hoverPos.y;\n const hoverNormRadius = (0.08 + effectiveHoverRadius * 0.35) + options.hoverStrength * 0.04;\n hoverMinCol = Math.max(0, Math.floor((hoverPosX - hoverNormRadius) * cols) - 1);\n hoverMaxCol = Math.min(cols, Math.ceil((hoverPosX + hoverNormRadius) * cols) + 1);\n hoverMinRow = Math.max(0, Math.floor((hoverPosY - hoverNormRadius) * rows) - 1);\n hoverMaxRow = Math.min(rows, Math.ceil((hoverPosY + hoverNormRadius) * rows) + 1);\n }\n\n // Cache options lookups outside the inner loop\n const animStyle = options.animationStyle;\n const animSpeed = options.animationSpeed;\n const noAnimation = animStyle === 'none';\n const hoverStrength = options.hoverStrength;\n const hoverEffect = options.hoverEffect;\n const hoverRadiusFactor = effectiveHoverRadius;\n const isInverted = options.invert;\n const colorMode = options.colorMode;\n const TWO_PI = Math.PI * 2;\n const invCols = 1 / cols;\n const invRows = 1 / rows;\n\n // Track last canvas state to skip redundant calls\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n // ─── Dots Render Mode ───\n const maxRadius = Math.min(cellW, cellH) * 0.5 * options.dotSizeRatio;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.a < 10) continue;\n\n const lum = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) * 0.00392156863;\n const intensity = isInverted ? 1 - lum : lum;\n if (intensity < 0.02) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n\n // ─── Hover Effect ───\n let hoverMul = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverMul = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const radius = maxRadius * intensity * animMul * hoverMul;\n if (radius < 0.3) continue;\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n // Compute fill color\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n\n if (radius <= 3) {\n const d = radius * 2;\n ctx.fillRect(px - radius, py - radius, d, d);\n } else {\n ctx.beginPath();\n ctx.arc(px, py, radius, 0, TWO_PI);\n ctx.fill();\n }\n }\n }\n } else {\n // ─── ASCII Text Render Mode ───\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n\n // Below 6px, characters are illegible — use fast fillRect with weight modulation\n // This turns 30K slow fillText calls into fast fillRect calls (30x speedup)\n const useFastRect = fontSize < 6;\n\n if (!useFastRect) {\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n\n // Pre-build character weight map for fillRect mode\n // Maps each charset char to its visual density (0.1 – 1.0)\n let charWeights: Record<string, number> | null = null;\n if (useFastRect) {\n charWeights = {};\n const cs = options.charset;\n const csLen = cs.length;\n for (let i = 0; i < csLen; i++) {\n charWeights[cs[i]] = Math.max(0.1, (i + 0.3) / csLen);\n }\n }\n\n const baseTransform = !useFastRect ? ctx.getTransform() : null;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.char === ' ' || cell.a < 10) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n if (animMul < 0.05) continue;\n\n // ─── Hover Effect ───\n let hoverScale = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverScale = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n if (useFastRect) {\n // ─── Fast fillRect path (sub-6px text) ───\n const weight = charWeights![cell.char] ?? 0.5;\n const effAlpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow)) * weight;\n if (effAlpha < 0.02) continue;\n if (effAlpha !== lastAlpha) { ctx.globalAlpha = effAlpha; lastAlpha = effAlpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n const rw = cellW * hoverScale;\n const rh = cellH * hoverScale;\n ctx.fillRect(px - rw * 0.5, py - rh * 0.5, rw, rh);\n } else {\n // ─── Standard fillText path ───\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n if (hoverScale !== 1) {\n ctx.translate(px, py);\n ctx.scale(hoverScale, hoverScale);\n ctx.fillText(cell.char, 0, 0);\n ctx.setTransform(baseTransform!);\n } else {\n ctx.fillText(cell.char, px, py);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n\n/**\n * Serialize a frame to a compact base64 string.\n *\n * Encoding (chosen by colorMode):\n * fullcolor → 4 bytes/cell: [r, g, b, a]\n * otherwise → 2 bytes/cell: [luma, a] (grayscale/matrix/accent)\n *\n * The first byte of the buffer is a stride marker (2 or 4) so the runtime\n * can auto-detect the format without extra options.\n * Charcode is NEVER stored — the runtime recomputes it from luma + charset.\n */\nfunction serializeFrame(frame: AsciiFrame, fullColor: boolean): string {\n const rows = frame.length;\n const cols = rows > 0 ? frame[0].length : 0;\n // Alpha is always 255 for solid content — omit it to halve grayscale data.\n // stride=1: luma only, stride=3: r,g,b only. Header byte stores stride.\n const stride = fullColor ? 3 : 1;\n // 1 header byte + rows*cols*stride\n const buf = new Uint8Array(1 + rows * cols * stride);\n buf[0] = stride; // stride marker\n let i = 1;\n for (let y = 0; y < rows; y++) {\n for (let x = 0; x < cols; x++) {\n const cell = frame[y][x];\n if (fullColor) {\n buf[i++] = cell.r;\n buf[i++] = cell.g;\n buf[i++] = cell.b;\n } else {\n buf[i++] = Math.round(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b);\n }\n }\n }\n let binary = '';\n for (let j = 0; j < buf.length; j++) binary += String.fromCharCode(buf[j]);\n return btoa(binary);\n}\n\n/**\n * Build the animation multiplier function as an inlined JS string\n * matching the engine's getAnimationMultiplier.\n */\nfunction buildAnimFnJS(style: AnimationStyle, speed: number): string {\n if (style === 'none' || style === 'waveField') return 'function(){return 1}';\n return `function(x,y,cols,rows,t){\n var s=${speed},T=t*s;\n ${style === 'wave' ? `var w=Math.sin(x/cols*Math.PI*4+T*3)*.5+.5,w2=Math.sin(y/rows*Math.PI*3+T*2)*.5+.5;return .3+.7*(w*.6+w2*.4);` : ''}${style === 'pulse' ? `var cx=cols/2,cy=rows/2,d=Math.sqrt((x-cx)*(x-cx)+(y-cy)*(y-cy)),m=Math.sqrt(cx*cx+cy*cy);return .2+.8*(Math.sin(d/m*Math.PI*6-T*4)*.5+.5);` : ''}${style === 'rain' ? `return .1+.9*(Math.sin(y/rows*Math.PI*8-T*5+x*.3)*.5+.5)*(Math.sin(x/cols*Math.PI*2+T)*.3+.7);` : ''}${style === 'breathe' ? `return Math.max(.1,Math.min(1,Math.sin(T*2)*.3+.7+Math.sin((x+y)*.1+T)*.1));` : ''}${style === 'sparkle' ? `var h=Math.sin(x*127.1+y*311.7+Math.floor(T*8)*43758.5453)*43758.5453;var sp=h-Math.floor(h);return sp>.7?1:.15+sp*.4;` : ''}${style === 'glitch' ? `var b=Math.floor(y/(rows*.05)),gh=Math.sin(b*43.23+Math.floor(T*6)*17.89)*43758.5453,gv=gh-Math.floor(gh);if(gv>.85){var fl=Math.sin(T*30+b)*.5+.5;return fl<.3?0:fl}return 1;` : ''}${style === 'spiral' ? `var cx=cols/2,cy=rows/2,dx=x-cx,dy=y-cy,a=Math.atan2(dy,dx),d=Math.sqrt(dx*dx+dy*dy),m=Math.sqrt(cx*cx+cy*cy);return .15+.85*(Math.sin(a*3+d/m*Math.PI*8-T*3)*.5+.5);` : ''}${style === 'typewriter' ? `var tc=cols*rows,ci=y*cols+x,p=(T*.5)%1,rp=p*tc*1.3,dd=ci-rp;if(dd>0)return 0;return Math.min(1,Math.max(0,1+dd/(tc*.15)));` : ''}${style === 'scatter' ? `var cx=cols/2,cy=rows/2,dx=x-cx,dy=y-cy,sd=Math.sqrt(dx*dx+dy*dy)/Math.sqrt(cx*cx+cy*cy),ph=Math.sin(T*1.5)*.5+.5;if(sd>ph)return Math.max(0,1-(sd-ph)*3);return .7+.3*Math.sin(sd*10-T*2);` : ''}\n}`;\n}\n\n/**\n * Build inline JS for resolving cell color based on color mode.\n */\nfunction buildColorFnJS(options: AsciiOptions): string {\n switch (options.colorMode) {\n case 'fullcolor':\n return `function(c){return 'rgb('+c.r+','+c.g+','+c.b+')'}`;\n case 'matrix':\n return `function(c){var b=Math.floor(.299*c.r+.587*c.g+.114*c.b);return 'rgb(0,'+b+',0)'}`;\n case 'accent': {\n const hex = options.accentColor.replace('#', '');\n const ar = parseInt(hex.substring(0, 2), 16);\n const ag = parseInt(hex.substring(2, 4), 16);\n const ab = parseInt(hex.substring(4, 6), 16);\n return `function(c){var b=(.299*c.r+.587*c.g+.114*c.b)/255;return 'rgb('+Math.floor(${ar}*b)+','+Math.floor(${ag}*b)+','+Math.floor(${ab}*b)+')'}`;\n }\n default:\n return `function(c){var g=Math.floor(.299*c.r+.587*c.g+.114*c.b);return 'rgb('+g+','+g+','+g+')'}`;\n }\n}\n\n// ─── Simple one-call API ──────────────────────────────────────────\n\nexport interface AsciifySimpleOptions {\n /** Character size in pixels. Default: 10 */\n fontSize?: number;\n /** Art style preset. Default: 'classic' */\n style?: ArtStyle;\n /** Extra options to merge on top of the preset */\n options?: Partial<AsciiOptions>;\n}\n\n/**\n * Convert an image/video/canvas element to ASCII art and render it onto a canvas.\n *\n * @example\n * const img = document.querySelector('img');\n * const canvas = document.querySelector('canvas');\n * await asciify(img, canvas);\n *\n * @example with options\n * await asciify(img, canvas, { fontSize: 8, style: 'letters' });\n */\nexport async function asciify(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<void> {\n // Resolve string → HTMLImageElement\n let el: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n if (typeof source === 'string') {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error(`Failed to load image: ${source}`));\n img.src = source;\n });\n el = img;\n } else if (source instanceof HTMLImageElement && !source.complete) {\n await new Promise<void>((resolve, reject) => {\n source.onload = () => resolve();\n source.onerror = () => reject(new Error('Image failed to load'));\n });\n el = source;\n } else {\n el = source;\n }\n\n const preset = ART_STYLE_PRESETS[style];\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...preset, ...options, fontSize };\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frame } = imageToAsciiFrame(el, merged, canvas.width, canvas.height);\n renderFrameToCanvas(ctx, frame, merged, canvas.width, canvas.height);\n}\n\n/**\n * Fetch a GIF, convert it to ASCII, and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyGif('animation.gif', canvas);\n * // later: stop();\n *\n * @example with style\n * const stop = await asciifyGif('animation.gif', canvas, { style: 'letters' });\n */\nexport async function asciifyGif(\n source: string | ArrayBuffer,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n const buffer = typeof source === 'string'\n ? await fetch(source).then(r => r.arrayBuffer())\n : source;\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await gifToAsciiFrames(buffer, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n\n/**\n * Convert a video element to ASCII art and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const video = document.querySelector('video');\n * const stop = await asciifyVideo(video, canvas);\n * // later: stop();\n *\n * @example with style\n * const stop = await asciifyVideo(video, canvas, { fontSize: 8, style: 'art' });\n */\nexport async function asciifyVideo(\n source: HTMLVideoElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n let video: HTMLVideoElement;\n if (typeof source === 'string') {\n video = document.createElement('video');\n video.crossOrigin = 'anonymous';\n video.src = source;\n await new Promise<void>((resolve, reject) => {\n video.onloadeddata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${source}`));\n });\n } else {\n video = source;\n }\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await videoToAsciiFrames(video, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n\nconst EMBED_CDN_VERSION = '1.0.11';\n\n/** Build the compact options object for the CDN embed runtime. */\nfunction buildEmbedOpts(\n options: AsciiOptions,\n rows: number,\n cols: number,\n width: number,\n height: number,\n fps?: number,\n animated?: boolean\n): string {\n const o: Record<string, unknown> = {\n r: rows, c: cols, w: width, h: height,\n cs: options.charset,\n cm: options.colorMode,\n as: options.animationStyle,\n sp: options.animationSpeed,\n inv: options.invert,\n hs: options.hoverStrength,\n hr: options.hoverRadius,\n he: options.hoverEffect,\n hc: options.hoverColor,\n dr: options.dotSizeRatio,\n dots: options.renderMode === 'dots',\n };\n if (options.colorMode === 'accent') o.ac = options.accentColor;\n if (fps !== undefined) o.fps = fps;\n if (animated) o.anim = true;\n return JSON.stringify(o);\n}\n\nconst CDN_SCRIPT = `<script src=\"https://cdn.jsdelivr.net/npm/asciify-engine@${EMBED_CDN_VERSION}/dist/embed.js\" async><\\/script>`;\n\n/**\n * Generate a clean embed snippet.\n *\n * Structure:\n * <canvas id> — the render target, short and clean\n * <script type=json id> — frame data lives here, clearly separated\n * <script src=cdn> — always the same line, cached by browsers\n *\n * Output (static):\n * <!-- Asciify Embed -->\n * <canvas id=\"ar-xxx\" data-asciify-opts=\"{…}\" width=\"…\" height=\"…\"></canvas>\n * <script type=\"application/json\" id=\"ar-xxx-d\">\"BASE64\"</script>\n * <script src=\"cdn/embed.js\" async></script>\n * <!-- /Asciify Embed -->\n */\nexport function generateEmbedCode(\n frame: AsciiFrame,\n options: AsciiOptions,\n width: number,\n height: number\n): string {\n const rows = frame.length;\n if (rows === 0) return '';\n const cols = frame[0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const data = serializeFrame(frame, isFullColor);\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height);\n\n return `<!-- Asciify Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">\"${data}\"</script>\n${CDN_SCRIPT}\n<!-- /Asciify Embed -->`;\n}\n\n/**\n * Generate an animated embed snippet for multi-frame (GIF/video) ASCII art.\n * Uses the same CDN runtime as generateEmbedCode.\n */\nexport function generateAnimatedEmbedCode(\n frames: AsciiFrame[],\n options: AsciiOptions,\n fps: number,\n width: number,\n height: number\n): string {\n if (frames.length === 0) return '';\n const rows = frames[0].length;\n const cols = frames[0][0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const allData = frames.map(f => serializeFrame(f, isFullColor));\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height, fps, true);\n\n return `<!-- Asciify Animated Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">${JSON.stringify(allData)}</script>\n${CDN_SCRIPT}\n<!-- /Asciify Animated Embed -->`;\n}\n\n// ─── Wave Background ──────────────────────────────────────────────\n\nexport interface WaveBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Character aspect ratio width/height (default: 0.62) */\n charAspect?: number;\n /** Line height multiplier (default: 1.4) */\n lineHeightRatio?: number;\n /** Character set from dark→bright (default: ' .·:;=+*#%@░▒▓') */\n chars?: string;\n /** Base colour for low-intensity cells — use '{a}' as alpha placeholder (default: white) */\n baseColor?: string;\n /** Accent colour applied near the cursor and on wave peaks (default: '#d4ff00') */\n accentColor?: string;\n /** Accent threshold: normalised intensity above which accent kicks in (default: 0.52) */\n accentThreshold?: number;\n /** How strongly the mouse influences local intensity (default: 0.55) */\n mouseInfluence?: number;\n /** Radial falloff for mouse influence — higher = tighter spotlight (default: 2.8) */\n mouseFalloff?: number;\n /** Base wave animation speed (default: 1) */\n speed?: number;\n /** Enable vortex swirl effect around cursor (default: true) */\n vortex?: boolean;\n /** Enable sparkle / pop flicker layered on top (default: true) */\n sparkles?: boolean;\n /** Enable a slow global breathe pulse (default: true) */\n breathe?: boolean;\n /** Light mode: swap fill colours to dark-on-light (default: false) */\n lightMode?: boolean;\n}\n\n// ─── Smooth noise helpers (value-noise via polynomial hash) ────────\nfunction _fade(t: number): number { return t * t * t * (t * (t * 6 - 15) + 10); }\nfunction _lerp(a: number, b: number, t: number): number { return a + (b - a) * t; }\n\n// Fast 2-D hash → pseudo-random gradient value between -1 and 1\nfunction _hash2(ix: number, iy: number): number {\n let n = ix * 127 + iy * 311;\n n = ((n >> 13) ^ n);\n return (((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 0x3fffffff) - 1;\n}\n\n// Single octave value noise, inputs should be floats\nfunction _vnoise(x: number, y: number): number {\n const ix = Math.floor(x), iy = Math.floor(y);\n const fx = x - ix, fy = y - iy;\n const ux = _fade(fx), uy = _fade(fy);\n const v00 = _hash2(ix, iy );\n const v10 = _hash2(ix + 1, iy );\n const v01 = _hash2(ix, iy + 1);\n const v11 = _hash2(ix + 1, iy + 1);\n return _lerp(_lerp(v00, v10, ux), _lerp(v01, v11, ux), uy); // -1..1\n}\n\n// 3-octave FBM (fractal Brownian motion) — adds richness to flat sine waves\nfunction _fbm(x: number, y: number): number {\n return (\n _vnoise(x, y ) * 0.500 +\n _vnoise(x * 2.1, y * 2.1) * 0.250 +\n _vnoise(x * 4.3, y * 4.3) * 0.125\n ) / 0.875; // normalise amplitude sum → roughly -1..1\n}\n\n/**\n * Render a procedural interactive wave-field of ASCII characters.\n *\n * Layers stacked per cell:\n * 1. Three cardinal sine waves (classic feel)\n * 2. Fractal Brownian Motion noise (organic structure)\n * 3. Diagonal drift ripple (depth / perspective)\n * 4. Slow global breathe pulse (heartbeat)\n * 5. Vortex swirl near cursor (energy field)\n * 6. Proximity spotlight (cursor highlight)\n * 7. Sparkle flickers on bright peaks (life)\n *\n * Call inside a requestAnimationFrame loop with accumulated time in seconds\n * and the current normalised mouse position {x, y} (0-1 range each).\n *\n * @example\n * ```ts\n * import { renderWaveBackground } from 'asciify-engine';\n *\n * const canvas = document.getElementById('bg') as HTMLCanvasElement;\n * const ctx = canvas.getContext('2d')!;\n * const mouse = { x: 0.5, y: 0.5 };\n * canvas.addEventListener('mousemove', e => {\n * const r = canvas.getBoundingClientRect();\n * mouse.x = (e.clientX - r.left) / r.width;\n * mouse.y = (e.clientY - r.top) / r.height;\n * });\n *\n * let t = 0;\n * const tick = () => {\n * renderWaveBackground(ctx, canvas.clientWidth, canvas.clientHeight, t, mouse);\n * t += 0.016;\n * requestAnimationFrame(tick);\n * };\n * requestAnimationFrame(tick);\n * ```\n */\nexport function renderWaveBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: WaveBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n charAspect = 0.62,\n lineHeightRatio = 1.4,\n chars = ' .:-=+*#%@',\n baseColor = null as string | null,\n accentColor = '#d4ff00',\n accentThreshold = 0.52,\n mouseInfluence = 0.55,\n mouseFalloff = 2.8,\n speed = 1,\n vortex = true,\n sparkles = true,\n breathe = true,\n lightMode = false,\n } = options;\n\n const charW = fontSize * charAspect;\n const lineH = fontSize * lineHeightRatio;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const mx = mousePos.x;\n const my = mousePos.y;\n\n // parse accent colour once per call\n let acR = 212, acG = 255, acB = 0;\n if (accentColor) {\n const hex = accentColor.replace('#', '');\n if (hex.length === 6) {\n acR = parseInt(hex.slice(0, 2), 16);\n acG = parseInt(hex.slice(2, 4), 16);\n acB = parseInt(hex.slice(4, 6), 16);\n }\n }\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n\n // ── Layer 4: global breathe — slow sinusoidal pulsation ──\n const breatheAmp = breathe ? (Math.sin(t * 0.22) * 0.5 + 0.5) * 0.12 : 0;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n const ny = row / rows;\n\n // ── Layer 1: three cardinal sine waves ──\n const w1 = Math.sin(col * 0.08 + row * 0.05 + t * 0.60) * 0.5 + 0.5;\n const w2 = Math.sin(col * 0.03 - row * 0.07 + t * 0.40) * 0.5 + 0.5;\n const w3 = Math.sin(col * 0.05 + row * 0.03 + t * 0.80) * 0.5 + 0.5;\n const sinePart = (w1 + w2 + w3) / 3;\n\n // ── Layer 2: FBM noise (slowly drifting) ──\n const noiseScale = 0.045;\n const noiseShift = t * 0.08;\n const noisePart = (_fbm(col * noiseScale + noiseShift, row * noiseScale * 1.4 - noiseShift * 0.7) * 0.5 + 0.5);\n\n // ── Layer 3: diagonal drift ripple ──\n const driftFreq = 0.06;\n const driftPart = Math.sin((col + row * 0.65) * driftFreq + t * 1.1) * 0.5 + 0.5;\n\n // Blend wave layers with weights\n const wavePart = sinePart * 0.45 + noisePart * 0.35 + driftPart * 0.20 + breatheAmp;\n\n // ── Layer 5: vortex swirl near cursor ──\n const dxRaw = nx - mx;\n const dyRaw = ny - my;\n const distRaw = Math.sqrt(dxRaw * dxRaw + dyRaw * dyRaw);\n let vortexBump = 0;\n if (vortex && distRaw < 0.35) {\n const angle = Math.atan2(dyRaw, dxRaw);\n const swirl = Math.sin(angle * 4 + t * 2.2 - distRaw * 14);\n const falloff = Math.max(0, 1 - distRaw / 0.35);\n vortexBump = swirl * falloff * falloff * 0.22;\n }\n\n // ── Layer 6: proximity spotlight ──\n const proximity = Math.max(0, 1 - distRaw * mouseFalloff);\n\n const intensity = (\n wavePart * (1 - mouseInfluence) +\n (proximity + vortexBump * 0.5) * mouseInfluence\n ) + vortexBump * 0.15;\n\n const clamped = Math.min(1, Math.max(0, intensity));\n\n // ── Layer 7: sparkle flicker on bright peaks ──\n let finalIntensity = clamped;\n if (sparkles && clamped > 0.72) {\n // rare random pop — deterministic per cell+time bucket so it doesn't jitter every frame\n const bucket = Math.floor(t * 8);\n const sparkleSeed = _hash2(col * 7 + bucket * 3, row * 11 + bucket);\n if (sparkleSeed > 0.88) {\n finalIntensity = Math.min(1, clamped + (sparkleSeed - 0.88) * 4);\n }\n }\n\n const charIdx = Math.floor(finalIntensity * (chars.length - 1));\n if (chars[charIdx] === ' ') continue;\n\n const alpha = 0.015 + finalIntensity * 0.07;\n const isAccent = finalIntensity > accentThreshold;\n\n if (isAccent) {\n const accentAlpha = Math.min(lightMode ? 0.40 : 0.28, alpha * (lightMode ? 4 : 2.8));\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${accentAlpha})`;\n } else if (baseColor) {\n ctx.fillStyle = baseColor.replace('{a}', String(alpha));\n } else if (lightMode) {\n ctx.fillStyle = `rgba(0,0,0,${alpha * 1.3})`;\n } else {\n ctx.fillStyle = `rgba(255,255,255,${alpha})`;\n }\n\n ctx.fillText(chars[charIdx], col * charW, row * lineH);\n }\n }\n}\n// ─── mountWaveBackground ─────────────────────────────────────────\n/**\n * Drop-in helper that mounts an interactive ASCII wave background onto any\n * element. Creates and injects a `<canvas>`, wires mouse tracking, DPR\n * resize, and the RAF loop — all internally.\n *\n * Returns a `destroy()` function to clean everything up.\n *\n * @example\n * ```ts\n * // 1 line — that's it:\n * import { mountWaveBackground } from 'asciify-engine';\n * const { destroy } = mountWaveBackground('#hero', { opacity: 0.2 });\n *\n * // React:\n * useEffect(() => mountWaveBackground(ref.current).destroy, []);\n * ```\n */\nexport interface MountWaveOptions extends WaveBackgroundOptions {\n /** CSS opacity applied to the canvas element (default: 0.2) */\n opacity?: number;\n /** Extra CSS class names added to the injected canvas */\n className?: string;\n /** z-index of the canvas (default: 0) */\n zIndex?: number;\n}\n\nexport function mountWaveBackground(\n target: string | HTMLElement,\n options: MountWaveOptions = {},\n): { destroy: () => void } {\n const { opacity = 0.2, className, zIndex = 0, ...renderOpts } = options;\n\n const container = typeof target === 'string'\n ? (document.querySelector(target) as HTMLElement | null)\n : target;\n\n if (!container) {\n console.warn('[asciify] mountWaveBackground: target not found', target);\n return { destroy: () => {} };\n }\n\n // Ensure container is a positioning parent\n const prevPosition = container.style.position;\n if (getComputedStyle(container).position === 'static') {\n container.style.position = 'relative';\n }\n\n const canvas = document.createElement('canvas');\n canvas.style.cssText = [\n 'position:absolute',\n 'inset:0',\n 'width:100%',\n 'height:100%',\n `opacity:${opacity}`,\n 'pointer-events:none',\n `z-index:${zIndex}`,\n ].join(';');\n if (className) canvas.className = className;\n container.prepend(canvas);\n\n const ctx = canvas.getContext('2d')!;\n const dpr = window.devicePixelRatio || 1;\n const mouse = { x: 0.5, y: 0.5 };\n const smoothMouse = { x: 0.5, y: 0.5 };\n\n const resize = () => {\n const r = container.getBoundingClientRect();\n canvas.width = r.width * dpr;\n canvas.height = r.height * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n };\n resize();\n\n const onMouseMove = (e: MouseEvent) => {\n const r = container.getBoundingClientRect();\n mouse.x = (e.clientX - r.left) / r.width;\n mouse.y = (e.clientY - r.top) / r.height;\n };\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n window.addEventListener('mousemove', onMouseMove);\n\n let time = 0;\n let raf = 0;\n const tick = () => {\n smoothMouse.x += (mouse.x - smoothMouse.x) * 0.07;\n smoothMouse.y += (mouse.y - smoothMouse.y) * 0.07;\n const r = container.getBoundingClientRect();\n renderWaveBackground(ctx, r.width, r.height, time, smoothMouse, renderOpts);\n time += 0.016;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n\n return {\n destroy: () => {\n cancelAnimationFrame(raf);\n ro.disconnect();\n window.removeEventListener('mousemove', onMouseMove);\n canvas.remove();\n container.style.position = prevPosition;\n },\n };\n}","// ─── Asciify WebGL Renderer ───────────────────────────────────────\n// GPU-accelerated drop-in replacement for renderFrameToCanvas.\n// All cells rendered in ONE instanced draw call per frame.\n// Animation + hover effects computed entirely in GLSL shaders.\n// No glyph atlas — uses solid rect/dots per cell (matches Canvas2D fillRect fast path).\n// Falls back gracefully to null if WebGL2 is unavailable.\n\nimport type { AsciiFrame, AsciiOptions } from './types';\n\n// ─── Types ────────────────────────────────────────────────────────\n\nexport interface WebGLRenderer {\n render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void;\n /** Call when options or the source frame has changed to invalidate cell data cache. */\n notifyDirty(): void;\n destroy(): void;\n}\n\n// ─── Vertex Shader ────────────────────────────────────────────────\n// One instance = one cell. Position, animation, hover, color all computed on GPU.\n// Cell data arrives as a single RGBA8 texture:\n// .rgb = cell color (normalized 0-1)\n// .a = char weight (0=space/invisible … 1=densest char, fully opaque)\n\nconst VERT_SRC = /* glsl */`#version 300 es\nprecision highp float;\nprecision highp int;\n\n// Unit quad corners: (-0.5,-0.5) to (0.5,0.5) - TRIANGLE_STRIP, 4 verts\nin vec2 a_corner;\n\n// Layout\nuniform vec2 u_canvasSize;\nuniform vec2 u_gridSize;\nuniform vec2 u_cellSize;\n\n// Animation\nuniform float u_time;\nuniform float u_animSpeed;\nuniform int u_animStyle;\n\n// Color\nuniform int u_colorMode;\nuniform vec3 u_accentColor;\nuniform int u_invert;\n\n// Hover\nuniform float u_hoverStrength;\nuniform float u_hoverIntensity;\nuniform vec2 u_hoverPos;\nuniform float u_hoverRadius;\nuniform int u_hoverEffect;\nuniform vec3 u_hoverColor;\n\n// Render mode: 0=rect 1=dots\nuniform int u_renderMode;\nuniform float u_dotSizeRatio;\n\n// Cell data: RGBA8 texture (cols x rows)\n// rgb = cell colour, a = source alpha\nuniform sampler2D u_cellTex;\n\nout vec4 v_color;\nout float v_alpha;\nout vec2 v_localUv;\n\n#define PI 3.141592653589793\n\nfloat ss(float t) { return t * t * (3.0 - 2.0 * t); }\n\nfloat getAnim(float nx, float ny, float cx, float cy, float t) {\n if (u_animStyle == 0) return 1.0;\n if (u_animStyle == 1) { // wave\n return 0.3 + 0.7 * (sin(nx * PI * 4.0 + t * 3.0) * 0.3 + 0.5\n + sin(ny * PI * 3.0 + t * 2.0) * 0.2);\n }\n if (u_animStyle == 2) { // pulse\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.2 + 0.8 * (sin(d * PI * 6.0 - t * 4.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 3) { // rain\n float drop = sin(ny * PI * 8.0 - t * 5.0 + cx * 0.3) * 0.5 + 0.5;\n return 0.1 + 0.9 * drop * (sin(nx * PI * 2.0 + t) * 0.3 + 0.7);\n }\n if (u_animStyle == 4) { // breathe\n return clamp(sin(t * 2.0) * 0.3 + 0.7 + sin((cx + cy) * 0.1 + t) * 0.1, 0.1, 1.0);\n }\n if (u_animStyle == 5) { // sparkle\n float sp = fract(sin(cx * 127.1 + cy * 311.7 + floor(t * 8.0) * 43758.5453) * 43758.5453);\n return sp > 0.7 ? 1.0 : 0.15 + sp * 0.4;\n }\n if (u_animStyle == 6) { // glitch\n float band = floor(cy / max(1.0, u_gridSize.y * 0.05));\n float gv = fract(sin(band * 43.23 + floor(t * 6.0) * 17.89) * 43758.5453);\n if (gv > 0.85) { float fl = sin(t * 30.0 + band) * 0.5 + 0.5; return fl < 0.3 ? 0.0 : fl; }\n return 1.0;\n }\n if (u_animStyle == 7) { // spiral\n float angle = atan(ny - 0.5, nx - 0.5);\n float dist = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.15 + 0.85 * (sin(angle * 3.0 + dist * PI * 8.0 - t * 3.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 8) { // typewriter\n float reveal = fract(t * 0.5) * u_gridSize.x * u_gridSize.y * 1.3;\n float dist = cy * u_gridSize.x + cx - reveal;\n if (dist > 0.0) return 0.0;\n return clamp(1.0 + dist / (u_gridSize.x * u_gridSize.y * 0.15), 0.0, 1.0);\n }\n if (u_animStyle == 9) { // scatter\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n float phase = sin(t * 1.5) * 0.5 + 0.5;\n if (d > phase) return max(0.0, 1.0 - (d - phase) * 3.0);\n return 0.7 + 0.3 * sin(d * 10.0 - t * 2.0);\n }\n return 1.0;\n}\n\nvec3 applyColorMode(vec3 rgb) {\n float lum = dot(rgb, vec3(0.299, 0.587, 0.114));\n if (u_colorMode == 0) return vec3(lum);\n if (u_colorMode == 2) return vec3(0.0, lum, 0.0);\n if (u_colorMode == 3) return lum * u_accentColor;\n return rgb;\n}\n\nvoid main() {\n int cols = int(u_gridSize.x);\n int rows = int(u_gridSize.y);\n int cx = gl_InstanceID % cols;\n int cy = gl_InstanceID / cols;\n\n float fnx = (float(cx) + 0.5) / float(cols);\n float fny = (float(cy) + 0.5) / float(rows);\n\n // Sample cell data\n vec4 cell = texture(u_cellTex, vec2(fnx, fny));\n // cell.rgb = colour, cell.a = source alpha (0=transparent, 1=opaque)\n\n // Invisible cells (fully transparent source pixel)\n if (cell.a < 0.004) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Char weight: 0=dark/space .. 1=dense/bright (luminance, matches luminanceToChar ordering)\n float charW = dot(cell.rgb, vec3(0.299, 0.587, 0.114));\n\n float cellW = u_cellSize.x;\n float cellH = u_cellSize.y;\n\n // Animation\n float t = u_time * u_animSpeed;\n float am = getAnim(fnx, fny, float(cx), float(cy), t);\n if (am < 0.04) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Hover\n float hoverScale = 1.0;\n vec2 hoverOff = vec2(0.0);\n float hoverGlow = 0.0;\n float hoverBlend = 0.0;\n\n if (u_hoverStrength > 0.0 && u_hoverIntensity > 0.005) {\n vec2 d = vec2(fnx - u_hoverPos.x, fny - u_hoverPos.y);\n float r = 0.08 + u_hoverRadius * 0.35 + u_hoverStrength * 0.04;\n float dist = length(d);\n if (dist < r) {\n float tv = 1.0 - dist / r;\n float e = ss(tv) * u_hoverIntensity;\n if (u_hoverEffect == 0) { // spotlight\n hoverScale = 1.0 + e * u_hoverStrength * 1.8;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 0.6 * vec2(cellW, cellH);\n hoverGlow = e * u_hoverStrength * 0.4;\n hoverBlend = e * e * u_hoverStrength * 0.25;\n } else if (u_hoverEffect == 1) { // magnify\n hoverScale = 1.0 + e * u_hoverStrength * 2.5;\n hoverGlow = e * u_hoverStrength * 0.15;\n } else if (u_hoverEffect == 2) { // repel\n hoverScale = 1.0 + e * u_hoverStrength * 0.3;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 1.2 * vec2(cellW, cellH);\n } else if (u_hoverEffect == 3) { // glow\n hoverGlow = e * u_hoverStrength * 0.8;\n hoverBlend = e * u_hoverStrength * 0.4;\n } else { // colorShift\n hoverScale = 1.0 + e * u_hoverStrength * 0.4;\n hoverGlow = e * u_hoverStrength * 0.2;\n hoverBlend = e * u_hoverStrength * 0.7;\n }\n }\n }\n\n // Final colour\n vec3 rgb = (u_invert == 1) ? (1.0 - cell.rgb) : cell.rgb;\n vec3 baseColor = applyColorMode(rgb);\n v_color = vec4(mix(baseColor, u_hoverColor, hoverBlend), 1.0);\n\n // Quad size & alpha\n vec2 quadSize;\n float finalAlpha;\n\n if (u_renderMode == 1) { // dots: radius driven by char weight (bright=big dot)\n float maxR = min(cellW, cellH) * 0.5 * u_dotSizeRatio;\n float radius = maxR * charW * am * hoverScale;\n if (radius < 0.3) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(radius * 2.0);\n finalAlpha = min(1.0, cell.a * am * (1.0 + hoverGlow));\n } else { // rect: size proportional to luminance — dark=tiny, bright=full (ASCII density look)\n if (charW < 0.01) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(cellW * charW * hoverScale, cellH * charW * hoverScale);\n finalAlpha = min(1.0, am * (1.0 + hoverGlow));\n }\n\n v_alpha = finalAlpha;\n v_localUv = a_corner;\n\n // NDC position (Y flipped: WebGL bottom-up, canvas top-down)\n float px = float(cx) * cellW + cellW * 0.5 + hoverOff.x;\n float py = float(cy) * cellH + cellH * 0.5 + hoverOff.y;\n vec2 pos = vec2(px, py) + a_corner * quadSize;\n vec2 ndc = pos / u_canvasSize * 2.0 - 1.0;\n ndc.y = -ndc.y;\n gl_Position = vec4(ndc, 0.0, 1.0);\n}\n`;\n\n// ─── Fragment Shader ──────────────────────────────────────────────\n\nconst FRAG_SRC = /* glsl */`#version 300 es\nprecision mediump float;\nprecision highp int;\n\nin vec4 v_color;\nin float v_alpha;\nin vec2 v_localUv;\n\nuniform int u_renderMode;\n\nout vec4 outColor;\n\nvoid main() {\n if (v_alpha < 0.01) discard;\n if (u_renderMode == 1) {\n // Dots: circle SDF clip\n if (length(v_localUv) > 0.5) discard;\n }\n outColor = vec4(v_color.rgb, v_alpha);\n}\n`;\n\n// ─── WebGL Helpers ────────────────────────────────────────────────\n\nfunction compileShader(gl: WebGL2RenderingContext, type: number, src: string): WebGLShader {\n const sh = gl.createShader(type)!;\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (!gl.getShaderParameter(sh, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(sh) ?? 'unknown';\n gl.deleteShader(sh);\n throw new Error(`Shader compile error: ${info}`);\n }\n return sh;\n}\n\nfunction linkProgram(gl: WebGL2RenderingContext, vert: WebGLShader, frag: WebGLShader): WebGLProgram {\n const prog = gl.createProgram()!;\n gl.attachShader(prog, vert);\n gl.attachShader(prog, frag);\n gl.linkProgram(prog);\n if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(prog) ?? 'unknown';\n gl.deleteProgram(prog);\n throw new Error(`Program link error: ${info}`);\n }\n return prog;\n}\n\nfunction makeTexture(gl: WebGL2RenderingContext, filter: number = gl.NEAREST): WebGLTexture {\n const t = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, t);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n return t;\n}\n\n// ─── Animation / color / hover index maps ────────────────────────\nconst ANIM_STYLES = ['none','wave','pulse','rain','breathe','sparkle','glitch','spiral','typewriter','scatter','waveField'] as const;\nconst HOVER_EFFECTS = ['spotlight','magnify','repel','glow','colorShift'] as const;\nconst COLOR_MODES = ['grayscale','fullcolor','matrix','accent'] as const;\n\n// ─── Main Factory ─────────────────────────────────────────────────\n\n/**\n * Try to create a WebGL2 renderer for the given canvas.\n * Returns null if WebGL2 is unavailable (caller can then use Canvas2D).\n * On setup failure after context is claimed, returns a stub that clears to dark.\n */\nexport function tryCreateWebGLRenderer(canvas: HTMLCanvasElement): WebGLRenderer | null {\n const glOrNull = canvas.getContext('webgl2', {\n alpha: true,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n }) as WebGL2RenderingContext | null;\n\n if (!glOrNull) return null;\n const gl: WebGL2RenderingContext = glOrNull; // non-null, stable in closures\n\n try {\n // ─── Compile shaders ─────────────────────────────────────────\n const vert = compileShader(gl, gl.VERTEX_SHADER, VERT_SRC);\n const frag = compileShader(gl, gl.FRAGMENT_SHADER, FRAG_SRC);\n const prog = linkProgram(gl, vert, frag);\n gl.deleteShader(vert);\n gl.deleteShader(frag);\n\n // ─── VAO: unit quad (TRIANGLE_STRIP, 4 vertices) ─────────────\n const vao = gl.createVertexArray()!;\n gl.bindVertexArray(vao);\n\n const corners = new Float32Array([-0.5,-0.5, 0.5,-0.5, -0.5,0.5, 0.5,0.5]);\n const vbo = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n gl.bufferData(gl.ARRAY_BUFFER, corners, gl.STATIC_DRAW);\n\n const aCorner = gl.getAttribLocation(prog, 'a_corner');\n gl.enableVertexAttribArray(aCorner);\n gl.vertexAttribPointer(aCorner, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindVertexArray(null);\n\n // ─── Single cell data texture (RGBA8: rgb=colour, a=charWeight 0-255) ─\n const cellTex = makeTexture(gl);\n\n // ─── Cached uniform locations ─────────────────────────────────\n const g = (n: string) => gl.getUniformLocation(prog, n)!;\n const u = {\n canvasSize: g('u_canvasSize'),\n gridSize: g('u_gridSize'),\n cellSize: g('u_cellSize'),\n time: g('u_time'),\n animSpeed: g('u_animSpeed'),\n animStyle: g('u_animStyle'),\n colorMode: g('u_colorMode'),\n accentColor: g('u_accentColor'),\n invert: g('u_invert'),\n hoverStrength: g('u_hoverStrength'),\n hoverIntensity:g('u_hoverIntensity'),\n hoverPos: g('u_hoverPos'),\n hoverRadius: g('u_hoverRadius'),\n hoverEffect: g('u_hoverEffect'),\n hoverColor: g('u_hoverColor'),\n renderMode: g('u_renderMode'),\n dotSizeRatio: g('u_dotSizeRatio'),\n cellTexU: g('u_cellTex'),\n };\n\n // ─── State ────────────────────────────────────────────────────\n let lastCols = 0;\n let lastRows = 0;\n let cellBuf = new Uint8Array(0); // rgba: rgb=colour, a=sourceAlpha\n let cellDataDirty = true;\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // ─── Render ───────────────────────────────────────────────────\n function render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void {\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n if (cols === 0) return;\n\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\n // Clear to dark or transparent based on source alpha\n let hasTransparency = false;\n const sy = Math.max(1, rows >> 2), sx = Math.max(1, cols >> 2);\n outer: for (let iy = 0; iy < rows; iy += sy)\n for (let ix = 0; ix < cols; ix += sx)\n if (frame[iy][ix].a < 200) { hasTransparency = true; break outer; }\n gl.clearColor(hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 1.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Re-allocate cell buffer when grid changes\n if (cols !== lastCols || rows !== lastRows) {\n cellBuf = new Uint8Array(cols * rows * 4);\n lastCols = cols;\n lastRows = rows;\n cellDataDirty = true;\n }\n\n // Upload cell data (rgb = colour, a = char weight 0-255)\n if (cellDataDirty) {\n for (let y = 0; y < rows; y++) {\n const row = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = row[x];\n const i = (y * cols + x) * 4;\n cellBuf[i] = cell.r;\n cellBuf[i + 1] = cell.g;\n cellBuf[i + 2] = cell.b;\n // alpha channel = source alpha (used for transparency masking in shader)\n cellBuf[i + 3] = cell.a;\n }\n }\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, cols, rows, 0,\n gl.RGBA, gl.UNSIGNED_BYTE, cellBuf);\n cellDataDirty = false;\n }\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n\n gl.useProgram(prog);\n gl.bindVertexArray(vao);\n\n const cellW = displayW / cols;\n const cellH = displayH / rows;\n\n gl.uniform2f(u.canvasSize, displayW, displayH);\n gl.uniform2f(u.gridSize, cols, rows);\n gl.uniform2f(u.cellSize, cellW, cellH);\n gl.uniform1f(u.time, time);\n gl.uniform1f(u.animSpeed, options.animationSpeed);\n gl.uniform1i(u.animStyle, ANIM_STYLES.indexOf(options.animationStyle));\n gl.uniform1i(u.colorMode, COLOR_MODES.indexOf(options.colorMode));\n\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n gl.uniform3f(u.accentColor,\n parseInt(acHex.slice(0, 2), 16) / 255,\n parseInt(acHex.slice(2, 4), 16) / 255,\n parseInt(acHex.slice(4, 6), 16) / 255);\n gl.uniform1i(u.invert, options.invert ? 1 : 0);\n\n const totalCells = rows * cols;\n const animActive = options.animationStyle !== 'none';\n const suppressHover = animActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!hoverPos && options.hoverStrength > 0;\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6 : 1;\n\n gl.uniform1f(u.hoverStrength, hoverActive ? options.hoverStrength : 0);\n gl.uniform1f(u.hoverIntensity, hoverActive ? (hoverPos?.intensity ?? 0) : 0);\n gl.uniform2f(u.hoverPos, hoverPos?.x ?? 0.5, hoverPos?.y ?? 0.5);\n gl.uniform1f(u.hoverRadius, options.hoverRadius * radiusScale);\n gl.uniform1i(u.hoverEffect, HOVER_EFFECTS.indexOf(options.hoverEffect));\n const hc = options.hoverColor || '#ffffff';\n gl.uniform3f(u.hoverColor,\n parseInt(hc.slice(1, 3), 16) / 255,\n parseInt(hc.slice(3, 5), 16) / 255,\n parseInt(hc.slice(5, 7), 16) / 255);\n\n gl.uniform1i(u.renderMode, options.renderMode === 'dots' ? 1 : 0);\n gl.uniform1f(u.dotSizeRatio, options.dotSizeRatio);\n gl.uniform1i(u.cellTexU, 0);\n\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, cols * rows);\n gl.bindVertexArray(null);\n }\n\n return {\n render,\n notifyDirty() { cellDataDirty = true; },\n destroy() {\n gl.deleteProgram(prog);\n gl.deleteVertexArray(vao);\n gl.deleteBuffer(vbo);\n gl.deleteTexture(cellTex);\n },\n };\n\n } catch (err) {\n console.error('[asciify] WebGL renderer setup FAILED (returning stub):', err);\n const stub: WebGLRenderer = {\n render() {\n try { gl.clearColor(0.039, 0.039, 0.039, 1); gl.clear(gl.COLOR_BUFFER_BIT); } catch { /* */ }\n },\n notifyDirty() {},\n destroy() {},\n };\n return stub;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/ascii-engine.ts","../src/webgl-engine.ts"],"names":["parseGIF","decompressFrames","render"],"mappings":";;;;;AAiDO,IAAM,QAAA,GAAW;AAAA,EACtB,QAAA,EAAU,YAAA;AAAA,EACV,MAAA,EAAQ,2BAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,0EAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,IAAA,EAAM,mDAAA;AAAA,EACN,OAAA,EAAS,sDAAA;AAAA,EACT,UAAA,EAAY,+JAAA;AAAA,EACZ,GAAA,EAAK,iCAAA;AAAA,EACL,KAAA,EAAO;AACT;AAOO,IAAM,iBAAA,GAA6D;AAAA,EACxE,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,QAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,MAAA;AAAA,IACZ,SAAA,EAAW,WAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,UAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,QAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,GAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA;AAEf;AAEO,IAAM,eAAA,GAAgC;AAAA,EAC3C,QAAA,EAAU,EAAA;AAAA,EACV,WAAA,EAAa,CAAA;AAAA,EACb,UAAA,EAAY,CAAA;AAAA,EACZ,QAAA,EAAU,CAAA;AAAA,EACV,SAAS,QAAA,CAAS,QAAA;AAAA,EAClB,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,SAAA;AAAA,EACb,MAAA,EAAQ,KAAA;AAAA,EACR,UAAA,EAAY,OAAA;AAAA,EACZ,cAAA,EAAgB,MAAA;AAAA,EAChB,cAAA,EAAgB,CAAA;AAAA,EAChB,YAAA,EAAc,GAAA;AAAA,EACd,cAAA,EAAgB,CAAA;AAAA,EAChB,aAAA,EAAe,CAAA;AAAA,EACf,WAAA,EAAa,GAAA;AAAA,EACb,WAAA,EAAa,WAAA;AAAA,EACb,UAAA,EAAY,SAAA;AAAA,EACZ,QAAA,EAAU,SAAA;AAAA,EACV,UAAA,EAAY;AACd;AAKO,IAAM,aAAA,GAAwF;AAAA,EACnG,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,EAAG,aAAa,WAAA,EAAa,WAAA,EAAa,GAAA,EAAK,UAAA,EAAY,SAAA;AAAU,GACjG;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,IAAA,EAAM,aAAa,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAChG;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,WAAA,EAAa,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACpG;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAClG;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,aAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAChG;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,YAAA,EAAc,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACrG;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,WAAA,EAAa,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACpG;AAAA,EACA,GAAA,EAAK;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU;AAEjG;AC7JA,SAAS,qBAAA,CAAsB,OAAe,MAAA,EAG5C;AACA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,EAAA,MAAM,MAAM,MAAA,CAAO,UAAA,CAAW,MAAM,EAAE,kBAAA,EAAoB,MAAM,CAAA;AAChE,EAAA,OAAO,EAAE,QAAQ,GAAA,EAAI;AACvB;AAKA,SAAS,eAAA,CAAgB,GAAA,EAAa,UAAA,EAAoB,QAAA,EAA0B;AAClF,EAAA,IAAI,QAAA,GAAW,MAAM,UAAA,GAAa,GAAA;AAClC,EAAA,MAAM,SAAU,GAAA,IAAO,QAAA,GAAW,MAAM,GAAA,CAAA,IAAS,GAAA,IAAO,MAAM,QAAA,GAAW,GAAA,CAAA,CAAA;AACzE,EAAA,QAAA,GAAW,MAAA,IAAU,WAAW,GAAA,CAAA,GAAO,GAAA;AACvC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAC,CAAA;AAC5C;AAKA,SAAS,eAAA,CAAgB,GAAA,EAAa,OAAA,EAAiB,MAAA,EAAyB;AAC9E,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AAClD,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAC1D,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,KAAK,CAAC,CAAC,CAAA;AACjE;AAOA,SAAS,iBACP,GAAA,EAAa,IAAA,EAAc,CAAA,EAAW,CAAA,EAAW,MAAc,MAAA,EACvD;AACR,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AAElD,EAAA,IAAI,UAAA,GAAa,MAAM,OAAO,GAAA;AAE9B,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,GAAO,CAAA;AACvB,EAAA,OAAO,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAM,CAAA;AAC/B;AAKA,IAAM,SAAA,GAAY;AAAA,EAChB,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,EAAE,CAAA;AAAA,EACZ,CAAC,EAAA,EAAI,CAAA,EAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EACZ,CAAE,CAAA,EAAE,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EACZ,CAAC,EAAA,EAAI,CAAA,EAAE,EAAA,EAAI,CAAC;AACd,CAAA;AAIA,IAAM,SAAA,GAAsB,IAAI,KAAA,CAAM,GAAG,CAAA;AACzC,IAAM,UAAA,GAAuB,IAAI,KAAA,CAAM,GAAG,CAAA;AAC1C,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAA,EAAK,EAAA,EAAA,EAAM;AAC/B,EAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AACrC,EAAA,UAAA,CAAW,EAAE,CAAA,GAAI,CAAA,MAAA,EAAS,EAAE,CAAA,GAAA,CAAA;AAC9B;AA4BA,SAAS,WAAA,CAAY,GAAA,EAAa,CAAA,EAAW,CAAA,EAAW,QAAA,EAA0B;AAChF,EAAA,IAAI,QAAA,IAAY,GAAG,OAAO,GAAA;AAC1B,EAAA,MAAM,SAAA,GAAA,CAAa,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,GAAI,EAAA,GAAK,GAAA,IAAO,QAAA,GAAW,GAAA;AACpE,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAK,GAAA,GAAM,SAAS,CAAC,CAAA;AACnD;AAMA,SAAS,eAAA,CACP,IAAA,EAAiB,SAAA,EAAmB,GAAA,EAAa,KAAa,GAAA,EACtD;AACR,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,IAAA,EAAO,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC1C,KAAK,QAAA;AACH,MAAA,OAAO,UAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAC,CAAA;AAAA,IAC1E,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAA,GAAA,CAAM,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,IAAK,GAAA;AAChE,MAAA,OAAO,CAAA,IAAA,EAAQ,GAAA,GAAM,EAAA,GAAM,CAAC,CAAA,CAAA,EAAK,GAAA,GAAM,EAAA,GAAM,CAAC,CAAA,CAAA,EAAK,GAAA,GAAM,EAAA,GAAM,CAAC,CAAA,CAAA,CAAA;AAAA,IAClE;AAAA,IACA;AACE,MAAA,OAAO,SAAA,CAAW,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAC,CAAA;AAAA;AAE7E;AAOA,IAAM,SAAA,GAAY,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC1B,SAAS,eAAA,CACP,IAAA,EAAiB,SAAA,EAAmB,GAAA,EAAa,KAAa,GAAA,EACpD;AACV,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,WAAA;AACH,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAClE,MAAA;AAAA,IACF,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAA,GAAM,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAA;AAChE,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,EAAA;AAAI,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AACpD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAA,GAAA,CAAM,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,IAAK,GAAA;AAChE,MAAA,SAAA,CAAU,CAAC,CAAA,GAAK,GAAA,GAAM,EAAA,GAAM,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,CAAA,GAAK,GAAA,GAAM,EAAA,GAAM,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,CAAA,GAAK,GAAA,GAAM,EAAA,GAAM,CAAA;AAC1F,MAAA;AAAA,IACF;AAAA,IACA,SAAS;AACP,MAAA,MAAM,IAAA,GAAQ,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAA;AAClE,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AAAM,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AAAM,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AACzD,MAAA;AAAA,IACF;AAAA;AAEF,EAAA,OAAO,SAAA;AACT;AAMA,SAAS,uBACP,CAAA,EACA,CAAA,EACA,MACA,IAAA,EACA,IAAA,EACA,OACA,KAAA,EACQ;AACR,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,CAAA;AAE7B,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AACjE,MAAA,OAAO,GAAA,GAAM,GAAA,IAAO,IAAA,GAAO,GAAA,GAAM,KAAA,GAAQ,GAAA,CAAA;AAAA,IAC3C;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAA,CAAM,CAAA,GAAI,OAAO,CAAA,GAAA,CAAK,CAAA,GAAI,OAAO,CAAC,CAAA;AACpD,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,EAAA,IAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AACpE,MAAA,OAAO,MAAM,GAAA,GAAM,IAAA;AAAA,IACrB;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACxE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,GAAO,KAAK,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAC1D,MAAA,OAAO,GAAA,GAAM,MAAM,IAAA,GAAO,IAAA;AAAA,IAC5B;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AACxC,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAA,CAAK,IAAI,CAAA,IAAK,GAAA,GAAM,CAAC,CAAA,GAAI,GAAA;AAC7C,MAAA,OAAO,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,GAAU,MAAM,CAAC,CAAA;AAAA,IACpD;AAAA,IACA,KAAK,SAAA,EAAW;AAEd,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,UAAU,CAAA,GAAI,UAAA;AAChF,MAAA,MAAM,OAAA,GAAW,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACvC,MAAA,OAAO,OAAA,GAAU,GAAA,GAAM,CAAA,GAAI,IAAA,GAAO,OAAA,GAAU,GAAA;AAAA,IAC9C;AAAA,IACA,KAAK,QAAA,EAAU;AAEb,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,IAAK,OAAO,IAAA,CAAK,CAAA;AACzC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,KAAK,CAAA,GAAI,UAAA;AACxE,MAAA,MAAM,SAAA,GAAY,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACpD,MAAA,IAAI,YAAY,IAAA,EAAM;AAEpB,QAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,GAAK,IAAI,IAAI,GAAA,GAAM,GAAA;AAChD,QAAA,OAAO,OAAA,GAAU,MAAM,CAAA,GAAI,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,CAAA,GAAI,EAAA;AACf,MAAA,MAAM,KAAK,CAAA,GAAI,EAAA;AACf,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC/B,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,GAAI,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AAClF,MAAA,OAAO,OAAO,IAAA,GAAO,MAAA;AAAA,IACvB;AAAA,IACA,KAAK,YAAA,EAAc;AAEjB,MAAA,MAAM,aAAa,IAAA,GAAO,IAAA;AAC1B,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,GAAO,CAAA;AAC7B,MAAA,MAAM,QAAA,GAAa,IAAI,GAAA,GAAO,CAAA;AAC9B,MAAA,MAAM,WAAA,GAAc,WAAW,UAAA,GAAa,GAAA;AAC5C,MAAA,MAAM,OAAO,SAAA,GAAY,WAAA;AACzB,MAAA,IAAI,IAAA,GAAO,GAAG,OAAO,CAAA;AACrB,MAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,IAAQ,aAAa,IAAA,CAAK,CAAA;AACvD,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AAAA,IACzB;AAAA,IACA,KAAK,SAAA,EAAW;AAEd,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAChF,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACxC,MAAA,MAAM,SAAA,GAAY,KAAA;AAClB,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAA,CAAK,KAAA,GAAQ,aAAa,CAAC,CAAA;AAAA,MAChD;AACA,MAAA,OAAO,MAAM,GAAA,GAAM,IAAA,CAAK,IAAI,KAAA,GAAQ,EAAA,GAAK,IAAI,CAAC,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,WAAA;AAEH,MAAA,OAAO,CAAA;AAAA,IACT;AACE,MAAA,OAAO,CAAA;AAAA;AAEb;AAMO,SAAS,iBAAA,CACd,MAAA,EACA,OAAA,EACA,WAAA,EACA,YAAA,EACmD;AACnD,EAAA,MAAM,QAAA,GAAW,MAAA,YAAkB,gBAAA,GAAmB,MAAA,CAAO,aAAa,MAAA,CAAO,KAAA;AACjF,EAAA,MAAM,SAAA,GAAY,MAAA,YAAkB,gBAAA,GAAmB,MAAA,CAAO,cAAc,MAAA,CAAO,MAAA;AAEnF,EAAA,IAAI,QAAA,KAAa,CAAA,IAAK,SAAA,KAAc,CAAA,EAAG;AACrC,IAAA,OAAO,EAAE,KAAA,EAAO,IAAI,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EACvC;AAEA,EAAA,MAAM,UAAA,GAAa,IAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,WAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,GAAW,UAAA,GAAa,OAAA,CAAQ,WAAA;AAEtD,EAAA,MAAM,UAAU,WAAA,IAAe,QAAA;AAC/B,EAAA,MAAM,UAAU,YAAA,IAAgB,SAAA;AAChC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAK,CAAA;AAEvC,EAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,IAAA,IAAQ,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,KAAA,EAAO,IAAI,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EACvC;AAEA,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,qBAAA,CAAsB,MAAM,IAAI,CAAA;AAChD,EAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,MAAM,IAAI,CAAA;AACtC,EAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,MAAM,IAAI,CAAA;AACnD,EAAA,MAAM,SAAS,SAAA,CAAU,IAAA;AAEzB,EAAA,MAAM,QAAoB,EAAC;AAE3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,MAAmB,EAAC;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,IAAA,GAAO,CAAA,IAAK,CAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAEtB,MAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAI,KAAA,GAAQ,CAAA;AAC5C,MAAA,MAAM,cAAc,eAAA,CAAgB,GAAA,EAAK,OAAA,CAAQ,UAAA,EAAY,QAAQ,QAAQ,CAAA;AAC7E,MAAA,MAAM,cAAc,WAAA,CAAY,WAAA,EAAa,CAAA,EAAG,CAAA,EAAG,QAAQ,cAAc,CAAA;AACzE,MAAA,MAAM,OAAO,OAAA,CAAQ,UAAA,GACjB,iBAAiB,WAAA,EAAa,OAAA,CAAQ,YAAY,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA,GAC5E,eAAA,CAAgB,aAAa,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAEhE,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IAC/B;AACA,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EAChB;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AAC7B;AAKA,eAAsB,kBAAA,CACpB,OACA,OAAA,EACA,WAAA,EACA,cACA,SAAA,GAAoB,EAAA,EACpB,WAAA,GAAsB,EAAA,EACtB,UAAA,EAC4E;AAC5E,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,UAAU,WAAW,CAAA;AACrD,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,SAAS,CAAA;AAClD,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,OAAQ,CAAA,GAAI,SAAA;AAClB,IAAA,IAAI,OAAO,QAAA,EAAU;AAErB,IAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,KAAA,CAAM,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAC3C,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AACA,MAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAAA,IAC1C,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,EAAO,OAAA,EAAS,aAAa,YAAY,CAAA;AAC1E,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACxB,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAEd,IAAA,UAAA,GAAA,CAAc,CAAA,GAAI,KAAK,WAAW,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,KAAK,SAAA,EAAU;AAC9C;AAOA,eAAsB,gBAAA,CACpB,MAAA,EACA,OAAA,EACA,WAAA,EACA,cACA,UAAA,EAC4E;AAC5E,EAAA,MAAM,GAAA,GAAMA,kBAAS,MAAM,CAAA;AAC3B,EAAA,MAAM,SAAA,GAAYC,yBAAA,CAAiB,GAAA,EAAK,IAAI,CAAA;AAE5C,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,QAAQ,EAAC,EAAG,MAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,EAAA,EAAG;AAAA,EACjD;AAEA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,KAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA;AAG/B,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,EAAK,KAAA,IAAS,IAAA;AACnC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,EAAK,MAAA,IAAU,IAAA;AAGpC,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,EAAA,UAAA,CAAW,KAAA,GAAQ,QAAA;AACnB,EAAA,UAAA,CAAW,MAAA,GAAS,QAAA;AACpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAG1C,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,EAAA,UAAA,CAAW,KAAA,GAAQ,QAAA;AACnB,EAAA,UAAA,CAAW,MAAA,GAAS,QAAA;AACpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAE1C,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AAGX,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,IAAA,UAAA,IAAe,EAAE,KAAA,IAAS,GAAA;AAAA,EAC5B;AACA,EAAA,MAAM,QAAA,GAAW,aAAa,SAAA,CAAU,MAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAO,QAAQ,CAAC,CAAC,CAAA;AAGjE,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,QAAQ,GAAG,CAAA;AAEhD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,CAAA,GAAI,UAAU,CAAC,CAAA;AACrB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,YAAA,EAAa,GAAI,CAAA;AAGtC,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAC1C,MAAA,OAAA,CAAQ,SAAA,CAAU,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,iBAAiB,IAAI,SAAA,CAAU,OAAO,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AACnE,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,IAAA,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAA;AACxB,IAAA,UAAA,CAAW,SAAS,IAAA,CAAK,MAAA;AACzB,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAC1C,IAAA,OAAA,CAAQ,YAAA,CAAa,cAAA,EAAgB,CAAA,EAAG,CAAC,CAAA;AAGzC,IAAA,OAAA,CAAQ,UAAU,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAG3D,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,UAAA,EAAY,OAAA,EAAS,aAAa,YAAY,CAAA;AAC/E,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACxB,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAGd,IAAA,IAAI,iBAAiB,CAAA,EAAG;AAEtB,MAAA,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,IAAA,IAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1E,CAAA,MAAA,IAAW,iBAAiB,CAAA,EAAG;AAE7B,MAAA,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAC1C,MAAA,OAAA,CAAQ,SAAA,CAAU,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAAA,IACpC;AAGA,IAAA,UAAA,GAAA,CAAc,CAAA,GAAI,KAAK,SAAS,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,GAAA,EAAI;AACnC;AAKA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAC1B;AAOA,IAAM,YAAA,GAAe,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,WAAW,CAAA,EAAE;AAE9F,SAAS,kBAAA,CACP,EAAA,EACA,EAAA,EACA,MAAA,EACA,MAAA,EACA,cAAA,EACA,QAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,GAAwC,WAAA,EACxC,YAAA,GAAuB,GAAA,EACF;AACrB,EAAA,MAAM,KAAK,EAAA,GAAK,MAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,MAAA;AAChB,EAAA,MAAM,MAAA,GAAS,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAG9B,EAAA,MAAM,MAAA,GAAU,IAAA,GAAO,YAAA,GAAe,IAAA,GAAQ,QAAA,GAAW,IAAA;AAEzD,EAAA,IAAI,MAAA,IAAU,SAAS,MAAA,EAAQ;AAC7B,IAAA,YAAA,CAAa,KAAA,GAAQ,CAAA;AACrB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,YAAA,CAAa,IAAA,GAAO,CAAA;AACpB,IAAA,YAAA,CAAa,UAAA,GAAa,CAAA;AAC1B,IAAA,YAAA,CAAa,SAAA,GAAY,CAAA;AACzB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,GAAO,MAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA,GAAI,cAAA;AAE9B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,WAAA,EAAa;AAChB,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC/B,MAAA,MAAM,SAAA,GAAY,KAAA,GAAQ,KAAA,GAAQ,QAAA,GAAW,GAAA;AAC7C,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,SAAA,GAAY,KAAA;AACxC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,SAAA,GAAY,KAAA;AACxC,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,KAAA,GAAQ,QAAQ,QAAA,GAAW,IAAA;AACxC,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA;AACH,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,IAAA;AAC1B,MAAA;AAAA,IACF,KAAK,OAAA,EAAS;AACZ,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAChC,MAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,KAAA,GAAQ,QAAA,GAAW,GAAA;AACxC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,GAAO,KAAA;AACpC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,GAAO,KAAA;AACpC,MAAA;AAAA,IACF;AAAA,IACA,KAAK,MAAA;AACH,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA;AAAA;AAGJ,EAAA,YAAA,CAAa,KAAA,GAAQ,KAAA;AACrB,EAAA,YAAA,CAAa,OAAA,GAAU,OAAA;AACvB,EAAA,YAAA,CAAa,OAAA,GAAU,OAAA;AACvB,EAAA,YAAA,CAAa,IAAA,GAAO,IAAA;AACpB,EAAA,YAAA,CAAa,UAAA,GAAa,UAAA;AAC1B,EAAA,YAAA,CAAa,SAAA,GAAY,KAAA;AACzB,EAAA,OAAO,YAAA;AACT;AAgBO,SAAS,mBAAA,CACd,KACA,KAAA,EACA,OAAA,EACA,aACA,YAAA,EACA,IAAA,GAAe,GACf,QAAA,EACA;AAEA,EAAA,IAAI,OAAA,CAAQ,mBAAmB,WAAA,EAAa;AAC1C,IAAA,MAAM,SAAA,GAAY,QAAA,GAAW,EAAE,CAAA,EAAG,SAAS,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,CAAA,EAAE,GAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AACjF,IAAA,MAAM,WAAW,OAAA,CAAQ,WAAA,IAAe,SAAA,EAAW,OAAA,CAAQ,KAAK,EAAE,CAAA;AAClE,IAAkB,SAAS,OAAA,CAAQ,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK;AAC3D,IAAkB,SAAS,OAAA,CAAQ,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK;AAC3D,IAAkB,SAAS,OAAA,CAAQ,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK;AAC3D,IAAA,oBAAA,CAAqB,GAAA,EAAK,WAAA,EAAa,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW;AAAA,MACpE,WAAA,EAAa,IAAI,OAAO,CAAA,CAAA;AAAA,MACxB,eAAA,EAAiB,IAAA;AAAA,MACjB,cAAA,EAAgB,OAAA,CAAQ,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,OAAA,CAAQ,aAAA,GAAgB,GAAG,CAAA,GAAI,IAAA;AAAA,MAC7F,YAAA,EAAc,GAAA;AAAA,MACd,OAAO,OAAA,CAAQ,cAAA;AAAA,MACf,MAAA,EAAQ,QAAQ,aAAA,GAAgB,CAAA;AAAA,MAChC,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,EAAA,IAAI,SAAS,CAAA,EAAG;AAChB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAEtB,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,WAAA,EAAa,YAAY,CAAA;AAG7C,EAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AACzC,EAAA,KAAA;AACA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,IAAA,EAAM,WAAW,WAAA,EAAa;AAC5D,MAAA,MAAM,GAAA,GAAM,MAAM,OAAO,CAAA;AACzB,MAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,IAAA,EAAM,WAAW,WAAA,EAAa;AAC5D,QAAA,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK;AAAE,UAAA,eAAA,GAAkB,IAAA;AAAM,UAAA,MAAM,KAAA;AAAA,QAAO;AAAA,MACnE;AAAA,IACF;AAEA,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,WAAA,EAAa,YAAY,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,QAAQ,WAAA,GAAc,IAAA;AAC5B,EAAA,MAAM,QAAQ,YAAA,GAAe,IAAA;AAC7B,EAAA,MAAM,aAAa,IAAA,GAAO,IAAA;AAE1B,EAAA,MAAM,cAAA,GAAiB,UAAU,SAAA,IAAa,CAAA;AAI9C,EAAA,MAAM,eAAA,GAAkB,QAAQ,cAAA,KAAmB,MAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,mBAAmB,UAAA,GAAa,GAAA;AACtD,EAAA,MAAM,WAAA,GAAc,CAAC,aAAA,IAAiB,CAAC,EAAE,QAAA,IAAY,OAAA,CAAQ,aAAA,GAAgB,CAAA,IAAK,cAAA,GAAiB,IAAA,CAAA;AAGnG,EAAA,MAAM,EAAA,GAAK,QAAQ,UAAA,IAAc,SAAA;AACjC,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAG5C,EAAA,MAAM,SAAS,OAAA,CAAQ,WAAA,IAAe,SAAA,EAAW,OAAA,CAAQ,KAAK,EAAE,CAAA;AAChE,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AACnD,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AACnD,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAKnD,EAAA,MAAM,WAAA,GAAc,aAAa,GAAA,GAAS,IAAA,GACtB,aAAa,IAAA,GAAS,GAAA,GACtB,UAAA,GAAa,GAAA,GAAS,GAAA,GACtB,CAAA;AACpB,EAAA,MAAM,oBAAA,GAAuB,QAAQ,WAAA,GAAc,WAAA;AAGnD,EAAA,IAAI,cAAc,CAAA,EAAG,WAAA,GAAc,IAAA,EAAM,WAAA,GAAc,GAAG,WAAA,GAAc,IAAA;AACxE,EAAA,IAAI,SAAA,GAAY,GAAG,SAAA,GAAY,CAAA;AAC/B,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,SAAA,GAAY,QAAA,CAAS,CAAA;AACrB,IAAA,SAAA,GAAY,QAAA,CAAS,CAAA;AACrB,IAAA,MAAM,eAAA,GAAmB,IAAA,GAAO,oBAAA,GAAuB,IAAA,GAAQ,QAAQ,aAAA,GAAgB,IAAA;AACvF,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAC9E,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,MAAM,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAChF,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAC9E,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,MAAM,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAAA,EAClF;AAGA,EAAA,MAAM,YAAY,OAAA,CAAQ,cAAA;AAC1B,EAAA,MAAM,YAAY,OAAA,CAAQ,cAAA;AAC1B,EAAA,MAAM,cAAc,SAAA,KAAc,MAAA;AAClC,EAAA,MAAM,gBAAgB,OAAA,CAAQ,aAAA;AAC9B,EAAA,MAAM,cAAc,OAAA,CAAQ,WAAA;AAC5B,EAAA,MAAM,iBAAA,GAAoB,oBAAA;AAC1B,EAAA,MAAM,aAAa,OAAA,CAAQ,MAAA;AAC3B,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AACzB,EAAA,MAAM,UAAU,CAAA,GAAI,IAAA;AACpB,EAAA,MAAM,UAAU,CAAA,GAAI,IAAA;AAGpB,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAQ;AAEjC,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,OAAO,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,YAAA;AAEzD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,CAAK,IAAI,EAAA,EAAI;AAEjB,QAAA,MAAM,GAAA,GAAA,CAAO,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,IAAK,aAAA;AACjE,QAAA,MAAM,SAAA,GAAY,UAAA,GAAa,CAAA,GAAI,GAAA,GAAM,GAAA;AACzC,QAAA,IAAI,YAAY,IAAA,EAAM;AAEtB,QAAA,MAAM,OAAA,GAAU,WAAA,GAAc,CAAA,GAC1B,sBAAA,CAAuB,CAAA,EAAG,GAAG,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AAGvE,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,QAAA,IAAI,WAAA,IAAe,KAAK,WAAA,IAAe,CAAA,IAAK,eAAe,CAAA,IAAK,WAAA,IAAe,KAAK,WAAA,EAAa;AAC/F,UAAA,MAAM,EAAA,GAAK,kBAAA;AAAA,YACT,CAAA,GAAI,OAAA;AAAA,YAAS,CAAA,GAAI,OAAA;AAAA,YAAS,SAAA;AAAA,YAAW,SAAA;AAAA,YAAW,cAAA;AAAA,YAChD,aAAA;AAAA,YAAe,KAAA;AAAA,YAAO,KAAA;AAAA,YAAO,WAAA;AAAA,YAAa;AAAA,WAC5C;AACA,UAAA,QAAA,GAAW,EAAA,CAAG,KAAA;AACd,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,IAAA;AACf,UAAA,UAAA,GAAa,EAAA,CAAG,UAAA;AAAA,QAClB;AAEA,QAAA,MAAM,MAAA,GAAS,SAAA,GAAY,SAAA,GAAY,OAAA,GAAU,QAAA;AACjD,QAAA,IAAI,SAAS,GAAA,EAAK;AAElB,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AACrC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AAGrC,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,MAAM,MAAM,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,KAAK,GAAG,CAAA;AAC1D,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,KAAA,GAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,QACxD;AAEA,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAI,KAAK,CAAA,GAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA;AAE9E,QAAA,IAAI,UAAU,SAAA,EAAW;AAAE,UAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAAO,UAAA,SAAA,GAAY,KAAA;AAAA,QAAO;AACvE,QAAA,IAAI,UAAU,aAAA,EAAe;AAAE,UAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,UAAA,aAAA,GAAgB,KAAA;AAAA,QAAO;AAE7E,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAM,IAAI,MAAA,GAAS,CAAA;AACnB,UAAA,GAAA,CAAI,SAAS,EAAA,GAAK,MAAA,EAAQ,EAAA,GAAK,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,QAC7C,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,GAAG,MAAM,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,UAAA,GAAa,IAAA;AACnB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,UAAA,EAAY,KAAK,CAAA,GAAI,GAAA;AAIvD,IAAA,MAAM,cAAc,QAAA,GAAW,CAAA;AAE/B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,MAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AAAA,IACrB;AAIA,IAAA,IAAI,WAAA,GAA6C,IAAA;AACjD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,GAAc,EAAC;AACf,MAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AACnB,MAAA,MAAM,QAAQ,EAAA,CAAG,MAAA;AACjB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,WAAA,CAAY,EAAA,CAAG,CAAC,CAAC,CAAA,GAAI,KAAK,GAAA,CAAI,GAAA,EAAA,CAAM,CAAA,GAAI,GAAA,IAAO,KAAK,CAAA;AAAA,MACtD;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,WAAA,GAAc,GAAA,CAAI,cAAa,GAAI,IAAA;AAE1D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,GAAA,IAAO,IAAA,CAAK,IAAI,EAAA,EAAI;AAEtC,QAAA,MAAM,OAAA,GAAU,WAAA,GAAc,CAAA,GAC1B,sBAAA,CAAuB,CAAA,EAAG,GAAG,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AACvE,QAAA,IAAI,UAAU,IAAA,EAAM;AAGpB,QAAA,IAAI,UAAA,GAAa,CAAA;AACjB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,QAAA,IAAI,WAAA,IAAe,KAAK,WAAA,IAAe,CAAA,IAAK,eAAe,CAAA,IAAK,WAAA,IAAe,KAAK,WAAA,EAAa;AAC/F,UAAA,MAAM,EAAA,GAAK,kBAAA;AAAA,YACT,CAAA,GAAI,OAAA;AAAA,YAAS,CAAA,GAAI,OAAA;AAAA,YAAS,SAAA;AAAA,YAAW,SAAA;AAAA,YAAW,cAAA;AAAA,YAChD,aAAA;AAAA,YAAe,KAAA;AAAA,YAAO,KAAA;AAAA,YAAO,WAAA;AAAA,YAAa;AAAA,WAC5C;AACA,UAAA,UAAA,GAAa,EAAA,CAAG,KAAA;AAChB,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,IAAA;AACf,UAAA,UAAA,GAAa,EAAA,CAAG,UAAA;AAAA,QAClB;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AACrC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AAErC,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,MAAM,MAAM,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,KAAK,GAAG,CAAA;AAC1D,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,KAAA,GAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,QACxD;AAEA,QAAA,IAAI,WAAA,EAAa;AAEf,UAAA,MAAM,MAAA,GAAS,WAAA,CAAa,IAAA,CAAK,IAAI,CAAA,IAAK,GAAA;AAC1C,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAI,IAAA,CAAK,IAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA,GAAI,MAAA;AACrF,UAAA,IAAI,WAAW,IAAA,EAAM;AACrB,UAAA,IAAI,aAAa,SAAA,EAAW;AAAE,YAAA,GAAA,CAAI,WAAA,GAAc,QAAA;AAAU,YAAA,SAAA,GAAY,QAAA;AAAA,UAAU;AAChF,UAAA,IAAI,UAAU,aAAA,EAAe;AAAE,YAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,YAAA,aAAA,GAAgB,KAAA;AAAA,UAAO;AAC7E,UAAA,MAAM,KAAK,KAAA,GAAQ,UAAA;AACnB,UAAA,MAAM,KAAK,KAAA,GAAQ,UAAA;AACnB,UAAA,GAAA,CAAI,QAAA,CAAS,KAAK,EAAA,GAAK,GAAA,EAAK,KAAK,EAAA,GAAK,GAAA,EAAK,IAAI,EAAE,CAAA;AAAA,QACnD,CAAA,MAAO;AAEL,UAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAI,KAAK,CAAA,GAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA;AAC9E,UAAA,IAAI,UAAU,SAAA,EAAW;AAAE,YAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAAO,YAAA,SAAA,GAAY,KAAA;AAAA,UAAO;AACvE,UAAA,IAAI,UAAU,aAAA,EAAe;AAAE,YAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,YAAA,aAAA,GAAgB,KAAA;AAAA,UAAO;AAC7E,UAAA,IAAI,eAAe,CAAA,EAAG;AACpB,YAAA,GAAA,CAAI,SAAA,CAAU,IAAI,EAAE,CAAA;AACpB,YAAA,GAAA,CAAI,KAAA,CAAM,YAAY,UAAU,CAAA;AAChC,YAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC5B,YAAA,GAAA,CAAI,aAAa,aAAc,CAAA;AAAA,UACjC,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,EAAA,EAAI,EAAE,CAAA;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;AAaA,SAAS,cAAA,CAAe,OAAmB,SAAA,EAA4B;AACrE,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,EAAA,MAAM,OAAO,IAAA,GAAO,CAAA,GAAI,KAAA,CAAM,CAAC,EAAE,MAAA,GAAS,CAAA;AAG1C,EAAA,MAAM,MAAA,GAAS,YAAY,CAAA,GAAI,CAAA;AAE/B,EAAA,MAAM,MAAM,IAAI,UAAA,CAAW,CAAA,GAAI,IAAA,GAAO,OAAO,MAAM,CAAA;AACnD,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA;AACT,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA;AACvB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AAChB,QAAA,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AAChB,QAAA,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAA,EAAK,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,CAAA;AACzE,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAyDA,eAAsB,OAAA,CACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,GAAW,EAAA,EAAI,KAAA,GAAQ,SAAA,EAAW,OAAA,GAAU,EAAC,EAAE,GAA0B,EAAC,EAC7D;AAEf,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,GAAA,CAAI,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC3B,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,sBAAA,EAAyB,MAAM,EAAE,CAAC,CAAA;AACvE,MAAA,GAAA,CAAI,GAAA,GAAM,MAAA;AAAA,IACZ,CAAC,CAAA;AACD,IAAA,EAAA,GAAK,GAAA;AAAA,EACP,CAAA,MAAA,IAAW,MAAA,YAAkB,gBAAA,IAAoB,CAAC,OAAO,QAAA,EAAU;AACjE,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,MAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,IACjE,CAAC,CAAA;AACD,IAAA,EAAA,GAAK,MAAA;AAAA,EACP,CAAA,MAAO;AACL,IAAA,EAAA,GAAK,MAAA;AAAA,EACP;AAEA,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,MAAA,EAAQ,GAAG,SAAS,QAAA,EAAS;AAEnF,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAEhE,EAAA,MAAM,EAAE,OAAM,GAAI,iBAAA,CAAkB,IAAI,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAC3E,EAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACrE;AAaA,eAAsB,UAAA,CACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,GAAW,EAAA,EAAI,KAAA,GAAQ,SAAA,EAAW,OAAA,GAAU,EAAC,EAAE,GAA0B,EAAC,EACvD;AACrB,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,KAAW,QAAA,GAC7B,MAAM,KAAA,CAAM,MAAM,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA,GAC7C,MAAA;AAEJ,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,kBAAkB,KAAK,CAAA,EAAG,GAAG,OAAA,EAAS,QAAA,EAAS;AACrG,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAEhE,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAM,gBAAA,CAAiB,MAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAE1F,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,IAAA,GAAO,YAAY,GAAA,EAAI;AAC3B,EAAA,MAAM,WAAW,GAAA,GAAO,GAAA;AAExB,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,GAAA,GAAM,QAAQ,QAAA,EAAU;AAC1B,MAAA,mBAAA,CAAoB,GAAA,EAAK,OAAO,CAAC,CAAA,EAAG,QAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACvE,MAAA,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA;AACrB,MAAA,IAAA,GAAO,GAAA;AAAA,IACT;AACA,IAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAEnC,EAAA,OAAO,MAAM;AAAE,IAAA,SAAA,GAAY,IAAA;AAAM,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,EAAG,CAAA;AACjE;AAcA,eAAsB,YAAA,CACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,GAAW,EAAA,EAAI,KAAA,GAAQ,SAAA,EAAW,OAAA,GAAU,EAAC,EAAE,GAA0B,EAAC,EACvD;AACrB,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,GAAQ,QAAA,CAAS,cAAc,OAAO,CAAA;AACtC,IAAA,KAAA,CAAM,WAAA,GAAc,WAAA;AACpB,IAAA,KAAA,CAAM,GAAA,GAAM,MAAA;AACZ,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,KAAA,CAAM,YAAA,GAAe,MAAM,OAAA,EAAQ;AACnC,MAAA,KAAA,CAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,sBAAA,EAAyB,MAAM,EAAE,CAAC,CAAA;AAAA,IAC3E,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,MAAA;AAAA,EACV;AAEA,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,kBAAkB,KAAK,CAAA,EAAG,GAAG,OAAA,EAAS,QAAA,EAAS;AACrG,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAEhE,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAM,kBAAA,CAAmB,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAE3F,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,IAAA,GAAO,YAAY,GAAA,EAAI;AAC3B,EAAA,MAAM,WAAW,GAAA,GAAO,GAAA;AAExB,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,GAAA,GAAM,QAAQ,QAAA,EAAU;AAC1B,MAAA,mBAAA,CAAoB,GAAA,EAAK,OAAO,CAAC,CAAA,EAAG,QAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACvE,MAAA,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA;AACrB,MAAA,IAAA,GAAO,GAAA;AAAA,IACT;AACA,IAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAEnC,EAAA,OAAO,MAAM;AAAE,IAAA,SAAA,GAAY,IAAA;AAAM,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,EAAG,CAAA;AACjE;AAEA,IAAM,iBAAA,GAAoB,QAAA;AAG1B,SAAS,eACP,OAAA,EACA,IAAA,EACA,MACA,KAAA,EACA,MAAA,EACA,KACA,QAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAA6B;AAAA,IACjC,CAAA,EAAG,IAAA;AAAA,IAAM,CAAA,EAAG,IAAA;AAAA,IAAM,CAAA,EAAG,KAAA;AAAA,IAAO,CAAA,EAAG,MAAA;AAAA,IAC/B,IAAI,OAAA,CAAQ,OAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,SAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,cAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,cAAA;AAAA,IACZ,KAAK,OAAA,CAAQ,MAAA;AAAA,IACb,IAAI,OAAA,CAAQ,aAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,WAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,WAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,UAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,YAAA;AAAA,IACZ,IAAA,EAAM,QAAQ,UAAA,KAAe;AAAA,GAC/B;AACA,EAAA,IAAI,OAAA,CAAQ,SAAA,KAAc,QAAA,EAAU,CAAA,CAAE,KAAK,OAAA,CAAQ,WAAA;AACnD,EAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,CAAA,CAAE,GAAA,GAAM,GAAA;AAC/B,EAAA,IAAI,QAAA,IAAY,IAAA,GAAO,IAAA;AACvB,EAAA,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AACzB;AAEA,IAAM,UAAA,GAAa,4DAA4D,iBAAiB,CAAA,+BAAA,CAAA;AAiBzF,SAAS,iBAAA,CACd,KAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,EAAA,IAAI,IAAA,KAAS,GAAG,OAAO,EAAA;AACvB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AACtB,EAAA,MAAM,WAAA,GAAc,QAAQ,SAAA,KAAc,WAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,EAAO,WAAW,CAAA;AAC9C,EAAA,MAAM,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACvD,EAAA,MAAM,OAAO,cAAA,CAAe,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAO,MAAM,CAAA;AAE9D,EAAA,OAAO,CAAA;AAAA,YAAA,EACK,EAAE,CAAA,qBAAA,EAAwB,IAAI,CAAA,SAAA,EAAY,KAAK,aAAa,MAAM,CAAA;AAAA,oCAAA,EAC1C,EAAE,QAAQ,IAAI,CAAA;AAAA,EAClD,UAAU;AAAA,uBAAA,CAAA;AAEZ;AAMO,SAAS,yBAAA,CACd,MAAA,EACA,OAAA,EACA,GAAA,EACA,OACA,MAAA,EACQ;AACR,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA;AACvB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AAC1B,EAAA,MAAM,WAAA,GAAc,QAAQ,SAAA,KAAc,WAAA;AAC1C,EAAA,MAAM,UAAU,MAAA,CAAO,GAAA,CAAI,OAAK,cAAA,CAAe,CAAA,EAAG,WAAW,CAAC,CAAA;AAC9D,EAAA,MAAM,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,eAAe,OAAA,EAAS,IAAA,EAAM,MAAM,KAAA,EAAO,MAAA,EAAQ,KAAK,IAAI,CAAA;AAEzE,EAAA,OAAO,CAAA;AAAA,YAAA,EACK,EAAE,CAAA,qBAAA,EAAwB,IAAI,CAAA,SAAA,EAAY,KAAK,aAAa,MAAM,CAAA;AAAA,oCAAA,EAC1C,EAAE,CAAA,IAAA,EAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EACpE,UAAU;AAAA,gCAAA,CAAA;AAEZ;AAoCA,SAAS,MAAM,CAAA,EAAmB;AAAE,EAAA,OAAO,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,IAAI,EAAA,CAAA,GAAM,EAAA,CAAA;AAAK;AAChF,SAAS,KAAA,CAAM,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAAE,EAAA,OAAO,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AAAG;AAGlF,SAAS,MAAA,CAAO,IAAY,EAAA,EAAoB;AAC9C,EAAA,IAAI,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,GAAA;AACxB,EAAA,CAAA,GAAM,KAAK,EAAA,GAAM,CAAA;AACjB,EAAA,OAAA,CAAU,KAAK,CAAA,GAAI,CAAA,GAAI,QAAQ,MAAA,CAAA,GAAU,UAAA,GAAc,cAAc,UAAA,GAAc,CAAA;AACrF;AAGA,SAAS,OAAA,CAAQ,GAAW,CAAA,EAAmB;AAC7C,EAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,CAAC,GAAG,EAAA,GAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC3C,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,EAAA;AAC5B,EAAA,MAAM,KAAK,KAAA,CAAM,EAAE,CAAA,EAAG,EAAA,GAAK,MAAM,EAAE,CAAA;AACnC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAA,EAAQ,EAAM,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,CAAA,EAAG,EAAM,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAA,EAAQ,EAAA,GAAK,CAAC,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AACjC,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,GAAA,EAAK,EAAE,CAAA,EAAG,KAAA,CAAM,GAAA,EAAK,GAAA,EAAK,EAAE,CAAA,EAAG,EAAE,CAAA;AAC3D;AAGA,SAAS,IAAA,CAAK,GAAW,CAAA,EAAmB;AAC1C,EAAA,OAAA,CACE,QAAQ,CAAA,EAAS,CAAO,IAAI,GAAA,GAC5B,OAAA,CAAQ,IAAI,GAAA,EAAK,CAAA,GAAI,GAAG,CAAA,GAAI,OAC5B,OAAA,CAAQ,CAAA,GAAI,KAAK,CAAA,GAAI,GAAG,IAAI,KAAA,IAC1B,KAAA;AACN;AAuCO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAkB,EAAA;AAAA,IAClB,UAAA,GAAkB,IAAA;AAAA,IAClB,eAAA,GAAkB,GAAA;AAAA,IAClB,KAAA,GAAkB,YAAA;AAAA,IAClB,SAAA,GAAkB,IAAA;AAAA,IAClB,WAAA,GAAkB,SAAA;AAAA,IAClB,eAAA,GAAkB,IAAA;AAAA,IAClB,cAAA,GAAkB,IAAA;AAAA,IAClB,YAAA,GAAkB,GAAA;AAAA,IAClB,KAAA,GAAkB,CAAA;AAAA,IAClB,MAAA,GAAkB,IAAA;AAAA,IAClB,QAAA,GAAkB,IAAA;AAAA,IAClB,OAAA,GAAkB,IAAA;AAAA,IAClB,SAAA,GAAkB;AAAA,GACpB,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAQ,QAAA,GAAW,UAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,eAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,KAAK,QAAA,CAAS,CAAA;AACpB,EAAA,MAAM,KAAK,QAAA,CAAS,CAAA;AAGpB,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AACvC,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAClC,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAClC,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAGjB,EAAA,MAAM,UAAA,GAAa,WAAW,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,IAAA,GAAO,CAAA;AAEvE,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAGjB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,QAAA,GAAA,CAAY,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA;AAGlC,MAAA,MAAM,UAAA,GAAa,KAAA;AACnB,MAAA,MAAM,aAAa,CAAA,GAAI,IAAA;AACvB,MAAA,MAAM,SAAA,GAAa,IAAA,CAAK,GAAA,GAAM,UAAA,GAAa,UAAA,EAAY,GAAA,GAAM,UAAA,GAAa,GAAA,GAAM,UAAA,GAAa,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA;AAG1G,MAAA,MAAM,SAAA,GAAY,IAAA;AAClB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAA,CAAK,GAAA,GAAM,GAAA,GAAM,QAAQ,SAAA,GAAY,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA;AAG7E,MAAA,MAAM,WAAW,QAAA,GAAW,IAAA,GAAO,SAAA,GAAY,IAAA,GAAO,YAAY,GAAA,GAAO,UAAA;AAGzE,MAAA,MAAM,QAAQ,EAAA,GAAK,EAAA;AACnB,MAAA,MAAM,QAAQ,EAAA,GAAK,EAAA;AACnB,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAA,GAAQ,QAAQ,KAAK,CAAA;AACvD,MAAA,IAAI,UAAA,GAAa,CAAA;AACjB,MAAA,IAAI,MAAA,IAAU,UAAU,IAAA,EAAM;AAC5B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA;AACrC,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,GAAQ,IAAI,CAAA,GAAI,GAAA,GAAM,UAAU,EAAE,CAAA;AACzD,QAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,UAAU,IAAI,CAAA;AAC9C,QAAA,UAAA,GAAa,KAAA,GAAQ,UAAU,OAAA,GAAU,IAAA;AAAA,MAC3C;AAGA,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,UAAU,YAAY,CAAA;AAExD,MAAA,MAAM,SAAA,GACJ,YAAY,CAAA,GAAI,cAAA,CAAA,GAAA,CACf,YAAY,UAAA,GAAa,GAAA,IAAO,iBAC/B,UAAA,GAAa,IAAA;AAEjB,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AAGlD,MAAA,IAAI,cAAA,GAAiB,OAAA;AACrB,MAAA,IAAI,QAAA,IAAY,UAAU,IAAA,EAAM;AAE9B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC/B,QAAA,MAAM,WAAA,GAAc,OAAO,GAAA,GAAM,CAAA,GAAI,SAAS,CAAA,EAAG,GAAA,GAAM,KAAK,MAAM,CAAA;AAClE,QAAA,IAAI,cAAc,IAAA,EAAM;AACtB,UAAA,cAAA,GAAiB,KAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAA,CAAW,WAAA,GAAc,QAAQ,CAAC,CAAA;AAAA,QACjE;AAAA,MACF;AAEA,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAC9D,MAAA,IAAI,KAAA,CAAM,OAAO,CAAA,KAAM,GAAA,EAAK;AAE5B,MAAA,MAAM,KAAA,GAAQ,QAAQ,cAAA,GAAiB,IAAA;AACvC,MAAA,MAAM,WAAW,cAAA,GAAiB,eAAA;AAElC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,SAAA,GAAY,MAAO,IAAA,EAAM,KAAA,IAAS,SAAA,GAAY,CAAA,GAAI,GAAA,CAAI,CAAA;AACnF,QAAA,GAAA,CAAI,SAAA,GAAY,QAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,MAC1D,WAAW,SAAA,EAAW;AACpB,QAAA,GAAA,CAAI,YAAY,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACxD,WAAW,SAAA,EAAW;AACpB,QAAA,GAAA,CAAI,SAAA,GAAY,CAAA,WAAA,EAAc,KAAA,GAAQ,GAAG,CAAA,CAAA,CAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,SAAA,GAAY,oBAAoB,KAAK,CAAA,CAAA,CAAA;AAAA,MAC3C;AAEA,MAAA,GAAA,CAAI,SAAS,KAAA,CAAM,OAAO,GAAG,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IACvD;AAAA,EACF;AACF;AAgDA,SAAS,YAAY,CAAA,EAAuD;AAE1E,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,qBAAqB,IAAI,CAAC,CAAA;AAC9C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,IAAI,GAAA,CAAI,MAAA,IAAU,IACpB,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,IAAI,CAAA,EAAG,EAAE,CAAC,CAAA,GAC1C,CAAC,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAE,CAAC,GAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAC,CAAA;AAC1F,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,EACrC;AAEA,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,wCAAwC,CAAA;AAC5D,EAAA,IAAI,KAAK,OAAO,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAC,GAAA,CAAI,CAAC,CAAA,EAAE;AACrD,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,eAAA,CACd,MAAA,EACA,OAAA,GAAkC,EAAC,EACV;AACzB,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,GAAA;AAAA,IACV,SAAA;AAAA,IACA,MAAA,GAAS,CAAA;AAAA,IACT,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,OAAA;AAEJ,EAAA,MAAM,YAAY,OAAO,MAAA,KAAW,WAC/B,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,GAC9B,MAAA;AAEJ,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,MAAM,CAAA;AAClE,IAAA,OAAO,EAAE,SAAS,MAAM;AAAA,IAAC,CAAA,EAAE;AAAA,EAC7B;AAGA,EAAA,MAAM,YAAA,GAAe,UAAU,KAAA,CAAM,QAAA;AACrC,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,CAAE,QAAA,KAAa,QAAA,EAAU;AACrD,IAAA,SAAA,CAAU,MAAM,QAAA,GAAW,UAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA,IACrB,mBAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAW,OAAO,CAAA,CAAA;AAAA,IAClB,qBAAA;AAAA,IACA,WAAW,MAAM,CAAA;AAAA,GACnB,CAAE,KAAK,GAAG,CAAA;AACV,EAAA,IAAI,SAAA,SAAkB,SAAA,GAAY,SAAA;AAClC,EAAA,SAAA,CAAU,QAAQ,MAAM,CAAA;AAExB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,EAAA,MAAM,KAAA,GAAc,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AACrC,EAAA,MAAM,WAAA,GAAc,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AAGrC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,+BAA+B,CAAA;AAC5D,EAAA,MAAM,UAAU,MAAe;AAC7B,IAAA,IAAI,WAAA,KAAgB,SAAS,OAAO,IAAA;AACpC,IAAA,IAAI,WAAA,KAAgB,QAAS,OAAO,KAAA;AACpC,IAAA,OAAO,EAAA,CAAG,OAAA;AAAA,EACZ,CAAA;AAGA,EAAA,IAAI,WAAA,GAA0D,IAAA;AAC9D,EAAA,IAAI,KAAA,EAAO,WAAA,GAAc,WAAA,CAAY,KAAK,CAAA;AAE1C,EAAA,MAAM,YAAY,OAA8B;AAAA,IAC9C,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,SAAA,EAAW,WAAA,GACP,CAAA,KAAA,EAAQ,WAAA,CAAY,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,KAAA,CAAA,GACvD,UAAA,CAAW;AAAA,GACjB,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,EAAE,OAAA,EAAS,SAAA,EAAU,EAAE;AAGvC,EAAA,MAAM,iBAAiB,MAAM;AAAE,IAAA,OAAA,CAAQ,UAAU,SAAA,EAAU;AAAA,EAAG,CAAA;AAC9D,EAAA,IAAI,WAAA,KAAgB,MAAA,EAAQ,EAAA,CAAG,gBAAA,CAAiB,UAAU,cAAc,CAAA;AAExE,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAC1C,IAAA,MAAA,CAAO,KAAA,GAAS,EAAE,KAAA,GAAS,GAAA;AAC3B,IAAA,MAAA,CAAO,MAAA,GAAS,EAAE,MAAA,GAAS,GAAA;AAC3B,IAAA,GAAA,CAAI,aAAa,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EACvC,CAAA;AACA,EAAA,MAAA,EAAO;AAEP,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAC1C,IAAA,KAAA,CAAM,CAAA,GAAA,CAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AACnC,IAAA,KAAA,CAAM,CAAA,GAAA,CAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAQ,CAAA,CAAE,MAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,CAAA;AACpC,EAAA,EAAA,CAAG,QAAQ,SAAS,CAAA;AACpB,EAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAEhD,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,GAAA,GAAO,CAAA;AACX,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,WAAA,CAAY,CAAA,IAAA,CAAM,KAAA,CAAM,CAAA,GAAI,WAAA,CAAY,CAAA,IAAK,IAAA;AAC7C,IAAA,WAAA,CAAY,CAAA,IAAA,CAAM,KAAA,CAAM,CAAA,GAAI,WAAA,CAAY,CAAA,IAAK,IAAA;AAC7C,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAC1C,IAAA,oBAAA,CAAqB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAO,CAAA;AAC/E,IAAA,IAAA,IAAQ,KAAA;AACR,IAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAAA,EAClC,CAAA;AACA,EAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAEhC,EAAA,OAAO;AAAA,IACL,SAAS,MAAM;AACb,MAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,MAAA,EAAA,CAAG,UAAA,EAAW;AACd,MAAA,IAAI,WAAA,KAAgB,MAAA,EAAQ,EAAA,CAAG,mBAAA,CAAoB,UAAU,cAAc,CAAA;AAC3E,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,MAAA,MAAA,CAAO,MAAA,EAAO;AACd,MAAA,SAAA,CAAU,MAAM,QAAA,GAAW,YAAA;AAAA,IAC7B;AAAA,GACF;AACF;AAGO,IAAM,mBAAA,GAAsB;;;AC/hDnC,IAAM,QAAA;AAAA;AAAA,EAAqB,CAAA;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;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,CAAA;AA6M3B,IAAM,QAAA;AAAA;AAAA,EAAqB,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAwB3B,SAAS,aAAA,CAAc,EAAA,EAA4B,IAAA,EAAc,GAAA,EAA0B;AACzF,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,YAAA,CAAa,IAAI,CAAA;AAC/B,EAAA,EAAA,CAAG,YAAA,CAAa,IAAI,GAAG,CAAA;AACvB,EAAA,EAAA,CAAG,cAAc,EAAE,CAAA;AACnB,EAAA,IAAI,CAAC,EAAA,CAAG,kBAAA,CAAmB,EAAA,EAAI,EAAA,CAAG,cAAc,CAAA,EAAG;AACjD,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,gBAAA,CAAiB,EAAE,CAAA,IAAK,SAAA;AACxC,IAAA,EAAA,CAAG,aAAa,EAAE,CAAA;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAE,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,WAAA,CAAY,EAAA,EAA4B,IAAA,EAAmB,IAAA,EAAiC;AACnG,EAAA,MAAM,IAAA,GAAO,GAAG,aAAA,EAAc;AAC9B,EAAA,EAAA,CAAG,YAAA,CAAa,MAAM,IAAI,CAAA;AAC1B,EAAA,EAAA,CAAG,YAAA,CAAa,MAAM,IAAI,CAAA;AAC1B,EAAA,EAAA,CAAG,YAAY,IAAI,CAAA;AACnB,EAAA,IAAI,CAAC,EAAA,CAAG,mBAAA,CAAoB,IAAA,EAAM,EAAA,CAAG,WAAW,CAAA,EAAG;AACjD,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,iBAAA,CAAkB,IAAI,CAAA,IAAK,SAAA;AAC3C,IAAA,EAAA,CAAG,cAAc,IAAI,CAAA;AACrB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAA,CAAY,EAAA,EAA4B,MAAA,GAAiB,EAAA,CAAG,OAAA,EAAuB;AAC1F,EAAA,MAAM,CAAA,GAAI,GAAG,aAAA,EAAc;AAC3B,EAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,UAAA,EAAY,CAAC,CAAA;AAC/B,EAAA,EAAA,CAAG,aAAA,CAAc,EAAA,CAAG,UAAA,EAAY,EAAA,CAAG,oBAAoB,MAAM,CAAA;AAC7D,EAAA,EAAA,CAAG,aAAA,CAAc,EAAA,CAAG,UAAA,EAAY,EAAA,CAAG,oBAAoB,MAAM,CAAA;AAC7D,EAAA,EAAA,CAAG,cAAc,EAAA,CAAG,UAAA,EAAY,EAAA,CAAG,cAAA,EAAgB,GAAG,aAAa,CAAA;AACnE,EAAA,EAAA,CAAG,cAAc,EAAA,CAAG,UAAA,EAAY,EAAA,CAAG,cAAA,EAAgB,GAAG,aAAa,CAAA;AACnE,EAAA,OAAO,CAAA;AACT;AAGA,IAAM,WAAA,GAAgB,CAAC,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,QAAA,EAAS,QAAA,EAAS,YAAA,EAAa,SAAA,EAAU,WAAW,CAAA;AAC5H,IAAM,gBAAgB,CAAC,WAAA,EAAY,SAAA,EAAU,OAAA,EAAQ,QAAO,YAAY,CAAA;AACxE,IAAM,WAAA,GAAgB,CAAC,WAAA,EAAY,WAAA,EAAY,UAAS,QAAQ,CAAA;AASzD,SAAS,uBAAuB,MAAA,EAAiD;AACtF,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU;AAAA,IAC3C,KAAA,EAAO,IAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,kBAAA,EAAoB,KAAA;AAAA,IACpB,qBAAA,EAAuB;AAAA,GACxB,CAAA;AAED,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,EAAA,GAA6B,QAAA;AAEnC,EAAA,IAAI;AA2DF,IAAA,IAASC,UAAT,SACE,KAAA,EACA,SACA,QAAA,EACA,QAAA,EACA,MACA,QAAA,EACM;AACN,MAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,MAAA,IAAI,SAAS,CAAA,EAAG;AAChB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AACtB,MAAA,IAAI,SAAS,CAAA,EAAG;AAEhB,MAAA,EAAA,CAAG,QAAA,CAAS,GAAG,CAAA,EAAG,EAAA,CAAG,OAAO,KAAA,EAAO,EAAA,CAAG,OAAO,MAAM,CAAA;AAGnD,MAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,IAAQ,CAAC,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,IAAQ,CAAC,CAAA;AAC7D,MAAA,KAAA,EAAO,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAM,EAAA,IAAM,EAAA;AACvC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,EAAM,EAAA,IAAM,EAAA;AAChC,UAAA,IAAI,MAAM,EAAE,CAAA,CAAE,EAAE,CAAA,CAAE,IAAI,GAAA,EAAK;AAAE,YAAA,eAAA,GAAkB,IAAA;AAAM,YAAA,MAAM,KAAA;AAAA,UAAO;AACtE,MAAA,EAAA,CAAG,UAAA;AAAA,QAAW,kBAAkB,CAAA,GAAI,MAAA;AAAA,QACtB,kBAAkB,CAAA,GAAI,MAAA;AAAA,QACtB,kBAAkB,CAAA,GAAI,MAAA;AAAA,QACtB,kBAAkB,CAAA,GAAI;AAAA,OAAG;AACvC,MAAA,EAAA,CAAG,KAAA,CAAM,GAAG,gBAAgB,CAAA;AAG5B,MAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,QAAA,EAAU;AAC1C,QAAA,OAAA,GAAW,IAAI,UAAA,CAAW,IAAA,GAAO,IAAA,GAAO,CAAC,CAAA;AACzC,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,aAAA,GAAgB,IAAA;AAAA,MAClB;AAGA,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,UAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,YAAA,MAAM,IAAA,GAAO,IAAI,CAAC,CAAA;AAClB,YAAA,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,IAAA,GAAO,CAAA,IAAK,CAAA;AAC3B,YAAA,OAAA,CAAQ,CAAC,IAAQ,IAAA,CAAK,CAAA;AACtB,YAAA,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA;AACtB,YAAA,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA;AAEtB,YAAA,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA;AAAA,UACxB;AAAA,QACF;AACA,QAAA,EAAA,CAAG,aAAA,CAAc,GAAG,QAAQ,CAAA;AAC5B,QAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,UAAA,EAAY,OAAO,CAAA;AACrC,QAAA,EAAA,CAAG,UAAA;AAAA,UAAW,EAAA,CAAG,UAAA;AAAA,UAAY,CAAA;AAAA,UAAG,EAAA,CAAG,IAAA;AAAA,UAAM,IAAA;AAAA,UAAM,IAAA;AAAA,UAAM,CAAA;AAAA,UACvC,EAAA,CAAG,IAAA;AAAA,UAAM,EAAA,CAAG,aAAA;AAAA,UAAe;AAAA,SAAO;AAChD,QAAA,aAAA,GAAgB,KAAA;AAAA,MAClB;AAEA,MAAA,EAAA,CAAG,aAAA,CAAc,GAAG,QAAQ,CAAA;AAC5B,MAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,UAAA,EAAY,OAAO,CAAA;AAErC,MAAA,EAAA,CAAG,WAAW,IAAI,CAAA;AAClB,MAAA,EAAA,CAAG,gBAAgB,GAAG,CAAA;AAEtB,MAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,MAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AAEzB,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,UAAA,EAAa,QAAA,EAAU,QAAQ,CAAA;AAC9C,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,QAAA,EAAa,IAAA,EAAU,IAAI,CAAA;AAC1C,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,QAAA,EAAa,KAAA,EAAU,KAAK,CAAA;AAC3C,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,IAAA,EAAa,IAAI,CAAA;AAChC,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,SAAA,EAAa,OAAA,CAAQ,cAAc,CAAA;AAClD,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,SAAA,EAAa,YAAY,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAC,CAAA;AACvE,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,SAAA,EAAa,YAAY,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAC,CAAA;AAElE,MAAA,MAAM,SAAS,OAAA,CAAQ,WAAA,IAAe,SAAA,EAAW,OAAA,CAAQ,KAAK,EAAE,CAAA;AAChE,MAAA,EAAA,CAAG,SAAA;AAAA,QAAU,CAAA,CAAE,WAAA;AAAA,QACb,SAAS,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,QAClC,SAAS,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,QAClC,SAAS,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAAG;AACvC,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,GAAS,IAAI,CAAC,CAAA;AAE7C,MAAA,MAAM,aAAgB,IAAA,GAAO,IAAA;AAC7B,MAAA,MAAM,UAAA,GAAgB,QAAQ,cAAA,KAAmB,MAAA;AACjD,MAAA,MAAM,aAAA,GAAgB,cAAc,UAAA,GAAa,GAAA;AACjD,MAAA,MAAM,cAAgB,CAAC,aAAA,IAAiB,CAAC,CAAC,QAAA,IAAY,QAAQ,aAAA,GAAgB,CAAA;AAC9E,MAAA,MAAM,WAAA,GAAgB,aAAa,GAAA,GAAS,IAAA,GACtB,aAAa,IAAA,GAAS,GAAA,GACtB,UAAA,GAAa,GAAA,GAAS,GAAA,GAAM,CAAA;AAElD,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,aAAA,EAAgB,WAAA,GAAc,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AACtE,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,cAAA,EAAgB,cAAe,QAAA,EAAU,SAAA,IAAa,IAAK,CAAC,CAAA;AAC3E,MAAA,EAAA,CAAG,SAAA,CAAU,EAAE,QAAA,EAAgB,QAAA,EAAU,KAAK,GAAA,EAAK,QAAA,EAAU,KAAK,GAAG,CAAA;AACrE,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,WAAA,EAAgB,OAAA,CAAQ,cAAc,WAAW,CAAA;AAChE,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,WAAA,EAAgB,cAAc,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAC,CAAA;AACzE,MAAA,MAAM,EAAA,GAAK,QAAQ,UAAA,IAAc,SAAA;AACjC,MAAA,EAAA,CAAG,SAAA;AAAA,QAAU,CAAA,CAAE,UAAA;AAAA,QACb,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,QAC/B,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,QAC/B,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAAG;AAEpC,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,UAAA,EAAc,QAAQ,UAAA,KAAe,MAAA,GAAS,IAAI,CAAC,CAAA;AAClE,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,YAAA,EAAc,OAAA,CAAQ,YAAY,CAAA;AACjD,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,QAAA,EAAc,CAAC,CAAA;AAE9B,MAAA,EAAA,CAAG,oBAAoB,EAAA,CAAG,cAAA,EAAgB,CAAA,EAAG,CAAA,EAAG,OAAO,IAAI,CAAA;AAC3D,MAAA,EAAA,CAAG,gBAAgB,IAAI,CAAA;AAAA,IACzB,CAAA;AAzGS,IAAA,IAAA,MAAA,GAAAA,OAAAA;AAzDT,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,EAAA,EAAI,EAAA,CAAG,eAAe,QAAQ,CAAA;AACzD,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,EAAA,EAAI,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAC3D,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA;AACvC,IAAA,EAAA,CAAG,aAAa,IAAI,CAAA;AACpB,IAAA,EAAA,CAAG,aAAa,IAAI,CAAA;AAGpB,IAAA,MAAM,GAAA,GAAM,GAAG,iBAAA,EAAkB;AACjC,IAAA,EAAA,CAAG,gBAAgB,GAAG,CAAA;AAEtB,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,CAAC,CAAA,GAAA,EAAK,CAAA,GAAA,EAAM,GAAA,EAAI,CAAA,GAAA,EAAM,CAAA,GAAA,EAAK,GAAA,EAAK,GAAA,EAAI,GAAG,CAAC,CAAA;AACzE,IAAA,MAAM,GAAA,GAAM,GAAG,YAAA,EAAa;AAC5B,IAAA,EAAA,CAAG,UAAA,CAAW,EAAA,CAAG,YAAA,EAAc,GAAG,CAAA;AAClC,IAAA,EAAA,CAAG,UAAA,CAAW,EAAA,CAAG,YAAA,EAAc,OAAA,EAAS,GAAG,WAAW,CAAA;AAEtD,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,iBAAA,CAAkB,IAAA,EAAM,UAAU,CAAA;AACrD,IAAA,EAAA,CAAG,wBAAwB,OAAO,CAAA;AAClC,IAAA,EAAA,CAAG,oBAAoB,OAAA,EAAS,CAAA,EAAG,GAAG,KAAA,EAAO,KAAA,EAAO,GAAG,CAAC,CAAA;AAExD,IAAA,EAAA,CAAG,gBAAgB,IAAI,CAAA;AAGvB,IAAA,MAAM,OAAA,GAAU,YAAY,EAAE,CAAA;AAG9B,IAAA,MAAM,IAAI,CAAC,CAAA,KAAc,EAAA,CAAG,kBAAA,CAAmB,MAAM,CAAC,CAAA;AACtD,IAAA,MAAM,CAAA,GAAI;AAAA,MACR,UAAA,EAAe,EAAE,cAAc,CAAA;AAAA,MAC/B,QAAA,EAAe,EAAE,YAAY,CAAA;AAAA,MAC7B,QAAA,EAAe,EAAE,YAAY,CAAA;AAAA,MAC7B,IAAA,EAAe,EAAE,QAAQ,CAAA;AAAA,MACzB,SAAA,EAAe,EAAE,aAAa,CAAA;AAAA,MAC9B,SAAA,EAAe,EAAE,aAAa,CAAA;AAAA,MAC9B,SAAA,EAAe,EAAE,aAAa,CAAA;AAAA,MAC9B,WAAA,EAAe,EAAE,eAAe,CAAA;AAAA,MAChC,MAAA,EAAe,EAAE,UAAU,CAAA;AAAA,MAC3B,aAAA,EAAe,EAAE,iBAAiB,CAAA;AAAA,MAClC,cAAA,EAAe,EAAE,kBAAkB,CAAA;AAAA,MACnC,QAAA,EAAe,EAAE,YAAY,CAAA;AAAA,MAC7B,WAAA,EAAe,EAAE,eAAe,CAAA;AAAA,MAChC,WAAA,EAAe,EAAE,eAAe,CAAA;AAAA,MAChC,UAAA,EAAe,EAAE,cAAc,CAAA;AAAA,MAC/B,UAAA,EAAe,EAAE,cAAc,CAAA;AAAA,MAC/B,YAAA,EAAe,EAAE,gBAAgB,CAAA;AAAA,MACjC,QAAA,EAAe,EAAE,WAAW;AAAA,KAC9B;AAGA,IAAA,IAAI,QAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,QAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,OAAA,GAAgB,IAAI,UAAA,CAAW,CAAC,CAAA;AACpC,IAAA,IAAI,aAAA,GAAgB,IAAA;AAEpB,IAAA,EAAA,CAAG,MAAA,CAAO,GAAG,KAAK,CAAA;AAClB,IAAA,EAAA,CAAG,SAAA,CAAU,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,mBAAmB,CAAA;AA8GjD,IAAA,OAAO;AAAA,MACL,MAAA,EAAAA,OAAAA;AAAA,MACA,WAAA,GAAc;AAAE,QAAA,aAAA,GAAgB,IAAA;AAAA,MAAM,CAAA;AAAA,MACtC,OAAA,GAAU;AACR,QAAA,EAAA,CAAG,cAAc,IAAI,CAAA;AACrB,QAAA,EAAA,CAAG,kBAAkB,GAAG,CAAA;AACxB,QAAA,EAAA,CAAG,aAAa,GAAG,CAAA;AACnB,QAAA,EAAA,CAAG,cAAc,OAAO,CAAA;AAAA,MAC1B;AAAA,KACF;AAAA,EAEF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,2DAA2D,GAAG,CAAA;AAC5E,IAAA,MAAM,IAAA,GAAsB;AAAA,MAC1B,MAAA,GAAS;AACP,QAAA,IAAI;AAAE,UAAA,EAAA,CAAG,UAAA,CAAW,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAC,CAAA;AAAG,UAAA,EAAA,CAAG,KAAA,CAAM,GAAG,gBAAgB,CAAA;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAQ;AAAA,MAC9F,CAAA;AAAA,MACA,WAAA,GAAc;AAAA,MAAC,CAAA;AAAA,MACf,OAAA,GAAU;AAAA,MAAC;AAAA,KACb;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"index.cjs","sourcesContent":["// ─── Asciify Types ────────────────────────────────────────────────\n\nexport type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';\nexport type RenderMode = 'ascii' | 'dots';\nexport type AnimationStyle = 'none' | 'wave' | 'pulse' | 'rain' | 'breathe' | 'sparkle' | 'glitch' | 'spiral' | 'typewriter' | 'scatter' | 'waveField';\nexport type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal' | 'box' | 'lines';\nexport type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift';\nexport type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice';\nexport type SourceType = 'image' | 'video' | 'gif' | null;\n\nexport interface AsciiOptions {\n fontSize: number;\n charSpacing: number;\n brightness: number;\n contrast: number;\n charset: string;\n colorMode: ColorMode;\n accentColor: string;\n invert: boolean;\n renderMode: RenderMode;\n animationStyle: AnimationStyle;\n animationSpeed: number;\n dotSizeRatio: number;\n ditherStrength: number;\n hoverStrength: number;\n hoverRadius: number;\n hoverEffect: HoverEffect;\n hoverColor: string;\n artStyle: ArtStyle;\n customText: string;\n}\n\nexport interface AsciiCell {\n char: string;\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport type AsciiFrame = AsciiCell[][];\n\nexport interface AsciiResult {\n frames: AsciiFrame[];\n cols: number;\n rows: number;\n fps: number;\n}\n\nexport const CHARSETS = {\n standard: ' .:-=+*#%@',\n blocks: ' ░▒▓█',\n minimal: ' .:+',\n dense: ' .\\'`^\",:;Il!i><~+_-?][}{1)(|\\\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$',\n binary: '01',\n dots: ' ⠁⠃⠇⡇⣇⣧⣷⣿',\n letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n claudeCode: ' ╔╗╚╝║═╠╣╦╩╬░▒▓█│─┌┐└┘├┤┬┴┼',\n box: ' ▪◾◼■█',\n lines: ' ˗‐–—―━',\n} as const;\n\nexport type CharsetKey = keyof typeof CHARSETS;\n\n/**\n * Art Style presets — each one sets render mode, charset, color mode, etc.\n */\nexport const ART_STYLE_PRESETS: Record<ArtStyle, Partial<AsciiOptions>> = {\n classic: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n },\n particles: {\n renderMode: 'dots',\n colorMode: 'fullcolor',\n dotSizeRatio: 0.8,\n },\n letters: {\n renderMode: 'ascii',\n charset: CHARSETS.letters,\n colorMode: 'fullcolor',\n },\n claudeCode: {\n renderMode: 'ascii',\n charset: CHARSETS.claudeCode,\n colorMode: 'accent',\n accentColor: '#f97316',\n },\n art: {\n renderMode: 'ascii',\n charset: CHARSETS.dense,\n colorMode: 'fullcolor',\n },\n terminal: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'matrix',\n },\n box: {\n renderMode: 'ascii',\n charset: CHARSETS.box,\n colorMode: 'grayscale',\n },\n lines: {\n renderMode: 'ascii',\n charset: CHARSETS.lines,\n colorMode: 'fullcolor',\n },\n};\n\nexport const DEFAULT_OPTIONS: AsciiOptions = {\n fontSize: 10,\n charSpacing: 1,\n brightness: 0,\n contrast: 0,\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n accentColor: '#d4ff00',\n invert: false,\n renderMode: 'ascii',\n animationStyle: 'none',\n animationSpeed: 1,\n dotSizeRatio: 0.8,\n ditherStrength: 0,\n hoverStrength: 0,\n hoverRadius: 0.2,\n hoverEffect: 'spotlight',\n hoverColor: '#ffffff',\n artStyle: 'classic',\n customText: '',\n};\n\n/**\n * Hover presets — one-click configurations for the hover system.\n */\nexport const HOVER_PRESETS: Record<HoverPreset, { label: string; options: Partial<AsciiOptions> }> = {\n none: {\n label: 'Off',\n options: { hoverStrength: 0, hoverEffect: 'spotlight', hoverRadius: 0.2, hoverColor: '#ffffff' },\n },\n subtle: {\n label: 'Subtle',\n options: { hoverStrength: 0.25, hoverEffect: 'glow', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n flashlight: {\n label: 'Flashlight',\n options: { hoverStrength: 0.6, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#fffbe6' },\n },\n magnifier: {\n label: 'Magnifier',\n options: { hoverStrength: 0.7, hoverEffect: 'magnify', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n forceField: {\n label: 'Force Field',\n options: { hoverStrength: 0.7, hoverEffect: 'repel', hoverRadius: 0.15, hoverColor: '#a0e8ff' },\n },\n neon: {\n label: 'Neon',\n options: { hoverStrength: 0.6, hoverEffect: 'colorShift', hoverRadius: 0.15, hoverColor: '#d946ef' },\n },\n fire: {\n label: 'Fire',\n options: { hoverStrength: 0.7, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#ff6b2b' },\n },\n ice: {\n label: 'Ice',\n options: { hoverStrength: 0.5, hoverEffect: 'glow', hoverRadius: 0.15, hoverColor: '#60d5f7' },\n },\n};\n","// ─── Asciify Engine ───────────────────────────────────────────────\n// Framework-agnostic. Pure TypeScript.\n// Converts image/video/GIF pixel data to ASCII character grids.\n// Supports: ASCII text mode, Dots mode, Animation effects, Transparency.\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame, AnimationStyle, ArtStyle } from './types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from './types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\n\n/**\n * Create an offscreen canvas for pixel sampling.\n */\nfunction createOffscreenCanvas(width: number, height: number): {\n canvas: HTMLCanvasElement | OffscreenCanvas;\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n} {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n return { canvas, ctx };\n}\n\n/**\n * Apply brightness and contrast adjustments to a luminance value.\n */\nfunction adjustLuminance(lum: number, brightness: number, contrast: number): number {\n let adjusted = lum + brightness * 255;\n const factor = (259 * (contrast * 255 + 255)) / (255 * (259 - contrast * 255));\n adjusted = factor * (adjusted - 128) + 128;\n return Math.max(0, Math.min(255, adjusted));\n}\n\n/**\n * Map a luminance value (0-255) to a character from the charset.\n */\nfunction luminanceToChar(lum: number, charset: string, invert: boolean): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n const index = Math.floor(normalized * (charset.length - 1));\n return charset[Math.max(0, Math.min(charset.length - 1, index))];\n}\n\n/**\n * Map a cell position to a character from custom text, tiled across the image.\n * Only shows characters where brightness is above a threshold; otherwise space.\n * This makes the custom text readable as a repeating pattern across the image.\n */\nfunction customTextToChar(\n lum: number, text: string, x: number, y: number, cols: number, invert: boolean\n): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n // Below threshold → space (dark/empty areas stay blank)\n if (normalized < 0.12) return ' ';\n // Tile the full text across positions so it reads naturally left-to-right\n const pos = y * cols + x;\n return text[pos % text.length];\n}\n\n/**\n * Simple ordered-dither noise based on Bayer 4x4 matrix.\n */\nconst BAYER_4X4 = [\n [ 0, 8, 2,10],\n [12, 4,14, 6],\n [ 3,11, 1, 9],\n [15, 7,13, 5],\n];\n\n// ─── Pre-computed Color LUTs ───\n// Avoid per-cell string allocation for grayscale and matrix modes.\nconst _GRAY_LUT: string[] = new Array(256);\nconst _GREEN_LUT: string[] = new Array(256);\nfor (let _i = 0; _i < 256; _i++) {\n _GRAY_LUT[_i] = `rgb(${_i},${_i},${_i})`;\n _GREEN_LUT[_i] = `rgb(0,${_i},0)`;\n}\n\n// ─── Cached Hover Glow Sprite ───\n// Avoids createRadialGradient() every frame.\nlet _glowCache: { canvas: HTMLCanvasElement; size: number; r: number; g: number; b: number } | null = null;\n\n// @ts-ignore: reserved for future hover-glow feature\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction _getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4; // quantize to reduce cache misses\n if (_glowCache && _glowCache.size === size && _glowCache.r === r && _glowCache.g === g && _glowCache.b === b) {\n return _glowCache.canvas;\n }\n const dim = size * 2;\n const canvas = document.createElement('canvas');\n canvas.width = dim;\n canvas.height = dim;\n const gCtx = canvas.getContext('2d')!;\n const gradient = gCtx.createRadialGradient(size, size, 0, size, size, size);\n gradient.addColorStop(0, `rgba(${r},${g},${b},1)`);\n gradient.addColorStop(0.4, `rgba(${r},${g},${b},0.4)`);\n gradient.addColorStop(1, `rgba(${r},${g},${b},0)`);\n gCtx.fillStyle = gradient;\n gCtx.fillRect(0, 0, dim, dim);\n _glowCache = { canvas, size, r, g, b };\n return canvas;\n}\n\nfunction applyDither(lum: number, x: number, y: number, strength: number): number {\n if (strength <= 0) return lum;\n const threshold = (BAYER_4X4[y % 4][x % 4] / 16 - 0.5) * strength * 128;\n return Math.max(0, Math.min(255, lum + threshold));\n}\n\n/**\n * Resolve a cell's fill color as a string — uses LUT for grayscale/matrix.\n * colorMode is passed directly to avoid per-cell object property lookup.\n */\nfunction getCellColorStr(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): string {\n switch (colorMode) {\n case 'fullcolor':\n return `rgb(${cell.r},${cell.g},${cell.b})`;\n case 'matrix':\n return _GREEN_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n return `rgb(${(acR * ab) | 0},${(acG * ab) | 0},${(acB * ab) | 0})`;\n }\n default:\n return _GRAY_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n }\n}\n\n/**\n * Resolve a cell's fill color as numeric [r, g, b] — avoids string allocation.\n * Uses the shared _colorRGB array to avoid per-call allocation.\n * colorMode passed directly to avoid per-cell object property lookup.\n */\nconst _colorRGB = [0, 0, 0];\nfunction getCellColorRGB(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): number[] {\n switch (colorMode) {\n case 'fullcolor':\n _colorRGB[0] = cell.r; _colorRGB[1] = cell.g; _colorRGB[2] = cell.b;\n break;\n case 'matrix': {\n const mb = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = 0; _colorRGB[1] = mb; _colorRGB[2] = 0;\n break;\n }\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n _colorRGB[0] = (acR * ab) | 0; _colorRGB[1] = (acG * ab) | 0; _colorRGB[2] = (acB * ab) | 0;\n break;\n }\n default: {\n const gray = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = gray; _colorRGB[1] = gray; _colorRGB[2] = gray;\n break;\n }\n }\n return _colorRGB;\n}\n\n/**\n * Get animation multiplier for a cell based on animation style.\n * Returns a value between 0 and 1 that modulates the cell's visibility/size.\n */\nfunction getAnimationMultiplier(\n x: number,\n y: number,\n cols: number,\n rows: number,\n time: number,\n style: AnimationStyle,\n speed: number\n): number {\n if (style === 'none') return 1;\n\n const t = time * speed;\n\n switch (style) {\n case 'wave': {\n const wave = Math.sin((x / cols) * Math.PI * 4 + t * 3) * 0.5 + 0.5;\n const wave2 = Math.sin((y / rows) * Math.PI * 3 + t * 2) * 0.5 + 0.5;\n return 0.3 + 0.7 * (wave * 0.6 + wave2 * 0.4);\n }\n case 'pulse': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dist = Math.sqrt((x - cx) ** 2 + (y - cy) ** 2);\n const maxDist = Math.sqrt(cx ** 2 + cy ** 2);\n const ring = Math.sin(dist / maxDist * Math.PI * 6 - t * 4) * 0.5 + 0.5;\n return 0.2 + 0.8 * ring;\n }\n case 'rain': {\n const drop = Math.sin(y / rows * Math.PI * 8 - t * 5 + x * 0.3) * 0.5 + 0.5;\n const fade = Math.sin(x / cols * Math.PI * 2 + t) * 0.3 + 0.7;\n return 0.1 + 0.9 * drop * fade;\n }\n case 'breathe': {\n const breathe = Math.sin(t * 2) * 0.3 + 0.7;\n const subtle = Math.sin((x + y) * 0.1 + t) * 0.1;\n return Math.max(0.1, Math.min(1, breathe + subtle));\n }\n case 'sparkle': {\n // Random-looking sparkle using pseudo-random hash\n const hash = Math.sin(x * 127.1 + y * 311.7 + Math.floor(t * 8) * 43758.5453) * 43758.5453;\n const sparkle = (hash - Math.floor(hash));\n return sparkle > 0.7 ? 1 : 0.15 + sparkle * 0.4;\n }\n case 'glitch': {\n // Horizontal glitch bands that shift randomly\n const band = Math.floor(y / (rows * 0.05));\n const glitchHash = Math.sin(band * 43.23 + Math.floor(t * 6) * 17.89) * 43758.5453;\n const glitchVal = glitchHash - Math.floor(glitchHash);\n if (glitchVal > 0.85) {\n // This band glitches — offset or blank\n const flicker = Math.sin(t * 30 + band) * 0.5 + 0.5;\n return flicker < 0.3 ? 0 : flicker;\n }\n return 1;\n }\n case 'spiral': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dx = x - cx;\n const dy = y - cy;\n const angle = Math.atan2(dy, dx);\n const dist = Math.sqrt(dx * dx + dy * dy);\n const maxDist = Math.sqrt(cx * cx + cy * cy);\n const spiral = Math.sin(angle * 3 + dist / maxDist * Math.PI * 8 - t * 3) * 0.5 + 0.5;\n return 0.15 + 0.85 * spiral;\n }\n case 'typewriter': {\n // Reveals characters left-to-right, top-to-bottom in a looping sweep\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1); // 0-1 sweep\n const revealPoint = progress * totalCells * 1.3; // overshoot for full coverage\n const dist = cellIndex - revealPoint;\n if (dist > 0) return 0;\n const fade = Math.max(0, 1 + dist / (totalCells * 0.15));\n return Math.min(1, fade);\n }\n case 'scatter': {\n // Particles scatter outward from center then reform\n const scx = cols / 2;\n const scy = rows / 2;\n const sdx = x - scx;\n const sdy = y - scy;\n const sdist = Math.sqrt(sdx * sdx + sdy * sdy) / Math.sqrt(scx * scx + scy * scy);\n const phase = Math.sin(t * 1.5) * 0.5 + 0.5; // 0-1 oscillation\n const threshold = phase;\n if (sdist > threshold) {\n return Math.max(0, 1 - (sdist - threshold) * 3);\n }\n return 0.7 + 0.3 * Math.sin(sdist * 10 - t * 2);\n }\n case 'waveField':\n // waveField is handled as a full short-circuit in renderFrameToCanvas — never reaches here\n return 1;\n default:\n return 1;\n }\n}\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n * Now reads alpha channel for transparency support.\n */\nexport function imageToAsciiFrame(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: AsciiOptions,\n targetWidth?: number,\n targetHeight?: number\n): { frame: AsciiFrame; cols: number; rows: number } {\n const srcWidth = source instanceof HTMLVideoElement ? source.videoWidth : source.width;\n const srcHeight = source instanceof HTMLVideoElement ? source.videoHeight : source.height;\n\n if (srcWidth === 0 || srcHeight === 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const charAspect = 0.55;\n const cellW = options.fontSize * options.charSpacing;\n const cellH = options.fontSize / charAspect * options.charSpacing;\n\n const renderW = targetWidth || srcWidth;\n const renderH = targetHeight || srcHeight;\n const cols = Math.floor(renderW / cellW);\n const rows = Math.floor(renderH / cellH);\n\n if (cols <= 0 || rows <= 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const { ctx } = createOffscreenCanvas(cols, rows);\n ctx.drawImage(source, 0, 0, cols, rows);\n const imageData = ctx.getImageData(0, 0, cols, rows);\n const pixels = imageData.data;\n\n const frame: AsciiFrame = [];\n\n for (let y = 0; y < rows; y++) {\n const row: AsciiCell[] = [];\n for (let x = 0; x < cols; x++) {\n const i = (y * cols + x) * 4;\n const r = pixels[i];\n const g = pixels[i + 1];\n const b = pixels[i + 2];\n const a = pixels[i + 3]; // Alpha channel\n\n const lum = 0.299 * r + 0.587 * g + 0.114 * b;\n const adjustedLum = adjustLuminance(lum, options.brightness, options.contrast);\n const ditheredLum = applyDither(adjustedLum, x, y, options.ditherStrength);\n const char = options.customText\n ? customTextToChar(ditheredLum, options.customText, x, y, cols, options.invert)\n : luminanceToChar(ditheredLum, options.charset, options.invert);\n\n row.push({ char, r, g, b, a });\n }\n frame.push(row);\n }\n\n return { frame, cols, rows };\n}\n\n/**\n * Extract frames from a video element for ASCII animation.\n */\nexport async function videoToAsciiFrames(\n video: HTMLVideoElement,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n targetFps: number = 12,\n maxDuration: number = 10,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const duration = Math.min(video.duration, maxDuration);\n const totalFrames = Math.ceil(duration * targetFps);\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n for (let i = 0; i < totalFrames; i++) {\n const time = (i / targetFps);\n if (time > duration) break;\n\n video.currentTime = time;\n await new Promise<void>((resolve) => {\n const handler = () => {\n video.removeEventListener('seeked', handler);\n resolve();\n };\n video.addEventListener('seeked', handler);\n });\n\n const result = imageToAsciiFrame(video, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n onProgress?.((i + 1) / totalFrames);\n }\n\n return { frames, cols, rows, fps: targetFps };\n}\n\n/**\n * Extract frames from an animated GIF file buffer.\n * Uses gifuct-js to parse and decompress GIF frames, then composites\n * them onto a canvas (handling disposal methods) to produce full frames.\n */\nexport async function gifToAsciiFrames(\n buffer: ArrayBuffer,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const gif = parseGIF(buffer);\n const rawFrames = decompressFrames(gif, true);\n\n if (rawFrames.length === 0) {\n return { frames: [], cols: 0, rows: 0, fps: 10 };\n }\n\n const gifW = rawFrames[0].dims.width;\n const gifH = rawFrames[0].dims.height;\n\n // Use the full GIF logical screen size for compositing\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n // Compositing canvas (full GIF size)\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n // Previous frame canvas for restore-to-previous disposal\n const prevCanvas = document.createElement('canvas');\n prevCanvas.width = logicalW;\n prevCanvas.height = logicalH;\n const prevCtx = prevCanvas.getContext('2d')!;\n\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n // Calculate average delay to determine FPS\n let totalDelay = 0;\n for (const f of rawFrames) {\n totalDelay += (f.delay || 100);\n }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n // Limit frames to avoid memory issues (cap at ~300 frames)\n const maxFrames = Math.min(rawFrames.length, 300);\n\n for (let i = 0; i < maxFrames; i++) {\n const f = rawFrames[i];\n const { dims, patch, disposalType } = f;\n\n // Save state before drawing (for disposal type 3 = restore to previous)\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n // Create ImageData for this frame's patch\n const frameImageData = new ImageData(patch, dims.width, dims.height);\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = dims.width;\n tempCanvas.height = dims.height;\n const tempCtx = tempCanvas.getContext('2d')!;\n tempCtx.putImageData(frameImageData, 0, 0);\n\n // Draw patch onto compositing canvas at the correct position\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n // Now sample the composited canvas\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n // Handle disposal\n if (disposalType === 2) {\n // Dispose to background (clear the patch area)\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n // Restore to previous\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n // disposalType 0 or 1 = leave as is (do nothing)\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Smoothstep easing for premium falloff curves.\n */\nfunction smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\n/**\n * Compute premium hover effects for a cell — writes results into\n * the reusable _hoverResult object to avoid per-cell allocation.\n * Uses the HoverEffect mode to vary the behaviour.\n */\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nfunction computeHoverEffect(\n nx: number,\n ny: number,\n hoverX: number,\n hoverY: number,\n hoverIntensity: number,\n strength: number,\n cellW: number,\n cellH: number,\n effect: import('./types').HoverEffect = 'spotlight',\n radiusFactor: number = 0.5\n): typeof _hoverResult {\n const dx = nx - hoverX;\n const dy = ny - hoverY;\n const distSq = dx * dx + dy * dy;\n\n // Dynamic radius — radiusFactor (0-1) maps to visual influence area\n const radius = (0.08 + radiusFactor * 0.35) + strength * 0.04;\n\n if (distSq >= radius * radius) {\n _hoverResult.scale = 1;\n _hoverResult.offsetX = 0;\n _hoverResult.offsetY = 0;\n _hoverResult.glow = 0;\n _hoverResult.colorBlend = 0;\n _hoverResult.proximity = 0;\n return _hoverResult;\n }\n\n const dist = Math.sqrt(distSq);\n const t = 1 - dist / radius;\n const eased = smoothstep(t) * hoverIntensity;\n\n let scale = 1;\n let offsetX = 0;\n let offsetY = 0;\n let glow = 0;\n let colorBlend = 0;\n\n switch (effect) {\n case 'spotlight': {\n scale = 1 + eased * strength * 1.8;\n const angle = Math.atan2(dy, dx);\n const pushForce = eased * eased * strength * 0.6;\n offsetX = Math.cos(angle) * pushForce * cellW;\n offsetY = Math.sin(angle) * pushForce * cellH;\n glow = eased * strength * 0.4;\n colorBlend = eased * eased * strength * 0.25;\n break;\n }\n case 'magnify':\n scale = 1 + eased * strength * 2.5;\n glow = eased * strength * 0.15;\n break;\n case 'repel': {\n scale = 1 + eased * strength * 0.3;\n const angle2 = Math.atan2(dy, dx);\n const push = eased * eased * strength * 1.2;\n offsetX = Math.cos(angle2) * push * cellW;\n offsetY = Math.sin(angle2) * push * cellH;\n break;\n }\n case 'glow':\n glow = eased * strength * 0.8;\n colorBlend = eased * strength * 0.4;\n break;\n case 'colorShift':\n scale = 1 + eased * strength * 0.4;\n glow = eased * strength * 0.2;\n colorBlend = eased * strength * 0.7;\n break;\n }\n\n _hoverResult.scale = scale;\n _hoverResult.offsetX = offsetX;\n _hoverResult.offsetY = offsetY;\n _hoverResult.glow = glow;\n _hoverResult.colorBlend = colorBlend;\n _hoverResult.proximity = eased;\n return _hoverResult;\n}\n\n/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n * Always renders every cell at full quality.\n *\n * Performance strategy:\n * - fillRect fast path for sub-6px text (30x faster than fillText)\n * - Auto-scaling hover radius: at high cell counts, the hover area\n * is proportionally smaller so fewer cells compute hover effects\n * - Hover bounding box early-exit skips cells outside the hover zone\n *\n * @param time - elapsed time in seconds for animation effects\n * @param hoverPos - optional smoothed mouse position {x, y, intensity} for hover effect\n */\nexport function renderFrameToCanvas(\n ctx: CanvasRenderingContext2D,\n frame: AsciiFrame,\n options: AsciiOptions,\n canvasWidth: number,\n canvasHeight: number,\n time: number = 0,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n) {\n // ── waveField short-circuit: render procedurally, ignore frame ──\n if (options.animationStyle === 'waveField') {\n const mouseNorm = hoverPos ? { x: hoverPos.x, y: hoverPos.y } : { x: 0.5, y: 0.5 };\n const acHexWF = (options.accentColor || '#d4ff00').replace('#', '');\n const wfAccentR = parseInt(acHexWF.substring(0, 2), 16) || 212;\n const wfAccentG = parseInt(acHexWF.substring(2, 4), 16) || 255;\n const wfAccentB = parseInt(acHexWF.substring(4, 6), 16) || 0;\n renderWaveBackground(ctx, canvasWidth, canvasHeight, time, mouseNorm, {\n accentColor: `#${acHexWF}`,\n accentThreshold: 0.52,\n mouseInfluence: options.hoverStrength > 0 ? Math.min(1, 0.3 + options.hoverStrength * 0.5) : 0.55,\n mouseFalloff: 2.8,\n speed: options.animationSpeed,\n vortex: options.hoverStrength > 0,\n sparkles: true,\n breathe: true,\n });\n void wfAccentR; void wfAccentG; void wfAccentB;\n return;\n }\n\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n\n ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n\n // Quick transparency check — sparse sample\n let hasTransparency = false;\n const sampleStepY = Math.max(1, rows >> 2);\n const sampleStepX = Math.max(1, cols >> 2);\n outer:\n for (let sampleY = 0; sampleY < rows; sampleY += sampleStepY) {\n const row = frame[sampleY];\n for (let sampleX = 0; sampleX < cols; sampleX += sampleStepX) {\n if (row[sampleX].a < 200) { hasTransparency = true; break outer; }\n }\n }\n\n if (!hasTransparency) {\n ctx.fillStyle = '#0a0a0a';\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n }\n\n const cellW = canvasWidth / cols;\n const cellH = canvasHeight / rows;\n const totalCells = rows * cols;\n\n const hoverIntensity = hoverPos?.intensity ?? 1;\n // When animation is active at high cell counts, disable hover to keep FPS up.\n // Animation already re-renders every cell every frame (expensive trig per cell);\n // adding hover on top doubles the math for cells in the hover zone.\n const animationActive = options.animationStyle !== 'none';\n const suppressHover = animationActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!(hoverPos && options.hoverStrength > 0 && hoverIntensity > 0.005);\n\n // Parse hover color once\n const hc = options.hoverColor || '#ffffff';\n const hcR = parseInt(hc.slice(1, 3), 16) || 255;\n const hcG = parseInt(hc.slice(3, 5), 16) || 255;\n const hcB = parseInt(hc.slice(5, 7), 16) || 255;\n\n // Pre-parse accent color once\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n const acR = parseInt(acHex.substring(0, 2), 16) || 255;\n const acG = parseInt(acHex.substring(2, 4), 16) || 255;\n const acB = parseInt(acHex.substring(4, 6), 16) || 255;\n\n // Auto-scale hover radius based on cell count for consistent performance.\n // At high cell counts the user's radius slider value is scaled down so the\n // hover zone stays a reasonable size (fewer cells to compute effects for).\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6\n : 1;\n const effectiveHoverRadius = options.hoverRadius * radiusScale;\n\n // Pre-compute hover bounding box in grid coords for early-exit\n let hoverMinCol = 0, hoverMaxCol = cols, hoverMinRow = 0, hoverMaxRow = rows;\n let hoverPosX = 0, hoverPosY = 0;\n if (hoverActive && hoverPos) {\n hoverPosX = hoverPos.x;\n hoverPosY = hoverPos.y;\n const hoverNormRadius = (0.08 + effectiveHoverRadius * 0.35) + options.hoverStrength * 0.04;\n hoverMinCol = Math.max(0, Math.floor((hoverPosX - hoverNormRadius) * cols) - 1);\n hoverMaxCol = Math.min(cols, Math.ceil((hoverPosX + hoverNormRadius) * cols) + 1);\n hoverMinRow = Math.max(0, Math.floor((hoverPosY - hoverNormRadius) * rows) - 1);\n hoverMaxRow = Math.min(rows, Math.ceil((hoverPosY + hoverNormRadius) * rows) + 1);\n }\n\n // Cache options lookups outside the inner loop\n const animStyle = options.animationStyle;\n const animSpeed = options.animationSpeed;\n const noAnimation = animStyle === 'none';\n const hoverStrength = options.hoverStrength;\n const hoverEffect = options.hoverEffect;\n const hoverRadiusFactor = effectiveHoverRadius;\n const isInverted = options.invert;\n const colorMode = options.colorMode;\n const TWO_PI = Math.PI * 2;\n const invCols = 1 / cols;\n const invRows = 1 / rows;\n\n // Track last canvas state to skip redundant calls\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n // ─── Dots Render Mode ───\n const maxRadius = Math.min(cellW, cellH) * 0.5 * options.dotSizeRatio;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.a < 10) continue;\n\n const lum = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) * 0.00392156863;\n const intensity = isInverted ? 1 - lum : lum;\n if (intensity < 0.02) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n\n // ─── Hover Effect ───\n let hoverMul = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverMul = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const radius = maxRadius * intensity * animMul * hoverMul;\n if (radius < 0.3) continue;\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n // Compute fill color\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n\n if (radius <= 3) {\n const d = radius * 2;\n ctx.fillRect(px - radius, py - radius, d, d);\n } else {\n ctx.beginPath();\n ctx.arc(px, py, radius, 0, TWO_PI);\n ctx.fill();\n }\n }\n }\n } else {\n // ─── ASCII Text Render Mode ───\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n\n // Below 6px, characters are illegible — use fast fillRect with weight modulation\n // This turns 30K slow fillText calls into fast fillRect calls (30x speedup)\n const useFastRect = fontSize < 6;\n\n if (!useFastRect) {\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n\n // Pre-build character weight map for fillRect mode\n // Maps each charset char to its visual density (0.1 – 1.0)\n let charWeights: Record<string, number> | null = null;\n if (useFastRect) {\n charWeights = {};\n const cs = options.charset;\n const csLen = cs.length;\n for (let i = 0; i < csLen; i++) {\n charWeights[cs[i]] = Math.max(0.1, (i + 0.3) / csLen);\n }\n }\n\n const baseTransform = !useFastRect ? ctx.getTransform() : null;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.char === ' ' || cell.a < 10) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n if (animMul < 0.05) continue;\n\n // ─── Hover Effect ───\n let hoverScale = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverScale = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n if (useFastRect) {\n // ─── Fast fillRect path (sub-6px text) ───\n const weight = charWeights![cell.char] ?? 0.5;\n const effAlpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow)) * weight;\n if (effAlpha < 0.02) continue;\n if (effAlpha !== lastAlpha) { ctx.globalAlpha = effAlpha; lastAlpha = effAlpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n const rw = cellW * hoverScale;\n const rh = cellH * hoverScale;\n ctx.fillRect(px - rw * 0.5, py - rh * 0.5, rw, rh);\n } else {\n // ─── Standard fillText path ───\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n if (hoverScale !== 1) {\n ctx.translate(px, py);\n ctx.scale(hoverScale, hoverScale);\n ctx.fillText(cell.char, 0, 0);\n ctx.setTransform(baseTransform!);\n } else {\n ctx.fillText(cell.char, px, py);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n\n/**\n * Serialize a frame to a compact base64 string.\n *\n * Encoding (chosen by colorMode):\n * fullcolor → 4 bytes/cell: [r, g, b, a]\n * otherwise → 2 bytes/cell: [luma, a] (grayscale/matrix/accent)\n *\n * The first byte of the buffer is a stride marker (2 or 4) so the runtime\n * can auto-detect the format without extra options.\n * Charcode is NEVER stored — the runtime recomputes it from luma + charset.\n */\nfunction serializeFrame(frame: AsciiFrame, fullColor: boolean): string {\n const rows = frame.length;\n const cols = rows > 0 ? frame[0].length : 0;\n // Alpha is always 255 for solid content — omit it to halve grayscale data.\n // stride=1: luma only, stride=3: r,g,b only. Header byte stores stride.\n const stride = fullColor ? 3 : 1;\n // 1 header byte + rows*cols*stride\n const buf = new Uint8Array(1 + rows * cols * stride);\n buf[0] = stride; // stride marker\n let i = 1;\n for (let y = 0; y < rows; y++) {\n for (let x = 0; x < cols; x++) {\n const cell = frame[y][x];\n if (fullColor) {\n buf[i++] = cell.r;\n buf[i++] = cell.g;\n buf[i++] = cell.b;\n } else {\n buf[i++] = Math.round(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b);\n }\n }\n }\n let binary = '';\n for (let j = 0; j < buf.length; j++) binary += String.fromCharCode(buf[j]);\n return btoa(binary);\n}\n\n/**\n * Build the animation multiplier function as an inlined JS string\n * matching the engine's getAnimationMultiplier.\n */\nfunction buildAnimFnJS(style: AnimationStyle, speed: number): string {\n if (style === 'none' || style === 'waveField') return 'function(){return 1}';\n return `function(x,y,cols,rows,t){\n var s=${speed},T=t*s;\n ${style === 'wave' ? `var w=Math.sin(x/cols*Math.PI*4+T*3)*.5+.5,w2=Math.sin(y/rows*Math.PI*3+T*2)*.5+.5;return .3+.7*(w*.6+w2*.4);` : ''}${style === 'pulse' ? `var cx=cols/2,cy=rows/2,d=Math.sqrt((x-cx)*(x-cx)+(y-cy)*(y-cy)),m=Math.sqrt(cx*cx+cy*cy);return .2+.8*(Math.sin(d/m*Math.PI*6-T*4)*.5+.5);` : ''}${style === 'rain' ? `return .1+.9*(Math.sin(y/rows*Math.PI*8-T*5+x*.3)*.5+.5)*(Math.sin(x/cols*Math.PI*2+T)*.3+.7);` : ''}${style === 'breathe' ? `return Math.max(.1,Math.min(1,Math.sin(T*2)*.3+.7+Math.sin((x+y)*.1+T)*.1));` : ''}${style === 'sparkle' ? `var h=Math.sin(x*127.1+y*311.7+Math.floor(T*8)*43758.5453)*43758.5453;var sp=h-Math.floor(h);return sp>.7?1:.15+sp*.4;` : ''}${style === 'glitch' ? `var b=Math.floor(y/(rows*.05)),gh=Math.sin(b*43.23+Math.floor(T*6)*17.89)*43758.5453,gv=gh-Math.floor(gh);if(gv>.85){var fl=Math.sin(T*30+b)*.5+.5;return fl<.3?0:fl}return 1;` : ''}${style === 'spiral' ? `var cx=cols/2,cy=rows/2,dx=x-cx,dy=y-cy,a=Math.atan2(dy,dx),d=Math.sqrt(dx*dx+dy*dy),m=Math.sqrt(cx*cx+cy*cy);return .15+.85*(Math.sin(a*3+d/m*Math.PI*8-T*3)*.5+.5);` : ''}${style === 'typewriter' ? `var tc=cols*rows,ci=y*cols+x,p=(T*.5)%1,rp=p*tc*1.3,dd=ci-rp;if(dd>0)return 0;return Math.min(1,Math.max(0,1+dd/(tc*.15)));` : ''}${style === 'scatter' ? `var cx=cols/2,cy=rows/2,dx=x-cx,dy=y-cy,sd=Math.sqrt(dx*dx+dy*dy)/Math.sqrt(cx*cx+cy*cy),ph=Math.sin(T*1.5)*.5+.5;if(sd>ph)return Math.max(0,1-(sd-ph)*3);return .7+.3*Math.sin(sd*10-T*2);` : ''}\n}`;\n}\n\n/**\n * Build inline JS for resolving cell color based on color mode.\n */\nfunction buildColorFnJS(options: AsciiOptions): string {\n switch (options.colorMode) {\n case 'fullcolor':\n return `function(c){return 'rgb('+c.r+','+c.g+','+c.b+')'}`;\n case 'matrix':\n return `function(c){var b=Math.floor(.299*c.r+.587*c.g+.114*c.b);return 'rgb(0,'+b+',0)'}`;\n case 'accent': {\n const hex = options.accentColor.replace('#', '');\n const ar = parseInt(hex.substring(0, 2), 16);\n const ag = parseInt(hex.substring(2, 4), 16);\n const ab = parseInt(hex.substring(4, 6), 16);\n return `function(c){var b=(.299*c.r+.587*c.g+.114*c.b)/255;return 'rgb('+Math.floor(${ar}*b)+','+Math.floor(${ag}*b)+','+Math.floor(${ab}*b)+')'}`;\n }\n default:\n return `function(c){var g=Math.floor(.299*c.r+.587*c.g+.114*c.b);return 'rgb('+g+','+g+','+g+')'}`;\n }\n}\n\n// ─── Simple one-call API ──────────────────────────────────────────\n\nexport interface AsciifySimpleOptions {\n /** Character size in pixels. Default: 10 */\n fontSize?: number;\n /** Art style preset. Default: 'classic' */\n style?: ArtStyle;\n /** Extra options to merge on top of the preset */\n options?: Partial<AsciiOptions>;\n}\n\n/**\n * Convert an image/video/canvas element to ASCII art and render it onto a canvas.\n *\n * @example\n * const img = document.querySelector('img');\n * const canvas = document.querySelector('canvas');\n * await asciify(img, canvas);\n *\n * @example with options\n * await asciify(img, canvas, { fontSize: 8, style: 'letters' });\n */\nexport async function asciify(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<void> {\n // Resolve string → HTMLImageElement\n let el: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n if (typeof source === 'string') {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error(`Failed to load image: ${source}`));\n img.src = source;\n });\n el = img;\n } else if (source instanceof HTMLImageElement && !source.complete) {\n await new Promise<void>((resolve, reject) => {\n source.onload = () => resolve();\n source.onerror = () => reject(new Error('Image failed to load'));\n });\n el = source;\n } else {\n el = source;\n }\n\n const preset = ART_STYLE_PRESETS[style];\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...preset, ...options, fontSize };\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frame } = imageToAsciiFrame(el, merged, canvas.width, canvas.height);\n renderFrameToCanvas(ctx, frame, merged, canvas.width, canvas.height);\n}\n\n/**\n * Fetch a GIF, convert it to ASCII, and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyGif('animation.gif', canvas);\n * // later: stop();\n *\n * @example with style\n * const stop = await asciifyGif('animation.gif', canvas, { style: 'letters' });\n */\nexport async function asciifyGif(\n source: string | ArrayBuffer,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n const buffer = typeof source === 'string'\n ? await fetch(source).then(r => r.arrayBuffer())\n : source;\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await gifToAsciiFrames(buffer, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n\n/**\n * Convert a video element to ASCII art and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const video = document.querySelector('video');\n * const stop = await asciifyVideo(video, canvas);\n * // later: stop();\n *\n * @example with style\n * const stop = await asciifyVideo(video, canvas, { fontSize: 8, style: 'art' });\n */\nexport async function asciifyVideo(\n source: HTMLVideoElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n let video: HTMLVideoElement;\n if (typeof source === 'string') {\n video = document.createElement('video');\n video.crossOrigin = 'anonymous';\n video.src = source;\n await new Promise<void>((resolve, reject) => {\n video.onloadeddata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${source}`));\n });\n } else {\n video = source;\n }\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await videoToAsciiFrames(video, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n\nconst EMBED_CDN_VERSION = '1.0.12';\n\n/** Build the compact options object for the CDN embed runtime. */\nfunction buildEmbedOpts(\n options: AsciiOptions,\n rows: number,\n cols: number,\n width: number,\n height: number,\n fps?: number,\n animated?: boolean\n): string {\n const o: Record<string, unknown> = {\n r: rows, c: cols, w: width, h: height,\n cs: options.charset,\n cm: options.colorMode,\n as: options.animationStyle,\n sp: options.animationSpeed,\n inv: options.invert,\n hs: options.hoverStrength,\n hr: options.hoverRadius,\n he: options.hoverEffect,\n hc: options.hoverColor,\n dr: options.dotSizeRatio,\n dots: options.renderMode === 'dots',\n };\n if (options.colorMode === 'accent') o.ac = options.accentColor;\n if (fps !== undefined) o.fps = fps;\n if (animated) o.anim = true;\n return JSON.stringify(o);\n}\n\nconst CDN_SCRIPT = `<script src=\"https://cdn.jsdelivr.net/npm/asciify-engine@${EMBED_CDN_VERSION}/dist/embed.js\" async><\\/script>`;\n\n/**\n * Generate a clean embed snippet.\n *\n * Structure:\n * <canvas id> — the render target, short and clean\n * <script type=json id> — frame data lives here, clearly separated\n * <script src=cdn> — always the same line, cached by browsers\n *\n * Output (static):\n * <!-- Asciify Embed -->\n * <canvas id=\"ar-xxx\" data-asciify-opts=\"{…}\" width=\"…\" height=\"…\"></canvas>\n * <script type=\"application/json\" id=\"ar-xxx-d\">\"BASE64\"</script>\n * <script src=\"cdn/embed.js\" async></script>\n * <!-- /Asciify Embed -->\n */\nexport function generateEmbedCode(\n frame: AsciiFrame,\n options: AsciiOptions,\n width: number,\n height: number\n): string {\n const rows = frame.length;\n if (rows === 0) return '';\n const cols = frame[0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const data = serializeFrame(frame, isFullColor);\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height);\n\n return `<!-- Asciify Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">\"${data}\"</script>\n${CDN_SCRIPT}\n<!-- /Asciify Embed -->`;\n}\n\n/**\n * Generate an animated embed snippet for multi-frame (GIF/video) ASCII art.\n * Uses the same CDN runtime as generateEmbedCode.\n */\nexport function generateAnimatedEmbedCode(\n frames: AsciiFrame[],\n options: AsciiOptions,\n fps: number,\n width: number,\n height: number\n): string {\n if (frames.length === 0) return '';\n const rows = frames[0].length;\n const cols = frames[0][0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const allData = frames.map(f => serializeFrame(f, isFullColor));\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height, fps, true);\n\n return `<!-- Asciify Animated Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">${JSON.stringify(allData)}</script>\n${CDN_SCRIPT}\n<!-- /Asciify Animated Embed -->`;\n}\n\n// ─── Wave Background ──────────────────────────────────────────────\n\nexport interface WaveBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Character aspect ratio width/height (default: 0.62) */\n charAspect?: number;\n /** Line height multiplier (default: 1.4) */\n lineHeightRatio?: number;\n /** Character set from dark→bright (default: ' .·:;=+*#%@░▒▓') */\n chars?: string;\n /** Base colour for low-intensity cells — use '{a}' as alpha placeholder (default: white) */\n baseColor?: string;\n /** Accent colour applied near the cursor and on wave peaks (default: '#d4ff00') */\n accentColor?: string;\n /** Accent threshold: normalised intensity above which accent kicks in (default: 0.52) */\n accentThreshold?: number;\n /** How strongly the mouse influences local intensity (default: 0.55) */\n mouseInfluence?: number;\n /** Radial falloff for mouse influence — higher = tighter spotlight (default: 2.8) */\n mouseFalloff?: number;\n /** Base wave animation speed (default: 1) */\n speed?: number;\n /** Enable vortex swirl effect around cursor (default: true) */\n vortex?: boolean;\n /** Enable sparkle / pop flicker layered on top (default: true) */\n sparkles?: boolean;\n /** Enable a slow global breathe pulse (default: true) */\n breathe?: boolean;\n /** Light mode: swap fill colours to dark-on-light (default: false) */\n lightMode?: boolean;\n}\n\n// ─── Smooth noise helpers (value-noise via polynomial hash) ────────\nfunction _fade(t: number): number { return t * t * t * (t * (t * 6 - 15) + 10); }\nfunction _lerp(a: number, b: number, t: number): number { return a + (b - a) * t; }\n\n// Fast 2-D hash → pseudo-random gradient value between -1 and 1\nfunction _hash2(ix: number, iy: number): number {\n let n = ix * 127 + iy * 311;\n n = ((n >> 13) ^ n);\n return (((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 0x3fffffff) - 1;\n}\n\n// Single octave value noise, inputs should be floats\nfunction _vnoise(x: number, y: number): number {\n const ix = Math.floor(x), iy = Math.floor(y);\n const fx = x - ix, fy = y - iy;\n const ux = _fade(fx), uy = _fade(fy);\n const v00 = _hash2(ix, iy );\n const v10 = _hash2(ix + 1, iy );\n const v01 = _hash2(ix, iy + 1);\n const v11 = _hash2(ix + 1, iy + 1);\n return _lerp(_lerp(v00, v10, ux), _lerp(v01, v11, ux), uy); // -1..1\n}\n\n// 3-octave FBM (fractal Brownian motion) — adds richness to flat sine waves\nfunction _fbm(x: number, y: number): number {\n return (\n _vnoise(x, y ) * 0.500 +\n _vnoise(x * 2.1, y * 2.1) * 0.250 +\n _vnoise(x * 4.3, y * 4.3) * 0.125\n ) / 0.875; // normalise amplitude sum → roughly -1..1\n}\n\n/**\n * Render a procedural interactive wave-field of ASCII characters.\n *\n * Layers stacked per cell:\n * 1. Three cardinal sine waves (classic feel)\n * 2. Fractal Brownian Motion noise (organic structure)\n * 3. Diagonal drift ripple (depth / perspective)\n * 4. Slow global breathe pulse (heartbeat)\n * 5. Vortex swirl near cursor (energy field)\n * 6. Proximity spotlight (cursor highlight)\n * 7. Sparkle flickers on bright peaks (life)\n *\n * Call inside a requestAnimationFrame loop with accumulated time in seconds\n * and the current normalised mouse position {x, y} (0-1 range each).\n *\n * @example\n * ```ts\n * import { renderWaveBackground } from 'asciify-engine';\n *\n * const canvas = document.getElementById('bg') as HTMLCanvasElement;\n * const ctx = canvas.getContext('2d')!;\n * const mouse = { x: 0.5, y: 0.5 };\n * canvas.addEventListener('mousemove', e => {\n * const r = canvas.getBoundingClientRect();\n * mouse.x = (e.clientX - r.left) / r.width;\n * mouse.y = (e.clientY - r.top) / r.height;\n * });\n *\n * let t = 0;\n * const tick = () => {\n * renderWaveBackground(ctx, canvas.clientWidth, canvas.clientHeight, t, mouse);\n * t += 0.016;\n * requestAnimationFrame(tick);\n * };\n * requestAnimationFrame(tick);\n * ```\n */\nexport function renderWaveBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: WaveBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n charAspect = 0.62,\n lineHeightRatio = 1.4,\n chars = ' .:-=+*#%@',\n baseColor = null as string | null,\n accentColor = '#d4ff00',\n accentThreshold = 0.52,\n mouseInfluence = 0.55,\n mouseFalloff = 2.8,\n speed = 1,\n vortex = true,\n sparkles = true,\n breathe = true,\n lightMode = false,\n } = options;\n\n const charW = fontSize * charAspect;\n const lineH = fontSize * lineHeightRatio;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const mx = mousePos.x;\n const my = mousePos.y;\n\n // parse accent colour once per call\n let acR = 212, acG = 255, acB = 0;\n if (accentColor) {\n const hex = accentColor.replace('#', '');\n if (hex.length === 6) {\n acR = parseInt(hex.slice(0, 2), 16);\n acG = parseInt(hex.slice(2, 4), 16);\n acB = parseInt(hex.slice(4, 6), 16);\n }\n }\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n\n // ── Layer 4: global breathe — slow sinusoidal pulsation ──\n const breatheAmp = breathe ? (Math.sin(t * 0.22) * 0.5 + 0.5) * 0.12 : 0;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n const ny = row / rows;\n\n // ── Layer 1: three cardinal sine waves ──\n const w1 = Math.sin(col * 0.08 + row * 0.05 + t * 0.60) * 0.5 + 0.5;\n const w2 = Math.sin(col * 0.03 - row * 0.07 + t * 0.40) * 0.5 + 0.5;\n const w3 = Math.sin(col * 0.05 + row * 0.03 + t * 0.80) * 0.5 + 0.5;\n const sinePart = (w1 + w2 + w3) / 3;\n\n // ── Layer 2: FBM noise (slowly drifting) ──\n const noiseScale = 0.045;\n const noiseShift = t * 0.08;\n const noisePart = (_fbm(col * noiseScale + noiseShift, row * noiseScale * 1.4 - noiseShift * 0.7) * 0.5 + 0.5);\n\n // ── Layer 3: diagonal drift ripple ──\n const driftFreq = 0.06;\n const driftPart = Math.sin((col + row * 0.65) * driftFreq + t * 1.1) * 0.5 + 0.5;\n\n // Blend wave layers with weights\n const wavePart = sinePart * 0.45 + noisePart * 0.35 + driftPart * 0.20 + breatheAmp;\n\n // ── Layer 5: vortex swirl near cursor ──\n const dxRaw = nx - mx;\n const dyRaw = ny - my;\n const distRaw = Math.sqrt(dxRaw * dxRaw + dyRaw * dyRaw);\n let vortexBump = 0;\n if (vortex && distRaw < 0.35) {\n const angle = Math.atan2(dyRaw, dxRaw);\n const swirl = Math.sin(angle * 4 + t * 2.2 - distRaw * 14);\n const falloff = Math.max(0, 1 - distRaw / 0.35);\n vortexBump = swirl * falloff * falloff * 0.22;\n }\n\n // ── Layer 6: proximity spotlight ──\n const proximity = Math.max(0, 1 - distRaw * mouseFalloff);\n\n const intensity = (\n wavePart * (1 - mouseInfluence) +\n (proximity + vortexBump * 0.5) * mouseInfluence\n ) + vortexBump * 0.15;\n\n const clamped = Math.min(1, Math.max(0, intensity));\n\n // ── Layer 7: sparkle flicker on bright peaks ──\n let finalIntensity = clamped;\n if (sparkles && clamped > 0.72) {\n // rare random pop — deterministic per cell+time bucket so it doesn't jitter every frame\n const bucket = Math.floor(t * 8);\n const sparkleSeed = _hash2(col * 7 + bucket * 3, row * 11 + bucket);\n if (sparkleSeed > 0.88) {\n finalIntensity = Math.min(1, clamped + (sparkleSeed - 0.88) * 4);\n }\n }\n\n const charIdx = Math.floor(finalIntensity * (chars.length - 1));\n if (chars[charIdx] === ' ') continue;\n\n const alpha = 0.015 + finalIntensity * 0.07;\n const isAccent = finalIntensity > accentThreshold;\n\n if (isAccent) {\n const accentAlpha = Math.min(lightMode ? 0.40 : 0.28, alpha * (lightMode ? 4 : 2.8));\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${accentAlpha})`;\n } else if (baseColor) {\n ctx.fillStyle = baseColor.replace('{a}', String(alpha));\n } else if (lightMode) {\n ctx.fillStyle = `rgba(0,0,0,${alpha * 1.3})`;\n } else {\n ctx.fillStyle = `rgba(255,255,255,${alpha})`;\n }\n\n ctx.fillText(chars[charIdx], col * charW, row * lineH);\n }\n }\n}\n// ─── asciiBackground ─────────────────────────────────────────────\n/**\n * Drop-in helper that mounts an interactive ASCII wave background onto any\n * element. Injects a canvas, wires DPR resize, mouse tracking, and the RAF\n * loop — all internally. Auto-detects light/dark mode and stays in sync if\n * the system theme changes.\n *\n * Returns a `destroy()` function to clean everything up.\n *\n * @example\n * ```ts\n * import { asciiBackground } from 'asciify-engine';\n *\n * // 1 line:\n * const { destroy } = asciiBackground('#hero', { opacity: 0.2 });\n *\n * // Custom color:\n * asciiBackground('#hero', { color: '#6b8700', accentColor: '#d4ff00' });\n *\n * // React — return destroy as cleanup:\n * useEffect(() => asciiBackground(ref.current).destroy, []);\n * ```\n */\nexport interface AsciiBackgroundOptions extends WaveBackgroundOptions {\n /** CSS opacity applied to the canvas element (default: 0.2) */\n opacity?: number;\n /** Extra CSS class names added to the injected canvas */\n className?: string;\n /** z-index of the canvas (default: 0) */\n zIndex?: number;\n /**\n * Colour scheme handling (default: 'auto').\n * - 'auto' — follows the system prefers-color-scheme and updates live\n * - 'dark' — always render dark-on-dark (bright chars on dark bg)\n * - 'light' — always render dark chars on light background\n */\n colorScheme?: 'auto' | 'light' | 'dark';\n /**\n * Custom character colour. Accepts any CSS colour string: hex, rgb(), hsl().\n * When set, overrides the default white/black colour for the ASCII chars.\n * The accent colour remains separate — use `accentColor` to change it.\n * @example '#6b8700'\n */\n color?: string;\n}\n\n/** Parse a hex or rgb CSS colour string into { r, g, b }. Returns null on failure. */\nfunction _parseColor(c: string): { r: number; g: number; b: number } | null {\n // Hex: #rrggbb or #rgb\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n // rgb(r,g,b) or rgba(r,g,b,a)\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\nexport function asciiBackground(\n target: string | HTMLElement | null,\n options: AsciiBackgroundOptions = {},\n): { destroy: () => void } {\n const {\n opacity = 0.2,\n className,\n zIndex = 0,\n colorScheme = 'auto',\n color,\n ...renderOpts\n } = options;\n\n const container = typeof target === 'string'\n ? (document.querySelector(target) as HTMLElement | null)\n : target;\n\n if (!container) {\n console.warn('[asciify] asciiBackground: target not found', target);\n return { destroy: () => {} };\n }\n\n // Ensure container is a positioning parent\n const prevPosition = container.style.position;\n if (getComputedStyle(container).position === 'static') {\n container.style.position = 'relative';\n }\n\n const canvas = document.createElement('canvas');\n canvas.style.cssText = [\n 'position:absolute',\n 'inset:0',\n 'width:100%',\n 'height:100%',\n `opacity:${opacity}`,\n 'pointer-events:none',\n `z-index:${zIndex}`,\n ].join(';');\n if (className) canvas.className = className;\n container.prepend(canvas);\n\n const ctx = canvas.getContext('2d')!;\n const dpr = window.devicePixelRatio || 1;\n const mouse = { x: 0.5, y: 0.5 };\n const smoothMouse = { x: 0.5, y: 0.5 };\n\n // ── Color scheme helpers ──\n const mq = window.matchMedia('(prefers-color-scheme: light)');\n const isLight = (): boolean => {\n if (colorScheme === 'light') return true;\n if (colorScheme === 'dark') return false;\n return mq.matches; // 'auto'\n };\n\n // Build baseColor from `color` option — replaces white/black default\n let parsedColor: { r: number; g: number; b: number } | null = null;\n if (color) parsedColor = _parseColor(color);\n\n const buildOpts = (): WaveBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n baseColor: parsedColor\n ? `rgba(${parsedColor.r},${parsedColor.g},${parsedColor.b},{a})`\n : renderOpts.baseColor,\n });\n\n const optsRef = { current: buildOpts() };\n\n // Re-compute when system theme changes (only matters in 'auto' mode)\n const onSchemeChange = () => { optsRef.current = buildOpts(); };\n if (colorScheme === 'auto') mq.addEventListener('change', onSchemeChange);\n\n const resize = () => {\n const r = container.getBoundingClientRect();\n canvas.width = r.width * dpr;\n canvas.height = r.height * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n };\n resize();\n\n const onMouseMove = (e: MouseEvent) => {\n const r = container.getBoundingClientRect();\n mouse.x = (e.clientX - r.left) / r.width;\n mouse.y = (e.clientY - r.top) / r.height;\n };\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n window.addEventListener('mousemove', onMouseMove);\n\n let time = 0;\n let raf = 0;\n const tick = () => {\n smoothMouse.x += (mouse.x - smoothMouse.x) * 0.07;\n smoothMouse.y += (mouse.y - smoothMouse.y) * 0.07;\n const r = container.getBoundingClientRect();\n renderWaveBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current);\n time += 0.016;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n\n return {\n destroy: () => {\n cancelAnimationFrame(raf);\n ro.disconnect();\n if (colorScheme === 'auto') mq.removeEventListener('change', onSchemeChange);\n window.removeEventListener('mousemove', onMouseMove);\n canvas.remove();\n container.style.position = prevPosition;\n },\n };\n}\n\n/** @deprecated Use `asciiBackground` instead. */\nexport const mountWaveBackground = asciiBackground;\n/** @deprecated Use `AsciiBackgroundOptions` instead. */\nexport type MountWaveOptions = AsciiBackgroundOptions;\n","// ─── Asciify WebGL Renderer ───────────────────────────────────────\n// GPU-accelerated drop-in replacement for renderFrameToCanvas.\n// All cells rendered in ONE instanced draw call per frame.\n// Animation + hover effects computed entirely in GLSL shaders.\n// No glyph atlas — uses solid rect/dots per cell (matches Canvas2D fillRect fast path).\n// Falls back gracefully to null if WebGL2 is unavailable.\n\nimport type { AsciiFrame, AsciiOptions } from './types';\n\n// ─── Types ────────────────────────────────────────────────────────\n\nexport interface WebGLRenderer {\n render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void;\n /** Call when options or the source frame has changed to invalidate cell data cache. */\n notifyDirty(): void;\n destroy(): void;\n}\n\n// ─── Vertex Shader ────────────────────────────────────────────────\n// One instance = one cell. Position, animation, hover, color all computed on GPU.\n// Cell data arrives as a single RGBA8 texture:\n// .rgb = cell color (normalized 0-1)\n// .a = char weight (0=space/invisible … 1=densest char, fully opaque)\n\nconst VERT_SRC = /* glsl */`#version 300 es\nprecision highp float;\nprecision highp int;\n\n// Unit quad corners: (-0.5,-0.5) to (0.5,0.5) - TRIANGLE_STRIP, 4 verts\nin vec2 a_corner;\n\n// Layout\nuniform vec2 u_canvasSize;\nuniform vec2 u_gridSize;\nuniform vec2 u_cellSize;\n\n// Animation\nuniform float u_time;\nuniform float u_animSpeed;\nuniform int u_animStyle;\n\n// Color\nuniform int u_colorMode;\nuniform vec3 u_accentColor;\nuniform int u_invert;\n\n// Hover\nuniform float u_hoverStrength;\nuniform float u_hoverIntensity;\nuniform vec2 u_hoverPos;\nuniform float u_hoverRadius;\nuniform int u_hoverEffect;\nuniform vec3 u_hoverColor;\n\n// Render mode: 0=rect 1=dots\nuniform int u_renderMode;\nuniform float u_dotSizeRatio;\n\n// Cell data: RGBA8 texture (cols x rows)\n// rgb = cell colour, a = source alpha\nuniform sampler2D u_cellTex;\n\nout vec4 v_color;\nout float v_alpha;\nout vec2 v_localUv;\n\n#define PI 3.141592653589793\n\nfloat ss(float t) { return t * t * (3.0 - 2.0 * t); }\n\nfloat getAnim(float nx, float ny, float cx, float cy, float t) {\n if (u_animStyle == 0) return 1.0;\n if (u_animStyle == 1) { // wave\n return 0.3 + 0.7 * (sin(nx * PI * 4.0 + t * 3.0) * 0.3 + 0.5\n + sin(ny * PI * 3.0 + t * 2.0) * 0.2);\n }\n if (u_animStyle == 2) { // pulse\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.2 + 0.8 * (sin(d * PI * 6.0 - t * 4.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 3) { // rain\n float drop = sin(ny * PI * 8.0 - t * 5.0 + cx * 0.3) * 0.5 + 0.5;\n return 0.1 + 0.9 * drop * (sin(nx * PI * 2.0 + t) * 0.3 + 0.7);\n }\n if (u_animStyle == 4) { // breathe\n return clamp(sin(t * 2.0) * 0.3 + 0.7 + sin((cx + cy) * 0.1 + t) * 0.1, 0.1, 1.0);\n }\n if (u_animStyle == 5) { // sparkle\n float sp = fract(sin(cx * 127.1 + cy * 311.7 + floor(t * 8.0) * 43758.5453) * 43758.5453);\n return sp > 0.7 ? 1.0 : 0.15 + sp * 0.4;\n }\n if (u_animStyle == 6) { // glitch\n float band = floor(cy / max(1.0, u_gridSize.y * 0.05));\n float gv = fract(sin(band * 43.23 + floor(t * 6.0) * 17.89) * 43758.5453);\n if (gv > 0.85) { float fl = sin(t * 30.0 + band) * 0.5 + 0.5; return fl < 0.3 ? 0.0 : fl; }\n return 1.0;\n }\n if (u_animStyle == 7) { // spiral\n float angle = atan(ny - 0.5, nx - 0.5);\n float dist = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.15 + 0.85 * (sin(angle * 3.0 + dist * PI * 8.0 - t * 3.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 8) { // typewriter\n float reveal = fract(t * 0.5) * u_gridSize.x * u_gridSize.y * 1.3;\n float dist = cy * u_gridSize.x + cx - reveal;\n if (dist > 0.0) return 0.0;\n return clamp(1.0 + dist / (u_gridSize.x * u_gridSize.y * 0.15), 0.0, 1.0);\n }\n if (u_animStyle == 9) { // scatter\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n float phase = sin(t * 1.5) * 0.5 + 0.5;\n if (d > phase) return max(0.0, 1.0 - (d - phase) * 3.0);\n return 0.7 + 0.3 * sin(d * 10.0 - t * 2.0);\n }\n return 1.0;\n}\n\nvec3 applyColorMode(vec3 rgb) {\n float lum = dot(rgb, vec3(0.299, 0.587, 0.114));\n if (u_colorMode == 0) return vec3(lum);\n if (u_colorMode == 2) return vec3(0.0, lum, 0.0);\n if (u_colorMode == 3) return lum * u_accentColor;\n return rgb;\n}\n\nvoid main() {\n int cols = int(u_gridSize.x);\n int rows = int(u_gridSize.y);\n int cx = gl_InstanceID % cols;\n int cy = gl_InstanceID / cols;\n\n float fnx = (float(cx) + 0.5) / float(cols);\n float fny = (float(cy) + 0.5) / float(rows);\n\n // Sample cell data\n vec4 cell = texture(u_cellTex, vec2(fnx, fny));\n // cell.rgb = colour, cell.a = source alpha (0=transparent, 1=opaque)\n\n // Invisible cells (fully transparent source pixel)\n if (cell.a < 0.004) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Char weight: 0=dark/space .. 1=dense/bright (luminance, matches luminanceToChar ordering)\n float charW = dot(cell.rgb, vec3(0.299, 0.587, 0.114));\n\n float cellW = u_cellSize.x;\n float cellH = u_cellSize.y;\n\n // Animation\n float t = u_time * u_animSpeed;\n float am = getAnim(fnx, fny, float(cx), float(cy), t);\n if (am < 0.04) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Hover\n float hoverScale = 1.0;\n vec2 hoverOff = vec2(0.0);\n float hoverGlow = 0.0;\n float hoverBlend = 0.0;\n\n if (u_hoverStrength > 0.0 && u_hoverIntensity > 0.005) {\n vec2 d = vec2(fnx - u_hoverPos.x, fny - u_hoverPos.y);\n float r = 0.08 + u_hoverRadius * 0.35 + u_hoverStrength * 0.04;\n float dist = length(d);\n if (dist < r) {\n float tv = 1.0 - dist / r;\n float e = ss(tv) * u_hoverIntensity;\n if (u_hoverEffect == 0) { // spotlight\n hoverScale = 1.0 + e * u_hoverStrength * 1.8;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 0.6 * vec2(cellW, cellH);\n hoverGlow = e * u_hoverStrength * 0.4;\n hoverBlend = e * e * u_hoverStrength * 0.25;\n } else if (u_hoverEffect == 1) { // magnify\n hoverScale = 1.0 + e * u_hoverStrength * 2.5;\n hoverGlow = e * u_hoverStrength * 0.15;\n } else if (u_hoverEffect == 2) { // repel\n hoverScale = 1.0 + e * u_hoverStrength * 0.3;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 1.2 * vec2(cellW, cellH);\n } else if (u_hoverEffect == 3) { // glow\n hoverGlow = e * u_hoverStrength * 0.8;\n hoverBlend = e * u_hoverStrength * 0.4;\n } else { // colorShift\n hoverScale = 1.0 + e * u_hoverStrength * 0.4;\n hoverGlow = e * u_hoverStrength * 0.2;\n hoverBlend = e * u_hoverStrength * 0.7;\n }\n }\n }\n\n // Final colour\n vec3 rgb = (u_invert == 1) ? (1.0 - cell.rgb) : cell.rgb;\n vec3 baseColor = applyColorMode(rgb);\n v_color = vec4(mix(baseColor, u_hoverColor, hoverBlend), 1.0);\n\n // Quad size & alpha\n vec2 quadSize;\n float finalAlpha;\n\n if (u_renderMode == 1) { // dots: radius driven by char weight (bright=big dot)\n float maxR = min(cellW, cellH) * 0.5 * u_dotSizeRatio;\n float radius = maxR * charW * am * hoverScale;\n if (radius < 0.3) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(radius * 2.0);\n finalAlpha = min(1.0, cell.a * am * (1.0 + hoverGlow));\n } else { // rect: size proportional to luminance — dark=tiny, bright=full (ASCII density look)\n if (charW < 0.01) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(cellW * charW * hoverScale, cellH * charW * hoverScale);\n finalAlpha = min(1.0, am * (1.0 + hoverGlow));\n }\n\n v_alpha = finalAlpha;\n v_localUv = a_corner;\n\n // NDC position (Y flipped: WebGL bottom-up, canvas top-down)\n float px = float(cx) * cellW + cellW * 0.5 + hoverOff.x;\n float py = float(cy) * cellH + cellH * 0.5 + hoverOff.y;\n vec2 pos = vec2(px, py) + a_corner * quadSize;\n vec2 ndc = pos / u_canvasSize * 2.0 - 1.0;\n ndc.y = -ndc.y;\n gl_Position = vec4(ndc, 0.0, 1.0);\n}\n`;\n\n// ─── Fragment Shader ──────────────────────────────────────────────\n\nconst FRAG_SRC = /* glsl */`#version 300 es\nprecision mediump float;\nprecision highp int;\n\nin vec4 v_color;\nin float v_alpha;\nin vec2 v_localUv;\n\nuniform int u_renderMode;\n\nout vec4 outColor;\n\nvoid main() {\n if (v_alpha < 0.01) discard;\n if (u_renderMode == 1) {\n // Dots: circle SDF clip\n if (length(v_localUv) > 0.5) discard;\n }\n outColor = vec4(v_color.rgb, v_alpha);\n}\n`;\n\n// ─── WebGL Helpers ────────────────────────────────────────────────\n\nfunction compileShader(gl: WebGL2RenderingContext, type: number, src: string): WebGLShader {\n const sh = gl.createShader(type)!;\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (!gl.getShaderParameter(sh, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(sh) ?? 'unknown';\n gl.deleteShader(sh);\n throw new Error(`Shader compile error: ${info}`);\n }\n return sh;\n}\n\nfunction linkProgram(gl: WebGL2RenderingContext, vert: WebGLShader, frag: WebGLShader): WebGLProgram {\n const prog = gl.createProgram()!;\n gl.attachShader(prog, vert);\n gl.attachShader(prog, frag);\n gl.linkProgram(prog);\n if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(prog) ?? 'unknown';\n gl.deleteProgram(prog);\n throw new Error(`Program link error: ${info}`);\n }\n return prog;\n}\n\nfunction makeTexture(gl: WebGL2RenderingContext, filter: number = gl.NEAREST): WebGLTexture {\n const t = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, t);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n return t;\n}\n\n// ─── Animation / color / hover index maps ────────────────────────\nconst ANIM_STYLES = ['none','wave','pulse','rain','breathe','sparkle','glitch','spiral','typewriter','scatter','waveField'] as const;\nconst HOVER_EFFECTS = ['spotlight','magnify','repel','glow','colorShift'] as const;\nconst COLOR_MODES = ['grayscale','fullcolor','matrix','accent'] as const;\n\n// ─── Main Factory ─────────────────────────────────────────────────\n\n/**\n * Try to create a WebGL2 renderer for the given canvas.\n * Returns null if WebGL2 is unavailable (caller can then use Canvas2D).\n * On setup failure after context is claimed, returns a stub that clears to dark.\n */\nexport function tryCreateWebGLRenderer(canvas: HTMLCanvasElement): WebGLRenderer | null {\n const glOrNull = canvas.getContext('webgl2', {\n alpha: true,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n }) as WebGL2RenderingContext | null;\n\n if (!glOrNull) return null;\n const gl: WebGL2RenderingContext = glOrNull; // non-null, stable in closures\n\n try {\n // ─── Compile shaders ─────────────────────────────────────────\n const vert = compileShader(gl, gl.VERTEX_SHADER, VERT_SRC);\n const frag = compileShader(gl, gl.FRAGMENT_SHADER, FRAG_SRC);\n const prog = linkProgram(gl, vert, frag);\n gl.deleteShader(vert);\n gl.deleteShader(frag);\n\n // ─── VAO: unit quad (TRIANGLE_STRIP, 4 vertices) ─────────────\n const vao = gl.createVertexArray()!;\n gl.bindVertexArray(vao);\n\n const corners = new Float32Array([-0.5,-0.5, 0.5,-0.5, -0.5,0.5, 0.5,0.5]);\n const vbo = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n gl.bufferData(gl.ARRAY_BUFFER, corners, gl.STATIC_DRAW);\n\n const aCorner = gl.getAttribLocation(prog, 'a_corner');\n gl.enableVertexAttribArray(aCorner);\n gl.vertexAttribPointer(aCorner, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindVertexArray(null);\n\n // ─── Single cell data texture (RGBA8: rgb=colour, a=charWeight 0-255) ─\n const cellTex = makeTexture(gl);\n\n // ─── Cached uniform locations ─────────────────────────────────\n const g = (n: string) => gl.getUniformLocation(prog, n)!;\n const u = {\n canvasSize: g('u_canvasSize'),\n gridSize: g('u_gridSize'),\n cellSize: g('u_cellSize'),\n time: g('u_time'),\n animSpeed: g('u_animSpeed'),\n animStyle: g('u_animStyle'),\n colorMode: g('u_colorMode'),\n accentColor: g('u_accentColor'),\n invert: g('u_invert'),\n hoverStrength: g('u_hoverStrength'),\n hoverIntensity:g('u_hoverIntensity'),\n hoverPos: g('u_hoverPos'),\n hoverRadius: g('u_hoverRadius'),\n hoverEffect: g('u_hoverEffect'),\n hoverColor: g('u_hoverColor'),\n renderMode: g('u_renderMode'),\n dotSizeRatio: g('u_dotSizeRatio'),\n cellTexU: g('u_cellTex'),\n };\n\n // ─── State ────────────────────────────────────────────────────\n let lastCols = 0;\n let lastRows = 0;\n let cellBuf = new Uint8Array(0); // rgba: rgb=colour, a=sourceAlpha\n let cellDataDirty = true;\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // ─── Render ───────────────────────────────────────────────────\n function render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void {\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n if (cols === 0) return;\n\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\n // Clear to dark or transparent based on source alpha\n let hasTransparency = false;\n const sy = Math.max(1, rows >> 2), sx = Math.max(1, cols >> 2);\n outer: for (let iy = 0; iy < rows; iy += sy)\n for (let ix = 0; ix < cols; ix += sx)\n if (frame[iy][ix].a < 200) { hasTransparency = true; break outer; }\n gl.clearColor(hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 1.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Re-allocate cell buffer when grid changes\n if (cols !== lastCols || rows !== lastRows) {\n cellBuf = new Uint8Array(cols * rows * 4);\n lastCols = cols;\n lastRows = rows;\n cellDataDirty = true;\n }\n\n // Upload cell data (rgb = colour, a = char weight 0-255)\n if (cellDataDirty) {\n for (let y = 0; y < rows; y++) {\n const row = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = row[x];\n const i = (y * cols + x) * 4;\n cellBuf[i] = cell.r;\n cellBuf[i + 1] = cell.g;\n cellBuf[i + 2] = cell.b;\n // alpha channel = source alpha (used for transparency masking in shader)\n cellBuf[i + 3] = cell.a;\n }\n }\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, cols, rows, 0,\n gl.RGBA, gl.UNSIGNED_BYTE, cellBuf);\n cellDataDirty = false;\n }\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n\n gl.useProgram(prog);\n gl.bindVertexArray(vao);\n\n const cellW = displayW / cols;\n const cellH = displayH / rows;\n\n gl.uniform2f(u.canvasSize, displayW, displayH);\n gl.uniform2f(u.gridSize, cols, rows);\n gl.uniform2f(u.cellSize, cellW, cellH);\n gl.uniform1f(u.time, time);\n gl.uniform1f(u.animSpeed, options.animationSpeed);\n gl.uniform1i(u.animStyle, ANIM_STYLES.indexOf(options.animationStyle));\n gl.uniform1i(u.colorMode, COLOR_MODES.indexOf(options.colorMode));\n\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n gl.uniform3f(u.accentColor,\n parseInt(acHex.slice(0, 2), 16) / 255,\n parseInt(acHex.slice(2, 4), 16) / 255,\n parseInt(acHex.slice(4, 6), 16) / 255);\n gl.uniform1i(u.invert, options.invert ? 1 : 0);\n\n const totalCells = rows * cols;\n const animActive = options.animationStyle !== 'none';\n const suppressHover = animActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!hoverPos && options.hoverStrength > 0;\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6 : 1;\n\n gl.uniform1f(u.hoverStrength, hoverActive ? options.hoverStrength : 0);\n gl.uniform1f(u.hoverIntensity, hoverActive ? (hoverPos?.intensity ?? 0) : 0);\n gl.uniform2f(u.hoverPos, hoverPos?.x ?? 0.5, hoverPos?.y ?? 0.5);\n gl.uniform1f(u.hoverRadius, options.hoverRadius * radiusScale);\n gl.uniform1i(u.hoverEffect, HOVER_EFFECTS.indexOf(options.hoverEffect));\n const hc = options.hoverColor || '#ffffff';\n gl.uniform3f(u.hoverColor,\n parseInt(hc.slice(1, 3), 16) / 255,\n parseInt(hc.slice(3, 5), 16) / 255,\n parseInt(hc.slice(5, 7), 16) / 255);\n\n gl.uniform1i(u.renderMode, options.renderMode === 'dots' ? 1 : 0);\n gl.uniform1f(u.dotSizeRatio, options.dotSizeRatio);\n gl.uniform1i(u.cellTexU, 0);\n\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, cols * rows);\n gl.bindVertexArray(null);\n }\n\n return {\n render,\n notifyDirty() { cellDataDirty = true; },\n destroy() {\n gl.deleteProgram(prog);\n gl.deleteVertexArray(vao);\n gl.deleteBuffer(vbo);\n gl.deleteTexture(cellTex);\n },\n };\n\n } catch (err) {\n console.error('[asciify] WebGL renderer setup FAILED (returning stub):', err);\n const stub: WebGLRenderer = {\n render() {\n try { gl.clearColor(0.039, 0.039, 0.039, 1); gl.clear(gl.COLOR_BUFFER_BIT); } catch { /* */ }\n },\n notifyDirty() {},\n destroy() {},\n };\n return stub;\n }\n}\n"]}
|