diff --git a/dist/index.js b/dist/index.js index 0637f33..06e4c5b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -37,8 +37,16 @@ async function initCodecWithBinary(initFn, wasmSource) { await initFn(wasmModule2); } async function initCodecForNode(initFn, wasmPath) { - const { readFile } = await import('fs/promises'); - const { createRequire } = await import('module'); + const fsModule = "fs/promises"; + const moduleModule = "module"; + const { readFile } = await import( + /* @vite-ignore */ + fsModule + ); + const { createRequire } = await import( + /* @vite-ignore */ + moduleModule + ); const require2 = createRequire(import.meta.url); const resolvedPath = require2.resolve(wasmPath); const wasmBuffer = await readFile(resolvedPath); @@ -726,7 +734,11 @@ async function doLoadWasm() { } const isNode2 = !isCloudflareWorker2() && typeof process !== "undefined" && process.versions != null && process.versions.node != null; if (isNode2) { - const { readFile } = await import('fs/promises'); + const fsModule = "fs/promises"; + const { readFile } = await import( + /* @vite-ignore */ + fsModule + ); const wasmBinary = await readFile(new URL("./sip.wasm", import.meta.url)); const module2 = await createSipModule({ wasmBinary }); return module2; diff --git a/dist/index.js.map b/dist/index.js.map index 3d5432c..83043d1 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/decoders/simple.ts","../src/probe.ts","../src/input.ts","../src/resize.ts","../src/wasm/loader.ts","../src/wasm/decoder.ts","../src/wasm/encoder.ts","../src/wasm/png-decoder.ts","../src/api.ts"],"names":["wasmModule","require","decode","copy","merged","isCloudflareWorker","module","isNode","decoder","bytes"],"mappings":"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","file":"index.js","sourcesContent":["import type { ImageFormat, Scanline } from '../types';\nimport type { Decoder } from './types';\n\ntype CodecWasmBinary = ArrayBuffer | Uint8Array | WebAssembly.Module;\n\n/**\n * Detect Cloudflare Workers/workerd runtime even when node compat is enabled.\n */\nfunction isCloudflareWorker(): boolean {\n const cacheStorage = (globalThis as { caches?: CacheStorage & { default?: Cache } }).caches;\n return typeof cacheStorage !== 'undefined' && typeof cacheStorage.default !== 'undefined';\n}\n\nfunction getPreloadedCodecBinary(format: 'avif' | 'webp'): CodecWasmBinary | null {\n const globalValue = (globalThis as Record).__SIP_CODEC_WASM__;\n if (!globalValue || typeof globalValue !== 'object') {\n return null;\n }\n\n const formatValue = (globalValue as Record)[format];\n if (\n formatValue instanceof ArrayBuffer ||\n formatValue instanceof Uint8Array ||\n formatValue instanceof WebAssembly.Module\n ) {\n return formatValue;\n }\n\n return null;\n}\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNode(): boolean {\n if (isCloudflareWorker()) {\n return false;\n }\n\n return typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n}\n\nasync function initCodecWithBinary(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initFn: (module: WebAssembly.Module) => Promise,\n wasmSource: CodecWasmBinary\n): Promise {\n if (wasmSource instanceof WebAssembly.Module) {\n await initFn(wasmSource);\n return;\n }\n\n let buffer: ArrayBuffer;\n\n if (wasmSource instanceof Uint8Array) {\n const copy = new Uint8Array(wasmSource.byteLength);\n copy.set(wasmSource);\n buffer = copy.buffer;\n } else {\n buffer = wasmSource;\n }\n\n const wasmModule = await WebAssembly.compile(buffer);\n await initFn(wasmModule);\n}\n\n/**\n * Initialize a @jsquash codec for Node.js by loading its WASM module\n */\nasync function initCodecForNode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initFn: (module: WebAssembly.Module) => Promise,\n wasmPath: string\n): Promise {\n // Dynamic import for Node.js modules\n const { readFile } = await import('fs/promises');\n const { createRequire } = await import('module');\n const require = createRequire(import.meta.url);\n\n // Resolve the WASM file path from the package\n const resolvedPath = require.resolve(wasmPath);\n const wasmBuffer = await readFile(resolvedPath);\n const wasmModule = await WebAssembly.compile(wasmBuffer);\n await initFn(wasmModule);\n}\n\n/**\n * Simple decoder for WebP and AVIF formats\n *\n * This decoder handles formats that don't have native WASM support yet.\n * For JPEG and PNG, use the native WASM decoders which are more memory efficient.\n *\n * Works with:\n * - WebP via external @jsquash/webp\n * - AVIF via external @jsquash/avif\n *\n * Supports both Node.js and browser/Workers environments.\n */\nexport class SimpleDecoder implements Decoder {\n readonly format: ImageFormat;\n readonly supportsScanline = false;\n readonly supportsScaledDecode = false;\n\n private data: ArrayBuffer;\n private width = 0;\n private height = 0;\n private hasAlpha = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private decodeFn: ((data: ArrayBuffer) => Promise) | null = null;\n\n constructor(format: ImageFormat, data: ArrayBuffer) {\n this.format = format;\n this.data = data;\n }\n\n async init(data: ArrayBuffer): Promise<{ width: number; height: number; hasAlpha: boolean }> {\n this.data = data;\n\n // Get decoder function based on format\n // In Node.js, we need to manually initialize the WASM modules\n // The init function is on the submodule (e.g. @jsquash/webp/decode.js)\n // Note: JPEG and PNG use native WASM decoders, not this fallback\n switch (this.format) {\n case 'avif': {\n const { default: decode, init } = await import('@jsquash/avif/decode.js');\n const preloaded = getPreloadedCodecBinary('avif');\n if (preloaded) {\n await initCodecWithBinary(init, preloaded);\n } else if (isNode()) {\n await initCodecForNode(init, '@jsquash/avif/codec/dec/avif_dec.wasm');\n }\n this.decodeFn = decode;\n this.hasAlpha = true; // AVIF may have alpha\n break;\n }\n case 'webp': {\n const { default: decode, init } = await import('@jsquash/webp/decode.js');\n const preloaded = getPreloadedCodecBinary('webp');\n if (preloaded) {\n await initCodecWithBinary(init, preloaded);\n } else if (isNode()) {\n await initCodecForNode(init, '@jsquash/webp/codec/dec/webp_dec.wasm');\n }\n this.decodeFn = decode;\n this.hasAlpha = true; // WebP may have alpha\n break;\n }\n case 'jpeg':\n case 'png':\n throw new Error(\n `${this.format.toUpperCase()} requires native WASM decoder. ` +\n 'Build the WASM module with `pnpm build:wasm` in the @standardagents/sip repo root.'\n );\n default:\n throw new Error(`Unsupported format for SimpleDecoder: ${this.format}`);\n }\n\n // Decode to get dimensions (unfortunately this decodes the whole thing)\n // For a more efficient probe, use the probe() function first\n const imageData = await this.decodeFn(this.data);\n if (!imageData) {\n throw new Error(`Failed to decode ${this.format} image`);\n }\n this.width = imageData.width;\n this.height = imageData.height;\n\n return {\n width: this.width,\n height: this.height,\n hasAlpha: this.hasAlpha,\n };\n }\n\n async decode(_scaleFactor?: number): Promise<{\n pixels: Uint8Array;\n width: number;\n height: number;\n }> {\n if (!this.decodeFn) {\n throw new Error('Decoder not initialized. Call init() first.');\n }\n\n // Decode the image\n const imageData = await this.decodeFn(this.data);\n this.width = imageData.width;\n this.height = imageData.height;\n\n // Convert RGBA to RGB\n const rgba = new Uint8Array(imageData.data.buffer);\n const rgb = new Uint8Array(this.width * this.height * 3);\n\n let srcIdx = 0;\n let dstIdx = 0;\n const pixelCount = this.width * this.height;\n\n for (let i = 0; i < pixelCount; i++) {\n rgb[dstIdx++] = rgba[srcIdx++]; // R\n rgb[dstIdx++] = rgba[srcIdx++]; // G\n rgb[dstIdx++] = rgba[srcIdx++]; // B\n srcIdx++; // Skip A\n }\n\n return {\n pixels: rgb,\n width: this.width,\n height: this.height,\n };\n }\n\n dispose(): void {\n // Clean up references\n this.decodeFn = null;\n }\n}\n\n/**\n * Create a decoder for the given format\n */\nexport async function createDecoder(\n format: ImageFormat,\n data: ArrayBuffer\n): Promise {\n const decoder = new SimpleDecoder(format, data);\n await decoder.init(data);\n return decoder;\n}\n","import type { ImageFormat, ProbeResult } from './types';\n\n/**\n * Magic bytes for format detection\n */\nconst MAGIC = {\n // JPEG: FFD8FF\n JPEG: [0xff, 0xd8, 0xff],\n // PNG: 89504E47 0D0A1A0A\n PNG: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],\n // WebP: RIFF....WEBP\n RIFF: [0x52, 0x49, 0x46, 0x46], // \"RIFF\"\n WEBP: [0x57, 0x45, 0x42, 0x50], // \"WEBP\"\n // AVIF: ....ftypavif or ....ftypavis\n FTYP: [0x66, 0x74, 0x79, 0x70], // \"ftyp\"\n};\n\n/**\n * Detect image format from magic bytes\n */\nfunction detectFormat(data: Uint8Array): ImageFormat {\n if (data.length < 12) return 'unknown';\n\n // Check JPEG\n if (\n data[0] === MAGIC.JPEG[0] &&\n data[1] === MAGIC.JPEG[1] &&\n data[2] === MAGIC.JPEG[2]\n ) {\n return 'jpeg';\n }\n\n // Check PNG\n if (\n data[0] === MAGIC.PNG[0] &&\n data[1] === MAGIC.PNG[1] &&\n data[2] === MAGIC.PNG[2] &&\n data[3] === MAGIC.PNG[3] &&\n data[4] === MAGIC.PNG[4] &&\n data[5] === MAGIC.PNG[5] &&\n data[6] === MAGIC.PNG[6] &&\n data[7] === MAGIC.PNG[7]\n ) {\n return 'png';\n }\n\n // Check WebP (RIFF....WEBP)\n if (\n data[0] === MAGIC.RIFF[0] &&\n data[1] === MAGIC.RIFF[1] &&\n data[2] === MAGIC.RIFF[2] &&\n data[3] === MAGIC.RIFF[3] &&\n data[8] === MAGIC.WEBP[0] &&\n data[9] === MAGIC.WEBP[1] &&\n data[10] === MAGIC.WEBP[2] &&\n data[11] === MAGIC.WEBP[3]\n ) {\n return 'webp';\n }\n\n // Check AVIF (....ftypavif, ....ftypmif1, ....ftypavis, etc.)\n if (\n data[4] === MAGIC.FTYP[0] &&\n data[5] === MAGIC.FTYP[1] &&\n data[6] === MAGIC.FTYP[2] &&\n data[7] === MAGIC.FTYP[3]\n ) {\n // Check for AVIF-related brands\n const brand = String.fromCharCode(data[8], data[9], data[10], data[11]);\n if (brand === 'avif' || brand === 'avis' || brand === 'mif1' || brand === 'msf1') {\n return 'avif';\n }\n }\n\n return 'unknown';\n}\n\n/**\n * Read JPEG dimensions from SOF marker\n * JPEG structure: FFD8 (SOI) followed by segments\n * We need to find SOF0 (FFC0), SOF1 (FFC1), or SOF2 (FFC2)\n */\nfunction probeJpeg(data: Uint8Array): { width: number; height: number } | null {\n let offset = 2; // Skip FFD8\n\n while (offset < data.length - 1) {\n // Each marker starts with FF\n if (data[offset] !== 0xff) {\n offset++;\n continue;\n }\n\n // Skip padding FF bytes\n while (offset < data.length && data[offset] === 0xff) {\n offset++;\n }\n\n if (offset >= data.length) break;\n\n const marker = data[offset++];\n\n // SOF markers (Start of Frame) - various types\n // FFC0-FFC3, FFC5-FFC7, FFC9-FFCB, FFCD-FFCF\n const isSOF =\n (marker >= 0xc0 && marker <= 0xc3) ||\n (marker >= 0xc5 && marker <= 0xc7) ||\n (marker >= 0xc9 && marker <= 0xcb) ||\n (marker >= 0xcd && marker <= 0xcf);\n\n if (isSOF) {\n if (offset + 7 > data.length) return null;\n // SOF structure: length(2) + precision(1) + height(2) + width(2)\n const height = (data[offset + 3] << 8) | data[offset + 4];\n const width = (data[offset + 5] << 8) | data[offset + 6];\n return { width, height };\n }\n\n // Skip to next segment\n // Most markers have a length field (except RST, SOI, EOI)\n if (marker === 0xd8 || marker === 0xd9 || (marker >= 0xd0 && marker <= 0xd7)) {\n // SOI, EOI, RST markers have no length\n continue;\n }\n\n if (offset + 1 >= data.length) break;\n const segmentLength = (data[offset] << 8) | data[offset + 1];\n offset += segmentLength;\n }\n\n return null;\n}\n\n/**\n * Read PNG dimensions from IHDR chunk\n * PNG structure: 8-byte signature, then chunks (length + type + data + CRC)\n * IHDR is always the first chunk: width(4) + height(4) + ...\n */\nfunction probePng(data: Uint8Array): { width: number; height: number; hasAlpha: boolean } | null {\n if (data.length < 24) return null;\n\n // Skip 8-byte signature, read first chunk (IHDR)\n // Chunk structure: length(4) + type(4) + data + crc(4)\n const chunkType = String.fromCharCode(data[12], data[13], data[14], data[15]);\n if (chunkType !== 'IHDR') return null;\n\n // IHDR data starts at offset 16\n const width =\n (data[16] << 24) | (data[17] << 16) | (data[18] << 8) | data[19];\n const height =\n (data[20] << 24) | (data[21] << 16) | (data[22] << 8) | data[23];\n\n // Color type is at offset 24 (after width + height)\n // 4 = grayscale + alpha, 6 = RGBA\n const colorType = data[25];\n const hasAlpha = colorType === 4 || colorType === 6;\n\n return { width, height, hasAlpha };\n}\n\n/**\n * Read WebP dimensions\n * WebP has multiple formats: VP8 (lossy), VP8L (lossless), VP8X (extended)\n */\nfunction probeWebp(data: Uint8Array): { width: number; height: number; hasAlpha: boolean } | null {\n if (data.length < 30) return null;\n\n // After RIFF header (12 bytes), check chunk type\n const chunkType = String.fromCharCode(data[12], data[13], data[14], data[15]);\n\n if (chunkType === 'VP8 ') {\n // Lossy WebP\n // VP8 bitstream starts at offset 20 (after chunk size)\n // Frame tag at offset 23: 3 bytes\n if (data.length < 30) return null;\n // Check for VP8 frame tag (0x9D 0x01 0x2A for keyframe)\n if (data[23] !== 0x9d || data[24] !== 0x01 || data[25] !== 0x2a) return null;\n // Width and height are 14-bit values\n const width = (data[26] | (data[27] << 8)) & 0x3fff;\n const height = (data[28] | (data[29] << 8)) & 0x3fff;\n return { width, height, hasAlpha: false };\n }\n\n if (chunkType === 'VP8L') {\n // Lossless WebP\n // Signature byte at offset 20 should be 0x2f\n if (data[20] !== 0x2f) return null;\n // Width and height encoded in next 4 bytes\n const bits = data[21] | (data[22] << 8) | (data[23] << 16) | (data[24] << 24);\n const width = (bits & 0x3fff) + 1;\n const height = ((bits >> 14) & 0x3fff) + 1;\n const hasAlpha = ((bits >> 28) & 1) === 1;\n return { width, height, hasAlpha };\n }\n\n if (chunkType === 'VP8X') {\n // Extended WebP format\n // Flags at offset 20\n const flags = data[20];\n const hasAlpha = (flags & 0x10) !== 0;\n // Width at offset 24 (24-bit, little-endian, +1)\n const width = (data[24] | (data[25] << 8) | (data[26] << 16)) + 1;\n // Height at offset 27 (24-bit, little-endian, +1)\n const height = (data[27] | (data[28] << 8) | (data[29] << 16)) + 1;\n return { width, height, hasAlpha };\n }\n\n return null;\n}\n\n/**\n * Read AVIF dimensions from HEIF/ISOBMFF structure\n * This is complex - AVIF uses HEIF container (ISO Base Media File Format)\n */\nfunction probeAvif(data: Uint8Array): { width: number; height: number } | null {\n // AVIF parsing is complex (ISOBMFF boxes)\n // For now, we'll look for the ispe (image spatial extents) box\n // which contains width and height\n\n let offset = 0;\n while (offset + 8 <= data.length) {\n // Box structure: size(4) + type(4) + data\n const size =\n (data[offset] << 24) |\n (data[offset + 1] << 16) |\n (data[offset + 2] << 8) |\n data[offset + 3];\n const type = String.fromCharCode(\n data[offset + 4],\n data[offset + 5],\n data[offset + 6],\n data[offset + 7]\n );\n\n if (size === 0) break; // Box extends to end of file\n if (size < 8) break; // Invalid box\n\n // Look for ispe box (can be nested in meta > iprp > ipco)\n if (type === 'ispe' && offset + 20 <= data.length) {\n // ispe: version(1) + flags(3) + width(4) + height(4)\n const width =\n (data[offset + 12] << 24) |\n (data[offset + 13] << 16) |\n (data[offset + 14] << 8) |\n data[offset + 15];\n const height =\n (data[offset + 16] << 24) |\n (data[offset + 17] << 16) |\n (data[offset + 18] << 8) |\n data[offset + 19];\n if (width > 0 && height > 0) {\n return { width, height };\n }\n }\n\n // Container boxes that we should descend into\n if (type === 'meta' || type === 'iprp' || type === 'ipco') {\n // For meta, skip 4 bytes (version + flags)\n const headerSize = type === 'meta' ? 12 : 8;\n offset += headerSize;\n continue;\n }\n\n offset += size;\n }\n\n return null;\n}\n\n/**\n * Probe an image to get format and dimensions\n * Only reads the header bytes - very memory efficient\n *\n * @param input - Image data as ArrayBuffer or Uint8Array\n * @returns ProbeResult with format, dimensions, and alpha info\n */\nexport function probe(input: ArrayBuffer | Uint8Array): ProbeResult {\n const data = input instanceof ArrayBuffer ? new Uint8Array(input) : input;\n\n const format = detectFormat(data);\n\n let result: { width: number; height: number; hasAlpha?: boolean } | null = null;\n\n switch (format) {\n case 'jpeg':\n result = probeJpeg(data);\n break;\n case 'png':\n result = probePng(data);\n break;\n case 'webp':\n result = probeWebp(data);\n break;\n case 'avif':\n result = probeAvif(data);\n break;\n }\n\n if (!result) {\n return {\n format: 'unknown',\n width: 0,\n height: 0,\n hasAlpha: false,\n };\n }\n\n return {\n format,\n width: result.width,\n height: result.height,\n hasAlpha: result.hasAlpha ?? false,\n };\n}\n\n/**\n * Detect just the format (faster if you don't need dimensions)\n */\nexport function detectImageFormat(input: ArrayBuffer | Uint8Array): ImageFormat {\n const data = input instanceof ArrayBuffer ? new Uint8Array(input) : input;\n return detectFormat(data);\n}\n","import { probe } from './probe';\nimport type { ByteInput, ImageInfo, ImageFormat, InputSource, InspectResult } from './types';\n\nconst INSPECT_TARGETS = [64, 512, 4_096, 16_384, 65_536, 262_144];\nconst STREAM_CHUNK_TARGET = 64 * 1024;\n\ntype PreparedInputSource = InputSource & {\n ensureHeaderBytes(target: number): Promise;\n readonly done: boolean;\n};\n\nfunction sliceArrayBuffer(view: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(view.byteLength);\n copy.set(view);\n return copy.buffer;\n}\n\nfunction concatChunks(chunks: Uint8Array[], total: number): Uint8Array {\n const merged = new Uint8Array(total);\n let offset = 0;\n\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return merged;\n}\n\nfunction normalizeChunk(chunk: Uint8Array): Uint8Array {\n if (chunk.byteOffset === 0 && chunk.byteLength === chunk.buffer.byteLength) {\n const copy = new Uint8Array(chunk.byteLength);\n copy.set(chunk);\n return copy;\n }\n\n const copy = new Uint8Array(chunk.byteLength);\n copy.set(chunk);\n return copy;\n}\n\nasync function* iterateReadableStream(stream: ReadableStream): AsyncIterable {\n const reader = stream.getReader();\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n\n if (value && value.byteLength > 0) {\n yield normalizeChunk(value);\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nasync function* coalesceAsyncIterable(\n input: AsyncIterable,\n target = STREAM_CHUNK_TARGET\n): AsyncIterable {\n let pending: Uint8Array[] = [];\n let total = 0;\n\n const flush = () => {\n if (total === 0) {\n return null;\n }\n\n const merged = concatChunks(pending, total);\n pending = [];\n total = 0;\n return merged;\n };\n\n for await (const rawChunk of input) {\n const chunk = normalizeChunk(rawChunk);\n if (chunk.byteLength >= target && total === 0) {\n yield chunk;\n continue;\n }\n\n pending.push(chunk);\n total += chunk.byteLength;\n\n if (total >= target) {\n const merged = flush();\n if (merged) {\n yield merged;\n }\n }\n }\n\n const merged = flush();\n if (merged) {\n yield merged;\n }\n}\n\nfunction getAsyncIterable(input: ReadableStream | AsyncIterable): AsyncIterable {\n if (typeof ReadableStream !== 'undefined' && input instanceof ReadableStream) {\n return coalesceAsyncIterable(iterateReadableStream(input));\n }\n\n if (typeof (input as AsyncIterable)[Symbol.asyncIterator] === 'function') {\n return coalesceAsyncIterable(input as AsyncIterable);\n }\n\n return coalesceAsyncIterable(input as AsyncIterable);\n}\n\nclass BytesInputSource implements PreparedInputSource {\n readonly kind = 'bytes' as const;\n readonly replayable = true;\n readonly byteLength: number;\n readonly formatHint?: ImageFormat;\n readonly headerBytes: Uint8Array;\n readonly done = true;\n\n constructor(private readonly bytes: Uint8Array, formatHint?: ImageFormat) {\n this.byteLength = bytes.byteLength;\n this.headerBytes = bytes.subarray(0, Math.min(bytes.byteLength, INSPECT_TARGETS.at(-1)!));\n this.formatHint = formatHint;\n }\n\n async ensureHeaderBytes(target: number): Promise {\n return this.bytes.subarray(0, Math.min(this.bytes.byteLength, target));\n }\n\n open(): AsyncIterable {\n const bytes = this.bytes;\n return (async function* openBytes() {\n yield bytes;\n })();\n }\n}\n\nclass StreamInputSource implements PreparedInputSource {\n readonly kind = 'stream' as const;\n readonly replayable = false;\n readonly byteLength?: number;\n readonly formatHint?: ImageFormat;\n\n private readonly iterator: AsyncIterator;\n private peekedChunks: Uint8Array[] = [];\n private peekedBytes = 0;\n private opened = false;\n private exhausted = false;\n headerBytes: Uint8Array = new Uint8Array(0);\n\n constructor(input: AsyncIterable, formatHint?: ImageFormat, byteLength?: number) {\n this.iterator = input[Symbol.asyncIterator]();\n this.formatHint = formatHint;\n this.byteLength = byteLength;\n }\n\n get done(): boolean {\n return this.exhausted;\n }\n\n async ensureHeaderBytes(target: number): Promise {\n while (!this.exhausted && this.peekedBytes < target) {\n const { value, done } = await this.iterator.next();\n if (done) {\n this.exhausted = true;\n break;\n }\n\n if (value && value.byteLength > 0) {\n const chunk = normalizeChunk(value);\n this.peekedChunks.push(chunk);\n this.peekedBytes += chunk.byteLength;\n }\n }\n\n this.headerBytes = concatChunks(this.peekedChunks, this.peekedBytes) as Uint8Array;\n return this.headerBytes;\n }\n\n open(): AsyncIterable {\n if (this.opened) {\n throw new Error('Input source can only be opened once');\n }\n\n this.opened = true;\n const replay = this.peekedChunks.slice();\n const iterator = this.iterator;\n\n return (async function* openStream() {\n for (const chunk of replay) {\n yield chunk;\n }\n\n while (true) {\n const { value, done } = await iterator.next();\n if (done) {\n return;\n }\n\n if (value && value.byteLength > 0) {\n yield normalizeChunk(value);\n }\n }\n })();\n }\n}\n\nfunction isInputSource(value: ByteInput | InputSource): value is PreparedInputSource {\n return typeof value === 'object' && value !== null && 'open' in value && 'headerBytes' in value;\n}\n\nfunction toUint8Array(input: ArrayBuffer | Uint8Array): Uint8Array {\n return input instanceof Uint8Array ? normalizeChunk(input) : new Uint8Array(input);\n}\n\nasync function sourceFromRequestLike(input: Request | Response): Promise {\n const contentType = input.headers.get('content-type') ?? '';\n const hint = contentType.startsWith('image/') ? (contentType.slice('image/'.length) as ImageFormat) : undefined;\n const lengthHeader = input.headers.get('content-length');\n const byteLength = lengthHeader ? Number(lengthHeader) : undefined;\n\n if (input.body) {\n return new StreamInputSource(getAsyncIterable(input.body as ReadableStream), hint, Number.isFinite(byteLength) ? byteLength : undefined);\n }\n\n const bytes = new Uint8Array(await input.arrayBuffer());\n return new BytesInputSource(bytes, hint);\n}\n\nexport async function prepareInputSource(input: ByteInput | InputSource): Promise {\n if (isInputSource(input)) {\n return input;\n }\n\n if (input instanceof ArrayBuffer || input instanceof Uint8Array) {\n return new BytesInputSource(toUint8Array(input));\n }\n\n if (typeof Blob !== 'undefined' && input instanceof Blob) {\n return new BytesInputSource(new Uint8Array(await input.arrayBuffer()));\n }\n\n if (typeof Request !== 'undefined' && input instanceof Request) {\n return sourceFromRequestLike(input);\n }\n\n if (typeof Response !== 'undefined' && input instanceof Response) {\n return sourceFromRequestLike(input);\n }\n\n if (typeof ReadableStream !== 'undefined' && input instanceof ReadableStream) {\n return new StreamInputSource(getAsyncIterable(input));\n }\n\n return new StreamInputSource(getAsyncIterable(input as AsyncIterable));\n}\n\nexport async function inspect(input: ByteInput): Promise {\n const source = await prepareInputSource(input);\n const info = await inspectSource(source);\n\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n return { info, source };\n}\n\nexport async function inspectSource(source: PreparedInputSource): Promise {\n let best = probe(source.headerBytes);\n if (best.format !== 'unknown') {\n return best;\n }\n\n for (const target of INSPECT_TARGETS) {\n const bytes = await source.ensureHeaderBytes(target);\n best = probe(bytes);\n if (best.format !== 'unknown') {\n return best;\n }\n }\n\n if (source.headerBytes.byteLength === 0) {\n return { format: 'unknown', width: 0, height: 0, hasAlpha: false };\n }\n\n return probe(source.headerBytes);\n}\n\nexport async function collectSourceBytes(source: InputSource): Promise {\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n for await (const chunk of source.open()) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n\n return concatChunks(chunks, total);\n}\n\nexport function asArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return sliceArrayBuffer(bytes);\n}\n","import type { ResizeState, Scanline } from './types';\n\n/**\n * Create a resize state for scanline-based bilinear interpolation\n *\n * This implements memory-efficient resizing that only needs 2 source rows\n * in memory at any time, regardless of image size.\n */\nexport function createResizeState(\n srcWidth: number,\n srcHeight: number,\n dstWidth: number,\n dstHeight: number\n): ResizeState {\n return {\n srcWidth,\n srcHeight,\n dstWidth,\n dstHeight,\n bufferA: null,\n bufferB: null,\n bufferAY: -1,\n bufferBY: -1,\n currentOutputY: 0,\n };\n}\n\n/**\n * Horizontally resize a single scanline using bilinear interpolation\n *\n * @param src - Source scanline (RGB, 3 bytes per pixel)\n * @param srcWidth - Source width\n * @param dstWidth - Destination width\n * @returns Resized scanline\n */\nfunction resizeRowHorizontal(\n src: Uint8Array,\n srcWidth: number,\n dstWidth: number\n): Uint8Array {\n const dst = new Uint8Array(dstWidth * 3);\n const xScale = srcWidth / dstWidth;\n\n for (let dstX = 0; dstX < dstWidth; dstX++) {\n // Map destination X to source X\n const srcXFloat = dstX * xScale;\n const srcX0 = Math.floor(srcXFloat);\n const srcX1 = Math.min(srcX0 + 1, srcWidth - 1);\n const t = srcXFloat - srcX0;\n const invT = 1 - t;\n\n // Source pixel offsets\n const src0 = srcX0 * 3;\n const src1 = srcX1 * 3;\n const dstOffset = dstX * 3;\n\n // Bilinear interpolation for RGB\n dst[dstOffset] = Math.round(src[src0] * invT + src[src1] * t);\n dst[dstOffset + 1] = Math.round(src[src0 + 1] * invT + src[src1 + 1] * t);\n dst[dstOffset + 2] = Math.round(src[src0 + 2] * invT + src[src1 + 2] * t);\n }\n\n return dst;\n}\n\n/**\n * Blend two horizontally-resized rows vertically\n *\n * @param rowA - First row (already horizontally resized)\n * @param rowB - Second row (already horizontally resized)\n * @param t - Blend factor (0 = all rowA, 1 = all rowB)\n * @param width - Width in pixels\n * @returns Blended row\n */\nfunction blendRows(\n rowA: Uint8Array,\n rowB: Uint8Array,\n t: number,\n width: number\n): Uint8Array {\n const result = new Uint8Array(width * 3);\n const invT = 1 - t;\n\n for (let i = 0; i < width * 3; i++) {\n result[i] = Math.round(rowA[i] * invT + rowB[i] * t);\n }\n\n return result;\n}\n\n/**\n * Process a source scanline and potentially output resized scanlines\n *\n * This is the core of the streaming resize algorithm. Call this for each\n * source scanline in order (y = 0, 1, 2, ...). It will return output\n * scanlines as they become available.\n *\n * Memory usage: Only keeps 2 horizontally-resized rows in memory at a time\n *\n * @param state - Resize state (mutated)\n * @param srcScanline - Source scanline (RGB, 3 bytes per pixel)\n * @param srcY - Source Y position (must be called in order)\n * @returns Array of output scanlines (may be 0, 1, or more)\n */\nexport function processScanline(\n state: ResizeState,\n srcScanline: Uint8Array,\n srcY: number\n): Scanline[] {\n const { srcWidth, srcHeight, dstWidth, dstHeight } = state;\n const yScale = srcHeight / dstHeight;\n const output: Scanline[] = [];\n\n // Horizontally resize this source row\n const resizedRow = resizeRowHorizontal(srcScanline, srcWidth, dstWidth);\n\n // Update buffers - rotate A ← B, B ← new\n state.bufferA = state.bufferB;\n state.bufferAY = state.bufferBY;\n state.bufferB = resizedRow;\n state.bufferBY = srcY;\n\n // Generate output rows that fall within [bufferAY, bufferBY]\n while (state.currentOutputY < dstHeight) {\n const srcYFloat = state.currentOutputY * yScale;\n const srcYFloor = Math.floor(srcYFloat);\n const srcYCeil = Math.min(srcYFloor + 1, srcHeight - 1);\n\n // Can we generate this output row with current buffers?\n if (srcYCeil > srcY) {\n // Need more source rows\n break;\n }\n\n // Handle edge cases at the beginning\n if (state.bufferA === null) {\n // First row - just use bufferB\n output.push({\n data: state.bufferB,\n width: dstWidth,\n y: state.currentOutputY,\n });\n state.currentOutputY++;\n continue;\n }\n\n // Both buffers available - do bilinear blend\n const t = srcYFloat - srcYFloor;\n\n // Determine which buffers to use\n let rowA = state.bufferA;\n let rowB = state.bufferB;\n\n // If srcYFloor matches bufferBY, we need to use bufferB for both\n if (srcYFloor === state.bufferBY) {\n rowA = state.bufferB;\n rowB = state.bufferB;\n } else if (srcYCeil === state.bufferAY) {\n // Edge case: use bufferA for both\n rowA = state.bufferA;\n rowB = state.bufferA;\n }\n\n const blended = blendRows(rowA, rowB, t, dstWidth);\n output.push({\n data: blended,\n width: dstWidth,\n y: state.currentOutputY,\n });\n\n state.currentOutputY++;\n }\n\n return output;\n}\n\n/**\n * Flush any remaining output rows after all source rows have been processed\n *\n * @param state - Resize state\n * @returns Remaining output scanlines\n */\nexport function flushResize(state: ResizeState): Scanline[] {\n const output: Scanline[] = [];\n\n // Generate any remaining rows using the last available buffer\n while (state.currentOutputY < state.dstHeight) {\n if (state.bufferB === null) break;\n\n output.push({\n data: state.bufferB,\n width: state.dstWidth,\n y: state.currentOutputY,\n });\n state.currentOutputY++;\n }\n\n return output;\n}\n\n/**\n * Calculate target dimensions while preserving aspect ratio\n *\n * @param srcWidth - Source width\n * @param srcHeight - Source height\n * @param maxWidth - Maximum target width\n * @param maxHeight - Maximum target height\n * @returns Target dimensions\n */\nexport function calculateTargetDimensions(\n srcWidth: number,\n srcHeight: number,\n maxWidth: number,\n maxHeight: number\n): { width: number; height: number; scale: number } {\n const scaleX = maxWidth / srcWidth;\n const scaleY = maxHeight / srcHeight;\n const scale = Math.min(scaleX, scaleY, 1); // Never upscale\n\n return {\n width: Math.round(srcWidth * scale),\n height: Math.round(srcHeight * scale),\n scale,\n };\n}\n\n/**\n * Calculate optimal JPEG DCT scale factor\n *\n * JPEG can decode at 1/1, 1/2, 1/4, or 1/8 scale using DCT scaling.\n * This dramatically reduces memory usage during decode.\n *\n * @param srcWidth - Source image width\n * @param srcHeight - Source image height\n * @param targetWidth - Desired output width\n * @param targetHeight - Desired output height\n * @returns Scale denominator (1, 2, 4, or 8)\n */\nexport function calculateDctScaleFactor(\n srcWidth: number,\n srcHeight: number,\n targetWidth: number,\n targetHeight: number\n): 1 | 2 | 4 | 8 {\n // We want the smallest DCT scale that still gives us enough pixels\n // to resize down to target dimensions without upscaling\n\n const scales: (1 | 2 | 4 | 8)[] = [8, 4, 2, 1];\n\n for (const scale of scales) {\n const scaledWidth = Math.ceil(srcWidth / scale);\n const scaledHeight = Math.ceil(srcHeight / scale);\n\n // If scaled dimensions are >= target, this scale works\n if (scaledWidth >= targetWidth && scaledHeight >= targetHeight) {\n return scale;\n }\n }\n\n // Fallback to no scaling\n return 1;\n}\n","/**\n * WASM Module Loader\n *\n * Loads the SIP WASM module with proper initialization.\n * Works in both browser and Cloudflare Workers environments.\n *\n * For Cloudflare Workers, use initWithWasmModule() in the Durable Object\n * constructor, passing the statically imported WASM module.\n */\n\nimport type { SipWasmModule } from './types';\n\nlet wasmModule: SipWasmModule | null = null;\nlet wasmPromise: Promise | null = null;\nlet precompiledWasmModule: WebAssembly.Module | null = null;\n\nfunction isCloudflareWorker(): boolean {\n const cacheStorage = (globalThis as { caches?: CacheStorage & { default?: Cache } }).caches;\n return typeof cacheStorage !== 'undefined' && typeof cacheStorage.default !== 'undefined';\n}\n\n/**\n * Check if WASM module is available\n */\nexport function isWasmAvailable(): boolean {\n return wasmModule !== null;\n}\n\n/**\n * Initialize with a pre-compiled WebAssembly.Module\n *\n * For Cloudflare Workers, import the WASM file statically and pass it here.\n * This allows workerd to pre-compile the WASM at bundle time.\n *\n * @example\n * ```typescript\n * import sipWasm from '@standardagents/sip/dist/sip.wasm';\n * import { initWithWasmModule } from '@standardagents/sip';\n *\n * // At module top level or in DO constructor\n * await initWithWasmModule(sipWasm);\n * ```\n */\nexport async function initWithWasmModule(compiledModule?: WebAssembly.Module): Promise {\n if (wasmModule) {\n return; // Already initialized\n }\n\n // Store the pre-compiled module for use in instantiateWasm callback\n if (compiledModule) {\n precompiledWasmModule = compiledModule;\n }\n\n await loadWasm();\n}\n\n/**\n * Get the WASM module, throwing if not loaded\n */\nexport function getWasmModule(): SipWasmModule {\n if (!wasmModule) {\n throw new Error('WASM module not loaded. Call loadWasm() first.');\n }\n return wasmModule;\n}\n\n/**\n * Load the WASM module\n *\n * This function is idempotent - calling it multiple times returns the same module.\n */\nexport async function loadWasm(): Promise {\n // Return cached module if already loaded\n if (wasmModule) {\n return wasmModule;\n }\n\n // Return existing promise if loading in progress\n if (wasmPromise) {\n return wasmPromise;\n }\n\n wasmPromise = doLoadWasm();\n\n try {\n wasmModule = await wasmPromise;\n return wasmModule;\n } catch (err) {\n wasmPromise = null;\n throw err;\n }\n}\n\n/**\n * Internal function to load the WASM module\n */\nasync function doLoadWasm(): Promise {\n // Check for externally provided loader first\n if (typeof globalThis !== 'undefined' && (globalThis as any).__SIP_WASM_LOADER__) {\n const loader = (globalThis as any).__SIP_WASM_LOADER__;\n return await loader();\n }\n\n // Try to dynamically import the Emscripten glue code\n try {\n // @ts-ignore - Dynamic import of built WASM module\n const createSipModule = (await import('./sip.js')).default;\n\n // Prefer an explicitly provided precompiled module in Workers/bundlers\n // before probing any environment-specific filesystem paths.\n if (precompiledWasmModule) {\n const module = await new Promise((resolve, reject) => {\n let resolvedModule: SipWasmModule | null = null;\n\n createSipModule({\n instantiateWasm: (\n imports: WebAssembly.Imports,\n receiveInstance: (instance: WebAssembly.Instance) => void\n ) => {\n WebAssembly.instantiate(precompiledWasmModule!, imports)\n .then((instance) => {\n receiveInstance(instance);\n })\n .catch((err) => {\n reject(err);\n });\n\n return {};\n },\n onRuntimeInitialized: () => {\n if (resolvedModule && resolvedModule.HEAPU8) {\n resolve(resolvedModule);\n }\n },\n }).then((mod: SipWasmModule) => {\n resolvedModule = mod;\n if (mod.HEAPU8) {\n resolve(mod);\n }\n }).catch(reject);\n });\n\n return module;\n }\n\n const isNode =\n !isCloudflareWorker() &&\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\n if (isNode) {\n const { readFile } = await import('fs/promises');\n const wasmBinary = await readFile(new URL('./sip.wasm', import.meta.url));\n const module = await createSipModule({ wasmBinary });\n return module as SipWasmModule;\n }\n\n // Standard loading (browser environment)\n const module = await createSipModule();\n return module as SipWasmModule;\n } catch (err) {\n throw new Error(\n 'SIP WASM module not available. ' +\n 'To use streaming processing, build the WASM module with `pnpm build:wasm` in the @standardagents/sip repo root. ' +\n 'Error: ' + (err instanceof Error ? err.message : String(err))\n );\n }\n}\n\n/**\n * Copy data to WASM memory\n */\nexport function copyToWasm(module: SipWasmModule, data: Uint8Array): number {\n const ptr = module._malloc(data.length);\n if (!ptr) {\n throw new Error('Failed to allocate WASM memory');\n }\n module.HEAPU8.set(data, ptr);\n return ptr;\n}\n\n/**\n * Copy data from WASM memory\n */\nexport function copyFromWasm(module: SipWasmModule, ptr: number, size: number): Uint8Array {\n return new Uint8Array(module.HEAPU8.buffer, ptr, size).slice();\n}\n","/**\n * WASM JPEG Decoder with incremental input support.\n *\n * The low-memory Worker path feeds compressed bytes into libjpeg-turbo as the\n * request body arrives, then reads scaled scanlines as soon as the decoder can\n * produce them.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule, DctScaleDenom } from './types';\nimport { copyToWasm, getWasmModule } from './loader';\n\ntype StepResult = 'ready' | 'needMore';\ntype ScanlineStep = Scanline | null | 'needMore';\n\nexport class WasmJpegDecoder {\n private readonly module: SipWasmModule;\n private decoder = 0;\n private width = 0;\n private height = 0;\n private outputWidth = 0;\n private outputHeight = 0;\n private rowBufferPtr = 0;\n private started = false;\n private finished = false;\n\n constructor() {\n this.module = getWasmModule();\n this.decoder = this.module._sip_decoder_create();\n if (!this.decoder) {\n throw new Error('Failed to create JPEG decoder');\n }\n }\n\n pushInput(data: Uint8Array, isFinal = false): void {\n if (data.byteLength === 0 && !isFinal) {\n return;\n }\n\n let ptr = 0;\n try {\n ptr = data.byteLength > 0 ? copyToWasm(this.module, data) : 0;\n if (this.module._sip_decoder_push_input(this.decoder, ptr, data.byteLength, isFinal ? 1 : 0) !== 0) {\n throw new Error('Failed to feed JPEG bytes into decoder');\n }\n } finally {\n if (ptr) {\n this.module._free(ptr);\n }\n }\n }\n\n /**\n * Compatibility helper for full-buffer callers.\n */\n init(data: ArrayBuffer | Uint8Array): { width: number; height: number } {\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n let ptr = 0;\n try {\n ptr = copyToWasm(this.module, bytes);\n if (this.module._sip_decoder_set_source(this.decoder, ptr, bytes.byteLength) !== 0) {\n throw new Error('Failed to set buffered JPEG source');\n }\n } finally {\n if (ptr) {\n this.module._free(ptr);\n }\n }\n\n const header = this.readHeaderStep();\n if (header !== 'ready') {\n throw new Error('Incomplete JPEG header');\n }\n\n return { width: this.width, height: this.height };\n }\n\n readHeaderStep(): StepResult {\n const result = this.module._sip_decoder_read_header(this.decoder);\n if (result === 1) {\n return 'needMore';\n }\n if (result !== 0) {\n throw new Error('Failed to read JPEG header');\n }\n\n this.width = this.module._sip_decoder_get_width(this.decoder);\n this.height = this.module._sip_decoder_get_height(this.decoder);\n this.outputWidth = this.width;\n this.outputHeight = this.height;\n return 'ready';\n }\n\n getDimensions(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n setScale(scaleDenom: DctScaleDenom): { width: number; height: number } {\n if (this.module._sip_decoder_set_scale(this.decoder, scaleDenom) !== 0) {\n throw new Error(`Invalid scale denominator: ${scaleDenom}`);\n }\n\n this.outputWidth = this.module._sip_decoder_get_output_width(this.decoder);\n this.outputHeight = this.module._sip_decoder_get_output_height(this.decoder);\n return { width: this.outputWidth, height: this.outputHeight };\n }\n\n getOutputDimensions(): { width: number; height: number } {\n return { width: this.outputWidth, height: this.outputHeight };\n }\n\n start(): void {\n const step = this.startStep();\n if (step !== 'ready') {\n throw new Error('JPEG decoder needs more input before starting');\n }\n }\n\n startStep(): StepResult {\n if (this.started) {\n return 'ready';\n }\n\n const result = this.module._sip_decoder_start(this.decoder);\n if (result === 1) {\n return 'needMore';\n }\n if (result !== 0) {\n throw new Error('Failed to start JPEG decompression');\n }\n\n this.rowBufferPtr = this.module._sip_decoder_get_row_buffer(this.decoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get JPEG decoder row buffer');\n }\n\n this.started = true;\n return 'ready';\n }\n\n readScanline(): Scanline | null {\n const result = this.readScanlineStep();\n if (result === 'needMore') {\n throw new Error('JPEG decoder needs more input');\n }\n return result;\n }\n\n readScanlineStep(): ScanlineStep {\n if (!this.started || this.finished) {\n return null;\n }\n\n const result = this.module._sip_decoder_read_scanline(this.decoder);\n if (result === 2) {\n return 'needMore';\n }\n if (result === 0) {\n this.finished = true;\n return null;\n }\n if (result !== 1) {\n throw new Error('Failed to read JPEG scanline');\n }\n\n const rowSize = this.outputWidth * 3;\n const data = new Uint8Array(this.module.HEAPU8.buffer, this.rowBufferPtr, rowSize).slice();\n const y = this.module._sip_decoder_get_scanline(this.decoder) - 1;\n\n return { data, width: this.outputWidth, y };\n }\n\n finishStep(): StepResult {\n const result = this.module._sip_decoder_finish(this.decoder);\n if (result === 1) {\n return 'needMore';\n }\n if (result !== 0) {\n throw new Error('Failed to finish JPEG decompression');\n }\n\n return 'ready';\n }\n\n getBufferedInputSize(): number {\n return this.module._sip_decoder_get_buffered_input_size(this.decoder);\n }\n\n getRowBufferSize(): number {\n return this.module._sip_decoder_get_working_size(this.decoder);\n }\n\n dispose(): void {\n if (this.decoder) {\n this.module._sip_decoder_destroy(this.decoder);\n this.decoder = 0;\n }\n\n this.rowBufferPtr = 0;\n this.started = false;\n this.finished = false;\n }\n}\n\n/**\n * Calculate optimal DCT scale factor for a target size.\n */\nexport function calculateOptimalScale(\n srcWidth: number,\n srcHeight: number,\n targetWidth: number,\n targetHeight: number\n): DctScaleDenom {\n const scales: DctScaleDenom[] = [8, 4, 2, 1];\n\n for (const scale of scales) {\n const scaledWidth = Math.ceil(srcWidth / scale);\n const scaledHeight = Math.ceil(srcHeight / scale);\n\n if (scaledWidth >= targetWidth && scaledHeight >= targetHeight) {\n return scale;\n }\n }\n\n return 1;\n}\n","/**\n * WASM JPEG Encoder with chunked output draining.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule } from './types';\nimport { copyFromWasm, getWasmModule } from './loader';\n\nexport class WasmJpegEncoder {\n private readonly module: SipWasmModule;\n private encoder = 0;\n private width = 0;\n private height = 0;\n private rowBufferPtr = 0;\n private started = false;\n private finished = false;\n private currentLine = 0;\n\n constructor() {\n this.module = getWasmModule();\n this.encoder = this.module._sip_encoder_create();\n if (!this.encoder) {\n throw new Error('Failed to create JPEG encoder');\n }\n }\n\n init(width: number, height: number, quality = 85): void {\n this.width = width;\n this.height = height;\n\n if (this.module._sip_encoder_init(this.encoder, width, height, quality) !== 0) {\n throw new Error('Failed to initialize JPEG encoder');\n }\n }\n\n start(): void {\n if (this.started) {\n return;\n }\n\n if (this.module._sip_encoder_start(this.encoder) !== 0) {\n throw new Error('Failed to start JPEG compression');\n }\n\n this.rowBufferPtr = this.module._sip_encoder_get_row_buffer(this.encoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get JPEG encoder row buffer');\n }\n\n this.started = true;\n this.currentLine = 0;\n }\n\n writeScanline(scanline: Scanline): void {\n this.writeScanlineData(scanline.data);\n }\n\n writeScanlineData(data: Uint8Array): void {\n if (!this.started || this.finished) {\n throw new Error('Encoder is not ready for scanlines');\n }\n\n const expectedSize = this.width * 3;\n if (data.byteLength !== expectedSize) {\n throw new Error(`Invalid scanline size: expected ${expectedSize}, got ${data.byteLength}`);\n }\n\n this.module.HEAPU8.set(data, this.rowBufferPtr);\n if (this.module._sip_encoder_write_scanline(this.encoder) !== 1) {\n throw new Error('Failed to write JPEG scanline');\n }\n\n this.currentLine++;\n }\n\n drainChunks(): Uint8Array[] {\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const ptr = this.module._sip_encoder_peek_chunk_data(this.encoder);\n const size = this.module._sip_encoder_peek_chunk_size(this.encoder);\n if (!ptr || !size) {\n break;\n }\n\n chunks.push(copyFromWasm(this.module, ptr, size));\n this.module._sip_encoder_pop_chunk(this.encoder);\n }\n\n return chunks;\n }\n\n finish(): Uint8Array[] {\n if (!this.started) {\n throw new Error('Encoding not started');\n }\n if (this.finished) {\n return [];\n }\n if (this.currentLine !== this.height) {\n throw new Error(`Incomplete image: wrote ${this.currentLine}/${this.height} scanlines`);\n }\n\n if (this.module._sip_encoder_finish(this.encoder) !== 0) {\n throw new Error('Failed to finish JPEG compression');\n }\n\n this.finished = true;\n return this.drainChunks();\n }\n\n encodeAll(pixels: Uint8Array): ArrayBuffer {\n this.start();\n\n const rowSize = this.width * 3;\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n for (let y = 0; y < this.height; y++) {\n this.writeScanlineData(pixels.subarray(y * rowSize, (y + 1) * rowSize));\n for (const chunk of this.drainChunks()) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n }\n\n for (const chunk of this.finish()) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return merged.buffer.slice(merged.byteOffset, merged.byteOffset + merged.byteLength);\n }\n\n getBufferedOutputSize(): number {\n return this.module._sip_encoder_get_buffered_output_size(this.encoder);\n }\n\n getRowBufferSize(): number {\n return this.width * 3;\n }\n\n getCurrentLine(): number {\n return this.currentLine;\n }\n\n dispose(): void {\n if (this.encoder) {\n this.module._sip_encoder_destroy(this.encoder);\n this.encoder = 0;\n }\n\n this.rowBufferPtr = 0;\n this.started = false;\n this.finished = false;\n this.currentLine = 0;\n }\n}\n\n","/**\n * WASM PNG Decoder with Row-by-Row Processing\n *\n * Memory-efficient PNG decoding using libspng's progressive API.\n * Decodes one row at a time to minimize memory usage.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule } from './types';\nimport { getWasmModule, copyToWasm } from './loader';\n\n/**\n * WASM-based PNG decoder with row-by-row decoding\n */\nexport class WasmPngDecoder {\n private module: SipWasmModule;\n private decoder: number = 0;\n private dataPtr: number = 0;\n private width: number = 0;\n private height: number = 0;\n private hasAlpha: boolean = false;\n private rowBufferPtr: number = 0;\n private started: boolean = false;\n private finished: boolean = false;\n private currentRow: number = 0;\n\n constructor() {\n this.module = getWasmModule();\n }\n\n /**\n * Initialize decoder with PNG data\n */\n init(data: ArrayBuffer | Uint8Array): {\n width: number;\n height: number;\n hasAlpha: boolean;\n } {\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n\n // Create decoder\n this.decoder = this.module._sip_png_decoder_create();\n if (!this.decoder) {\n throw new Error('Failed to create PNG decoder');\n }\n\n // Copy data to WASM memory\n this.dataPtr = copyToWasm(this.module, bytes);\n\n // Set source\n if (this.module._sip_png_decoder_set_source(this.decoder, this.dataPtr, bytes.length) !== 0) {\n this.dispose();\n throw new Error('Failed to set PNG decoder source');\n }\n\n // Read header\n if (this.module._sip_png_decoder_read_header(this.decoder) !== 0) {\n this.dispose();\n throw new Error('Failed to read PNG header');\n }\n\n this.width = this.module._sip_png_decoder_get_width(this.decoder);\n this.height = this.module._sip_png_decoder_get_height(this.decoder);\n this.hasAlpha = this.module._sip_png_decoder_has_alpha(this.decoder) !== 0;\n\n return { width: this.width, height: this.height, hasAlpha: this.hasAlpha };\n }\n\n /**\n * Get image dimensions\n */\n getDimensions(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n /**\n * Check if image has alpha channel\n */\n getHasAlpha(): boolean {\n return this.hasAlpha;\n }\n\n /**\n * Start decoding\n */\n start(): void {\n if (!this.decoder) {\n throw new Error('Decoder not initialized');\n }\n if (this.started) {\n throw new Error('Decoding already started');\n }\n\n if (this.module._sip_png_decoder_start(this.decoder) !== 0) {\n throw new Error('Failed to start PNG decompression');\n }\n\n this.rowBufferPtr = this.module._sip_png_decoder_get_row_buffer(this.decoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get row buffer');\n }\n\n this.started = true;\n this.currentRow = 0;\n }\n\n /**\n * Read next scanline\n *\n * @returns Scanline object or null if no more scanlines\n */\n readScanline(): Scanline | null {\n if (!this.started || this.finished) {\n return null;\n }\n\n if (this.currentRow >= this.height) {\n this.finished = true;\n return null;\n }\n\n const result = this.module._sip_png_decoder_read_row(this.decoder);\n\n if (result < 0) {\n throw new Error('Failed to read PNG row');\n }\n\n // Copy scanline data (RGB = 3 bytes per pixel)\n const rowSize = this.width * 3;\n const data = new Uint8Array(\n this.module.HEAPU8.buffer,\n this.rowBufferPtr,\n rowSize\n ).slice();\n\n const y = this.currentRow;\n this.currentRow++;\n\n // Check if done after reading this row\n if (result === 0 || this.currentRow >= this.height) {\n this.finished = true;\n }\n\n return {\n data,\n width: this.width,\n y,\n };\n }\n\n /**\n * Read all remaining scanlines\n *\n * @yields Scanline objects\n */\n *readAllScanlines(): Generator {\n let scanline: Scanline | null;\n while ((scanline = this.readScanline()) !== null) {\n yield scanline;\n }\n }\n\n /**\n * Decode entire image to RGB buffer\n *\n * @returns Full RGB pixel buffer\n */\n decodeAll(): { pixels: Uint8Array; width: number; height: number } {\n if (!this.started) {\n this.start();\n }\n\n const pixels = new Uint8Array(this.width * this.height * 3);\n const rowSize = this.width * 3;\n\n for (const scanline of this.readAllScanlines()) {\n pixels.set(scanline.data, scanline.y * rowSize);\n }\n\n return {\n pixels,\n width: this.width,\n height: this.height,\n };\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.decoder) {\n this.module._sip_png_decoder_destroy(this.decoder);\n this.decoder = 0;\n }\n\n if (this.dataPtr) {\n this.module._free(this.dataPtr);\n this.dataPtr = 0;\n }\n\n this.started = false;\n this.finished = false;\n this.rowBufferPtr = 0;\n this.currentRow = 0;\n }\n}\n","import { createDecoder } from './decoders/simple';\nimport { asArrayBuffer, collectSourceBytes, inspect, inspectSource, prepareInputSource } from './input';\nimport { probe } from './probe';\nimport {\n calculateTargetDimensions,\n createResizeState,\n flushResize,\n processScanline,\n} from './resize';\nimport type {\n ByteInput,\n EncodedImage,\n EncodedImageInfo,\n ImageInfo,\n InputSource,\n PixelStream,\n Scanline,\n TransformOptions,\n TransformStats,\n} from './types';\nimport {\n WasmJpegDecoder,\n WasmJpegEncoder,\n WasmPngDecoder,\n calculateOptimalScale,\n initWithWasmModule,\n loadWasm,\n} from './wasm';\n\nconst DEFAULT_QUALITY = 85;\n\ntype StatsResolver = {\n resolve: (value: TransformStats) => void;\n reject: (reason?: unknown) => void;\n promise: Promise;\n};\n\ntype InfoResolver = {\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n promise: Promise;\n};\n\ntype PreparedSource = Awaited>;\n\nfunction createDeferred(): InfoResolver {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { resolve, reject, promise };\n}\n\nfunction makeEmptyStats(): TransformStats {\n return {\n peakPipelineBytes: 0,\n peakCodecBytes: 0,\n peakBufferedInputBytes: 0,\n peakBufferedOutputBytes: 0,\n bytesIn: 0,\n bytesOut: 0,\n notes: [],\n };\n}\n\nfunction concatUint8Arrays(chunks: Uint8Array[]): Uint8Array {\n let total = 0;\n for (const chunk of chunks) {\n total += chunk.byteLength;\n }\n\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return merged;\n}\n\nfunction readJpegOrientation(bytes: Uint8Array): number | null {\n if (bytes.byteLength < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8) {\n return null;\n }\n\n let offset = 2;\n while (offset + 4 <= bytes.byteLength) {\n if (bytes[offset] !== 0xff) {\n offset++;\n continue;\n }\n\n while (offset < bytes.byteLength && bytes[offset] === 0xff) {\n offset++;\n }\n\n if (offset >= bytes.byteLength) {\n break;\n }\n\n const marker = bytes[offset++];\n if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {\n continue;\n }\n if (marker === 0xd9 || marker === 0xda) {\n break;\n }\n if (offset + 2 > bytes.byteLength) {\n break;\n }\n\n const segmentLength = (bytes[offset] << 8) | bytes[offset + 1];\n if (segmentLength < 2 || offset + segmentLength > bytes.byteLength) {\n break;\n }\n\n const segmentStart = offset + 2;\n const payloadLength = segmentLength - 2;\n if (\n marker === 0xe1 &&\n payloadLength >= 14 &&\n bytes[segmentStart] === 0x45 &&\n bytes[segmentStart + 1] === 0x78 &&\n bytes[segmentStart + 2] === 0x69 &&\n bytes[segmentStart + 3] === 0x66 &&\n bytes[segmentStart + 4] === 0x00 &&\n bytes[segmentStart + 5] === 0x00\n ) {\n const tiff = segmentStart + 6;\n if (tiff + 8 > bytes.byteLength) {\n return null;\n }\n\n const littleEndian = bytes[tiff] === 0x49 && bytes[tiff + 1] === 0x49;\n const bigEndian = bytes[tiff] === 0x4d && bytes[tiff + 1] === 0x4d;\n if (!littleEndian && !bigEndian) {\n return null;\n }\n\n const read16 = (index: number) => (\n littleEndian\n ? bytes[index] | (bytes[index + 1] << 8)\n : (bytes[index] << 8) | bytes[index + 1]\n );\n const read32 = (index: number) => (\n littleEndian\n ? (bytes[index] |\n (bytes[index + 1] << 8) |\n (bytes[index + 2] << 16) |\n (bytes[index + 3] << 24)) >>> 0\n : ((bytes[index] << 24) |\n (bytes[index + 1] << 16) |\n (bytes[index + 2] << 8) |\n bytes[index + 3]) >>> 0\n );\n\n const ifdOffset = read32(tiff + 4);\n const ifdStart = tiff + ifdOffset;\n if (ifdStart + 2 > bytes.byteLength) {\n return null;\n }\n\n const entryCount = read16(ifdStart);\n for (let i = 0; i < entryCount; i++) {\n const entry = ifdStart + 2 + (i * 12);\n if (entry + 12 > bytes.byteLength) {\n return null;\n }\n\n const tag = read16(entry);\n if (tag !== 0x0112) {\n continue;\n }\n\n const type = read16(entry + 2);\n const count = read32(entry + 4);\n if (type !== 3 || count !== 1) {\n return null;\n }\n\n const valueOffset = entry + 8;\n return littleEndian\n ? bytes[valueOffset] | (bytes[valueOffset + 1] << 8)\n : (bytes[valueOffset] << 8) | bytes[valueOffset + 1];\n }\n }\n\n offset += segmentLength;\n }\n\n return null;\n}\n\nfunction buildExifOrientationSegment(orientation: number): Uint8Array | null {\n if (!Number.isInteger(orientation) || orientation < 2 || orientation > 8) {\n return null;\n }\n\n const payload = new Uint8Array([\n 0x45, 0x78, 0x69, 0x66, 0x00, 0x00,\n 0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00,\n 0x01, 0x00,\n 0x12, 0x01,\n 0x03, 0x00,\n 0x01, 0x00, 0x00, 0x00,\n orientation & 0xff, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n ]);\n const length = payload.byteLength + 2;\n const segment = new Uint8Array(payload.byteLength + 4);\n segment[0] = 0xff;\n segment[1] = 0xe1;\n segment[2] = (length >> 8) & 0xff;\n segment[3] = length & 0xff;\n segment.set(payload, 4);\n return segment;\n}\n\nfunction injectJpegApp1Segment(chunk: Uint8Array, segment: Uint8Array): Uint8Array {\n if (chunk.byteLength < 2 || chunk[0] !== 0xff || chunk[1] !== 0xd8) {\n return concatUint8Arrays([chunk, segment]);\n }\n\n const merged = new Uint8Array(chunk.byteLength + segment.byteLength);\n merged[0] = 0xff;\n merged[1] = 0xd8;\n merged.set(segment, 2);\n merged.set(chunk.subarray(2), 2 + segment.byteLength);\n return merged;\n}\n\nasync function readJpegOrientationFromSource(source: {\n headerBytes: Uint8Array;\n ensureHeaderBytes(target: number): Promise;\n}): Promise {\n const direct = readJpegOrientation(source.headerBytes);\n if (direct !== null) {\n return direct;\n }\n\n const extended = await source.ensureHeaderBytes(262_144);\n return readJpegOrientation(extended);\n}\n\nclass StatsTracker {\n readonly stats = makeEmptyStats();\n\n constructor(note?: string) {\n if (note) {\n this.note(note);\n }\n }\n\n note(message: string): void {\n if (!this.stats.notes.includes(message)) {\n this.stats.notes.push(message);\n }\n }\n\n addBytesIn(bytes: number): void {\n this.stats.bytesIn += bytes;\n }\n\n addBytesOut(bytes: number): void {\n this.stats.bytesOut += bytes;\n }\n\n update(bufferedInput: number, bufferedOutput: number, codecBytes: number, pipelineBytes: number): void {\n this.stats.peakBufferedInputBytes = Math.max(this.stats.peakBufferedInputBytes, bufferedInput);\n this.stats.peakBufferedOutputBytes = Math.max(this.stats.peakBufferedOutputBytes, bufferedOutput);\n this.stats.peakCodecBytes = Math.max(this.stats.peakCodecBytes, codecBytes);\n this.stats.peakPipelineBytes = Math.max(this.stats.peakPipelineBytes, pipelineBytes);\n }\n\n snapshot(): TransformStats {\n return { ...this.stats, notes: [...this.stats.notes] };\n }\n}\n\nfunction normalizeBox(options: TransformOptions, width: number, height: number) {\n return calculateTargetDimensions(\n width,\n height,\n options.width ?? width,\n options.height ?? height\n );\n}\n\nfunction createPixelStream(\n iteratorFactory: () => AsyncIterable,\n info: Promise<{ width: number; height: number; originalFormat: Exclude }>,\n stats: Promise = Promise.resolve(makeEmptyStats())\n): PixelStream {\n return {\n info,\n stats,\n [Symbol.asyncIterator]() {\n return iteratorFactory()[Symbol.asyncIterator]();\n },\n };\n}\n\nfunction createEncodedImage(\n iteratorFactory: () => AsyncIterable,\n info: Promise,\n stats: Promise\n): EncodedImage {\n return {\n info,\n stats,\n [Symbol.asyncIterator]() {\n return iteratorFactory()[Symbol.asyncIterator]();\n },\n };\n}\n\nasync function* iterateUint8ArrayRows(\n pixels: Uint8Array,\n width: number,\n height: number\n): AsyncIterable {\n const rowSize = width * 3;\n for (let y = 0; y < height; y++) {\n yield {\n data: pixels.subarray(y * rowSize, (y + 1) * rowSize),\n width,\n y,\n };\n }\n}\n\nasync function* iterateInputChunks(source: InputSource): AsyncIterable<{\n chunk: Uint8Array;\n isFinal: boolean;\n}> {\n const iterator = source.open()[Symbol.asyncIterator]();\n let current = await iterator.next();\n\n if (current.done) {\n return;\n }\n\n while (true) {\n const next = await iterator.next();\n yield {\n chunk: current.value,\n isFinal: next.done === true,\n };\n\n if (next.done === true) {\n return;\n }\n\n current = next;\n }\n}\n\nasync function* decodeSourceInternal(\n input: ByteInput | InputSource\n): AsyncIterable {\n const prepared = await prepareInputSource(input);\n const info = await inspectSource(prepared);\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n await loadWasm();\n\n if (info.format === 'jpeg') {\n const decoder = new WasmJpegDecoder();\n try {\n if (prepared.kind === 'bytes') {\n const bytes = await collectSourceBytes(prepared);\n decoder.init(asArrayBuffer(bytes));\n decoder.start();\n\n while (true) {\n const scanline = decoder.readScanline();\n if (!scanline) {\n break;\n }\n yield scanline;\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n return;\n }\n\n let headerReady = false;\n let started = false;\n\n for await (const { chunk, isFinal } of iterateInputChunks(prepared)) {\n decoder.pushInput(chunk, isFinal);\n\n if (!headerReady) {\n const headerStep = decoder.readHeaderStep();\n if (headerStep === 'ready') {\n headerReady = true;\n } else {\n continue;\n }\n }\n\n if (!started) {\n const startStep = decoder.startStep();\n if (startStep === 'ready') {\n started = true;\n } else {\n continue;\n }\n }\n\n while (true) {\n const scanline = decoder.readScanlineStep();\n if (scanline === 'needMore') {\n break;\n }\n if (scanline === null) {\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n return;\n }\n yield scanline;\n }\n }\n\n if (!headerReady) {\n if (decoder.readHeaderStep() !== 'ready') {\n throw new Error('Incomplete JPEG image');\n }\n headerReady = true;\n }\n\n if (!started) {\n if (decoder.startStep() !== 'ready') {\n throw new Error('Incomplete JPEG image');\n }\n started = true;\n }\n\n while (true) {\n const scanline = decoder.readScanlineStep();\n if (scanline === 'needMore') {\n throw new Error('Unexpected end of JPEG input');\n }\n if (scanline === null) {\n break;\n }\n yield scanline;\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n return;\n } finally {\n decoder.dispose();\n }\n }\n\n const bytes = await collectSourceBytes(prepared);\n const buffer = asArrayBuffer(bytes);\n\n if (info.format === 'png') {\n const decoder = new WasmPngDecoder();\n try {\n decoder.init(buffer);\n decoder.start();\n for (const scanline of decoder.readAllScanlines()) {\n yield scanline;\n }\n } finally {\n decoder.dispose();\n }\n return;\n }\n\n const decoder = await createDecoder(info.format, buffer);\n try {\n const decoded = await decoder.decode();\n yield* iterateUint8ArrayRows(decoded.pixels, decoded.width, decoded.height);\n } finally {\n decoder.dispose();\n }\n}\n\nexport function decode(input: ByteInput | InputSource): PixelStream {\n const infoDeferred = createDeferred<{ width: number; height: number; originalFormat: Exclude }>();\n\n const iteratorFactory = () => (async function* decodeIterator() {\n const prepared = await prepareInputSource(input);\n const info = await inspectSource(prepared);\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n infoDeferred.resolve({\n width: info.width,\n height: info.height,\n originalFormat: info.format,\n });\n\n yield* decodeSourceInternal(prepared);\n })();\n\n return createPixelStream(iteratorFactory, infoDeferred.promise);\n}\n\nexport function resize(stream: PixelStream, options: TransformOptions): PixelStream {\n const infoPromise = stream.info.then((info) => {\n const target = normalizeBox(options, info.width, info.height);\n return {\n width: target.width,\n height: target.height,\n originalFormat: info.originalFormat,\n };\n });\n\n const iteratorFactory = () => (async function* resizeIterator() {\n const sourceInfo = await stream.info;\n const target = normalizeBox(options, sourceInfo.width, sourceInfo.height);\n const state = createResizeState(\n sourceInfo.width,\n sourceInfo.height,\n target.width,\n target.height\n );\n\n for await (const scanline of stream) {\n const output = processScanline(state, scanline.data, scanline.y);\n for (const next of output) {\n yield next;\n }\n }\n\n for (const next of flushResize(state)) {\n yield next;\n }\n })();\n\n return createPixelStream(iteratorFactory, infoPromise, stream.stats ?? Promise.resolve(makeEmptyStats()));\n}\n\nexport function encodeJpeg(stream: PixelStream, options: TransformOptions = {}): EncodedImage {\n const quality = options.quality ?? DEFAULT_QUALITY;\n const infoPromise = stream.info.then((info) => ({\n width: info.width,\n height: info.height,\n mimeType: 'image/jpeg' as const,\n originalFormat: info.originalFormat,\n }));\n\n const statsPromise = stream.stats ?? Promise.resolve(makeEmptyStats());\n\n const iteratorFactory = () => (async function* encodeIterator() {\n await loadWasm();\n const info = await stream.info;\n const encoder = new WasmJpegEncoder();\n\n try {\n encoder.init(info.width, info.height, quality);\n encoder.start();\n\n for await (const scanline of stream) {\n encoder.writeScanline(scanline);\n for (const chunk of encoder.drainChunks()) {\n yield chunk;\n }\n }\n\n for (const chunk of encoder.finish()) {\n yield chunk;\n }\n } finally {\n encoder.dispose();\n }\n })();\n\n return createEncodedImage(iteratorFactory, infoPromise, statsPromise);\n}\n\nasync function* runJpegTransform(\n source: PreparedSource,\n info: ImageInfo,\n options: TransformOptions,\n infoDeferred: InfoResolver,\n stats: StatsTracker\n): AsyncIterable {\n await loadWasm();\n\n const orientation = await readJpegOrientationFromSource(source);\n const orientationSegment = orientation ? buildExifOrientationSegment(orientation) : null;\n const target = normalizeBox(options, info.width, info.height);\n const decoder = new WasmJpegDecoder();\n const encoder = new WasmJpegEncoder();\n let resizeState = createResizeState(1, 1, target.width, target.height);\n let decodeWidth = info.width;\n let decodeHeight = info.height;\n const scale = calculateOptimalScale(info.width, info.height, target.width, target.height);\n let headerReady = false;\n let started = false;\n let emittedFirstChunk = false;\n\n const refresh = () => {\n const resizeBytes =\n (resizeState.bufferA?.byteLength ?? 0) +\n (resizeState.bufferB?.byteLength ?? 0);\n const codecBytes =\n decoder.getBufferedInputSize() +\n decoder.getRowBufferSize() +\n encoder.getBufferedOutputSize() +\n encoder.getRowBufferSize();\n const pipelineBytes = codecBytes + resizeBytes;\n stats.update(decoder.getBufferedInputSize(), encoder.getBufferedOutputSize(), codecBytes, pipelineBytes);\n };\n\n try {\n if (source.kind === 'bytes') {\n const bytes = await collectSourceBytes(source);\n stats.addBytesIn(bytes.byteLength);\n refresh();\n\n if (orientationSegment) {\n stats.note(`jpeg-orientation=${orientation}`);\n }\n\n decoder.init(asArrayBuffer(bytes));\n const output = decoder.setScale(scale);\n decodeWidth = output.width;\n decodeHeight = output.height;\n resizeState = createResizeState(output.width, output.height, target.width, target.height);\n encoder.init(target.width, target.height, options.quality ?? DEFAULT_QUALITY);\n encoder.start();\n decoder.start();\n headerReady = true;\n started = true;\n infoDeferred.resolve({\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: 'jpeg',\n });\n stats.note(`jpeg-dct-scale=1/${scale}`);\n stats.note(`jpeg-decoded=${decodeWidth}x${decodeHeight}`);\n refresh();\n\n while (true) {\n const scanline = decoder.readScanline();\n if (!scanline) {\n break;\n }\n\n const outputScanlines = processScanline(resizeState, scanline.data, scanline.y);\n refresh();\n\n for (const outScanline of outputScanlines) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n\n for (const outScanline of flushResize(resizeState)) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n\n for (const jpegChunk of encoder.finish()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n\n return;\n }\n\n if (orientationSegment) {\n stats.note(`jpeg-orientation=${orientation}`);\n }\n\n for await (const { chunk, isFinal } of iterateInputChunks(source)) {\n stats.addBytesIn(chunk.byteLength);\n decoder.pushInput(chunk, isFinal);\n refresh();\n\n if (!headerReady) {\n const headerStep = decoder.readHeaderStep();\n if (headerStep === 'needMore') {\n continue;\n }\n\n headerReady = true;\n const output = decoder.setScale(scale);\n decodeWidth = output.width;\n decodeHeight = output.height;\n resizeState = createResizeState(output.width, output.height, target.width, target.height);\n encoder.init(target.width, target.height, options.quality ?? DEFAULT_QUALITY);\n encoder.start();\n infoDeferred.resolve({\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: 'jpeg',\n });\n stats.note(`jpeg-dct-scale=1/${scale}`);\n stats.note(`jpeg-decoded=${decodeWidth}x${decodeHeight}`);\n refresh();\n }\n\n if (!started) {\n const startStep = decoder.startStep();\n if (startStep === 'needMore') {\n continue;\n }\n\n started = true;\n refresh();\n }\n\n while (true) {\n const scanline = decoder.readScanlineStep();\n if (scanline === 'needMore') {\n break;\n }\n if (scanline === null) {\n break;\n }\n\n const outputScanlines = processScanline(resizeState, scanline.data, scanline.y);\n refresh();\n\n for (const outScanline of outputScanlines) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n }\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n\n for (const outScanline of flushResize(resizeState)) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n\n for (const jpegChunk of encoder.finish()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n } finally {\n decoder.dispose();\n encoder.dispose();\n }\n}\n\nasync function* runBufferedTransform(\n source: PreparedSource,\n info: ImageInfo,\n options: TransformOptions,\n infoDeferred: InfoResolver,\n stats: StatsTracker\n): AsyncIterable {\n const bytes = await collectSourceBytes(source);\n stats.addBytesIn(bytes.byteLength);\n stats.update(bytes.byteLength, 0, bytes.byteLength, bytes.byteLength);\n stats.note(`${info.format}-input-buffered`);\n await loadWasm();\n\n const target = normalizeBox(options, info.width, info.height);\n const encoder = new WasmJpegEncoder();\n let scanlines: AsyncIterable;\n\n if (info.format === 'png') {\n const decoder = new WasmPngDecoder();\n decoder.init(asArrayBuffer(bytes));\n decoder.start();\n\n const state = createResizeState(info.width, info.height, target.width, target.height);\n scanlines = (async function* pngRows() {\n try {\n for (const scanline of decoder.readAllScanlines()) {\n for (const outScanline of processScanline(state, scanline.data, scanline.y)) {\n yield outScanline;\n }\n }\n\n for (const outScanline of flushResize(state)) {\n yield outScanline;\n }\n } finally {\n decoder.dispose();\n }\n })();\n } else {\n const decoder = await createDecoder(info.format, asArrayBuffer(bytes));\n const decoded = await decoder.decode();\n decoder.dispose();\n\n const state = createResizeState(decoded.width, decoded.height, target.width, target.height);\n scanlines = (async function* bufferedRows() {\n for await (const row of iterateUint8ArrayRows(decoded.pixels, decoded.width, decoded.height)) {\n for (const outScanline of processScanline(state, row.data, row.y)) {\n yield outScanline;\n }\n }\n\n for (const outScanline of flushResize(state)) {\n yield outScanline;\n }\n })();\n }\n\n infoDeferred.resolve({\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: info.format as EncodedImageInfo['originalFormat'],\n });\n\n try {\n encoder.init(target.width, target.height, options.quality ?? DEFAULT_QUALITY);\n encoder.start();\n\n for await (const scanline of scanlines) {\n encoder.writeScanline(scanline);\n const codecBytes = bytes.byteLength + encoder.getBufferedOutputSize() + encoder.getRowBufferSize();\n stats.update(bytes.byteLength, encoder.getBufferedOutputSize(), codecBytes, codecBytes);\n for (const chunk of encoder.drainChunks()) {\n stats.addBytesOut(chunk.byteLength);\n stats.update(bytes.byteLength, encoder.getBufferedOutputSize(), codecBytes, codecBytes);\n yield chunk;\n }\n }\n\n for (const chunk of encoder.finish()) {\n stats.addBytesOut(chunk.byteLength);\n const codecBytes = bytes.byteLength + encoder.getBufferedOutputSize() + encoder.getRowBufferSize();\n stats.update(bytes.byteLength, encoder.getBufferedOutputSize(), codecBytes, codecBytes);\n yield chunk;\n }\n } finally {\n encoder.dispose();\n }\n}\n\nexport function transform(input: ByteInput | InputSource, options: TransformOptions = {}): EncodedImage {\n const infoDeferred = createDeferred();\n const statsDeferred = createDeferred();\n\n const iteratorFactory = () => (async function* transformIterator() {\n const prepared = await prepareInputSource(input);\n const info = await inspectSource(prepared);\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n const stats = new StatsTracker(\n prepared.kind === 'stream' ? 'streaming-input' : 'byte-input'\n );\n\n try {\n if (info.format === 'jpeg') {\n yield* runJpegTransform(prepared, info, options, infoDeferred, stats);\n } else {\n yield* runBufferedTransform(prepared, info, options, infoDeferred, stats);\n }\n\n statsDeferred.resolve(stats.snapshot());\n } catch (error) {\n infoDeferred.reject(error);\n statsDeferred.reject(error);\n throw error;\n }\n })();\n\n return createEncodedImage(iteratorFactory, infoDeferred.promise, statsDeferred.promise);\n}\n\nexport async function ready(options: { wasm?: WebAssembly.Module | ArrayBuffer } = {}): Promise {\n if (options.wasm instanceof WebAssembly.Module) {\n await initWithWasmModule(options.wasm);\n return;\n }\n\n if (options.wasm instanceof ArrayBuffer) {\n const compiled = await WebAssembly.compile(options.wasm);\n await initWithWasmModule(compiled);\n return;\n }\n\n await loadWasm();\n}\n\nexport async function collect(image: EncodedImage): Promise<{\n data: ArrayBuffer;\n info: EncodedImageInfo;\n stats: TransformStats;\n}> {\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n for await (const chunk of image) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return {\n data: merged.buffer.slice(merged.byteOffset, merged.byteOffset + merged.byteLength),\n info: await image.info,\n stats: await image.stats,\n };\n}\n\nexport function toReadableStream(image: EncodedImage): ReadableStream {\n const iterator = image[Symbol.asyncIterator]();\n return new ReadableStream({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n return;\n }\n\n controller.enqueue(value);\n },\n async cancel(reason) {\n if (typeof iterator.return === 'function') {\n await iterator.return(reason);\n }\n },\n });\n}\n\nexport function toResponse(image: EncodedImage, init: ResponseInit = {}): Response {\n const headers = new Headers(init.headers);\n headers.set('Content-Type', 'image/jpeg');\n\n return new Response(toReadableStream(image), {\n ...init,\n headers,\n });\n}\n\nexport { inspect };\n"]} \ No newline at end of file +{"version":3,"sources":["../src/decoders/simple.ts","../src/probe.ts","../src/input.ts","../src/resize.ts","../src/wasm/loader.ts","../src/wasm/decoder.ts","../src/wasm/encoder.ts","../src/wasm/png-decoder.ts","../src/api.ts"],"names":["wasmModule","require","decode","copy","merged","isCloudflareWorker","module","isNode","decoder","bytes"],"mappings":";AAQA,SAAS,kBAAA,GAA8B;AACrC,EAAA,MAAM,eAAgB,UAAA,CAA+D,MAAA;AACrF,EAAA,OAAO,OAAO,YAAA,KAAiB,WAAA,IAAe,OAAO,aAAa,OAAA,KAAY,WAAA;AAChF;AAEA,SAAS,wBAAwB,MAAA,EAAiD;AAChF,EAAA,MAAM,cAAe,UAAA,CAAuC,kBAAA;AAC5D,EAAA,IAAI,CAAC,WAAA,IAAe,OAAO,WAAA,KAAgB,QAAA,EAAU;AACnD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAe,YAAwC,MAAM,CAAA;AACnE,EAAA,IACE,uBAAuB,WAAA,IACvB,WAAA,YAAuB,UAAA,IACvB,WAAA,YAAuB,YAAY,MAAA,EACnC;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,MAAA,GAAkB;AACzB,EAAA,IAAI,oBAAmB,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAO,YAAY,WAAA,IACnB,OAAA,CAAQ,YAAY,IAAA,IACpB,OAAA,CAAQ,SAAS,IAAA,IAAQ,IAAA;AAClC;AAEA,eAAe,mBAAA,CAEb,QACA,UAAA,EACe;AACf,EAAA,IAAI,UAAA,YAAsB,YAAY,MAAA,EAAQ;AAC5C,IAAA,MAAM,OAAO,UAAU,CAAA;AACvB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,MAAA;AAEJ,EAAA,IAAI,sBAAsB,UAAA,EAAY;AACpC,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,UAAA,CAAW,UAAU,CAAA;AACjD,IAAA,IAAA,CAAK,IAAI,UAAU,CAAA;AACnB,IAAA,MAAA,GAAS,IAAA,CAAK,MAAA;AAAA,EAChB,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,UAAA;AAAA,EACX;AAEA,EAAA,MAAMA,WAAAA,GAAa,MAAM,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAA;AACnD,EAAA,MAAM,OAAOA,WAAU,CAAA;AACzB;AAKA,eAAe,gBAAA,CAEb,QACA,QAAA,EACe;AAGf,EAAA,MAAM,QAAA,GAAW,aAAA;AACjB,EAAA,MAAM,YAAA,GAAe,QAAA;AACrB,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM;AAAA;AAAA,IAA0B;AAAA,GAAA;AACrD,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM;AAAA;AAAA,IAA0B;AAAA,GAAA;AAC1D,EAAA,MAAMC,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAG7C,EAAA,MAAM,YAAA,GAAeA,QAAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,YAAY,CAAA;AAC9C,EAAA,MAAMD,WAAAA,GAAa,MAAM,WAAA,CAAY,OAAA,CAAQ,UAAU,CAAA;AACvD,EAAA,MAAM,OAAOA,WAAU,CAAA;AACzB;AAcO,IAAM,gBAAN,MAAuC;AAAA,EACnC,MAAA;AAAA,EACA,gBAAA,GAAmB,KAAA;AAAA,EACnB,oBAAA,GAAuB,KAAA;AAAA,EAExB,IAAA;AAAA,EACA,KAAA,GAAQ,CAAA;AAAA,EACR,MAAA,GAAS,CAAA;AAAA,EACT,QAAA,GAAW,KAAA;AAAA;AAAA,EAEX,QAAA,GAAyD,IAAA;AAAA,EAEjE,WAAA,CAAY,QAAqB,IAAA,EAAmB;AAClD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEA,MAAM,KAAK,IAAA,EAAkF;AAC3F,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAMZ,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACnB,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,EAAE,OAAA,EAASE,OAAAA,EAAQ,MAAK,GAAI,MAAM,OAAO,yBAAyB,CAAA;AACxE,QAAA,MAAM,SAAA,GAAY,wBAAwB,MAAM,CAAA;AAChD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,mBAAA,CAAoB,MAAM,SAAS,CAAA;AAAA,QAC3C,CAAA,MAAA,IAAW,QAAO,EAAG;AACnB,UAAA,MAAM,gBAAA,CAAiB,MAAM,uCAAuC,CAAA;AAAA,QACtE;AACA,QAAA,IAAA,CAAK,QAAA,GAAWA,OAAAA;AAChB,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,EAAE,OAAA,EAASA,OAAAA,EAAQ,MAAK,GAAI,MAAM,OAAO,yBAAyB,CAAA;AACxE,QAAA,MAAM,SAAA,GAAY,wBAAwB,MAAM,CAAA;AAChD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,mBAAA,CAAoB,MAAM,SAAS,CAAA;AAAA,QAC3C,CAAA,MAAA,IAAW,QAAO,EAAG;AACnB,UAAA,MAAM,gBAAA,CAAiB,MAAM,uCAAuC,CAAA;AAAA,QACtE;AACA,QAAA,IAAA,CAAK,QAAA,GAAWA,OAAAA;AAChB,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA;AAAA,MACL,KAAK,KAAA;AACH,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,CAAA,mHAAA;AAAA,SAE9B;AAAA,MACF;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA;AAK1E,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AAC/C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,IAAA,CAAK,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,QAAQ,SAAA,CAAU,KAAA;AACvB,IAAA,IAAA,CAAK,SAAS,SAAA,CAAU,MAAA;AAExB,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,YAAA,EAIV;AACD,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAGA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,QAAQ,SAAA,CAAU,KAAA;AACvB,IAAA,IAAA,CAAK,SAAS,SAAA,CAAU,MAAA;AAGxB,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,SAAA,CAAU,KAAK,MAAM,CAAA;AACjD,IAAA,MAAM,MAAM,IAAI,UAAA,CAAW,KAAK,KAAA,GAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AAEvD,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA;AAErC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,MAAA,GAAA,CAAI,MAAA,EAAQ,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,CAAA;AAC7B,MAAA,GAAA,CAAI,MAAA,EAAQ,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,CAAA;AAC7B,MAAA,GAAA,CAAI,MAAA,EAAQ,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,CAAA;AAC7B,MAAA,MAAA,EAAA;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,GAAA;AAAA,MACR,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AAEd,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AACF,CAAA;AAKA,eAAsB,aAAA,CACpB,QACA,IAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,MAAA,EAAQ,IAAI,CAAA;AAC9C,EAAA,MAAM,OAAA,CAAQ,KAAK,IAAI,CAAA;AACvB,EAAA,OAAO,OAAA;AACT;;;ACjOA,IAAM,KAAA,GAAQ;AAAA;AAAA,EAEZ,IAAA,EAAM,CAAC,GAAA,EAAM,GAAA,EAAM,GAAI,CAAA;AAAA;AAAA,EAEvB,GAAA,EAAK,CAAC,GAAA,EAAM,EAAA,EAAM,IAAM,EAAA,EAAM,EAAA,EAAM,EAAA,EAAM,EAAA,EAAM,EAAI,CAAA;AAAA;AAAA,EAEpD,IAAA,EAAM,CAAC,EAAA,EAAM,EAAA,EAAM,IAAM,EAAI,CAAA;AAAA;AAAA,EAC7B,IAAA,EAAM,CAAC,EAAA,EAAM,EAAA,EAAM,IAAM,EAAI,CAAA;AAAA;AAAA;AAAA,EAE7B,IAAA,EAAM,CAAC,GAAA,EAAM,GAAA,EAAM,KAAM,GAAI;AAAA;AAC/B,CAAA;AAKA,SAAS,aAAa,IAAA,EAA+B;AACnD,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI,OAAO,SAAA;AAG7B,EAAA,IACE,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,KAAK,CAAC,CAAA,IACxB,KAAK,CAAC,CAAA,KAAM,MAAM,IAAA,CAAK,CAAC,KACxB,IAAA,CAAK,CAAC,MAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EACxB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IACE,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,KACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,KAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IACvB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EACvB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IACE,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,KACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,KAAK,EAAE,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACzB,IAAA,CAAK,EAAE,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EACzB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IACE,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IACxB,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EACxB;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAC,CAAA;AACtE,IAAA,IAAI,UAAU,MAAA,IAAU,KAAA,KAAU,UAAU,KAAA,KAAU,MAAA,IAAU,UAAU,MAAA,EAAQ;AAChF,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAOA,SAAS,UAAU,IAAA,EAA4D;AAC7E,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,OAAO,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAE/B,IAAA,IAAI,IAAA,CAAK,MAAM,CAAA,KAAM,GAAA,EAAM;AACzB,MAAA,MAAA,EAAA;AACA,MAAA;AAAA,IACF;AAGA,IAAA,OAAO,SAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAM,MAAM,GAAA,EAAM;AACpD,MAAA,MAAA,EAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,IAAU,KAAK,MAAA,EAAQ;AAE3B,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAQ,CAAA;AAI5B,IAAA,MAAM,KAAA,GACH,MAAA,IAAU,GAAA,IAAQ,MAAA,IAAU,OAC5B,MAAA,IAAU,GAAA,IAAQ,MAAA,IAAU,GAAA,IAC5B,UAAU,GAAA,IAAQ,MAAA,IAAU,GAAA,IAC5B,MAAA,IAAU,OAAQ,MAAA,IAAU,GAAA;AAE/B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA;AAErC,MAAA,MAAM,MAAA,GAAU,KAAK,MAAA,GAAS,CAAC,KAAK,CAAA,GAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AACxD,MAAA,MAAM,KAAA,GAAS,KAAK,MAAA,GAAS,CAAC,KAAK,CAAA,GAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AACvD,MAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,IACzB;AAIA,IAAA,IAAI,WAAW,GAAA,IAAQ,MAAA,KAAW,OAAS,MAAA,IAAU,GAAA,IAAQ,UAAU,GAAA,EAAO;AAE5E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,MAAA,EAAQ;AAC/B,IAAA,MAAM,gBAAiB,IAAA,CAAK,MAAM,KAAK,CAAA,GAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AAC3D,IAAA,MAAA,IAAU,aAAA;AAAA,EACZ;AAEA,EAAA,OAAO,IAAA;AACT;AAOA,SAAS,SAAS,IAAA,EAA+E;AAC/F,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI,OAAO,IAAA;AAI7B,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAC,CAAA;AAC5E,EAAA,IAAI,SAAA,KAAc,QAAQ,OAAO,IAAA;AAGjC,EAAA,MAAM,KAAA,GACH,IAAA,CAAK,EAAE,CAAA,IAAK,KAAO,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA,GAAO,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA,GAAK,KAAK,EAAE,CAAA;AACjE,EAAA,MAAM,MAAA,GACH,IAAA,CAAK,EAAE,CAAA,IAAK,KAAO,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA,GAAO,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA,GAAK,KAAK,EAAE,CAAA;AAIjE,EAAA,MAAM,SAAA,GAAY,KAAK,EAAE,CAAA;AACzB,EAAA,MAAM,QAAA,GAAW,SAAA,KAAc,CAAA,IAAK,SAAA,KAAc,CAAA;AAElD,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AACnC;AAMA,SAAS,UAAU,IAAA,EAA+E;AAChG,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI,OAAO,IAAA;AAG7B,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAC,CAAA;AAE5E,EAAA,IAAI,cAAc,MAAA,EAAQ;AAIxB,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,EAAA,EAAI,OAAO,IAAA;AAE7B,IAAA,IAAI,IAAA,CAAK,EAAE,CAAA,KAAM,GAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,KAAM,CAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,KAAM,EAAA,EAAM,OAAO,IAAA;AAExE,IAAA,MAAM,SAAS,IAAA,CAAK,EAAE,IAAK,IAAA,CAAK,EAAE,KAAK,CAAA,IAAM,KAAA;AAC7C,IAAA,MAAM,UAAU,IAAA,CAAK,EAAE,IAAK,IAAA,CAAK,EAAE,KAAK,CAAA,IAAM,KAAA;AAC9C,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAM;AAAA,EAC1C;AAEA,EAAA,IAAI,cAAc,MAAA,EAAQ;AAGxB,IAAA,IAAI,IAAA,CAAK,EAAE,CAAA,KAAM,EAAA,EAAM,OAAO,IAAA;AAE9B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAE,CAAA,GAAK,KAAK,EAAE,CAAA,IAAK,CAAA,GAAM,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA,GAAO,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA;AAC1E,IAAA,MAAM,KAAA,GAAA,CAAS,OAAO,KAAA,IAAU,CAAA;AAChC,IAAA,MAAM,MAAA,GAAA,CAAW,IAAA,IAAQ,EAAA,GAAM,KAAA,IAAU,CAAA;AACzC,IAAA,MAAM,QAAA,GAAA,CAAa,IAAA,IAAQ,EAAA,GAAM,CAAA,MAAO,CAAA;AACxC,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,EACnC;AAEA,EAAA,IAAI,cAAc,MAAA,EAAQ;AAGxB,IAAA,MAAM,KAAA,GAAQ,KAAK,EAAE,CAAA;AACrB,IAAA,MAAM,QAAA,GAAA,CAAY,QAAQ,EAAA,MAAU,CAAA;AAEpC,IAAA,MAAM,KAAA,GAAA,CAAS,IAAA,CAAK,EAAE,CAAA,GAAK,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA,GAAM,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA,IAAO,CAAA;AAEhE,IAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,EAAE,CAAA,GAAK,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA,GAAM,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA,IAAO,CAAA;AACjE,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AAAA,EACnC;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,UAAU,IAAA,EAA4D;AAK7E,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,OAAO,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,MAAA,EAAQ;AAEhC,IAAA,MAAM,OACH,IAAA,CAAK,MAAM,CAAA,IAAK,EAAA,GAChB,KAAK,MAAA,GAAS,CAAC,CAAA,IAAK,EAAA,GACpB,KAAK,MAAA,GAAS,CAAC,KAAK,CAAA,GACrB,IAAA,CAAK,SAAS,CAAC,CAAA;AACjB,IAAA,MAAM,OAAO,MAAA,CAAO,YAAA;AAAA,MAClB,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MACf,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MACf,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MACf,IAAA,CAAK,SAAS,CAAC;AAAA,KACjB;AAEA,IAAA,IAAI,SAAS,CAAA,EAAG;AAChB,IAAA,IAAI,OAAO,CAAA,EAAG;AAGd,IAAA,IAAI,IAAA,KAAS,MAAA,IAAU,MAAA,GAAS,EAAA,IAAM,KAAK,MAAA,EAAQ;AAEjD,MAAA,MAAM,QACH,IAAA,CAAK,MAAA,GAAS,EAAE,CAAA,IAAK,EAAA,GACrB,KAAK,MAAA,GAAS,EAAE,CAAA,IAAK,EAAA,GACrB,KAAK,MAAA,GAAS,EAAE,KAAK,CAAA,GACtB,IAAA,CAAK,SAAS,EAAE,CAAA;AAClB,MAAA,MAAM,SACH,IAAA,CAAK,MAAA,GAAS,EAAE,CAAA,IAAK,EAAA,GACrB,KAAK,MAAA,GAAS,EAAE,CAAA,IAAK,EAAA,GACrB,KAAK,MAAA,GAAS,EAAE,KAAK,CAAA,GACtB,IAAA,CAAK,SAAS,EAAE,CAAA;AAClB,MAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,MAAA,GAAS,CAAA,EAAG;AAC3B,QAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,MACzB;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,MAAA,IAAU,SAAS,MAAA,EAAQ;AAEzD,MAAA,MAAM,UAAA,GAAa,IAAA,KAAS,MAAA,GAAS,EAAA,GAAK,CAAA;AAC1C,MAAA,MAAA,IAAU,UAAA;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,IAAU,IAAA;AAAA,EACZ;AAEA,EAAA,OAAO,IAAA;AACT;AASO,SAAS,MAAM,KAAA,EAA8C;AAClE,EAAA,MAAM,OAAO,KAAA,YAAiB,WAAA,GAAc,IAAI,UAAA,CAAW,KAAK,CAAA,GAAI,KAAA;AAEpE,EAAA,MAAM,MAAA,GAAS,aAAa,IAAI,CAAA;AAEhC,EAAA,IAAI,MAAA,GAAuE,IAAA;AAE3E,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,MAAA;AACH,MAAA,MAAA,GAAS,UAAU,IAAI,CAAA;AACvB,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,MAAA,GAAS,SAAS,IAAI,CAAA;AACtB,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,MAAA,GAAS,UAAU,IAAI,CAAA;AACvB,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,MAAA,GAAS,UAAU,IAAI,CAAA;AACvB,MAAA;AAAA;AAGJ,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,GAC/B;AACF;;;ACrTA,IAAM,kBAAkB,CAAC,EAAA,EAAI,KAAK,IAAA,EAAO,KAAA,EAAQ,OAAQ,MAAO,CAAA;AAChE,IAAM,sBAAsB,EAAA,GAAK,IAAA;AAOjC,SAAS,iBAAiB,IAAA,EAA+B;AACvD,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAC3C,EAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,EAAA,OAAO,IAAA,CAAK,MAAA;AACd;AAEA,SAAS,YAAA,CAAa,QAAsB,KAAA,EAA2B;AACrE,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,KAAK,CAAA;AACnC,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AACxB,IAAA,MAAA,IAAU,KAAA,CAAM,UAAA;AAAA,EAClB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAA+B;AACrD,EAAA,IAAI,MAAM,UAAA,KAAe,CAAA,IAAK,MAAM,UAAA,KAAe,KAAA,CAAM,OAAO,UAAA,EAAY;AAC1E,IAAA,MAAMC,KAAAA,GAAO,IAAI,UAAA,CAAW,KAAA,CAAM,UAAU,CAAA;AAC5C,IAAAA,KAAAA,CAAK,IAAI,KAAK,CAAA;AACd,IAAA,OAAOA,KAAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,KAAA,CAAM,UAAU,CAAA;AAC5C,EAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AACd,EAAA,OAAO,IAAA;AACT;AAEA,gBAAgB,sBAAsB,MAAA,EAA+D;AACnG,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAEhC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,UAAA,GAAa,CAAA,EAAG;AACjC,QAAA,MAAM,eAAe,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAEA,gBAAgB,qBAAA,CACd,KAAA,EACA,MAAA,GAAS,mBAAA,EACkB;AAC3B,EAAA,IAAI,UAAwB,EAAC;AAC7B,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAMC,OAAAA,GAAS,YAAA,CAAa,OAAA,EAAS,KAAK,CAAA;AAC1C,IAAA,OAAA,GAAU,EAAC;AACX,IAAA,KAAA,GAAQ,CAAA;AACR,IAAA,OAAOA,OAAAA;AAAA,EACT,CAAA;AAEA,EAAA,WAAA,MAAiB,YAAY,KAAA,EAAO;AAClC,IAAA,MAAM,KAAA,GAAQ,eAAe,QAAQ,CAAA;AACrC,IAAA,IAAI,KAAA,CAAM,UAAA,IAAc,MAAA,IAAU,KAAA,KAAU,CAAA,EAAG;AAC7C,MAAA,MAAM,KAAA;AACN,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,IAAA,KAAA,IAAS,KAAA,CAAM,UAAA;AAEf,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,MAAMA,UAAS,KAAA,EAAM;AACrB,MAAA,IAAIA,OAAAA,EAAQ;AACV,QAAA,MAAMA,OAAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,MAAA;AAAA,EACR;AACF;AAEA,SAAS,iBAAiB,KAAA,EAA0F;AAClH,EAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,IAAe,KAAA,YAAiB,cAAA,EAAgB;AAC5E,IAAA,OAAO,qBAAA,CAAsB,qBAAA,CAAsB,KAAK,CAAC,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,OAAQ,KAAA,CAAoC,MAAA,CAAO,aAAa,MAAM,UAAA,EAAY;AACpF,IAAA,OAAO,sBAAsB,KAAkC,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO,sBAAsB,KAAkC,CAAA;AACjE;AAEA,IAAM,mBAAN,MAAsD;AAAA,EAQpD,WAAA,CAA6B,OAAmB,UAAA,EAA0B;AAA7C,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,KAAA,CAAM,UAAA;AACxB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,UAAA,EAAY,eAAA,CAAgB,EAAA,CAAG,EAAE,CAAE,CAAC,CAAA;AACxF,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAJ6B,KAAA;AAAA,EAPpB,IAAA,GAAO,OAAA;AAAA,EACP,UAAA,GAAa,IAAA;AAAA,EACb,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EAQhB,MAAM,kBAAkB,MAAA,EAAqC;AAC3D,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY,MAAM,CAAC,CAAA;AAAA,EACvE;AAAA,EAEA,IAAA,GAAkC;AAChC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,OAAA,CAAQ,gBAAgB,SAAA,GAAY;AAClC,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,GAAG;AAAA,EACL;AACF,CAAA;AAEA,IAAM,oBAAN,MAAuD;AAAA,EAC5C,IAAA,GAAO,QAAA;AAAA,EACP,UAAA,GAAa,KAAA;AAAA,EACb,UAAA;AAAA,EACA,UAAA;AAAA,EAEQ,QAAA;AAAA,EACT,eAA6B,EAAC;AAAA,EAC9B,WAAA,GAAc,CAAA;AAAA,EACd,MAAA,GAAS,KAAA;AAAA,EACT,SAAA,GAAY,KAAA;AAAA,EACpB,WAAA,GAA2C,IAAI,UAAA,CAAW,CAAC,CAAA;AAAA,EAE3D,WAAA,CAAY,KAAA,EAAkC,UAAA,EAA0B,UAAA,EAAqB;AAC3F,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,aAAa,CAAA,EAAE;AAC5C,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,IAAI,IAAA,GAAgB;AAClB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,MAAM,kBAAkB,MAAA,EAAqC;AAC3D,IAAA,OAAO,CAAC,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,cAAc,MAAA,EAAQ;AACnD,MAAA,MAAM,EAAE,KAAA,EAAO,IAAA,KAAS,MAAM,IAAA,CAAK,SAAS,IAAA,EAAK;AACjD,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,UAAA,GAAa,CAAA,EAAG;AACjC,QAAA,MAAM,KAAA,GAAQ,eAAe,KAAK,CAAA;AAClC,QAAA,IAAA,CAAK,YAAA,CAAa,KAAK,KAAK,CAAA;AAC5B,QAAA,IAAA,CAAK,eAAe,KAAA,CAAM,UAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,YAAA,CAAa,IAAA,CAAK,YAAA,EAAc,KAAK,WAAW,CAAA;AACnE,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,IAAA,GAAkC;AAChC,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,KAAA,EAAM;AACvC,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAEtB,IAAA,OAAA,CAAQ,gBAAgB,UAAA,GAAa;AACnC,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,MAAM,SAAS,IAAA,EAAK;AAC5C,QAAA,IAAI,IAAA,EAAM;AACR,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,IAAS,KAAA,CAAM,UAAA,GAAa,CAAA,EAAG;AACjC,UAAA,MAAM,eAAe,KAAK,CAAA;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAAA,EACL;AACF,CAAA;AAEA,SAAS,cAAc,KAAA,EAA8D;AACnF,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,MAAA,IAAU,SAAS,aAAA,IAAiB,KAAA;AAC5F;AAEA,SAAS,aAAa,KAAA,EAA6C;AACjE,EAAA,OAAO,iBAAiB,UAAA,GAAa,cAAA,CAAe,KAAK,CAAA,GAAI,IAAI,WAAW,KAAK,CAAA;AACnF;AAEA,eAAe,sBAAsB,KAAA,EAAyD;AAC5F,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AACzD,EAAA,MAAM,IAAA,GAAO,YAAY,UAAA,CAAW,QAAQ,IAAK,WAAA,CAAY,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,GAAoB,MAAA;AACtG,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AACvD,EAAA,MAAM,UAAA,GAAa,YAAA,GAAe,MAAA,CAAO,YAAY,CAAA,GAAI,MAAA;AAEzD,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,OAAO,IAAI,iBAAA,CAAkB,gBAAA,CAAiB,KAAA,CAAM,IAAkC,CAAA,EAAG,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,GAAI,UAAA,GAAa,MAAS,CAAA;AAAA,EACrJ;AAEA,EAAA,MAAM,QAAQ,IAAI,UAAA,CAAW,MAAM,KAAA,CAAM,aAAa,CAAA;AACtD,EAAA,OAAO,IAAI,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA;AACzC;AAEA,eAAsB,mBAAmB,KAAA,EAA8D;AACrG,EAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,YAAiB,WAAA,IAAe,KAAA,YAAiB,UAAA,EAAY;AAC/D,IAAA,OAAO,IAAI,gBAAA,CAAiB,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,OAAO,IAAA,KAAS,WAAA,IAAe,KAAA,YAAiB,IAAA,EAAM;AACxD,IAAA,OAAO,IAAI,iBAAiB,IAAI,UAAA,CAAW,MAAM,KAAA,CAAM,WAAA,EAAa,CAAC,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,KAAA,YAAiB,OAAA,EAAS;AAC9D,IAAA,OAAO,sBAAsB,KAAK,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,KAAA,YAAiB,QAAA,EAAU;AAChE,IAAA,OAAO,sBAAsB,KAAK,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,OAAO,cAAA,KAAmB,WAAA,IAAe,KAAA,YAAiB,cAAA,EAAgB;AAC5E,IAAA,OAAO,IAAI,iBAAA,CAAkB,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,OAAO,IAAI,iBAAA,CAAkB,gBAAA,CAAiB,KAAkC,CAAC,CAAA;AACnF;AAEA,eAAsB,QAAQ,KAAA,EAA0C;AACtE,EAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,MAAM,CAAA;AAEvC,EAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,IAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AACxB;AAEA,eAAsB,cAAc,MAAA,EAAiD;AACnF,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA;AACnC,EAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,UAAU,eAAA,EAAiB;AACpC,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,iBAAA,CAAkB,MAAM,CAAA;AACnD,IAAA,IAAA,GAAO,MAAM,KAAK,CAAA;AAClB,IAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,WAAA,CAAY,UAAA,KAAe,CAAA,EAAG;AACvC,IAAA,OAAO,EAAE,QAAQ,SAAA,EAAW,KAAA,EAAO,GAAG,MAAA,EAAQ,CAAA,EAAG,UAAU,KAAA,EAAM;AAAA,EACnE;AAEA,EAAA,OAAO,KAAA,CAAM,OAAO,WAAW,CAAA;AACjC;AAEA,eAAsB,mBAAmB,MAAA,EAA0C;AACjF,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,WAAA,MAAiB,KAAA,IAAS,MAAA,CAAO,IAAA,EAAK,EAAG;AACvC,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,IAAA,KAAA,IAAS,KAAA,CAAM,UAAA;AAAA,EACjB;AAEA,EAAA,OAAO,YAAA,CAAa,QAAQ,KAAK,CAAA;AACnC;AAEO,SAAS,cAAc,KAAA,EAAgC;AAC5D,EAAA,OAAO,iBAAiB,KAAK,CAAA;AAC/B;;;AC1SO,SAAS,iBAAA,CACd,QAAA,EACA,SAAA,EACA,QAAA,EACA,SAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,EAAA;AAAA,IACV,QAAA,EAAU,EAAA;AAAA,IACV,cAAA,EAAgB;AAAA,GAClB;AACF;AAUA,SAAS,mBAAA,CACP,GAAA,EACA,QAAA,EACA,QAAA,EACY;AACZ,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,QAAA,GAAW,CAAC,CAAA;AACvC,EAAA,MAAM,SAAS,QAAA,GAAW,QAAA;AAE1B,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,QAAA,EAAU,IAAA,EAAA,EAAQ;AAE1C,IAAA,MAAM,YAAY,IAAA,GAAO,MAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAClC,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAG,WAAW,CAAC,CAAA;AAC9C,IAAA,MAAM,IAAI,SAAA,GAAY,KAAA;AACtB,IAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AAGjB,IAAA,MAAM,OAAO,KAAA,GAAQ,CAAA;AACrB,IAAA,MAAM,OAAO,KAAA,GAAQ,CAAA;AACrB,IAAA,MAAM,YAAY,IAAA,GAAO,CAAA;AAGzB,IAAA,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA,GAAO,GAAA,CAAI,IAAI,CAAA,GAAI,CAAC,CAAA;AAC5D,IAAA,GAAA,CAAI,SAAA,GAAY,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,GAAO,GAAA,CAAI,IAAA,GAAO,CAAC,IAAI,CAAC,CAAA;AACxE,IAAA,GAAA,CAAI,SAAA,GAAY,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,GAAO,GAAA,CAAI,IAAA,GAAO,CAAC,IAAI,CAAC,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,GAAA;AACT;AAWA,SAAS,SAAA,CACP,IAAA,EACA,IAAA,EACA,CAAA,EACA,KAAA,EACY;AACZ,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA;AACvC,EAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AAEjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,GAAQ,GAAG,CAAA,EAAA,EAAK;AAClC,IAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,GAAI,CAAC,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,MAAA;AACT;AAgBO,SAAS,eAAA,CACd,KAAA,EACA,WAAA,EACA,IAAA,EACY;AACZ,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,QAAA,EAAU,WAAU,GAAI,KAAA;AACrD,EAAA,MAAM,SAAS,SAAA,GAAY,SAAA;AAC3B,EAAA,MAAM,SAAqB,EAAC;AAG5B,EAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,WAAA,EAAa,QAAA,EAAU,QAAQ,CAAA;AAGtE,EAAA,KAAA,CAAM,UAAU,KAAA,CAAM,OAAA;AACtB,EAAA,KAAA,CAAM,WAAW,KAAA,CAAM,QAAA;AACvB,EAAA,KAAA,CAAM,OAAA,GAAU,UAAA;AAChB,EAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AAGjB,EAAA,OAAO,KAAA,CAAM,iBAAiB,SAAA,EAAW;AACvC,IAAA,MAAM,SAAA,GAAY,MAAM,cAAA,GAAiB,MAAA;AACzC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AACtC,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,CAAA,EAAG,YAAY,CAAC,CAAA;AAGtD,IAAA,IAAI,WAAW,IAAA,EAAM;AAEnB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,YAAY,IAAA,EAAM;AAE1B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAM,KAAA,CAAM,OAAA;AAAA,QACZ,KAAA,EAAO,QAAA;AAAA,QACP,GAAG,KAAA,CAAM;AAAA,OACV,CAAA;AACD,MAAA,KAAA,CAAM,cAAA,EAAA;AACN,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAI,SAAA,GAAY,SAAA;AAGtB,IAAA,IAAI,OAAO,KAAA,CAAM,OAAA;AACjB,IAAA,IAAI,OAAO,KAAA,CAAM,OAAA;AAGjB,IAAA,IAAI,SAAA,KAAc,MAAM,QAAA,EAAU;AAChC,MAAA,IAAA,GAAO,KAAA,CAAM,OAAA;AACb,MAAA,IAAA,GAAO,KAAA,CAAM,OAAA;AAAA,IACf,CAAA,MAAA,IAAW,QAAA,KAAa,KAAA,CAAM,QAAA,EAAU;AAEtC,MAAA,IAAA,GAAO,KAAA,CAAM,OAAA;AACb,MAAA,IAAA,GAAO,KAAA,CAAM,OAAA;AAAA,IACf;AAEA,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,GAAG,QAAQ,CAAA;AACjD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,QAAA;AAAA,MACP,GAAG,KAAA,CAAM;AAAA,KACV,CAAA;AAED,IAAA,KAAA,CAAM,cAAA,EAAA;AAAA,EACR;AAEA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,YAAY,KAAA,EAAgC;AAC1D,EAAA,MAAM,SAAqB,EAAC;AAG5B,EAAA,OAAO,KAAA,CAAM,cAAA,GAAiB,KAAA,CAAM,SAAA,EAAW;AAC7C,IAAA,IAAI,KAAA,CAAM,YAAY,IAAA,EAAM;AAE5B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,MAAM,KAAA,CAAM,OAAA;AAAA,MACZ,OAAO,KAAA,CAAM,QAAA;AAAA,MACb,GAAG,KAAA,CAAM;AAAA,KACV,CAAA;AACD,IAAA,KAAA,CAAM,cAAA,EAAA;AAAA,EACR;AAEA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,yBAAA,CACd,QAAA,EACA,SAAA,EACA,QAAA,EACA,SAAA,EACkD;AAClD,EAAA,MAAM,SAAS,QAAA,GAAW,QAAA;AAC1B,EAAA,MAAM,SAAS,SAAA,GAAY,SAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,KAAK,CAAA;AAAA,IAClC,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,KAAK,CAAA;AAAA,IACpC;AAAA,GACF;AACF;;;ACpNA,IAAI,UAAA,GAAmC,IAAA;AACvC,IAAI,WAAA,GAA6C,IAAA;AACjD,IAAI,qBAAA,GAAmD,IAAA;AAEvD,SAASC,mBAAAA,GAA8B;AACrC,EAAA,MAAM,eAAgB,UAAA,CAA+D,MAAA;AACrF,EAAA,OAAO,OAAO,YAAA,KAAiB,WAAA,IAAe,OAAO,aAAa,OAAA,KAAY,WAAA;AAChF;AAwBA,eAAsB,mBAAmB,cAAA,EAAoD;AAC3F,EAAA,IAAI,UAAA,EAAY;AACd,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,qBAAA,GAAwB,cAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,QAAA,EAAS;AACjB;AAKO,SAAS,aAAA,GAA+B;AAC7C,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,UAAA;AACT;AAOA,eAAsB,QAAA,GAAmC;AAEvD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,WAAA,GAAc,UAAA,EAAW;AAEzB,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,MAAM,WAAA;AACnB,IAAA,OAAO,UAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAKA,eAAe,UAAA,GAAqC;AAElD,EAAA,IAAI,OAAO,UAAA,KAAe,WAAA,IAAgB,UAAA,CAAmB,mBAAA,EAAqB;AAChF,IAAA,MAAM,SAAU,UAAA,CAAmB,mBAAA;AACnC,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB;AAGA,EAAA,IAAI;AAEF,IAAA,MAAM,eAAA,GAAA,CAAmB,MAAM,OAAO,UAAU,CAAA,EAAG,OAAA;AAInD,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,MAAMC,UAAS,MAAM,IAAI,OAAA,CAAuB,CAAC,SAAS,MAAA,KAAW;AACnE,QAAA,IAAI,cAAA,GAAuC,IAAA;AAE3C,QAAA,eAAA,CAAgB;AAAA,UACd,eAAA,EAAiB,CACf,OAAA,EACA,eAAA,KACG;AACH,YAAA,WAAA,CAAY,YAAY,qBAAA,EAAwB,OAAO,CAAA,CACpD,IAAA,CAAK,CAAC,QAAA,KAAa;AAClB,cAAA,eAAA,CAAgB,QAAQ,CAAA;AAAA,YAC1B,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,cAAA,MAAA,CAAO,GAAG,CAAA;AAAA,YACZ,CAAC,CAAA;AAEH,YAAA,OAAO,EAAC;AAAA,UACV,CAAA;AAAA,UACA,sBAAsB,MAAM;AAC1B,YAAA,IAAI,cAAA,IAAkB,eAAe,MAAA,EAAQ;AAC3C,cAAA,OAAA,CAAQ,cAAc,CAAA;AAAA,YACxB;AAAA,UACF;AAAA,SACD,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,KAAuB;AAC9B,UAAA,cAAA,GAAiB,GAAA;AACjB,UAAA,IAAI,IAAI,MAAA,EAAQ;AACd,YAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,UACb;AAAA,QACF,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA;AAAA,MACjB,CAAC,CAAA;AAED,MAAA,OAAOA,OAAAA;AAAA,IACT;AAEA,IAAA,MAAMC,OAAAA,GACJ,CAACF,mBAAAA,EAAmB,IACpB,OAAO,OAAA,KAAY,WAAA,IACnB,OAAA,CAAQ,QAAA,IAAY,IAAA,IACpB,OAAA,CAAQ,QAAA,CAAS,IAAA,IAAQ,IAAA;AAE3B,IAAA,IAAIE,OAAAA,EAAQ;AAGV,MAAA,MAAM,QAAA,GAAW,aAAA;AACjB,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM;AAAA;AAAA,QAA0B;AAAA,OAAA;AACrD,MAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,IAAI,IAAI,YAAA,EAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AACxE,MAAA,MAAMD,OAAAA,GAAS,MAAM,eAAA,CAAgB,EAAE,YAAY,CAAA;AACnD,MAAA,OAAOA,OAAAA;AAAA,IACT;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,eAAA,EAAgB;AACrC,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,4JAEa,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,KAC9D;AAAA,EACF;AACF;AAKO,SAAS,UAAA,CAAW,QAAuB,IAAA,EAA0B;AAC1E,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AACtC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AACA,EAAA,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAC3B,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,YAAA,CAAa,MAAA,EAAuB,GAAA,EAAa,IAAA,EAA0B;AACzF,EAAA,OAAO,IAAI,WAAW,MAAA,CAAO,MAAA,CAAO,QAAQ,GAAA,EAAK,IAAI,EAAE,KAAA,EAAM;AAC/D;;;AC/KO,IAAM,kBAAN,MAAsB;AAAA,EACV,MAAA;AAAA,EACT,OAAA,GAAU,CAAA;AAAA,EACV,KAAA,GAAQ,CAAA;AAAA,EACR,MAAA,GAAS,CAAA;AAAA,EACT,WAAA,GAAc,CAAA;AAAA,EACd,YAAA,GAAe,CAAA;AAAA,EACf,YAAA,GAAe,CAAA;AAAA,EACf,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,GAAW,KAAA;AAAA,EAEnB,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,aAAA,EAAc;AAC5B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAoB;AAC/C,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,SAAA,CAAU,IAAA,EAAkB,OAAA,GAAU,KAAA,EAAa;AACjD,IAAA,IAAI,IAAA,CAAK,UAAA,KAAe,CAAA,IAAK,CAAC,OAAA,EAAS;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,KAAK,UAAA,GAAa,CAAA,GAAI,WAAW,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA,GAAI,CAAA;AAC5D,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,uBAAA,CAAwB,IAAA,CAAK,OAAA,EAAS,GAAA,EAAK,IAAA,CAAK,UAAA,EAAY,OAAA,GAAU,CAAA,GAAI,CAAC,CAAA,KAAM,CAAA,EAAG;AAClG,QAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,MAC1D;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,GAAG,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAAmE;AACtE,IAAA,MAAM,QAAQ,IAAA,YAAgB,UAAA,GAAa,IAAA,GAAO,IAAI,WAAW,IAAI,CAAA;AACrE,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACnC,MAAA,IAAI,IAAA,CAAK,OAAO,uBAAA,CAAwB,IAAA,CAAK,SAAS,GAAA,EAAK,KAAA,CAAM,UAAU,CAAA,KAAM,CAAA,EAAG;AAClF,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,GAAG,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,KAAK,cAAA,EAAe;AACnC,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,EAClD;AAAA,EAEA,cAAA,GAA6B;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,wBAAA,CAAyB,KAAK,OAAO,CAAA;AAChE,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,sBAAA,CAAuB,KAAK,OAAO,CAAA;AAC5D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,uBAAA,CAAwB,KAAK,OAAO,CAAA;AAC9D,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,KAAA;AACxB,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,MAAA;AACzB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,aAAA,GAAmD;AACjD,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,EAClD;AAAA,EAEA,SAAS,UAAA,EAA8D;AACrE,IAAA,IAAI,KAAK,MAAA,CAAO,sBAAA,CAAuB,KAAK,OAAA,EAAS,UAAU,MAAM,CAAA,EAAG;AACtE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,UAAU,CAAA,CAAE,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,6BAAA,CAA8B,KAAK,OAAO,CAAA;AACzE,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,8BAAA,CAA+B,KAAK,OAAO,CAAA;AAC3E,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,WAAA,EAAa,MAAA,EAAQ,KAAK,YAAA,EAAa;AAAA,EAC9D;AAAA,EAEA,mBAAA,GAAyD;AACvD,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,WAAA,EAAa,MAAA,EAAQ,KAAK,YAAA,EAAa;AAAA,EAC9D;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,EAAU;AAC5B,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,SAAA,GAAwB;AACtB,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,kBAAA,CAAmB,KAAK,OAAO,CAAA;AAC1D,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,2BAAA,CAA4B,KAAK,OAAO,CAAA;AACxE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,YAAA,GAAgC;AAC9B,IAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,EAAiB;AACrC,IAAA,IAAI,WAAW,UAAA,EAAY;AACzB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,gBAAA,GAAiC;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,QAAA,EAAU;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,0BAAA,CAA2B,KAAK,OAAO,CAAA;AAClE,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,WAAA,GAAc,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,YAAA,EAAc,OAAO,CAAA,CAAE,KAAA,EAAM;AACzF,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA,CAAO,yBAAA,CAA0B,IAAA,CAAK,OAAO,CAAA,GAAI,CAAA;AAEhE,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,aAAa,CAAA,EAAE;AAAA,EAC5C;AAAA,EAEA,UAAA,GAAyB;AACvB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,KAAK,OAAO,CAAA;AAC3D,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,oBAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,oCAAA,CAAqC,IAAA,CAAK,OAAO,CAAA;AAAA,EACtE;AAAA,EAEA,gBAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,6BAAA,CAA8B,IAAA,CAAK,OAAO,CAAA;AAAA,EAC/D;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AAC7C,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB;AACF,CAAA;AAKO,SAAS,qBAAA,CACd,QAAA,EACA,SAAA,EACA,WAAA,EACA,YAAA,EACe;AACf,EAAA,MAAM,MAAA,GAA0B,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAE3C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,KAAK,CAAA;AAC9C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,KAAK,CAAA;AAEhD,IAAA,IAAI,WAAA,IAAe,WAAA,IAAe,YAAA,IAAgB,YAAA,EAAc;AAC9D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AACT;;;ACzNO,IAAM,kBAAN,MAAsB;AAAA,EACV,MAAA;AAAA,EACT,OAAA,GAAU,CAAA;AAAA,EACV,KAAA,GAAQ,CAAA;AAAA,EACR,MAAA,GAAS,CAAA;AAAA,EACT,YAAA,GAAe,CAAA;AAAA,EACf,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,GAAW,KAAA;AAAA,EACX,WAAA,GAAc,CAAA;AAAA,EAEtB,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,aAAA,EAAc;AAC5B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,mBAAA,EAAoB;AAC/C,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,IAAA,CAAK,KAAA,EAAe,MAAA,EAAgB,OAAA,GAAU,EAAA,EAAU;AACtD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAI,IAAA,CAAK,OAAO,iBAAA,CAAkB,IAAA,CAAK,SAAS,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA,KAAM,CAAA,EAAG;AAC7E,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,MAAA,CAAO,kBAAA,CAAmB,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,2BAAA,CAA4B,KAAK,OAAO,CAAA;AACxE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,EACrB;AAAA,EAEA,cAAc,QAAA,EAA0B;AACtC,IAAA,IAAA,CAAK,iBAAA,CAAkB,SAAS,IAAI,CAAA;AAAA,EACtC;AAAA,EAEA,kBAAkB,IAAA,EAAwB;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,QAAA,EAAU;AAClC,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,YAAA,GAAe,KAAK,KAAA,GAAQ,CAAA;AAClC,IAAA,IAAI,IAAA,CAAK,eAAe,YAAA,EAAc;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,YAAY,CAAA,MAAA,EAAS,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AAAA,IAC3F;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,KAAK,YAAY,CAAA;AAC9C,IAAA,IAAI,KAAK,MAAA,CAAO,2BAAA,CAA4B,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AAC/D,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,IAAA,CAAK,WAAA,EAAA;AAAA,EACP;AAAA,EAEA,WAAA,GAA4B;AAC1B,IAAA,MAAM,SAAuB,EAAC;AAE9B,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,4BAAA,CAA6B,KAAK,OAAO,CAAA;AACjE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,4BAAA,CAA6B,KAAK,OAAO,CAAA;AAClE,MAAA,IAAI,CAAC,GAAA,IAAO,CAAC,IAAA,EAAM;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,KAAK,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,GAAA,EAAK,IAAI,CAAC,CAAA;AAChD,MAAA,IAAA,CAAK,MAAA,CAAO,sBAAA,CAAuB,IAAA,CAAK,OAAO,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAA,GAAuB;AACrB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,IAAA,CAAK,MAAA,EAAQ;AACpC,MAAA,MAAM,IAAI,MAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,WAAW,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,UAAA,CAAY,CAAA;AAAA,IACxF;AAEA,IAAA,IAAI,KAAK,MAAA,CAAO,mBAAA,CAAoB,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AACvD,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,OAAO,KAAK,WAAA,EAAY;AAAA,EAC1B;AAAA,EAEA,UAAU,MAAA,EAAiC;AACzC,IAAA,IAAA,CAAK,KAAA,EAAM;AAEX,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,GAAQ,CAAA;AAC7B,IAAA,MAAM,SAAuB,EAAC;AAC9B,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,QAAA,CAAS,CAAA,GAAI,UAAU,CAAA,GAAI,CAAA,IAAK,OAAO,CAAC,CAAA;AACtE,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,WAAA,EAAY,EAAG;AACtC,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,QAAA,KAAA,IAAS,KAAA,CAAM,UAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,MAAA,EAAO,EAAG;AACjC,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,MAAA,KAAA,IAAS,KAAA,CAAM,UAAA;AAAA,IACjB;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,KAAK,CAAA;AACnC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AACxB,MAAA,MAAA,IAAU,KAAA,CAAM,UAAA;AAAA,IAClB;AAEA,IAAA,OAAO,MAAA,CAAO,OAAO,KAAA,CAAM,MAAA,CAAO,YAAY,MAAA,CAAO,UAAA,GAAa,OAAO,UAAU,CAAA;AAAA,EACrF;AAAA,EAEA,qBAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,qCAAA,CAAsC,IAAA,CAAK,OAAO,CAAA;AAAA,EACvE;AAAA,EAEA,gBAAA,GAA2B;AACzB,IAAA,OAAO,KAAK,KAAA,GAAQ,CAAA;AAAA,EACtB;AAAA,EAEA,cAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AAC7C,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,EACrB;AACF,CAAA;;;ACtJO,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA;AAAA,EACA,OAAA,GAAkB,CAAA;AAAA,EAClB,OAAA,GAAkB,CAAA;AAAA,EAClB,KAAA,GAAgB,CAAA;AAAA,EAChB,MAAA,GAAiB,CAAA;AAAA,EACjB,QAAA,GAAoB,KAAA;AAAA,EACpB,YAAA,GAAuB,CAAA;AAAA,EACvB,OAAA,GAAmB,KAAA;AAAA,EACnB,QAAA,GAAoB,KAAA;AAAA,EACpB,UAAA,GAAqB,CAAA;AAAA,EAE7B,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,aAAA,EAAc;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,IAAA,EAIH;AACA,IAAA,MAAM,QAAQ,IAAA,YAAgB,WAAA,GAAc,IAAI,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA;AAGnE,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,uBAAA,EAAwB;AACnD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAGA,IAAA,IAAA,CAAK,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAG5C,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,2BAAA,CAA4B,IAAA,CAAK,OAAA,EAAS,KAAK,OAAA,EAAS,KAAA,CAAM,MAAM,CAAA,KAAM,CAAA,EAAG;AAC3F,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AAGA,IAAA,IAAI,KAAK,MAAA,CAAO,4BAAA,CAA6B,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AAChE,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,0BAAA,CAA2B,KAAK,OAAO,CAAA;AAChE,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,2BAAA,CAA4B,KAAK,OAAO,CAAA;AAClE,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,MAAA,CAAO,0BAAA,CAA2B,IAAA,CAAK,OAAO,CAAA,KAAM,CAAA;AAEzE,IAAA,OAAO,EAAE,OAAO,IAAA,CAAK,KAAA,EAAO,QAAQ,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAmD;AACjD,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,KAAK,MAAA,CAAO,sBAAA,CAAuB,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG;AAC1D,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,+BAAA,CAAgC,KAAK,OAAO,CAAA;AAC5E,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,GAAgC;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,QAAA,EAAU;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,MAAA,EAAQ;AAClC,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,yBAAA,CAA0B,KAAK,OAAO,CAAA;AAEjE,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,GAAQ,CAAA;AAC7B,IAAA,MAAM,OAAO,IAAI,UAAA;AAAA,MACf,IAAA,CAAK,OAAO,MAAA,CAAO,MAAA;AAAA,MACnB,IAAA,CAAK,YAAA;AAAA,MACL;AAAA,MACA,KAAA,EAAM;AAER,IAAA,MAAM,IAAI,IAAA,CAAK,UAAA;AACf,IAAA,IAAA,CAAK,UAAA,EAAA;AAGL,IAAA,IAAI,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,UAAA,IAAc,KAAK,MAAA,EAAQ;AAClD,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAC,gBAAA,GAAwC;AACvC,IAAA,IAAI,QAAA;AACJ,IAAA,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,YAAA,EAAa,MAAO,IAAA,EAAM;AAChD,MAAA,MAAM,QAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,GAAmE;AACjE,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAEA,IAAA,MAAM,SAAS,IAAI,UAAA,CAAW,KAAK,KAAA,GAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,GAAQ,CAAA;AAE7B,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,gBAAA,EAAiB,EAAG;AAC9C,MAAA,MAAA,CAAO,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA;AACjD,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAAA,IACjB;AAEA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAC9B,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AAAA,IACjB;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAAA,EACpB;AACF,CAAA;;;AChLA,IAAM,eAAA,GAAkB,EAAA;AAgBxB,SAAS,cAAA,GAAqC;AAC5C,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,MAAA;AACJ,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAW,CAAC,KAAK,GAAA,KAAQ;AAC3C,IAAA,OAAA,GAAU,GAAA;AACV,IAAA,MAAA,GAAS,GAAA;AAAA,EACX,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAQ;AACpC;AAEA,SAAS,cAAA,GAAiC;AACxC,EAAA,OAAO;AAAA,IACL,iBAAA,EAAmB,CAAA;AAAA,IACnB,cAAA,EAAgB,CAAA;AAAA,IAChB,sBAAA,EAAwB,CAAA;AAAA,IACxB,uBAAA,EAAyB,CAAA;AAAA,IACzB,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU,CAAA;AAAA,IACV,OAAO;AAAC,GACV;AACF;AAEA,SAAS,kBAAkB,MAAA,EAAkC;AAC3D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,KAAA,IAAS,KAAA,CAAM,UAAA;AAAA,EACjB;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,KAAK,CAAA;AACnC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AACxB,IAAA,MAAA,IAAU,KAAA,CAAM,UAAA;AAAA,EAClB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBAAoB,KAAA,EAAkC;AAC7D,EAAA,IAAI,KAAA,CAAM,UAAA,GAAa,CAAA,IAAK,KAAA,CAAM,CAAC,MAAM,GAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,EAAM;AAClE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,OAAO,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,UAAA,EAAY;AACrC,IAAA,IAAI,KAAA,CAAM,MAAM,CAAA,KAAM,GAAA,EAAM;AAC1B,MAAA,MAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,SAAS,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,MAAM,MAAM,GAAA,EAAM;AAC1D,MAAA,MAAA,EAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,IAAU,MAAM,UAAA,EAAY;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,EAAQ,CAAA;AAC7B,IAAA,IAAI,WAAW,GAAA,IAAQ,MAAA,KAAW,KAAS,MAAA,IAAU,GAAA,IAAQ,UAAU,GAAA,EAAO;AAC5E,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,KAAW,GAAA,IAAQ,MAAA,KAAW,GAAA,EAAM;AACtC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,UAAA,EAAY;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,gBAAiB,KAAA,CAAM,MAAM,KAAK,CAAA,GAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7D,IAAA,IAAI,aAAA,GAAgB,CAAA,IAAK,MAAA,GAAS,aAAA,GAAgB,MAAM,UAAA,EAAY;AAClE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eAAe,MAAA,GAAS,CAAA;AAC9B,IAAA,MAAM,gBAAgB,aAAA,GAAgB,CAAA;AACtC,IAAA,IACE,MAAA,KAAW,GAAA,IACX,aAAA,IAAiB,EAAA,IACjB,MAAM,YAAY,CAAA,KAAM,EAAA,IACxB,KAAA,CAAM,YAAA,GAAe,CAAC,CAAA,KAAM,GAAA,IAC5B,MAAM,YAAA,GAAe,CAAC,CAAA,KAAM,GAAA,IAC5B,KAAA,CAAM,YAAA,GAAe,CAAC,CAAA,KAAM,OAC5B,KAAA,CAAM,YAAA,GAAe,CAAC,CAAA,KAAM,CAAA,IAC5B,KAAA,CAAM,YAAA,GAAe,CAAC,MAAM,CAAA,EAC5B;AACA,MAAA,MAAM,OAAO,YAAA,GAAe,CAAA;AAC5B,MAAA,IAAI,IAAA,GAAO,CAAA,GAAI,KAAA,CAAM,UAAA,EAAY;AAC/B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,IAAI,CAAA,KAAM,MAAQ,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,KAAM,EAAA;AACjE,MAAA,MAAM,SAAA,GAAY,MAAM,IAAI,CAAA,KAAM,MAAQ,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,KAAM,EAAA;AAC9D,MAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,SAAA,EAAW;AAC/B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,SAAS,CAAC,KAAA,KACd,eACI,KAAA,CAAM,KAAK,IAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,IAAK,IACnC,KAAA,CAAM,KAAK,KAAK,CAAA,GAAK,KAAA,CAAM,QAAQ,CAAC,CAAA;AAE3C,MAAA,MAAM,SAAS,CAAC,KAAA,KACd,gBACK,KAAA,CAAM,KAAK,IACX,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,IAAK,IACpB,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,IAAK,EAAA,GACpB,MAAM,KAAA,GAAQ,CAAC,CAAA,IAAK,EAAA,MAAS,KAC5B,KAAA,CAAM,KAAK,KAAK,EAAA,GACjB,KAAA,CAAM,QAAQ,CAAC,CAAA,IAAK,EAAA,GACpB,KAAA,CAAM,QAAQ,CAAC,CAAA,IAAK,IACrB,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,MAAO,CAAA;AAG5B,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,GAAO,CAAC,CAAA;AACjC,MAAA,MAAM,WAAW,IAAA,GAAO,SAAA;AACxB,MAAA,IAAI,QAAA,GAAW,CAAA,GAAI,KAAA,CAAM,UAAA,EAAY;AACnC,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,UAAA,GAAa,OAAO,QAAQ,CAAA;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,QAAA,MAAM,KAAA,GAAQ,QAAA,GAAW,CAAA,GAAK,CAAA,GAAI,EAAA;AAClC,QAAA,IAAI,KAAA,GAAQ,EAAA,GAAK,KAAA,CAAM,UAAA,EAAY;AACjC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,QAAA,IAAI,QAAQ,GAAA,EAAQ;AAClB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC7B,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AAC9B,QAAA,IAAI,IAAA,KAAS,CAAA,IAAK,KAAA,KAAU,CAAA,EAAG;AAC7B,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,cAAc,KAAA,GAAQ,CAAA;AAC5B,QAAA,OAAO,YAAA,GACH,KAAA,CAAM,WAAW,CAAA,GAAK,MAAM,WAAA,GAAc,CAAC,CAAA,IAAK,CAAA,GAC/C,MAAM,WAAW,CAAA,IAAK,CAAA,GAAK,KAAA,CAAM,cAAc,CAAC,CAAA;AAAA,MACvD;AAAA,IACF;AAEA,IAAA,MAAA,IAAU,aAAA;AAAA,EACZ;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,4BAA4B,WAAA,EAAwC;AAC3E,EAAA,IAAI,CAAC,OAAO,SAAA,CAAU,WAAW,KAAK,WAAA,GAAc,CAAA,IAAK,cAAc,CAAA,EAAG;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW;AAAA,IAC7B,EAAA;AAAA,IAAM,GAAA;AAAA,IAAM,GAAA;AAAA,IAAM,GAAA;AAAA,IAAM,CAAA;AAAA,IAAM,CAAA;AAAA,IAC9B,EAAA;AAAA,IAAM,EAAA;AAAA,IAAM,EAAA;AAAA,IAAM,CAAA;AAAA,IAAM,CAAA;AAAA,IAAM,CAAA;AAAA,IAAM,CAAA;AAAA,IAAM,CAAA;AAAA,IAC1C,CAAA;AAAA,IAAM,CAAA;AAAA,IACN,EAAA;AAAA,IAAM,CAAA;AAAA,IACN,CAAA;AAAA,IAAM,CAAA;AAAA,IACN,CAAA;AAAA,IAAM,CAAA;AAAA,IAAM,CAAA;AAAA,IAAM,CAAA;AAAA,IAClB,WAAA,GAAc,GAAA;AAAA,IAAM,CAAA;AAAA,IAAM,CAAA;AAAA,IAAM,CAAA;AAAA,IAChC,CAAA;AAAA,IAAM,CAAA;AAAA,IAAM,CAAA;AAAA,IAAM;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,QAAQ,UAAA,GAAa,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,OAAA,CAAQ,aAAa,CAAC,CAAA;AACrD,EAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AACb,EAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AACb,EAAA,OAAA,CAAQ,CAAC,CAAA,GAAK,MAAA,IAAU,CAAA,GAAK,GAAA;AAC7B,EAAA,OAAA,CAAQ,CAAC,IAAI,MAAA,GAAS,GAAA;AACtB,EAAA,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAC,CAAA;AACtB,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,qBAAA,CAAsB,OAAmB,OAAA,EAAiC;AACjF,EAAA,IAAI,KAAA,CAAM,UAAA,GAAa,CAAA,IAAK,KAAA,CAAM,CAAC,MAAM,GAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,EAAM;AAClE,IAAA,OAAO,iBAAA,CAAkB,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,EAC3C;AAEA,EAAA,MAAM,SAAS,IAAI,UAAA,CAAW,KAAA,CAAM,UAAA,GAAa,QAAQ,UAAU,CAAA;AACnE,EAAA,MAAA,CAAO,CAAC,CAAA,GAAI,GAAA;AACZ,EAAA,MAAA,CAAO,CAAC,CAAA,GAAI,GAAA;AACZ,EAAA,MAAA,CAAO,GAAA,CAAI,SAAS,CAAC,CAAA;AACrB,EAAA,MAAA,CAAO,IAAI,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,GAAI,QAAQ,UAAU,CAAA;AACpD,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,8BAA8B,MAAA,EAGlB;AACzB,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,MAAA,CAAO,WAAW,CAAA;AACrD,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,iBAAA,CAAkB,MAAO,CAAA;AACvD,EAAA,OAAO,oBAAoB,QAAQ,CAAA;AACrC;AAEA,IAAM,eAAN,MAAmB;AAAA,EACR,QAAQ,cAAA,EAAe;AAAA,EAEhC,YAAY,IAAA,EAAe;AACzB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,KAAK,OAAA,EAAuB;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,WAAW,KAAA,EAAqB;AAC9B,IAAA,IAAA,CAAK,MAAM,OAAA,IAAW,KAAA;AAAA,EACxB;AAAA,EAEA,YAAY,KAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,MAAM,QAAA,IAAY,KAAA;AAAA,EACzB;AAAA,EAEA,MAAA,CAAO,aAAA,EAAuB,cAAA,EAAwB,UAAA,EAAoB,aAAA,EAA6B;AACrG,IAAA,IAAA,CAAK,MAAM,sBAAA,GAAyB,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,wBAAwB,aAAa,CAAA;AAC7F,IAAA,IAAA,CAAK,MAAM,uBAAA,GAA0B,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,yBAAyB,cAAc,CAAA;AAChG,IAAA,IAAA,CAAK,MAAM,cAAA,GAAiB,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,gBAAgB,UAAU,CAAA;AAC1E,IAAA,IAAA,CAAK,MAAM,iBAAA,GAAoB,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,mBAAmB,aAAa,CAAA;AAAA,EACrF;AAAA,EAEA,QAAA,GAA2B;AACzB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,EACvD;AACF,CAAA;AAEA,SAAS,YAAA,CAAa,OAAA,EAA2B,KAAA,EAAe,MAAA,EAAgB;AAC9E,EAAA,OAAO,yBAAA;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAQ,KAAA,IAAS,KAAA;AAAA,IACjB,QAAQ,MAAA,IAAU;AAAA,GACpB;AACF;AAEA,SAAS,iBAAA,CACP,iBACA,IAAA,EACA,KAAA,GAAiC,QAAQ,OAAA,CAAQ,cAAA,EAAgB,CAAA,EACpD;AACb,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,CAAC,MAAA,CAAO,aAAa,CAAA,GAAI;AACvB,MAAA,OAAO,eAAA,EAAgB,CAAE,MAAA,CAAO,aAAa,CAAA,EAAE;AAAA,IACjD;AAAA,GACF;AACF;AAEA,SAAS,kBAAA,CACP,eAAA,EACA,IAAA,EACA,KAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,CAAC,MAAA,CAAO,aAAa,CAAA,GAAI;AACvB,MAAA,OAAO,eAAA,EAAgB,CAAE,MAAA,CAAO,aAAa,CAAA,EAAE;AAAA,IACjD;AAAA,GACF;AACF;AAEA,gBAAgB,qBAAA,CACd,MAAA,EACA,KAAA,EACA,MAAA,EACyB;AACzB,EAAA,MAAM,UAAU,KAAA,GAAQ,CAAA;AACxB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM;AAAA,MACJ,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,OAAA,EAAA,CAAU,CAAA,GAAI,KAAK,OAAO,CAAA;AAAA,MACpD,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAEA,gBAAgB,mBAAmB,MAAA,EAGhC;AACD,EAAA,MAAM,WAAW,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,CAAO,aAAa,CAAA,EAAE;AACrD,EAAA,IAAI,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AAElC,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA;AAAA,EACF;AAEA,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,MAAM;AAAA,MACJ,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,OAAA,EAAS,KAAK,IAAA,KAAS;AAAA,KACzB;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,IAAA,EAAM;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AACF;AAEA,gBAAgB,qBACd,KAAA,EACyB;AACzB,EAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,QAAQ,CAAA;AACzC,EAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,IAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,EAC5C;AAEA,EAAA,MAAM,QAAA,EAAS;AAEf,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,IAAA,MAAME,QAAAA,GAAU,IAAI,eAAA,EAAgB;AACpC,IAAA,IAAI;AACF,MAAA,IAAI,QAAA,CAAS,SAAS,OAAA,EAAS;AAC7B,QAAA,MAAMC,MAAAA,GAAQ,MAAM,kBAAA,CAAmB,QAAQ,CAAA;AAC/C,QAAAD,QAAAA,CAAQ,IAAA,CAAK,aAAA,CAAcC,MAAK,CAAC,CAAA;AACjC,QAAAD,SAAQ,KAAA,EAAM;AAEd,QAAA,OAAO,IAAA,EAAM;AACX,UAAA,MAAM,QAAA,GAAWA,SAAQ,YAAA,EAAa;AACtC,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA;AAAA,UACF;AACA,UAAA,MAAM,QAAA;AAAA,QACR;AAEA,QAAA,IAAIA,QAAAA,CAAQ,UAAA,EAAW,KAAM,OAAA,EAAS;AACpC,UAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,QAChE;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,WAAA,GAAc,KAAA;AAClB,MAAA,IAAI,OAAA,GAAU,KAAA;AAEd,MAAA,WAAA,MAAiB,EAAE,KAAA,EAAO,OAAA,EAAQ,IAAK,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AACnE,QAAAA,QAAAA,CAAQ,SAAA,CAAU,KAAA,EAAO,OAAO,CAAA;AAEhC,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,MAAM,UAAA,GAAaA,SAAQ,cAAA,EAAe;AAC1C,UAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,YAAA,WAAA,GAAc,IAAA;AAAA,UAChB,CAAA,MAAO;AACL,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,SAAA,GAAYA,SAAQ,SAAA,EAAU;AACpC,UAAA,IAAI,cAAc,OAAA,EAAS;AACzB,YAAA,OAAA,GAAU,IAAA;AAAA,UACZ,CAAA,MAAO;AACL,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO,IAAA,EAAM;AACX,UAAA,MAAM,QAAA,GAAWA,SAAQ,gBAAA,EAAiB;AAC1C,UAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,YAAA;AAAA,UACF;AACA,UAAA,IAAI,aAAa,IAAA,EAAM;AACrB,YAAA,IAAIA,QAAAA,CAAQ,UAAA,EAAW,KAAM,OAAA,EAAS;AACpC,cAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,YAChE;AACA,YAAA;AAAA,UACF;AACA,UAAA,MAAM,QAAA;AAAA,QACR;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,IAAIA,QAAAA,CAAQ,cAAA,EAAe,KAAM,OAAA,EAAS;AACxC,UAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,QACzC;AACA,QAAA,WAAA,GAAc,IAAA;AAAA,MAChB;AAEA,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,IAAIA,QAAAA,CAAQ,SAAA,EAAU,KAAM,OAAA,EAAS;AACnC,UAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,QACzC;AACA,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAEA,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,QAAA,GAAWA,SAAQ,gBAAA,EAAiB;AAC1C,QAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,UAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,QAChD;AACA,QAAA,IAAI,aAAa,IAAA,EAAM;AACrB,UAAA;AAAA,QACF;AACA,QAAA,MAAM,QAAA;AAAA,MACR;AAEA,MAAA,IAAIA,QAAAA,CAAQ,UAAA,EAAW,KAAM,OAAA,EAAS;AACpC,QAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,MAChE;AACA,MAAA;AAAA,IACF,CAAA,SAAE;AACA,MAAAA,SAAQ,OAAA,EAAQ;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,kBAAA,CAAmB,QAAQ,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAElC,EAAA,IAAI,IAAA,CAAK,WAAW,KAAA,EAAO;AACzB,IAAA,MAAMA,QAAAA,GAAU,IAAI,cAAA,EAAe;AACnC,IAAA,IAAI;AACF,MAAAA,QAAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,MAAAA,SAAQ,KAAA,EAAM;AACd,MAAA,KAAA,MAAW,QAAA,IAAYA,QAAAA,CAAQ,gBAAA,EAAiB,EAAG;AACjD,QAAA,MAAM,QAAA;AAAA,MACR;AAAA,IACF,CAAA,SAAE;AACA,MAAAA,SAAQ,OAAA,EAAQ;AAAA,IAClB;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,CAAc,IAAA,CAAK,QAAQ,MAAM,CAAA;AACvD,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,EAAO;AACrC,IAAA,OAAO,sBAAsB,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,KAAA,EAAO,QAAQ,MAAM,CAAA;AAAA,EAC5E,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAClB;AACF;AAEO,SAAS,OAAO,KAAA,EAA6C;AAClE,EAAA,MAAM,eAAe,cAAA,EAA2G;AAEhI,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,gBAAgB,cAAA,GAAiB;AAC9D,IAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,QAAQ,CAAA;AACzC,IAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,YAAA,CAAa,OAAA,CAAQ;AAAA,MACnB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,gBAAgB,IAAA,CAAK;AAAA,KACtB,CAAA;AAED,IAAA,OAAO,qBAAqB,QAAQ,CAAA;AAAA,EACtC,CAAA,GAAG;AAEH,EAAA,OAAO,iBAAA,CAAkB,eAAA,EAAiB,YAAA,CAAa,OAAO,CAAA;AAChE;AAEO,SAAS,MAAA,CAAO,QAAqB,OAAA,EAAwC;AAClF,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,IAAA,KAAS;AAC7C,IAAA,MAAM,SAAS,YAAA,CAAa,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAC5D,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,gBAAgB,IAAA,CAAK;AAAA,KACvB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,gBAAgB,cAAA,GAAiB;AAC9D,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAA;AAChC,IAAA,MAAM,SAAS,YAAA,CAAa,OAAA,EAAS,UAAA,CAAW,KAAA,EAAO,WAAW,MAAM,CAAA;AACxE,IAAA,MAAM,KAAA,GAAQ,iBAAA;AAAA,MACZ,UAAA,CAAW,KAAA;AAAA,MACX,UAAA,CAAW,MAAA;AAAA,MACX,MAAA,CAAO,KAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAEA,IAAA,WAAA,MAAiB,YAAY,MAAA,EAAQ;AACnC,MAAA,MAAM,SAAS,eAAA,CAAgB,KAAA,EAAO,QAAA,CAAS,IAAA,EAAM,SAAS,CAAC,CAAA;AAC/D,MAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,QAAA,MAAM,IAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,KAAK,CAAA,EAAG;AACrC,MAAA,MAAM,IAAA;AAAA,IACR;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,OAAO,iBAAA,CAAkB,iBAAiB,WAAA,EAAa,MAAA,CAAO,SAAS,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,CAAC,CAAA;AAC1G;AAEO,SAAS,UAAA,CAAW,MAAA,EAAqB,OAAA,GAA4B,EAAC,EAAiB;AAC5F,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,eAAA;AACnC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,IAAA,MAAU;AAAA,IAC9C,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAA,EAAU,YAAA;AAAA,IACV,gBAAgB,IAAA,CAAK;AAAA,GACvB,CAAE,CAAA;AAEF,EAAA,MAAM,eAAe,MAAA,CAAO,KAAA,IAAS,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AAErE,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,gBAAgB,cAAA,GAAiB;AAC9D,IAAA,MAAM,QAAA,EAAS;AACf,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,EAAgB;AAEpC,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,OAAO,CAAA;AAC7C,MAAA,OAAA,CAAQ,KAAA,EAAM;AAEd,MAAA,WAAA,MAAiB,YAAY,MAAA,EAAQ;AACnC,QAAA,OAAA,CAAQ,cAAc,QAAQ,CAAA;AAC9B,QAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,WAAA,EAAY,EAAG;AACzC,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,EAAO,EAAG;AACpC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,IAClB;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,OAAO,kBAAA,CAAmB,eAAA,EAAiB,WAAA,EAAa,YAAY,CAAA;AACtE;AAEA,gBAAgB,gBAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,EACA,cACA,KAAA,EAC2B;AAC3B,EAAA,MAAM,QAAA,EAAS;AAEf,EAAA,MAAM,WAAA,GAAc,MAAM,6BAAA,CAA8B,MAAM,CAAA;AAC9D,EAAA,MAAM,kBAAA,GAAqB,WAAA,GAAc,2BAAA,CAA4B,WAAW,CAAA,GAAI,IAAA;AACpF,EAAA,MAAM,SAAS,YAAA,CAAa,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,IAAI,eAAA,EAAgB;AACpC,EAAA,MAAM,OAAA,GAAU,IAAI,eAAA,EAAgB;AACpC,EAAA,IAAI,cAAc,iBAAA,CAAkB,CAAA,EAAG,GAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACrE,EAAA,IAAI,cAAc,IAAA,CAAK,KAAA;AACvB,EAAA,IAAI,eAAe,IAAA,CAAK,MAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,sBAAsB,IAAA,CAAK,KAAA,EAAO,KAAK,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AACxF,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,iBAAA,GAAoB,KAAA;AAExB,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,MAAM,eACH,WAAA,CAAY,OAAA,EAAS,cAAc,CAAA,KACnC,WAAA,CAAY,SAAS,UAAA,IAAc,CAAA,CAAA;AACtC,IAAA,MAAM,UAAA,GACJ,OAAA,CAAQ,oBAAA,EAAqB,GAC7B,OAAA,CAAQ,gBAAA,EAAiB,GACzB,OAAA,CAAQ,qBAAA,EAAsB,GAC9B,OAAA,CAAQ,gBAAA,EAAiB;AAC3B,IAAA,MAAM,gBAAgB,UAAA,GAAa,WAAA;AACnC,IAAA,KAAA,CAAM,MAAA,CAAO,QAAQ,oBAAA,EAAqB,EAAG,QAAQ,qBAAA,EAAsB,EAAG,YAAY,aAAa,CAAA;AAAA,EACzG,CAAA;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,KAAA,GAAQ,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAC7C,MAAA,KAAA,CAAM,UAAA,CAAW,MAAM,UAAU,CAAA;AACjC,MAAA,OAAA,EAAQ;AAER,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,WAAW,CAAA,CAAE,CAAA;AAAA,MAC9C;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AACjC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AACrC,MAAA,WAAA,GAAc,MAAA,CAAO,KAAA;AACrB,MAAA,YAAA,GAAe,MAAA,CAAO,MAAA;AACtB,MAAA,WAAA,GAAc,iBAAA,CAAkB,OAAO,KAAA,EAAO,MAAA,CAAO,QAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACxF,MAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,KAAA,EAAO,OAAO,MAAA,EAAQ,OAAA,CAAQ,WAAW,eAAe,CAAA;AAC5E,MAAA,OAAA,CAAQ,KAAA,EAAM;AACd,MAAA,OAAA,CAAQ,KAAA,EAAM;AACd,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,YAAA,CAAa,OAAA,CAAQ;AAAA,QACnB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,QAAA,EAAU,YAAA;AAAA,QACV,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,KAAK,CAAA,CAAE,CAAA;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AACxD,MAAA,OAAA,EAAQ;AAER,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,QAAA,GAAW,QAAQ,YAAA,EAAa;AACtC,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,kBAAkB,eAAA,CAAgB,WAAA,EAAa,QAAA,CAAS,IAAA,EAAM,SAAS,CAAC,CAAA;AAC9E,QAAA,OAAA,EAAQ;AAER,QAAA,KAAA,MAAW,eAAe,eAAA,EAAiB;AACzC,UAAA,OAAA,CAAQ,cAAc,WAAW,CAAA;AACjC,UAAA,OAAA,EAAQ;AACR,UAAA,KAAA,MAAW,SAAA,IAAa,OAAA,CAAQ,WAAA,EAAY,EAAG;AAC7C,YAAA,MAAM,YAAY,CAAC,iBAAA,IAAqB,qBACpC,qBAAA,CAAsB,SAAA,EAAW,kBAAkB,CAAA,GACnD,SAAA;AACJ,YAAA,iBAAA,GAAoB,IAAA;AACpB,YAAA,KAAA,CAAM,WAAA,CAAY,UAAU,UAAU,CAAA;AACtC,YAAA,OAAA,EAAQ;AACR,YAAA,MAAM,SAAA;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,CAAQ,UAAA,EAAW,KAAM,OAAA,EAAS;AACpC,QAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,MAChE;AAEA,MAAA,KAAA,MAAW,WAAA,IAAe,WAAA,CAAY,WAAW,CAAA,EAAG;AAClD,QAAA,OAAA,CAAQ,cAAc,WAAW,CAAA;AACjC,QAAA,OAAA,EAAQ;AACR,QAAA,KAAA,MAAW,SAAA,IAAa,OAAA,CAAQ,WAAA,EAAY,EAAG;AAC7C,UAAA,MAAM,YAAY,CAAC,iBAAA,IAAqB,qBACpC,qBAAA,CAAsB,SAAA,EAAW,kBAAkB,CAAA,GACnD,SAAA;AACJ,UAAA,iBAAA,GAAoB,IAAA;AACpB,UAAA,KAAA,CAAM,WAAA,CAAY,UAAU,UAAU,CAAA;AACtC,UAAA,OAAA,EAAQ;AACR,UAAA,MAAM,SAAA;AAAA,QACR;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,SAAA,IAAa,OAAA,CAAQ,MAAA,EAAO,EAAG;AACxC,QAAA,MAAM,YAAY,CAAC,iBAAA,IAAqB,qBACpC,qBAAA,CAAsB,SAAA,EAAW,kBAAkB,CAAA,GACnD,SAAA;AACJ,QAAA,iBAAA,GAAoB,IAAA;AACpB,QAAA,KAAA,CAAM,WAAA,CAAY,UAAU,UAAU,CAAA;AACtC,QAAA,OAAA,EAAQ;AACR,QAAA,MAAM,SAAA;AAAA,MACR;AAEA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,WAAW,CAAA,CAAE,CAAA;AAAA,IAC9C;AAEA,IAAA,WAAA,MAAiB,EAAE,KAAA,EAAO,OAAA,EAAQ,IAAK,kBAAA,CAAmB,MAAM,CAAA,EAAG;AACjE,MAAA,KAAA,CAAM,UAAA,CAAW,MAAM,UAAU,CAAA;AACjC,MAAA,OAAA,CAAQ,SAAA,CAAU,OAAO,OAAO,CAAA;AAChC,MAAA,OAAA,EAAQ;AAER,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAM,UAAA,GAAa,QAAQ,cAAA,EAAe;AAC1C,QAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,UAAA;AAAA,QACF;AAEA,QAAA,WAAA,GAAc,IAAA;AACd,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AACrC,QAAA,WAAA,GAAc,MAAA,CAAO,KAAA;AACrB,QAAA,YAAA,GAAe,MAAA,CAAO,MAAA;AACtB,QAAA,WAAA,GAAc,iBAAA,CAAkB,OAAO,KAAA,EAAO,MAAA,CAAO,QAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACxF,QAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,KAAA,EAAO,OAAO,MAAA,EAAQ,OAAA,CAAQ,WAAW,eAAe,CAAA;AAC5E,QAAA,OAAA,CAAQ,KAAA,EAAM;AACd,QAAA,YAAA,CAAa,OAAA,CAAQ;AAAA,UACnB,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,QAAA,EAAU,YAAA;AAAA,UACV,cAAA,EAAgB;AAAA,SACjB,CAAA;AACD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,KAAK,CAAA,CAAE,CAAA;AACtC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAA;AACxD,QAAA,OAAA,EAAQ;AAAA,MACV;AAEA,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,EAAU;AACpC,QAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,UAAA;AAAA,QACF;AAEA,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,OAAA,EAAQ;AAAA,MACV;AAEA,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,QAAA,GAAW,QAAQ,gBAAA,EAAiB;AAC1C,QAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,UAAA;AAAA,QACF;AACA,QAAA,IAAI,aAAa,IAAA,EAAM;AACrB,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,kBAAkB,eAAA,CAAgB,WAAA,EAAa,QAAA,CAAS,IAAA,EAAM,SAAS,CAAC,CAAA;AAC9E,QAAA,OAAA,EAAQ;AAER,QAAA,KAAA,MAAW,eAAe,eAAA,EAAiB;AACzC,UAAA,OAAA,CAAQ,cAAc,WAAW,CAAA;AACjC,UAAA,OAAA,EAAQ;AACR,UAAA,KAAA,MAAW,SAAA,IAAa,OAAA,CAAQ,WAAA,EAAY,EAAG;AAC7C,YAAA,MAAM,YAAY,CAAC,iBAAA,IAAqB,qBACpC,qBAAA,CAAsB,SAAA,EAAW,kBAAkB,CAAA,GACnD,SAAA;AACJ,YAAA,iBAAA,GAAoB,IAAA;AACpB,YAAA,KAAA,CAAM,WAAA,CAAY,UAAU,UAAU,CAAA;AACtC,YAAA,OAAA,EAAQ;AACR,YAAA,MAAM,SAAA;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,UAAA,EAAW,KAAM,OAAA,EAAS;AACpC,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AAEA,IAAA,KAAA,MAAW,WAAA,IAAe,WAAA,CAAY,WAAW,CAAA,EAAG;AAClD,MAAA,OAAA,CAAQ,cAAc,WAAW,CAAA;AACjC,MAAA,OAAA,EAAQ;AACR,MAAA,KAAA,MAAW,SAAA,IAAa,OAAA,CAAQ,WAAA,EAAY,EAAG;AAC7C,QAAA,MAAM,YAAY,CAAC,iBAAA,IAAqB,qBACpC,qBAAA,CAAsB,SAAA,EAAW,kBAAkB,CAAA,GACnD,SAAA;AACJ,QAAA,iBAAA,GAAoB,IAAA;AACpB,QAAA,KAAA,CAAM,WAAA,CAAY,UAAU,UAAU,CAAA;AACtC,QAAA,OAAA,EAAQ;AACR,QAAA,MAAM,SAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,SAAA,IAAa,OAAA,CAAQ,MAAA,EAAO,EAAG;AACxC,MAAA,MAAM,YAAY,CAAC,iBAAA,IAAqB,qBACpC,qBAAA,CAAsB,SAAA,EAAW,kBAAkB,CAAA,GACnD,SAAA;AACJ,MAAA,iBAAA,GAAoB,IAAA;AACpB,MAAA,KAAA,CAAM,WAAA,CAAY,UAAU,UAAU,CAAA;AACtC,MAAA,OAAA,EAAQ;AACR,MAAA,MAAM,SAAA;AAAA,IACR;AAAA,EACF,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAClB;AACF;AAEA,gBAAgB,oBAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,EACA,cACA,KAAA,EAC2B;AAC3B,EAAA,MAAM,KAAA,GAAQ,MAAM,kBAAA,CAAmB,MAAM,CAAA;AAC7C,EAAA,KAAA,CAAM,UAAA,CAAW,MAAM,UAAU,CAAA;AACjC,EAAA,KAAA,CAAM,OAAO,KAAA,CAAM,UAAA,EAAY,GAAG,KAAA,CAAM,UAAA,EAAY,MAAM,UAAU,CAAA;AACpE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,eAAA,CAAiB,CAAA;AAC1C,EAAA,MAAM,QAAA,EAAS;AAEf,EAAA,MAAM,SAAS,YAAA,CAAa,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,IAAI,eAAA,EAAgB;AACpC,EAAA,IAAI,SAAA;AAEJ,EAAA,IAAI,IAAA,CAAK,WAAW,KAAA,EAAO;AACzB,IAAA,MAAM,OAAA,GAAU,IAAI,cAAA,EAAe;AACnC,IAAA,OAAA,CAAQ,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAA,EAAM;AAEd,IAAA,MAAM,KAAA,GAAQ,kBAAkB,IAAA,CAAK,KAAA,EAAO,KAAK,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AACpF,IAAA,SAAA,GAAA,CAAa,gBAAgB,OAAA,GAAU;AACrC,MAAA,IAAI;AACF,QAAA,KAAA,MAAW,QAAA,IAAY,OAAA,CAAQ,gBAAA,EAAiB,EAAG;AACjD,UAAA,KAAA,MAAW,eAAe,eAAA,CAAgB,KAAA,EAAO,SAAS,IAAA,EAAM,QAAA,CAAS,CAAC,CAAA,EAAG;AAC3E,YAAA,MAAM,WAAA;AAAA,UACR;AAAA,QACF;AAEA,QAAA,KAAA,MAAW,WAAA,IAAe,WAAA,CAAY,KAAK,CAAA,EAAG;AAC5C,UAAA,MAAM,WAAA;AAAA,QACR;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,MAClB;AAAA,IACF,CAAA,GAAG;AAAA,EACL,CAAA,MAAO;AACL,IAAA,MAAM,UAAU,MAAM,aAAA,CAAc,KAAK,MAAA,EAAQ,aAAA,CAAc,KAAK,CAAC,CAAA;AACrE,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,EAAO;AACrC,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAEhB,IAAA,MAAM,KAAA,GAAQ,kBAAkB,OAAA,CAAQ,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAC1F,IAAA,SAAA,GAAA,CAAa,gBAAgB,YAAA,GAAe;AAC1C,MAAA,WAAA,MAAiB,GAAA,IAAO,sBAAsB,OAAA,CAAQ,MAAA,EAAQ,QAAQ,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC5F,QAAA,KAAA,MAAW,eAAe,eAAA,CAAgB,KAAA,EAAO,IAAI,IAAA,EAAM,GAAA,CAAI,CAAC,CAAA,EAAG;AACjE,UAAA,MAAM,WAAA;AAAA,QACR;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,WAAA,IAAe,WAAA,CAAY,KAAK,CAAA,EAAG;AAC5C,QAAA,MAAM,WAAA;AAAA,MACR;AAAA,IACF,CAAA,GAAG;AAAA,EACL;AAEA,EAAA,YAAA,CAAa,OAAA,CAAQ;AAAA,IACnB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAA,EAAU,YAAA;AAAA,IACV,gBAAgB,IAAA,CAAK;AAAA,GACtB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,KAAA,EAAO,OAAO,MAAA,EAAQ,OAAA,CAAQ,WAAW,eAAe,CAAA;AAC5E,IAAA,OAAA,CAAQ,KAAA,EAAM;AAEd,IAAA,WAAA,MAAiB,YAAY,SAAA,EAAW;AACtC,MAAA,OAAA,CAAQ,cAAc,QAAQ,CAAA;AAC9B,MAAA,MAAM,aAAa,KAAA,CAAM,UAAA,GAAa,QAAQ,qBAAA,EAAsB,GAAI,QAAQ,gBAAA,EAAiB;AACjG,MAAA,KAAA,CAAM,OAAO,KAAA,CAAM,UAAA,EAAY,QAAQ,qBAAA,EAAsB,EAAG,YAAY,UAAU,CAAA;AACtF,MAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,WAAA,EAAY,EAAG;AACzC,QAAA,KAAA,CAAM,WAAA,CAAY,MAAM,UAAU,CAAA;AAClC,QAAA,KAAA,CAAM,OAAO,KAAA,CAAM,UAAA,EAAY,QAAQ,qBAAA,EAAsB,EAAG,YAAY,UAAU,CAAA;AACtF,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,EAAO,EAAG;AACpC,MAAA,KAAA,CAAM,WAAA,CAAY,MAAM,UAAU,CAAA;AAClC,MAAA,MAAM,aAAa,KAAA,CAAM,UAAA,GAAa,QAAQ,qBAAA,EAAsB,GAAI,QAAQ,gBAAA,EAAiB;AACjG,MAAA,KAAA,CAAM,OAAO,KAAA,CAAM,UAAA,EAAY,QAAQ,qBAAA,EAAsB,EAAG,YAAY,UAAU,CAAA;AACtF,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAClB;AACF;AAEO,SAAS,SAAA,CAAU,KAAA,EAAgC,OAAA,GAA4B,EAAC,EAAiB;AACtG,EAAA,MAAM,eAAe,cAAA,EAAiC;AACtD,EAAA,MAAM,gBAAgB,cAAA,EAA+B;AAErD,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,gBAAgB,iBAAA,GAAoB;AACjE,IAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,QAAQ,CAAA;AACzC,IAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,QAAQ,IAAI,YAAA;AAAA,MAChB,QAAA,CAAS,IAAA,KAAS,QAAA,GAAW,iBAAA,GAAoB;AAAA,KACnD;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,QAAA,OAAO,gBAAA,CAAiB,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,cAAc,KAAK,CAAA;AAAA,MACtE,CAAA,MAAO;AACL,QAAA,OAAO,oBAAA,CAAqB,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,cAAc,KAAK,CAAA;AAAA,MAC1E;AAEA,MAAA,aAAA,CAAc,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,IACxC,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,OAAO,KAAK,CAAA;AACzB,MAAA,aAAA,CAAc,OAAO,KAAK,CAAA;AAC1B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,OAAO,kBAAA,CAAmB,eAAA,EAAiB,YAAA,CAAa,OAAA,EAAS,cAAc,OAAO,CAAA;AACxF;AAEA,eAAsB,KAAA,CAAM,OAAA,GAAuD,EAAC,EAAkB;AACpG,EAAA,IAAI,OAAA,CAAQ,IAAA,YAAgB,WAAA,CAAY,MAAA,EAAQ;AAC9C,IAAA,MAAM,kBAAA,CAAmB,QAAQ,IAAI,CAAA;AACrC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,gBAAgB,WAAA,EAAa;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACvD,IAAA,MAAM,mBAAmB,QAAQ,CAAA;AACjC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,EAAS;AACjB;AAEA,eAAsB,QAAQ,KAAA,EAI3B;AACD,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,WAAA,MAAiB,SAAS,KAAA,EAAO;AAC/B,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,IAAA,KAAA,IAAS,KAAA,CAAM,UAAA;AAAA,EACjB;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,KAAK,CAAA;AACnC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AACxB,IAAA,MAAA,IAAU,KAAA,CAAM,UAAA;AAAA,EAClB;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAO,MAAA,CAAO,KAAA,CAAM,OAAO,UAAA,EAAY,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,UAAU,CAAA;AAAA,IAClF,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,IAClB,KAAA,EAAO,MAAM,KAAA,CAAM;AAAA,GACrB;AACF;AAEO,SAAS,iBAAiB,KAAA,EAAiD;AAChF,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,aAAa,CAAA,EAAE;AAC7C,EAAA,OAAO,IAAI,cAAA,CAA2B;AAAA,IACpC,MAAM,KAAK,UAAA,EAAY;AACrB,MAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,MAAM,SAAS,IAAA,EAAK;AAC5C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,KAAA,EAAM;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,MAAM,OAAO,MAAA,EAAQ;AACnB,MAAA,IAAI,OAAO,QAAA,CAAS,MAAA,KAAW,UAAA,EAAY;AACzC,QAAA,MAAM,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,MAC9B;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAEO,SAAS,UAAA,CAAW,KAAA,EAAqB,IAAA,GAAqB,EAAC,EAAa;AACjF,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AACxC,EAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,YAAY,CAAA;AAExC,EAAA,OAAO,IAAI,QAAA,CAAS,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAAA,IAC3C,GAAG,IAAA;AAAA,IACH;AAAA,GACD,CAAA;AACH","file":"index.js","sourcesContent":["import type { ImageFormat, Scanline } from '../types';\nimport type { Decoder } from './types';\n\ntype CodecWasmBinary = ArrayBuffer | Uint8Array | WebAssembly.Module;\n\n/**\n * Detect Cloudflare Workers/workerd runtime even when node compat is enabled.\n */\nfunction isCloudflareWorker(): boolean {\n const cacheStorage = (globalThis as { caches?: CacheStorage & { default?: Cache } }).caches;\n return typeof cacheStorage !== 'undefined' && typeof cacheStorage.default !== 'undefined';\n}\n\nfunction getPreloadedCodecBinary(format: 'avif' | 'webp'): CodecWasmBinary | null {\n const globalValue = (globalThis as Record).__SIP_CODEC_WASM__;\n if (!globalValue || typeof globalValue !== 'object') {\n return null;\n }\n\n const formatValue = (globalValue as Record)[format];\n if (\n formatValue instanceof ArrayBuffer ||\n formatValue instanceof Uint8Array ||\n formatValue instanceof WebAssembly.Module\n ) {\n return formatValue;\n }\n\n return null;\n}\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNode(): boolean {\n if (isCloudflareWorker()) {\n return false;\n }\n\n return typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n}\n\nasync function initCodecWithBinary(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initFn: (module: WebAssembly.Module) => Promise,\n wasmSource: CodecWasmBinary\n): Promise {\n if (wasmSource instanceof WebAssembly.Module) {\n await initFn(wasmSource);\n return;\n }\n\n let buffer: ArrayBuffer;\n\n if (wasmSource instanceof Uint8Array) {\n const copy = new Uint8Array(wasmSource.byteLength);\n copy.set(wasmSource);\n buffer = copy.buffer;\n } else {\n buffer = wasmSource;\n }\n\n const wasmModule = await WebAssembly.compile(buffer);\n await initFn(wasmModule);\n}\n\n/**\n * Initialize a @jsquash codec for Node.js by loading its WASM module\n */\nasync function initCodecForNode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initFn: (module: WebAssembly.Module) => Promise,\n wasmPath: string\n): Promise {\n // Dynamic module names prevent esbuild/wrangler from resolving these\n // at bundle time. Only Node.js reaches this function at runtime.\n const fsModule = 'fs/promises';\n const moduleModule = 'module';\n const { readFile } = await import(/* @vite-ignore */ fsModule);\n const { createRequire } = await import(/* @vite-ignore */ moduleModule);\n const require = createRequire(import.meta.url);\n\n // Resolve the WASM file path from the package\n const resolvedPath = require.resolve(wasmPath);\n const wasmBuffer = await readFile(resolvedPath);\n const wasmModule = await WebAssembly.compile(wasmBuffer);\n await initFn(wasmModule);\n}\n\n/**\n * Simple decoder for WebP and AVIF formats\n *\n * This decoder handles formats that don't have native WASM support yet.\n * For JPEG and PNG, use the native WASM decoders which are more memory efficient.\n *\n * Works with:\n * - WebP via external @jsquash/webp\n * - AVIF via external @jsquash/avif\n *\n * Supports both Node.js and browser/Workers environments.\n */\nexport class SimpleDecoder implements Decoder {\n readonly format: ImageFormat;\n readonly supportsScanline = false;\n readonly supportsScaledDecode = false;\n\n private data: ArrayBuffer;\n private width = 0;\n private height = 0;\n private hasAlpha = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private decodeFn: ((data: ArrayBuffer) => Promise) | null = null;\n\n constructor(format: ImageFormat, data: ArrayBuffer) {\n this.format = format;\n this.data = data;\n }\n\n async init(data: ArrayBuffer): Promise<{ width: number; height: number; hasAlpha: boolean }> {\n this.data = data;\n\n // Get decoder function based on format\n // In Node.js, we need to manually initialize the WASM modules\n // The init function is on the submodule (e.g. @jsquash/webp/decode.js)\n // Note: JPEG and PNG use native WASM decoders, not this fallback\n switch (this.format) {\n case 'avif': {\n const { default: decode, init } = await import('@jsquash/avif/decode.js');\n const preloaded = getPreloadedCodecBinary('avif');\n if (preloaded) {\n await initCodecWithBinary(init, preloaded);\n } else if (isNode()) {\n await initCodecForNode(init, '@jsquash/avif/codec/dec/avif_dec.wasm');\n }\n this.decodeFn = decode;\n this.hasAlpha = true; // AVIF may have alpha\n break;\n }\n case 'webp': {\n const { default: decode, init } = await import('@jsquash/webp/decode.js');\n const preloaded = getPreloadedCodecBinary('webp');\n if (preloaded) {\n await initCodecWithBinary(init, preloaded);\n } else if (isNode()) {\n await initCodecForNode(init, '@jsquash/webp/codec/dec/webp_dec.wasm');\n }\n this.decodeFn = decode;\n this.hasAlpha = true; // WebP may have alpha\n break;\n }\n case 'jpeg':\n case 'png':\n throw new Error(\n `${this.format.toUpperCase()} requires native WASM decoder. ` +\n 'Build the WASM module with `pnpm build:wasm` in the @standardagents/sip repo root.'\n );\n default:\n throw new Error(`Unsupported format for SimpleDecoder: ${this.format}`);\n }\n\n // Decode to get dimensions (unfortunately this decodes the whole thing)\n // For a more efficient probe, use the probe() function first\n const imageData = await this.decodeFn(this.data);\n if (!imageData) {\n throw new Error(`Failed to decode ${this.format} image`);\n }\n this.width = imageData.width;\n this.height = imageData.height;\n\n return {\n width: this.width,\n height: this.height,\n hasAlpha: this.hasAlpha,\n };\n }\n\n async decode(_scaleFactor?: number): Promise<{\n pixels: Uint8Array;\n width: number;\n height: number;\n }> {\n if (!this.decodeFn) {\n throw new Error('Decoder not initialized. Call init() first.');\n }\n\n // Decode the image\n const imageData = await this.decodeFn(this.data);\n this.width = imageData.width;\n this.height = imageData.height;\n\n // Convert RGBA to RGB\n const rgba = new Uint8Array(imageData.data.buffer);\n const rgb = new Uint8Array(this.width * this.height * 3);\n\n let srcIdx = 0;\n let dstIdx = 0;\n const pixelCount = this.width * this.height;\n\n for (let i = 0; i < pixelCount; i++) {\n rgb[dstIdx++] = rgba[srcIdx++]; // R\n rgb[dstIdx++] = rgba[srcIdx++]; // G\n rgb[dstIdx++] = rgba[srcIdx++]; // B\n srcIdx++; // Skip A\n }\n\n return {\n pixels: rgb,\n width: this.width,\n height: this.height,\n };\n }\n\n dispose(): void {\n // Clean up references\n this.decodeFn = null;\n }\n}\n\n/**\n * Create a decoder for the given format\n */\nexport async function createDecoder(\n format: ImageFormat,\n data: ArrayBuffer\n): Promise {\n const decoder = new SimpleDecoder(format, data);\n await decoder.init(data);\n return decoder;\n}\n","import type { ImageFormat, ProbeResult } from './types';\n\n/**\n * Magic bytes for format detection\n */\nconst MAGIC = {\n // JPEG: FFD8FF\n JPEG: [0xff, 0xd8, 0xff],\n // PNG: 89504E47 0D0A1A0A\n PNG: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],\n // WebP: RIFF....WEBP\n RIFF: [0x52, 0x49, 0x46, 0x46], // \"RIFF\"\n WEBP: [0x57, 0x45, 0x42, 0x50], // \"WEBP\"\n // AVIF: ....ftypavif or ....ftypavis\n FTYP: [0x66, 0x74, 0x79, 0x70], // \"ftyp\"\n};\n\n/**\n * Detect image format from magic bytes\n */\nfunction detectFormat(data: Uint8Array): ImageFormat {\n if (data.length < 12) return 'unknown';\n\n // Check JPEG\n if (\n data[0] === MAGIC.JPEG[0] &&\n data[1] === MAGIC.JPEG[1] &&\n data[2] === MAGIC.JPEG[2]\n ) {\n return 'jpeg';\n }\n\n // Check PNG\n if (\n data[0] === MAGIC.PNG[0] &&\n data[1] === MAGIC.PNG[1] &&\n data[2] === MAGIC.PNG[2] &&\n data[3] === MAGIC.PNG[3] &&\n data[4] === MAGIC.PNG[4] &&\n data[5] === MAGIC.PNG[5] &&\n data[6] === MAGIC.PNG[6] &&\n data[7] === MAGIC.PNG[7]\n ) {\n return 'png';\n }\n\n // Check WebP (RIFF....WEBP)\n if (\n data[0] === MAGIC.RIFF[0] &&\n data[1] === MAGIC.RIFF[1] &&\n data[2] === MAGIC.RIFF[2] &&\n data[3] === MAGIC.RIFF[3] &&\n data[8] === MAGIC.WEBP[0] &&\n data[9] === MAGIC.WEBP[1] &&\n data[10] === MAGIC.WEBP[2] &&\n data[11] === MAGIC.WEBP[3]\n ) {\n return 'webp';\n }\n\n // Check AVIF (....ftypavif, ....ftypmif1, ....ftypavis, etc.)\n if (\n data[4] === MAGIC.FTYP[0] &&\n data[5] === MAGIC.FTYP[1] &&\n data[6] === MAGIC.FTYP[2] &&\n data[7] === MAGIC.FTYP[3]\n ) {\n // Check for AVIF-related brands\n const brand = String.fromCharCode(data[8], data[9], data[10], data[11]);\n if (brand === 'avif' || brand === 'avis' || brand === 'mif1' || brand === 'msf1') {\n return 'avif';\n }\n }\n\n return 'unknown';\n}\n\n/**\n * Read JPEG dimensions from SOF marker\n * JPEG structure: FFD8 (SOI) followed by segments\n * We need to find SOF0 (FFC0), SOF1 (FFC1), or SOF2 (FFC2)\n */\nfunction probeJpeg(data: Uint8Array): { width: number; height: number } | null {\n let offset = 2; // Skip FFD8\n\n while (offset < data.length - 1) {\n // Each marker starts with FF\n if (data[offset] !== 0xff) {\n offset++;\n continue;\n }\n\n // Skip padding FF bytes\n while (offset < data.length && data[offset] === 0xff) {\n offset++;\n }\n\n if (offset >= data.length) break;\n\n const marker = data[offset++];\n\n // SOF markers (Start of Frame) - various types\n // FFC0-FFC3, FFC5-FFC7, FFC9-FFCB, FFCD-FFCF\n const isSOF =\n (marker >= 0xc0 && marker <= 0xc3) ||\n (marker >= 0xc5 && marker <= 0xc7) ||\n (marker >= 0xc9 && marker <= 0xcb) ||\n (marker >= 0xcd && marker <= 0xcf);\n\n if (isSOF) {\n if (offset + 7 > data.length) return null;\n // SOF structure: length(2) + precision(1) + height(2) + width(2)\n const height = (data[offset + 3] << 8) | data[offset + 4];\n const width = (data[offset + 5] << 8) | data[offset + 6];\n return { width, height };\n }\n\n // Skip to next segment\n // Most markers have a length field (except RST, SOI, EOI)\n if (marker === 0xd8 || marker === 0xd9 || (marker >= 0xd0 && marker <= 0xd7)) {\n // SOI, EOI, RST markers have no length\n continue;\n }\n\n if (offset + 1 >= data.length) break;\n const segmentLength = (data[offset] << 8) | data[offset + 1];\n offset += segmentLength;\n }\n\n return null;\n}\n\n/**\n * Read PNG dimensions from IHDR chunk\n * PNG structure: 8-byte signature, then chunks (length + type + data + CRC)\n * IHDR is always the first chunk: width(4) + height(4) + ...\n */\nfunction probePng(data: Uint8Array): { width: number; height: number; hasAlpha: boolean } | null {\n if (data.length < 24) return null;\n\n // Skip 8-byte signature, read first chunk (IHDR)\n // Chunk structure: length(4) + type(4) + data + crc(4)\n const chunkType = String.fromCharCode(data[12], data[13], data[14], data[15]);\n if (chunkType !== 'IHDR') return null;\n\n // IHDR data starts at offset 16\n const width =\n (data[16] << 24) | (data[17] << 16) | (data[18] << 8) | data[19];\n const height =\n (data[20] << 24) | (data[21] << 16) | (data[22] << 8) | data[23];\n\n // Color type is at offset 24 (after width + height)\n // 4 = grayscale + alpha, 6 = RGBA\n const colorType = data[25];\n const hasAlpha = colorType === 4 || colorType === 6;\n\n return { width, height, hasAlpha };\n}\n\n/**\n * Read WebP dimensions\n * WebP has multiple formats: VP8 (lossy), VP8L (lossless), VP8X (extended)\n */\nfunction probeWebp(data: Uint8Array): { width: number; height: number; hasAlpha: boolean } | null {\n if (data.length < 30) return null;\n\n // After RIFF header (12 bytes), check chunk type\n const chunkType = String.fromCharCode(data[12], data[13], data[14], data[15]);\n\n if (chunkType === 'VP8 ') {\n // Lossy WebP\n // VP8 bitstream starts at offset 20 (after chunk size)\n // Frame tag at offset 23: 3 bytes\n if (data.length < 30) return null;\n // Check for VP8 frame tag (0x9D 0x01 0x2A for keyframe)\n if (data[23] !== 0x9d || data[24] !== 0x01 || data[25] !== 0x2a) return null;\n // Width and height are 14-bit values\n const width = (data[26] | (data[27] << 8)) & 0x3fff;\n const height = (data[28] | (data[29] << 8)) & 0x3fff;\n return { width, height, hasAlpha: false };\n }\n\n if (chunkType === 'VP8L') {\n // Lossless WebP\n // Signature byte at offset 20 should be 0x2f\n if (data[20] !== 0x2f) return null;\n // Width and height encoded in next 4 bytes\n const bits = data[21] | (data[22] << 8) | (data[23] << 16) | (data[24] << 24);\n const width = (bits & 0x3fff) + 1;\n const height = ((bits >> 14) & 0x3fff) + 1;\n const hasAlpha = ((bits >> 28) & 1) === 1;\n return { width, height, hasAlpha };\n }\n\n if (chunkType === 'VP8X') {\n // Extended WebP format\n // Flags at offset 20\n const flags = data[20];\n const hasAlpha = (flags & 0x10) !== 0;\n // Width at offset 24 (24-bit, little-endian, +1)\n const width = (data[24] | (data[25] << 8) | (data[26] << 16)) + 1;\n // Height at offset 27 (24-bit, little-endian, +1)\n const height = (data[27] | (data[28] << 8) | (data[29] << 16)) + 1;\n return { width, height, hasAlpha };\n }\n\n return null;\n}\n\n/**\n * Read AVIF dimensions from HEIF/ISOBMFF structure\n * This is complex - AVIF uses HEIF container (ISO Base Media File Format)\n */\nfunction probeAvif(data: Uint8Array): { width: number; height: number } | null {\n // AVIF parsing is complex (ISOBMFF boxes)\n // For now, we'll look for the ispe (image spatial extents) box\n // which contains width and height\n\n let offset = 0;\n while (offset + 8 <= data.length) {\n // Box structure: size(4) + type(4) + data\n const size =\n (data[offset] << 24) |\n (data[offset + 1] << 16) |\n (data[offset + 2] << 8) |\n data[offset + 3];\n const type = String.fromCharCode(\n data[offset + 4],\n data[offset + 5],\n data[offset + 6],\n data[offset + 7]\n );\n\n if (size === 0) break; // Box extends to end of file\n if (size < 8) break; // Invalid box\n\n // Look for ispe box (can be nested in meta > iprp > ipco)\n if (type === 'ispe' && offset + 20 <= data.length) {\n // ispe: version(1) + flags(3) + width(4) + height(4)\n const width =\n (data[offset + 12] << 24) |\n (data[offset + 13] << 16) |\n (data[offset + 14] << 8) |\n data[offset + 15];\n const height =\n (data[offset + 16] << 24) |\n (data[offset + 17] << 16) |\n (data[offset + 18] << 8) |\n data[offset + 19];\n if (width > 0 && height > 0) {\n return { width, height };\n }\n }\n\n // Container boxes that we should descend into\n if (type === 'meta' || type === 'iprp' || type === 'ipco') {\n // For meta, skip 4 bytes (version + flags)\n const headerSize = type === 'meta' ? 12 : 8;\n offset += headerSize;\n continue;\n }\n\n offset += size;\n }\n\n return null;\n}\n\n/**\n * Probe an image to get format and dimensions\n * Only reads the header bytes - very memory efficient\n *\n * @param input - Image data as ArrayBuffer or Uint8Array\n * @returns ProbeResult with format, dimensions, and alpha info\n */\nexport function probe(input: ArrayBuffer | Uint8Array): ProbeResult {\n const data = input instanceof ArrayBuffer ? new Uint8Array(input) : input;\n\n const format = detectFormat(data);\n\n let result: { width: number; height: number; hasAlpha?: boolean } | null = null;\n\n switch (format) {\n case 'jpeg':\n result = probeJpeg(data);\n break;\n case 'png':\n result = probePng(data);\n break;\n case 'webp':\n result = probeWebp(data);\n break;\n case 'avif':\n result = probeAvif(data);\n break;\n }\n\n if (!result) {\n return {\n format: 'unknown',\n width: 0,\n height: 0,\n hasAlpha: false,\n };\n }\n\n return {\n format,\n width: result.width,\n height: result.height,\n hasAlpha: result.hasAlpha ?? false,\n };\n}\n\n/**\n * Detect just the format (faster if you don't need dimensions)\n */\nexport function detectImageFormat(input: ArrayBuffer | Uint8Array): ImageFormat {\n const data = input instanceof ArrayBuffer ? new Uint8Array(input) : input;\n return detectFormat(data);\n}\n","import { probe } from './probe';\nimport type { ByteInput, ImageInfo, ImageFormat, InputSource, InspectResult } from './types';\n\nconst INSPECT_TARGETS = [64, 512, 4_096, 16_384, 65_536, 262_144];\nconst STREAM_CHUNK_TARGET = 64 * 1024;\n\ntype PreparedInputSource = InputSource & {\n ensureHeaderBytes(target: number): Promise;\n readonly done: boolean;\n};\n\nfunction sliceArrayBuffer(view: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(view.byteLength);\n copy.set(view);\n return copy.buffer;\n}\n\nfunction concatChunks(chunks: Uint8Array[], total: number): Uint8Array {\n const merged = new Uint8Array(total);\n let offset = 0;\n\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return merged;\n}\n\nfunction normalizeChunk(chunk: Uint8Array): Uint8Array {\n if (chunk.byteOffset === 0 && chunk.byteLength === chunk.buffer.byteLength) {\n const copy = new Uint8Array(chunk.byteLength);\n copy.set(chunk);\n return copy;\n }\n\n const copy = new Uint8Array(chunk.byteLength);\n copy.set(chunk);\n return copy;\n}\n\nasync function* iterateReadableStream(stream: ReadableStream): AsyncIterable {\n const reader = stream.getReader();\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n\n if (value && value.byteLength > 0) {\n yield normalizeChunk(value);\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nasync function* coalesceAsyncIterable(\n input: AsyncIterable,\n target = STREAM_CHUNK_TARGET\n): AsyncIterable {\n let pending: Uint8Array[] = [];\n let total = 0;\n\n const flush = () => {\n if (total === 0) {\n return null;\n }\n\n const merged = concatChunks(pending, total);\n pending = [];\n total = 0;\n return merged;\n };\n\n for await (const rawChunk of input) {\n const chunk = normalizeChunk(rawChunk);\n if (chunk.byteLength >= target && total === 0) {\n yield chunk;\n continue;\n }\n\n pending.push(chunk);\n total += chunk.byteLength;\n\n if (total >= target) {\n const merged = flush();\n if (merged) {\n yield merged;\n }\n }\n }\n\n const merged = flush();\n if (merged) {\n yield merged;\n }\n}\n\nfunction getAsyncIterable(input: ReadableStream | AsyncIterable): AsyncIterable {\n if (typeof ReadableStream !== 'undefined' && input instanceof ReadableStream) {\n return coalesceAsyncIterable(iterateReadableStream(input));\n }\n\n if (typeof (input as AsyncIterable)[Symbol.asyncIterator] === 'function') {\n return coalesceAsyncIterable(input as AsyncIterable);\n }\n\n return coalesceAsyncIterable(input as AsyncIterable);\n}\n\nclass BytesInputSource implements PreparedInputSource {\n readonly kind = 'bytes' as const;\n readonly replayable = true;\n readonly byteLength: number;\n readonly formatHint?: ImageFormat;\n readonly headerBytes: Uint8Array;\n readonly done = true;\n\n constructor(private readonly bytes: Uint8Array, formatHint?: ImageFormat) {\n this.byteLength = bytes.byteLength;\n this.headerBytes = bytes.subarray(0, Math.min(bytes.byteLength, INSPECT_TARGETS.at(-1)!));\n this.formatHint = formatHint;\n }\n\n async ensureHeaderBytes(target: number): Promise {\n return this.bytes.subarray(0, Math.min(this.bytes.byteLength, target));\n }\n\n open(): AsyncIterable {\n const bytes = this.bytes;\n return (async function* openBytes() {\n yield bytes;\n })();\n }\n}\n\nclass StreamInputSource implements PreparedInputSource {\n readonly kind = 'stream' as const;\n readonly replayable = false;\n readonly byteLength?: number;\n readonly formatHint?: ImageFormat;\n\n private readonly iterator: AsyncIterator;\n private peekedChunks: Uint8Array[] = [];\n private peekedBytes = 0;\n private opened = false;\n private exhausted = false;\n headerBytes: Uint8Array = new Uint8Array(0);\n\n constructor(input: AsyncIterable, formatHint?: ImageFormat, byteLength?: number) {\n this.iterator = input[Symbol.asyncIterator]();\n this.formatHint = formatHint;\n this.byteLength = byteLength;\n }\n\n get done(): boolean {\n return this.exhausted;\n }\n\n async ensureHeaderBytes(target: number): Promise {\n while (!this.exhausted && this.peekedBytes < target) {\n const { value, done } = await this.iterator.next();\n if (done) {\n this.exhausted = true;\n break;\n }\n\n if (value && value.byteLength > 0) {\n const chunk = normalizeChunk(value);\n this.peekedChunks.push(chunk);\n this.peekedBytes += chunk.byteLength;\n }\n }\n\n this.headerBytes = concatChunks(this.peekedChunks, this.peekedBytes) as Uint8Array;\n return this.headerBytes;\n }\n\n open(): AsyncIterable {\n if (this.opened) {\n throw new Error('Input source can only be opened once');\n }\n\n this.opened = true;\n const replay = this.peekedChunks.slice();\n const iterator = this.iterator;\n\n return (async function* openStream() {\n for (const chunk of replay) {\n yield chunk;\n }\n\n while (true) {\n const { value, done } = await iterator.next();\n if (done) {\n return;\n }\n\n if (value && value.byteLength > 0) {\n yield normalizeChunk(value);\n }\n }\n })();\n }\n}\n\nfunction isInputSource(value: ByteInput | InputSource): value is PreparedInputSource {\n return typeof value === 'object' && value !== null && 'open' in value && 'headerBytes' in value;\n}\n\nfunction toUint8Array(input: ArrayBuffer | Uint8Array): Uint8Array {\n return input instanceof Uint8Array ? normalizeChunk(input) : new Uint8Array(input);\n}\n\nasync function sourceFromRequestLike(input: Request | Response): Promise {\n const contentType = input.headers.get('content-type') ?? '';\n const hint = contentType.startsWith('image/') ? (contentType.slice('image/'.length) as ImageFormat) : undefined;\n const lengthHeader = input.headers.get('content-length');\n const byteLength = lengthHeader ? Number(lengthHeader) : undefined;\n\n if (input.body) {\n return new StreamInputSource(getAsyncIterable(input.body as ReadableStream), hint, Number.isFinite(byteLength) ? byteLength : undefined);\n }\n\n const bytes = new Uint8Array(await input.arrayBuffer());\n return new BytesInputSource(bytes, hint);\n}\n\nexport async function prepareInputSource(input: ByteInput | InputSource): Promise {\n if (isInputSource(input)) {\n return input;\n }\n\n if (input instanceof ArrayBuffer || input instanceof Uint8Array) {\n return new BytesInputSource(toUint8Array(input));\n }\n\n if (typeof Blob !== 'undefined' && input instanceof Blob) {\n return new BytesInputSource(new Uint8Array(await input.arrayBuffer()));\n }\n\n if (typeof Request !== 'undefined' && input instanceof Request) {\n return sourceFromRequestLike(input);\n }\n\n if (typeof Response !== 'undefined' && input instanceof Response) {\n return sourceFromRequestLike(input);\n }\n\n if (typeof ReadableStream !== 'undefined' && input instanceof ReadableStream) {\n return new StreamInputSource(getAsyncIterable(input));\n }\n\n return new StreamInputSource(getAsyncIterable(input as AsyncIterable));\n}\n\nexport async function inspect(input: ByteInput): Promise {\n const source = await prepareInputSource(input);\n const info = await inspectSource(source);\n\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n return { info, source };\n}\n\nexport async function inspectSource(source: PreparedInputSource): Promise {\n let best = probe(source.headerBytes);\n if (best.format !== 'unknown') {\n return best;\n }\n\n for (const target of INSPECT_TARGETS) {\n const bytes = await source.ensureHeaderBytes(target);\n best = probe(bytes);\n if (best.format !== 'unknown') {\n return best;\n }\n }\n\n if (source.headerBytes.byteLength === 0) {\n return { format: 'unknown', width: 0, height: 0, hasAlpha: false };\n }\n\n return probe(source.headerBytes);\n}\n\nexport async function collectSourceBytes(source: InputSource): Promise {\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n for await (const chunk of source.open()) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n\n return concatChunks(chunks, total);\n}\n\nexport function asArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return sliceArrayBuffer(bytes);\n}\n","import type { ResizeState, Scanline } from './types';\n\n/**\n * Create a resize state for scanline-based bilinear interpolation\n *\n * This implements memory-efficient resizing that only needs 2 source rows\n * in memory at any time, regardless of image size.\n */\nexport function createResizeState(\n srcWidth: number,\n srcHeight: number,\n dstWidth: number,\n dstHeight: number\n): ResizeState {\n return {\n srcWidth,\n srcHeight,\n dstWidth,\n dstHeight,\n bufferA: null,\n bufferB: null,\n bufferAY: -1,\n bufferBY: -1,\n currentOutputY: 0,\n };\n}\n\n/**\n * Horizontally resize a single scanline using bilinear interpolation\n *\n * @param src - Source scanline (RGB, 3 bytes per pixel)\n * @param srcWidth - Source width\n * @param dstWidth - Destination width\n * @returns Resized scanline\n */\nfunction resizeRowHorizontal(\n src: Uint8Array,\n srcWidth: number,\n dstWidth: number\n): Uint8Array {\n const dst = new Uint8Array(dstWidth * 3);\n const xScale = srcWidth / dstWidth;\n\n for (let dstX = 0; dstX < dstWidth; dstX++) {\n // Map destination X to source X\n const srcXFloat = dstX * xScale;\n const srcX0 = Math.floor(srcXFloat);\n const srcX1 = Math.min(srcX0 + 1, srcWidth - 1);\n const t = srcXFloat - srcX0;\n const invT = 1 - t;\n\n // Source pixel offsets\n const src0 = srcX0 * 3;\n const src1 = srcX1 * 3;\n const dstOffset = dstX * 3;\n\n // Bilinear interpolation for RGB\n dst[dstOffset] = Math.round(src[src0] * invT + src[src1] * t);\n dst[dstOffset + 1] = Math.round(src[src0 + 1] * invT + src[src1 + 1] * t);\n dst[dstOffset + 2] = Math.round(src[src0 + 2] * invT + src[src1 + 2] * t);\n }\n\n return dst;\n}\n\n/**\n * Blend two horizontally-resized rows vertically\n *\n * @param rowA - First row (already horizontally resized)\n * @param rowB - Second row (already horizontally resized)\n * @param t - Blend factor (0 = all rowA, 1 = all rowB)\n * @param width - Width in pixels\n * @returns Blended row\n */\nfunction blendRows(\n rowA: Uint8Array,\n rowB: Uint8Array,\n t: number,\n width: number\n): Uint8Array {\n const result = new Uint8Array(width * 3);\n const invT = 1 - t;\n\n for (let i = 0; i < width * 3; i++) {\n result[i] = Math.round(rowA[i] * invT + rowB[i] * t);\n }\n\n return result;\n}\n\n/**\n * Process a source scanline and potentially output resized scanlines\n *\n * This is the core of the streaming resize algorithm. Call this for each\n * source scanline in order (y = 0, 1, 2, ...). It will return output\n * scanlines as they become available.\n *\n * Memory usage: Only keeps 2 horizontally-resized rows in memory at a time\n *\n * @param state - Resize state (mutated)\n * @param srcScanline - Source scanline (RGB, 3 bytes per pixel)\n * @param srcY - Source Y position (must be called in order)\n * @returns Array of output scanlines (may be 0, 1, or more)\n */\nexport function processScanline(\n state: ResizeState,\n srcScanline: Uint8Array,\n srcY: number\n): Scanline[] {\n const { srcWidth, srcHeight, dstWidth, dstHeight } = state;\n const yScale = srcHeight / dstHeight;\n const output: Scanline[] = [];\n\n // Horizontally resize this source row\n const resizedRow = resizeRowHorizontal(srcScanline, srcWidth, dstWidth);\n\n // Update buffers - rotate A ← B, B ← new\n state.bufferA = state.bufferB;\n state.bufferAY = state.bufferBY;\n state.bufferB = resizedRow;\n state.bufferBY = srcY;\n\n // Generate output rows that fall within [bufferAY, bufferBY]\n while (state.currentOutputY < dstHeight) {\n const srcYFloat = state.currentOutputY * yScale;\n const srcYFloor = Math.floor(srcYFloat);\n const srcYCeil = Math.min(srcYFloor + 1, srcHeight - 1);\n\n // Can we generate this output row with current buffers?\n if (srcYCeil > srcY) {\n // Need more source rows\n break;\n }\n\n // Handle edge cases at the beginning\n if (state.bufferA === null) {\n // First row - just use bufferB\n output.push({\n data: state.bufferB,\n width: dstWidth,\n y: state.currentOutputY,\n });\n state.currentOutputY++;\n continue;\n }\n\n // Both buffers available - do bilinear blend\n const t = srcYFloat - srcYFloor;\n\n // Determine which buffers to use\n let rowA = state.bufferA;\n let rowB = state.bufferB;\n\n // If srcYFloor matches bufferBY, we need to use bufferB for both\n if (srcYFloor === state.bufferBY) {\n rowA = state.bufferB;\n rowB = state.bufferB;\n } else if (srcYCeil === state.bufferAY) {\n // Edge case: use bufferA for both\n rowA = state.bufferA;\n rowB = state.bufferA;\n }\n\n const blended = blendRows(rowA, rowB, t, dstWidth);\n output.push({\n data: blended,\n width: dstWidth,\n y: state.currentOutputY,\n });\n\n state.currentOutputY++;\n }\n\n return output;\n}\n\n/**\n * Flush any remaining output rows after all source rows have been processed\n *\n * @param state - Resize state\n * @returns Remaining output scanlines\n */\nexport function flushResize(state: ResizeState): Scanline[] {\n const output: Scanline[] = [];\n\n // Generate any remaining rows using the last available buffer\n while (state.currentOutputY < state.dstHeight) {\n if (state.bufferB === null) break;\n\n output.push({\n data: state.bufferB,\n width: state.dstWidth,\n y: state.currentOutputY,\n });\n state.currentOutputY++;\n }\n\n return output;\n}\n\n/**\n * Calculate target dimensions while preserving aspect ratio\n *\n * @param srcWidth - Source width\n * @param srcHeight - Source height\n * @param maxWidth - Maximum target width\n * @param maxHeight - Maximum target height\n * @returns Target dimensions\n */\nexport function calculateTargetDimensions(\n srcWidth: number,\n srcHeight: number,\n maxWidth: number,\n maxHeight: number\n): { width: number; height: number; scale: number } {\n const scaleX = maxWidth / srcWidth;\n const scaleY = maxHeight / srcHeight;\n const scale = Math.min(scaleX, scaleY, 1); // Never upscale\n\n return {\n width: Math.round(srcWidth * scale),\n height: Math.round(srcHeight * scale),\n scale,\n };\n}\n\n/**\n * Calculate optimal JPEG DCT scale factor\n *\n * JPEG can decode at 1/1, 1/2, 1/4, or 1/8 scale using DCT scaling.\n * This dramatically reduces memory usage during decode.\n *\n * @param srcWidth - Source image width\n * @param srcHeight - Source image height\n * @param targetWidth - Desired output width\n * @param targetHeight - Desired output height\n * @returns Scale denominator (1, 2, 4, or 8)\n */\nexport function calculateDctScaleFactor(\n srcWidth: number,\n srcHeight: number,\n targetWidth: number,\n targetHeight: number\n): 1 | 2 | 4 | 8 {\n // We want the smallest DCT scale that still gives us enough pixels\n // to resize down to target dimensions without upscaling\n\n const scales: (1 | 2 | 4 | 8)[] = [8, 4, 2, 1];\n\n for (const scale of scales) {\n const scaledWidth = Math.ceil(srcWidth / scale);\n const scaledHeight = Math.ceil(srcHeight / scale);\n\n // If scaled dimensions are >= target, this scale works\n if (scaledWidth >= targetWidth && scaledHeight >= targetHeight) {\n return scale;\n }\n }\n\n // Fallback to no scaling\n return 1;\n}\n","/**\n * WASM Module Loader\n *\n * Loads the SIP WASM module with proper initialization.\n * Works in both browser and Cloudflare Workers environments.\n *\n * For Cloudflare Workers, use initWithWasmModule() in the Durable Object\n * constructor, passing the statically imported WASM module.\n */\n\nimport type { SipWasmModule } from './types';\n\nlet wasmModule: SipWasmModule | null = null;\nlet wasmPromise: Promise | null = null;\nlet precompiledWasmModule: WebAssembly.Module | null = null;\n\nfunction isCloudflareWorker(): boolean {\n const cacheStorage = (globalThis as { caches?: CacheStorage & { default?: Cache } }).caches;\n return typeof cacheStorage !== 'undefined' && typeof cacheStorage.default !== 'undefined';\n}\n\n/**\n * Check if WASM module is available\n */\nexport function isWasmAvailable(): boolean {\n return wasmModule !== null;\n}\n\n/**\n * Initialize with a pre-compiled WebAssembly.Module\n *\n * For Cloudflare Workers, import the WASM file statically and pass it here.\n * This allows workerd to pre-compile the WASM at bundle time.\n *\n * @example\n * ```typescript\n * import sipWasm from '@standardagents/sip/dist/sip.wasm';\n * import { initWithWasmModule } from '@standardagents/sip';\n *\n * // At module top level or in DO constructor\n * await initWithWasmModule(sipWasm);\n * ```\n */\nexport async function initWithWasmModule(compiledModule?: WebAssembly.Module): Promise {\n if (wasmModule) {\n return; // Already initialized\n }\n\n // Store the pre-compiled module for use in instantiateWasm callback\n if (compiledModule) {\n precompiledWasmModule = compiledModule;\n }\n\n await loadWasm();\n}\n\n/**\n * Get the WASM module, throwing if not loaded\n */\nexport function getWasmModule(): SipWasmModule {\n if (!wasmModule) {\n throw new Error('WASM module not loaded. Call loadWasm() first.');\n }\n return wasmModule;\n}\n\n/**\n * Load the WASM module\n *\n * This function is idempotent - calling it multiple times returns the same module.\n */\nexport async function loadWasm(): Promise {\n // Return cached module if already loaded\n if (wasmModule) {\n return wasmModule;\n }\n\n // Return existing promise if loading in progress\n if (wasmPromise) {\n return wasmPromise;\n }\n\n wasmPromise = doLoadWasm();\n\n try {\n wasmModule = await wasmPromise;\n return wasmModule;\n } catch (err) {\n wasmPromise = null;\n throw err;\n }\n}\n\n/**\n * Internal function to load the WASM module\n */\nasync function doLoadWasm(): Promise {\n // Check for externally provided loader first\n if (typeof globalThis !== 'undefined' && (globalThis as any).__SIP_WASM_LOADER__) {\n const loader = (globalThis as any).__SIP_WASM_LOADER__;\n return await loader();\n }\n\n // Try to dynamically import the Emscripten glue code\n try {\n // @ts-ignore - Dynamic import of built WASM module\n const createSipModule = (await import('./sip.js')).default;\n\n // Prefer an explicitly provided precompiled module in Workers/bundlers\n // before probing any environment-specific filesystem paths.\n if (precompiledWasmModule) {\n const module = await new Promise((resolve, reject) => {\n let resolvedModule: SipWasmModule | null = null;\n\n createSipModule({\n instantiateWasm: (\n imports: WebAssembly.Imports,\n receiveInstance: (instance: WebAssembly.Instance) => void\n ) => {\n WebAssembly.instantiate(precompiledWasmModule!, imports)\n .then((instance) => {\n receiveInstance(instance);\n })\n .catch((err) => {\n reject(err);\n });\n\n return {};\n },\n onRuntimeInitialized: () => {\n if (resolvedModule && resolvedModule.HEAPU8) {\n resolve(resolvedModule);\n }\n },\n }).then((mod: SipWasmModule) => {\n resolvedModule = mod;\n if (mod.HEAPU8) {\n resolve(mod);\n }\n }).catch(reject);\n });\n\n return module;\n }\n\n const isNode =\n !isCloudflareWorker() &&\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\n if (isNode) {\n // Dynamic module name prevents esbuild/wrangler from resolving this\n // at bundle time. Only Node.js reaches this branch at runtime.\n const fsModule = 'fs/promises';\n const { readFile } = await import(/* @vite-ignore */ fsModule);\n const wasmBinary = await readFile(new URL('./sip.wasm', import.meta.url));\n const module = await createSipModule({ wasmBinary });\n return module as SipWasmModule;\n }\n\n // Standard loading (browser environment)\n const module = await createSipModule();\n return module as SipWasmModule;\n } catch (err) {\n throw new Error(\n 'SIP WASM module not available. ' +\n 'To use streaming processing, build the WASM module with `pnpm build:wasm` in the @standardagents/sip repo root. ' +\n 'Error: ' + (err instanceof Error ? err.message : String(err))\n );\n }\n}\n\n/**\n * Copy data to WASM memory\n */\nexport function copyToWasm(module: SipWasmModule, data: Uint8Array): number {\n const ptr = module._malloc(data.length);\n if (!ptr) {\n throw new Error('Failed to allocate WASM memory');\n }\n module.HEAPU8.set(data, ptr);\n return ptr;\n}\n\n/**\n * Copy data from WASM memory\n */\nexport function copyFromWasm(module: SipWasmModule, ptr: number, size: number): Uint8Array {\n return new Uint8Array(module.HEAPU8.buffer, ptr, size).slice();\n}\n","/**\n * WASM JPEG Decoder with incremental input support.\n *\n * The low-memory Worker path feeds compressed bytes into libjpeg-turbo as the\n * request body arrives, then reads scaled scanlines as soon as the decoder can\n * produce them.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule, DctScaleDenom } from './types';\nimport { copyToWasm, getWasmModule } from './loader';\n\ntype StepResult = 'ready' | 'needMore';\ntype ScanlineStep = Scanline | null | 'needMore';\n\nexport class WasmJpegDecoder {\n private readonly module: SipWasmModule;\n private decoder = 0;\n private width = 0;\n private height = 0;\n private outputWidth = 0;\n private outputHeight = 0;\n private rowBufferPtr = 0;\n private started = false;\n private finished = false;\n\n constructor() {\n this.module = getWasmModule();\n this.decoder = this.module._sip_decoder_create();\n if (!this.decoder) {\n throw new Error('Failed to create JPEG decoder');\n }\n }\n\n pushInput(data: Uint8Array, isFinal = false): void {\n if (data.byteLength === 0 && !isFinal) {\n return;\n }\n\n let ptr = 0;\n try {\n ptr = data.byteLength > 0 ? copyToWasm(this.module, data) : 0;\n if (this.module._sip_decoder_push_input(this.decoder, ptr, data.byteLength, isFinal ? 1 : 0) !== 0) {\n throw new Error('Failed to feed JPEG bytes into decoder');\n }\n } finally {\n if (ptr) {\n this.module._free(ptr);\n }\n }\n }\n\n /**\n * Compatibility helper for full-buffer callers.\n */\n init(data: ArrayBuffer | Uint8Array): { width: number; height: number } {\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n let ptr = 0;\n try {\n ptr = copyToWasm(this.module, bytes);\n if (this.module._sip_decoder_set_source(this.decoder, ptr, bytes.byteLength) !== 0) {\n throw new Error('Failed to set buffered JPEG source');\n }\n } finally {\n if (ptr) {\n this.module._free(ptr);\n }\n }\n\n const header = this.readHeaderStep();\n if (header !== 'ready') {\n throw new Error('Incomplete JPEG header');\n }\n\n return { width: this.width, height: this.height };\n }\n\n readHeaderStep(): StepResult {\n const result = this.module._sip_decoder_read_header(this.decoder);\n if (result === 1) {\n return 'needMore';\n }\n if (result !== 0) {\n throw new Error('Failed to read JPEG header');\n }\n\n this.width = this.module._sip_decoder_get_width(this.decoder);\n this.height = this.module._sip_decoder_get_height(this.decoder);\n this.outputWidth = this.width;\n this.outputHeight = this.height;\n return 'ready';\n }\n\n getDimensions(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n setScale(scaleDenom: DctScaleDenom): { width: number; height: number } {\n if (this.module._sip_decoder_set_scale(this.decoder, scaleDenom) !== 0) {\n throw new Error(`Invalid scale denominator: ${scaleDenom}`);\n }\n\n this.outputWidth = this.module._sip_decoder_get_output_width(this.decoder);\n this.outputHeight = this.module._sip_decoder_get_output_height(this.decoder);\n return { width: this.outputWidth, height: this.outputHeight };\n }\n\n getOutputDimensions(): { width: number; height: number } {\n return { width: this.outputWidth, height: this.outputHeight };\n }\n\n start(): void {\n const step = this.startStep();\n if (step !== 'ready') {\n throw new Error('JPEG decoder needs more input before starting');\n }\n }\n\n startStep(): StepResult {\n if (this.started) {\n return 'ready';\n }\n\n const result = this.module._sip_decoder_start(this.decoder);\n if (result === 1) {\n return 'needMore';\n }\n if (result !== 0) {\n throw new Error('Failed to start JPEG decompression');\n }\n\n this.rowBufferPtr = this.module._sip_decoder_get_row_buffer(this.decoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get JPEG decoder row buffer');\n }\n\n this.started = true;\n return 'ready';\n }\n\n readScanline(): Scanline | null {\n const result = this.readScanlineStep();\n if (result === 'needMore') {\n throw new Error('JPEG decoder needs more input');\n }\n return result;\n }\n\n readScanlineStep(): ScanlineStep {\n if (!this.started || this.finished) {\n return null;\n }\n\n const result = this.module._sip_decoder_read_scanline(this.decoder);\n if (result === 2) {\n return 'needMore';\n }\n if (result === 0) {\n this.finished = true;\n return null;\n }\n if (result !== 1) {\n throw new Error('Failed to read JPEG scanline');\n }\n\n const rowSize = this.outputWidth * 3;\n const data = new Uint8Array(this.module.HEAPU8.buffer, this.rowBufferPtr, rowSize).slice();\n const y = this.module._sip_decoder_get_scanline(this.decoder) - 1;\n\n return { data, width: this.outputWidth, y };\n }\n\n finishStep(): StepResult {\n const result = this.module._sip_decoder_finish(this.decoder);\n if (result === 1) {\n return 'needMore';\n }\n if (result !== 0) {\n throw new Error('Failed to finish JPEG decompression');\n }\n\n return 'ready';\n }\n\n getBufferedInputSize(): number {\n return this.module._sip_decoder_get_buffered_input_size(this.decoder);\n }\n\n getRowBufferSize(): number {\n return this.module._sip_decoder_get_working_size(this.decoder);\n }\n\n dispose(): void {\n if (this.decoder) {\n this.module._sip_decoder_destroy(this.decoder);\n this.decoder = 0;\n }\n\n this.rowBufferPtr = 0;\n this.started = false;\n this.finished = false;\n }\n}\n\n/**\n * Calculate optimal DCT scale factor for a target size.\n */\nexport function calculateOptimalScale(\n srcWidth: number,\n srcHeight: number,\n targetWidth: number,\n targetHeight: number\n): DctScaleDenom {\n const scales: DctScaleDenom[] = [8, 4, 2, 1];\n\n for (const scale of scales) {\n const scaledWidth = Math.ceil(srcWidth / scale);\n const scaledHeight = Math.ceil(srcHeight / scale);\n\n if (scaledWidth >= targetWidth && scaledHeight >= targetHeight) {\n return scale;\n }\n }\n\n return 1;\n}\n","/**\n * WASM JPEG Encoder with chunked output draining.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule } from './types';\nimport { copyFromWasm, getWasmModule } from './loader';\n\nexport class WasmJpegEncoder {\n private readonly module: SipWasmModule;\n private encoder = 0;\n private width = 0;\n private height = 0;\n private rowBufferPtr = 0;\n private started = false;\n private finished = false;\n private currentLine = 0;\n\n constructor() {\n this.module = getWasmModule();\n this.encoder = this.module._sip_encoder_create();\n if (!this.encoder) {\n throw new Error('Failed to create JPEG encoder');\n }\n }\n\n init(width: number, height: number, quality = 85): void {\n this.width = width;\n this.height = height;\n\n if (this.module._sip_encoder_init(this.encoder, width, height, quality) !== 0) {\n throw new Error('Failed to initialize JPEG encoder');\n }\n }\n\n start(): void {\n if (this.started) {\n return;\n }\n\n if (this.module._sip_encoder_start(this.encoder) !== 0) {\n throw new Error('Failed to start JPEG compression');\n }\n\n this.rowBufferPtr = this.module._sip_encoder_get_row_buffer(this.encoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get JPEG encoder row buffer');\n }\n\n this.started = true;\n this.currentLine = 0;\n }\n\n writeScanline(scanline: Scanline): void {\n this.writeScanlineData(scanline.data);\n }\n\n writeScanlineData(data: Uint8Array): void {\n if (!this.started || this.finished) {\n throw new Error('Encoder is not ready for scanlines');\n }\n\n const expectedSize = this.width * 3;\n if (data.byteLength !== expectedSize) {\n throw new Error(`Invalid scanline size: expected ${expectedSize}, got ${data.byteLength}`);\n }\n\n this.module.HEAPU8.set(data, this.rowBufferPtr);\n if (this.module._sip_encoder_write_scanline(this.encoder) !== 1) {\n throw new Error('Failed to write JPEG scanline');\n }\n\n this.currentLine++;\n }\n\n drainChunks(): Uint8Array[] {\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const ptr = this.module._sip_encoder_peek_chunk_data(this.encoder);\n const size = this.module._sip_encoder_peek_chunk_size(this.encoder);\n if (!ptr || !size) {\n break;\n }\n\n chunks.push(copyFromWasm(this.module, ptr, size));\n this.module._sip_encoder_pop_chunk(this.encoder);\n }\n\n return chunks;\n }\n\n finish(): Uint8Array[] {\n if (!this.started) {\n throw new Error('Encoding not started');\n }\n if (this.finished) {\n return [];\n }\n if (this.currentLine !== this.height) {\n throw new Error(`Incomplete image: wrote ${this.currentLine}/${this.height} scanlines`);\n }\n\n if (this.module._sip_encoder_finish(this.encoder) !== 0) {\n throw new Error('Failed to finish JPEG compression');\n }\n\n this.finished = true;\n return this.drainChunks();\n }\n\n encodeAll(pixels: Uint8Array): ArrayBuffer {\n this.start();\n\n const rowSize = this.width * 3;\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n for (let y = 0; y < this.height; y++) {\n this.writeScanlineData(pixels.subarray(y * rowSize, (y + 1) * rowSize));\n for (const chunk of this.drainChunks()) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n }\n\n for (const chunk of this.finish()) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return merged.buffer.slice(merged.byteOffset, merged.byteOffset + merged.byteLength);\n }\n\n getBufferedOutputSize(): number {\n return this.module._sip_encoder_get_buffered_output_size(this.encoder);\n }\n\n getRowBufferSize(): number {\n return this.width * 3;\n }\n\n getCurrentLine(): number {\n return this.currentLine;\n }\n\n dispose(): void {\n if (this.encoder) {\n this.module._sip_encoder_destroy(this.encoder);\n this.encoder = 0;\n }\n\n this.rowBufferPtr = 0;\n this.started = false;\n this.finished = false;\n this.currentLine = 0;\n }\n}\n\n","/**\n * WASM PNG Decoder with Row-by-Row Processing\n *\n * Memory-efficient PNG decoding using libspng's progressive API.\n * Decodes one row at a time to minimize memory usage.\n */\n\nimport type { Scanline } from '../types';\nimport type { SipWasmModule } from './types';\nimport { getWasmModule, copyToWasm } from './loader';\n\n/**\n * WASM-based PNG decoder with row-by-row decoding\n */\nexport class WasmPngDecoder {\n private module: SipWasmModule;\n private decoder: number = 0;\n private dataPtr: number = 0;\n private width: number = 0;\n private height: number = 0;\n private hasAlpha: boolean = false;\n private rowBufferPtr: number = 0;\n private started: boolean = false;\n private finished: boolean = false;\n private currentRow: number = 0;\n\n constructor() {\n this.module = getWasmModule();\n }\n\n /**\n * Initialize decoder with PNG data\n */\n init(data: ArrayBuffer | Uint8Array): {\n width: number;\n height: number;\n hasAlpha: boolean;\n } {\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n\n // Create decoder\n this.decoder = this.module._sip_png_decoder_create();\n if (!this.decoder) {\n throw new Error('Failed to create PNG decoder');\n }\n\n // Copy data to WASM memory\n this.dataPtr = copyToWasm(this.module, bytes);\n\n // Set source\n if (this.module._sip_png_decoder_set_source(this.decoder, this.dataPtr, bytes.length) !== 0) {\n this.dispose();\n throw new Error('Failed to set PNG decoder source');\n }\n\n // Read header\n if (this.module._sip_png_decoder_read_header(this.decoder) !== 0) {\n this.dispose();\n throw new Error('Failed to read PNG header');\n }\n\n this.width = this.module._sip_png_decoder_get_width(this.decoder);\n this.height = this.module._sip_png_decoder_get_height(this.decoder);\n this.hasAlpha = this.module._sip_png_decoder_has_alpha(this.decoder) !== 0;\n\n return { width: this.width, height: this.height, hasAlpha: this.hasAlpha };\n }\n\n /**\n * Get image dimensions\n */\n getDimensions(): { width: number; height: number } {\n return { width: this.width, height: this.height };\n }\n\n /**\n * Check if image has alpha channel\n */\n getHasAlpha(): boolean {\n return this.hasAlpha;\n }\n\n /**\n * Start decoding\n */\n start(): void {\n if (!this.decoder) {\n throw new Error('Decoder not initialized');\n }\n if (this.started) {\n throw new Error('Decoding already started');\n }\n\n if (this.module._sip_png_decoder_start(this.decoder) !== 0) {\n throw new Error('Failed to start PNG decompression');\n }\n\n this.rowBufferPtr = this.module._sip_png_decoder_get_row_buffer(this.decoder);\n if (!this.rowBufferPtr) {\n throw new Error('Failed to get row buffer');\n }\n\n this.started = true;\n this.currentRow = 0;\n }\n\n /**\n * Read next scanline\n *\n * @returns Scanline object or null if no more scanlines\n */\n readScanline(): Scanline | null {\n if (!this.started || this.finished) {\n return null;\n }\n\n if (this.currentRow >= this.height) {\n this.finished = true;\n return null;\n }\n\n const result = this.module._sip_png_decoder_read_row(this.decoder);\n\n if (result < 0) {\n throw new Error('Failed to read PNG row');\n }\n\n // Copy scanline data (RGB = 3 bytes per pixel)\n const rowSize = this.width * 3;\n const data = new Uint8Array(\n this.module.HEAPU8.buffer,\n this.rowBufferPtr,\n rowSize\n ).slice();\n\n const y = this.currentRow;\n this.currentRow++;\n\n // Check if done after reading this row\n if (result === 0 || this.currentRow >= this.height) {\n this.finished = true;\n }\n\n return {\n data,\n width: this.width,\n y,\n };\n }\n\n /**\n * Read all remaining scanlines\n *\n * @yields Scanline objects\n */\n *readAllScanlines(): Generator {\n let scanline: Scanline | null;\n while ((scanline = this.readScanline()) !== null) {\n yield scanline;\n }\n }\n\n /**\n * Decode entire image to RGB buffer\n *\n * @returns Full RGB pixel buffer\n */\n decodeAll(): { pixels: Uint8Array; width: number; height: number } {\n if (!this.started) {\n this.start();\n }\n\n const pixels = new Uint8Array(this.width * this.height * 3);\n const rowSize = this.width * 3;\n\n for (const scanline of this.readAllScanlines()) {\n pixels.set(scanline.data, scanline.y * rowSize);\n }\n\n return {\n pixels,\n width: this.width,\n height: this.height,\n };\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n if (this.decoder) {\n this.module._sip_png_decoder_destroy(this.decoder);\n this.decoder = 0;\n }\n\n if (this.dataPtr) {\n this.module._free(this.dataPtr);\n this.dataPtr = 0;\n }\n\n this.started = false;\n this.finished = false;\n this.rowBufferPtr = 0;\n this.currentRow = 0;\n }\n}\n","import { createDecoder } from './decoders/simple';\nimport { asArrayBuffer, collectSourceBytes, inspect, inspectSource, prepareInputSource } from './input';\nimport { probe } from './probe';\nimport {\n calculateTargetDimensions,\n createResizeState,\n flushResize,\n processScanline,\n} from './resize';\nimport type {\n ByteInput,\n EncodedImage,\n EncodedImageInfo,\n ImageInfo,\n InputSource,\n PixelStream,\n Scanline,\n TransformOptions,\n TransformStats,\n} from './types';\nimport {\n WasmJpegDecoder,\n WasmJpegEncoder,\n WasmPngDecoder,\n calculateOptimalScale,\n initWithWasmModule,\n loadWasm,\n} from './wasm';\n\nconst DEFAULT_QUALITY = 85;\n\ntype StatsResolver = {\n resolve: (value: TransformStats) => void;\n reject: (reason?: unknown) => void;\n promise: Promise;\n};\n\ntype InfoResolver = {\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n promise: Promise;\n};\n\ntype PreparedSource = Awaited>;\n\nfunction createDeferred(): InfoResolver {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { resolve, reject, promise };\n}\n\nfunction makeEmptyStats(): TransformStats {\n return {\n peakPipelineBytes: 0,\n peakCodecBytes: 0,\n peakBufferedInputBytes: 0,\n peakBufferedOutputBytes: 0,\n bytesIn: 0,\n bytesOut: 0,\n notes: [],\n };\n}\n\nfunction concatUint8Arrays(chunks: Uint8Array[]): Uint8Array {\n let total = 0;\n for (const chunk of chunks) {\n total += chunk.byteLength;\n }\n\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return merged;\n}\n\nfunction readJpegOrientation(bytes: Uint8Array): number | null {\n if (bytes.byteLength < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8) {\n return null;\n }\n\n let offset = 2;\n while (offset + 4 <= bytes.byteLength) {\n if (bytes[offset] !== 0xff) {\n offset++;\n continue;\n }\n\n while (offset < bytes.byteLength && bytes[offset] === 0xff) {\n offset++;\n }\n\n if (offset >= bytes.byteLength) {\n break;\n }\n\n const marker = bytes[offset++];\n if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {\n continue;\n }\n if (marker === 0xd9 || marker === 0xda) {\n break;\n }\n if (offset + 2 > bytes.byteLength) {\n break;\n }\n\n const segmentLength = (bytes[offset] << 8) | bytes[offset + 1];\n if (segmentLength < 2 || offset + segmentLength > bytes.byteLength) {\n break;\n }\n\n const segmentStart = offset + 2;\n const payloadLength = segmentLength - 2;\n if (\n marker === 0xe1 &&\n payloadLength >= 14 &&\n bytes[segmentStart] === 0x45 &&\n bytes[segmentStart + 1] === 0x78 &&\n bytes[segmentStart + 2] === 0x69 &&\n bytes[segmentStart + 3] === 0x66 &&\n bytes[segmentStart + 4] === 0x00 &&\n bytes[segmentStart + 5] === 0x00\n ) {\n const tiff = segmentStart + 6;\n if (tiff + 8 > bytes.byteLength) {\n return null;\n }\n\n const littleEndian = bytes[tiff] === 0x49 && bytes[tiff + 1] === 0x49;\n const bigEndian = bytes[tiff] === 0x4d && bytes[tiff + 1] === 0x4d;\n if (!littleEndian && !bigEndian) {\n return null;\n }\n\n const read16 = (index: number) => (\n littleEndian\n ? bytes[index] | (bytes[index + 1] << 8)\n : (bytes[index] << 8) | bytes[index + 1]\n );\n const read32 = (index: number) => (\n littleEndian\n ? (bytes[index] |\n (bytes[index + 1] << 8) |\n (bytes[index + 2] << 16) |\n (bytes[index + 3] << 24)) >>> 0\n : ((bytes[index] << 24) |\n (bytes[index + 1] << 16) |\n (bytes[index + 2] << 8) |\n bytes[index + 3]) >>> 0\n );\n\n const ifdOffset = read32(tiff + 4);\n const ifdStart = tiff + ifdOffset;\n if (ifdStart + 2 > bytes.byteLength) {\n return null;\n }\n\n const entryCount = read16(ifdStart);\n for (let i = 0; i < entryCount; i++) {\n const entry = ifdStart + 2 + (i * 12);\n if (entry + 12 > bytes.byteLength) {\n return null;\n }\n\n const tag = read16(entry);\n if (tag !== 0x0112) {\n continue;\n }\n\n const type = read16(entry + 2);\n const count = read32(entry + 4);\n if (type !== 3 || count !== 1) {\n return null;\n }\n\n const valueOffset = entry + 8;\n return littleEndian\n ? bytes[valueOffset] | (bytes[valueOffset + 1] << 8)\n : (bytes[valueOffset] << 8) | bytes[valueOffset + 1];\n }\n }\n\n offset += segmentLength;\n }\n\n return null;\n}\n\nfunction buildExifOrientationSegment(orientation: number): Uint8Array | null {\n if (!Number.isInteger(orientation) || orientation < 2 || orientation > 8) {\n return null;\n }\n\n const payload = new Uint8Array([\n 0x45, 0x78, 0x69, 0x66, 0x00, 0x00,\n 0x49, 0x49, 0x2a, 0x00, 0x08, 0x00, 0x00, 0x00,\n 0x01, 0x00,\n 0x12, 0x01,\n 0x03, 0x00,\n 0x01, 0x00, 0x00, 0x00,\n orientation & 0xff, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n ]);\n const length = payload.byteLength + 2;\n const segment = new Uint8Array(payload.byteLength + 4);\n segment[0] = 0xff;\n segment[1] = 0xe1;\n segment[2] = (length >> 8) & 0xff;\n segment[3] = length & 0xff;\n segment.set(payload, 4);\n return segment;\n}\n\nfunction injectJpegApp1Segment(chunk: Uint8Array, segment: Uint8Array): Uint8Array {\n if (chunk.byteLength < 2 || chunk[0] !== 0xff || chunk[1] !== 0xd8) {\n return concatUint8Arrays([chunk, segment]);\n }\n\n const merged = new Uint8Array(chunk.byteLength + segment.byteLength);\n merged[0] = 0xff;\n merged[1] = 0xd8;\n merged.set(segment, 2);\n merged.set(chunk.subarray(2), 2 + segment.byteLength);\n return merged;\n}\n\nasync function readJpegOrientationFromSource(source: {\n headerBytes: Uint8Array;\n ensureHeaderBytes(target: number): Promise;\n}): Promise {\n const direct = readJpegOrientation(source.headerBytes);\n if (direct !== null) {\n return direct;\n }\n\n const extended = await source.ensureHeaderBytes(262_144);\n return readJpegOrientation(extended);\n}\n\nclass StatsTracker {\n readonly stats = makeEmptyStats();\n\n constructor(note?: string) {\n if (note) {\n this.note(note);\n }\n }\n\n note(message: string): void {\n if (!this.stats.notes.includes(message)) {\n this.stats.notes.push(message);\n }\n }\n\n addBytesIn(bytes: number): void {\n this.stats.bytesIn += bytes;\n }\n\n addBytesOut(bytes: number): void {\n this.stats.bytesOut += bytes;\n }\n\n update(bufferedInput: number, bufferedOutput: number, codecBytes: number, pipelineBytes: number): void {\n this.stats.peakBufferedInputBytes = Math.max(this.stats.peakBufferedInputBytes, bufferedInput);\n this.stats.peakBufferedOutputBytes = Math.max(this.stats.peakBufferedOutputBytes, bufferedOutput);\n this.stats.peakCodecBytes = Math.max(this.stats.peakCodecBytes, codecBytes);\n this.stats.peakPipelineBytes = Math.max(this.stats.peakPipelineBytes, pipelineBytes);\n }\n\n snapshot(): TransformStats {\n return { ...this.stats, notes: [...this.stats.notes] };\n }\n}\n\nfunction normalizeBox(options: TransformOptions, width: number, height: number) {\n return calculateTargetDimensions(\n width,\n height,\n options.width ?? width,\n options.height ?? height\n );\n}\n\nfunction createPixelStream(\n iteratorFactory: () => AsyncIterable,\n info: Promise<{ width: number; height: number; originalFormat: Exclude }>,\n stats: Promise = Promise.resolve(makeEmptyStats())\n): PixelStream {\n return {\n info,\n stats,\n [Symbol.asyncIterator]() {\n return iteratorFactory()[Symbol.asyncIterator]();\n },\n };\n}\n\nfunction createEncodedImage(\n iteratorFactory: () => AsyncIterable,\n info: Promise,\n stats: Promise\n): EncodedImage {\n return {\n info,\n stats,\n [Symbol.asyncIterator]() {\n return iteratorFactory()[Symbol.asyncIterator]();\n },\n };\n}\n\nasync function* iterateUint8ArrayRows(\n pixels: Uint8Array,\n width: number,\n height: number\n): AsyncIterable {\n const rowSize = width * 3;\n for (let y = 0; y < height; y++) {\n yield {\n data: pixels.subarray(y * rowSize, (y + 1) * rowSize),\n width,\n y,\n };\n }\n}\n\nasync function* iterateInputChunks(source: InputSource): AsyncIterable<{\n chunk: Uint8Array;\n isFinal: boolean;\n}> {\n const iterator = source.open()[Symbol.asyncIterator]();\n let current = await iterator.next();\n\n if (current.done) {\n return;\n }\n\n while (true) {\n const next = await iterator.next();\n yield {\n chunk: current.value,\n isFinal: next.done === true,\n };\n\n if (next.done === true) {\n return;\n }\n\n current = next;\n }\n}\n\nasync function* decodeSourceInternal(\n input: ByteInput | InputSource\n): AsyncIterable {\n const prepared = await prepareInputSource(input);\n const info = await inspectSource(prepared);\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n await loadWasm();\n\n if (info.format === 'jpeg') {\n const decoder = new WasmJpegDecoder();\n try {\n if (prepared.kind === 'bytes') {\n const bytes = await collectSourceBytes(prepared);\n decoder.init(asArrayBuffer(bytes));\n decoder.start();\n\n while (true) {\n const scanline = decoder.readScanline();\n if (!scanline) {\n break;\n }\n yield scanline;\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n return;\n }\n\n let headerReady = false;\n let started = false;\n\n for await (const { chunk, isFinal } of iterateInputChunks(prepared)) {\n decoder.pushInput(chunk, isFinal);\n\n if (!headerReady) {\n const headerStep = decoder.readHeaderStep();\n if (headerStep === 'ready') {\n headerReady = true;\n } else {\n continue;\n }\n }\n\n if (!started) {\n const startStep = decoder.startStep();\n if (startStep === 'ready') {\n started = true;\n } else {\n continue;\n }\n }\n\n while (true) {\n const scanline = decoder.readScanlineStep();\n if (scanline === 'needMore') {\n break;\n }\n if (scanline === null) {\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n return;\n }\n yield scanline;\n }\n }\n\n if (!headerReady) {\n if (decoder.readHeaderStep() !== 'ready') {\n throw new Error('Incomplete JPEG image');\n }\n headerReady = true;\n }\n\n if (!started) {\n if (decoder.startStep() !== 'ready') {\n throw new Error('Incomplete JPEG image');\n }\n started = true;\n }\n\n while (true) {\n const scanline = decoder.readScanlineStep();\n if (scanline === 'needMore') {\n throw new Error('Unexpected end of JPEG input');\n }\n if (scanline === null) {\n break;\n }\n yield scanline;\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n return;\n } finally {\n decoder.dispose();\n }\n }\n\n const bytes = await collectSourceBytes(prepared);\n const buffer = asArrayBuffer(bytes);\n\n if (info.format === 'png') {\n const decoder = new WasmPngDecoder();\n try {\n decoder.init(buffer);\n decoder.start();\n for (const scanline of decoder.readAllScanlines()) {\n yield scanline;\n }\n } finally {\n decoder.dispose();\n }\n return;\n }\n\n const decoder = await createDecoder(info.format, buffer);\n try {\n const decoded = await decoder.decode();\n yield* iterateUint8ArrayRows(decoded.pixels, decoded.width, decoded.height);\n } finally {\n decoder.dispose();\n }\n}\n\nexport function decode(input: ByteInput | InputSource): PixelStream {\n const infoDeferred = createDeferred<{ width: number; height: number; originalFormat: Exclude }>();\n\n const iteratorFactory = () => (async function* decodeIterator() {\n const prepared = await prepareInputSource(input);\n const info = await inspectSource(prepared);\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n infoDeferred.resolve({\n width: info.width,\n height: info.height,\n originalFormat: info.format,\n });\n\n yield* decodeSourceInternal(prepared);\n })();\n\n return createPixelStream(iteratorFactory, infoDeferred.promise);\n}\n\nexport function resize(stream: PixelStream, options: TransformOptions): PixelStream {\n const infoPromise = stream.info.then((info) => {\n const target = normalizeBox(options, info.width, info.height);\n return {\n width: target.width,\n height: target.height,\n originalFormat: info.originalFormat,\n };\n });\n\n const iteratorFactory = () => (async function* resizeIterator() {\n const sourceInfo = await stream.info;\n const target = normalizeBox(options, sourceInfo.width, sourceInfo.height);\n const state = createResizeState(\n sourceInfo.width,\n sourceInfo.height,\n target.width,\n target.height\n );\n\n for await (const scanline of stream) {\n const output = processScanline(state, scanline.data, scanline.y);\n for (const next of output) {\n yield next;\n }\n }\n\n for (const next of flushResize(state)) {\n yield next;\n }\n })();\n\n return createPixelStream(iteratorFactory, infoPromise, stream.stats ?? Promise.resolve(makeEmptyStats()));\n}\n\nexport function encodeJpeg(stream: PixelStream, options: TransformOptions = {}): EncodedImage {\n const quality = options.quality ?? DEFAULT_QUALITY;\n const infoPromise = stream.info.then((info) => ({\n width: info.width,\n height: info.height,\n mimeType: 'image/jpeg' as const,\n originalFormat: info.originalFormat,\n }));\n\n const statsPromise = stream.stats ?? Promise.resolve(makeEmptyStats());\n\n const iteratorFactory = () => (async function* encodeIterator() {\n await loadWasm();\n const info = await stream.info;\n const encoder = new WasmJpegEncoder();\n\n try {\n encoder.init(info.width, info.height, quality);\n encoder.start();\n\n for await (const scanline of stream) {\n encoder.writeScanline(scanline);\n for (const chunk of encoder.drainChunks()) {\n yield chunk;\n }\n }\n\n for (const chunk of encoder.finish()) {\n yield chunk;\n }\n } finally {\n encoder.dispose();\n }\n })();\n\n return createEncodedImage(iteratorFactory, infoPromise, statsPromise);\n}\n\nasync function* runJpegTransform(\n source: PreparedSource,\n info: ImageInfo,\n options: TransformOptions,\n infoDeferred: InfoResolver,\n stats: StatsTracker\n): AsyncIterable {\n await loadWasm();\n\n const orientation = await readJpegOrientationFromSource(source);\n const orientationSegment = orientation ? buildExifOrientationSegment(orientation) : null;\n const target = normalizeBox(options, info.width, info.height);\n const decoder = new WasmJpegDecoder();\n const encoder = new WasmJpegEncoder();\n let resizeState = createResizeState(1, 1, target.width, target.height);\n let decodeWidth = info.width;\n let decodeHeight = info.height;\n const scale = calculateOptimalScale(info.width, info.height, target.width, target.height);\n let headerReady = false;\n let started = false;\n let emittedFirstChunk = false;\n\n const refresh = () => {\n const resizeBytes =\n (resizeState.bufferA?.byteLength ?? 0) +\n (resizeState.bufferB?.byteLength ?? 0);\n const codecBytes =\n decoder.getBufferedInputSize() +\n decoder.getRowBufferSize() +\n encoder.getBufferedOutputSize() +\n encoder.getRowBufferSize();\n const pipelineBytes = codecBytes + resizeBytes;\n stats.update(decoder.getBufferedInputSize(), encoder.getBufferedOutputSize(), codecBytes, pipelineBytes);\n };\n\n try {\n if (source.kind === 'bytes') {\n const bytes = await collectSourceBytes(source);\n stats.addBytesIn(bytes.byteLength);\n refresh();\n\n if (orientationSegment) {\n stats.note(`jpeg-orientation=${orientation}`);\n }\n\n decoder.init(asArrayBuffer(bytes));\n const output = decoder.setScale(scale);\n decodeWidth = output.width;\n decodeHeight = output.height;\n resizeState = createResizeState(output.width, output.height, target.width, target.height);\n encoder.init(target.width, target.height, options.quality ?? DEFAULT_QUALITY);\n encoder.start();\n decoder.start();\n headerReady = true;\n started = true;\n infoDeferred.resolve({\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: 'jpeg',\n });\n stats.note(`jpeg-dct-scale=1/${scale}`);\n stats.note(`jpeg-decoded=${decodeWidth}x${decodeHeight}`);\n refresh();\n\n while (true) {\n const scanline = decoder.readScanline();\n if (!scanline) {\n break;\n }\n\n const outputScanlines = processScanline(resizeState, scanline.data, scanline.y);\n refresh();\n\n for (const outScanline of outputScanlines) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n\n for (const outScanline of flushResize(resizeState)) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n\n for (const jpegChunk of encoder.finish()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n\n return;\n }\n\n if (orientationSegment) {\n stats.note(`jpeg-orientation=${orientation}`);\n }\n\n for await (const { chunk, isFinal } of iterateInputChunks(source)) {\n stats.addBytesIn(chunk.byteLength);\n decoder.pushInput(chunk, isFinal);\n refresh();\n\n if (!headerReady) {\n const headerStep = decoder.readHeaderStep();\n if (headerStep === 'needMore') {\n continue;\n }\n\n headerReady = true;\n const output = decoder.setScale(scale);\n decodeWidth = output.width;\n decodeHeight = output.height;\n resizeState = createResizeState(output.width, output.height, target.width, target.height);\n encoder.init(target.width, target.height, options.quality ?? DEFAULT_QUALITY);\n encoder.start();\n infoDeferred.resolve({\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: 'jpeg',\n });\n stats.note(`jpeg-dct-scale=1/${scale}`);\n stats.note(`jpeg-decoded=${decodeWidth}x${decodeHeight}`);\n refresh();\n }\n\n if (!started) {\n const startStep = decoder.startStep();\n if (startStep === 'needMore') {\n continue;\n }\n\n started = true;\n refresh();\n }\n\n while (true) {\n const scanline = decoder.readScanlineStep();\n if (scanline === 'needMore') {\n break;\n }\n if (scanline === null) {\n break;\n }\n\n const outputScanlines = processScanline(resizeState, scanline.data, scanline.y);\n refresh();\n\n for (const outScanline of outputScanlines) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n }\n }\n\n if (decoder.finishStep() !== 'ready') {\n throw new Error('Unexpected end of JPEG input while finishing');\n }\n\n for (const outScanline of flushResize(resizeState)) {\n encoder.writeScanline(outScanline);\n refresh();\n for (const jpegChunk of encoder.drainChunks()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n }\n\n for (const jpegChunk of encoder.finish()) {\n const nextChunk = !emittedFirstChunk && orientationSegment\n ? injectJpegApp1Segment(jpegChunk, orientationSegment)\n : jpegChunk;\n emittedFirstChunk = true;\n stats.addBytesOut(nextChunk.byteLength);\n refresh();\n yield nextChunk;\n }\n } finally {\n decoder.dispose();\n encoder.dispose();\n }\n}\n\nasync function* runBufferedTransform(\n source: PreparedSource,\n info: ImageInfo,\n options: TransformOptions,\n infoDeferred: InfoResolver,\n stats: StatsTracker\n): AsyncIterable {\n const bytes = await collectSourceBytes(source);\n stats.addBytesIn(bytes.byteLength);\n stats.update(bytes.byteLength, 0, bytes.byteLength, bytes.byteLength);\n stats.note(`${info.format}-input-buffered`);\n await loadWasm();\n\n const target = normalizeBox(options, info.width, info.height);\n const encoder = new WasmJpegEncoder();\n let scanlines: AsyncIterable;\n\n if (info.format === 'png') {\n const decoder = new WasmPngDecoder();\n decoder.init(asArrayBuffer(bytes));\n decoder.start();\n\n const state = createResizeState(info.width, info.height, target.width, target.height);\n scanlines = (async function* pngRows() {\n try {\n for (const scanline of decoder.readAllScanlines()) {\n for (const outScanline of processScanline(state, scanline.data, scanline.y)) {\n yield outScanline;\n }\n }\n\n for (const outScanline of flushResize(state)) {\n yield outScanline;\n }\n } finally {\n decoder.dispose();\n }\n })();\n } else {\n const decoder = await createDecoder(info.format, asArrayBuffer(bytes));\n const decoded = await decoder.decode();\n decoder.dispose();\n\n const state = createResizeState(decoded.width, decoded.height, target.width, target.height);\n scanlines = (async function* bufferedRows() {\n for await (const row of iterateUint8ArrayRows(decoded.pixels, decoded.width, decoded.height)) {\n for (const outScanline of processScanline(state, row.data, row.y)) {\n yield outScanline;\n }\n }\n\n for (const outScanline of flushResize(state)) {\n yield outScanline;\n }\n })();\n }\n\n infoDeferred.resolve({\n width: target.width,\n height: target.height,\n mimeType: 'image/jpeg',\n originalFormat: info.format as EncodedImageInfo['originalFormat'],\n });\n\n try {\n encoder.init(target.width, target.height, options.quality ?? DEFAULT_QUALITY);\n encoder.start();\n\n for await (const scanline of scanlines) {\n encoder.writeScanline(scanline);\n const codecBytes = bytes.byteLength + encoder.getBufferedOutputSize() + encoder.getRowBufferSize();\n stats.update(bytes.byteLength, encoder.getBufferedOutputSize(), codecBytes, codecBytes);\n for (const chunk of encoder.drainChunks()) {\n stats.addBytesOut(chunk.byteLength);\n stats.update(bytes.byteLength, encoder.getBufferedOutputSize(), codecBytes, codecBytes);\n yield chunk;\n }\n }\n\n for (const chunk of encoder.finish()) {\n stats.addBytesOut(chunk.byteLength);\n const codecBytes = bytes.byteLength + encoder.getBufferedOutputSize() + encoder.getRowBufferSize();\n stats.update(bytes.byteLength, encoder.getBufferedOutputSize(), codecBytes, codecBytes);\n yield chunk;\n }\n } finally {\n encoder.dispose();\n }\n}\n\nexport function transform(input: ByteInput | InputSource, options: TransformOptions = {}): EncodedImage {\n const infoDeferred = createDeferred();\n const statsDeferred = createDeferred();\n\n const iteratorFactory = () => (async function* transformIterator() {\n const prepared = await prepareInputSource(input);\n const info = await inspectSource(prepared);\n if (info.format === 'unknown') {\n throw new Error('Unsupported image format');\n }\n\n const stats = new StatsTracker(\n prepared.kind === 'stream' ? 'streaming-input' : 'byte-input'\n );\n\n try {\n if (info.format === 'jpeg') {\n yield* runJpegTransform(prepared, info, options, infoDeferred, stats);\n } else {\n yield* runBufferedTransform(prepared, info, options, infoDeferred, stats);\n }\n\n statsDeferred.resolve(stats.snapshot());\n } catch (error) {\n infoDeferred.reject(error);\n statsDeferred.reject(error);\n throw error;\n }\n })();\n\n return createEncodedImage(iteratorFactory, infoDeferred.promise, statsDeferred.promise);\n}\n\nexport async function ready(options: { wasm?: WebAssembly.Module | ArrayBuffer } = {}): Promise {\n if (options.wasm instanceof WebAssembly.Module) {\n await initWithWasmModule(options.wasm);\n return;\n }\n\n if (options.wasm instanceof ArrayBuffer) {\n const compiled = await WebAssembly.compile(options.wasm);\n await initWithWasmModule(compiled);\n return;\n }\n\n await loadWasm();\n}\n\nexport async function collect(image: EncodedImage): Promise<{\n data: ArrayBuffer;\n info: EncodedImageInfo;\n stats: TransformStats;\n}> {\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n for await (const chunk of image) {\n chunks.push(chunk);\n total += chunk.byteLength;\n }\n\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return {\n data: merged.buffer.slice(merged.byteOffset, merged.byteOffset + merged.byteLength),\n info: await image.info,\n stats: await image.stats,\n };\n}\n\nexport function toReadableStream(image: EncodedImage): ReadableStream {\n const iterator = image[Symbol.asyncIterator]();\n return new ReadableStream({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n return;\n }\n\n controller.enqueue(value);\n },\n async cancel(reason) {\n if (typeof iterator.return === 'function') {\n await iterator.return(reason);\n }\n },\n });\n}\n\nexport function toResponse(image: EncodedImage, init: ResponseInit = {}): Response {\n const headers = new Headers(init.headers);\n headers.set('Content-Type', 'image/jpeg');\n\n return new Response(toReadableStream(image), {\n ...init,\n headers,\n });\n}\n\nexport { inspect };\n"]} \ No newline at end of file diff --git a/package.json b/package.json index 4c88b41..4696862 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,11 @@ "import": "./dist/index.js", "default": "./dist/index.js" }, + "./workerd": { + "types": "./dist/workerd.d.ts", + "import": "./dist/workerd.js", + "default": "./dist/workerd.js" + }, "./dist/sip.wasm": "./dist/sip.wasm" }, "files": [ diff --git a/src/decoders/simple.ts b/src/decoders/simple.ts index 34d3418..fc71f38 100644 --- a/src/decoders/simple.ts +++ b/src/decoders/simple.ts @@ -74,9 +74,12 @@ async function initCodecForNode( initFn: (module: WebAssembly.Module) => Promise, wasmPath: string ): Promise { - // Dynamic import for Node.js modules - const { readFile } = await import('fs/promises'); - const { createRequire } = await import('module'); + // Dynamic module names prevent esbuild/wrangler from resolving these + // at bundle time. Only Node.js reaches this function at runtime. + const fsModule = 'fs/promises'; + const moduleModule = 'module'; + const { readFile } = await import(/* @vite-ignore */ fsModule); + const { createRequire } = await import(/* @vite-ignore */ moduleModule); const require = createRequire(import.meta.url); // Resolve the WASM file path from the package diff --git a/src/wasm/loader.ts b/src/wasm/loader.ts index 3f83035..cd84793 100644 --- a/src/wasm/loader.ts +++ b/src/wasm/loader.ts @@ -150,7 +150,10 @@ async function doLoadWasm(): Promise { process.versions.node != null; if (isNode) { - const { readFile } = await import('fs/promises'); + // Dynamic module name prevents esbuild/wrangler from resolving this + // at bundle time. Only Node.js reaches this branch at runtime. + const fsModule = 'fs/promises'; + const { readFile } = await import(/* @vite-ignore */ fsModule); const wasmBinary = await readFile(new URL('./sip.wasm', import.meta.url)); const module = await createSipModule({ wasmBinary }); return module as SipWasmModule;