image-to-pixel 3.0.1 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -69
- package/dist/editor.css +1 -1
- package/dist/editor.css.map +2 -2
- package/dist/editor.esm.js +54 -54
- package/dist/editor.esm.js.map +4 -4
- package/dist/image-to-pixel.bundle.esm.js +16 -16
- package/dist/image-to-pixel.bundle.esm.js.map +3 -3
- package/dist/image-to-pixel.cjs +13 -9
- package/dist/image-to-pixel.cjs.map +2 -2
- package/dist/image-to-pixel.esm.js +13 -9
- package/dist/image-to-pixel.esm.js.map +2 -2
- package/dist/image-to-pixel.js +13 -9
- package/dist/image-to-pixel.js.map +2 -2
- package/dist/image-to-pixel.min.js +11 -11
- package/dist/image-to-pixel.min.js.map +3 -3
- package/dist/video.esm.js +2 -2
- package/dist/video.esm.js.map +4 -4
- package/lib/core/video/audio.js +159 -0
- package/lib/core/video/frames.js +52 -7
- package/lib/core/video/mux-mp4.js +320 -131
- package/lib/core/video/mux-webm.js +168 -127
- package/lib/editor/exporter.js +103 -21
- package/lib/editor/icons.js +65 -61
- package/lib/editor/index.js +288 -30
- package/lib/editor/inspector.js +66 -15
- package/lib/editor/library.js +188 -182
- package/lib/editor/storyboard.js +566 -0
- package/lib/editor/styles/editor.css +71 -1
- package/lib/editor/timeline-preview.js +142 -0
- package/lib/editor/workspace.js +62 -0
- package/lib/index.js +31 -31
- package/lib/video.js +122 -92
- package/package.json +92 -92
- package/types/index.d.ts +2 -0
- package/types/video.d.ts +99 -43
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../lib/core/color.js", "../lib/core/palette/parse.js", "../lib/core/palette/lospec.js", "../lib/index.js", "../lib/core/palette/builtin.js", "../lib/core/settings.js", "../lib/core/plan.js", "../lib/core/dither/bluenoise-data.js", "../lib/core/dither/matrices.js", "../lib/core/dither/kernels.js", "../lib/core/palette/extract.js", "../lib/core/cpu/stages.js", "../lib/core/cpu/pipeline.js", "../lib/core/gpu/backend.js", "../lib/core/gpu/shaders.js", "../lib/core/source.js", "../lib/core/export/scale.js", "../lib/core/export/canvas.js", "../lib/core/export/crc32.js", "../lib/core/export/png.js", "../lib/core/engine.js", "../lib/core/presets.js", "../lib/core/export/gif.js", "../lib/core/export/zip.js", "../lib/core/export/sheet.js", "../lib/core/video/frames.js"],
|
|
4
|
-
"sourcesContent": ["// Colour helpers shared by the CPU path, the GPU uniforms and the editor.\r\n// All channel values are sRGB in 0..1 unless a name says otherwise.\r\n\r\n/** Parse '#rgb', '#rrggbb', '#rrggbbaa', 'rrggbb' or [r,g,b] (0..255) into [r, g, b] bytes. */\r\nexport function parseColor(c) {\r\n if (Array.isArray(c)) return [c[0] | 0, c[1] | 0, c[2] | 0];\r\n let s = String(c).trim().replace(/^#|^0x/i, '');\r\n if (s.length === 3 || s.length === 4) s = s.slice(0, 3).split('').map(ch => ch + ch).join('');\r\n if (!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(s)) throw new Error(`Invalid colour \"${c}\"`);\r\n return [parseInt(s.slice(0, 2), 16), parseInt(s.slice(2, 4), 16), parseInt(s.slice(4, 6), 16)];\r\n}\r\n\r\n/** True when `c` parses as a colour. */\r\nexport function isColor(c) {\r\n try { parseColor(c); return true; } catch { return false; }\r\n}\r\n\r\n/** [r, g, b] bytes \u2192 '#rrggbb'. */\r\nexport function toHex(rgb) {\r\n return '#' + rgb.slice(0, 3).map(v => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0')).join('');\r\n}\r\n\r\n/** Normalise any colour to '#rrggbb' (lower case). */\r\nexport const normHex = c => toHex(parseColor(c));\r\n\r\nconst lin = c => (c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));\r\n\r\n/** sRGB (0..1) \u2192 OKLab [L, a, b]. Same maths as the GLSL `oklab()` in gpu/shaders.js. */\r\nexport function oklab(r, g, b) {\r\n r = lin(r); g = lin(g); b = lin(b);\r\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\r\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\r\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\r\n return [\r\n 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\r\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\r\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s,\r\n ];\r\n}\r\n\r\n/** Relative luminance-ish weight used by saturation (Rec. 709). */\r\nexport const LUMA = [0.2126, 0.7152, 0.0722];\r\n\r\n/** Perceived lightness 0..1 of a hex colour; handy for picking text colours on swatches. */\r\nexport function lightness(hex) {\r\n const [r, g, b] = parseColor(hex);\r\n return oklab(r / 255, g / 255, b / 255)[0];\r\n}\r\n\r\n/**\r\n * Average distance (sRGB 0..1) from each palette colour to its nearest neighbour.\r\n * Ordered dithering scales its threshold by this so `strength` means the same thing\r\n * for a 2-colour and a 64-colour palette.\r\n */\r\nexport function paletteSpread(rgbs) {\r\n if (rgbs.length < 2) return 1;\r\n let sum = 0;\r\n for (let i = 0; i < rgbs.length; i++) {\r\n let best = Infinity;\r\n for (let j = 0; j < rgbs.length; j++) {\r\n if (i === j) continue;\r\n const dr = rgbs[i][0] - rgbs[j][0], dg = rgbs[i][1] - rgbs[j][1], db = rgbs[i][2] - rgbs[j][2];\r\n const d = Math.sqrt(dr * dr + dg * dg + db * db);\r\n if (d < best) best = d;\r\n }\r\n sum += best;\r\n }\r\n return Math.max(0.04, Math.min(1, sum / rgbs.length / 255));\r\n}\r\n", "// Palette file formats. Every parser returns { name, colors: ['#rrggbb', \u2026] }.\r\n//\r\n// .gpl GIMP / Aseprite / Krita palette\r\n// .hex one hex colour per line (Lospec \"HEX file\")\r\n// .txt Paint.NET palette (AARRGGBB per line, ';' comments)\r\n// .pal JASC-PAL (Paint Shop Pro, Aseprite export)\r\n// .json Lospec JSON ({ name, colors: ['rrggbb'] }), this tool's own export, or a plain array\r\n// anything else: every #hex / 6-digit token found in the text\r\n\r\nimport { normHex } from '../color.js';\r\n\r\nconst dedupe = list => [...new Set(list)];\r\n\r\nexport function parseGPL(text) {\r\n const lines = text.split(/\\r?\\n/);\r\n if (!/^GIMP Palette/i.test(lines[0] || '')) throw new Error('Not a GIMP palette (missing \"GIMP Palette\" header)');\r\n let name = '';\r\n const colors = [];\r\n for (const raw of lines.slice(1)) {\r\n const line = raw.trim();\r\n if (!line || line.startsWith('#')) continue;\r\n const nm = /^Name:\\s*(.*)$/i.exec(line);\r\n if (nm) { name = nm[1].trim(); continue; }\r\n if (/^Columns:/i.test(line)) continue;\r\n const m = /^(\\d{1,3})\\s+(\\d{1,3})\\s+(\\d{1,3})/.exec(line);\r\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\r\n }\r\n return { name, colors };\r\n}\r\n\r\nexport function parseHexList(text) {\r\n const colors = [];\r\n for (const raw of text.split(/\\r?\\n/)) {\r\n const line = raw.trim();\r\n if (!line || line.startsWith(';') || line.startsWith('//')) continue;\r\n const m = /^#?([0-9a-f]{6}|[0-9a-f]{8}|[0-9a-f]{3})\\b/i.exec(line);\r\n if (!m) continue;\r\n // 8 digits in a .txt palette are AARRGGBB (Paint.NET); in a .hex file they are rare, treat the same\r\n const h = m[1].length === 8 ? m[1].slice(2) : m[1];\r\n colors.push(normHex(h));\r\n }\r\n return { name: '', colors };\r\n}\r\n\r\nexport function parseJASC(text) {\r\n const lines = text.split(/\\r?\\n/).map(l => l.trim());\r\n if (lines[0] !== 'JASC-PAL') throw new Error('Not a JASC palette');\r\n const n = parseInt(lines[2], 10) || 0;\r\n const colors = [];\r\n for (let i = 3; i < 3 + n && i < lines.length; i++) {\r\n const m = /^(\\d+)\\s+(\\d+)\\s+(\\d+)/.exec(lines[i]);\r\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\r\n }\r\n return { name: '', colors };\r\n}\r\n\r\nexport function parseJSON(text) {\r\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\r\n const list = Array.isArray(obj) ? obj : (obj.colors || obj.palette || []);\r\n const colors = list.map(c => (typeof c === 'object' && c ? (c.hex || c.color) : c)).filter(Boolean).map(normHex);\r\n return { name: (!Array.isArray(obj) && obj.name) || '', colors };\r\n}\r\n\r\n/** Pull every hex-looking token out of free text (pasted CSS, a tweet, a Lospec page). */\r\nexport function parseLoose(text) {\r\n const colors = [];\r\n const re = /#?\\b([0-9a-f]{6})\\b/gi;\r\n let m;\r\n while ((m = re.exec(text))) colors.push(normHex(m[1]));\r\n return { name: '', colors };\r\n}\r\n\r\n/**\r\n * Parse palette text by file name / content sniffing.\r\n * @param {string} text\r\n * @param {string} [filename]\r\n * @returns {{ name: string, colors: string[] }}\r\n */\r\nexport function parsePalette(text, filename = '') {\r\n const ext = (/\\.([a-z0-9]+)$/i.exec(filename) || [])[1]?.toLowerCase() || '';\r\n const t = String(text).replace(/^\uFEFF/, '');\r\n const trimmed = t.trim();\r\n let out;\r\n if (ext === 'gpl' || /^GIMP Palette/i.test(trimmed)) out = parseGPL(trimmed);\r\n else if (ext === 'pal' || trimmed.startsWith('JASC-PAL')) out = parseJASC(trimmed);\r\n else if (ext === 'json' || trimmed.startsWith('{') || trimmed.startsWith('[')) out = parseJSON(trimmed);\r\n else if (ext === 'hex' || ext === 'txt') out = parseHexList(trimmed);\r\n else {\r\n out = parseHexList(trimmed);\r\n if (!out.colors.length) out = parseLoose(trimmed);\r\n }\r\n out.colors = dedupe(out.colors).slice(0, 256);\r\n if (!out.name && filename) out.name = filename.replace(/\\.[^.]+$/, '').replace(/[-_]+/g, ' ');\r\n if (!out.colors.length) throw new Error('No colours found in that palette');\r\n return out;\r\n}\r\n\r\n/** Palette \u2192 .gpl text. */\r\nexport function toGPL(name, colors) {\r\n const rows = colors.map(c => {\r\n const h = normHex(c);\r\n const r = parseInt(h.slice(1, 3), 16), g = parseInt(h.slice(3, 5), 16), b = parseInt(h.slice(5, 7), 16);\r\n return `${String(r).padStart(3)} ${String(g).padStart(3)} ${String(b).padStart(3)}\\t${h.slice(1)}`;\r\n });\r\n return `GIMP Palette\\nName: ${name || 'Palette'}\\nColumns: 8\\n#\\n${rows.join('\\n')}\\n`;\r\n}\r\n\r\n/** Palette \u2192 .hex text. */\r\nexport const toHexFile = colors => colors.map(c => normHex(c).slice(1)).join('\\n') + '\\n';\r\n\r\n/** Palette \u2192 JSON text (Lospec-compatible shape). */\r\nexport const toPaletteJSON = (name, colors) => JSON.stringify({ name: name || 'Palette', colors: colors.map(c => normHex(c).slice(1)) }, null, 2);\r\n", "// Lospec palette lookup by slug, e.g. 'rgbg-36' from https://lospec.com/palette-list/rgbg-36\r\n\r\nimport { parseJSON } from './parse.js';\r\n\r\n/** Turn a slug or a full Lospec URL into a slug. */\r\nexport function lospecSlug(input) {\r\n const s = String(input || '').trim();\r\n const m = /palette-list\\/([a-z0-9-]+)/i.exec(s);\r\n return (m ? m[1] : s).toLowerCase().replace(/\\.(json|hex|gpl)$/, '');\r\n}\r\n\r\n/**\r\n * Fetch a palette from Lospec. Needs network access; the editor caches results.\r\n * @returns {Promise<{ name: string, colors: string[], author?: string, slug: string }>}\r\n */\r\nexport async function fetchLospec(slugOrUrl, { fetch: f = globalThis.fetch } = {}) {\r\n const slug = lospecSlug(slugOrUrl);\r\n if (!/^[a-z0-9-]+$/.test(slug)) throw new Error('That does not look like a Lospec palette slug');\r\n const res = await f(`https://lospec.com/palette-list/${slug}.json`);\r\n if (!res.ok) throw new Error(`Lospec returned ${res.status} for \"${slug}\"`);\r\n const json = await res.json();\r\n const p = parseJSON(json);\r\n return { name: json.name || slug, author: json.author || '', colors: p.colors, slug };\r\n}\r\n", "// image-to-pixel core: no UI. Works in browsers (WebGL 2 via ShaderMate, CPU fallback) and,\n// for { width, height, data } inputs, in Node on the CPU.\n\nexport { createPixelator, pixelate, makeResult } from './core/engine.js';\nexport {\n DEFAULTS, DITHER_METHODS, SETTINGS_VERSION, MAX_SIZE, LEGACY_DITHER,\n defaultSettings, normalizeSettings, mergeSettings, resolveSize, ditherKind, cropRect, ASPECTS,\n encodeSettings, decodeSettings, compactSettings, settingsToJSON, settingsFromJSON,\n} from './core/settings.js';\nexport { makePlan } from './core/plan.js';\nexport { runCPU } from './core/cpu/pipeline.js';\nexport { PALETTES, getPalette } from './core/palette/builtin.js';\nexport { parsePalette, toGPL, toHexFile, toPaletteJSON } from './core/palette/parse.js';\nexport { extractPalette } from './core/palette/extract.js';\nexport { fetchLospec, lospecSlug } from './core/palette/lospec.js';\nexport { thresholdMap, parseMatrix, bayer } from './core/dither/matrices.js';\nexport { KERNELS } from './core/dither/kernels.js';\nexport { PRESETS, getPreset } from './core/presets.js';\nexport { parseColor, toHex, oklab } from './core/color.js';\nexport { toFrame, loadImage } from './core/source.js';\nexport { upscale, resizeNearest, uniqueColors, detectGrid, hasTransparency } from './core/export/scale.js';\nexport { toCanvas, downloadBlob } from './core/export/canvas.js';\nexport { encodePNG } from './core/export/png.js';\nexport { encodeGIF } from './core/export/gif.js';\nexport { createZip } from './core/export/zip.js';\nexport { packSpriteSheet, buildTileset } from './core/export/sheet.js';\nexport { forEachFrame, estimateFps, seekTo, frameTimes, videoReady, mediaError, sniffVideoCodec } from './core/video/frames.js';\n\n/* global __ITP_VERSION__ */\n// The build replaces __ITP_VERSION__ with package.json's version; unbundled source reports 'dev'.\nexport const VERSION = typeof __ITP_VERSION__ === 'string' ? __ITP_VERSION__ : 'dev';\n", "// Built-in palettes. Most come from Lospec (https://lospec.com/palette-list); credit to their authors.\r\n// The list matches the classic editor plus a few staples.\r\n\r\n/** @type {{ id: string, name: string, author: string, colors: string[] }[]} */\r\nexport const PALETTES = [\r\n { id: \"1-bit-monitor\", name: \"1-Bit Monitor\", author: \"\", colors: [\"222323\",\"f0f6f0\"] },\r\n { id: \"apollo\", name: \"Apollo\", author: \"AdamCYounis\", colors: [\"172038\",\"253a5e\",\"3c5e8b\",\"4f8fba\",\"73bed3\",\"a4dddb\",\"19332d\",\"25562e\",\"468232\",\"75a743\",\"a8ca58\",\"d0da91\",\"4d2b32\",\"7a4841\",\"ad7757\",\"c09473\",\"d7b594\",\"e7d5b3\",\"341c27\",\"602c2c\",\"884b2b\",\"be772b\",\"de9e41\",\"e8c170\",\"241527\",\"411d31\",\"752438\",\"a53030\",\"cf573c\",\"da863e\",\"1e1d39\",\"402751\",\"7a367b\",\"a23e8c\",\"c65197\",\"df84a5\",\"090a14\",\"10141f\",\"151d28\",\"202e37\",\"394a50\",\"577277\",\"819796\",\"a8b5b2\",\"c7cfcc\",\"ebede9\"] },\r\n { id: \"batpalette\", name: \"Batpalette\", author: \"el Rojaz\", colors: [\"000000\",\"7f7f7f\",\"ffffff\",\"681e99\",\"3f48cc\",\"88ff82\",\"bfa621\",\"cc3d18\"] },\r\n { id: \"beached-boogaloo\", name: \"Beached Boogaloo\", author: \".tomais\", colors: [\"ff0b20\",\"8f0434\",\"500037\",\"a0ff00\",\"57e71e\",\"0ea717\",\"057833\",\"2cdeef\",\"2483e7\",\"153ab7\",\"0d0a87\",\"ff0b88\",\"a60fff\",\"6409cf\",\"eaef30\",\"ff880b\",\"b75308\",\"802202\",\"000000\",\"231940\",\"514378\",\"ffffff\",\"73a3a7\",\"366770\",\"f7b771\",\"c77650\",\"974c38\",\"873939\",\"601e2c\",\"300c1f\"] },\r\n { id: \"cc-29\", name: \"CC-29\", author: \"Alpha6\", colors: [\"f2f0e5\",\"b8b5b9\",\"868188\",\"646365\",\"45444f\",\"3a3858\",\"212123\",\"352b42\",\"43436a\",\"4b80ca\",\"68c2d3\",\"a2dcc7\",\"ede19e\",\"d3a068\",\"b45252\",\"6a536e\",\"4b4158\",\"80493a\",\"a77b5b\",\"e5ceb4\",\"c2d368\",\"8ab060\",\"567b79\",\"4e584a\",\"7b7243\",\"b2b47e\",\"edc8c4\",\"cf8acb\",\"5f556a\"] },\r\n { id: \"cga-16\", name: \"CGA 16\", author: \"\", colors: [\"000000\",\"0000aa\",\"00aa00\",\"00aaaa\",\"aa0000\",\"aa00aa\",\"aa5500\",\"aaaaaa\",\"555555\",\"5555ff\",\"55ff55\",\"55ffff\",\"ff5555\",\"ff55ff\",\"ffff55\",\"ffffff\"] },\r\n { id: \"chaotic-neutral\", name: \"Chaotic neutral\", author: \"Dodecahedron \u2DFD\", colors: [\"e1d4cb\",\"c19f90\",\"a56457\",\"6d504d\",\"484044\",\"392b29\",\"31312f\",\"d8eef0\",\"97999f\",\"81a4c0\",\"6a7f92\",\"415973\",\"43425a\",\"45334b\",\"4b1f40\",\"671087\",\"955ab9\"] },\r\n { id: \"endesga-32\", name: \"Endesga 32\", author: \"ENDESGA\", colors: [\"be4a2f\",\"d77643\",\"ead4aa\",\"e4a672\",\"b86f50\",\"733e39\",\"3e2731\",\"a22633\",\"e43b44\",\"f77622\",\"feae34\",\"fee761\",\"63c74d\",\"3e8948\",\"265c42\",\"193c3e\",\"124e89\",\"0099db\",\"2ce8f5\",\"ffffff\",\"c0cbdc\",\"8b9bb4\",\"5a6988\",\"3a4466\",\"262b44\",\"181425\",\"ff0044\",\"68386c\",\"b55088\",\"f6757a\",\"e8b796\",\"c28569\"] },\r\n { id: \"fantasy-24\", name: \"Fantasy 24\", author: \"\", colors: [\"1f240a\",\"39571c\",\"a58c27\",\"efac28\",\"efd8a1\",\"ab5c1c\",\"183f39\",\"ef692f\",\"efb775\",\"a56243\",\"773421\",\"724113\",\"2a1d0d\",\"392a1c\",\"684c3c\",\"927e6a\",\"276468\",\"ef3a0c\",\"45230d\",\"3c9f9c\",\"9b1a0a\",\"36170c\",\"550f0a\",\"300f0a\"] },\r\n { id: \"game-boy-dmg\", name: \"Game Boy (DMG)\", author: \"\", colors: [\"0f380f\",\"306230\",\"8bac0f\",\"9bbc0f\"] },\r\n { id: \"grayscale-4\", name: \"Grayscale 4\", author: \"\", colors: [\"000000\",\"555555\",\"aaaaaa\",\"ffffff\"] },\r\n { id: \"hidden-library\", name: \"Hidden Library\", author: \"Pixel Hoo\", colors: [\"100b2a\",\"2a213a\",\"314743\",\"65856d\",\"adca9a\",\"ecfeca\",\"582d27\",\"974133\",\"d67654\",\"5d3441\",\"a3685b\",\"ffb379\",\"ffe6a9\",\"ffffff\"] },\r\n { id: \"intacto14\", name: \"Intacto14\", author: \"Anubi\", colors: [\"221529\",\"4b5561\",\"879ba3\",\"cbf5ef\",\"62b4de\",\"5660d6\",\"5b29a6\",\"d64562\",\"f2735c\",\"edbb8e\",\"ab6375\",\"522152\",\"37ada2\",\"8cde8c\"] },\r\n { id: \"journey\", name: \"Journey\", author: \"\uD83C\uDF4DPineappleOnPizza\uD83C\uDF4D\", colors: [\"050914\",\"110524\",\"3b063a\",\"691749\",\"9c3247\",\"d46453\",\"f5a15d\",\"ffcf8e\",\"ff7a7d\",\"ff417d\",\"d61a88\",\"94007a\",\"42004e\",\"220029\",\"100726\",\"25082c\",\"3d1132\",\"73263d\",\"bd4035\",\"ed7b39\",\"ffb84a\",\"fff540\",\"c6d831\",\"77b02a\",\"429058\",\"2c645e\",\"153c4a\",\"052137\",\"0e0421\",\"0c0b42\",\"032769\",\"144491\",\"488bd4\",\"78d7ff\",\"b0fff1\",\"faffff\",\"c7d4e1\",\"928fb8\",\"5b537d\",\"392946\",\"24142c\",\"0e0f2c\",\"132243\",\"1a466b\",\"10908e\",\"28c074\",\"3dff6e\",\"f8ffb8\",\"f0c297\",\"cf968c\",\"8f5765\",\"52294b\",\"0f022e\",\"35003b\",\"64004c\",\"9b0e3e\",\"d41e3c\",\"ed4c40\",\"ff9757\",\"d4662f\",\"9c341a\",\"691b22\",\"450c28\",\"2d002e\"] },\r\n { id: \"lospec500\", name: \"Lospec500\", author: \"\", colors: [\"10121c\",\"2c1e31\",\"6b2643\",\"ac2847\",\"ec273f\",\"94493a\",\"de5d3a\",\"e98537\",\"f3a833\",\"4d3533\",\"6e4c30\",\"a26d3f\",\"ce9248\",\"dab163\",\"e8d282\",\"f7f3b7\",\"1e4044\",\"006554\",\"26854c\",\"5ab552\",\"9de64e\",\"008b8b\",\"62a477\",\"a6cb96\",\"d3eed3\",\"3e3b65\",\"3859b3\",\"3388de\",\"36c5f4\",\"6dead6\",\"5e5b8c\",\"8c78a5\",\"b0a7b8\",\"deceed\",\"9a4d76\",\"c878af\",\"cc99ff\",\"fa6e79\",\"ffa2ac\",\"ffd1d5\",\"f6e8e0\",\"ffffff\"] },\r\n { id: \"nyx8\", name: \"Nyx8\", author: \"Javier Guerrero\", colors: [\"08141e\",\"0f2a3f\",\"20394f\",\"4e495f\",\"816271\",\"997577\",\"c3a38a\",\"f6d6bd\"] },\r\n { id: \"oil-6\", name: \"Oil 6\", author: \"\", colors: [\"fbf5ef\",\"f2d3ab\",\"c69fa5\",\"8b6d9c\",\"494d7e\",\"272744\"] },\r\n { id: \"pico-8\", name: \"PICO-8\", author: \"\", colors: [\"000000\",\"1d2b53\",\"7e2553\",\"008751\",\"ab5236\",\"5f574f\",\"c2c3c7\",\"fff1e8\",\"ff004d\",\"ffa300\",\"ffec27\",\"00e436\",\"29adff\",\"83769c\",\"ff77a8\",\"ffccaa\"] },\r\n { id: \"resurrect-64\", name: \"Resurrect 64\", author: \"Kerrie Lake\", colors: [\"2e222f\",\"3e3546\",\"625565\",\"966c6c\",\"ab947a\",\"694f62\",\"7f708a\",\"9babb2\",\"c7dcd0\",\"ffffff\",\"6e2727\",\"b33831\",\"ea4f36\",\"f57d4a\",\"ae2334\",\"e83b3b\",\"fb6b1d\",\"f79617\",\"f9c22b\",\"7a3045\",\"9e4539\",\"cd683d\",\"e6904e\",\"fbb954\",\"4c3e24\",\"676633\",\"a2a947\",\"d5e04b\",\"fbff86\",\"165a4c\",\"239063\",\"1ebc73\",\"91db69\",\"cddf6c\",\"313638\",\"374e4a\",\"547e64\",\"92a984\",\"b2ba90\",\"0b5e65\",\"0b8a8f\",\"0eaf9b\",\"30e1b9\",\"8ff8e2\",\"323353\",\"484a77\",\"4d65b4\",\"4d9be6\",\"8fd3ff\",\"45293f\",\"6b3e75\",\"905ea9\",\"a884f3\",\"eaaded\",\"753c54\",\"a24b6f\",\"cf657f\",\"ed8099\",\"831c5d\",\"c32454\",\"f04f78\",\"f68181\",\"fca790\",\"fdcbb0\"] },\r\n { id: \"slso8\", name: \"SLSO8\", author: \"Luis Miguel Maldonado\", colors: [\"0d2b45\",\"203c56\",\"544e68\",\"8d697a\",\"d08159\",\"ffaa5e\",\"ffd4a3\",\"ffecd6\"] },\r\n { id: \"sweet-canyon-extended-64\", name: \"Sweet Canyon Extended 64\", author: \"Mr Slime\", colors: [\"0f0e11\",\"2d2c33\",\"40404a\",\"51545c\",\"6b7179\",\"7c8389\",\"a8b2b6\",\"d5d5d5\",\"eeebe0\",\"f1dbb1\",\"eec99f\",\"e1a17e\",\"cc9562\",\"ab7b49\",\"9a643a\",\"86482f\",\"783a29\",\"6a3328\",\"541d29\",\"42192c\",\"512240\",\"782349\",\"8b2e5d\",\"a93e89\",\"d062c8\",\"ec94ea\",\"f2bdfc\",\"eaebff\",\"a2fafa\",\"64e7e7\",\"54cfd8\",\"2fb6c3\",\"2c89af\",\"25739d\",\"2a5684\",\"214574\",\"1f2966\",\"101445\",\"3c0d3b\",\"66164c\",\"901f3d\",\"bb3030\",\"dc473c\",\"ec6a45\",\"fb9b41\",\"f0c04c\",\"f4d66e\",\"fffb76\",\"ccf17a\",\"97d948\",\"6fba3b\",\"229443\",\"1d7e45\",\"116548\",\"0c4f3f\",\"0a3639\",\"251746\",\"48246d\",\"69189c\",\"9f20c0\",\"e527d2\",\"ff51cf\",\"ff7ada\",\"ff9edb\"] },\r\n { id: \"sweetie-16\", name: \"Sweetie 16\", author: \"\", colors: [\"1a1c2c\",\"5d275d\",\"b13e53\",\"ef7d57\",\"ffcd75\",\"a7f070\",\"38b764\",\"257179\",\"29366f\",\"3b5dc9\",\"41a6f6\",\"73eff7\",\"f4f4f4\",\"94b0c2\",\"566c86\",\"333c57\"] },\r\n { id: \"toxic-haze\", name: \"Toxic Haze\", author: \"sillyTheJester\", colors: [\"e5ff00\",\"b8d14a\",\"9ab06e\",\"708763\",\"4c5c52\",\"393e40\",\"242424\"] },\r\n { id: \"vinik24\", name: \"Vinik24\", author: \"Vinik\", colors: [\"000000\",\"6f6776\",\"9a9a97\",\"c5ccb8\",\"8b5580\",\"c38890\",\"a593a5\",\"666092\",\"9a4f50\",\"c28d75\",\"7ca1c0\",\"416aa3\",\"8d6268\",\"be955c\",\"68aca9\",\"387080\",\"6e6962\",\"93a167\",\"6eaa78\",\"557064\",\"9d9f7f\",\"7e9e99\",\"5d6872\",\"433455\"] },\r\n];\r\n\r\n/** Look a built-in palette up by id or name (case-insensitive). */\r\nexport function getPalette(idOrName) {\r\n const k = String(idOrName || \"\").toLowerCase();\r\n return PALETTES.find(p => p.id === k || p.name.toLowerCase() === k) || null;\r\n}\r\n", "// The settings object is the one contract between the engine, the editor, presets,\r\n// share links and saved JSON. Everything goes through normalizeSettings().\r\n\r\nimport { getPalette } from './palette/builtin.js';\r\nimport { normHex, isColor } from './color.js';\r\n\r\nexport const SETTINGS_VERSION = 1;\r\nexport const MAX_SIZE = 2048;\r\n\r\n/** Dither methods. `kind` decides which pipeline runs them. */\r\nexport const DITHER_METHODS = [\r\n { id: 'none', label: 'None', kind: 'none' },\r\n { id: 'bayer2', label: 'Bayer 2\u00D72', kind: 'ordered' },\r\n { id: 'bayer4', label: 'Bayer 4\u00D74', kind: 'ordered' },\r\n { id: 'bayer8', label: 'Bayer 8\u00D78', kind: 'ordered' },\r\n { id: 'bayer16', label: 'Bayer 16\u00D716', kind: 'ordered' },\r\n { id: 'cluster4', label: 'Clustered dot 4\u00D74', kind: 'ordered' },\r\n { id: 'cluster8', label: 'Clustered dot 8\u00D78', kind: 'ordered' },\r\n { id: 'lines', label: 'Horizontal lines', kind: 'ordered' },\r\n { id: 'bluenoise', label: 'Blue noise', kind: 'ordered' },\r\n { id: 'custom', label: 'Custom matrix', kind: 'ordered' },\r\n { id: 'floyd-steinberg', label: 'Floyd\u2013Steinberg', kind: 'diffusion' },\r\n { id: 'atkinson', label: 'Atkinson', kind: 'diffusion' },\r\n { id: 'sierra-lite', label: 'Sierra Lite', kind: 'diffusion' },\r\n { id: 'sierra', label: 'Sierra', kind: 'diffusion' },\r\n { id: 'burkes', label: 'Burkes', kind: 'diffusion' },\r\n { id: 'jarvis', label: 'Jarvis\u2013Judice\u2013Ninke', kind: 'diffusion' },\r\n { id: 'stucki', label: 'Stucki', kind: 'diffusion' },\r\n];\r\nexport const ditherKind = id => (DITHER_METHODS.find(m => m.id === id) || { kind: 'none' }).kind;\r\n\r\n/** Names the classic image-to-pixel.js used, mapped to the new ids. */\r\nexport const LEGACY_DITHER = {\r\n 'none': 'none', 'floyd-steinberg': 'floyd-steinberg', 'atkinson': 'atkinson',\r\n 'ordered': 'bayer8', '2x2 bayer': 'bayer2', '4x4 bayer': 'bayer4', 'clustered 4x4': 'cluster4',\r\n};\r\n\r\nexport const DEFAULTS = Object.freeze({\r\n version: SETTINGS_VERSION,\r\n size: { mode: 'width', width: 96, height: 0, block: 8, resample: 'box' },\r\n adjust: { brightness: 0, contrast: 0, saturation: 0, hue: 0, gamma: 1 },\r\n frame: { aspect: 'original', zoom: 1, x: 0.5, y: 0.5 },\r\n palette: { source: 'builtin', id: 'endesga-32', name: 'Endesga 32', colors: [], count: 16, distance: 'oklab' },\r\n dither: { method: 'bayer4', strength: 0.6, matrix: null },\r\n alpha: { threshold: 0.5 },\r\n cleanup: { orphans: false, smooth: false },\r\n outline: { mode: 'none', color: '#000000', corners: false },\r\n export: { size: 'scale', scale: 4, indexed: true, grid: false, gridColor: '#000000' },\r\n});\r\n\r\nconst clamp = (v, lo, hi, d) => {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? Math.min(hi, Math.max(lo, n)) : d;\r\n};\r\nconst oneOf = (v, list, d) => (list.includes(v) ? v : d);\r\nconst bool = (v, d) => (typeof v === 'boolean' ? v : d);\r\n\r\n/** Deep copy of the defaults (palette colours resolved). */\r\nexport function defaultSettings() {\r\n return normalizeSettings({});\r\n}\r\n\r\n/**\r\n * Fill in defaults, clamp ranges, resolve built-in palette colours and drop unknown keys.\r\n * Never throws on bad values; it falls back to the default for that field.\r\n * @param {object} input partial settings\r\n */\r\nexport function normalizeSettings(input = {}) {\r\n const d = DEFAULTS;\r\n const i = input || {};\r\n const s = {}; const size = i.size || {}; const adj = i.adjust || {}; const pal = i.palette || {};\r\n const dit = i.dither || {}; const al = i.alpha || {}; const cl = i.cleanup || {}; const ol = i.outline || {};\r\n const ex = i.export || {};\r\n\r\n s.version = SETTINGS_VERSION;\r\n s.size = {\r\n mode: oneOf(size.mode, ['width', 'block'], d.size.mode),\r\n width: Math.round(clamp(size.width, 1, MAX_SIZE, d.size.width)),\r\n height: Math.round(clamp(size.height, 0, MAX_SIZE, d.size.height)),\r\n block: clamp(size.block, 1, 256, d.size.block),\r\n resample: oneOf(size.resample, ['box', 'nearest'], d.size.resample),\r\n };\r\n s.adjust = {\r\n brightness: clamp(adj.brightness, -1, 1, 0),\r\n contrast: clamp(adj.contrast, -1, 1, 0),\r\n saturation: clamp(adj.saturation, -1, 1, 0),\r\n hue: clamp(adj.hue, -180, 180, 0),\r\n gamma: clamp(adj.gamma, 0.2, 5, 1),\r\n };\r\n const fr = i.frame || {};\r\n s.frame = {\r\n aspect: oneOf(fr.aspect, ASPECTS.map(a => a.id), 'original'),\r\n zoom: clamp(fr.zoom, 1, 8, 1),\r\n x: clamp(fr.x, 0, 1, 0.5),\r\n y: clamp(fr.y, 0, 1, 0.5),\r\n };\r\n\r\n const source = oneOf(pal.source, ['builtin', 'custom', 'extract', 'none'], d.palette.source);\r\n s.palette = {\r\n source,\r\n id: typeof pal.id === 'string' ? pal.id : (source === 'builtin' ? d.palette.id : ''),\r\n name: typeof pal.name === 'string' ? pal.name : '',\r\n colors: [],\r\n count: Math.round(clamp(pal.count, 2, 256, d.palette.count)),\r\n distance: oneOf(pal.distance, ['oklab', 'rgb'], d.palette.distance),\r\n };\r\n if (source === 'builtin') {\r\n const p = getPalette(s.palette.id) || getPalette(d.palette.id);\r\n s.palette.id = p.id; s.palette.name = p.name; s.palette.colors = p.colors.map(c => '#' + c);\r\n } else if (source === 'custom') {\r\n s.palette.colors = (Array.isArray(pal.colors) ? pal.colors : []).filter(isColor).map(normHex).slice(0, 256);\r\n if (!s.palette.colors.length) s.palette.colors = ['#000000', '#ffffff'];\r\n s.palette.name = s.palette.name || 'Custom';\r\n } else if (source === 'extract') {\r\n s.palette.name = `Extracted (${s.palette.count})`;\r\n } else {\r\n s.palette.name = 'None';\r\n }\r\n\r\n const method = DITHER_METHODS.some(m => m.id === dit.method) ? dit.method : d.dither.method;\r\n s.dither = {\r\n method,\r\n strength: clamp(dit.strength, 0, 1, d.dither.strength),\r\n matrix: normalizeMatrix(dit.matrix),\r\n };\r\n s.alpha = { threshold: clamp(al.threshold, 0, 1, d.alpha.threshold) };\r\n s.cleanup = { orphans: bool(cl.orphans, false), smooth: bool(cl.smooth, false) };\r\n s.outline = {\r\n mode: oneOf(ol.mode, ['none', 'outer', 'inner'], 'none'),\r\n color: isColor(ol.color) ? normHex(ol.color) : d.outline.color,\r\n corners: bool(ol.corners, false),\r\n };\r\n s.export = {\r\n size: oneOf(ex.size, ['scale', 'source'], 'scale'),\r\n scale: Math.round(clamp(ex.scale, 1, 64, d.export.scale)),\r\n indexed: bool(ex.indexed, d.export.indexed),\r\n grid: bool(ex.grid, false),\r\n gridColor: isColor(ex.gridColor) ? normHex(ex.gridColor) : d.export.gridColor,\r\n };\r\n return s;\r\n}\r\n\r\n/** A custom threshold matrix: 2D array of numbers. Ranks are derived from the order of the values. */\r\nexport function normalizeMatrix(m) {\r\n if (!Array.isArray(m) || !m.length || !Array.isArray(m[0])) return null;\r\n const h = Math.min(16, m.length), w = Math.min(16, m[0].length);\r\n const out = [];\r\n for (let y = 0; y < h; y++) {\r\n const row = [];\r\n for (let x = 0; x < w; x++) { const v = Number((m[y] || [])[x]); row.push(Number.isFinite(v) ? v : 0); }\r\n out.push(row);\r\n }\r\n return out;\r\n}\r\n\r\n/** Frame aspect ratios. `ratio` is width / height; null keeps the source's. */\r\nexport const ASPECTS = [\r\n { id: 'original', label: 'Original', ratio: null },\r\n { id: '1:1', label: '1:1', ratio: 1 },\r\n { id: '4:3', label: '4:3', ratio: 4 / 3 },\r\n { id: '3:4', label: '3:4', ratio: 3 / 4 },\r\n { id: '3:2', label: '3:2', ratio: 3 / 2 },\r\n { id: '2:3', label: '2:3', ratio: 2 / 3 },\r\n { id: '16:9', label: '16:9', ratio: 16 / 9 },\r\n { id: '9:16', label: '9:16', ratio: 9 / 16 },\r\n];\r\n\r\n/**\r\n * The part of a srcW \u00D7 srcH source that `frame` keeps, in whole source pixels.\r\n * The largest rectangle of the chosen aspect that fits, divided by zoom, placed by x/y (0 = left/top, 1 = right/bottom).\r\n */\r\nexport function cropRect(srcW, srcH, frame = {}) {\r\n const a = (ASPECTS.find(x => x.id === frame.aspect) || ASPECTS[0]).ratio || srcW / srcH;\r\n let w = srcW, h = srcW / a;\r\n if (h > srcH) { h = srcH; w = srcH * a; }\r\n const zoom = Math.max(1, frame.zoom || 1);\r\n w = Math.max(1, Math.min(srcW, Math.round(w / zoom)));\r\n h = Math.max(1, Math.min(srcH, Math.round(h / zoom)));\r\n const fx = frame.x ?? 0.5, fy = frame.y ?? 0.5;\r\n return { x: Math.round((srcW - w) * fx), y: Math.round((srcH - h) * fy), w, h };\r\n}\r\n\r\n/** Output size in pixels for a source of srcW \u00D7 srcH. */\r\nexport function resolveSize(srcW, srcH, size) {\r\n let w, h;\r\n if (size.mode === 'block') {\r\n w = Math.max(1, Math.round(srcW / size.block));\r\n h = Math.max(1, Math.round(srcH / size.block));\r\n } else {\r\n w = size.width;\r\n h = size.height || Math.max(1, Math.round(w * srcH / srcW));\r\n }\r\n return { width: Math.min(MAX_SIZE, w), height: Math.min(MAX_SIZE, h) };\r\n}\r\n\r\n// ---- sharing ---------------------------------------------------------------\r\n\r\nfunction diff(a, b) {\r\n // keys of `a` whose value differs from `b` (one level deep per group)\r\n const out = {};\r\n for (const k of Object.keys(a)) {\r\n if (k === 'version') continue;\r\n const va = a[k], vb = b[k];\r\n if (va && typeof va === 'object' && !Array.isArray(va)) {\r\n const g = {};\r\n for (const kk of Object.keys(va)) if (JSON.stringify(va[kk]) !== JSON.stringify(vb && vb[kk])) g[kk] = va[kk];\r\n if (Object.keys(g).length) out[k] = g;\r\n } else if (JSON.stringify(va) !== JSON.stringify(vb)) out[k] = va;\r\n }\r\n return out;\r\n}\r\n\r\nconst b64url = {\r\n enc(str) {\r\n const bytes = new TextEncoder().encode(str);\r\n let bin = ''; for (const b of bytes) bin += String.fromCharCode(b);\r\n return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n },\r\n dec(s) {\r\n const bin = atob(s.replace(/-/g, '+').replace(/_/g, '/'));\r\n return new TextDecoder().decode(Uint8Array.from(bin, c => c.charCodeAt(0)));\r\n },\r\n};\r\n\r\n/** Settings \u2192 the smallest JSON that rebuilds them (only what differs from the defaults). */\r\nexport function compactSettings(settings) {\r\n const s = normalizeSettings(settings);\r\n const out = diff(s, defaultSettings());\r\n if (out.palette) {\r\n if (s.palette.source !== 'custom') { delete out.palette.colors; delete out.palette.name; } // a built-in id is enough\r\n if (s.palette.source !== 'builtin') delete out.palette.id;\r\n if (s.palette.source !== 'extract') delete out.palette.count;\r\n }\r\n if (out.palette && !Object.keys(out.palette).length) delete out.palette;\r\n return out;\r\n}\r\n\r\n/** Settings \u2192 URL-safe string for `#s=\u2026`. */\r\nexport function encodeSettings(settings) {\r\n return b64url.enc(JSON.stringify({ v: SETTINGS_VERSION, ...compactSettings(settings) }));\r\n}\r\n\r\n/** `#s=\u2026` string (or a whole URL / hash) \u2192 settings. Throws on garbage. */\r\nexport function decodeSettings(str) {\r\n let s = String(str);\r\n const m = /[#&?]s=([A-Za-z0-9_-]+)/.exec(s);\r\n if (m) s = m[1];\r\n const obj = JSON.parse(b64url.dec(s));\r\n delete obj.v;\r\n return normalizeSettings(obj);\r\n}\r\n\r\n/** Settings \u2192 pretty JSON for saving to a file. */\r\nexport function settingsToJSON(settings) {\r\n return JSON.stringify({ $schema: 'image-to-pixel/settings', version: SETTINGS_VERSION, ...compactSettings(settings) }, null, 2);\r\n}\r\n\r\n/** JSON text \u2192 settings. Accepts a full or partial settings object. */\r\nexport function settingsFromJSON(text) {\r\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\r\n delete obj.$schema;\r\n return normalizeSettings(obj);\r\n}\r\n\r\n/** Apply a partial patch on top of settings (one level deep per group). */\r\nexport function mergeSettings(base, patch) {\r\n const out = JSON.parse(JSON.stringify(base));\r\n for (const k of Object.keys(patch || {})) {\r\n if (patch[k] && typeof patch[k] === 'object' && !Array.isArray(patch[k]) && out[k] && typeof out[k] === 'object') {\r\n Object.assign(out[k], patch[k]);\r\n } else out[k] = patch[k];\r\n }\r\n return normalizeSettings(out);\r\n}\r\n", "// A \"plan\" is everything both backends need, resolved once from settings + source size:\r\n// output size, palette bytes, threshold map, kernel, and the numbers derived from them.\r\n// Building it in one place keeps the CPU and GPU paths in lock-step.\r\n\r\nimport { normalizeSettings, resolveSize, ditherKind, cropRect } from './settings.js';\r\nimport { parseColor, paletteSpread } from './color.js';\r\nimport { thresholdMap } from './dither/matrices.js';\r\nimport { KERNELS, kernelSkew, waveCount } from './dither/kernels.js';\r\nimport { extractPalette } from './palette/extract.js';\r\nimport { resample, adjust } from './cpu/stages.js';\r\n\r\n/**\r\n * @param {object} settings\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA source (only read for palette extraction)\r\n */\r\nexport function makePlan(settings, src) {\r\n const s = normalizeSettings(settings);\r\n const crop = cropRect(src.width, src.height, s.frame);\r\n const { width, height } = resolveSize(crop.w, crop.h, s.size);\r\n\r\n let colors = s.palette.colors;\r\n if (s.palette.source === 'extract') colors = extractFrom(src, s, width, height, crop);\r\n const quantize = s.palette.source !== 'none' && colors.length > 0;\r\n const palette = quantize ? colors.map(parseColor) : [];\r\n\r\n let kind = quantize ? ditherKind(s.dither.method) : 'none';\r\n if (s.dither.strength <= 0) kind = 'none';\r\n\r\n const map = kind === 'ordered' ? thresholdMap(s.dither.method, s.dither.matrix) : null;\r\n const kernel = kind === 'diffusion' ? KERNELS[s.dither.method] : null;\r\n const skew = kernel ? kernelSkew(kernel) : 1;\r\n\r\n return {\r\n settings: s,\r\n srcWidth: src.width, srcHeight: src.height,\r\n crop, // source pixels kept by the frame settings\r\n width, height,\r\n quantize, kind,\r\n palette, // [[r, g, b] bytes]\r\n paletteHex: quantize ? colors.slice() : null,\r\n distance: s.palette.distance === 'rgb' ? 1 : 0,\r\n spread: quantize ? paletteSpread(palette) : 0,\r\n map, kernel, skew,\r\n waves: kernel ? waveCount(width, height, skew) : 0,\r\n outline: { mode: s.outline.mode, color: parseColor(s.outline.color), corners: s.outline.corners },\r\n };\r\n}\r\n\r\nfunction extractFrom(src, s, width, height, crop) {\r\n // extract from what will actually be quantised: the resized + adjusted image (capped for speed)\r\n const k = Math.min(1, 160 / Math.max(width, height));\r\n const w = Math.max(1, Math.round(width * k)), h = Math.max(1, Math.round(height * k));\r\n const prep = resample(src, w, h, 'box', crop);\r\n adjust(prep, s.adjust);\r\n const bytes = new Uint8ClampedArray(prep.length);\r\n for (let i = 0; i < prep.length; i++) bytes[i] = Math.round(prep[i] * 255);\r\n return extractPalette({ data: bytes, width: w, height: h }, s.palette.count, { alphaThreshold: Math.max(0.01, s.alpha.threshold) });\r\n}\r\n", "// Generated by scripts/gen-bluenoise.mjs: 64\u00D764 void-and-cluster blue noise, one byte per cell (0..255).\r\nexport const BLUE_NOISE_SIZE = 64;\r\nexport const BLUE_NOISE_B64 = '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';\r\n", "// Threshold maps for ordered dithering.\r\n// A map is { w, h, levels, values: Uint8Array } and the threshold of a cell is (value + 0.5) / levels.\r\n// The GPU reads the same bytes from a texture, so CPU and GPU agree exactly.\r\n\r\nimport { BLUE_NOISE_B64, BLUE_NOISE_SIZE } from './bluenoise-data.js';\r\n\r\nfunction fromB64(b64) {\r\n if (typeof atob === 'function') return Uint8Array.from(atob(b64), c => c.charCodeAt(0));\r\n return new Uint8Array(Buffer.from(b64, 'base64'));\r\n}\r\n\r\n/** Bayer index matrix of size n (power of two). */\r\nexport function bayer(n) {\r\n let m = [[0]];\r\n for (let s = 1; s < n; s *= 2) {\r\n const next = [];\r\n for (let y = 0; y < s * 2; y++) next.push(new Array(s * 2));\r\n for (let y = 0; y < s; y++) for (let x = 0; x < s; x++) {\r\n const v = 4 * m[y][x];\r\n next[y][x] = v; next[y][x + s] = v + 2; next[y + s][x] = v + 3; next[y + s][x + s] = v + 1;\r\n }\r\n m = next;\r\n }\r\n return m;\r\n}\r\n\r\n/** Turn arbitrary numbers into ranks 0..n-1 (ties keep reading order). */\r\nexport function toRanks(rows) {\r\n const h = rows.length, w = rows[0].length;\r\n const cells = [];\r\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) cells.push({ i: y * w + x, v: rows[y][x] });\r\n cells.sort((a, b) => a.v - b.v || a.i - b.i);\r\n const out = new Uint8Array(w * h);\r\n cells.forEach((c, r) => { out[c.i] = r; });\r\n return out;\r\n}\r\n\r\n/** Clustered-dot screen: cells ranked by a dot function, two dots per tile at 45\u00B0. */\r\nfunction clustered(n) {\r\n const rows = [];\r\n for (let y = 0; y < n; y++) {\r\n const row = [];\r\n for (let x = 0; x < n; x++) {\r\n const u = (x + 0.5) / n * 2 * Math.PI, v = (y + 0.5) / n * 2 * Math.PI;\r\n row.push(-(Math.cos(u) + Math.cos(v)) + (x * n + y) * 1e-9);\r\n }\r\n rows.push(row);\r\n }\r\n return rows;\r\n}\r\n\r\nconst CLUSTER4 = [[7, 13, 11, 4], [12, 16, 14, 8], [10, 15, 6, 2], [5, 9, 3, 1]]; // classic editor's matrix\r\nconst cache = new Map();\r\n\r\n/**\r\n * Threshold map for an ordered method id ('bayer4', 'bluenoise', 'custom' \u2026).\r\n * @param {string} method\r\n * @param {number[][]|null} [custom] matrix for 'custom'\r\n */\r\nexport function thresholdMap(method, custom = null) {\r\n if (method === 'custom') {\r\n const m = custom && custom.length ? custom : bayer(4);\r\n return { w: m[0].length, h: m.length, levels: m.length * m[0].length, values: toRanks(m) };\r\n }\r\n if (cache.has(method)) return cache.get(method);\r\n let map;\r\n const sq = rows => ({ w: rows[0].length, h: rows.length, levels: rows.length * rows[0].length, values: toRanks(rows) });\r\n switch (method) {\r\n case 'bayer2': map = sq(bayer(2)); break;\r\n case 'bayer4': map = sq(bayer(4)); break;\r\n case 'bayer8': map = sq(bayer(8)); break;\r\n case 'bayer16': map = sq(bayer(16)); break;\r\n case 'cluster4': map = sq(CLUSTER4); break;\r\n case 'cluster8': map = sq(clustered(8)); break;\r\n case 'lines': map = sq([[0], [2], [1], [3]]); break;\r\n case 'bluenoise': map = { w: BLUE_NOISE_SIZE, h: BLUE_NOISE_SIZE, levels: 256, values: fromB64(BLUE_NOISE_B64) }; break;\r\n default: map = sq(bayer(4));\r\n }\r\n cache.set(method, map);\r\n return map;\r\n}\r\n\r\n/**\r\n * Parse a custom matrix typed by a person: rows on lines, numbers separated by spaces or commas.\r\n * Accepts an optional \"/ 16\" style divisor line, which is ignored (only the order matters).\r\n */\r\nexport function parseMatrix(text) {\r\n const rows = String(text).split(/\\r?\\n|;/).map(l => l.trim()).filter(l => l && !/^\\//.test(l))\r\n .map(l => l.replace(/[[\\]]/g, '').split(/[\\s,]+/).filter(Boolean).map(Number));\r\n if (!rows.length) throw new Error('Matrix is empty');\r\n const w = rows[0].length;\r\n if (rows.some(r => r.length !== w || r.some(v => !Number.isFinite(v)))) throw new Error('Every row needs the same number of values');\r\n if (w > 16 || rows.length > 16) throw new Error('Matrices are limited to 16\u00D716');\r\n return rows;\r\n}\r\n", "// Error-diffusion kernels as push offsets [dx, dy, weight] (weights already divided).\r\n// `skew` is the wavefront slope the GPU needs: pixels with x + skew*y = k only depend on\r\n// earlier waves, so each wave is one draw (see docs/how-it-works.md).\r\n\r\nconst k = (div, list) => list.map(([dx, dy, w]) => [dx, dy, w / div]);\r\n\r\nexport const KERNELS = {\r\n 'floyd-steinberg': k(16, [[1, 0, 7], [-1, 1, 3], [0, 1, 5], [1, 1, 1]]),\r\n 'atkinson': k(8, [[1, 0, 1], [2, 0, 1], [-1, 1, 1], [0, 1, 1], [1, 1, 1], [0, 2, 1]]),\r\n 'sierra-lite': k(4, [[1, 0, 2], [-1, 1, 1], [0, 1, 1]]),\r\n 'sierra': k(32, [[1, 0, 5], [2, 0, 3], [-2, 1, 2], [-1, 1, 4], [0, 1, 5], [1, 1, 4], [2, 1, 2], [-1, 2, 2], [0, 2, 3], [1, 2, 2]]),\r\n 'burkes': k(32, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2]]),\r\n 'jarvis': k(48, [[1, 0, 7], [2, 0, 5], [-2, 1, 3], [-1, 1, 5], [0, 1, 7], [1, 1, 5], [2, 1, 3], [-2, 2, 1], [-1, 2, 3], [0, 2, 5], [1, 2, 3], [2, 2, 1]]),\r\n 'stucki': k(42, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2], [-2, 2, 1], [-1, 2, 2], [0, 2, 4], [1, 2, 2], [2, 2, 1]]),\r\n};\r\n\r\nexport const MAX_KERNEL = 12;\r\n\r\n/** Smallest integer s so that every push offset lands on a later wave x + s*y. */\r\nexport function kernelSkew(kernel) {\r\n let s = 1;\r\n for (const [dx, dy] of kernel) if (dy > 0) s = Math.max(s, Math.floor(-dx / dy) + 1);\r\n return s;\r\n}\r\n\r\n/** Number of waves (GPU draws) for an image of w \u00D7 h. */\r\nexport const waveCount = (w, h, skew) => (w - 1) + skew * (h - 1) + 1;\r\n", "// Palette extraction: median cut on the image's colours, refined by a few k-means passes.\r\n// Deterministic (no randomness), so the same image always gives the same palette.\r\n\r\nimport { toHex } from '../color.js';\r\n\r\n/**\r\n * @param {{ data: ArrayLike<number>, width: number, height: number }} img RGBA bytes\r\n * @param {number} count number of colours (2..256)\r\n * @param {{ maxSamples?: number, alphaThreshold?: number }} [opts]\r\n * @returns {string[]} '#rrggbb' colours sorted dark \u2192 light\r\n */\r\nexport function extractPalette(img, count = 16, opts = {}) {\r\n const { maxSamples = 40000, alphaThreshold = 0.5 } = opts;\r\n const n = img.width * img.height;\r\n const step = Math.max(1, Math.floor(n / maxSamples));\r\n const pts = [];\r\n for (let i = 0; i < n; i += step) {\r\n const o = i * 4;\r\n if (img.data[o + 3] < alphaThreshold * 255) continue;\r\n pts.push([img.data[o], img.data[o + 1], img.data[o + 2]]);\r\n }\r\n if (!pts.length) return ['#000000', '#ffffff'].slice(0, Math.max(1, count));\r\n\r\n // ---- median cut\r\n let boxes = [pts];\r\n while (boxes.length < count) {\r\n let bi = -1, bestRange = -1, bestAxis = 0;\r\n boxes.forEach((b, i) => {\r\n if (b.length < 2) return;\r\n for (let a = 0; a < 3; a++) {\r\n let lo = 255, hi = 0;\r\n for (const p of b) { if (p[a] < lo) lo = p[a]; if (p[a] > hi) hi = p[a]; }\r\n // weight by population so big flat areas get split before tiny noisy ones\r\n const r = (hi - lo) * Math.sqrt(b.length);\r\n if (r > bestRange) { bestRange = r; bi = i; bestAxis = a; }\r\n }\r\n });\r\n if (bi < 0 || bestRange <= 0) break;\r\n const b = boxes[bi].slice().sort((p, q) => p[bestAxis] - q[bestAxis]);\r\n const mid = b.length >> 1;\r\n boxes.splice(bi, 1, b.slice(0, mid), b.slice(mid));\r\n }\r\n let centers = boxes.map(b => mean(b));\r\n\r\n // ---- k-means refinement\r\n for (let iter = 0; iter < 6; iter++) {\r\n const sums = centers.map(() => [0, 0, 0, 0]);\r\n for (const p of pts) {\r\n let best = 0, bd = Infinity;\r\n for (let c = 0; c < centers.length; c++) {\r\n const dr = p[0] - centers[c][0], dg = p[1] - centers[c][1], db = p[2] - centers[c][2];\r\n const d = dr * dr + dg * dg + db * db;\r\n if (d < bd) { bd = d; best = c; }\r\n }\r\n const s = sums[best]; s[0] += p[0]; s[1] += p[1]; s[2] += p[2]; s[3]++;\r\n }\r\n centers = centers.map((c, i) => (sums[i][3] ? [sums[i][0] / sums[i][3], sums[i][1] / sums[i][3], sums[i][2] / sums[i][3]] : c));\r\n }\r\n\r\n const hexes = [...new Set(centers.map(c => toHex(c)))];\r\n const lum = h => { const v = parseInt(h.slice(1), 16); return 0.2126 * (v >> 16) + 0.7152 * ((v >> 8) & 255) + 0.0722 * (v & 255); };\r\n return hexes.sort((a, b) => lum(a) - lum(b));\r\n}\r\n\r\nfunction mean(list) {\r\n let r = 0, g = 0, b = 0;\r\n for (const p of list) { r += p[0]; g += p[1]; b += p[2]; }\r\n return [r / list.length, g / list.length, b / list.length];\r\n}\r\n", "// CPU reference implementation of every pipeline stage.\r\n// The GLSL in gpu/shaders.js mirrors these functions line for line; tests compare the two.\r\n// Working buffers are Float32Array RGBA, rows top-down, values 0..1.\r\n\r\nimport { oklab, LUMA } from '../color.js';\r\n\r\n/**\r\n * Resample to w \u00D7 h. 'box' averages up to 16\u00D716 evenly spaced source texels per output pixel\r\n * (alpha-weighted); 'nearest' takes the centre texel. Integer maths, identical on the GPU.\r\n */\r\nexport function resample(src, w, h, mode = 'box', crop = null) {\r\n const ox = crop ? crop.x : 0, oy = crop ? crop.y : 0;\r\n const sw = crop ? crop.w : src.width, sh = crop ? crop.h : src.height, d = src.data, stride = src.width;\r\n const out = new Float32Array(w * h * 4);\r\n const nx = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sw / w)));\r\n const ny = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sh / h)));\r\n const xs = new Int32Array(w * nx), ys = new Int32Array(h * ny);\r\n for (let x = 0; x < w; x++) for (let i = 0; i < nx; i++) xs[x * nx + i] = ox + Math.min(sw - 1, Math.floor(((2 * (x * nx + i) + 1) * sw) / (2 * w * nx)));\r\n for (let y = 0; y < h; y++) for (let j = 0; j < ny; j++) ys[y * ny + j] = oy + Math.min(sh - 1, Math.floor(((2 * (y * ny + j) + 1) * sh) / (2 * h * ny)));\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n let r = 0, g = 0, b = 0, a = 0;\r\n for (let j = 0; j < ny; j++) {\r\n const row = ys[y * ny + j] * stride;\r\n for (let i = 0; i < nx; i++) {\r\n const o = (row + xs[x * nx + i]) * 4;\r\n const al = d[o + 3] / 255;\r\n r += d[o] / 255 * al; g += d[o + 1] / 255 * al; b += d[o + 2] / 255 * al; a += al;\r\n }\r\n }\r\n const o = (y * w + x) * 4;\r\n if (a > 0) { out[o] = r / a; out[o + 1] = g / a; out[o + 2] = b / a; }\r\n out[o + 3] = a / (nx * ny);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/** Brightness, contrast, saturation, hue, gamma \u2014 in that order, in place. */\r\nexport function adjust(buf, { brightness = 0, contrast = 0, saturation = 0, hue = 0, gamma = 1 }) {\r\n if (!brightness && !contrast && !saturation && !hue && gamma === 1) return buf;\r\n const f = contrast >= 0 ? 1 / (1 - 0.99 * contrast) : 1 + contrast;\r\n const ig = 1 / gamma;\r\n // luminance-preserving hue rotation: the CSS hue-rotate() matrix (rows sum to 1, so greys stay grey)\r\n const hk = Math.cos(hue * Math.PI / 180), hq = Math.sin(hue * Math.PI / 180);\r\n const M = [\r\n 0.213 + 0.787 * hk - 0.213 * hq, 0.715 - 0.715 * hk - 0.715 * hq, 0.072 - 0.072 * hk + 0.928 * hq,\r\n 0.213 - 0.213 * hk + 0.143 * hq, 0.715 + 0.285 * hk + 0.140 * hq, 0.072 - 0.072 * hk - 0.283 * hq,\r\n 0.213 - 0.213 * hk - 0.787 * hq, 0.715 - 0.715 * hk + 0.715 * hq, 0.072 + 0.928 * hk + 0.072 * hq,\r\n ];\r\n for (let o = 0; o < buf.length; o += 4) {\r\n let r = buf[o] + brightness, g = buf[o + 1] + brightness, b = buf[o + 2] + brightness;\r\n r = (r - 0.5) * f + 0.5; g = (g - 0.5) * f + 0.5; b = (b - 0.5) * f + 0.5;\r\n const l = r * LUMA[0] + g * LUMA[1] + b * LUMA[2];\r\n const k = 1 + saturation;\r\n r = l + (r - l) * k; g = l + (g - l) * k; b = l + (b - l) * k;\r\n if (hue) {\r\n const r2 = M[0] * r + M[1] * g + M[2] * b, g2 = M[3] * r + M[4] * g + M[5] * b, b2 = M[6] * r + M[7] * g + M[8] * b;\r\n r = r2; g = g2; b = b2;\r\n }\r\n buf[o] = Math.pow(clamp01(r), ig); buf[o + 1] = Math.pow(clamp01(g), ig); buf[o + 2] = Math.pow(clamp01(b), ig);\r\n }\r\n return buf;\r\n}\r\n\r\n/** Binary alpha: below the threshold becomes fully transparent, the rest fully opaque. */\r\nexport function alphaCut(buf, threshold) {\r\n for (let o = 3; o < buf.length; o += 4) buf[o] = buf[o] >= threshold && buf[o] > 0 ? 1 : 0;\r\n return buf;\r\n}\r\n\r\nexport const clamp01 = v => (v < 0 ? 0 : v > 1 ? 1 : v);\r\n\r\n/** Precompute what nearest() needs for a palette. */\r\nexport function paletteSpace(palette, distance) {\r\n const n = palette.length;\r\n const coords = new Float64Array(n * 3);\r\n const rgb = new Float64Array(n * 3);\r\n palette.forEach((c, i) => {\r\n rgb.set([c[0] / 255, c[1] / 255, c[2] / 255], i * 3);\r\n coords.set(distance === 1 ? [c[0] / 255, c[1] / 255, c[2] / 255] : oklab(c[0] / 255, c[1] / 255, c[2] / 255), i * 3);\r\n });\r\n return { n, coords, rgb, distance };\r\n}\r\n\r\nconst W_RGB = [0.299, 0.587, 0.114];\r\n\r\n/** Index of the nearest palette colour (ties: lowest index). */\r\nexport function nearest(sp, r, g, b) {\r\n let p0, p1, p2, w0 = 1, w1 = 1, w2 = 1;\r\n if (sp.distance === 1) { p0 = r; p1 = g; p2 = b; w0 = W_RGB[0]; w1 = W_RGB[1]; w2 = W_RGB[2]; }\r\n else [p0, p1, p2] = oklab(r, g, b);\r\n let best = 0, bd = Infinity;\r\n const c = sp.coords;\r\n for (let i = 0; i < sp.n; i++) {\r\n const d0 = p0 - c[i * 3], d1 = p1 - c[i * 3 + 1], d2 = p2 - c[i * 3 + 2];\r\n const dist = w0 * d0 * d0 + w1 * d1 * d1 + w2 * d2 * d2;\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n return best;\r\n}\r\n\r\n/** No dithering / ordered dithering \u2192 RGBA bytes. */\r\nexport function quantizeOrdered(buf, w, h, plan) {\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const sp = plan.quantize ? paletteSpace(plan.palette, plan.distance) : null;\r\n const map = plan.kind === 'ordered' ? plan.map : null;\r\n const amt = map ? plan.spread * plan.settings.dither.strength : 0;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4;\r\n if (buf[o + 3] < 0.5) continue; // transparent stays 0,0,0,0\r\n let r = buf[o], g = buf[o + 1], b = buf[o + 2];\r\n if (sp) {\r\n if (map) {\r\n const t = (map.values[(y % map.h) * map.w + (x % map.w)] + 0.5) / map.levels - 0.5;\r\n r = clamp01(r + t * amt); g = clamp01(g + t * amt); b = clamp01(b + t * amt);\r\n }\r\n const i = nearest(sp, r, g, b);\r\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2];\r\n } else {\r\n out[o] = Math.round(r * 255); out[o + 1] = Math.round(g * 255); out[o + 2] = Math.round(b * 255);\r\n }\r\n out[o + 3] = 255;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/** Error diffusion (left \u2192 right, top \u2192 bottom) \u2192 RGBA bytes. */\r\nexport function quantizeDiffusion(buf, w, h, plan) {\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const sp = paletteSpace(plan.palette, plan.distance);\r\n const acc = new Float32Array(w * h * 3);\r\n const strength = plan.settings.dither.strength;\r\n const kernel = plan.kernel;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const p = y * w + x, o = p * 4;\r\n if (buf[o + 3] < 0.5) continue;\r\n const r = clamp01(buf[o] + acc[p * 3] * strength);\r\n const g = clamp01(buf[o + 1] + acc[p * 3 + 1] * strength);\r\n const b = clamp01(buf[o + 2] + acc[p * 3 + 2] * strength);\r\n const i = nearest(sp, r, g, b);\r\n const er = r - sp.rgb[i * 3], eg = g - sp.rgb[i * 3 + 1], eb = b - sp.rgb[i * 3 + 2];\r\n for (const [dx, dy, wt] of kernel) {\r\n const xx = x + dx, yy = y + dy;\r\n if (xx < 0 || xx >= w || yy >= h) continue;\r\n const q = (yy * w + xx) * 3;\r\n acc[q] += er * wt; acc[q + 1] += eg * wt; acc[q + 2] += eb * wt;\r\n }\r\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2]; out[o + 3] = 255;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nconst key = (d, o) => (d[o + 3] === 0 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\nconst N4 = [[0, -1], [1, 0], [0, 1], [-1, 0]];\r\n\r\n/** Replace pixels that share no colour with any 4-neighbour by their most common neighbour. */\r\nexport function removeOrphans(px, w, h) {\r\n const src = px.slice();\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4, c = key(src, o);\r\n const ks = [], os = [];\r\n for (const [dx, dy] of N4) {\r\n const xx = x + dx, yy = y + dy;\r\n if (xx < 0 || yy < 0 || xx >= w || yy >= h) continue;\r\n const oo = (yy * w + xx) * 4;\r\n ks.push(key(src, oo)); os.push(oo);\r\n }\r\n if (ks.length < 2 || ks.includes(c)) continue;\r\n let best = 0, bc = 0;\r\n for (let i = 0; i < ks.length; i++) {\r\n let n = 0; for (let j = 0; j < ks.length; j++) if (ks[j] === ks[i]) n++;\r\n if (n > bc) { bc = n; best = i; }\r\n }\r\n px.set(src.subarray(os[best], os[best] + 4), o);\r\n }\r\n }\r\n return px;\r\n}\r\n\r\n/** 3\u00D73 majority: a colour that fills at least 5 of the 9 cells wins. */\r\nexport function smoothMajority(px, w, h) {\r\n const src = px.slice();\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4, c = key(src, o);\r\n const ks = [], os = [];\r\n for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) {\r\n const xx = Math.min(w - 1, Math.max(0, x + dx)), yy = Math.min(h - 1, Math.max(0, y + dy));\r\n const oo = (yy * w + xx) * 4; ks.push(key(src, oo)); os.push(oo);\r\n }\r\n for (let i = 0; i < 9; i++) {\r\n if (ks[i] === c) continue;\r\n let n = 0; for (let j = 0; j < 9; j++) if (ks[j] === ks[i]) n++;\r\n if (n >= 5) { px.set(src.subarray(os[i], os[i] + 4), o); break; }\r\n }\r\n }\r\n }\r\n return px;\r\n}\r\n\r\n/** Outline around (outer) or inside (inner) the opaque shape. */\r\nexport function outline(px, w, h, { mode, color, corners }) {\r\n if (mode === 'none') return px;\r\n const src = px.slice();\r\n const opaque = (x, y) => x >= 0 && y >= 0 && x < w && y < h && src[(y * w + x) * 4 + 3] > 0;\r\n const inside = (x, y) => x >= 0 && y >= 0 && x < w && y < h;\r\n const nb = corners ? [[0, -1], [1, 0], [0, 1], [-1, 0], [-1, -1], [1, -1], [1, 1], [-1, 1]] : N4;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const me = opaque(x, y);\r\n let hit = false;\r\n for (const [dx, dy] of nb) {\r\n const xx = x + dx, yy = y + dy;\r\n if (!inside(xx, yy)) continue;\r\n if (mode === 'outer' ? (!me && opaque(xx, yy)) : (me && !opaque(xx, yy))) { hit = true; break; }\r\n }\r\n if (hit) { const o = (y * w + x) * 4; px[o] = color[0]; px[o + 1] = color[1]; px[o + 2] = color[2]; px[o + 3] = 255; }\r\n }\r\n }\r\n return px;\r\n}\r\n", "// The whole pipeline on the CPU. Used when WebGL 2 is unavailable, in Node, and as the\r\n// reference the GPU output is tested against.\r\n\r\nimport { resample, adjust, alphaCut, quantizeOrdered, quantizeDiffusion, removeOrphans, smoothMajority, outline } from './stages.js';\r\n\r\n/**\r\n * @param {ReturnType<import('../plan.js').makePlan>} plan\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA bytes, rows top-down\r\n * @returns {Uint8ClampedArray} RGBA bytes, plan.width \u00D7 plan.height\r\n */\r\nexport function runCPU(plan, src) {\r\n const { width: w, height: h, settings: s } = plan;\r\n const buf = resample(src, w, h, s.size.resample, plan.crop);\r\n adjust(buf, s.adjust);\r\n alphaCut(buf, s.alpha.threshold);\r\n const px = plan.kind === 'diffusion' ? quantizeDiffusion(buf, w, h, plan) : quantizeOrdered(buf, w, h, plan);\r\n if (s.cleanup.orphans) removeOrphans(px, w, h);\r\n if (s.cleanup.smooth) smoothMajority(px, w, h);\r\n outline(px, w, h, plan.outline);\r\n return px;\r\n}\r\n", "// GPU backend: one ShaderMate instance, six passes, rendered on demand (never animating).\r\n\r\nimport { createShader } from 'shadermate';\r\nimport { COMMON, PREP, QUANT, DIFFUSE, RESOLVE, ORPHAN, SMOOTH, OUTLINE } from './shaders.js';\r\nimport { MAX_KERNEL } from '../dither/kernels.js';\r\n\r\nconst canvasOf = (w, h) => { const c = document.createElement('canvas'); c.width = w; c.height = h; return c; };\r\n\r\n/**\r\n * Create the WebGL 2 backend. Rejects when WebGL 2 or float render targets are missing,\r\n * so the caller can fall back to the CPU.\r\n */\r\nexport async function createGPUBackend() {\r\n if (typeof document === 'undefined') throw new Error('No DOM');\r\n const probe = canvasOf(1, 1).getContext('webgl2');\r\n if (!probe) throw new Error('WebGL 2 is not available');\r\n if (!probe.getExtension('EXT_color_buffer_float')) throw new Error('Float render targets are not available');\r\n const dbg = probe.getExtension('WEBGL_debug_renderer_info');\r\n const renderer = String(dbg ? probe.getParameter(dbg.UNMASKED_RENDERER_WEBGL) : probe.getParameter(probe.RENDERER));\r\n probe.getExtension('WEBGL_lose_context')?.loseContext();\r\n\r\n const canvas = canvasOf(1, 1);\r\n const source = canvasOf(1, 1);\r\n const palette = canvasOf(256, 1);\r\n const matrix = canvasOf(1, 1);\r\n const nearest = el => ({ element: el, filter: 'nearest', wrap: 'clamp' });\r\n\r\n const sm = createShader({\r\n canvas,\r\n webgl: 2,\r\n size: [1, 1],\r\n pixelRatio: 1,\r\n autoplay: false,\r\n pauseWhenHidden: false,\r\n pointer: false,\r\n errorOverlay: false,\r\n warnMissingUniforms: false,\r\n preserveDrawingBuffer: true,\r\n premultipliedAlpha: false,\r\n antialias: false,\r\n dialect: 'shadermate',\r\n common: COMMON,\r\n samplers: { u_palette: nearest(palette), u_matrix: nearest(matrix) },\r\n uniforms: {\r\n u_count: 1, u_distance: 0, u_resample: 0, u_adjust: [0, 0, 0, 1], u_hue: 0, u_crop: [0, 0, 1, 1], u_alphaCut: 0.5,\r\n u_mode: 0, u_levels: 1, u_amount: 0,\r\n u_skew: 1, u_strength: 1, u_kn: 0, u_kernel: new Float32Array(MAX_KERNEL * 3),\r\n u_outline: 0, u_corners: 0, u_outlineColor: [0, 0, 0],\r\n },\r\n passes: [\r\n { name: 'prep', shader: PREP, float: 'full', filter: 'nearest', channels: [{ ...nearest(source), dynamic: false }] },\r\n { name: 'quant', shader: QUANT, filter: 'nearest', channels: ['prep'] },\r\n { name: 'diffuse', shader: DIFFUSE, float: 'full', filter: 'nearest', pingpong: true, iterations: 2, channels: ['prep', 'diffuse'] },\r\n { name: 'resolve', shader: RESOLVE, filter: 'nearest', channels: ['quant', 'diffuse'] },\r\n { name: 'orphan', shader: ORPHAN, filter: 'nearest', channels: ['resolve'] },\r\n { name: 'smooth', shader: SMOOTH, filter: 'nearest', channels: ['orphan'] },\r\n { name: 'out', shader: OUTLINE, screen: true, channels: ['smooth'] },\r\n ],\r\n });\r\n\r\n let failure = null;\r\n sm.on('error', e => { failure = e; });\r\n await sm.ready;\r\n if (failure || sm.error) { sm.destroy(); throw failure || sm.error; }\r\n\r\n // `u_on` is a per-pass switch: same name, different value in each pass\r\n const passUniforms = (name, values) => { for (const k in values) sm.set(k, values[k], name); };\r\n\r\n let lastSource = null;\r\n let paletteKey = '', matrixKey = '';\r\n\r\n async function setSource(frame) {\r\n if (frame.canvas === lastSource && !frame.dirty) return;\r\n source.width = frame.width; source.height = frame.height;\r\n const ctx = source.getContext('2d');\r\n ctx.clearRect(0, 0, source.width, source.height);\r\n ctx.drawImage(frame.canvas, 0, 0);\r\n await sm.setChannel(0, { ...nearest(source), dynamic: false }, 'prep');\r\n lastSource = frame.canvas;\r\n }\r\n\r\n function setPalette(plan) {\r\n const key = plan.palette.map(c => c.join(',')).join(';');\r\n if (key === paletteKey) return;\r\n paletteKey = key;\r\n const ctx = palette.getContext('2d');\r\n const img = ctx.createImageData(256, 1);\r\n plan.palette.forEach((c, i) => img.data.set([c[0], c[1], c[2], 255], i * 4));\r\n ctx.putImageData(img, 0, 0);\r\n }\r\n\r\n function setMatrix(map) {\r\n const key = map ? `${map.w}x${map.h}:${map.levels}:${map.values.join(',')}` : 'none';\r\n if (key === matrixKey) return;\r\n matrixKey = key;\r\n const m = map || { w: 1, h: 1, values: [0] };\r\n matrix.width = m.w; matrix.height = m.h;\r\n const ctx = matrix.getContext('2d');\r\n const img = ctx.createImageData(m.w, m.h);\r\n for (let i = 0; i < m.values.length; i++) img.data.set([m.values[i], 0, 0, 255], i * 4);\r\n ctx.putImageData(img, 0, 0);\r\n }\r\n\r\n /**\r\n * @param {ReturnType<import('../plan.js').makePlan>} plan\r\n * @param {{ canvas: HTMLCanvasElement, width: number, height: number, dirty?: boolean }} frame\r\n * @returns {Promise<Uint8ClampedArray>} RGBA bytes, rows top-down\r\n */\r\n async function run(plan, frame) {\r\n const s = plan.settings;\r\n await setSource(frame);\r\n if (plan.quantize) setPalette(plan);\r\n setMatrix(plan.map);\r\n if (sm.width !== plan.width || sm.height !== plan.height) sm.setSize(plan.width, plan.height);\r\n\r\n const diffusion = plan.kind === 'diffusion';\r\n const kernel = new Array(MAX_KERNEL).fill(null).map((_, i) => (plan.kernel && plan.kernel[i]) || [0, 0, 0]);\r\n sm.set({\r\n u_count: plan.palette.length || 1,\r\n u_distance: plan.distance,\r\n u_resample: s.size.resample === 'nearest' ? 1 : 0,\r\n u_adjust: [s.adjust.brightness, s.adjust.contrast, s.adjust.saturation, s.adjust.gamma],\r\n u_hue: s.adjust.hue,\r\n u_crop: [plan.crop.x, plan.crop.y, plan.crop.w, plan.crop.h],\r\n u_alphaCut: s.alpha.threshold,\r\n u_mode: !plan.quantize ? 0 : plan.kind === 'ordered' ? 2 : 1,\r\n u_levels: plan.map ? plan.map.levels : 1,\r\n u_amount: plan.map ? plan.spread * s.dither.strength : 0,\r\n u_skew: plan.skew,\r\n u_strength: s.dither.strength,\r\n u_kn: plan.kernel ? plan.kernel.length : 0,\r\n u_kernel: new Float32Array(kernel.flat()),\r\n u_outline: { none: 0, outer: 1, inner: 2 }[plan.outline.mode],\r\n u_corners: plan.outline.corners ? 1 : 0,\r\n u_outlineColor: plan.outline.color.map(v => v / 255),\r\n });\r\n passUniforms('diffuse', { u_on: diffusion ? 1 : 0 });\r\n passUniforms('resolve', { u_on: diffusion ? 1 : 0 });\r\n passUniforms('orphan', { u_on: s.cleanup.orphans ? 1 : 0 });\r\n passUniforms('smooth', { u_on: s.cleanup.smooth ? 1 : 0 });\r\n sm.getPass('diffuse').cfg.iterations = diffusion ? plan.waves : 1;\r\n\r\n const { data } = sm.readPixels();\r\n // GL rows are bottom-up\r\n const w = plan.width, h = plan.height, out = new Uint8ClampedArray(w * h * 4), row = w * 4;\r\n for (let y = 0; y < h; y++) out.set(data.subarray((h - 1 - y) * row, (h - y) * row), y * row);\r\n return out;\r\n }\r\n\r\n return {\r\n name: 'webgl',\r\n renderer,\r\n /** Software rasterisers (SwiftShader, llvmpipe) are slower than the CPU path for error diffusion. */\r\n software: /swiftshader|llvmpipe|softpipe|software|basic render/i.test(renderer),\r\n run,\r\n shader: sm,\r\n destroy() { sm.destroy(); },\r\n };\r\n}\r\n", "// GLSL (WebGL 2) for the GPU pipeline. Each pass mirrors a function in cpu/stages.js.\r\n// ShaderMate adds the #version line, precision, fragColor and the built-in uniforms.\r\n//\r\n// prep \u2500\u25B6 quant \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n// \u2514\u2500\u2500\u2500\u25B6 diffuse (N waves) \u2500\u25B6 resolve \u2500\u25B6 orphan \u2500\u25B6 smooth \u2500\u25B6 out (screen)\r\n//\r\n// Note: no trailing comments on uniform lines; ShaderMate reads trailing numbers there as default values.\r\n// All passes address pixels top-down (`P`, row 0 = top) so the maths matches the CPU.\r\n\r\nexport const COMMON = /* glsl */`\r\n// 256\u00D71, palette colours in x = 0..count-1\r\nuniform sampler2D u_palette;\r\nuniform int u_count;\r\n// 0 = OKLab, 1 = weighted RGB\r\nuniform int u_distance;\r\n\r\nivec2 topDown() { return ivec2(int(gl_FragCoord.x), int(u_resolution.y) - 1 - int(gl_FragCoord.y)); }\r\nvec4 at(sampler2D t, ivec2 p) { ivec2 s = textureSize(t, 0); return texelFetch(t, ivec2(p.x, s.y - 1 - p.y), 0); }\r\nbool inside(ivec2 p) { return p.x >= 0 && p.y >= 0 && p.x < int(u_resolution.x) && p.y < int(u_resolution.y); }\r\nvec3 palColor(int i) { return texelFetch(u_palette, ivec2(i, 0), 0).rgb; }\r\n\r\nfloat linear1(float c) { return c <= 0.04045 ? c / 12.92 : pow((c + 0.055) / 1.055, 2.4); }\r\nvec3 oklab(vec3 c) {\r\n c = vec3(linear1(c.r), linear1(c.g), linear1(c.b));\r\n float l = pow(0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b, 1.0 / 3.0);\r\n float m = pow(0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b, 1.0 / 3.0);\r\n float s = pow(0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b, 1.0 / 3.0);\r\n return vec3(0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\r\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\r\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s);\r\n}\r\nvec3 space(vec3 c) { return u_distance == 1 ? c : oklab(c); }\r\nint nearestIndex(vec3 c) {\r\n vec3 p = space(c);\r\n vec3 w = u_distance == 1 ? vec3(0.299, 0.587, 0.114) : vec3(1.0);\r\n int best = 0; float bd = 1e20;\r\n for (int i = 0; i < 256; i++) {\r\n if (i >= u_count) break;\r\n vec3 d = p - space(palColor(i));\r\n float dist = dot(w * d, d);\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n return best;\r\n}\r\nint colorKey(vec4 c) {\r\n if (c.a < 0.5) return -1;\r\n ivec3 b = ivec3(floor(c.rgb * 255.0 + 0.5));\r\n return b.r * 65536 + b.g * 256 + b.b;\r\n}\r\n`;\r\n\r\n/** Resample (box / nearest) + adjust + alpha cut. iChannel0 = source image. */\r\nexport const PREP = /* glsl */`\r\n// 0 box, 1 nearest\r\nuniform int u_resample;\r\n// brightness, contrast, saturation, gamma\r\nuniform vec4 u_adjust;\r\n// hue rotation in degrees\r\nuniform float u_hue;\r\nuniform float u_alphaCut;\r\n// source region in texels: x, y (from the top-left), width, height\r\nuniform ivec4 u_crop;\r\n\r\nvoid main() {\r\n ivec2 P = topDown();\r\n ivec2 R = ivec2(u_resolution);\r\n ivec2 O = u_crop.xy;\r\n ivec2 S = u_crop.zw;\r\n int nx = u_resample == 1 ? 1 : clamp((S.x + R.x - 1) / R.x, 1, 16);\r\n int ny = u_resample == 1 ? 1 : clamp((S.y + R.y - 1) / R.y, 1, 16);\r\n vec4 acc = vec4(0.0);\r\n for (int j = 0; j < 16; j++) {\r\n if (j >= ny) break;\r\n int sy = min(S.y - 1, ((2 * (P.y * ny + j) + 1) * S.y) / (2 * R.y * ny));\r\n for (int i = 0; i < 16; i++) {\r\n if (i >= nx) break;\r\n int sx = min(S.x - 1, ((2 * (P.x * nx + i) + 1) * S.x) / (2 * R.x * nx));\r\n vec4 c = at(iChannel0, O + ivec2(sx, sy));\r\n acc += vec4(c.rgb * c.a, c.a);\r\n }\r\n }\r\n vec3 c = acc.a > 0.0 ? acc.rgb / acc.a : vec3(0.0);\r\n float a = acc.a / float(nx * ny);\r\n\r\n float br = u_adjust.x, co = u_adjust.y, sa = u_adjust.z, ga = u_adjust.w;\r\n if (br != 0.0 || co != 0.0 || sa != 0.0 || ga != 1.0 || u_hue != 0.0) {\r\n float f = co >= 0.0 ? 1.0 / (1.0 - 0.99 * co) : 1.0 + co;\r\n c = (c + br - 0.5) * f + 0.5;\r\n float l = dot(c, vec3(0.2126, 0.7152, 0.0722));\r\n c = l + (c - l) * (1.0 + sa);\r\n if (u_hue != 0.0) {\r\n float h = radians(u_hue), k = cos(h), q = sin(h);\r\n c = vec3(\r\n (0.213 + 0.787 * k - 0.213 * q) * c.r + (0.715 - 0.715 * k - 0.715 * q) * c.g + (0.072 - 0.072 * k + 0.928 * q) * c.b,\r\n (0.213 - 0.213 * k + 0.143 * q) * c.r + (0.715 + 0.285 * k + 0.140 * q) * c.g + (0.072 - 0.072 * k - 0.283 * q) * c.b,\r\n (0.213 - 0.213 * k - 0.787 * q) * c.r + (0.715 - 0.715 * k + 0.715 * q) * c.g + (0.072 + 0.928 * k + 0.072 * q) * c.b);\r\n }\r\n c = pow(clamp(c, 0.0, 1.0), vec3(1.0 / ga));\r\n }\r\n a = (a >= u_alphaCut && a > 0.0) ? 1.0 : 0.0;\r\n fragColor = vec4(c * a, a);\r\n}\r\n`;\r\n\r\n/** No dither / ordered dither. iChannel0 = prep. */\r\nexport const QUANT = /* glsl */`\r\n// threshold bytes in .r\r\nuniform sampler2D u_matrix;\r\n// 0 pass-through, 1 nearest, 2 ordered\r\nuniform int u_mode;\r\nuniform float u_levels;\r\n// spread \u00D7 strength\r\nuniform float u_amount;\r\n\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 p = at(iChannel0, P);\r\n if (p.a < 0.5) { fragColor = vec4(0.0); return; }\r\n vec3 c = p.rgb;\r\n if (u_mode == 0) { fragColor = vec4(floor(c * 255.0 + 0.5) / 255.0, 1.0); return; }\r\n if (u_mode == 2) {\r\n ivec2 ms = textureSize(u_matrix, 0);\r\n float v = floor(at(u_matrix, ivec2(P.x % ms.x, P.y % ms.y)).r * 255.0 + 0.5);\r\n float t = (v + 0.5) / u_levels - 0.5;\r\n c = clamp(c + t * u_amount, 0.0, 1.0);\r\n }\r\n fragColor = vec4(palColor(nearestIndex(c)), 1.0);\r\n}\r\n`;\r\n\r\n/**\r\n * Error diffusion as a wavefront. Iteration r computes every pixel with x + skew*y == r,\r\n * pulling the stored error of already-computed neighbours.\r\n * Output: rgb = quantisation error, a = palette index (-1 not yet computed, -2 transparent).\r\n * iChannel0 = prep, iChannel1 = this pass (previous iteration).\r\n */\r\nexport const DIFFUSE = /* glsl */`\r\n// iteration index, set by ShaderMate for passes with iterations (declared here: a FragCoord.xyz built-in)\r\nuniform int u_recursion;\r\nuniform int u_on;\r\nuniform int u_skew;\r\nuniform float u_strength;\r\nuniform int u_kn;\r\n// push offsets (dx, dy) and weight\r\nuniform vec3 u_kernel[12];\r\n\r\nvoid main() {\r\n if (u_on == 0) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\r\n ivec2 P = topDown();\r\n int k = P.x + u_skew * P.y;\r\n int r = u_recursion;\r\n if (k < r) { fragColor = at(iChannel1, P); return; }\r\n if (k > r) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\r\n vec4 p = at(iChannel0, P);\r\n if (p.a < 0.5) { fragColor = vec4(0.0, 0.0, 0.0, -2.0); return; }\r\n vec3 acc = vec3(0.0);\r\n for (int i = 0; i < 12; i++) {\r\n if (i >= u_kn) break;\r\n ivec2 Q = P - ivec2(u_kernel[i].xy);\r\n if (!inside(Q)) continue;\r\n vec4 e = at(iChannel1, Q);\r\n if (e.a >= 0.0) acc += e.rgb * u_kernel[i].z;\r\n }\r\n vec3 c = clamp(p.rgb + acc * u_strength, 0.0, 1.0);\r\n int idx = nearestIndex(c);\r\n fragColor = vec4(c - palColor(idx), float(idx));\r\n}\r\n`;\r\n\r\n/** Pick the ordered result or turn diffusion indices into colours. iChannel0 = quant, iChannel1 = diffuse. */\r\nexport const RESOLVE = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n if (u_on == 0) { fragColor = at(iChannel0, P); return; }\r\n vec4 d = at(iChannel1, P);\r\n fragColor = d.a < 0.0 ? vec4(0.0) : vec4(palColor(int(d.a + 0.5)), 1.0);\r\n}\r\n`;\r\n\r\n/** Orphan removal. iChannel0 = resolve. */\r\nexport const ORPHAN = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_on == 0) return;\r\n int c = colorKey(me);\r\n ivec2 off[4] = ivec2[4](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0));\r\n int ks[4]; vec4 cs[4]; int n = 0;\r\n for (int i = 0; i < 4; i++) {\r\n ivec2 Q = P + off[i];\r\n if (!inside(Q)) continue;\r\n cs[n] = at(iChannel0, Q); ks[n] = colorKey(cs[n]);\r\n if (ks[n] == c) return;\r\n n++;\r\n }\r\n if (n < 2) return;\r\n int best = 0, bc = 0;\r\n for (int i = 0; i < 4; i++) {\r\n if (i >= n) break;\r\n int m = 0;\r\n for (int j = 0; j < 4; j++) { if (j >= n) break; if (ks[j] == ks[i]) m++; }\r\n if (m > bc) { bc = m; best = i; }\r\n }\r\n fragColor = cs[best];\r\n}\r\n`;\r\n\r\n/** 3\u00D73 majority smoothing. iChannel0 = orphan. */\r\nexport const SMOOTH = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_on == 0) return;\r\n int c = colorKey(me);\r\n ivec2 R = ivec2(u_resolution);\r\n int ks[9]; vec4 cs[9];\r\n for (int j = 0; j < 3; j++) for (int i = 0; i < 3; i++) {\r\n ivec2 Q = clamp(P + ivec2(i - 1, j - 1), ivec2(0), R - 1);\r\n cs[j * 3 + i] = at(iChannel0, Q); ks[j * 3 + i] = colorKey(cs[j * 3 + i]);\r\n }\r\n for (int i = 0; i < 9; i++) {\r\n if (ks[i] == c) continue;\r\n int m = 0;\r\n for (int j = 0; j < 9; j++) if (ks[j] == ks[i]) m++;\r\n if (m >= 5) { fragColor = cs[i]; return; }\r\n }\r\n}\r\n`;\r\n\r\n/** Outline, drawn to the canvas. iChannel0 = smooth. */\r\nexport const OUTLINE = /* glsl */`\r\n// 0 none, 1 outer, 2 inner\r\nuniform int u_outline;\r\nuniform int u_corners;\r\nuniform vec3 u_outlineColor;\r\nbool opaqueAt(ivec2 q) { return inside(q) && at(iChannel0, q).a > 0.5; }\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_outline == 0) return;\r\n bool o = me.a > 0.5;\r\n ivec2 off[8] = ivec2[8](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0), ivec2(-1, -1), ivec2(1, -1), ivec2(1, 1), ivec2(-1, 1));\r\n int n = u_corners == 1 ? 8 : 4;\r\n for (int i = 0; i < 8; i++) {\r\n if (i >= n) break;\r\n ivec2 Q = P + off[i];\r\n if (!inside(Q)) continue;\r\n bool other = opaqueAt(Q);\r\n if (u_outline == 1 ? (!o && other) : (o && !other)) { fragColor = vec4(u_outlineColor, 1.0); return; }\r\n }\r\n}\r\n`;\r\n", "// Turning whatever the caller has into a \"frame\": { width, height, canvas?, data }.\r\n// Accepts URLs, Blobs/Files, <img>, <canvas>, OffscreenCanvas, ImageBitmap, <video> (current frame),\r\n// VideoFrame, ImageData or any { width, height, data } RGBA object, plus p5 / q5 images.\r\n\r\nexport const MAX_SOURCE = 4096;\r\nconst hasDOM = typeof document !== 'undefined';\r\n\r\nconst isRGBA = s => s && typeof s === 'object' && 'data' in s && 'width' in s && 'height' in s && s.data && s.data.length === s.width * s.height * 4;\r\n\r\n/** Load a URL or Blob into something drawable. */\r\nexport async function loadImage(src) {\r\n if (typeof Blob !== 'undefined' && src instanceof Blob) {\r\n if (typeof createImageBitmap === 'function') {\r\n try { return await createImageBitmap(src); } catch { /* fall through (e.g. SVG) */ }\r\n }\r\n src = URL.createObjectURL(src);\r\n }\r\n if (!hasDOM) throw new Error('Loading images by URL needs a browser; pass { width, height, data } in Node.');\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.decoding = 'async';\r\n img.src = src;\r\n await img.decode();\r\n return img;\r\n}\r\n\r\n/** Natural pixel size of a drawable. */\r\nexport function sizeOf(el) {\r\n return {\r\n width: el.naturalWidth || el.videoWidth || el.displayWidth || el.codedWidth || el.width || 0,\r\n height: el.naturalHeight || el.videoHeight || el.displayHeight || el.codedHeight || el.height || 0,\r\n };\r\n}\r\n\r\nfunction unwrap(src) {\r\n // p5.Image / q5 image / p5.Graphics / p5.Renderer\r\n if (src && !isRGBA(src) && typeof src === 'object') {\r\n if (src.canvas && typeof src.canvas === 'object' && 'getContext' in src.canvas) return src.canvas;\r\n if (src.elt && typeof src.elt === 'object' && 'getContext' in src.elt) return src.elt;\r\n }\r\n return src;\r\n}\r\n\r\n/**\r\n * @param {any} source\r\n * @param {{ maxSize?: number, canvas?: HTMLCanvasElement }} [opts] canvas: scratch canvas to reuse\r\n */\r\nexport async function toFrame(source, opts = {}) {\r\n const maxSize = opts.maxSize || MAX_SOURCE;\r\n let src = unwrap(source);\r\n if (typeof src === 'string' || (typeof Blob !== 'undefined' && src instanceof Blob)) src = await loadImage(src);\r\n if (src && typeof src.complete === 'boolean' && !src.complete && src.decode) await src.decode();\r\n\r\n if (isRGBA(src)) {\r\n const frame = { width: src.width, height: src.height, data: src.data, canvas: null };\r\n if (hasDOM) {\r\n Object.defineProperty(frame, 'canvas', {\r\n configurable: true,\r\n get() {\r\n const c = document.createElement('canvas'); c.width = src.width; c.height = src.height;\r\n const img = new ImageData(new Uint8ClampedArray(src.data), src.width, src.height);\r\n c.getContext('2d').putImageData(img, 0, 0);\r\n Object.defineProperty(frame, 'canvas', { value: c });\r\n return c;\r\n },\r\n });\r\n }\r\n return frame;\r\n }\r\n if (!hasDOM) throw new Error('Unsupported source in a non-browser environment. Pass { width, height, data }.');\r\n\r\n let { width, height } = sizeOf(src);\r\n if (!width || !height) throw new Error('Source has no size yet (is the image or video loaded?)');\r\n const k = Math.min(1, maxSize / Math.max(width, height));\r\n width = Math.max(1, Math.round(width * k)); height = Math.max(1, Math.round(height * k));\r\n\r\n const canvas = opts.canvas || document.createElement('canvas');\r\n canvas.width = width; canvas.height = height;\r\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\r\n ctx.clearRect(0, 0, width, height);\r\n ctx.imageSmoothingEnabled = k < 1;\r\n ctx.imageSmoothingQuality = 'high';\r\n ctx.drawImage(src, 0, 0, width, height);\r\n let cached = null;\r\n return {\r\n width, height, canvas, dirty: true,\r\n get data() { return (cached ||= ctx.getImageData(0, 0, width, height).data); },\r\n };\r\n}\r\n", "// Pure pixel helpers (no DOM): integer upscaling, grid lines, colour counting.\r\n\r\nimport { parseColor, toHex } from '../color.js';\r\n\r\n/**\r\n * Nearest-neighbour integer upscale.\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\r\n * @param {number} k scale factor (integer \u2265 1)\r\n * @param {{ grid?: boolean, gridColor?: string, gridAlpha?: number }} [opts] grid: 1px lines between source pixels\r\n */\r\nexport function upscale(img, k = 1, opts = {}) {\r\n k = Math.max(1, Math.round(k));\r\n const w = img.width * k, h = img.height * k;\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const src = img.data, sw = img.width;\r\n for (let y = 0; y < h; y++) {\r\n const sy = (y / k) | 0;\r\n for (let x = 0; x < w; x++) {\r\n const so = (sy * sw + ((x / k) | 0)) * 4, o = (y * w + x) * 4;\r\n out[o] = src[so]; out[o + 1] = src[so + 1]; out[o + 2] = src[so + 2]; out[o + 3] = src[so + 3];\r\n }\r\n }\r\n if (opts.grid && k >= 3) {\r\n const [r, g, b] = parseColor(opts.gridColor || '#000000');\r\n const a = opts.gridAlpha ?? 0.35;\r\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {\r\n if (x % k && y % k) continue;\r\n const o = (y * w + x) * 4;\r\n const sa = out[o + 3] / 255, oa = a + sa * (1 - a);\r\n out[o] = (r * a + out[o] * sa * (1 - a)) / oa;\r\n out[o + 1] = (g * a + out[o + 1] * sa * (1 - a)) / oa;\r\n out[o + 2] = (b * a + out[o + 2] * sa * (1 - a)) / oa;\r\n out[o + 3] = oa * 255;\r\n }\r\n }\r\n return { width: w, height: h, data: out };\r\n}\r\n\r\n/**\r\n * Nearest-neighbour resize to any size (used to export at the source's resolution, like 2.x's\r\n * \"full resolution\" download). Pixels may differ by one in size when the ratio isn't whole.\r\n */\r\nexport function resizeNearest(img, width, height) {\r\n width = Math.max(1, Math.round(width)); height = Math.max(1, Math.round(height));\r\n const out = new Uint8ClampedArray(width * height * 4);\r\n const xs = new Int32Array(width);\r\n for (let x = 0; x < width; x++) xs[x] = Math.min(img.width - 1, Math.floor((x + 0.5) * img.width / width));\r\n for (let y = 0; y < height; y++) {\r\n const sy = Math.min(img.height - 1, Math.floor((y + 0.5) * img.height / height));\r\n for (let x = 0; x < width; x++) {\r\n const so = (sy * img.width + xs[x]) * 4, o = (y * width + x) * 4;\r\n out[o] = img.data[so]; out[o + 1] = img.data[so + 1]; out[o + 2] = img.data[so + 2]; out[o + 3] = img.data[so + 3];\r\n }\r\n }\r\n return { width, height, data: out };\r\n}\r\n\r\n/** Distinct opaque colours in an image ('#rrggbb'), in order of first appearance. */\r\nexport function uniqueColors(img, limit = Infinity) {\r\n const seen = new Set();\r\n const d = img.data;\r\n for (let o = 0; o < d.length; o += 4) {\r\n if (d[o + 3] === 0) continue;\r\n seen.add((d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\n if (seen.size > limit) break;\r\n }\r\n return [...seen].map(v => toHex([v >> 16, (v >> 8) & 255, v & 255]));\r\n}\r\n\r\n/** True when the image has at least one non-opaque pixel. */\r\nexport function hasTransparency(img) {\r\n for (let o = 3; o < img.data.length; o += 4) if (img.data[o] < 255) return true;\r\n return false;\r\n}\r\n\r\n/**\r\n * Detect the pixel-grid size of an upscaled pixel-art image (e.g. a sprite saved at 4\u00D7).\r\n * Returns the largest block size b such that the image is made of b\u00D7b solid blocks\r\n * (allowing a small tolerance for JPEG noise), or 1.\r\n */\r\nexport function detectGrid(img, tolerance = 8) {\r\n const { width: w, height: h, data: d } = img;\r\n const same = (a, b) => Math.abs(d[a] - d[b]) <= tolerance && Math.abs(d[a + 1] - d[b + 1]) <= tolerance && Math.abs(d[a + 2] - d[b + 2]) <= tolerance && Math.abs(d[a + 3] - d[b + 3]) <= tolerance;\r\n // run lengths along rows and columns; the block size divides all of them (mostly)\r\n const gcd = (a, b) => (b ? gcd(b, a % b) : a);\r\n let g = 0;\r\n const stepY = Math.max(1, Math.floor(h / 64)), stepX = Math.max(1, Math.floor(w / 64));\r\n for (let y = 0; y < h; y += stepY) {\r\n let run = 1;\r\n for (let x = 1; x < w; x++) {\r\n if (same((y * w + x) * 4, (y * w + x - 1) * 4)) run++;\r\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\r\n }\r\n }\r\n for (let x = 0; x < w; x += stepX) {\r\n let run = 1;\r\n for (let y = 1; y < h; y++) {\r\n if (same((y * w + x) * 4, ((y - 1) * w + x) * 4)) run++;\r\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\r\n }\r\n }\r\n return g || 1;\r\n}\r\n", "// DOM helpers: canvases and downloads.\r\n\r\nimport { upscale } from './scale.js';\r\n\r\n/** RGBA image \u2192 <canvas>, upscaled by an integer factor with optional grid lines. */\r\nexport function toCanvas(img, scale = 1, opts = {}) {\r\n const up = scale > 1 || opts.grid ? upscale(img, scale, opts) : img;\r\n const c = opts.canvas || document.createElement('canvas');\r\n c.width = up.width; c.height = up.height;\r\n c.getContext('2d').putImageData(new ImageData(new Uint8ClampedArray(up.data), up.width, up.height), 0, 0);\r\n return c;\r\n}\r\n\r\n/** Trigger a browser download for a Blob or bytes. */\r\nexport function downloadBlob(data, filename, type = 'application/octet-stream') {\r\n const blob = data instanceof Blob ? data : new Blob([data], { type });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url; a.download = filename; a.rel = 'noopener';\r\n document.body.appendChild(a); a.click(); a.remove();\r\n setTimeout(() => URL.revokeObjectURL(url), 10000);\r\n}\r\n", "// CRC-32 (IEEE), shared by the PNG and zip writers.\r\nlet table = null;\r\nexport function crc32(bytes, crc = 0) {\r\n if (!table) {\r\n table = new Uint32Array(256);\r\n for (let n = 0; n < 256; n++) {\r\n let c = n;\r\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\r\n table[n] = c >>> 0;\r\n }\r\n }\r\n crc = ~crc >>> 0;\r\n for (let i = 0; i < bytes.length; i++) crc = table[(crc ^ bytes[i]) & 255] ^ (crc >>> 8);\r\n return ~crc >>> 0;\r\n}\r\n", "// Minimal PNG encoder: indexed (colour type 3, with tRNS) when the image has \u2264 256 colours,\r\n// otherwise RGBA. Uses CompressionStream('deflate'), so it works in browsers and in Node 18+.\r\n\r\nimport { crc32 } from './crc32.js';\r\nimport { upscale, resizeNearest } from './scale.js';\r\n\r\nconst SIG = [137, 80, 78, 71, 13, 10, 26, 10];\r\n\r\nasync function deflate(bytes) {\r\n if (typeof CompressionStream === 'function') {\r\n const cs = new CompressionStream('deflate');\r\n const stream = new Blob([bytes]).stream().pipeThrough(cs);\r\n return new Uint8Array(await new Response(stream).arrayBuffer());\r\n }\r\n const { deflateSync } = await import('node:zlib');\r\n return new Uint8Array(deflateSync(bytes));\r\n}\r\n\r\nfunction chunk(type, data) {\r\n const out = new Uint8Array(12 + data.length);\r\n const dv = new DataView(out.buffer);\r\n dv.setUint32(0, data.length);\r\n for (let i = 0; i < 4; i++) out[4 + i] = type.charCodeAt(i);\r\n out.set(data, 8);\r\n dv.setUint32(8 + data.length, crc32(out.subarray(4, 8 + data.length)));\r\n return out;\r\n}\r\n\r\n/** Map pixels to palette indices. Returns null when there are more than 256 colours. */\r\nexport function indexImage(img) {\r\n const d = img.data, n = img.width * img.height;\r\n const map = new Map(), colors = [], idx = new Uint8Array(n);\r\n for (let i = 0; i < n; i++) {\r\n const o = i * 4;\r\n const k = d[o + 3] === 0 ? -1 : ((d[o] << 24) | (d[o + 1] << 16) | (d[o + 2] << 8) | d[o + 3]) >>> 0;\r\n let v = map.get(k);\r\n if (v === undefined) {\r\n if (colors.length === 256) return null;\r\n v = colors.length; map.set(k, v);\r\n colors.push(k === -1 ? [0, 0, 0, 0] : [d[o], d[o + 1], d[o + 2], d[o + 3]]);\r\n }\r\n idx[i] = v;\r\n }\r\n return { colors, indices: idx };\r\n}\r\n\r\n/**\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\r\n * @param {{ scale?: number, grid?: boolean, gridColor?: string, indexed?: boolean, width?: number, height?: number }} [opts]\r\n * width/height: resize to exactly this size (nearest neighbour) instead of scaling\r\n * @returns {Promise<Uint8Array>}\r\n */\r\nexport async function encodePNG(img, opts = {}) {\r\n if (opts.width && opts.height) img = resizeNearest(img, opts.width, opts.height);\r\n else if ((opts.scale && opts.scale > 1) || opts.grid) img = upscale(img, opts.scale || 1, opts);\r\n const { width: w, height: h } = img;\r\n const ix = opts.indexed === false ? null : indexImage(img);\r\n const ihdr = new Uint8Array(13);\r\n const dv = new DataView(ihdr.buffer);\r\n dv.setUint32(0, w); dv.setUint32(4, h);\r\n const parts = [new Uint8Array(SIG)];\r\n let raw;\r\n if (ix) {\r\n const bits = ix.colors.length <= 2 ? 1 : ix.colors.length <= 4 ? 2 : ix.colors.length <= 16 ? 4 : 8;\r\n ihdr.set([bits, 3, 0, 0, 0], 8);\r\n const stride = Math.ceil(w * bits / 8);\r\n raw = new Uint8Array((stride + 1) * h);\r\n for (let y = 0; y < h; y++) {\r\n const row = y * (stride + 1) + 1;\r\n for (let x = 0; x < w; x++) {\r\n const v = ix.indices[y * w + x];\r\n const bit = x * bits;\r\n raw[row + (bit >> 3)] |= v << (8 - bits - (bit & 7));\r\n }\r\n }\r\n parts.push(chunk('IHDR', ihdr));\r\n parts.push(chunk('PLTE', Uint8Array.from(ix.colors.flatMap(c => c.slice(0, 3)))));\r\n if (ix.colors.some(c => c[3] < 255)) {\r\n let last = ix.colors.length; while (last > 0 && ix.colors[last - 1][3] === 255) last--;\r\n parts.push(chunk('tRNS', Uint8Array.from(ix.colors.slice(0, last).map(c => c[3]))));\r\n }\r\n } else {\r\n ihdr.set([8, 6, 0, 0, 0], 8);\r\n raw = new Uint8Array((w * 4 + 1) * h);\r\n for (let y = 0; y < h; y++) raw.set(img.data.subarray ? img.data.subarray(y * w * 4, (y + 1) * w * 4) : Array.prototype.slice.call(img.data, y * w * 4, (y + 1) * w * 4), y * (w * 4 + 1) + 1);\r\n parts.push(chunk('IHDR', ihdr));\r\n }\r\n parts.push(chunk('IDAT', await deflate(raw)));\r\n parts.push(chunk('IEND', new Uint8Array(0)));\r\n const total = parts.reduce((s, p) => s + p.length, 0);\r\n const out = new Uint8Array(total);\r\n let o = 0; for (const p of parts) { out.set(p, o); o += p.length; }\r\n return out;\r\n}\r\n", "// The public engine: createPixelator() picks a backend and turns sources into pixel art.\r\n\r\nimport { makePlan } from './plan.js';\r\nimport { runCPU } from './cpu/pipeline.js';\r\nimport { createGPUBackend } from './gpu/backend.js';\r\nimport { toFrame } from './source.js';\r\nimport { normalizeSettings, LEGACY_DITHER } from './settings.js';\r\nimport { uniqueColors } from './export/scale.js';\r\nimport { toCanvas } from './export/canvas.js';\r\nimport { encodePNG } from './export/png.js';\r\n\r\nconst isVideo = s => typeof HTMLVideoElement !== 'undefined' && s instanceof HTMLVideoElement;\r\nconst isVideoFrame = s => typeof VideoFrame !== 'undefined' && s instanceof VideoFrame;\r\n\r\n/**\r\n * Create an engine. Reuse one for many images: the GPU backend compiles its shaders once.\r\n * @param {{ backend?: 'auto' | 'webgl' | 'cpu', diffusion?: 'auto' | 'gpu' | 'cpu', maxSourceSize?: number }} [options]\r\n * diffusion: where error diffusion runs. 'auto' uses the GPU unless WebGL is software-rendered.\r\n */\r\nexport async function createPixelator(options = {}) {\r\n const want = options.backend || 'auto';\r\n let gpu = null, gpuError = null;\r\n if (want !== 'cpu' && typeof document !== 'undefined') {\r\n try { gpu = await createGPUBackend(); } catch (e) {\r\n gpuError = e;\r\n if (want === 'webgl') throw e;\r\n }\r\n }\r\n const scratch = typeof document !== 'undefined' ? document.createElement('canvas') : null;\r\n let last = { source: null, frame: null };\r\n let queue = Promise.resolve();\r\n\r\n async function frameFor(source) {\r\n if (source === last.source && last.frame && !isVideo(source) && !isVideoFrame(source)) {\r\n last.frame.dirty = false;\r\n return last.frame;\r\n }\r\n const frame = await toFrame(source, { maxSize: options.maxSourceSize, canvas: scratch });\r\n last = { source, frame };\r\n return frame;\r\n }\r\n\r\n async function processNow(source, settings) {\r\n const t0 = typeof performance !== 'undefined' ? performance.now() : Date.now();\r\n const frame = await frameFor(source);\r\n const plan = makePlan(settings, frame);\r\n let data, backend = 'cpu';\r\n const diffusionOnCPU = plan.kind === 'diffusion' && (options.diffusion === 'cpu' || (options.diffusion !== 'gpu' && gpu && gpu.software));\r\n if (gpu && frame.canvas && !diffusionOnCPU) {\r\n data = await gpu.run(plan, frame);\r\n backend = 'webgl';\r\n } else {\r\n data = runCPU(plan, frame);\r\n }\r\n const ms = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - t0;\r\n return makeResult(plan, data, backend, ms);\r\n }\r\n\r\n return {\r\n /** 'webgl' or 'cpu' */\r\n get backend() { return gpu ? 'webgl' : 'cpu'; },\r\n /** GPU renderer string (WebGL backend only). */\r\n get renderer() { return gpu ? gpu.renderer : ''; },\r\n /** Why the GPU backend is not in use, if it isn't. */\r\n get fallbackReason() { return gpuError ? String(gpuError.message || gpuError) : ''; },\r\n /**\r\n * Process one source. Calls are queued, so it is safe to call from input handlers.\r\n * @returns {Promise<PixelResult>}\r\n */\r\n process(source, settings = {}) {\r\n const run = queue.then(() => processNow(source, settings));\r\n queue = run.catch(() => { });\r\n return run;\r\n },\r\n /** Forget the cached source (call after drawing new content into the same canvas). */\r\n invalidate() { last = { source: null, frame: null }; },\r\n destroy() { if (gpu) gpu.destroy(); gpu = null; },\r\n /** The underlying ShaderMate instance (GPU backend only), for debugging. */\r\n get shader() { return gpu ? gpu.shader : null; },\r\n };\r\n}\r\n\r\n/**\r\n * @typedef {object} PixelResult\r\n * @property {number} width\r\n * @property {number} height\r\n * @property {Uint8ClampedArray} data RGBA, rows top-down\r\n * @property {string[]} palette colours actually available ('#rrggbb')\r\n * @property {object} settings normalised settings used\r\n * @property {'webgl'|'cpu'} backend\r\n * @property {number} ms processing time\r\n */\r\nexport function makeResult(plan, data, backend = 'cpu', ms = 0) {\r\n const result = {\r\n width: plan.width,\r\n height: plan.height,\r\n data,\r\n palette: plan.paletteHex ? plan.paletteHex.slice() : null,\r\n settings: plan.settings,\r\n kind: plan.kind,\r\n waves: plan.waves,\r\n /** The framed part of the source, as fractions of its width and height. */\r\n crop: { x: plan.crop.x / plan.srcWidth, y: plan.crop.y / plan.srcHeight, w: plan.crop.w / plan.srcWidth, h: plan.crop.h / plan.srcHeight },\r\n backend,\r\n ms,\r\n /** Distinct colours actually used in the image. */\r\n usedColors() { return uniqueColors(this); },\r\n toImageData() { return new ImageData(new Uint8ClampedArray(this.data), this.width, this.height); },\r\n /** Canvas at `scale` \u00D7 (nearest-neighbour), optional grid lines. */\r\n toCanvas(scale = 1, opts = {}) { return toCanvas(this, scale, opts); },\r\n /** PNG bytes (indexed when \u2264 256 colours unless `indexed: false`). */\r\n toPNG(opts = {}) { return encodePNG(this, opts); },\r\n async toBlob(opts = {}) { return new Blob([await encodePNG(this, opts)], { type: 'image/png' }); },\r\n };\r\n return result;\r\n}\r\n\r\nlet shared = null;\r\n/** One-shot helper with a shared engine. `pixelate(source, settings)`. */\r\nexport async function pixelate(source, settings) {\r\n // classic API: pixelate({ image, width, dither, strength, palette, resolution }) \u2192 canvas\r\n if (settings === undefined && source && typeof source === 'object' && 'image' in source && 'width' in source) {\r\n return pixelateClassic(source);\r\n }\r\n shared ||= createPixelator();\r\n return (await shared).process(source, settings);\r\n}\r\n\r\n/** Compatibility with image-to-pixel.js 2.x. Returns a canvas like the old function did. */\r\nasync function pixelateClassic(opts) {\r\n const { image, width, dither = 'none', strength = 0, palette = null, resolution = 'original' } = opts;\r\n let pal = { source: 'none' };\r\n if (Array.isArray(palette)) pal = { source: 'custom', colors: palette };\r\n else if (typeof palette === 'string') {\r\n const { fetchLospec } = await import('./palette/lospec.js');\r\n const p = await fetchLospec(palette);\r\n pal = { source: 'custom', colors: p.colors, name: p.name };\r\n }\r\n const settings = normalizeSettings({\r\n size: { width },\r\n palette: pal,\r\n dither: { method: LEGACY_DITHER[String(dither).toLowerCase()] || 'none', strength: strength / 100 },\r\n alpha: { threshold: 0 },\r\n });\r\n shared ||= createPixelator();\r\n const engine = await shared;\r\n const res = await engine.process(image, settings);\r\n if (resolution === 'original') {\r\n const frame = await toFrame(image);\r\n const c = document.createElement('canvas');\r\n c.width = frame.width; c.height = frame.height;\r\n const ctx = c.getContext('2d');\r\n ctx.imageSmoothingEnabled = false;\r\n ctx.drawImage(res.toCanvas(1), 0, 0, c.width, c.height);\r\n return c;\r\n }\r\n return res.toCanvas(1);\r\n}\r\n", "// Built-in presets: partial settings applied on top of the defaults.\r\n\r\nexport const PRESETS = [\r\n {\r\n id: 'balanced', name: 'Balanced', description: 'Endesga 32, Bayer 4\u00D74. A good first look at most photos.',\r\n settings: { size: { width: 96 }, palette: { source: 'builtin', id: 'endesga-32' }, dither: { method: 'bayer4', strength: 0.6 } },\r\n },\r\n {\r\n id: 'game-boy', name: 'Game Boy', description: 'Four greens, 160 px wide, ordered dither.',\r\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'game-boy-dmg' }, dither: { method: 'bayer4', strength: 1 }, adjust: { contrast: 0.15 } },\r\n },\r\n {\r\n id: 'pico-8', name: 'PICO-8', description: '128 px, the PICO-8 palette, blue-noise dither.',\r\n settings: { size: { width: 128 }, palette: { source: 'builtin', id: 'pico-8' }, dither: { method: 'bluenoise', strength: 0.7 } },\r\n },\r\n {\r\n id: 'one-bit', name: '1-bit Atkinson', description: 'Classic Mac look: two colours, Atkinson diffusion.',\r\n settings: { size: { width: 192 }, palette: { source: 'builtin', id: '1-bit-monitor' }, dither: { method: 'atkinson', strength: 1 }, adjust: { contrast: 0.2 } },\r\n },\r\n {\r\n id: 'faithful', name: 'Faithful colour', description: 'Palette extracted from the image, Floyd\u2013Steinberg.',\r\n settings: { size: { width: 128 }, palette: { source: 'extract', count: 24 }, dither: { method: 'floyd-steinberg', strength: 0.75 } },\r\n },\r\n {\r\n id: 'sprite', name: 'Clean sprite', description: 'No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.',\r\n settings: { size: { width: 48, resample: 'nearest' }, palette: { source: 'extract', count: 12 }, dither: { method: 'none' }, cleanup: { orphans: true }, outline: { mode: 'outer', color: '#1a1c2c' } },\r\n },\r\n {\r\n id: 'cga', name: 'CGA', description: '16 hard colours with an 8\u00D78 Bayer pattern.',\r\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'cga-16' }, dither: { method: 'bayer8', strength: 1 } },\r\n },\r\n {\r\n id: 'newsprint', name: 'Newsprint', description: 'Grey clustered-dot halftone.',\r\n settings: { size: { width: 220 }, palette: { source: 'builtin', id: 'grayscale-4' }, dither: { method: 'cluster8', strength: 1 }, adjust: { saturation: -1 } },\r\n },\r\n {\r\n id: 'soft', name: 'Soft painterly', description: 'Resurrect 64 with Sierra Lite and a light smooth.',\r\n settings: { size: { width: 112 }, palette: { source: 'builtin', id: 'resurrect-64' }, dither: { method: 'sierra-lite', strength: 0.6 }, cleanup: { smooth: true } },\r\n },\r\n];\r\n\r\nexport const getPreset = id => PRESETS.find(p => p.id === id) || null;\r\n", "// Animated GIF encoder. Pixel art already uses a small palette, so frames are written\r\n// losslessly with one global colour table whenever the whole animation fits in 256 colours\r\n// (255 + transparency). Otherwise each frame gets its own table, reduced by median cut if needed.\r\n\r\nimport { upscale } from './scale.js';\r\nimport { extractPalette } from '../palette/extract.js';\r\nimport { parseColor } from '../color.js';\r\n\r\nclass ByteWriter {\r\n constructor() { this.buf = new Uint8Array(1 << 16); this.n = 0; }\r\n byte(b) { if (this.n === this.buf.length) { const nb = new Uint8Array(this.buf.length * 2); nb.set(this.buf); this.buf = nb; } this.buf[this.n++] = b; }\r\n bytes(arr) { for (let i = 0; i < arr.length; i++) this.byte(arr[i]); }\r\n u16(v) { this.byte(v & 255); this.byte((v >> 8) & 255); }\r\n str(s) { for (let i = 0; i < s.length; i++) this.byte(s.charCodeAt(i)); }\r\n result() { return this.buf.slice(0, this.n); }\r\n}\r\n\r\n/** GIF-flavoured LZW for one frame of indices. */\r\nexport function lzwEncode(indices, minCodeSize, w) {\r\n const clear = 1 << minCodeSize, eoi = clear + 1;\r\n let codeSize = minCodeSize + 1, next = eoi + 1;\r\n let dict = new Map();\r\n let cur = 0, curBits = 0;\r\n const sub = [];\r\n let block = [];\r\n const emit = code => {\r\n cur |= code << curBits; curBits += codeSize;\r\n while (curBits >= 8) { block.push(cur & 255); cur >>>= 8; curBits -= 8; if (block.length === 255) { sub.push(block); block = []; } }\r\n };\r\n emit(clear);\r\n let prefix = indices[0];\r\n for (let i = 1; i < indices.length; i++) {\r\n const k = indices[i];\r\n const key = prefix * 256 + k;\r\n const hit = dict.get(key);\r\n if (hit !== undefined) { prefix = hit; continue; }\r\n emit(prefix);\r\n if (next < 4096) {\r\n dict.set(key, next++);\r\n if (next > (1 << codeSize) && codeSize < 12) codeSize++;\r\n } else {\r\n emit(clear); dict = new Map(); codeSize = minCodeSize + 1; next = eoi + 1;\r\n }\r\n prefix = k;\r\n }\r\n emit(prefix);\r\n emit(eoi);\r\n if (curBits > 0) block.push(cur & 255);\r\n if (block.length) sub.push(block);\r\n w.byte(minCodeSize);\r\n for (const b of sub) { w.byte(b.length); w.bytes(b); }\r\n w.byte(0);\r\n}\r\n\r\nconst keyOf = (d, o) => (d[o + 3] < 128 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\n\r\nfunction tableFor(colorKeys, transparent) {\r\n const list = [...colorKeys].filter(k => k !== -1);\r\n const colors = list.map(k => [k >> 16, (k >> 8) & 255, k & 255]);\r\n const tIndex = transparent ? colors.length : -1;\r\n if (transparent) colors.push([0, 0, 0]);\r\n let bits = 1; while ((1 << bits) < colors.length) bits++;\r\n while (colors.length < (1 << bits)) colors.push([0, 0, 0]);\r\n const index = new Map(list.map((k, i) => [k, i]));\r\n return { colors, bits, tIndex, index };\r\n}\r\n\r\nfunction reduce(frame, max) {\r\n // > max colours: median-cut palette, then nearest colour per pixel\r\n const pal = extractPalette(frame, max).map(parseColor);\r\n const d = new Uint8ClampedArray(frame.data);\r\n const cache = new Map();\r\n for (let o = 0; o < d.length; o += 4) {\r\n if (d[o + 3] < 128) continue;\r\n const k = (d[o] << 16) | (d[o + 1] << 8) | d[o + 2];\r\n let best = cache.get(k);\r\n if (best === undefined) {\r\n let bd = Infinity; best = 0;\r\n for (let i = 0; i < pal.length; i++) {\r\n const dr = d[o] - pal[i][0], dg = d[o + 1] - pal[i][1], db = d[o + 2] - pal[i][2];\r\n const dist = dr * dr * 3 + dg * dg * 4 + db * db * 2;\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n cache.set(k, best);\r\n }\r\n d.set(pal[best], o);\r\n }\r\n return { ...frame, data: d };\r\n}\r\n\r\n/**\r\n * @param {{ width: number, height: number, data: ArrayLike<number>, delay?: number }[]} frames delay in ms\r\n * @param {{ loop?: number, scale?: number, delay?: number }} [opts] loop: 0 = forever, -1 = play once\r\n * @returns {Uint8Array}\r\n */\r\nexport function encodeGIF(frames, opts = {}) {\r\n if (!frames.length) throw new Error('No frames');\r\n const scale = Math.max(1, Math.round(opts.scale || 1));\r\n const fr = frames.map(f => ({ ...(scale > 1 ? upscale(f, scale) : f), delay: f.delay ?? opts.delay ?? 100 }));\r\n const W = fr[0].width, H = fr[0].height;\r\n\r\n // collect colours\r\n let transparent = false;\r\n const all = new Set();\r\n const perFrame = fr.map(f => {\r\n const s = new Set();\r\n for (let o = 0; o < f.data.length; o += 4) { const k = keyOf(f.data, o); if (k === -1) transparent = true; s.add(k); all.add(k); }\r\n return s;\r\n });\r\n const opaqueCount = s => s.size - (s.has(-1) ? 1 : 0);\r\n const globalOK = opaqueCount(all) + (transparent ? 1 : 0) <= 256;\r\n const global = globalOK ? tableFor(all, transparent) : null;\r\n\r\n const w = new ByteWriter();\r\n w.str('GIF89a');\r\n w.u16(W); w.u16(H);\r\n w.byte(global ? 0xf0 | (global.bits - 1) : 0x00);\r\n w.byte(0); w.byte(0);\r\n if (global) for (const c of global.colors) w.bytes(c);\r\n if (fr.length > 1 && opts.loop !== -1) {\r\n w.byte(0x21); w.byte(0xff); w.byte(11); w.str('NETSCAPE2.0'); w.byte(3); w.byte(1); w.u16(opts.loop || 0); w.byte(0);\r\n }\r\n\r\n fr.forEach((f0, i) => {\r\n let f = f0, table = global, set = perFrame[i];\r\n if (!table) {\r\n const max = transparent ? 255 : 256;\r\n if (opaqueCount(set) > max) {\r\n f = reduce(f0, max);\r\n set = new Set(); for (let o = 0; o < f.data.length; o += 4) set.add(keyOf(f.data, o));\r\n }\r\n table = tableFor(set, set.has(-1));\r\n }\r\n // graphic control extension\r\n w.byte(0x21); w.byte(0xf9); w.byte(4);\r\n w.byte(((transparent ? 2 : 1) << 2) | (table.tIndex >= 0 ? 1 : 0));\r\n w.u16(Math.max(2, Math.round(f.delay / 10)));\r\n w.byte(table.tIndex >= 0 ? table.tIndex : 0);\r\n w.byte(0);\r\n // image descriptor\r\n w.byte(0x2c); w.u16(0); w.u16(0); w.u16(W); w.u16(H);\r\n w.byte(table === global ? 0 : 0x80 | (table.bits - 1));\r\n if (table !== global) for (const c of table.colors) w.bytes(c);\r\n const idx = new Uint8Array(W * H);\r\n for (let p = 0; p < idx.length; p++) {\r\n const k = keyOf(f.data, p * 4);\r\n idx[p] = k === -1 ? table.tIndex : table.index.get(k);\r\n }\r\n lzwEncode(idx, Math.max(2, table.bits), w);\r\n });\r\n w.byte(0x3b);\r\n return w.result();\r\n}\r\n", "// Store-only zip writer (PNGs and GIFs are already compressed, so deflating again buys little).\r\n\r\nimport { crc32 } from './crc32.js';\r\n\r\nconst enc = new TextEncoder();\r\n\r\n/**\r\n * @param {{ name: string, data: Uint8Array | string, date?: Date }[]} entries\r\n * @returns {Uint8Array}\r\n */\r\nexport function createZip(entries) {\r\n const files = [], central = [];\r\n let offset = 0;\r\n const used = new Set();\r\n for (const e of entries) {\r\n let name = e.name.replace(/\\\\/g, '/').replace(/^\\/+/, '');\r\n // avoid duplicate names inside one archive\r\n if (used.has(name)) { const m = /^(.*?)(\\.[^.]*)?$/.exec(name); let i = 2; while (used.has(`${m[1]}-${i}${m[2] || ''}`)) i++; name = `${m[1]}-${i}${m[2] || ''}`; }\r\n used.add(name);\r\n const nameBytes = enc.encode(name);\r\n const data = typeof e.data === 'string' ? enc.encode(e.data) : e.data;\r\n const crc = crc32(data);\r\n const d = e.date || new Date();\r\n const time = (d.getHours() << 11) | (d.getMinutes() << 5) | (d.getSeconds() >> 1);\r\n const date = ((d.getFullYear() - 1980) << 9) | ((d.getMonth() + 1) << 5) | d.getDate();\r\n\r\n const local = new Uint8Array(30 + nameBytes.length);\r\n const lv = new DataView(local.buffer);\r\n lv.setUint32(0, 0x04034b50, true); lv.setUint16(4, 20, true); lv.setUint16(6, 0x0800, true); // UTF-8 names\r\n lv.setUint16(8, 0, true); lv.setUint16(10, time, true); lv.setUint16(12, date, true);\r\n lv.setUint32(14, crc, true); lv.setUint32(18, data.length, true); lv.setUint32(22, data.length, true);\r\n lv.setUint16(26, nameBytes.length, true); lv.setUint16(28, 0, true);\r\n local.set(nameBytes, 30);\r\n\r\n const cen = new Uint8Array(46 + nameBytes.length);\r\n const cv = new DataView(cen.buffer);\r\n cv.setUint32(0, 0x02014b50, true); cv.setUint16(4, 20, true); cv.setUint16(6, 20, true); cv.setUint16(8, 0x0800, true);\r\n cv.setUint16(10, 0, true); cv.setUint16(12, time, true); cv.setUint16(14, date, true);\r\n cv.setUint32(16, crc, true); cv.setUint32(20, data.length, true); cv.setUint32(24, data.length, true);\r\n cv.setUint16(28, nameBytes.length, true); cv.setUint32(42, offset, true);\r\n cen.set(nameBytes, 46);\r\n\r\n files.push(local, data); central.push(cen);\r\n offset += local.length + data.length;\r\n }\r\n const cenSize = central.reduce((s, c) => s + c.length, 0);\r\n const end = new Uint8Array(22);\r\n const ev = new DataView(end.buffer);\r\n ev.setUint32(0, 0x06054b50, true); ev.setUint16(8, entries.length, true); ev.setUint16(10, entries.length, true);\r\n ev.setUint32(12, cenSize, true); ev.setUint32(16, offset, true);\r\n const out = new Uint8Array(offset + cenSize + 22);\r\n let o = 0;\r\n for (const p of [...files, ...central, end]) { out.set(p, o); o += p.length; }\r\n return out;\r\n}\r\n", "// Sprite sheets (many frames \u2192 one image + atlas JSON) and tilesets (one image \u2192 unique tiles + map).\r\n\r\nconst blank = (w, h) => ({ width: w, height: h, data: new Uint8ClampedArray(w * h * 4) });\r\n\r\nfunction blit(dst, src, dx, dy, sx = 0, sy = 0, sw = src.width, sh = src.height) {\r\n for (let y = 0; y < sh; y++) {\r\n const so = ((sy + y) * src.width + sx) * 4, o = ((dy + y) * dst.width + dx) * 4;\r\n dst.data.set(src.data.subarray ? src.data.subarray(so, so + sw * 4) : Array.prototype.slice.call(src.data, so, so + sw * 4), o);\r\n }\r\n}\r\n\r\n/**\r\n * Pack frames into a grid. Frames may differ in size; cells use the largest frame.\r\n * @param {{ width: number, height: number, data: ArrayLike<number>, name?: string, delay?: number }[]} frames\r\n * @param {{ columns?: number, padding?: number, name?: string }} [opts] columns: 0 = roughly square\r\n * @returns {{ image: { width, height, data }, atlas: object }}\r\n */\r\nexport function packSpriteSheet(frames, opts = {}) {\r\n if (!frames.length) throw new Error('No frames');\r\n const pad = Math.max(0, opts.padding | 0);\r\n const cw = Math.max(...frames.map(f => f.width)), ch = Math.max(...frames.map(f => f.height));\r\n const cols = Math.max(1, Math.min(frames.length, opts.columns || Math.ceil(Math.sqrt(frames.length))));\r\n const rows = Math.ceil(frames.length / cols);\r\n const W = cols * cw + (cols - 1) * pad, H = rows * ch + (rows - 1) * pad;\r\n const image = blank(W, H);\r\n const out = {};\r\n frames.forEach((f, i) => {\r\n const x = (i % cols) * (cw + pad), y = Math.floor(i / cols) * (ch + pad);\r\n blit(image, f, x, y);\r\n out[f.name || `frame-${String(i).padStart(3, '0')}`] = {\r\n frame: { x, y, w: f.width, h: f.height },\r\n sourceSize: { w: f.width, h: f.height },\r\n ...(f.delay != null ? { duration: Math.round(f.delay) } : {}),\r\n };\r\n });\r\n // the \"hash\" flavour of the TexturePacker / Aseprite JSON format, which most engines read\r\n const atlas = { frames: out, meta: { app: 'image-to-pixel', image: (opts.name || 'sheet') + '.png', size: { w: W, h: H }, scale: '1', columns: cols, rows, padding: pad } };\r\n return { image, atlas };\r\n}\r\n\r\n/**\r\n * Cut an image into tiles, drop duplicates (optionally counting mirrored tiles as duplicates)\r\n * and return the tileset image and a tile map.\r\n * @param {{ width, height, data }} img\r\n * @param {{ tileWidth?: number, tileHeight?: number, columns?: number, flips?: boolean }} [opts]\r\n * @returns {{ image, map: { width: number, height: number, tiles: number[], flips?: number[] }, count: number }}\r\n */\r\nexport function buildTileset(img, opts = {}) {\r\n const tw = Math.max(1, opts.tileWidth || 8), th = Math.max(1, opts.tileHeight || tw);\r\n const mw = Math.ceil(img.width / tw), mh = Math.ceil(img.height / th);\r\n const tiles = [], keys = new Map(), map = [], flipsOut = [];\r\n const read = (tx, ty) => {\r\n const t = blank(tw, th);\r\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\r\n const sx = tx * tw + x, sy = ty * th + y;\r\n if (sx >= img.width || sy >= img.height) continue;\r\n const so = (sy * img.width + sx) * 4;\r\n t.data.set([img.data[so], img.data[so + 1], img.data[so + 2], img.data[so + 3]], (y * tw + x) * 4);\r\n }\r\n return t;\r\n };\r\n const key = t => {\r\n let s = '';\r\n for (let i = 0; i < t.data.length; i += 4) s += t.data[i + 3] === 0 ? '.' : String.fromCharCode(t.data[i] + 1, t.data[i + 1] + 1, t.data[i + 2] + 1);\r\n return s;\r\n };\r\n const flip = (t, fx, fy) => {\r\n const o = blank(tw, th);\r\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\r\n const si = ((fy ? th - 1 - y : y) * tw + (fx ? tw - 1 - x : x)) * 4;\r\n o.data.set(t.data.subarray(si, si + 4), (y * tw + x) * 4);\r\n }\r\n return o;\r\n };\r\n for (let ty = 0; ty < mh; ty++) {\r\n for (let tx = 0; tx < mw; tx++) {\r\n const t = read(tx, ty);\r\n let id = keys.get(key(t)), f = 0;\r\n if (id === undefined && opts.flips) {\r\n for (const [fx, fy, code] of [[1, 0, 1], [0, 1, 2], [1, 1, 3]]) {\r\n const k = keys.get(key(flip(t, fx, fy)));\r\n if (k !== undefined) { id = k; f = code; break; }\r\n }\r\n }\r\n if (id === undefined) { id = tiles.length; tiles.push(t); keys.set(key(t), id); }\r\n map.push(id); flipsOut.push(f);\r\n }\r\n }\r\n const sheet = packSpriteSheet(tiles, { columns: opts.columns || Math.min(16, tiles.length) });\r\n return {\r\n image: sheet.image,\r\n map: { width: mw, height: mh, tileWidth: tw, tileHeight: th, tiles: map, ...(opts.flips ? { flips: flipsOut } : {}) },\r\n count: tiles.length,\r\n };\r\n}\r\n", "// Frame-accurate stepping through an HTMLVideoElement by seeking to the middle of each frame.\r\n// Seeking (instead of playing) means every frame is visited exactly once, regardless of how\r\n// long processing takes, and the same input always produces the same frames.\r\n\r\nconst wait = (el, ev, ms = 4000) => new Promise((res, rej) => {\r\n const t = setTimeout(() => { el.removeEventListener(ev, ok); rej(new Error(`Timed out waiting for \"${ev}\"`)); }, ms);\r\n const ok = () => { clearTimeout(t); res(); };\r\n el.addEventListener(ev, ok, { once: true });\r\n});\r\n\r\nconst MEDIA_ERRORS = {\r\n 1: 'loading was aborted',\r\n 2: 'a network error stopped the download',\r\n 3: 'the browser could not decode it',\r\n 4: \"this browser can't play this video's format\",\r\n};\r\n\r\n/** Turn a <video>'s MediaError into a readable Error (err.code is the MediaError code). */\r\nexport function mediaError(video) {\r\n const code = video.error ? video.error.code : 0;\r\n const err = new Error(MEDIA_ERRORS[code] || 'the video could not be loaded');\r\n err.code = code;\r\n if (video.error && video.error.message) err.detail = video.error.message;\r\n return err;\r\n}\r\n\r\n/** Resolve on `ok`, reject straight away if the media element reports an error. */\r\nconst waitOrFail = (video, ok, ms) => new Promise((res, rej) => {\r\n const done = () => { clearTimeout(t); video.removeEventListener(ok, onOk); video.removeEventListener('error', onErr); };\r\n const onOk = () => { done(); res(); };\r\n const onErr = () => { done(); rej(mediaError(video)); };\r\n const t = setTimeout(() => { done(); rej(new Error(`no response from the video decoder after ${ms / 1000} s`)); }, ms);\r\n video.addEventListener(ok, onOk, { once: true });\r\n video.addEventListener('error', onErr, { once: true });\r\n});\r\n\r\n/**\r\n * Wait until a video's metadata (size, duration) and first frame are available.\r\n * Rejects immediately with a readable message when the browser can't play the file.\r\n */\r\nexport async function videoReady(video, { timeout = 60000 } = {}) {\r\n if (video.error) throw mediaError(video);\r\n if (video.readyState < 1) await waitOrFail(video, 'loadedmetadata', timeout);\r\n if (video.readyState < 2) await waitOrFail(video, 'loadeddata', timeout).catch(e => { if (e.code) throw e; });\r\n return video;\r\n}\r\n\r\n/**\r\n * Best-effort codec name for an MP4/MOV/WebM file, read from its bytes. Used to explain playback errors.\r\n * @param {Blob} file\r\n * @returns {Promise<string>} e.g. 'H.265 (HEVC)', or '' when unknown\r\n */\r\nexport async function sniffVideoCodec(file) {\r\n const buf = new Uint8Array(await file.arrayBuffer());\r\n const NAMES = { avc1: 'H.264', avc3: 'H.264', hvc1: 'H.265 (HEVC)', hev1: 'H.265 (HEVC)', av01: 'AV1', vp09: 'VP9', vp08: 'VP8', mp4v: 'MPEG-4 Part 2', apcn: 'ProRes', apch: 'ProRes', apcs: 'ProRes', apco: 'ProRes', ap4h: 'ProRes 4444', dvh1: 'Dolby Vision', dvhe: 'Dolby Vision' };\r\n // MP4/MOV: the first sample entry of the 'stsd' box names the codec\r\n for (let i = 0; i + 24 < buf.length; i++) {\r\n if (buf[i] === 0x73 && buf[i + 1] === 0x74 && buf[i + 2] === 0x73 && buf[i + 3] === 0x64) {\r\n const type = String.fromCharCode(buf[i + 16], buf[i + 17], buf[i + 18], buf[i + 19]);\r\n if (NAMES[type]) return NAMES[type];\r\n }\r\n }\r\n // WebM/Matroska: CodecID strings such as V_VP9, V_AV1, V_MPEGH/ISO/HEVC\r\n const head = new TextDecoder('latin1').decode(buf.subarray(0, Math.min(buf.length, 1 << 20)));\r\n const m = /V_(VP8|VP9|AV1|MPEG4\\/ISO\\/AVC|MPEGH\\/ISO\\/HEVC)/.exec(head);\r\n if (m) return { VP8: 'VP8', VP9: 'VP9', AV1: 'AV1', 'MPEG4/ISO/AVC': 'H.264', 'MPEGH/ISO/HEVC': 'H.265 (HEVC)' }[m[1]];\r\n return '';\r\n}\r\n\r\n/** Seek and resolve once the frame at `time` is decoded and paintable. */\r\nexport async function seekTo(video, time) {\r\n time = Math.max(0, Math.min(time, (video.duration || 0) - 1e-4));\r\n if (Math.abs(video.currentTime - time) < 1e-6 && video.readyState >= 2) return;\r\n const presented = 'requestVideoFrameCallback' in video\r\n ? new Promise(res => { video.requestVideoFrameCallback(() => res()); setTimeout(res, 500); })\r\n : null;\r\n const seeked = wait(video, 'seeked');\r\n video.currentTime = time;\r\n await seeked;\r\n if (presented) await presented;\r\n}\r\n\r\n/**\r\n * Estimate the frame rate from presented frames (requestVideoFrameCallback), falling back to `fallback`.\r\n * Plays muted for a moment and restores the position.\r\n */\r\nexport async function estimateFps(video, fallback = 30) {\r\n if (!('requestVideoFrameCallback' in video)) return fallback;\r\n await videoReady(video);\r\n const was = { t: video.currentTime, muted: video.muted, paused: video.paused };\r\n const times = [];\r\n try {\r\n video.muted = true;\r\n await new Promise((res) => {\r\n const done = setTimeout(res, 1200);\r\n const cb = (_, meta) => {\r\n times.push(meta.mediaTime);\r\n if (times.length >= 12) { clearTimeout(done); res(); } else video.requestVideoFrameCallback(cb);\r\n };\r\n video.requestVideoFrameCallback(cb);\r\n video.play().catch(() => { clearTimeout(done); res(); });\r\n });\r\n } finally {\r\n video.pause();\r\n video.muted = was.muted;\r\n await seekTo(video, was.t).catch(() => { });\r\n }\r\n const deltas = [];\r\n for (let i = 1; i < times.length; i++) { const d = times[i] - times[i - 1]; if (d > 0.001) deltas.push(d); }\r\n if (deltas.length < 3) return fallback;\r\n deltas.sort((a, b) => a - b);\r\n const fps = 1 / deltas[Math.floor(deltas.length / 2)];\r\n // snap to common rates\r\n for (const r of [12, 15, 23.976, 24, 25, 29.97, 30, 48, 50, 59.94, 60]) if (Math.abs(fps - r) < 0.6) return r;\r\n return Math.round(fps);\r\n}\r\n\r\n/** Frame times (seconds, middle of each frame) for a clip. */\r\nexport function frameTimes({ duration, fps, start = 0, end = duration, maxFrames = Infinity }) {\r\n const out = [];\r\n const n = Math.min(maxFrames, Math.max(1, Math.floor((end - start) * fps + 1e-6)));\r\n for (let i = 0; i < n; i++) out.push(start + (i + 0.5) / fps);\r\n return out;\r\n}\r\n\r\n/**\r\n * Visit frames one by one.\r\n * @param {HTMLVideoElement} video\r\n * @param {{ fps: number, start?: number, end?: number, maxFrames?: number, signal?: AbortSignal,\r\n * onFrame: (info: { index: number, time: number, total: number }) => any }} opts\r\n */\r\nexport async function forEachFrame(video, opts) {\r\n await videoReady(video);\r\n const wasPaused = video.paused;\r\n video.pause();\r\n const times = frameTimes({ duration: video.duration, ...opts });\r\n for (let i = 0; i < times.length; i++) {\r\n if (opts.signal && opts.signal.aborted) throw new DOMException('Aborted', 'AbortError');\r\n await seekTo(video, times[i]);\r\n await opts.onFrame({ index: i, time: times[i], total: times.length });\r\n }\r\n if (!wasPaused) video.play().catch(() => { });\r\n return times.length;\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// Colour helpers shared by the CPU path, the GPU uniforms and the editor.\r\n// All channel values are sRGB in 0..1 unless a name says otherwise.\r\n\r\n/** Parse '#rgb', '#rrggbb', '#rrggbbaa', 'rrggbb' or [r,g,b] (0..255) into [r, g, b] bytes. */\r\nexport function parseColor(c) {\r\n if (Array.isArray(c)) return [c[0] | 0, c[1] | 0, c[2] | 0];\r\n let s = String(c).trim().replace(/^#|^0x/i, '');\r\n if (s.length === 3 || s.length === 4) s = s.slice(0, 3).split('').map(ch => ch + ch).join('');\r\n if (!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(s)) throw new Error(`Invalid colour \"${c}\"`);\r\n return [parseInt(s.slice(0, 2), 16), parseInt(s.slice(2, 4), 16), parseInt(s.slice(4, 6), 16)];\r\n}\r\n\r\n/** True when `c` parses as a colour. */\r\nexport function isColor(c) {\r\n try { parseColor(c); return true; } catch { return false; }\r\n}\r\n\r\n/** [r, g, b] bytes \u2192 '#rrggbb'. */\r\nexport function toHex(rgb) {\r\n return '#' + rgb.slice(0, 3).map(v => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0')).join('');\r\n}\r\n\r\n/** Normalise any colour to '#rrggbb' (lower case). */\r\nexport const normHex = c => toHex(parseColor(c));\r\n\r\nconst lin = c => (c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));\r\n\r\n/** sRGB (0..1) \u2192 OKLab [L, a, b]. Same maths as the GLSL `oklab()` in gpu/shaders.js. */\r\nexport function oklab(r, g, b) {\r\n r = lin(r); g = lin(g); b = lin(b);\r\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\r\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\r\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\r\n return [\r\n 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\r\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\r\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s,\r\n ];\r\n}\r\n\r\n/** Relative luminance-ish weight used by saturation (Rec. 709). */\r\nexport const LUMA = [0.2126, 0.7152, 0.0722];\r\n\r\n/** Perceived lightness 0..1 of a hex colour; handy for picking text colours on swatches. */\r\nexport function lightness(hex) {\r\n const [r, g, b] = parseColor(hex);\r\n return oklab(r / 255, g / 255, b / 255)[0];\r\n}\r\n\r\n/**\r\n * Average distance (sRGB 0..1) from each palette colour to its nearest neighbour.\r\n * Ordered dithering scales its threshold by this so `strength` means the same thing\r\n * for a 2-colour and a 64-colour palette.\r\n */\r\nexport function paletteSpread(rgbs) {\r\n if (rgbs.length < 2) return 1;\r\n let sum = 0;\r\n for (let i = 0; i < rgbs.length; i++) {\r\n let best = Infinity;\r\n for (let j = 0; j < rgbs.length; j++) {\r\n if (i === j) continue;\r\n const dr = rgbs[i][0] - rgbs[j][0], dg = rgbs[i][1] - rgbs[j][1], db = rgbs[i][2] - rgbs[j][2];\r\n const d = Math.sqrt(dr * dr + dg * dg + db * db);\r\n if (d < best) best = d;\r\n }\r\n sum += best;\r\n }\r\n return Math.max(0.04, Math.min(1, sum / rgbs.length / 255));\r\n}\r\n", "// Palette file formats. Every parser returns { name, colors: ['#rrggbb', \u2026] }.\r\n//\r\n// .gpl GIMP / Aseprite / Krita palette\r\n// .hex one hex colour per line (Lospec \"HEX file\")\r\n// .txt Paint.NET palette (AARRGGBB per line, ';' comments)\r\n// .pal JASC-PAL (Paint Shop Pro, Aseprite export)\r\n// .json Lospec JSON ({ name, colors: ['rrggbb'] }), this tool's own export, or a plain array\r\n// anything else: every #hex / 6-digit token found in the text\r\n\r\nimport { normHex } from '../color.js';\r\n\r\nconst dedupe = list => [...new Set(list)];\r\n\r\nexport function parseGPL(text) {\r\n const lines = text.split(/\\r?\\n/);\r\n if (!/^GIMP Palette/i.test(lines[0] || '')) throw new Error('Not a GIMP palette (missing \"GIMP Palette\" header)');\r\n let name = '';\r\n const colors = [];\r\n for (const raw of lines.slice(1)) {\r\n const line = raw.trim();\r\n if (!line || line.startsWith('#')) continue;\r\n const nm = /^Name:\\s*(.*)$/i.exec(line);\r\n if (nm) { name = nm[1].trim(); continue; }\r\n if (/^Columns:/i.test(line)) continue;\r\n const m = /^(\\d{1,3})\\s+(\\d{1,3})\\s+(\\d{1,3})/.exec(line);\r\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\r\n }\r\n return { name, colors };\r\n}\r\n\r\nexport function parseHexList(text) {\r\n const colors = [];\r\n for (const raw of text.split(/\\r?\\n/)) {\r\n const line = raw.trim();\r\n if (!line || line.startsWith(';') || line.startsWith('//')) continue;\r\n const m = /^#?([0-9a-f]{6}|[0-9a-f]{8}|[0-9a-f]{3})\\b/i.exec(line);\r\n if (!m) continue;\r\n // 8 digits in a .txt palette are AARRGGBB (Paint.NET); in a .hex file they are rare, treat the same\r\n const h = m[1].length === 8 ? m[1].slice(2) : m[1];\r\n colors.push(normHex(h));\r\n }\r\n return { name: '', colors };\r\n}\r\n\r\nexport function parseJASC(text) {\r\n const lines = text.split(/\\r?\\n/).map(l => l.trim());\r\n if (lines[0] !== 'JASC-PAL') throw new Error('Not a JASC palette');\r\n const n = parseInt(lines[2], 10) || 0;\r\n const colors = [];\r\n for (let i = 3; i < 3 + n && i < lines.length; i++) {\r\n const m = /^(\\d+)\\s+(\\d+)\\s+(\\d+)/.exec(lines[i]);\r\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\r\n }\r\n return { name: '', colors };\r\n}\r\n\r\nexport function parseJSON(text) {\r\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\r\n const list = Array.isArray(obj) ? obj : (obj.colors || obj.palette || []);\r\n const colors = list.map(c => (typeof c === 'object' && c ? (c.hex || c.color) : c)).filter(Boolean).map(normHex);\r\n return { name: (!Array.isArray(obj) && obj.name) || '', colors };\r\n}\r\n\r\n/** Pull every hex-looking token out of free text (pasted CSS, a tweet, a Lospec page). */\r\nexport function parseLoose(text) {\r\n const colors = [];\r\n const re = /#?\\b([0-9a-f]{6})\\b/gi;\r\n let m;\r\n while ((m = re.exec(text))) colors.push(normHex(m[1]));\r\n return { name: '', colors };\r\n}\r\n\r\n/**\r\n * Parse palette text by file name / content sniffing.\r\n * @param {string} text\r\n * @param {string} [filename]\r\n * @returns {{ name: string, colors: string[] }}\r\n */\r\nexport function parsePalette(text, filename = '') {\r\n const ext = (/\\.([a-z0-9]+)$/i.exec(filename) || [])[1]?.toLowerCase() || '';\r\n const t = String(text).replace(/^\uFEFF/, '');\r\n const trimmed = t.trim();\r\n let out;\r\n if (ext === 'gpl' || /^GIMP Palette/i.test(trimmed)) out = parseGPL(trimmed);\r\n else if (ext === 'pal' || trimmed.startsWith('JASC-PAL')) out = parseJASC(trimmed);\r\n else if (ext === 'json' || trimmed.startsWith('{') || trimmed.startsWith('[')) out = parseJSON(trimmed);\r\n else if (ext === 'hex' || ext === 'txt') out = parseHexList(trimmed);\r\n else {\r\n out = parseHexList(trimmed);\r\n if (!out.colors.length) out = parseLoose(trimmed);\r\n }\r\n out.colors = dedupe(out.colors).slice(0, 256);\r\n if (!out.name && filename) out.name = filename.replace(/\\.[^.]+$/, '').replace(/[-_]+/g, ' ');\r\n if (!out.colors.length) throw new Error('No colours found in that palette');\r\n return out;\r\n}\r\n\r\n/** Palette \u2192 .gpl text. */\r\nexport function toGPL(name, colors) {\r\n const rows = colors.map(c => {\r\n const h = normHex(c);\r\n const r = parseInt(h.slice(1, 3), 16), g = parseInt(h.slice(3, 5), 16), b = parseInt(h.slice(5, 7), 16);\r\n return `${String(r).padStart(3)} ${String(g).padStart(3)} ${String(b).padStart(3)}\\t${h.slice(1)}`;\r\n });\r\n return `GIMP Palette\\nName: ${name || 'Palette'}\\nColumns: 8\\n#\\n${rows.join('\\n')}\\n`;\r\n}\r\n\r\n/** Palette \u2192 .hex text. */\r\nexport const toHexFile = colors => colors.map(c => normHex(c).slice(1)).join('\\n') + '\\n';\r\n\r\n/** Palette \u2192 JSON text (Lospec-compatible shape). */\r\nexport const toPaletteJSON = (name, colors) => JSON.stringify({ name: name || 'Palette', colors: colors.map(c => normHex(c).slice(1)) }, null, 2);\r\n", "// Lospec palette lookup by slug, e.g. 'rgbg-36' from https://lospec.com/palette-list/rgbg-36\r\n\r\nimport { parseJSON } from './parse.js';\r\n\r\n/** Turn a slug or a full Lospec URL into a slug. */\r\nexport function lospecSlug(input) {\r\n const s = String(input || '').trim();\r\n const m = /palette-list\\/([a-z0-9-]+)/i.exec(s);\r\n return (m ? m[1] : s).toLowerCase().replace(/\\.(json|hex|gpl)$/, '');\r\n}\r\n\r\n/**\r\n * Fetch a palette from Lospec. Needs network access; the editor caches results.\r\n * @returns {Promise<{ name: string, colors: string[], author?: string, slug: string }>}\r\n */\r\nexport async function fetchLospec(slugOrUrl, { fetch: f = globalThis.fetch } = {}) {\r\n const slug = lospecSlug(slugOrUrl);\r\n if (!/^[a-z0-9-]+$/.test(slug)) throw new Error('That does not look like a Lospec palette slug');\r\n const res = await f(`https://lospec.com/palette-list/${slug}.json`);\r\n if (!res.ok) throw new Error(`Lospec returned ${res.status} for \"${slug}\"`);\r\n const json = await res.json();\r\n const p = parseJSON(json);\r\n return { name: json.name || slug, author: json.author || '', colors: p.colors, slug };\r\n}\r\n", "// image-to-pixel core: no UI. Works in browsers (WebGL 2 via ShaderMate, CPU fallback) and,\r\n// for { width, height, data } inputs, in Node on the CPU.\r\n\r\nexport { createPixelator, pixelate, makeResult } from './core/engine.js';\r\nexport {\r\n DEFAULTS, DITHER_METHODS, SETTINGS_VERSION, MAX_SIZE, LEGACY_DITHER,\r\n defaultSettings, normalizeSettings, mergeSettings, resolveSize, ditherKind, cropRect, ASPECTS,\r\n encodeSettings, decodeSettings, compactSettings, settingsToJSON, settingsFromJSON,\r\n} from './core/settings.js';\r\nexport { makePlan } from './core/plan.js';\r\nexport { runCPU } from './core/cpu/pipeline.js';\r\nexport { PALETTES, getPalette } from './core/palette/builtin.js';\r\nexport { parsePalette, toGPL, toHexFile, toPaletteJSON } from './core/palette/parse.js';\r\nexport { extractPalette } from './core/palette/extract.js';\r\nexport { fetchLospec, lospecSlug } from './core/palette/lospec.js';\r\nexport { thresholdMap, parseMatrix, bayer } from './core/dither/matrices.js';\r\nexport { KERNELS } from './core/dither/kernels.js';\r\nexport { PRESETS, getPreset } from './core/presets.js';\r\nexport { parseColor, toHex, oklab } from './core/color.js';\r\nexport { toFrame, loadImage } from './core/source.js';\r\nexport { upscale, resizeNearest, uniqueColors, detectGrid, hasTransparency } from './core/export/scale.js';\r\nexport { toCanvas, downloadBlob } from './core/export/canvas.js';\r\nexport { encodePNG } from './core/export/png.js';\r\nexport { encodeGIF } from './core/export/gif.js';\r\nexport { createZip } from './core/export/zip.js';\r\nexport { packSpriteSheet, buildTileset } from './core/export/sheet.js';\r\nexport { forEachFrame, estimateFps, seekTo, frameTimes, videoReady, mediaError, sniffVideoCodec } from './core/video/frames.js';\r\n\r\n/* global __ITP_VERSION__ */\r\n// The build replaces __ITP_VERSION__ with package.json's version; unbundled source reports 'dev'.\r\nexport const VERSION = typeof __ITP_VERSION__ === 'string' ? __ITP_VERSION__ : 'dev';\r\n", "// Built-in palettes. Most come from Lospec (https://lospec.com/palette-list); credit to their authors.\r\n// The list matches the classic editor plus a few staples.\r\n\r\n/** @type {{ id: string, name: string, author: string, colors: string[] }[]} */\r\nexport const PALETTES = [\r\n { id: \"1-bit-monitor\", name: \"1-Bit Monitor\", author: \"\", colors: [\"222323\",\"f0f6f0\"] },\r\n { id: \"apollo\", name: \"Apollo\", author: \"AdamCYounis\", colors: [\"172038\",\"253a5e\",\"3c5e8b\",\"4f8fba\",\"73bed3\",\"a4dddb\",\"19332d\",\"25562e\",\"468232\",\"75a743\",\"a8ca58\",\"d0da91\",\"4d2b32\",\"7a4841\",\"ad7757\",\"c09473\",\"d7b594\",\"e7d5b3\",\"341c27\",\"602c2c\",\"884b2b\",\"be772b\",\"de9e41\",\"e8c170\",\"241527\",\"411d31\",\"752438\",\"a53030\",\"cf573c\",\"da863e\",\"1e1d39\",\"402751\",\"7a367b\",\"a23e8c\",\"c65197\",\"df84a5\",\"090a14\",\"10141f\",\"151d28\",\"202e37\",\"394a50\",\"577277\",\"819796\",\"a8b5b2\",\"c7cfcc\",\"ebede9\"] },\r\n { id: \"batpalette\", name: \"Batpalette\", author: \"el Rojaz\", colors: [\"000000\",\"7f7f7f\",\"ffffff\",\"681e99\",\"3f48cc\",\"88ff82\",\"bfa621\",\"cc3d18\"] },\r\n { id: \"beached-boogaloo\", name: \"Beached Boogaloo\", author: \".tomais\", colors: [\"ff0b20\",\"8f0434\",\"500037\",\"a0ff00\",\"57e71e\",\"0ea717\",\"057833\",\"2cdeef\",\"2483e7\",\"153ab7\",\"0d0a87\",\"ff0b88\",\"a60fff\",\"6409cf\",\"eaef30\",\"ff880b\",\"b75308\",\"802202\",\"000000\",\"231940\",\"514378\",\"ffffff\",\"73a3a7\",\"366770\",\"f7b771\",\"c77650\",\"974c38\",\"873939\",\"601e2c\",\"300c1f\"] },\r\n { id: \"cc-29\", name: \"CC-29\", author: \"Alpha6\", colors: [\"f2f0e5\",\"b8b5b9\",\"868188\",\"646365\",\"45444f\",\"3a3858\",\"212123\",\"352b42\",\"43436a\",\"4b80ca\",\"68c2d3\",\"a2dcc7\",\"ede19e\",\"d3a068\",\"b45252\",\"6a536e\",\"4b4158\",\"80493a\",\"a77b5b\",\"e5ceb4\",\"c2d368\",\"8ab060\",\"567b79\",\"4e584a\",\"7b7243\",\"b2b47e\",\"edc8c4\",\"cf8acb\",\"5f556a\"] },\r\n { id: \"cga-16\", name: \"CGA 16\", author: \"\", colors: [\"000000\",\"0000aa\",\"00aa00\",\"00aaaa\",\"aa0000\",\"aa00aa\",\"aa5500\",\"aaaaaa\",\"555555\",\"5555ff\",\"55ff55\",\"55ffff\",\"ff5555\",\"ff55ff\",\"ffff55\",\"ffffff\"] },\r\n { id: \"chaotic-neutral\", name: \"Chaotic neutral\", author: \"Dodecahedron \u2DFD\", colors: [\"e1d4cb\",\"c19f90\",\"a56457\",\"6d504d\",\"484044\",\"392b29\",\"31312f\",\"d8eef0\",\"97999f\",\"81a4c0\",\"6a7f92\",\"415973\",\"43425a\",\"45334b\",\"4b1f40\",\"671087\",\"955ab9\"] },\r\n { id: \"endesga-32\", name: \"Endesga 32\", author: \"ENDESGA\", colors: [\"be4a2f\",\"d77643\",\"ead4aa\",\"e4a672\",\"b86f50\",\"733e39\",\"3e2731\",\"a22633\",\"e43b44\",\"f77622\",\"feae34\",\"fee761\",\"63c74d\",\"3e8948\",\"265c42\",\"193c3e\",\"124e89\",\"0099db\",\"2ce8f5\",\"ffffff\",\"c0cbdc\",\"8b9bb4\",\"5a6988\",\"3a4466\",\"262b44\",\"181425\",\"ff0044\",\"68386c\",\"b55088\",\"f6757a\",\"e8b796\",\"c28569\"] },\r\n { id: \"fantasy-24\", name: \"Fantasy 24\", author: \"\", colors: [\"1f240a\",\"39571c\",\"a58c27\",\"efac28\",\"efd8a1\",\"ab5c1c\",\"183f39\",\"ef692f\",\"efb775\",\"a56243\",\"773421\",\"724113\",\"2a1d0d\",\"392a1c\",\"684c3c\",\"927e6a\",\"276468\",\"ef3a0c\",\"45230d\",\"3c9f9c\",\"9b1a0a\",\"36170c\",\"550f0a\",\"300f0a\"] },\r\n { id: \"game-boy-dmg\", name: \"Game Boy (DMG)\", author: \"\", colors: [\"0f380f\",\"306230\",\"8bac0f\",\"9bbc0f\"] },\r\n { id: \"grayscale-4\", name: \"Grayscale 4\", author: \"\", colors: [\"000000\",\"555555\",\"aaaaaa\",\"ffffff\"] },\r\n { id: \"hidden-library\", name: \"Hidden Library\", author: \"Pixel Hoo\", colors: [\"100b2a\",\"2a213a\",\"314743\",\"65856d\",\"adca9a\",\"ecfeca\",\"582d27\",\"974133\",\"d67654\",\"5d3441\",\"a3685b\",\"ffb379\",\"ffe6a9\",\"ffffff\"] },\r\n { id: \"intacto14\", name: \"Intacto14\", author: \"Anubi\", colors: [\"221529\",\"4b5561\",\"879ba3\",\"cbf5ef\",\"62b4de\",\"5660d6\",\"5b29a6\",\"d64562\",\"f2735c\",\"edbb8e\",\"ab6375\",\"522152\",\"37ada2\",\"8cde8c\"] },\r\n { id: \"journey\", name: \"Journey\", author: \"\uD83C\uDF4DPineappleOnPizza\uD83C\uDF4D\", colors: [\"050914\",\"110524\",\"3b063a\",\"691749\",\"9c3247\",\"d46453\",\"f5a15d\",\"ffcf8e\",\"ff7a7d\",\"ff417d\",\"d61a88\",\"94007a\",\"42004e\",\"220029\",\"100726\",\"25082c\",\"3d1132\",\"73263d\",\"bd4035\",\"ed7b39\",\"ffb84a\",\"fff540\",\"c6d831\",\"77b02a\",\"429058\",\"2c645e\",\"153c4a\",\"052137\",\"0e0421\",\"0c0b42\",\"032769\",\"144491\",\"488bd4\",\"78d7ff\",\"b0fff1\",\"faffff\",\"c7d4e1\",\"928fb8\",\"5b537d\",\"392946\",\"24142c\",\"0e0f2c\",\"132243\",\"1a466b\",\"10908e\",\"28c074\",\"3dff6e\",\"f8ffb8\",\"f0c297\",\"cf968c\",\"8f5765\",\"52294b\",\"0f022e\",\"35003b\",\"64004c\",\"9b0e3e\",\"d41e3c\",\"ed4c40\",\"ff9757\",\"d4662f\",\"9c341a\",\"691b22\",\"450c28\",\"2d002e\"] },\r\n { id: \"lospec500\", name: \"Lospec500\", author: \"\", colors: [\"10121c\",\"2c1e31\",\"6b2643\",\"ac2847\",\"ec273f\",\"94493a\",\"de5d3a\",\"e98537\",\"f3a833\",\"4d3533\",\"6e4c30\",\"a26d3f\",\"ce9248\",\"dab163\",\"e8d282\",\"f7f3b7\",\"1e4044\",\"006554\",\"26854c\",\"5ab552\",\"9de64e\",\"008b8b\",\"62a477\",\"a6cb96\",\"d3eed3\",\"3e3b65\",\"3859b3\",\"3388de\",\"36c5f4\",\"6dead6\",\"5e5b8c\",\"8c78a5\",\"b0a7b8\",\"deceed\",\"9a4d76\",\"c878af\",\"cc99ff\",\"fa6e79\",\"ffa2ac\",\"ffd1d5\",\"f6e8e0\",\"ffffff\"] },\r\n { id: \"nyx8\", name: \"Nyx8\", author: \"Javier Guerrero\", colors: [\"08141e\",\"0f2a3f\",\"20394f\",\"4e495f\",\"816271\",\"997577\",\"c3a38a\",\"f6d6bd\"] },\r\n { id: \"oil-6\", name: \"Oil 6\", author: \"\", colors: [\"fbf5ef\",\"f2d3ab\",\"c69fa5\",\"8b6d9c\",\"494d7e\",\"272744\"] },\r\n { id: \"pico-8\", name: \"PICO-8\", author: \"\", colors: [\"000000\",\"1d2b53\",\"7e2553\",\"008751\",\"ab5236\",\"5f574f\",\"c2c3c7\",\"fff1e8\",\"ff004d\",\"ffa300\",\"ffec27\",\"00e436\",\"29adff\",\"83769c\",\"ff77a8\",\"ffccaa\"] },\r\n { id: \"resurrect-64\", name: \"Resurrect 64\", author: \"Kerrie Lake\", colors: [\"2e222f\",\"3e3546\",\"625565\",\"966c6c\",\"ab947a\",\"694f62\",\"7f708a\",\"9babb2\",\"c7dcd0\",\"ffffff\",\"6e2727\",\"b33831\",\"ea4f36\",\"f57d4a\",\"ae2334\",\"e83b3b\",\"fb6b1d\",\"f79617\",\"f9c22b\",\"7a3045\",\"9e4539\",\"cd683d\",\"e6904e\",\"fbb954\",\"4c3e24\",\"676633\",\"a2a947\",\"d5e04b\",\"fbff86\",\"165a4c\",\"239063\",\"1ebc73\",\"91db69\",\"cddf6c\",\"313638\",\"374e4a\",\"547e64\",\"92a984\",\"b2ba90\",\"0b5e65\",\"0b8a8f\",\"0eaf9b\",\"30e1b9\",\"8ff8e2\",\"323353\",\"484a77\",\"4d65b4\",\"4d9be6\",\"8fd3ff\",\"45293f\",\"6b3e75\",\"905ea9\",\"a884f3\",\"eaaded\",\"753c54\",\"a24b6f\",\"cf657f\",\"ed8099\",\"831c5d\",\"c32454\",\"f04f78\",\"f68181\",\"fca790\",\"fdcbb0\"] },\r\n { id: \"slso8\", name: \"SLSO8\", author: \"Luis Miguel Maldonado\", colors: [\"0d2b45\",\"203c56\",\"544e68\",\"8d697a\",\"d08159\",\"ffaa5e\",\"ffd4a3\",\"ffecd6\"] },\r\n { id: \"sweet-canyon-extended-64\", name: \"Sweet Canyon Extended 64\", author: \"Mr Slime\", colors: [\"0f0e11\",\"2d2c33\",\"40404a\",\"51545c\",\"6b7179\",\"7c8389\",\"a8b2b6\",\"d5d5d5\",\"eeebe0\",\"f1dbb1\",\"eec99f\",\"e1a17e\",\"cc9562\",\"ab7b49\",\"9a643a\",\"86482f\",\"783a29\",\"6a3328\",\"541d29\",\"42192c\",\"512240\",\"782349\",\"8b2e5d\",\"a93e89\",\"d062c8\",\"ec94ea\",\"f2bdfc\",\"eaebff\",\"a2fafa\",\"64e7e7\",\"54cfd8\",\"2fb6c3\",\"2c89af\",\"25739d\",\"2a5684\",\"214574\",\"1f2966\",\"101445\",\"3c0d3b\",\"66164c\",\"901f3d\",\"bb3030\",\"dc473c\",\"ec6a45\",\"fb9b41\",\"f0c04c\",\"f4d66e\",\"fffb76\",\"ccf17a\",\"97d948\",\"6fba3b\",\"229443\",\"1d7e45\",\"116548\",\"0c4f3f\",\"0a3639\",\"251746\",\"48246d\",\"69189c\",\"9f20c0\",\"e527d2\",\"ff51cf\",\"ff7ada\",\"ff9edb\"] },\r\n { id: \"sweetie-16\", name: \"Sweetie 16\", author: \"\", colors: [\"1a1c2c\",\"5d275d\",\"b13e53\",\"ef7d57\",\"ffcd75\",\"a7f070\",\"38b764\",\"257179\",\"29366f\",\"3b5dc9\",\"41a6f6\",\"73eff7\",\"f4f4f4\",\"94b0c2\",\"566c86\",\"333c57\"] },\r\n { id: \"toxic-haze\", name: \"Toxic Haze\", author: \"sillyTheJester\", colors: [\"e5ff00\",\"b8d14a\",\"9ab06e\",\"708763\",\"4c5c52\",\"393e40\",\"242424\"] },\r\n { id: \"vinik24\", name: \"Vinik24\", author: \"Vinik\", colors: [\"000000\",\"6f6776\",\"9a9a97\",\"c5ccb8\",\"8b5580\",\"c38890\",\"a593a5\",\"666092\",\"9a4f50\",\"c28d75\",\"7ca1c0\",\"416aa3\",\"8d6268\",\"be955c\",\"68aca9\",\"387080\",\"6e6962\",\"93a167\",\"6eaa78\",\"557064\",\"9d9f7f\",\"7e9e99\",\"5d6872\",\"433455\"] },\r\n];\r\n\r\n/** Look a built-in palette up by id or name (case-insensitive). */\r\nexport function getPalette(idOrName) {\r\n const k = String(idOrName || \"\").toLowerCase();\r\n return PALETTES.find(p => p.id === k || p.name.toLowerCase() === k) || null;\r\n}\r\n", "// The settings object is the one contract between the engine, the editor, presets,\r\n// share links and saved JSON. Everything goes through normalizeSettings().\r\n\r\nimport { getPalette } from './palette/builtin.js';\r\nimport { normHex, isColor } from './color.js';\r\n\r\nexport const SETTINGS_VERSION = 1;\r\nexport const MAX_SIZE = 2048;\r\n\r\n/** Dither methods. `kind` decides which pipeline runs them. */\r\nexport const DITHER_METHODS = [\r\n { id: 'none', label: 'None', kind: 'none' },\r\n { id: 'bayer2', label: 'Bayer 2\u00D72', kind: 'ordered' },\r\n { id: 'bayer4', label: 'Bayer 4\u00D74', kind: 'ordered' },\r\n { id: 'bayer8', label: 'Bayer 8\u00D78', kind: 'ordered' },\r\n { id: 'bayer16', label: 'Bayer 16\u00D716', kind: 'ordered' },\r\n { id: 'cluster4', label: 'Clustered dot 4\u00D74', kind: 'ordered' },\r\n { id: 'cluster8', label: 'Clustered dot 8\u00D78', kind: 'ordered' },\r\n { id: 'lines', label: 'Horizontal lines', kind: 'ordered' },\r\n { id: 'bluenoise', label: 'Blue noise', kind: 'ordered' },\r\n { id: 'custom', label: 'Custom matrix', kind: 'ordered' },\r\n { id: 'floyd-steinberg', label: 'Floyd\u2013Steinberg', kind: 'diffusion' },\r\n { id: 'atkinson', label: 'Atkinson', kind: 'diffusion' },\r\n { id: 'sierra-lite', label: 'Sierra Lite', kind: 'diffusion' },\r\n { id: 'sierra', label: 'Sierra', kind: 'diffusion' },\r\n { id: 'burkes', label: 'Burkes', kind: 'diffusion' },\r\n { id: 'jarvis', label: 'Jarvis\u2013Judice\u2013Ninke', kind: 'diffusion' },\r\n { id: 'stucki', label: 'Stucki', kind: 'diffusion' },\r\n];\r\nexport const ditherKind = id => (DITHER_METHODS.find(m => m.id === id) || { kind: 'none' }).kind;\r\n\r\n/** Names the classic image-to-pixel.js used, mapped to the new ids. */\r\nexport const LEGACY_DITHER = {\r\n 'none': 'none', 'floyd-steinberg': 'floyd-steinberg', 'atkinson': 'atkinson',\r\n 'ordered': 'bayer8', '2x2 bayer': 'bayer2', '4x4 bayer': 'bayer4', 'clustered 4x4': 'cluster4',\r\n};\r\n\r\nexport const DEFAULTS = Object.freeze({\r\n version: SETTINGS_VERSION,\r\n size: { mode: 'width', width: 96, height: 0, block: 8, resample: 'box' },\r\n adjust: { brightness: 0, contrast: 0, saturation: 0, hue: 0, gamma: 1 },\r\n frame: { aspect: 'original', zoom: 1, x: 0.5, y: 0.5 },\r\n palette: { source: 'builtin', id: 'endesga-32', name: 'Endesga 32', colors: [], count: 16, distance: 'oklab' },\r\n dither: { method: 'bayer4', strength: 0.6, matrix: null },\r\n alpha: { threshold: 0.5 },\r\n cleanup: { orphans: false, smooth: false },\r\n outline: { mode: 'none', color: '#000000', corners: false },\r\n export: { size: 'scale', scale: 4, indexed: true, grid: false, gridColor: '#000000' },\r\n});\r\n\r\nconst clamp = (v, lo, hi, d) => {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? Math.min(hi, Math.max(lo, n)) : d;\r\n};\r\nconst oneOf = (v, list, d) => (list.includes(v) ? v : d);\r\nconst bool = (v, d) => (typeof v === 'boolean' ? v : d);\r\n\r\n/** Deep copy of the defaults (palette colours resolved). */\r\nexport function defaultSettings() {\r\n return normalizeSettings({});\r\n}\r\n\r\n/**\r\n * Fill in defaults, clamp ranges, resolve built-in palette colours and drop unknown keys.\r\n * Never throws on bad values; it falls back to the default for that field.\r\n * @param {object} input partial settings\r\n */\r\nexport function normalizeSettings(input = {}) {\r\n const d = DEFAULTS;\r\n const i = input || {};\r\n const s = {}; const size = i.size || {}; const adj = i.adjust || {}; const pal = i.palette || {};\r\n const dit = i.dither || {}; const al = i.alpha || {}; const cl = i.cleanup || {}; const ol = i.outline || {};\r\n const ex = i.export || {};\r\n\r\n s.version = SETTINGS_VERSION;\r\n s.size = {\r\n mode: oneOf(size.mode, ['width', 'block'], d.size.mode),\r\n width: Math.round(clamp(size.width, 1, MAX_SIZE, d.size.width)),\r\n height: Math.round(clamp(size.height, 0, MAX_SIZE, d.size.height)),\r\n block: clamp(size.block, 1, 256, d.size.block),\r\n resample: oneOf(size.resample, ['box', 'nearest'], d.size.resample),\r\n };\r\n s.adjust = {\r\n brightness: clamp(adj.brightness, -1, 1, 0),\r\n contrast: clamp(adj.contrast, -1, 1, 0),\r\n saturation: clamp(adj.saturation, -1, 1, 0),\r\n hue: clamp(adj.hue, -180, 180, 0),\r\n gamma: clamp(adj.gamma, 0.2, 5, 1),\r\n };\r\n const fr = i.frame || {};\r\n s.frame = {\r\n aspect: oneOf(fr.aspect, ASPECTS.map(a => a.id), 'original'),\r\n zoom: clamp(fr.zoom, 1, 8, 1),\r\n x: clamp(fr.x, 0, 1, 0.5),\r\n y: clamp(fr.y, 0, 1, 0.5),\r\n };\r\n\r\n const source = oneOf(pal.source, ['builtin', 'custom', 'extract', 'none'], d.palette.source);\r\n s.palette = {\r\n source,\r\n id: typeof pal.id === 'string' ? pal.id : (source === 'builtin' ? d.palette.id : ''),\r\n name: typeof pal.name === 'string' ? pal.name : '',\r\n colors: [],\r\n count: Math.round(clamp(pal.count, 2, 256, d.palette.count)),\r\n distance: oneOf(pal.distance, ['oklab', 'rgb'], d.palette.distance),\r\n };\r\n if (source === 'builtin') {\r\n const p = getPalette(s.palette.id) || getPalette(d.palette.id);\r\n s.palette.id = p.id; s.palette.name = p.name; s.palette.colors = p.colors.map(c => '#' + c);\r\n } else if (source === 'custom') {\r\n s.palette.colors = (Array.isArray(pal.colors) ? pal.colors : []).filter(isColor).map(normHex).slice(0, 256);\r\n if (!s.palette.colors.length) s.palette.colors = ['#000000', '#ffffff'];\r\n s.palette.name = s.palette.name || 'Custom';\r\n } else if (source === 'extract') {\r\n s.palette.name = `Extracted (${s.palette.count})`;\r\n } else {\r\n s.palette.name = 'None';\r\n }\r\n\r\n const method = DITHER_METHODS.some(m => m.id === dit.method) ? dit.method : d.dither.method;\r\n s.dither = {\r\n method,\r\n strength: clamp(dit.strength, 0, 1, d.dither.strength),\r\n matrix: normalizeMatrix(dit.matrix),\r\n };\r\n s.alpha = { threshold: clamp(al.threshold, 0, 1, d.alpha.threshold) };\r\n s.cleanup = { orphans: bool(cl.orphans, false), smooth: bool(cl.smooth, false) };\r\n s.outline = {\r\n mode: oneOf(ol.mode, ['none', 'outer', 'inner'], 'none'),\r\n color: isColor(ol.color) ? normHex(ol.color) : d.outline.color,\r\n corners: bool(ol.corners, false),\r\n };\r\n s.export = {\r\n size: oneOf(ex.size, ['scale', 'source'], 'scale'),\r\n scale: Math.round(clamp(ex.scale, 1, 64, d.export.scale)),\r\n indexed: bool(ex.indexed, d.export.indexed),\r\n grid: bool(ex.grid, false),\r\n gridColor: isColor(ex.gridColor) ? normHex(ex.gridColor) : d.export.gridColor,\r\n };\r\n return s;\r\n}\r\n\r\n/** A custom threshold matrix: 2D array of numbers. Ranks are derived from the order of the values. */\r\nexport function normalizeMatrix(m) {\r\n if (!Array.isArray(m) || !m.length || !Array.isArray(m[0])) return null;\r\n const h = Math.min(16, m.length), w = Math.min(16, m[0].length);\r\n const out = [];\r\n for (let y = 0; y < h; y++) {\r\n const row = [];\r\n for (let x = 0; x < w; x++) { const v = Number((m[y] || [])[x]); row.push(Number.isFinite(v) ? v : 0); }\r\n out.push(row);\r\n }\r\n return out;\r\n}\r\n\r\n/** Frame aspect ratios. `ratio` is width / height; null keeps the source's. */\r\nexport const ASPECTS = [\r\n { id: 'original', label: 'Original', ratio: null },\r\n { id: '1:1', label: '1:1', ratio: 1 },\r\n { id: '4:3', label: '4:3', ratio: 4 / 3 },\r\n { id: '3:4', label: '3:4', ratio: 3 / 4 },\r\n { id: '3:2', label: '3:2', ratio: 3 / 2 },\r\n { id: '2:3', label: '2:3', ratio: 2 / 3 },\r\n { id: '16:9', label: '16:9', ratio: 16 / 9 },\r\n { id: '9:16', label: '9:16', ratio: 9 / 16 },\r\n];\r\n\r\n/**\r\n * The part of a srcW \u00D7 srcH source that `frame` keeps, in whole source pixels.\r\n * The largest rectangle of the chosen aspect that fits, divided by zoom, placed by x/y (0 = left/top, 1 = right/bottom).\r\n */\r\nexport function cropRect(srcW, srcH, frame = {}) {\r\n const a = (ASPECTS.find(x => x.id === frame.aspect) || ASPECTS[0]).ratio || srcW / srcH;\r\n let w = srcW, h = srcW / a;\r\n if (h > srcH) { h = srcH; w = srcH * a; }\r\n const zoom = Math.max(1, frame.zoom || 1);\r\n w = Math.max(1, Math.min(srcW, Math.round(w / zoom)));\r\n h = Math.max(1, Math.min(srcH, Math.round(h / zoom)));\r\n const fx = frame.x ?? 0.5, fy = frame.y ?? 0.5;\r\n return { x: Math.round((srcW - w) * fx), y: Math.round((srcH - h) * fy), w, h };\r\n}\r\n\r\n/** Output size in pixels for a source of srcW \u00D7 srcH. */\r\nexport function resolveSize(srcW, srcH, size) {\r\n let w, h;\r\n if (size.mode === 'block') {\r\n w = Math.max(1, Math.round(srcW / size.block));\r\n h = Math.max(1, Math.round(srcH / size.block));\r\n } else {\r\n w = size.width;\r\n h = size.height || Math.max(1, Math.round(w * srcH / srcW));\r\n }\r\n return { width: Math.min(MAX_SIZE, w), height: Math.min(MAX_SIZE, h) };\r\n}\r\n\r\n// ---- sharing ---------------------------------------------------------------\r\n\r\nfunction diff(a, b) {\r\n // keys of `a` whose value differs from `b` (one level deep per group)\r\n const out = {};\r\n for (const k of Object.keys(a)) {\r\n if (k === 'version') continue;\r\n const va = a[k], vb = b[k];\r\n if (va && typeof va === 'object' && !Array.isArray(va)) {\r\n const g = {};\r\n for (const kk of Object.keys(va)) if (JSON.stringify(va[kk]) !== JSON.stringify(vb && vb[kk])) g[kk] = va[kk];\r\n if (Object.keys(g).length) out[k] = g;\r\n } else if (JSON.stringify(va) !== JSON.stringify(vb)) out[k] = va;\r\n }\r\n return out;\r\n}\r\n\r\nconst b64url = {\r\n enc(str) {\r\n const bytes = new TextEncoder().encode(str);\r\n let bin = ''; for (const b of bytes) bin += String.fromCharCode(b);\r\n return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n },\r\n dec(s) {\r\n const bin = atob(s.replace(/-/g, '+').replace(/_/g, '/'));\r\n return new TextDecoder().decode(Uint8Array.from(bin, c => c.charCodeAt(0)));\r\n },\r\n};\r\n\r\n/** Settings \u2192 the smallest JSON that rebuilds them (only what differs from the defaults). */\r\nexport function compactSettings(settings) {\r\n const s = normalizeSettings(settings);\r\n const out = diff(s, defaultSettings());\r\n if (out.palette) {\r\n if (s.palette.source !== 'custom') { delete out.palette.colors; delete out.palette.name; } // a built-in id is enough\r\n if (s.palette.source !== 'builtin') delete out.palette.id;\r\n if (s.palette.source !== 'extract') delete out.palette.count;\r\n }\r\n if (out.palette && !Object.keys(out.palette).length) delete out.palette;\r\n return out;\r\n}\r\n\r\n/** Settings \u2192 URL-safe string for `#s=\u2026`. */\r\nexport function encodeSettings(settings) {\r\n return b64url.enc(JSON.stringify({ v: SETTINGS_VERSION, ...compactSettings(settings) }));\r\n}\r\n\r\n/** `#s=\u2026` string (or a whole URL / hash) \u2192 settings. Throws on garbage. */\r\nexport function decodeSettings(str) {\r\n let s = String(str);\r\n const m = /[#&?]s=([A-Za-z0-9_-]+)/.exec(s);\r\n if (m) s = m[1];\r\n const obj = JSON.parse(b64url.dec(s));\r\n delete obj.v;\r\n return normalizeSettings(obj);\r\n}\r\n\r\n/** Settings \u2192 pretty JSON for saving to a file. */\r\nexport function settingsToJSON(settings) {\r\n return JSON.stringify({ $schema: 'image-to-pixel/settings', version: SETTINGS_VERSION, ...compactSettings(settings) }, null, 2);\r\n}\r\n\r\n/** JSON text \u2192 settings. Accepts a full or partial settings object. */\r\nexport function settingsFromJSON(text) {\r\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\r\n delete obj.$schema;\r\n return normalizeSettings(obj);\r\n}\r\n\r\n/** Apply a partial patch on top of settings (one level deep per group). */\r\nexport function mergeSettings(base, patch) {\r\n const out = JSON.parse(JSON.stringify(base));\r\n for (const k of Object.keys(patch || {})) {\r\n if (patch[k] && typeof patch[k] === 'object' && !Array.isArray(patch[k]) && out[k] && typeof out[k] === 'object') {\r\n Object.assign(out[k], patch[k]);\r\n } else out[k] = patch[k];\r\n }\r\n return normalizeSettings(out);\r\n}\r\n", "// A \"plan\" is everything both backends need, resolved once from settings + source size:\r\n// output size, palette bytes, threshold map, kernel, and the numbers derived from them.\r\n// Building it in one place keeps the CPU and GPU paths in lock-step.\r\n\r\nimport { normalizeSettings, resolveSize, ditherKind, cropRect } from './settings.js';\r\nimport { parseColor, paletteSpread } from './color.js';\r\nimport { thresholdMap } from './dither/matrices.js';\r\nimport { KERNELS, kernelSkew, waveCount } from './dither/kernels.js';\r\nimport { extractPalette } from './palette/extract.js';\r\nimport { resample, adjust } from './cpu/stages.js';\r\n\r\n/**\r\n * @param {object} settings\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA source (only read for palette extraction)\r\n */\r\nexport function makePlan(settings, src) {\r\n const s = normalizeSettings(settings);\r\n const crop = cropRect(src.width, src.height, s.frame);\r\n const { width, height } = resolveSize(crop.w, crop.h, s.size);\r\n\r\n let colors = s.palette.colors;\r\n if (s.palette.source === 'extract') colors = extractFrom(src, s, width, height, crop);\r\n const quantize = s.palette.source !== 'none' && colors.length > 0;\r\n const palette = quantize ? colors.map(parseColor) : [];\r\n\r\n let kind = quantize ? ditherKind(s.dither.method) : 'none';\r\n if (s.dither.strength <= 0) kind = 'none';\r\n\r\n const map = kind === 'ordered' ? thresholdMap(s.dither.method, s.dither.matrix) : null;\r\n const kernel = kind === 'diffusion' ? KERNELS[s.dither.method] : null;\r\n const skew = kernel ? kernelSkew(kernel) : 1;\r\n\r\n return {\r\n settings: s,\r\n srcWidth: src.width, srcHeight: src.height,\r\n crop, // source pixels kept by the frame settings\r\n width, height,\r\n quantize, kind,\r\n palette, // [[r, g, b] bytes]\r\n paletteHex: quantize ? colors.slice() : null,\r\n distance: s.palette.distance === 'rgb' ? 1 : 0,\r\n spread: quantize ? paletteSpread(palette) : 0,\r\n map, kernel, skew,\r\n waves: kernel ? waveCount(width, height, skew) : 0,\r\n outline: { mode: s.outline.mode, color: parseColor(s.outline.color), corners: s.outline.corners },\r\n };\r\n}\r\n\r\nfunction extractFrom(src, s, width, height, crop) {\r\n // extract from what will actually be quantised: the resized + adjusted image (capped for speed)\r\n const k = Math.min(1, 160 / Math.max(width, height));\r\n const w = Math.max(1, Math.round(width * k)), h = Math.max(1, Math.round(height * k));\r\n const prep = resample(src, w, h, 'box', crop);\r\n adjust(prep, s.adjust);\r\n const bytes = new Uint8ClampedArray(prep.length);\r\n for (let i = 0; i < prep.length; i++) bytes[i] = Math.round(prep[i] * 255);\r\n return extractPalette({ data: bytes, width: w, height: h }, s.palette.count, { alphaThreshold: Math.max(0.01, s.alpha.threshold) });\r\n}\r\n", "// Generated by scripts/gen-bluenoise.mjs: 64\u00D764 void-and-cluster blue noise, one byte per cell (0..255).\r\nexport const BLUE_NOISE_SIZE = 64;\r\nexport const BLUE_NOISE_B64 = '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';\r\n", "// Threshold maps for ordered dithering.\r\n// A map is { w, h, levels, values: Uint8Array } and the threshold of a cell is (value + 0.5) / levels.\r\n// The GPU reads the same bytes from a texture, so CPU and GPU agree exactly.\r\n\r\nimport { BLUE_NOISE_B64, BLUE_NOISE_SIZE } from './bluenoise-data.js';\r\n\r\nfunction fromB64(b64) {\r\n if (typeof atob === 'function') return Uint8Array.from(atob(b64), c => c.charCodeAt(0));\r\n return new Uint8Array(Buffer.from(b64, 'base64'));\r\n}\r\n\r\n/** Bayer index matrix of size n (power of two). */\r\nexport function bayer(n) {\r\n let m = [[0]];\r\n for (let s = 1; s < n; s *= 2) {\r\n const next = [];\r\n for (let y = 0; y < s * 2; y++) next.push(new Array(s * 2));\r\n for (let y = 0; y < s; y++) for (let x = 0; x < s; x++) {\r\n const v = 4 * m[y][x];\r\n next[y][x] = v; next[y][x + s] = v + 2; next[y + s][x] = v + 3; next[y + s][x + s] = v + 1;\r\n }\r\n m = next;\r\n }\r\n return m;\r\n}\r\n\r\n/** Turn arbitrary numbers into ranks 0..n-1 (ties keep reading order). */\r\nexport function toRanks(rows) {\r\n const h = rows.length, w = rows[0].length;\r\n const cells = [];\r\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) cells.push({ i: y * w + x, v: rows[y][x] });\r\n cells.sort((a, b) => a.v - b.v || a.i - b.i);\r\n const out = new Uint8Array(w * h);\r\n cells.forEach((c, r) => { out[c.i] = r; });\r\n return out;\r\n}\r\n\r\n/** Clustered-dot screen: cells ranked by a dot function, two dots per tile at 45\u00B0. */\r\nfunction clustered(n) {\r\n const rows = [];\r\n for (let y = 0; y < n; y++) {\r\n const row = [];\r\n for (let x = 0; x < n; x++) {\r\n const u = (x + 0.5) / n * 2 * Math.PI, v = (y + 0.5) / n * 2 * Math.PI;\r\n row.push(-(Math.cos(u) + Math.cos(v)) + (x * n + y) * 1e-9);\r\n }\r\n rows.push(row);\r\n }\r\n return rows;\r\n}\r\n\r\nconst CLUSTER4 = [[7, 13, 11, 4], [12, 16, 14, 8], [10, 15, 6, 2], [5, 9, 3, 1]]; // classic editor's matrix\r\nconst cache = new Map();\r\n\r\n/**\r\n * Threshold map for an ordered method id ('bayer4', 'bluenoise', 'custom' \u2026).\r\n * @param {string} method\r\n * @param {number[][]|null} [custom] matrix for 'custom'\r\n */\r\nexport function thresholdMap(method, custom = null) {\r\n if (method === 'custom') {\r\n const m = custom && custom.length ? custom : bayer(4);\r\n return { w: m[0].length, h: m.length, levels: m.length * m[0].length, values: toRanks(m) };\r\n }\r\n if (cache.has(method)) return cache.get(method);\r\n let map;\r\n const sq = rows => ({ w: rows[0].length, h: rows.length, levels: rows.length * rows[0].length, values: toRanks(rows) });\r\n switch (method) {\r\n case 'bayer2': map = sq(bayer(2)); break;\r\n case 'bayer4': map = sq(bayer(4)); break;\r\n case 'bayer8': map = sq(bayer(8)); break;\r\n case 'bayer16': map = sq(bayer(16)); break;\r\n case 'cluster4': map = sq(CLUSTER4); break;\r\n case 'cluster8': map = sq(clustered(8)); break;\r\n case 'lines': map = sq([[0], [2], [1], [3]]); break;\r\n case 'bluenoise': map = { w: BLUE_NOISE_SIZE, h: BLUE_NOISE_SIZE, levels: 256, values: fromB64(BLUE_NOISE_B64) }; break;\r\n default: map = sq(bayer(4));\r\n }\r\n cache.set(method, map);\r\n return map;\r\n}\r\n\r\n/**\r\n * Parse a custom matrix typed by a person: rows on lines, numbers separated by spaces or commas.\r\n * Accepts an optional \"/ 16\" style divisor line, which is ignored (only the order matters).\r\n */\r\nexport function parseMatrix(text) {\r\n const rows = String(text).split(/\\r?\\n|;/).map(l => l.trim()).filter(l => l && !/^\\//.test(l))\r\n .map(l => l.replace(/[[\\]]/g, '').split(/[\\s,]+/).filter(Boolean).map(Number));\r\n if (!rows.length) throw new Error('Matrix is empty');\r\n const w = rows[0].length;\r\n if (rows.some(r => r.length !== w || r.some(v => !Number.isFinite(v)))) throw new Error('Every row needs the same number of values');\r\n if (w > 16 || rows.length > 16) throw new Error('Matrices are limited to 16\u00D716');\r\n return rows;\r\n}\r\n", "// Error-diffusion kernels as push offsets [dx, dy, weight] (weights already divided).\r\n// `skew` is the wavefront slope the GPU needs: pixels with x + skew*y = k only depend on\r\n// earlier waves, so each wave is one draw (see docs/how-it-works.md).\r\n\r\nconst k = (div, list) => list.map(([dx, dy, w]) => [dx, dy, w / div]);\r\n\r\nexport const KERNELS = {\r\n 'floyd-steinberg': k(16, [[1, 0, 7], [-1, 1, 3], [0, 1, 5], [1, 1, 1]]),\r\n 'atkinson': k(8, [[1, 0, 1], [2, 0, 1], [-1, 1, 1], [0, 1, 1], [1, 1, 1], [0, 2, 1]]),\r\n 'sierra-lite': k(4, [[1, 0, 2], [-1, 1, 1], [0, 1, 1]]),\r\n 'sierra': k(32, [[1, 0, 5], [2, 0, 3], [-2, 1, 2], [-1, 1, 4], [0, 1, 5], [1, 1, 4], [2, 1, 2], [-1, 2, 2], [0, 2, 3], [1, 2, 2]]),\r\n 'burkes': k(32, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2]]),\r\n 'jarvis': k(48, [[1, 0, 7], [2, 0, 5], [-2, 1, 3], [-1, 1, 5], [0, 1, 7], [1, 1, 5], [2, 1, 3], [-2, 2, 1], [-1, 2, 3], [0, 2, 5], [1, 2, 3], [2, 2, 1]]),\r\n 'stucki': k(42, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2], [-2, 2, 1], [-1, 2, 2], [0, 2, 4], [1, 2, 2], [2, 2, 1]]),\r\n};\r\n\r\nexport const MAX_KERNEL = 12;\r\n\r\n/** Smallest integer s so that every push offset lands on a later wave x + s*y. */\r\nexport function kernelSkew(kernel) {\r\n let s = 1;\r\n for (const [dx, dy] of kernel) if (dy > 0) s = Math.max(s, Math.floor(-dx / dy) + 1);\r\n return s;\r\n}\r\n\r\n/** Number of waves (GPU draws) for an image of w \u00D7 h. */\r\nexport const waveCount = (w, h, skew) => (w - 1) + skew * (h - 1) + 1;\r\n", "// Palette extraction: median cut on the image's colours, refined by a few k-means passes.\r\n// Deterministic (no randomness), so the same image always gives the same palette.\r\n\r\nimport { toHex } from '../color.js';\r\n\r\n/**\r\n * @param {{ data: ArrayLike<number>, width: number, height: number }} img RGBA bytes\r\n * @param {number} count number of colours (2..256)\r\n * @param {{ maxSamples?: number, alphaThreshold?: number }} [opts]\r\n * @returns {string[]} '#rrggbb' colours sorted dark \u2192 light\r\n */\r\nexport function extractPalette(img, count = 16, opts = {}) {\r\n const { maxSamples = 40000, alphaThreshold = 0.5 } = opts;\r\n const n = img.width * img.height;\r\n const step = Math.max(1, Math.floor(n / maxSamples));\r\n const pts = [];\r\n for (let i = 0; i < n; i += step) {\r\n const o = i * 4;\r\n if (img.data[o + 3] < alphaThreshold * 255) continue;\r\n pts.push([img.data[o], img.data[o + 1], img.data[o + 2]]);\r\n }\r\n if (!pts.length) return ['#000000', '#ffffff'].slice(0, Math.max(1, count));\r\n\r\n // ---- median cut\r\n let boxes = [pts];\r\n while (boxes.length < count) {\r\n let bi = -1, bestRange = -1, bestAxis = 0;\r\n boxes.forEach((b, i) => {\r\n if (b.length < 2) return;\r\n for (let a = 0; a < 3; a++) {\r\n let lo = 255, hi = 0;\r\n for (const p of b) { if (p[a] < lo) lo = p[a]; if (p[a] > hi) hi = p[a]; }\r\n // weight by population so big flat areas get split before tiny noisy ones\r\n const r = (hi - lo) * Math.sqrt(b.length);\r\n if (r > bestRange) { bestRange = r; bi = i; bestAxis = a; }\r\n }\r\n });\r\n if (bi < 0 || bestRange <= 0) break;\r\n const b = boxes[bi].slice().sort((p, q) => p[bestAxis] - q[bestAxis]);\r\n const mid = b.length >> 1;\r\n boxes.splice(bi, 1, b.slice(0, mid), b.slice(mid));\r\n }\r\n let centers = boxes.map(b => mean(b));\r\n\r\n // ---- k-means refinement\r\n for (let iter = 0; iter < 6; iter++) {\r\n const sums = centers.map(() => [0, 0, 0, 0]);\r\n for (const p of pts) {\r\n let best = 0, bd = Infinity;\r\n for (let c = 0; c < centers.length; c++) {\r\n const dr = p[0] - centers[c][0], dg = p[1] - centers[c][1], db = p[2] - centers[c][2];\r\n const d = dr * dr + dg * dg + db * db;\r\n if (d < bd) { bd = d; best = c; }\r\n }\r\n const s = sums[best]; s[0] += p[0]; s[1] += p[1]; s[2] += p[2]; s[3]++;\r\n }\r\n centers = centers.map((c, i) => (sums[i][3] ? [sums[i][0] / sums[i][3], sums[i][1] / sums[i][3], sums[i][2] / sums[i][3]] : c));\r\n }\r\n\r\n const hexes = [...new Set(centers.map(c => toHex(c)))];\r\n const lum = h => { const v = parseInt(h.slice(1), 16); return 0.2126 * (v >> 16) + 0.7152 * ((v >> 8) & 255) + 0.0722 * (v & 255); };\r\n return hexes.sort((a, b) => lum(a) - lum(b));\r\n}\r\n\r\nfunction mean(list) {\r\n let r = 0, g = 0, b = 0;\r\n for (const p of list) { r += p[0]; g += p[1]; b += p[2]; }\r\n return [r / list.length, g / list.length, b / list.length];\r\n}\r\n", "// CPU reference implementation of every pipeline stage.\r\n// The GLSL in gpu/shaders.js mirrors these functions line for line; tests compare the two.\r\n// Working buffers are Float32Array RGBA, rows top-down, values 0..1.\r\n\r\nimport { oklab, LUMA } from '../color.js';\r\n\r\n/**\r\n * Resample to w \u00D7 h. 'box' averages up to 16\u00D716 evenly spaced source texels per output pixel\r\n * (alpha-weighted); 'nearest' takes the centre texel. Integer maths, identical on the GPU.\r\n */\r\nexport function resample(src, w, h, mode = 'box', crop = null) {\r\n const ox = crop ? crop.x : 0, oy = crop ? crop.y : 0;\r\n const sw = crop ? crop.w : src.width, sh = crop ? crop.h : src.height, d = src.data, stride = src.width;\r\n const out = new Float32Array(w * h * 4);\r\n const nx = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sw / w)));\r\n const ny = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sh / h)));\r\n const xs = new Int32Array(w * nx), ys = new Int32Array(h * ny);\r\n for (let x = 0; x < w; x++) for (let i = 0; i < nx; i++) xs[x * nx + i] = ox + Math.min(sw - 1, Math.floor(((2 * (x * nx + i) + 1) * sw) / (2 * w * nx)));\r\n for (let y = 0; y < h; y++) for (let j = 0; j < ny; j++) ys[y * ny + j] = oy + Math.min(sh - 1, Math.floor(((2 * (y * ny + j) + 1) * sh) / (2 * h * ny)));\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n let r = 0, g = 0, b = 0, a = 0;\r\n for (let j = 0; j < ny; j++) {\r\n const row = ys[y * ny + j] * stride;\r\n for (let i = 0; i < nx; i++) {\r\n const o = (row + xs[x * nx + i]) * 4;\r\n const al = d[o + 3] / 255;\r\n r += d[o] / 255 * al; g += d[o + 1] / 255 * al; b += d[o + 2] / 255 * al; a += al;\r\n }\r\n }\r\n const o = (y * w + x) * 4;\r\n if (a > 0) { out[o] = r / a; out[o + 1] = g / a; out[o + 2] = b / a; }\r\n out[o + 3] = a / (nx * ny);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/** Brightness, contrast, saturation, hue, gamma \u2014 in that order, in place. */\r\nexport function adjust(buf, { brightness = 0, contrast = 0, saturation = 0, hue = 0, gamma = 1 }) {\r\n if (!brightness && !contrast && !saturation && !hue && gamma === 1) return buf;\r\n const f = contrast >= 0 ? 1 / (1 - 0.99 * contrast) : 1 + contrast;\r\n const ig = 1 / gamma;\r\n // luminance-preserving hue rotation: the CSS hue-rotate() matrix (rows sum to 1, so greys stay grey)\r\n const hk = Math.cos(hue * Math.PI / 180), hq = Math.sin(hue * Math.PI / 180);\r\n const M = [\r\n 0.213 + 0.787 * hk - 0.213 * hq, 0.715 - 0.715 * hk - 0.715 * hq, 0.072 - 0.072 * hk + 0.928 * hq,\r\n 0.213 - 0.213 * hk + 0.143 * hq, 0.715 + 0.285 * hk + 0.140 * hq, 0.072 - 0.072 * hk - 0.283 * hq,\r\n 0.213 - 0.213 * hk - 0.787 * hq, 0.715 - 0.715 * hk + 0.715 * hq, 0.072 + 0.928 * hk + 0.072 * hq,\r\n ];\r\n for (let o = 0; o < buf.length; o += 4) {\r\n let r = buf[o] + brightness, g = buf[o + 1] + brightness, b = buf[o + 2] + brightness;\r\n r = (r - 0.5) * f + 0.5; g = (g - 0.5) * f + 0.5; b = (b - 0.5) * f + 0.5;\r\n const l = r * LUMA[0] + g * LUMA[1] + b * LUMA[2];\r\n const k = 1 + saturation;\r\n r = l + (r - l) * k; g = l + (g - l) * k; b = l + (b - l) * k;\r\n if (hue) {\r\n const r2 = M[0] * r + M[1] * g + M[2] * b, g2 = M[3] * r + M[4] * g + M[5] * b, b2 = M[6] * r + M[7] * g + M[8] * b;\r\n r = r2; g = g2; b = b2;\r\n }\r\n buf[o] = Math.pow(clamp01(r), ig); buf[o + 1] = Math.pow(clamp01(g), ig); buf[o + 2] = Math.pow(clamp01(b), ig);\r\n }\r\n return buf;\r\n}\r\n\r\n/** Binary alpha: below the threshold becomes fully transparent, the rest fully opaque. */\r\nexport function alphaCut(buf, threshold) {\r\n for (let o = 3; o < buf.length; o += 4) buf[o] = buf[o] >= threshold && buf[o] > 0 ? 1 : 0;\r\n return buf;\r\n}\r\n\r\nexport const clamp01 = v => (v < 0 ? 0 : v > 1 ? 1 : v);\r\n\r\n/** Precompute what nearest() needs for a palette. */\r\nexport function paletteSpace(palette, distance) {\r\n const n = palette.length;\r\n const coords = new Float64Array(n * 3);\r\n const rgb = new Float64Array(n * 3);\r\n palette.forEach((c, i) => {\r\n rgb.set([c[0] / 255, c[1] / 255, c[2] / 255], i * 3);\r\n coords.set(distance === 1 ? [c[0] / 255, c[1] / 255, c[2] / 255] : oklab(c[0] / 255, c[1] / 255, c[2] / 255), i * 3);\r\n });\r\n return { n, coords, rgb, distance };\r\n}\r\n\r\nconst W_RGB = [0.299, 0.587, 0.114];\r\n\r\n/** Index of the nearest palette colour (ties: lowest index). */\r\nexport function nearest(sp, r, g, b) {\r\n let p0, p1, p2, w0 = 1, w1 = 1, w2 = 1;\r\n if (sp.distance === 1) { p0 = r; p1 = g; p2 = b; w0 = W_RGB[0]; w1 = W_RGB[1]; w2 = W_RGB[2]; }\r\n else [p0, p1, p2] = oklab(r, g, b);\r\n let best = 0, bd = Infinity;\r\n const c = sp.coords;\r\n for (let i = 0; i < sp.n; i++) {\r\n const d0 = p0 - c[i * 3], d1 = p1 - c[i * 3 + 1], d2 = p2 - c[i * 3 + 2];\r\n const dist = w0 * d0 * d0 + w1 * d1 * d1 + w2 * d2 * d2;\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n return best;\r\n}\r\n\r\n/** No dithering / ordered dithering \u2192 RGBA bytes. */\r\nexport function quantizeOrdered(buf, w, h, plan) {\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const sp = plan.quantize ? paletteSpace(plan.palette, plan.distance) : null;\r\n const map = plan.kind === 'ordered' ? plan.map : null;\r\n const amt = map ? plan.spread * plan.settings.dither.strength : 0;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4;\r\n if (buf[o + 3] < 0.5) continue; // transparent stays 0,0,0,0\r\n let r = buf[o], g = buf[o + 1], b = buf[o + 2];\r\n if (sp) {\r\n if (map) {\r\n const t = (map.values[(y % map.h) * map.w + (x % map.w)] + 0.5) / map.levels - 0.5;\r\n r = clamp01(r + t * amt); g = clamp01(g + t * amt); b = clamp01(b + t * amt);\r\n }\r\n const i = nearest(sp, r, g, b);\r\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2];\r\n } else {\r\n out[o] = Math.round(r * 255); out[o + 1] = Math.round(g * 255); out[o + 2] = Math.round(b * 255);\r\n }\r\n out[o + 3] = 255;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/** Error diffusion (left \u2192 right, top \u2192 bottom) \u2192 RGBA bytes. */\r\nexport function quantizeDiffusion(buf, w, h, plan) {\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const sp = paletteSpace(plan.palette, plan.distance);\r\n const acc = new Float32Array(w * h * 3);\r\n const strength = plan.settings.dither.strength;\r\n const kernel = plan.kernel;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const p = y * w + x, o = p * 4;\r\n if (buf[o + 3] < 0.5) continue;\r\n const r = clamp01(buf[o] + acc[p * 3] * strength);\r\n const g = clamp01(buf[o + 1] + acc[p * 3 + 1] * strength);\r\n const b = clamp01(buf[o + 2] + acc[p * 3 + 2] * strength);\r\n const i = nearest(sp, r, g, b);\r\n const er = r - sp.rgb[i * 3], eg = g - sp.rgb[i * 3 + 1], eb = b - sp.rgb[i * 3 + 2];\r\n for (const [dx, dy, wt] of kernel) {\r\n const xx = x + dx, yy = y + dy;\r\n if (xx < 0 || xx >= w || yy >= h) continue;\r\n const q = (yy * w + xx) * 3;\r\n acc[q] += er * wt; acc[q + 1] += eg * wt; acc[q + 2] += eb * wt;\r\n }\r\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2]; out[o + 3] = 255;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nconst key = (d, o) => (d[o + 3] === 0 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\nconst N4 = [[0, -1], [1, 0], [0, 1], [-1, 0]];\r\n\r\n/** Replace pixels that share no colour with any 4-neighbour by their most common neighbour. */\r\nexport function removeOrphans(px, w, h) {\r\n const src = px.slice();\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4, c = key(src, o);\r\n const ks = [], os = [];\r\n for (const [dx, dy] of N4) {\r\n const xx = x + dx, yy = y + dy;\r\n if (xx < 0 || yy < 0 || xx >= w || yy >= h) continue;\r\n const oo = (yy * w + xx) * 4;\r\n ks.push(key(src, oo)); os.push(oo);\r\n }\r\n if (ks.length < 2 || ks.includes(c)) continue;\r\n let best = 0, bc = 0;\r\n for (let i = 0; i < ks.length; i++) {\r\n let n = 0; for (let j = 0; j < ks.length; j++) if (ks[j] === ks[i]) n++;\r\n if (n > bc) { bc = n; best = i; }\r\n }\r\n px.set(src.subarray(os[best], os[best] + 4), o);\r\n }\r\n }\r\n return px;\r\n}\r\n\r\n/** 3\u00D73 majority: a colour that fills at least 5 of the 9 cells wins. */\r\nexport function smoothMajority(px, w, h) {\r\n const src = px.slice();\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4, c = key(src, o);\r\n const ks = [], os = [];\r\n for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) {\r\n const xx = Math.min(w - 1, Math.max(0, x + dx)), yy = Math.min(h - 1, Math.max(0, y + dy));\r\n const oo = (yy * w + xx) * 4; ks.push(key(src, oo)); os.push(oo);\r\n }\r\n for (let i = 0; i < 9; i++) {\r\n if (ks[i] === c) continue;\r\n let n = 0; for (let j = 0; j < 9; j++) if (ks[j] === ks[i]) n++;\r\n if (n >= 5) { px.set(src.subarray(os[i], os[i] + 4), o); break; }\r\n }\r\n }\r\n }\r\n return px;\r\n}\r\n\r\n/** Outline around (outer) or inside (inner) the opaque shape. */\r\nexport function outline(px, w, h, { mode, color, corners }) {\r\n if (mode === 'none') return px;\r\n const src = px.slice();\r\n const opaque = (x, y) => x >= 0 && y >= 0 && x < w && y < h && src[(y * w + x) * 4 + 3] > 0;\r\n const inside = (x, y) => x >= 0 && y >= 0 && x < w && y < h;\r\n const nb = corners ? [[0, -1], [1, 0], [0, 1], [-1, 0], [-1, -1], [1, -1], [1, 1], [-1, 1]] : N4;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const me = opaque(x, y);\r\n let hit = false;\r\n for (const [dx, dy] of nb) {\r\n const xx = x + dx, yy = y + dy;\r\n if (!inside(xx, yy)) continue;\r\n if (mode === 'outer' ? (!me && opaque(xx, yy)) : (me && !opaque(xx, yy))) { hit = true; break; }\r\n }\r\n if (hit) { const o = (y * w + x) * 4; px[o] = color[0]; px[o + 1] = color[1]; px[o + 2] = color[2]; px[o + 3] = 255; }\r\n }\r\n }\r\n return px;\r\n}\r\n", "// The whole pipeline on the CPU. Used when WebGL 2 is unavailable, in Node, and as the\r\n// reference the GPU output is tested against.\r\n\r\nimport { resample, adjust, alphaCut, quantizeOrdered, quantizeDiffusion, removeOrphans, smoothMajority, outline } from './stages.js';\r\n\r\n/**\r\n * @param {ReturnType<import('../plan.js').makePlan>} plan\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA bytes, rows top-down\r\n * @returns {Uint8ClampedArray} RGBA bytes, plan.width \u00D7 plan.height\r\n */\r\nexport function runCPU(plan, src) {\r\n const { width: w, height: h, settings: s } = plan;\r\n const buf = resample(src, w, h, s.size.resample, plan.crop);\r\n adjust(buf, s.adjust);\r\n alphaCut(buf, s.alpha.threshold);\r\n const px = plan.kind === 'diffusion' ? quantizeDiffusion(buf, w, h, plan) : quantizeOrdered(buf, w, h, plan);\r\n if (s.cleanup.orphans) removeOrphans(px, w, h);\r\n if (s.cleanup.smooth) smoothMajority(px, w, h);\r\n outline(px, w, h, plan.outline);\r\n return px;\r\n}\r\n", "// GPU backend: one ShaderMate instance, six passes, rendered on demand (never animating).\r\n\r\nimport { createShader } from 'shadermate';\r\nimport { COMMON, PREP, QUANT, DIFFUSE, RESOLVE, ORPHAN, SMOOTH, OUTLINE } from './shaders.js';\r\nimport { MAX_KERNEL } from '../dither/kernels.js';\r\n\r\nconst canvasOf = (w, h) => { const c = document.createElement('canvas'); c.width = w; c.height = h; return c; };\r\n\r\n/**\r\n * Create the WebGL 2 backend. Rejects when WebGL 2 or float render targets are missing,\r\n * so the caller can fall back to the CPU.\r\n */\r\nexport async function createGPUBackend() {\r\n if (typeof document === 'undefined') throw new Error('No DOM');\r\n const probe = canvasOf(1, 1).getContext('webgl2');\r\n if (!probe) throw new Error('WebGL 2 is not available');\r\n if (!probe.getExtension('EXT_color_buffer_float')) throw new Error('Float render targets are not available');\r\n const dbg = probe.getExtension('WEBGL_debug_renderer_info');\r\n const renderer = String(dbg ? probe.getParameter(dbg.UNMASKED_RENDERER_WEBGL) : probe.getParameter(probe.RENDERER));\r\n probe.getExtension('WEBGL_lose_context')?.loseContext();\r\n\r\n const canvas = canvasOf(1, 1);\r\n const source = canvasOf(1, 1);\r\n const palette = canvasOf(256, 1);\r\n const matrix = canvasOf(1, 1);\r\n const nearest = el => ({ element: el, filter: 'nearest', wrap: 'clamp' });\r\n\r\n const sm = createShader({\r\n canvas,\r\n webgl: 2,\r\n size: [1, 1],\r\n pixelRatio: 1,\r\n autoplay: false,\r\n pauseWhenHidden: false,\r\n pointer: false,\r\n errorOverlay: false,\r\n warnMissingUniforms: false,\r\n preserveDrawingBuffer: true,\r\n premultipliedAlpha: false,\r\n antialias: false,\r\n dialect: 'shadermate',\r\n common: COMMON,\r\n samplers: { u_palette: nearest(palette), u_matrix: nearest(matrix) },\r\n uniforms: {\r\n u_count: 1, u_distance: 0, u_resample: 0, u_adjust: [0, 0, 0, 1], u_hue: 0, u_crop: [0, 0, 1, 1], u_alphaCut: 0.5,\r\n u_mode: 0, u_levels: 1, u_amount: 0,\r\n u_skew: 1, u_strength: 1, u_kn: 0, u_kernel: new Float32Array(MAX_KERNEL * 3),\r\n u_outline: 0, u_corners: 0, u_outlineColor: [0, 0, 0],\r\n },\r\n passes: [\r\n { name: 'prep', shader: PREP, float: 'full', filter: 'nearest', channels: [{ ...nearest(source), dynamic: false }] },\r\n { name: 'quant', shader: QUANT, filter: 'nearest', channels: ['prep'] },\r\n { name: 'diffuse', shader: DIFFUSE, float: 'full', filter: 'nearest', pingpong: true, iterations: 2, channels: ['prep', 'diffuse'] },\r\n { name: 'resolve', shader: RESOLVE, filter: 'nearest', channels: ['quant', 'diffuse'] },\r\n { name: 'orphan', shader: ORPHAN, filter: 'nearest', channels: ['resolve'] },\r\n { name: 'smooth', shader: SMOOTH, filter: 'nearest', channels: ['orphan'] },\r\n { name: 'out', shader: OUTLINE, screen: true, channels: ['smooth'] },\r\n ],\r\n });\r\n\r\n let failure = null;\r\n sm.on('error', e => { failure = e; });\r\n await sm.ready;\r\n if (failure || sm.error) { sm.destroy(); throw failure || sm.error; }\r\n\r\n // `u_on` is a per-pass switch: same name, different value in each pass\r\n const passUniforms = (name, values) => { for (const k in values) sm.set(k, values[k], name); };\r\n\r\n let lastSource = null;\r\n let paletteKey = '', matrixKey = '';\r\n\r\n async function setSource(frame) {\r\n if (frame.canvas === lastSource && !frame.dirty) return;\r\n source.width = frame.width; source.height = frame.height;\r\n const ctx = source.getContext('2d');\r\n ctx.clearRect(0, 0, source.width, source.height);\r\n ctx.drawImage(frame.canvas, 0, 0);\r\n await sm.setChannel(0, { ...nearest(source), dynamic: false }, 'prep');\r\n lastSource = frame.canvas;\r\n }\r\n\r\n function setPalette(plan) {\r\n const key = plan.palette.map(c => c.join(',')).join(';');\r\n if (key === paletteKey) return;\r\n paletteKey = key;\r\n const ctx = palette.getContext('2d');\r\n const img = ctx.createImageData(256, 1);\r\n plan.palette.forEach((c, i) => img.data.set([c[0], c[1], c[2], 255], i * 4));\r\n ctx.putImageData(img, 0, 0);\r\n }\r\n\r\n function setMatrix(map) {\r\n const key = map ? `${map.w}x${map.h}:${map.levels}:${map.values.join(',')}` : 'none';\r\n if (key === matrixKey) return;\r\n matrixKey = key;\r\n const m = map || { w: 1, h: 1, values: [0] };\r\n matrix.width = m.w; matrix.height = m.h;\r\n const ctx = matrix.getContext('2d');\r\n const img = ctx.createImageData(m.w, m.h);\r\n for (let i = 0; i < m.values.length; i++) img.data.set([m.values[i], 0, 0, 255], i * 4);\r\n ctx.putImageData(img, 0, 0);\r\n }\r\n\r\n /**\r\n * @param {ReturnType<import('../plan.js').makePlan>} plan\r\n * @param {{ canvas: HTMLCanvasElement, width: number, height: number, dirty?: boolean }} frame\r\n * @returns {Promise<Uint8ClampedArray>} RGBA bytes, rows top-down\r\n */\r\n async function run(plan, frame) {\r\n const s = plan.settings;\r\n await setSource(frame);\r\n if (plan.quantize) setPalette(plan);\r\n setMatrix(plan.map);\r\n if (sm.width !== plan.width || sm.height !== plan.height) sm.setSize(plan.width, plan.height);\r\n\r\n const diffusion = plan.kind === 'diffusion';\r\n const kernel = new Array(MAX_KERNEL).fill(null).map((_, i) => (plan.kernel && plan.kernel[i]) || [0, 0, 0]);\r\n sm.set({\r\n u_count: plan.palette.length || 1,\r\n u_distance: plan.distance,\r\n u_resample: s.size.resample === 'nearest' ? 1 : 0,\r\n u_adjust: [s.adjust.brightness, s.adjust.contrast, s.adjust.saturation, s.adjust.gamma],\r\n u_hue: s.adjust.hue,\r\n u_crop: [plan.crop.x, plan.crop.y, plan.crop.w, plan.crop.h],\r\n u_alphaCut: s.alpha.threshold,\r\n u_mode: !plan.quantize ? 0 : plan.kind === 'ordered' ? 2 : 1,\r\n u_levels: plan.map ? plan.map.levels : 1,\r\n u_amount: plan.map ? plan.spread * s.dither.strength : 0,\r\n u_skew: plan.skew,\r\n u_strength: s.dither.strength,\r\n u_kn: plan.kernel ? plan.kernel.length : 0,\r\n u_kernel: new Float32Array(kernel.flat()),\r\n u_outline: { none: 0, outer: 1, inner: 2 }[plan.outline.mode],\r\n u_corners: plan.outline.corners ? 1 : 0,\r\n u_outlineColor: plan.outline.color.map(v => v / 255),\r\n });\r\n passUniforms('diffuse', { u_on: diffusion ? 1 : 0 });\r\n passUniforms('resolve', { u_on: diffusion ? 1 : 0 });\r\n passUniforms('orphan', { u_on: s.cleanup.orphans ? 1 : 0 });\r\n passUniforms('smooth', { u_on: s.cleanup.smooth ? 1 : 0 });\r\n sm.getPass('diffuse').cfg.iterations = diffusion ? plan.waves : 1;\r\n\r\n const { data } = sm.readPixels();\r\n // GL rows are bottom-up\r\n const w = plan.width, h = plan.height, out = new Uint8ClampedArray(w * h * 4), row = w * 4;\r\n for (let y = 0; y < h; y++) out.set(data.subarray((h - 1 - y) * row, (h - y) * row), y * row);\r\n return out;\r\n }\r\n\r\n return {\r\n name: 'webgl',\r\n renderer,\r\n /** Software rasterisers (SwiftShader, llvmpipe) are slower than the CPU path for error diffusion. */\r\n software: /swiftshader|llvmpipe|softpipe|software|basic render/i.test(renderer),\r\n run,\r\n shader: sm,\r\n destroy() { sm.destroy(); },\r\n };\r\n}\r\n", "// GLSL (WebGL 2) for the GPU pipeline. Each pass mirrors a function in cpu/stages.js.\r\n// ShaderMate adds the #version line, precision, fragColor and the built-in uniforms.\r\n//\r\n// prep \u2500\u25B6 quant \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n// \u2514\u2500\u2500\u2500\u25B6 diffuse (N waves) \u2500\u25B6 resolve \u2500\u25B6 orphan \u2500\u25B6 smooth \u2500\u25B6 out (screen)\r\n//\r\n// Note: no trailing comments on uniform lines; ShaderMate reads trailing numbers there as default values.\r\n// All passes address pixels top-down (`P`, row 0 = top) so the maths matches the CPU.\r\n\r\nexport const COMMON = /* glsl */`\r\n// 256\u00D71, palette colours in x = 0..count-1\r\nuniform sampler2D u_palette;\r\nuniform int u_count;\r\n// 0 = OKLab, 1 = weighted RGB\r\nuniform int u_distance;\r\n\r\nivec2 topDown() { return ivec2(int(gl_FragCoord.x), int(u_resolution.y) - 1 - int(gl_FragCoord.y)); }\r\nvec4 at(sampler2D t, ivec2 p) { ivec2 s = textureSize(t, 0); return texelFetch(t, ivec2(p.x, s.y - 1 - p.y), 0); }\r\nbool inside(ivec2 p) { return p.x >= 0 && p.y >= 0 && p.x < int(u_resolution.x) && p.y < int(u_resolution.y); }\r\nvec3 palColor(int i) { return texelFetch(u_palette, ivec2(i, 0), 0).rgb; }\r\n\r\nfloat linear1(float c) { return c <= 0.04045 ? c / 12.92 : pow((c + 0.055) / 1.055, 2.4); }\r\nvec3 oklab(vec3 c) {\r\n c = vec3(linear1(c.r), linear1(c.g), linear1(c.b));\r\n float l = pow(0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b, 1.0 / 3.0);\r\n float m = pow(0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b, 1.0 / 3.0);\r\n float s = pow(0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b, 1.0 / 3.0);\r\n return vec3(0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\r\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\r\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s);\r\n}\r\nvec3 space(vec3 c) { return u_distance == 1 ? c : oklab(c); }\r\nint nearestIndex(vec3 c) {\r\n vec3 p = space(c);\r\n vec3 w = u_distance == 1 ? vec3(0.299, 0.587, 0.114) : vec3(1.0);\r\n int best = 0; float bd = 1e20;\r\n for (int i = 0; i < 256; i++) {\r\n if (i >= u_count) break;\r\n vec3 d = p - space(palColor(i));\r\n float dist = dot(w * d, d);\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n return best;\r\n}\r\nint colorKey(vec4 c) {\r\n if (c.a < 0.5) return -1;\r\n ivec3 b = ivec3(floor(c.rgb * 255.0 + 0.5));\r\n return b.r * 65536 + b.g * 256 + b.b;\r\n}\r\n`;\r\n\r\n/** Resample (box / nearest) + adjust + alpha cut. iChannel0 = source image. */\r\nexport const PREP = /* glsl */`\r\n// 0 box, 1 nearest\r\nuniform int u_resample;\r\n// brightness, contrast, saturation, gamma\r\nuniform vec4 u_adjust;\r\n// hue rotation in degrees\r\nuniform float u_hue;\r\nuniform float u_alphaCut;\r\n// source region in texels: x, y (from the top-left), width, height\r\nuniform ivec4 u_crop;\r\n\r\nvoid main() {\r\n ivec2 P = topDown();\r\n ivec2 R = ivec2(u_resolution);\r\n ivec2 O = u_crop.xy;\r\n ivec2 S = u_crop.zw;\r\n int nx = u_resample == 1 ? 1 : clamp((S.x + R.x - 1) / R.x, 1, 16);\r\n int ny = u_resample == 1 ? 1 : clamp((S.y + R.y - 1) / R.y, 1, 16);\r\n vec4 acc = vec4(0.0);\r\n for (int j = 0; j < 16; j++) {\r\n if (j >= ny) break;\r\n int sy = min(S.y - 1, ((2 * (P.y * ny + j) + 1) * S.y) / (2 * R.y * ny));\r\n for (int i = 0; i < 16; i++) {\r\n if (i >= nx) break;\r\n int sx = min(S.x - 1, ((2 * (P.x * nx + i) + 1) * S.x) / (2 * R.x * nx));\r\n vec4 c = at(iChannel0, O + ivec2(sx, sy));\r\n acc += vec4(c.rgb * c.a, c.a);\r\n }\r\n }\r\n vec3 c = acc.a > 0.0 ? acc.rgb / acc.a : vec3(0.0);\r\n float a = acc.a / float(nx * ny);\r\n\r\n float br = u_adjust.x, co = u_adjust.y, sa = u_adjust.z, ga = u_adjust.w;\r\n if (br != 0.0 || co != 0.0 || sa != 0.0 || ga != 1.0 || u_hue != 0.0) {\r\n float f = co >= 0.0 ? 1.0 / (1.0 - 0.99 * co) : 1.0 + co;\r\n c = (c + br - 0.5) * f + 0.5;\r\n float l = dot(c, vec3(0.2126, 0.7152, 0.0722));\r\n c = l + (c - l) * (1.0 + sa);\r\n if (u_hue != 0.0) {\r\n float h = radians(u_hue), k = cos(h), q = sin(h);\r\n c = vec3(\r\n (0.213 + 0.787 * k - 0.213 * q) * c.r + (0.715 - 0.715 * k - 0.715 * q) * c.g + (0.072 - 0.072 * k + 0.928 * q) * c.b,\r\n (0.213 - 0.213 * k + 0.143 * q) * c.r + (0.715 + 0.285 * k + 0.140 * q) * c.g + (0.072 - 0.072 * k - 0.283 * q) * c.b,\r\n (0.213 - 0.213 * k - 0.787 * q) * c.r + (0.715 - 0.715 * k + 0.715 * q) * c.g + (0.072 + 0.928 * k + 0.072 * q) * c.b);\r\n }\r\n c = pow(clamp(c, 0.0, 1.0), vec3(1.0 / ga));\r\n }\r\n a = (a >= u_alphaCut && a > 0.0) ? 1.0 : 0.0;\r\n fragColor = vec4(c * a, a);\r\n}\r\n`;\r\n\r\n/** No dither / ordered dither. iChannel0 = prep. */\r\nexport const QUANT = /* glsl */`\r\n// threshold bytes in .r\r\nuniform sampler2D u_matrix;\r\n// 0 pass-through, 1 nearest, 2 ordered\r\nuniform int u_mode;\r\nuniform float u_levels;\r\n// spread \u00D7 strength\r\nuniform float u_amount;\r\n\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 p = at(iChannel0, P);\r\n if (p.a < 0.5) { fragColor = vec4(0.0); return; }\r\n vec3 c = p.rgb;\r\n if (u_mode == 0) { fragColor = vec4(floor(c * 255.0 + 0.5) / 255.0, 1.0); return; }\r\n if (u_mode == 2) {\r\n ivec2 ms = textureSize(u_matrix, 0);\r\n float v = floor(at(u_matrix, ivec2(P.x % ms.x, P.y % ms.y)).r * 255.0 + 0.5);\r\n float t = (v + 0.5) / u_levels - 0.5;\r\n c = clamp(c + t * u_amount, 0.0, 1.0);\r\n }\r\n fragColor = vec4(palColor(nearestIndex(c)), 1.0);\r\n}\r\n`;\r\n\r\n/**\r\n * Error diffusion as a wavefront. Iteration r computes every pixel with x + skew*y == r,\r\n * pulling the stored error of already-computed neighbours.\r\n * Output: rgb = quantisation error, a = palette index (-1 not yet computed, -2 transparent).\r\n * iChannel0 = prep, iChannel1 = this pass (previous iteration).\r\n */\r\nexport const DIFFUSE = /* glsl */`\r\n// iteration index, set by ShaderMate for passes with iterations (declared here: a FragCoord.xyz built-in)\r\nuniform int u_recursion;\r\nuniform int u_on;\r\nuniform int u_skew;\r\nuniform float u_strength;\r\nuniform int u_kn;\r\n// push offsets (dx, dy) and weight\r\nuniform vec3 u_kernel[12];\r\n\r\nvoid main() {\r\n if (u_on == 0) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\r\n ivec2 P = topDown();\r\n int k = P.x + u_skew * P.y;\r\n int r = u_recursion;\r\n if (k < r) { fragColor = at(iChannel1, P); return; }\r\n if (k > r) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\r\n vec4 p = at(iChannel0, P);\r\n if (p.a < 0.5) { fragColor = vec4(0.0, 0.0, 0.0, -2.0); return; }\r\n vec3 acc = vec3(0.0);\r\n for (int i = 0; i < 12; i++) {\r\n if (i >= u_kn) break;\r\n ivec2 Q = P - ivec2(u_kernel[i].xy);\r\n if (!inside(Q)) continue;\r\n vec4 e = at(iChannel1, Q);\r\n if (e.a >= 0.0) acc += e.rgb * u_kernel[i].z;\r\n }\r\n vec3 c = clamp(p.rgb + acc * u_strength, 0.0, 1.0);\r\n int idx = nearestIndex(c);\r\n fragColor = vec4(c - palColor(idx), float(idx));\r\n}\r\n`;\r\n\r\n/** Pick the ordered result or turn diffusion indices into colours. iChannel0 = quant, iChannel1 = diffuse. */\r\nexport const RESOLVE = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n if (u_on == 0) { fragColor = at(iChannel0, P); return; }\r\n vec4 d = at(iChannel1, P);\r\n fragColor = d.a < 0.0 ? vec4(0.0) : vec4(palColor(int(d.a + 0.5)), 1.0);\r\n}\r\n`;\r\n\r\n/** Orphan removal. iChannel0 = resolve. */\r\nexport const ORPHAN = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_on == 0) return;\r\n int c = colorKey(me);\r\n ivec2 off[4] = ivec2[4](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0));\r\n int ks[4]; vec4 cs[4]; int n = 0;\r\n for (int i = 0; i < 4; i++) {\r\n ivec2 Q = P + off[i];\r\n if (!inside(Q)) continue;\r\n cs[n] = at(iChannel0, Q); ks[n] = colorKey(cs[n]);\r\n if (ks[n] == c) return;\r\n n++;\r\n }\r\n if (n < 2) return;\r\n int best = 0, bc = 0;\r\n for (int i = 0; i < 4; i++) {\r\n if (i >= n) break;\r\n int m = 0;\r\n for (int j = 0; j < 4; j++) { if (j >= n) break; if (ks[j] == ks[i]) m++; }\r\n if (m > bc) { bc = m; best = i; }\r\n }\r\n fragColor = cs[best];\r\n}\r\n`;\r\n\r\n/** 3\u00D73 majority smoothing. iChannel0 = orphan. */\r\nexport const SMOOTH = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_on == 0) return;\r\n int c = colorKey(me);\r\n ivec2 R = ivec2(u_resolution);\r\n int ks[9]; vec4 cs[9];\r\n for (int j = 0; j < 3; j++) for (int i = 0; i < 3; i++) {\r\n ivec2 Q = clamp(P + ivec2(i - 1, j - 1), ivec2(0), R - 1);\r\n cs[j * 3 + i] = at(iChannel0, Q); ks[j * 3 + i] = colorKey(cs[j * 3 + i]);\r\n }\r\n for (int i = 0; i < 9; i++) {\r\n if (ks[i] == c) continue;\r\n int m = 0;\r\n for (int j = 0; j < 9; j++) if (ks[j] == ks[i]) m++;\r\n if (m >= 5) { fragColor = cs[i]; return; }\r\n }\r\n}\r\n`;\r\n\r\n/** Outline, drawn to the canvas. iChannel0 = smooth. */\r\nexport const OUTLINE = /* glsl */`\r\n// 0 none, 1 outer, 2 inner\r\nuniform int u_outline;\r\nuniform int u_corners;\r\nuniform vec3 u_outlineColor;\r\nbool opaqueAt(ivec2 q) { return inside(q) && at(iChannel0, q).a > 0.5; }\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_outline == 0) return;\r\n bool o = me.a > 0.5;\r\n ivec2 off[8] = ivec2[8](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0), ivec2(-1, -1), ivec2(1, -1), ivec2(1, 1), ivec2(-1, 1));\r\n int n = u_corners == 1 ? 8 : 4;\r\n for (int i = 0; i < 8; i++) {\r\n if (i >= n) break;\r\n ivec2 Q = P + off[i];\r\n if (!inside(Q)) continue;\r\n bool other = opaqueAt(Q);\r\n if (u_outline == 1 ? (!o && other) : (o && !other)) { fragColor = vec4(u_outlineColor, 1.0); return; }\r\n }\r\n}\r\n`;\r\n", "// Turning whatever the caller has into a \"frame\": { width, height, canvas?, data }.\r\n// Accepts URLs, Blobs/Files, <img>, <canvas>, OffscreenCanvas, ImageBitmap, <video> (current frame),\r\n// VideoFrame, ImageData or any { width, height, data } RGBA object, plus p5 / q5 images.\r\n\r\nexport const MAX_SOURCE = 4096;\r\nconst hasDOM = typeof document !== 'undefined';\r\n\r\nconst isRGBA = s => s && typeof s === 'object' && 'data' in s && 'width' in s && 'height' in s && s.data && s.data.length === s.width * s.height * 4;\r\n\r\n/** Load a URL or Blob into something drawable. */\r\nexport async function loadImage(src) {\r\n if (typeof Blob !== 'undefined' && src instanceof Blob) {\r\n if (typeof createImageBitmap === 'function') {\r\n try { return await createImageBitmap(src); } catch { /* fall through (e.g. SVG) */ }\r\n }\r\n src = URL.createObjectURL(src);\r\n }\r\n if (!hasDOM) throw new Error('Loading images by URL needs a browser; pass { width, height, data } in Node.');\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.decoding = 'async';\r\n img.src = src;\r\n await img.decode();\r\n return img;\r\n}\r\n\r\n/** Natural pixel size of a drawable. */\r\nexport function sizeOf(el) {\r\n return {\r\n width: el.naturalWidth || el.videoWidth || el.displayWidth || el.codedWidth || el.width || 0,\r\n height: el.naturalHeight || el.videoHeight || el.displayHeight || el.codedHeight || el.height || 0,\r\n };\r\n}\r\n\r\nfunction unwrap(src) {\r\n // p5.Image / q5 image / p5.Graphics / p5.Renderer\r\n if (src && !isRGBA(src) && typeof src === 'object') {\r\n if (src.canvas && typeof src.canvas === 'object' && 'getContext' in src.canvas) return src.canvas;\r\n if (src.elt && typeof src.elt === 'object' && 'getContext' in src.elt) return src.elt;\r\n }\r\n return src;\r\n}\r\n\r\n/**\r\n * @param {any} source\r\n * @param {{ maxSize?: number, canvas?: HTMLCanvasElement }} [opts] canvas: scratch canvas to reuse\r\n */\r\nexport async function toFrame(source, opts = {}) {\r\n const maxSize = opts.maxSize || MAX_SOURCE;\r\n let src = unwrap(source);\r\n if (typeof src === 'string' || (typeof Blob !== 'undefined' && src instanceof Blob)) src = await loadImage(src);\r\n if (src && typeof src.complete === 'boolean' && !src.complete && src.decode) await src.decode();\r\n\r\n if (isRGBA(src)) {\r\n const frame = { width: src.width, height: src.height, data: src.data, canvas: null };\r\n if (hasDOM) {\r\n Object.defineProperty(frame, 'canvas', {\r\n configurable: true,\r\n get() {\r\n const c = document.createElement('canvas'); c.width = src.width; c.height = src.height;\r\n const img = new ImageData(new Uint8ClampedArray(src.data), src.width, src.height);\r\n c.getContext('2d').putImageData(img, 0, 0);\r\n Object.defineProperty(frame, 'canvas', { value: c });\r\n return c;\r\n },\r\n });\r\n }\r\n return frame;\r\n }\r\n if (!hasDOM) throw new Error('Unsupported source in a non-browser environment. Pass { width, height, data }.');\r\n\r\n let { width, height } = sizeOf(src);\r\n if (!width || !height) throw new Error('Source has no size yet (is the image or video loaded?)');\r\n const k = Math.min(1, maxSize / Math.max(width, height));\r\n width = Math.max(1, Math.round(width * k)); height = Math.max(1, Math.round(height * k));\r\n\r\n const canvas = opts.canvas || document.createElement('canvas');\r\n canvas.width = width; canvas.height = height;\r\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\r\n ctx.clearRect(0, 0, width, height);\r\n ctx.imageSmoothingEnabled = k < 1;\r\n ctx.imageSmoothingQuality = 'high';\r\n ctx.drawImage(src, 0, 0, width, height);\r\n let cached = null;\r\n return {\r\n width, height, canvas, dirty: true,\r\n get data() { return (cached ||= ctx.getImageData(0, 0, width, height).data); },\r\n };\r\n}\r\n", "// Pure pixel helpers (no DOM): integer upscaling, grid lines, colour counting.\r\n\r\nimport { parseColor, toHex } from '../color.js';\r\n\r\n/**\r\n * Nearest-neighbour integer upscale.\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\r\n * @param {number} k scale factor (integer \u2265 1)\r\n * @param {{ grid?: boolean, gridColor?: string, gridAlpha?: number }} [opts] grid: 1px lines between source pixels\r\n */\r\nexport function upscale(img, k = 1, opts = {}) {\r\n k = Math.max(1, Math.round(k));\r\n const w = img.width * k, h = img.height * k;\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const src = img.data, sw = img.width;\r\n for (let y = 0; y < h; y++) {\r\n const sy = (y / k) | 0;\r\n for (let x = 0; x < w; x++) {\r\n const so = (sy * sw + ((x / k) | 0)) * 4, o = (y * w + x) * 4;\r\n out[o] = src[so]; out[o + 1] = src[so + 1]; out[o + 2] = src[so + 2]; out[o + 3] = src[so + 3];\r\n }\r\n }\r\n if (opts.grid && k >= 3) {\r\n const [r, g, b] = parseColor(opts.gridColor || '#000000');\r\n const a = opts.gridAlpha ?? 0.35;\r\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {\r\n if (x % k && y % k) continue;\r\n const o = (y * w + x) * 4;\r\n const sa = out[o + 3] / 255, oa = a + sa * (1 - a);\r\n out[o] = (r * a + out[o] * sa * (1 - a)) / oa;\r\n out[o + 1] = (g * a + out[o + 1] * sa * (1 - a)) / oa;\r\n out[o + 2] = (b * a + out[o + 2] * sa * (1 - a)) / oa;\r\n out[o + 3] = oa * 255;\r\n }\r\n }\r\n return { width: w, height: h, data: out };\r\n}\r\n\r\n/**\r\n * Nearest-neighbour resize to any size (used to export at the source's resolution, like 2.x's\r\n * \"full resolution\" download). Pixels may differ by one in size when the ratio isn't whole.\r\n */\r\nexport function resizeNearest(img, width, height) {\r\n width = Math.max(1, Math.round(width)); height = Math.max(1, Math.round(height));\r\n const out = new Uint8ClampedArray(width * height * 4);\r\n const xs = new Int32Array(width);\r\n for (let x = 0; x < width; x++) xs[x] = Math.min(img.width - 1, Math.floor((x + 0.5) * img.width / width));\r\n for (let y = 0; y < height; y++) {\r\n const sy = Math.min(img.height - 1, Math.floor((y + 0.5) * img.height / height));\r\n for (let x = 0; x < width; x++) {\r\n const so = (sy * img.width + xs[x]) * 4, o = (y * width + x) * 4;\r\n out[o] = img.data[so]; out[o + 1] = img.data[so + 1]; out[o + 2] = img.data[so + 2]; out[o + 3] = img.data[so + 3];\r\n }\r\n }\r\n return { width, height, data: out };\r\n}\r\n\r\n/** Distinct opaque colours in an image ('#rrggbb'), in order of first appearance. */\r\nexport function uniqueColors(img, limit = Infinity) {\r\n const seen = new Set();\r\n const d = img.data;\r\n for (let o = 0; o < d.length; o += 4) {\r\n if (d[o + 3] === 0) continue;\r\n seen.add((d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\n if (seen.size > limit) break;\r\n }\r\n return [...seen].map(v => toHex([v >> 16, (v >> 8) & 255, v & 255]));\r\n}\r\n\r\n/** True when the image has at least one non-opaque pixel. */\r\nexport function hasTransparency(img) {\r\n for (let o = 3; o < img.data.length; o += 4) if (img.data[o] < 255) return true;\r\n return false;\r\n}\r\n\r\n/**\r\n * Detect the pixel-grid size of an upscaled pixel-art image (e.g. a sprite saved at 4\u00D7).\r\n * Returns the largest block size b such that the image is made of b\u00D7b solid blocks\r\n * (allowing a small tolerance for JPEG noise), or 1.\r\n */\r\nexport function detectGrid(img, tolerance = 8) {\r\n const { width: w, height: h, data: d } = img;\r\n const same = (a, b) => Math.abs(d[a] - d[b]) <= tolerance && Math.abs(d[a + 1] - d[b + 1]) <= tolerance && Math.abs(d[a + 2] - d[b + 2]) <= tolerance && Math.abs(d[a + 3] - d[b + 3]) <= tolerance;\r\n // run lengths along rows and columns; the block size divides all of them (mostly)\r\n const gcd = (a, b) => (b ? gcd(b, a % b) : a);\r\n let g = 0;\r\n const stepY = Math.max(1, Math.floor(h / 64)), stepX = Math.max(1, Math.floor(w / 64));\r\n for (let y = 0; y < h; y += stepY) {\r\n let run = 1;\r\n for (let x = 1; x < w; x++) {\r\n if (same((y * w + x) * 4, (y * w + x - 1) * 4)) run++;\r\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\r\n }\r\n }\r\n for (let x = 0; x < w; x += stepX) {\r\n let run = 1;\r\n for (let y = 1; y < h; y++) {\r\n if (same((y * w + x) * 4, ((y - 1) * w + x) * 4)) run++;\r\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\r\n }\r\n }\r\n return g || 1;\r\n}\r\n", "// DOM helpers: canvases and downloads.\r\n\r\nimport { upscale } from './scale.js';\r\n\r\n/** RGBA image \u2192 <canvas>, upscaled by an integer factor with optional grid lines. */\r\nexport function toCanvas(img, scale = 1, opts = {}) {\r\n const up = scale > 1 || opts.grid ? upscale(img, scale, opts) : img;\r\n const c = opts.canvas || document.createElement('canvas');\r\n c.width = up.width; c.height = up.height;\r\n c.getContext('2d').putImageData(new ImageData(new Uint8ClampedArray(up.data), up.width, up.height), 0, 0);\r\n return c;\r\n}\r\n\r\n/** Trigger a browser download for a Blob or bytes. */\r\nexport function downloadBlob(data, filename, type = 'application/octet-stream') {\r\n const blob = data instanceof Blob ? data : new Blob([data], { type });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url; a.download = filename; a.rel = 'noopener';\r\n document.body.appendChild(a); a.click(); a.remove();\r\n setTimeout(() => URL.revokeObjectURL(url), 10000);\r\n}\r\n", "// CRC-32 (IEEE), shared by the PNG and zip writers.\r\nlet table = null;\r\nexport function crc32(bytes, crc = 0) {\r\n if (!table) {\r\n table = new Uint32Array(256);\r\n for (let n = 0; n < 256; n++) {\r\n let c = n;\r\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\r\n table[n] = c >>> 0;\r\n }\r\n }\r\n crc = ~crc >>> 0;\r\n for (let i = 0; i < bytes.length; i++) crc = table[(crc ^ bytes[i]) & 255] ^ (crc >>> 8);\r\n return ~crc >>> 0;\r\n}\r\n", "// Minimal PNG encoder: indexed (colour type 3, with tRNS) when the image has \u2264 256 colours,\r\n// otherwise RGBA. Uses CompressionStream('deflate'), so it works in browsers and in Node 18+.\r\n\r\nimport { crc32 } from './crc32.js';\r\nimport { upscale, resizeNearest } from './scale.js';\r\n\r\nconst SIG = [137, 80, 78, 71, 13, 10, 26, 10];\r\n\r\nasync function deflate(bytes) {\r\n if (typeof CompressionStream === 'function') {\r\n const cs = new CompressionStream('deflate');\r\n const stream = new Blob([bytes]).stream().pipeThrough(cs);\r\n return new Uint8Array(await new Response(stream).arrayBuffer());\r\n }\r\n const { deflateSync } = await import('node:zlib');\r\n return new Uint8Array(deflateSync(bytes));\r\n}\r\n\r\nfunction chunk(type, data) {\r\n const out = new Uint8Array(12 + data.length);\r\n const dv = new DataView(out.buffer);\r\n dv.setUint32(0, data.length);\r\n for (let i = 0; i < 4; i++) out[4 + i] = type.charCodeAt(i);\r\n out.set(data, 8);\r\n dv.setUint32(8 + data.length, crc32(out.subarray(4, 8 + data.length)));\r\n return out;\r\n}\r\n\r\n/** Map pixels to palette indices. Returns null when there are more than 256 colours. */\r\nexport function indexImage(img) {\r\n const d = img.data, n = img.width * img.height;\r\n const map = new Map(), colors = [], idx = new Uint8Array(n);\r\n for (let i = 0; i < n; i++) {\r\n const o = i * 4;\r\n const k = d[o + 3] === 0 ? -1 : ((d[o] << 24) | (d[o + 1] << 16) | (d[o + 2] << 8) | d[o + 3]) >>> 0;\r\n let v = map.get(k);\r\n if (v === undefined) {\r\n if (colors.length === 256) return null;\r\n v = colors.length; map.set(k, v);\r\n colors.push(k === -1 ? [0, 0, 0, 0] : [d[o], d[o + 1], d[o + 2], d[o + 3]]);\r\n }\r\n idx[i] = v;\r\n }\r\n return { colors, indices: idx };\r\n}\r\n\r\n/**\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\r\n * @param {{ scale?: number, grid?: boolean, gridColor?: string, indexed?: boolean, width?: number, height?: number }} [opts]\r\n * width/height: resize to exactly this size (nearest neighbour) instead of scaling\r\n * @returns {Promise<Uint8Array>}\r\n */\r\nexport async function encodePNG(img, opts = {}) {\r\n if (opts.width && opts.height) img = resizeNearest(img, opts.width, opts.height);\r\n else if ((opts.scale && opts.scale > 1) || opts.grid) img = upscale(img, opts.scale || 1, opts);\r\n const { width: w, height: h } = img;\r\n const ix = opts.indexed === false ? null : indexImage(img);\r\n const ihdr = new Uint8Array(13);\r\n const dv = new DataView(ihdr.buffer);\r\n dv.setUint32(0, w); dv.setUint32(4, h);\r\n const parts = [new Uint8Array(SIG)];\r\n let raw;\r\n if (ix) {\r\n const bits = ix.colors.length <= 2 ? 1 : ix.colors.length <= 4 ? 2 : ix.colors.length <= 16 ? 4 : 8;\r\n ihdr.set([bits, 3, 0, 0, 0], 8);\r\n const stride = Math.ceil(w * bits / 8);\r\n raw = new Uint8Array((stride + 1) * h);\r\n for (let y = 0; y < h; y++) {\r\n const row = y * (stride + 1) + 1;\r\n for (let x = 0; x < w; x++) {\r\n const v = ix.indices[y * w + x];\r\n const bit = x * bits;\r\n raw[row + (bit >> 3)] |= v << (8 - bits - (bit & 7));\r\n }\r\n }\r\n parts.push(chunk('IHDR', ihdr));\r\n parts.push(chunk('PLTE', Uint8Array.from(ix.colors.flatMap(c => c.slice(0, 3)))));\r\n if (ix.colors.some(c => c[3] < 255)) {\r\n let last = ix.colors.length; while (last > 0 && ix.colors[last - 1][3] === 255) last--;\r\n parts.push(chunk('tRNS', Uint8Array.from(ix.colors.slice(0, last).map(c => c[3]))));\r\n }\r\n } else {\r\n ihdr.set([8, 6, 0, 0, 0], 8);\r\n raw = new Uint8Array((w * 4 + 1) * h);\r\n for (let y = 0; y < h; y++) raw.set(img.data.subarray ? img.data.subarray(y * w * 4, (y + 1) * w * 4) : Array.prototype.slice.call(img.data, y * w * 4, (y + 1) * w * 4), y * (w * 4 + 1) + 1);\r\n parts.push(chunk('IHDR', ihdr));\r\n }\r\n parts.push(chunk('IDAT', await deflate(raw)));\r\n parts.push(chunk('IEND', new Uint8Array(0)));\r\n const total = parts.reduce((s, p) => s + p.length, 0);\r\n const out = new Uint8Array(total);\r\n let o = 0; for (const p of parts) { out.set(p, o); o += p.length; }\r\n return out;\r\n}\r\n", "// The public engine: createPixelator() picks a backend and turns sources into pixel art.\r\n\r\nimport { makePlan } from './plan.js';\r\nimport { runCPU } from './cpu/pipeline.js';\r\nimport { createGPUBackend } from './gpu/backend.js';\r\nimport { toFrame } from './source.js';\r\nimport { normalizeSettings, LEGACY_DITHER } from './settings.js';\r\nimport { uniqueColors } from './export/scale.js';\r\nimport { toCanvas } from './export/canvas.js';\r\nimport { encodePNG } from './export/png.js';\r\n\r\nconst isVideo = s => typeof HTMLVideoElement !== 'undefined' && s instanceof HTMLVideoElement;\r\nconst isVideoFrame = s => typeof VideoFrame !== 'undefined' && s instanceof VideoFrame;\r\n\r\n/**\r\n * Create an engine. Reuse one for many images: the GPU backend compiles its shaders once.\r\n * @param {{ backend?: 'auto' | 'webgl' | 'cpu', diffusion?: 'auto' | 'gpu' | 'cpu', maxSourceSize?: number }} [options]\r\n * diffusion: where error diffusion runs. 'auto' uses the GPU unless WebGL is software-rendered.\r\n */\r\nexport async function createPixelator(options = {}) {\r\n const want = options.backend || 'auto';\r\n let gpu = null, gpuError = null;\r\n if (want !== 'cpu' && typeof document !== 'undefined') {\r\n try { gpu = await createGPUBackend(); } catch (e) {\r\n gpuError = e;\r\n if (want === 'webgl') throw e;\r\n }\r\n }\r\n const scratch = typeof document !== 'undefined' ? document.createElement('canvas') : null;\r\n let last = { source: null, frame: null };\r\n let queue = Promise.resolve();\r\n\r\n async function frameFor(source) {\r\n if (source === last.source && last.frame && !isVideo(source) && !isVideoFrame(source)) {\r\n last.frame.dirty = false;\r\n return last.frame;\r\n }\r\n const frame = await toFrame(source, { maxSize: options.maxSourceSize, canvas: scratch });\r\n last = { source, frame };\r\n return frame;\r\n }\r\n\r\n async function processNow(source, settings) {\r\n const t0 = typeof performance !== 'undefined' ? performance.now() : Date.now();\r\n const frame = await frameFor(source);\r\n const plan = makePlan(settings, frame);\r\n let data, backend = 'cpu';\r\n const diffusionOnCPU = plan.kind === 'diffusion' && (options.diffusion === 'cpu' || (options.diffusion !== 'gpu' && gpu && gpu.software));\r\n if (gpu && frame.canvas && !diffusionOnCPU) {\r\n data = await gpu.run(plan, frame);\r\n backend = 'webgl';\r\n } else {\r\n data = runCPU(plan, frame);\r\n }\r\n const ms = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - t0;\r\n return makeResult(plan, data, backend, ms);\r\n }\r\n\r\n return {\r\n /** 'webgl' or 'cpu' */\r\n get backend() { return gpu ? 'webgl' : 'cpu'; },\r\n /** GPU renderer string (WebGL backend only). */\r\n get renderer() { return gpu ? gpu.renderer : ''; },\r\n /** Why the GPU backend is not in use, if it isn't. */\r\n get fallbackReason() { return gpuError ? String(gpuError.message || gpuError) : ''; },\r\n /**\r\n * Process one source. Calls are queued, so it is safe to call from input handlers.\r\n * @returns {Promise<PixelResult>}\r\n */\r\n process(source, settings = {}) {\r\n const run = queue.then(() => processNow(source, settings));\r\n queue = run.catch(() => { });\r\n return run;\r\n },\r\n /** Forget the cached source (call after drawing new content into the same canvas). */\r\n invalidate() { last = { source: null, frame: null }; },\r\n destroy() { if (gpu) gpu.destroy(); gpu = null; },\r\n /** The underlying ShaderMate instance (GPU backend only), for debugging. */\r\n get shader() { return gpu ? gpu.shader : null; },\r\n };\r\n}\r\n\r\n/**\r\n * @typedef {object} PixelResult\r\n * @property {number} width\r\n * @property {number} height\r\n * @property {Uint8ClampedArray} data RGBA, rows top-down\r\n * @property {string[]} palette colours actually available ('#rrggbb')\r\n * @property {object} settings normalised settings used\r\n * @property {'webgl'|'cpu'} backend\r\n * @property {number} ms processing time\r\n */\r\nexport function makeResult(plan, data, backend = 'cpu', ms = 0) {\r\n const result = {\r\n width: plan.width,\r\n height: plan.height,\r\n data,\r\n palette: plan.paletteHex ? plan.paletteHex.slice() : null,\r\n settings: plan.settings,\r\n kind: plan.kind,\r\n waves: plan.waves,\r\n /** The framed part of the source, as fractions of its width and height. */\r\n crop: { x: plan.crop.x / plan.srcWidth, y: plan.crop.y / plan.srcHeight, w: plan.crop.w / plan.srcWidth, h: plan.crop.h / plan.srcHeight },\r\n backend,\r\n ms,\r\n /** Distinct colours actually used in the image. */\r\n usedColors() { return uniqueColors(this); },\r\n toImageData() { return new ImageData(new Uint8ClampedArray(this.data), this.width, this.height); },\r\n /** Canvas at `scale` \u00D7 (nearest-neighbour), optional grid lines. */\r\n toCanvas(scale = 1, opts = {}) { return toCanvas(this, scale, opts); },\r\n /** PNG bytes (indexed when \u2264 256 colours unless `indexed: false`). */\r\n toPNG(opts = {}) { return encodePNG(this, opts); },\r\n async toBlob(opts = {}) { return new Blob([await encodePNG(this, opts)], { type: 'image/png' }); },\r\n };\r\n return result;\r\n}\r\n\r\nlet shared = null;\r\n/** One-shot helper with a shared engine. `pixelate(source, settings)`. */\r\nexport async function pixelate(source, settings) {\r\n // classic API: pixelate({ image, width, dither, strength, palette, resolution }) \u2192 canvas\r\n if (settings === undefined && source && typeof source === 'object' && 'image' in source && 'width' in source) {\r\n return pixelateClassic(source);\r\n }\r\n shared ||= createPixelator();\r\n return (await shared).process(source, settings);\r\n}\r\n\r\n/** Compatibility with image-to-pixel.js 2.x. Returns a canvas like the old function did. */\r\nasync function pixelateClassic(opts) {\r\n const { image, width, dither = 'none', strength = 0, palette = null, resolution = 'original' } = opts;\r\n let pal = { source: 'none' };\r\n if (Array.isArray(palette)) pal = { source: 'custom', colors: palette };\r\n else if (typeof palette === 'string') {\r\n const { fetchLospec } = await import('./palette/lospec.js');\r\n const p = await fetchLospec(palette);\r\n pal = { source: 'custom', colors: p.colors, name: p.name };\r\n }\r\n const settings = normalizeSettings({\r\n size: { width },\r\n palette: pal,\r\n dither: { method: LEGACY_DITHER[String(dither).toLowerCase()] || 'none', strength: strength / 100 },\r\n alpha: { threshold: 0 },\r\n });\r\n shared ||= createPixelator();\r\n const engine = await shared;\r\n const res = await engine.process(image, settings);\r\n if (resolution === 'original') {\r\n const frame = await toFrame(image);\r\n const c = document.createElement('canvas');\r\n c.width = frame.width; c.height = frame.height;\r\n const ctx = c.getContext('2d');\r\n ctx.imageSmoothingEnabled = false;\r\n ctx.drawImage(res.toCanvas(1), 0, 0, c.width, c.height);\r\n return c;\r\n }\r\n return res.toCanvas(1);\r\n}\r\n", "// Built-in presets: partial settings applied on top of the defaults.\r\n\r\nexport const PRESETS = [\r\n {\r\n id: 'balanced', name: 'Balanced', description: 'Endesga 32, Bayer 4\u00D74. A good first look at most photos.',\r\n settings: { size: { width: 96 }, palette: { source: 'builtin', id: 'endesga-32' }, dither: { method: 'bayer4', strength: 0.6 } },\r\n },\r\n {\r\n id: 'game-boy', name: 'Game Boy', description: 'Four greens, 160 px wide, ordered dither.',\r\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'game-boy-dmg' }, dither: { method: 'bayer4', strength: 1 }, adjust: { contrast: 0.15 } },\r\n },\r\n {\r\n id: 'pico-8', name: 'PICO-8', description: '128 px, the PICO-8 palette, blue-noise dither.',\r\n settings: { size: { width: 128 }, palette: { source: 'builtin', id: 'pico-8' }, dither: { method: 'bluenoise', strength: 0.7 } },\r\n },\r\n {\r\n id: 'one-bit', name: '1-bit Atkinson', description: 'Classic Mac look: two colours, Atkinson diffusion.',\r\n settings: { size: { width: 192 }, palette: { source: 'builtin', id: '1-bit-monitor' }, dither: { method: 'atkinson', strength: 1 }, adjust: { contrast: 0.2 } },\r\n },\r\n {\r\n id: 'faithful', name: 'Faithful colour', description: 'Palette extracted from the image, Floyd\u2013Steinberg.',\r\n settings: { size: { width: 128 }, palette: { source: 'extract', count: 24 }, dither: { method: 'floyd-steinberg', strength: 0.75 } },\r\n },\r\n {\r\n id: 'sprite', name: 'Clean sprite', description: 'No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.',\r\n settings: { size: { width: 48, resample: 'nearest' }, palette: { source: 'extract', count: 12 }, dither: { method: 'none' }, cleanup: { orphans: true }, outline: { mode: 'outer', color: '#1a1c2c' } },\r\n },\r\n {\r\n id: 'cga', name: 'CGA', description: '16 hard colours with an 8\u00D78 Bayer pattern.',\r\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'cga-16' }, dither: { method: 'bayer8', strength: 1 } },\r\n },\r\n {\r\n id: 'newsprint', name: 'Newsprint', description: 'Grey clustered-dot halftone.',\r\n settings: { size: { width: 220 }, palette: { source: 'builtin', id: 'grayscale-4' }, dither: { method: 'cluster8', strength: 1 }, adjust: { saturation: -1 } },\r\n },\r\n {\r\n id: 'soft', name: 'Soft painterly', description: 'Resurrect 64 with Sierra Lite and a light smooth.',\r\n settings: { size: { width: 112 }, palette: { source: 'builtin', id: 'resurrect-64' }, dither: { method: 'sierra-lite', strength: 0.6 }, cleanup: { smooth: true } },\r\n },\r\n];\r\n\r\nexport const getPreset = id => PRESETS.find(p => p.id === id) || null;\r\n", "// Animated GIF encoder. Pixel art already uses a small palette, so frames are written\r\n// losslessly with one global colour table whenever the whole animation fits in 256 colours\r\n// (255 + transparency). Otherwise each frame gets its own table, reduced by median cut if needed.\r\n\r\nimport { upscale } from './scale.js';\r\nimport { extractPalette } from '../palette/extract.js';\r\nimport { parseColor } from '../color.js';\r\n\r\nclass ByteWriter {\r\n constructor() { this.buf = new Uint8Array(1 << 16); this.n = 0; }\r\n byte(b) { if (this.n === this.buf.length) { const nb = new Uint8Array(this.buf.length * 2); nb.set(this.buf); this.buf = nb; } this.buf[this.n++] = b; }\r\n bytes(arr) { for (let i = 0; i < arr.length; i++) this.byte(arr[i]); }\r\n u16(v) { this.byte(v & 255); this.byte((v >> 8) & 255); }\r\n str(s) { for (let i = 0; i < s.length; i++) this.byte(s.charCodeAt(i)); }\r\n result() { return this.buf.slice(0, this.n); }\r\n}\r\n\r\n/** GIF-flavoured LZW for one frame of indices. */\r\nexport function lzwEncode(indices, minCodeSize, w) {\r\n const clear = 1 << minCodeSize, eoi = clear + 1;\r\n let codeSize = minCodeSize + 1, next = eoi + 1;\r\n let dict = new Map();\r\n let cur = 0, curBits = 0;\r\n const sub = [];\r\n let block = [];\r\n const emit = code => {\r\n cur |= code << curBits; curBits += codeSize;\r\n while (curBits >= 8) { block.push(cur & 255); cur >>>= 8; curBits -= 8; if (block.length === 255) { sub.push(block); block = []; } }\r\n };\r\n emit(clear);\r\n let prefix = indices[0];\r\n for (let i = 1; i < indices.length; i++) {\r\n const k = indices[i];\r\n const key = prefix * 256 + k;\r\n const hit = dict.get(key);\r\n if (hit !== undefined) { prefix = hit; continue; }\r\n emit(prefix);\r\n if (next < 4096) {\r\n dict.set(key, next++);\r\n if (next > (1 << codeSize) && codeSize < 12) codeSize++;\r\n } else {\r\n emit(clear); dict = new Map(); codeSize = minCodeSize + 1; next = eoi + 1;\r\n }\r\n prefix = k;\r\n }\r\n emit(prefix);\r\n emit(eoi);\r\n if (curBits > 0) block.push(cur & 255);\r\n if (block.length) sub.push(block);\r\n w.byte(minCodeSize);\r\n for (const b of sub) { w.byte(b.length); w.bytes(b); }\r\n w.byte(0);\r\n}\r\n\r\nconst keyOf = (d, o) => (d[o + 3] < 128 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\n\r\nfunction tableFor(colorKeys, transparent) {\r\n const list = [...colorKeys].filter(k => k !== -1);\r\n const colors = list.map(k => [k >> 16, (k >> 8) & 255, k & 255]);\r\n const tIndex = transparent ? colors.length : -1;\r\n if (transparent) colors.push([0, 0, 0]);\r\n let bits = 1; while ((1 << bits) < colors.length) bits++;\r\n while (colors.length < (1 << bits)) colors.push([0, 0, 0]);\r\n const index = new Map(list.map((k, i) => [k, i]));\r\n return { colors, bits, tIndex, index };\r\n}\r\n\r\nfunction reduce(frame, max) {\r\n // > max colours: median-cut palette, then nearest colour per pixel\r\n const pal = extractPalette(frame, max).map(parseColor);\r\n const d = new Uint8ClampedArray(frame.data);\r\n const cache = new Map();\r\n for (let o = 0; o < d.length; o += 4) {\r\n if (d[o + 3] < 128) continue;\r\n const k = (d[o] << 16) | (d[o + 1] << 8) | d[o + 2];\r\n let best = cache.get(k);\r\n if (best === undefined) {\r\n let bd = Infinity; best = 0;\r\n for (let i = 0; i < pal.length; i++) {\r\n const dr = d[o] - pal[i][0], dg = d[o + 1] - pal[i][1], db = d[o + 2] - pal[i][2];\r\n const dist = dr * dr * 3 + dg * dg * 4 + db * db * 2;\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n cache.set(k, best);\r\n }\r\n d.set(pal[best], o);\r\n }\r\n return { ...frame, data: d };\r\n}\r\n\r\n/**\r\n * @param {{ width: number, height: number, data: ArrayLike<number>, delay?: number }[]} frames delay in ms\r\n * @param {{ loop?: number, scale?: number, delay?: number }} [opts] loop: 0 = forever, -1 = play once\r\n * @returns {Uint8Array}\r\n */\r\nexport function encodeGIF(frames, opts = {}) {\r\n if (!frames.length) throw new Error('No frames');\r\n const scale = Math.max(1, Math.round(opts.scale || 1));\r\n const fr = frames.map(f => ({ ...(scale > 1 ? upscale(f, scale) : f), delay: f.delay ?? opts.delay ?? 100 }));\r\n const W = fr[0].width, H = fr[0].height;\r\n\r\n // collect colours\r\n let transparent = false;\r\n const all = new Set();\r\n const perFrame = fr.map(f => {\r\n const s = new Set();\r\n for (let o = 0; o < f.data.length; o += 4) { const k = keyOf(f.data, o); if (k === -1) transparent = true; s.add(k); all.add(k); }\r\n return s;\r\n });\r\n const opaqueCount = s => s.size - (s.has(-1) ? 1 : 0);\r\n const globalOK = opaqueCount(all) + (transparent ? 1 : 0) <= 256;\r\n const global = globalOK ? tableFor(all, transparent) : null;\r\n\r\n const w = new ByteWriter();\r\n w.str('GIF89a');\r\n w.u16(W); w.u16(H);\r\n w.byte(global ? 0xf0 | (global.bits - 1) : 0x00);\r\n w.byte(0); w.byte(0);\r\n if (global) for (const c of global.colors) w.bytes(c);\r\n if (fr.length > 1 && opts.loop !== -1) {\r\n w.byte(0x21); w.byte(0xff); w.byte(11); w.str('NETSCAPE2.0'); w.byte(3); w.byte(1); w.u16(opts.loop || 0); w.byte(0);\r\n }\r\n\r\n fr.forEach((f0, i) => {\r\n let f = f0, table = global, set = perFrame[i];\r\n if (!table) {\r\n const max = transparent ? 255 : 256;\r\n if (opaqueCount(set) > max) {\r\n f = reduce(f0, max);\r\n set = new Set(); for (let o = 0; o < f.data.length; o += 4) set.add(keyOf(f.data, o));\r\n }\r\n table = tableFor(set, set.has(-1));\r\n }\r\n // graphic control extension\r\n w.byte(0x21); w.byte(0xf9); w.byte(4);\r\n w.byte(((transparent ? 2 : 1) << 2) | (table.tIndex >= 0 ? 1 : 0));\r\n w.u16(Math.max(2, Math.round(f.delay / 10)));\r\n w.byte(table.tIndex >= 0 ? table.tIndex : 0);\r\n w.byte(0);\r\n // image descriptor\r\n w.byte(0x2c); w.u16(0); w.u16(0); w.u16(W); w.u16(H);\r\n w.byte(table === global ? 0 : 0x80 | (table.bits - 1));\r\n if (table !== global) for (const c of table.colors) w.bytes(c);\r\n const idx = new Uint8Array(W * H);\r\n for (let p = 0; p < idx.length; p++) {\r\n const k = keyOf(f.data, p * 4);\r\n idx[p] = k === -1 ? table.tIndex : table.index.get(k);\r\n }\r\n lzwEncode(idx, Math.max(2, table.bits), w);\r\n });\r\n w.byte(0x3b);\r\n return w.result();\r\n}\r\n", "// Store-only zip writer (PNGs and GIFs are already compressed, so deflating again buys little).\r\n\r\nimport { crc32 } from './crc32.js';\r\n\r\nconst enc = new TextEncoder();\r\n\r\n/**\r\n * @param {{ name: string, data: Uint8Array | string, date?: Date }[]} entries\r\n * @returns {Uint8Array}\r\n */\r\nexport function createZip(entries) {\r\n const files = [], central = [];\r\n let offset = 0;\r\n const used = new Set();\r\n for (const e of entries) {\r\n let name = e.name.replace(/\\\\/g, '/').replace(/^\\/+/, '');\r\n // avoid duplicate names inside one archive\r\n if (used.has(name)) { const m = /^(.*?)(\\.[^.]*)?$/.exec(name); let i = 2; while (used.has(`${m[1]}-${i}${m[2] || ''}`)) i++; name = `${m[1]}-${i}${m[2] || ''}`; }\r\n used.add(name);\r\n const nameBytes = enc.encode(name);\r\n const data = typeof e.data === 'string' ? enc.encode(e.data) : e.data;\r\n const crc = crc32(data);\r\n const d = e.date || new Date();\r\n const time = (d.getHours() << 11) | (d.getMinutes() << 5) | (d.getSeconds() >> 1);\r\n const date = ((d.getFullYear() - 1980) << 9) | ((d.getMonth() + 1) << 5) | d.getDate();\r\n\r\n const local = new Uint8Array(30 + nameBytes.length);\r\n const lv = new DataView(local.buffer);\r\n lv.setUint32(0, 0x04034b50, true); lv.setUint16(4, 20, true); lv.setUint16(6, 0x0800, true); // UTF-8 names\r\n lv.setUint16(8, 0, true); lv.setUint16(10, time, true); lv.setUint16(12, date, true);\r\n lv.setUint32(14, crc, true); lv.setUint32(18, data.length, true); lv.setUint32(22, data.length, true);\r\n lv.setUint16(26, nameBytes.length, true); lv.setUint16(28, 0, true);\r\n local.set(nameBytes, 30);\r\n\r\n const cen = new Uint8Array(46 + nameBytes.length);\r\n const cv = new DataView(cen.buffer);\r\n cv.setUint32(0, 0x02014b50, true); cv.setUint16(4, 20, true); cv.setUint16(6, 20, true); cv.setUint16(8, 0x0800, true);\r\n cv.setUint16(10, 0, true); cv.setUint16(12, time, true); cv.setUint16(14, date, true);\r\n cv.setUint32(16, crc, true); cv.setUint32(20, data.length, true); cv.setUint32(24, data.length, true);\r\n cv.setUint16(28, nameBytes.length, true); cv.setUint32(42, offset, true);\r\n cen.set(nameBytes, 46);\r\n\r\n files.push(local, data); central.push(cen);\r\n offset += local.length + data.length;\r\n }\r\n const cenSize = central.reduce((s, c) => s + c.length, 0);\r\n const end = new Uint8Array(22);\r\n const ev = new DataView(end.buffer);\r\n ev.setUint32(0, 0x06054b50, true); ev.setUint16(8, entries.length, true); ev.setUint16(10, entries.length, true);\r\n ev.setUint32(12, cenSize, true); ev.setUint32(16, offset, true);\r\n const out = new Uint8Array(offset + cenSize + 22);\r\n let o = 0;\r\n for (const p of [...files, ...central, end]) { out.set(p, o); o += p.length; }\r\n return out;\r\n}\r\n", "// Sprite sheets (many frames \u2192 one image + atlas JSON) and tilesets (one image \u2192 unique tiles + map).\r\n\r\nconst blank = (w, h) => ({ width: w, height: h, data: new Uint8ClampedArray(w * h * 4) });\r\n\r\nfunction blit(dst, src, dx, dy, sx = 0, sy = 0, sw = src.width, sh = src.height) {\r\n for (let y = 0; y < sh; y++) {\r\n const so = ((sy + y) * src.width + sx) * 4, o = ((dy + y) * dst.width + dx) * 4;\r\n dst.data.set(src.data.subarray ? src.data.subarray(so, so + sw * 4) : Array.prototype.slice.call(src.data, so, so + sw * 4), o);\r\n }\r\n}\r\n\r\n/**\r\n * Pack frames into a grid. Frames may differ in size; cells use the largest frame.\r\n * @param {{ width: number, height: number, data: ArrayLike<number>, name?: string, delay?: number }[]} frames\r\n * @param {{ columns?: number, padding?: number, name?: string }} [opts] columns: 0 = roughly square\r\n * @returns {{ image: { width, height, data }, atlas: object }}\r\n */\r\nexport function packSpriteSheet(frames, opts = {}) {\r\n if (!frames.length) throw new Error('No frames');\r\n const pad = Math.max(0, opts.padding | 0);\r\n const cw = Math.max(...frames.map(f => f.width)), ch = Math.max(...frames.map(f => f.height));\r\n const cols = Math.max(1, Math.min(frames.length, opts.columns || Math.ceil(Math.sqrt(frames.length))));\r\n const rows = Math.ceil(frames.length / cols);\r\n const W = cols * cw + (cols - 1) * pad, H = rows * ch + (rows - 1) * pad;\r\n const image = blank(W, H);\r\n const out = {};\r\n frames.forEach((f, i) => {\r\n const x = (i % cols) * (cw + pad), y = Math.floor(i / cols) * (ch + pad);\r\n blit(image, f, x, y);\r\n out[f.name || `frame-${String(i).padStart(3, '0')}`] = {\r\n frame: { x, y, w: f.width, h: f.height },\r\n sourceSize: { w: f.width, h: f.height },\r\n ...(f.delay != null ? { duration: Math.round(f.delay) } : {}),\r\n };\r\n });\r\n // the \"hash\" flavour of the TexturePacker / Aseprite JSON format, which most engines read\r\n const atlas = { frames: out, meta: { app: 'image-to-pixel', image: (opts.name || 'sheet') + '.png', size: { w: W, h: H }, scale: '1', columns: cols, rows, padding: pad } };\r\n return { image, atlas };\r\n}\r\n\r\n/**\r\n * Cut an image into tiles, drop duplicates (optionally counting mirrored tiles as duplicates)\r\n * and return the tileset image and a tile map.\r\n * @param {{ width, height, data }} img\r\n * @param {{ tileWidth?: number, tileHeight?: number, columns?: number, flips?: boolean }} [opts]\r\n * @returns {{ image, map: { width: number, height: number, tiles: number[], flips?: number[] }, count: number }}\r\n */\r\nexport function buildTileset(img, opts = {}) {\r\n const tw = Math.max(1, opts.tileWidth || 8), th = Math.max(1, opts.tileHeight || tw);\r\n const mw = Math.ceil(img.width / tw), mh = Math.ceil(img.height / th);\r\n const tiles = [], keys = new Map(), map = [], flipsOut = [];\r\n const read = (tx, ty) => {\r\n const t = blank(tw, th);\r\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\r\n const sx = tx * tw + x, sy = ty * th + y;\r\n if (sx >= img.width || sy >= img.height) continue;\r\n const so = (sy * img.width + sx) * 4;\r\n t.data.set([img.data[so], img.data[so + 1], img.data[so + 2], img.data[so + 3]], (y * tw + x) * 4);\r\n }\r\n return t;\r\n };\r\n const key = t => {\r\n let s = '';\r\n for (let i = 0; i < t.data.length; i += 4) s += t.data[i + 3] === 0 ? '.' : String.fromCharCode(t.data[i] + 1, t.data[i + 1] + 1, t.data[i + 2] + 1);\r\n return s;\r\n };\r\n const flip = (t, fx, fy) => {\r\n const o = blank(tw, th);\r\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\r\n const si = ((fy ? th - 1 - y : y) * tw + (fx ? tw - 1 - x : x)) * 4;\r\n o.data.set(t.data.subarray(si, si + 4), (y * tw + x) * 4);\r\n }\r\n return o;\r\n };\r\n for (let ty = 0; ty < mh; ty++) {\r\n for (let tx = 0; tx < mw; tx++) {\r\n const t = read(tx, ty);\r\n let id = keys.get(key(t)), f = 0;\r\n if (id === undefined && opts.flips) {\r\n for (const [fx, fy, code] of [[1, 0, 1], [0, 1, 2], [1, 1, 3]]) {\r\n const k = keys.get(key(flip(t, fx, fy)));\r\n if (k !== undefined) { id = k; f = code; break; }\r\n }\r\n }\r\n if (id === undefined) { id = tiles.length; tiles.push(t); keys.set(key(t), id); }\r\n map.push(id); flipsOut.push(f);\r\n }\r\n }\r\n const sheet = packSpriteSheet(tiles, { columns: opts.columns || Math.min(16, tiles.length) });\r\n return {\r\n image: sheet.image,\r\n map: { width: mw, height: mh, tileWidth: tw, tileHeight: th, tiles: map, ...(opts.flips ? { flips: flipsOut } : {}) },\r\n count: tiles.length,\r\n };\r\n}\r\n", "// Frame-accurate stepping through an HTMLVideoElement by seeking to the middle of each frame.\r\n// Seeking (instead of playing) means every frame is visited exactly once, regardless of how\r\n// long processing takes, and the same input always produces the same frames.\r\n\r\nconst wait = (el, ev, ms = 4000) => new Promise((res, rej) => {\r\n const t = setTimeout(() => { el.removeEventListener(ev, ok); rej(new Error(`Timed out waiting for \"${ev}\"`)); }, ms);\r\n const ok = () => { clearTimeout(t); res(); };\r\n el.addEventListener(ev, ok, { once: true });\r\n});\r\n\r\nconst MEDIA_ERRORS = {\r\n 1: 'loading was aborted',\r\n 2: 'a network error stopped the download',\r\n 3: 'the browser could not decode it',\r\n 4: \"this browser can't play this video's format\",\r\n};\r\n\r\n/** Turn a <video>'s MediaError into a readable Error (err.code is the MediaError code). */\r\nexport function mediaError(video) {\r\n const code = video.error ? video.error.code : 0;\r\n const err = new Error(MEDIA_ERRORS[code] || 'the video could not be loaded');\r\n err.code = code;\r\n if (video.error && video.error.message) err.detail = video.error.message;\r\n return err;\r\n}\r\n\r\n/** Resolve on `ok`, reject straight away if the media element reports an error. */\r\nconst waitOrFail = (video, ok, ms) => new Promise((res, rej) => {\r\n const done = () => { clearTimeout(t); video.removeEventListener(ok, onOk); video.removeEventListener('error', onErr); };\r\n const onOk = () => { done(); res(); };\r\n const onErr = () => { done(); rej(mediaError(video)); };\r\n const t = setTimeout(() => { done(); rej(new Error(`no response from the video decoder after ${ms / 1000} s`)); }, ms);\r\n video.addEventListener(ok, onOk, { once: true });\r\n video.addEventListener('error', onErr, { once: true });\r\n});\r\n\r\n/**\r\n * Wait until a video's metadata (size, duration) and first frame are available.\r\n * Rejects immediately with a readable message when the browser can't play the file.\r\n */\r\nexport async function videoReady(video, { timeout = 60000 } = {}) {\r\n if (video.error) throw mediaError(video);\r\n if (video.readyState < 1) await waitOrFail(video, 'loadedmetadata', timeout);\r\n if (video.readyState < 2) await waitOrFail(video, 'loadeddata', timeout).catch(e => { if (e.code) throw e; });\r\n return video;\r\n}\r\n\r\n/**\r\n * Best-effort codec name for an MP4/MOV/WebM file, read from its bytes. Used to explain playback errors.\r\n * @param {Blob} file\r\n * @returns {Promise<string>} e.g. 'H.265 (HEVC)', or '' when unknown\r\n */\r\nexport async function sniffVideoCodec(file) {\r\n const buf = new Uint8Array(await file.arrayBuffer());\r\n const NAMES = { avc1: 'H.264', avc3: 'H.264', hvc1: 'H.265 (HEVC)', hev1: 'H.265 (HEVC)', av01: 'AV1', vp09: 'VP9', vp08: 'VP8', mp4v: 'MPEG-4 Part 2', apcn: 'ProRes', apch: 'ProRes', apcs: 'ProRes', apco: 'ProRes', ap4h: 'ProRes 4444', dvh1: 'Dolby Vision', dvhe: 'Dolby Vision' };\r\n // MP4/MOV: the first sample entry of the 'stsd' box names the codec\r\n for (let i = 0; i + 24 < buf.length; i++) {\r\n if (buf[i] === 0x73 && buf[i + 1] === 0x74 && buf[i + 2] === 0x73 && buf[i + 3] === 0x64) {\r\n const type = String.fromCharCode(buf[i + 16], buf[i + 17], buf[i + 18], buf[i + 19]);\r\n if (NAMES[type]) return NAMES[type];\r\n }\r\n }\r\n // WebM/Matroska: CodecID strings such as V_VP9, V_AV1, V_MPEGH/ISO/HEVC\r\n const head = new TextDecoder('latin1').decode(buf.subarray(0, Math.min(buf.length, 1 << 20)));\r\n const m = /V_(VP8|VP9|AV1|MPEG4\\/ISO\\/AVC|MPEGH\\/ISO\\/HEVC)/.exec(head);\r\n if (m) return { VP8: 'VP8', VP9: 'VP9', AV1: 'AV1', 'MPEG4/ISO/AVC': 'H.264', 'MPEGH/ISO/HEVC': 'H.265 (HEVC)' }[m[1]];\r\n return '';\r\n}\r\n\r\n/**\r\n * Does this MP4/MOV/WebM file have an audio track? Reads only the container headers: for MP4/MOV the\r\n * top-level boxes are walked to 'moov' (which phones often write at the end) and only that box is read.\r\n * @param {Blob} file\r\n * @returns {Promise<boolean | null>} null when it can't tell\r\n */\r\nexport async function hasAudioTrack(file) {\r\n try {\r\n const head = new Uint8Array(await file.slice(0, 12).arrayBuffer());\r\n if (head[0] === 0x1a && head[1] === 0x45 && head[2] === 0xdf && head[3] === 0xa3) {\r\n // WebM/Matroska: Tracks sit near the start; audio CodecIDs all begin with A_\r\n const text = new TextDecoder('latin1').decode(await file.slice(0, 4 << 20).arrayBuffer());\r\n return /A_(OPUS|VORBIS|AAC|MPEG|AC3|EAC3|FLAC|PCM|DTS|TRUEHD|ALAC)/.test(text);\r\n }\r\n for (let o = 0; o + 8 <= file.size;) {\r\n const dv = new DataView(await file.slice(o, o + 16).arrayBuffer());\r\n let size = dv.getUint32(0);\r\n const type = String.fromCharCode(dv.getUint8(4), dv.getUint8(5), dv.getUint8(6), dv.getUint8(7));\r\n if (size === 1) size = Number(dv.getBigUint64(8));\r\n else if (size === 0) size = file.size - o;\r\n if (size < 8) return null;\r\n if (type === 'moov') {\r\n const moov = new Uint8Array(await file.slice(o, o + size).arrayBuffer());\r\n // each track's 'hdlr' box names its kind 12 bytes after the box type: 'vide', 'soun', \u2026\r\n for (let i = 4; i + 16 <= moov.length; i++) {\r\n if (moov[i] === 0x68 && moov[i + 1] === 0x64 && moov[i + 2] === 0x6c && moov[i + 3] === 0x72\r\n && moov[i + 12] === 0x73 && moov[i + 13] === 0x6f && moov[i + 14] === 0x75 && moov[i + 15] === 0x6e) return true;\r\n }\r\n return false;\r\n }\r\n o += size;\r\n }\r\n return null;\r\n } catch (_) {\r\n return null;\r\n }\r\n}\r\n\r\n/** Seek and resolve once the frame at `time` is decoded and paintable. */\r\nexport async function seekTo(video, time) {\r\n time = Math.max(0, Math.min(time, (video.duration || 0) - 1e-4));\r\n if (Math.abs(video.currentTime - time) < 1e-6 && video.readyState >= 2) return;\r\n const presented = 'requestVideoFrameCallback' in video\r\n ? new Promise(res => { video.requestVideoFrameCallback(() => res()); setTimeout(res, 500); })\r\n : null;\r\n const seeked = wait(video, 'seeked');\r\n video.currentTime = time;\r\n await seeked;\r\n if (presented) await presented;\r\n}\r\n\r\n/**\r\n * Estimate the frame rate from presented frames (requestVideoFrameCallback), falling back to `fallback`.\r\n * Plays muted for a moment and restores the position.\r\n */\r\nexport async function estimateFps(video, fallback = 30) {\r\n if (!('requestVideoFrameCallback' in video)) return fallback;\r\n await videoReady(video);\r\n const was = { t: video.currentTime, muted: video.muted, paused: video.paused };\r\n const times = [];\r\n try {\r\n video.muted = true;\r\n await new Promise((res) => {\r\n const done = setTimeout(res, 1200);\r\n const cb = (_, meta) => {\r\n times.push(meta.mediaTime);\r\n if (times.length >= 12) { clearTimeout(done); res(); } else video.requestVideoFrameCallback(cb);\r\n };\r\n video.requestVideoFrameCallback(cb);\r\n video.play().catch(() => { clearTimeout(done); res(); });\r\n });\r\n } finally {\r\n video.pause();\r\n video.muted = was.muted;\r\n await seekTo(video, was.t).catch(() => { });\r\n }\r\n const deltas = [];\r\n for (let i = 1; i < times.length; i++) { const d = times[i] - times[i - 1]; if (d > 0.001) deltas.push(d); }\r\n if (deltas.length < 3) return fallback;\r\n deltas.sort((a, b) => a - b);\r\n const fps = 1 / deltas[Math.floor(deltas.length / 2)];\r\n // snap to common rates\r\n for (const r of [12, 15, 23.976, 24, 25, 29.97, 30, 48, 50, 59.94, 60]) if (Math.abs(fps - r) < 0.6) return r;\r\n return Math.round(fps);\r\n}\r\n\r\n/** Frame times (seconds, middle of each frame) for a clip. */\r\nexport function frameTimes({ duration, fps, start = 0, end = duration, maxFrames = Infinity }) {\r\n const out = [];\r\n const n = Math.min(maxFrames, Math.max(1, Math.floor((end - start) * fps + 1e-6)));\r\n for (let i = 0; i < n; i++) out.push(start + (i + 0.5) / fps);\r\n return out;\r\n}\r\n\r\n/**\r\n * Visit frames one by one.\r\n * @param {HTMLVideoElement} video\r\n * @param {{ fps: number, start?: number, end?: number, maxFrames?: number, times?: number[], signal?: AbortSignal,\r\n * onFrame: (info: { index: number, time: number, total: number }) => any }} opts\r\n */\r\nexport async function forEachFrame(video, opts) {\r\n await videoReady(video);\r\n const wasPaused = video.paused;\r\n video.pause();\r\n // Explicit timestamps allow non-contiguous frame selections.\r\n const times = Array.isArray(opts.times)\r\n ? opts.times.filter(t => Number.isFinite(t)).slice(0, opts.maxFrames ?? Infinity)\r\n : frameTimes({ duration: video.duration, ...opts });\r\n try {\r\n for (let i = 0; i < times.length; i++) {\r\n if (opts.signal?.aborted) throw new DOMException('Aborted', 'AbortError');\r\n await seekTo(video, times[i]);\r\n if (opts.signal?.aborted) throw new DOMException('Aborted', 'AbortError');\r\n await opts.onFrame({ index: i, time: times[i], total: times.length });\r\n }\r\n } finally {\r\n if (!wasPaused) video.play().catch(() => { });\r\n }\r\n return times.length;\r\n}\r\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,WAAW,GAAG;AAC5B,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;AAC1D,MAAI,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,WAAW,EAAE;AAC9C,MAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EAAG,KAAI,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,QAAM,KAAK,EAAE,EAAE,KAAK,EAAE;AAC5F,MAAI,CAAC,+BAA+B,KAAK,CAAC,EAAG,OAAM,IAAI,MAAM,mBAAmB,CAAC,GAAG;AACpF,SAAO,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;AAC/F;AAGO,SAAS,QAAQ,GAAG;AACzB,MAAI;AAAE,eAAW,CAAC;AAAG,WAAO;AAAA,EAAM,QAAQ;AAAE,WAAO;AAAA,EAAO;AAC5D;AAGO,SAAS,MAAM,KAAK;AACzB,SAAO,MAAM,IAAI,MAAM,GAAG,CAAC,EAAE,IAAI,OAAK,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACxH;AAQO,SAAS,MAAM,GAAG,GAAG,GAAG;AAC7B,MAAI,IAAI,CAAC;AAAG,MAAI,IAAI,CAAC;AAAG,MAAI,IAAI,CAAC;AACjC,QAAM,IAAI,KAAK,KAAK,eAAe,IAAI,eAAe,IAAI,eAAe,CAAC;AAC1E,QAAM,IAAI,KAAK,KAAK,eAAe,IAAI,eAAe,IAAI,eAAe,CAAC;AAC1E,QAAM,IAAI,KAAK,KAAK,eAAe,IAAI,eAAe,IAAI,eAAe,CAAC;AAC1E,SAAO;AAAA,IACL,eAAe,IAAI,cAAe,IAAI,eAAe;AAAA,IACrD,eAAe,IAAI,cAAe,IAAI,eAAe;AAAA,IACrD,eAAe,IAAI,eAAe,IAAI,cAAe;AAAA,EACvD;AACF;AAgBO,SAAS,cAAc,MAAM;AAClC,MAAI,KAAK,SAAS,EAAG,QAAO;AAC5B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAI,MAAM,EAAG;AACb,YAAM,KAAK,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;AAC7F,YAAM,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAC/C,UAAI,IAAI,KAAM,QAAO;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,MAAM,KAAK,IAAI,GAAG,MAAM,KAAK,SAAS,GAAG,CAAC;AAC5D;AApEA,IAuBa,SAEP,KAgBO;AAzCb;AAAA;AAuBO,IAAM,UAAU,OAAK,MAAM,WAAW,CAAC,CAAC;AAE/C,IAAM,MAAM,OAAM,KAAK,UAAU,IAAI,QAAQ,KAAK,KAAK,IAAI,SAAS,OAAO,GAAG;AAgBvE,IAAM,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA;AAAA;;;AC5BpC,SAAS,SAAS,MAAM;AAC7B,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,MAAI,CAAC,iBAAiB,KAAK,MAAM,CAAC,KAAK,EAAE,EAAG,OAAM,IAAI,MAAM,oDAAoD;AAChH,MAAI,OAAO;AACX,QAAM,SAAS,CAAC;AAChB,aAAW,OAAO,MAAM,MAAM,CAAC,GAAG;AAChC,UAAM,OAAO,IAAI,KAAK;AACtB,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,EAAG;AACnC,UAAM,KAAK,kBAAkB,KAAK,IAAI;AACtC,QAAI,IAAI;AAAE,aAAO,GAAG,CAAC,EAAE,KAAK;AAAG;AAAA,IAAU;AACzC,QAAI,aAAa,KAAK,IAAI,EAAG;AAC7B,UAAM,IAAI,qCAAqC,KAAK,IAAI;AACxD,QAAI,EAAG,QAAO,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAAA,EACnD;AACA,SAAO,EAAE,MAAM,OAAO;AACxB;AAEO,SAAS,aAAa,MAAM;AACjC,QAAM,SAAS,CAAC;AAChB,aAAW,OAAO,KAAK,MAAM,OAAO,GAAG;AACrC,UAAM,OAAO,IAAI,KAAK;AACtB,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,IAAI,EAAG;AAC5D,UAAM,IAAI,8CAA8C,KAAK,IAAI;AACjE,QAAI,CAAC,EAAG;AAER,UAAM,IAAI,EAAE,CAAC,EAAE,WAAW,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACjD,WAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,EACxB;AACA,SAAO,EAAE,MAAM,IAAI,OAAO;AAC5B;AAEO,SAAS,UAAU,MAAM;AAC9B,QAAM,QAAQ,KAAK,MAAM,OAAO,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AACnD,MAAI,MAAM,CAAC,MAAM,WAAY,OAAM,IAAI,MAAM,oBAAoB;AACjE,QAAM,IAAI,SAAS,MAAM,CAAC,GAAG,EAAE,KAAK;AACpC,QAAM,SAAS,CAAC;AAChB,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK,IAAI,MAAM,QAAQ,KAAK;AAClD,UAAM,IAAI,yBAAyB,KAAK,MAAM,CAAC,CAAC;AAChD,QAAI,EAAG,QAAO,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAAA,EACnD;AACA,SAAO,EAAE,MAAM,IAAI,OAAO;AAC5B;AAEO,SAAS,UAAU,MAAM;AAC9B,QAAM,MAAM,OAAO,SAAS,WAAW,KAAK,MAAM,IAAI,IAAI;AAC1D,QAAM,OAAO,MAAM,QAAQ,GAAG,IAAI,MAAO,IAAI,UAAU,IAAI,WAAW,CAAC;AACvE,QAAM,SAAS,KAAK,IAAI,OAAM,OAAO,MAAM,YAAY,IAAK,EAAE,OAAO,EAAE,QAAS,CAAE,EAAE,OAAO,OAAO,EAAE,IAAI,OAAO;AAC/G,SAAO,EAAE,MAAO,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,QAAS,IAAI,OAAO;AACjE;AAGO,SAAS,WAAW,MAAM;AAC/B,QAAM,SAAS,CAAC;AAChB,QAAM,KAAK;AACX,MAAI;AACJ,SAAQ,IAAI,GAAG,KAAK,IAAI,EAAI,QAAO,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;AACrD,SAAO,EAAE,MAAM,IAAI,OAAO;AAC5B;AAQO,SAAS,aAAa,MAAM,WAAW,IAAI;AAChD,QAAM,OAAO,kBAAkB,KAAK,QAAQ,KAAK,CAAC,GAAG,CAAC,GAAG,YAAY,KAAK;AAC1E,QAAM,IAAI,OAAO,IAAI,EAAE,QAAQ,MAAM,EAAE;AACvC,QAAM,UAAU,EAAE,KAAK;AACvB,MAAI;AACJ,MAAI,QAAQ,SAAS,iBAAiB,KAAK,OAAO,EAAG,OAAM,SAAS,OAAO;AAAA,WAClE,QAAQ,SAAS,QAAQ,WAAW,UAAU,EAAG,OAAM,UAAU,OAAO;AAAA,WACxE,QAAQ,UAAU,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,EAAG,OAAM,UAAU,OAAO;AAAA,WAC7F,QAAQ,SAAS,QAAQ,MAAO,OAAM,aAAa,OAAO;AAAA,OAC9D;AACH,UAAM,aAAa,OAAO;AAC1B,QAAI,CAAC,IAAI,OAAO,OAAQ,OAAM,WAAW,OAAO;AAAA,EAClD;AACA,MAAI,SAAS,OAAO,IAAI,MAAM,EAAE,MAAM,GAAG,GAAG;AAC5C,MAAI,CAAC,IAAI,QAAQ,SAAU,KAAI,OAAO,SAAS,QAAQ,YAAY,EAAE,EAAE,QAAQ,UAAU,GAAG;AAC5F,MAAI,CAAC,IAAI,OAAO,OAAQ,OAAM,IAAI,MAAM,kCAAkC;AAC1E,SAAO;AACT;AAGO,SAAS,MAAM,MAAM,QAAQ;AAClC,QAAM,OAAO,OAAO,IAAI,OAAK;AAC3B,UAAM,IAAI,QAAQ,CAAC;AACnB,UAAM,IAAI,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AACtG,WAAO,GAAG,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,IAAK,EAAE,MAAM,CAAC,CAAC;AAAA,EAClG,CAAC;AACD,SAAO;AAAA,QAAuB,QAAQ,SAAS;AAAA;AAAA;AAAA,EAAoB,KAAK,KAAK,IAAI,CAAC;AAAA;AACpF;AAzGA,IAWM,QAiGO,WAGA;AA/Gb;AAAA;AASA;AAEA,IAAM,SAAS,UAAQ,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAiGjC,IAAM,YAAY,YAAU,OAAO,IAAI,OAAK,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI;AAG9E,IAAM,gBAAgB,CAAC,MAAM,WAAW,KAAK,UAAU,EAAE,MAAM,QAAQ,WAAW,QAAQ,OAAO,IAAI,OAAK,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC;AAAA;AAAA;;;AC/GhJ;AAAA;AAAA;AAAA;AAAA;AAKO,SAAS,WAAW,OAAO;AAChC,QAAM,IAAI,OAAO,SAAS,EAAE,EAAE,KAAK;AACnC,QAAM,IAAI,8BAA8B,KAAK,CAAC;AAC9C,UAAQ,IAAI,EAAE,CAAC,IAAI,GAAG,YAAY,EAAE,QAAQ,qBAAqB,EAAE;AACrE;AAMA,eAAsB,YAAY,WAAW,EAAE,OAAO,IAAI,WAAW,MAAM,IAAI,CAAC,GAAG;AACjF,QAAM,OAAO,WAAW,SAAS;AACjC,MAAI,CAAC,eAAe,KAAK,IAAI,EAAG,OAAM,IAAI,MAAM,+CAA+C;AAC/F,QAAM,MAAM,MAAM,EAAE,mCAAmC,IAAI,OAAO;AAClE,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,mBAAmB,IAAI,MAAM,SAAS,IAAI,GAAG;AAC1E,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,IAAI,UAAU,IAAI;AACxB,SAAO,EAAE,MAAM,KAAK,QAAQ,MAAM,QAAQ,KAAK,UAAU,IAAI,QAAQ,EAAE,QAAQ,KAAK;AACtF;AAvBA;AAAA;AAEA;AAAA;AAAA;;;ACFA;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;;;ACIO,IAAM,WAAW;AAAA,EACtB,EAAE,IAAI,iBAAiB,MAAM,iBAAiB,QAAQ,IAAI,QAAQ,CAAC,UAAS,QAAQ,EAAE;AAAA,EACtF,EAAE,IAAI,UAAU,MAAM,UAAU,QAAQ,eAAe,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC/d,EAAE,IAAI,cAAc,MAAM,cAAc,QAAQ,YAAY,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC9I,EAAE,IAAI,oBAAoB,MAAM,oBAAoB,QAAQ,WAAW,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC/V,EAAE,IAAI,SAAS,MAAM,SAAS,QAAQ,UAAU,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC/T,EAAE,IAAI,UAAU,MAAM,UAAU,QAAQ,IAAI,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EACtM,EAAE,IAAI,mBAAmB,MAAM,mBAAmB,QAAQ,uBAAkB,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC/O,EAAE,IAAI,cAAc,MAAM,cAAc,QAAQ,WAAW,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EACrW,EAAE,IAAI,cAAc,MAAM,cAAc,QAAQ,IAAI,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EACtR,EAAE,IAAI,gBAAgB,MAAM,kBAAkB,QAAQ,IAAI,QAAQ,CAAC,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EACxG,EAAE,IAAI,eAAe,MAAM,eAAe,QAAQ,IAAI,QAAQ,CAAC,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EACpG,EAAE,IAAI,kBAAkB,MAAM,kBAAkB,QAAQ,aAAa,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC7M,EAAE,IAAI,aAAa,MAAM,aAAa,QAAQ,SAAS,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC/L,EAAE,IAAI,WAAW,MAAM,WAAW,QAAQ,sCAAwB,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC5oB,EAAE,IAAI,aAAa,MAAM,aAAa,QAAQ,IAAI,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EACtb,EAAE,IAAI,QAAQ,MAAM,QAAQ,QAAQ,mBAAmB,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EACzI,EAAE,IAAI,SAAS,MAAM,SAAS,QAAQ,IAAI,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC1G,EAAE,IAAI,UAAU,MAAM,UAAU,QAAQ,IAAI,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EACtM,EAAE,IAAI,gBAAgB,MAAM,gBAAgB,QAAQ,eAAe,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC7oB,EAAE,IAAI,SAAS,MAAM,SAAS,QAAQ,yBAAyB,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EACjJ,EAAE,IAAI,4BAA4B,MAAM,4BAA4B,QAAQ,YAAY,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAClqB,EAAE,IAAI,cAAc,MAAM,cAAc,QAAQ,IAAI,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC9M,EAAE,IAAI,cAAc,MAAM,cAAc,QAAQ,kBAAkB,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AAAA,EAC3I,EAAE,IAAI,WAAW,MAAM,WAAW,QAAQ,SAAS,QAAQ,CAAC,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,UAAS,QAAQ,EAAE;AACvR;AAGO,SAAS,WAAW,UAAU;AACnC,QAAMA,KAAI,OAAO,YAAY,EAAE,EAAE,YAAY;AAC7C,SAAO,SAAS,KAAK,OAAK,EAAE,OAAOA,MAAK,EAAE,KAAK,YAAY,MAAMA,EAAC,KAAK;AACzE;;;AC/BA;AAEO,IAAM,mBAAmB;AACzB,IAAM,WAAW;AAGjB,IAAM,iBAAiB;AAAA,EAC5B,EAAE,IAAI,QAAQ,OAAO,QAAQ,MAAM,OAAO;AAAA,EAC1C,EAAE,IAAI,UAAU,OAAO,gBAAa,MAAM,UAAU;AAAA,EACpD,EAAE,IAAI,UAAU,OAAO,gBAAa,MAAM,UAAU;AAAA,EACpD,EAAE,IAAI,UAAU,OAAO,gBAAa,MAAM,UAAU;AAAA,EACpD,EAAE,IAAI,WAAW,OAAO,kBAAe,MAAM,UAAU;AAAA,EACvD,EAAE,IAAI,YAAY,OAAO,wBAAqB,MAAM,UAAU;AAAA,EAC9D,EAAE,IAAI,YAAY,OAAO,wBAAqB,MAAM,UAAU;AAAA,EAC9D,EAAE,IAAI,SAAS,OAAO,oBAAoB,MAAM,UAAU;AAAA,EAC1D,EAAE,IAAI,aAAa,OAAO,cAAc,MAAM,UAAU;AAAA,EACxD,EAAE,IAAI,UAAU,OAAO,iBAAiB,MAAM,UAAU;AAAA,EACxD,EAAE,IAAI,mBAAmB,OAAO,wBAAmB,MAAM,YAAY;AAAA,EACrE,EAAE,IAAI,YAAY,OAAO,YAAY,MAAM,YAAY;AAAA,EACvD,EAAE,IAAI,eAAe,OAAO,eAAe,MAAM,YAAY;AAAA,EAC7D,EAAE,IAAI,UAAU,OAAO,UAAU,MAAM,YAAY;AAAA,EACnD,EAAE,IAAI,UAAU,OAAO,UAAU,MAAM,YAAY;AAAA,EACnD,EAAE,IAAI,UAAU,OAAO,iCAAuB,MAAM,YAAY;AAAA,EAChE,EAAE,IAAI,UAAU,OAAO,UAAU,MAAM,YAAY;AACrD;AACO,IAAM,aAAa,SAAO,eAAe,KAAK,OAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,GAAG;AAGrF,IAAM,gBAAgB;AAAA,EAC3B,QAAQ;AAAA,EAAQ,mBAAmB;AAAA,EAAmB,YAAY;AAAA,EAClE,WAAW;AAAA,EAAU,aAAa;AAAA,EAAU,aAAa;AAAA,EAAU,iBAAiB;AACtF;AAEO,IAAM,WAAW,OAAO,OAAO;AAAA,EACpC,SAAS;AAAA,EACT,MAAM,EAAE,MAAM,SAAS,OAAO,IAAI,QAAQ,GAAG,OAAO,GAAG,UAAU,MAAM;AAAA,EACvE,QAAQ,EAAE,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,KAAK,GAAG,OAAO,EAAE;AAAA,EACtE,OAAO,EAAE,QAAQ,YAAY,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI;AAAA,EACrD,SAAS,EAAE,QAAQ,WAAW,IAAI,cAAc,MAAM,cAAc,QAAQ,CAAC,GAAG,OAAO,IAAI,UAAU,QAAQ;AAAA,EAC7G,QAAQ,EAAE,QAAQ,UAAU,UAAU,KAAK,QAAQ,KAAK;AAAA,EACxD,OAAO,EAAE,WAAW,IAAI;AAAA,EACxB,SAAS,EAAE,SAAS,OAAO,QAAQ,MAAM;AAAA,EACzC,SAAS,EAAE,MAAM,QAAQ,OAAO,WAAW,SAAS,MAAM;AAAA,EAC1D,QAAQ,EAAE,MAAM,SAAS,OAAO,GAAG,SAAS,MAAM,MAAM,OAAO,WAAW,UAAU;AACtF,CAAC;AAED,IAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,MAAM;AAC9B,QAAM,IAAI,OAAO,CAAC;AAClB,SAAO,OAAO,SAAS,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI;AAC9D;AACA,IAAM,QAAQ,CAAC,GAAG,MAAM,MAAO,KAAK,SAAS,CAAC,IAAI,IAAI;AACtD,IAAM,OAAO,CAAC,GAAG,MAAO,OAAO,MAAM,YAAY,IAAI;AAG9C,SAAS,kBAAkB;AAChC,SAAO,kBAAkB,CAAC,CAAC;AAC7B;AAOO,SAAS,kBAAkB,QAAQ,CAAC,GAAG;AAC5C,QAAM,IAAI;AACV,QAAM,IAAI,SAAS,CAAC;AACpB,QAAM,IAAI,CAAC;AAAG,QAAM,OAAO,EAAE,QAAQ,CAAC;AAAG,QAAM,MAAM,EAAE,UAAU,CAAC;AAAG,QAAM,MAAM,EAAE,WAAW,CAAC;AAC/F,QAAM,MAAM,EAAE,UAAU,CAAC;AAAG,QAAM,KAAK,EAAE,SAAS,CAAC;AAAG,QAAM,KAAK,EAAE,WAAW,CAAC;AAAG,QAAM,KAAK,EAAE,WAAW,CAAC;AAC3G,QAAM,KAAK,EAAE,UAAU,CAAC;AAExB,IAAE,UAAU;AACZ,IAAE,OAAO;AAAA,IACP,MAAM,MAAM,KAAK,MAAM,CAAC,SAAS,OAAO,GAAG,EAAE,KAAK,IAAI;AAAA,IACtD,OAAO,KAAK,MAAM,MAAM,KAAK,OAAO,GAAG,UAAU,EAAE,KAAK,KAAK,CAAC;AAAA,IAC9D,QAAQ,KAAK,MAAM,MAAM,KAAK,QAAQ,GAAG,UAAU,EAAE,KAAK,MAAM,CAAC;AAAA,IACjE,OAAO,MAAM,KAAK,OAAO,GAAG,KAAK,EAAE,KAAK,KAAK;AAAA,IAC7C,UAAU,MAAM,KAAK,UAAU,CAAC,OAAO,SAAS,GAAG,EAAE,KAAK,QAAQ;AAAA,EACpE;AACA,IAAE,SAAS;AAAA,IACT,YAAY,MAAM,IAAI,YAAY,IAAI,GAAG,CAAC;AAAA,IAC1C,UAAU,MAAM,IAAI,UAAU,IAAI,GAAG,CAAC;AAAA,IACtC,YAAY,MAAM,IAAI,YAAY,IAAI,GAAG,CAAC;AAAA,IAC1C,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,CAAC;AAAA,IAChC,OAAO,MAAM,IAAI,OAAO,KAAK,GAAG,CAAC;AAAA,EACnC;AACA,QAAM,KAAK,EAAE,SAAS,CAAC;AACvB,IAAE,QAAQ;AAAA,IACR,QAAQ,MAAM,GAAG,QAAQ,QAAQ,IAAI,OAAK,EAAE,EAAE,GAAG,UAAU;AAAA,IAC3D,MAAM,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;AAAA,IAC5B,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG;AAAA,IACxB,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG;AAAA,EAC1B;AAEA,QAAM,SAAS,MAAM,IAAI,QAAQ,CAAC,WAAW,UAAU,WAAW,MAAM,GAAG,EAAE,QAAQ,MAAM;AAC3F,IAAE,UAAU;AAAA,IACV;AAAA,IACA,IAAI,OAAO,IAAI,OAAO,WAAW,IAAI,KAAM,WAAW,YAAY,EAAE,QAAQ,KAAK;AAAA,IACjF,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,IAChD,QAAQ,CAAC;AAAA,IACT,OAAO,KAAK,MAAM,MAAM,IAAI,OAAO,GAAG,KAAK,EAAE,QAAQ,KAAK,CAAC;AAAA,IAC3D,UAAU,MAAM,IAAI,UAAU,CAAC,SAAS,KAAK,GAAG,EAAE,QAAQ,QAAQ;AAAA,EACpE;AACA,MAAI,WAAW,WAAW;AACxB,UAAM,IAAI,WAAW,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,QAAQ,EAAE;AAC7D,MAAE,QAAQ,KAAK,EAAE;AAAI,MAAE,QAAQ,OAAO,EAAE;AAAM,MAAE,QAAQ,SAAS,EAAE,OAAO,IAAI,OAAK,MAAM,CAAC;AAAA,EAC5F,WAAW,WAAW,UAAU;AAC9B,MAAE,QAAQ,UAAU,MAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,SAAS,CAAC,GAAG,OAAO,OAAO,EAAE,IAAI,OAAO,EAAE,MAAM,GAAG,GAAG;AAC1G,QAAI,CAAC,EAAE,QAAQ,OAAO,OAAQ,GAAE,QAAQ,SAAS,CAAC,WAAW,SAAS;AACtE,MAAE,QAAQ,OAAO,EAAE,QAAQ,QAAQ;AAAA,EACrC,WAAW,WAAW,WAAW;AAC/B,MAAE,QAAQ,OAAO,cAAc,EAAE,QAAQ,KAAK;AAAA,EAChD,OAAO;AACL,MAAE,QAAQ,OAAO;AAAA,EACnB;AAEA,QAAM,SAAS,eAAe,KAAK,OAAK,EAAE,OAAO,IAAI,MAAM,IAAI,IAAI,SAAS,EAAE,OAAO;AACrF,IAAE,SAAS;AAAA,IACT;AAAA,IACA,UAAU,MAAM,IAAI,UAAU,GAAG,GAAG,EAAE,OAAO,QAAQ;AAAA,IACrD,QAAQ,gBAAgB,IAAI,MAAM;AAAA,EACpC;AACA,IAAE,QAAQ,EAAE,WAAW,MAAM,GAAG,WAAW,GAAG,GAAG,EAAE,MAAM,SAAS,EAAE;AACpE,IAAE,UAAU,EAAE,SAAS,KAAK,GAAG,SAAS,KAAK,GAAG,QAAQ,KAAK,GAAG,QAAQ,KAAK,EAAE;AAC/E,IAAE,UAAU;AAAA,IACV,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,SAAS,OAAO,GAAG,MAAM;AAAA,IACvD,OAAO,QAAQ,GAAG,KAAK,IAAI,QAAQ,GAAG,KAAK,IAAI,EAAE,QAAQ;AAAA,IACzD,SAAS,KAAK,GAAG,SAAS,KAAK;AAAA,EACjC;AACA,IAAE,SAAS;AAAA,IACT,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,QAAQ,GAAG,OAAO;AAAA,IACjD,OAAO,KAAK,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,EAAE,OAAO,KAAK,CAAC;AAAA,IACxD,SAAS,KAAK,GAAG,SAAS,EAAE,OAAO,OAAO;AAAA,IAC1C,MAAM,KAAK,GAAG,MAAM,KAAK;AAAA,IACzB,WAAW,QAAQ,GAAG,SAAS,IAAI,QAAQ,GAAG,SAAS,IAAI,EAAE,OAAO;AAAA,EACtE;AACA,SAAO;AACT;AAGO,SAAS,gBAAgB,GAAG;AACjC,MAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,EAAG,QAAO;AACnE,QAAM,IAAI,KAAK,IAAI,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC,EAAE,MAAM;AAC9D,QAAM,MAAM,CAAC;AACb,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,MAAM,CAAC;AACb,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAAE,YAAM,IAAI,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAAG,UAAI,KAAK,OAAO,SAAS,CAAC,IAAI,IAAI,CAAC;AAAA,IAAG;AACvG,QAAI,KAAK,GAAG;AAAA,EACd;AACA,SAAO;AACT;AAGO,IAAM,UAAU;AAAA,EACrB,EAAE,IAAI,YAAY,OAAO,YAAY,OAAO,KAAK;AAAA,EACjD,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,EAAE;AAAA,EACpC,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,IAAI,EAAE;AAAA,EACxC,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,IAAI,EAAE;AAAA,EACxC,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,IAAI,EAAE;AAAA,EACxC,EAAE,IAAI,OAAO,OAAO,OAAO,OAAO,IAAI,EAAE;AAAA,EACxC,EAAE,IAAI,QAAQ,OAAO,QAAQ,OAAO,KAAK,EAAE;AAAA,EAC3C,EAAE,IAAI,QAAQ,OAAO,QAAQ,OAAO,IAAI,GAAG;AAC7C;AAMO,SAAS,SAAS,MAAM,MAAM,QAAQ,CAAC,GAAG;AAC/C,QAAM,KAAK,QAAQ,KAAK,OAAK,EAAE,OAAO,MAAM,MAAM,KAAK,QAAQ,CAAC,GAAG,SAAS,OAAO;AACnF,MAAI,IAAI,MAAM,IAAI,OAAO;AACzB,MAAI,IAAI,MAAM;AAAE,QAAI;AAAM,QAAI,OAAO;AAAA,EAAG;AACxC,QAAM,OAAO,KAAK,IAAI,GAAG,MAAM,QAAQ,CAAC;AACxC,MAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC;AACpD,MAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC;AACpD,QAAM,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,KAAK;AAC3C,SAAO,EAAE,GAAG,KAAK,OAAO,OAAO,KAAK,EAAE,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,EAAE,GAAG,GAAG,EAAE;AAChF;AAGO,SAAS,YAAY,MAAM,MAAM,MAAM;AAC5C,MAAI,GAAG;AACP,MAAI,KAAK,SAAS,SAAS;AACzB,QAAI,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,KAAK,KAAK,CAAC;AAC7C,QAAI,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,KAAK,KAAK,CAAC;AAAA,EAC/C,OAAO;AACL,QAAI,KAAK;AACT,QAAI,KAAK,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC;AAAA,EAC5D;AACA,SAAO,EAAE,OAAO,KAAK,IAAI,UAAU,CAAC,GAAG,QAAQ,KAAK,IAAI,UAAU,CAAC,EAAE;AACvE;AAIA,SAAS,KAAK,GAAG,GAAG;AAElB,QAAM,MAAM,CAAC;AACb,aAAWC,MAAK,OAAO,KAAK,CAAC,GAAG;AAC9B,QAAIA,OAAM,UAAW;AACrB,UAAM,KAAK,EAAEA,EAAC,GAAG,KAAK,EAAEA,EAAC;AACzB,QAAI,MAAM,OAAO,OAAO,YAAY,CAAC,MAAM,QAAQ,EAAE,GAAG;AACtD,YAAM,IAAI,CAAC;AACX,iBAAW,MAAM,OAAO,KAAK,EAAE,EAAG,KAAI,KAAK,UAAU,GAAG,EAAE,CAAC,MAAM,KAAK,UAAU,MAAM,GAAG,EAAE,CAAC,EAAG,GAAE,EAAE,IAAI,GAAG,EAAE;AAC5G,UAAI,OAAO,KAAK,CAAC,EAAE,OAAQ,KAAIA,EAAC,IAAI;AAAA,IACtC,WAAW,KAAK,UAAU,EAAE,MAAM,KAAK,UAAU,EAAE,EAAG,KAAIA,EAAC,IAAI;AAAA,EACjE;AACA,SAAO;AACT;AAEA,IAAM,SAAS;AAAA,EACb,IAAI,KAAK;AACP,UAAM,QAAQ,IAAI,YAAY,EAAE,OAAO,GAAG;AAC1C,QAAI,MAAM;AAAI,eAAW,KAAK,MAAO,QAAO,OAAO,aAAa,CAAC;AACjE,WAAO,KAAK,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,EAAE;AAAA,EAC5E;AAAA,EACA,IAAI,GAAG;AACL,UAAM,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG,CAAC;AACxD,WAAO,IAAI,YAAY,EAAE,OAAO,WAAW,KAAK,KAAK,OAAK,EAAE,WAAW,CAAC,CAAC,CAAC;AAAA,EAC5E;AACF;AAGO,SAAS,gBAAgB,UAAU;AACxC,QAAM,IAAI,kBAAkB,QAAQ;AACpC,QAAM,MAAM,KAAK,GAAG,gBAAgB,CAAC;AACrC,MAAI,IAAI,SAAS;AACf,QAAI,EAAE,QAAQ,WAAW,UAAU;AAAE,aAAO,IAAI,QAAQ;AAAQ,aAAO,IAAI,QAAQ;AAAA,IAAM;AACzF,QAAI,EAAE,QAAQ,WAAW,UAAW,QAAO,IAAI,QAAQ;AACvD,QAAI,EAAE,QAAQ,WAAW,UAAW,QAAO,IAAI,QAAQ;AAAA,EACzD;AACA,MAAI,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,OAAO,EAAE,OAAQ,QAAO,IAAI;AAChE,SAAO;AACT;AAGO,SAAS,eAAe,UAAU;AACvC,SAAO,OAAO,IAAI,KAAK,UAAU,EAAE,GAAG,kBAAkB,GAAG,gBAAgB,QAAQ,EAAE,CAAC,CAAC;AACzF;AAGO,SAAS,eAAe,KAAK;AAClC,MAAI,IAAI,OAAO,GAAG;AAClB,QAAM,IAAI,0BAA0B,KAAK,CAAC;AAC1C,MAAI,EAAG,KAAI,EAAE,CAAC;AACd,QAAM,MAAM,KAAK,MAAM,OAAO,IAAI,CAAC,CAAC;AACpC,SAAO,IAAI;AACX,SAAO,kBAAkB,GAAG;AAC9B;AAGO,SAAS,eAAe,UAAU;AACvC,SAAO,KAAK,UAAU,EAAE,SAAS,2BAA2B,SAAS,kBAAkB,GAAG,gBAAgB,QAAQ,EAAE,GAAG,MAAM,CAAC;AAChI;AAGO,SAAS,iBAAiB,MAAM;AACrC,QAAM,MAAM,OAAO,SAAS,WAAW,KAAK,MAAM,IAAI,IAAI;AAC1D,SAAO,IAAI;AACX,SAAO,kBAAkB,GAAG;AAC9B;AAGO,SAAS,cAAc,MAAM,OAAO;AACzC,QAAM,MAAM,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;AAC3C,aAAWA,MAAK,OAAO,KAAK,SAAS,CAAC,CAAC,GAAG;AACxC,QAAI,MAAMA,EAAC,KAAK,OAAO,MAAMA,EAAC,MAAM,YAAY,CAAC,MAAM,QAAQ,MAAMA,EAAC,CAAC,KAAK,IAAIA,EAAC,KAAK,OAAO,IAAIA,EAAC,MAAM,UAAU;AAChH,aAAO,OAAO,IAAIA,EAAC,GAAG,MAAMA,EAAC,CAAC;AAAA,IAChC,MAAO,KAAIA,EAAC,IAAI,MAAMA,EAAC;AAAA,EACzB;AACA,SAAO,kBAAkB,GAAG;AAC9B;;;AC5QA;;;ACJO,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;;;ACI9B,SAAS,QAAQ,KAAK;AACpB,MAAI,OAAO,SAAS,WAAY,QAAO,WAAW,KAAK,KAAK,GAAG,GAAG,OAAK,EAAE,WAAW,CAAC,CAAC;AACtF,SAAO,IAAI,WAAW,OAAO,KAAK,KAAK,QAAQ,CAAC;AAClD;AAGO,SAAS,MAAM,GAAG;AACvB,MAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AACZ,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;AAC7B,UAAM,OAAO,CAAC;AACd,aAAS,IAAI,GAAG,IAAI,IAAI,GAAG,IAAK,MAAK,KAAK,IAAI,MAAM,IAAI,CAAC,CAAC;AAC1D,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACtD,YAAM,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;AACpB,WAAK,CAAC,EAAE,CAAC,IAAI;AAAG,WAAK,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI;AAAG,WAAK,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI;AAAG,WAAK,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI;AAAA,IAC3F;AACA,QAAI;AAAA,EACN;AACA,SAAO;AACT;AAGO,SAAS,QAAQ,MAAM;AAC5B,QAAM,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE;AACnC,QAAM,QAAQ,CAAC;AACf,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,GAAG,IAAK,OAAM,KAAK,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAClG,QAAM,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC3C,QAAM,MAAM,IAAI,WAAW,IAAI,CAAC;AAChC,QAAM,QAAQ,CAAC,GAAG,MAAM;AAAE,QAAI,EAAE,CAAC,IAAI;AAAA,EAAG,CAAC;AACzC,SAAO;AACT;AAGA,SAAS,UAAU,GAAG;AACpB,QAAM,OAAO,CAAC;AACd,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,MAAM,CAAC;AACb,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,KAAK,IAAI,OAAO,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,IAAI,KAAK;AACpE,UAAI,KAAK,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI;AAAA,IAC5D;AACA,SAAK,KAAK,GAAG;AAAA,EACf;AACA,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AAC/E,IAAM,QAAQ,oBAAI,IAAI;AAOf,SAAS,aAAa,QAAQ,SAAS,MAAM;AAClD,MAAI,WAAW,UAAU;AACvB,UAAM,IAAI,UAAU,OAAO,SAAS,SAAS,MAAM,CAAC;AACpD,WAAO,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,GAAG,EAAE,QAAQ,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,QAAQ,QAAQ,CAAC,EAAE;AAAA,EAC3F;AACA,MAAI,MAAM,IAAI,MAAM,EAAG,QAAO,MAAM,IAAI,MAAM;AAC9C,MAAI;AACJ,QAAM,KAAK,WAAS,EAAE,GAAG,KAAK,CAAC,EAAE,QAAQ,GAAG,KAAK,QAAQ,QAAQ,KAAK,SAAS,KAAK,CAAC,EAAE,QAAQ,QAAQ,QAAQ,IAAI,EAAE;AACrH,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAU,YAAM,GAAG,MAAM,CAAC,CAAC;AAAG;AAAA,IACnC,KAAK;AAAU,YAAM,GAAG,MAAM,CAAC,CAAC;AAAG;AAAA,IACnC,KAAK;AAAU,YAAM,GAAG,MAAM,CAAC,CAAC;AAAG;AAAA,IACnC,KAAK;AAAW,YAAM,GAAG,MAAM,EAAE,CAAC;AAAG;AAAA,IACrC,KAAK;AAAY,YAAM,GAAG,QAAQ;AAAG;AAAA,IACrC,KAAK;AAAY,YAAM,GAAG,UAAU,CAAC,CAAC;AAAG;AAAA,IACzC,KAAK;AAAS,YAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAAG;AAAA,IAC9C,KAAK;AAAa,YAAM,EAAE,GAAG,iBAAiB,GAAG,iBAAiB,QAAQ,KAAK,QAAQ,QAAQ,cAAc,EAAE;AAAG;AAAA,IAClH;AAAS,YAAM,GAAG,MAAM,CAAC,CAAC;AAAA,EAC5B;AACA,QAAM,IAAI,QAAQ,GAAG;AACrB,SAAO;AACT;AAMO,SAAS,YAAY,MAAM;AAChC,QAAM,OAAO,OAAO,IAAI,EAAE,MAAM,SAAS,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAK,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAC1F,IAAI,OAAK,EAAE,QAAQ,UAAU,EAAE,EAAE,MAAM,QAAQ,EAAE,OAAO,OAAO,EAAE,IAAI,MAAM,CAAC;AAC/E,MAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,iBAAiB;AACnD,QAAM,IAAI,KAAK,CAAC,EAAE;AAClB,MAAI,KAAK,KAAK,OAAK,EAAE,WAAW,KAAK,EAAE,KAAK,OAAK,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,EAAG,OAAM,IAAI,MAAM,2CAA2C;AACnI,MAAI,IAAI,MAAM,KAAK,SAAS,GAAI,OAAM,IAAI,MAAM,kCAA+B;AAC/E,SAAO;AACT;;;AC1FA,IAAM,IAAI,CAAC,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC;AAE7D,IAAM,UAAU;AAAA,EACrB,mBAAmB,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EACtE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EACpF,eAAe,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EACtD,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EACjI,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EAC/F,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,EACxJ,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAC1J;AAEO,IAAM,aAAa;AAGnB,SAAS,WAAW,QAAQ;AACjC,MAAI,IAAI;AACR,aAAW,CAAC,IAAI,EAAE,KAAK,OAAQ,KAAI,KAAK,EAAG,KAAI,KAAK,IAAI,GAAG,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;AACnF,SAAO;AACT;AAGO,IAAM,YAAY,CAAC,GAAG,GAAG,SAAU,IAAI,IAAK,QAAQ,IAAI,KAAK;;;ACvBpE;AAQO,SAAS,eAAe,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG;AACzD,QAAM,EAAE,aAAa,KAAO,iBAAiB,IAAI,IAAI;AACrD,QAAM,IAAI,IAAI,QAAQ,IAAI;AAC1B,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,UAAU,CAAC;AACnD,QAAM,MAAM,CAAC;AACb,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK,MAAM;AAChC,UAAM,IAAI,IAAI;AACd,QAAI,IAAI,KAAK,IAAI,CAAC,IAAI,iBAAiB,IAAK;AAC5C,QAAI,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;AAAA,EAC1D;AACA,MAAI,CAAC,IAAI,OAAQ,QAAO,CAAC,WAAW,SAAS,EAAE,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAG1E,MAAI,QAAQ,CAAC,GAAG;AAChB,SAAO,MAAM,SAAS,OAAO;AAC3B,QAAI,KAAK,IAAI,YAAY,IAAI,WAAW;AACxC,UAAM,QAAQ,CAACC,IAAG,MAAM;AACtB,UAAIA,GAAE,SAAS,EAAG;AAClB,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAI,KAAK,KAAK,KAAK;AACnB,mBAAW,KAAKA,IAAG;AAAE,cAAI,EAAE,CAAC,IAAI,GAAI,MAAK,EAAE,CAAC;AAAG,cAAI,EAAE,CAAC,IAAI,GAAI,MAAK,EAAE,CAAC;AAAA,QAAG;AAEzE,cAAM,KAAK,KAAK,MAAM,KAAK,KAAKA,GAAE,MAAM;AACxC,YAAI,IAAI,WAAW;AAAE,sBAAY;AAAG,eAAK;AAAG,qBAAW;AAAA,QAAG;AAAA,MAC5D;AAAA,IACF,CAAC;AACD,QAAI,KAAK,KAAK,aAAa,EAAG;AAC9B,UAAM,IAAI,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,IAAI,EAAE,QAAQ,CAAC;AACpE,UAAM,MAAM,EAAE,UAAU;AACxB,UAAM,OAAO,IAAI,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC;AAAA,EACnD;AACA,MAAI,UAAU,MAAM,IAAI,OAAK,KAAK,CAAC,CAAC;AAGpC,WAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,UAAM,OAAO,QAAQ,IAAI,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AAC3C,eAAW,KAAK,KAAK;AACnB,UAAI,OAAO,GAAG,KAAK;AACnB,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,cAAM,KAAK,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC;AACpF,cAAM,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK;AACnC,YAAI,IAAI,IAAI;AAAE,eAAK;AAAG,iBAAO;AAAA,QAAG;AAAA,MAClC;AACA,YAAM,IAAI,KAAK,IAAI;AAAG,QAAE,CAAC,KAAK,EAAE,CAAC;AAAG,QAAE,CAAC,KAAK,EAAE,CAAC;AAAG,QAAE,CAAC,KAAK,EAAE,CAAC;AAAG,QAAE,CAAC;AAAA,IACrE;AACA,cAAU,QAAQ,IAAI,CAAC,GAAG,MAAO,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAE;AAAA,EAChI;AAEA,QAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,QAAQ,IAAI,OAAK,MAAM,CAAC,CAAC,CAAC,CAAC;AACrD,QAAM,MAAM,OAAK;AAAE,UAAM,IAAI,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE;AAAG,WAAO,UAAU,KAAK,MAAM,UAAW,KAAK,IAAK,OAAO,UAAU,IAAI;AAAA,EAAM;AACnI,SAAO,MAAM,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;AAC7C;AAEA,SAAS,KAAK,MAAM;AAClB,MAAI,IAAI,GAAG,IAAI,GAAG,IAAI;AACtB,aAAW,KAAK,MAAM;AAAE,SAAK,EAAE,CAAC;AAAG,SAAK,EAAE,CAAC;AAAG,SAAK,EAAE,CAAC;AAAA,EAAG;AACzD,SAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,QAAQ,IAAI,KAAK,MAAM;AAC3D;;;AChEA;AAMO,SAAS,SAAS,KAAK,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC7D,QAAM,KAAK,OAAO,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,IAAI;AACnD,QAAM,KAAK,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,OAAO,KAAK,IAAI,IAAI,QAAQ,IAAI,IAAI,MAAM,SAAS,IAAI;AAClG,QAAM,MAAM,IAAI,aAAa,IAAI,IAAI,CAAC;AACtC,QAAM,KAAK,SAAS,YAAY,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;AAC/E,QAAM,KAAK,SAAS,YAAY,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;AAC/E,QAAM,KAAK,IAAI,WAAW,IAAI,EAAE,GAAG,KAAK,IAAI,WAAW,IAAI,EAAE;AAC7D,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,IAAI,IAAK,IAAG,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,GAAG,KAAK,OAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,MAAO,IAAI,IAAI,GAAG,CAAC;AACxJ,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,IAAI,IAAK,IAAG,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,GAAG,KAAK,OAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,MAAO,IAAI,IAAI,GAAG,CAAC;AACxJ,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;AAC7B,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI;AAC7B,iBAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,gBAAMC,MAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK;AACnC,gBAAM,KAAK,EAAEA,KAAI,CAAC,IAAI;AACtB,eAAK,EAAEA,EAAC,IAAI,MAAM;AAAI,eAAK,EAAEA,KAAI,CAAC,IAAI,MAAM;AAAI,eAAK,EAAEA,KAAI,CAAC,IAAI,MAAM;AAAI,eAAK;AAAA,QACjF;AAAA,MACF;AACA,YAAM,KAAK,IAAI,IAAI,KAAK;AACxB,UAAI,IAAI,GAAG;AAAE,YAAI,CAAC,IAAI,IAAI;AAAG,YAAI,IAAI,CAAC,IAAI,IAAI;AAAG,YAAI,IAAI,CAAC,IAAI,IAAI;AAAA,MAAG;AACrE,UAAI,IAAI,CAAC,IAAI,KAAK,KAAK;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,OAAO,KAAK,EAAE,aAAa,GAAG,WAAW,GAAG,aAAa,GAAG,MAAM,GAAG,QAAQ,EAAE,GAAG;AAChG,MAAI,CAAC,cAAc,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,UAAU,EAAG,QAAO;AAC3E,QAAM,IAAI,YAAY,IAAI,KAAK,IAAI,OAAO,YAAY,IAAI;AAC1D,QAAM,KAAK,IAAI;AAEf,QAAM,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK,GAAG,GAAG,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK,GAAG;AAC3E,QAAM,IAAI;AAAA,IACR,QAAQ,QAAQ,KAAK,QAAQ;AAAA,IAAI,QAAQ,QAAQ,KAAK,QAAQ;AAAA,IAAI,QAAQ,QAAQ,KAAK,QAAQ;AAAA,IAC/F,QAAQ,QAAQ,KAAK,QAAQ;AAAA,IAAI,QAAQ,QAAQ,KAAK,OAAQ;AAAA,IAAI,QAAQ,QAAQ,KAAK,QAAQ;AAAA,IAC/F,QAAQ,QAAQ,KAAK,QAAQ;AAAA,IAAI,QAAQ,QAAQ,KAAK,QAAQ;AAAA,IAAI,QAAQ,QAAQ,KAAK,QAAQ;AAAA,EACjG;AACA,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACtC,QAAI,IAAI,IAAI,CAAC,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,IAAI;AAC3E,SAAK,IAAI,OAAO,IAAI;AAAK,SAAK,IAAI,OAAO,IAAI;AAAK,SAAK,IAAI,OAAO,IAAI;AACtE,UAAM,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;AAChD,UAAMC,KAAI,IAAI;AACd,QAAI,KAAK,IAAI,KAAKA;AAAG,QAAI,KAAK,IAAI,KAAKA;AAAG,QAAI,KAAK,IAAI,KAAKA;AAC5D,QAAI,KAAK;AACP,YAAM,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI;AAClH,UAAI;AAAI,UAAI;AAAI,UAAI;AAAA,IACtB;AACA,QAAI,CAAC,IAAI,KAAK,IAAI,QAAQ,CAAC,GAAG,EAAE;AAAG,QAAI,IAAI,CAAC,IAAI,KAAK,IAAI,QAAQ,CAAC,GAAG,EAAE;AAAG,QAAI,IAAI,CAAC,IAAI,KAAK,IAAI,QAAQ,CAAC,GAAG,EAAE;AAAA,EAChH;AACA,SAAO;AACT;AAGO,SAAS,SAAS,KAAK,WAAW;AACvC,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,EAAG,KAAI,CAAC,IAAI,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,IAAI,IAAI,IAAI;AACzF,SAAO;AACT;AAEO,IAAM,UAAU,OAAM,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAG9C,SAAS,aAAa,SAAS,UAAU;AAC9C,QAAM,IAAI,QAAQ;AAClB,QAAM,SAAS,IAAI,aAAa,IAAI,CAAC;AACrC,QAAM,MAAM,IAAI,aAAa,IAAI,CAAC;AAClC,UAAQ,QAAQ,CAAC,GAAG,MAAM;AACxB,QAAI,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC;AACnD,WAAO,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,EACrH,CAAC;AACD,SAAO,EAAE,GAAG,QAAQ,KAAK,SAAS;AACpC;AAEA,IAAM,QAAQ,CAAC,OAAO,OAAO,KAAK;AAG3B,SAAS,QAAQ,IAAI,GAAG,GAAG,GAAG;AACnC,MAAI,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK;AACrC,MAAI,GAAG,aAAa,GAAG;AAAE,SAAK;AAAG,SAAK;AAAG,SAAK;AAAG,SAAK,MAAM,CAAC;AAAG,SAAK,MAAM,CAAC;AAAG,SAAK,MAAM,CAAC;AAAA,EAAG,MACzF,EAAC,IAAI,IAAI,EAAE,IAAI,MAAM,GAAG,GAAG,CAAC;AACjC,MAAI,OAAO,GAAG,KAAK;AACnB,QAAM,IAAI,GAAG;AACb,WAAS,IAAI,GAAG,IAAI,GAAG,GAAG,KAAK;AAC7B,UAAM,KAAK,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC;AACvE,UAAM,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AACrD,QAAI,OAAO,IAAI;AAAE,WAAK;AAAM,aAAO;AAAA,IAAG;AAAA,EACxC;AACA,SAAO;AACT;AAGO,SAAS,gBAAgB,KAAK,GAAG,GAAG,MAAM;AAC/C,QAAM,MAAM,IAAI,kBAAkB,IAAI,IAAI,CAAC;AAC3C,QAAM,KAAK,KAAK,WAAW,aAAa,KAAK,SAAS,KAAK,QAAQ,IAAI;AACvE,QAAM,MAAM,KAAK,SAAS,YAAY,KAAK,MAAM;AACjD,QAAM,MAAM,MAAM,KAAK,SAAS,KAAK,SAAS,OAAO,WAAW;AAChE,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,KAAK,IAAI,IAAI,KAAK;AACxB,UAAI,IAAI,IAAI,CAAC,IAAI,IAAK;AACtB,UAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAC7C,UAAI,IAAI;AACN,YAAI,KAAK;AACP,gBAAM,KAAK,IAAI,OAAQ,IAAI,IAAI,IAAK,IAAI,IAAK,IAAI,IAAI,CAAE,IAAI,OAAO,IAAI,SAAS;AAC/E,cAAI,QAAQ,IAAI,IAAI,GAAG;AAAG,cAAI,QAAQ,IAAI,IAAI,GAAG;AAAG,cAAI,QAAQ,IAAI,IAAI,GAAG;AAAA,QAC7E;AACA,cAAM,IAAI,QAAQ,IAAI,GAAG,GAAG,CAAC;AAC7B,YAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAG,YAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAG,YAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAA,MAC9F,OAAO;AACL,YAAI,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG;AAAG,YAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG;AAAG,YAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG;AAAA,MACjG;AACA,UAAI,IAAI,CAAC,IAAI;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,KAAK,GAAG,GAAG,MAAM;AACjD,QAAM,MAAM,IAAI,kBAAkB,IAAI,IAAI,CAAC;AAC3C,QAAM,KAAK,aAAa,KAAK,SAAS,KAAK,QAAQ;AACnD,QAAM,MAAM,IAAI,aAAa,IAAI,IAAI,CAAC;AACtC,QAAM,WAAW,KAAK,SAAS,OAAO;AACtC,QAAM,SAAS,KAAK;AACpB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI;AAC7B,UAAI,IAAI,IAAI,CAAC,IAAI,IAAK;AACtB,YAAM,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,QAAQ;AAChD,YAAM,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,QAAQ;AACxD,YAAM,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,QAAQ;AACxD,YAAM,IAAI,QAAQ,IAAI,GAAG,GAAG,CAAC;AAC7B,YAAM,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC;AACnF,iBAAW,CAAC,IAAI,IAAI,EAAE,KAAK,QAAQ;AACjC,cAAM,KAAK,IAAI,IAAI,KAAK,IAAI;AAC5B,YAAI,KAAK,KAAK,MAAM,KAAK,MAAM,EAAG;AAClC,cAAM,KAAK,KAAK,IAAI,MAAM;AAC1B,YAAI,CAAC,KAAK,KAAK;AAAI,YAAI,IAAI,CAAC,KAAK,KAAK;AAAI,YAAI,IAAI,CAAC,KAAK,KAAK;AAAA,MAC/D;AACA,UAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAG,UAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAG,UAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAG,UAAI,IAAI,CAAC,IAAI;AAAA,IAC9G;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,MAAM,CAAC,GAAG,MAAO,EAAE,IAAI,CAAC,MAAM,IAAI,KAAM,EAAE,CAAC,KAAK,KAAO,EAAE,IAAI,CAAC,KAAK,IAAK,EAAE,IAAI,CAAC;AACrF,IAAM,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAGrC,SAAS,cAAc,IAAI,GAAG,GAAG;AACtC,QAAM,MAAM,GAAG,MAAM;AACrB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,KAAK,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC;AACzC,YAAM,KAAK,CAAC,GAAG,KAAK,CAAC;AACrB,iBAAW,CAAC,IAAI,EAAE,KAAK,IAAI;AACzB,cAAM,KAAK,IAAI,IAAI,KAAK,IAAI;AAC5B,YAAI,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,EAAG;AAC5C,cAAM,MAAM,KAAK,IAAI,MAAM;AAC3B,WAAG,KAAK,IAAI,KAAK,EAAE,CAAC;AAAG,WAAG,KAAK,EAAE;AAAA,MACnC;AACA,UAAI,GAAG,SAAS,KAAK,GAAG,SAAS,CAAC,EAAG;AACrC,UAAI,OAAO,GAAG,KAAK;AACnB,eAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;AAClC,YAAI,IAAI;AAAG,iBAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,IAAK,KAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAG;AACpE,YAAI,IAAI,IAAI;AAAE,eAAK;AAAG,iBAAO;AAAA,QAAG;AAAA,MAClC;AACA,SAAG,IAAI,IAAI,SAAS,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;AAAA,IAChD;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,eAAe,IAAI,GAAG,GAAG;AACvC,QAAM,MAAM,GAAG,MAAM;AACrB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,KAAK,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC;AACzC,YAAM,KAAK,CAAC,GAAG,KAAK,CAAC;AACrB,eAAS,KAAK,IAAI,MAAM,GAAG,KAAM,UAAS,KAAK,IAAI,MAAM,GAAG,MAAM;AAChE,cAAM,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC,GAAG,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC;AACzF,cAAM,MAAM,KAAK,IAAI,MAAM;AAAG,WAAG,KAAK,IAAI,KAAK,EAAE,CAAC;AAAG,WAAG,KAAK,EAAE;AAAA,MACjE;AACA,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAI,GAAG,CAAC,MAAM,EAAG;AACjB,YAAI,IAAI;AAAG,iBAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAG;AAC5D,YAAI,KAAK,GAAG;AAAE,aAAG,IAAI,IAAI,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AAAG;AAAA,QAAO;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,QAAQ,IAAI,GAAG,GAAG,EAAE,MAAM,OAAO,QAAQ,GAAG;AAC1D,MAAI,SAAS,OAAQ,QAAO;AAC5B,QAAM,MAAM,GAAG,MAAM;AACrB,QAAM,SAAS,CAAC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI;AAC1F,QAAM,SAAS,CAAC,GAAG,MAAM,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI;AAC1D,QAAM,KAAK,UAAU,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI;AAC9F,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,KAAK,OAAO,GAAG,CAAC;AACtB,UAAI,MAAM;AACV,iBAAW,CAAC,IAAI,EAAE,KAAK,IAAI;AACzB,cAAM,KAAK,IAAI,IAAI,KAAK,IAAI;AAC5B,YAAI,CAAC,OAAO,IAAI,EAAE,EAAG;AACrB,YAAI,SAAS,UAAW,CAAC,MAAM,OAAO,IAAI,EAAE,IAAM,MAAM,CAAC,OAAO,IAAI,EAAE,GAAI;AAAE,gBAAM;AAAM;AAAA,QAAO;AAAA,MACjG;AACA,UAAI,KAAK;AAAE,cAAM,KAAK,IAAI,IAAI,KAAK;AAAG,WAAG,CAAC,IAAI,MAAM,CAAC;AAAG,WAAG,IAAI,CAAC,IAAI,MAAM,CAAC;AAAG,WAAG,IAAI,CAAC,IAAI,MAAM,CAAC;AAAG,WAAG,IAAI,CAAC,IAAI;AAAA,MAAK;AAAA,IACvH;AAAA,EACF;AACA,SAAO;AACT;;;ALnNO,SAAS,SAAS,UAAU,KAAK;AACtC,QAAM,IAAI,kBAAkB,QAAQ;AACpC,QAAM,OAAO,SAAS,IAAI,OAAO,IAAI,QAAQ,EAAE,KAAK;AACpD,QAAM,EAAE,OAAO,OAAO,IAAI,YAAY,KAAK,GAAG,KAAK,GAAG,EAAE,IAAI;AAE5D,MAAI,SAAS,EAAE,QAAQ;AACvB,MAAI,EAAE,QAAQ,WAAW,UAAW,UAAS,YAAY,KAAK,GAAG,OAAO,QAAQ,IAAI;AACpF,QAAM,WAAW,EAAE,QAAQ,WAAW,UAAU,OAAO,SAAS;AAChE,QAAM,UAAU,WAAW,OAAO,IAAI,UAAU,IAAI,CAAC;AAErD,MAAI,OAAO,WAAW,WAAW,EAAE,OAAO,MAAM,IAAI;AACpD,MAAI,EAAE,OAAO,YAAY,EAAG,QAAO;AAEnC,QAAM,MAAM,SAAS,YAAY,aAAa,EAAE,OAAO,QAAQ,EAAE,OAAO,MAAM,IAAI;AAClF,QAAM,SAAS,SAAS,cAAc,QAAQ,EAAE,OAAO,MAAM,IAAI;AACjE,QAAM,OAAO,SAAS,WAAW,MAAM,IAAI;AAE3C,SAAO;AAAA,IACL,UAAU;AAAA,IACV,UAAU,IAAI;AAAA,IAAO,WAAW,IAAI;AAAA,IACpC;AAAA;AAAA,IACA;AAAA,IAAO;AAAA,IACP;AAAA,IAAU;AAAA,IACV;AAAA;AAAA,IACA,YAAY,WAAW,OAAO,MAAM,IAAI;AAAA,IACxC,UAAU,EAAE,QAAQ,aAAa,QAAQ,IAAI;AAAA,IAC7C,QAAQ,WAAW,cAAc,OAAO,IAAI;AAAA,IAC5C;AAAA,IAAK;AAAA,IAAQ;AAAA,IACb,OAAO,SAAS,UAAU,OAAO,QAAQ,IAAI,IAAI;AAAA,IACjD,SAAS,EAAE,MAAM,EAAE,QAAQ,MAAM,OAAO,WAAW,EAAE,QAAQ,KAAK,GAAG,SAAS,EAAE,QAAQ,QAAQ;AAAA,EAClG;AACF;AAEA,SAAS,YAAY,KAAK,GAAG,OAAO,QAAQ,MAAM;AAEhD,QAAMC,KAAI,KAAK,IAAI,GAAG,MAAM,KAAK,IAAI,OAAO,MAAM,CAAC;AACnD,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQA,EAAC,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,SAASA,EAAC,CAAC;AACpF,QAAM,OAAO,SAAS,KAAK,GAAG,GAAG,OAAO,IAAI;AAC5C,SAAO,MAAM,EAAE,MAAM;AACrB,QAAM,QAAQ,IAAI,kBAAkB,KAAK,MAAM;AAC/C,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,OAAM,CAAC,IAAI,KAAK,MAAM,KAAK,CAAC,IAAI,GAAG;AACzE,SAAO,eAAe,EAAE,MAAM,OAAO,OAAO,GAAG,QAAQ,EAAE,GAAG,EAAE,QAAQ,OAAO,EAAE,gBAAgB,KAAK,IAAI,MAAM,EAAE,MAAM,SAAS,EAAE,CAAC;AACpI;;;AM/CO,SAAS,OAAO,MAAM,KAAK;AAChC,QAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,EAAE,IAAI;AAC7C,QAAM,MAAM,SAAS,KAAK,GAAG,GAAG,EAAE,KAAK,UAAU,KAAK,IAAI;AAC1D,SAAO,KAAK,EAAE,MAAM;AACpB,WAAS,KAAK,EAAE,MAAM,SAAS;AAC/B,QAAM,KAAK,KAAK,SAAS,cAAc,kBAAkB,KAAK,GAAG,GAAG,IAAI,IAAI,gBAAgB,KAAK,GAAG,GAAG,IAAI;AAC3G,MAAI,EAAE,QAAQ,QAAS,eAAc,IAAI,GAAG,CAAC;AAC7C,MAAI,EAAE,QAAQ,OAAQ,gBAAe,IAAI,GAAG,CAAC;AAC7C,UAAQ,IAAI,GAAG,GAAG,KAAK,OAAO;AAC9B,SAAO;AACT;;;AClBA,wBAA6B;;;ACOtB,IAAM;AAAA;AAAA,EAAmB;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;AA2CzB,IAAM;AAAA;AAAA,EAAiB;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;AAqDvB,IAAM;AAAA;AAAA,EAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BxB,IAAM;AAAA;AAAA,EAAoB;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;AAkC1B,IAAM;AAAA;AAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW1B,IAAM;AAAA;AAAA,EAAmB;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;AA8BzB,IAAM;AAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBzB,IAAM;AAAA;AAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADrOjC,IAAM,WAAW,CAAC,GAAG,MAAM;AAAE,QAAM,IAAI,SAAS,cAAc,QAAQ;AAAG,IAAE,QAAQ;AAAG,IAAE,SAAS;AAAG,SAAO;AAAG;AAM9G,eAAsB,mBAAmB;AACvC,MAAI,OAAO,aAAa,YAAa,OAAM,IAAI,MAAM,QAAQ;AAC7D,QAAM,QAAQ,SAAS,GAAG,CAAC,EAAE,WAAW,QAAQ;AAChD,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,0BAA0B;AACtD,MAAI,CAAC,MAAM,aAAa,wBAAwB,EAAG,OAAM,IAAI,MAAM,wCAAwC;AAC3G,QAAM,MAAM,MAAM,aAAa,2BAA2B;AAC1D,QAAM,WAAW,OAAO,MAAM,MAAM,aAAa,IAAI,uBAAuB,IAAI,MAAM,aAAa,MAAM,QAAQ,CAAC;AAClH,QAAM,aAAa,oBAAoB,GAAG,YAAY;AAEtD,QAAM,SAAS,SAAS,GAAG,CAAC;AAC5B,QAAM,SAAS,SAAS,GAAG,CAAC;AAC5B,QAAM,UAAU,SAAS,KAAK,CAAC;AAC/B,QAAM,SAAS,SAAS,GAAG,CAAC;AAC5B,QAAMC,WAAU,SAAO,EAAE,SAAS,IAAI,QAAQ,WAAW,MAAM,QAAQ;AAEvE,QAAM,SAAK,gCAAa;AAAA,IACtB;AAAA,IACA,OAAO;AAAA,IACP,MAAM,CAAC,GAAG,CAAC;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB,oBAAoB;AAAA,IACpB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU,EAAE,WAAWA,SAAQ,OAAO,GAAG,UAAUA,SAAQ,MAAM,EAAE;AAAA,IACnE,UAAU;AAAA,MACR,SAAS;AAAA,MAAG,YAAY;AAAA,MAAG,YAAY;AAAA,MAAG,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MAAG,OAAO;AAAA,MAAG,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MAAG,YAAY;AAAA,MAC9G,QAAQ;AAAA,MAAG,UAAU;AAAA,MAAG,UAAU;AAAA,MAClC,QAAQ;AAAA,MAAG,YAAY;AAAA,MAAG,MAAM;AAAA,MAAG,UAAU,IAAI,aAAa,aAAa,CAAC;AAAA,MAC5E,WAAW;AAAA,MAAG,WAAW;AAAA,MAAG,gBAAgB,CAAC,GAAG,GAAG,CAAC;AAAA,IACtD;AAAA,IACA,QAAQ;AAAA,MACN,EAAE,MAAM,QAAQ,QAAQ,MAAM,OAAO,QAAQ,QAAQ,WAAW,UAAU,CAAC,EAAE,GAAGA,SAAQ,MAAM,GAAG,SAAS,MAAM,CAAC,EAAE;AAAA,MACnH,EAAE,MAAM,SAAS,QAAQ,OAAO,QAAQ,WAAW,UAAU,CAAC,MAAM,EAAE;AAAA,MACtE,EAAE,MAAM,WAAW,QAAQ,SAAS,OAAO,QAAQ,QAAQ,WAAW,UAAU,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,SAAS,EAAE;AAAA,MACnI,EAAE,MAAM,WAAW,QAAQ,SAAS,QAAQ,WAAW,UAAU,CAAC,SAAS,SAAS,EAAE;AAAA,MACtF,EAAE,MAAM,UAAU,QAAQ,QAAQ,QAAQ,WAAW,UAAU,CAAC,SAAS,EAAE;AAAA,MAC3E,EAAE,MAAM,UAAU,QAAQ,QAAQ,QAAQ,WAAW,UAAU,CAAC,QAAQ,EAAE;AAAA,MAC1E,EAAE,MAAM,OAAO,QAAQ,SAAS,QAAQ,MAAM,UAAU,CAAC,QAAQ,EAAE;AAAA,IACrE;AAAA,EACF,CAAC;AAED,MAAI,UAAU;AACd,KAAG,GAAG,SAAS,OAAK;AAAE,cAAU;AAAA,EAAG,CAAC;AACpC,QAAM,GAAG;AACT,MAAI,WAAW,GAAG,OAAO;AAAE,OAAG,QAAQ;AAAG,UAAM,WAAW,GAAG;AAAA,EAAO;AAGpE,QAAM,eAAe,CAAC,MAAM,WAAW;AAAE,eAAWC,MAAK,OAAQ,IAAG,IAAIA,IAAG,OAAOA,EAAC,GAAG,IAAI;AAAA,EAAG;AAE7F,MAAI,aAAa;AACjB,MAAI,aAAa,IAAI,YAAY;AAEjC,iBAAe,UAAU,OAAO;AAC9B,QAAI,MAAM,WAAW,cAAc,CAAC,MAAM,MAAO;AACjD,WAAO,QAAQ,MAAM;AAAO,WAAO,SAAS,MAAM;AAClD,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC/C,QAAI,UAAU,MAAM,QAAQ,GAAG,CAAC;AAChC,UAAM,GAAG,WAAW,GAAG,EAAE,GAAGD,SAAQ,MAAM,GAAG,SAAS,MAAM,GAAG,MAAM;AACrE,iBAAa,MAAM;AAAA,EACrB;AAEA,WAAS,WAAW,MAAM;AACxB,UAAME,OAAM,KAAK,QAAQ,IAAI,OAAK,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG;AACvD,QAAIA,SAAQ,WAAY;AACxB,iBAAaA;AACb,UAAM,MAAM,QAAQ,WAAW,IAAI;AACnC,UAAM,MAAM,IAAI,gBAAgB,KAAK,CAAC;AACtC,SAAK,QAAQ,QAAQ,CAAC,GAAG,MAAM,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;AAC3E,QAAI,aAAa,KAAK,GAAG,CAAC;AAAA,EAC5B;AAEA,WAAS,UAAU,KAAK;AACtB,UAAMA,OAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC,KAAK;AAC9E,QAAIA,SAAQ,UAAW;AACvB,gBAAYA;AACZ,UAAM,IAAI,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,QAAQ,CAAC,CAAC,EAAE;AAC3C,WAAO,QAAQ,EAAE;AAAG,WAAO,SAAS,EAAE;AACtC,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,UAAM,MAAM,IAAI,gBAAgB,EAAE,GAAG,EAAE,CAAC;AACxC,aAAS,IAAI,GAAG,IAAI,EAAE,OAAO,QAAQ,IAAK,KAAI,KAAK,IAAI,CAAC,EAAE,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AACtF,QAAI,aAAa,KAAK,GAAG,CAAC;AAAA,EAC5B;AAOA,iBAAe,IAAI,MAAM,OAAO;AAC9B,UAAM,IAAI,KAAK;AACf,UAAM,UAAU,KAAK;AACrB,QAAI,KAAK,SAAU,YAAW,IAAI;AAClC,cAAU,KAAK,GAAG;AAClB,QAAI,GAAG,UAAU,KAAK,SAAS,GAAG,WAAW,KAAK,OAAQ,IAAG,QAAQ,KAAK,OAAO,KAAK,MAAM;AAE5F,UAAM,YAAY,KAAK,SAAS;AAChC,UAAM,SAAS,IAAI,MAAM,UAAU,EAAE,KAAK,IAAI,EAAE,IAAI,CAAC,GAAG,MAAO,KAAK,UAAU,KAAK,OAAO,CAAC,KAAM,CAAC,GAAG,GAAG,CAAC,CAAC;AAC1G,OAAG,IAAI;AAAA,MACL,SAAS,KAAK,QAAQ,UAAU;AAAA,MAChC,YAAY,KAAK;AAAA,MACjB,YAAY,EAAE,KAAK,aAAa,YAAY,IAAI;AAAA,MAChD,UAAU,CAAC,EAAE,OAAO,YAAY,EAAE,OAAO,UAAU,EAAE,OAAO,YAAY,EAAE,OAAO,KAAK;AAAA,MACtF,OAAO,EAAE,OAAO;AAAA,MAChB,QAAQ,CAAC,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,KAAK,CAAC;AAAA,MAC3D,YAAY,EAAE,MAAM;AAAA,MACpB,QAAQ,CAAC,KAAK,WAAW,IAAI,KAAK,SAAS,YAAY,IAAI;AAAA,MAC3D,UAAU,KAAK,MAAM,KAAK,IAAI,SAAS;AAAA,MACvC,UAAU,KAAK,MAAM,KAAK,SAAS,EAAE,OAAO,WAAW;AAAA,MACvD,QAAQ,KAAK;AAAA,MACb,YAAY,EAAE,OAAO;AAAA,MACrB,MAAM,KAAK,SAAS,KAAK,OAAO,SAAS;AAAA,MACzC,UAAU,IAAI,aAAa,OAAO,KAAK,CAAC;AAAA,MACxC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,EAAE,KAAK,QAAQ,IAAI;AAAA,MAC5D,WAAW,KAAK,QAAQ,UAAU,IAAI;AAAA,MACtC,gBAAgB,KAAK,QAAQ,MAAM,IAAI,OAAK,IAAI,GAAG;AAAA,IACrD,CAAC;AACD,iBAAa,WAAW,EAAE,MAAM,YAAY,IAAI,EAAE,CAAC;AACnD,iBAAa,WAAW,EAAE,MAAM,YAAY,IAAI,EAAE,CAAC;AACnD,iBAAa,UAAU,EAAE,MAAM,EAAE,QAAQ,UAAU,IAAI,EAAE,CAAC;AAC1D,iBAAa,UAAU,EAAE,MAAM,EAAE,QAAQ,SAAS,IAAI,EAAE,CAAC;AACzD,OAAG,QAAQ,SAAS,EAAE,IAAI,aAAa,YAAY,KAAK,QAAQ;AAEhE,UAAM,EAAE,KAAK,IAAI,GAAG,WAAW;AAE/B,UAAM,IAAI,KAAK,OAAO,IAAI,KAAK,QAAQ,MAAM,IAAI,kBAAkB,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI;AACzF,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,GAAG,GAAG,IAAI,GAAG;AAC5F,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA;AAAA,IAEA,UAAU,uDAAuD,KAAK,QAAQ;AAAA,IAC9E;AAAA,IACA,QAAQ;AAAA,IACR,UAAU;AAAE,SAAG,QAAQ;AAAA,IAAG;AAAA,EAC5B;AACF;;;AE1JO,IAAM,aAAa;AAC1B,IAAM,SAAS,OAAO,aAAa;AAEnC,IAAM,SAAS,OAAK,KAAK,OAAO,MAAM,YAAY,UAAU,KAAK,WAAW,KAAK,YAAY,KAAK,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,QAAQ,EAAE,SAAS;AAGnJ,eAAsB,UAAU,KAAK;AACnC,MAAI,OAAO,SAAS,eAAe,eAAe,MAAM;AACtD,QAAI,OAAO,sBAAsB,YAAY;AAC3C,UAAI;AAAE,eAAO,MAAM,kBAAkB,GAAG;AAAA,MAAG,QAAQ;AAAA,MAAgC;AAAA,IACrF;AACA,UAAM,IAAI,gBAAgB,GAAG;AAAA,EAC/B;AACA,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,8EAA8E;AAC3G,QAAM,MAAM,IAAI,MAAM;AACtB,MAAI,cAAc;AAClB,MAAI,WAAW;AACf,MAAI,MAAM;AACV,QAAM,IAAI,OAAO;AACjB,SAAO;AACT;AAGO,SAAS,OAAO,IAAI;AACzB,SAAO;AAAA,IACL,OAAO,GAAG,gBAAgB,GAAG,cAAc,GAAG,gBAAgB,GAAG,cAAc,GAAG,SAAS;AAAA,IAC3F,QAAQ,GAAG,iBAAiB,GAAG,eAAe,GAAG,iBAAiB,GAAG,eAAe,GAAG,UAAU;AAAA,EACnG;AACF;AAEA,SAAS,OAAO,KAAK;AAEnB,MAAI,OAAO,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,UAAU;AAClD,QAAI,IAAI,UAAU,OAAO,IAAI,WAAW,YAAY,gBAAgB,IAAI,OAAQ,QAAO,IAAI;AAC3F,QAAI,IAAI,OAAO,OAAO,IAAI,QAAQ,YAAY,gBAAgB,IAAI,IAAK,QAAO,IAAI;AAAA,EACpF;AACA,SAAO;AACT;AAMA,eAAsB,QAAQ,QAAQ,OAAO,CAAC,GAAG;AAC/C,QAAM,UAAU,KAAK,WAAW;AAChC,MAAI,MAAM,OAAO,MAAM;AACvB,MAAI,OAAO,QAAQ,YAAa,OAAO,SAAS,eAAe,eAAe,KAAO,OAAM,MAAM,UAAU,GAAG;AAC9G,MAAI,OAAO,OAAO,IAAI,aAAa,aAAa,CAAC,IAAI,YAAY,IAAI,OAAQ,OAAM,IAAI,OAAO;AAE9F,MAAI,OAAO,GAAG,GAAG;AACf,UAAM,QAAQ,EAAE,OAAO,IAAI,OAAO,QAAQ,IAAI,QAAQ,MAAM,IAAI,MAAM,QAAQ,KAAK;AACnF,QAAI,QAAQ;AACV,aAAO,eAAe,OAAO,UAAU;AAAA,QACrC,cAAc;AAAA,QACd,MAAM;AACJ,gBAAM,IAAI,SAAS,cAAc,QAAQ;AAAG,YAAE,QAAQ,IAAI;AAAO,YAAE,SAAS,IAAI;AAChF,gBAAM,MAAM,IAAI,UAAU,IAAI,kBAAkB,IAAI,IAAI,GAAG,IAAI,OAAO,IAAI,MAAM;AAChF,YAAE,WAAW,IAAI,EAAE,aAAa,KAAK,GAAG,CAAC;AACzC,iBAAO,eAAe,OAAO,UAAU,EAAE,OAAO,EAAE,CAAC;AACnD,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,gFAAgF;AAE7G,MAAI,EAAE,OAAO,OAAO,IAAI,OAAO,GAAG;AAClC,MAAI,CAAC,SAAS,CAAC,OAAQ,OAAM,IAAI,MAAM,wDAAwD;AAC/F,QAAMC,KAAI,KAAK,IAAI,GAAG,UAAU,KAAK,IAAI,OAAO,MAAM,CAAC;AACvD,UAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQA,EAAC,CAAC;AAAG,WAAS,KAAK,IAAI,GAAG,KAAK,MAAM,SAASA,EAAC,CAAC;AAEvF,QAAM,SAAS,KAAK,UAAU,SAAS,cAAc,QAAQ;AAC7D,SAAO,QAAQ;AAAO,SAAO,SAAS;AACtC,QAAM,MAAM,OAAO,WAAW,MAAM,EAAE,oBAAoB,KAAK,CAAC;AAChE,MAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AACjC,MAAI,wBAAwBA,KAAI;AAChC,MAAI,wBAAwB;AAC5B,MAAI,UAAU,KAAK,GAAG,GAAG,OAAO,MAAM;AACtC,MAAI,SAAS;AACb,SAAO;AAAA,IACL;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAQ,OAAO;AAAA,IAC9B,IAAI,OAAO;AAAE,aAAQ,oBAAW,IAAI,aAAa,GAAG,GAAG,OAAO,MAAM,EAAE;AAAA,IAAO;AAAA,EAC/E;AACF;;;ACtFA;AAQO,SAAS,QAAQ,KAAKC,KAAI,GAAG,OAAO,CAAC,GAAG;AAC7C,EAAAA,KAAI,KAAK,IAAI,GAAG,KAAK,MAAMA,EAAC,CAAC;AAC7B,QAAM,IAAI,IAAI,QAAQA,IAAG,IAAI,IAAI,SAASA;AAC1C,QAAM,MAAM,IAAI,kBAAkB,IAAI,IAAI,CAAC;AAC3C,QAAM,MAAM,IAAI,MAAM,KAAK,IAAI;AAC/B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,KAAM,IAAIA,KAAK;AACrB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,MAAM,KAAK,MAAO,IAAIA,KAAK,MAAM,GAAG,KAAK,IAAI,IAAI,KAAK;AAC5D,UAAI,CAAC,IAAI,IAAI,EAAE;AAAG,UAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;AAAG,UAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;AAAG,UAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;AAAA,IAC/F;AAAA,EACF;AACA,MAAI,KAAK,QAAQA,MAAK,GAAG;AACvB,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI,WAAW,KAAK,aAAa,SAAS;AACxD,UAAM,IAAI,KAAK,aAAa;AAC5B,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACtD,UAAI,IAAIA,MAAK,IAAIA,GAAG;AACpB,YAAM,KAAK,IAAI,IAAI,KAAK;AACxB,YAAM,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI;AAChD,UAAI,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM;AAC3C,UAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM;AACnD,UAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM;AACnD,UAAI,IAAI,CAAC,IAAI,KAAK;AAAA,IACpB;AAAA,EACF;AACA,SAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,IAAI;AAC1C;AAMO,SAAS,cAAc,KAAK,OAAO,QAAQ;AAChD,UAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;AAAG,WAAS,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC;AAC/E,QAAM,MAAM,IAAI,kBAAkB,QAAQ,SAAS,CAAC;AACpD,QAAM,KAAK,IAAI,WAAW,KAAK;AAC/B,WAAS,IAAI,GAAG,IAAI,OAAO,IAAK,IAAG,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,GAAG,KAAK,OAAO,IAAI,OAAO,IAAI,QAAQ,KAAK,CAAC;AACzG,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,UAAM,KAAK,KAAK,IAAI,IAAI,SAAS,GAAG,KAAK,OAAO,IAAI,OAAO,IAAI,SAAS,MAAM,CAAC;AAC/E,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,MAAM,KAAK,IAAI,QAAQ,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,QAAQ,KAAK;AAC/D,UAAI,CAAC,IAAI,IAAI,KAAK,EAAE;AAAG,UAAI,IAAI,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC;AAAG,UAAI,IAAI,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC;AAAG,UAAI,IAAI,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,IACnH;AAAA,EACF;AACA,SAAO,EAAE,OAAO,QAAQ,MAAM,IAAI;AACpC;AAGO,SAAS,aAAa,KAAK,QAAQ,UAAU;AAClD,QAAM,OAAO,oBAAI,IAAI;AACrB,QAAM,IAAI,IAAI;AACd,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,GAAG;AACpC,QAAI,EAAE,IAAI,CAAC,MAAM,EAAG;AACpB,SAAK,IAAK,EAAE,CAAC,KAAK,KAAO,EAAE,IAAI,CAAC,KAAK,IAAK,EAAE,IAAI,CAAC,CAAC;AAClD,QAAI,KAAK,OAAO,MAAO;AAAA,EACzB;AACA,SAAO,CAAC,GAAG,IAAI,EAAE,IAAI,OAAK,MAAM,CAAC,KAAK,IAAK,KAAK,IAAK,KAAK,IAAI,GAAG,CAAC,CAAC;AACrE;AAGO,SAAS,gBAAgB,KAAK;AACnC,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK,QAAQ,KAAK,EAAG,KAAI,IAAI,KAAK,CAAC,IAAI,IAAK,QAAO;AAC3E,SAAO;AACT;AAOO,SAAS,WAAW,KAAK,YAAY,GAAG;AAC7C,QAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,EAAE,IAAI;AACzC,QAAM,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,aAAa,KAAK,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,aAAa,KAAK,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,aAAa,KAAK,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK;AAE1L,QAAM,MAAM,CAAC,GAAG,MAAO,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI;AAC3C,MAAI,IAAI;AACR,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC,GAAG,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC;AACrF,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK,OAAO;AACjC,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC,EAAG;AAAA,WAC3C;AAAE,YAAI,IAAI,GAAG,GAAG;AAAG,cAAM;AAAG,YAAI,MAAM,EAAG,QAAO;AAAA,MAAG;AAAA,IAC1D;AAAA,EACF;AACA,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK,OAAO;AACjC,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI,MAAM,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,EAAG;AAAA,WAC7C;AAAE,YAAI,IAAI,GAAG,GAAG;AAAG,cAAM;AAAG,YAAI,MAAM,EAAG,QAAO;AAAA,MAAG;AAAA,IAC1D;AAAA,EACF;AACA,SAAO,KAAK;AACd;;;ACjGO,SAAS,SAAS,KAAK,QAAQ,GAAG,OAAO,CAAC,GAAG;AAClD,QAAM,KAAK,QAAQ,KAAK,KAAK,OAAO,QAAQ,KAAK,OAAO,IAAI,IAAI;AAChE,QAAM,IAAI,KAAK,UAAU,SAAS,cAAc,QAAQ;AACxD,IAAE,QAAQ,GAAG;AAAO,IAAE,SAAS,GAAG;AAClC,IAAE,WAAW,IAAI,EAAE,aAAa,IAAI,UAAU,IAAI,kBAAkB,GAAG,IAAI,GAAG,GAAG,OAAO,GAAG,MAAM,GAAG,GAAG,CAAC;AACxG,SAAO;AACT;AAGO,SAAS,aAAa,MAAM,UAAU,OAAO,4BAA4B;AAC9E,QAAM,OAAO,gBAAgB,OAAO,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC;AACpE,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,IAAE,OAAO;AAAK,IAAE,WAAW;AAAU,IAAE,MAAM;AAC7C,WAAS,KAAK,YAAY,CAAC;AAAG,IAAE,MAAM;AAAG,IAAE,OAAO;AAClD,aAAW,MAAM,IAAI,gBAAgB,GAAG,GAAG,GAAK;AAClD;;;ACpBA,IAAI,QAAQ;AACL,SAAS,MAAM,OAAO,MAAM,GAAG;AACpC,MAAI,CAAC,OAAO;AACV,YAAQ,IAAI,YAAY,GAAG;AAC3B,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAI,IAAI;AACR,eAASC,KAAI,GAAGA,KAAI,GAAGA,KAAK,KAAI,IAAI,IAAI,aAAc,MAAM,IAAK,MAAM;AACvE,YAAM,CAAC,IAAI,MAAM;AAAA,IACnB;AAAA,EACF;AACA,QAAM,CAAC,QAAQ;AACf,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,IAAK,OAAM,OAAO,MAAM,MAAM,CAAC,KAAK,GAAG,IAAK,QAAQ;AACtF,SAAO,CAAC,QAAQ;AAClB;;;ACRA,IAAM,MAAM,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAE5C,eAAe,QAAQ,OAAO;AAC5B,MAAI,OAAO,sBAAsB,YAAY;AAC3C,UAAM,KAAK,IAAI,kBAAkB,SAAS;AAC1C,UAAM,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE;AACxD,WAAO,IAAI,WAAW,MAAM,IAAI,SAAS,MAAM,EAAE,YAAY,CAAC;AAAA,EAChE;AACA,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,WAAW;AAChD,SAAO,IAAI,WAAW,YAAY,KAAK,CAAC;AAC1C;AAEA,SAAS,MAAM,MAAM,MAAM;AACzB,QAAM,MAAM,IAAI,WAAW,KAAK,KAAK,MAAM;AAC3C,QAAM,KAAK,IAAI,SAAS,IAAI,MAAM;AAClC,KAAG,UAAU,GAAG,KAAK,MAAM;AAC3B,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;AAC1D,MAAI,IAAI,MAAM,CAAC;AACf,KAAG,UAAU,IAAI,KAAK,QAAQ,MAAM,IAAI,SAAS,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC;AACrE,SAAO;AACT;AAGO,SAAS,WAAW,KAAK;AAC9B,QAAM,IAAI,IAAI,MAAM,IAAI,IAAI,QAAQ,IAAI;AACxC,QAAM,MAAM,oBAAI,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,IAAI,WAAW,CAAC;AAC1D,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,IAAI,IAAI;AACd,UAAMC,KAAI,EAAE,IAAI,CAAC,MAAM,IAAI,MAAO,EAAE,CAAC,KAAK,KAAO,EAAE,IAAI,CAAC,KAAK,KAAO,EAAE,IAAI,CAAC,KAAK,IAAK,EAAE,IAAI,CAAC,OAAO;AACnG,QAAI,IAAI,IAAI,IAAIA,EAAC;AACjB,QAAI,MAAM,QAAW;AACnB,UAAI,OAAO,WAAW,IAAK,QAAO;AAClC,UAAI,OAAO;AAAQ,UAAI,IAAIA,IAAG,CAAC;AAC/B,aAAO,KAAKA,OAAM,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,IAC5E;AACA,QAAI,CAAC,IAAI;AAAA,EACX;AACA,SAAO,EAAE,QAAQ,SAAS,IAAI;AAChC;AAQA,eAAsB,UAAU,KAAK,OAAO,CAAC,GAAG;AAC9C,MAAI,KAAK,SAAS,KAAK,OAAQ,OAAM,cAAc,KAAK,KAAK,OAAO,KAAK,MAAM;AAAA,WACrE,KAAK,SAAS,KAAK,QAAQ,KAAM,KAAK,KAAM,OAAM,QAAQ,KAAK,KAAK,SAAS,GAAG,IAAI;AAC9F,QAAM,EAAE,OAAO,GAAG,QAAQ,EAAE,IAAI;AAChC,QAAM,KAAK,KAAK,YAAY,QAAQ,OAAO,WAAW,GAAG;AACzD,QAAM,OAAO,IAAI,WAAW,EAAE;AAC9B,QAAM,KAAK,IAAI,SAAS,KAAK,MAAM;AACnC,KAAG,UAAU,GAAG,CAAC;AAAG,KAAG,UAAU,GAAG,CAAC;AACrC,QAAM,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC;AAClC,MAAI;AACJ,MAAI,IAAI;AACN,UAAM,OAAO,GAAG,OAAO,UAAU,IAAI,IAAI,GAAG,OAAO,UAAU,IAAI,IAAI,GAAG,OAAO,UAAU,KAAK,IAAI;AAClG,SAAK,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;AAC9B,UAAM,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC;AACrC,UAAM,IAAI,YAAY,SAAS,KAAK,CAAC;AACrC,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,MAAM,KAAK,SAAS,KAAK;AAC/B,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,IAAI,GAAG,QAAQ,IAAI,IAAI,CAAC;AAC9B,cAAM,MAAM,IAAI;AAChB,YAAI,OAAO,OAAO,EAAE,KAAK,KAAM,IAAI,QAAQ,MAAM;AAAA,MACnD;AAAA,IACF;AACA,UAAM,KAAK,MAAM,QAAQ,IAAI,CAAC;AAC9B,UAAM,KAAK,MAAM,QAAQ,WAAW,KAAK,GAAG,OAAO,QAAQ,OAAK,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,QAAI,GAAG,OAAO,KAAK,OAAK,EAAE,CAAC,IAAI,GAAG,GAAG;AACnC,UAAI,OAAO,GAAG,OAAO;AAAQ,aAAO,OAAO,KAAK,GAAG,OAAO,OAAO,CAAC,EAAE,CAAC,MAAM,IAAK;AAChF,YAAM,KAAK,MAAM,QAAQ,WAAW,KAAK,GAAG,OAAO,MAAM,GAAG,IAAI,EAAE,IAAI,OAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAAA,IACpF;AAAA,EACF,OAAO;AACL,SAAK,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;AAC3B,UAAM,IAAI,YAAY,IAAI,IAAI,KAAK,CAAC;AACpC,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,IAAI,IAAI,KAAK,WAAW,IAAI,KAAK,SAAS,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,UAAU,MAAM,KAAK,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC;AAC7L,UAAM,KAAK,MAAM,QAAQ,IAAI,CAAC;AAAA,EAChC;AACA,QAAM,KAAK,MAAM,QAAQ,MAAM,QAAQ,GAAG,CAAC,CAAC;AAC5C,QAAM,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC;AAC3C,QAAM,QAAQ,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;AACpD,QAAM,MAAM,IAAI,WAAW,KAAK;AAChC,MAAI,IAAI;AAAG,aAAW,KAAK,OAAO;AAAE,QAAI,IAAI,GAAG,CAAC;AAAG,SAAK,EAAE;AAAA,EAAQ;AAClE,SAAO;AACT;;;AClFA,IAAM,UAAU,OAAK,OAAO,qBAAqB,eAAe,aAAa;AAC7E,IAAM,eAAe,OAAK,OAAO,eAAe,eAAe,aAAa;AAO5E,eAAsB,gBAAgB,UAAU,CAAC,GAAG;AAClD,QAAM,OAAO,QAAQ,WAAW;AAChC,MAAI,MAAM,MAAM,WAAW;AAC3B,MAAI,SAAS,SAAS,OAAO,aAAa,aAAa;AACrD,QAAI;AAAE,YAAM,MAAM,iBAAiB;AAAA,IAAG,SAAS,GAAG;AAChD,iBAAW;AACX,UAAI,SAAS,QAAS,OAAM;AAAA,IAC9B;AAAA,EACF;AACA,QAAM,UAAU,OAAO,aAAa,cAAc,SAAS,cAAc,QAAQ,IAAI;AACrF,MAAI,OAAO,EAAE,QAAQ,MAAM,OAAO,KAAK;AACvC,MAAI,QAAQ,QAAQ,QAAQ;AAE5B,iBAAe,SAAS,QAAQ;AAC9B,QAAI,WAAW,KAAK,UAAU,KAAK,SAAS,CAAC,QAAQ,MAAM,KAAK,CAAC,aAAa,MAAM,GAAG;AACrF,WAAK,MAAM,QAAQ;AACnB,aAAO,KAAK;AAAA,IACd;AACA,UAAM,QAAQ,MAAM,QAAQ,QAAQ,EAAE,SAAS,QAAQ,eAAe,QAAQ,QAAQ,CAAC;AACvF,WAAO,EAAE,QAAQ,MAAM;AACvB,WAAO;AAAA,EACT;AAEA,iBAAe,WAAW,QAAQ,UAAU;AAC1C,UAAM,KAAK,OAAO,gBAAgB,cAAc,YAAY,IAAI,IAAI,KAAK,IAAI;AAC7E,UAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,UAAM,OAAO,SAAS,UAAU,KAAK;AACrC,QAAI,MAAM,UAAU;AACpB,UAAM,iBAAiB,KAAK,SAAS,gBAAgB,QAAQ,cAAc,SAAU,QAAQ,cAAc,SAAS,OAAO,IAAI;AAC/H,QAAI,OAAO,MAAM,UAAU,CAAC,gBAAgB;AAC1C,aAAO,MAAM,IAAI,IAAI,MAAM,KAAK;AAChC,gBAAU;AAAA,IACZ,OAAO;AACL,aAAO,OAAO,MAAM,KAAK;AAAA,IAC3B;AACA,UAAM,MAAM,OAAO,gBAAgB,cAAc,YAAY,IAAI,IAAI,KAAK,IAAI,KAAK;AACnF,WAAO,WAAW,MAAM,MAAM,SAAS,EAAE;AAAA,EAC3C;AAEA,SAAO;AAAA;AAAA,IAEL,IAAI,UAAU;AAAE,aAAO,MAAM,UAAU;AAAA,IAAO;AAAA;AAAA,IAE9C,IAAI,WAAW;AAAE,aAAO,MAAM,IAAI,WAAW;AAAA,IAAI;AAAA;AAAA,IAEjD,IAAI,iBAAiB;AAAE,aAAO,WAAW,OAAO,SAAS,WAAW,QAAQ,IAAI;AAAA,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,IAKpF,QAAQ,QAAQ,WAAW,CAAC,GAAG;AAC7B,YAAM,MAAM,MAAM,KAAK,MAAM,WAAW,QAAQ,QAAQ,CAAC;AACzD,cAAQ,IAAI,MAAM,MAAM;AAAA,MAAE,CAAC;AAC3B,aAAO;AAAA,IACT;AAAA;AAAA,IAEA,aAAa;AAAE,aAAO,EAAE,QAAQ,MAAM,OAAO,KAAK;AAAA,IAAG;AAAA,IACrD,UAAU;AAAE,UAAI,IAAK,KAAI,QAAQ;AAAG,YAAM;AAAA,IAAM;AAAA;AAAA,IAEhD,IAAI,SAAS;AAAE,aAAO,MAAM,IAAI,SAAS;AAAA,IAAM;AAAA,EACjD;AACF;AAYO,SAAS,WAAW,MAAM,MAAM,UAAU,OAAO,KAAK,GAAG;AAC9D,QAAM,SAAS;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IACb;AAAA,IACA,SAAS,KAAK,aAAa,KAAK,WAAW,MAAM,IAAI;AAAA,IACrD,UAAU,KAAK;AAAA,IACf,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA;AAAA,IAEZ,MAAM,EAAE,GAAG,KAAK,KAAK,IAAI,KAAK,UAAU,GAAG,KAAK,KAAK,IAAI,KAAK,WAAW,GAAG,KAAK,KAAK,IAAI,KAAK,UAAU,GAAG,KAAK,KAAK,IAAI,KAAK,UAAU;AAAA,IACzI;AAAA,IACA;AAAA;AAAA,IAEA,aAAa;AAAE,aAAO,aAAa,IAAI;AAAA,IAAG;AAAA,IAC1C,cAAc;AAAE,aAAO,IAAI,UAAU,IAAI,kBAAkB,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,MAAM;AAAA,IAAG;AAAA;AAAA,IAEjG,SAAS,QAAQ,GAAG,OAAO,CAAC,GAAG;AAAE,aAAO,SAAS,MAAM,OAAO,IAAI;AAAA,IAAG;AAAA;AAAA,IAErE,MAAM,OAAO,CAAC,GAAG;AAAE,aAAO,UAAU,MAAM,IAAI;AAAA,IAAG;AAAA,IACjD,MAAM,OAAO,OAAO,CAAC,GAAG;AAAE,aAAO,IAAI,KAAK,CAAC,MAAM,UAAU,MAAM,IAAI,CAAC,GAAG,EAAE,MAAM,YAAY,CAAC;AAAA,IAAG;AAAA,EACnG;AACA,SAAO;AACT;AAEA,IAAI,SAAS;AAEb,eAAsB,SAAS,QAAQ,UAAU;AAE/C,MAAI,aAAa,UAAa,UAAU,OAAO,WAAW,YAAY,WAAW,UAAU,WAAW,QAAQ;AAC5G,WAAO,gBAAgB,MAAM;AAAA,EAC/B;AACA,sBAAW,gBAAgB;AAC3B,UAAQ,MAAM,QAAQ,QAAQ,QAAQ,QAAQ;AAChD;AAGA,eAAe,gBAAgB,MAAM;AACnC,QAAM,EAAE,OAAO,OAAO,SAAS,QAAQ,WAAW,GAAG,UAAU,MAAM,aAAa,WAAW,IAAI;AACjG,MAAI,MAAM,EAAE,QAAQ,OAAO;AAC3B,MAAI,MAAM,QAAQ,OAAO,EAAG,OAAM,EAAE,QAAQ,UAAU,QAAQ,QAAQ;AAAA,WAC7D,OAAO,YAAY,UAAU;AACpC,UAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,UAAM,IAAI,MAAMA,aAAY,OAAO;AACnC,UAAM,EAAE,QAAQ,UAAU,QAAQ,EAAE,QAAQ,MAAM,EAAE,KAAK;AAAA,EAC3D;AACA,QAAM,WAAW,kBAAkB;AAAA,IACjC,MAAM,EAAE,MAAM;AAAA,IACd,SAAS;AAAA,IACT,QAAQ,EAAE,QAAQ,cAAc,OAAO,MAAM,EAAE,YAAY,CAAC,KAAK,QAAQ,UAAU,WAAW,IAAI;AAAA,IAClG,OAAO,EAAE,WAAW,EAAE;AAAA,EACxB,CAAC;AACD,sBAAW,gBAAgB;AAC3B,QAAM,SAAS,MAAM;AACrB,QAAM,MAAM,MAAM,OAAO,QAAQ,OAAO,QAAQ;AAChD,MAAI,eAAe,YAAY;AAC7B,UAAM,QAAQ,MAAM,QAAQ,KAAK;AACjC,UAAM,IAAI,SAAS,cAAc,QAAQ;AACzC,MAAE,QAAQ,MAAM;AAAO,MAAE,SAAS,MAAM;AACxC,UAAM,MAAM,EAAE,WAAW,IAAI;AAC7B,QAAI,wBAAwB;AAC5B,QAAI,UAAU,IAAI,SAAS,CAAC,GAAG,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM;AACtD,WAAO;AAAA,EACT;AACA,SAAO,IAAI,SAAS,CAAC;AACvB;;;AjBjJA;AAEA;;;AkBZO,IAAM,UAAU;AAAA,EACrB;AAAA,IACE,IAAI;AAAA,IAAY,MAAM;AAAA,IAAY,aAAa;AAAA,IAC/C,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,GAAG,SAAS,EAAE,QAAQ,WAAW,IAAI,aAAa,GAAG,QAAQ,EAAE,QAAQ,UAAU,UAAU,IAAI,EAAE;AAAA,EACjI;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAY,MAAM;AAAA,IAAY,aAAa;AAAA,IAC/C,UAAU,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,SAAS,EAAE,QAAQ,WAAW,IAAI,eAAe,GAAG,QAAQ,EAAE,QAAQ,UAAU,UAAU,EAAE,GAAG,QAAQ,EAAE,UAAU,KAAK,EAAE;AAAA,EAC9J;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAU,MAAM;AAAA,IAAU,aAAa;AAAA,IAC3C,UAAU,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,SAAS,EAAE,QAAQ,WAAW,IAAI,SAAS,GAAG,QAAQ,EAAE,QAAQ,aAAa,UAAU,IAAI,EAAE;AAAA,EACjI;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAW,MAAM;AAAA,IAAkB,aAAa;AAAA,IACpD,UAAU,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,SAAS,EAAE,QAAQ,WAAW,IAAI,gBAAgB,GAAG,QAAQ,EAAE,QAAQ,YAAY,UAAU,EAAE,GAAG,QAAQ,EAAE,UAAU,IAAI,EAAE;AAAA,EAChK;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAY,MAAM;AAAA,IAAmB,aAAa;AAAA,IACtD,UAAU,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,SAAS,EAAE,QAAQ,WAAW,OAAO,GAAG,GAAG,QAAQ,EAAE,QAAQ,mBAAmB,UAAU,KAAK,EAAE;AAAA,EACrI;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAU,MAAM;AAAA,IAAgB,aAAa;AAAA,IACjD,UAAU,EAAE,MAAM,EAAE,OAAO,IAAI,UAAU,UAAU,GAAG,SAAS,EAAE,QAAQ,WAAW,OAAO,GAAG,GAAG,QAAQ,EAAE,QAAQ,OAAO,GAAG,SAAS,EAAE,SAAS,KAAK,GAAG,SAAS,EAAE,MAAM,SAAS,OAAO,UAAU,EAAE;AAAA,EACxM;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAO,MAAM;AAAA,IAAO,aAAa;AAAA,IACrC,UAAU,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,SAAS,EAAE,QAAQ,WAAW,IAAI,SAAS,GAAG,QAAQ,EAAE,QAAQ,UAAU,UAAU,EAAE,EAAE;AAAA,EAC5H;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAa,MAAM;AAAA,IAAa,aAAa;AAAA,IACjD,UAAU,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,SAAS,EAAE,QAAQ,WAAW,IAAI,cAAc,GAAG,QAAQ,EAAE,QAAQ,YAAY,UAAU,EAAE,GAAG,QAAQ,EAAE,YAAY,GAAG,EAAE;AAAA,EAC/J;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAQ,MAAM;AAAA,IAAkB,aAAa;AAAA,IACjD,UAAU,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,SAAS,EAAE,QAAQ,WAAW,IAAI,eAAe,GAAG,QAAQ,EAAE,QAAQ,eAAe,UAAU,IAAI,GAAG,SAAS,EAAE,QAAQ,KAAK,EAAE;AAAA,EACpK;AACF;AAEO,IAAM,YAAY,QAAM,QAAQ,KAAK,OAAK,EAAE,OAAO,EAAE,KAAK;;;AlBvBjE;;;AmBZA;AAEA,IAAM,aAAN,MAAiB;AAAA,EACf,cAAc;AAAE,SAAK,MAAM,IAAI,WAAW,KAAK,EAAE;AAAG,SAAK,IAAI;AAAA,EAAG;AAAA,EAChE,KAAK,GAAG;AAAE,QAAI,KAAK,MAAM,KAAK,IAAI,QAAQ;AAAE,YAAM,KAAK,IAAI,WAAW,KAAK,IAAI,SAAS,CAAC;AAAG,SAAG,IAAI,KAAK,GAAG;AAAG,WAAK,MAAM;AAAA,IAAI;AAAE,SAAK,IAAI,KAAK,GAAG,IAAI;AAAA,EAAG;AAAA,EACvJ,MAAM,KAAK;AAAE,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAK,MAAK,KAAK,IAAI,CAAC,CAAC;AAAA,EAAG;AAAA,EACrE,IAAI,GAAG;AAAE,SAAK,KAAK,IAAI,GAAG;AAAG,SAAK,KAAM,KAAK,IAAK,GAAG;AAAA,EAAG;AAAA,EACxD,IAAI,GAAG;AAAE,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,MAAK,KAAK,EAAE,WAAW,CAAC,CAAC;AAAA,EAAG;AAAA,EACxE,SAAS;AAAE,WAAO,KAAK,IAAI,MAAM,GAAG,KAAK,CAAC;AAAA,EAAG;AAC/C;AAGO,SAAS,UAAU,SAAS,aAAa,GAAG;AACjD,QAAM,QAAQ,KAAK,aAAa,MAAM,QAAQ;AAC9C,MAAI,WAAW,cAAc,GAAG,OAAO,MAAM;AAC7C,MAAI,OAAO,oBAAI,IAAI;AACnB,MAAI,MAAM,GAAG,UAAU;AACvB,QAAM,MAAM,CAAC;AACb,MAAI,QAAQ,CAAC;AACb,QAAM,OAAO,UAAQ;AACnB,WAAO,QAAQ;AAAS,eAAW;AACnC,WAAO,WAAW,GAAG;AAAE,YAAM,KAAK,MAAM,GAAG;AAAG,eAAS;AAAG,iBAAW;AAAG,UAAI,MAAM,WAAW,KAAK;AAAE,YAAI,KAAK,KAAK;AAAG,gBAAQ,CAAC;AAAA,MAAG;AAAA,IAAE;AAAA,EACrI;AACA,OAAK,KAAK;AACV,MAAI,SAAS,QAAQ,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAMC,KAAI,QAAQ,CAAC;AACnB,UAAMC,OAAM,SAAS,MAAMD;AAC3B,UAAM,MAAM,KAAK,IAAIC,IAAG;AACxB,QAAI,QAAQ,QAAW;AAAE,eAAS;AAAK;AAAA,IAAU;AACjD,SAAK,MAAM;AACX,QAAI,OAAO,MAAM;AACf,WAAK,IAAIA,MAAK,MAAM;AACpB,UAAI,OAAQ,KAAK,YAAa,WAAW,GAAI;AAAA,IAC/C,OAAO;AACL,WAAK,KAAK;AAAG,aAAO,oBAAI,IAAI;AAAG,iBAAW,cAAc;AAAG,aAAO,MAAM;AAAA,IAC1E;AACA,aAASD;AAAA,EACX;AACA,OAAK,MAAM;AACX,OAAK,GAAG;AACR,MAAI,UAAU,EAAG,OAAM,KAAK,MAAM,GAAG;AACrC,MAAI,MAAM,OAAQ,KAAI,KAAK,KAAK;AAChC,IAAE,KAAK,WAAW;AAClB,aAAW,KAAK,KAAK;AAAE,MAAE,KAAK,EAAE,MAAM;AAAG,MAAE,MAAM,CAAC;AAAA,EAAG;AACrD,IAAE,KAAK,CAAC;AACV;AAEA,IAAM,QAAQ,CAAC,GAAG,MAAO,EAAE,IAAI,CAAC,IAAI,MAAM,KAAM,EAAE,CAAC,KAAK,KAAO,EAAE,IAAI,CAAC,KAAK,IAAK,EAAE,IAAI,CAAC;AAEvF,SAAS,SAAS,WAAW,aAAa;AACxC,QAAM,OAAO,CAAC,GAAG,SAAS,EAAE,OAAO,CAAAA,OAAKA,OAAM,EAAE;AAChD,QAAM,SAAS,KAAK,IAAI,CAAAA,OAAK,CAACA,MAAK,IAAKA,MAAK,IAAK,KAAKA,KAAI,GAAG,CAAC;AAC/D,QAAM,SAAS,cAAc,OAAO,SAAS;AAC7C,MAAI,YAAa,QAAO,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;AACtC,MAAI,OAAO;AAAG,SAAQ,KAAK,OAAQ,OAAO,OAAQ;AAClD,SAAO,OAAO,SAAU,KAAK,KAAO,QAAO,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;AACzD,QAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,CAACA,IAAG,MAAM,CAACA,IAAG,CAAC,CAAC,CAAC;AAChD,SAAO,EAAE,QAAQ,MAAM,QAAQ,MAAM;AACvC;AAEA,SAAS,OAAO,OAAO,KAAK;AAE1B,QAAM,MAAM,eAAe,OAAO,GAAG,EAAE,IAAI,UAAU;AACrD,QAAM,IAAI,IAAI,kBAAkB,MAAM,IAAI;AAC1C,QAAME,SAAQ,oBAAI,IAAI;AACtB,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,GAAG;AACpC,QAAI,EAAE,IAAI,CAAC,IAAI,IAAK;AACpB,UAAMF,KAAK,EAAE,CAAC,KAAK,KAAO,EAAE,IAAI,CAAC,KAAK,IAAK,EAAE,IAAI,CAAC;AAClD,QAAI,OAAOE,OAAM,IAAIF,EAAC;AACtB,QAAI,SAAS,QAAW;AACtB,UAAI,KAAK;AAAU,aAAO;AAC1B,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,cAAM,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;AAChF,cAAM,OAAO,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK;AACnD,YAAI,OAAO,IAAI;AAAE,eAAK;AAAM,iBAAO;AAAA,QAAG;AAAA,MACxC;AACA,MAAAE,OAAM,IAAIF,IAAG,IAAI;AAAA,IACnB;AACA,MAAE,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,EACpB;AACA,SAAO,EAAE,GAAG,OAAO,MAAM,EAAE;AAC7B;AAOO,SAAS,UAAU,QAAQ,OAAO,CAAC,GAAG;AAC3C,MAAI,CAAC,OAAO,OAAQ,OAAM,IAAI,MAAM,WAAW;AAC/C,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC;AACrD,QAAM,KAAK,OAAO,IAAI,QAAM,EAAE,GAAI,QAAQ,IAAI,QAAQ,GAAG,KAAK,IAAI,GAAI,OAAO,EAAE,SAAS,KAAK,SAAS,IAAI,EAAE;AAC5G,QAAM,IAAI,GAAG,CAAC,EAAE,OAAO,IAAI,GAAG,CAAC,EAAE;AAGjC,MAAI,cAAc;AAClB,QAAM,MAAM,oBAAI,IAAI;AACpB,QAAM,WAAW,GAAG,IAAI,OAAK;AAC3B,UAAM,IAAI,oBAAI,IAAI;AAClB,aAAS,IAAI,GAAG,IAAI,EAAE,KAAK,QAAQ,KAAK,GAAG;AAAE,YAAMA,KAAI,MAAM,EAAE,MAAM,CAAC;AAAG,UAAIA,OAAM,GAAI,eAAc;AAAM,QAAE,IAAIA,EAAC;AAAG,UAAI,IAAIA,EAAC;AAAA,IAAG;AACjI,WAAO;AAAA,EACT,CAAC;AACD,QAAM,cAAc,OAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI;AACnD,QAAM,WAAW,YAAY,GAAG,KAAK,cAAc,IAAI,MAAM;AAC7D,QAAM,SAAS,WAAW,SAAS,KAAK,WAAW,IAAI;AAEvD,QAAM,IAAI,IAAI,WAAW;AACzB,IAAE,IAAI,QAAQ;AACd,IAAE,IAAI,CAAC;AAAG,IAAE,IAAI,CAAC;AACjB,IAAE,KAAK,SAAS,MAAQ,OAAO,OAAO,IAAK,CAAI;AAC/C,IAAE,KAAK,CAAC;AAAG,IAAE,KAAK,CAAC;AACnB,MAAI,OAAQ,YAAW,KAAK,OAAO,OAAQ,GAAE,MAAM,CAAC;AACpD,MAAI,GAAG,SAAS,KAAK,KAAK,SAAS,IAAI;AACrC,MAAE,KAAK,EAAI;AAAG,MAAE,KAAK,GAAI;AAAG,MAAE,KAAK,EAAE;AAAG,MAAE,IAAI,aAAa;AAAG,MAAE,KAAK,CAAC;AAAG,MAAE,KAAK,CAAC;AAAG,MAAE,IAAI,KAAK,QAAQ,CAAC;AAAG,MAAE,KAAK,CAAC;AAAA,EACrH;AAEA,KAAG,QAAQ,CAAC,IAAI,MAAM;AACpB,QAAI,IAAI,IAAIG,SAAQ,QAAQ,MAAM,SAAS,CAAC;AAC5C,QAAI,CAACA,QAAO;AACV,YAAM,MAAM,cAAc,MAAM;AAChC,UAAI,YAAY,GAAG,IAAI,KAAK;AAC1B,YAAI,OAAO,IAAI,GAAG;AAClB,cAAM,oBAAI,IAAI;AAAG,iBAAS,IAAI,GAAG,IAAI,EAAE,KAAK,QAAQ,KAAK,EAAG,KAAI,IAAI,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,MACtF;AACA,MAAAA,SAAQ,SAAS,KAAK,IAAI,IAAI,EAAE,CAAC;AAAA,IACnC;AAEA,MAAE,KAAK,EAAI;AAAG,MAAE,KAAK,GAAI;AAAG,MAAE,KAAK,CAAC;AACpC,MAAE,MAAO,cAAc,IAAI,MAAM,KAAMA,OAAM,UAAU,IAAI,IAAI,EAAE;AACjE,MAAE,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC3C,MAAE,KAAKA,OAAM,UAAU,IAAIA,OAAM,SAAS,CAAC;AAC3C,MAAE,KAAK,CAAC;AAER,MAAE,KAAK,EAAI;AAAG,MAAE,IAAI,CAAC;AAAG,MAAE,IAAI,CAAC;AAAG,MAAE,IAAI,CAAC;AAAG,MAAE,IAAI,CAAC;AACnD,MAAE,KAAKA,WAAU,SAAS,IAAI,MAAQA,OAAM,OAAO,CAAE;AACrD,QAAIA,WAAU,OAAQ,YAAW,KAAKA,OAAM,OAAQ,GAAE,MAAM,CAAC;AAC7D,UAAM,MAAM,IAAI,WAAW,IAAI,CAAC;AAChC,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAMH,KAAI,MAAM,EAAE,MAAM,IAAI,CAAC;AAC7B,UAAI,CAAC,IAAIA,OAAM,KAAKG,OAAM,SAASA,OAAM,MAAM,IAAIH,EAAC;AAAA,IACtD;AACA,cAAU,KAAK,KAAK,IAAI,GAAGG,OAAM,IAAI,GAAG,CAAC;AAAA,EAC3C,CAAC;AACD,IAAE,KAAK,EAAI;AACX,SAAO,EAAE,OAAO;AAClB;;;ACpJA,IAAM,MAAM,IAAI,YAAY;AAMrB,SAAS,UAAU,SAAS;AACjC,QAAM,QAAQ,CAAC,GAAG,UAAU,CAAC;AAC7B,MAAI,SAAS;AACb,QAAM,OAAO,oBAAI,IAAI;AACrB,aAAW,KAAK,SAAS;AACvB,QAAI,OAAO,EAAE,KAAK,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;AAExD,QAAI,KAAK,IAAI,IAAI,GAAG;AAAE,YAAM,IAAI,oBAAoB,KAAK,IAAI;AAAG,UAAI,IAAI;AAAG,aAAO,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,EAAG;AAAK,aAAO,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE;AAAA,IAAI;AAClK,SAAK,IAAI,IAAI;AACb,UAAM,YAAY,IAAI,OAAO,IAAI;AACjC,UAAM,OAAO,OAAO,EAAE,SAAS,WAAW,IAAI,OAAO,EAAE,IAAI,IAAI,EAAE;AACjE,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,IAAI,EAAE,QAAQ,oBAAI,KAAK;AAC7B,UAAM,OAAQ,EAAE,SAAS,KAAK,KAAO,EAAE,WAAW,KAAK,IAAM,EAAE,WAAW,KAAK;AAC/E,UAAM,OAAS,EAAE,YAAY,IAAI,QAAS,IAAO,EAAE,SAAS,IAAI,KAAM,IAAK,EAAE,QAAQ;AAErF,UAAM,QAAQ,IAAI,WAAW,KAAK,UAAU,MAAM;AAClD,UAAM,KAAK,IAAI,SAAS,MAAM,MAAM;AACpC,OAAG,UAAU,GAAG,UAAY,IAAI;AAAG,OAAG,UAAU,GAAG,IAAI,IAAI;AAAG,OAAG,UAAU,GAAG,MAAQ,IAAI;AAC1F,OAAG,UAAU,GAAG,GAAG,IAAI;AAAG,OAAG,UAAU,IAAI,MAAM,IAAI;AAAG,OAAG,UAAU,IAAI,MAAM,IAAI;AACnF,OAAG,UAAU,IAAI,KAAK,IAAI;AAAG,OAAG,UAAU,IAAI,KAAK,QAAQ,IAAI;AAAG,OAAG,UAAU,IAAI,KAAK,QAAQ,IAAI;AACpG,OAAG,UAAU,IAAI,UAAU,QAAQ,IAAI;AAAG,OAAG,UAAU,IAAI,GAAG,IAAI;AAClE,UAAM,IAAI,WAAW,EAAE;AAEvB,UAAM,MAAM,IAAI,WAAW,KAAK,UAAU,MAAM;AAChD,UAAM,KAAK,IAAI,SAAS,IAAI,MAAM;AAClC,OAAG,UAAU,GAAG,UAAY,IAAI;AAAG,OAAG,UAAU,GAAG,IAAI,IAAI;AAAG,OAAG,UAAU,GAAG,IAAI,IAAI;AAAG,OAAG,UAAU,GAAG,MAAQ,IAAI;AACrH,OAAG,UAAU,IAAI,GAAG,IAAI;AAAG,OAAG,UAAU,IAAI,MAAM,IAAI;AAAG,OAAG,UAAU,IAAI,MAAM,IAAI;AACpF,OAAG,UAAU,IAAI,KAAK,IAAI;AAAG,OAAG,UAAU,IAAI,KAAK,QAAQ,IAAI;AAAG,OAAG,UAAU,IAAI,KAAK,QAAQ,IAAI;AACpG,OAAG,UAAU,IAAI,UAAU,QAAQ,IAAI;AAAG,OAAG,UAAU,IAAI,QAAQ,IAAI;AACvE,QAAI,IAAI,WAAW,EAAE;AAErB,UAAM,KAAK,OAAO,IAAI;AAAG,YAAQ,KAAK,GAAG;AACzC,cAAU,MAAM,SAAS,KAAK;AAAA,EAChC;AACA,QAAM,UAAU,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;AACxD,QAAM,MAAM,IAAI,WAAW,EAAE;AAC7B,QAAM,KAAK,IAAI,SAAS,IAAI,MAAM;AAClC,KAAG,UAAU,GAAG,WAAY,IAAI;AAAG,KAAG,UAAU,GAAG,QAAQ,QAAQ,IAAI;AAAG,KAAG,UAAU,IAAI,QAAQ,QAAQ,IAAI;AAC/G,KAAG,UAAU,IAAI,SAAS,IAAI;AAAG,KAAG,UAAU,IAAI,QAAQ,IAAI;AAC9D,QAAM,MAAM,IAAI,WAAW,SAAS,UAAU,EAAE;AAChD,MAAI,IAAI;AACR,aAAW,KAAK,CAAC,GAAG,OAAO,GAAG,SAAS,GAAG,GAAG;AAAE,QAAI,IAAI,GAAG,CAAC;AAAG,SAAK,EAAE;AAAA,EAAQ;AAC7E,SAAO;AACT;;;ACpDA,IAAM,QAAQ,CAAC,GAAG,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,IAAI,kBAAkB,IAAI,IAAI,CAAC,EAAE;AAEvF,SAAS,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,OAAO,KAAK,IAAI,QAAQ;AAC/E,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,OAAO,KAAK,KAAK,IAAI,QAAQ,MAAM,GAAG,MAAM,KAAK,KAAK,IAAI,QAAQ,MAAM;AAC9E,QAAI,KAAK,IAAI,IAAI,KAAK,WAAW,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,UAAU,MAAM,KAAK,IAAI,MAAM,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC;AAAA,EAChI;AACF;AAQO,SAAS,gBAAgB,QAAQ,OAAO,CAAC,GAAG;AACjD,MAAI,CAAC,OAAO,OAAQ,OAAM,IAAI,MAAM,WAAW;AAC/C,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,UAAU,CAAC;AACxC,QAAM,KAAK,KAAK,IAAI,GAAG,OAAO,IAAI,OAAK,EAAE,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,GAAG,OAAO,IAAI,OAAK,EAAE,MAAM,CAAC;AAC5F,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,QAAQ,KAAK,WAAW,KAAK,KAAK,KAAK,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;AACrG,QAAM,OAAO,KAAK,KAAK,OAAO,SAAS,IAAI;AAC3C,QAAM,IAAI,OAAO,MAAM,OAAO,KAAK,KAAK,IAAI,OAAO,MAAM,OAAO,KAAK;AACrE,QAAM,QAAQ,MAAM,GAAG,CAAC;AACxB,QAAM,MAAM,CAAC;AACb,SAAO,QAAQ,CAAC,GAAG,MAAM;AACvB,UAAM,IAAK,IAAI,QAAS,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK;AACpE,SAAK,OAAO,GAAG,GAAG,CAAC;AACnB,QAAI,EAAE,QAAQ,SAAS,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,IAAI;AAAA,MACrD,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO;AAAA,MACvC,YAAY,EAAE,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO;AAAA,MACtC,GAAI,EAAE,SAAS,OAAO,EAAE,UAAU,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,IAC7D;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,EAAE,QAAQ,KAAK,MAAM,EAAE,KAAK,kBAAkB,QAAQ,KAAK,QAAQ,WAAW,QAAQ,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,KAAK,SAAS,MAAM,MAAM,SAAS,IAAI,EAAE;AAC1K,SAAO,EAAE,OAAO,MAAM;AACxB;AASO,SAAS,aAAa,KAAK,OAAO,CAAC,GAAG;AAC3C,QAAM,KAAK,KAAK,IAAI,GAAG,KAAK,aAAa,CAAC,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,cAAc,EAAE;AACnF,QAAM,KAAK,KAAK,KAAK,IAAI,QAAQ,EAAE,GAAG,KAAK,KAAK,KAAK,IAAI,SAAS,EAAE;AACpE,QAAM,QAAQ,CAAC,GAAG,OAAO,oBAAI,IAAI,GAAG,MAAM,CAAC,GAAG,WAAW,CAAC;AAC1D,QAAM,OAAO,CAAC,IAAI,OAAO;AACvB,UAAM,IAAI,MAAM,IAAI,EAAE;AACtB,aAAS,IAAI,GAAG,IAAI,IAAI,IAAK,UAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACxD,YAAM,KAAK,KAAK,KAAK,GAAG,KAAK,KAAK,KAAK;AACvC,UAAI,MAAM,IAAI,SAAS,MAAM,IAAI,OAAQ;AACzC,YAAM,MAAM,KAAK,IAAI,QAAQ,MAAM;AACnC,QAAE,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE,GAAG,IAAI,KAAK,KAAK,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,IACnG;AACA,WAAO;AAAA,EACT;AACA,QAAMC,OAAM,OAAK;AACf,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,EAAE,KAAK,QAAQ,KAAK,EAAG,MAAK,EAAE,KAAK,IAAI,CAAC,MAAM,IAAI,MAAM,OAAO,aAAa,EAAE,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;AACnJ,WAAO;AAAA,EACT;AACA,QAAM,OAAO,CAAC,GAAG,IAAI,OAAO;AAC1B,UAAM,IAAI,MAAM,IAAI,EAAE;AACtB,aAAS,IAAI,GAAG,IAAI,IAAI,IAAK,UAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACxD,YAAM,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI,IAAI,MAAM;AAClE,QAAE,KAAK,IAAI,EAAE,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,IAC1D;AACA,WAAO;AAAA,EACT;AACA,WAAS,KAAK,GAAG,KAAK,IAAI,MAAM;AAC9B,aAAS,KAAK,GAAG,KAAK,IAAI,MAAM;AAC9B,YAAM,IAAI,KAAK,IAAI,EAAE;AACrB,UAAI,KAAK,KAAK,IAAIA,KAAI,CAAC,CAAC,GAAG,IAAI;AAC/B,UAAI,OAAO,UAAa,KAAK,OAAO;AAClC,mBAAW,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG;AAC9D,gBAAMC,KAAI,KAAK,IAAID,KAAI,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC;AACvC,cAAIC,OAAM,QAAW;AAAE,iBAAKA;AAAG,gBAAI;AAAM;AAAA,UAAO;AAAA,QAClD;AAAA,MACF;AACA,UAAI,OAAO,QAAW;AAAE,aAAK,MAAM;AAAQ,cAAM,KAAK,CAAC;AAAG,aAAK,IAAID,KAAI,CAAC,GAAG,EAAE;AAAA,MAAG;AAChF,UAAI,KAAK,EAAE;AAAG,eAAS,KAAK,CAAC;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,QAAQ,gBAAgB,OAAO,EAAE,SAAS,KAAK,WAAW,KAAK,IAAI,IAAI,MAAM,MAAM,EAAE,CAAC;AAC5F,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,KAAK,EAAE,OAAO,IAAI,QAAQ,IAAI,WAAW,IAAI,YAAY,IAAI,OAAO,KAAK,GAAI,KAAK,QAAQ,EAAE,OAAO,SAAS,IAAI,CAAC,EAAG;AAAA,IACpH,OAAO,MAAM;AAAA,EACf;AACF;;;AC1FA,IAAM,OAAO,CAAC,IAAI,IAAI,KAAK,QAAS,IAAI,QAAQ,CAAC,KAAK,QAAQ;AAC5D,QAAM,IAAI,WAAW,MAAM;AAAE,OAAG,oBAAoB,IAAI,EAAE;AAAG,QAAI,IAAI,MAAM,0BAA0B,EAAE,GAAG,CAAC;AAAA,EAAG,GAAG,EAAE;AACnH,QAAM,KAAK,MAAM;AAAE,iBAAa,CAAC;AAAG,QAAI;AAAA,EAAG;AAC3C,KAAG,iBAAiB,IAAI,IAAI,EAAE,MAAM,KAAK,CAAC;AAC5C,CAAC;AAED,IAAM,eAAe;AAAA,EACnB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAGO,SAAS,WAAW,OAAO;AAChC,QAAM,OAAO,MAAM,QAAQ,MAAM,MAAM,OAAO;AAC9C,QAAM,MAAM,IAAI,MAAM,aAAa,IAAI,KAAK,+BAA+B;AAC3E,MAAI,OAAO;AACX,MAAI,MAAM,SAAS,MAAM,MAAM,QAAS,KAAI,SAAS,MAAM,MAAM;AACjE,SAAO;AACT;AAGA,IAAM,aAAa,CAAC,OAAO,IAAI,OAAO,IAAI,QAAQ,CAAC,KAAK,QAAQ;AAC9D,QAAM,OAAO,MAAM;AAAE,iBAAa,CAAC;AAAG,UAAM,oBAAoB,IAAI,IAAI;AAAG,UAAM,oBAAoB,SAAS,KAAK;AAAA,EAAG;AACtH,QAAM,OAAO,MAAM;AAAE,SAAK;AAAG,QAAI;AAAA,EAAG;AACpC,QAAM,QAAQ,MAAM;AAAE,SAAK;AAAG,QAAI,WAAW,KAAK,CAAC;AAAA,EAAG;AACtD,QAAM,IAAI,WAAW,MAAM;AAAE,SAAK;AAAG,QAAI,IAAI,MAAM,4CAA4C,KAAK,GAAI,IAAI,CAAC;AAAA,EAAG,GAAG,EAAE;AACrH,QAAM,iBAAiB,IAAI,MAAM,EAAE,MAAM,KAAK,CAAC;AAC/C,QAAM,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AACvD,CAAC;AAMD,eAAsB,WAAW,OAAO,EAAE,UAAU,IAAM,IAAI,CAAC,GAAG;AAChE,MAAI,MAAM,MAAO,OAAM,WAAW,KAAK;AACvC,MAAI,MAAM,aAAa,EAAG,OAAM,WAAW,OAAO,kBAAkB,OAAO;AAC3E,MAAI,MAAM,aAAa,EAAG,OAAM,WAAW,OAAO,cAAc,OAAO,EAAE,MAAM,OAAK;AAAE,QAAI,EAAE,KAAM,OAAM;AAAA,EAAG,CAAC;AAC5G,SAAO;AACT;AAOA,eAAsB,gBAAgB,MAAM;AAC1C,QAAM,MAAM,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC;AACnD,QAAM,QAAQ,EAAE,MAAM,SAAS,MAAM,SAAS,MAAM,gBAAgB,MAAM,gBAAgB,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,iBAAiB,MAAM,UAAU,MAAM,UAAU,MAAM,UAAU,MAAM,UAAU,MAAM,eAAe,MAAM,gBAAgB,MAAM,eAAe;AAExR,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,QAAQ,KAAK;AACxC,QAAI,IAAI,CAAC,MAAM,OAAQ,IAAI,IAAI,CAAC,MAAM,OAAQ,IAAI,IAAI,CAAC,MAAM,OAAQ,IAAI,IAAI,CAAC,MAAM,KAAM;AACxF,YAAM,OAAO,OAAO,aAAa,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;AACnF,UAAI,MAAM,IAAI,EAAG,QAAO,MAAM,IAAI;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,OAAO,IAAI,YAAY,QAAQ,EAAE,OAAO,IAAI,SAAS,GAAG,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE,CAAC,CAAC;AAC5F,QAAM,IAAI,mDAAmD,KAAK,IAAI;AACtE,MAAI,EAAG,QAAO,EAAE,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,iBAAiB,SAAS,kBAAkB,eAAe,EAAE,EAAE,CAAC,CAAC;AACrH,SAAO;AACT;AAyCA,eAAsB,OAAO,OAAO,MAAM;AACxC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,MAAM,YAAY,KAAK,IAAI,CAAC;AAC/D,MAAI,KAAK,IAAI,MAAM,cAAc,IAAI,IAAI,QAAQ,MAAM,cAAc,EAAG;AACxE,QAAM,YAAY,+BAA+B,QAC7C,IAAI,QAAQ,SAAO;AAAE,UAAM,0BAA0B,MAAM,IAAI,CAAC;AAAG,eAAW,KAAK,GAAG;AAAA,EAAG,CAAC,IAC1F;AACJ,QAAM,SAAS,KAAK,OAAO,QAAQ;AACnC,QAAM,cAAc;AACpB,QAAM;AACN,MAAI,UAAW,OAAM;AACvB;AAMA,eAAsB,YAAY,OAAO,WAAW,IAAI;AACtD,MAAI,EAAE,+BAA+B,OAAQ,QAAO;AACpD,QAAM,WAAW,KAAK;AACtB,QAAM,MAAM,EAAE,GAAG,MAAM,aAAa,OAAO,MAAM,OAAO,QAAQ,MAAM,OAAO;AAC7E,QAAM,QAAQ,CAAC;AACf,MAAI;AACF,UAAM,QAAQ;AACd,UAAM,IAAI,QAAQ,CAAC,QAAQ;AACzB,YAAM,OAAO,WAAW,KAAK,IAAI;AACjC,YAAM,KAAK,CAAC,GAAG,SAAS;AACtB,cAAM,KAAK,KAAK,SAAS;AACzB,YAAI,MAAM,UAAU,IAAI;AAAE,uBAAa,IAAI;AAAG,cAAI;AAAA,QAAG,MAAO,OAAM,0BAA0B,EAAE;AAAA,MAChG;AACA,YAAM,0BAA0B,EAAE;AAClC,YAAM,KAAK,EAAE,MAAM,MAAM;AAAE,qBAAa,IAAI;AAAG,YAAI;AAAA,MAAG,CAAC;AAAA,IACzD,CAAC;AAAA,EACH,UAAE;AACA,UAAM,MAAM;AACZ,UAAM,QAAQ,IAAI;AAClB,UAAM,OAAO,OAAO,IAAI,CAAC,EAAE,MAAM,MAAM;AAAA,IAAE,CAAC;AAAA,EAC5C;AACA,QAAM,SAAS,CAAC;AAChB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAAE,UAAM,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;AAAG,QAAI,IAAI,KAAO,QAAO,KAAK,CAAC;AAAA,EAAG;AAC3G,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,SAAO,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC3B,QAAM,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC;AAEpD,aAAW,KAAK,CAAC,IAAI,IAAI,QAAQ,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,EAAE,EAAG,KAAI,KAAK,IAAI,MAAM,CAAC,IAAI,IAAK,QAAO;AAC5G,SAAO,KAAK,MAAM,GAAG;AACvB;AAGO,SAAS,WAAW,EAAE,UAAU,KAAK,QAAQ,GAAG,MAAM,UAAU,YAAY,SAAS,GAAG;AAC7F,QAAM,MAAM,CAAC;AACb,QAAM,IAAI,KAAK,IAAI,WAAW,KAAK,IAAI,GAAG,KAAK,OAAO,MAAM,SAAS,MAAM,IAAI,CAAC,CAAC;AACjF,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,KAAK,SAAS,IAAI,OAAO,GAAG;AAC5D,SAAO;AACT;AAQA,eAAsB,aAAa,OAAO,MAAM;AAC9C,QAAM,WAAW,KAAK;AACtB,QAAM,YAAY,MAAM;AACxB,QAAM,MAAM;AAEZ,QAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAClC,KAAK,MAAM,OAAO,OAAK,OAAO,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,aAAa,QAAQ,IAC9E,WAAW,EAAE,UAAU,MAAM,UAAU,GAAG,KAAK,CAAC;AACpD,MAAI;AACF,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAI,KAAK,QAAQ,QAAS,OAAM,IAAI,aAAa,WAAW,YAAY;AACxE,YAAM,OAAO,OAAO,MAAM,CAAC,CAAC;AAC5B,UAAI,KAAK,QAAQ,QAAS,OAAM,IAAI,aAAa,WAAW,YAAY;AACxE,YAAM,KAAK,QAAQ,EAAE,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,OAAO,MAAM,OAAO,CAAC;AAAA,IACtE;AAAA,EACF,UAAE;AACA,QAAI,CAAC,UAAW,OAAM,KAAK,EAAE,MAAM,MAAM;AAAA,IAAE,CAAC;AAAA,EAC9C;AACA,SAAO,MAAM;AACf;;;AtB9JO,IAAM,UAAU,OAAsC,UAAkB;",
|
|
6
6
|
"names": ["k", "k", "b", "o", "k", "k", "nearest", "k", "key", "k", "k", "k", "k", "fetchLospec", "k", "key", "cache", "table", "key", "k"]
|
|
7
7
|
}
|