@energy8platform/golem 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -2
- package/dist/editor.js +502 -87
- package/dist/lib/cli.js +1309 -359
- package/dist/lib/cli.js.map +4 -4
- package/dist/lib/editor/stage.d.ts +7 -0
- package/dist/lib/editor/store.d.ts +72 -32
- package/dist/lib/editor-entry.js +1309 -359
- package/dist/lib/editor-entry.js.map +4 -4
- package/dist/lib/harness.js +162 -27
- package/dist/lib/preview/export-video.d.ts +12 -0
- package/dist/lib/preview/harness.d.ts +2 -0
- package/dist/lib/preview/render-preview.d.ts +6 -0
- package/dist/lib/rig-anim.d.ts +1 -1
- package/dist/lib/rig-check.d.ts +2 -1
- package/dist/lib/rig-constraints.d.ts +63 -0
- package/dist/lib/rig-format.d.ts +551 -325
- package/dist/lib/rig-gates.d.ts +209 -0
- package/dist/lib/rig-mesh.d.ts +1 -0
- package/dist/lib/rig-motion.d.ts +22 -0
- package/dist/lib/rig-qa.d.ts +35 -0
- package/dist/lib/rig-quality.d.ts +12 -0
- package/dist/lib/rig-runtime.d.ts +10 -1
- package/dist/lib/rig-state.d.ts +3 -0
- package/dist/lib/rig-tools.d.ts +5 -1
- package/dist/lib/runtime.js +146 -25
- package/dist/lib/runtime.js.map +3 -3
- package/dist/lib/tools.js +1291 -341
- package/dist/lib/tools.js.map +4 -4
- package/package.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/editor/server.ts", "../../src/rig-format.ts", "../../src/rig-deform.ts", "../../src/rig-api.ts", "../../src/rig-io.ts", "../../src/rig-queue.ts", "../../src/rig-anim.ts", "../../src/rig-mesh.ts", "../../src/rig-path.ts", "../../src/rig-constraints.ts", "../../src/rig-tools.ts", "../../src/rig-import-layers.ts", "../../src/rig-presets.ts", "../../src/preview/render-preview.ts", "../../src/rig-check.ts", "../../src/rig-history.ts", "../../src/rig-atlas.ts", "../../src/spine-import.ts", "../../src/ktx2.ts", "../../src/rig-templates.ts", "../../src/rig-template-library.ts", "../../src/rig-mesh-image.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * editor/server.ts \u2014 HTTP + SSE for the browser editor, on top of the same tool registry as MCP.\n * `rig` in every request is a path relative to `root`; the file on disk is the state; the server watches it and\n * tells every client when it changed (own writes included \u2014 clients compare versions).\n */\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { readFile, stat, readdir, mkdir, open } from \"node:fs/promises\";\nimport { watch as fsWatch, type FSWatcher } from \"node:fs\";\nimport { resolve, dirname, basename, extname, sep, join, relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { RigDocument } from \"../rig-format\";\nimport { callTool } from \"../rig-api\";\nimport { withRigQueue } from \"../rig-queue\";\nimport { pngSize } from \"../rig-import-layers\";\nimport { saveBytes } from \"../rig-io\";\n\nconst TYPES: Record<string, string> = { \".html\": \"text/html; charset=utf-8\", \".js\": \"text/javascript\", \".css\": \"text/css\", \".map\": \"application/json\", \".json\": \"application/json\", \".png\": \"image/png\", \".jpg\": \"image/jpeg\", \".webp\": \"image/webp\" };\n\nexport interface EditorServer { port: number; url: string; close(): Promise<void> }\n\n/** `root` \u2014 where the rigs live (every path in the API is relative to it); `assets` \u2014 where editor.html and dist/ are (default: this package). */\nexport async function startEditorServer(opts: { root: string; port?: number; assets?: string }): Promise<EditorServer> {\n const root = resolve(opts.root);\n const assets = resolve(opts.assets ?? fileURLToPath(new URL(\"../..\", import.meta.url)));\n const inside = (rel: string) => { const abs = resolve(root, rel); return abs === root || abs.startsWith(root + sep) ? abs : undefined; };\n const version = async (abs: string) => { try { const s = await stat(abs); return `${s.mtimeMs}:${s.size}`; } catch { return \"missing\"; } };\n const readDoc = async (abs: string) => RigDocument.parse(JSON.parse(await readFile(abs, \"utf8\")));\n /**\n * The document on disk together with the version OF that document. Stat, read, stat again: a write landing\n * between a read and a single stat pairs one with the other's version, and a version NEWER than the document\n * beside it is the one direction that breaks the precondition \u2014 the client would send a version that matches\n * the file while showing an older document, and clobber. While the file keeps moving, read again; if it never\n * settles, the version stat'd BEFORE the read is the safe half of the pair, since too old only costs a 409.\n */\n const readDocAt = async (abs: string) => {\n let v = await version(abs);\n for (let i = 0; i < 3; i++) {\n const doc = await readDoc(abs);\n const after = await version(abs);\n if (after === v) return { doc, version: v };\n v = after;\n }\n return { doc: await readDoc(abs), version: v };\n };\n const json = (res: ServerResponse, status: number, body: unknown) => { res.writeHead(status, { \"content-type\": \"application/json\" }); res.end(JSON.stringify(body)); };\n\n // The editor writes files, so the surface is loopback-only. A page on any other origin can still *send* requests\n // to 127.0.0.1, but it cannot forge `Host`: a request naming anything but this server's own address is a\n // DNS-rebinding attempt, not our editor. Filled in once the port is known (nothing can arrive before `listen`).\n let allowedHosts = new Set<string>();\n const hostOk = (req: IncomingMessage) => allowedHosts.has(String(req.headers.host ?? \"\").toLowerCase());\n\n // ---- watchers: one per rig file, fan out to SSE clients ----\n const clients = new Map<string, Set<ServerResponse>>(); // abs rig path \u2192 responses\n type Watcher = { w: FSWatcher; last: string; timer?: NodeJS.Timeout };\n const watchers = new Map<string, Watcher>();\n function ensureWatch(abs: string) {\n if (watchers.has(abs)) return;\n const entry: Watcher = { w: fsWatch(dirname(abs), { persistent: false }, (_e, file) => { if (file && file !== basename(abs)) return; schedule(); }), last: \"\" };\n const schedule = () => { clearTimeout(entry.timer); entry.timer = setTimeout(async () => {\n const v = await version(abs);\n if (v === entry.last) return;\n entry.last = v;\n for (const res of clients.get(abs) ?? []) res.write(`event: changed\\ndata: ${JSON.stringify({ version: v })}\\n\\n`);\n }, 50); };\n version(abs).then(v => { entry.last = v; });\n watchers.set(abs, entry);\n }\n\n async function body(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = []; for await (const c of req) chunks.push(c as Buffer);\n return chunks.length ? JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) : {};\n }\n\n const SKIP = new Set([\"node_modules\", \".rig-history\", \"dist\", \".git\"]);\n /** every rig.json under the root, newest first \u2014 the `open` list */\n async function listRigs(): Promise<{ rig: string; name: string; mtimeMs: number }[]> {\n const out: { rig: string; name: string; mtimeMs: number }[] = [];\n const walk = async (dir: string) => {\n for (const e of await readdir(dir, { withFileTypes: true })) {\n if (e.isDirectory()) { if (!SKIP.has(e.name)) await walk(join(dir, e.name)); continue; }\n if (e.name !== \"rig.json\") continue;\n const abs = join(dir, e.name);\n let name = \"?\";\n try { name = String(JSON.parse(await readFile(abs, \"utf8\")).meta?.name ?? \"?\"); } catch { /* unreadable: still listed, still openable */ }\n out.push({ rig: relative(root, abs).split(sep).join(\"/\"), name, mtimeMs: (await stat(abs)).mtimeMs });\n }\n };\n await walk(root);\n return out.sort((a, b) => b.mtimeMs - a.mtimeMs);\n }\n /** the PNGs beside a rig, with their sizes read from the header only */\n async function listFiles(rigAbs: string): Promise<{ name: string; width: number; height: number }[]> {\n const dir = dirname(rigAbs), out: { name: string; width: number; height: number }[] = [];\n for (const e of (await readdir(dir, { withFileTypes: true })).filter(e => e.isFile() && /\\.png$/i.test(e.name)).sort((a, b) => a.name.localeCompare(b.name))) {\n const fh = await open(join(dir, e.name));\n try {\n const head = Buffer.alloc(24);\n const { bytesRead } = await fh.read(head, 0, 24, 0);\n if (bytesRead < 24) continue;\n const [width, height] = pngSize(head);\n out.push({ name: e.name, width, height });\n } catch { /* not a PNG after all: not listed */ } finally { await fh.close(); }\n }\n return out;\n }\n const UPLOAD_MAX = 64 * 1024 * 1024;\n /** the request body, refused past `max` bytes */\n async function bytes(req: IncomingMessage, max: number): Promise<Buffer | undefined> {\n const chunks: Buffer[] = []; let n = 0;\n for await (const c of req) { n += (c as Buffer).length; if (n > max) return undefined; chunks.push(c as Buffer); }\n return Buffer.concat(chunks);\n }\n\n const server = createServer(async (req, res) => {\n try {\n if (!hostOk(req)) return json(res, 403, { isError: true, text: `ERROR: forbidden Host \"${req.headers.host ?? \"\"}\" \u2014 this server answers only on 127.0.0.1 / localhost` });\n const url = new URL(req.url ?? \"/\", \"http://x\");\n if (url.pathname === \"/\") { res.writeHead(302, { location: \"/editor.html\" + url.search }); return res.end(); }\n if (url.pathname.startsWith(\"/api/\")) return await api(url, req, res);\n // Only /rig/<path> (under `root`) and the fixed static surface (editor.html, dist/editor.js, dist/editor.css\n // and their maps, under `assets`) are servable; everything else \u2014 including anything a normalized \"..\"\n // collapses onto \u2014 is refused, not just 404ed.\n const STATIC = new Set([\"/editor.html\", \"/dist/editor.js\", \"/dist/editor.js.map\", \"/dist/editor.css\", \"/dist/editor.css.map\"]);\n const abs = url.pathname.startsWith(\"/rig/\") ? inside(decodeURIComponent(url.pathname.slice(5)))\n : STATIC.has(url.pathname) ? join(assets, url.pathname)\n : undefined;\n if (!abs) { res.writeHead(403); return res.end(\"forbidden\"); }\n try { const data = await readFile(abs); res.writeHead(200, { \"content-type\": TYPES[extname(abs)] ?? \"application/octet-stream\" }); res.end(data); }\n catch { res.writeHead(404); res.end(\"not found\"); }\n } catch (e) {\n // a throw after the headers went out cannot be reported to the client; ending the response is all that is left,\n // and the error must never escape to the process (one bad request would take the editor down)\n if (res.headersSent) { console.error(`editor: ${req.method} ${req.url}: ${(e as Error).message}`); res.end(); return; }\n json(res, 500, { isError: true, text: `ERROR: ${(e as Error).message}` });\n }\n });\n\n async function api(url: URL, req: IncomingMessage, res: ServerResponse) {\n const rigOf = (rel: string | null) => { if (!rel) return undefined; return inside(rel); };\n if (url.pathname === \"/api/doc\") {\n const abs = rigOf(url.searchParams.get(\"rig\")); if (!abs) return json(res, 403, { isError: true, text: \"rig outside root\" });\n return json(res, 200, await readDocAt(abs));\n }\n if (url.pathname === \"/api/events\") {\n const abs = rigOf(url.searchParams.get(\"rig\")); if (!abs) { res.writeHead(403); return res.end(); }\n // watch BEFORE the headers go out: fs.watch throws on a missing directory (the editor asks for the rig it had\n // open last, which need not exist under this root), and a throw after writeHead has nowhere to be reported\n if (!(await stat(abs).then(() => true, () => false))) return json(res, 404, { isError: true, text: `ERROR: ${url.searchParams.get(\"rig\")} does not exist under ${root}` });\n ensureWatch(abs);\n res.writeHead(200, { \"content-type\": \"text/event-stream\", \"cache-control\": \"no-cache\", connection: \"keep-alive\" });\n res.write(`: connected\\n\\n`);\n (clients.get(abs) ?? clients.set(abs, new Set()).get(abs)!).add(res);\n const hb = setInterval(() => res.write(\": hb\\n\\n\"), 15000);\n req.on(\"close\", () => { clearInterval(hb); clients.get(abs)?.delete(res); });\n return;\n }\n if (url.pathname.startsWith(\"/api/tool/\") && req.method === \"POST\") {\n // a JSON body is the only shape this route takes; demanding the type keeps a cross-origin form POST\n // (the one request shape a browser sends without a preflight) from ever reaching `callTool`\n const ct = String(req.headers[\"content-type\"] ?? \"\").toLowerCase();\n if (!ct.startsWith(\"application/json\")) return json(res, 415, { isError: true, text: `ERROR: POST /api/tool/* needs content-type: application/json (got \"${req.headers[\"content-type\"] ?? \"none\"}\")` });\n const { rig, args, baseVersion } = (await body(req)) as { rig?: string; args?: Record<string, unknown>; baseVersion?: string };\n const abs = rigOf(rig ?? null); if (!abs) return json(res, 403, { isError: true, text: \"rig outside root\" });\n ensureWatch(abs);\n return await withRigQueue(abs, async () => {\n // Check the version inside the same queue as the tool: two requests based on one version must not\n // both pass before either saves. This queue coordinates this process; external writers can still race.\n if (baseVersion !== undefined && (await version(abs)) !== baseVersion) {\n const at = await readDocAt(abs);\n return json(res, 409, { isError: true, version: at.version, doc: at.doc,\n text: `ERROR: the rig changed on disk (expected ${baseVersion}, found ${at.version}); nothing was written` });\n }\n const r = await callTool(url.pathname.slice(10), { ...(args ?? {}), path: abs });\n return json(res, 200, { text: r.text, doc: r.doc, image: r.image?.toString(\"base64\"), isError: r.isError, version: await version(abs) });\n });\n }\n if (url.pathname === \"/api/rigs\" && req.method === \"GET\") return json(res, 200, await listRigs());\n if (url.pathname === \"/api/rigs\" && req.method === \"POST\") {\n const ct = String(req.headers[\"content-type\"] ?? \"\").toLowerCase();\n if (!ct.startsWith(\"application/json\")) return json(res, 415, { isError: true, text: \"ERROR: POST /api/rigs needs content-type: application/json\" });\n const { rig, name, width, height } = (await body(req)) as { rig?: string; name?: string; width?: number; height?: number };\n if (typeof rig !== \"string\" || !/(^|\\/)rig\\.json$/.test(rig)) return json(res, 400, { isError: true, text: \"ERROR: a project is a directory with a rig.json \u2014 the path must end with /rig.json\" });\n const abs = inside(rig); if (!abs) return json(res, 403, { isError: true, text: \"rig outside root\" });\n if (await stat(abs).then(() => true, () => false)) return json(res, 409, { isError: true, text: `ERROR: ${rig} already exists \u2014 open it, or pick another directory` });\n await mkdir(dirname(abs), { recursive: true });\n const r = await callTool(\"rig_create\", { path: abs, name: name ?? basename(dirname(abs)), width: width ?? 640, height: height ?? 700 });\n ensureWatch(abs);\n return json(res, r.isError ? 400 : 200, { text: r.text, doc: r.doc, isError: r.isError, version: await version(abs) });\n }\n if (url.pathname === \"/api/files\" && req.method === \"GET\") {\n const abs = rigOf(url.searchParams.get(\"rig\")); if (!abs) return json(res, 403, { isError: true, text: \"rig outside root\" });\n return json(res, 200, await listFiles(abs));\n }\n if (url.pathname === \"/api/upload\" && req.method === \"POST\") {\n const abs = rigOf(url.searchParams.get(\"rig\")); if (!abs) return json(res, 403, { isError: true, text: \"rig outside root\" });\n const name = url.searchParams.get(\"name\") ?? \"\";\n if (!/^[A-Za-z0-9._-]+\\.png$/i.test(name) || name.startsWith(\".\")) return json(res, 400, { isError: true, text: `ERROR: bad file name \"${name}\" \u2014 letters, digits, . _ - and a .png extension` });\n if (!String(req.headers[\"content-type\"] ?? \"\").toLowerCase().startsWith(\"image/png\")) return json(res, 415, { isError: true, text: \"ERROR: upload needs content-type: image/png\" });\n const target = join(dirname(abs), name);\n if (!inside(relative(root, target))) return json(res, 403, { isError: true, text: \"file outside root\" });\n if (await stat(target).then(() => true, () => false)) return json(res, 409, { isError: true, text: `ERROR: ${name} already exists next to the rig \u2014 rename the file` });\n const data = await bytes(req, UPLOAD_MAX);\n if (!data) return json(res, 413, { isError: true, text: `ERROR: ${name} is larger than ${UPLOAD_MAX / 1048576} MB` });\n let size: [number, number];\n try { size = pngSize(data); } catch { return json(res, 415, { isError: true, text: `ERROR: ${name} is not a PNG` }); }\n await saveBytes(target, data);\n return json(res, 200, { name, width: size[0], height: size[1] });\n }\n json(res, 404, { isError: true, text: \"unknown api route\" });\n }\n\n await new Promise<void>((ok, fail) => {\n server.once(\"error\", fail);\n server.listen(opts.port ?? 8765, \"127.0.0.1\", () => { server.off(\"error\", fail); ok(); });\n });\n const port = (server.address() as { port: number }).port;\n allowedHosts = new Set([`127.0.0.1:${port}`, `localhost:${port}`, `[::1]:${port}`]);\n return { port, url: `http://127.0.0.1:${port}`, close: async () => { for (const w of watchers.values()) { clearTimeout(w.timer); w.w.close(); } for (const set of clients.values()) for (const c of set) c.end(); await new Promise<void>(r => server.close(() => r())); } };\n}\n", "/**\n * rig-format v2 \u2014 declarative rig document for slot animation.\n * Source of truth for both AI agents and the editor.\n *\n * Conventions (agents rely on these, keep them stable):\n * - Units: pixels in document space, origin top-left, Y down (PixiJS).\n * - Rotation: degrees, clockwise positive. Shear: degrees added to the x axis (shearX) / y axis (shearY).\n * - Bone transforms are LOCAL (relative to parent, subject to `inherit`). Root bones \u2014 relative to document.\n * - Time: seconds. Animation duration is explicit, keys may end earlier.\n * - Ids: snake_case, unique within their collection.\n *\n * v2 (Spine-class): attachments are first-class (region / mesh with weights / path), bones have shear and\n * inherit modes, slots have a colour, constraints (ik / transform / path) with their own tracks, deform tracks\n * carry vertex offsets, drawOrder tracks. v0/v1 documents are migrated on parse (slot pivot/offset \u2192 region attachment).\n */\nimport { z } from \"zod\";\nimport { DEFORM_PROP_RE, DEFORM_BOUNDS } from \"./rig-deform\";\n\n// ---------- primitives ----------\n\n/** the shape of every id in the format; exported so UIs can check a typed id before building a tool call */\nexport const ID_RE = /^[a-z][a-z0-9_]*$/;\nexport const Id = z.string().regex(ID_RE, \"snake_case id\");\n\nexport const Ease = z.union([\n z.enum([\"linear\", \"step\", \"ease_in\", \"ease_out\", \"ease_in_out\", \"back_out\", \"elastic_out\"]),\n // cubic-bezier control points, same semantics as CSS\n z.object({ bezier: z.tuple([z.number(), z.number(), z.number(), z.number()]) }),\n]);\n\nexport const Transform = z.object({\n x: z.number().default(0),\n y: z.number().default(0),\n rotation: z.number().default(0),\n scaleX: z.number().default(1),\n scaleY: z.number().default(1),\n shearX: z.number().default(0),\n shearY: z.number().default(0),\n});\n\nexport const Color = z.string().regex(/^#[0-9a-fA-F]{8}$/, \"color must be #rrggbbaa\");\nexport const Blend = z.enum([\"normal\", \"add\", \"multiply\", \"screen\"]);\nexport const Inherit = z.enum([\"normal\", \"onlyTranslation\", \"noRotationOrReflection\", \"noScale\", \"noScaleOrReflection\"]);\n\n// ---------- assets ----------\n\nexport const Asset = z.object({\n id: Id,\n /** relative path inside the rig package, e.g. \"layers/arm_l.png\" */\n src: z.string(),\n /** original (untrimmed, unrotated) image size \u2014 the space attachments and uvs refer to */\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n /** packed region [x, y, w, h] inside `src` when `src` is an atlas (w/h as packed: trimmed, rotated) */\n frame: z.tuple([z.number(), z.number(), z.number(), z.number()]).optional(),\n /** the packed region is stored rotated 90\u00B0 clockwise */\n rotate: z.union([z.literal(0), z.literal(90)]).default(0),\n /** offset [x, y] of the packed (trimmed) region inside the original image */\n trim: z.tuple([z.number(), z.number()]).optional(),\n /** where this layer came from \u2014 provenance for agents */\n origin: z\n .object({\n sourceImage: z.string().optional(),\n /** bbox in source image: [x, y, w, h] */\n bbox: z.tuple([z.number(), z.number(), z.number(), z.number()]).optional(),\n inpainted: z.boolean().default(false),\n prompt: z.string().optional(),\n })\n .optional(),\n});\n\n// ---------- skeleton ----------\n\nexport const Bone = z.object({\n id: Id,\n parent: Id.optional(),\n /** visual length for the editor gizmo and for chains (ik/path), no effect on child transforms */\n length: z.number().nonnegative().default(0),\n transform: Transform.default({}),\n /** which parts of the parent's world transform this bone inherits */\n inherit: Inherit.default(\"normal\"),\n /** semantic hint: \"head\", \"arm_l\", \"torso\"\u2026 drives auto-rig & presets */\n role: z.string().optional(),\n /** editor colour, no runtime effect */\n color: z.string().optional(),\n});\n\nexport const Slot = z.object({\n id: Id,\n bone: Id,\n /** active attachment id; undefined = hidden */\n attachment: Id.optional(),\n alpha: z.number().min(0).max(1).default(1),\n /** draw order, higher = on top */\n z: z.number().int().default(0),\n /** blend mode: `add` for glows/fire on black, `multiply` for shadows */\n blend: Blend.default(\"normal\"),\n /** tint, #rrggbbaa */\n color: Color.default(\"#ffffffff\"),\n});\n\n// ---------- attachments ----------\n\n/** one bone's influence on a vertex: position in that bone's local space and weight */\nexport const Influence = z.object({ bone: Id, x: z.number(), y: z.number(), w: z.number() });\nconst VertexData = {\n /** unweighted: [x, y, \u2026] in the slot bone's local space */\n vertices: z.array(z.number()).optional(),\n /** weighted: one influence list per vertex */\n weights: z.array(z.array(Influence).min(1)).optional(),\n};\n\nexport const RegionAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"region\"),\n asset: Id,\n /** placement of the image centre in the slot bone's local space */\n x: z.number().default(0), y: z.number().default(0), rotation: z.number().default(0),\n scaleX: z.number().default(1), scaleY: z.number().default(1),\n /** drawn size; default: the asset size */\n width: z.number().positive().optional(), height: z.number().positive().optional(),\n});\nexport const MeshAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"mesh\"),\n asset: Id,\n /** texture coordinates 0..1 in the asset's original image, 2 per vertex */\n uvs: z.array(z.number()),\n triangles: z.array(z.number().int().nonnegative()),\n ...VertexData,\n /** number of hull vertices (the outline is uvs[0..hull)) */\n hull: z.number().int().nonnegative().default(0),\n width: z.number().positive().optional(), height: z.number().positive().optional(),\n});\nexport const PathAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"path\"),\n ...VertexData,\n /** curve lengths for constant-speed positioning */\n lengths: z.array(z.number()).default([]),\n closed: z.boolean().default(false),\n constantSpeed: z.boolean().default(true),\n});\nexport const Attachment = z.discriminatedUnion(\"type\", [RegionAttachment, MeshAttachment, PathAttachment]);\n\n// ---------- constraints ----------\n\nexport const IkConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1), target: Id,\n mix: z.number().default(1), softness: z.number().default(0),\n bendPositive: z.boolean().default(true), compress: z.boolean().default(false), stretch: z.boolean().default(false), uniform: z.boolean().default(false),\n});\nexport const TransformConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1), target: Id,\n local: z.boolean().default(false), relative: z.boolean().default(false),\n rotation: z.number().default(0), x: z.number().default(0), y: z.number().default(0),\n scaleX: z.number().default(0), scaleY: z.number().default(0), shearY: z.number().default(0),\n mixRotate: z.number().default(1), mixX: z.number().default(1), mixY: z.number().default(1),\n mixScaleX: z.number().default(1), mixScaleY: z.number().default(1), mixShearY: z.number().default(1),\n});\nexport const PathConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1),\n /** slot whose active attachment is a path */\n target: Id,\n positionMode: z.enum([\"fixed\", \"percent\"]).default(\"percent\"),\n spacingMode: z.enum([\"length\", \"fixed\", \"percent\", \"proportional\"]).default(\"length\"),\n rotateMode: z.enum([\"tangent\", \"chain\", \"chainScale\"]).default(\"tangent\"),\n rotation: z.number().default(0), position: z.number().default(0), spacing: z.number().default(0),\n mixRotate: z.number().default(1), mixX: z.number().default(1), mixY: z.number().default(1),\n});\n\n/**\n * The mix channels that switch each kind of constraint on \u2014 the solvers' own early-outs, in one place:\n * `applyIk` returns at `mix <= 0`, `applyTransformConstraint` and `applyPathConstraint` when every mix here is 0.\n * `rig_check` (`constraint_dead`), the editor's drag redirection and the constraint forms all read this list, so\n * an early-out that ever changes has a single definition to change with it. They are also the keyable mix tracks.\n */\nexport const MIX_PROPS = {\n ik: [\"mix\"],\n transform: [\"mixRotate\", \"mixX\", \"mixY\", \"mixScaleX\", \"mixScaleY\", \"mixShearY\"],\n path: [\"mixRotate\", \"mixX\", \"mixY\"],\n} as const;\n\n// ---------- animation ----------\n\nexport const BoneProp = z.enum([\"x\", \"y\", \"rotation\", \"scaleX\", \"scaleY\", \"shearX\", \"shearY\"]);\nexport const SlotProp = z.enum([\"alpha\", \"attachment\", \"z\", \"color\"]);\n/** lattice params (fractions of the image size), p<row><col>x|y pixel offsets of one control point, or `vertices` (mesh offsets) */\nexport const DeformProp = z.string().regex(/^(bulge|bend|sway|squash|p[0-2][0-2][xy]|vertices)$/, \"deform prop must be bulge|bend|sway|squash|p<row><col>x|y|vertices\");\nexport const IkProp = z.enum([\"mix\", \"softness\", \"bendPositive\", \"compress\", \"stretch\"]);\nexport const TransformProp = z.enum([\"mixRotate\", \"mixX\", \"mixY\", \"mixScaleX\", \"mixScaleY\", \"mixShearY\"]);\nexport const PathProp = z.enum([\"position\", \"spacing\", \"mixRotate\", \"mixX\", \"mixY\"]);\n\nexport const KeyValue = z.union([z.number(), z.string(), z.null(), z.array(z.number()), z.array(z.string())]);\nexport const Key = z.object({\n t: z.number().nonnegative(),\n v: KeyValue,\n /** easing INTO the next key */\n ease: Ease.default(\"ease_in_out\"),\n});\n\nexport const Track = z.discriminatedUnion(\"target\", [\n z.object({ target: z.literal(\"bone\"), id: Id, prop: BoneProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"slot\"), id: Id, prop: SlotProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"deform\"), id: Id, prop: DeformProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"ik\"), id: Id, prop: IkProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"transform\"), id: Id, prop: TransformProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"path\"), id: Id, prop: PathProp, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"drawOrder\"), id: Id.default(\"order\"), prop: z.literal(\"order\").default(\"order\"), keys: z.array(Key).min(1) }),\n]);\n\nexport const Event = z.object({\n t: z.number().nonnegative(),\n name: z.string(),\n payload: z.record(z.unknown()).optional(),\n});\n\nexport const Animation = z.object({\n id: Id,\n duration: z.number().positive(),\n loop: z.boolean().default(false),\n tracks: z.array(Track).default([]),\n events: z.array(Event).default([]),\n /** if generated from a preset \u2014 keep params so the agent can re-tune instead of re-keying */\n preset: z.object({ name: z.string(), params: z.record(z.unknown()) }).optional(),\n});\n\n// ---------- document ----------\n\n/** the editor's reference underlay: a PNG in the rig's directory drawn under the canvas \u2014 runtime, preview and export ignore it */\nexport const Reference = z.object({\n src: z.string(),\n opacity: z.number().min(0).max(1).default(0.5),\n x: z.number().default(0), y: z.number().default(0),\n scale: z.number().positive().default(1),\n});\n\nexport const RigSchema = z.object({\n format: z.literal(\"energy8.rig\"),\n version: z.literal(2),\n meta: z.object({\n name: z.string(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n /** free-form notes for agents & humans: what this rig is, what's intentionally missing */\n notes: z.string().optional(),\n reference: Reference.optional(),\n }),\n assets: z.array(Asset),\n bones: z.array(Bone).min(1),\n slots: z.array(Slot),\n attachments: z.array(Attachment).default([]),\n ik: z.array(IkConstraint).default([]),\n transform: z.array(TransformConstraint).default([]),\n path: z.array(PathConstraint).default([]),\n animations: z.array(Animation),\n});\n\n/** schema that also accepts v0/v1 input (migrated on the fly) */\nexport const RigDocument = z.preprocess(input => {\n const v = (input as { version?: unknown } | null)?.version;\n return v === 0 || v === 1 ? migrateV1(input) : input;\n}, RigSchema);\n\nexport type RigDocument = z.infer<typeof RigSchema>;\nexport type Bone = z.infer<typeof Bone>;\nexport type Slot = z.infer<typeof Slot>;\nexport type Asset = z.infer<typeof Asset>;\nexport type Reference = z.infer<typeof Reference>;\nexport type Attachment = z.infer<typeof Attachment>;\nexport type RegionAttachment = z.infer<typeof RegionAttachment>;\nexport type MeshAttachment = z.infer<typeof MeshAttachment>;\nexport type PathAttachment = z.infer<typeof PathAttachment>;\nexport type Influence = z.infer<typeof Influence>;\nexport type IkConstraint = z.infer<typeof IkConstraint>;\nexport type TransformConstraint = z.infer<typeof TransformConstraint>;\nexport type PathConstraint = z.infer<typeof PathConstraint>;\nexport type Animation = z.infer<typeof Animation>;\nexport type Track = z.infer<typeof Track>;\nexport type Key = z.infer<typeof Key>;\n\n// ---------- v1 \u2192 v2 migration ----------\n\nconst DEG = Math.PI / 180;\n\n/**\n * v0/v1: slot placement lived on the slot (pivot fraction + bone-local offset) and `attachment` named an ASSET.\n * v2: every showable image is a region attachment with its own placement; deform tracks target attachments.\n */\nexport function migrateV1(input: unknown): unknown {\n const doc = input as Record<string, any>;\n const assets: any[] = doc.assets ?? [], slots: any[] = doc.slots ?? [], anims: any[] = doc.animations ?? [];\n const assetById = new Map(assets.map(a => [a.id, a]));\n // which assets each slot can show: rest attachment + every attachment key value\n const shows = new Map<string, Set<string>>();\n const add = (slot: string, asset: string) => (shows.get(slot) ?? shows.set(slot, new Set()).get(slot)!).add(asset);\n for (const s of slots) if (s.attachment) add(s.id, s.attachment);\n for (const a of anims) for (const t of a.tracks ?? [])\n if (t.target === \"slot\" && t.prop === \"attachment\") for (const k of t.keys ?? []) if (typeof k.v === \"string\") add(t.id, k.v);\n const usage = new Map<string, number>();\n for (const set of shows.values()) for (const asset of set) usage.set(asset, (usage.get(asset) ?? 0) + 1);\n const attachmentId = (slot: string, asset: string) => ((usage.get(asset) ?? 0) > 1 ? `${slot}_${asset}` : asset);\n\n const attachments: any[] = [];\n for (const s of slots) {\n const pivot = s.pivot ?? { x: 0.5, y: 0.5 }, o = { x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1, ...(s.offset ?? {}) };\n for (const asset of shows.get(s.id) ?? []) {\n const a = assetById.get(asset);\n if (!a) continue;\n // image centre relative to the pivot point, then through the slot offset transform\n const cx = (0.5 - pivot.x) * a.width, cy = (0.5 - pivot.y) * a.height;\n const r = o.rotation * DEG, cos = Math.cos(r), sin = Math.sin(r);\n const x = o.x + cos * o.scaleX * cx - sin * o.scaleY * cy, y = o.y + sin * o.scaleX * cx + cos * o.scaleY * cy;\n attachments.push({ id: attachmentId(s.id, asset), slot: s.id, type: \"region\", asset, x: round(x), y: round(y), rotation: o.rotation, scaleX: o.scaleX, scaleY: o.scaleY });\n }\n }\n const restAttachment = (slot: string) => {\n const s = slots.find(x => x.id === slot);\n const first = s?.attachment ?? [...(shows.get(slot) ?? [])][0];\n return first ? attachmentId(slot, first) : undefined;\n };\n const newSlots = slots.map(s => {\n const { pivot, offset, attachment, ...rest } = s;\n return { ...rest, ...(attachment ? { attachment: attachmentId(s.id, attachment) } : {}) };\n });\n const newAnims = anims.map(a => ({\n ...a,\n tracks: (a.tracks ?? []).flatMap((t: any) => {\n if (t.target === \"slot\" && t.prop === \"attachment\")\n return [{ ...t, keys: t.keys.map((k: any) => ({ ...k, v: typeof k.v === \"string\" ? attachmentId(t.id, k.v) : k.v })) }];\n if (t.target === \"deform\") { const id = restAttachment(t.id); return id ? [{ ...t, id }] : []; }\n return [t];\n }),\n }));\n return { ...doc, version: 2, slots: newSlots, attachments: [...(doc.attachments ?? []), ...attachments], animations: newAnims };\n}\nconst round = (v: number) => Math.round(v * 1e6) / 1e6 + 0;\n\n// ---------- semantic validation (beyond shape) ----------\n\nconst trackId = (t: Track) => `${t.target}.${t.id}.${t.prop}`;\n\nexport function validate(doc: RigDocument): string[] {\n const errs: string[] = [];\n const dup = (xs: { id: string }[], kind: string) => {\n const seen = new Set<string>();\n for (const x of xs) {\n if (seen.has(x.id)) errs.push(`${kind}: duplicate id \"${x.id}\"`);\n seen.add(x.id);\n }\n };\n dup(doc.assets, \"asset\"); dup(doc.bones, \"bone\"); dup(doc.slots, \"slot\"); dup(doc.attachments, \"attachment\");\n dup(doc.animations, \"animation\"); dup(doc.ik, \"ik\"); dup(doc.transform, \"transform\"); dup(doc.path, \"path\");\n\n const bones = new Set(doc.bones.map(b => b.id));\n const assets = new Map(doc.assets.map(a => [a.id, a]));\n const slots = new Set(doc.slots.map(s => s.id));\n const attachments = new Map(doc.attachments.map(a => [a.id, a]));\n const iks = new Set(doc.ik.map(c => c.id)), transforms = new Set(doc.transform.map(c => c.id)), paths = new Set(doc.path.map(c => c.id));\n\n for (const b of doc.bones) {\n if (b.parent && !bones.has(b.parent)) errs.push(`bone \"${b.id}\": unknown parent \"${b.parent}\"`);\n }\n for (const b of doc.bones) {\n const seen = new Set<string>(); let cur: Bone | undefined = b;\n while (cur?.parent) {\n if (seen.has(cur.id)) { errs.push(`bone \"${b.id}\": parent cycle`); break; }\n seen.add(cur.id); cur = doc.bones.find(x => x.id === cur!.parent);\n }\n }\n if (!doc.bones.some(b => !b.parent)) errs.push(\"no root bone\");\n\n for (const a of doc.assets) {\n if (a.frame && (a.frame[2] <= 0 || a.frame[3] <= 0)) errs.push(`asset \"${a.id}\": frame must have positive size`);\n if (a.frame && !a.trim && !a.rotate && (a.frame[2] !== a.width || a.frame[3] !== a.height)) errs.push(`asset \"${a.id}\": frame size must equal width\u00D7height (or declare trim/rotate)`);\n }\n for (const s of doc.slots) {\n if (!bones.has(s.bone)) errs.push(`slot \"${s.id}\": unknown bone \"${s.bone}\"`);\n if (s.attachment) {\n const a = attachments.get(s.attachment);\n if (!a) errs.push(`slot \"${s.id}\": unknown attachment \"${s.attachment}\"`);\n else if (a.slot !== s.id) errs.push(`slot \"${s.id}\": attachment \"${s.attachment}\" belongs to slot \"${a.slot}\"`);\n }\n }\n const vertexCount = (a: Attachment): number => {\n if (a.type === \"region\") return 4;\n if (a.type === \"mesh\") return a.uvs.length / 2;\n return a.vertices ? a.vertices.length / 2 : a.weights?.length ?? 0;\n };\n for (const a of doc.attachments) {\n if (!slots.has(a.slot)) errs.push(`attachment \"${a.id}\": unknown slot \"${a.slot}\"`);\n if (a.type !== \"path\" && !assets.has(a.asset)) errs.push(`attachment \"${a.id}\": unknown asset \"${a.asset}\"`);\n if (a.type === \"mesh\" || a.type === \"path\") {\n const n = a.type === \"mesh\" ? a.uvs.length / 2 : vertexCount(a);\n if (a.type === \"mesh\") {\n if (a.uvs.length % 2 || n < 3) errs.push(`attachment \"${a.id}\": uvs must have 2 numbers per vertex, at least 3 vertices`);\n if (a.triangles.length % 3) errs.push(`attachment \"${a.id}\": triangles must have 3 indices each`);\n for (const i of a.triangles) if (i >= n) errs.push(`attachment \"${a.id}\": triangle index ${i} out of range (${n} vertices)`);\n }\n if ((a.vertices ? 1 : 0) + (a.weights ? 1 : 0) !== 1) errs.push(`attachment \"${a.id}\": exactly one of vertices / weights`);\n if (a.vertices && a.vertices.length !== 2 * n) errs.push(`attachment \"${a.id}\": vertices must have 2 numbers per vertex (${2 * n}, got ${a.vertices.length})`);\n if (a.weights) {\n if (a.weights.length !== n) errs.push(`attachment \"${a.id}\": weights must have one influence list per vertex (${n}, got ${a.weights.length})`);\n for (const list of a.weights) for (const inf of list) if (!bones.has(inf.bone)) errs.push(`attachment \"${a.id}\": weights reference unknown bone \"${inf.bone}\"`);\n }\n }\n }\n for (const c of doc.ik) {\n if (c.bones.length > 2) errs.push(`ik \"${c.id}\": must have 1 or 2 bones`);\n for (const b of c.bones) if (!bones.has(b)) errs.push(`ik \"${c.id}\": unknown bone \"${b}\"`);\n if (!bones.has(c.target)) errs.push(`ik \"${c.id}\": unknown target bone \"${c.target}\"`);\n }\n for (const c of doc.transform) {\n for (const b of c.bones) if (!bones.has(b)) errs.push(`transform \"${c.id}\": unknown bone \"${b}\"`);\n if (!bones.has(c.target)) errs.push(`transform \"${c.id}\": unknown target bone \"${c.target}\"`);\n }\n for (const c of doc.path) {\n for (const b of c.bones) if (!bones.has(b)) errs.push(`path \"${c.id}\": unknown bone \"${b}\"`);\n if (!slots.has(c.target)) errs.push(`path \"${c.id}\": unknown target slot \"${c.target}\"`);\n }\n\n for (const a of doc.animations) {\n const tracks = new Set<string>();\n for (const t of a.tracks) {\n const tid = trackId(t);\n if (tracks.has(tid)) errs.push(`animation \"${a.id}\": duplicate track ${tid}`);\n tracks.add(tid);\n const known = t.target === \"bone\" ? bones.has(t.id) : t.target === \"slot\" ? slots.has(t.id) : t.target === \"deform\" ? attachments.has(t.id)\n : t.target === \"ik\" ? iks.has(t.id) : t.target === \"transform\" ? transforms.has(t.id) : t.target === \"path\" ? paths.has(t.id) : true;\n if (!known) errs.push(`animation \"${a.id}\": unknown ${t.target} \"${t.id}\"`);\n const bound = t.target === \"deform\" ? (DEFORM_BOUNDS as Record<string, number | undefined>)[t.prop] : undefined;\n const att = t.target === \"deform\" ? attachments.get(t.id) : undefined;\n let prev = -1;\n for (const k of t.keys) {\n if (k.t <= prev && prev >= 0) errs.push(`animation \"${a.id}\" ${tid}: keys not strictly increasing`);\n if (k.t > a.duration) errs.push(`animation \"${a.id}\" ${tid}: key at ${k.t}s exceeds duration`);\n if (t.target === \"slot\" && t.prop === \"attachment\") {\n if (k.v !== null && typeof k.v !== \"string\") errs.push(`animation \"${a.id}\" ${tid}: attachment key must be an attachment id or null`);\n else if (typeof k.v === \"string\") {\n const target = attachments.get(k.v);\n if (!target) errs.push(`animation \"${a.id}\": unknown attachment \"${k.v}\"`);\n else if (target.slot !== t.id) errs.push(`animation \"${a.id}\" ${tid}: attachment \"${k.v}\" belongs to slot \"${target.slot}\"`);\n }\n } else if (t.target === \"slot\" && t.prop === \"color\") {\n const ok = Array.isArray(k.v) && k.v.length === 4 && k.v.every(c => typeof c === \"number\" && c >= 0 && c <= 1);\n if (!ok) errs.push(`animation \"${a.id}\" ${tid}: color key must be [r, g, b, a] in 0..1`);\n } else if (t.target === \"drawOrder\") {\n const order = Array.isArray(k.v) ? (k.v as unknown[]) : [];\n const ok = order.length === doc.slots.length && new Set(order).size === order.length && order.every(s => typeof s === \"string\" && slots.has(s));\n if (!ok) errs.push(`animation \"${a.id}\" drawOrder key at ${k.t}s must list every slot exactly once`);\n } else if (t.target === \"deform\" && t.prop === \"vertices\") {\n if (!Array.isArray(k.v) || !k.v.every(v => typeof v === \"number\")) errs.push(`animation \"${a.id}\" ${tid}: vertices key must be a number array`);\n else if (att && att.type !== \"region\") {\n const expected = att.weights ? 2 * att.weights.reduce((s, list) => s + list.length, 0) : 2 * vertexCount(att);\n if (k.v.length !== expected) errs.push(`animation \"${a.id}\" ${tid}: vertices key needs ${expected} numbers, got ${k.v.length}`);\n } else if (att) errs.push(`animation \"${a.id}\" ${tid}: vertices deform needs a mesh or path attachment`);\n } else if (typeof k.v !== \"number\") errs.push(`animation \"${a.id}\" ${tid}: key must be a number`);\n else if (bound !== undefined && Math.abs(k.v) > bound) errs.push(`animation \"${a.id}\" ${tid}: value ${k.v} out of range [-${bound}, ${bound}]`);\n prev = k.t;\n }\n }\n for (const e of a.events) {\n if (e.t > a.duration) errs.push(`animation \"${a.id}\": event \"${e.name}\" exceeds duration`);\n }\n }\n return errs;\n}\n\nexport function parse(input: unknown): RigDocument {\n const doc = RigDocument.parse(input);\n const errs = validate(doc);\n if (errs.length) throw new Error(\"rig validation failed:\\n\" + errs.join(\"\\n\"));\n return doc;\n}\n", "/**\n * rig-deform \u2014 3\u00D73 control-grid deformer for a slot's attachment (pure math, no PixiJS).\n *\n * Control points live on an interpolating biquadratic (Lagrange) patch over the image:\n * rows r=0..2 at v=0,0.5,1 of the height (top\u2192bottom), cols c=0..2 at u=0,0.5,1 of the width.\n * Each control point carries an offset (dx, dy) in image pixels. With zero offsets the patch is the\n * identity, and moving control point (r,c) by d moves the surface at that point by exactly d.\n *\n * Named params are dimensionless fractions of the image size (see spec \u00A71); raw `p<r><c>x|y` are pixels.\n * All contributions add.\n */\n\nexport const DEFORM_NAMED = [\"bulge\", \"bend\", \"sway\", \"squash\"] as const;\nexport const DEFORM_PROP_RE = /^(bulge|bend|sway|squash|p[0-2][0-2][xy])$/;\n/** |value| bound per named param. bulge/squash reach a degenerate (zero-area) patch at 1, hence 0.9. */\nexport const DEFORM_BOUNDS: Record<(typeof DEFORM_NAMED)[number], number> = { bulge: 0.9, bend: 1, sway: 1, squash: 0.9 };\n\nexport interface Pivot { x: number; y: number }\n\nconst T = [0, 0.5, 1];\nconst basis = (t: number) => [(1 - t) * (1 - 2 * t), 4 * t * (1 - t), t * (2 * t - 1)];\nconst dbasis = (t: number) => [4 * t - 3, 4 - 8 * t, 4 * t - 1];\n\n/** Named params + raw offsets \u2192 18 numbers [dx00, dy00, dx01, dy01, \u2026] row-major by (r*3+c). */\nexport function controlOffsets(params: Record<string, number>, w: number, h: number, pivot: Pivot, out: Float64Array = new Float64Array(18)): Float64Array {\n out.fill(0);\n const bulge = params.bulge ?? 0, bend = params.bend ?? 0, sway = params.sway ?? 0, squash = params.squash ?? 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const i = (r * 3 + c) * 2, u = T[c], v = T[r], mid = r === 1 ? 1 : 0;\n // `+ 0` folds IEEE -0 (zero params \u00D7 negative factors) into +0 so pinned points compare equal to 0\n out[i] = mid * (bulge * w * (u - 0.5) + bend * w) + sway * w * (v - pivot.y) + squash * w * (u - pivot.x) * 0.5 + 0;\n out[i + 1] = -squash * h * (v - pivot.y) + 0;\n }\n for (const k in params) {\n if (k.length !== 4 || k[0] !== \"p\") continue;\n const r = +k[1], c = +k[2];\n if (!(r >= 0 && r < 3 && c >= 0 && c < 3) || (k[3] !== \"x\" && k[3] !== \"y\")) continue;\n out[(r * 3 + c) * 2 + (k[3] === \"y\" ? 1 : 0)] += params[k];\n }\n return out;\n}\n\n/** Patch offset at normalized image coords (u, v) \u2208 [0,1]\u00B2. */\nexport function evalPatch(offsets: ArrayLike<number>, u: number, v: number): [number, number] {\n const bu = basis(u), bv = basis(v);\n let x = 0, y = 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const wgt = bv[r] * bu[c], i = (r * 3 + c) * 2;\n x += wgt * offsets[i]; y += wgt * offsets[i + 1];\n }\n return [x, y];\n}\n\n/** n\u00D7n render vertices (row-major, x fastest \u2014 PlaneGeometry order), pivot baked in, image-local pixels. */\nexport function gridPositions(offsets: ArrayLike<number>, w: number, h: number, pivot: Pivot, n: number, out: Float32Array = new Float32Array(2 * n * n)): Float32Array {\n const px = pivot.x * w, py = pivot.y * h;\n for (let j = 0; j < n; j++) for (let i = 0; i < n; i++) {\n const u = i / (n - 1), v = j / (n - 1), [ox, oy] = evalPatch(offsets, u, v), k = (j * n + i) * 2;\n out[k] = u * w - px + ox;\n out[k + 1] = v * h - py + oy;\n }\n return out;\n}\n\n/** Minimum Jacobian determinant of (u,v)\u2192image map over a sample grid, normalized so identity = 1. \u2264 0 means a fold. */\nexport function minJacobian(offsets: ArrayLike<number>, w: number, h: number, samples = 17): number {\n let min = Infinity;\n for (let j = 0; j < samples; j++) for (let i = 0; i < samples; i++) {\n const u = i / (samples - 1), v = j / (samples - 1);\n const bu = basis(u), bv = basis(v), du = dbasis(u), dv = dbasis(v);\n let xu = 0, xv = 0, yu = 0, yv = 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const k = (r * 3 + c) * 2, dx = offsets[k], dy = offsets[k + 1];\n xu += bv[r] * du[c] * dx; xv += dv[r] * bu[c] * dx;\n yu += bv[r] * du[c] * dy; yv += dv[r] * bu[c] * dy;\n }\n const det = ((w + xu) * (h + yv) - xv * yu) / (w * h);\n if (det < min) min = det;\n }\n return min;\n}\n", "/**\n * rig-api \u2014 the tool registry. MCP (stdio), the CLI and the editor's HTTP server all register these same tools,\n * so a human in the editor and an agent over MCP perform identical operations with identical history.\n *\n * Each tool reads `rig.json`, applies, writes back. Stateless per call: agents can crash/retry freely; the file\n * is the state. Every mutation first snapshots the previous file into `.rig-history/` (rig_undo / rig_diff) and\n * answers with what changed; structural tools also return the compact rig summary.\n */\nimport { z } from \"zod\";\nimport { readFile, writeFile, stat } from \"node:fs/promises\";\nimport { dirname, join, relative, isAbsolute } from \"node:path\";\nimport { saveJson } from \"./rig-io\";\nimport { withRigQueue } from \"./rig-queue\";\nimport { RigDocument, validate, parse, Ease, type Track } from \"./rig-format\";\nimport * as T from \"./rig-tools\";\nimport { importLayers, pngSize } from \"./rig-import-layers\";\nimport { applyPreset, presets } from \"./rig-presets\";\nimport { renderPreview, closePreview } from \"./preview/render-preview\";\nimport { checkRig, summarize } from \"./rig-check\";\nimport { pushHistory, listHistory, diffDocs, undo, redo } from \"./rig-history\";\nimport { buildAtlas } from \"./rig-atlas\";\nimport { importSpineProject } from \"./spine-import\";\nimport { extractTemplate, applyTemplate, describeTemplate } from \"./rig-templates\";\nimport { saveTemplate, loadLibrary } from \"./rig-template-library\";\nimport { traceHulls, meshFromIslands, autoWeights, defaultWeightBones, round6 } from \"./rig-mesh\";\nimport { alphaMaskFromPng } from \"./rig-mesh-image\";\nimport { evaluate } from \"./rig-anim\";\n\nexport interface ToolResult { text: string; image?: Buffer; doc?: RigDocument; isError?: boolean }\n/** `input` is the BUILT schema, not the raw shape: see `tool` below for why every caller has to share this one object */\nexport interface ToolDef { name: string; description: string; input: z.AnyZodObject; run(args: Record<string, unknown>): Promise<ToolResult> }\nexport const tools: ToolDef[] = [];\n/**\n * `.strict()`, built once here and handed to every caller (callTool, and the MCP server's registerTool), because\n * zod's default is to STRIP unknown keys: a misspelled optional argument \u2014 `bone` for `bones`, `time` for `t` \u2014\n * used to reach the handler as if it had never been passed, and the tool answered \"ok\" for a document the agent\n * did not ask for. Most of this registry's arguments are optional, so that silence covered nearly all of them.\n */\nfunction tool<S extends z.ZodRawShape>(name: string, description: string, input: S, run: (args: z.infer<z.ZodObject<S>>) => Promise<ToolResult>) {\n const handler = run as ToolDef[\"run\"];\n tools.push({ name, description, input: z.object(input).strict(), run: args =>\n typeof args.path === \"string\" ? withRigQueue(args.path, () => handler(args)) : handler(args) });\n}\nexport async function callTool(name: string, args: unknown): Promise<ToolResult> {\n const t = tools.find(t => t.name === name);\n if (!t) return { text: `ERROR: unknown tool \"${name}\"`, isError: true };\n const parsed = t.input.safeParse(args);\n if (!parsed.success) return { text: `ERROR: invalid arguments: ${parsed.error.issues.map(i => `${i.path.join(\".\") || \"(root)\"}: ${i.message}`).join(\"; \")}`, isError: true };\n // Handlers already catch their own errors into ToolResult, but callTool is now also invoked from an HTTP\n // handler (editor/server.ts) with no other try/catch above it \u2014 an uncaught throw here would otherwise\n // crash the request instead of returning a JSON error. (Not separately unit-tested: every tool's own\n // try/catch makes a handler that reaches this catch hard to construct without stubbing one out.)\n try { return await t.run(parsed.data); } catch (e) { return fail(e); }\n}\nexport const closeTools = () => closePreview();\n\nconst text = (s: string, doc?: RigDocument): ToolResult => ({ text: s, doc });\nconst fail = (e: unknown): ToolResult => ({ text: `ERROR: ${e instanceof Error ? e.message : String(e)}`, isError: true });\n\nconst Path = z.string().describe(\"path to rig.json; assets are resolved relative to its directory\");\nconst Library = z.string().optional().describe(\"template library JSON; default presets.json next to rig.json\");\n\nasync function load(path: string) { return RigDocument.parse(JSON.parse(await readFile(path, \"utf8\"))); }\n/** every writer of a file someone else reads goes through this \u2014 see rig-io.ts for why it is not `writeFile` */\nconst save = (path: string, doc: RigDocument) => saveJson(path, doc);\nconst exists = (p: string) => stat(p).then(() => true, () => false);\n/** absolute path, or relative to the rig's directory */\nconst resolveFrom = (rigPath: string, p: string) => (isAbsolute(p) ? p : join(dirname(rigPath), p));\n/** how a file is referenced from rig.json (asset.src) */\nconst srcFor = (rigPath: string, file: string) => relative(dirname(rigPath), file).split(\"\\\\\").join(\"/\");\nconst libraryFor = (rigPath: string, lib?: string) => (lib ? resolveFrom(rigPath, lib) : join(dirname(rigPath), \"presets.json\"));\nasync function pngInfo(rigPath: string, file: string) {\n const abs = resolveFrom(rigPath, file);\n const [width, height] = pngSize(await readFile(abs));\n return { abs, width, height, src: srcFor(rigPath, abs) };\n}\n\n/** load \u2192 snapshot \u2192 op \u2192 save \u2192 what changed (+ summary for structural edits). Refuses to save an invalid doc. */\nasync function mutate(path: string, op: (d: RigDocument) => RigDocument | Promise<RigDocument>, summary = false): Promise<ToolResult> {\n try {\n const raw = await readFile(path, \"utf8\");\n const prev = RigDocument.parse(JSON.parse(raw));\n const next = parse(await op(prev));\n await pushHistory(path, raw);\n await save(path, next);\n const changes = diffDocs(prev, next);\n const head = summary ? T.describe(next) : `${next.meta.name} ${next.meta.width}x${next.meta.height}`;\n return text(`${head}\\nchanged:${changes.length ? \"\\n \" + changes.join(\"\\n \") : \" nothing\"}`, next);\n } catch (e) { return fail(e); }\n}\nasync function create(path: string, doc: RigDocument): Promise<ToolResult> {\n if (await exists(path)) await pushHistory(path, await readFile(path, \"utf8\"));\n const saved = parse(doc);\n await save(path, saved);\n return text(T.describe(saved), saved);\n}\n/** preview companion: findings of the previewed animation (plus any error), or a positive one-liner */\nfunction previewCheck(doc: RigDocument, animation?: string): string {\n const all = checkRig(doc, { animation });\n const scoped = animation ? all.filter(f => f.animation === animation || f.level === \"error\") : all;\n if (scoped.length) return summarize(scoped);\n const a = animation ? doc.animations.find(x => x.id === animation) : undefined;\n return a ? `check: OK for \"${a.id}\" (${a.tracks.length} tracks, ${a.duration}s${a.loop ? \" loop\" : \"\"})` : \"check: OK (rest pose)\";\n}\n\nconst TrackRef = { target: z.enum([\"bone\", \"slot\", \"deform\", \"ik\", \"transform\", \"path\", \"drawOrder\"]), id: z.string(), prop: z.string() };\nconst KeyIn = z.object({ t: z.number().describe(\"seconds\"), v: z.union([z.number(), z.string(), z.null(), z.array(z.number()), z.array(z.string())]),\n ease: Ease.optional().describe(\"into the next key: linear|step|ease_in|ease_out|ease_in_out|back_out|elastic_out|{bezier:[x1,y1,x2,y2]}; default ease_in_out\") });\n/** number-array key values (deform vertices) are rounded so rig.json stays compact \u2014 same 6 decimals rig-mesh writes */\nconst roundKey = <K extends z.infer<typeof KeyIn>>(k: K): K =>\n Array.isArray(k.v) && k.v.every(x => typeof x === \"number\") ? { ...k, v: (k.v as number[]).map(round6) } : k;\nconst KEY_DOC =\n \"Keys are {t, v, ease?}. Bone values are ABSOLUTE local-transform values, not offsets (rest x=4 \u2192 key v=0 moves it 4px); \" +\n \"deform values are relative (0 = rest). bone: x|y|rotation|scaleX|scaleY|shearX|shearY; slot: alpha|attachment(asset id or null)|z; \" +\n \"deform (3\u00D73 mesh on the slot's image): bulge|bend|sway|squash (fractions of the image size, |v|\u22640.9/1) or p<row><col>x|y (px, rows/cols 0..2 top-left first). \" +\n \"Some values are arrays: deform `vertices` keys are number arrays (2\u00B7n offsets, or 2\u00B7\u03A3influences for weighted meshes); drawOrder keys are slot-id arrays; slot color keys are [r,g,b,a].\";\n\n// ---------- document ----------\n\ntool(\"rig_create\", \"Create a new empty rig document with a root bone at bottom-center.\",\n { path: Path, name: z.string(), width: z.number().int(), height: z.number().int(), notes: z.string().optional().describe(\"style anchor + what is intentionally missing; reused by rig_layer_prompt\") },\n async ({ path, name, width, height, notes }) => {\n try { return await create(path, T.createDoc(name, width, height, notes)); } catch (e) { return fail(e); }\n });\n\ntool(\"rig_create_symbol\",\n \"Create a rig from ONE image (a slot symbol): canvas = image + margin, root at the image's bottom centre, slot pivot (0.5, 1). \" +\n \"Then apply symbol_idle / symbol_win / anticipation_shake / dim presets.\",\n { path: Path, image: z.string().describe(\"PNG path, absolute or relative to rig.json dir\"), name: z.string().optional(), margin: z.number().default(0.15).describe(\"fraction of the image size on every side, room for bounces\"), notes: z.string().optional() },\n async ({ path, image, name, margin, notes }) => {\n try {\n const { width, height, src } = await pngInfo(path, image);\n return await create(path, T.createSymbol(name ?? src.replace(/^.*\\//, \"\").replace(/\\.png$/i, \"\"), { src, width, height }, margin, notes));\n } catch (e) { return fail(e); }\n });\n\nconst ReferenceIn = z.object({\n src: z.string().describe(\"PNG next to rig.json (relative path)\"),\n opacity: z.number().min(0).max(1).optional(), x: z.number().optional(), y: z.number().optional(), scale: z.number().positive().optional(),\n}).strict();\n\ntool(\"rig_set_meta\",\n \"Patch the document's meta: name, canvas width/height (moves nothing \u2014 only the bounds change), notes, and the editor's reference underlay \" +\n \"`reference {src, opacity, x, y, scale}` \u2014 a PNG next to rig.json drawn under the canvas to fit parts against; runtime, preview and export ignore it; null removes it.\",\n { path: Path, name: z.string().optional(), width: z.number().int().positive().optional(), height: z.number().int().positive().optional(),\n notes: z.string().optional(), reference: ReferenceIn.nullable().optional() },\n async ({ path, ...patch }) => mutate(path, d => T.setMeta(d, patch)));\n\ntool(\"rig_get\", \"Read a rig. Compact summary by default; verbose=true adds slot pivot/offset and every track with key counts and value ranges (no asset prompts); full=true returns the JSON.\",\n { path: Path, verbose: z.boolean().default(false), full: z.boolean().default(false) },\n async ({ path, verbose, full }) => { try { const d = await load(path); return text(full ? JSON.stringify(d, null, 2) : T.describe(d, { verbose })); } catch (e) { return fail(e); } });\n\ntool(\"rig_get_attachment\",\n \"ONE attachment, in full: the exact `vertices` / `weights` / `uvs` / `triangles` arrays it stores. This is what the raw forms of rig_set_path_attachment and rig_set_mesh want \u2014 they edit a shape in place instead of rebuilding it, and to edit `weights` you have to start from the `weights` that are there. \" +\n \"The FIRST LINE is a summary (kind, slot, vertex/anchor counts, skinning, the length a deform `vertices` key must have); everything after the first newline is the attachment object as JSON, ready to hand straight back. \" +\n \"rig_get full=true returns the same arrays inside the whole document, which is 3.3 MB on a Spine import against a few KB here.\",\n { path: Path, id: z.string().describe(\"attachment id (rig_get lists them per slot with verbose=true)\") },\n async ({ path, id }) => {\n try {\n const d = await load(path);\n const att = d.attachments.find(a => a.id === id);\n if (!att) throw new Error(`unknown attachment \"${id}\" (the document has ${d.attachments.length}: ${d.attachments.slice(0, 12).map(a => a.id).join(\", \")}${d.attachments.length > 12 ? \", \u2026\" : \"\"})`);\n return text(`${T.describeAttachment(d, att)}\\n${JSON.stringify(att, null, 2)}`);\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_get_pose\",\n \"Where every bone actually IS at one moment: world x, y, angle (degrees) and axis lengths, with the bone's own local x, y and rotation, plus each slot's shown attachment and world bounding box. \" +\n \"Constraints are applied, so this is what the runtime draws, not what the document stores. Without `animation` it reports the rest pose, and `t` is then an error rather than a number that does nothing. \" +\n \"A `t` past the animation's duration is clamped to the end, and the summary line says so. \" +\n \"`bones` and `slots` narrow the report \u2014 pass them on a large rig, where the whole report runs to tens of KB. \" +\n \"Use it to check an edit landed where you meant instead of reading it off a preview image.\",\n { path: Path, animation: z.string().optional(), t: z.number().min(0).optional(),\n bones: z.array(z.string()).optional(), slots: z.array(z.string()).optional() },\n async ({ path, ...opts }) => {\n try {\n const d = await load(path);\n const r = T.poseReport(d, opts);\n const past = r.duration !== undefined && r.t > r.duration ? ` \u2014 past its ${r.duration}s end, clamped to the end` : \"\";\n return text(`${r.bones.length} bones, ${r.slots.length} slots at t=${r.t}${r.animation ? ` in \"${r.animation}\"` : \" (rest)\"}${past}\\n${JSON.stringify(r)}`);\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_validate\", \"Schema and reference validation (empty = OK). Motion problems (seams, folds, misplaced patches) are rig_check's job.\",\n { path: Path },\n async ({ path }) => { try { const errs = validate(await load(path)); return text(errs.length ? errs.join(\"\\n\") : \"OK (schema and references; run rig_check for motion problems)\"); } catch (e) { return fail(e); } });\n\ntool(\"rig_check\",\n \"Cheap self-critique without rendering: out_of_canvas (slot leaves the canvas, worst time), static_track, loop_seam, \" +\n \"deform_flip (lattice folds over itself \u2014 an error), mesh_fold (a skinned/deformed mesh folds over itself: error when \u2265 5 % of the mesh folds, warning below \u2014 \" +\n \"a dense mesh bent hard at a joint pinches the odd hairline triangle), weights_sum (skinned mesh vertex weights not summing to 1), \" +\n \"patch_offset (a slot sits away from its asset's source bbox), rest_overlap, unused_asset, never_visible, \" +\n \"and for constraints: constraint_dead (every mix is 0 at rest and no track lifts one \u2014 the solver skips it), \" +\n \"constraint_cycle (the target is a bone the constraint drives, or hangs off one: it reads what it writes \u2014 an error), \" +\n \"ik_unreachable (the target sits beyond the chain's reach for over 20 % of an animation, so the limb hangs straight), \" +\n \"path_missing (a path constraint whose target slot never shows a path attachment \u2014 an error). \" +\n \"Findings are sorted by severity. Run it before spending vision tokens on a preview.\",\n { path: Path, animation: z.string().optional().describe(\"limit to one animation (rest pose is always checked)\") },\n async ({ path, animation }) => { try { return text(summarize(checkRig(await load(path), { animation }), 100)); } catch (e) { return fail(e); } });\n\ntool(\"rig_import_spine\",\n \"Import a Spine project (skeleton .json 3.8/4.x + .atlas + page image) as a new rig: bones, slots, region/mesh/path attachments with weights, \" +\n \"IK / transform / path constraints and every animation (deform, draw order, colors), converted to this document's y-down space. \" +\n \"The atlas may be plain or base64 text; a KTX2 page is transcoded to PNG next to rig.json. Then use rig_get / rig_render_preview / rig_check as with any rig.\",\n { path: Path, json: z.string().describe(\"Spine skeleton .json, absolute or relative to rig.json dir\"),\n atlas: z.string().optional().describe(\"atlas file; default: <json>.atlas or <json>.atlas.txt\"),\n image: z.string().optional().describe(\"atlas page image (.png or .ktx2); default: the page named in the atlas, next to it\"),\n name: z.string().optional().describe(\"default: the json file name\"), margin: z.number().optional().describe(\"canvas margin around the skeleton bounds, px\"), notes: z.string().optional() },\n async ({ path, json, atlas, image, name, margin, notes }) => {\n try {\n const r = await importSpineProject({ json: resolveFrom(path, json), atlas: atlas && resolveFrom(path, atlas), image: image && resolveFrom(path, image), rigPath: path, name, margin, notes });\n const res = await create(path, parse(r.doc));\n if (r.warnings.length) res.text += `\\nwarnings:\\n ${r.warnings.join(\"\\n \")}`;\n return res;\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_import_layers\",\n \"Import PNG layers from a directory as assets + slots + bones. Uses layers.json sidecar if present \" +\n \"(id, role, parent, z, bbox, joint, swap, bone, slot), else filename convention `03_arm_l.png` \u2192 z=3, id=arm_l, role from known names. \" +\n \"Bone hierarchy is inferred from roles (head\u2192neck\u2192torso\u2192hips\u2192root, arms\u2192torso, legs\u2192hips). \" +\n \"`swap: true` = patch (closed eyes, mouth) as a hidden slot on the parent's bone; several swap layers with the same `slot` share one slot; `bone` = attach to an existing bone without creating one.\",\n { path: Path, layersDir: z.string().describe(\"absolute dir, or relative to rig.json dir\"), relPrefix: z.string().default(\"layers\").describe(\"how asset.src refers to the dir, relative to rig.json\") },\n async ({ path, layersDir, relPrefix }) => mutate(path, d => importLayers(d, resolveFrom(path, layersDir), relPrefix), true));\n\ntool(\"rig_replace_asset\",\n \"Swap one layer's PNG (e.g. a regenerated part) without rebuilding the rig. Pivots are fractions, so the slot keeps working; the image should keep the same silhouette registration.\",\n { path: Path, id: z.string(), file: z.string().describe(\"new PNG, absolute or relative to rig.json dir\"), prompt: z.string().optional().describe(\"provenance: how it was generated\") },\n async ({ path, id, file, prompt }) => mutate(path, async d => { const { width, height, src } = await pngInfo(path, file); return T.replaceAsset(d, id, { src, width, height, prompt, inpainted: true }); }));\n\ntool(\"rig_layer_prompt\",\n \"Build a parts-first image-generation prompt for one layer from its provenance (asset.origin), the rig's style notes and its bone context. Generate the image with your image tool, then rig_replace_asset.\",\n { path: Path, id: z.string() },\n async ({ path, id }) => { try { return text(T.layerPrompt(await load(path), id)); } catch (e) { return fail(e); } });\n\nconst Frame = z.tuple([z.number().int(), z.number().int(), z.number().int(), z.number().int()]).describe(\"[x, y, w, h] rectangle in the source image's pixels\");\nconst OriginIn = z.object({ sourceImage: z.string().optional(), bbox: Frame.optional(), inpainted: z.boolean().default(false), prompt: z.string().optional() }).strict();\n\ntool(\"rig_set_asset\",\n \"Create or patch an asset. `src` = a PNG relative to rig.json (needed to create); `frame` = one rectangle of that PNG (a part split off a sheet \u2014 the runtime, \" +\n \"preview, export and editor all cut it at draw time, no crop file); without `frame` the asset is the whole image. Re-framing an asset that regions show keeps \" +\n \"the source pixel under each image centre where it is drawn; a mesh keeps its uvs and is named so you can re-trace it. Place it with rig_place_asset.\",\n { path: Path, id: z.string(), src: z.string().optional(), frame: Frame.nullable().optional().describe(\"null = the whole image again\"),\n width: z.number().int().positive().optional(), height: z.number().int().positive().optional(), origin: OriginIn.optional() },\n async ({ path, id, src, ...patch }) => mutateWith(path, async (d, say) => {\n const cur = d.assets.find(a => a.id === id);\n const file = src ?? cur?.src;\n if (!file) throw new Error(`asset \"${id}\" does not exist \u2014 creating one needs src`);\n const info = await pngInfo(path, file).catch((e: NodeJS.ErrnoException) => { throw new Error(`asset \"${id}\": cannot read ${file} (${e.code ?? e.message})`); });\n const r = T.setAsset(d, id, { ...patch, ...(src ? { src: info.src } : {}) }, { width: info.width, height: info.height });\n for (const n of r.notes) say(n);\n return r.doc;\n }));\n\ntool(\"rig_remove_asset\", \"Remove an asset nothing shows any more (refused, with the list, while an attachment still uses it).\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutate(path, d => T.removeAsset(d, id)));\n\ntool(\"rig_place_asset\",\n \"Put an asset on a bone in ONE call: a slot (`slot` or the asset's id; created on `bone` when missing, an existing slot keeps its bone), a region attachment \" +\n \"named like the asset with its centre at the DOCUMENT point (x, y), and the slot showing it. z = max + 1 unless given. Then rotate/scale with rig_set_attachment.\",\n { path: Path, asset: z.string(), bone: z.string(), x: z.number(), y: z.number(), slot: z.string().optional(), z: z.number().int().optional() },\n async ({ path, ...p }) => mutate(path, d => T.placeAsset(d, p), true));\n\n// ---------- history ----------\n\ntool(\"rig_undo\", \"Restore the rig as it was `steps` mutations ago (every mutation snapshots the previous file into .rig-history/ next to rig.json).\",\n { path: Path, steps: z.number().int().min(1).default(1) },\n async ({ path, steps }) => {\n try {\n const doc = parse(JSON.parse(await undo(path, steps)));\n await save(path, doc);\n return text(`restored ${steps} step${steps === 1 ? \"\" : \"s\"} back\\n` + T.describe(doc), doc);\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_redo\", \"Re-apply the mutation undone by the last rig_undo (any new mutation clears the redo stack).\", { path: Path },\n async ({ path }) => { try { const doc = parse(JSON.parse(await redo(path))); await save(path, doc); return text(\"redone\\n\" + T.describe(doc), doc); } catch (e) { return fail(e); } });\n\ntool(\"rig_diff\", \"Structural difference between the current rig and the snapshot `steps` mutations ago: bones/slots/assets added, removed, changed; tracks with key counts and value ranges; preset params.\",\n { path: Path, steps: z.number().int().min(1).default(1) },\n async ({ path, steps }) => {\n try {\n const history = await listHistory(path);\n if (!history.length) return text(\"no history for this rig\");\n if (steps > history.length) return text(`only ${history.length} snapshot${history.length === 1 ? \"\" : \"s\"} available`);\n const old = RigDocument.parse(JSON.parse(await readFile(history[history.length - steps], \"utf8\")));\n const lines = diffDocs(old, await load(path));\n return text(lines.length ? lines.join(\"\\n\") : \"no differences\");\n } catch (e) { return fail(e); }\n });\n\n// ---------- skeleton ----------\n\nconst TransformPatch = z.object({ x: z.number(), y: z.number(), rotation: z.number(), scaleX: z.number(), scaleY: z.number(), shearX: z.number(), shearY: z.number() }).partial();\nconst BoneFields = { parent: z.string().optional(), role: z.string().optional(), length: z.number().optional().describe(\"px to the far joint; editor rotation handle, weight_shift leg length\"),\n inherit: z.enum([\"normal\", \"onlyTranslation\", \"noRotationOrReflection\", \"noScale\", \"noScaleOrReflection\"]).optional(), color: z.string().optional().describe(\"editor colour\"), transform: TransformPatch.optional() };\n\ntool(\"rig_add_bone\", \"Add a bone. transform is LOCAL to parent (px, degrees CW). Omit parent \u2192 root. `bind` moves those slots onto the new bone without moving their images (the editor's B tool with a part selected).\",\n { path: Path, id: z.string(), ...BoneFields, bind: z.array(z.string()).optional().describe(\"slot ids to re-bind onto the new bone, world placement kept\") },\n async ({ path, bind, ...bone }) => mutateWith(path, (d, say) => {\n let next = T.addBone(d, bone);\n for (const s of bind ?? []) {\n const r = T.rebindSlot(next, s, bone.id);\n next = r.doc;\n if (r.approx > 0.01) say(`slot \"${s}\" re-bound to \"${bone.id}\" approximately: a region corner moved ${r.approx} px (shear or non-uniform scale between the bones)`);\n }\n return next;\n }, true));\n\ntool(\"rig_update_bone\", \"Patch bone fields (parent, role, length, inherit, color, transform \u2014 partial, merged). parent=null detaches the bone into a root of its own.\",\n { path: Path, id: z.string(), ...BoneFields, parent: z.string().nullable().optional().describe(\"new parent bone; null = make it a root bone (a rig may have several)\") },\n async ({ path, id, ...patch }) => mutate(path, d => T.updateBone(d, id, patch)));\n\ntool(\"rig_remove_bone\", \"Remove a bone; children and slots re-parent to its parent.\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutateWith(path, (d, say) => {\n const parent = d.bones.find(b => b.id === id)?.parent;\n const slots = d.slots.filter(s => s.bone === id).map(s => s.id);\n const r = T.removeBone(d, id);\n if (r.approx > 0.01) say(`bone \"${id}\" removed; slot \"${slots.join(\", \")}\" re-bound to \"${parent}\" approximately: a region corner moved ${r.approx} px (shear or non-uniform scale between the bones)`);\n return r.doc;\n }, true));\n\ntool(\"rig_set_slot\", \"Create or patch a slot (a draw layer on a bone). attachment = id of one of its attachments, null hides it (swap slots). blend=add for glow/fire layers painted on black; color is #rrggbbaa tint. \" +\n \"Changing `bone` on an existing slot KEEPS its images where they are on the document (placements are re-expressed in the new bone's rest frame; weighted meshes need nothing).\",\n { path: Path, id: z.string(), bone: z.string().optional(), attachment: z.string().nullable().optional(), z: z.number().int().optional(), alpha: z.number().optional(),\n blend: z.enum([\"normal\", \"add\", \"multiply\", \"screen\"]).optional(), color: z.string().optional() },\n async ({ path, attachment, bone, ...slot }) => mutateWith(path, (d, say) => {\n let next = d;\n const cur = d.slots.find(s => s.id === slot.id);\n if (cur && bone !== undefined && bone !== cur.bone) {\n const r = T.rebindSlot(d, slot.id, bone);\n next = r.doc;\n if (r.approx > 0.01) say(`slot \"${slot.id}\" re-bound to \"${bone}\" approximately: a region corner moved ${r.approx} px (shear or non-uniform scale between the bones)`);\n }\n return T.setSlot(next, { ...slot, ...(bone !== undefined ? { bone } : {}), ...(attachment === undefined ? {} : { attachment: attachment ?? undefined }) });\n }));\n\ntool(\"rig_set_attachment\",\n \"Create or patch a REGION attachment: an image (asset) placed in a slot. x/y = the image CENTRE in the slot bone's space, rotation in degrees, scale; fields are merged. \" +\n \"A slot can hold several attachments (swap states); set slot.attachment to show one. Meshes come from rig_mesh_from_image (trace this region's image) or rig_import_spine.\",\n { path: Path, id: z.string(), slot: z.string().optional(), asset: z.string().optional(), x: z.number().optional(), y: z.number().optional(), rotation: z.number().optional(),\n scaleX: z.number().optional(), scaleY: z.number().optional(), width: z.number().optional(), height: z.number().optional() },\n async ({ path, ...att }) => mutate(path, d => T.setAttachment(d, att)));\n\n// ---------- meshes ----------\n\nconst Influence = z.object({ bone: z.string(), x: z.number(), y: z.number(), w: z.number() }).describe(\"one influence: the vertex in that bone's local space and its weight\");\nconst WeightsIn = z.array(z.array(Influence).min(1)).describe(\"one influence list per vertex, in uv order; weights of a list should sum to 1\");\n/** run `op` through `mutate` and prefix the result with the lines it collected */\nasync function mutateWith(path: string, op: (d: RigDocument, say: (line: string) => void) => RigDocument | Promise<RigDocument>, summary = false): Promise<ToolResult> {\n const lines: string[] = [];\n const res = await mutate(path, d => op(d, l => lines.push(l)), summary);\n return res.isError || !lines.length ? res : { ...res, text: `${lines.join(\"\\n\")}\\n${res.text}` };\n}\nconst meshOf = (doc: RigDocument, id: string) => {\n const att = doc.attachments.find(a => a.id === id);\n if (!att) throw new Error(`unknown attachment \"${id}\"`);\n if (att.type !== \"mesh\") throw new Error(`attachment \"${id}\" is a ${att.type}, not a mesh${att.type === \"region\" ? \" (run rig_mesh_from_image on it first)\" : \"\"}`);\n return att;\n};\n\ntool(\"rig_mesh_from_image\",\n \"Turn a REGION attachment into a mesh traced from its PNG's alpha: the outline (pixels with alpha \u2265 threshold, simplified by tolerance px, pushed out by margin px) \" +\n \"plus an interior grid every `spacing` px, Delaunay-triangulated. EVERY separate opaque island of the layer is meshed (a closed-eyes overlay is two strokes) \u2014 \" +\n \"islands under 5% of the largest, and holes, are skipped; the answer says `islands: N` when there is more than one, and such a mesh reports hull 0. \" +\n \"The mesh keeps the region's id, slot, asset and placement, so nothing moves; \" +\n \"lattice deform tracks (bulge/bend/sway/squash/p<rc>) on it are dropped (they only apply to regions). Next: rig_auto_weights, then key deform `vertices`.\",\n { path: Path, id: z.string().describe(\"attachment id (a region)\"),\n spacing: z.number().min(1).default(24).describe(\"interior vertex spacing in image px; smaller = denser mesh\"),\n tolerance: z.number().nonnegative().default(2).describe(\"outline simplification in px; 0 keeps every pixel step\"),\n margin: z.number().default(1).describe(\"px the outline is pushed outward, so the traced edge keeps the soft pixels\"),\n threshold: z.number().int().min(1).max(255).default(8).describe(\"alpha value counted as opaque\") },\n async ({ path, id, ...opts }) => mutateWith(path, async (d, say) => {\n const att = d.attachments.find(a => a.id === id);\n if (!att) throw new Error(`unknown attachment \"${id}\"`);\n if (att.type !== \"region\") throw new Error(`attachment \"${id}\" is already a ${att.type}, not a region (use rig_set_mesh to edit its geometry)`);\n const asset = d.assets.find(a => a.id === att.asset);\n if (!asset) throw new Error(`unknown asset \"${att.asset}\"`);\n if (asset.rotate || asset.trim) throw new Error(`asset \"${asset.id}\" is packed into an exported atlas (rotate/trim): run rig_mesh_from_image on the unpacked rig, not an atlas export`);\n const png = await readFile(resolveFrom(path, asset.src))\n .catch((e: NodeJS.ErrnoException) => { throw new Error(`asset \"${asset.id}\": cannot read ${asset.src} (${e.code ?? e.message})`); });\n const { spacing, ...trace } = opts;\n const mask = alphaMaskFromPng(png, asset.frame);\n // traced here rather than inside meshFromMask so the answer can say how many separate islands the layer has:\n // a closed-eyes overlay is two strokes, and an agent should see that it got both\n const islands = traceHulls(mask, trace);\n const mesh = meshFromIslands(islands, att, asset, mask, spacing);\n const { doc, droppedTracks } = T.convertToMesh(d, mesh);\n say(`${id}=mesh(${mesh.uvs.length / 2}v, ${mesh.triangles.length / 3}t, hull ${mesh.hull}${islands.length > 1 ? `, islands: ${islands.length}` : \"\"})`);\n if (droppedTracks.length) say(`dropped lattice deform tracks: ${droppedTracks.join(\", \")}`);\n return doc;\n }));\n\ntool(\"rig_auto_weights\",\n \"Skin a mesh to bones by distance: each vertex takes the `maxInfluences` (default 2) nearest candidate bones, inverse-distance weighted and normalized to 1. \" +\n \"Nothing is dropped for being far away, so a vertex far from every joint still blends its two nearest bones instead of snapping to one at weight 1. \" +\n \"`radius` scales the falloff \u2014 weight `1 / (distance/radius + 1)\u00B2` \u2014 in world px, default 1: a larger radius spreads influence across more bones, a smaller one binds each vertex more tightly to its nearest bone. There is no cutoff at any radius. \" +\n \"Default `bones`, from the REST pose: the slot's bone, its parent and its direct children. \" +\n \"Replaces the mesh's `vertices` with `weights`, so deform `vertices` keys on it are dropped (their length changes). Check the result with rig_render_preview.\",\n { path: Path, id: z.string().describe(\"mesh attachment id\"), bones: z.array(z.string()).min(1).optional().describe(\"candidate bones; default: the slot's bone + its parent + its children\"),\n radius: z.number().positive().optional().describe(\"falloff scale in world px, default 1; larger spreads influence across more bones, smaller binds tighter to the nearest one; no cutoff\"),\n maxInfluences: z.number().int().min(1).default(2).describe(\"bones per vertex\") },\n async ({ path, id, bones, radius, maxInfluences }) => mutateWith(path, (d, say) => {\n const att = meshOf(d, id);\n const skel = evaluate(d, new Map());\n const candidates = bones ?? defaultWeightBones(d, att.slot);\n const r = radius ?? 1;\n const weights = autoWeights(d, skel, att, { bones: candidates, radius: r, maxInfluences }).weights!;\n const counts = new Map<string, number>();\n for (const list of weights) for (const b of new Set(list.map(i => i.bone))) counts.set(b, (counts.get(b) ?? 0) + 1);\n const { doc, dropped } = T.setWeights(d, id, weights);\n say(`${id}: ${weights.length} vertices skinned (max ${maxInfluences} influences)`);\n for (const b of candidates) if (counts.get(b)) say(` ${b}: ${counts.get(b)} vertices`);\n if (dropped.length) say(`dropped deform tracks: ${dropped.join(\", \")}`);\n return doc;\n }));\n\ntool(\"rig_set_mesh\",\n \"Replace a mesh's geometry arrays (only the given ones): `uvs` (2 per vertex, 0..1 in the asset image), `triangles` (3 indices each), `hull` (leading vertices that form the outline), \" +\n \"and its rest shape as either `vertices` (2 per vertex, slot-bone local) or `weights` (skinned) \u2014 giving one drops the other. \" +\n \"Deform `vertices` keys whose length no longer fits are dropped. For tracing a mesh from the image use rig_mesh_from_image.\",\n { path: Path, id: z.string().describe(\"mesh attachment id\"), vertices: z.array(z.number()).optional(), weights: WeightsIn.optional(),\n uvs: z.array(z.number()).optional(), triangles: z.array(z.number().int().nonnegative()).optional(), hull: z.number().int().nonnegative().optional() },\n async ({ path, id, ...patch }) => mutateWith(path, (d, say) => {\n const { doc, dropped } = T.setMesh(d, meshOf(d, id).id, patch);\n if (dropped.length) say(`dropped deform tracks: ${dropped.join(\", \")}`);\n return doc;\n }));\n\ntool(\"rig_set_weights\",\n \"Replace a mesh's skinning by hand: one influence list per vertex (uv order), each {bone, x, y, w} holding the vertex in that bone's local space; a list's weights should sum to 1. \" +\n \"Drops the mesh's unweighted `vertices` and any deform `vertices` keys whose length no longer fits. rig_auto_weights computes these from bone distance.\",\n { path: Path, id: z.string().describe(\"mesh attachment id\"), weights: WeightsIn },\n async ({ path, id, weights }) => mutateWith(path, (d, say) => {\n const { doc, dropped } = T.setWeights(d, meshOf(d, id).id, weights);\n if (dropped.length) say(`dropped deform tracks: ${dropped.join(\", \")}`);\n return doc;\n }));\n\ntool(\"rig_remove_attachment\", \"Remove an attachment; slots showing it become hidden, keys naming it become null.\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutate(path, d => T.removeAttachment(d, id)));\n\ntool(\"rig_remove_slot\", \"Remove a slot and its tracks.\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutate(path, d => T.removeSlot(d, id), true));\n\ntool(\"rig_set_draw_order\", \"Setup draw order in one call: `order` lists EVERY slot back-to-front (the same order a drawOrder key uses); each slot gets z = its index. For an animated reorder key the drawOrder track with rig_set_keys instead.\",\n { path: Path, order: z.array(z.string()).min(1) },\n async ({ path, order }) => mutate(path, d => T.setDrawOrder(d, order)));\n\n/** does `v` (a preset's `params`, or anything nested in it) name `id` as a whole string value, at any depth? */\nfunction namesId(v: unknown, id: string): boolean {\n if (typeof v === \"string\") return v === id;\n if (Array.isArray(v)) return v.some(x => namesId(x, id));\n if (v && typeof v === \"object\") return Object.values(v).some(x => namesId(x, id));\n return false;\n}\n\ntool(\"rig_rename\",\n \"Rename a bone, slot, attachment, asset or constraint and rewrite EVERY reference to it (parents, slot bones, chains and targets, mesh/path influences, slot attachments, key values, drawOrder keys, tracks). \" +\n \"Roles stay. Templates in presets.json are a separate file and are not rewritten \u2014 re-save them if they name the old id. \" +\n \"An animation's own preset.params (rig_apply_preset) is left alone too \u2014 the reply names any that still refer to the old id, since a blind substitution across differently-shaped params would be unsafe.\",\n { path: Path, kind: z.enum([\"bone\", \"slot\", \"attachment\", \"asset\", \"constraint\"]), id: z.string(), to: z.string() },\n async ({ path, kind, id, to }) => mutateWith(path, async (d, say) => {\n if (await exists(libraryFor(path))) say(`note: ${libraryFor(path)} is not rewritten \u2014 templates that name \"${id}\" by id still do`);\n const next = T.rename(d, kind, id, to);\n for (const a of next.animations) {\n if (a.preset && namesId(a.preset.params, id)) say(`note: animation \"${a.id}\" was made by preset \"${a.preset.name}\" whose params still name \"${id}\" \u2014 re-apply the preset with the new id if you re-tune it`);\n }\n return next;\n }, true));\n\n// ---------- constraints ----------\n\nconst ConstraintBones = z.array(z.string()).min(1).optional().describe(\"bones the constraint drives (replaces the whole list); required when it is created\");\nconst ConstraintOrder = z.number().int().optional().describe(\"solver order, lowest first (default 0); equal orders keep document order\");\nconst PathMixes = { mixRotate: z.number().optional(), mixX: z.number().optional(), mixY: z.number().optional() };\nconst Mixes = { ...PathMixes, mixScaleX: z.number().optional(), mixScaleY: z.number().optional(), mixShearY: z.number().optional() };\nconst CONSTRAINT_DOC =\n \"Constraints are solved after the bone tree, in `order`, and OVERWRITE the bones they drive: keying such a bone directly does nothing visible \u2014 key the target bone (or this constraint's mix, an ordinary number track) instead. \" +\n \"Ids are shared by the three kinds and a constraint's kind is fixed once created; rig_remove_constraint drops it together with its tracks.\";\n\ntool(\"rig_set_ik\",\n \"Create or patch an IK constraint: bend a chain of 1-2 bones so its tip reaches a TARGET BONE \u2014 move the target, the limb follows. \" +\n \"`bones` is the chain parent\u2192child (1 or 2 bones; the format has no longer chains), `target` is a BONE, normally a marker parented to the root so the limb reaches a place in the world. \" +\n \"`bendPositive` picks which way a two-bone chain buckles (knee forward or backward), `softness` eases the last px before full extension, `compress`/`stretch` let the chain shorten/lengthen to reach, \" +\n \"`mix` 0..1 fades the whole constraint. Fields are merged, so {id, mix} patches only the mix. \" +\n \"To rig a limb from scratch call rig_add_ik_chain instead: it creates the target bone at the current tip and derives `bendPositive` from the pose. \" + CONSTRAINT_DOC,\n { path: Path, id: z.string(), bones: ConstraintBones, target: z.string().optional().describe(\"BONE the chain reaches for\"),\n mix: z.number().optional(), softness: z.number().optional(), bendPositive: z.boolean().optional(),\n compress: z.boolean().optional(), stretch: z.boolean().optional(), uniform: z.boolean().optional(), order: ConstraintOrder },\n async ({ path, id, ...patch }) => mutate(path, d => T.setConstraint(d, \"ik\", id, patch)));\n\ntool(\"rig_set_transform\",\n \"Create or patch a transform constraint: copy a TARGET BONE's transform onto the driven bones, channel by channel (mixRotate/mixX/mixY/mixScaleX/mixScaleY/mixShearY, 0..1, each keyable), \" +\n \"with constant offsets (rotation/x/y/scaleX/scaleY/shearY) added on top. `local` copies in the bones' local space instead of world; `relative` ADDS the target's transform to the bone's own instead of replacing it. \" +\n \"Use it to make parts follow one control: a cape following the torso, a mirrored limb, a bone that inherits half the rotation. Fields are merged; `bones` and `target` (a BONE) are required when it is created. \" + CONSTRAINT_DOC,\n { path: Path, id: z.string(), bones: ConstraintBones, target: z.string().optional().describe(\"BONE whose transform is copied\"),\n local: z.boolean().optional(), relative: z.boolean().optional(),\n rotation: z.number().optional(), x: z.number().optional(), y: z.number().optional(), scaleX: z.number().optional(), scaleY: z.number().optional(), shearY: z.number().optional(),\n ...Mixes, order: ConstraintOrder },\n async ({ path, id, ...patch }) => mutate(path, d => T.setConstraint(d, \"transform\", id, patch)));\n\ntool(\"rig_set_path\",\n \"Create or patch a path constraint: place and orient bones along the curve of a path attachment (a tail following a spline, a chain crawling along a road). \" +\n \"`target` is a SLOT whose visible attachment is a path \u2014 build the curve with rig_set_path_attachment, then show it with rig_set_slot {attachment}. \" +\n \"positionMode fixed|percent (position in px along the curve, or 0..1 of its length), spacingMode length|fixed|percent|proportional (how the bones are spread along it), rotateMode tangent|chain|chainScale. \" +\n \"`position` and `spacing` slide the bones along the curve and are the usual things to key. Fields are merged; `bones` and `target` are required when it is created. \" + CONSTRAINT_DOC,\n { path: Path, id: z.string(), bones: ConstraintBones, target: z.string().optional().describe(\"SLOT showing a path attachment\"),\n positionMode: z.enum([\"fixed\", \"percent\"]).optional(), spacingMode: z.enum([\"length\", \"fixed\", \"percent\", \"proportional\"]).optional(),\n rotateMode: z.enum([\"tangent\", \"chain\", \"chainScale\"]).optional(),\n rotation: z.number().optional(), position: z.number().optional(), spacing: z.number().optional(), ...PathMixes, order: ConstraintOrder },\n async ({ path, id, ...patch }) => mutate(path, d => T.setConstraint(d, \"path\", id, patch)));\n\ntool(\"rig_remove_constraint\",\n \"Remove a constraint of any kind (ik / transform / path) by id, together with its animation tracks; the bones it drove fall back to their keyed or rest transforms.\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutate(path, d => T.removeConstraint(d, id)));\n\ntool(\"rig_add_ik_chain\",\n \"Rig a limb in ONE call \u2014 the easy path to IK. Give the chain's LAST bone (shin, forearm): the chain is [parent, bone] when that parent has exactly this one child, otherwise just the bone. \" +\n \"The tool creates a target bone (role ik_target) at the chain's current tip AS A CHILD OF THE ROOT BONE \u2014 never inside the chain, where the IK would drag its own target \u2014 \" +\n \"and an IK constraint `<bone>_ik` whose `bendPositive` is derived from the CURRENT pose, so adding it does not move the rig. It is solved last (highest order). \" +\n \"When the two-bone chain would reach up to the root itself, it falls back to the single bone (which just aims at the target) and says so. \" +\n \"Afterwards pose the limb by moving or keying the TARGET bone (or fade the constraint with its mix), not the chain's rotations.\",\n { path: Path, bone: z.string().describe(\"the chain's tip bone, e.g. shin or forearm; it needs a parent\"),\n target: z.string().optional().describe(\"id for the new target bone; default <bone>_ik\"),\n mix: z.number().default(1), softness: z.number().default(0) },\n async ({ path, bone, target, mix, softness }) => mutateWith(path, (d, say) => {\n const r = T.addIkChain(d, bone, { target, mix, softness });\n say(`ik \"${bone}_ik\": chain ${r.chain.join(\",\")}${r.note ? ` (${r.note})` : \"\"} \u2192 new target bone \"${r.target}\" (bend ${r.bendPositive ? \"+\" : \"-\"}); move or key \"${r.target}\" to pose the limb`);\n return r.doc;\n }, true));\n\ntool(\"rig_set_path_attachment\",\n \"Create or replace a PATH attachment. Two forms, exactly one per call (both need at least 2 anchors, 3 when closed): \" +\n \"`points` \u2014 anchors in DOCUMENT coordinates \u2014 rebuilds the curve with fresh Catmull-Rom tangents, so it DESTROYS a skinned path's weights and any authored tangents; the form for drawing a path from scratch. \" +\n \"`vertices` / `weights` \u2014 raw control points [cPrev, p, cNext] per anchor, in the slot bone's space (or skinned: `weights` gives one influence list per control point, {bone,x,y,w} like rig_set_weights) \u2014 \" +\n \"the ONLY form that preserves weights and authored tangents; use it to edit an existing path, and rig_path_anchor to add or remove an anchor without a full replace. \" +\n \"Show it with rig_set_slot {id: <slot>, attachment: <id>}, then drive bones along it with rig_set_path. `closed` keeps its current value when omitted on an existing path (false on creation). \" +\n \"Deform `vertices` keys whose length no longer fits the new geometry are dropped \u2014 and a `points` rebuild that happens to keep the same count keeps them too, now deforming a DIFFERENT curve, which is the other reason to edit through the raw form. \" +\n \"`lengths` are always re-measured, so an imported path's stored values move by up to ~0.5 % even when the shape is byte-identical; that is nothing to act on, because every path here has `constantSpeed: true` (all of ross's do, and no tool can turn it off) and the runtime then measures the posed curve itself and never reads them.\",\n { path: Path, id: z.string().describe(\"path attachment id\"), slot: z.string(),\n points: z.array(z.tuple([z.number(), z.number()])).min(2).optional().describe(\"[[x, y], \u2026] anchors in document space\"),\n vertices: z.array(z.number()).optional(), weights: WeightsIn.optional(),\n closed: z.boolean().optional() },\n async ({ path, id, slot, points, vertices, weights, closed }) => mutateWith(path, (d, say) => {\n const { doc: next, dropped } = T.setPathAttachment(d, id, slot, { points, vertices, weights, closed });\n const anchors = points ? points.length : (vertices ? vertices.length / 6 : weights!.length / 3);\n const att = next.attachments.find(a => a.id === id);\n say(`${id}: path through ${anchors} anchors${att?.type === \"path\" && att.closed ? \", closed\" : \"\"} in slot \"${slot}\"${dropped.length ? `; dropped ${dropped.join(\", \")}` : \"\"}`);\n return next;\n }));\n\ntool(\"rig_path_anchor\",\n \"Insert or remove one anchor of a path attachment. `insert` splits the curve AFTER anchor `index` at `t` (strictly between 0 and 1, default 0.5) using de Casteljau, so the curve keeps its exact shape in EVERY pose, not just at rest, and a weighted path keeps its skinning (each new control point is the c*w-weighted blend of the split segment's influences, which is an identity in the bone matrices). \" +\n \"It also keeps the attachment's DEFORM tracks: the same coefficients blend the four source control points' offsets, so the ANIMATED curve is unchanged too \u2014 an insert loses nothing. \" +\n \"`remove` drops the anchor's three control points, which does change the shape, and with it any deform key whose length no longer fits (reported in the reply).\",\n { path: Path, id: z.string().describe(\"path attachment id\"), op: z.enum([\"insert\", \"remove\"]),\n index: z.number().int().nonnegative().describe(\"anchor index, 0-based (anchors are the vertices at 1, 4, 7, \u2026)\"),\n t: z.number().gt(0).lt(1).optional().describe(\"insert only: where in the segment, strictly between 0 and 1 (an endpoint is the anchor that is already there), default 0.5\") },\n async ({ path, id, op, index, t }) => mutateWith(path, (d, say) => {\n const { doc, dropped } = T.pathAnchorOp(d, id, op, index, t);\n if (dropped.length) say(`dropped deform tracks: ${dropped.join(\", \")}`);\n return doc;\n }));\n\n// ---------- animation ----------\n\nconst presetHelp = Object.values(presets).map(p => `${p.name}: ${JSON.stringify(p.defaults)}`).join(\"\\n\");\n\ntool(\"rig_apply_preset\",\n \"Generate an animation from a parametric preset (replaces the animation with the same id). Built-in presets bind to bones by `role`; \" +\n \"template presets (rig_save_as_preset) come from the library and match bones by role, then id. Re-tune by re-applying with different params.\\n\" +\n \"Character: idle_breathing (bulges the torso image, neck/waist pinned), weight_shift (feet stay planted), win_bounce, anticipation_shake, blink, mouth_talk. \" +\n \"Symbol: symbol_idle, symbol_win, dim (state pose, use as base).\\n\" + presetHelp,\n { path: Path, preset: z.string().describe(\"built-in name or a template name from the library\"), params: z.record(z.unknown()).default({}).describe(\"partial override of defaults\"),\n id: z.string().optional().describe(\"animation id for templates (default: template name)\"), library: Library },\n async ({ path, preset, params, id, library }) => mutate(path, async d => {\n if (preset in presets) return applyPreset(d, preset as keyof typeof presets, params);\n const tpl = (await loadLibrary(libraryFor(path, library))).find(t => t.name === preset);\n if (!tpl) throw new Error(`unknown preset \"${preset}\" (built-in: ${Object.keys(presets).join(\", \")}; library: ${libraryFor(path, library)})`);\n return applyTemplate(d, tpl, params as Record<string, number>, id);\n }, true));\n\ntool(\"rig_save_as_preset\",\n \"Turn a finished animation into a reusable template: tracks stored relative to rest and keyed by bone role, params amplitude (all relative values), \" +\n \"speed (time) and optional named groups of source tracks (`{\\\"turn\\\": [\\\"bone.root.rotation\\\"]}`) that become their own multipliers. Apply on any rig with rig_apply_preset.\",\n { path: Path, animation: z.string(), name: z.string().describe(\"snake_case template name\"), groups: z.record(z.array(z.string())).optional(), library: Library },\n async ({ path, animation, name, groups, library }) => {\n try {\n const tpl = extractTemplate(await load(path), animation, name, groups);\n const lib = libraryFor(path, library);\n await saveTemplate(lib, tpl);\n return text(`saved to ${lib}\\n${describeTemplate(tpl)}`);\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_list_presets\", \"Built-in presets with their defaults, and the templates in the library with their params.\",\n { path: Path, library: Library },\n async ({ path, library }) => {\n try {\n const lib = libraryFor(path, library), tpls = await loadLibrary(lib);\n return text(`built-in:\\n${presetHelp}\\ntemplates (${lib}):\\n${tpls.length ? tpls.map(describeTemplate).join(\"\\n\") : \" none\"}`);\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_get_preset\", \"One preset as JSON: {builtin: true, name, defaults} for a built-in, or the library template (tracks, params). For editors that preview parameter changes locally.\",\n { path: Path, preset: z.string(), library: Library },\n async ({ path, preset, library }) => {\n try {\n if (preset in presets) { const p = presets[preset as keyof typeof presets]; return text(JSON.stringify({ builtin: true, name: p.name, defaults: p.defaults })); }\n const tpl = (await loadLibrary(libraryFor(path, library))).find(t => t.name === preset);\n if (!tpl) throw new Error(`unknown preset \"${preset}\"`);\n return text(JSON.stringify(tpl));\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_set_keys\",\n \"Set the keys of ONE track (creates the animation if missing; manual keys drop the animation's preset link). \" +\n \"Replaces all keys unless merge=true, which replaces only keys at the given times and keeps the rest. \" +\n \"duration/loop are optional and persist once set. \" + KEY_DOC,\n { path: Path, animation: z.string(), ...TrackRef, keys: z.array(KeyIn), merge: z.boolean().default(false), duration: z.number().optional(), loop: z.boolean().optional() },\n async ({ path, animation, target, id, prop, keys, merge, duration, loop }) => mutate(path, d => {\n let n = T.setKeys(d, animation, { target, id, prop } as Omit<Track, \"keys\">, keys.map(roundKey), duration, { merge });\n if (loop !== undefined) n = { ...n, animations: n.animations.map(a => (a.id === animation ? { ...a, loop } : a)) };\n return n;\n }));\n\ntool(\"rig_set_tracks\",\n \"Set several tracks of one animation in a single call (same semantics as rig_set_keys for each). \" + KEY_DOC,\n { path: Path, animation: z.string(), tracks: z.array(z.object({ ...TrackRef, keys: z.array(KeyIn) })).min(1), merge: z.boolean().default(false), duration: z.number().optional(), loop: z.boolean().optional() },\n async ({ path, animation, tracks, merge, duration, loop }) => mutate(path, d => {\n let n = d;\n for (const t of tracks) n = T.setKeys(n, animation, { target: t.target, id: t.id, prop: t.prop } as Omit<Track, \"keys\">, t.keys.map(roundKey), duration, { merge });\n if (loop !== undefined) n = { ...n, animations: n.animations.map(a => (a.id === animation ? { ...a, loop } : a)) };\n return n;\n }));\n\ntool(\"rig_set_goal\",\n \"Put a bone at a point in DOCUMENT coordinates \u2014 the same coordinates rig_get_pose reports and rig_render_preview draws. \" +\n \"Without `animation` it moves the setup pose; with one it keys x and y at `t`, creating the animation if it does not exist yet (`t` and `ease` without an `animation` are an error, not a no-op). \" +\n \"If the bone is driven by a LIVE ik constraint the edit is redirected to that constraint's TARGET BONE, whose origin is then what lands on the point (the answer says so), because writing the bone itself would be overwritten by the solver. \" +\n \"For a rig_add_ik_chain limb that target sits at the chain's tip, so AT FULL MIX the tip reaches the point while the named bone only turns \u2014 a goal on the chain's FIRST bone does not move that bone's origin at all, and a partly mixed chain lands the target but leaves the tip short. \" +\n \"A live transform or path constraint refuses instead: nothing can be written there, so key its mix to 0 at that time or edit the constraint. \" +\n \"The point is converted using the pose AT THAT TIME, so a turned parent is accounted for. \" +\n \"The result is re-evaluated before it is saved: if what was written does not actually land on the point (a target a second solver owns, or one parented inside the chain that aims it) the call fails and writes nothing. \" +\n \"On success the answer gives the NAMED bone's world origin and tip after the edit.\",\n { path: Path, bone: z.string(), x: z.number(), y: z.number(),\n animation: z.string().optional(), t: z.number().min(0).optional(), ease: Ease.optional() },\n async ({ path, bone, x, y, ...opts }) => mutateWith(path, (d, say) => {\n const { doc, wrote, redirected, origin, tip } = T.setGoal(d, bone, x, y, opts);\n say(redirected ? `${bone} is driven by ik \"${redirected}\" \u2014 moved its target \"${wrote}\" instead` : `${wrote} \u2192 ${x}, ${y}`);\n // the numbers a second rig_get_pose call would have cost: after an ik redirect they are the only way to see\n // what the gesture did to the bone that was actually named, which is not the bone that landed on the point\n say(`${bone} is now at ${origin[0]}, ${origin[1]} (tip ${tip[0]}, ${tip[1]})${opts.animation ? ` in \"${opts.animation}\" at t=${opts.t ?? 0}` : \"\"}`);\n return doc;\n }));\n\ntool(\"rig_copy_tracks\",\n \"Copy the bone tracks of one set of bones onto another, pair by pair, optionally shifted in time and mirrored. \" +\n \"`phase` is a fraction of the animation's duration (0.5 = half a cycle later, 1 wraps back to 0). `mirrorX` negates x, rotation, shearX and shearY, which mirrors the motion across the PARENT's y axis \u2014 \" +\n \"that is a left/right mirror only when the destination's parent frame is itself the mirror image of the source's, which is not automatic: on a rig whose shoulders are not conjugate frames a mirrored arm copy points the SAME way in the document. \" +\n \"Destination tracks are replaced per prop, not merged. Data can be lost: a track keyed at both 0 and `duration` with DIFFERENT values loses the segment into that last key when `phase` shifts it, and a non-looping animation has the segment between its last and first key split \u2014 both are reported in the answer. \" +\n \"This is how the second leg of a cycle is made from the first \u2014 it is an operation, not a preset: nothing is stored or reused.\",\n { path: Path, animation: z.string(), from: z.array(z.string()).min(1), to: z.array(z.string()).min(1),\n phase: z.number().min(0).max(1).default(0), mirrorX: z.boolean().default(false) },\n async ({ path, animation, from, to, phase, mirrorX }) => mutateWith(path, (d, say) => {\n const { doc, copied, empty, lossy } = T.copyTracks(d, animation, from, to, { phase, mirrorX });\n say(`copied ${copied} track${copied === 1 ? \"\" : \"s\"}${phase ? ` shifted ${phase} of ${animation}` : \"\"}${mirrorX ? \", mirrored\" : \"\"}${empty.length ? `; no tracks on: ${empty.join(\", \")}` : \"\"}`);\n // the rotation can split the segment that ran from the last key to the first (see copyTracks) \u2014 harmless on\n // a loop, but a one-shot animation now plays a different curve there, and the agent should hear that once.\n // phase 1 is a full turn \u2014 the same identity as phase 0 \u2014 so it gates on `phase % 1`, not `phase !== 0`.\n const anim = d.animations.find(a => a.id === animation)!;\n if (phase % 1 !== 0 && !anim.loop) say(`\"${animation}\" does not loop: the shift may have split the segment between its last key and its first`);\n // a SEPARATE line from the seam note above: that one fires for every benign closed-loop drop too, so it\n // cannot carry \"data was actually lost\" \u2014 this only fires when the two ends of the dropped duplicate disagree\n if (lossy.length) say(`closing value dropped at the seam (endpoints disagreed, so the segment into it is gone): ${lossy.join(\"; \")}`);\n return doc;\n }));\n\ntool(\"rig_adjust_track\",\n \"Re-tune an existing track without retyping keys: amplitude scales its deviation from the rest value (0.5 = half as strong, 2 = twice; scale props as ratios), \" +\n \"offset adds a constant, timeScale stretches its key times (duration grows to fit). Drops the preset link.\",\n { path: Path, animation: z.string(), ...TrackRef, amplitude: z.number().optional(), offset: z.number().optional(), timeScale: z.number().positive().optional() },\n async ({ path, animation, target, id, prop, ...adj }) => mutate(path, d => T.adjustTrack(d, animation, { target, id, prop } as Omit<Track, \"keys\">, adj)));\n\ntool(\"rig_set_animation\", \"Animation properties without touching keys: duration (must cover the last key/event), loop, events (full list), rename. Creates the animation if missing.\",\n { path: Path, id: z.string(), duration: z.number().positive().optional(), loop: z.boolean().optional(),\n events: z.array(z.object({ t: z.number().nonnegative(), name: z.string(), payload: z.record(z.unknown()).optional() })).optional(), rename: z.string().optional() },\n async ({ path, id, ...patch }) => mutate(path, d => T.setAnimation(d, id, patch)));\n\ntool(\"rig_remove_keys\", \"Remove the keys of one track at the given times; an emptied track is dropped. Drops the preset link.\",\n { path: Path, animation: z.string(), ...TrackRef, times: z.array(z.number()).min(1) },\n async ({ path, animation, target, id, prop, times }) => mutate(path, d => T.removeKeys(d, animation, { target, id, prop } as Omit<Track, \"keys\">, times)));\n\ntool(\"rig_remove_animation\", \"Delete an animation.\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutate(path, d => T.removeAnimation(d, id), true));\n\n// ---------- preview / export ----------\n\ntool(\"rig_render_preview\",\n \"Render frames of an animation (or the rest pose) as a contact-sheet PNG, plus the rig_check findings for that animation (or a positive one-liner). \" +\n \"Use it after every change to SEE the result. overlayBones=true draws the skeleton with ids; onionSkin=true ghosts the previous frame of the sheet under each frame \" +\n \"(the first frame has no ghost); region=[x,y,w,h] in document px crops to a detail (a face) so small motion is legible at low token cost.\",\n { path: Path, animation: z.string().optional(), fps: z.number().default(8), count: z.number().int().optional(), times: z.array(z.number()).optional(),\n overlayBones: z.boolean().default(false), onionSkin: z.boolean().default(false), region: z.tuple([z.number(), z.number(), z.number(), z.number()]).optional(),\n scale: z.number().default(0.5).describe(\"downscale to save tokens\"), sheetColumns: z.number().int().default(4), saveTo: z.string().optional().describe(\"also write sheet PNG here\") },\n async ({ path, saveTo, ...opts }) => {\n try {\n const doc = await load(path);\n const r = await renderPreview(doc, { assetsDir: dirname(path), ...opts });\n if (saveTo) await writeFile(saveTo, r.sheet);\n return { text: `${r.times.length} frames @ ${r.width}x${r.height}, t=[${r.times.join(\", \")}]\\n${previewCheck(doc, opts.animation)}`, image: r.sheet };\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_export\",\n \"Export for a game: pack all PNG layers into <outDir>/atlas.png and write <outDir>/rig.json whose assets point into it (asset.frame). One texture per rig instead of one per layer.\",\n { path: Path, outDir: z.string().describe(\"absolute, or relative to rig.json dir\"), padding: z.number().int().default(2), maxSize: z.number().int().default(4096) },\n async ({ path, outDir, padding, maxSize }) => {\n try {\n const out = resolveFrom(path, outDir);\n const doc = await buildAtlas(await load(path), dirname(path), out, { padding, maxSize });\n const [w, h] = pngSize(await readFile(join(out, \"atlas.png\")));\n return text(`\u2192 ${join(out, \"rig.json\")}\\n\u2192 ${join(out, \"atlas.png\")} (${w}x${h}, ${doc.assets.length} frames)`);\n } catch (e) { return fail(e); }\n });\n", "/**\n * rig-io \u2014 the one way this project writes a JSON file that something else reads.\n *\n * `rig.json` has readers that are not the writer: the editor's watcher and its `/api/doc`, the version\n * precondition's read, and the next tool call's own load. `writeFile` truncates and then writes in 1 MiB chunks,\n * so on a multi-megabyte rig anyone reading between two chunks parses a prefix (measured: 21 of 24 concurrent\n * reads of the 1.3 MB cashier rig failed at position 1048576). A rename inside one directory is atomic, so every\n * reader sees either the whole old file or the whole new one.\n */\nimport { mkdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\n\nlet tmpSeq = 0;\n\n/**\n * Write `value` as pretty JSON to `path`, atomically. The temp file is a SIBLING \u2014 a rename across devices is\n * neither atomic nor guaranteed to work \u2014 named so the editor watcher's basename filter ignores it (and matched\n * by `.gitignore`'s `.*.tmp`, so a crash between the write and the rename cannot leave a tracked stray behind).\n * A failed write removes it rather than leaving it around.\n */\n/** Write `data` to `path` atomically \u2014 the temp-sibling-then-rename dance `saveJson` documents above. */\nexport async function saveBytes(path: string, data: Buffer | string): Promise<void> {\n const dir = dirname(path);\n await mkdir(dir, { recursive: true });\n const tmp = join(dir, `.${basename(path)}.${process.pid}.${(tmpSeq++).toString(36)}.tmp`);\n try {\n await writeFile(tmp, data);\n await rename(tmp, path);\n } catch (e) {\n await rm(tmp, { force: true });\n throw e;\n }\n}\n\nexport const saveJson = (path: string, value: unknown) => saveBytes(path, JSON.stringify(value, null, 2));\n", "/** Serialize operations on one rig within a process, including HTTP version checks and history writes. */\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { resolve } from \"node:path\";\n\nconst pending = new Map<string, Promise<void>>();\nconst active = new AsyncLocalStorage<Set<string>>();\n\n/** Reentrant so an HTTP transaction can call the same registry used directly by MCP and CLI. */\nexport async function withRigQueue<T>(path: string, op: () => Promise<T>): Promise<T> {\n const key = resolve(path);\n const held = active.getStore();\n if (held?.has(key)) return op();\n const previous = pending.get(key) ?? Promise.resolve();\n let release!: () => void;\n const next = new Promise<void>(r => { release = r; });\n pending.set(key, next);\n await previous;\n const scope = new Set(held);\n scope.add(key);\n try { return await active.run(scope, op); }\n finally {\n scope.delete(key);\n release();\n if (pending.get(key) === next) pending.delete(key);\n }\n}\n", "/**\n * rig-anim \u2014 pure animation math shared by the runtime, the checker, the importer and tests. No PixiJS.\n *\n * - easing + track sampling, Pose: Map<\"target:id:prop\", value>\n * - 2D affine matrices with PixiJS layout (a b c d tx ty; x' = a\u00B7x + c\u00B7y + tx, y' = b\u00B7x + d\u00B7y + ty)\n * - bone world transforms with shear and inherit modes, constraints (ik / transform / path) applied in `order`\n * - attachment geometry in document space: region corners, skinned mesh vertices, lattice deformation\n */\nimport type { RigDocument, Animation, Track, Bone, Attachment, RegionAttachment, MeshAttachment, PathAttachment, IkConstraint, TransformConstraint, PathConstraint } from \"./rig-format\";\nimport { controlOffsets, evalPatch, type Pivot } from \"./rig-deform\";\n\nconst DEG = Math.PI / 180;\n\n// ---------- easing ----------\n\nexport type EaseSpec = Track[\"keys\"][number][\"ease\"];\n\nconst named: Record<string, (t: number) => number> = {\n linear: t => t,\n step: () => 0,\n ease_in: t => t * t,\n ease_out: t => 1 - (1 - t) * (1 - t),\n ease_in_out: t => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2),\n back_out: t => 1 + 2.70158 * (t - 1) ** 3 + 1.70158 * (t - 1) ** 2,\n elastic_out: t =>\n t === 0 ? 0 : t === 1 ? 1 : 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * ((2 * Math.PI) / 3)) + 1,\n};\n\n/**\n * Cubic bezier easing sampled into 10 linear segments walked in order of the curve parameter (the same\n * approximation Spine uses: 9 interior samples per curve), so control points with non-monotonic times\n * behave identically to Spine.\n */\nconst BEZIER_SEGMENTS = 10;\nfunction bezier(x1: number, y1: number, x2: number, y2: number) {\n const px: number[] = [0], py: number[] = [0];\n for (let i = 1; i <= BEZIER_SEGMENTS; i++) {\n const t = i / BEZIER_SEGMENTS, u = 1 - t;\n px.push(3 * u * u * t * x1 + 3 * u * t * t * x2 + t * t * t);\n py.push(3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t);\n }\n return (x: number) => {\n if (x <= 0) return 0;\n for (let i = 1; i <= BEZIER_SEGMENTS; i++) {\n if (px[i] >= x) {\n const span = px[i] - px[i - 1];\n return py[i - 1] + (span > 0 ? ((x - px[i - 1]) / span) * (py[i] - py[i - 1]) : 0);\n }\n }\n return 1;\n };\n}\n\nconst easeCache = new Map<string, (t: number) => number>();\nexport function ease(spec: EaseSpec): (t: number) => number {\n if (typeof spec === \"string\") return named[spec];\n const key = spec.bezier.join(\",\");\n let f = easeCache.get(key);\n if (!f) easeCache.set(key, (f = bezier(...spec.bezier)));\n return f;\n}\n\n// ---------- sampling ----------\n\nexport type Val = number | string | null | number[] | string[];\n/** key: \"bone:id:prop\" | \"slot:id:prop\" | \"deform:id:prop\" | \"ik:id:prop\" | \"transform:id:prop\" | \"path:id:prop\" | \"drawOrder:order:order\" */\nexport type Pose = Map<string, Val>;\nexport const pk = (target: string, id: string, prop: string) => `${target}:${id}:${prop}`;\n\nexport function sample(track: Track, t: number): Val {\n const keys = track.keys;\n if (t <= keys[0].t) return keys[0].v;\n const last = keys[keys.length - 1];\n if (t >= last.t) return last.v;\n let i = 0;\n while (keys[i + 1].t <= t) i++;\n const a = keys[i], b = keys[i + 1];\n if (typeof a.v === \"number\" && typeof b.v === \"number\") {\n const u = ease(a.ease)((t - a.t) / (b.t - a.t));\n return a.v + (b.v - a.v) * u;\n }\n if (Array.isArray(a.v) && Array.isArray(b.v) && typeof a.v[0] === \"number\") {\n const u = ease(a.ease)((t - a.t) / (b.t - a.t)), av = a.v as number[], bv = b.v as number[];\n return av.map((v, k) => v + ((bv[k] ?? v) - v) * u);\n }\n return a.v; // discrete\n}\n\nexport function poseOf(anim: Animation, t: number, out: Pose = new Map()): Pose {\n for (const tr of anim.tracks) out.set(pk(tr.target, tr.id, tr.prop), sample(tr, t));\n return out;\n}\n\n/** Crossfade: numbers (and number arrays) interpolate toward `to` (or rest when absent there); discrete values hold until w = 1. */\nexport function blendPoses(from: Pose, to: Pose, w: number, restOf: (key: string) => Val): Pose {\n const out = new Map(to);\n for (const [k, f] of from) {\n const cur = to.get(k);\n if (typeof f === \"number\") {\n const target = typeof cur === \"number\" ? cur : (restOf(k) as number);\n out.set(k, f + (target - f) * w);\n } else if (Array.isArray(f) && typeof f[0] === \"number\") {\n const fv = f as number[], tv = (Array.isArray(cur) && typeof cur[0] === \"number\" ? cur : fv.map(() => 0)) as number[];\n out.set(k, fv.map((v, i) => v + ((tv[i] ?? 0) - v) * w));\n } else if (cur === undefined && w < 1) out.set(k, f);\n }\n return out;\n}\n\n/** Setup value of a pose key. */\nexport function restValue(doc: RigDocument, key: string): Val {\n const [target, id, prop] = key.split(\":\");\n if (target === \"bone\") return (doc.bones.find(b => b.id === id)!.transform as Record<string, number>)[prop];\n if (target === \"slot\") {\n const s = doc.slots.find(s => s.id === id)!;\n if (prop === \"color\") return colorToArray(s.color);\n return (s as unknown as Record<string, Val>)[prop];\n }\n if (target === \"ik\" || target === \"transform\" || target === \"path\") {\n const c = (doc[target] as { id: string }[]).find(c => c.id === id) as Record<string, unknown> | undefined;\n const v = c?.[prop];\n return typeof v === \"boolean\" ? (v ? 1 : 0) : ((v as number) ?? 0);\n }\n if (target === \"drawOrder\") return doc.slots.map(s => s.id);\n return 0;\n}\n\n/** \"#rrggbbaa\" \u2192 [r, g, b, a] in 0..1 */\nexport const colorToArray = (c: string): number[] => [0, 2, 4, 6].map(k => parseInt(c.slice(1 + k, 3 + k), 16) / 255);\n\n/** Numeric lattice deform params of one attachment present in the pose, or undefined when it has none. */\nexport function deformParams(pose: Pose, attachmentId: string): Record<string, number> | undefined {\n let out: Record<string, number> | undefined;\n const prefix = `deform:${attachmentId}:`;\n for (const [k, v] of pose)\n if (k.startsWith(prefix) && typeof v === \"number\") (out ??= {})[k.slice(prefix.length)] = v;\n return out;\n}\n\n// ---------- affine ----------\n\nexport interface Affine { a: number; b: number; c: number; d: number; tx: number; ty: number }\n\n/** translate \u00B7 rotate(deg, clockwise in Y-down) \u00B7 shear \u00B7 scale \u2014 PixiJS setTransform semantics with shear as axis angles */\nexport function affineOf(x: number, y: number, rotationDeg: number, sx: number, sy: number, shearX = 0, shearY = 0): Affine {\n const rx = (rotationDeg + shearX) * DEG, ry = (rotationDeg + 90 + shearY) * DEG;\n return { a: Math.cos(rx) * sx, b: Math.sin(rx) * sx, c: Math.cos(ry) * sy, d: Math.sin(ry) * sy, tx: x, ty: y };\n}\n\n/** parent \u2218 local (apply local first, then parent) \u2014 PixiJS Matrix.append */\nexport function mul(p: Affine, l: Affine): Affine {\n return {\n a: p.a * l.a + p.c * l.b, b: p.b * l.a + p.d * l.b,\n c: p.a * l.c + p.c * l.d, d: p.b * l.c + p.d * l.d,\n tx: p.a * l.tx + p.c * l.ty + p.tx, ty: p.b * l.tx + p.d * l.ty + p.ty,\n };\n}\n\nexport const apply = (m: Affine, x: number, y: number): [number, number] => [m.a * x + m.c * y + m.tx, m.b * x + m.d * y + m.ty];\n\nexport function invert(m: Affine): Affine {\n const det = m.a * m.d - m.b * m.c || 1e-12;\n const a = m.d / det, b = -m.b / det, c = -m.c / det, d = m.a / det;\n return { a, b, c, d, tx: -(a * m.tx + c * m.ty), ty: -(b * m.tx + d * m.ty) };\n}\n\n/** rotation of the x axis of an affine, degrees */\nexport const rotationOf = (m: Affine) => Math.atan2(m.b, m.a) / DEG;\n\n/**\n * Where a world matrix puts a bone, which way its x axis points, and how long its axes are \u2014 the inverse of\n * `affineOf` for everything except shear, which cannot be recovered from the axes alone (a sheared y axis is\n * reported by its length, and `angle` follows the x axis only). Reading a posed bone goes through here so the\n * numbers an agent gets are the numbers the runtime drew.\n */\nexport function decompose(m: Affine): { x: number; y: number; angle: number; scaleX: number; scaleY: number } {\n return { x: m.tx, y: m.ty, angle: rotationOf(m), scaleX: Math.hypot(m.a, m.b), scaleY: Math.hypot(m.c, m.d) };\n}\n\nconst num = (pose: Pose, key: string, rest: number) => { const v = pose.get(key); return typeof v === \"number\" ? v : rest; };\n\n// ---------- bones ----------\n\nexport interface BoneState {\n /** effective local values (setup + pose + constraint adjustments) */\n x: number; y: number; rotation: number; scaleX: number; scaleY: number; shearX: number; shearY: number;\n world: Affine;\n}\n\nexport interface Skeleton {\n doc: RigDocument;\n pose: Pose;\n bones: Map<string, BoneState>;\n /** attachment shown per slot (pose or setup), null = hidden */\n attachment: Map<string, Attachment | null>;\n}\n\nconst boneIndex = new WeakMap<RigDocument, Map<string, Bone>>();\nfunction boneOf(doc: RigDocument, id: string): Bone {\n let idx = boneIndex.get(doc);\n if (!idx) boneIndex.set(doc, (idx = new Map(doc.bones.map(b => [b.id, b]))));\n const b = idx.get(id);\n if (!b) throw new Error(`unknown bone \"${id}\"`);\n return b;\n}\n\n/** world transform of one bone from its effective local values and its parent's world transform, honouring `inherit` */\nexport function boneWorldOf(bone: Bone, s: Omit<BoneState, \"world\">, parent: Affine | undefined): Affine {\n const local = affineOf(s.x, s.y, s.rotation, s.scaleX, s.scaleY, s.shearX, s.shearY);\n if (!parent) return local;\n if (bone.inherit === \"normal\") return mul(parent, local);\n const [tx, ty] = apply(parent, s.x, s.y);\n return { ...mul(inheritedParentLinear(bone, parent), { ...local, tx: 0, ty: 0 }), tx, ty };\n}\n\n/** Order bones parent-first (memoized per document). */\nconst orderCache = new WeakMap<RigDocument, Bone[]>();\nexport function boneOrder(doc: RigDocument): Bone[] {\n let order = orderCache.get(doc);\n if (order) return order;\n order = [];\n const emitted = new Set<string>();\n while (order.length < doc.bones.length) {\n let progressed = false;\n for (const b of doc.bones) if (!emitted.has(b.id) && (!b.parent || emitted.has(b.parent))) { emitted.add(b.id); order.push(b); progressed = true; }\n if (!progressed) throw new Error(\"bone hierarchy has a cycle\");\n }\n orderCache.set(doc, order);\n return order;\n}\n\nconst localOf = (doc: RigDocument, pose: Pose, b: Bone): Omit<BoneState, \"world\"> => {\n const r = b.transform, id = b.id;\n return {\n x: num(pose, pk(\"bone\", id, \"x\"), r.x), y: num(pose, pk(\"bone\", id, \"y\"), r.y),\n rotation: num(pose, pk(\"bone\", id, \"rotation\"), r.rotation),\n scaleX: num(pose, pk(\"bone\", id, \"scaleX\"), r.scaleX), scaleY: num(pose, pk(\"bone\", id, \"scaleY\"), r.scaleY),\n shearX: num(pose, pk(\"bone\", id, \"shearX\"), r.shearX), shearY: num(pose, pk(\"bone\", id, \"shearY\"), r.shearY),\n };\n};\n\n/** Recompute world transforms of `bone` and its descendants from their current local values. */\nfunction updateSubtree(skel: Skeleton, root: string) {\n const doc = skel.doc;\n const kids = new Map<string, Bone[]>();\n for (const b of doc.bones) if (b.parent) (kids.get(b.parent) ?? kids.set(b.parent, []).get(b.parent)!).push(b);\n const stack = [root];\n while (stack.length) {\n const id = stack.pop()!, b = boneOf(doc, id), st = skel.bones.get(id)!;\n st.world = boneWorldOf(b, st, b.parent ? skel.bones.get(b.parent)!.world : undefined);\n for (const k of kids.get(id) ?? []) stack.push(k.id);\n }\n}\n\n/** Full skeleton evaluation for a pose: bone locals, constraints in order, world transforms, shown attachments. */\nexport function evaluate(doc: RigDocument, pose: Pose): Skeleton {\n const skel: Skeleton = { doc, pose, bones: new Map(), attachment: new Map() };\n for (const b of boneOrder(doc)) {\n const s = localOf(doc, pose, b);\n const world = boneWorldOf(b, s, b.parent ? skel.bones.get(b.parent)!.world : undefined);\n skel.bones.set(b.id, { ...s, world });\n }\n const attachments = new Map(doc.attachments.map(a => [a.id, a]));\n for (const s of doc.slots) {\n const v = pose.get(pk(\"slot\", s.id, \"attachment\"));\n const id = v === undefined ? s.attachment : (v as string | null);\n skel.attachment.set(s.id, id ? attachments.get(id) ?? null : null);\n }\n // constraints, in document order (ties broken by array order)\n const all: { order: number; kind: \"ik\" | \"transform\" | \"path\"; c: IkConstraint | TransformConstraint | PathConstraint }[] = [\n ...doc.ik.map(c => ({ order: c.order, kind: \"ik\" as const, c })),\n ...doc.transform.map(c => ({ order: c.order, kind: \"transform\" as const, c })),\n ...doc.path.map(c => ({ order: c.order, kind: \"path\" as const, c })),\n ].sort((a, b) => a.order - b.order);\n for (const { kind, c } of all) {\n if (kind === \"ik\") applyIk(skel, c as IkConstraint);\n else if (kind === \"transform\") applyTransformConstraint(skel, c as TransformConstraint);\n else applyPathConstraint(skel, c as PathConstraint);\n }\n return skel;\n}\n\n/** Bone world transforms for a pose (constraints applied). */\nexport function boneWorld(doc: RigDocument, pose: Pose): Map<string, Affine> {\n const skel = evaluate(doc, pose);\n return new Map([...skel.bones].map(([id, s]) => [id, s.world]));\n}\n\n// ---------- constraints ----------\n\n/** a constraint's value at this frame: the keyed one, else the document's \u2014 what every early-out below reads\n * (`applyIk` at `mix <= 0`, the transform/path solvers when all of `MIX_PROPS` are 0). `rig-check`'s `poseNum`\n * answers the same question elsewhere and must keep agreeing with it.\n * Outside the solvers, ask `mixAt` in rig-constraints.ts \u2014 the exported one, so a fourth copy is never needed. */\nconst cnum = (skel: Skeleton, kind: string, id: string, prop: string, rest: number | boolean) =>\n num(skel.pose, pk(kind, id, prop), typeof rest === \"boolean\" ? (rest ? 1 : 0) : rest);\n\n/** point in bone-local space of `bone` for a document-space point */\nfunction toLocal(skel: Skeleton, bone: string, x: number, y: number): [number, number] {\n return apply(invert(skel.bones.get(bone)!.world), x, y);\n}\n/** document-space direction of a bone's local x axis, degrees */\nconst worldRotation = (skel: Skeleton, bone: string) => rotationOf(skel.bones.get(bone)!.world);\n\nconst IDENTITY: Affine = { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 };\nconst wrapRad = (r: number) => (r > Math.PI ? r - 2 * Math.PI : r < -Math.PI ? r + 2 * Math.PI : r);\n\n/**\n * Single-bone IK: rotate `bone` so its (sheared) x axis points at the world point, blended by `mix`. Solved in the\n * parent's local space, which aims correctly under any parent scale; a negative scaleX flips the axis by 180\u00B0.\n * compress/stretch scale the bone's length to the target distance (uniform: both axes).\n */\nfunction aimAt(skel: Skeleton, boneId: string, tx: number, ty: number, mix: number, compress = false, stretch = false, uniform = false) {\n const b = boneOf(skel.doc, boneId), st = skel.bones.get(boneId)!;\n const parent = b.parent ? skel.bones.get(b.parent)!.world : undefined;\n let dx: number, dy: number;\n if (parent && b.inherit === \"onlyTranslation\") { dx = tx - st.world.tx; dy = ty - st.world.ty; }\n else {\n const [px, py] = parent ? apply(invert(parent), tx, ty) : [tx, ty];\n dx = px - st.x; dy = py - st.y;\n }\n let r = Math.atan2(dy, dx) / DEG - st.shearX - st.rotation;\n if (st.scaleX < 0) r += 180;\n r = shortest(r);\n let sx = st.scaleX, sy = st.scaleY;\n if (compress || stretch) {\n const len = b.length * sx;\n if (len > 0.0001) {\n const dd = dx * dx + dy * dy;\n if ((compress && dd < len * len) || (stretch && dd > len * len)) { const f = (Math.sqrt(dd) / len - 1) * mix + 1; sx *= f; if (uniform) sy *= f; }\n }\n }\n st.rotation += r * mix; st.scaleX = sx; st.scaleY = sy;\n updateSubtree(skel, boneId);\n}\n\nconst shortest = (deg: number) => ((((deg + 180) % 360) + 360) % 360) - 180;\n\n/**\n * IK constraint. One bone aims at the target. Two bones: the child is moved onto the parent's x axis and both are\n * rotated so the child's tip reaches the target, bending to the requested side. Solved in the parent's parent space:\n * the law of cosines when the parent's scale is uniform, otherwise the child's tip sweeps an ellipse (parent scale)\n * and the reachable point is solved analytically. Negative scales flip axes by 180\u00B0 and mirror the bend; the parent's\n * shear is dropped. Softness eases the last stretch before full extension; stretch lengthens the parent to reach.\n */\nfunction applyIk(skel: Skeleton, c: IkConstraint) {\n const mix = cnum(skel, \"ik\", c.id, \"mix\", c.mix);\n if (mix <= 0) return;\n const target = skel.bones.get(c.target)!.world;\n const bendDir = cnum(skel, \"ik\", c.id, \"bendPositive\", c.bendPositive) > 0.5 ? 1 : -1;\n const compress = cnum(skel, \"ik\", c.id, \"compress\", c.compress) > 0.5, stretch = cnum(skel, \"ik\", c.id, \"stretch\", c.stretch) > 0.5;\n let softness = cnum(skel, \"ik\", c.id, \"softness\", c.softness);\n if (c.bones.length === 1) { aimAt(skel, c.bones[0], target.tx, target.ty, mix, compress, stretch, c.uniform); return; }\n const [pId, cId] = c.bones;\n const parentBone = boneOf(skel.doc, pId), childBone = boneOf(skel.doc, cId);\n const p = skel.bones.get(pId)!, ch = skel.bones.get(cId)!;\n const px = p.x, py = p.y;\n let psx = p.scaleX, psy = p.scaleY, csx = ch.scaleX, sx = psx, sy = psy;\n let os1 = 0, os2 = 0, s2 = 1;\n if (psx < 0) { psx = -psx; os1 = 180; s2 = -1; }\n if (psy < 0) { psy = -psy; s2 = -s2; }\n if (csx < 0) { csx = -csx; os2 = 180; }\n const uniform = Math.abs(psx - psy) <= 0.0001;\n const cx = ch.x, cy = !uniform || stretch ? 0 : ch.y;\n const [cwx, cwy] = apply(p.world, cx, cy);\n const ppInv = invert(parentBone.parent ? skel.bones.get(parentBone.parent)!.world : IDENTITY);\n const [clx, cly] = apply(ppInv, cwx, cwy);\n const dx = clx - px, dy = cly - py, l1 = Math.hypot(dx, dy);\n let l2 = childBone.length * csx;\n if (l1 < 0.0001) { // parent and child share an origin: aim the parent, the child keeps its offset\n aimAt(skel, pId, target.tx, target.ty, mix, false, stretch, false);\n ch.x = cx; ch.y = cy; ch.rotation = 0;\n updateSubtree(skel, pId);\n return;\n }\n const [tlx, tly] = apply(ppInv, target.tx, target.ty);\n let tx = tlx - px, ty = tly - py, dd = tx * tx + ty * ty;\n if (softness !== 0) {\n softness *= psx * (csx + 1) * 0.5;\n const td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness;\n if (sd > 0) {\n let q = Math.min(1, sd / (softness * 2)) - 1;\n q = (sd - softness * (1 - q * q)) / td;\n tx -= q * tx; ty -= q * ty; dd = tx * tx + ty * ty;\n }\n }\n let a1: number, a2: number;\n if (uniform) {\n l2 *= psx;\n let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);\n if (cos < -1) { cos = -1; a2 = Math.PI * bendDir; }\n else if (cos > 1) {\n cos = 1; a2 = 0;\n if (stretch) { const f = (Math.sqrt(dd) / (l1 + l2) - 1) * mix + 1; sx *= f; if (c.uniform) sy *= f; }\n } else a2 = Math.acos(cos) * bendDir;\n const a = l1 + l2 * cos, b = l2 * Math.sin(a2);\n a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);\n } else {\n // child tip on the ellipse (l1 + a\u00B7cos \u03B8, b\u00B7sin \u03B8): find the point at distance \u221Add, else the nearest extreme\n const a = psx * l2, b = psy * l2, aa = a * a, bb = b * b, ta = Math.atan2(ty, tx);\n const c0 = bb * l1 * l1 + aa * dd - aa * bb, c1 = -2 * bb * l1, c2 = bb - aa;\n const disc = c1 * c1 - 4 * c2 * c0;\n let solved = false;\n a1 = a2 = 0;\n if (disc >= 0) {\n let q = Math.sqrt(disc);\n if (c1 < 0) q = -q;\n q = -(c1 + q) * 0.5;\n const r0 = q / c2, r1 = c0 / q, r = Math.abs(r0) < Math.abs(r1) ? r0 : r1, yy = dd - r * r;\n if (yy >= 0) {\n const y = Math.sqrt(yy) * bendDir;\n a1 = ta - Math.atan2(y, r);\n a2 = Math.atan2(y / psy, (r - l1) / psx);\n solved = true;\n }\n }\n if (!solved) {\n let minAngle = Math.PI, minX = l1 - a, minDist = minX * minX, minY = 0, maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0;\n const k = -a * l1 / (aa - bb);\n if (k >= -1 && k <= 1) {\n const ang = Math.acos(k), x = a * Math.cos(ang) + l1, y = b * Math.sin(ang), dist = x * x + y * y;\n if (dist < minDist) { minAngle = ang; minDist = dist; minX = x; minY = y; }\n if (dist > maxDist) { maxAngle = ang; maxDist = dist; maxX = x; maxY = y; }\n }\n if (dd <= (minDist + maxDist) * 0.5) { a1 = ta - Math.atan2(minY * bendDir, minX); a2 = minAngle * bendDir; }\n else { a1 = ta - Math.atan2(maxY * bendDir, maxX); a2 = maxAngle * bendDir; }\n }\n }\n const os = Math.atan2(cy, cx) * s2;\n const d1 = shortest((a1 - os) / DEG + os1 - p.rotation);\n const d2 = shortest(((a2 + os) / DEG - ch.shearX) * s2 + os2 - ch.rotation);\n p.rotation += d1 * mix; p.scaleX = sx; p.scaleY = sy; p.shearX = 0; p.shearY = 0;\n ch.x = cx; ch.y = cy; ch.rotation += d2 * mix;\n updateSubtree(skel, pId);\n}\n\n/**\n * Transform constraint: each bone follows the target's rotation / position / scale / shear by the mix amounts, with\n * the constraint's offsets. World mode edits the bone's world matrix (rotation turns the whole matrix, scales the\n * axis lengths, shear turns the y axis) and folds it back into effective locals; local mode mixes the effective\n * local values. `relative` adds the target's values instead of matching them.\n */\nfunction applyTransformConstraint(skel: Skeleton, c: TransformConstraint) {\n const mixRotate = cnum(skel, \"transform\", c.id, \"mixRotate\", c.mixRotate), mixX = cnum(skel, \"transform\", c.id, \"mixX\", c.mixX), mixY = cnum(skel, \"transform\", c.id, \"mixY\", c.mixY);\n const mixScaleX = cnum(skel, \"transform\", c.id, \"mixScaleX\", c.mixScaleX), mixScaleY = cnum(skel, \"transform\", c.id, \"mixScaleY\", c.mixScaleY), mixShearY = cnum(skel, \"transform\", c.id, \"mixShearY\", c.mixShearY);\n if (!mixRotate && !mixX && !mixY && !mixScaleX && !mixScaleY && !mixShearY) return;\n const target = skel.bones.get(c.target)!, tw = target.world;\n const offsetRotation = c.rotation * DEG, offsetShearY = c.shearY * DEG;\n for (const id of c.bones) {\n const b = boneOf(skel.doc, id), st = skel.bones.get(id)!;\n if (c.local) {\n if (c.relative) {\n st.rotation += (target.rotation + c.rotation) * mixRotate;\n st.x += (target.x + c.x) * mixX; st.y += (target.y + c.y) * mixY;\n st.scaleX *= (target.scaleX - 1 + c.scaleX) * mixScaleX + 1;\n st.scaleY *= (target.scaleY - 1 + c.scaleY) * mixScaleY + 1;\n st.shearY += (target.shearY + c.shearY) * mixShearY;\n } else {\n st.rotation += (target.rotation - st.rotation + c.rotation) * mixRotate;\n st.x += (target.x - st.x + c.x) * mixX; st.y += (target.y - st.y + c.y) * mixY;\n if (st.scaleX !== 0) st.scaleX += (target.scaleX - st.scaleX + c.scaleX) * mixScaleX;\n if (st.scaleY !== 0) st.scaleY += (target.scaleY - st.scaleY + c.scaleY) * mixScaleY;\n st.shearY += (target.shearY - st.shearY + c.shearY) * mixShearY;\n }\n updateSubtree(skel, id);\n continue;\n }\n let w: Affine = { ...st.world };\n const targetRot = Math.atan2(tw.b, tw.a), rotate = (m: Affine, r: number): Affine => {\n const cos = Math.cos(r), sin = Math.sin(r);\n return { a: cos * m.a - sin * m.b, b: sin * m.a + cos * m.b, c: cos * m.c - sin * m.d, d: sin * m.c + cos * m.d, tx: m.tx, ty: m.ty };\n };\n if (mixRotate !== 0) {\n const r = wrapRad(c.relative ? targetRot + offsetRotation : targetRot - Math.atan2(w.b, w.a) + offsetRotation);\n w = rotate(w, r * mixRotate);\n }\n if (mixX !== 0 || mixY !== 0) {\n const [ox, oy] = apply(tw, c.x, c.y); // the offset lives in the target's space\n if (c.relative) { w.tx += ox * mixX; w.ty += oy * mixY; }\n else { w.tx += (ox - w.tx) * mixX; w.ty += (oy - w.ty) * mixY; }\n }\n if (mixScaleX !== 0) {\n const ts = Math.hypot(tw.a, tw.b);\n let f: number;\n if (c.relative) f = (ts - 1 + c.scaleX) * mixScaleX + 1;\n else { const s0 = Math.hypot(w.a, w.b); f = s0 === 0 ? 1 : (s0 + (ts - s0 + c.scaleX) * mixScaleX) / s0; }\n w.a *= f; w.b *= f;\n }\n if (mixScaleY !== 0) {\n const ts = Math.hypot(tw.c, tw.d);\n let f: number;\n if (c.relative) f = (ts - 1 + c.scaleY) * mixScaleY + 1;\n else { const s0 = Math.hypot(w.c, w.d); f = s0 === 0 ? 1 : (s0 + (ts - s0 + c.scaleY) * mixScaleY) / s0; }\n w.c *= f; w.d *= f;\n }\n if (mixShearY > 0) {\n const by = Math.atan2(w.d, w.c), targetShear = Math.atan2(tw.d, tw.c) - targetRot;\n const r = c.relative\n ? by + (wrapRad(targetShear) - Math.PI / 2 + offsetShearY) * mixShearY\n : by + (wrapRad(targetShear - (by - Math.atan2(w.b, w.a))) + offsetShearY) * mixShearY;\n const len = Math.hypot(w.c, w.d);\n w.c = Math.cos(r) * len; w.d = Math.sin(r) * len;\n }\n setEffectiveWorld(skel, b, st, w);\n }\n}\n\n// ---------- paths ----------\n\n/** world-space control points of a path attachment (2 numbers per vertex) */\nexport function pathWorldVertices(skel: Skeleton, slotId: string, att: PathAttachment): number[] {\n return attachmentWorldVertices(skel, slotId, att);\n}\n\n/** path length: `lengths[i]` is the length up to the end of curve i; an open path stores one extra entry */\nexport function pathLength(vertexCount: number, closed: boolean, lengths: number[]): number {\n const curveCount = closed ? vertexCount / 3 : vertexCount / 3 - 1;\n return curveCount >= 1 && lengths.length >= curveCount ? lengths[curveCount - 1] : lengths[lengths.length - 1] ?? 1;\n}\n\n/**\n * Sample positions and tangents along a path made of cubic bezier curves through the attachment vertices\n * (vertex layout: [c_prev, p, c_next] triples; curve i runs p_i \u2192 c_next_i \u2192 c_prev_{i+1} \u2192 p_{i+1}).\n */\n/**\n * Points along a path attachment (document space). `positions` are absolute distances along the path (or fractions of\n * its length when `percent`). With `constantSpeed` the length of the posed curve is measured (4 chords per curve for\n * the total, 10 chords inside the curve that holds the position); otherwise the stored setup `lengths` and the raw\n * curve parameter are used. Closed paths wrap; positions beyond an open path continue along its end tangents.\n * `angle` is the tangent direction in degrees.\n */\nexport function samplePath(points: number[], closed: boolean, lengths: number[], constantSpeed: boolean, positions: number[], percent: boolean): { x: number; y: number; angle: number }[] {\n const n = points.length / 2;\n // anchors sit at indices 1, 4, 7, \u2026 (each vertex = [cPrev, p, cNext]); curve i runs from anchor i to anchor i + 1\n const curveCount = closed ? n / 3 : n / 3 - 1;\n if (curveCount < 1) return positions.map(() => ({ x: points[2] ?? 0, y: points[3] ?? 0, angle: 0 }));\n const curve = (i: number) => {\n const a = ((i * 3 + 1) % n) * 2, c1 = ((i * 3 + 2) % n) * 2, c2 = ((i * 3 + 3) % n) * 2, b = ((i * 3 + 4) % n) * 2;\n return [points[a], points[a + 1], points[c1], points[c1 + 1], points[c2], points[c2 + 1], points[b], points[b + 1]];\n };\n const pointAt = (i: number, t: number) => {\n const [x0, y0, x1, y1, x2, y2, x3, y3] = curve(i), u = 1 - t;\n return { x: u * u * u * x0 + 3 * u * u * t * x1 + 3 * u * t * t * x2 + t * t * t * x3, y: u * u * u * y0 + 3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t * y3 };\n };\n const angleAt = (i: number, t: number) => {\n const [x0, y0, x1, y1, x2, y2, x3, y3] = curve(i), u = 1 - t;\n const dx = 3 * u * u * (x1 - x0) + 6 * u * t * (x2 - x1) + 3 * t * t * (x3 - x2);\n const dy = 3 * u * u * (y1 - y0) + 6 * u * t * (y2 - y1) + 3 * t * t * (y3 - y2);\n return Math.atan2(dy, dx) / DEG;\n };\n const chords = (i: number, count: number) => {\n const acc: number[] = []; let sum = 0, prev = pointAt(i, 0);\n for (let k = 1; k <= count; k++) { const q = pointAt(i, k / count); sum += Math.hypot(q.x - prev.x, q.y - prev.y); acc.push(sum); prev = q; }\n return acc;\n };\n const cum: number[] = [];\n if (constantSpeed) { let acc = 0; for (let i = 0; i < curveCount; i++) { acc += chords(i, 4)[3]; cum.push(acc); } }\n else for (let i = 0; i < curveCount; i++) cum.push(lengths[i] ?? (i ? cum[i - 1] : 0));\n const total = cum[curveCount - 1];\n const out: { x: number; y: number; angle: number }[] = [];\n for (let pos of positions) {\n if (percent) pos *= total;\n if (closed) {\n if (total > 0) { pos %= total; if (pos < 0) pos += total; } else pos = 0;\n } else if (pos < 0) { // before the start: continue the start tangent (anchor 0 towards its outgoing control)\n const r = Math.atan2(points[5] - points[3], points[4] - points[2]);\n out.push({ x: points[2] + pos * Math.cos(r), y: points[3] + pos * Math.sin(r), angle: r / DEG });\n continue;\n } else if (pos > total) { // after the end: continue the end tangent (incoming control towards the last anchor)\n const a = (curveCount * 3 + 1) * 2, c = curveCount * 3 * 2, e = pos - total;\n const r = Math.atan2(points[a + 1] - points[c + 1], points[a] - points[c]);\n out.push({ x: points[a] + e * Math.cos(r), y: points[a + 1] + e * Math.sin(r), angle: r / DEG });\n continue;\n }\n let i = 0;\n while (i < curveCount - 1 && pos > cum[i]) i++;\n const prev = i ? cum[i - 1] : 0, span = cum[i] - prev;\n const f = span > 0 ? (pos - prev) / span : 0;\n let t = f;\n if (constantSpeed) { // weight the parameter by chord lengths inside the curve\n const seg = chords(i, 10), target = f * seg[9];\n let k = 0;\n while (k < 9 && target > seg[k]) k++;\n const sPrev = k ? seg[k - 1] : 0, sSpan = seg[k] - sPrev;\n t = (k + (sSpan > 0 ? (target - sPrev) / sSpan : 0)) / 10;\n }\n out.push({ ...pointAt(i, t), angle: angleAt(i, t) });\n }\n return out;\n}\n\nconst PATH_EPSILON = 0.00001;\n\n/**\n * Path constraint: bones are laid along the target slot's path attachment (spacing modes: length = bone length +\n * spacing, fixed = spacing px, percent = fraction of the path per bone, proportional = the path shared by bone length),\n * translated with mixX/mixY and rotated with mixRotate (tangent = path direction, chain = towards the next bone,\n * chainScale = chain + scaled to reach it). Applied in world space, then folded back into the bones' effective locals.\n */\nfunction applyPathConstraint(skel: Skeleton, c: PathConstraint) {\n const mixRotate = cnum(skel, \"path\", c.id, \"mixRotate\", c.mixRotate), mixX = cnum(skel, \"path\", c.id, \"mixX\", c.mixX), mixY = cnum(skel, \"path\", c.id, \"mixY\", c.mixY);\n if (!mixRotate && !mixX && !mixY) return;\n const att = skel.attachment.get(c.target);\n if (!att || att.type !== \"path\") return;\n const points = pathWorldVertices(skel, c.target, att);\n const position = cnum(skel, \"path\", c.id, \"position\", c.position), spacing = cnum(skel, \"path\", c.id, \"spacing\", c.spacing);\n const tangents = c.rotateMode === \"tangent\", scale = c.rotateMode === \"chainScale\";\n const bones = c.bones.map(id => ({ b: boneOf(skel.doc, id), st: skel.bones.get(id)! }));\n const spacesCount = tangents ? bones.length : bones.length + 1;\n // spacing between consecutive bones; length-based modes scale with the bone's world x axis\n const spaces = new Array<number>(spacesCount).fill(0), worldLengths: number[] = [];\n let sum = 0;\n for (let i = 0; i < spacesCount - 1; i++) {\n const { b, st } = bones[i], setupLength = b.length;\n const len = setupLength < PATH_EPSILON ? 0 : setupLength * Math.hypot(st.world.a, st.world.b);\n worldLengths.push(len);\n if (c.spacingMode === \"percent\") spaces[i + 1] = spacing;\n else if (setupLength < PATH_EPSILON) spaces[i + 1] = spacing;\n else if (c.spacingMode === \"proportional\") { spaces[i + 1] = len; sum += len; }\n else spaces[i + 1] = (c.spacingMode === \"length\" ? setupLength + spacing : spacing) * len / setupLength;\n }\n if (c.spacingMode === \"proportional\" && sum > 0) { const f = spacesCount / sum * spacing; for (let i = 1; i < spacesCount; i++) spaces[i] *= f; }\n const total = measuredPathLength(points, att.closed, att.lengths, att.constantSpeed);\n const multiplier = c.spacingMode === \"percent\" ? total : c.spacingMode === \"proportional\" ? total / spacesCount : 1;\n let p = c.positionMode === \"percent\" ? position * total : position;\n const positions: number[] = [];\n for (let i = 0; i < spacesCount; i++) { p += spaces[i] * multiplier; positions.push(p); }\n const samples = samplePath(points, att.closed, att.lengths, att.constantSpeed, positions, false);\n // offset rotation follows the target bone's handedness; chain mode without an offset links bones tip to tail\n const tip = c.rotation === 0 && c.rotateMode === \"chain\";\n let offsetRotation = c.rotation * DEG;\n if (c.rotation !== 0) {\n const slot = skel.doc.slots.find(sl => sl.id === c.target)!, tw = skel.bones.get(slot.bone)!.world;\n if (tw.a * tw.d - tw.b * tw.c < 0) offsetRotation = -offsetRotation;\n }\n let boneX = samples[0].x, boneY = samples[0].y;\n for (let i = 0; i < bones.length; i++) {\n const { b, st } = bones[i];\n let w: Affine = { ...st.world };\n w.tx += (boneX - w.tx) * mixX;\n w.ty += (boneY - w.ty) * mixY;\n const next = samples[i + 1] ?? { x: 0, y: 0, angle: 0 };\n const dx = next.x - boneX, dy = next.y - boneY;\n if (scale) {\n const len = worldLengths[i];\n if (len !== 0) { const f = (Math.hypot(dx, dy) / len - 1) * mixRotate + 1; w.a *= f; w.b *= f; }\n }\n boneX = next.x; boneY = next.y;\n if (mixRotate > 0) {\n const { a, b: bb, c: cc, d } = w;\n let r = (tangents ? samples[i].angle : spaces[i + 1] === 0 ? next.angle : Math.atan2(dy, dx) / DEG) * DEG;\n r -= Math.atan2(bb, a);\n if (tip) {\n const cos = Math.cos(r), sin = Math.sin(r), length = b.length;\n boneX += (length * (cos * a - sin * bb) - dx) * mixRotate;\n boneY += (length * (sin * a + cos * bb) - dy) * mixRotate;\n } else r += offsetRotation;\n if (r > Math.PI) r -= 2 * Math.PI; else if (r < -Math.PI) r += 2 * Math.PI;\n r *= mixRotate;\n const cos = Math.cos(r), sin = Math.sin(r);\n w = { a: cos * a - sin * bb, b: sin * a + cos * bb, c: cos * cc - sin * d, d: sin * cc + cos * d, tx: w.tx, ty: w.ty };\n }\n setEffectiveWorld(skel, b, st, w);\n }\n}\n\n/** total length used for percent positions/spacing: measured on the posed curve (constant speed) or the stored setup lengths */\nfunction measuredPathLength(points: number[], closed: boolean, lengths: number[], constantSpeed: boolean): number {\n const n = points.length / 2, curveCount = closed ? n / 3 : n / 3 - 1;\n if (curveCount < 1) return 0;\n if (!constantSpeed) return pathLength(n, closed, lengths);\n let total = 0;\n for (let i = 0; i < curveCount; i++) {\n const a = ((i * 3 + 1) % n) * 2, c1 = ((i * 3 + 2) % n) * 2, c2 = ((i * 3 + 3) % n) * 2, b = ((i * 3 + 4) % n) * 2;\n let px = points[a], py = points[a + 1];\n for (let k = 1; k <= 4; k++) {\n const t = k / 4, u = 1 - t;\n const x = u * u * u * points[a] + 3 * u * u * t * points[c1] + 3 * u * t * t * points[c2] + t * t * t * points[b];\n const y = u * u * u * points[a + 1] + 3 * u * u * t * points[c1 + 1] + 3 * u * t * t * points[c2 + 1] + t * t * t * points[b + 1];\n total += Math.hypot(x - px, y - py); px = x; py = y;\n }\n }\n return total;\n}\n\n/** the parent's linear part a bone actually inherits under its `inherit` mode */\nfunction inheritedParentLinear(bone: Bone, parent: Affine): Affine {\n switch (bone.inherit) {\n case \"normal\": return { ...parent, tx: 0, ty: 0 };\n case \"onlyTranslation\": return { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 };\n case \"noRotationOrReflection\": {\n // scale along the parent's axes without its rotation; keeps the parent's area scale, drops reflection\n const lenX = Math.hypot(parent.a, parent.b) || 1;\n const det = parent.a * parent.d - parent.b * parent.c;\n return { a: lenX, b: 0, c: 0, d: Math.abs(det) / lenX, tx: 0, ty: 0 };\n }\n case \"noScale\": case \"noScaleOrReflection\": {\n const lenX = Math.hypot(parent.a, parent.b) || 1;\n const ua = parent.a / lenX, ub = parent.b / lenX;\n const det = parent.a * parent.d - parent.b * parent.c;\n const reflect = det < 0 && bone.inherit === \"noScale\" ? -1 : 1; // noScale keeps the parent's reflection\n return { a: ua, b: ub, c: -ub * reflect, d: ua * reflect, tx: 0, ty: 0 };\n }\n }\n}\n\n/** Give a bone the world transform `world`: its effective locals are decomposed relative to the parent (shearX folds into rotation), descendants follow. */\nfunction setEffectiveWorld(skel: Skeleton, bone: Bone, st: BoneState, world: Affine) {\n const parent = bone.parent ? skel.bones.get(bone.parent)!.world : undefined;\n let lin: Affine = world, tx = world.tx, ty = world.ty;\n if (parent) {\n [tx, ty] = apply(invert(parent), world.tx, world.ty);\n lin = mul(invert(inheritedParentLinear(bone, parent)), { ...world, tx: 0, ty: 0 });\n }\n st.x = tx; st.y = ty;\n st.rotation = Math.atan2(lin.b, lin.a) / DEG;\n st.scaleX = Math.hypot(lin.a, lin.b);\n st.scaleY = Math.hypot(lin.c, lin.d);\n st.shearX = 0;\n st.shearY = shortest(Math.atan2(lin.d, lin.c) / DEG - st.rotation - 90);\n updateSubtree(skel, bone.id);\n}\n\n// ---------- attachment geometry ----------\n\n/** skinned or bone-local vertices of a mesh/path attachment in document space, deform offsets applied */\nexport function attachmentWorldVertices(skel: Skeleton, slotId: string, att: MeshAttachment | PathAttachment): number[] {\n const deform = skel.pose.get(pk(\"deform\", att.id, \"vertices\"));\n const off = Array.isArray(deform) && typeof deform[0] === \"number\" ? (deform as number[]) : undefined;\n const out: number[] = [];\n if (att.weights) {\n let k = 0;\n for (const list of att.weights) {\n let x = 0, y = 0;\n for (const inf of list) {\n const w = skel.bones.get(inf.bone)!.world;\n const vx = inf.x + (off ? off[k] : 0), vy = inf.y + (off ? off[k + 1] : 0);\n k += 2;\n x += (w.a * vx + w.c * vy + w.tx) * inf.w; y += (w.b * vx + w.d * vy + w.ty) * inf.w;\n }\n out.push(x, y);\n }\n } else {\n const slot = skel.doc.slots.find(s => s.id === slotId)!, w = skel.bones.get(slot.bone)!.world, v = att.vertices!;\n for (let i = 0; i < v.length; i += 2) {\n const vx = v[i] + (off ? off[i] : 0), vy = v[i + 1] + (off ? off[i + 1] : 0);\n out.push(w.a * vx + w.c * vy + w.tx, w.b * vx + w.d * vy + w.ty);\n }\n }\n return out;\n}\n\n/** image-local (centre-relative) \u2192 document matrix for a region attachment */\nexport function regionMatrix(skel: Skeleton, slotId: string, att: RegionAttachment): Affine {\n const slot = skel.doc.slots.find(s => s.id === slotId)!;\n return mul(skel.bones.get(slot.bone)!.world, affineOf(att.x, att.y, att.rotation, att.scaleX, att.scaleY));\n}\n\nexport function regionSize(doc: RigDocument, att: RegionAttachment): [number, number] {\n const asset = doc.assets.find(a => a.id === att.asset)!;\n return [att.width ?? asset.width, att.height ?? asset.height];\n}\n\n/**\n * Outline of a slot's shown attachment in document space: region \u2192 `samplesPerEdge` points per edge clockwise\n * from the top-left (lattice deform applied), mesh \u2192 hull vertices (or all), path/hidden \u2192 undefined.\n */\nexport function slotOutline(doc: RigDocument, pose: Pose, slotId: string, samplesPerEdge = 1, skel = evaluate(doc, pose)): [number, number][] | undefined {\n if (!doc.slots.some(s => s.id === slotId)) throw new Error(`unknown slot \"${slotId}\"`);\n const att = skel.attachment.get(slotId);\n if (!att) return undefined;\n if (att.type === \"mesh\") {\n const v = attachmentWorldVertices(skel, slotId, att), n = att.hull > 0 ? att.hull : v.length / 2;\n const pts: [number, number][] = [];\n for (let i = 0; i < n; i++) pts.push([v[i * 2], v[i * 2 + 1]]);\n return pts;\n }\n if (att.type === \"path\") return undefined;\n const [w, h] = regionSize(doc, att), m = regionMatrix(skel, slotId, att), pivot: Pivot = { x: 0.5, y: 0.5 };\n const params = deformParams(pose, att.id);\n const offsets = params ? controlOffsets(params, w, h, pivot) : undefined;\n const pts: [number, number][] = [];\n const push = (u: number, v: number) => {\n const [ox, oy] = offsets ? evalPatch(offsets, u, v) : [0, 0];\n pts.push(apply(m, (u - 0.5) * w + ox, (v - 0.5) * h + oy));\n };\n const n = Math.max(1, samplesPerEdge);\n for (let i = 0; i < n; i++) push(i / n, 0);\n for (let i = 0; i < n; i++) push(1, i / n);\n for (let i = 0; i < n; i++) push(1 - i / n, 1);\n for (let i = 0; i < n; i++) push(0, 1 - i / n);\n return pts;\n}\n", "/**\n * rig-mesh \u2014 pure mesh math shared by the registry tools and the editor: outline tracing from alpha, Delaunay\n * triangulation, distance-based auto weights, vertex fitting, deform offsets and the weight brush. No node:*, no DOM.\n */\nimport Delaunator from \"delaunator\";\nimport { affineOf, apply, attachmentWorldVertices, invert, pk, type Affine, type Skeleton } from \"./rig-anim\";\nimport type { RigDocument, MeshAttachment, RegionAttachment, Asset } from \"./rig-format\";\n\nexport interface AlphaMask { width: number; height: number; alpha: Uint8Array }\nexport type Pt = [number, number];\n\n// ---------- outline ----------\n\nexport interface TraceOptions { threshold?: number; tolerance?: number; margin?: number }\n\n/**\n * An island smaller than this fraction of the largest one is antialiasing debris or a stray speck, not a part\n * worth its own triangles \u2014 a layer's second real island (the other eye of a closed-eyes overlay) is within a\n * factor of two of the first, while the specks a cut-out leaves behind are three orders of magnitude smaller.\n */\nconst MIN_ISLAND_AREA = 0.05;\n\n/** unit edges around opaque pixels, oriented clockwise on screen, linked into loops (outer loops and holes alike) */\nfunction traceLoops(mask: AlphaMask, threshold: number): Pt[][] {\n const { width: w, height: h, alpha } = mask;\n const solid = (x: number, y: number) => x >= 0 && y >= 0 && x < w && y < h && alpha[y * w + x] >= threshold;\n // directed edges keyed by start point \"x,y\" \u2192 end point; several edges may start at one corner (diagonal touch)\n const edges = new Map<string, Pt[]>();\n const add = (x1: number, y1: number, x2: number, y2: number) => { const k = `${x1},${y1}`; (edges.get(k) ?? edges.set(k, []).get(k)!).push([x2, y2]); };\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {\n if (!solid(x, y)) continue;\n if (!solid(x, y - 1)) add(x, y, x + 1, y);\n if (!solid(x + 1, y)) add(x + 1, y, x + 1, y + 1);\n if (!solid(x, y + 1)) add(x + 1, y + 1, x, y + 1);\n if (!solid(x - 1, y)) add(x, y + 1, x, y);\n }\n if (!edges.size) throw new Error(\"empty alpha: no opaque pixels above the threshold\");\n const loops: Pt[][] = [];\n while (edges.size) {\n const [startKey] = edges.entries().next().value as [string, Pt[]];\n const start = startKey.split(\",\").map(Number) as Pt;\n const loop: Pt[] = [start];\n let cur = start;\n let dirIn: Pt | null = null;\n for (;;) {\n const k = `${cur[0]},${cur[1]}`, list = edges.get(k);\n if (!list || !list.length) break;\n const next = pickNext(cur, list, dirIn);\n if (!list.length) edges.delete(k);\n if (next[0] === start[0] && next[1] === start[1]) break;\n dirIn = [next[0] - cur[0], next[1] - cur[1]];\n loop.push(next); cur = next;\n }\n if (loop.length >= 4) loops.push(loop);\n }\n return loops;\n}\n\n/**\n * Every separate opaque island's outline, simplified and offset, largest first. A layer is not always one blob \u2014\n * a closed-eyes overlay is two strokes, a dashed outfit trim is a dozen \u2014 and meshing only the biggest one drops\n * the rest of the image silently. Holes (a loop wound against the largest loop's orientation, e.g. the inside of\n * a ring) are dropped, as is any island under `MIN_ISLAND_AREA` of the largest.\n */\nexport function traceHulls(mask: AlphaMask, opts: TraceOptions = {}): Pt[][] {\n const { threshold = 8, tolerance = 2, margin = 1 } = opts;\n const loops = traceLoops(mask, threshold).map(l => ({ l, a: signedArea(l) }));\n const biggest = loops.reduce((m, x) => (Math.abs(x.a) > Math.abs(m.a) ? x : m), loops[0]);\n const islands = loops\n .filter(x => Math.sign(x.a) === Math.sign(biggest.a) && Math.abs(x.a) >= MIN_ISLAND_AREA * Math.abs(biggest.a))\n .sort((p, q) => Math.abs(q.a) - Math.abs(p.a)); // stable: equal-area islands keep their tracing order\n return islands.map(({ l }) => { const s = simplify(dropCollinear(l), tolerance); return margin ? offsetPolygon(s, margin) : s; });\n}\n\n/** the outline of the largest opaque island only \u2014 `traceHulls` when every island matters */\nexport function traceHull(mask: AlphaMask, opts: TraceOptions = {}): Pt[] {\n return traceHulls(mask, opts)[0];\n}\n\n/**\n * At a corner where several edges start (a diagonal touch between two regions), several unit steps leave `cur`.\n * Every traced edge keeps the solid region on the same fixed side (rotate the travel direction by +90\u00B0: (dx,dy) \u2192\n * (-dy,dx)); at a plain vertex that's the only outgoing edge, so this is a no-op. At a branch point, prefer \u2014 in\n * order \u2014 the step that turns toward that side (hugs the region tightest), then straight ahead, then away, then\n * back, so two regions that meet only at a point are traced as two separate loops instead of one figure-eight.\n * The first edge of a loop has no incoming direction (`dirIn === null`): any outgoing edge is a valid start.\n */\nfunction pickNext(cur: Pt, list: Pt[], dirIn: Pt | null): Pt {\n if (list.length === 1 || !dirIn) return list.pop()!;\n const rotate = (d: Pt, sign: 1 | -1): Pt => (sign > 0 ? [-d[1], d[0]] : [d[1], -d[0]]);\n const priority: Pt[] = [rotate(dirIn, 1), dirIn, rotate(dirIn, -1), [-dirIn[0], -dirIn[1]]];\n for (const want of priority) {\n const idx = list.findIndex(p => p[0] - cur[0] === want[0] && p[1] - cur[1] === want[1]);\n if (idx >= 0) return list.splice(idx, 1)[0];\n }\n return list.pop()!;\n}\n\nexport function signedArea(p: Pt[]): number { let a = 0; for (let i = 0; i < p.length; i++) { const [x1, y1] = p[i], [x2, y2] = p[(i + 1) % p.length]; a += x1 * y2 - x2 * y1; } return a / 2; }\nfunction dropCollinear(p: Pt[]): Pt[] {\n return p.filter((_, i) => { const a = p[(i + p.length - 1) % p.length], b = p[i], c = p[(i + 1) % p.length]; return (b[0] - a[0]) * (c[1] - b[1]) - (b[1] - a[1]) * (c[0] - b[0]) !== 0; });\n}\n/** Douglas\u2013Peucker on a closed ring: split at the two farthest-apart points, simplify both halves */\nfunction simplify(ring: Pt[], tol: number): Pt[] {\n if (tol <= 0 || ring.length <= 4) return ring;\n let a = 0, b = 0, best = -1;\n for (let i = 0; i < ring.length; i++) for (let j = i + 1; j < ring.length; j++) { const d = (ring[i][0] - ring[j][0]) ** 2 + (ring[i][1] - ring[j][1]) ** 2; if (d > best) { best = d; a = i; b = j; } }\n const seg1 = ring.slice(a, b + 1), seg2 = [...ring.slice(b), ...ring.slice(0, a + 1)];\n const out = [...dp(seg1, tol).slice(0, -1), ...dp(seg2, tol).slice(0, -1)];\n return out.length >= 3 ? out : ring;\n}\nfunction dp(pts: Pt[], tol: number): Pt[] {\n if (pts.length < 3) return pts;\n const [x1, y1] = pts[0], [x2, y2] = pts[pts.length - 1];\n let idx = 0, dmax = 0;\n for (let i = 1; i < pts.length - 1; i++) { const d = segDist(pts[i][0], pts[i][1], x1, y1, x2, y2); if (d > dmax) { dmax = d; idx = i; } }\n if (dmax <= tol) return [pts[0], pts[pts.length - 1]];\n return [...dp(pts.slice(0, idx + 1), tol).slice(0, -1), ...dp(pts.slice(idx), tol)];\n}\nfunction segDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1, l2 = dx * dx + dy * dy;\n const t = l2 ? Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / l2)) : 0;\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n/** push every vertex outward along its angle bisector by `m` px (mitre, clamped to 2m) */\nfunction offsetPolygon(p: Pt[], m: number): Pt[] {\n const out = signedArea(p) > 0 ? 1 : -1;\n return p.map((b, i) => {\n const a = p[(i + p.length - 1) % p.length], c = p[(i + 1) % p.length];\n const n1 = normal(a, b, out), n2 = normal(b, c, out);\n let nx = n1[0] + n2[0], ny = n1[1] + n2[1];\n const l = Math.hypot(nx, ny) || 1; nx /= l; ny /= l;\n const dot = Math.max(0.5, nx * n1[0] + ny * n1[1]);\n return [b[0] + nx * m / dot, b[1] + ny * m / dot];\n });\n}\nconst normal = (a: Pt, b: Pt, out: number): Pt => { const dx = b[0] - a[0], dy = b[1] - a[1], l = Math.hypot(dx, dy) || 1; return [out * dy / l, -out * dx / l]; };\n\nexport function pointInPolygon(poly: Pt[], x: number, y: number): boolean {\n let inside = false;\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const [xi, yi] = poly[i], [xj, yj] = poly[j];\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) inside = !inside;\n }\n return inside;\n}\nexport function distanceToPolygon(poly: Pt[], x: number, y: number): number {\n let d = Infinity;\n for (let i = 0; i < poly.length; i++) { const a = poly[i], b = poly[(i + 1) % poly.length]; d = Math.min(d, segDist(x, y, a[0], a[1], b[0], b[1])); }\n return d;\n}\n\n// ---------- triangulation ----------\n\nexport function interiorPoints(hull: Pt[], spacing: number): Pt[] {\n const xs = hull.map(p => p[0]), ys = hull.map(p => p[1]);\n const x0 = Math.min(...xs), x1 = Math.max(...xs), y0 = Math.min(...ys), y1 = Math.max(...ys);\n const nx = Math.max(1, Math.round((x1 - x0) / spacing)), ny = Math.max(1, Math.round((y1 - y0) / spacing));\n const out: Pt[] = [];\n for (let j = 0; j <= ny; j++) for (let i = 0; i <= nx; i++) {\n const x = x0 + ((x1 - x0) * i) / nx, y = y0 + ((y1 - y0) * j) / ny;\n if (pointInPolygon(hull, x, y) && distanceToPolygon(hull, x, y) >= spacing / 2) out.push([x, y]);\n }\n return out;\n}\n\n/** hull edges longer than `spacing` are subdivided so the outline survives Delaunay; outside triangles are culled */\nexport function triangulate(hull: Pt[], interior: Pt[], spacing: number): { vertices: number[]; triangles: number[]; hull: number } {\n const ring: Pt[] = [];\n for (let i = 0; i < hull.length; i++) {\n const a = hull[i], b = hull[(i + 1) % hull.length], n = Math.max(1, Math.ceil(Math.hypot(b[0] - a[0], b[1] - a[1]) / spacing));\n for (let k = 0; k < n; k++) ring.push([a[0] + ((b[0] - a[0]) * k) / n, a[1] + ((b[1] - a[1]) * k) / n]);\n }\n const pts = [...ring, ...interior];\n const flat = pts.flat();\n const d = new Delaunator(flat);\n const triangles: number[] = [];\n for (let i = 0; i < d.triangles.length; i += 3) {\n const a = d.triangles[i], b = d.triangles[i + 1], c = d.triangles[i + 2];\n const cx = (flat[2 * a] + flat[2 * b] + flat[2 * c]) / 3, cy = (flat[2 * a + 1] + flat[2 * b + 1] + flat[2 * c + 1]) / 3;\n if (pointInPolygon(hull, cx, cy)) triangles.push(a, b, c);\n }\n return { vertices: flat, triangles, hull: ring.length };\n}\n\n// ---------- folds ----------\n\n/** `minArea`: ignore a flipped triangle whose rest-pose area (px\u00B2) is below this \u2014 hairline slivers flip sign from\n * rounding noise alone and aren't a real fold. Default 0 keeps every flip (the pre-existing behaviour). */\nexport function foldedTriangles(rest: number[], world: number[], triangles: number[], minArea = 0): number[] {\n const out: number[] = [];\n for (let i = 0; i < triangles.length; i += 3) {\n const r = triangleArea(rest, triangles[i], triangles[i + 1], triangles[i + 2]), w = triangleArea(world, triangles[i], triangles[i + 1], triangles[i + 2]);\n if (r !== 0 && w !== 0 && Math.sign(r) !== Math.sign(w) && Math.abs(r) >= minArea) out.push(i / 3);\n }\n return out;\n}\n\n/** signed area of triangle (a, b, c) of a flat [x, y, \u2026] vertex array \u2014 negative when it winds the other way */\nexport const triangleArea = (v: number[], a: number, b: number, c: number) =>\n ((v[2 * b] - v[2 * a]) * (v[2 * c + 1] - v[2 * a + 1]) - (v[2 * b + 1] - v[2 * a + 1]) * (v[2 * c] - v[2 * a])) / 2;\n\n/** total area of a mesh's triangles in the given vertex positions \u2014 the denominator for \"how much of it folded\" */\nexport function meshArea(vertices: number[], triangles: number[]): number {\n let total = 0;\n for (let i = 0; i < triangles.length; i += 3) total += Math.abs(triangleArea(vertices, triangles[i], triangles[i + 1], triangles[i + 2]));\n return total;\n}\n\n// ---------- mesh from image / auto weights ----------\n\n/**\n * World positions of a mesh's REST shape under the given skeleton \u2014 `attachmentWorldVertices` with the pose's\n * deform offsets left out, which is what auto-weighting and the weight brush measure distances against (a mesh\n * is skinned to where its rest vertices are, not to where a deform key happens to have pushed them).\n */\nexport function meshWorldVertices(skel: Skeleton, slotId: string, att: MeshAttachment): number[] {\n const key = pk(\"deform\", att.id, \"vertices\");\n if (!skel.pose.has(key)) return attachmentWorldVertices(skel, slotId, att);\n const pose = new Map(skel.pose);\n pose.delete(key);\n return attachmentWorldVertices({ ...skel, pose }, slotId, att);\n}\n\n/** 6 decimals, the precision rest shapes, weights and deform offsets are written at \u2014 what rig.json keeps\n * (`+ 0` turns a rounded -0 back into 0). Shared with the registry tools, the editor's gizmos and verify-mesh. */\nexport const round6 = (v: number) => +v.toFixed(6) + 0;\n\n/**\n * region \u2192 mesh over already-traced islands: each island is filled with an interior grid and triangulated on its\n * own, then the islands are concatenated with their triangle indices offset. uvs are x/imgW, y/imgH; vertices are\n * slot-bone local, through the region placement.\n * `hull` (the leading vertices that form THE outline) only makes sense for a single island, so a multi-island\n * mesh reports 0 \u2014 consumers then treat every vertex as outline, which is right when there is more than one.\n */\nexport function meshFromIslands(islands: Pt[][], region: RegionAttachment, asset: Asset, mask: { width: number; height: number }, spacing = 24): MeshAttachment {\n const w = region.width ?? asset.width, h = region.height ?? asset.height;\n const place: Affine = affineOf(region.x, region.y, region.rotation, region.scaleX, region.scaleY);\n const uvs: number[] = [], vertices: number[] = [], triangles: number[] = [];\n let hull = 0;\n for (const island of islands) {\n const tri = triangulate(island, interiorPoints(island, spacing), spacing);\n const offset = uvs.length / 2;\n for (let i = 0; i < tri.vertices.length; i += 2) {\n const u = tri.vertices[i] / mask.width, v = tri.vertices[i + 1] / mask.height;\n uvs.push(round6(u), round6(v));\n const [x, y] = apply(place, (u - 0.5) * w, (v - 0.5) * h);\n vertices.push(round6(x), round6(y));\n }\n for (const t of tri.triangles) triangles.push(t + offset);\n if (islands.length === 1) hull = tri.hull;\n }\n return {\n id: region.id, slot: region.slot, type: \"mesh\", asset: region.asset,\n uvs, triangles, vertices, hull,\n ...(region.width ? { width: region.width } : {}),\n ...(region.height ? { height: region.height } : {}),\n };\n}\n\n/** region \u2192 mesh: every opaque island's outline + an interior grid, triangulated (see `traceHulls`, `meshFromIslands`) */\nexport function meshFromMask(\n mask: AlphaMask,\n region: RegionAttachment,\n asset: Asset,\n opts: { spacing?: number; tolerance?: number; margin?: number; threshold?: number } = {},\n): MeshAttachment {\n const { spacing, ...trace } = opts;\n return meshFromIslands(traceHulls(mask, trace), region, asset, mask, spacing);\n}\n\n/** `radius` is the falloff's distance scale, in world px \u2014 see `autoWeights` */\nexport interface AutoWeightsOptions { bones: string[]; radius: number; maxInfluences: number }\n/** normalized weights below this are dropped rather than kept as a dead influence that rounds to 0 in the file */\nexport const MIN_AUTO_WEIGHT = 1e-6;\n\n/** default candidates: the slot's bone, its parent, its direct children */\nexport function defaultWeightBones(doc: RigDocument, slotId: string): string[] {\n const slot = doc.slots.find(s => s.id === slotId);\n if (!slot) throw new Error(`unknown slot \"${slotId}\"`);\n const bone = doc.bones.find(b => b.id === slot.bone)!;\n return [...new Set([bone.id, ...(bone.parent ? [bone.parent] : []), ...doc.bones.filter(b => b.parent === bone.id).map(b => b.id)])];\n}\n\n/**\n * Inverse-distance skinning. For every vertex: the distance `d` to each candidate bone's segment (joint \u2192 joint +\n * length along x; length 0 = a point), weight `1 / (d/radius + 1)\u00B2`, top-K by weight, normalized; influences hold\n * the vertex in each bone's local space.\n *\n * `radius` scales the falloff: it is the distance, in world px, at which the weight has fallen to 1/4 of its\n * value at the joint. `1` reproduces the historical law `1 / (d + 1px)\u00B2` exactly \u2014 which is why it is the\n * default, and omitting `radius` changes nothing. A larger radius flattens the curve, so bones farther away keep\n * a meaningful share; a smaller one sharpens it, so the nearest bone dominates within a few px.\n *\n * There is deliberately no cutoff at any radius: every candidate bone keeps a nonzero share, however far past\n * `radius` it sits. A hard cutoff is what this replaced, and it was worse than useless \u2014 the middle of a limb\n * sat beyond `radius` of both of its joints (the old default was half the mesh's extent), so it had no bone in\n * range at all and had to snap to its single nearest bone at w=1; neighbouring vertices snapping to *different*\n * bones is a hard seam with no blend, and it flips the triangles between them as soon as those bones\n * counter-rotate.\n */\nexport function autoWeights(doc: RigDocument, skel: Skeleton, att: MeshAttachment, opts: AutoWeightsOptions): MeshAttachment {\n if (!opts.bones.length) throw new Error(\"autoWeights: at least one candidate bone is required\");\n if (!(opts.radius > 0)) throw new Error(\"autoWeights: radius must be > 0\");\n if (!(opts.maxInfluences >= 1)) throw new Error(\"autoWeights: maxInfluences must be >= 1\");\n const world = meshWorldVertices(skel, att.slot, att);\n const segs: { id: string; x1: number; y1: number; x2: number; y2: number; inv: Affine }[] = opts.bones.map(id => {\n const b = doc.bones.find(x => x.id === id), st = skel.bones.get(id);\n if (!b || !st) throw new Error(`unknown bone \"${id}\"`);\n const [ex, ey] = apply(st.world, b.length, 0);\n return { id, x1: st.world.tx, y1: st.world.ty, x2: ex, y2: ey, inv: invert(st.world) };\n });\n const weights: NonNullable<MeshAttachment[\"weights\"]> = [];\n for (let i = 0; i < world.length; i += 2) {\n const x = world[i], y = world[i + 1];\n const distances = segs.map(s => ({ s, d: segDist(x, y, s.x1, s.y1, s.x2, s.y2) })).sort((a, b) => a.d - b.d);\n // inverse-distance with a falloff scale: `radius` is the distance at which the weight has fallen to 1/4.\n // There is no cutoff \u2014 a hard edge is what produced the seams and folds described above.\n const cands = distances\n .slice(0, opts.maxInfluences)\n .map(c => ({ s: c.s, w: 1 / (c.d / opts.radius + 1) ** 2 }));\n const sum = cands.reduce((s, c) => s + c.w, 0);\n const kept = cands.filter(c => c.w / sum >= MIN_AUTO_WEIGHT);\n const total = kept.reduce((s, c) => s + c.w, 0);\n weights.push(kept.map(c => { const [lx, ly] = apply(c.s.inv, x, y); return { bone: c.s.id, x: round6(lx), y: round6(ly), w: round6(c.w / total) }; }));\n }\n const { vertices: _drop, ...rest } = att;\n return { ...rest, weights };\n}\n\n// ---------- vertex fitting, deform offsets, weight brush ----------\n\n/**\n * What the fitting and deform math below actually reads: the slot the points live in, plus the `VertexData` a\n * mesh and a PATH carry identically (`vertices`, or `weights` skinned to bones). Neither cares which of the two\n * it was handed \u2014 a path attachment is skinned exactly like a mesh, vertex for vertex.\n */\nexport type VertexAttachment = Pick<MeshAttachment, \"slot\" | \"vertices\" | \"weights\">;\n/** one rest shape, never both \u2014 what a vertex gesture commits and what `rig_set_mesh` / `rig_set_path_attachment` take */\nexport type VertexPatch = { vertices: number[]; weights?: undefined } | { weights: NonNullable<MeshAttachment[\"weights\"]>; vertices?: undefined };\n\n/**\n * How many CONTROL POINTS a mesh or a path holds: one influence list each when skinned, two numbers of\n * `vertices` each when not. The same count for both shapes, in one place \u2014 the gizmo, the anchor tool, the tree's\n * delete and the properties panel all ask it, and a copy that got the weighted branch wrong would read half a\n * skinned path as a whole one.\n */\nexport const vertexCount = (att: Pick<VertexAttachment, \"vertices\" | \"weights\">) =>\n att.weights ? att.weights.length : (att.vertices?.length ?? 0) / 2;\n\n/**\n * New local data so the attachment's vertices sit at `targetWorld` (flat, all vertices) under `skel`:\n * `vertices` \u2192 slot-bone local; `weights` \u2192 every influence's x,y re-expressed in its bone.\n *\n * @deprecated Not the way to MOVE a vertex \u2014 `deformOffsetsFor` plus `VertexGizmo.shift` is, and this has no\n * caller left in the project. Kept for a future \"normalize this attachment's vertices to these positions\", which\n * is what it actually is; every gesture that reached for it collapsed the per-bone spread instead.\n *\n * A skinned vertex's influences do not\n * generally agree on where it is (Spine's rarely do, and `blendInfluences` disagrees on purpose), and re-deriving\n * them all from one world point throws that spread away for a position that only matches in the pose `skel` is\n * in \u2014 measured at 489 px of animated drift on `ross`'s `n_fur` for a 0.01 px setup nudge.\n */\nexport function fitVertices(skel: Skeleton, att: VertexAttachment, targetWorld: number[]): VertexPatch {\n if (att.weights) {\n const inv = new Map<string, Affine>();\n const invOf = (id: string) => inv.get(id) ?? inv.set(id, invert(skel.bones.get(id)!.world)).get(id)!;\n return { weights: att.weights.map((list, i) => list.map(inf => { const [x, y] = apply(invOf(inf.bone), targetWorld[2 * i], targetWorld[2 * i + 1]); return { ...inf, x: round6(x), y: round6(y) }; })) };\n }\n const slot = skel.doc.slots.find(s => s.id === att.slot)!, inv = invert(skel.bones.get(slot.bone)!.world);\n const vertices: number[] = [];\n for (let i = 0; i < targetWorld.length; i += 2) { const [x, y] = apply(inv, targetWorld[i], targetWorld[i + 1]); vertices.push(round6(x), round6(y)); }\n return { vertices };\n}\n\n/** flat offset length for an attachment: 2\u00B7n unweighted, 2\u00B7\u03A3 influences weighted */\nexport const deformLength = (att: VertexAttachment) => att.weights ? 2 * att.weights.reduce((s, l) => s + l.length, 0) : (att.vertices?.length ?? 0);\n/** linear part of an inverse: map a world direction into a bone's local direction */\nconst localDelta = (world: Affine, dx: number, dy: number): [number, number] => { const m = invert(world); return [m.a * dx + m.c * dy, m.b * dx + m.d * dy]; };\n\n/** deform offsets (format of the `vertices` key) that move vertex `index` by `worldDelta`, starting from `base` (or zeros) */\nexport function deformOffsetsFor(skel: Skeleton, att: VertexAttachment, base: number[] | undefined, index: number, worldDelta: [number, number]): number[] {\n if (base && base.length !== deformLength(att)) throw new Error(`deformOffsetsFor: base.length (${base.length}) must equal deformLength(att) (${deformLength(att)})`);\n const out = base ? base.slice() : new Array(deformLength(att)).fill(0);\n if (att.weights) {\n let k = 0;\n for (let i = 0; i < index; i++) k += 2 * att.weights[i].length;\n for (const inf of att.weights[index]) { const [dx, dy] = localDelta(skel.bones.get(inf.bone)!.world, worldDelta[0], worldDelta[1]); out[k] = out[k] + dx; out[k + 1] = out[k + 1] + dy; k += 2; }\n } else {\n const slot = skel.doc.slots.find(s => s.id === att.slot)!;\n const [dx, dy] = localDelta(skel.bones.get(slot.bone)!.world, worldDelta[0], worldDelta[1]);\n out[2 * index] = out[2 * index] + dx; out[2 * index + 1] = out[2 * index + 1] + dy;\n }\n return out;\n}\n\nexport interface BrushOptions { bone: string; center: [number, number]; radius: number; strength: number; maxInfluences: number; slotBone: string }\n/**\n * Below this fraction a bone is pure noise: dropped instead of kept alive through renormalization. The falloff\n * `1 - d/radius` only reaches exactly 0 at `d === radius`, so a single \"remove everything\" stroke leaves a\n * residual of `d/radius` on a bone that was a vertex's sole influence (see the singleton branch below) \u2014 e.g.\n * at `radius: 1e6` a vertex 155px from the brush centre leaves a residual of ~1.55e-4. `1e-3` clears that with\n * margin while staying two orders of magnitude below any deliberately painted weight (the lightest weight any\n * test here paints is > 0.3); `1e-4` is tighter than the residual a single realistic-but-large stroke can\n * leave behind and would need a second stroke to clear it.\n */\nconst MIN_WEIGHT = 1e-3;\n/** add strength\u00B7(1 \u2212 d/radius) of `bone` to vertices within radius (negative strength removes), renormalize, keep top-K; a vertex left without influences gets the slot bone at 1 */\nexport function paintWeights(skel: Skeleton, att: MeshAttachment, world: number[], opts: BrushOptions): MeshAttachment {\n const lists = att.weights ?? att.vertices!.reduce<MeshAttachment[\"weights\"] & {}>((acc, _, i) => { if (i % 2 === 0) acc.push([{ bone: opts.slotBone, w: 1, x: att.vertices![i], y: att.vertices![i + 1] }]); return acc; }, []);\n const inv = new Map<string, Affine>();\n const local = (id: string, x: number, y: number) => apply(inv.get(id) ?? inv.set(id, invert(skel.bones.get(id)!.world)).get(id)!, x, y);\n const weights = lists.map((list, i) => {\n const x = world[2 * i], y = world[2 * i + 1], d = Math.hypot(x - opts.center[0], y - opts.center[1]);\n if (d >= opts.radius) return list;\n const f = opts.strength * (1 - d / opts.radius);\n const cur = list.find(l => l.bone === opts.bone)?.w ?? 0;\n const next = Math.max(0, Math.min(1, cur + f));\n if (next === cur) return list;\n let others = list.filter(l => l.bone !== opts.bone);\n // The stroke reduces `bone`'s weight and it's the vertex's only influence: there's nothing else to\n // redistribute into, so dividing the leftover by itself at the final normalize would snap it straight\n // back to 1 and the bone could never be removed. Give the weight it lost to the slot bone instead \u2014 the\n // mesh's rest position \u2014 unless `bone` already *is* the slot bone, in which case there's truly nothing\n // to hand the weight to and the stroke is a no-op (the last influence can't be removed).\n if (next < cur && others.length === 0) {\n if (opts.bone === opts.slotBone) return list;\n const [slx, sly] = local(opts.slotBone, x, y);\n others = [{ bone: opts.slotBone, x: round6(slx), y: round6(sly), w: 1 - next }];\n }\n const otherSum = others.reduce((s, l) => s + l.w, 0);\n const scale = otherSum > 1e-9 ? (1 - next) / otherSum : 0;\n let out = others.map(l => ({ ...l, w: l.w * scale }));\n if (next > MIN_WEIGHT) { const [lx, ly] = local(opts.bone, x, y); out.push({ bone: opts.bone, x: round6(lx), y: round6(ly), w: next }); }\n out = out.filter(l => l.w > MIN_WEIGHT).sort((a, b) => b.w - a.w).slice(0, opts.maxInfluences);\n const sum = out.reduce((s, l) => s + l.w, 0);\n if (!out.length || sum < MIN_WEIGHT) { const [lx, ly] = local(opts.slotBone, x, y); return [{ bone: opts.slotBone, x: round6(lx), y: round6(ly), w: 1 }]; }\n return out.map(l => ({ ...l, w: round6(l.w / sum) }));\n });\n const { vertices: _v, ...rest } = att;\n return { ...rest, weights };\n}\n", "/**\n * rig-path \u2014 pure geometry for path attachments: splitting a curve without changing its shape, blending\n * influence lists, curve lengths and hit-testing. Shared by the registry tools and the editor. No node:*, no DOM.\n *\n * Control-point layout, fixed by the format and verified against spine-core: vertex i*3+1 is anchor i, its\n * triple is [cPrev, p, cNext], and curve i runs p_i \u2192 cNext_i \u2192 cPrev_{i+1} \u2192 p_{i+1}. The index wrapping a\n * CLOSED path needs is taken from `samplePath` (rig-anim.ts) rather than derived again here: that sampler is\n * pinned against the spine-core runtime, so it is what these control points mean.\n */\nimport type { Pt } from \"./rig-constraints\";\nimport type { Influence } from \"./rig-format\";\nimport { MIN_AUTO_WEIGHT, round6 } from \"./rig-mesh\";\n\n/** flat [x, y, \u2026] \u2194 point pairs \u2014 the format stores flat arrays, the geometry below reads points */\nexport const toPoints = (flat: number[]): Pt[] => {\n const out: Pt[] = [];\n for (let i = 0; i + 1 < flat.length; i += 2) out.push([flat[i], flat[i + 1]]);\n return out;\n};\nexport const flatten = (pts: Pt[]): number[] => pts.flatMap(p => [p[0], p[1]]);\n\n/** anchors of a path: the vertices at 1, 4, 7, \u2026 (`vertexCount` counts POINTS, not numbers) */\nexport const anchorCount = (vertexCount: number): number => Math.floor(vertexCount / 3);\n/** curves of a path: one per anchor when closed (the last wraps), one fewer when open */\nexport const curveCount = (vertexCount: number, closed: boolean): number =>\n closed ? anchorCount(vertexCount) : anchorCount(vertexCount) - 1;\n\nconst lerp = (a: Pt, b: Pt, t: number): Pt => [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t];\n\n/** the four control points of curve `i` \u2014 p_i, cNext_i, cPrev_{i+1}, p_{i+1} \u2014 wrapped exactly as `samplePath` wraps them */\nfunction curveOf(worldPoints: number[], i: number): [Pt, Pt, Pt, Pt] {\n const n = worldPoints.length / 2;\n const at = (k: number): Pt => { const j = (k % n) * 2; return [worldPoints[j], worldPoints[j + 1]]; };\n return [at(i * 3 + 1), at(i * 3 + 2), at(i * 3 + 3), at(i * 3 + 4)];\n}\n\n/** point on the cubic bezier through p0..p3 at parameter t */\nexport function bezierPointAt(p0: Pt, p1: Pt, p2: Pt, p3: Pt, t: number): Pt {\n const u = 1 - t;\n return [\n u * u * u * p0[0] + 3 * u * u * t * p1[0] + 3 * u * t * t * p2[0] + t * t * t * p3[0],\n u * u * u * p0[1] + 3 * u * u * t * p1[1] + 3 * u * t * t * p2[1] + t * t * t * p3[1],\n ];\n}\n\n/** cubic bezier length, approximated by 8 chords (the curve bulges outward, so this runs a few % longer than the straight p0\u2192p3 chord) */\nexport function bezierLength(p0: Pt, p1: Pt, p2: Pt, p3: Pt, chords = 8): number {\n let len = 0, prev = p0;\n for (let k = 1; k <= chords; k++) {\n const pt = bezierPointAt(p0, p1, p2, p3, k / chords);\n len += Math.hypot(pt[0] - prev[0], pt[1] - prev[1]);\n prev = pt;\n }\n return len;\n}\n\n/** the point of curve `i` at parameter `t`, in whatever space `worldPoints` are given in (same wrapping as `samplePath`) */\nexport const pathPointAt = (worldPoints: number[], i: number, t: number): Pt => bezierPointAt(...curveOf(worldPoints, i), t);\n\n/**\n * Cumulative curve lengths of a path in the space its points are given in \u2014 one entry per curve, which is the\n * convention `pathFromPoints` writes. (A Spine-imported OPEN path carries one entry more; `pathLength` reads\n * `lengths` by curve index, so shortening to one-per-curve loses nothing, and with `constantSpeed` on the\n * runtime measures the posed curve and never reads these at all.)\n */\nexport function curveLengths(worldPoints: number[], closed: boolean): number[] {\n const out: number[] = [];\n let acc = 0;\n for (let i = 0, n = curveCount(worldPoints.length / 2, closed); i < n; i++) {\n const [p0, c1, c2, p3] = curveOf(worldPoints, i);\n acc += bezierLength(p0, c1, c2, p3);\n out.push(round6(acc));\n }\n return out;\n}\n\n/**\n * De Casteljau split of curve `i` at `t`: the five control points the split changes or adds, in world space.\n * The two halves p0 \u2192 a \u2192 d \u2192 f and f \u2192 e \u2192 c \u2192 p3 are, together, the ORIGINAL curve \u2014 exactly, not to some\n * tolerance \u2014 so inserting an anchor this way moves nothing that was already drawn.\n *\n * `coeffs` are the affine coefficients of those five points over the curve's own four control points\n * `[p_i, cNext_i, cPrev_{i+1}, p_{i+1}]`, in the order `[cNextI, triple[0], triple[1], triple[2], cPrevNext]`.\n * Each row sums to 1 and is non-negative for t in (0, 1), so a WEIGHTED path can rebuild the five influence\n * lists from the four it already has (`blendInfluences`) and stay skinned to the same bones.\n */\nexport function splitCurve(worldPoints: number[], closed: boolean, i: number, t: number):\n { cNextI: Pt; triple: [Pt, Pt, Pt]; cPrevNext: Pt; coeffs: number[][] } {\n const n = curveCount(worldPoints.length / 2, closed);\n if (!Number.isInteger(i) || i < 0 || i >= n) throw new Error(`splitCurve: curve ${i} is out of range (${n} curves)`);\n const [p0, c1, c2, p3] = curveOf(worldPoints, i);\n const a = lerp(p0, c1, t), b = lerp(c1, c2, t), c = lerp(c2, p3, t);\n const d = lerp(a, b, t), e = lerp(b, c, t), f = lerp(d, e, t);\n // curve i becomes p0 \u2192 a \u2192 d \u2192 f, then f \u2192 e \u2192 c \u2192 p3: the union is the original curve, exactly\n return { cNextI: a, triple: [d, f, e], cPrevNext: c, coeffs: [\n [1 - t, t, 0, 0], // a\n [(1 - t) ** 2, 2 * t * (1 - t), t * t, 0], // d\n [(1 - t) ** 3, 3 * t * (1 - t) ** 2, 3 * t * t * (1 - t), t ** 3], // f\n [0, (1 - t) ** 2, 2 * t * (1 - t), t * t], // e\n [0, 0, 1 - t, t], // c\n ] };\n}\n\n/**\n * Apply a `splitCurve` to a list with ONE ENTRY PER CONTROL POINT: `cNext_i` and `cPrev_{i+1}` are replaced\n * (the split moves them) and the new anchor's `[cPrev, p, cNext]` triple goes in between. The point array, the\n * local `vertices` and the `weights` lists are all this shape and must stay in step, so they share this.\n * On a closed path the last curve's `cPrev_{i+1}` is entry 0 and the triple appends at the end \u2014 the same\n * wrapping `curveOf` reads the curve with.\n */\nexport function insertTriple<T>(items: T[], i: number, cNextI: T, triple: [T, T, T], cPrevNext: T): T[] {\n const n = items.length;\n const out = items.slice();\n out[(i * 3 + 2) % n] = cNextI;\n out[(i * 3 + 3) % n] = cPrevNext;\n out.splice(i * 3 + 3, 0, ...triple); // not wrapped: on the last curve of a closed path this appends\n return out;\n}\n\n/** drop anchor `i`'s whole `[cPrev, p, cNext]` triple from a per-control-point list */\nexport function removeTriple<T>(items: T[], i: number): T[] {\n const out = items.slice();\n out.splice(i * 3, 3);\n return out;\n}\n\n/**\n * Blend skinned control points by affine coefficients: the WHOLE influence list, positions included.\n *\n * Under linear blend skinning a control point sits at `P_k = \u03A3_j w_kj \u00B7 W_j(q_kj)`, so the affine combination\n * `P' = \u03A3_k c_k \u00B7 P_k` expands \u2014 every bone matrix `W_j` being affine \u2014 into a control point of the same form:\n *\n * w'_j = \u03A3_k c_k \u00B7 w_kj q'_j = \u03A3_k c_k \u00B7 w_kj \u00B7 q_kj / w'_j\n *\n * That is an identity in the bone matrices, so the blended point follows `P'` in EVERY pose, which is the only\n * thing worth having: a split anchor that is right at rest and wrong the moment the bones move has preserved\n * nothing. Mapping the blended WORLD point back through each bone's inverse instead \u2014 what `fitVertices` does,\n * correctly, for its own job of fitting existing influences to one target position \u2014 agrees with this only\n * where the bones stand in their setup pose. On ross's posed tail that route drifts by ~50 px.\n *\n * `coeffs` must sum to 1 (affine, not linear) and each source list must already be normalized.\n */\nexport function blendInfluences(sources: Influence[][], coeffs: number[]): Influence[] {\n if (sources.length !== coeffs.length) throw new Error(`blendInfluences: ${sources.length} source lists but ${coeffs.length} coefficients`);\n const acc = new Map<string, { x: number; y: number; w: number }>();\n sources.forEach((list, k) => {\n for (const inf of list) {\n const a = acc.get(inf.bone) ?? acc.set(inf.bone, { x: 0, y: 0, w: 0 }).get(inf.bone)!;\n const cw = coeffs[k] * inf.w;\n a.x += cw * inf.x; a.y += cw * inf.y; a.w += cw;\n }\n });\n const total = [...acc.values()].reduce((s, a) => s + a.w, 0);\n if (!(total > 0)) throw new Error(\"blendInfluences: the blended weights sum to zero\");\n // below MIN_AUTO_WEIGHT a bone rounds to 0 in the file anyway \u2014 a dead influence, not a share of the point\n const kept = [...acc].filter(([, a]) => a.w / total >= MIN_AUTO_WEIGHT);\n const sum = kept.reduce((s, [, a]) => s + a.w, 0);\n // the position divides by the bone's OWN unnormalized share \u2014 the same `\u03A3 c\u00B7w` that accumulated its numerator.\n // Only the weight is renormalized, and only when the filter above dropped a bone (otherwise `sum` is already 1).\n return kept.map(([bone, a]) => ({ bone, x: round6(a.x / a.w), y: round6(a.y / a.w), w: round6(a.w / sum) }));\n}\n\n/**\n * The DEFORM OFFSETS of a blended control point \u2014 the same `\u03A3 c\u00B7w\u00B7d / w'` its rest positions get, and for the\n * same reason. An offset adds to the stored position INSIDE each bone's frame (`attachmentWorldVertices` poses\n * `q_kj + d_kj`), so a deformed control point is `\u03A3_j w_kj \u00B7 W_j(q_kj + d_kj)`; running the derivation in\n * `blendInfluences` over that instead of over `q` alone gives back the very same identity with `q + d` in place\n * of `q`, and subtracting the rest half leaves `d'_j = \u03A3_k c_k\u00B7w_kj\u00B7d_kj / w'_j`. The blended anchor therefore\n * sits on the DEFORMED curve in every pose exactly as its rest position sits on the rest curve \u2014 and, the blend\n * being linear in `d`, at every time between two keys as well, not only on them.\n *\n * `sources` are the same four influence lists the positions blend from and `chunks` their offset pairs in the\n * same order, so the result is aligned to `blendInfluences(sources, coeffs)` influence for influence: the weights\n * decide which bones survive and in what order, and they are identical in both calls.\n */\nexport function blendOffsets(sources: Influence[][], chunks: number[][], coeffs: number[]): number[] {\n const asOffsets = sources.map((list, k) => list.map((inf, j) => ({ ...inf, x: chunks[k][2 * j] ?? 0, y: chunks[k][2 * j + 1] ?? 0 })));\n return blendInfluences(asOffsets, coeffs).flatMap(i => [i.x, i.y]);\n}\n\n/** the same blend for an UNWEIGHTED path, where a control point is one pair in the slot bone's space */\nexport const blendPairs = (chunks: number[][], coeffs: number[]): number[] =>\n [0, 1].map(c => round6(coeffs.reduce((sum, k, i) => sum + k * (chunks[i][c] ?? 0), 0)));\n\n/** golden ratio conjugate: each round of the search below keeps 61.8% of the bracket and one of its two probes */\nconst PHI = (Math.sqrt(5) - 1) / 2;\n\n/**\n * Nearest point on the POSED curve: which curve, its parameter, and the world distance \u2014 so the caller can\n * apply its own pick threshold (a click far from the curve is a miss, not a very bad hit).\n * 16 samples per curve locate the minimum, then 8 rounds of golden-section refine it inside the bracket its\n * two neighbours make \u2014 down to ~1/350 of a curve, well under a pixel on any curve a user can see.\n */\nexport function nearestOnPath(worldPoints: number[], closed: boolean, p: Pt): { curve: number; t: number; d: number } {\n const n = curveCount(worldPoints.length / 2, closed);\n if (n < 1) { // a single anchor is not a curve; the anchor itself is the answer\n const [x, y] = worldPoints.length >= 4 ? [worldPoints[2], worldPoints[3]] : [0, 0];\n return { curve: 0, t: 0, d: Math.hypot(x - p[0], y - p[1]) };\n }\n const SAMPLES = 16;\n let best = { curve: 0, t: 0, d2: Infinity };\n for (let i = 0; i < n; i++) {\n const [p0, c1, c2, p3] = curveOf(worldPoints, i);\n const at = (t: number) => { const q = bezierPointAt(p0, c1, c2, p3, t); return (q[0] - p[0]) ** 2 + (q[1] - p[1]) ** 2; };\n let k = 0, kd = Infinity;\n for (let s = 0; s < SAMPLES; s++) { const d2 = at(s / (SAMPLES - 1)); if (d2 < kd) { kd = d2; k = s; } }\n // bracket the sampled minimum with its neighbours, then squeeze it\n let lo = Math.max(0, (k - 1) / (SAMPLES - 1)), hi = Math.min(1, (k + 1) / (SAMPLES - 1));\n let c = hi - PHI * (hi - lo), d = lo + PHI * (hi - lo), fc = at(c), fd = at(d);\n for (let r = 0; r < 8; r++) {\n if (fc < fd) { hi = d; d = c; fd = fc; c = hi - PHI * (hi - lo); fc = at(c); }\n else { lo = c; c = d; fc = fd; d = lo + PHI * (hi - lo); fd = at(d); }\n }\n const t = fc < fd ? c : d, d2 = Math.min(fc, fd, kd);\n if (d2 < best.d2) best = { curve: i, t: d2 === kd ? k / (SAMPLES - 1) : t, d2 };\n }\n return { curve: best.curve, t: best.t, d: Math.sqrt(best.d2) };\n}\n", "/**\n * rig-constraints \u2014 pure helpers for authoring constraints: which bones a constraint drives, the 1\u20132 bone chain\n * behind a limb, the bend sign that reproduces a pose, IK reach, and path geometry from anchor points.\n * The solvers themselves live in rig-anim.ts and are not touched here. No node:*, no DOM.\n */\nimport { MIX_PROPS, type RigDocument, type IkConstraint } from \"./rig-format\";\nimport { apply, invert, pk, type Pose, type Skeleton } from \"./rig-anim\";\nimport { curveLengths, flatten } from \"./rig-path\";\n\nexport type Pt = [number, number];\n\n/** bone id \u2192 ids of the constraints that write that bone, in the order the solver applies them */\nexport function drivenBones(doc: RigDocument): Map<string, string[]> {\n const out = new Map<string, string[]>();\n const add = (bone: string, id: string) => (out.get(bone) ?? out.set(bone, []).get(bone)!).push(id);\n // constraints, in document order (ties broken by array order) \u2014 mirrors the sort in evaluate() (rig-anim.ts)\n const all: { order: number; id: string; bones: string[] }[] = [\n ...doc.ik.map(c => ({ order: c.order, id: c.id, bones: c.bones })),\n ...doc.transform.map(c => ({ order: c.order, id: c.id, bones: c.bones })),\n ...doc.path.map(c => ({ order: c.order, id: c.id, bones: c.bones })),\n ].sort((a, b) => a.order - b.order);\n for (const c of all) for (const b of c.bones) add(b, c.id);\n return out;\n}\n\n/**\n * A constraint's property at one moment: the keyed value, else the document's. That is the read the solvers make\n * to decide whether they run at all (`cnum` in rig-anim.ts), so anything asking \"is this constraint live here?\"\n * has to make the same one \u2014 hence one exported copy rather than a fourth private one.\n */\nexport const mixAt = (pose: Pose, kind: string, id: string, prop: string, rest: number): number => {\n const v = pose.get(pk(kind, id, prop));\n return typeof v === \"number\" ? v : rest;\n};\n\n/**\n * The constraint that owns a bone's transform in this pose, or undefined when the bone is really editable there.\n * The LAST constraint in solver order wins (it writes last), and one counts only while it is actually mixed IN \u2014\n * the solvers' own early-outs, listed once in `MIX_PROPS`. A mixed-out constraint therefore blocks nothing: at\n * that frame the solver skips it and whatever wrote before it stands.\n * `Stage.driverOf` forwards to this function over the editor's own pose signal \u2014 there is no second copy left.\n */\nexport function driverAt(doc: RigDocument, pose: Pose, bone: string): { kind: \"ik\" | \"transform\" | \"path\"; id: string; target: string } | undefined {\n const ids = drivenBones(doc).get(bone);\n for (let i = (ids?.length ?? 0) - 1; i >= 0; i--) {\n const id = ids![i];\n const ik = doc.ik.find(c => c.id === id);\n if (ik) {\n if (mixAt(pose, \"ik\", id, \"mix\", ik.mix) > 0) return { kind: \"ik\", id, target: ik.target };\n continue;\n }\n const tc = doc.transform.find(c => c.id === id);\n if (tc) {\n if (MIX_PROPS.transform.some(m => mixAt(pose, \"transform\", id, m, tc[m]) !== 0)) return { kind: \"transform\", id, target: tc.target };\n continue;\n }\n const pc = doc.path.find(c => c.id === id);\n if (pc && MIX_PROPS.path.some(m => mixAt(pose, \"path\", id, m, pc[m]) !== 0)) return { kind: \"path\", id, target: pc.target };\n }\n return undefined;\n}\n\n/** [parent, bone] when the parent has exactly one child (an unambiguous limb), else [bone] */\nexport function ikChainFor(doc: RigDocument, bone: string): string[] {\n const b = doc.bones.find(x => x.id === bone);\n if (!b) throw new Error(`unknown bone \"${bone}\"`);\n if (!b.parent) throw new Error(`bone \"${bone}\" is a root: an IK chain needs one or two bones with a parent`);\n const siblings = doc.bones.filter(x => x.parent === b.parent);\n return siblings.length === 1 ? [b.parent, bone] : [bone];\n}\n\n/** world point at the far end of the chain's last bone (its `length` along its x axis) */\nexport function chainEnd(skel: Skeleton, chain: string[]): Pt {\n const last = chain[chain.length - 1];\n const st = skel.bones.get(last);\n if (!st) throw new Error(`unknown bone \"${last}\"`);\n const len = skel.doc.bones.find(b => b.id === last)!.length;\n return apply(st.world, len, 0);\n}\n\n/**\n * `bendPositive` for a two-bone chain: the sign of the cross product of the chain's two segments as they are posed\n * now \u2014 parent origin \u2192 child origin, then child origin \u2192 the chain's tip. That is the triangle the two-bone solver\n * works in (`bendDir` picks which side of it the joint falls on), so the sign matches it even when the parent is\n * sheared or its child hangs off its x axis, where \"the parent's x axis\" would not.\n * A straight chain (cross \u2248 0) answers `true`, matching Spine's default.\n * A chain whose last bone has `length: 0` has no measurable bend either (the tip coincides with the bone's own\n * origin, so the cross product is always exactly 0) and likewise answers `true`.\n */\nexport function bendSignFor(skel: Skeleton, chain: string[]): boolean {\n if (chain.length < 2) return true;\n const p = skel.bones.get(chain[0])!.world, c = skel.bones.get(chain[1])!.world;\n const tip = chainEnd(skel, chain);\n const cross = (c.tx - p.tx) * (tip[1] - c.ty) - (c.ty - p.ty) * (tip[0] - c.tx);\n return cross >= 0;\n}\n\n/** distance from the chain root to the target and the chain's maximum reach, both in world px */\nexport function ikReach(skel: Skeleton, c: IkConstraint): { distance: number; reach: number } {\n const root = skel.bones.get(c.bones[0])!.world;\n const target = skel.bones.get(c.target)!.world;\n let reach = 0;\n for (const id of c.bones) {\n const st = skel.bones.get(id)!, len = skel.doc.bones.find(b => b.id === id)!.length;\n reach += len * Math.hypot(st.world.a, st.world.b);\n }\n return { distance: Math.hypot(target.tx - root.tx, target.ty - root.ty), reach };\n}\n\n/** anchor points of a path attachment in document space (every third vertex, starting at index 1) */\nexport const pathAnchors = (world: number[]): Pt[] => {\n const out: Pt[] = [];\n for (let i = 1; i * 2 + 1 < world.length; i += 3) out.push([world[i * 2], world[i * 2 + 1]]);\n return out;\n};\n\nconst r6 = (v: number) => +v.toFixed(6) + 0;\n\n/**\n * Anchor points \u2192 the format's `[cPrev, anchor, cNext]` triples. Control points come from Catmull-Rom tangents\n * ((next \u2212 prev) / 6), which makes the curve pass through every anchor with C1 continuity; the ends of an open\n * path use the single available neighbour. Coordinates are converted into the slot bone's space.\n */\nexport function pathFromPoints(skel: Skeleton, slotId: string, points: Pt[], closed: boolean): { vertices: number[]; closed: boolean; lengths: number[] } {\n if (points.length < 2) throw new Error(\"a path needs at least two points\");\n if (closed && points.length < 3) throw new Error(\"a closed path needs at least three points\");\n const slot = skel.doc.slots.find(s => s.id === slotId);\n if (!slot) throw new Error(`unknown slot \"${slotId}\"`);\n const inv = invert(skel.bones.get(slot.bone)!.world);\n const n = points.length;\n const at = (i: number): Pt => points[closed ? (i + n) % n : Math.max(0, Math.min(n - 1, i))];\n // Catmull-Rom control points in document (world) space, one [cPrev, anchor, cNext] triple per anchor\n const ctrl: [Pt, Pt, Pt][] = [];\n for (let i = 0; i < n; i++) {\n const prev = at(i - 1), cur = points[i], next = at(i + 1);\n const tx = (next[0] - prev[0]) / 6, ty = (next[1] - prev[1]) / 6;\n ctrl.push([[cur[0] - tx, cur[1] - ty], cur, [cur[0] + tx, cur[1] + ty]]);\n }\n const vertices: number[] = [];\n for (const triple of ctrl) for (const [x, y] of triple) { const [lx, ly] = apply(inv, x, y); vertices.push(r6(lx), r6(ly)); }\n // curve lengths are measured by the runtime when constantSpeed is on; store an accurate estimate (sampling the\n // actual bezier, not the straight anchor-to-anchor chord) so a non-constant-speed path still tracks correctly.\n // Measured in DOCUMENT space, on the control points before they were folded into the slot bone \u2014 the runtime\n // samples the posed curve, and a scaled slot bone would otherwise store lengths in the wrong unit.\n return { vertices, closed, lengths: curveLengths(flatten(ctrl.flat()), closed) };\n}\n", "/**\n * rig-tools v0 \u2014 pure operations over RigDocument. No UI, no MCP; both sit on top of this.\n * Every op returns a NEW document (undo-friendly, MCP-friendly).\n */\nimport { RigSchema, Attachment as AttachmentSchema, IkConstraint as IkSchema, TransformConstraint as TransformSchema, PathConstraint as PathSchema, validate, ID_RE,\n type RigDocument, type Bone, type Slot, type Track, type Attachment, type RegionAttachment, type MeshAttachment, type PathAttachment, type Influence, type Animation, type Reference, type Asset } from \"./rig-format\";\nimport { restValue, pk, affineOf, mul, apply, invert, evaluate, attachmentWorldVertices, regionSize, poseOf, decompose, slotOutline, type EaseSpec, type Skeleton, type Pose } from \"./rig-anim\";\nimport { ikChainFor, chainEnd, bendSignFor, driverAt, pathFromPoints, type Pt } from \"./rig-constraints\";\nimport { deformLength, round6, vertexCount } from \"./rig-mesh\";\nimport { anchorCount, blendInfluences, blendOffsets, blendPairs, curveLengths, flatten, insertTriple, removeTriple, splitCurve, toPoints } from \"./rig-path\";\n\ntype Doc = RigDocument;\ntype Key = Track[\"keys\"][number];\ntype Transform = Bone[\"transform\"];\n/** patches may give any subset of transform fields; `parent: null` detaches the bone (makes it a root) */\nexport type BonePatch = Partial<Omit<Bone, \"id\" | \"transform\" | \"parent\">> & { parent?: string | null; transform?: Partial<Transform> };\nexport type SlotPatch = Partial<Omit<Slot, \"id\">>;\nexport type KeyInput = Omit<Key, \"ease\"> & { ease?: Key[\"ease\"] };\n/** region placement: image centre in the slot bone's space */\nexport type RegionPlacement = { x?: number; y?: number; rotation?: number; scaleX?: number; scaleY?: number; width?: number; height?: number };\n\n// ---------- create ----------\n\nexport function createDoc(name: string, width: number, height: number, notes?: string): Doc {\n return RigSchema.parse({\n format: \"energy8.rig\", version: 2,\n meta: { name, width, height, notes },\n assets: [],\n // root at bottom-center: bounce/scale presets pivot around the feet\n bones: [{ id: \"root\", transform: { x: width / 2, y: height }, role: \"root\" }],\n slots: [], animations: [],\n });\n}\n\n/** One image as a rig: canvas = image + margin on every side, root at the image's bottom centre, slot pivot (0.5, 1). */\nexport function createSymbol(name: string, asset: { id?: string; src: string; width: number; height: number }, margin = 0.15, notes?: string): Doc {\n const mx = Math.ceil(asset.width * margin), my = Math.ceil(asset.height * margin);\n const width = asset.width + 2 * mx, height = asset.height + 2 * my;\n const fromFile = asset.src.replace(/^.*\\//, \"\").replace(/\\.[^.]+$/, \"\").toLowerCase().replace(/[^a-z0-9_]/g, \"_\").replace(/^[^a-z]+/, \"\");\n const id = asset.id ?? (fromFile || name);\n let doc = createDoc(name, width, height, notes);\n doc = { ...doc, bones: [{ ...doc.bones[0], transform: { ...doc.bones[0].transform, x: width / 2, y: height - my } }] };\n doc = { ...doc, assets: [RigSchema.shape.assets.element.parse({ id, src: asset.src, width: asset.width, height: asset.height })] };\n doc = setSlot(doc, { id, bone: \"root\" });\n // the image hangs from the root (its bottom centre): the centre is half a height above\n doc = setAttachment(doc, { id, slot: id, asset: id, y: -asset.height / 2 });\n return setSlot(doc, { id, attachment: id });\n}\n\n/** Swap a layer's file (e.g. after regeneration). Pivots are fractions, so slots keep working; provenance is merged. */\nexport function replaceAsset(doc: Doc, id: string, next: { src: string; width: number; height: number; prompt?: string; sourceImage?: string; inpainted?: boolean; bbox?: [number, number, number, number] }): Doc {\n const cur = doc.assets.find(a => a.id === id);\n if (!cur) throw new Error(`unknown asset \"${id}\"`);\n const { src, width, height, ...origin } = next;\n const asset = RigSchema.shape.assets.element.parse({ ...cur, src, width, height, frame: undefined, rotate: 0, trim: undefined,\n origin: { ...cur.origin, ...Object.fromEntries(Object.entries(origin).filter(([, v]) => v !== undefined)) } });\n // keep the point that sat at each region's pivot fraction in place when the image size changes\n const attachments = doc.attachments.map(a => {\n if (a.type !== \"region\" || a.asset !== id || (cur.width === width && cur.height === height)) return a;\n const px = 0.5 - a.x / cur.width, py = 0.5 - a.y / cur.height;\n return { ...a, x: +((0.5 - px) * width).toFixed(4) + 0, y: +((0.5 - py) * height).toFixed(4) + 0 };\n });\n return { ...doc, assets: doc.assets.map(a => (a.id === id ? asset : a)), attachments };\n}\n\n// ---------- assets ----------\n\nexport type AssetPatch = { src?: string; width?: number; height?: number; frame?: [number, number, number, number] | null; origin?: Asset[\"origin\"] };\nconst round4 = (v: number) => +v.toFixed(4) + 0;\n/** the centre of what an asset shows, in the pixels of its source image */\nconst sourceCentre = (a: { width: number; height: number; frame?: [number, number, number, number] }): [number, number] =>\n a.frame ? [a.frame[0] + a.frame[2] / 2, a.frame[1] + a.frame[3] / 2] : [a.width / 2, a.height / 2];\n\n/**\n * Create or patch an asset. `image` is the size of the PNG `src` names (the caller reads it \u2014 this module cannot\n * read files); a `frame` must fit inside it. Size is only derived from `frame`/`image` when this patch actually\n * REFRAMES (a `frame` or `src` was given) \u2014 with a frame the asset's size IS the frame's, without one it's the\n * image's; an unrelated patch (e.g. `origin` only) leaves the current width/height alone, since for a packed\n * atlas asset (rotate/trim) the frame's [w, h] is the packed size, not the true one `width`/`height` store.\n * Re-framing an asset that regions already show keeps the SOURCE pixel that sat under each image centre\n * where it was drawn (spec \u00A73): the old centre lands at (u, v) of the new frame, so each placement moves by\n * \u2212L\u00B7(u, v) in its own rotated, scaled frame. A mesh keeps its uvs \u2014 they index the old pixels \u2014 and is named\n * in `notes` so the caller re-traces it. Only a frame or src change resets `rotate`/`trim` (packer fields).\n */\nexport function setAsset(doc: Doc, id: string, patch: AssetPatch, image?: { width: number; height: number }): { doc: Doc; notes: string[] } {\n const cur = doc.assets.find(a => a.id === id);\n if (!cur && !patch.src) throw new Error(`asset \"${id}\" does not exist \u2014 creating one needs src`);\n // a `src` restated as its own current value is not a source change: it must not skip the shift guard below,\n // nor (on a packed atlas asset) reset rotate/trim/width/height as if the image had actually been swapped\n const srcChanged = patch.src !== undefined && patch.src !== cur?.src;\n const reframed = patch.frame !== undefined || srcChanged;\n const frame = patch.frame === undefined ? cur?.frame : patch.frame ?? undefined;\n if (frame) {\n const [fx, fy, fw, fh] = frame;\n if (!frame.every(Number.isInteger) || fw < 1 || fh < 1 || fx < 0 || fy < 0) throw new Error(`asset \"${id}\": frame must be [x, y, w, h] integers with w, h \u2265 1`);\n if (image && (fx + fw > image.width || fy + fh > image.height)) throw new Error(`asset \"${id}\": frame [${frame.join(\", \")}] is outside the ${image.width}x${image.height} image`);\n }\n const size = reframed && frame ? { width: frame[2], height: frame[3] }\n : reframed && image ? image\n : { width: patch.width ?? cur?.width ?? image?.width, height: patch.height ?? cur?.height ?? image?.height };\n const next = RigSchema.shape.assets.element.parse({\n ...cur, id, src: patch.src ?? cur!.src, ...size, frame,\n ...(reframed ? { rotate: 0, trim: undefined } : {}),\n ...(patch.origin ? { origin: patch.origin } : {}),\n });\n const notes: string[] = [];\n let attachments = doc.attachments;\n if (cur && patch.frame !== undefined && !srcChanged) {\n const [ox, oy] = sourceCentre(cur), [nx, ny] = sourceCentre(next);\n const u = ox - nx, v = oy - ny;\n attachments = doc.attachments.map(a => {\n if (a.type === \"path\" || a.asset !== id) return a;\n if (a.type === \"mesh\") { notes.push(`mesh \"${a.id}\" keeps its uvs \u2014 re-trace it (rig_mesh_from_image) for the new frame`); return a; }\n const L = affineOf(0, 0, a.rotation, a.scaleX, a.scaleY);\n return { ...a, x: round4(a.x - (L.a * u + L.c * v)), y: round4(a.y - (L.b * u + L.d * v)) };\n });\n }\n return { doc: { ...doc, assets: cur ? doc.assets.map(a => (a.id === id ? next : a)) : [...doc.assets, next], attachments }, notes };\n}\n\nexport function removeAsset(doc: Doc, id: string): Doc {\n if (!doc.assets.some(a => a.id === id)) throw new Error(`unknown asset \"${id}\"`);\n const users = doc.attachments.filter(a => a.type !== \"path\" && a.asset === id).map(a => a.id);\n if (users.length) throw new Error(`asset \"${id}\" is shown by ${users.map(u => `\"${u}\"`).join(\", \")} \u2014 remove those attachments first`);\n return { ...doc, assets: doc.assets.filter(a => a.id !== id) };\n}\n\n/**\n * One mutation for \"this picture on that bone, here\": the slot (`slot ?? asset`, created on `bone` when missing \u2014\n * an existing slot keeps its own bone), a region attachment named like the asset with its centre at the DOCUMENT\n * point (x, y) expressed in the slot bone's rest frame, and the slot showing it.\n */\nexport function placeAsset(doc: Doc, p: { asset: string; bone: string; x: number; y: number; slot?: string; z?: number }): Doc {\n if (!doc.assets.some(a => a.id === p.asset)) throw new Error(`unknown asset \"${p.asset}\"`);\n if (doc.attachments.some(a => a.id === p.asset)) throw new Error(`attachment \"${p.asset}\" already exists \u2014 the asset is placed; move it with rig_set_attachment`);\n const slotId = p.slot ?? p.asset;\n const cur = doc.slots.find(s => s.id === slotId);\n const boneId = cur?.bone ?? p.bone;\n const world = evaluate(doc, new Map()).bones.get(boneId)?.world;\n if (!world) throw new Error(`unknown bone \"${boneId}\"`);\n const z = p.z ?? cur?.z ?? (doc.slots.length ? Math.max(...doc.slots.map(s => s.z)) + 1 : 0);\n let next = cur ? doc : setSlot(doc, { id: slotId, bone: boneId, z });\n const [lx, ly] = apply(invert(world), p.x, p.y);\n next = setAttachment(next, { id: p.asset, slot: slotId, asset: p.asset, x: round4(lx), y: round4(ly) });\n return setSlot(next, { id: slotId, attachment: p.asset, ...(p.z !== undefined ? { z: p.z } : {}) });\n}\n\n/** Parts-first regeneration prompt for one layer: style anchor + provenance + rig context + chroma-key rules. */\nexport function layerPrompt(doc: Doc, assetId: string): string {\n const a = doc.assets.find(a => a.id === assetId);\n if (!a) throw new Error(`unknown asset \"${assetId}\"`);\n const att = doc.attachments.find(a => a.type !== \"path\" && a.asset === assetId);\n const slot = att ? doc.slots.find(s => s.id === att.slot) : doc.slots.find(s => s.id === assetId);\n const bone = slot && doc.bones.find(b => b.id === slot.bone);\n const children = bone ? doc.bones.filter(b => b.parent === bone.id).map(b => b.id) : [];\n const lines = [\n `Use case: isolated 2D cut-out rig part \"${a.id}\" for the character/symbol \"${doc.meta.name}\".`,\n `Style: ${doc.meta.notes ? doc.meta.notes + \". \" : \"\"}Match the existing layers exactly \u2014 same medium, line weight, palette, light direction.`,\n `Part: ${a.origin?.prompt ?? a.id}.`,\n `Size: ${a.width}\u00D7${a.height} px at source scale${a.origin?.bbox ? ` (source bbox [${a.origin.bbox.join(\", \")}])` : \"\"}; keep the same silhouette registration` +\n (att && att.type === \"region\" ? ` so the image centre stays at (${+att.x.toFixed(1)}, ${+att.y.toFixed(1)}) from the joint.` : \".\"),\n bone ? `Rig context: attached to bone \"${bone.id}\"${bone.parent ? `, parent \"${bone.parent}\"` : \"\"}${children.length ? `; child parts: ${children.join(\", \")}` : \"\"}.` : \"Rig context: not attached yet.\",\n \"Add about 20 px (source scale) of overlap beyond every joint end so rotation cannot expose a cut.\",\n \"Composition: orthographic front view, one connected opaque part only, same orientation as the current layer, centred with generous padding, no foreshortening.\",\n \"Backdrop: perfectly flat uniform #00FF00 chroma-key background with no gradient, floor, shadow, text or watermark; do not use #00FF00 inside the part.\",\n ];\n return lines.join(\"\\n\");\n}\n\n// ---------- meta ----------\n\nexport type MetaPatch = { name?: string; width?: number; height?: number; notes?: string; reference?: (Partial<Omit<Reference, 'src'>> & { src: string }) | null };\n\n/**\n * Patch the document's meta. Resizing the canvas moves nothing \u2014 bones keep their document coordinates, only the\n * bounds change. `reference: null` clears the editor's underlay; a reference `src` has to stay inside the rig's\n * directory, since that is the only place the editor server serves images from.\n */\nexport function setMeta(doc: Doc, patch: MetaPatch): Doc {\n const { reference, ...rest } = patch;\n if (reference && (/^([a-zA-Z]:)?[\\\\/]/.test(reference.src) || /(^|[\\\\/])\\.\\.([\\\\/]|$)/.test(reference.src))) {\n throw new Error(`reference.src must be a relative path inside the rig's directory (got \"${reference.src}\")`);\n }\n const meta = RigSchema.shape.meta.parse({ ...doc.meta, ...rest, ...(reference === undefined ? {} : { reference: reference ?? undefined }) });\n return { ...doc, meta };\n}\n\n// ---------- bones ----------\n\nexport function addBone(doc: Doc, bone: BonePatch & { id: string }): Doc {\n if (doc.bones.some(b => b.id === bone.id)) throw new Error(`bone \"${bone.id}\" exists`);\n const parent = bone.parent ?? doc.bones.find(b => !b.parent)!.id;\n const b = RigSchema.shape.bones.element.parse({ ...bone, parent: bone.id === parent ? undefined : parent });\n return { ...doc, bones: [...doc.bones, b] };\n}\n\nexport function updateBone(doc: Doc, id: string, patch: BonePatch): Doc {\n const i = doc.bones.findIndex(b => b.id === id);\n if (i < 0) throw new Error(`unknown bone \"${id}\"`);\n const cur = doc.bones[i];\n // `parent: null` detaches the bone into a root of its own (the format allows several roots \u2014 `validate` only\n // asks for at least one); an absent `parent` leaves the current one alone, like every other field\n const { parent, ...rest } = patch;\n const next = RigSchema.shape.bones.element.parse({ ...cur, ...rest, transform: { ...cur.transform, ...patch.transform },\n ...(parent === undefined ? {} : { parent: parent ?? undefined }) });\n return { ...doc, bones: doc.bones.map((b, j) => (j === i ? next : b)) };\n}\n\n/** `approx` is the largest of its re-bound slots' (see `rebindSlot`), 0 when every re-expression was exact. */\nexport function removeBone(doc: Doc, id: string): { doc: Doc; approx: number } {\n const bone = doc.bones.find(b => b.id === id);\n if (!bone) throw new Error(`unknown bone \"${id}\"`);\n if (!bone.parent) throw new Error(\"cannot remove root\");\n let approx = 0;\n for (const s of doc.slots) if (s.bone === id) { const r = rebindSlot(doc, s.id, bone.parent); doc = r.doc; approx = Math.max(approx, r.approx); } // images stay put\n return {\n doc: {\n ...doc,\n bones: doc.bones.filter(b => b.id !== id).map(b => (b.parent === id ? { ...b, parent: bone.parent } : b)),\n animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.filter(t => !(t.target === \"bone\" && t.id === id)) })),\n },\n approx,\n };\n}\n\n// ---------- slots ----------\n\n/** keep every drawOrder key listing every slot exactly once: `fn` edits one key's slot list */\nfunction patchDrawOrder(doc: Doc, fn: (order: string[]) => string[]): Doc {\n return { ...doc, animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.map(t =>\n t.target !== \"drawOrder\" ? t : { ...t, keys: t.keys.map(k => ({ ...k, v: fn(k.v as string[]) })) }) })) };\n}\n\n/**\n * Create or patch a slot. A NEW slot is appended to every `drawOrder` key (it draws on top \u2014 the same place\n * `z = max + 1` puts it), so a rig with such keys stays valid. A `bone` change on an existing slot goes through\n * `rebindSlot`, so the images stay where they are on the document.\n */\nexport function setSlot(doc: Doc, slot: SlotPatch & { id: string }): Doc {\n const cur = doc.slots.find(s => s.id === slot.id);\n if (cur && slot.bone && slot.bone !== cur.bone) doc = rebindSlot(doc, slot.id, slot.bone).doc;\n const base = doc.slots.find(s => s.id === slot.id);\n const next = RigSchema.shape.slots.element.parse({ ...base, ...slot });\n if (base) return { ...doc, slots: doc.slots.map(s => (s.id === slot.id ? next : s)) };\n return patchDrawOrder({ ...doc, slots: [...doc.slots, next] }, o => (o.includes(slot.id) ? o : [...o, slot.id]));\n}\n\nexport function removeSlot(doc: Doc, id: string): Doc {\n const gone = new Set(doc.attachments.filter(a => a.slot === id).map(a => a.id));\n return patchDrawOrder({\n ...doc,\n slots: doc.slots.filter(s => s.id !== id),\n attachments: doc.attachments.filter(a => a.slot !== id),\n animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.filter(t => !((t.target === \"slot\" && t.id === id) || (t.target === \"deform\" && gone.has(t.id)))) })),\n }, o => o.filter(s => s !== id));\n}\n\n/**\n * Move `slotId` onto `bone` WITHOUT moving what it shows. Every region's placement and every unweighted mesh or\n * path vertex is re-expressed in the new bone's REST frame; weighted data is left alone \u2014 its points live in the\n * influence bones, and the slot bone is not one of them. A region has no shear, so between two bones whose axes\n * are not similar (a shear, a non-uniform scale, a mirror) the decomposition cannot be exact: `approx` is the\n * largest distance (document px) any region corner moved, 0 when the re-expression is exact.\n */\nexport function rebindSlot(doc: Doc, slotId: string, bone: string): { doc: Doc; approx: number } {\n const slot = doc.slots.find(s => s.id === slotId);\n if (!slot) throw new Error(`unknown slot \"${slotId}\"`);\n if (slot.bone === bone) return { doc, approx: 0 };\n const skel = evaluate(doc, new Map());\n const from = skel.bones.get(slot.bone)?.world, to = skel.bones.get(bone)?.world;\n if (!to) throw new Error(`unknown bone \"${bone}\"`);\n if (!from) throw new Error(`slot \"${slotId}\" sits on unknown bone \"${slot.bone}\"`);\n const toInv = invert(to);\n let approx = 0;\n const attachments = doc.attachments.map(a => {\n if (a.slot !== slotId) return a;\n if (a.type === \"region\") {\n const M = mul(from, affineOf(a.x, a.y, a.rotation, a.scaleX, a.scaleY));\n const L = mul(toInv, M);\n const d = decompose(L);\n // `decompose` reports scaleX/scaleY as hypot()s \u2014 always \u2265 0 \u2014 so it cannot on its own tell a mirror\n // (negative determinant) from a shear: the determinant of the full local delta says which one it is,\n // and the mirror (when that's what it is) always shows up as a sign flip on scaleY, never scaleX.\n const det = L.a * L.d - L.b * L.c;\n // x, y (world position) need the finer 6-decimal rounding here: `to` can carry a scale factor, which\n // amplifies a 4-decimal quantization of a bone-local coordinate past a visible fraction of a pixel \u2014\n // rotation/scale stay at round4 (their own quantization does not get amplified the same way)\n const next = { ...a, x: round6(d.x), y: round6(d.y), rotation: round4(d.angle), scaleX: round4(d.scaleX), scaleY: round4(det < 0 ? -d.scaleY : d.scaleY) };\n const N = mul(to, affineOf(next.x, next.y, next.rotation, next.scaleX, next.scaleY));\n const [w, h] = regionSize(doc, a);\n for (const [cx, cy] of [[-w / 2, -h / 2], [w / 2, -h / 2], [w / 2, h / 2], [-w / 2, h / 2]]) {\n const p = apply(M, cx, cy), q = apply(N, cx, cy);\n approx = Math.max(approx, Math.hypot(p[0] - q[0], p[1] - q[1]));\n }\n return next;\n }\n if (a.vertices) {\n const v = a.vertices.slice();\n for (let i = 0; i < v.length; i += 2) { const [wx, wy] = apply(from, v[i], v[i + 1]); const [lx, ly] = apply(toInv, wx, wy); v[i] = round6(lx); v[i + 1] = round6(ly); }\n return { ...a, vertices: v };\n }\n return a; // weighted: its points live in the influence bones\n });\n return { doc: { ...doc, attachments, slots: doc.slots.map(s => (s.id === slotId ? { ...s, bone } : s)) }, approx: Math.round(approx * 1000) / 1000 };\n}\n\n/** setup draw order in one call: `order` lists every slot back-to-front (the drawOrder key's order); z = index */\nexport function setDrawOrder(doc: Doc, order: string[]): Doc {\n const ids = new Set(doc.slots.map(s => s.id));\n if (order.length !== ids.size || new Set(order).size !== order.length || !order.every(s => ids.has(s))) throw new Error(\"order must list every slot exactly once\");\n const z = new Map(order.map((id, i) => [id, i]));\n return { ...doc, slots: doc.slots.map(s => ({ ...s, z: z.get(s.id)! })) };\n}\n\n// ---------- attachments ----------\n\n/** Create or patch a region attachment (an image placed in a slot). Placement is the image CENTRE in the slot bone's space. */\nexport function setAttachment(doc: Doc, att: RegionPlacement & { id: string; slot?: string; asset?: string }): Doc {\n const cur = doc.attachments.find(a => a.id === att.id);\n if (cur && cur.type !== \"region\") throw new Error(`attachment \"${att.id}\" is a ${cur.type}; use setMesh`);\n const next = AttachmentSchema.parse({ type: \"region\", ...cur, ...att });\n return { ...doc, attachments: cur ? doc.attachments.map(a => (a.id === att.id ? next : a)) : [...doc.attachments, next] };\n}\n\n/** Create or replace any attachment (mesh / path / region) from a full description. */\nexport function setAttachmentRaw(doc: Doc, att: Record<string, unknown> & { id: string }): Doc {\n const next = AttachmentSchema.parse(att) as Attachment;\n const exists = doc.attachments.some(a => a.id === att.id);\n return { ...doc, attachments: exists ? doc.attachments.map(a => (a.id === att.id ? next : a)) : [...doc.attachments, next] };\n}\n\nconst trackId = (t: Omit<Track, \"keys\">) => `${t.target}.${t.id}.${t.prop}`;\n\n/** drop the deform `vertices` tracks of `id` whose keys no longer have the expected offset length */\nfunction dropVertexKeys(doc: Doc, id: string, keep: (len: number) => boolean): { doc: Doc; dropped: string[] } {\n const dropped: string[] = [];\n const animations = doc.animations.map(a => ({ ...a, tracks: a.tracks.filter(t => {\n if (t.target !== \"deform\" || t.id !== id || t.prop !== \"vertices\") return true;\n const ok = t.keys.every(k => Array.isArray(k.v) && keep(k.v.length));\n if (!ok) dropped.push(`deform.${id}.vertices in ${a.id}`);\n return ok;\n }) }));\n return { doc: { ...doc, animations }, dropped };\n}\n\n/**\n * Replace the geometry arrays of a mesh attachment. `vertices` and `weights` are exclusive: giving one drops\n * the other, and exactly one must remain. Deform `vertices` keys whose length no longer matches the mesh are\n * dropped (returned in `dropped`) \u2014 they would otherwise make the document invalid.\n */\nexport function setMesh(doc: Doc, id: string, patch: { vertices?: number[]; weights?: MeshAttachment[\"weights\"]; uvs?: number[]; triangles?: number[]; hull?: number }): { doc: Doc; dropped: string[] } {\n const cur = doc.attachments.find(a => a.id === id);\n if (!cur || cur.type !== \"mesh\") throw new Error(`attachment \"${id}\" is not a mesh`);\n if (patch.vertices && patch.weights) throw new Error(`attachment \"${id}\": give vertices OR weights, not both (a mesh has one rest shape)`);\n const next: MeshAttachment = { ...cur, ...patch };\n if (patch.vertices) delete (next as { weights?: unknown }).weights;\n if (patch.weights) delete (next as { vertices?: unknown }).vertices;\n const n = next.uvs.length / 2;\n if (next.vertices && next.vertices.length !== 2 * n) throw new Error(`vertices must have ${2 * n} numbers (2 per vertex, ${n} vertices), got ${next.vertices.length}`);\n if (next.weights && next.weights.length !== n) throw new Error(`weights must have ${n} influence lists (one per vertex), got ${next.weights.length}`);\n const withAtt = { ...doc, attachments: doc.attachments.map(a => (a.id === id ? AttachmentSchema.parse(next) : a)) };\n const len = deformLength(next);\n return dropVertexKeys(withAtt, id, l => l === len);\n}\n\n/** Replace a mesh's skinning (drops its unweighted `vertices`); stale deform vertex keys are pruned. */\nexport const setWeights = (doc: Doc, id: string, weights: NonNullable<MeshAttachment[\"weights\"]>) => setMesh(doc, id, { weights });\n\n/** Replace a REGION attachment by the given mesh (same id); lattice deform tracks on that id are removed (returned). */\nexport function convertToMesh(doc: Doc, mesh: MeshAttachment): { doc: Doc; droppedTracks: string[] } {\n const cur = doc.attachments.find(a => a.id === mesh.id);\n if (!cur || cur.type !== \"region\") throw new Error(`attachment \"${mesh.id}\" is not a region`);\n const droppedTracks: string[] = [];\n const animations = doc.animations.map(a => ({ ...a, tracks: a.tracks.filter(t => {\n const drop = t.target === \"deform\" && t.id === mesh.id;\n if (drop) droppedTracks.push(`${trackId(t)} in ${a.id}`);\n return !drop;\n }) }));\n return { doc: { ...doc, attachments: doc.attachments.map(a => (a.id === mesh.id ? AttachmentSchema.parse(mesh) : a)), animations }, droppedTracks };\n}\n\nexport function removeAttachment(doc: Doc, id: string): Doc {\n return {\n ...doc,\n attachments: doc.attachments.filter(a => a.id !== id),\n slots: doc.slots.map(s => (s.attachment === id ? { ...s, attachment: undefined } : s)),\n animations: doc.animations.map(a => ({ ...a, tracks: a.tracks\n .filter(t => !(t.target === \"deform\" && t.id === id))\n .map(t => (t.target === \"slot\" && t.prop === \"attachment\" ? { ...t, keys: t.keys.map(k => (k.v === id ? { ...k, v: null } : k)) } : t)) })),\n };\n}\n\n/** the region attachment currently at rest in a slot (undefined when hidden or not a region) */\nexport const restRegion = (doc: Doc, slotId: string): RegionAttachment | undefined => {\n const s = doc.slots.find(s => s.id === slotId);\n const a = s?.attachment ? doc.attachments.find(a => a.id === s.attachment) : undefined;\n return a?.type === \"region\" ? a : undefined;\n};\n\n/** region placement equivalent to a v1 pivot (fraction) + bone-local offset for an image of size w\u00D7h */\nexport function placementFromPivot(pivot: { x: number; y: number }, offset: Partial<Transform>, w: number, h: number): Required<Pick<RegionPlacement, \"x\" | \"y\" | \"rotation\" | \"scaleX\" | \"scaleY\">> {\n const o = { x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1, ...offset };\n const [x, y] = apply(affineOf(o.x, o.y, o.rotation, o.scaleX, o.scaleY), (0.5 - pivot.x) * w, (0.5 - pivot.y) * h);\n return { x: +x.toFixed(4) + 0, y: +y.toFixed(4) + 0, rotation: o.rotation, scaleX: o.scaleX, scaleY: o.scaleY };\n}\n\n// ---------- constraints ----------\n\nexport type ConstraintKind = \"ik\" | \"transform\" | \"path\";\nconst CONSTRAINT_SCHEMA = { ik: IkSchema, transform: TransformSchema, path: PathSchema };\nconst article = (kind: ConstraintKind) => (kind === \"ik\" ? \"an\" : \"a\");\n/** which list holds `id` \u2014 constraint ids are unique across the three kinds */\nexport const constraintKind = (doc: Doc, id: string): ConstraintKind | undefined =>\n doc.ik.some(c => c.id === id) ? \"ik\" : doc.transform.some(c => c.id === id) ? \"transform\" : doc.path.some(c => c.id === id) ? \"path\" : undefined;\n\n/**\n * Create or patch a constraint. The patch is merged over the current value and re-parsed, so schema defaults\n * fill in on creation and a patch only has to name what changes (an explicit `undefined` changes nothing).\n * A constraint's KIND is fixed on creation: changing it means removing the constraint and creating it again,\n * because the three kinds share an id space and their fields (and tracks) do not translate.\n */\nexport function setConstraint(doc: Doc, kind: ConstraintKind, id: string, patch: Record<string, unknown>): Doc {\n const existing = constraintKind(doc, id);\n if (existing && existing !== kind)\n throw new Error(`constraint \"${id}\" is already ${article(existing)} ${existing}; remove it before creating ${article(kind)} ${kind} constraint with that id`);\n const cur = (doc[kind] as { id: string }[]).find(c => c.id === id);\n const given = Object.fromEntries(Object.entries(patch).filter(([, v]) => v !== undefined));\n // a patch may name any subset, but there is nothing to merge over when the constraint is new\n if (!cur && !(given.bones && given.target)) throw new Error(`no ${kind} constraint \"${id}\" yet: creating one needs at least bones and target`);\n const next = CONSTRAINT_SCHEMA[kind].parse({ ...cur, ...given, id });\n // the format's own rule, enforced here too: `validate` only runs when a document is saved, so an in-process\n // caller (the editor, another tool) would otherwise build a three-bone IK and only hear about it much later\n if (kind === \"ik\" && next.bones.length > 2) throw new Error(`ik \"${id}\": 1 or 2 bones, got ${next.bones.length} (${next.bones.join(\",\")})`);\n const list = cur ? (doc[kind] as { id: string }[]).map(c => (c.id === id ? next : c)) : [...(doc[kind] as unknown[]), next];\n return { ...doc, [kind]: list } as Doc;\n}\n\n/** Remove a constraint of any kind together with its tracks (mix / position / \u2026). */\nexport function removeConstraint(doc: Doc, id: string): Doc {\n const kind = constraintKind(doc, id);\n if (!kind) throw new Error(`unknown constraint \"${id}\"`);\n return {\n ...doc,\n [kind]: (doc[kind] as { id: string }[]).filter(c => c.id !== id),\n animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.filter(t => !(t.target === kind && t.id === id)) })),\n } as Doc;\n}\n\n/**\n * Rig a limb in one call: `ikChainFor(bone)` gets a target bone at the chain's current tip and an IK constraint\n * `<bone>_ik` whose bend sign reproduces the authored pose, so adding it moves nothing.\n *\n * The target is parented to the ROOT bone, never inside the chain: a target dragged by the bones it drives is a\n * cycle (the solver would read what it just wrote). When the two-bone chain would reach up to the root \u2014 the only\n * parent available for the target \u2014 the chain DEGRADES to the single bone (a one-bone IK aims that bone at the\n * target and is cycle-free), and `note` says so; only a `bone` that is itself a root is refused (by `ikChainFor`).\n */\nexport function addIkChain(doc: Doc, bone: string, opts: { target?: string; mix?: number; softness?: number } = {}): { doc: Doc; chain: string[]; target: string; bendPositive: boolean; note?: string } {\n const id = `${bone}_ik`;\n if (constraintKind(doc, id)) throw new Error(`constraint \"${id}\" exists; remove it first (rig_remove_constraint) or patch it`);\n const full = ikChainFor(doc, bone);\n const rootId = doc.bones.find(b => !b.parent)!.id;\n const note = full.includes(rootId) ? \"single bone \u2014 the two-bone chain would include the root, which carries the target\" : undefined;\n const chain = note ? [bone] : full;\n // a one-bone IK aims the bone at the target; with no length the tip IS the bone's own origin, so the target\n // would sit on it and the solver would snap the bone to rotation 0 instead of holding the authored pose\n if (chain.length === 1 && !doc.bones.find(b => b.id === bone)!.length)\n throw new Error(`bone \"${bone}\" has length 0: a one-bone IK aims it at a target placed at its tip, so give it a length first`);\n const target = opts.target ?? id;\n if (doc.bones.some(b => b.id === target)) throw new Error(`bone \"${target}\" exists; pass another target id`);\n const skel = evaluate(doc, new Map());\n const [tipX, tipY] = chainEnd(skel, chain);\n const bendPositive = bendSignFor(skel, chain);\n const [lx, ly] = apply(invert(skel.bones.get(rootId)!.world), tipX, tipY);\n // 6 decimals, like the bone transforms the Spine importer writes: the target's position is the whole limb's\n // pose, and rounding it to the 4 decimals used for image placement already costs ~1e-5 px of drift\n let next = addBone(doc, { id: target, parent: rootId, role: \"ik_target\", transform: { x: +lx.toFixed(6) + 0, y: +ly.toFixed(6) + 0 } });\n const order = Math.max(0, ...next.ik.map(c => c.order), ...next.transform.map(c => c.order), ...next.path.map(c => c.order)) + 1;\n next = setConstraint(next, \"ik\", id, { bones: chain, target, bendPositive, mix: opts.mix ?? 1, softness: opts.softness ?? 0, order });\n return { doc: next, chain, target, bendPositive, note };\n}\n\n// ---------- paths ----------\n\n/** the vertex data of a path: anchors to smooth into a curve, or the raw control points themselves */\nexport interface PathGeometryIn { points?: Pt[]; vertices?: number[]; weights?: Influence[][]; closed?: boolean }\n\n/** vertex data \u2192 the same points in DOCUMENT space, without having to put the attachment in the document first */\nconst pathWorld = (skel: Skeleton, id: string, slot: string, data: { vertices?: number[]; weights?: Influence[][] }, closed: boolean): number[] =>\n attachmentWorldVertices(skel, slot, { id, slot, type: \"path\", ...data, lengths: [], closed, constantSpeed: true });\n\n/** write a path attachment and prune the deform tracks whose offset length no longer fits it */\nfunction putPath(doc: Doc, att: PathAttachment): { doc: Doc; dropped: string[] } {\n const len = deformLength(att);\n return dropVertexKeys(setAttachmentRaw(doc, att), att.id, l => l === len);\n}\n\n/** a flat `deform.<id>.vertices` value split per CONTROL POINT: one chunk per influence list, or one pair each */\nconst offsetChunks = (att: PathAttachment, v: number[]): number[][] => {\n const out: number[][] = [];\n if (!att.weights) { for (let i = 0; i < v.length; i += 2) out.push(v.slice(i, i + 2)); return out; }\n let k = 0;\n for (const list of att.weights) { out.push(v.slice(k, k + 2 * list.length)); k += 2 * list.length; }\n return out;\n};\n\n/**\n * Rewrite the deform `vertices` keys of `id` that still fit `len` through `map`. A key of any other length is\n * already stale against the attachment as it stands \u2014 `putPath`'s prune is what deals with that, not this.\n */\nfunction mapVertexKeys(doc: Doc, id: string, len: number, map: (v: number[]) => number[]): Doc {\n const fits = (v: Key[\"v\"]): v is number[] => Array.isArray(v) && v.length === len && typeof v[0] === \"number\";\n return { ...doc, animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.map(t =>\n (t.target === \"deform\" && t.id === id && t.prop === \"vertices\"\n ? { ...t, keys: t.keys.map(k => (fits(k.v) ? { ...k, v: map(k.v) } : k)) }\n : t) as Track) })) };\n}\n\n/**\n * Create or replace a PATH attachment. Two forms, exactly one per call:\n * `points` \u2014 anchors in DOCUMENT space; the curve is rebuilt with Catmull-Rom tangents (the agent's form).\n * `vertices` / `weights` \u2014 raw control points, [cPrev, p, cNext] per anchor, in the slot bone's space\n * (or skinned), which is the ONLY form that preserves authored tangents and weights.\n * `lengths` are re-measured in both cases. Deform tracks whose length no longer fits are dropped.\n * `closed` and `constantSpeed` keep the attachment's current values when it already exists.\n */\nexport function setPathAttachment(doc: Doc, id: string, slot: string, geom: PathGeometryIn): { doc: Doc; dropped: string[] } {\n const cur = doc.attachments.find(a => a.id === id);\n if (cur && cur.type !== \"path\") throw new Error(`attachment \"${id}\" is a ${cur.type}, not a path`);\n if (!doc.slots.some(s => s.id === slot)) throw new Error(`unknown slot \"${slot}\"`);\n const raw = geom.vertices ?? geom.weights;\n if ((geom.points ? 1 : 0) + (raw ? 1 : 0) !== 1)\n throw new Error(`attachment \"${id}\": give exactly one of \\`points\\` (anchors, re-smoothed) or \\`vertices\\`/\\`weights\\` (raw control points)`);\n if (geom.vertices && geom.weights) throw new Error(`attachment \"${id}\": give vertices OR weights, not both (a path has one rest shape)`);\n const closed = geom.closed ?? (cur?.type === \"path\" ? cur.closed : false);\n const skel = evaluate(doc, new Map());\n // constantSpeed: the runtime measures the posed curve itself, so the stored `lengths` stay an estimate\n const constantSpeed = cur?.type === \"path\" ? cur.constantSpeed : true;\n if (geom.points) {\n const geometry = pathFromPoints(skel, slot, geom.points, closed);\n return putPath(doc, { id, slot, type: \"path\", ...geometry, closed, constantSpeed });\n }\n if (geom.vertices && geom.vertices.length % 6 !== 0)\n throw new Error(`attachment \"${id}\": vertices must hold three control points [cPrev, p, cNext] per anchor (a multiple of 6 numbers), got ${geom.vertices.length}`);\n if (geom.weights && geom.weights.length % 3 !== 0)\n throw new Error(`attachment \"${id}\": weights must hold three control points [cPrev, p, cNext] per anchor (a multiple of 3 lists), got ${geom.weights.length}`);\n const data = geom.vertices ? { vertices: geom.vertices } : { weights: geom.weights! };\n const anchors = anchorCount(geom.vertices ? geom.vertices.length / 2 : geom.weights!.length);\n if (anchors < 2) throw new Error(`attachment \"${id}\": a path needs at least two anchors, got ${anchors}`);\n if (closed && anchors < 3) throw new Error(`attachment \"${id}\": a closed path needs at least three anchors, got ${anchors}`);\n // measuring the curve poses every influence's bone; say which bone is missing rather than crash inside the pose\n for (const inf of geom.weights?.flat() ?? [])\n if (!skel.bones.has(inf.bone)) throw new Error(`attachment \"${id}\": weights reference unknown bone \"${inf.bone}\"`);\n const lengths = curveLengths(pathWorld(skel, id, slot, data, closed), closed);\n return putPath(doc, { id, slot, type: \"path\", ...data, lengths, closed, constantSpeed });\n}\n\n/**\n * Structural path edit. `insert` splits the curve AFTER anchor `index` at parameter `t`, which leaves the curve's\n * shape untouched (de Casteljau); `remove` drops an anchor's triple, which necessarily changes the shape.\n *\n * A skinned path stays skinned: the five control points a split touches get their influence lists \u2014 bones,\n * weights and bone-space positions alike \u2014 blended from the four the curve already had, by the split's own\n * affine coefficients (`blendInfluences`). No bone appears or disappears, every list still sums to 1, and the\n * shape is preserved in every POSE, not only in the setup one.\n *\n * `insert` also carries the DEFORM tracks through: the same coefficients blend the offsets of the same four\n * control points (`blendOffsets`), which is the identity again with `q + d` in place of `q`, so the animated\n * curve is unchanged too. That makes an insert lossless \u2014 which matters, because a single Ctrl-click on `ross`'s\n * `tail_path` reaches 17 of them. `remove` cannot make that promise (it changes the curve's shape by\n * construction), so its stale keys are still dropped and reported in `dropped`.\n */\nexport function pathAnchorOp(doc: Doc, id: string, op: \"insert\" | \"remove\", index: number, t = 0.5): { doc: Doc; dropped: string[] } {\n const att = doc.attachments.find(a => a.id === id);\n if (!att || att.type !== \"path\") throw new Error(`attachment \"${id}\" is not a path`);\n const count = vertexCount(att);\n const anchors = anchorCount(count);\n if (!Number.isInteger(index) || index < 0 || index >= anchors)\n throw new Error(`path \"${id}\": anchor ${index} is out of range (${anchors} anchors)`);\n const skel = evaluate(doc, new Map());\n const world = toPoints(attachmentWorldVertices(skel, att.slot, att));\n\n if (op === \"remove\") {\n if (anchors - 1 < (att.closed ? 3 : 2))\n throw new Error(`path \"${id}\": a path needs at least two anchors (three when closed), so anchor ${index} cannot be removed`);\n const data = att.weights ? { weights: removeTriple(att.weights, index) } : { vertices: flatten(removeTriple(toPoints(att.vertices!), index)) };\n const lengths = curveLengths(flatten(removeTriple(world, index)), att.closed);\n return putPath(doc, { ...att, ...data, lengths });\n }\n\n if (!att.closed && index >= anchors - 1)\n throw new Error(`path \"${id}\": anchor ${index} is the last anchor of an OPEN path, so there is no segment after it to split (insert after anchors 0\u2026${anchors - 2}, or close the path)`);\n if (!(t > 0 && t < 1)) throw new Error(`path \"${id}\": the split parameter must lie strictly inside the curve (0 < t < 1), got ${t}`);\n const { cNextI, triple, cPrevNext, coeffs } = splitCurve(flatten(world), att.closed, index, t);\n const lengths = curveLengths(flatten(insertTriple(world, index, cNextI, triple, cPrevNext)), att.closed);\n // the four SOURCE control points every coefficient row is over: p_i, cNext_i, cPrev_{i+1}, p_{i+1}, wrapped\n // exactly as `samplePath` wraps them, so the last curve of a closed path reads across entry 0\n const src = <T>(items: T[]): T[] => [1, 2, 3, 4].map(k => items[(index * 3 + k) % count]);\n /**\n * The DEFORM tracks come through the split instead of being thrown away. A key holds offsets that add to the\n * stored position inside each bone's frame, so blending them with the SAME de Casteljau coefficients as the\n * rest data preserves the same identity (`blendOffsets`): the inserted anchor sits on the DEFORMED curve in\n * every pose, at every time, exactly as its rest position sits on the rest curve. `ross`'s `tail_path` carries\n * 17 of these tracks and one Ctrl-click used to discard all 17.\n */\n const withKeys = (grow: (chunks: number[][]) => number[][]) =>\n mapVertexKeys(doc, id, deformLength(att), v => grow(offsetChunks(att, v)).flat());\n if (!att.weights) {\n // only the five points the split touches are re-derived; the rest keep their stored values to the last\n // decimal, instead of drifting through a world round trip that should have been the identity\n const inv = invert(skel.bones.get(doc.slots.find(s => s.id === att.slot)!.bone)!.world);\n const local = (p: Pt): Pt => { const [x, y] = apply(inv, p[0], p[1]); return [round6(x), round6(y)]; };\n const vertices = flatten(insertTriple(toPoints(att.vertices!), index, local(cNextI), [local(triple[0]), local(triple[1]), local(triple[2])], local(cPrevNext)));\n // one bone, so a control point's offset is one pair and the blend is the plain affine combination\n const grown = withKeys(c => { const s4 = src(c), at = (k: number) => blendPairs(s4, coeffs[k]); return insertTriple(c, index, at(0), [at(1), at(2), at(3)], at(4)); });\n return putPath(grown, { ...att, vertices, lengths });\n }\n // The blend consumes the whole influence lists, positions and all \u2014 see `blendInfluences` for why the world\n // points play no part here: a split rebuilt from them would only hold in the setup pose.\n const sources = src(att.weights);\n const at = (k: number) => blendInfluences(sources, coeffs[k]);\n const weights = insertTriple(att.weights, index, at(0), [at(1), at(2), at(3)], at(4));\n const grown = withKeys(c => { const s4 = src(c), off = (k: number) => blendOffsets(sources, s4, coeffs[k]); return insertTriple(c, index, off(0), [off(1), off(2), off(3)], off(4)); });\n return putPath(grown, { ...att, weights, lengths });\n}\n\n// ---------- animation ----------\n\n/**\n * Replace the keys of one track (creating the animation/track if missing). Manual edit \u2192 drops `preset`.\n * `merge: true` keeps existing keys except those at the given times (fix one key without retyping all).\n */\nexport function setKeys(doc: Doc, animId: string, track: Omit<Track, \"keys\">, keys: KeyInput[], duration?: number, opts: { merge?: boolean } = {}): Doc {\n const anim = doc.animations.find(a => a.id === animId) ?? { id: animId, duration: duration ?? 1, loop: false, tracks: [], events: [] };\n const same = (t: Track) => t.target === track.target && t.id === track.id && t.prop === track.prop;\n const given = keys.map(k => ({ ...k, ease: k.ease ?? (\"ease_in_out\" as const) }));\n const kept = opts.merge ? (anim.tracks.find(same)?.keys ?? []).filter(k => !given.some(g => Math.abs(g.t - k.t) < 1e-9)) : [];\n const sorted = [...kept, ...given].sort((a, b) => a.t - b.t);\n // replaced in place, never moved to the end: the editor's timeline rows are this order, and re-keying one\n // property must not shuffle the rows inside its group under the user's cursor\n const edited = { ...track, keys: sorted } as Track;\n const tracks = anim.tracks.some(same) ? anim.tracks.map(t => (same(t) ? edited : t)) : [...anim.tracks, edited];\n const dur = duration ?? Math.max(anim.duration, ...sorted.map(k => k.t));\n const next = { ...anim, tracks, duration: dur, preset: undefined };\n return { ...doc, animations: doc.animations.some(a => a.id === animId) ? doc.animations.map(a => (a.id === animId ? next : a)) : [...doc.animations, next] };\n}\n\n/**\n * Re-tune one existing track without retyping keys: `amplitude` scales deviations from the rest value\n * (scale props as ratios), `offset` adds a constant, `timeScale` stretches key times (duration grows to fit).\n */\nexport function adjustTrack(doc: Doc, animId: string, track: Omit<Track, \"keys\">, adj: { amplitude?: number; offset?: number; timeScale?: number }): Doc {\n const anim = doc.animations.find(a => a.id === animId);\n if (!anim) throw new Error(`unknown animation \"${animId}\"`);\n const same = (t: Track) => t.target === track.target && t.id === track.id && t.prop === track.prop;\n const tr = anim.tracks.find(same);\n if (!tr) throw new Error(`unknown track ${track.target}.${track.id}.${track.prop} in \"${animId}\"`);\n if (tr.target === \"slot\" && tr.prop === \"attachment\") throw new Error(\"cannot adjust a discrete (attachment) track\");\n const rest = restValue(doc, pk(tr.target, tr.id, tr.prop)) as number;\n const ratio = tr.target === \"bone\" && (tr.prop === \"scaleX\" || tr.prop === \"scaleY\");\n const r4 = (v: number) => +v.toFixed(4) + 0;\n const keys = tr.keys.map(k => {\n let v = k.v as number;\n if (adj.amplitude !== undefined) v = ratio ? rest * (1 + (v / rest - 1) * adj.amplitude) : rest + (v - rest) * adj.amplitude;\n if (adj.offset) v += adj.offset;\n return { ...k, t: r4(adj.timeScale ? k.t * adj.timeScale : k.t), v: r4(v) };\n });\n const duration = Math.max(anim.duration, keys[keys.length - 1].t);\n const next = { ...anim, duration, tracks: anim.tracks.map(t => (same(t) ? ({ ...t, keys } as Track) : t)), preset: undefined };\n return { ...doc, animations: doc.animations.map(a => (a.id === animId ? next : a)) };\n}\n\nexport function removeAnimation(doc: Doc, id: string): Doc {\n return { ...doc, animations: doc.animations.filter(a => a.id !== id) };\n}\n\n/** Animation properties without touching keys. Creates the animation when missing. `rename` changes the id. */\nexport function setAnimation(doc: Doc, id: string, patch: { duration?: number; loop?: boolean; events?: Animation[\"events\"]; rename?: string }): Doc {\n const cur = doc.animations.find(a => a.id === id) ?? { id, duration: 1, loop: false, tracks: [], events: [] };\n const exists = doc.animations.some(a => a.id === id);\n if (patch.rename && patch.rename !== id && doc.animations.some(a => a.id === patch.rename)) throw new Error(`animation \"${patch.rename}\" exists`);\n const events = patch.events ?? cur.events;\n const last = Math.max(0, ...cur.tracks.flatMap(t => t.keys.map(k => k.t)), ...events.map(e => e.t));\n if (patch.duration !== undefined && patch.duration < last - 1e-9) throw new Error(`duration ${patch.duration}s is below the last key/event at ${last}s`);\n const next: Animation = { ...cur, id: patch.rename ?? id, duration: patch.duration ?? cur.duration, loop: patch.loop ?? cur.loop, events };\n return { ...doc, animations: exists ? doc.animations.map(a => (a.id === id ? next : a)) : [...doc.animations, next] };\n}\n\n/** Remove the keys of one track at the given times (1e-6 tolerance); an emptied track is dropped. Manual edit \u2192 drops `preset`. */\nexport function removeKeys(doc: Doc, animId: string, track: Omit<Track, \"keys\">, times: number[]): Doc {\n const anim = doc.animations.find(a => a.id === animId);\n if (!anim) throw new Error(`unknown animation \"${animId}\"`);\n const same = (t: Track) => t.target === track.target && t.id === track.id && t.prop === track.prop;\n const tr = anim.tracks.find(same);\n if (!tr) throw new Error(`unknown track ${track.target}.${track.id}.${track.prop} in \"${animId}\"`);\n const keys = tr.keys.filter(k => !times.some(t => Math.abs(k.t - t) < 1e-6));\n const tracks = keys.length ? anim.tracks.map(t => (same(t) ? ({ ...t, keys } as Track) : t)) : anim.tracks.filter(t => !same(t));\n return { ...doc, animations: doc.animations.map(a => (a.id === animId ? { ...a, tracks, preset: undefined } : a)) };\n}\n\n/**\n * Exactly the bone properties `mirrorX` flips. Conjugating a bone's local transform by the reflection\n * F = diag(-1, 1) gives F\u00B7affineOf(x, y, r, sx, sy, shx, shy)\u00B7F = affineOf(-x, y, -r, sx, sy, -shx, -shy):\n * F\u00B7M\u00B7F maps (a, b, c, d) to (a, -b, -c, d), and the y axis cos(-r+90-shy), sin(-r+90-shy) is the only way to\n * reach (-c, d) \u2014 with shearY LEFT POSITIVE the y axis is off by 2\u00B7shearY, which `ross`, having shearY tracks,\n * would show. The scales are lengths and survive; y survives because the reflection is across the y axis.\n */\nconst MIRRORED_BONE_PROPS = new Set([\"x\", \"rotation\", \"shearX\", \"shearY\"]);\n\n/**\n * Copy every `target: \"bone\"` track of each `from[i]` bone onto `to[i]`, pair by pair, replacing whatever\n * `to[i]` already held for that prop. `phase` rotates each key's time by a fraction of the animation's duration,\n * wrapping around (0.5 = half a cycle later, 1 is a full turn \u2014 the same identity as 0); `mirrorX` negates the\n * props in `MIRRORED_BONE_PROPS`. A source bone with no bone tracks is collected into `empty` rather than failing the\n * call \u2014 an agent may name a whole limb when only half of it is animated.\n *\n * Easing belongs to the key that STARTS a segment, so rotating keys around the end can split the segment that\n * ran from the last key to the first: on a looping animation that is the same segment and nothing is lost, on a\n * one-shot animation it is a different curve \u2014 `rig_copy_tracks` says so once when that applies. A track keyed at\n * both 0 and `duration` (the standard closed-loop shape) keys the SAME point of the circle twice; any nonzero\n * shift would send both copies to the same time, so the duplicate at `duration` is dropped before shifting. That\n * is lossless when the two ends agree (the ordinary case: the cycle returns to where it started). Nothing forces\n * them to \u2014 a tail can author a different rest angle at the loop's seam \u2014 so a drop where they DISAGREE is\n * collected into `lossy` (bone, prop, both values) instead of silently discarding the segment between them: not\n * an error (the source shape is legal), not something to nudge either key to avoid (there is no basis to pick\n * which end wins), just a fact the caller needs to hear.\n */\nexport function copyTracks(doc: Doc, animId: string, from: string[], to: string[], opts: { phase?: number; mirrorX?: boolean }): { doc: Doc; copied: number; empty: string[]; lossy: string[] } {\n const phase = opts.phase ?? 0, mirrorX = opts.mirrorX ?? false;\n if (from.length !== to.length) throw new Error(`from (${from.length} bones) and to (${to.length} bones) must have the same length, pair by pair`);\n const overlap = [...new Set(from)].filter(id => to.includes(id));\n if (overlap.length) throw new Error(`bone${overlap.length === 1 ? \"\" : \"s\"} in both from and to: ${overlap.join(\", \")} \u2014 the result would depend on order`);\n const dupTo = [...new Set(to)].filter(id => to.filter(x => x === id).length > 1);\n if (dupTo.length) throw new Error(`bone${dupTo.length === 1 ? \"\" : \"s\"} repeated in to: ${dupTo.join(\", \")} \u2014 the last pair would silently win`);\n if (!(phase >= 0 && phase <= 1)) throw new Error(`phase must be 0..1, got ${phase}`);\n const anim = doc.animations.find(a => a.id === animId);\n if (!anim) throw new Error(`unknown animation \"${animId}\"`);\n for (const id of [...from, ...to]) if (!doc.bones.some(b => b.id === id)) throw new Error(`unknown bone \"${id}\"`);\n\n // phase 1 is a full turn: the same identity as phase 0. Both are worth naming, not folded into \"shift\", because\n // a key at `duration` and a key at 0 are the SAME point of the circle \u2014 the standard closed-loop shape keys\n // both \u2014 so ANY nonzero rotation sends them to the same time, and shift === 0 is the only case with nothing to\n // reconcile at all.\n const shift = (phase % 1) * anim.duration;\n const empty: string[] = [], lossy: string[] = [];\n let copied = 0, next = doc;\n for (let i = 0; i < from.length; i++) {\n const srcId = from[i], dstId = to[i];\n let any = false;\n for (const t of anim.tracks) {\n if (t.target !== \"bone\" || t.id !== srcId) continue;\n any = true;\n const mirror = mirrorX && MIRRORED_BONE_PROPS.has(t.prop);\n // the key at 0 already starts the cycle (and keeps its ease into the next key); its duplicate at `duration`\n // \u2014 the standard shape for a track that closes a loop \u2014 would collide with it the instant a nonzero shift\n // moves either one, so it is the duplicate that goes. When the two ends don't actually agree, dropping the\n // second one throws away real authored data (the segment leading up to it) \u2014 say so, once per track.\n const dropDuplicate = shift !== 0 && t.keys.some(k => k.t === 0);\n if (dropDuplicate) {\n const zero = t.keys.find(k => k.t === 0)!;\n for (const dup of t.keys.filter(k => k.t === anim.duration))\n if (Math.abs((dup.v as number) - (zero.v as number)) > 1e-6) lossy.push(`${srcId}.${t.prop}: ${zero.v} vs ${dup.v}`);\n }\n const kept = dropDuplicate ? t.keys.filter(k => k.t !== anim.duration) : t.keys;\n const keys = kept.map(k => {\n if (shift === 0) return { t: k.t, v: mirror ? -(k.v as number) : k.v, ease: k.ease };\n // round BEFORE comparing to `duration`: raw floating point leaves whether a key that landed within\n // ~5e-7 of the boundary counts as \"wrapped\" a coin flip, which is visible on ross's 33ms `setup` animation\n const shifted = round6(k.t + shift);\n return { t: shifted >= anim.duration ? shifted - anim.duration : shifted, v: mirror ? -(k.v as number) : k.v, ease: k.ease };\n });\n next = setKeys(next, animId, { target: \"bone\", id: dstId, prop: t.prop as \"x\" }, keys);\n copied++;\n }\n if (!any) empty.push(srcId);\n }\n return { doc: next, copied, empty, lossy };\n}\n\n// ---------- describe (compact text for agents) ----------\n\nconst n3 = (v: number) => String(Math.round(v * 1000) / 1000);\n/** compact key summary for one track: count and value range (or the set of discrete values) */\nexport function trackSummary(t: Track): string {\n const nums = t.keys.map(k => k.v).filter((v): v is number => typeof v === \"number\");\n const range = nums.length ? `[${n3(Math.min(...nums))}..${n3(Math.max(...nums))}]` : `{${[...new Set(t.keys.map(k => String(k.v)))].join(\",\")}}`;\n return `${t.keys.length} key${t.keys.length === 1 ? \"\" : \"s\"} ${range}`;\n}\n\n// ---------- rename ----------\n\nexport type RenameKind = \"bone\" | \"slot\" | \"attachment\" | \"asset\" | \"constraint\";\n\n/**\n * Rename one thing and every reference to it (spec \u00A73). A bone is named by bone parents, slots, ik/transform\n * chains and targets, path chains, every mesh/path influence and bone tracks; a slot by its attachments, path\n * constraint targets (those aim at a slot), slot tracks and every drawOrder key; an attachment by the slot that\n * shows it, `attachment` key values and deform tracks; an asset by regions and meshes; a constraint by its own\n * tracks. Roles are not ids and stay. Templates in presets.json are a separate file and are NOT rewritten.\n */\nexport function rename(doc: Doc, kind: RenameKind, id: string, to: string): Doc {\n if (!ID_RE.test(to)) throw new Error(`\"${to}\" is not a snake_case id`);\n if (to === id) return doc;\n const sub = (v: string) => (v === id ? to : v);\n const subKeys = (t: Track, pred: boolean, f: (v: Key[\"v\"]) => Key[\"v\"]): Track => (pred ? { ...t, keys: t.keys.map(k => ({ ...k, v: f(k.v) })) } : t);\n const retrack = (target: Track[\"target\"]) => (t: Track): Track => (t.target === target && t.id === id ? { ...t, id: to } : t);\n const tracks = (f: (t: Track) => Track): Doc => ({ ...doc, animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.map(f) })) });\n const taken = (list: { id: string }[], what: string) => { if (list.some(x => x.id === to)) throw new Error(`${what} \"${to}\" already exists`); };\n const known = (list: { id: string }[], what: string) => { if (!list.some(x => x.id === id)) throw new Error(`unknown ${what} \"${id}\"`); };\n const influences = (a: Attachment): Attachment => (a.type === \"region\" || !a.weights ? a : { ...a, weights: a.weights.map(l => l.map(i => ({ ...i, bone: sub(i.bone) }))) });\n switch (kind) {\n case \"bone\": {\n known(doc.bones, \"bone\"); taken(doc.bones, \"bone\");\n doc = tracks(retrack(\"bone\"));\n return { ...doc,\n bones: doc.bones.map(b => ({ ...b, id: sub(b.id), ...(b.parent ? { parent: sub(b.parent) } : {}) })),\n slots: doc.slots.map(s => ({ ...s, bone: sub(s.bone) })),\n ik: doc.ik.map(c => ({ ...c, bones: c.bones.map(sub), target: sub(c.target) })),\n transform: doc.transform.map(c => ({ ...c, bones: c.bones.map(sub), target: sub(c.target) })),\n path: doc.path.map(c => ({ ...c, bones: c.bones.map(sub) })),\n attachments: doc.attachments.map(influences),\n };\n }\n case \"slot\": {\n known(doc.slots, \"slot\"); taken(doc.slots, \"slot\");\n doc = tracks(t => subKeys(retrack(\"slot\")(t), t.target === \"drawOrder\", v => (Array.isArray(v) ? (v as string[]).map(sub) : v)));\n return { ...doc,\n slots: doc.slots.map(s => ({ ...s, id: sub(s.id) })),\n attachments: doc.attachments.map(a => ({ ...a, slot: sub(a.slot) })),\n path: doc.path.map(c => ({ ...c, target: sub(c.target) })),\n };\n }\n case \"attachment\": {\n known(doc.attachments, \"attachment\"); taken(doc.attachments, \"attachment\");\n doc = tracks(t => subKeys(retrack(\"deform\")(t), t.target === \"slot\" && t.prop === \"attachment\", v => (typeof v === \"string\" ? sub(v) : v)));\n return { ...doc,\n attachments: doc.attachments.map(a => ({ ...a, id: sub(a.id) })),\n slots: doc.slots.map(s => (s.attachment ? { ...s, attachment: sub(s.attachment) } : s)),\n };\n }\n case \"asset\": {\n known(doc.assets, \"asset\"); taken(doc.assets, \"asset\");\n return { ...doc,\n assets: doc.assets.map(a => ({ ...a, id: sub(a.id) })),\n attachments: doc.attachments.map(a => (a.type === \"path\" ? a : { ...a, asset: sub(a.asset) })),\n };\n }\n case \"constraint\": {\n const all = [...doc.ik, ...doc.transform, ...doc.path];\n known(all, \"constraint\"); taken(all, \"constraint\");\n const kindOf = constraintKind(doc, id)!;\n doc = tracks(retrack(kindOf));\n return { ...doc, [kindOf]: (doc[kindOf] as { id: string }[]).map(c => ({ ...c, id: sub(c.id) })) } as Doc;\n }\n }\n}\n\n/** Compact text for agents. `verbose`: slot pivot/offset and every track with its key summary (no asset prompts). */\n/**\n * One attachment in one line: what shape it is, and the counts an agent needs before it asks for the arrays.\n * `deform.<id>.vertices` keys are `deformLength` numbers long, which is 2\u00B7\u03A3 influences on a skinned shape and\n * 2\u00B7vertices otherwise, so it is stated rather than left to be derived from the two counts.\n */\nexport function describeAttachment(doc: Doc, att: Attachment): string {\n const head = `${att.type} \"${att.id}\" in slot \"${att.slot}\"`;\n if (att.type === \"region\") {\n const a = doc.assets.find(x => x.id === att.asset);\n return `${head}: asset \"${att.asset}\"${a ? ` (${a.width}x${a.height})` : \" (MISSING)\"} at (${n3(att.x)}, ${n3(att.y)}) rot ${n3(att.rotation)} scale ${n3(att.scaleX)}/${n3(att.scaleY)}`;\n }\n const n = vertexCount(att);\n const bones = att.weights ? [...new Set(att.weights.flat().map(i => i.bone))] : [];\n const skin = att.weights\n ? `skinned to ${bones.length} bone${bones.length === 1 ? \"\" : \"s\"} (${bones.join(\", \")}), ${att.weights.reduce((t, l) => t + l.length, 0)} influences`\n : `unskinned (\\`vertices\\` in slot bone \"${doc.slots.find(s => s.id === att.slot)?.bone ?? \"?\"}\"'s space)`;\n const shape = att.type === \"mesh\"\n ? `${n} vertices, ${att.triangles.length / 3} triangles, hull ${att.hull}`\n : `${n} control points = ${anchorCount(n)} anchors, ${att.closed ? \"closed\" : \"open\"}, ${att.constantSpeed ? \"constantSpeed\" : \"stored lengths\"}`;\n const keyed = doc.animations.filter(a => a.tracks.some(t => t.target === \"deform\" && t.id === att.id && t.prop === \"vertices\")).map(a => a.id);\n return `${head}: ${shape}; ${skin}; deform key length ${deformLength(att)}${keyed.length ? `; vertices keyed in ${keyed.length} animation${keyed.length === 1 ? \"\" : \"s\"} (${keyed.join(\", \")})` : \"\"}`;\n}\n\nexport function describe(doc: Doc, opts: { verbose?: boolean } = {}): string {\n const lines = [`${doc.meta.name} ${doc.meta.width}x${doc.meta.height}`];\n if (doc.meta.notes) lines.push(`notes: ${doc.meta.notes}`);\n const kids = (id?: string) => doc.bones.filter(b => b.parent === id);\n const place = (s: Slot) => {\n const extra: string[] = [];\n for (const a of doc.attachments.filter(a => a.slot === s.id)) {\n if (a.type === \"region\") extra.push(`${a.id}${a.id === a.asset ? \"\" : `=${a.asset}`}@(${n3(a.x)}, ${n3(a.y)})${a.rotation ? ` rot ${n3(a.rotation)}` : \"\"}${a.scaleX !== 1 || a.scaleY !== 1 ? ` scale ${n3(a.scaleX)}/${n3(a.scaleY)}` : \"\"}`);\n else if (a.type === \"mesh\") extra.push(`${a.id}=mesh(${a.uvs.length / 2}v, ${a.triangles.length / 3}t, hull ${a.hull}${a.weights ? `, weighted by ${[...new Set(a.weights.flat().map(i => i.bone))].join(\",\")}` : \"\"})`);\n else extra.push(`${a.id}=path`);\n }\n if (s.alpha !== 1) extra.push(`alpha ${n3(s.alpha)}`);\n if (s.blend !== \"normal\") extra.push(`blend ${s.blend}`);\n if (s.color !== \"#ffffffff\") extra.push(`color ${s.color}`);\n return extra.length ? \" [\" + extra.join(\"; \") + \"]\" : \"\";\n };\n const walk = (b: Bone, d: number) => {\n const t = b.transform, s = doc.slots.filter(s => s.bone === b.id).map(s => `${s.id}\u2192${s.attachment ?? \"\u2205\"} z${s.z}${opts.verbose ? place(s) : \"\"}`).join(\", \");\n lines.push(`${\" \".repeat(d)}\u2022 ${b.id}${b.role ? ` [${b.role}]` : \"\"} (${t.x},${t.y} r${t.rotation} s${t.scaleX}/${t.scaleY})${s ? ` slots: ${s}` : \"\"}`);\n kids(b.id).forEach(c => walk(c, d + 1));\n };\n lines.push(\"bones:\"); kids(undefined).forEach(b => walk(b, 1));\n lines.push(`assets: ${doc.assets.map(a => `${a.id}(${a.width}x${a.height})`).join(\", \") || \"none\"}`);\n // constraints: one line for the whole set in a compact summary, one line each WITH the fields that decide\n // what they do when verbose (an agent cannot judge a constraint from `id(bones\u2192target)` alone)\n const ord = (c: { order: number }) => (c.order ? ` order ${c.order}` : \"\");\n if (doc.ik.length || doc.transform.length || doc.path.length) {\n if (opts.verbose) lines.push(\"constraints:\",\n ...doc.ik.map(c => ` ik ${c.id}(${c.bones.join(\",\")}\u2192${c.target}) mix ${n3(c.mix)} bend${c.bendPositive ? \"+\" : \"-\"}${c.softness ? ` soft ${n3(c.softness)}` : \"\"}${c.compress ? \" compress\" : \"\"}${c.stretch ? \" stretch\" : \"\"}${c.uniform ? \" uniform\" : \"\"}${ord(c)}`),\n ...doc.transform.map(c => ` transform ${c.id}(${c.bones.join(\",\")}\u2192${c.target})${c.local ? \" local\" : \"\"}${c.relative ? \" relative\" : \"\"} mix ${[c.mixRotate, c.mixX, c.mixY, c.mixScaleX, c.mixScaleY, c.mixShearY].map(n3).join(\"/\")}${ord(c)}`),\n ...doc.path.map(c => ` path ${c.id}(${c.bones.join(\",\")}\u2192${c.target}) ${c.positionMode}/${c.spacingMode}/${c.rotateMode} pos ${n3(c.position)} spacing ${n3(c.spacing)} mix ${[c.mixRotate, c.mixX, c.mixY].map(n3).join(\"/\")}${ord(c)}`));\n else lines.push(`constraints: ${[...doc.ik.map(c => `ik ${c.id}(${c.bones.join(\",\")}\u2192${c.target})`), ...doc.transform.map(c => `transform ${c.id}(${c.bones.length}\u2192${c.target})`), ...doc.path.map(c => `path ${c.id}(${c.bones.length}\u2192${c.target})`)].join(\", \")}`);\n }\n lines.push(\"animations:\");\n for (const a of doc.animations) {\n lines.push(` \u2022 ${a.id} ${a.duration}s${a.loop ? \" loop\" : \"\"} ${a.tracks.length} tracks${a.preset ? ` preset=${a.preset.name} ${JSON.stringify(a.preset.params)}` : \"\"}${a.events.length ? ` events=${a.events.map(e => `${e.name}@${e.t}`).join(\",\")}` : \"\"}`);\n if (opts.verbose) for (const t of a.tracks) lines.push(` ${t.target}.${t.id}.${t.prop}: ${trackSummary(t)}`);\n }\n const errs = validate(doc);\n if (errs.length) lines.push(\"ERRORS:\", ...errs.map(e => \" \" + e));\n return lines.join(\"\\n\");\n}\n\n// ---------- pose report (agent feedback) ----------\n\nexport interface PoseReport {\n animation?: string; t: number;\n /** the animation's duration, so a caller can see that a `t` beyond it was clamped rather than sampled */\n duration?: number;\n bones: { id: string; x: number; y: number; angle: number; scaleX: number; scaleY: number;\n local: { x: number; y: number; rotation: number } }[];\n slots: { id: string; attachment: string | null; bbox?: [number, number, number, number] }[];\n}\n\n/**\n * Where every bone and slot actually IS after `evaluate`: posed, not rest \u2014 constraints have run, so this is\n * what the runtime draws. Without `animation`, the pose is empty (rest); `bones`/`slots` narrow the report and\n * an id the document does not have is an error, not a silent drop, so a typo shows up at once.\n */\nexport function poseReport(doc: Doc, opts: { animation?: string; t?: number; bones?: string[]; slots?: string[] }): PoseReport {\n const t = opts.t ?? 0;\n let pose: Pose = new Map();\n // an id that is not there gets the same answer everywhere: what was asked for, and enough of what exists to fix it\n const missing = (kind: string, id: string, have: string[]) =>\n new Error(`unknown ${kind} \"${id}\" (the document has ${have.length}: ${have.slice(0, 12).join(\", \")}${have.length > 12 ? \", \u2026\" : \"\"})`);\n let duration: number | undefined;\n if (opts.animation !== undefined) {\n const anim = doc.animations.find(a => a.id === opts.animation);\n if (!anim) throw missing(\"animation\", opts.animation, doc.animations.map(a => a.id));\n // `sample` holds the last key past the end, so a t beyond `duration` is a silently different question from\n // the one asked \u2014 not an error (a caller scrubbing past the end is legitimate), but it has to be said\n duration = anim.duration;\n pose = poseOf(anim, t);\n } else if (opts.t !== undefined) {\n // a time with nothing to sample is a mistake worth naming: the answer would have been the rest pose, silently\n throw new Error(`t=${opts.t} needs an animation to mean anything; omit it for the rest pose`);\n }\n const skel = evaluate(doc, pose);\n for (const id of opts.bones ?? []) if (!skel.bones.has(id)) throw missing(\"bone\", id, doc.bones.map(b => b.id));\n for (const id of opts.slots ?? []) if (!doc.slots.some(s => s.id === id)) throw missing(\"slot\", id, doc.slots.map(s => s.id));\n\n const bones = (opts.bones ?? doc.bones.map(b => b.id)).map(id => {\n const st = skel.bones.get(id)!;\n const { x, y, angle, scaleX, scaleY } = decompose(st.world);\n return { id, x: round6(x), y: round6(y), angle: round6(angle), scaleX: round6(scaleX), scaleY: round6(scaleY),\n local: { x: round6(st.x), y: round6(st.y), rotation: round6(st.rotation) } };\n });\n const slots = (opts.slots ?? doc.slots.map(s => s.id)).map(id => {\n const att = skel.attachment.get(id);\n const pts = slotOutline(doc, pose, id, 1, skel);\n let bbox: [number, number, number, number] | undefined;\n if (pts) {\n const xs = pts.map(p => p[0]), ys = pts.map(p => p[1]);\n bbox = [round6(Math.min(...xs)), round6(Math.min(...ys)), round6(Math.max(...xs)), round6(Math.max(...ys))];\n }\n return { id, attachment: att ? att.id : null, bbox };\n });\n return { animation: opts.animation, t, duration, bones, slots };\n}\n\n/**\n * A bone sent to a point in DOCUMENT coordinates \u2014 the gesture a human gets by dragging the bone in the editor.\n *\n * The point is converted through the parent's world matrix TAKEN FROM THE POSE AT `t`, never from rest: a goal\n * solved against the setup pose is exact at rest and off by the parent's animated turn in every other frame.\n * Which bone is actually written follows the editor's rule (`Stage.grabDriven`), because a bone a solver owns\n * cannot be posed by writing it \u2014 a live ik hands the edit to its target bone, a live transform or path refuses.\n */\nexport function setGoal(doc: Doc, bone: string, x: number, y: number, opts: { animation?: string; t?: number; ease?: EaseSpec }): { doc: Doc; wrote: string; redirected?: string; origin: Pt; tip: Pt } {\n if (!doc.bones.some(b => b.id === bone)) throw new Error(`unknown bone \"${bone}\"`);\n // the same refusal rig_get_pose makes: a time with nothing to sample would silently mean \"the rest pose\",\n // and an easing with no key to carry it is the same kind of argument that quietly does nothing\n const stray = opts.t !== undefined ? `t=${opts.t}` : opts.ease !== undefined ? \"ease\" : undefined;\n if (opts.animation === undefined && stray)\n throw new Error(`${stray} needs an animation to mean anything; omit it to move the setup pose`);\n const t = opts.t ?? 0;\n // an animation that does not exist yet has no keys, so its pose is the rest one; `setKeys` creates it below\n const anim = opts.animation === undefined ? undefined : doc.animations.find(a => a.id === opts.animation);\n const pose: Pose = anim ? poseOf(anim, t) : new Map();\n\n const driver = driverAt(doc, pose, bone);\n if (driver && driver.kind !== \"ik\")\n // no \"move its target\" here: a path constraint's target is a SLOT, and a transform constraint with mixX/mixY\n // at 0 does not take its follower's position from the target at all \u2014 the mix is the only general remedy\n throw new Error(`bone \"${bone}\" is driven by ${driver.kind} constraint \"${driver.id}\"${anim ? ` at t=${t}` : \"\"}: the solver overwrites whatever is written here \u2014 ` +\n `edit the constraint, or key its mix to 0 where you want to pose the bone by hand`);\n const wrote = driver ? driver.target : bone;\n const written = doc.bones.find(b => b.id === wrote);\n if (!written) throw new Error(`ik \"${driver!.id}\" drives \"${bone}\" but its target bone \"${wrote}\" is gone`);\n\n const parent = written.parent ? evaluate(doc, pose).bones.get(written.parent)!.world : undefined;\n // 9 decimals, the same digits the editor's gizmos write (`round9`, editor/gizmos.ts): re-evaluating the rig\n // still reproduces the world matrix, and rig.json keeps no 17-digit float for a round number\n const [lx, ly] = (parent ? apply(invert(parent), x, y) : [x, y]).map(v => +v.toFixed(9) + 0); // a root bone's parent space IS the document\n const redirected = driver?.id;\n let next = doc;\n if (opts.animation === undefined) next = updateBone(doc, wrote, { transform: { x: lx, y: ly } });\n else for (const [prop, v] of [[\"x\", lx], [\"y\", ly]] as const)\n next = setKeys(next, opts.animation, { target: \"bone\", id: wrote, prop } as Omit<Track, \"keys\">, [{ t, v, ease: opts.ease }], undefined, { merge: true });\n\n // Writing the local x/y that solves for the goal is not the same as the goal landing. `driverAt` was asked\n // about `bone`; nobody asked about `wrote` \u2014 an ik target can itself sit under a live transform constraint, or\n // be parented INSIDE the chain that aims at it (devil's `devil_leg_l_ik` hangs off `devil_foot_l_ik`, and a\n // goal on `devil_foot_l` ends 3300 px away). A human sees the limb fly across the canvas; the agent sees \"ok\".\n // So the answer is checked against an evaluate of the RESULT, once, where every path meets.\n const after: Pose = opts.animation === undefined ? new Map() : poseOf(next.animations.find(a => a.id === opts.animation)!, t);\n const skel = evaluate(next, after);\n const landed = skel.bones.get(wrote)!.world;\n const miss = Math.hypot(landed.tx - x, landed.ty - y);\n // the reviewer's ross sweep put 3570 goals within 8e-10 px, so a 1e-3 px miss is a real one, not rounding\n if (miss > 1e-3) {\n const owner = driverAt(next, after, wrote);\n const chain = redirected ? (doc.ik.find(c => c.id === redirected)?.bones ?? []) : [];\n const inChain: string[] = [];\n for (let p = written.parent; p; p = doc.bones.find(b => b.id === p)?.parent) if (chain.includes(p)) inChain.push(p);\n throw new Error(`\"${wrote}\" ended at ${round6(landed.tx)}, ${round6(landed.ty)} \u2014 ${round6(miss)} px from the goal ${x}, ${y}; nothing was written. ` +\n (owner ? `\"${wrote}\" is itself driven by ${owner.kind} constraint \"${owner.id}\"${anim ? ` at t=${t}` : \"\"}: key its mix to 0 there, or aim at a bone the solver does not own.`\n : inChain.length ? `\"${wrote}\" hangs off \"${inChain[0]}\", which ik \"${redirected}\" moves: the target follows what it aims, so no local value settles. Reparent it outside the chain.`\n : `something downstream of the write moves it \u2014 check what \"${wrote}\" inherits.`));\n }\n const named = skel.bones.get(bone)!;\n const pt = (p: [number, number]): Pt => [round6(p[0]), round6(p[1])];\n return { doc: next, wrote, redirected,\n origin: pt([named.world.tx, named.world.ty]),\n tip: pt(apply(named.world, doc.bones.find(b => b.id === bone)!.length, 0)) };\n}\n", "/**\n * rig-import-layers \u2014 node-only: reads PNG layers off disk and imports them into a RigDocument.\n * Split out of rig-tools.ts so that module stays browser-bundleable (no node:* imports).\n */\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport { RigSchema, type RigDocument } from \"./rig-format\";\nimport { setSlot, setAttachment, addBone, placementFromPivot } from \"./rig-tools\";\n\ntype Doc = RigDocument;\n\n// ---------- import layers ----------\n\n/**\n * Optional sidecar `layers.json` in the layers dir (written by the segmentation step):\n * [{ \"file\": \"arm_l.png\", \"id\": \"arm_l\", \"role\": \"arm_l\", \"parent\": \"torso\", \"z\": 3,\n * \"bbox\": [x, y, w, h], \"joint\": [x, y], \"inpainted\": true, \"prompt\": \"...\" }]\n * Without it: every PNG is a full-canvas layer, id/role from filename (`03_arm_l.png` \u2192 z=3, id=arm_l).\n * Layers are assumed to share the document canvas size unless bbox is given.\n */\nexport interface LayerSpec {\n file: string; id?: string; role?: string; parent?: string; z?: number;\n bbox?: [number, number, number, number]; joint?: [number, number];\n inpainted?: boolean; prompt?: string; sourceImage?: string;\n /** swap patch (closed eyes, mouth shape): no bone of its own, slot on `parent`'s bone, hidden until an animation shows it */\n swap?: boolean;\n /** attach to this existing bone instead of creating one (accessory drawn with the bone, e.g. a hat on `head`) */\n bone?: string;\n /** slot id for swap layers; several assets with the same `slot` become one hidden slot (mouth shapes) */\n slot?: string;\n /** blend mode of the slot (`add` for glow/fire layers painted on black) */\n blend?: \"normal\" | \"add\" | \"multiply\" | \"screen\";\n}\n\nconst DEFAULT_PARENT: Record<string, string> = {\n head: \"neck\", neck: \"torso\", torso: \"hips\", hips: \"root\", body: \"root\",\n arm_l: \"torso\", arm_r: \"torso\", arm_upper_l: \"torso\", arm_upper_r: \"torso\",\n forearm_l: \"arm_upper_l\", forearm_r: \"arm_upper_r\", hand_l: \"forearm_l\", hand_r: \"forearm_r\",\n leg_l: \"hips\", leg_r: \"hips\", hair: \"head\", eyes: \"head\", mouth: \"head\",\n};\n\nexport function pngSize(buf: Buffer): [number, number] {\n if (buf.length < 24 || buf.readUInt32BE(0) !== 0x89504e47 || buf.readUInt32BE(4) !== 0x0d0a1a0a) throw new Error(\"not a PNG (bad signature)\");\n if (buf.readUInt32BE(12) !== 0x49484452) throw new Error(\"not a PNG (IHDR missing)\");\n return [buf.readUInt32BE(16), buf.readUInt32BE(20)];\n}\n\nexport async function importLayers(doc: Doc, dir: string, relPrefix = \"layers\"): Promise<Doc> {\n let specs: LayerSpec[];\n try { specs = JSON.parse(await readFile(join(dir, \"layers.json\"), \"utf8\")); }\n catch { specs = (await readdir(dir)).filter(f => f.endsWith(\".png\")).sort().map(file => ({ file })); }\n\n let next = doc;\n const parsed: (LayerSpec & { id: string; z: number; role?: string; w: number; h: number; bbox: [number, number, number, number] })[] = [];\n for (const s of specs) {\n const buf = await readFile(join(dir, s.file));\n const [w, h] = pngSize(buf);\n const m = basename(s.file, \".png\").match(/^(?:(\\d+)_)?(.+)$/)!;\n const id = s.id ?? m[2].toLowerCase().replace(/[^a-z0-9_]/g, \"_\");\n const z = s.z ?? (m[1] ? +m[1] : parsed.length);\n const role = s.role ?? (DEFAULT_PARENT[id] || id === \"root\" ? id : undefined);\n const bbox: [number, number, number, number] = s.bbox ?? [0, 0, w, h];\n parsed.push({ ...s, id, z, role, w, h, bbox });\n }\n const ids = new Set(parsed.map(p => p.id));\n const rootId = next.bones.find(b => !b.parent)!.id;\n const exists = (id: string) => ids.has(id) || next.bones.some(b => b.id === id);\n // explicit parent, else walk the role chain (head\u2192neck\u2192torso\u2192hips\u2192root) to the first bone that exists\n const resolveParent = (p: (typeof parsed)[number]): string => {\n if (p.parent && exists(p.parent)) return p.parent;\n let cur = p.role && DEFAULT_PARENT[p.role];\n while (cur && !exists(cur)) cur = DEFAULT_PARENT[cur];\n return cur ?? rootId;\n };\n // the bone a layer hangs from: explicit `bone`, else its (resolved) parent\n const dependency = (p: (typeof parsed)[number]) => (p.bone && exists(p.bone) ? p.bone : resolveParent(p));\n const pending = [...parsed];\n while (pending.length) {\n const i = pending.findIndex(p => next.bones.some(b => b.id === dependency(p)));\n const p = pending.splice(i < 0 ? 0 : i, 1)[0];\n const target = dependency(p);\n if (!next.bones.some(b => b.id === target)) throw new Error(`layer \"${p.id}\": bone \"${target}\" is neither in the rig nor in the import`);\n const [bx, by, bw, bh] = p.bbox;\n const joint = p.joint ?? [bx + bw / 2, by + bh / 2];\n // bone transform is local: convert world joint \u2192 parent space (parents are unrotated at import)\n const host = worldOf(next, target);\n next = { ...next, assets: [...next.assets, RigSchema.shape.assets.element.parse({\n id: p.id, src: `${relPrefix}/${p.file}`, width: p.w, height: p.h,\n origin: { sourceImage: p.sourceImage, bbox: s_bbox(p), inpainted: p.inpainted ?? false, prompt: p.prompt },\n })] };\n const pivot = { x: (joint[0] - bx) / bw, y: (joint[1] - by) / bh };\n if (p.swap || p.bone) {\n const slotId = p.slot ?? p.id;\n if (!next.slots.some(s => s.id === slotId)) next = setSlot(next, { id: slotId, bone: target, z: p.z, blend: p.blend });\n // the image centre relative to the host bone: joint offset + centre-from-pivot\n next = setAttachment(next, { id: p.id, slot: slotId, asset: p.id, ...placementFromPivot(pivot, { x: joint[0] - host.x, y: joint[1] - host.y }, p.w, p.h) });\n if (!p.swap) next = setSlot(next, { id: slotId, attachment: p.id });\n continue;\n }\n if (!next.bones.some(b => b.id === p.id))\n next = addBone(next, { id: p.id, parent: target, role: p.role, transform: { x: joint[0] - host.x, y: joint[1] - host.y, rotation: 0, scaleX: 1, scaleY: 1 } });\n next = setSlot(next, { id: p.id, bone: p.id, z: p.z, blend: p.blend });\n next = setAttachment(next, { id: p.id, slot: p.id, asset: p.id, ...placementFromPivot(pivot, {}, p.w, p.h) });\n next = setSlot(next, { id: p.id, attachment: p.id });\n }\n return next;\n}\n\nconst s_bbox = (p: { bbox: [number, number, number, number] }) => p.bbox;\n\nfunction worldOf(doc: Doc, id: string): { x: number; y: number } {\n const b = doc.bones.find(b => b.id === id)!;\n const p = b.parent ? worldOf(doc, b.parent) : { x: 0, y: 0 };\n return { x: p.x + b.transform.x, y: p.y + b.transform.y };\n}\n", "/**\n * rig-presets v1 \u2014 parametric animation generators.\n *\n * A preset = (doc, params) \u2192 Animation. The Animation keeps `preset: {name, params}`\n * so an agent can re-tune params instead of editing keys.\n * Presets pick bones by `role`; missing roles are skipped, root is the fallback.\n * Image deformation (rig-deform.ts) goes through `deform` tracks on slots: breathing bulges the torso\n * image with the neck and waist pinned instead of scaling the torso bone (which stretched children).\n */\nimport type { RigDocument, Animation, Track, Bone, Slot } from \"./rig-format\";\nimport { affineOf, apply } from \"./rig-anim\";\n\ntype Key = Track[\"keys\"][number];\ntype Ease = Key[\"ease\"];\n\n// ---------- helpers ----------\n\nconst root = (doc: RigDocument) => doc.bones.find(b => !b.parent)!;\nconst byRole = (doc: RigDocument, ...roles: string[]) =>\n doc.bones.filter(b => b.role && roles.includes(b.role));\n/** the visible slot that carries a bone's image: same id as the bone, else the first attached slot on it */\nconst slotOfBone = (doc: RigDocument, bone: Bone): Slot | undefined =>\n doc.slots.find(s => s.bone === bone.id && s.id === bone.id && s.attachment) ?? doc.slots.find(s => s.bone === bone.id && s.attachment);\nconst requireSlot = (doc: RigDocument, id: string): Slot => {\n const s = doc.slots.find(s => s.id === id);\n if (!s) throw new Error(`unknown slot \"${id}\"`);\n return s;\n};\n\n/** sample f(t) into keys */\nfunction sampled(duration: number, n: number, f: (t: number) => number, ease: Ease = \"linear\"): Key[] {\n const keys: Key[] = [];\n for (let i = 0; i <= n; i++) {\n const t = +((duration * i) / n).toFixed(4);\n keys.push({ t, v: +f(t).toFixed(4) + 0, ease });\n }\n return keys;\n}\n\nfunction boneTrack(bone: Bone, prop: \"x\" | \"y\" | \"rotation\" | \"scaleX\" | \"scaleY\", keys: Key[]): Track {\n return { target: \"bone\", id: bone.id, prop, keys };\n}\n/** lattice deform on the slot's REST attachment (deform tracks target attachments) */\nfunction deformTrack(slot: Slot, prop: string, keys: Key[]): Track | undefined {\n return slot.attachment ? { target: \"deform\", id: slot.attachment, prop, keys } : undefined;\n}\nconst pushTrack = (tracks: Track[], t: Track | undefined) => { if (t) tracks.push(t); };\nfunction slotTrack(slot: Slot, prop: \"alpha\" | \"attachment\" | \"z\", keys: Key[]): Track {\n return { target: \"slot\", id: slot.id, prop, keys };\n}\n\n/** keys as explicit [t, v, ease?] tuples \u2014 for hand-shaped curves */\nconst K = (...pts: [number, number, Ease?][]): Key[] =>\n pts.map(([t, v, e]) => ({ t, v, ease: e ?? \"ease_in_out\" }));\n/** discrete keys: [t, value] with step easing */\nconst S = (...pts: [number, string | null][]): Key[] => pts.map(([t, v]) => ({ t, v, ease: \"step\" }));\n\nexport interface Preset<P> {\n name: string;\n defaults: P;\n build(doc: RigDocument, params: P): Animation;\n}\n\nfunction finish<P>(name: string, id: string, duration: number, loop: boolean, tracks: Track[], params: P): Animation {\n return { id, duration, loop, tracks, events: [], preset: { name, params: params as Record<string, unknown> } };\n}\n\n// ---------- idle_breathing ----------\n\nexport interface IdleBreathingParams {\n id: string;\n period: number; // seconds per breath\n amplitude: number; // torso bulge (fraction of the image width) \u2014 or scaleY delta when the torso bone has no image\n headBob: number; // px\n armSway: number; // degrees\n}\n\nexport const idleBreathing: Preset<IdleBreathingParams> = {\n name: \"idle_breathing\",\n defaults: { id: \"idle\", period: 2.4, amplitude: 0.03, headBob: 3, armSway: 2 },\n build(doc, p) {\n const T = p.period, w = (2 * Math.PI) / T, tracks: Track[] = [];\n const torso = byRole(doc, \"torso\", \"body\")[0] ?? root(doc);\n const heads = byRole(doc, \"head\");\n const armsL = byRole(doc, \"arm_l\", \"arm_upper_l\");\n const armsR = byRole(doc, \"arm_r\", \"arm_upper_r\");\n\n const chest = slotOfBone(doc, torso);\n if (chest?.attachment) {\n // deform the image with neck and waist pinned; children (head, arms) are untouched\n pushTrack(tracks, deformTrack(chest, \"bulge\", sampled(T, 8, t => p.amplitude * Math.sin(w * t), \"ease_in_out\")));\n } else {\n const r = torso.transform;\n tracks.push(boneTrack(torso, \"scaleY\", sampled(T, 8, t => r.scaleY + p.amplitude * Math.sin(w * t), \"ease_in_out\")));\n tracks.push(boneTrack(torso, \"scaleX\", sampled(T, 8, t => r.scaleX - p.amplitude * 0.4 * Math.sin(w * t), \"ease_in_out\")));\n }\n for (const h of heads)\n tracks.push(boneTrack(h, \"y\", sampled(T, 8, t => h.transform.y - p.headBob * Math.sin(w * t + 0.4), \"ease_in_out\")));\n for (const a of armsL)\n tracks.push(boneTrack(a, \"rotation\", sampled(T, 8, t => a.transform.rotation + p.armSway * Math.sin(w * t + 0.8), \"ease_in_out\")));\n for (const a of armsR)\n tracks.push(boneTrack(a, \"rotation\", sampled(T, 8, t => a.transform.rotation - p.armSway * Math.sin(w * t + 0.8), \"ease_in_out\")));\n return finish(this.name, p.id, T, true, tracks, p);\n },\n};\n\n// ---------- win_bounce ----------\n\nexport interface WinBounceParams {\n id: string;\n duration: number;\n height: number; // px, first jump\n bounces: number; // 1..3\n squash: number; // 0.15 = 15% squash on landing\n}\n\nexport const winBounce: Preset<WinBounceParams> = {\n name: \"win_bounce\",\n defaults: { id: \"win\", duration: 1.2, height: 40, bounces: 2, squash: 0.15 },\n build(doc, p) {\n const b = root(doc), r = b.transform, tracks: Track[] = [];\n const yK: [number, number, Ease?][] = [[0, r.y, \"ease_out\"]];\n const sxK: [number, number, Ease?][] = [[0, r.scaleX, \"ease_out\"]];\n const syK: [number, number, Ease?][] = [[0, r.scaleY, \"ease_out\"]];\n // each bounce: up (decaying height) then land with squash\n const per = p.duration / p.bounces;\n for (let i = 0; i < p.bounces; i++) {\n const t0 = i * per, h = p.height * 0.55 ** i, s = p.squash * 0.7 ** i;\n // anticipation squash \u2192 apex stretch \u2192 landing squash\n sxK.push([t0 + per * 0.08, r.scaleX * (1 + s), \"ease_out\"], [t0 + per * 0.5, r.scaleX * (1 - s * 0.6), \"ease_in\"], [t0 + per * 0.95, r.scaleX * (1 + s), \"ease_out\"]);\n syK.push([t0 + per * 0.08, r.scaleY * (1 - s), \"ease_out\"], [t0 + per * 0.5, r.scaleY * (1 + s * 0.6), \"ease_in\"], [t0 + per * 0.95, r.scaleY * (1 - s), \"ease_out\"]);\n yK.push([t0 + per * 0.08, r.y, \"ease_out\"], [t0 + per * 0.5, r.y - h, \"ease_in\"], [t0 + per * 0.95, r.y, \"ease_out\"]);\n }\n yK.push([p.duration, r.y]); sxK.push([p.duration, r.scaleX]); syK.push([p.duration, r.scaleY]);\n tracks.push(boneTrack(b, \"y\", K(...yK)), boneTrack(b, \"scaleX\", K(...sxK)), boneTrack(b, \"scaleY\", K(...syK)));\n for (const h of byRole(doc, \"head\"))\n tracks.push(boneTrack(h, \"rotation\", K([0, h.transform.rotation], [p.duration * 0.25, h.transform.rotation - 6, \"back_out\"], [p.duration * 0.6, h.transform.rotation + 4], [p.duration, h.transform.rotation])));\n const anim = finish(this.name, p.id, p.duration, false, tracks, p);\n anim.events.push({ t: 0, name: \"win_start\" }, { t: per * 0.95, name: \"land\" });\n return anim;\n },\n};\n\n// ---------- anticipation_shake ----------\n\nexport interface AnticipationShakeParams {\n id: string;\n duration: number;\n amplitude: number; // px at the end\n frequency: number; // Hz\n grow: boolean; // ramp amplitude 0 \u2192 amplitude\n scaleUp: number; // final scale multiplier, e.g. 1.06\n}\n\nexport const anticipationShake: Preset<AnticipationShakeParams> = {\n name: \"anticipation_shake\",\n defaults: { id: \"anticipation\", duration: 1.5, amplitude: 4, frequency: 14, grow: true, scaleUp: 1.06 },\n build(doc, p) {\n const b = root(doc), r = b.transform, tracks: Track[] = [];\n // Half-period samples hit sin(k*PI) = 0 and erase translation entirely.\n const n = Math.ceil(p.duration * p.frequency * 4); // include quarter-cycle extrema\n const env = (t: number) => (p.grow ? t / p.duration : 1);\n tracks.push(boneTrack(b, \"x\", sampled(p.duration, n, t => r.x + p.amplitude * env(t) * Math.sin(2 * Math.PI * p.frequency * t), \"linear\")));\n tracks.push(boneTrack(b, \"rotation\", sampled(p.duration, n, t => r.rotation + 0.6 * p.amplitude * env(t) * Math.sin(2 * Math.PI * p.frequency * t + 1.2), \"linear\")));\n tracks.push(boneTrack(b, \"scaleX\", K([0, r.scaleX, \"ease_in\"], [p.duration, r.scaleX * p.scaleUp])));\n tracks.push(boneTrack(b, \"scaleY\", K([0, r.scaleY, \"ease_in\"], [p.duration, r.scaleY * p.scaleUp])));\n return finish(this.name, p.id, p.duration, false, tracks, p);\n },\n};\n\n// ---------- blink (swap layer) ----------\n\nexport interface BlinkParams {\n id: string;\n slot: string; // swap slot (hidden at rest) or the eyes slot\n closed?: string; // asset shown while closed; default: same id as the slot\n period: number; // seconds between blinks\n hold: number; // seconds closed\n}\n\nexport const blink: Preset<BlinkParams> = {\n name: \"blink\",\n defaults: { id: \"blink\", slot: \"eyes_closed\", period: 3.5, hold: 0.12 },\n build(doc, p) {\n const slot = requireSlot(doc, p.slot);\n const open = slot.attachment ?? null, closed = p.closed ?? slot.id;\n const at = +(p.period * 0.8).toFixed(4);\n const keys = S([0, open], [at, closed], [Math.min(+(at + p.hold).toFixed(4), p.period), open]);\n return finish(this.name, p.id, p.period, true, [slotTrack(slot, \"attachment\", keys)], p);\n },\n};\n\n// ---------- mouth_talk (swap cycle) ----------\n\nexport interface MouthTalkParams {\n id: string;\n slot: string;\n frames: (string | null)[]; // attachment ids (null = hidden / rest), cycled in order\n rate: number; // frames per second\n duration: number; // loop length in seconds\n}\n\nexport const mouthTalk: Preset<MouthTalkParams> = {\n name: \"mouth_talk\",\n defaults: { id: \"talk\", slot: \"mouth\", frames: [\"mouth_open\", null], rate: 8, duration: 1.5 },\n build(doc, p) {\n const slot = requireSlot(doc, p.slot);\n if (!p.frames.length) throw new Error(\"mouth_talk: frames must not be empty\");\n const n = Math.max(1, Math.round(p.duration * p.rate));\n const keys = S(...Array.from({ length: n }, (_, i): [number, string | null] => [+(i / p.rate).toFixed(4), p.frames[i % p.frames.length]]));\n return finish(this.name, p.id, p.duration, true, [slotTrack(slot, \"attachment\", keys)], p);\n },\n};\n\n// ---------- dim (state pose) ----------\n\nexport interface DimParams { id: string; alpha: number; duration: number }\n\nexport const dim: Preset<DimParams> = {\n name: \"dim\",\n defaults: { id: \"dim\", alpha: 0.4, duration: 0.25 },\n build(doc, p) {\n const tracks = doc.slots.filter(s => s.attachment).map(s => slotTrack(s, \"alpha\", K([0, s.alpha, \"ease_out\"], [p.duration, p.alpha])));\n return finish(this.name, p.id, p.duration, false, tracks, p);\n },\n};\n\n// ---------- symbol_idle ----------\n\nexport interface SymbolIdleParams {\n id: string;\n period: number;\n float: number; // px of vertical float\n pulse: number; // image bulge at the peak (fraction of width)\n tilt: number; // degrees of rotation sway\n}\n\nexport const symbolIdle: Preset<SymbolIdleParams> = {\n name: \"symbol_idle\",\n defaults: { id: \"idle\", period: 2.4, float: 4, pulse: 0.02, tilt: 1.5 },\n build(doc, p) {\n const b = root(doc), r = b.transform, T = p.period, w = (2 * Math.PI) / T, tracks: Track[] = [];\n const rise = (t: number) => 0.5 - 0.5 * Math.cos(w * t); // 0 at t=0 \u2192 1 \u2192 0\n tracks.push(boneTrack(b, \"y\", sampled(T, 8, t => r.y - p.float * rise(t), \"ease_in_out\")));\n if (p.tilt) tracks.push(boneTrack(b, \"rotation\", sampled(T, 8, t => r.rotation + p.tilt * Math.sin(w * t), \"ease_in_out\")));\n if (p.pulse) for (const s of doc.slots.filter(s => s.bone === b.id && s.attachment))\n pushTrack(tracks, deformTrack(s, \"bulge\", sampled(T, 8, t => p.pulse * rise(t), \"ease_in_out\")));\n return finish(this.name, p.id, T, true, tracks, p);\n },\n};\n\n// ---------- symbol_win ----------\n\nexport interface SymbolWinParams {\n id: string;\n duration: number;\n pop: number; // scale overshoot, 0.15 = +15%\n wobble: number; // jelly sway amplitude (fraction of width)\n wobbles: number; // oscillations over the duration\n}\n\nexport const symbolWin: Preset<SymbolWinParams> = {\n name: \"symbol_win\",\n defaults: { id: \"win\", duration: 0.9, pop: 0.15, wobble: 0.08, wobbles: 3 },\n build(doc, p) {\n const b = root(doc), r = b.transform, d = p.duration, tracks: Track[] = [];\n for (const [prop, rest] of [[\"scaleX\", r.scaleX], [\"scaleY\", r.scaleY]] as const)\n tracks.push(boneTrack(b, prop, K([0, rest, \"ease_out\"], [d * 0.2, rest * (1 + p.pop), \"ease_in_out\"], [d * 0.5, rest * (1 - p.pop * 0.3), \"ease_out\"], [d, rest])));\n if (p.wobble) {\n const n = Math.max(8, p.wobbles * 4);\n const keys = sampled(d, n, t => p.wobble * Math.exp(-3 * t / d) * Math.sin(2 * Math.PI * p.wobbles * t / d), \"ease_in_out\");\n keys[keys.length - 1].v = 0;\n for (const s of doc.slots.filter(s => s.bone === b.id && s.attachment)) pushTrack(tracks, deformTrack(s, \"sway\", keys));\n }\n const anim = finish(this.name, p.id, d, false, tracks, p);\n anim.events.push({ t: 0, name: \"win_start\" });\n return anim;\n },\n};\n\n// ---------- weight_shift ----------\n\nexport interface WeightShiftParams {\n id: string;\n period: number; // seconds for a full left-right-left cycle\n shift: number; // px of sideways hip travel\n lean: number; // degrees of torso counter-lean (head counters by half)\n dip: number; // px the hips sink at the extremes\n}\n\n/** Idle variation: hips sway sideways, torso leans against it, legs pivot so the feet stay planted (asin(shift/leg length)). */\nexport const weightShift: Preset<WeightShiftParams> = {\n name: \"weight_shift\",\n defaults: { id: \"idle_b\", period: 4, shift: 6, lean: 1.5, dip: 2 },\n build(doc, p) {\n const T = p.period, w = (2 * Math.PI) / T, N = 16, tracks: Track[] = [];\n const hips = byRole(doc, \"hips\")[0] ?? root(doc), hr = hips.transform;\n const s = (t: number) => Math.sin(w * t);\n tracks.push(boneTrack(hips, \"x\", sampled(T, N, t => hr.x + p.shift * s(t))));\n if (p.dip) tracks.push(boneTrack(hips, \"y\", sampled(T, N, t => hr.y + p.dip * s(t) ** 2)));\n const torso = byRole(doc, \"torso\", \"body\")[0];\n if (torso && torso !== hips) tracks.push(boneTrack(torso, \"rotation\", sampled(T, N, t => torso.transform.rotation - p.lean * s(t))));\n for (const h of byRole(doc, \"head\")) tracks.push(boneTrack(h, \"rotation\", sampled(T, N, t => h.transform.rotation + (p.lean / 2) * s(t))));\n for (const leg of byRole(doc, \"leg_l\", \"leg_r\")) {\n const slot = slotOfBone(doc, leg), att = slot && doc.attachments.find(a => a.id === slot.attachment && a.type === \"region\");\n const asset = att && att.type === \"region\" ? doc.assets.find(a => a.id === att.asset) : undefined;\n let length = leg.length;\n if (!length && att && att.type === \"region\" && asset) {\n const w = att.width ?? asset.width, h = att.height ?? asset.height, m = affineOf(att.x, att.y, att.rotation, att.scaleX, att.scaleY);\n // farthest edge midpoint of the placed image from the joint \u2248 the foot\n length = Math.max(...[[0, -h / 2], [w / 2, 0], [0, h / 2], [-w / 2, 0]].map(([x, y]) => Math.hypot(...apply(m, x, y))));\n }\n if (!(length > p.shift)) continue; // no image to measure the leg by \u2192 leave it\n tracks.push(boneTrack(leg, \"rotation\", sampled(T, N, t => leg.transform.rotation + (Math.asin((p.shift * s(t)) / length) * 180) / Math.PI)));\n // the hips sink, the feet do not: legs rise by the same dip (reads as a knee bend on a rigid cut-out)\n if (p.dip) tracks.push(boneTrack(leg, \"y\", sampled(T, N, t => leg.transform.y - p.dip * s(t) ** 2)));\n }\n return finish(this.name, p.id, T, true, tracks, p);\n },\n};\n\n// ---------- registry ----------\n\nexport const presets = {\n idle_breathing: idleBreathing,\n win_bounce: winBounce,\n anticipation_shake: anticipationShake,\n blink,\n mouth_talk: mouthTalk,\n dim,\n symbol_idle: symbolIdle,\n symbol_win: symbolWin,\n weight_shift: weightShift,\n} as const;\n\nexport type PresetName = keyof typeof presets;\n\n/** Build an animation from a preset name + partial params, replacing any animation with the same id. */\nexport function applyPreset(doc: RigDocument, name: PresetName, params: Record<string, unknown> = {}): RigDocument {\n const preset = presets[name] as Preset<any>;\n const anim = preset.build(doc, { ...preset.defaults, ...params });\n const animations = doc.animations.filter(a => a.id !== anim.id).concat(anim);\n return { ...doc, animations };\n}\n", "/**\n * preview/render-preview.ts \u2014 Node side. Drives headless Chromium via Playwright.\n *\n * Usage:\n * const r = await renderPreview(doc, { assetsDir: \"rigs/hero\", animation: \"idle\", fps: 8 });\n * fs.writeFileSync(\"sheet.png\", r.sheet); // hand this to the agent\n *\n * Browser is reused across calls (agents call this in a loop) \u2014 call closePreview() at the end.\n */\nimport { chromium, type Browser, type Page } from \"playwright\";\nimport { readFile } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parse, type RigDocument } from \"../rig-format\";\n\nexport interface PreviewOptions {\n /** directory that asset.src paths are relative to */\n assetsDir: string;\n animation?: string;\n /** explicit sample times, OR fps (+ optional count) evenly over the animation */\n times?: number[];\n fps?: number;\n count?: number;\n overlayBones?: boolean;\n background?: string;\n scale?: number;\n sheetColumns?: number;\n /** ghost the previous frame under each frame */\n onionSkin?: boolean;\n /** crop [x, y, w, h] in DOCUMENT pixels \u2014 zoom on a detail without spending tokens on the whole canvas */\n region?: [number, number, number, number];\n}\n\nexport interface PreviewResult {\n frames: Buffer[];\n sheet: Buffer;\n times: number[];\n width: number;\n height: number;\n}\n\nconst HERE = dirname(fileURLToPath(import.meta.url));\nlet browser: Browser | undefined;\nlet page: Page | undefined;\nlet harnessJs: string | undefined;\nlet pending: Promise<unknown> = Promise.resolve();\n\nasync function getPage(): Promise<Page> {\n if (page && !page.isClosed()) return page;\n if (browser && !browser.isConnected()) browser = undefined;\n browser ??= await chromium.launch({\n headless: true,\n args: [\"--use-angle=swiftshader\", \"--enable-unsafe-swiftshader\", \"--ignore-gpu-blocklist\"],\n });\n const next = await browser.newPage({ deviceScaleFactor: 1 });\n try {\n next.on(\"pageerror\", e => console.error(\"[harness]\", e.message));\n await next.setContent(`<!doctype html><html><body style=\"margin:0;background:transparent\"></body></html>`);\n harnessJs ??= await readFile(join(HERE, \"harness.js\"), \"utf8\");\n await next.addScriptTag({ content: harnessJs });\n page = next;\n return next;\n } catch (e) {\n await next.close();\n throw e;\n }\n}\n\nfunction enqueue<T>(op: () => Promise<T>): Promise<T> {\n const result = pending.then(op);\n pending = result.catch(() => {});\n return result;\n}\n\nexport function closePreview() {\n return enqueue(async () => {\n await browser?.close();\n browser = undefined; page = undefined;\n });\n}\n\nconst mime = (p: string) => (p.endsWith(\".webp\") ? \"image/webp\" : p.endsWith(\".jpg\") || p.endsWith(\".jpeg\") ? \"image/jpeg\" : \"image/png\");\nconst fromDataUrl = (u: string) => Buffer.from(u.slice(u.indexOf(\",\") + 1), \"base64\");\n\nexport function renderPreview(doc: RigDocument, opts: PreviewOptions): Promise<PreviewResult> {\n // One harness owns one scene. Concurrent MCP calls must not replace each other's rig.\n return enqueue(() => render(parse(doc), opts));\n}\n\nasync function render(doc: RigDocument, opts: PreviewOptions): Promise<PreviewResult> {\n const positive = (n: number, name: string, integer = false) => {\n if (!Number.isFinite(n) || n <= 0 || (integer && !Number.isInteger(n)))\n throw new Error(`${name} must be a positive ${integer ? \"integer\" : \"number\"}`);\n };\n positive(opts.fps ?? 8, \"fps\");\n positive(opts.scale ?? 1, \"scale\");\n positive(opts.sheetColumns ?? 4, \"sheetColumns\", true);\n if (opts.count !== undefined) positive(opts.count, \"count\", true);\n const anim = opts.animation === undefined ? undefined : doc.animations.find(a => a.id === opts.animation);\n if (opts.animation !== undefined && !anim) throw new Error(`unknown animation \"${opts.animation}\"`);\n if (opts.times && (!opts.times.length || opts.times.some(t => !Number.isFinite(t) || t < 0)))\n throw new Error(\"times must contain finite, nonnegative sample times\");\n if (opts.region && (opts.region.length !== 4 || opts.region.some(v => !Number.isFinite(v)) || opts.region[2] <= 0 || opts.region[3] <= 0))\n throw new Error(\"region must be [x, y, w, h] with positive w and h\");\n const sc = opts.scale ?? 1;\n const region = opts.region ? opts.region.map((v, i) => Math.round(v * sc) as number) as [number, number, number, number] : undefined;\n // resolve sample times\n let times = opts.times;\n if (!times) {\n if (!anim) times = [0];\n else {\n const fps = opts.fps ?? 8;\n const n = opts.count ?? Math.max(2, Math.round(anim.duration * fps));\n // loop \u2192 don't duplicate t=0 at the end; one-shot \u2192 include the final pose\n times = Array.from({ length: n }, (_, i) => n === 1 ? 0 : +((anim.duration * i) / (anim.loop ? n : n - 1)).toFixed(4));\n }\n }\n\n // asset files \u2192 data URLs keyed by src (agent-friendly: no file serving, no CORS; an atlas is read once)\n const assets: Record<string, string> = {};\n for (const a of doc.assets) {\n if (assets[a.src]) continue;\n const buf = await readFile(join(opts.assetsDir, a.src));\n assets[a.src] = `data:${mime(a.src)};base64,${buf.toString(\"base64\")}`;\n }\n\n const p = await getPage();\n const res = await p.evaluate(\n async ({ doc, assets, scale, ro }) => {\n const h = (window as any).rigHarness;\n await h.load(doc, assets, scale);\n return h.renderFrames(ro);\n },\n {\n doc, assets, scale: opts.scale ?? 1,\n ro: { animation: opts.animation, times, overlayBones: opts.overlayBones, background: opts.background, sheetColumns: opts.sheetColumns, onionSkin: opts.onionSkin, region },\n },\n );\n\n return {\n frames: res.frames.map(fromDataUrl),\n sheet: fromDataUrl(res.sheet),\n times, width: res.width, height: res.height,\n };\n}\n", "/**\n * rig-check \u2014 cheap self-critique for agents, computed from the document alone (no browser).\n *\n * Findings are hints, not a pass/fail gate: `rest_overlap` is normal for cut-out characters,\n * `out_of_canvas` may be intended for a jump. `deform_flip` and `mesh_fold` are the real errors (folded mesh/lattice);\n * `weights_sum` flags skinned-mesh vertices whose influence weights don't add to 1.\n *\n * `mesh_fold` is graded by how much of the mesh folds \u2014 the folded triangles' rest area over the mesh's total rest\n * area, at the worst sampled time. A dense mesh bent hard at a joint almost always pinches one hairline triangle\n * somewhere; that is a `warn`, not something to stop for. `error` is reserved for a fold big enough to see\n * (\u2265 `FOLD_ERROR_RATIO` of the mesh), which is what a torn limb or a collapsed silhouette looks like.\n *\n * Constraints get four of their own: `constraint_dead` (every mix is 0 at rest and no track lifts one \u2014 the solver\n * skips it), `constraint_cycle` (the target is a bone the constraint drives, or hangs off one: it reads what it\n * writes \u2014 an error), `ik_unreachable` (the target sits beyond the chain's reach for most of an animation, so the\n * limb hangs straight instead of following) and `path_missing` (a path constraint whose target slot never shows a\n * path attachment \u2014 an error).\n */\nimport { MIX_PROPS, type RigDocument, type Animation, type Track, type MeshAttachment, type IkConstraint } from \"./rig-format\";\nimport { poseOf, evaluate, slotOutline, regionMatrix, apply, deformParams, sample, restValue, pk, attachmentWorldVertices, type Pose } from \"./rig-anim\";\nimport { controlOffsets, minJacobian } from \"./rig-deform\";\nimport { foldedTriangles, triangleArea, meshArea } from \"./rig-mesh\";\nimport { ikReach } from \"./rig-constraints\";\n\n/** fraction of a mesh's rest area that has to fold before `mesh_fold` is an error rather than a warning: a limb\n * bent to its limit pinches a few percent of a dense mesh without reading as broken, a torn one loses far more */\nconst FOLD_ERROR_RATIO = 0.05;\n/** px the IK target may sit beyond the chain's reach before the chain counts as hanging straight (rounding, not authoring) */\nconst IK_SLACK = 1;\n/** share of an animation's frames that has to overshoot before `ik_unreachable` fires: a limb parked at full\n * extension for a beat is an idiom (that is how you lock a leg straight), a limb that never reaches is a bug */\nconst IK_UNREACHABLE_FRAMES = 0.2;\n\nexport interface Finding {\n level: \"error\" | \"warn\" | \"info\";\n code: string;\n /** slot / track / asset the finding is about */\n subject: string;\n message: string;\n animation?: string;\n time?: number;\n}\n\nexport interface CheckOptions {\n /** only this animation (plus the rest pose) */\n animation?: string;\n /** sampling rate for outlines (default 30) and for the fold check (default 60) */\n fps?: number;\n deformFps?: number;\n /** rest_overlap threshold as a fraction of the smaller box (default 0.6) */\n overlap?: number;\n /** px of allowed overflow before out_of_canvas fires (default 1) */\n margin?: number;\n}\n\nconst isNumeric = (t: Track) => t.target !== \"slot\" || t.prop !== \"attachment\";\nconst trackId = (t: Track) => `${t.target}.${t.id}.${t.prop}`;\nconst fmt = (n: number) => String(Math.round(n * 1000) / 1000);\nconst times = (a: Animation, fps: number) => {\n const n = Math.max(1, Math.round(a.duration * fps)), out: number[] = [];\n for (let i = 0; i <= n; i++) out.push(Math.min(a.duration, i / fps));\n return out;\n};\n\nexport function checkRig(doc: RigDocument, opts: CheckOptions = {}): Finding[] {\n const fps = opts.fps ?? 30, dfps = opts.deformFps ?? 60, overlapMin = opts.overlap ?? 0.6, margin = opts.margin ?? 1;\n const anims = opts.animation === undefined ? doc.animations : doc.animations.filter(a => a.id === opts.animation);\n if (opts.animation !== undefined && !anims.length) throw new Error(`unknown animation \"${opts.animation}\"`);\n const out: Finding[] = [];\n const W = doc.meta.width, H = doc.meta.height;\n\n // --- overflow helper: worst side of a slot outline against the canvas\n const overflowOf = (pose: Pose, slotId: string, skel: ReturnType<typeof evaluate>) => {\n const pts = slotOutline(doc, pose, slotId, 4, skel);\n if (!pts) return undefined;\n const slot = doc.slots.find(s => s.id === slotId)!, alphaV = pose.get(`slot:${slotId}:alpha`);\n const alpha = typeof alphaV === \"number\" ? alphaV : slot.alpha;\n if (alpha <= 0.01) return undefined; // invisible: cannot leave the canvas visibly\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (const [x, y] of pts) { minX = Math.min(minX, x); maxX = Math.max(maxX, x); minY = Math.min(minY, y); maxY = Math.max(maxY, y); }\n const sides: [string, number][] = [[\"left\", -minX], [\"right\", maxX - W], [\"top\", -minY], [\"bottom\", maxY - H]];\n sides.sort((a, b) => b[1] - a[1]);\n return { side: sides[0][0], px: sides[0][1], box: [minX, minY, maxX, maxY] as const };\n };\n\n // --- rest pose: overflow + overlap\n const parentOf = new Map(doc.bones.map(b => [b.id, b.parent]));\n const knownBones = new Set(doc.bones.map(b => b.id));\n const slotOf = new Map(doc.slots.map(s => [s.id, s]));\n const related = (a: string, b: string) => {\n for (let cur = parentOf.get(a); cur; cur = parentOf.get(cur)) if (cur === b) return true;\n for (let cur = parentOf.get(b); cur; cur = parentOf.get(cur)) if (cur === a) return true;\n return false;\n };\n const restPose: Pose = new Map(), restWorld = evaluate(doc, restPose);\n const restBoxes: { id: string; bone: string; box: readonly [number, number, number, number] }[] = [];\n for (const s of doc.slots) {\n const o = overflowOf(restPose, s.id, restWorld);\n if (!o) continue;\n restBoxes.push({ id: s.id, bone: s.bone, box: o.box });\n if (o.px > margin) out.push({ level: \"warn\", code: \"out_of_canvas\", subject: s.id,\n message: `slot \"${s.id}\" leaves the canvas by ${Math.round(o.px)}px (${o.side}) in the rest pose` });\n }\n for (let i = 0; i < restBoxes.length; i++) for (let j = i + 1; j < restBoxes.length; j++) {\n // a layer over its own ancestor's layer (arm over torso) is how cut-outs work; only unrelated bones are suspicious\n if (related(restBoxes[i].bone, restBoxes[j].bone)) continue;\n const a = restBoxes[i].box, b = restBoxes[j].box;\n const iw = Math.min(a[2], b[2]) - Math.max(a[0], b[0]), ih = Math.min(a[3], b[3]) - Math.max(a[1], b[1]);\n if (iw <= 0 || ih <= 0) continue;\n const smaller = Math.min((a[2] - a[0]) * (a[3] - a[1]), (b[2] - b[0]) * (b[3] - b[1]));\n const ratio = smaller > 0 ? (iw * ih) / smaller : 0;\n if (ratio >= overlapMin) out.push({ level: \"info\", code: \"rest_overlap\", subject: `${restBoxes[i].id}+${restBoxes[j].id}`,\n message: `slots \"${restBoxes[i].id}\" and \"${restBoxes[j].id}\" overlap ${Math.round(ratio * 100)}% of the smaller one in the rest pose` });\n }\n\n // --- constraints: never runs, reads what it writes, or aims at a path that is never shown\n //\n // These three are document-level: a dead constraint is only dead if NO animation revives it, so they look at\n // `doc.animations` even when `opts.animation` narrows the per-animation walks below.\n //\n // \"Mix\" is what switches a constraint on \u2014 one channel for IK, six for a transform, three for a path. Rest mixes\n // of 0 mean the solver skips it (`applyIk` returns on mix <= 0, `applyTransformConstraint`/`applyPathConstraint`\n // on all-zero mixes), so a track that keys any of them away from 0 is what keeps it alive. Away from 0, not\n // above it: a NEGATIVE mix is how a transform constraint is inverted (ross drives `anti_nose` with mixX -0.1).\n const keyedNonZero = new Set<string>(); // constraint track keys that are not all 0, by `kind:id:prop`\n for (const a of doc.animations) for (const t of a.tracks)\n if ((t.target === \"ik\" || t.target === \"transform\" || t.target === \"path\") && t.keys.some(k => typeof k.v === \"number\" && k.v !== 0))\n keyedNonZero.add(pk(t.target, t.id, t.prop));\n const attById = new Map(doc.attachments.map(a => [a.id, a]));\n /** every constraint with its rest mixes and the BONE its target resolves to \u2014 a path constraint aims at a slot */\n const constraints = [\n ...doc.ik.map(c => ({ kind: \"ik\" as const, id: c.id, bones: c.bones, target: c.target, mixes: [c.mix], targetBone: c.target })),\n ...doc.transform.map(c => ({ kind: \"transform\" as const, id: c.id, bones: c.bones, target: c.target,\n mixes: [c.mixRotate, c.mixX, c.mixY, c.mixScaleX, c.mixScaleY, c.mixShearY], targetBone: c.target })),\n ...doc.path.map(c => ({ kind: \"path\" as const, id: c.id, bones: c.bones, target: c.target,\n mixes: [c.mixRotate, c.mixX, c.mixY], targetBone: slotOf.get(c.target)?.bone })),\n ];\n for (const { kind, id, bones, target, mixes, targetBone } of constraints) {\n const props = MIX_PROPS[kind];\n if (mixes.every(m => m === 0) && !props.some(p => keyedNonZero.has(pk(kind, id, p))))\n out.push({ level: \"warn\", code: \"constraint_dead\", subject: id,\n message: `${kind} constraint \"${id}\" never runs: ${props.join(\"/\")} ${props.length === 1 ? \"is\" : \"are all\"} 0 in the rest pose and no animation keys ${props.length === 1 ? \"it\" : \"one\"} away from 0 \u2014 enable it with rig_set_${kind} {id: \"${id}\", ${props[0]}: 1} or key ${kind}.${id}.${props[0]}` });\n // the solver writes the constraint's bones (and, through them, their subtrees) and then reads the target: a\n // target inside that subtree is read after it was written, so the pose depends on the solve order\n if (targetBone !== undefined && knownBones.has(targetBone)) {\n let owner: string | undefined;\n for (let cur: string | undefined = targetBone; cur !== undefined && owner === undefined; cur = parentOf.get(cur)) if (bones.includes(cur)) owner = cur;\n if (owner !== undefined) out.push({ level: \"error\", code: \"constraint_cycle\", subject: id,\n message: `${kind} constraint \"${id}\" targets ${kind === \"path\" ? `slot \"${target}\", which sits on bone \"${targetBone}\"` : `bone \"${targetBone}\"`}${owner === targetBone ? \", one of the bones it drives\" : `, a descendant of \"${owner}\", one of the bones it drives`} \u2014 the solver reads what it writes; move the target off the chain (rig_add_ik_chain parents its target to the root)` });\n }\n }\n for (const c of doc.path) {\n const slot = slotOf.get(c.target);\n if (!slot) continue; // unknown slot: rig_validate's job, not a second report here\n const isPath = (attId: unknown) => typeof attId === \"string\" && attById.get(attId)?.type === \"path\";\n const shown = isPath(slot.attachment) || doc.animations.some(a => a.tracks.some(t =>\n t.target === \"slot\" && t.prop === \"attachment\" && t.id === slot.id && t.keys.some(k => isPath(k.v))));\n if (!shown) out.push({ level: \"error\", code: \"path_missing\", subject: c.id,\n message: `path constraint \"${c.id}\" follows slot \"${c.target}\", which never shows a path attachment (none at rest, none keyed) \u2014 draw the curve with rig_set_path_attachment and show it with rig_set_slot {id: \"${c.target}\", attachment: \u2026}` });\n }\n\n // --- IK that cannot reach: the chain hangs straight and stops following its target\n //\n // `stretch` closes the gap by lengthening the chain, so an overshooting stretchy IK is working as designed; mix 0\n // means the solver never ran. Both are read from the pose, so a track that turns either on mid-animation counts.\n //\n // ONE-bone IK is exempt: it does not reach, it AIMS \u2014 `applyIk` hands a single bone to `aimAt`, which only\n // rotates it towards the target. A head, an eye or a gun tracking a control bone parked far out in the world is\n // the normal way to author that, and it is out of reach in every frame; there is nothing to bend and nothing to\n // report. Only a two-bone chain can run out of reach and hang straight instead of following.\n const ikCheckable = doc.ik.filter(c => c.bones.length > 1 && c.bones.every(b => knownBones.has(b)) && knownBones.has(c.target));\n // keyed value, else the document's \u2014 the same read `applyIk` makes through `cnum`, so this sees the mix (and the\n // `stretch` flag) the solver saw at that frame; `mixAt` (rig-constraints.ts) is the exported form of it\n const poseNum = (pose: Pose, key: string, rest: number) => { const v = pose.get(key); return typeof v === \"number\" ? v : rest; };\n /** px the target sits beyond the chain's reach, or undefined when the constraint is off, stretchy, or reaching */\n const ikOvershoot = (skel: ReturnType<typeof evaluate>, c: IkConstraint) => {\n if (poseNum(skel.pose, pk(\"ik\", c.id, \"mix\"), c.mix) <= 0) return undefined;\n if (poseNum(skel.pose, pk(\"ik\", c.id, \"stretch\"), c.stretch ? 1 : 0) > 0.5) return undefined;\n const { distance, reach } = ikReach(skel, c);\n return distance > reach + IK_SLACK ? distance - reach : undefined;\n };\n for (const c of ikCheckable) {\n const over = ikOvershoot(restWorld, c);\n if (over !== undefined) out.push({ level: \"warn\", code: \"ik_unreachable\", subject: c.id,\n message: `IK \"${c.id}\" cannot reach \"${c.target}\" in the rest pose: ${Math.round(over)}px beyond the chain's reach \u2014 the chain hangs straight instead of bending; move the target closer or set stretch` });\n }\n\n // --- mesh folds: what CAN fold, and the rest geometry to grade a fold against\n //\n // A mesh folds when the bones that place it move apart, so the candidates cannot be read off the track list:\n // a mesh weighted to `n_neck1`/`n_neck2` folds as soon as an ANCESTOR of those bones is keyed, and a static walk\n // over the slot bone's ancestors (plus directly-keyed influences) misses exactly that case. Instead the walks\n // below \u2014 which already evaluate the whole skeleton per sampled time \u2014 ask the skeleton: a mesh is a candidate\n // at time `t` when any bone that places it (its slot's bone, or any of its influences) has a world transform\n // different from its rest one. The answer is cached per bone per time, so all 110 meshes share one comparison.\n const meshes = doc.attachments.filter((att): att is MeshAttachment => att.type === \"mesh\" && doc.slots.some(s => s.id === att.slot));\n const boneIds: string[] = [], boneSlot = new Map<string, number>();\n const slotFor = (id: string) => { let i = boneSlot.get(id); if (i === undefined) { i = boneIds.length; boneIds.push(id); boneSlot.set(id, i); } return i; };\n /** per mesh: the slots (in `boneIds`) of every bone that places it */\n const meshBones = new Map<string, number[]>();\n for (const att of meshes) {\n const set = new Set<string>();\n const slot = slotOf.get(att.slot);\n if (slot && knownBones.has(slot.bone)) set.add(slot.bone);\n if (att.weights) for (const list of att.weights) for (const inf of list) if (knownBones.has(inf.bone)) set.add(inf.bone);\n meshBones.set(att.id, [...set].map(slotFor));\n }\n const restAffines = boneIds.map(id => restWorld.bones.get(id)!.world);\n /** a bone whose world affine differs from its rest one by more than rounding noise can move a mesh off its rest shape */\n const MOVED_EPS = 1e-9;\n const movedFlags = (skel: ReturnType<typeof evaluate>) => {\n const flags = new Uint8Array(boneIds.length);\n for (let i = 0; i < boneIds.length; i++) {\n const w = skel.bones.get(boneIds[i])!.world, r = restAffines[i];\n flags[i] = Math.abs(w.a - r.a) > MOVED_EPS || Math.abs(w.b - r.b) > MOVED_EPS || Math.abs(w.c - r.c) > MOVED_EPS\n || Math.abs(w.d - r.d) > MOVED_EPS || Math.abs(w.tx - r.tx) > MOVED_EPS || Math.abs(w.ty - r.ty) > MOVED_EPS ? 1 : 0;\n }\n return flags;\n };\n // rest shape and rest area per mesh, filled on first use and shared by every animation\n const meshRest = new Map<string, number[]>(), restArea = new Map<string, number>();\n const restOf = (att: MeshAttachment) => {\n let rest = meshRest.get(att.id);\n if (!rest) {\n rest = attachmentWorldVertices(restWorld, att.slot, att);\n meshRest.set(att.id, rest);\n restArea.set(att.id, meshArea(rest, att.triangles));\n }\n return rest;\n };\n\n // --- per animation\n for (const a of anims) {\n // static tracks / loop seams\n for (const t of a.tracks) {\n if (!isNumeric(t)) continue;\n const vals = t.keys.map(k => k.v as number);\n if (vals.length >= 2 && vals.every(v => v === vals[0])) {\n const rest = restValue(doc, pk(t.target, t.id, t.prop));\n const atRest = typeof rest === \"number\" && Math.abs(rest - vals[0]) < 1e-9;\n out.push({ level: atRest ? \"warn\" : \"info\", code: \"static_track\", subject: trackId(t), animation: a.id,\n message: atRest\n ? `animation \"${a.id}\" ${trackId(t)}: all ${vals.length} keys equal the setup value ${fmt(vals[0])} \u2014 the track does nothing, drop it`\n : `animation \"${a.id}\" ${trackId(t)}: holds ${fmt(vals[0])}${typeof rest === \"number\" ? ` (setup ${fmt(rest)})` : \"\"} \u2014 a pose offset, not motion` });\n }\n if (a.loop) {\n const v0 = sample(t, 0) as number, v1 = sample(t, a.duration) as number;\n const range = Math.max(...vals) - Math.min(...vals);\n if (Math.abs(v0 - v1) > Math.max(1e-3, 0.01 * range))\n out.push({ level: \"warn\", code: \"loop_seam\", subject: trackId(t), animation: a.id,\n message: `animation \"${a.id}\" ${trackId(t)}: loop jumps from ${fmt(v1)} back to ${fmt(v0)} at the wrap (${fmt(v0)} \u2192 ${fmt(v1)})` });\n }\n }\n // Deform-authored meshes need dense (dfps) sampling to catch easing overshoot, checked below in the motion-pop\n // dfps walk (they stay in that group whether or not their bones move \u2014 the deform alone can fold them);\n // everything else is bone-driven, moves smoothly enough for fps, and is checked in the overflow-over-time fps\n // walk right below, at the times where its own bones have actually left the rest pose. Both walks already build\n // a full skeleton per sampled time for other checks, so the fold check reuses it instead of calling evaluate().\n const vertexKeyed = new Set(a.tracks.filter(t => t.target === \"deform\" && t.prop === \"vertices\").map(t => t.id));\n const deformMeshes = meshes.filter(att => vertexKeyed.has(att.id));\n const bonesMeshes = meshes.filter(att => !vertexKeyed.has(att.id));\n // the WORST sampled time, not the first one that folds: a fold that starts as a sliver and opens into a tear\n // has to be graded by how bad it gets, so every candidate mesh is sampled at EVERY time of its walk \u2014 there is\n // no early exit once a mesh has folded. Only the bookkeeping is per mesh: one entry, replaced whenever a later\n // sample folds a larger share of the rest area.\n const meshFolds = new Map<string, { t: number; n: number; k: number; ratio: number }>();\n const tryMeshFold = (att: MeshAttachment, skel: ReturnType<typeof evaluate>, t: number) => {\n const rest = restOf(att);\n const tris = foldedTriangles(rest, attachmentWorldVertices(skel, att.slot, att), att.triangles, 1);\n if (!tris.length) return;\n let folded = 0;\n for (const k of tris) folded += Math.abs(triangleArea(rest, att.triangles[3 * k], att.triangles[3 * k + 1], att.triangles[3 * k + 2]));\n const total = restArea.get(att.id)!;\n const ratio = total > 0 ? folded / total : 1;\n const prev = meshFolds.get(att.id);\n if (!prev || ratio > prev.ratio) meshFolds.set(att.id, { t, n: tris.length, k: tris[0], ratio });\n };\n // overflow over time (the IK reach check rides along on this walk \u2014 no second skeleton evaluation)\n const worst = new Map<string, { px: number; side: string; t: number }>();\n const ikOver = new Map<string, { frames: number; over: number; t: number }>();\n const fpsTimes = times(a, fps);\n for (const t of fpsTimes) {\n const pose = poseOf(a, t), world = evaluate(doc, pose);\n for (const s of doc.slots) {\n const o = overflowOf(pose, s.id, world);\n if (o && o.px > (worst.get(s.id)?.px ?? -Infinity)) worst.set(s.id, { px: o.px, side: o.side, t });\n }\n for (const c of ikCheckable) {\n const over = ikOvershoot(world, c);\n if (over === undefined) continue;\n const cur = ikOver.get(c.id);\n if (!cur) ikOver.set(c.id, { frames: 1, over, t });\n else { cur.frames++; if (over > cur.over) { cur.over = over; cur.t = t; } }\n }\n const moved = movedFlags(world);\n for (const att of bonesMeshes) if (meshBones.get(att.id)!.some(i => moved[i])) tryMeshFold(att, world, t);\n }\n for (const [slot, w] of worst) if (w.px > margin)\n out.push({ level: \"warn\", code: \"out_of_canvas\", subject: slot, animation: a.id, time: w.t,\n message: `slot \"${slot}\" leaves the canvas by ${Math.round(w.px)}px (${w.side}) at t=${w.t.toFixed(2)}s in \"${a.id}\"` });\n for (const c of ikCheckable) {\n const o = ikOver.get(c.id);\n if (o && o.frames > IK_UNREACHABLE_FRAMES * fpsTimes.length)\n out.push({ level: \"warn\", code: \"ik_unreachable\", subject: c.id, animation: a.id, time: o.t,\n message: `IK \"${c.id}\" cannot reach \"${c.target}\" in ${Math.round(100 * o.frames / fpsTimes.length)}% of \"${a.id}\" (worst ${Math.round(o.over)}px beyond the chain's reach at t=${o.t.toFixed(2)}s) \u2014 the chain hangs straight there instead of following the target` });\n }\n // keys with a step ease land their value at the next key's time: a pop there is the author's choice\n const stepTimes = a.tracks.flatMap(t => t.keys.slice(0, -1).map((k, i) => (k.ease === \"step\" ? t.keys[i + 1].t : -1)).filter(x => x >= 0));\n // motion pops: a bone that jumps far in one 60 fps frame compared with how it moves the rest of the time\n {\n const ts = times(a, dfps);\n const prev = new Map<string, [number, number]>();\n const deltas = new Map<string, { t: number; d: number }[]>();\n for (const t of ts) {\n const skel = evaluate(doc, poseOf(a, t)), world = skel.bones;\n for (const [id, { world: w }] of world) {\n const p = prev.get(id);\n if (p) (deltas.get(id) ?? deltas.set(id, []).get(id)!).push({ t, d: Math.hypot(w.tx - p[0], w.ty - p[1]) });\n prev.set(id, [w.tx, w.ty]);\n }\n for (const att of deformMeshes) tryMeshFold(att, skel, t);\n }\n for (const [id, ds] of deltas) {\n const sorted = ds.map(x => x.d).filter(d => d > 0).sort((x, y) => x - y);\n if (!sorted.length) continue;\n const typical = sorted[Math.floor(sorted.length / 2)];\n const worst = ds.reduce((m, x) => (x.d > m.d ? x : m), ds[0]);\n if (worst.d > Math.max(6, 5 * typical)) {\n const stepped = stepTimes.some(st => st > worst.t - 1 / dfps - 1e-9 && st <= worst.t + 1e-9);\n out.push({ level: stepped ? \"info\" : \"warn\", code: \"motion_pop\", subject: id, animation: a.id, time: worst.t,\n message: `bone \"${id}\" jumps ${Math.round(worst.d)}px in one frame at t=${worst.t.toFixed(2)}s in \"${a.id}\" (typical frame motion ${fmt(typical)}px) \u2014 a step key or a discontinuity` });\n }\n }\n }\n for (const att of [...deformMeshes, ...bonesMeshes]) {\n const f = meshFolds.get(att.id);\n if (f) out.push({ level: f.ratio >= FOLD_ERROR_RATIO ? \"error\" : \"warn\", code: \"mesh_fold\", subject: att.id, animation: a.id, time: f.t,\n message: `attachment \"${att.id}\" folds ${f.n} triangle${f.n === 1 ? \"\" : \"s\"} (first: triangle ${f.k}) at t=${f.t.toFixed(2)}s in \"${a.id}\" \u2014 reduce the deform or the bone motion (${fmt(100 * f.ratio)}% of the mesh)` });\n }\n // mesh folds (dense sampling catches easing overshoot between keys)\n const deformed = [...new Set(a.tracks.filter(t => t.target === \"deform\" && t.prop !== \"vertices\").map(t => t.id))];\n for (const attId of deformed) {\n const att = doc.attachments.find(x => x.id === attId);\n if (!att || att.type !== \"region\") continue;\n const asset = doc.assets.find(x => x.id === att.asset);\n if (!asset) continue;\n const w = att.width ?? asset.width, h = att.height ?? asset.height;\n let fold: { t: number; det: number } | undefined;\n for (const t of times(a, dfps)) {\n const params = deformParams(poseOf(a, t), attId);\n if (!params) continue;\n const det = minJacobian(controlOffsets(params, w, h, { x: 0.5, y: 0.5 }), w, h);\n if (det <= 0 && (!fold || det < fold.det)) fold = { t, det };\n }\n if (fold) out.push({ level: \"error\", code: \"deform_flip\", subject: attId, animation: a.id, time: fold.t,\n message: `attachment \"${attId}\" folds over itself (jacobian ${fmt(fold.det)}) at t=${fold.t.toFixed(2)}s in \"${a.id}\" \u2014 reduce the deform or its easing overshoot` });\n }\n }\n\n // --- provenance: every asset a slot can show should land where its source bbox says (importer/edit drift)\n for (const att of doc.attachments) {\n if (att.type !== \"region\") continue;\n const asset = doc.assets.find(a => a.id === att.asset), bbox = asset?.origin?.bbox;\n if (!asset || !bbox || !doc.slots.some(s => s.id === att.slot)) continue;\n const [cx, cy] = apply(regionMatrix(restWorld, att.slot, att), 0, 0);\n const ex = bbox[0] + bbox[2] / 2, ey = bbox[1] + bbox[3] / 2, dx = cx - ex, dy = cy - ey;\n const dist = Math.hypot(dx, dy);\n if (dist > 2) out.push({ level: \"warn\", code: \"patch_offset\", subject: att.slot,\n message: `slot \"${att.slot}\": attachment \"${att.id}\" sits ${Math.round(dist)}px ${Math.abs(dy) >= Math.abs(dx) ? (dy > 0 ? \"below\" : \"above\") : (dx > 0 ? \"right of\" : \"left of\")} its source bbox (expected centre (${fmt(ex)}, ${fmt(ey)}), rig places it at (${fmt(cx)}, ${fmt(cy)}))` });\n }\n\n // --- document-level: skinned mesh vertices whose influence weights don't sum to 1\n for (const att of doc.attachments) {\n if (att.type !== \"mesh\" || !att.weights) continue;\n let firstIndex = -1, firstSum = 0, count = 0;\n att.weights.forEach((list, i) => {\n const sum = list.reduce((s, inf) => s + inf.w, 0);\n if (Math.abs(sum - 1) > 0.01) { count++; if (firstIndex < 0) { firstIndex = i; firstSum = sum; } }\n });\n if (count > 0) out.push({ level: \"warn\", code: \"weights_sum\", subject: att.id,\n message: `attachment \"${att.id}\": ${count} ${count === 1 ? \"vertex has\" : \"vertices have\"} weights that do not sum to 1 (first: vertex ${firstIndex}, sum ${fmt(firstSum)})` });\n }\n\n // --- document-level: unused assets, never-visible slots\n const shownAttachments = new Set<string>();\n for (const s of doc.slots) if (s.attachment) shownAttachments.add(s.attachment);\n const swappedIn = new Set<string>();\n for (const a of doc.animations) for (const t of a.tracks)\n if (t.target === \"slot\" && t.prop === \"attachment\") for (const k of t.keys) if (typeof k.v === \"string\") { shownAttachments.add(k.v); swappedIn.add(t.id); }\n const used = new Set<string>();\n for (const att of doc.attachments) if (att.type !== \"path\" && shownAttachments.has(att.id)) used.add(att.asset);\n for (const asset of doc.assets) if (!used.has(asset.id))\n out.push({ level: \"info\", code: \"unused_asset\", subject: asset.id, message: `asset \"${asset.id}\" is not shown by any attachment at rest or in any animation` });\n for (const s of doc.slots) if (!s.attachment && !swappedIn.has(s.id))\n out.push({ level: \"warn\", code: \"never_visible\", subject: s.id, message: `slot \"${s.id}\" has no attachment and no animation ever shows one` });\n\n return out;\n}\n\n/** One-line count plus the findings \u2014 appended to preview results and returned by rig_check.\n * A single noisy code (e.g. mesh_fold across 100 meshes) is capped at 5 lines so it can't crowd out every\n * other kind of finding within `max`; the rest fold into one \"\u2026 N more <code>\" line, then the overall `max`\n * still applies on top of that. */\nexport function summarize(findings: Finding[], max = 12): string {\n if (!findings.length) return \"check: OK\";\n const rank = { error: 0, warn: 1, info: 2 };\n const sorted = [...findings].sort((a, b) => rank[a.level] - rank[b.level]);\n const n = (level: Finding[\"level\"]) => findings.filter(f => f.level === level).length;\n const parts = [[n(\"error\"), \"error\"], [n(\"warn\"), \"warning\"], [n(\"info\"), \"info\"]] as const;\n const head = \"check: \" + parts.filter(([c]) => c > 0).map(([c, w]) => `${c} ${w}${c === 1 || w === \"info\" ? \"\" : \"s\"}`).join(\", \");\n\n const PER_CODE = 5;\n const codeTotal = new Map<string, number>();\n for (const f of sorted) codeTotal.set(f.code, (codeTotal.get(f.code) ?? 0) + 1);\n const shownPerCode = new Map<string, number>();\n const lines: string[] = [];\n for (const f of sorted) {\n const shown = shownPerCode.get(f.code) ?? 0;\n if (shown < PER_CODE) lines.push(` [${f.level}] ${f.code}: ${f.message}`);\n else if (shown === PER_CODE) lines.push(` \u2026 ${codeTotal.get(f.code)! - PER_CODE} more ${f.code}`);\n shownPerCode.set(f.code, shown + 1);\n }\n const capped = lines.slice(0, max);\n if (lines.length > max) capped.push(` \u2026 ${lines.length - max} more`);\n return [head, ...capped].join(\"\\n\");\n}\n", "/**\n * rig-history \u2014 version snapshots next to rig.json (`.rig-history/<name>/NNNN.json`) and a structural diff.\n * The MCP server pushes the previous file before every mutation; `rig_undo` pops, `rig_diff` compares.\n */\nimport { mkdir, readdir, readFile, writeFile, unlink } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport type { RigDocument, Animation, Track } from \"./rig-format\";\n\nexport function historyDir(rigPath: string): string {\n return join(dirname(rigPath), \".rig-history\", basename(rigPath).replace(/\\.json$/, \"\"));\n}\n\nasync function files(dir: string): Promise<string[]> {\n try { return (await readdir(dir)).filter(f => /^\\d{4,}\\.json$/.test(f))\n .sort((a, b) => Number(a.slice(0, -5)) - Number(b.slice(0, -5))); }\n catch { return []; }\n}\n\nasync function snapshots(rigPath: string): Promise<string[]> {\n return files(historyDir(rigPath));\n}\n\n/** oldest \u2192 newest absolute paths */\nexport async function listHistory(rigPath: string): Promise<string[]> {\n return (await snapshots(rigPath)).map(f => join(historyDir(rigPath), f));\n}\n\nexport const redoDir = (rigPath: string) => join(historyDir(rigPath), \"redo\");\n\n/** oldest \u2192 newest absolute paths of redo entries */\nexport async function listRedo(rigPath: string): Promise<string[]> {\n return (await files(redoDir(rigPath))).map(f => join(redoDir(rigPath), f));\n}\n\n/** Discard every redo entry (invoked whenever a new mutation is pushed). */\nexport async function clearRedo(rigPath: string): Promise<void> {\n for (const f of await listRedo(rigPath)) await unlink(f);\n}\n\nasync function pushInto(dir: string, contents: string, keep: number): Promise<string> {\n await mkdir(dir, { recursive: true });\n const fs = await files(dir);\n const next = fs.length ? +fs[fs.length - 1].slice(0, -5) + 1 : 1;\n const file = join(dir, `${String(next).padStart(4, \"0\")}.json`);\n await writeFile(file, contents);\n for (const f of fs.slice(0, Math.max(0, fs.length + 1 - keep))) await unlink(join(dir, f));\n return file;\n}\n\n/** Store `contents` as the newest snapshot; keeps the last `keep`. A new mutation invalidates redo unless `keepRedo`. */\nexport async function pushHistory(rigPath: string, contents: string, keep = 50, opts: { keepRedo?: boolean } = {}): Promise<string> {\n if (!opts.keepRedo) await clearRedo(rigPath);\n return pushInto(historyDir(rigPath), contents, keep);\n}\n\n/** Contents of the `steps`-th newest snapshot; it and everything newer are discarded. */\nexport async function popHistory(rigPath: string, steps = 1): Promise<string> {\n const files = await snapshots(rigPath);\n if (!files.length) throw new Error(\"no history for this rig\");\n if (!Number.isInteger(steps) || steps < 1 || steps > files.length)\n throw new Error(`only ${files.length} snapshot${files.length === 1 ? \"\" : \"s\"} available, cannot undo ${steps}`);\n const dir = historyDir(rigPath);\n const contents = await readFile(join(dir, files[files.length - steps]), \"utf8\");\n for (const f of files.slice(files.length - steps)) await unlink(join(dir, f));\n return contents;\n}\n\n/** Undo `steps` mutations: the current file goes to the redo stack; returns the contents to write back. */\nexport async function undo(rigPath: string, steps = 1): Promise<string> {\n const current = await readFile(rigPath, \"utf8\");\n const restored = await popHistory(rigPath, steps);\n await pushInto(redoDir(rigPath), current, 50);\n return restored;\n}\n\n/** Redo the last undo: returns the contents to write back; the pre-redo state is snapshotted into history. */\nexport async function redo(rigPath: string): Promise<string> {\n const entries = await listRedo(rigPath);\n if (!entries.length) throw new Error(\"nothing to redo\");\n const file = entries[entries.length - 1];\n const contents = await readFile(file, \"utf8\");\n await pushHistory(rigPath, await readFile(rigPath, \"utf8\"), 50, { keepRedo: true });\n await unlink(file);\n return contents;\n}\n\n// ---------- diff ----------\n\nconst j = (v: unknown) => JSON.stringify(v);\nconst fmt = (v: unknown) => (typeof v === \"number\" ? String(Math.round(v * 1000) / 1000) : v === undefined ? \"\u2205\" : j(v));\nconst isObj = (v: unknown): v is Record<string, unknown> => typeof v === \"object\" && v !== null && !Array.isArray(v);\n/** an array long enough that printing it costs more than it tells */\nconst long = (v: unknown) => Array.isArray(v) && v.length > 4;\nconst entries = (v: unknown) => (Array.isArray(v) ? `${v.length} entries` : fmt(v));\n\n/** leaf-level changes between two plain objects: \"path: a \u2192 b\" */\nfunction leafDiff(a: Record<string, unknown>, b: Record<string, unknown>, prefix = \"\"): string[] {\n const out: string[] = [];\n for (const k of new Set([...Object.keys(a), ...Object.keys(b)])) {\n const va = a[k], vb = b[k], path = prefix ? `${prefix}.${k}` : k;\n if (j(va) === j(vb)) continue;\n if (isObj(va) && isObj(vb)) out.push(...leafDiff(va, vb, path));\n else if (Array.isArray(va) && Array.isArray(vb) && va.length === vb.length && va.length > 4\n && va.every(n => typeof n === \"number\") && vb.every(n => typeof n === \"number\")) {\n let n = 0, max = 0;\n for (let i = 0; i < va.length; i++) { const d = Math.abs((va[i] as number) - (vb[i] as number)); if (d) { n++; if (d > max) max = d; } }\n out.push(`${path}: ${n} values changed (max |\u0394| ${fmt(max)})`);\n }\n // same length, not all numbers (weights, draw orders): count the positions that differ instead of printing them\n else if (Array.isArray(va) && Array.isArray(vb) && va.length === vb.length && va.length > 4) {\n let n = 0;\n for (let i = 0; i < va.length; i++) if (j(va[i]) !== j(vb[i])) n++;\n out.push(`${path}: ${n} entries changed`);\n }\n // both arrays, different lengths: only a long one is worth summarizing (ik `bones` still prints its ids)\n else if (Array.isArray(va) && Array.isArray(vb))\n out.push(Math.max(va.length, vb.length) > 4 ? `${path}: length ${va.length} \u2192 ${vb.length}` : `${path}: ${fmt(va)} \u2192 ${fmt(vb)}`);\n // a long array appearing or disappearing (a mesh gaining uvs, vertices \u2194 weights): its contents help nobody\n else if (long(va) || long(vb)) out.push(`${path}: ${entries(va)} \u2192 ${entries(vb)}`);\n else out.push(`${path}: ${fmt(va)} \u2192 ${fmt(vb)}`);\n }\n return out;\n}\n\nconst trackId = (t: Track) => `${t.target}.${t.id}.${t.prop}`;\nfunction trackRange(t: Track): string {\n const nums = t.keys.map(k => k.v).filter((v): v is number => typeof v === \"number\");\n return nums.length ? `[${fmt(Math.min(...nums))}..${fmt(Math.max(...nums))}]` : `{${[...new Set(t.keys.map(k => fmt(k.v)))].join(\",\")}}`;\n}\nconst keyCount = (t: Track) => `${t.keys.length} key${t.keys.length === 1 ? \"\" : \"s\"}`;\n\nfunction animDiff(a: Animation, b: Animation): string[] {\n const out: string[] = [], id = `animation ${a.id}`;\n for (const k of [\"duration\", \"loop\"] as const) if (a[k] !== b[k]) out.push(`~ ${id}: ${k}: ${fmt(a[k])} \u2192 ${fmt(b[k])}`);\n if (a.preset && !b.preset) out.push(`~ ${id}: preset ${a.preset.name} dropped (manual keys)`);\n else if (!a.preset && b.preset) out.push(`~ ${id}: preset ${b.preset.name} applied ${j(b.preset.params)}`);\n else if (a.preset && b.preset) {\n if (a.preset.name !== b.preset.name) out.push(`~ ${id}: preset ${a.preset.name} \u2192 ${b.preset.name}`);\n for (const l of leafDiff(a.preset.params, b.preset.params)) out.push(`~ ${id}: preset ${b.preset.name} ${l}`);\n }\n const ta = new Map(a.tracks.map(t => [trackId(t), t])), tb = new Map(b.tracks.map(t => [trackId(t), t]));\n for (const [tid, t] of tb) if (!ta.has(tid)) out.push(`+ track ${tid} (${keyCount(t)}) ${trackRange(t)} in ${a.id}`);\n for (const [tid, t] of ta) {\n const u = tb.get(tid);\n if (!u) out.push(`- track ${tid} (${keyCount(t)}) from ${a.id}`);\n else if (j(t.keys) !== j(u.keys)) out.push(`~ track ${tid} in ${a.id}: ${keyCount(t)} ${trackRange(t)} \u2192 ${t.keys.length === u.keys.length ? \"\" : keyCount(u) + \" \"}${trackRange(u)}`);\n }\n if (j(a.events) !== j(b.events)) out.push(`~ ${id}: events ${a.events.map(e => e.name).join(\",\") || \"\u2205\"} \u2192 ${b.events.map(e => e.name).join(\",\") || \"\u2205\"}`);\n return out;\n}\n\n/** Human-readable structural difference; empty when the documents are identical. */\nexport function diffDocs(a: RigDocument, b: RigDocument): string[] {\n const out: string[] = [];\n for (const l of leafDiff(a.meta, b.meta)) out.push(`~ meta.${l}`);\n const kinds: [keyof RigDocument, string][] = [\n [\"assets\", \"asset\"], [\"bones\", \"bone\"], [\"slots\", \"slot\"],\n [\"attachments\", \"attachment\"], [\"ik\", \"ik\"], [\"transform\", \"transform\"], [\"path\", \"path\"],\n ];\n for (const [kind, name] of kinds) {\n const ma = new Map((a[kind] as { id: string }[]).map(x => [x.id, x as unknown as Record<string, unknown>]));\n const mb = new Map((b[kind] as { id: string }[]).map(x => [x.id, x as unknown as Record<string, unknown>]));\n for (const [id, x] of mb) if (!ma.has(id)) out.push(`+ ${name} ${id} ${j(x)}`);\n for (const [id, x] of ma) {\n const y = mb.get(id);\n if (!y) out.push(`- ${name} ${id}`);\n else for (const l of leafDiff(x, y)) out.push(`~ ${name} ${id}: ${l}`);\n }\n }\n const aa = new Map(a.animations.map(x => [x.id, x])), ab = new Map(b.animations.map(x => [x.id, x]));\n for (const [id, x] of ab) if (!aa.has(id)) out.push(`+ animation ${id} (${x.duration}s${x.loop ? \" loop\" : \"\"}, ${x.tracks.length} tracks${x.preset ? `, preset ${x.preset.name}` : \"\"})`);\n for (const [id, x] of aa) {\n const y = ab.get(id);\n if (!y) out.push(`- animation ${id}`);\n else out.push(...animDiff(x, y));\n }\n return out;\n}\n", "/**\n * rig-atlas \u2014 pack a rig's PNG layers into one sprite sheet for export.\n * Shelf packing (rows of height-sorted rects) with a transparent gutter; good enough for \u2264 a few hundred parts.\n * Each frame's edge pixels are extruded into the gutter so bilinear sampling at a frame edge (deformed meshes,\n * minified sprites) sees the edge colour, like a standalone texture's clamp-to-edge, instead of transparency.\n * Runtime side: `asset.frame` + `createTextures()` in rig-runtime.ts.\n */\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { saveJson } from \"./rig-io\";\nimport { PNG } from \"pngjs\";\nimport type { RigDocument } from \"./rig-format\";\n\nexport interface Rect { id: string; width: number; height: number }\nexport interface Packed { width: number; height: number; frames: Map<string, [number, number, number, number]> }\n\nexport interface PackOptions {\n /** gap between frames in px (default 2); never less than 2\u00B7extrude */\n padding?: number;\n /** px of edge replication into the gutter (default 1) */\n extrude?: number;\n maxSize?: number;\n}\n\nexport function packRects(rects: Rect[], opts: PackOptions = {}): Packed {\n const extrude = opts.extrude ?? 1, pad = Math.max(opts.padding ?? 2, 2 * extrude), max = opts.maxSize ?? 4096;\n const sorted = [...rects].sort((a, b) => b.height - a.height || b.width - a.width || a.id.localeCompare(b.id));\n for (const r of sorted)\n if (r.width + 2 * pad > max || r.height + 2 * pad > max) throw new Error(`asset \"${r.id}\" (${r.width}\u00D7${r.height}) does not fit in a ${max}px atlas`);\n const area = sorted.reduce((s, r) => s + (r.width + pad) * (r.height + pad), 0);\n const widest = Math.max(0, ...sorted.map(r => r.width + 2 * pad));\n let width = 64;\n while (width < max && (width < widest || width * width < area)) width *= 2;\n for (;;) {\n const frames = new Map<string, [number, number, number, number]>();\n let x = pad, y = pad, shelf = 0;\n for (const r of sorted) {\n if (x + r.width + pad > width) { x = pad; y += shelf + pad; shelf = 0; }\n frames.set(r.id, [x, y, r.width, r.height]);\n x += r.width + pad;\n shelf = Math.max(shelf, r.height);\n }\n const height = y + shelf + pad;\n if (height <= max) return { width, height, frames };\n if (width >= max) throw new Error(`atlas does not fit in ${max}\u00D7${max} (needs ${width}\u00D7${height})`);\n width *= 2;\n }\n}\n\n/** Read every PNG asset, pack, write `<outDir>/atlas.png` + `<outDir>/rig.json`; returns the exported document. */\n/** replicate the outer ring of a frame `n` px outward (edges and corners) */\nfunction extrudeFrame(sheet: PNG, x: number, y: number, w: number, h: number, n: number) {\n const W = sheet.width, H = sheet.height, d = sheet.data;\n const copy = (sx: number, sy: number, dx: number, dy: number) => {\n if (dx < 0 || dy < 0 || dx >= W || dy >= H) return;\n d.copy(d, (dy * W + dx) * 4, (sy * W + sx) * 4, (sy * W + sx) * 4 + 4);\n };\n for (let i = 1; i <= n; i++) {\n for (let xx = x; xx < x + w; xx++) { copy(xx, y, xx, y - i); copy(xx, y + h - 1, xx, y + h - 1 + i); }\n for (let yy = y; yy < y + h; yy++) { copy(x, yy, x - i, yy); copy(x + w - 1, yy, x + w - 1 + i, yy); }\n }\n for (let i = 1; i <= n; i++) for (let k = 1; k <= n; k++) {\n copy(x, y, x - i, y - k); copy(x + w - 1, y, x + w - 1 + i, y - k);\n copy(x, y + h - 1, x - i, y + h - 1 + k); copy(x + w - 1, y + h - 1, x + w - 1 + i, y + h - 1 + k);\n }\n}\n\nexport async function buildAtlas(doc: RigDocument, assetsDir: string, outDir: string, opts: PackOptions = {}): Promise<RigDocument> {\n const images = new Map<string, PNG>();\n const files = new Map<string, PNG>();\n for (const a of doc.assets) {\n if (!/\\.png$/i.test(a.src)) throw new Error(`atlas requires PNG assets: \"${a.src}\" (asset \"${a.id}\") is not a PNG`);\n let png = files.get(a.src);\n if (!png) files.set(a.src, (png = PNG.sync.read(await readFile(join(assetsDir, a.src)))));\n if (a.frame) {\n const [fx, fy, fw, fh] = a.frame, sub = new PNG({ width: fw, height: fh });\n PNG.bitblt(png, sub, fx, fy, fw, fh, 0, 0);\n png = sub;\n }\n if (png.width !== a.width || png.height !== a.height)\n throw new Error(`asset \"${a.id}\": document says ${a.width}\u00D7${a.height} but \"${a.src}\" is ${png.width}\u00D7${png.height}`);\n images.set(a.id, png);\n }\n const packed = packRects(doc.assets.map(a => ({ id: a.id, width: a.width, height: a.height })), opts);\n const sheet = new PNG({ width: packed.width, height: packed.height });\n for (const [id, [x, y, w, h]] of packed.frames) {\n PNG.bitblt(images.get(id)!, sheet, 0, 0, w, h, x, y);\n extrudeFrame(sheet, x, y, w, h, opts.extrude ?? 1);\n }\n await mkdir(outDir, { recursive: true });\n await writeFile(join(outDir, \"atlas.png\"), PNG.sync.write(sheet));\n const out: RigDocument = { ...doc, assets: doc.assets.map(a => ({ ...a, src: \"atlas.png\", frame: packed.frames.get(a.id)! })) };\n await saveJson(join(outDir, \"rig.json\"), out); // the same atomic write every other rig.json writer uses\n return out;\n}\n", "/**\n * spine-import \u2014 Spine JSON (3.8 / 4.x) + atlas \u2192 energy8.rig v2 document. Our own reader of the documented format.\n *\n * Coordinates: Spine is y-up with the skeleton origin at (0,0); the document is y-down with the skeleton's bounding\n * box mapped onto the canvas. A reflection R (y \u2190 \u2212y) conjugates every transform: local values become\n * (x, \u2212y, \u2212rotation, scaleX, scaleY, \u2212shearX, \u2212shearY) and attachment-local coordinates are mirrored; a synthetic\n * document root carries the translation. Bone timelines (relative in Spine) are converted to absolute values.\n */\nimport { readFile, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, extname, join, relative } from \"node:path\";\nimport { apply, attachmentWorldVertices, evaluate, pk, poseOf, regionMatrix, regionSize, restValue, type Pose } from \"./rig-anim\";\nimport { parse, type RigDocument } from \"./rig-format\";\nimport { ktx2ToPng } from \"./ktx2\";\n\n/** Spine 4.1+ (and the spine-core runtime) keeps deform timelines under `attachments`; 4.0 files store them under `deform`. Returns a 4.1-shaped copy. */\nexport function spineJson41(j: any): any {\n const out = structuredClone(j);\n for (const a of Object.values(out.animations ?? {}) as any[]) {\n if (!a.deform || a.attachments) continue;\n a.attachments = {};\n for (const [skin, slots] of Object.entries(a.deform as Record<string, Record<string, Record<string, unknown>>>)) {\n a.attachments[skin] = {};\n for (const [slot, atts] of Object.entries(slots)) {\n a.attachments[skin][slot] = {};\n for (const [att, frames] of Object.entries(atts)) a.attachments[skin][slot][att] = { deform: frames };\n }\n }\n }\n return out;\n}\n\n\nexport interface AtlasRegion { name: string; page: string; x: number; y: number; width: number; height: number; rotate: 0 | 90; offsetX: number; offsetY: number; originalWidth: number; originalHeight: number }\nexport interface AtlasPage { name: string; width: number; height: number; scale: number }\n\n/** Parse a Spine atlas (3.8 or 4.x text; base64-wrapped text is accepted too). */\nexport function parseAtlas(text: string): { pages: AtlasPage[]; regions: AtlasRegion[] } {\n if (!/\\n/.test(text.trim()) && /^[A-Za-z0-9+/=\\s]+$/.test(text)) text = Buffer.from(text, \"base64\").toString(\"utf8\");\n const pages: AtlasPage[] = [], regions: AtlasRegion[] = [];\n let page: AtlasPage | undefined, region: AtlasRegion | undefined;\n for (const raw of text.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (!line) { page = undefined; continue; }\n const colon = line.indexOf(\":\");\n if (colon < 0) {\n if (!page || /\\.(png|jpe?g|webp|ktx2?|pvr|dds|astc)$/i.test(line)) { page = { name: line, width: 0, height: 0, scale: 1 }; pages.push(page); region = undefined; continue; }\n region = { name: line, page: page.name, x: 0, y: 0, width: 0, height: 0, rotate: 0, offsetX: 0, offsetY: 0, originalWidth: 0, originalHeight: 0 };\n regions.push(region);\n continue;\n }\n const key = line.slice(0, colon).trim(), vals = line.slice(colon + 1).split(\",\").map(s => s.trim());\n if (!region) {\n if (!page) continue;\n if (key === \"size\") { page.width = +vals[0]; page.height = +vals[1]; }\n else if (key === \"scale\") page.scale = +vals[0];\n continue;\n }\n switch (key) {\n case \"bounds\": region.x = +vals[0]; region.y = +vals[1]; region.width = +vals[2]; region.height = +vals[3]; break;\n case \"xy\": region.x = +vals[0]; region.y = +vals[1]; break;\n case \"size\": region.width = +vals[0]; region.height = +vals[1]; break;\n case \"offsets\": region.offsetX = +vals[0]; region.offsetY = +vals[1]; region.originalWidth = +vals[2]; region.originalHeight = +vals[3]; break;\n case \"offset\": region.offsetX = +vals[0]; region.offsetY = +vals[1]; break;\n case \"orig\": region.originalWidth = +vals[0]; region.originalHeight = +vals[1]; break;\n case \"rotate\": region.rotate = vals[0] === \"true\" || vals[0] === \"90\" ? 90 : 0; break;\n }\n }\n for (const r of regions) if (!r.originalWidth && !r.originalHeight) { r.originalWidth = r.width; r.originalHeight = r.height; }\n return { pages, regions };\n}\n\n// ---------- ids ----------\n\nclass Ids {\n private used = new Set<string>();\n private map = new Map<string, string>();\n constructor(private prefix = \"\") {}\n get(name: string): string {\n const known = this.map.get(name);\n if (known) return known;\n let base = name.toLowerCase().replace(/[^a-z0-9_]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n if (!/^[a-z]/.test(base)) base = this.prefix + (base || \"x\");\n let id = base, n = 2;\n while (this.used.has(id)) id = `${base}_${n++}`;\n this.used.add(id); this.map.set(name, id);\n return id;\n }\n has(name: string) { return this.map.has(name); }\n}\n\n// ---------- import ----------\n\nexport interface ImportOptions {\n name?: string;\n /** file name to use for the atlas page image(s) in asset.src (e.g. \"ross.png\" after transcoding a ktx2) */\n pageImage?: string | ((page: string) => string);\n /** canvas margin around the skeleton bounds, px */\n margin?: number;\n /** canvas = the union of everything shown in every animation (default) or just the setup-pose bounds */\n fit?: \"animations\" | \"setup\";\n notes?: string;\n}\n\nexport interface ImportResult {\n doc: unknown;\n warnings: string[];\n boneId(name: string): string;\n slotId(name: string): string;\n attachmentId(slotName: string, attachmentName: string): string;\n assetId(regionName: string): string;\n animId(name: string): string;\n /** spine (y-up, skeleton origin) \u2192 document */\n toDoc(x: number, y: number): [number, number];\n}\n\nexport const spineToDoc = (x: number, y: number, originX: number, originY: number): [number, number] => [x + originX, originY - y];\n\ntype J = Record<string, any>;\nconst r4 = (v: number) => Math.round(v * 1e6) / 1e6 + 0;\nconst hex8 = (c: string | undefined) => `#${(c ?? \"ffffffff\").toLowerCase().padEnd(8, \"f\").slice(0, 8)}`;\n\nexport function importSpine(json: J, atlasText: string, opts: ImportOptions = {}): ImportResult {\n const warnings: string[] = [];\n const atlas = parseAtlas(atlasText);\n const version = String(json.skeleton?.spine ?? \"4.0\");\n const major = parseFloat(version);\n const bounds = { x: json.skeleton?.x ?? 0, y: json.skeleton?.y ?? 0, w: json.skeleton?.width ?? 0, h: json.skeleton?.height ?? 0 };\n const margin = opts.margin ?? 0;\n let originX = -bounds.x + margin, originY = bounds.y + bounds.h + margin;\n const toDoc = (x: number, y: number) => spineToDoc(x, y, originX, originY);\n\n const boneIds = new Ids(\"b_\"), slotIds = new Ids(\"s_\"), assetIds = new Ids(\"a_\"), attIds = new Ids(\"att_\"), ikIds = new Ids(\"ik_\"), tcIds = new Ids(\"tc_\"), pcIds = new Ids(\"pc_\"), animIds = new Ids(\"anim_\");\n const ROOT = \"origin\";\n const attachmentIdMap = new Map<string, string>();\n const attachmentId = (slot: string, name: string) => {\n const key = `${slot} ${name}`;\n let id = attachmentIdMap.get(key);\n if (!id) { id = attIds.get(attIds.has(name) ? `${slot}_${name}` : name); attachmentIdMap.set(key, id); }\n return id;\n };\n\n // ---- bones\n const spineBones: J[] = json.bones ?? [];\n const boneIndexByName = new Map(spineBones.map((b, i) => [b.name, i]));\n const bones: J[] = [{ id: ROOT, transform: { x: r4(originX), y: r4(originY) }, role: \"root\" }];\n for (const b of spineBones) {\n bones.push({\n id: boneIds.get(b.name),\n parent: b.parent ? boneIds.get(b.parent) : ROOT,\n length: b.length ?? 0,\n transform: { x: r4(b.x ?? 0), y: r4(-(b.y ?? 0)), rotation: r4(-(b.rotation ?? 0)), scaleX: b.scaleX ?? 1, scaleY: b.scaleY ?? 1, shearX: r4(-(b.shearX ?? 0)), shearY: r4(-(b.shearY ?? 0)) },\n inherit: b.transform ?? b.inherit ?? \"normal\",\n ...(b.color ? { color: b.color } : {}),\n });\n }\n\n const skins: { name: string; attachments: J }[] = Array.isArray(json.skins) ? json.skins : Object.entries(json.skins ?? {}).map(([name, attachments]) => ({ name, attachments: attachments as J }));\n /**\n * A slot's setup attachment \u2014 and every `attachment` timeline key \u2014 names a PLAIN attachment; which skin\n * supplies it is a runtime choice in Spine. Attachments below are stored with a `<skin>_` prefix outside the\n * default skin, so a plain name would dangle on any rig whose setup pose comes from a non-default skin (forge\n * has six skins and 51-69 slots in each; ross has one, which is why this never showed). Resolve through the\n * first skin that offers the name, default first.\n */\n /**\n * A sequence attachment is ONE attachment in Spine that shows one of `count` numbered regions; the format here\n * has no such thing, so the import expands it into `count` ordinary attachments and drives them with the\n * `attachment` track the format already has. `Sequence.getPath` in spine-core is this padding, and the index\n * added to `start` is what the runtime appends \u2014 the two must keep agreeing or every frame misses its region.\n */\n const frameSuffix = (seq: J, index: number) => {\n const n = String((seq.start ?? 0) + index);\n return \"0\".repeat(Math.max(0, (seq.digits ?? 0) - n.length)) + n;\n };\n const sequences = new Map<string, J>(); // `${slot} ${prefixed name}` \u2192 the Spine sequence block\n\n const skinnedName = new Map<string, string>();\n for (const skin of skins) {\n const prefix = skin.name === \"default\" ? \"\" : `${skin.name}_`;\n for (const [slotName, atts] of Object.entries(skin.attachments ?? {}))\n for (const [name, a] of Object.entries(atts as J)) {\n const key = `${slotName} ${name}`;\n // a slot naming a sequence attachment means \"show its setup frame\": the base name belongs to no region\n const seq = (a as J).sequence;\n if (!skinnedName.has(key)) skinnedName.set(key, prefix + name + (seq ? frameSuffix(seq, seq.setupIndex ?? 0) : \"\"));\n }\n }\n const attachmentRef = (slot: string, name: string) => attachmentId(slot, skinnedName.get(`${slot} ${name}`) ?? name);\n\n // ---- slots (draw order = array order)\n const spineSlots: J[] = json.slots ?? [];\n const slotIndexByName = new Map(spineSlots.map((s, i) => [s.name, i]));\n const blendOf = (b?: string) => (b === \"additive\" ? \"add\" : b === \"multiply\" ? \"multiply\" : b === \"screen\" ? \"screen\" : \"normal\");\n const slots: J[] = spineSlots.map((s, i) => ({\n id: slotIds.get(s.name), bone: boneIds.get(s.bone), z: i,\n ...(s.attachment ? { attachment: attachmentRef(s.name, s.attachment) } : {}),\n blend: blendOf(s.blend), color: hex8(s.color), alpha: 1,\n }));\n\n // ---- assets from atlas regions (lazily, only the ones used)\n const pageImage = (page: string) => (typeof opts.pageImage === \"function\" ? opts.pageImage(page) : opts.pageImage ?? page);\n const assets = new Map<string, J>();\n const regionByName = new Map(atlas.regions.map(r => [r.name, r]));\n const assetFor = (regionName: string): string | undefined => {\n const r = regionByName.get(regionName);\n if (!r) { warnings.push(`atlas region \"${regionName}\" not found`); return undefined; }\n const id = assetIds.get(regionName);\n if (!assets.has(id)) {\n const trimmed = r.offsetX || r.offsetY || r.originalWidth !== r.width || r.originalHeight !== r.height;\n assets.set(id, { id, src: pageImage(r.page), width: r.originalWidth, height: r.originalHeight,\n frame: [r.x, r.y, r.width, r.height], rotate: r.rotate, ...(trimmed ? { trim: [r.offsetX, r.offsetY] } : {}) });\n }\n return id;\n };\n\n // ---- attachments (default skin + other skins merged with a skin prefix)\n const attachments: J[] = [];\n const readVertices = (a: J, vertexCount: number): { vertices?: number[]; weights?: J[][] } => {\n const v: number[] = a.vertices ?? [];\n if (v.length === vertexCount * 2) {\n const out: number[] = [];\n for (let i = 0; i < v.length; i += 2) out.push(r4(v[i]), r4(-v[i + 1]));\n return { vertices: out };\n }\n const weights: J[][] = [];\n for (let i = 0; i < v.length;) {\n const n = v[i++], list: J[] = [];\n for (let k = 0; k < n; k++) { const bi = v[i++], x = v[i++], y = v[i++], w = v[i++]; list.push({ bone: boneIds.get(spineBones[bi].name), x: r4(x), y: r4(-y), w }); }\n // JSON weights are rounded and rarely sum to exactly 1; normalize so skinning is translation-invariant\n const sum = list.reduce((s, inf) => s + inf.w, 0) || 1;\n for (const inf of list) inf.w = inf.w / sum;\n weights.push(list);\n }\n return { weights };\n };\n for (const skin of skins) {\n const prefix = skin.name === \"default\" ? \"\" : `${skin.name}_`;\n for (const [slotName, atts] of Object.entries(skin.attachments ?? {})) {\n if (!slotIndexByName.has(slotName)) { warnings.push(`skin \"${skin.name}\": unknown slot \"${slotName}\"`); continue; }\n const slot = slotIds.get(slotName);\n for (const [name, a] of Object.entries(atts as J)) {\n if (a.sequence) {\n sequences.set(`${slotName} ${prefix}${name}`, a.sequence);\n const base = a.path ?? name;\n for (let i = 0; i < (a.sequence.count ?? 0); i++) {\n const suffix = frameSuffix(a.sequence, i), asset = assetFor(base + suffix);\n if (!asset) continue;\n attachments.push({ id: attachmentId(slotName, prefix + name + suffix), slot, type: \"region\", asset,\n x: r4(a.x ?? 0), y: r4(-(a.y ?? 0)), rotation: r4(-(a.rotation ?? 0)), scaleX: a.scaleX ?? 1, scaleY: a.scaleY ?? 1,\n ...(a.width ? { width: a.width } : {}), ...(a.height ? { height: a.height } : {}) });\n }\n if ((a.type ?? \"region\") !== \"region\") warnings.push(`sequence \"${slotName}/${name}\" of type ${a.type} imported as regions`);\n continue;\n }\n const type = a.type ?? \"region\", id = attachmentId(slotName, prefix + name);\n if (type === \"region\") {\n const asset = assetFor(a.path ?? name);\n if (!asset) continue;\n attachments.push({ id, slot, type: \"region\", asset, x: r4(a.x ?? 0), y: r4(-(a.y ?? 0)), rotation: r4(-(a.rotation ?? 0)), scaleX: a.scaleX ?? 1, scaleY: a.scaleY ?? 1,\n ...(a.width ? { width: a.width } : {}), ...(a.height ? { height: a.height } : {}) });\n } else if (type === \"mesh\" || type === \"linkedmesh\") {\n if (type === \"linkedmesh\") { warnings.push(`linked mesh \"${slotName}/${name}\" skipped`); continue; }\n const asset = assetFor(a.path ?? name);\n if (!asset) continue;\n const n = (a.uvs?.length ?? 0) / 2;\n attachments.push({ id, slot, type: \"mesh\", asset, uvs: a.uvs, triangles: a.triangles, ...readVertices(a, n), hull: a.hull ?? 0, ...(a.width ? { width: a.width } : {}), ...(a.height ? { height: a.height } : {}) });\n } else if (type === \"path\") {\n attachments.push({ id, slot, type: \"path\", ...readVertices(a, a.vertexCount ?? 0), lengths: a.lengths ?? [], closed: !!a.closed, constantSpeed: a.constantSpeed ?? true });\n } else warnings.push(`attachment \"${slotName}/${name}\" of type ${type} skipped`);\n }\n }\n }\n\n // ---- constraints\n const ik = (json.ik ?? []).map((c: J) => ({\n id: ikIds.get(c.name), order: c.order ?? 0, bones: c.bones.map((b: string) => boneIds.get(b)), target: boneIds.get(c.target),\n mix: c.mix ?? 1, softness: c.softness ?? 0, bendPositive: !(c.bendPositive ?? true), // mirrored: the bend side flips\n compress: !!c.compress, stretch: !!c.stretch, uniform: !!c.uniform,\n }));\n const transform = (json.transform ?? []).map((c: J) => ({\n id: tcIds.get(c.name), order: c.order ?? 0, bones: c.bones.map((b: string) => boneIds.get(b)), target: boneIds.get(c.target),\n local: !!c.local, relative: !!c.relative,\n rotation: r4(-(c.rotation ?? 0)), x: r4(c.x ?? 0), y: r4(-(c.y ?? 0)), scaleX: c.scaleX ?? 0, scaleY: c.scaleY ?? 0, shearY: r4(-(c.shearY ?? 0)),\n mixRotate: c.mixRotate ?? c.rotateMix ?? 1, mixX: c.mixX ?? c.translateMix ?? 1, mixY: c.mixY ?? c.mixX ?? c.translateMix ?? 1,\n mixScaleX: c.mixScaleX ?? c.scaleMix ?? 1, mixScaleY: c.mixScaleY ?? c.mixScaleX ?? c.scaleMix ?? 1, mixShearY: c.mixShearY ?? c.shearMix ?? 1,\n }));\n const path = (json.path ?? []).map((c: J) => ({\n id: pcIds.get(c.name), order: c.order ?? 0, bones: c.bones.map((b: string) => boneIds.get(b)), target: slotIds.get(c.target),\n positionMode: c.positionMode ?? \"percent\", spacingMode: c.spacingMode ?? \"length\", rotateMode: c.rotateMode ?? \"tangent\",\n rotation: r4(-(c.rotation ?? 0)), position: c.position ?? 0, spacing: c.spacing ?? 0,\n mixRotate: c.mixRotate ?? c.rotateMix ?? 1, mixX: c.mixX ?? c.translateMix ?? 1, mixY: c.mixY ?? c.mixX ?? c.translateMix ?? 1,\n }));\n\n // ---- animations\n type Key = { t: number; v: unknown; ease?: unknown };\n /** Spine curve \u2192 our per-key ease. 4.x: absolute [cx1, cy1, cx2, cy2] per component; 3.x: normalized [x1, y1, x2, y2]. */\n const easeOf = (curve: unknown, component: number, t0: number, t1: number, v0: number, v1: number): unknown => {\n if (curve === \"stepped\") return \"step\";\n if (!Array.isArray(curve)) return \"linear\";\n if (major < 4) { const [x1, y1, x2, y2] = curve as number[]; return { bezier: [x1, y1, x2, y2] }; }\n const c = (curve as number[]).slice(component * 4, component * 4 + 4);\n if (c.length < 4) return \"linear\";\n const dt = t1 - t0 || 1, dv = v1 - v0;\n const nx = (x: number) => (x - t0) / dt; // control times may fall outside the segment; the sampled walk copes\n if (Math.abs(dv) < 1e-9) return { bezier: [nx(c[0]), nx(c[0]), nx(c[2]), nx(c[2])] }; // flat segment: value fraction is moot, keep the timing shape\n return { bezier: [nx(c[0]), (c[1] - v0) / dv, nx(c[2]), (c[3] - v0) / dv] };\n };\n const track = (target: string, id: string, prop: string, keys: Key[]) => ({ target, id, prop, keys });\n /** numeric timeline \u2192 keys with absolute values via `abs(spineValue)`, eases from curves (component `comp`) */\n const numeric = (frames: J[], field: string, def: number, abs: (v: number) => number, comp: number): Key[] => {\n const keys: Key[] = [];\n for (let i = 0; i < frames.length; i++) {\n const f = frames[i], next = frames[i + 1], t = f.time ?? 0;\n const ease = next ? easeOf(f.curve, comp, t, next.time ?? 0, f[field] ?? def, next[field] ?? def) : \"linear\";\n keys.push({ t: r4(t), v: r4(abs(f[field] ?? def)), ease });\n }\n return keys;\n };\n const animations: J[] = [];\n for (const [animName, a] of Object.entries((json.animations ?? {}) as J)) {\n const tracks: J[] = [], events: J[] = [];\n let duration = 0;\n const seen = (frames: J[]) => { for (const f of frames) duration = Math.max(duration, f.time ?? 0); };\n // bones (values relative to setup in Spine \u2192 absolute here)\n for (const [boneName, tl] of Object.entries((a.bones ?? {}) as J)) {\n const sb = spineBones[boneIndexByName.get(boneName)!]; if (!sb) { warnings.push(`${animName}: unknown bone ${boneName}`); continue; }\n const id = boneIds.get(boneName), setup = { x: sb.x ?? 0, y: sb.y ?? 0, rotation: sb.rotation ?? 0, scaleX: sb.scaleX ?? 1, scaleY: sb.scaleY ?? 1, shearX: sb.shearX ?? 0, shearY: sb.shearY ?? 0 };\n for (const [kind, frames] of Object.entries(tl as J) as [string, J[]][]) {\n seen(frames);\n if (kind === \"rotate\") tracks.push(track(\"bone\", id, \"rotation\", numeric(frames, major < 4 ? \"angle\" : \"value\", 0, v => -(setup.rotation + v), 0)));\n else if (kind === \"translate\") { tracks.push(track(\"bone\", id, \"x\", numeric(frames, \"x\", 0, v => setup.x + v, 0))); tracks.push(track(\"bone\", id, \"y\", numeric(frames, \"y\", 0, v => -(setup.y + v), 1))); }\n else if (kind === \"translatex\") tracks.push(track(\"bone\", id, \"x\", numeric(frames, \"value\", 0, v => setup.x + v, 0)));\n else if (kind === \"translatey\") tracks.push(track(\"bone\", id, \"y\", numeric(frames, \"value\", 0, v => -(setup.y + v), 0)));\n else if (kind === \"scale\") { tracks.push(track(\"bone\", id, \"scaleX\", numeric(frames, \"x\", 1, v => setup.scaleX * v, 0))); tracks.push(track(\"bone\", id, \"scaleY\", numeric(frames, \"y\", 1, v => setup.scaleY * v, 1))); }\n else if (kind === \"scalex\") tracks.push(track(\"bone\", id, \"scaleX\", numeric(frames, \"value\", 1, v => setup.scaleX * v, 0)));\n else if (kind === \"scaley\") tracks.push(track(\"bone\", id, \"scaleY\", numeric(frames, \"value\", 1, v => setup.scaleY * v, 0)));\n else if (kind === \"shear\") { tracks.push(track(\"bone\", id, \"shearX\", numeric(frames, \"x\", 0, v => -(setup.shearX + v), 0))); tracks.push(track(\"bone\", id, \"shearY\", numeric(frames, \"y\", 0, v => -(setup.shearY + v), 1))); }\n else if (kind === \"shearx\") tracks.push(track(\"bone\", id, \"shearX\", numeric(frames, \"value\", 0, v => -(setup.shearX + v), 0)));\n else if (kind === \"sheary\") tracks.push(track(\"bone\", id, \"shearY\", numeric(frames, \"value\", 0, v => -(setup.shearY + v), 0)));\n else warnings.push(`${animName}/${boneName}: ${kind} timeline skipped`);\n }\n }\n // slots\n const attachmentFrames = new Map<string, J[]>();\n for (const [slotName, tl] of Object.entries((a.slots ?? {}) as J)) {\n if (!slotIndexByName.has(slotName)) { warnings.push(`${animName}: unknown slot ${slotName}`); continue; }\n const id = slotIds.get(slotName);\n for (const [kind, frames] of Object.entries(tl as J) as [string, J[]][]) {\n seen(frames);\n if (kind === \"attachment\") {\n attachmentFrames.set(slotName, frames); // a sequence timeline on this slot layers onto these\n tracks.push(track(\"slot\", id, \"attachment\", frames.map(f => ({ t: r4(f.time ?? 0), v: f.name ? attachmentRef(slotName, f.name) : null, ease: \"step\" }))));\n }\n else if (kind === \"rgba\" || kind === \"color\") {\n const rgbaOf = (f: J) => { const c = hex8(f.color); return [0, 2, 4, 6].map(k => parseInt(c.slice(1 + k, 3 + k), 16) / 255); };\n tracks.push(track(\"slot\", id, \"color\", frames.map((f, i) => {\n const rgba = rgbaOf(f), next = frames[i + 1];\n return { t: r4(f.time ?? 0), v: rgba.map(r4), ease: next ? easeOf(f.curve, 0, f.time ?? 0, next.time ?? 0, rgba[0], rgbaOf(next)[0]) : \"linear\" };\n })));\n } else if (kind === \"rgb\") {\n tracks.push(track(\"slot\", id, \"color\", frames.map(f => { const c = hex8((f.color ?? \"ffffff\") + \"ff\"); return { t: r4(f.time ?? 0), v: [0, 2, 4, 6].map(k => r4(parseInt(c.slice(1 + k, 3 + k), 16) / 255)), ease: \"linear\" }; })));\n } else if (kind === \"alpha\") tracks.push(track(\"slot\", id, \"alpha\", numeric(frames, \"value\", 1, v => v, 0)));\n else warnings.push(`${animName}/${slotName}: ${kind} timeline skipped`);\n }\n }\n // Per-attachment timelines live in two places depending on the exporter: `deform` alone (3.8 and 4.0, which\n // is what ross has) or `attachments[skin][slot][att][kind]` (4.1+, which is what devil has, and where the\n // sequence timeline also lives). Reading only the first silently drops the other \u2014 devil loses 4 deform\n // timelines and 2 sequences that way, with no warning, because nothing ever looks in the second place.\n const perAttachment: [string, string, string, string, J[]][] = [];\n for (const [skinName, slotsMap] of Object.entries((a.deform ?? {}) as J))\n for (const [slotName, attMap] of Object.entries(slotsMap as J))\n for (const [attName, frames] of Object.entries(attMap as J) as [string, J[]][])\n perAttachment.push([skinName, slotName, attName, \"deform\", frames]);\n for (const [skinName, slotsMap] of Object.entries((a.attachments ?? {}) as J))\n for (const [slotName, attMap] of Object.entries(slotsMap as J))\n for (const [attName, kinds] of Object.entries(attMap as J))\n for (const [kind, frames] of Object.entries(kinds as J) as [string, J[]][])\n perAttachment.push([skinName, slotName, attName, kind, frames]);\n\n const pendingSequences: { slotName: string; attName: string; seq: J; frames: J[]; base: string }[] = [];\n for (const [skinName, slotName, attName, kind, frames] of perAttachment) {\n const prefix = skinName === \"default\" ? \"\" : `${skinName}_`;\n seen(frames);\n if (kind === \"sequence\") {\n const seq = sequences.get(`${slotName} ${prefix}${attName}`);\n if (!seq) { warnings.push(`${animName}: sequence timeline on ${slotName}/${attName}, which is not a sequence attachment`); continue; }\n // lowered after the loop: which frame a key shows depends on where the NEXT key is, and the last key\n // runs to the animation's end, which is only known once every timeline has been seen\n pendingSequences.push({ slotName, attName, seq, frames, base: prefix + attName });\n continue;\n }\n if (kind !== \"deform\") { warnings.push(`${animName}: ${kind} timeline on ${slotName}/${attName} skipped`); continue; }\n const id = attachmentId(slotName, prefix + attName);\n const att = attachments.find(x => x.id === id);\n if (!att) { warnings.push(`${animName}: deform of unknown attachment ${slotName}/${attName}`); continue; }\n const length = att.weights ? 2 * att.weights.reduce((s: number, l: J[]) => s + l.length, 0) : (att.vertices?.length ?? 0);\n tracks.push(track(\"deform\", id, \"vertices\", frames.map((f, i) => {\n const full = new Array(length).fill(0);\n const off = f.offset ?? 0, vs: number[] = f.vertices ?? [];\n for (let k = 0; k < vs.length; k++) full[off + k] = (k + off) % 2 === 1 ? -vs[k] : vs[k]; // mirror y\n const next = frames[i + 1];\n return { t: r4(f.time ?? 0), v: full.map(r4), ease: next ? easeOf(f.curve, 0, f.time ?? 0, next.time ?? 0, 0, 1) : \"linear\" };\n })));\n }\n // draw order: offsets \u2192 full order (documented Spine semantics)\n const drawOrderFrames: J[] | undefined = a.drawOrder ?? a.draworder;\n if (Array.isArray(drawOrderFrames)) {\n seen(drawOrderFrames);\n const n = spineSlots.length;\n tracks.push(track(\"drawOrder\", \"order\", \"order\", drawOrderFrames.map(f => {\n const offsets: J[] = f.offsets ?? [];\n const order = new Array<number>(n).fill(-1), unchanged: number[] = [];\n let originalIndex = 0;\n for (const o of offsets) {\n const slotIndex = slotIndexByName.get(o.slot)!;\n while (originalIndex !== slotIndex) unchanged.push(originalIndex++);\n order[originalIndex + o.offset] = originalIndex++;\n }\n while (originalIndex < n) unchanged.push(originalIndex++);\n let u = unchanged.length;\n for (let i = n - 1; i >= 0; i--) if (order[i] === -1) order[i] = unchanged[--u];\n return { t: r4(f.time ?? 0), v: order.map(i => slots[i].id), ease: \"step\" };\n })));\n }\n // constraints\n for (const [name, frames] of Object.entries((a.ik ?? {}) as J) as [string, J[]][]) {\n seen(frames); const id = ikIds.get(name);\n tracks.push(track(\"ik\", id, \"mix\", numeric(frames, \"mix\", 1, v => v, 0)));\n tracks.push(track(\"ik\", id, \"softness\", numeric(frames, \"softness\", 0, v => v, 1)));\n tracks.push(track(\"ik\", id, \"bendPositive\", frames.map(f => ({ t: r4(f.time ?? 0), v: (f.bendPositive ?? true) ? 0 : 1, ease: \"step\" }))));\n tracks.push(track(\"ik\", id, \"compress\", frames.map(f => ({ t: r4(f.time ?? 0), v: f.compress ? 1 : 0, ease: \"step\" }))));\n tracks.push(track(\"ik\", id, \"stretch\", frames.map(f => ({ t: r4(f.time ?? 0), v: f.stretch ? 1 : 0, ease: \"step\" }))));\n }\n const mixTrack = (target: string, id: string, frames: J[], prop: string, old: string, comp: number) =>\n track(target, id, prop, frames.map((f, i) => ({ t: r4(f.time ?? 0), v: r4(f[prop] ?? f[old] ?? 1),\n ease: frames[i + 1] ? easeOf(f.curve, comp, f.time ?? 0, frames[i + 1].time ?? 0, f[prop] ?? f[old] ?? 1, frames[i + 1][prop] ?? frames[i + 1][old] ?? 1) : \"linear\" })));\n for (const [name, frames] of Object.entries((a.transform ?? {}) as J) as [string, J[]][]) {\n seen(frames); const id = tcIds.get(name);\n const props: [string, string, number][] = [[\"mixRotate\", \"rotateMix\", 0], [\"mixX\", \"translateMix\", 1], [\"mixY\", \"translateMix\", 2], [\"mixScaleX\", \"scaleMix\", 3], [\"mixScaleY\", \"scaleMix\", 4], [\"mixShearY\", \"shearMix\", 5]];\n for (const [prop, old, comp] of props) tracks.push(mixTrack(\"transform\", id, frames, prop, old, comp));\n }\n for (const [name, tl] of Object.entries((a.path ?? {}) as J)) {\n const id = pcIds.get(name);\n for (const [kind, frames] of Object.entries(tl as J) as [string, J[]][]) {\n seen(frames);\n if (kind === \"position\" || kind === \"spacing\") tracks.push(track(\"path\", id, kind, numeric(frames, \"value\", 0, v => v, 0)));\n else if (kind === \"mix\") for (const [prop, old, comp] of [[\"mixRotate\", \"rotateMix\", 0], [\"mixX\", \"translateMix\", 1], [\"mixY\", \"translateMix\", 2]] as [string, string, number][])\n tracks.push(mixTrack(\"path\", id, frames, prop, old, comp));\n }\n }\n for (const e of (a.events ?? []) as J[]) {\n events.push({ t: r4(e.time ?? 0), name: e.name, payload: { ...(e.int !== undefined ? { int: e.int } : {}), ...(e.float !== undefined ? { float: e.float } : {}), ...(e.string !== undefined ? { string: e.string } : {}) } });\n duration = Math.max(duration, e.time ?? 0);\n }\n /**\n * A sequence timeline says which numbered frame a sequence attachment shows, by counting `delay` seconds\n * from its own key. Here a sequence IS its frames, so that becomes an `attachment` track: walk each key's\n * span and emit a step key whenever the index changes. The arithmetic is spine-core's `SequenceTimeline`,\n * epsilon included \u2014 without it a delay that divides the span exactly loses its last frame. Lowered here\n * rather than in the loop above because the final key runs to the animation's end, which is only known\n * once every timeline has been seen.\n */\n const seqIndex = (mode: string, raw: number, count: number): number => {\n const fold = () => { const n = (count << 1) - 2, i = n === 0 ? 0 : raw % n; return i >= count ? n - i : i; };\n if (mode === \"once\") return Math.min(count - 1, raw);\n if (mode === \"loop\") return raw % count;\n if (mode === \"pingpong\") return fold();\n if (mode === \"onceReverse\") return Math.max(count - 1 - raw, 0);\n if (mode === \"loopReverse\") return count - 1 - (raw % count);\n if (mode === \"pingpongReverse\") return count - 1 - fold();\n return raw; // hold: the key's own index, held\n };\n for (const { slotName, attName, seq, frames, base } of pendingSequences) {\n const slotId = slotIds.get(slotName), count = seq.count ?? 0;\n const steps: { t: number; k: number }[] = [];\n let delay = 0;\n const push = (t: number, k: number) => { if (steps[steps.length - 1]?.k !== k) steps.push({ t, k }); };\n for (let i = 0; i < frames.length && count > 0; i++) {\n const f = frames[i], t0 = f.time ?? 0, mode: string = f.mode ?? \"hold\", index = f.index ?? 0;\n delay = f.delay ?? delay; // Spine carries the previous key's delay forward\n const end = i + 1 < frames.length ? (frames[i + 1].time ?? 0) : duration;\n if (mode === \"hold\" || !(delay > 0)) { push(t0, seqIndex(mode, index, count)); continue; }\n const steps = Math.min(Math.ceil(Math.max(0, end - t0) / delay), 100000);\n for (let step = 0; step <= steps; step++) {\n const t = t0 + step * delay;\n if (step > 0 && t >= end) break;\n push(t, seqIndex(mode, index + Math.trunc((t - t0) / delay + 0.00001), count));\n }\n }\n if (!steps.length) continue;\n const frameId = (k: number) => attachmentId(slotName, base + frameSuffix(seq, k));\n /**\n * Spine layers the two timelines: the `attachment` one chooses WHICH attachment the slot shows, the\n * sequence one chooses which frame WITHIN it, and the second only means anything while the first is\n * showing the sequence attachment. h1's explosion is exactly that \u2014 the slot is empty until 0.2333, then\n * shows `fx/explosion_` while the sequence loops through it. So evaluate both at every time either of them\n * keys, and let the attachment timeline decide whether the frame applies at all.\n */\n const attFrames = attachmentFrames.get(slotName);\n const setupName: string | null = spineSlots.find(x => x.name === slotName)?.attachment ?? null;\n const at = <T,>(xs: { t: number }[], t: number) => { let hit: T | undefined; for (const x of xs) if (x.t <= t + 1e-9) hit = x as T; return hit; };\n const shownAt = (t: number): string | null => {\n let name = setupName;\n for (const f of attFrames ?? []) if ((f.time ?? 0) <= t + 1e-9) name = f.name ?? null;\n return name;\n };\n const times = [...new Set([...(attFrames ?? []).map(f => r4(f.time ?? 0)), ...steps.map(x => r4(x.t))])].sort((x, y) => x - y);\n const keys: Key[] = [];\n for (const t of times) {\n const name = shownAt(t);\n const v = name === null ? null\n : name === attName ? frameId(at<{ t: number; k: number }>(steps.map(x => ({ ...x, t: r4(x.t) })), t)?.k ?? (seq.setupIndex ?? 0))\n : attachmentRef(slotName, name);\n if (!keys.length || keys[keys.length - 1].v !== v) keys.push({ t, v, ease: \"step\" });\n }\n const existing = tracks.findIndex(t => t.target === \"slot\" && t.id === slotId && t.prop === \"attachment\");\n if (existing >= 0) tracks.splice(existing, 1);\n if (keys.length) tracks.push(track(\"slot\", slotId, \"attachment\", keys));\n }\n // Spine holds the setup value until a track's first key; our tracks hold their first key, so make it explicit.\n // Tracks whose every key equals the setup value change nothing (Spine keys everything) and are dropped.\n const setupOf = (tr: J) => {\n if (tr.target === \"deform\") return (tr.keys[0].v as number[]).map(() => 0);\n const v = restValue({ bones, slots, ik, transform, path } as unknown as RigDocument, pk(tr.target, tr.id, tr.prop));\n return v === undefined ? null : v; // a slot without a setup attachment rests hidden\n };\n const same = (a: unknown, b: unknown): boolean => Array.isArray(a) && Array.isArray(b) ? a.length === b.length && a.every((v, i) => same(v, b[i]))\n : typeof a === \"number\" && typeof b === \"number\" ? Math.abs(a - b) < 1e-9 : a === b;\n const live = tracks.filter(tr => { const rest = setupOf(tr); return !tr.keys.every((k: J) => same(k.v, rest)); });\n for (const tr of live) if (tr.keys[0].t > 0) tr.keys.unshift({ t: 0, v: setupOf(tr), ease: \"step\" });\n animations.push({ id: animIds.get(animName), duration: r4(Math.max(duration, 1 / 30)), loop: false, tracks: live, events });\n }\n\n // An attachment the import decided not to create \u2014 its atlas region is missing, or it is a linked mesh \u2014 must\n // not stay referenced: a slot or an `attachment` key pointing at nothing fails validation and takes the whole\n // rig with it. Drop the reference instead, so what DID import still opens.\n const made = new Set(attachments.map(a => a.id as string));\n const nameOf = new Map([...attachmentIdMap].map(([k, id]) => [id, k]));\n const lost = (id: string) => { warnings.push(`attachment \"${nameOf.get(id) ?? id}\" was not imported; the reference to it is dropped`); };\n for (const slot of slots)\n if (slot.attachment && !made.has(slot.attachment as string)) { lost(slot.attachment as string); delete slot.attachment; }\n for (const anim of animations)\n for (const tr of anim.tracks as J[])\n if (tr.target === \"slot\" && tr.prop === \"attachment\")\n for (const k of tr.keys as J[]) if (k.v && !made.has(k.v as string)) { lost(k.v as string); k.v = null; }\n\n let width = Math.ceil(bounds.w + 2 * margin) || 1, height = Math.ceil(bounds.h + 2 * margin) || 1;\n const build = () => ({\n format: \"energy8.rig\", version: 2,\n meta: { name: opts.name ?? json.skeleton?.hash ?? \"spine\", width, height, notes: opts.notes ?? `imported from Spine ${version}` },\n assets: [...assets.values()], bones, slots, attachments, ik, transform, path, animations,\n });\n if (opts.fit !== \"setup\") {\n // canvas = everything the rig ever shows (sampled at 30 fps, like rig_check), not just the setup bounds Spine exports\n const parsed = parse(build());\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const grow = (pose: Pose) => {\n const skel = evaluate(parsed, pose);\n for (const slot of parsed.slots) {\n const att = skel.attachment.get(slot.id);\n if (!att || att.type === \"path\") continue;\n let pts: number[];\n if (att.type === \"mesh\") pts = attachmentWorldVertices(skel, slot.id, att);\n else {\n const m = regionMatrix(skel, slot.id, att), [w, h] = regionSize(parsed, att);\n pts = [[-w / 2, -h / 2], [w / 2, -h / 2], [w / 2, h / 2], [-w / 2, h / 2]].flatMap(([cx, cy]) => apply(m, cx, cy));\n }\n for (let i = 0; i < pts.length; i += 2) {\n if (pts[i] < minX) minX = pts[i]; if (pts[i] > maxX) maxX = pts[i];\n if (pts[i + 1] < minY) minY = pts[i + 1]; if (pts[i + 1] > maxY) maxY = pts[i + 1];\n }\n }\n };\n grow(new Map());\n for (const a of parsed.animations) for (let i = 0, n = Math.max(1, Math.round(a.duration * 30)); i <= n; i++) grow(poseOf(a, Math.min(a.duration, i / 30)));\n if (Number.isFinite(minX)) {\n const dx = margin - Math.floor(minX), dy = margin - Math.floor(minY);\n bones[0].transform.x = r4(bones[0].transform.x + dx); bones[0].transform.y = r4(bones[0].transform.y + dy);\n originX += dx; originY += dy;\n width = Math.ceil(maxX - minX) + 2 * margin + 1; height = Math.ceil(maxY - minY) + 2 * margin + 1;\n }\n }\n const doc = build();\n return { doc, warnings, boneId: n => boneIds.get(n), slotId: n => slotIds.get(n), attachmentId, assetId: n => assetIds.get(n), animId: n => animIds.get(n), toDoc };\n}\n\n// ---------- files ----------\n\nexport interface SpineProjectOptions {\n /** Spine skeleton .json */\n json: string;\n /** atlas text (plain or base64); default: the json's sibling `.atlas` / `.atlas.txt` */\n atlas?: string;\n /** atlas page image, .png or .ktx2; default: the page named in the atlas, next to the atlas (a .ktx2 twin is tried too) */\n image?: string;\n /** where the rig will live: the page asset is referenced relative to its directory (KTX2 pages are written there as PNG) */\n rigPath: string;\n name?: string;\n margin?: number;\n notes?: string;\n}\n\nconst exists = (p: string) => stat(p).then(() => true, () => false);\nasync function firstExisting(candidates: string[], what: string): Promise<string> {\n for (const c of candidates) if (await exists(c)) return c;\n throw new Error(`${what} not found, tried: ${candidates.join(\", \")}`);\n}\n\n/** Import a Spine project from files. Resolves the atlas and page image, transcodes KTX2 pages to PNG next to the rig. */\nexport async function importSpineProject(opts: SpineProjectOptions): Promise<ReturnType<typeof importSpine> & { imagePath: string }> {\n const json = JSON.parse(await readFile(opts.json, \"utf8\"));\n const stem = opts.json.replace(/\\.json$/i, \"\");\n const atlasPath = opts.atlas ?? await firstExisting([stem + \".atlas\", stem + \".atlas.txt\"], \"atlas\");\n const atlasText = await readFile(atlasPath, \"utf8\");\n const { pages } = parseAtlas(atlasText);\n if (pages.length !== 1) throw new Error(`expected one atlas page, got ${pages.length}`);\n const pageStem = join(dirname(atlasPath), pages[0].name.replace(/\\.[a-z0-9]+$/i, \"\"));\n const imagePath = opts.image ?? await firstExisting([join(dirname(atlasPath), pages[0].name), pageStem + \".png\", pageStem + \".ktx2\", stem + \".png\", stem + \".ktx2\"], \"atlas page image\");\n const rigDir = dirname(opts.rigPath);\n let pngPath = imagePath;\n if (extname(imagePath).toLowerCase() === \".ktx2\") {\n pngPath = join(rigDir, basename(imagePath).replace(/\\.ktx2$/i, \".png\"));\n if (!(await exists(pngPath))) {\n const { png } = await ktx2ToPng(new Uint8Array(await readFile(imagePath)));\n await writeFile(pngPath, png);\n }\n }\n const pageImage = relative(rigDir, pngPath).split(\"\\\\\").join(\"/\");\n const name = opts.name ?? basename(stem);\n return { ...importSpine(json, atlasText, { name, pageImage, margin: opts.margin, notes: opts.notes }), imagePath: pngPath };\n}\n", "/**\n * KTX2 (Basis UASTC / ETC1S, zstd supercompression ok) \u2192 RGBA pixels, via the basis transcoder bundled with three.js.\n * `three` is an optional dependency: it is resolved lazily so everything else works without it.\n */\nimport { readFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { PNG } from \"pngjs\";\n\nconst require = createRequire(import.meta.url);\nlet basisPromise: Promise<any> | undefined;\n\nasync function basis(): Promise<any> {\n if (basisPromise) return basisPromise;\n basisPromise = (async () => {\n let jsPath: string;\n try { jsPath = require.resolve(\"three/examples/jsm/libs/basis/basis_transcoder.js\"); }\n catch { throw new Error(\"KTX2 pages need the basis transcoder from three.js: `npm i -D three`, or convert the page to PNG yourself\"); }\n const wasm = await readFile(jsPath.replace(/\\.js$/, \".wasm\"));\n // Emscripten CommonJS factory (module.exports = BASIS) inside an ESM package: evaluate it as CJS by hand\n const src = await readFile(jsPath, \"utf8\");\n const mod = { exports: {} as any };\n new Function(\"require\", \"module\", \"exports\", \"__dirname\", \"__filename\", src)(require, mod, mod.exports, jsPath.replace(/\\/[^/]+$/, \"\"), jsPath);\n const Basis = await mod.exports({ wasmBinary: wasm });\n Basis.initializeBasis();\n return Basis;\n })();\n return basisPromise;\n}\n\nexport interface Ktx2Info { width: number; height: number; levels: number; hasAlpha: boolean; uastc: boolean }\n\n/** Transcode level 0 of a KTX2 texture to RGBA8. */\nexport async function ktx2ToRgba(data: Uint8Array): Promise<Ktx2Info & { rgba: Uint8Array }> {\n const Basis = await basis();\n const file = new Basis.KTX2File(data);\n try {\n if (!file.isValid()) throw new Error(\"invalid KTX2 file\");\n const info: Ktx2Info = { width: file.getWidth(), height: file.getHeight(), levels: file.getLevels(), hasAlpha: !!file.getHasAlpha(), uastc: !!file.isUASTC() };\n if (!file.startTranscoding()) throw new Error(\"KTX2: startTranscoding failed\");\n const RGBA32 = 13; // transcoder_texture_format::cTFRGBA32\n const rgba = new Uint8Array(file.getImageTranscodedSizeInBytes(0, 0, 0, RGBA32));\n if (!file.transcodeImage(rgba, 0, 0, 0, RGBA32, 0, -1, -1)) throw new Error(\"KTX2: transcodeImage failed\");\n return { ...info, rgba };\n } finally { file.close(); file.delete(); }\n}\n\n/** Transcode a KTX2 texture to a PNG buffer. */\nexport async function ktx2ToPng(data: Uint8Array): Promise<Ktx2Info & { png: Buffer }> {\n const { rgba, ...info } = await ktx2ToRgba(data);\n const png = new PNG({ width: info.width, height: info.height });\n png.data = Buffer.from(rgba.buffer, rgba.byteOffset, rgba.byteLength);\n return { ...info, png: PNG.sync.write(png) };\n}\n", "/**\n * rig-templates \u2014 turn a finished animation into a reusable preset (\"rig_save_as_preset\").\n *\n * A template stores tracks relative to the source rig's rest pose and keyed by bone `role`, so it can be\n * instantiated on a different rig: bone x/y/rotation as deltas, scale as ratios, slot alpha as a delta,\n * deform params as-is, attachment/z unchanged. Params are scalar multipliers: `amplitude` (every relative\n * value), `speed` (time), plus optional named groups that scale only the listed source tracks.\n * Pure (no node:*) so the editor bundles it and previews param changes locally; the library on disk\n * (a JSON array of templates, `presets.json` next to the rig by default) lives in `rig-template-library.ts`.\n */\nimport type { RigDocument, Animation, Track, Slot, Bone } from \"./rig-format\";\n\ntype Key = Track[\"keys\"][number];\n\nexport interface TemplateTrack {\n target: Track[\"target\"];\n /** source id (bone or slot) \u2014 used when the target rig has no matching role */\n id: string;\n /** role of the bone (or of the slot's bone) in the source rig */\n role?: string;\n prop: string;\n /** values relative to rest (see module doc) */\n keys: Key[];\n}\n\nexport interface TemplateParam { default: number; /** source track ids `target.id.prop`; absent = every track */ tracks?: string[] }\n\nexport interface AnimationTemplate {\n name: string;\n duration: number;\n loop: boolean;\n events: Animation[\"events\"];\n tracks: TemplateTrack[];\n params: Record<string, TemplateParam>;\n /** source track ids left out because their keys are arrays (see `extractTemplate`) \u2014 absent when nothing was */\n skipped?: string[];\n source: { rig: string; animation: string };\n}\n\nconst trackId = (t: { target: string; id: string; prop: string }) => `${t.target}.${t.id}.${t.prop}`;\nconst round = (v: number) => +v.toFixed(4);\nconst isScale = (prop: string) => prop === \"scaleX\" || prop === \"scaleY\";\n\nexport function extractTemplate(doc: RigDocument, animId: string, name: string, groups: Record<string, string[]> = {}): AnimationTemplate {\n const anim = doc.animations.find(a => a.id === animId);\n if (!anim) throw new Error(`unknown animation \"${animId}\"`);\n const ids = new Set(anim.tracks.map(trackId));\n for (const [g, list] of Object.entries(groups)) for (const id of list)\n if (!ids.has(id)) throw new Error(`group \"${g}\": unknown track \"${id}\" (tracks: ${[...ids].join(\", \")})`);\n const roleOfBone = (id: string) => doc.bones.find(b => b.id === id)?.role;\n const tracks: TemplateTrack[] = [];\n const skipped: string[] = [];\n for (const t of anim.tracks) {\n // Array-valued keys \u2014 deform `vertices` (2 numbers per vertex or per influence), drawOrder (slot ids), slot\n // colour \u2014 describe THIS rig's geometry and layering. A template stores values relative to rest and scales\n // them by `amplitude`, and neither means anything for an array: `round(v * k)` on one is NaN, and a drawOrder\n // track has no slot at all (`doc.slots.find(...)!` used to throw on it). They are recorded by name instead,\n // so an agent can see what did not come along rather than find it silently missing.\n if (t.target === \"drawOrder\" || t.keys.some(k => Array.isArray(k.v))) { skipped.push(trackId(t)); continue; }\n if (t.target === \"bone\") {\n const bone = doc.bones.find(b => b.id === t.id)!, rest = (bone.transform as Record<string, number>)[t.prop];\n tracks.push({ target: t.target, id: t.id, role: bone.role, prop: t.prop,\n keys: t.keys.map(k => ({ ...k, v: isScale(t.prop) ? round((k.v as number) / rest) : round((k.v as number) - rest) })) });\n continue;\n }\n const slot = t.target === \"deform\"\n ? doc.slots.find(s => s.id === doc.attachments.find(a => a.id === t.id)?.slot)!\n : doc.slots.find(s => s.id === t.id)!;\n const role = roleOfBone(slot.bone);\n if (t.target === \"slot\" && t.prop === \"alpha\")\n tracks.push({ target: t.target, id: t.id, role, prop: t.prop, keys: t.keys.map(k => ({ ...k, v: round((k.v as number) - slot.alpha) })) });\n else tracks.push({ target: t.target, id: t.id, role, prop: t.prop, keys: t.keys.map(k => ({ ...k })) });\n }\n const params: Record<string, TemplateParam> = { amplitude: { default: 1 }, speed: { default: 1 } };\n for (const [g, list] of Object.entries(groups)) params[g] = { default: 1, tracks: list };\n return { name, duration: anim.duration, loop: anim.loop, events: anim.events.map(e => ({ ...e })), tracks, params,\n ...(skipped.length ? { skipped } : {}),\n source: { rig: doc.meta.name, animation: animId } };\n}\n\n/** the slot carrying a bone's image: same id as the bone, else the first attached slot on it */\nconst slotOfBone = (doc: RigDocument, bone: Bone): Slot | undefined =>\n doc.slots.find(s => s.bone === bone.id && s.id === bone.id && s.attachment) ?? doc.slots.find(s => s.bone === bone.id && s.attachment);\n\nexport function instantiateTemplate(doc: RigDocument, tpl: AnimationTemplate, params: Record<string, number> = {}, id = tpl.name): Animation {\n for (const k of Object.keys(params)) if (!(k in tpl.params)) throw new Error(`unknown param \"${k}\" (available: ${Object.keys(tpl.params).join(\", \")})`);\n const p: Record<string, number> = {};\n for (const [k, def] of Object.entries(tpl.params)) p[k] = params[k] ?? def.default;\n const speed = p.speed || 1, assets = new Set(doc.assets.map(a => a.id));\n const factorFor = (src: string) => {\n let k = p.amplitude;\n for (const [name, def] of Object.entries(tpl.params)) if (def.tracks?.includes(src)) k *= p[name];\n return k;\n };\n const tracks: Track[] = [];\n for (const t of tpl.tracks) {\n // a library file written before array keys were skipped can still hold one; `round(v * k)` on an array is NaN\n if (t.keys.some(kk => Array.isArray(kk.v))) continue;\n const k = factorFor(trackId(t)), time = (x: number) => round(x / speed);\n if (t.target === \"bone\") {\n const bone = (t.role && doc.bones.find(b => b.role === t.role)) || doc.bones.find(b => b.id === t.id);\n if (!bone) continue;\n const rest = (bone.transform as Record<string, number>)[t.prop];\n tracks.push({ target: \"bone\", id: bone.id, prop: t.prop as \"x\",\n keys: t.keys.map(kk => ({ ...kk, t: time(kk.t), v: round(isScale(t.prop) ? rest * (1 + ((kk.v as number) - 1) * k) : rest + (kk.v as number) * k) })) });\n continue;\n }\n const byRole = t.role && doc.bones.find(b => b.role === t.role);\n if (t.target === \"deform\") {\n const att = doc.attachments.find(a => a.id === t.id) ?? (byRole ? doc.attachments.find(a => a.id === slotOfBone(doc, byRole)?.attachment) : undefined);\n if (att) tracks.push({ target: \"deform\", id: att.id, prop: t.prop, keys: t.keys.map(kk => ({ ...kk, t: time(kk.t), v: round((kk.v as number) * k) })) });\n continue;\n }\n const slot = doc.slots.find(s => s.id === t.id) ?? (byRole ? slotOfBone(doc, byRole) : undefined);\n if (!slot) continue;\n if (false) {}\n else if (t.prop === \"alpha\")\n tracks.push({ target: \"slot\", id: slot.id, prop: \"alpha\", keys: t.keys.map(kk => ({ ...kk, t: time(kk.t), v: round(Math.min(1, Math.max(0, slot.alpha + (kk.v as number) * k))) })) });\n else if (t.prop === \"attachment\") {\n if (t.keys.some(kk => typeof kk.v === \"string\" && !assets.has(kk.v))) continue;\n tracks.push({ target: \"slot\", id: slot.id, prop: \"attachment\", keys: t.keys.map(kk => ({ ...kk, t: time(kk.t) })) });\n } else tracks.push({ target: \"slot\", id: slot.id, prop: \"z\", keys: t.keys.map(kk => ({ ...kk, t: time(kk.t) })) });\n }\n return { id, duration: round(tpl.duration / speed), loop: tpl.loop, tracks,\n events: tpl.events.map(e => ({ ...e, t: round(e.t / speed) })), preset: { name: `template:${tpl.name}`, params: p } };\n}\n\n/** replace/add the instantiated animation in the document */\nexport function applyTemplate(doc: RigDocument, tpl: AnimationTemplate, params: Record<string, number> = {}, id?: string): RigDocument {\n const anim = instantiateTemplate(doc, tpl, params, id);\n return { ...doc, animations: doc.animations.filter(a => a.id !== anim.id).concat(anim) };\n}\n\nexport function describeTemplate(t: AnimationTemplate): string {\n const params = Object.entries(t.params).map(([k, v]) => `${k}=${v.default}${v.tracks ? `(${v.tracks.join(\",\")})` : \"\"}`).join(\" \");\n const roles = [...new Set(t.tracks.map(x => x.role ?? x.id))].join(\", \");\n const skipped = t.skipped?.length ? `; skipped: ${t.skipped.join(\", \")}` : \"\";\n return `${t.name}: ${t.duration}s${t.loop ? \" loop\" : \"\"}, ${t.tracks.length} tracks on ${roles}; params ${params}${skipped}; from ${t.source.rig}/${t.source.animation}`;\n}\n", "/**\n * rig-template-library \u2014 the on-disk side of rig-templates: `presets.json` (a JSON array of templates).\n *\n * Split out of `rig-templates.ts` so that module stays pure and bundles for the browser: the editor previews\n * template params locally (applyTemplate) and gets the template itself over `rig_get_preset`, never from disk.\n */\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { AnimationTemplate } from \"./rig-templates\";\n\nexport async function loadLibrary(path: string): Promise<AnimationTemplate[]> {\n try { return JSON.parse(await readFile(path, \"utf8\")) as AnimationTemplate[]; }\n catch (e) { if ((e as NodeJS.ErrnoException).code === \"ENOENT\") return []; throw e; }\n}\n\nexport async function saveTemplate(path: string, tpl: AnimationTemplate): Promise<void> {\n const all = await loadLibrary(path);\n const i = all.findIndex(t => t.name === tpl.name);\n if (i >= 0) all[i] = tpl; else all.push(tpl);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, JSON.stringify(all, null, 2));\n}\n", "/**\n * rig-mesh-image \u2014 Node-only PNG \u2192 AlphaMask reader. Kept separate from rig-mesh.ts so the pure mesh math\n * stays free of node:* / DOM dependencies. `frame` = [x, y, w, h] cuts one rectangle out of a sheet, so a\n * framed asset (a part split off an uploaded PNG in the editor) traces exactly like a file of its own.\n */\nimport { PNG } from \"pngjs\";\nimport type { AlphaMask } from \"./rig-mesh\";\n\nexport function alphaMaskFromPng(buf: Buffer, frame?: [number, number, number, number]): AlphaMask {\n const png = PNG.sync.read(buf);\n const [fx, fy, w, h] = frame ?? [0, 0, png.width, png.height];\n if (fx < 0 || fy < 0 || w < 1 || h < 1 || fx + w > png.width || fy + h > png.height) {\n throw new Error(`frame [${fx}, ${fy}, ${w}, ${h}] is outside the ${png.width}x${png.height} image`);\n }\n const alpha = new Uint8Array(w * h);\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) alpha[y * w + x] = png.data[((fy + y) * png.width + fx + x) * 4 + 3];\n return { width: w, height: h, alpha };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["readFile", "stat", "readdir", "mkdir", "resolve", "dirname", "basename", "extname", "join", "relative", "fileURLToPath", "j", "vertexCount", "z", "readFile", "writeFile", "stat", "dirname", "join", "relative", "DEG", "
|
|
3
|
+
"sources": ["../../src/editor/server.ts", "../../src/rig-format.ts", "../../src/rig-deform.ts", "../../src/rig-api.ts", "../../src/rig-io.ts", "../../src/rig-queue.ts", "../../src/rig-anim.ts", "../../src/rig-mesh.ts", "../../src/rig-path.ts", "../../src/rig-constraints.ts", "../../src/rig-tools.ts", "../../src/rig-import-layers.ts", "../../src/rig-presets.ts", "../../src/preview/export-video.ts", "../../src/preview/render-preview.ts", "../../src/rig-qa.ts", "../../src/rig-quality.ts", "../../src/rig-check.ts", "../../src/rig-history.ts", "../../src/rig-atlas.ts", "../../src/spine-import.ts", "../../src/ktx2.ts", "../../src/rig-templates.ts", "../../src/rig-template-library.ts", "../../src/rig-mesh-image.ts", "../../src/rig-gates.ts", "../../src/rig-state.ts", "../../src/rig-motion.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * editor/server.ts \u2014 HTTP + SSE for the browser editor, on top of the same tool registry as MCP.\n * `rig` in every request is a path relative to `root`; the file on disk is the state; the server watches it and\n * tells every client when it changed (own writes included \u2014 clients compare versions).\n */\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { readFile, stat, readdir, mkdir, open } from \"node:fs/promises\";\nimport { watch as fsWatch, type FSWatcher } from \"node:fs\";\nimport { resolve, dirname, basename, extname, sep, join, relative } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { RigDocument } from \"../rig-format\";\nimport { callTool } from \"../rig-api\";\nimport { withRigQueue } from \"../rig-queue\";\nimport { pngSize } from \"../rig-import-layers\";\nimport { saveBytes } from \"../rig-io\";\n\nconst TYPES: Record<string, string> = { \".html\": \"text/html; charset=utf-8\", \".js\": \"text/javascript\", \".css\": \"text/css\", \".map\": \"application/json\", \".json\": \"application/json\", \".png\": \"image/png\", \".jpg\": \"image/jpeg\", \".webp\": \"image/webp\" };\n\nexport interface EditorServer { port: number; url: string; close(): Promise<void> }\n\n/** `root` \u2014 where the rigs live (every path in the API is relative to it); `assets` \u2014 where editor.html and dist/ are (default: this package). */\nexport async function startEditorServer(opts: { root: string; port?: number; assets?: string }): Promise<EditorServer> {\n const root = resolve(opts.root);\n const assets = resolve(opts.assets ?? fileURLToPath(new URL(\"../..\", import.meta.url)));\n const inside = (rel: string) => { const abs = resolve(root, rel); return abs === root || abs.startsWith(root + sep) ? abs : undefined; };\n const version = async (abs: string) => { try { const s = await stat(abs); return `${s.mtimeMs}:${s.size}`; } catch { return \"missing\"; } };\n const readDoc = async (abs: string) => RigDocument.parse(JSON.parse(await readFile(abs, \"utf8\")));\n /**\n * The document on disk together with the version OF that document. Stat, read, stat again: a write landing\n * between a read and a single stat pairs one with the other's version, and a version NEWER than the document\n * beside it is the one direction that breaks the precondition \u2014 the client would send a version that matches\n * the file while showing an older document, and clobber. While the file keeps moving, read again; if it never\n * settles, the version stat'd BEFORE the read is the safe half of the pair, since too old only costs a 409.\n */\n const readDocAt = async (abs: string) => {\n let v = await version(abs);\n for (let i = 0; i < 3; i++) {\n const doc = await readDoc(abs);\n const after = await version(abs);\n if (after === v) return { doc, version: v };\n v = after;\n }\n return { doc: await readDoc(abs), version: v };\n };\n const json = (res: ServerResponse, status: number, body: unknown) => { res.writeHead(status, { \"content-type\": \"application/json\" }); res.end(JSON.stringify(body)); };\n\n // The editor writes files, so the surface is loopback-only. A page on any other origin can still *send* requests\n // to 127.0.0.1, but it cannot forge `Host`: a request naming anything but this server's own address is a\n // DNS-rebinding attempt, not our editor. Filled in once the port is known (nothing can arrive before `listen`).\n let allowedHosts = new Set<string>();\n const hostOk = (req: IncomingMessage) => allowedHosts.has(String(req.headers.host ?? \"\").toLowerCase());\n\n // ---- watchers: one per rig file, fan out to SSE clients ----\n const clients = new Map<string, Set<ServerResponse>>(); // abs rig path \u2192 responses\n type Watcher = { w: FSWatcher; last: string; timer?: NodeJS.Timeout };\n const watchers = new Map<string, Watcher>();\n function ensureWatch(abs: string) {\n if (watchers.has(abs)) return;\n const entry: Watcher = { w: fsWatch(dirname(abs), { persistent: false }, (_e, file) => { if (file && file !== basename(abs)) return; schedule(); }), last: \"\" };\n const schedule = () => { clearTimeout(entry.timer); entry.timer = setTimeout(async () => {\n const v = await version(abs);\n if (v === entry.last) return;\n entry.last = v;\n for (const res of clients.get(abs) ?? []) res.write(`event: changed\\ndata: ${JSON.stringify({ version: v })}\\n\\n`);\n }, 50); };\n version(abs).then(v => { entry.last = v; });\n watchers.set(abs, entry);\n }\n\n async function body(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = []; for await (const c of req) chunks.push(c as Buffer);\n return chunks.length ? JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) : {};\n }\n\n const SKIP = new Set([\"node_modules\", \".rig-history\", \"dist\", \".git\"]);\n /** every rig.json under the root, newest first \u2014 the `open` list */\n async function listRigs(): Promise<{ rig: string; name: string; mtimeMs: number }[]> {\n const out: { rig: string; name: string; mtimeMs: number }[] = [];\n const walk = async (dir: string) => {\n for (const e of await readdir(dir, { withFileTypes: true })) {\n if (e.isDirectory()) { if (!SKIP.has(e.name)) await walk(join(dir, e.name)); continue; }\n if (e.name !== \"rig.json\") continue;\n const abs = join(dir, e.name);\n let name = \"?\";\n try { name = String(JSON.parse(await readFile(abs, \"utf8\")).meta?.name ?? \"?\"); } catch { /* unreadable: still listed, still openable */ }\n out.push({ rig: relative(root, abs).split(sep).join(\"/\"), name, mtimeMs: (await stat(abs)).mtimeMs });\n }\n };\n await walk(root);\n return out.sort((a, b) => b.mtimeMs - a.mtimeMs);\n }\n /** the PNGs beside a rig, with their sizes read from the header only */\n async function listFiles(rigAbs: string): Promise<{ name: string; width: number; height: number }[]> {\n const dir = dirname(rigAbs), out: { name: string; width: number; height: number }[] = [];\n for (const e of (await readdir(dir, { withFileTypes: true })).filter(e => e.isFile() && /\\.png$/i.test(e.name)).sort((a, b) => a.name.localeCompare(b.name))) {\n const fh = await open(join(dir, e.name));\n try {\n const head = Buffer.alloc(24);\n const { bytesRead } = await fh.read(head, 0, 24, 0);\n if (bytesRead < 24) continue;\n const [width, height] = pngSize(head);\n out.push({ name: e.name, width, height });\n } catch { /* not a PNG after all: not listed */ } finally { await fh.close(); }\n }\n return out;\n }\n const UPLOAD_MAX = 64 * 1024 * 1024;\n /** the request body, refused past `max` bytes */\n async function bytes(req: IncomingMessage, max: number): Promise<Buffer | undefined> {\n const chunks: Buffer[] = []; let n = 0;\n for await (const c of req) { n += (c as Buffer).length; if (n > max) return undefined; chunks.push(c as Buffer); }\n return Buffer.concat(chunks);\n }\n\n const server = createServer(async (req, res) => {\n try {\n if (!hostOk(req)) return json(res, 403, { isError: true, text: `ERROR: forbidden Host \"${req.headers.host ?? \"\"}\" \u2014 this server answers only on 127.0.0.1 / localhost` });\n const url = new URL(req.url ?? \"/\", \"http://x\");\n if (url.pathname === \"/\") { res.writeHead(302, { location: \"/editor.html\" + url.search }); return res.end(); }\n if (url.pathname.startsWith(\"/api/\")) return await api(url, req, res);\n // Only /rig/<path> (under `root`) and the fixed static surface (editor.html, dist/editor.js, dist/editor.css\n // and their maps, under `assets`) are servable; everything else \u2014 including anything a normalized \"..\"\n // collapses onto \u2014 is refused, not just 404ed.\n const STATIC = new Set([\"/editor.html\", \"/dist/editor.js\", \"/dist/editor.js.map\", \"/dist/editor.css\", \"/dist/editor.css.map\"]);\n const abs = url.pathname.startsWith(\"/rig/\") ? inside(decodeURIComponent(url.pathname.slice(5)))\n : STATIC.has(url.pathname) ? join(assets, url.pathname)\n : undefined;\n if (!abs) { res.writeHead(403); return res.end(\"forbidden\"); }\n try { const data = await readFile(abs); res.writeHead(200, { \"content-type\": TYPES[extname(abs)] ?? \"application/octet-stream\" }); res.end(data); }\n catch { res.writeHead(404); res.end(\"not found\"); }\n } catch (e) {\n // a throw after the headers went out cannot be reported to the client; ending the response is all that is left,\n // and the error must never escape to the process (one bad request would take the editor down)\n if (res.headersSent) { console.error(`editor: ${req.method} ${req.url}: ${(e as Error).message}`); res.end(); return; }\n json(res, 500, { isError: true, text: `ERROR: ${(e as Error).message}` });\n }\n });\n\n async function api(url: URL, req: IncomingMessage, res: ServerResponse) {\n const rigOf = (rel: string | null) => { if (!rel) return undefined; return inside(rel); };\n if (url.pathname === \"/api/doc\") {\n const abs = rigOf(url.searchParams.get(\"rig\")); if (!abs) return json(res, 403, { isError: true, text: \"rig outside root\" });\n return json(res, 200, await readDocAt(abs));\n }\n if (url.pathname === \"/api/events\") {\n const abs = rigOf(url.searchParams.get(\"rig\")); if (!abs) { res.writeHead(403); return res.end(); }\n // watch BEFORE the headers go out: fs.watch throws on a missing directory (the editor asks for the rig it had\n // open last, which need not exist under this root), and a throw after writeHead has nowhere to be reported\n if (!(await stat(abs).then(() => true, () => false))) return json(res, 404, { isError: true, text: `ERROR: ${url.searchParams.get(\"rig\")} does not exist under ${root}` });\n ensureWatch(abs);\n res.writeHead(200, { \"content-type\": \"text/event-stream\", \"cache-control\": \"no-cache\", connection: \"keep-alive\" });\n res.write(`: connected\\n\\n`);\n (clients.get(abs) ?? clients.set(abs, new Set()).get(abs)!).add(res);\n const hb = setInterval(() => res.write(\": hb\\n\\n\"), 15000);\n req.on(\"close\", () => { clearInterval(hb); clients.get(abs)?.delete(res); });\n return;\n }\n if (url.pathname.startsWith(\"/api/tool/\") && req.method === \"POST\") {\n // a JSON body is the only shape this route takes; demanding the type keeps a cross-origin form POST\n // (the one request shape a browser sends without a preflight) from ever reaching `callTool`\n const ct = String(req.headers[\"content-type\"] ?? \"\").toLowerCase();\n if (!ct.startsWith(\"application/json\")) return json(res, 415, { isError: true, text: `ERROR: POST /api/tool/* needs content-type: application/json (got \"${req.headers[\"content-type\"] ?? \"none\"}\")` });\n const { rig, args, baseVersion } = (await body(req)) as { rig?: string; args?: Record<string, unknown>; baseVersion?: string };\n const abs = rigOf(rig ?? null); if (!abs) return json(res, 403, { isError: true, text: \"rig outside root\" });\n ensureWatch(abs);\n return await withRigQueue(abs, async () => {\n // Check the version inside the same queue as the tool: two requests based on one version must not\n // both pass before either saves. This queue coordinates this process; external writers can still race.\n if (baseVersion !== undefined && (await version(abs)) !== baseVersion) {\n const at = await readDocAt(abs);\n return json(res, 409, { isError: true, version: at.version, doc: at.doc,\n text: `ERROR: the rig changed on disk (expected ${baseVersion}, found ${at.version}); nothing was written` });\n }\n const r = await callTool(url.pathname.slice(10), { ...(args ?? {}), path: abs });\n return json(res, 200, { text: r.text, doc: r.doc, image: r.image?.toString(\"base64\"), isError: r.isError, version: await version(abs) });\n });\n }\n if (url.pathname === \"/api/rigs\" && req.method === \"GET\") return json(res, 200, await listRigs());\n if (url.pathname === \"/api/rigs\" && req.method === \"POST\") {\n const ct = String(req.headers[\"content-type\"] ?? \"\").toLowerCase();\n if (!ct.startsWith(\"application/json\")) return json(res, 415, { isError: true, text: \"ERROR: POST /api/rigs needs content-type: application/json\" });\n const { rig, name, width, height } = (await body(req)) as { rig?: string; name?: string; width?: number; height?: number };\n if (typeof rig !== \"string\" || !/(^|\\/)rig\\.json$/.test(rig)) return json(res, 400, { isError: true, text: \"ERROR: a project is a directory with a rig.json \u2014 the path must end with /rig.json\" });\n const abs = inside(rig); if (!abs) return json(res, 403, { isError: true, text: \"rig outside root\" });\n if (await stat(abs).then(() => true, () => false)) return json(res, 409, { isError: true, text: `ERROR: ${rig} already exists \u2014 open it, or pick another directory` });\n await mkdir(dirname(abs), { recursive: true });\n const r = await callTool(\"rig_create\", { path: abs, name: name ?? basename(dirname(abs)), width: width ?? 640, height: height ?? 700 });\n ensureWatch(abs);\n return json(res, r.isError ? 400 : 200, { text: r.text, doc: r.doc, isError: r.isError, version: await version(abs) });\n }\n if (url.pathname === \"/api/files\" && req.method === \"GET\") {\n const abs = rigOf(url.searchParams.get(\"rig\")); if (!abs) return json(res, 403, { isError: true, text: \"rig outside root\" });\n return json(res, 200, await listFiles(abs));\n }\n if (url.pathname === \"/api/upload\" && req.method === \"POST\") {\n const abs = rigOf(url.searchParams.get(\"rig\")); if (!abs) return json(res, 403, { isError: true, text: \"rig outside root\" });\n const name = url.searchParams.get(\"name\") ?? \"\";\n if (!/^[A-Za-z0-9._-]+\\.png$/i.test(name) || name.startsWith(\".\")) return json(res, 400, { isError: true, text: `ERROR: bad file name \"${name}\" \u2014 letters, digits, . _ - and a .png extension` });\n if (!String(req.headers[\"content-type\"] ?? \"\").toLowerCase().startsWith(\"image/png\")) return json(res, 415, { isError: true, text: \"ERROR: upload needs content-type: image/png\" });\n const target = join(dirname(abs), name);\n if (!inside(relative(root, target))) return json(res, 403, { isError: true, text: \"file outside root\" });\n if (await stat(target).then(() => true, () => false)) return json(res, 409, { isError: true, text: `ERROR: ${name} already exists next to the rig \u2014 rename the file` });\n const data = await bytes(req, UPLOAD_MAX);\n if (!data) return json(res, 413, { isError: true, text: `ERROR: ${name} is larger than ${UPLOAD_MAX / 1048576} MB` });\n let size: [number, number];\n try { size = pngSize(data); } catch { return json(res, 415, { isError: true, text: `ERROR: ${name} is not a PNG` }); }\n await saveBytes(target, data);\n return json(res, 200, { name, width: size[0], height: size[1] });\n }\n json(res, 404, { isError: true, text: \"unknown api route\" });\n }\n\n await new Promise<void>((ok, fail) => {\n server.once(\"error\", fail);\n server.listen(opts.port ?? 8765, \"127.0.0.1\", () => { server.off(\"error\", fail); ok(); });\n });\n const port = (server.address() as { port: number }).port;\n allowedHosts = new Set([`127.0.0.1:${port}`, `localhost:${port}`, `[::1]:${port}`]);\n return { port, url: `http://127.0.0.1:${port}`, close: async () => { for (const w of watchers.values()) { clearTimeout(w.timer); w.w.close(); } for (const set of clients.values()) for (const c of set) c.end(); await new Promise<void>(r => server.close(() => r())); } };\n}\n", "/**\n * rig-format v2 \u2014 declarative rig document for slot animation.\n * Source of truth for both AI agents and the editor.\n *\n * Conventions (agents rely on these, keep them stable):\n * - Units: pixels in document space, origin top-left, Y down (PixiJS).\n * - Rotation: degrees, clockwise positive. Shear: degrees added to the x axis (shearX) / y axis (shearY).\n * - Bone transforms are LOCAL (relative to parent, subject to `inherit`). Root bones \u2014 relative to document.\n * - Time: seconds. Animation duration is explicit, keys may end earlier.\n * - Ids: snake_case, unique within their collection.\n *\n * v2 (Spine-class): attachments are first-class (region / mesh with weights / path), bones have shear and\n * inherit modes, slots have a colour, constraints (ik / transform / path) with their own tracks, deform tracks\n * carry vertex offsets, drawOrder tracks. v0/v1 documents are migrated on parse (slot pivot/offset \u2192 region attachment).\n */\nimport { z } from \"zod\";\nimport { DEFORM_PROP_RE, DEFORM_BOUNDS } from \"./rig-deform\";\n\n// ---------- primitives ----------\n\n/** the shape of every id in the format; exported so UIs can check a typed id before building a tool call */\nexport const ID_RE = /^[a-z][a-z0-9_]*$/;\nexport const Id = z.string().regex(ID_RE, \"snake_case id\");\n\nexport const Ease = z.union([\n z.enum([\"linear\", \"step\", \"ease_in\", \"ease_out\", \"ease_in_out\", \"minimum_jerk\", \"back_out\", \"elastic_out\"]),\n // cubic-bezier control points, same semantics as CSS\n z.object({ bezier: z.tuple([z.number(), z.number(), z.number(), z.number()]) }),\n]);\n\nexport const Transform = z.object({\n x: z.number().default(0),\n y: z.number().default(0),\n rotation: z.number().default(0),\n scaleX: z.number().default(1),\n scaleY: z.number().default(1),\n shearX: z.number().default(0),\n shearY: z.number().default(0),\n});\n\nexport const Color = z.string().regex(/^#[0-9a-fA-F]{8}$/, \"color must be #rrggbbaa\");\nexport const Blend = z.enum([\"normal\", \"add\", \"multiply\", \"screen\"]);\nexport const Inherit = z.enum([\"normal\", \"onlyTranslation\", \"noRotationOrReflection\", \"noScale\", \"noScaleOrReflection\"]);\n\n// ---------- assets ----------\n\nexport const Asset = z.object({\n id: Id,\n /** relative path inside the rig package, e.g. \"layers/arm_l.png\" */\n src: z.string(),\n /** original (untrimmed, unrotated) image size \u2014 the space attachments and uvs refer to */\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n /** packed region [x, y, w, h] inside `src` when `src` is an atlas (w/h as packed: trimmed, rotated) */\n frame: z.tuple([z.number(), z.number(), z.number(), z.number()]).optional(),\n /** the packed region is stored rotated 90\u00B0 clockwise */\n rotate: z.union([z.literal(0), z.literal(90)]).default(0),\n /** offset [x, y] of the packed (trimmed) region inside the original image */\n trim: z.tuple([z.number(), z.number()]).optional(),\n /** where this layer came from \u2014 provenance for agents */\n origin: z\n .object({\n sourceImage: z.string().optional(),\n bboxSpace: z.enum([\"source\", \"document\"]).optional(),\n /** bbox in source image: [x, y, w, h] */\n bbox: z.tuple([z.number(), z.number(), z.number(), z.number()]).optional(),\n inpainted: z.boolean().default(false),\n prompt: z.string().optional(),\n })\n .optional(),\n});\n\n// ---------- skeleton ----------\n\nexport const Bone = z.object({\n id: Id,\n parent: Id.optional(),\n /** visual length for the editor gizmo and for chains (ik/path), no effect on child transforms */\n length: z.number().nonnegative().default(0),\n transform: Transform.default({}),\n /** which parts of the parent's world transform this bone inherits */\n inherit: Inherit.default(\"normal\"),\n /** semantic hint: \"head\", \"arm_l\", \"torso\"\u2026 drives auto-rig & presets */\n role: z.string().optional(),\n /** editor colour, no runtime effect */\n color: z.string().optional(),\n});\n\nexport const Slot = z.object({\n id: Id,\n bone: Id,\n /** Closed path attachment used as a moving clipping mask. */\n clip: Id.optional(),\n /** active attachment id; undefined = hidden */\n attachment: Id.optional(),\n alpha: z.number().min(0).max(1).default(1),\n /** draw order, higher = on top */\n z: z.number().int().default(0),\n /** blend mode: `add` for glows/fire on black, `multiply` for shadows */\n blend: Blend.default(\"normal\"),\n /** tint, #rrggbbaa */\n color: Color.default(\"#ffffffff\"),\n});\n\n// ---------- attachments ----------\n\n/** one bone's influence on a vertex: position in that bone's local space and weight */\nexport const Influence = z.object({ bone: Id, x: z.number(), y: z.number(), w: z.number() });\nconst VertexData = {\n /** unweighted: [x, y, \u2026] in the slot bone's local space */\n vertices: z.array(z.number()).optional(),\n /** weighted: one influence list per vertex */\n weights: z.array(z.array(Influence).min(1)).optional(),\n};\n\nexport const RegionAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"region\"),\n asset: Id,\n /** placement of the image centre in the slot bone's local space */\n x: z.number().default(0), y: z.number().default(0), rotation: z.number().default(0),\n scaleX: z.number().default(1), scaleY: z.number().default(1),\n /** drawn size; default: the asset size */\n width: z.number().positive().optional(), height: z.number().positive().optional(),\n});\nexport const MeshAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"mesh\"),\n asset: Id,\n /** texture coordinates 0..1 in the asset's original image, 2 per vertex */\n uvs: z.array(z.number()),\n triangles: z.array(z.number().int().nonnegative()),\n ...VertexData,\n /** number of hull vertices (the outline is uvs[0..hull)) */\n hull: z.number().int().nonnegative().default(0),\n width: z.number().positive().optional(), height: z.number().positive().optional(),\n});\nexport const PathAttachment = z.object({\n id: Id, slot: Id, type: z.literal(\"path\"),\n ...VertexData,\n /** curve lengths for constant-speed positioning */\n lengths: z.array(z.number()).default([]),\n closed: z.boolean().default(false),\n constantSpeed: z.boolean().default(true),\n});\nexport const Attachment = z.discriminatedUnion(\"type\", [RegionAttachment, MeshAttachment, PathAttachment]);\n\n// ---------- constraints ----------\n\nexport const IkConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1), target: Id,\n iterations: z.number().int().min(1).max(1000).optional(),\n tolerance: z.number().positive().optional(),\n mix: z.number().default(1), softness: z.number().default(0),\n bendPositive: z.boolean().default(true), compress: z.boolean().default(false), stretch: z.boolean().default(false), uniform: z.boolean().default(false),\n});\nexport const TransformConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1), target: Id,\n local: z.boolean().default(false), relative: z.boolean().default(false),\n rotation: z.number().default(0), x: z.number().default(0), y: z.number().default(0),\n scaleX: z.number().default(0), scaleY: z.number().default(0), shearY: z.number().default(0),\n mixRotate: z.number().default(1), mixX: z.number().default(1), mixY: z.number().default(1),\n mixScaleX: z.number().default(1), mixScaleY: z.number().default(1), mixShearY: z.number().default(1),\n});\nexport const PathConstraint = z.object({\n id: Id, order: z.number().int().default(0),\n bones: z.array(Id).min(1),\n /** slot whose active attachment is a path */\n target: Id,\n positionMode: z.enum([\"fixed\", \"percent\"]).default(\"percent\"),\n spacingMode: z.enum([\"length\", \"fixed\", \"percent\", \"proportional\"]).default(\"length\"),\n rotateMode: z.enum([\"tangent\", \"chain\", \"chainScale\"]).default(\"tangent\"),\n rotation: z.number().default(0), position: z.number().default(0), spacing: z.number().default(0),\n mixRotate: z.number().default(1), mixX: z.number().default(1), mixY: z.number().default(1),\n});\n\n/**\n * The mix channels that switch each kind of constraint on \u2014 the solvers' own early-outs, in one place:\n * `applyIk` returns at `mix <= 0`, `applyTransformConstraint` and `applyPathConstraint` when every mix here is 0.\n * `rig_check` (`constraint_dead`), the editor's drag redirection and the constraint forms all read this list, so\n * an early-out that ever changes has a single definition to change with it. They are also the keyable mix tracks.\n */\nexport const MIX_PROPS = {\n ik: [\"mix\"],\n transform: [\"mixRotate\", \"mixX\", \"mixY\", \"mixScaleX\", \"mixScaleY\", \"mixShearY\"],\n path: [\"mixRotate\", \"mixX\", \"mixY\"],\n} as const;\n\n// ---------- animation ----------\n\nexport const BoneProp = z.enum([\"x\", \"y\", \"rotation\", \"scaleX\", \"scaleY\", \"shearX\", \"shearY\"]);\nexport const SlotProp = z.enum([\"alpha\", \"attachment\", \"z\", \"color\"]);\n/** lattice params (fractions of the image size), p<row><col>x|y pixel offsets of one control point, or `vertices` (mesh offsets) */\nexport const DeformProp = z.string().regex(/^(bulge|bend|sway|squash|p[0-2][0-2][xy]|vertices)$/, \"deform prop must be bulge|bend|sway|squash|p<row><col>x|y|vertices\");\nexport const IkProp = z.enum([\"mix\", \"softness\", \"bendPositive\", \"compress\", \"stretch\"]);\nexport const TransformProp = z.enum([\"mixRotate\", \"mixX\", \"mixY\", \"mixScaleX\", \"mixScaleY\", \"mixShearY\", \"x\", \"y\", \"rotation\", \"scaleX\", \"scaleY\", \"shearY\"]);\nexport const PathProp = z.enum([\"position\", \"spacing\", \"mixRotate\", \"mixX\", \"mixY\"]);\n\nexport const KeyValue = z.union([z.number(), z.string(), z.null(), z.array(z.number()), z.array(z.string())]);\nexport const Key = z.object({\n t: z.number().nonnegative(),\n v: KeyValue,\n /** easing INTO the next key */\n ease: Ease.default(\"ease_in_out\"),\n});\n\nconst Interpolation = { interpolation: z.enum([\"segment\", \"pchip\"]).optional() };\nexport const Track = z.discriminatedUnion(\"target\", [\n z.object({ target: z.literal(\"bone\"), id: Id, prop: BoneProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"slot\"), id: Id, prop: SlotProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"deform\"), id: Id, prop: DeformProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"ik\"), id: Id, prop: IkProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"transform\"), id: Id, prop: TransformProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"path\"), id: Id, prop: PathProp, ...Interpolation, keys: z.array(Key).min(1) }),\n z.object({ target: z.literal(\"drawOrder\"), id: Id.default(\"order\"), prop: z.literal(\"order\").default(\"order\"), ...Interpolation, keys: z.array(Key).min(1) }),\n]);\n\nexport const Event = z.object({\n t: z.number().nonnegative(),\n name: z.string(),\n payload: z.record(z.unknown()).optional(),\n});\n\nexport const Animation = z.object({\n id: Id,\n duration: z.number().positive(),\n loop: z.boolean().default(false),\n tracks: z.array(Track).default([]),\n events: z.array(Event).default([]),\n /** if generated from a preset \u2014 keep params so the agent can re-tune instead of re-keying */\n preset: z.object({ name: z.string(), params: z.record(z.unknown()) }).optional(),\n});\n\n// ---------- document ----------\n\n/** the editor's reference underlay: a PNG in the rig's directory drawn under the canvas \u2014 runtime, preview and export ignore it */\nexport const Reference = z.object({\n src: z.string(),\n opacity: z.number().min(0).max(1).default(0.5),\n x: z.number().default(0), y: z.number().default(0),\n scale: z.number().positive().default(1),\n});\n\nexport const RigSchema = z.object({\n format: z.literal(\"energy8.rig\"),\n version: z.literal(2),\n meta: z.object({\n name: z.string(),\n width: z.number().int().positive(),\n height: z.number().int().positive(),\n /** free-form notes for agents & humans: what this rig is, what's intentionally missing */\n notes: z.string().optional(),\n reference: Reference.optional(),\n }),\n assets: z.array(Asset),\n bones: z.array(Bone).min(1),\n slots: z.array(Slot),\n attachments: z.array(Attachment).default([]),\n ik: z.array(IkConstraint).default([]),\n transform: z.array(TransformConstraint).default([]),\n path: z.array(PathConstraint).default([]),\n animations: z.array(Animation),\n});\n\n/** schema that also accepts v0/v1 input (migrated on the fly) */\nexport const RigDocument = z.preprocess(input => {\n const v = (input as { version?: unknown } | null)?.version;\n return v === 0 || v === 1 ? migrateV1(input) : input;\n}, RigSchema);\n\nexport type RigDocument = z.infer<typeof RigSchema>;\nexport type Bone = z.infer<typeof Bone>;\nexport type Slot = z.infer<typeof Slot>;\nexport type Asset = z.infer<typeof Asset>;\nexport type Reference = z.infer<typeof Reference>;\nexport type Attachment = z.infer<typeof Attachment>;\nexport type RegionAttachment = z.infer<typeof RegionAttachment>;\nexport type MeshAttachment = z.infer<typeof MeshAttachment>;\nexport type PathAttachment = z.infer<typeof PathAttachment>;\nexport type Influence = z.infer<typeof Influence>;\nexport type IkConstraint = z.infer<typeof IkConstraint>;\nexport type TransformConstraint = z.infer<typeof TransformConstraint>;\nexport type PathConstraint = z.infer<typeof PathConstraint>;\nexport type Animation = z.infer<typeof Animation>;\nexport type Track = z.infer<typeof Track>;\nexport type Key = z.infer<typeof Key>;\n\n// ---------- v1 \u2192 v2 migration ----------\n\nconst DEG = Math.PI / 180;\n\n/**\n * v0/v1: slot placement lived on the slot (pivot fraction + bone-local offset) and `attachment` named an ASSET.\n * v2: every showable image is a region attachment with its own placement; deform tracks target attachments.\n */\nexport function migrateV1(input: unknown): unknown {\n const doc = input as Record<string, any>;\n const assets: any[] = doc.assets ?? [], slots: any[] = doc.slots ?? [], anims: any[] = doc.animations ?? [];\n const assetById = new Map(assets.map(a => [a.id, a]));\n // which assets each slot can show: rest attachment + every attachment key value\n const shows = new Map<string, Set<string>>();\n const add = (slot: string, asset: string) => (shows.get(slot) ?? shows.set(slot, new Set()).get(slot)!).add(asset);\n for (const s of slots) if (s.attachment) add(s.id, s.attachment);\n for (const a of anims) for (const t of a.tracks ?? [])\n if (t.target === \"slot\" && t.prop === \"attachment\") for (const k of t.keys ?? []) if (typeof k.v === \"string\") add(t.id, k.v);\n const usage = new Map<string, number>();\n for (const set of shows.values()) for (const asset of set) usage.set(asset, (usage.get(asset) ?? 0) + 1);\n const attachmentId = (slot: string, asset: string) => ((usage.get(asset) ?? 0) > 1 ? `${slot}_${asset}` : asset);\n\n const attachments: any[] = [];\n for (const s of slots) {\n const pivot = s.pivot ?? { x: 0.5, y: 0.5 }, o = { x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1, ...(s.offset ?? {}) };\n for (const asset of shows.get(s.id) ?? []) {\n const a = assetById.get(asset);\n if (!a) continue;\n // image centre relative to the pivot point, then through the slot offset transform\n const cx = (0.5 - pivot.x) * a.width, cy = (0.5 - pivot.y) * a.height;\n const r = o.rotation * DEG, cos = Math.cos(r), sin = Math.sin(r);\n const x = o.x + cos * o.scaleX * cx - sin * o.scaleY * cy, y = o.y + sin * o.scaleX * cx + cos * o.scaleY * cy;\n attachments.push({ id: attachmentId(s.id, asset), slot: s.id, type: \"region\", asset, x: round(x), y: round(y), rotation: o.rotation, scaleX: o.scaleX, scaleY: o.scaleY });\n }\n }\n const restAttachment = (slot: string) => {\n const s = slots.find(x => x.id === slot);\n const first = s?.attachment ?? [...(shows.get(slot) ?? [])][0];\n return first ? attachmentId(slot, first) : undefined;\n };\n const newSlots = slots.map(s => {\n const { pivot, offset, attachment, ...rest } = s;\n return { ...rest, ...(attachment ? { attachment: attachmentId(s.id, attachment) } : {}) };\n });\n const newAnims = anims.map(a => ({\n ...a,\n tracks: (a.tracks ?? []).flatMap((t: any) => {\n if (t.target === \"slot\" && t.prop === \"attachment\")\n return [{ ...t, keys: t.keys.map((k: any) => ({ ...k, v: typeof k.v === \"string\" ? attachmentId(t.id, k.v) : k.v })) }];\n if (t.target === \"deform\") { const id = restAttachment(t.id); return id ? [{ ...t, id }] : []; }\n return [t];\n }),\n }));\n return { ...doc, version: 2, slots: newSlots, attachments: [...(doc.attachments ?? []), ...attachments], animations: newAnims };\n}\nconst round = (v: number) => Math.round(v * 1e6) / 1e6 + 0;\n\n// ---------- semantic validation (beyond shape) ----------\n\nconst trackId = (t: Track) => `${t.target}.${t.id}.${t.prop}`;\n\nexport function validate(doc: RigDocument): string[] {\n const errs: string[] = [];\n const dup = (xs: { id: string }[], kind: string) => {\n const seen = new Set<string>();\n for (const x of xs) {\n if (seen.has(x.id)) errs.push(`${kind}: duplicate id \"${x.id}\"`);\n seen.add(x.id);\n }\n };\n dup(doc.assets, \"asset\"); dup(doc.bones, \"bone\"); dup(doc.slots, \"slot\"); dup(doc.attachments, \"attachment\");\n dup(doc.animations, \"animation\"); dup(doc.ik, \"ik\"); dup(doc.transform, \"transform\"); dup(doc.path, \"path\");\n\n const bones = new Set(doc.bones.map(b => b.id));\n const assets = new Map(doc.assets.map(a => [a.id, a]));\n const slots = new Set(doc.slots.map(s => s.id));\n const attachments = new Map(doc.attachments.map(a => [a.id, a]));\n const iks = new Set(doc.ik.map(c => c.id)), transforms = new Set(doc.transform.map(c => c.id)), paths = new Set(doc.path.map(c => c.id));\n\n for (const b of doc.bones) {\n if (b.parent && !bones.has(b.parent)) errs.push(`bone \"${b.id}\": unknown parent \"${b.parent}\"`);\n }\n for (const b of doc.bones) {\n const seen = new Set<string>(); let cur: Bone | undefined = b;\n while (cur?.parent) {\n if (seen.has(cur.id)) { errs.push(`bone \"${b.id}\": parent cycle`); break; }\n seen.add(cur.id); cur = doc.bones.find(x => x.id === cur!.parent);\n }\n }\n if (!doc.bones.some(b => !b.parent)) errs.push(\"no root bone\");\n\n for (const a of doc.assets) {\n if (a.frame && (a.frame[2] <= 0 || a.frame[3] <= 0)) errs.push(`asset \"${a.id}\": frame must have positive size`);\n if (a.frame && !a.trim && !a.rotate && (a.frame[2] !== a.width || a.frame[3] !== a.height)) errs.push(`asset \"${a.id}\": frame size must equal width\u00D7height (or declare trim/rotate)`);\n }\n for (const s of doc.slots) {\n if (s.clip) {\n const mask = attachments.get(s.clip);\n if (mask?.type !== \"path\" || !mask.closed) errs.push(`slot \"${s.id}\": clip must name a closed path attachment`);\n }\n if (!bones.has(s.bone)) errs.push(`slot \"${s.id}\": unknown bone \"${s.bone}\"`);\n if (s.attachment) {\n const a = attachments.get(s.attachment);\n if (!a) errs.push(`slot \"${s.id}\": unknown attachment \"${s.attachment}\"`);\n else if (a.slot !== s.id) errs.push(`slot \"${s.id}\": attachment \"${s.attachment}\" belongs to slot \"${a.slot}\"`);\n }\n }\n const vertexCount = (a: Attachment): number => {\n if (a.type === \"region\") return 4;\n if (a.type === \"mesh\") return a.uvs.length / 2;\n return a.vertices ? a.vertices.length / 2 : a.weights?.length ?? 0;\n };\n for (const a of doc.attachments) {\n if (!slots.has(a.slot)) errs.push(`attachment \"${a.id}\": unknown slot \"${a.slot}\"`);\n if (a.type !== \"path\" && !assets.has(a.asset)) errs.push(`attachment \"${a.id}\": unknown asset \"${a.asset}\"`);\n if (a.type === \"mesh\" || a.type === \"path\") {\n const n = a.type === \"mesh\" ? a.uvs.length / 2 : vertexCount(a);\n if (a.type === \"mesh\") {\n if (a.uvs.length % 2 || n < 3) errs.push(`attachment \"${a.id}\": uvs must have 2 numbers per vertex, at least 3 vertices`);\n if (a.triangles.length % 3) errs.push(`attachment \"${a.id}\": triangles must have 3 indices each`);\n for (const i of a.triangles) if (i >= n) errs.push(`attachment \"${a.id}\": triangle index ${i} out of range (${n} vertices)`);\n }\n if ((a.vertices ? 1 : 0) + (a.weights ? 1 : 0) !== 1) errs.push(`attachment \"${a.id}\": exactly one of vertices / weights`);\n if (a.vertices && a.vertices.length !== 2 * n) errs.push(`attachment \"${a.id}\": vertices must have 2 numbers per vertex (${2 * n}, got ${a.vertices.length})`);\n if (a.weights) {\n if (a.weights.length !== n) errs.push(`attachment \"${a.id}\": weights must have one influence list per vertex (${n}, got ${a.weights.length})`);\n for (const list of a.weights) for (const inf of list) if (!bones.has(inf.bone)) errs.push(`attachment \"${a.id}\": weights reference unknown bone \"${inf.bone}\"`);\n }\n }\n }\n for (const c of doc.ik) {\n for (let i = 1; i < c.bones.length; i++) if (doc.bones.find(b => b.id === c.bones[i])?.parent !== c.bones[i - 1])\n errs.push(`ik \"${c.id}\": bones must form a contiguous parent-to-child chain`);\n\n for (const b of c.bones) if (!bones.has(b)) errs.push(`ik \"${c.id}\": unknown bone \"${b}\"`);\n if (!bones.has(c.target)) errs.push(`ik \"${c.id}\": unknown target bone \"${c.target}\"`);\n }\n for (const c of doc.transform) {\n for (const b of c.bones) if (!bones.has(b)) errs.push(`transform \"${c.id}\": unknown bone \"${b}\"`);\n if (!bones.has(c.target)) errs.push(`transform \"${c.id}\": unknown target bone \"${c.target}\"`);\n }\n for (const c of doc.path) {\n for (const b of c.bones) if (!bones.has(b)) errs.push(`path \"${c.id}\": unknown bone \"${b}\"`);\n if (!slots.has(c.target)) errs.push(`path \"${c.id}\": unknown target slot \"${c.target}\"`);\n }\n\n for (const a of doc.animations) {\n const tracks = new Set<string>();\n for (const t of a.tracks) {\n const tid = trackId(t);\n if (tracks.has(tid)) errs.push(`animation \"${a.id}\": duplicate track ${tid}`);\n tracks.add(tid);\n const known = t.target === \"bone\" ? bones.has(t.id) : t.target === \"slot\" ? slots.has(t.id) : t.target === \"deform\" ? attachments.has(t.id)\n : t.target === \"ik\" ? iks.has(t.id) : t.target === \"transform\" ? transforms.has(t.id) : t.target === \"path\" ? paths.has(t.id) : true;\n if (!known) errs.push(`animation \"${a.id}\": unknown ${t.target} \"${t.id}\"`);\n const bound = t.target === \"deform\" ? (DEFORM_BOUNDS as Record<string, number | undefined>)[t.prop] : undefined;\n const att = t.target === \"deform\" ? attachments.get(t.id) : undefined;\n let prev = -1;\n for (const k of t.keys) {\n if (k.t <= prev && prev >= 0) errs.push(`animation \"${a.id}\" ${tid}: keys not strictly increasing`);\n if (k.t > a.duration) errs.push(`animation \"${a.id}\" ${tid}: key at ${k.t}s exceeds duration`);\n if (t.target === \"slot\" && t.prop === \"attachment\") {\n if (k.v !== null && typeof k.v !== \"string\") errs.push(`animation \"${a.id}\" ${tid}: attachment key must be an attachment id or null`);\n else if (typeof k.v === \"string\") {\n const target = attachments.get(k.v);\n if (!target) errs.push(`animation \"${a.id}\": unknown attachment \"${k.v}\"`);\n else if (target.slot !== t.id) errs.push(`animation \"${a.id}\" ${tid}: attachment \"${k.v}\" belongs to slot \"${target.slot}\"`);\n }\n } else if (t.target === \"slot\" && t.prop === \"color\") {\n const ok = Array.isArray(k.v) && k.v.length === 4 && k.v.every(c => typeof c === \"number\" && c >= 0 && c <= 1);\n if (!ok) errs.push(`animation \"${a.id}\" ${tid}: color key must be [r, g, b, a] in 0..1`);\n } else if (t.target === \"drawOrder\") {\n const order = Array.isArray(k.v) ? (k.v as unknown[]) : [];\n const ok = order.length === doc.slots.length && new Set(order).size === order.length && order.every(s => typeof s === \"string\" && slots.has(s));\n if (!ok) errs.push(`animation \"${a.id}\" drawOrder key at ${k.t}s must list every slot exactly once`);\n } else if (t.target === \"deform\" && t.prop === \"vertices\") {\n if (!Array.isArray(k.v) || !k.v.every(v => typeof v === \"number\")) errs.push(`animation \"${a.id}\" ${tid}: vertices key must be a number array`);\n else if (att && att.type !== \"region\") {\n const expected = att.weights ? 2 * att.weights.reduce((s, list) => s + list.length, 0) : 2 * vertexCount(att);\n if (k.v.length !== expected) errs.push(`animation \"${a.id}\" ${tid}: vertices key needs ${expected} numbers, got ${k.v.length}`);\n } else if (att) errs.push(`animation \"${a.id}\" ${tid}: vertices deform needs a mesh or path attachment`);\n } else if (typeof k.v !== \"number\") errs.push(`animation \"${a.id}\" ${tid}: key must be a number`);\n else if (bound !== undefined && Math.abs(k.v) > bound) errs.push(`animation \"${a.id}\" ${tid}: value ${k.v} out of range [-${bound}, ${bound}]`);\n prev = k.t;\n }\n }\n for (const e of a.events) {\n if (e.t > a.duration) errs.push(`animation \"${a.id}\": event \"${e.name}\" exceeds duration`);\n }\n }\n return errs;\n}\n\nexport function parse(input: unknown): RigDocument {\n const doc = RigDocument.parse(input);\n const errs = validate(doc);\n if (errs.length) throw new Error(\"rig validation failed:\\n\" + errs.join(\"\\n\"));\n return doc;\n}\n", "/**\n * rig-deform \u2014 3\u00D73 control-grid deformer for a slot's attachment (pure math, no PixiJS).\n *\n * Control points live on an interpolating biquadratic (Lagrange) patch over the image:\n * rows r=0..2 at v=0,0.5,1 of the height (top\u2192bottom), cols c=0..2 at u=0,0.5,1 of the width.\n * Each control point carries an offset (dx, dy) in image pixels. With zero offsets the patch is the\n * identity, and moving control point (r,c) by d moves the surface at that point by exactly d.\n *\n * Named params are dimensionless fractions of the image size (see spec \u00A71); raw `p<r><c>x|y` are pixels.\n * All contributions add.\n */\n\nexport const DEFORM_NAMED = [\"bulge\", \"bend\", \"sway\", \"squash\"] as const;\nexport const DEFORM_PROP_RE = /^(bulge|bend|sway|squash|p[0-2][0-2][xy])$/;\n/** |value| bound per named param. bulge/squash reach a degenerate (zero-area) patch at 1, hence 0.9. */\nexport const DEFORM_BOUNDS: Record<(typeof DEFORM_NAMED)[number], number> = { bulge: 0.9, bend: 1, sway: 1, squash: 0.9 };\n\nexport interface Pivot { x: number; y: number }\n\nconst T = [0, 0.5, 1];\nconst basis = (t: number) => [(1 - t) * (1 - 2 * t), 4 * t * (1 - t), t * (2 * t - 1)];\nconst dbasis = (t: number) => [4 * t - 3, 4 - 8 * t, 4 * t - 1];\n\n/** Named params + raw offsets \u2192 18 numbers [dx00, dy00, dx01, dy01, \u2026] row-major by (r*3+c). */\nexport function controlOffsets(params: Record<string, number>, w: number, h: number, pivot: Pivot, out: Float64Array = new Float64Array(18)): Float64Array {\n out.fill(0);\n const bulge = params.bulge ?? 0, bend = params.bend ?? 0, sway = params.sway ?? 0, squash = params.squash ?? 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const i = (r * 3 + c) * 2, u = T[c], v = T[r], mid = r === 1 ? 1 : 0;\n // `+ 0` folds IEEE -0 (zero params \u00D7 negative factors) into +0 so pinned points compare equal to 0\n out[i] = mid * (bulge * w * (u - 0.5) + bend * w) + sway * w * (v - pivot.y) + squash * w * (u - pivot.x) * 0.5 + 0;\n out[i + 1] = -squash * h * (v - pivot.y) + 0;\n }\n for (const k in params) {\n if (k.length !== 4 || k[0] !== \"p\") continue;\n const r = +k[1], c = +k[2];\n if (!(r >= 0 && r < 3 && c >= 0 && c < 3) || (k[3] !== \"x\" && k[3] !== \"y\")) continue;\n out[(r * 3 + c) * 2 + (k[3] === \"y\" ? 1 : 0)] += params[k];\n }\n return out;\n}\n\n/** Patch offset at normalized image coords (u, v) \u2208 [0,1]\u00B2. */\nexport function evalPatch(offsets: ArrayLike<number>, u: number, v: number): [number, number] {\n const bu = basis(u), bv = basis(v);\n let x = 0, y = 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const wgt = bv[r] * bu[c], i = (r * 3 + c) * 2;\n x += wgt * offsets[i]; y += wgt * offsets[i + 1];\n }\n return [x, y];\n}\n\n/** n\u00D7n render vertices (row-major, x fastest \u2014 PlaneGeometry order), pivot baked in, image-local pixels. */\nexport function gridPositions(offsets: ArrayLike<number>, w: number, h: number, pivot: Pivot, n: number, out: Float32Array = new Float32Array(2 * n * n)): Float32Array {\n const px = pivot.x * w, py = pivot.y * h;\n for (let j = 0; j < n; j++) for (let i = 0; i < n; i++) {\n const u = i / (n - 1), v = j / (n - 1), [ox, oy] = evalPatch(offsets, u, v), k = (j * n + i) * 2;\n out[k] = u * w - px + ox;\n out[k + 1] = v * h - py + oy;\n }\n return out;\n}\n\n/** Minimum Jacobian determinant of (u,v)\u2192image map over a sample grid, normalized so identity = 1. \u2264 0 means a fold. */\nexport function minJacobian(offsets: ArrayLike<number>, w: number, h: number, samples = 17): number {\n let min = Infinity;\n for (let j = 0; j < samples; j++) for (let i = 0; i < samples; i++) {\n const u = i / (samples - 1), v = j / (samples - 1);\n const bu = basis(u), bv = basis(v), du = dbasis(u), dv = dbasis(v);\n let xu = 0, xv = 0, yu = 0, yv = 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) {\n const k = (r * 3 + c) * 2, dx = offsets[k], dy = offsets[k + 1];\n xu += bv[r] * du[c] * dx; xv += dv[r] * bu[c] * dx;\n yu += bv[r] * du[c] * dy; yv += dv[r] * bu[c] * dy;\n }\n const det = ((w + xu) * (h + yv) - xv * yu) / (w * h);\n if (det < min) min = det;\n }\n return min;\n}\n", "/**\n * rig-api \u2014 the tool registry. MCP (stdio), the CLI and the editor's HTTP server all register these same tools,\n * so a human in the editor and an agent over MCP perform identical operations with identical history.\n *\n * Each tool reads `rig.json`, applies, writes back. Stateless per call: agents can crash/retry freely; the file\n * is the state. Every mutation first snapshots the previous file into `.rig-history/` (rig_undo / rig_diff) and\n * answers with what changed; structural tools also return the compact rig summary.\n */\nimport { z } from \"zod\";\nimport { readFile, writeFile, stat } from \"node:fs/promises\";\nimport { dirname, join, relative, isAbsolute } from \"node:path\";\nimport { saveJson } from \"./rig-io\";\nimport { withRigQueue } from \"./rig-queue\";\nimport { RigDocument, validate, parse, Ease, type Track } from \"./rig-format\";\nimport * as T from \"./rig-tools\";\nimport { importLayers, pngSize } from \"./rig-import-layers\";\nimport { applyPreset, presets } from \"./rig-presets\";\nimport { exportVideo } from \"./preview/export-video\";\nimport { renderPreview, closePreview } from \"./preview/render-preview\";\nimport { checkRig, summarize } from \"./rig-check\";\nimport { pushHistory, listHistory, diffDocs, undo, redo } from \"./rig-history\";\nimport { buildAtlas } from \"./rig-atlas\";\nimport { importSpineProject } from \"./spine-import\";\nimport { extractTemplate, applyTemplate, describeTemplate } from \"./rig-templates\";\nimport { saveTemplate, loadLibrary } from \"./rig-template-library\";\nimport { traceHulls, meshFromIslands, autoWeights, defaultWeightBones, round6 } from \"./rig-mesh\";\nimport { alphaMaskFromPng } from \"./rig-mesh-image\";\nimport { evaluate } from \"./rig-anim\";\nimport { GateConfig, runGates } from \"./rig-gates\";\nimport { sha256, verifyRenderManifest, type RenderManifest } from \"./rig-qa\";\nimport { fileURLToPath } from \"node:url\";\nimport { orderConstraints } from \"./rig-constraints\";\nimport { gradientWeights, smoothWeights, pinWeights, attachToBone, bakeSecondary } from \"./rig-motion\";\n\nexport interface ToolResult { text: string; image?: Buffer; doc?: RigDocument; isError?: boolean }\n/** `input` is the BUILT schema, not the raw shape: see `tool` below for why every caller has to share this one object */\nexport interface ToolDef { name: string; description: string; input: z.AnyZodObject; run(args: Record<string, unknown>): Promise<ToolResult> }\nexport const tools: ToolDef[] = [];\n/**\n * `.strict()`, built once here and handed to every caller (callTool, and the MCP server's registerTool), because\n * zod's default is to STRIP unknown keys: a misspelled optional argument \u2014 `bone` for `bones`, `time` for `t` \u2014\n * used to reach the handler as if it had never been passed, and the tool answered \"ok\" for a document the agent\n * did not ask for. Most of this registry's arguments are optional, so that silence covered nearly all of them.\n */\nfunction tool<S extends z.ZodRawShape>(name: string, description: string, input: S, run: (args: z.infer<z.ZodObject<S>>) => Promise<ToolResult>) {\n const handler = run as ToolDef[\"run\"];\n tools.push({ name, description, input: z.object(input).strict(), run: args =>\n typeof args.path === \"string\" ? withRigQueue(args.path, () => handler(args)) : handler(args) });\n}\nexport async function callTool(name: string, args: unknown): Promise<ToolResult> {\n const t = tools.find(t => t.name === name);\n if (!t) return { text: `ERROR: unknown tool \"${name}\"`, isError: true };\n const parsed = t.input.safeParse(args);\n if (!parsed.success) return { text: `ERROR: invalid arguments: ${parsed.error.issues.map(i => `${i.path.join(\".\") || \"(root)\"}: ${i.message}`).join(\"; \")}`, isError: true };\n // Handlers already catch their own errors into ToolResult, but callTool is now also invoked from an HTTP\n // handler (editor/server.ts) with no other try/catch above it \u2014 an uncaught throw here would otherwise\n // crash the request instead of returning a JSON error. (Not separately unit-tested: every tool's own\n // try/catch makes a handler that reaches this catch hard to construct without stubbing one out.)\n try { return await t.run(parsed.data); } catch (e) { return fail(e); }\n}\nexport const closeTools = () => closePreview();\n\nconst text = (s: string, doc?: RigDocument): ToolResult => ({ text: s, doc });\nconst fail = (e: unknown): ToolResult => ({ text: `ERROR: ${e instanceof Error ? e.message : String(e)}`, isError: true });\n\nconst Path = z.string().describe(\"path to rig.json; assets are resolved relative to its directory\");\nconst Library = z.string().optional().describe(\"template library JSON; default presets.json next to rig.json\");\n\nasync function load(path: string) { return RigDocument.parse(JSON.parse(await readFile(path, \"utf8\"))); }\n/** every writer of a file someone else reads goes through this \u2014 see rig-io.ts for why it is not `writeFile` */\nconst save = (path: string, doc: RigDocument) => saveJson(path, doc);\nconst exists = (p: string) => stat(p).then(() => true, () => false);\n/** absolute path, or relative to the rig's directory */\nconst resolveFrom = (rigPath: string, p: string) => (isAbsolute(p) ? p : join(dirname(rigPath), p));\n/** how a file is referenced from rig.json (asset.src) */\nconst srcFor = (rigPath: string, file: string) => relative(dirname(rigPath), file).split(\"\\\\\").join(\"/\");\nconst libraryFor = (rigPath: string, lib?: string) => (lib ? resolveFrom(rigPath, lib) : join(dirname(rigPath), \"presets.json\"));\nasync function pngInfo(rigPath: string, file: string) {\n const abs = resolveFrom(rigPath, file);\n const [width, height] = pngSize(await readFile(abs));\n return { abs, width, height, src: srcFor(rigPath, abs) };\n}\n\n/** load \u2192 snapshot \u2192 op \u2192 save \u2192 what changed (+ summary for structural edits). Refuses to save an invalid doc. */\nasync function mutate(path: string, op: (d: RigDocument) => RigDocument | Promise<RigDocument>, summary = false): Promise<ToolResult> {\n try {\n const raw = await readFile(path, \"utf8\");\n const prev = RigDocument.parse(JSON.parse(raw));\n const next = parse(await op(prev));\n await pushHistory(path, raw);\n await save(path, next);\n const changes = diffDocs(prev, next);\n const head = summary ? T.describe(next) : `${next.meta.name} ${next.meta.width}x${next.meta.height}`;\n return text(`${head}\\nchanged:${changes.length ? \"\\n \" + changes.join(\"\\n \") : \" nothing\"}`, next);\n } catch (e) { return fail(e); }\n}\nasync function create(path: string, doc: RigDocument): Promise<ToolResult> {\n if (await exists(path)) await pushHistory(path, await readFile(path, \"utf8\"));\n const saved = parse(doc);\n await save(path, saved);\n return text(T.describe(saved), saved);\n}\n/** preview companion: findings of the previewed animation (plus any error), or a positive one-liner */\nfunction previewCheck(doc: RigDocument, animation?: string): string {\n const all = checkRig(doc, { animation });\n const scoped = animation ? all.filter(f => f.animation === animation || f.level === \"error\") : all;\n if (scoped.length) return summarize(scoped);\n const a = animation ? doc.animations.find(x => x.id === animation) : undefined;\n return a ? `check: OK for \"${a.id}\" (${a.tracks.length} tracks, ${a.duration}s${a.loop ? \" loop\" : \"\"})` : \"check: OK (rest pose)\";\n}\n\nconst TrackRef = { interpolation: z.enum([\"segment\", \"pchip\"]).optional().describe(\"pchip: smooth through numeric keys, preserving extrema; segment: per-key easing\"), target: z.enum([\"bone\", \"slot\", \"deform\", \"ik\", \"transform\", \"path\", \"drawOrder\"]), id: z.string(), prop: z.string() };\nconst KeyIn = z.object({ t: z.number().describe(\"seconds\"), v: z.union([z.number(), z.string(), z.null(), z.array(z.number()), z.array(z.string())]),\n ease: Ease.optional().describe(\"into the next key: linear|step|ease_in|ease_out|ease_in_out|back_out|elastic_out|{bezier:[x1,y1,x2,y2]}; default ease_in_out; minimum_jerk for a rest-to-rest segment\") });\n/** number-array key values (deform vertices) are rounded so rig.json stays compact \u2014 same 6 decimals rig-mesh writes */\nconst roundKey = <K extends z.infer<typeof KeyIn>>(k: K): K =>\n Array.isArray(k.v) && k.v.every(x => typeof x === \"number\") ? { ...k, v: (k.v as number[]).map(round6) } : k;\nconst KEY_DOC =\n \"Keys are {t, v, ease?}. Bone values are ABSOLUTE local-transform values, not offsets (rest x=4 \u2192 key v=0 moves it 4px); \" +\n \"deform values are relative (0 = rest). bone: x|y|rotation|scaleX|scaleY|shearX|shearY; slot: alpha|attachment(asset id or null)|z; \" +\n \"deform (3\u00D73 mesh on the slot's image): bulge|bend|sway|squash (fractions of the image size, |v|\u22640.9/1) or p<row><col>x|y (px, rows/cols 0..2 top-left first). \" +\n \"Some values are arrays: deform `vertices` keys are number arrays (2\u00B7n offsets, or 2\u00B7\u03A3influences for weighted meshes); drawOrder keys are slot-id arrays; slot color keys are [r,g,b,a].\";\n\n// ---------- document ----------\n\ntool(\"rig_create\", \"Create a new empty rig document with a root bone at bottom-center.\",\n { path: Path, name: z.string(), width: z.number().int(), height: z.number().int(), notes: z.string().optional().describe(\"style anchor + what is intentionally missing; reused by rig_layer_prompt\") },\n async ({ path, name, width, height, notes }) => {\n try { return await create(path, T.createDoc(name, width, height, notes)); } catch (e) { return fail(e); }\n });\n\ntool(\"rig_create_symbol\",\n \"Create a rig from ONE image (a slot symbol): canvas = image + margin, root at the image's bottom centre, slot pivot (0.5, 1). \" +\n \"Then apply symbol_idle / symbol_win / anticipation_shake / dim presets.\",\n { path: Path, image: z.string().describe(\"PNG path, absolute or relative to rig.json dir\"), name: z.string().optional(), margin: z.number().default(0.15).describe(\"fraction of the image size on every side, room for bounces\"), notes: z.string().optional() },\n async ({ path, image, name, margin, notes }) => {\n try {\n const { width, height, src } = await pngInfo(path, image);\n return await create(path, T.createSymbol(name ?? src.replace(/^.*\\//, \"\").replace(/\\.png$/i, \"\"), { src, width, height }, margin, notes));\n } catch (e) { return fail(e); }\n });\n\nconst ReferenceIn = z.object({\n src: z.string().describe(\"PNG next to rig.json (relative path)\"),\n opacity: z.number().min(0).max(1).optional(), x: z.number().optional(), y: z.number().optional(), scale: z.number().positive().optional(),\n}).strict();\n\ntool(\"rig_set_meta\",\n \"Patch the document's meta: name, canvas width/height (moves nothing \u2014 only the bounds change), notes, and the editor's reference underlay \" +\n \"`reference {src, opacity, x, y, scale}` \u2014 a PNG next to rig.json drawn under the canvas to fit parts against; runtime, preview and export ignore it; null removes it.\",\n { path: Path, name: z.string().optional(), width: z.number().int().positive().optional(), height: z.number().int().positive().optional(),\n notes: z.string().optional(), reference: ReferenceIn.nullable().optional() },\n async ({ path, ...patch }) => mutate(path, d => T.setMeta(d, patch)));\n\ntool(\"rig_get\", \"Read a rig. Compact summary by default; verbose=true adds slot pivot/offset and every track with key counts and value ranges (no asset prompts); full=true returns the JSON.\",\n { path: Path, verbose: z.boolean().default(false), full: z.boolean().default(false) },\n async ({ path, verbose, full }) => { try { const d = await load(path); return text(full ? JSON.stringify(d, null, 2) : T.describe(d, { verbose })); } catch (e) { return fail(e); } });\n\ntool(\"rig_get_attachment\",\n \"ONE attachment, in full: the exact `vertices` / `weights` / `uvs` / `triangles` arrays it stores. This is what the raw forms of rig_set_path_attachment and rig_set_mesh want \u2014 they edit a shape in place instead of rebuilding it, and to edit `weights` you have to start from the `weights` that are there. \" +\n \"The FIRST LINE is a summary (kind, slot, vertex/anchor counts, skinning, the length a deform `vertices` key must have); everything after the first newline is the attachment object as JSON, ready to hand straight back. \" +\n \"rig_get full=true returns the same arrays inside the whole document, which is 3.3 MB on a Spine import against a few KB here.\",\n { path: Path, id: z.string().describe(\"attachment id (rig_get lists them per slot with verbose=true)\") },\n async ({ path, id }) => {\n try {\n const d = await load(path);\n const att = d.attachments.find(a => a.id === id);\n if (!att) throw new Error(`unknown attachment \"${id}\" (the document has ${d.attachments.length}: ${d.attachments.slice(0, 12).map(a => a.id).join(\", \")}${d.attachments.length > 12 ? \", \u2026\" : \"\"})`);\n return text(`${T.describeAttachment(d, att)}\\n${JSON.stringify(att, null, 2)}`);\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_get_pose\",\n \"Where every bone actually IS at one moment: world x, y, angle (degrees) and axis lengths, with the bone's own local x, y and rotation, plus each slot's shown attachment and world bounding box. \" +\n \"Constraints are applied, so this is what the runtime draws, not what the document stores. Without `animation` it reports the rest pose, and `t` is then an error rather than a number that does nothing. \" +\n \"A `t` past the animation's duration is clamped to the end, and the summary line says so. \" +\n \"`bones` and `slots` narrow the report \u2014 pass them on a large rig, where the whole report runs to tens of KB. \" +\n \"Use it to check an edit landed where you meant instead of reading it off a preview image.\",\n { path: Path, animation: z.string().optional(), t: z.number().min(0).optional(),\n bones: z.array(z.string()).optional(), slots: z.array(z.string()).optional() },\n async ({ path, ...opts }) => {\n try {\n const d = await load(path);\n const r = T.poseReport(d, opts);\n const past = r.duration !== undefined && r.t > r.duration ? ` \u2014 past its ${r.duration}s end, clamped to the end` : \"\";\n return text(`${r.bones.length} bones, ${r.slots.length} slots at t=${r.t}${r.animation ? ` in \"${r.animation}\"` : \" (rest)\"}${past}\\n${JSON.stringify(r)}`);\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_validate\", \"Schema and reference validation (empty = OK). Motion problems (seams, folds, misplaced patches) are rig_check's job.\",\n { path: Path },\n async ({ path }) => { try { const errs = validate(await load(path)); return text(errs.length ? errs.join(\"\\n\") : \"OK (schema and references; run rig_check for motion problems)\"); } catch (e) { return fail(e); } });\n\ntool(\"rig_check\",\n \"Cheap self-critique without rendering: out_of_canvas (slot leaves the canvas, worst time), static_track, loop_seam, \" +\n \"deform_flip (lattice folds over itself \u2014 an error), mesh_fold (a skinned/deformed mesh folds over itself: error when \u2265 5 % of the mesh folds, warning below \u2014 \" +\n \"a dense mesh bent hard at a joint pinches the odd hairline triangle), weights_sum (skinned mesh vertex weights not summing to 1), \" +\n \"patch_offset (a slot sits away from its asset's source bbox), rest_overlap, unused_asset, never_visible, \" +\n \"and for constraints: constraint_dead (every mix is 0 at rest and no track lifts one \u2014 the solver skips it), \" +\n \"constraint_cycle (the target is a bone the constraint drives, or hangs off one: it reads what it writes \u2014 an error), \" +\n \"ik_unreachable (the target sits beyond the chain's reach for over 20 % of an animation, so the limb hangs straight), \" +\n \"path_missing (a path constraint whose target slot never shows a path attachment \u2014 an error). \" +\n \"Motion diagnostics also cover pass_key_stop, velocity_jump, acceleration_jump, loop_velocity and constraint_order; \" +\n \"provide secondaryBones, frontOf slot pairs and named attachment UV landmarks for brief-specific frozen-motion, ordering and swap-registration checks. \" +\n \"Findings are sorted by severity. Run it before spending vision tokens on a preview.\",\n { path: Path, animation: z.string().optional().describe(\"limit to one animation (rest pose is always checked)\"), fps: z.number().positive().optional(), deformFps: z.number().positive().optional(), secondaryBones: z.array(z.string()).optional(), frontOf: z.array(z.tuple([z.string(), z.string()])).optional(), landmarks: z.record(z.record(z.tuple([z.number(), z.number()]))).optional(), landmarkTolerance: z.number().nonnegative().optional() },\n async ({ path, ...opts }) => { try { return text(summarize(checkRig(await load(path), opts), 100)); } catch (e) { return fail(e); } });\n\ntool(\"rig_import_spine\",\n \"Import a Spine project (skeleton .json 3.8/4.x + .atlas + page image) as a new rig: bones, slots, region/mesh/path attachments with weights, \" +\n \"IK / transform / path constraints and every animation (deform, draw order, colors), converted to this document's y-down space. \" +\n \"The atlas may be plain or base64 text; a KTX2 page is transcoded to PNG next to rig.json. Then use rig_get / rig_render_preview / rig_check as with any rig.\",\n { path: Path, json: z.string().describe(\"Spine skeleton .json, absolute or relative to rig.json dir\"),\n atlas: z.string().optional().describe(\"atlas file; default: <json>.atlas or <json>.atlas.txt\"),\n image: z.string().optional().describe(\"atlas page image (.png or .ktx2); default: the page named in the atlas, next to it\"),\n name: z.string().optional().describe(\"default: the json file name\"), margin: z.number().optional().describe(\"canvas margin around the skeleton bounds, px\"), notes: z.string().optional() },\n async ({ path, json, atlas, image, name, margin, notes }) => {\n try {\n const r = await importSpineProject({ json: resolveFrom(path, json), atlas: atlas && resolveFrom(path, atlas), image: image && resolveFrom(path, image), rigPath: path, name, margin, notes });\n const res = await create(path, parse(r.doc));\n if (r.warnings.length) res.text += `\\nwarnings:\\n ${r.warnings.join(\"\\n \")}`;\n return res;\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_import_layers\",\n \"Import PNG layers from a directory as assets + slots + bones. Uses layers.json sidecar if present \" +\n \"(id, role, parent, z, bbox, joint, swap, bone, slot), else filename convention `03_arm_l.png` \u2192 z=3, id=arm_l, role from known names. \" +\n \"Bone hierarchy is inferred from roles (head\u2192neck\u2192torso\u2192hips\u2192root, arms\u2192torso, legs\u2192hips). \" +\n \"`swap: true` = patch (closed eyes, mouth) as a hidden slot on the parent's bone; several swap layers with the same `slot` share one slot; `bone` = attach to an existing bone without creating one.\",\n { path: Path, layersDir: z.string().describe(\"absolute dir, or relative to rig.json dir\"), relPrefix: z.string().default(\"layers\").describe(\"how asset.src refers to the dir, relative to rig.json\") },\n async ({ path, layersDir, relPrefix }) => mutate(path, d => importLayers(d, resolveFrom(path, layersDir), relPrefix), true));\n\ntool(\"rig_replace_asset\",\n \"Swap one layer's PNG (e.g. a regenerated part) without rebuilding the rig. Pivots are fractions, so the slot keeps working; the image should keep the same silhouette registration.\",\n { path: Path, id: z.string(), file: z.string().describe(\"new PNG, absolute or relative to rig.json dir\"), prompt: z.string().optional().describe(\"provenance: how it was generated\") },\n async ({ path, id, file, prompt }) => mutate(path, async d => { const { width, height, src } = await pngInfo(path, file); return T.replaceAsset(d, id, { src, width, height, prompt, inpainted: true }); }));\n\ntool(\"rig_layer_prompt\",\n \"Build a parts-first image-generation prompt for one layer from its provenance (asset.origin), the rig's style notes and its bone context. Generate the image with your image tool, then rig_replace_asset.\",\n { path: Path, method: z.enum([\"part\", \"repair\"]).default(\"part\"), removed: z.array(z.string()).optional(), id: z.string() },\n async ({ path, id, method, removed }) => { try { return text(T.layerPrompt(await load(path), id, { method, removed })); } catch (e) { return fail(e); } });\n\nconst Frame = z.tuple([z.number().int(), z.number().int(), z.number().int(), z.number().int()]).describe(\"[x, y, w, h] rectangle in the source image's pixels\");\nconst OriginIn = z.object({ bboxSpace: z.enum([\"source\", \"document\"]).optional(), sourceImage: z.string().optional(), bbox: Frame.optional(), inpainted: z.boolean().default(false), prompt: z.string().optional() }).strict();\n\ntool(\"rig_set_asset\",\n \"Create or patch an asset. `src` = a PNG relative to rig.json (needed to create); `frame` = one rectangle of that PNG (a part split off a sheet \u2014 the runtime, \" +\n \"preview, export and editor all cut it at draw time, no crop file); without `frame` the asset is the whole image. Re-framing an asset that regions show keeps \" +\n \"the source pixel under each image centre where it is drawn; a mesh keeps its uvs and is named so you can re-trace it. Place it with rig_place_asset.\",\n { path: Path, id: z.string(), src: z.string().optional(), frame: Frame.nullable().optional().describe(\"null = the whole image again\"),\n width: z.number().int().positive().optional(), height: z.number().int().positive().optional(), origin: OriginIn.optional() },\n async ({ path, id, src, ...patch }) => mutateWith(path, async (d, say) => {\n const cur = d.assets.find(a => a.id === id);\n const file = src ?? cur?.src;\n if (!file) throw new Error(`asset \"${id}\" does not exist \u2014 creating one needs src`);\n const info = await pngInfo(path, file).catch((e: NodeJS.ErrnoException) => { throw new Error(`asset \"${id}\": cannot read ${file} (${e.code ?? e.message})`); });\n const r = T.setAsset(d, id, { ...patch, ...(src ? { src: info.src } : {}) }, { width: info.width, height: info.height });\n for (const n of r.notes) say(n);\n return r.doc;\n }));\n\ntool(\"rig_remove_asset\", \"Remove an asset nothing shows any more (refused, with the list, while an attachment still uses it).\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutate(path, d => T.removeAsset(d, id)));\n\ntool(\"rig_place_asset\",\n \"Put an asset on a bone in ONE call: a slot (`slot` or the asset's id; created on `bone` when missing, an existing slot keeps its bone), a region attachment \" +\n \"named like the asset with its centre at the DOCUMENT point (x, y), and the slot showing it. z = max + 1 unless given. Then rotate/scale with rig_set_attachment.\",\n { path: Path, asset: z.string(), bone: z.string(), x: z.number(), y: z.number(), slot: z.string().optional(), z: z.number().int().optional() },\n async ({ path, ...p }) => mutate(path, d => T.placeAsset(d, p), true));\n\n// ---------- history ----------\n\ntool(\"rig_undo\", \"Restore the rig as it was `steps` mutations ago (every mutation snapshots the previous file into .rig-history/ next to rig.json).\",\n { path: Path, steps: z.number().int().min(1).default(1) },\n async ({ path, steps }) => {\n try {\n const doc = parse(JSON.parse(await undo(path, steps)));\n await save(path, doc);\n return text(`restored ${steps} step${steps === 1 ? \"\" : \"s\"} back\\n` + T.describe(doc), doc);\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_redo\", \"Re-apply the mutation undone by the last rig_undo (any new mutation clears the redo stack).\", { path: Path },\n async ({ path }) => { try { const doc = parse(JSON.parse(await redo(path))); await save(path, doc); return text(\"redone\\n\" + T.describe(doc), doc); } catch (e) { return fail(e); } });\n\ntool(\"rig_diff\", \"Structural difference between the current rig and the snapshot `steps` mutations ago: bones/slots/assets added, removed, changed; tracks with key counts and value ranges; preset params.\",\n { path: Path, steps: z.number().int().min(1).default(1) },\n async ({ path, steps }) => {\n try {\n const history = await listHistory(path);\n if (!history.length) return text(\"no history for this rig\");\n if (steps > history.length) return text(`only ${history.length} snapshot${history.length === 1 ? \"\" : \"s\"} available`);\n const old = RigDocument.parse(JSON.parse(await readFile(history[history.length - steps], \"utf8\")));\n const lines = diffDocs(old, await load(path));\n return text(lines.length ? lines.join(\"\\n\") : \"no differences\");\n } catch (e) { return fail(e); }\n });\n\n// ---------- skeleton ----------\n\nconst TransformPatch = z.object({ x: z.number(), y: z.number(), rotation: z.number(), scaleX: z.number(), scaleY: z.number(), shearX: z.number(), shearY: z.number() }).partial();\nconst BoneFields = { parent: z.string().optional(), role: z.string().optional(), length: z.number().optional().describe(\"px to the far joint; editor rotation handle, weight_shift leg length\"),\n inherit: z.enum([\"normal\", \"onlyTranslation\", \"noRotationOrReflection\", \"noScale\", \"noScaleOrReflection\"]).optional(), color: z.string().optional().describe(\"editor colour\"), transform: TransformPatch.optional() };\n\ntool(\"rig_add_bone\", \"Add a bone. transform is LOCAL to parent (px, degrees CW). Omit parent \u2192 root. `bind` moves those slots onto the new bone without moving their images (the editor's B tool with a part selected).\",\n { path: Path, id: z.string(), ...BoneFields, bind: z.array(z.string()).optional().describe(\"slot ids to re-bind onto the new bone, world placement kept\") },\n async ({ path, bind, ...bone }) => mutateWith(path, (d, say) => {\n let next = T.addBone(d, bone);\n for (const s of bind ?? []) {\n const r = T.rebindSlot(next, s, bone.id);\n next = r.doc;\n if (r.approx > 0.01) say(`slot \"${s}\" re-bound to \"${bone.id}\" approximately: a region corner moved ${r.approx} px (shear or non-uniform scale between the bones)`);\n }\n return next;\n }, true));\n\ntool(\"rig_update_bone\", \"Patch bone fields (parent, role, length, inherit, color, transform \u2014 partial, merged). parent=null detaches the bone into a root of its own.\",\n { path: Path, id: z.string(), ...BoneFields, parent: z.string().nullable().optional().describe(\"new parent bone; null = make it a root bone (a rig may have several)\") },\n async ({ path, id, ...patch }) => mutate(path, d => T.updateBone(d, id, patch)));\n\ntool(\"rig_remove_bone\", \"Remove a bone; children and slots re-parent to its parent.\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutateWith(path, (d, say) => {\n const parent = d.bones.find(b => b.id === id)?.parent;\n const slots = d.slots.filter(s => s.bone === id).map(s => s.id);\n const r = T.removeBone(d, id);\n if (r.approx > 0.01) say(`bone \"${id}\" removed; slot \"${slots.join(\", \")}\" re-bound to \"${parent}\" approximately: a region corner moved ${r.approx} px (shear or non-uniform scale between the bones)`);\n return r.doc;\n }, true));\n\ntool(\"rig_set_slot\", \"Create or patch a slot (a draw layer on a bone). attachment = id of one of its attachments, null hides it (swap slots). blend=add for glow/fire layers painted on black; color is #rrggbbaa tint. \" +\n \"clip names a closed path attachment used as a moving mask; null removes it. Changing `bone` on an existing slot KEEPS its images where they are on the document (placements are re-expressed in the new bone's rest frame; weighted meshes need nothing).\",\n { path: Path, id: z.string(), bone: z.string().optional(), clip: z.string().nullable().optional(), attachment: z.string().nullable().optional(), z: z.number().int().optional(), alpha: z.number().optional(),\n blend: z.enum([\"normal\", \"add\", \"multiply\", \"screen\"]).optional(), color: z.string().optional() },\n async ({ path, attachment, bone, clip, ...slot }) => mutateWith(path, (d, say) => {\n let next = d;\n const cur = d.slots.find(s => s.id === slot.id);\n if (cur && bone !== undefined && bone !== cur.bone) {\n const r = T.rebindSlot(d, slot.id, bone);\n next = r.doc;\n if (r.approx > 0.01) say(`slot \"${slot.id}\" re-bound to \"${bone}\" approximately: a region corner moved ${r.approx} px (shear or non-uniform scale between the bones)`);\n }\n return T.setSlot(next, { ...slot, ...(clip === undefined ? {} : { clip: clip ?? undefined }), ...(bone !== undefined ? { bone } : {}), ...(attachment === undefined ? {} : { attachment: attachment ?? undefined }) });\n }));\n\ntool(\"rig_set_attachment\",\n \"Create or patch a REGION attachment: an image (asset) placed in a slot. x/y = the image CENTRE in the slot bone's space, rotation in degrees, scale; fields are merged. \" +\n \"A slot can hold several attachments (swap states); set slot.attachment to show one. Meshes come from rig_mesh_from_image (trace this region's image) or rig_import_spine.\",\n { path: Path, id: z.string(), slot: z.string().optional(), asset: z.string().optional(), x: z.number().optional(), y: z.number().optional(), rotation: z.number().optional(),\n scaleX: z.number().optional(), scaleY: z.number().optional(), width: z.number().optional(), height: z.number().optional() },\n async ({ path, ...att }) => mutate(path, d => T.setAttachment(d, att)));\n\n// ---------- meshes ----------\n\nconst Influence = z.object({ bone: z.string(), x: z.number(), y: z.number(), w: z.number() }).describe(\"one influence: the vertex in that bone's local space and its weight\");\nconst WeightsIn = z.array(z.array(Influence).min(1)).describe(\"one influence list per vertex, in uv order; weights of a list should sum to 1\");\n/** run `op` through `mutate` and prefix the result with the lines it collected */\nasync function mutateWith(path: string, op: (d: RigDocument, say: (line: string) => void) => RigDocument | Promise<RigDocument>, summary = false): Promise<ToolResult> {\n const lines: string[] = [];\n const res = await mutate(path, d => op(d, l => lines.push(l)), summary);\n return res.isError || !lines.length ? res : { ...res, text: `${lines.join(\"\\n\")}\\n${res.text}` };\n}\nconst meshOf = (doc: RigDocument, id: string) => {\n const att = doc.attachments.find(a => a.id === id);\n if (!att) throw new Error(`unknown attachment \"${id}\"`);\n if (att.type !== \"mesh\") throw new Error(`attachment \"${id}\" is a ${att.type}, not a mesh${att.type === \"region\" ? \" (run rig_mesh_from_image on it first)\" : \"\"}`);\n return att;\n};\n\ntool(\"rig_mesh_from_image\",\n \"Turn a REGION attachment into a mesh traced from its PNG's alpha: the outline (pixels with alpha \u2265 threshold, simplified by tolerance px, pushed out by margin px) \" +\n \"plus an interior grid every `spacing` px, Delaunay-triangulated. EVERY separate opaque island of the layer is meshed (a closed-eyes overlay is two strokes) \u2014 \" +\n \"islands below minIslandRatio (default 5% of the largest), and holes, are skipped; the answer says `islands: N` when there is more than one, and such a mesh reports hull 0. \" +\n \"The mesh keeps the region's id, slot, asset and placement, so nothing moves; \" +\n \"lattice deform tracks (bulge/bend/sway/squash/p<rc>) on it are dropped (they only apply to regions). Next: rig_auto_weights, then key deform `vertices`.\",\n { path: Path, id: z.string().describe(\"attachment id (a region)\"),\n spacing: z.number().min(1).default(24).describe(\"interior vertex spacing in image px; smaller = denser mesh\"),\n tolerance: z.number().nonnegative().default(2).describe(\"outline simplification in px; 0 keeps every pixel step\"),\n margin: z.number().default(1).describe(\"px the outline is pushed outward, so the traced edge keeps the soft pixels\"),\n minIslandRatio: z.number().min(0).max(1).default(0.05).describe(\"minimum island area relative to largest; 0 preserves small intentional fragments\"), threshold: z.number().int().min(1).max(255).default(8).describe(\"alpha value counted as opaque\") },\n async ({ path, id, ...opts }) => mutateWith(path, async (d, say) => {\n const att = d.attachments.find(a => a.id === id);\n if (!att) throw new Error(`unknown attachment \"${id}\"`);\n if (att.type !== \"region\") throw new Error(`attachment \"${id}\" is already a ${att.type}, not a region (use rig_set_mesh to edit its geometry)`);\n const asset = d.assets.find(a => a.id === att.asset);\n if (!asset) throw new Error(`unknown asset \"${att.asset}\"`);\n if (asset.rotate || asset.trim) throw new Error(`asset \"${asset.id}\" is packed into an exported atlas (rotate/trim): run rig_mesh_from_image on the unpacked rig, not an atlas export`);\n const png = await readFile(resolveFrom(path, asset.src))\n .catch((e: NodeJS.ErrnoException) => { throw new Error(`asset \"${asset.id}\": cannot read ${asset.src} (${e.code ?? e.message})`); });\n const { spacing, ...trace } = opts;\n const mask = alphaMaskFromPng(png, asset.frame);\n // traced here rather than inside meshFromMask so the answer can say how many separate islands the layer has:\n // a closed-eyes overlay is two strokes, and an agent should see that it got both\n const islands = traceHulls(mask, trace);\n const mesh = meshFromIslands(islands, att, asset, mask, spacing);\n const { doc, droppedTracks } = T.convertToMesh(d, mesh);\n say(`${id}=mesh(${mesh.uvs.length / 2}v, ${mesh.triangles.length / 3}t, hull ${mesh.hull}${islands.length > 1 ? `, islands: ${islands.length}` : \"\"})`);\n if (droppedTracks.length) say(`dropped lattice deform tracks: ${droppedTracks.join(\", \")}`);\n return doc;\n }));\n\ntool(\"rig_auto_weights\",\n \"Skin a mesh to bones by distance: each vertex takes the `maxInfluences` (default 2) nearest candidate bones, inverse-distance weighted and normalized to 1. \" +\n \"Nothing is dropped for being far away, so a vertex far from every joint still blends its two nearest bones instead of snapping to one at weight 1. \" +\n \"`radius` scales the falloff \u2014 weight `1 / (distance/radius + 1)\u00B2` \u2014 in world px, default 1: a larger radius spreads influence across more bones, a smaller one binds each vertex more tightly to its nearest bone. There is no cutoff at any radius. \" +\n \"Default `bones`, from the REST pose: the slot's bone, its parent and its direct children. \" +\n \"Replaces the mesh's `vertices` with `weights`, so deform `vertices` keys on it are dropped (their length changes). Check the result with rig_render_preview.\",\n { path: Path, id: z.string().describe(\"mesh attachment id\"), bones: z.array(z.string()).min(1).optional().describe(\"candidate bones; default: the slot's bone + its parent + its children\"),\n radius: z.number().positive().optional().describe(\"falloff scale in world px, default 1; larger spreads influence across more bones, smaller binds tighter to the nearest one; no cutoff\"),\n maxInfluences: z.number().int().min(1).default(2).describe(\"bones per vertex\") },\n async ({ path, id, bones, radius, maxInfluences }) => mutateWith(path, (d, say) => {\n const att = meshOf(d, id);\n const skel = evaluate(d, new Map());\n const candidates = bones ?? defaultWeightBones(d, att.slot);\n const r = radius ?? 1;\n const weights = autoWeights(d, skel, att, { bones: candidates, radius: r, maxInfluences }).weights!;\n const counts = new Map<string, number>();\n for (const list of weights) for (const b of new Set(list.map(i => i.bone))) counts.set(b, (counts.get(b) ?? 0) + 1);\n const { doc, dropped } = T.setWeights(d, id, weights);\n say(`${id}: ${weights.length} vertices skinned (max ${maxInfluences} influences)`);\n for (const b of candidates) if (counts.get(b)) say(` ${b}: ${counts.get(b)} vertices`);\n if (dropped.length) say(`dropped deform tracks: ${dropped.join(\", \")}`);\n return doc;\n }));\n\ntool(\"rig_set_mesh\",\n \"Replace a mesh's geometry arrays (only the given ones): `uvs` (2 per vertex, 0..1 in the asset image), `triangles` (3 indices each), `hull` (leading vertices that form the outline), \" +\n \"and its rest shape as either `vertices` (2 per vertex, slot-bone local) or `weights` (skinned) \u2014 giving one drops the other. \" +\n \"Deform `vertices` keys whose length no longer fits are dropped. For tracing a mesh from the image use rig_mesh_from_image.\",\n { path: Path, id: z.string().describe(\"mesh attachment id\"), vertices: z.array(z.number()).optional(), weights: WeightsIn.optional(),\n uvs: z.array(z.number()).optional(), triangles: z.array(z.number().int().nonnegative()).optional(), hull: z.number().int().nonnegative().optional() },\n async ({ path, id, ...patch }) => mutateWith(path, (d, say) => {\n const { doc, dropped } = T.setMesh(d, meshOf(d, id).id, patch);\n if (dropped.length) say(`dropped deform tracks: ${dropped.join(\", \")}`);\n return doc;\n }));\n\ntool(\"rig_set_weights\",\n \"Replace a mesh's skinning by hand: one influence list per vertex (uv order), each {bone, x, y, w} holding the vertex in that bone's local space; a list's weights should sum to 1. \" +\n \"Drops the mesh's unweighted `vertices` and any deform `vertices` keys whose length no longer fits. rig_auto_weights computes these from bone distance.\",\n { path: Path, id: z.string().describe(\"mesh attachment id\"), weights: WeightsIn },\n async ({ path, id, weights }) => mutateWith(path, (d, say) => {\n const { doc, dropped } = T.setWeights(d, meshOf(d, id).id, weights);\n if (dropped.length) say(`dropped deform tracks: ${dropped.join(\", \")}`);\n return doc;\n }));\n\ntool(\"rig_remove_attachment\", \"Remove an attachment; slots showing it become hidden, keys naming it become null.\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutate(path, d => T.removeAttachment(d, id)));\n\ntool(\"rig_remove_slot\", \"Remove a slot and its tracks.\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutate(path, d => T.removeSlot(d, id), true));\n\ntool(\"rig_set_draw_order\", \"Setup draw order in one call: `order` lists EVERY slot back-to-front (the same order a drawOrder key uses); each slot gets z = its index. For an animated reorder key the drawOrder track with rig_set_keys instead.\",\n { path: Path, order: z.array(z.string()).min(1) },\n async ({ path, order }) => mutate(path, d => T.setDrawOrder(d, order)));\n\n/** does `v` (a preset's `params`, or anything nested in it) name `id` as a whole string value, at any depth? */\nfunction namesId(v: unknown, id: string): boolean {\n if (typeof v === \"string\") return v === id;\n if (Array.isArray(v)) return v.some(x => namesId(x, id));\n if (v && typeof v === \"object\") return Object.values(v).some(x => namesId(x, id));\n return false;\n}\n\ntool(\"rig_rename\",\n \"Rename a bone, slot, attachment, asset or constraint and rewrite EVERY reference to it (parents, slot bones, chains and targets, mesh/path influences, slot attachments, key values, drawOrder keys, tracks). \" +\n \"Roles stay. Templates in presets.json are a separate file and are not rewritten \u2014 re-save them if they name the old id. \" +\n \"An animation's own preset.params (rig_apply_preset) is left alone too \u2014 the reply names any that still refer to the old id, since a blind substitution across differently-shaped params would be unsafe.\",\n { path: Path, kind: z.enum([\"bone\", \"slot\", \"attachment\", \"asset\", \"constraint\"]), id: z.string(), to: z.string() },\n async ({ path, kind, id, to }) => mutateWith(path, async (d, say) => {\n if (await exists(libraryFor(path))) say(`note: ${libraryFor(path)} is not rewritten \u2014 templates that name \"${id}\" by id still do`);\n const next = T.rename(d, kind, id, to);\n for (const a of next.animations) {\n if (a.preset && namesId(a.preset.params, id)) say(`note: animation \"${a.id}\" was made by preset \"${a.preset.name}\" whose params still name \"${id}\" \u2014 re-apply the preset with the new id if you re-tune it`);\n }\n return next;\n }, true));\n\n// ---------- constraints ----------\n\nconst ConstraintBones = z.array(z.string()).min(1).optional().describe(\"bones the constraint drives (replaces the whole list); required when it is created\");\nconst ConstraintOrder = z.number().int().optional().describe(\"solver order, lowest first (default 0); equal orders keep document order\");\nconst PathMixes = { mixRotate: z.number().optional(), mixX: z.number().optional(), mixY: z.number().optional() };\nconst Mixes = { ...PathMixes, mixScaleX: z.number().optional(), mixScaleY: z.number().optional(), mixShearY: z.number().optional() };\nconst CONSTRAINT_DOC =\n \"Constraints are solved after the bone tree, in `order`, and OVERWRITE the bones they drive: keying such a bone directly does nothing visible \u2014 key the target bone (or this constraint's mix, an ordinary number track) instead. \" +\n \"Ids are shared by the three kinds and a constraint's kind is fixed once created; rig_remove_constraint drops it together with its tracks.\";\n\ntool(\"rig_set_ik\",\n \"Create or patch an IK constraint: bend a chain of bones so its tip reaches a TARGET BONE \u2014 move the target, the limb follows. \" +\n \"`bones` is the chain parent\u2192child (1\u20132 bones: analytic solve; 3+: iterative CCD), `target` is a BONE, normally a marker parented to the root so the limb reaches a place in the world. \" +\n \"`bendPositive` picks which way a two-bone chain buckles (knee forward or backward), `softness` eases the last px before full extension, `compress`/`stretch` let the chain shorten/lengthen to reach, \" +\n \"`mix` 0..1 fades the whole constraint. Fields are merged, so {id, mix} patches only the mix. \" +\n \"To rig a limb from scratch call rig_add_ik_chain instead: it creates the target bone at the current tip and derives `bendPositive` from the pose. \" + CONSTRAINT_DOC,\n { path: Path, id: z.string(), bones: ConstraintBones, target: z.string().optional().describe(\"BONE the chain reaches for\"),\n mix: z.number().optional(), softness: z.number().optional(), bendPositive: z.boolean().optional(),\n iterations: z.number().int().min(1).max(1000).optional(), tolerance: z.number().positive().optional(), compress: z.boolean().optional(), stretch: z.boolean().optional(), uniform: z.boolean().optional(), order: ConstraintOrder },\n async ({ path, id, ...patch }) => mutate(path, d => T.setConstraint(d, \"ik\", id, patch)));\n\ntool(\"rig_set_transform\",\n \"Create or patch a transform constraint: copy a TARGET BONE's transform onto the driven bones, channel by channel (mixRotate/mixX/mixY/mixScaleX/mixScaleY/mixShearY, 0..1, each keyable), \" +\n \"with constant offsets (rotation/x/y/scaleX/scaleY/shearY) added on top. `local` copies in the bones' local space instead of world; `relative` ADDS the target's transform to the bone's own instead of replacing it. \" +\n \"Use it to make parts follow one control: a cape following the torso, a mirrored limb, a bone that inherits half the rotation. Fields are merged; `bones` and `target` (a BONE) are required when it is created. \" + CONSTRAINT_DOC,\n { path: Path, id: z.string(), bones: ConstraintBones, target: z.string().optional().describe(\"BONE whose transform is copied\"),\n local: z.boolean().optional(), relative: z.boolean().optional(),\n rotation: z.number().optional(), x: z.number().optional(), y: z.number().optional(), scaleX: z.number().optional(), scaleY: z.number().optional(), shearY: z.number().optional(),\n ...Mixes, order: ConstraintOrder },\n async ({ path, id, ...patch }) => mutate(path, d => T.setConstraint(d, \"transform\", id, patch)));\n\ntool(\"rig_set_path\",\n \"Create or patch a path constraint: place and orient bones along the curve of a path attachment (a tail following a spline, a chain crawling along a road). \" +\n \"`target` is a SLOT whose visible attachment is a path \u2014 build the curve with rig_set_path_attachment, then show it with rig_set_slot {attachment}. \" +\n \"positionMode fixed|percent (position in px along the curve, or 0..1 of its length), spacingMode length|fixed|percent|proportional (how the bones are spread along it), rotateMode tangent|chain|chainScale. \" +\n \"`position` and `spacing` slide the bones along the curve and are the usual things to key. Fields are merged; `bones` and `target` are required when it is created. \" + CONSTRAINT_DOC,\n { path: Path, id: z.string(), bones: ConstraintBones, target: z.string().optional().describe(\"SLOT showing a path attachment\"),\n positionMode: z.enum([\"fixed\", \"percent\"]).optional(), spacingMode: z.enum([\"length\", \"fixed\", \"percent\", \"proportional\"]).optional(),\n rotateMode: z.enum([\"tangent\", \"chain\", \"chainScale\"]).optional(),\n rotation: z.number().optional(), position: z.number().optional(), spacing: z.number().optional(), ...PathMixes, order: ConstraintOrder },\n async ({ path, id, ...patch }) => mutate(path, d => T.setConstraint(d, \"path\", id, patch)));\n\ntool(\"rig_remove_constraint\",\n \"Remove a constraint of any kind (ik / transform / path) by id, together with its animation tracks; the bones it drove fall back to their keyed or rest transforms.\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutate(path, d => T.removeConstraint(d, id)));\n\ntool(\"rig_add_ik_chain\",\n \"Rig a limb in ONE call \u2014 the easy path to IK. Give the chain's LAST bone (shin, forearm): the chain is [parent, bone] when that parent has exactly this one child, otherwise just the bone. \" +\n \"The tool creates a target bone (role ik_target) at the chain's current tip AS A CHILD OF THE ROOT BONE \u2014 never inside the chain, where the IK would drag its own target \u2014 \" +\n \"and an IK constraint `<bone>_ik` whose `bendPositive` is derived from the CURRENT pose, so adding it does not move the rig. It is solved last (highest order). \" +\n \"When the two-bone chain would reach up to the root itself, it falls back to the single bone (which just aims at the target) and says so. \" +\n \"Afterwards pose the limb by moving or keying the TARGET bone (or fade the constraint with its mix), not the chain's rotations.\",\n { path: Path, bone: z.string().describe(\"the chain's tip bone, e.g. shin or forearm; it needs a parent\"),\n bones: z.array(z.string()).min(1).optional().describe(\"explicit parent-to-tip chain for long IK\"), target: z.string().optional().describe(\"id for the new target bone; default <bone>_ik\"),\n mix: z.number().default(1), softness: z.number().default(0) },\n async ({ path, bone, target, mix, softness, bones }) => mutateWith(path, (d, say) => {\n const r = T.addIkChain(d, bone, { target, mix, softness, bones });\n say(`ik \"${bone}_ik\": chain ${r.chain.join(\",\")}${r.note ? ` (${r.note})` : \"\"} \u2192 new target bone \"${r.target}\" (bend ${r.bendPositive ? \"+\" : \"-\"}); move or key \"${r.target}\" to pose the limb`);\n return r.doc;\n }, true));\n\ntool(\"rig_set_path_attachment\",\n \"Create or replace a PATH attachment. Two forms, exactly one per call (both need at least 2 anchors, 3 when closed): \" +\n \"`points` \u2014 anchors in DOCUMENT coordinates \u2014 rebuilds the curve with fresh Catmull-Rom tangents, so it DESTROYS a skinned path's weights and any authored tangents; the form for drawing a path from scratch. \" +\n \"`vertices` / `weights` \u2014 raw control points [cPrev, p, cNext] per anchor, in the slot bone's space (or skinned: `weights` gives one influence list per control point, {bone,x,y,w} like rig_set_weights) \u2014 \" +\n \"the ONLY form that preserves weights and authored tangents; use it to edit an existing path, and rig_path_anchor to add or remove an anchor without a full replace. \" +\n \"Show it with rig_set_slot {id: <slot>, attachment: <id>}, then drive bones along it with rig_set_path. `closed` keeps its current value when omitted on an existing path (false on creation). \" +\n \"Deform `vertices` keys whose length no longer fits the new geometry are dropped \u2014 and a `points` rebuild that happens to keep the same count keeps them too, now deforming a DIFFERENT curve, which is the other reason to edit through the raw form. \" +\n \"`lengths` are always re-measured, so an imported path's stored values move by up to ~0.5 % even when the shape is byte-identical; that is nothing to act on, because every path here has `constantSpeed: true` (all of ross's do, and no tool can turn it off) and the runtime then measures the posed curve itself and never reads them.\",\n { path: Path, id: z.string().describe(\"path attachment id\"), slot: z.string(),\n points: z.array(z.tuple([z.number(), z.number()])).min(2).optional().describe(\"[[x, y], \u2026] anchors in document space\"),\n vertices: z.array(z.number()).optional(), weights: WeightsIn.optional(),\n closed: z.boolean().optional() },\n async ({ path, id, slot, points, vertices, weights, closed }) => mutateWith(path, (d, say) => {\n const { doc: next, dropped } = T.setPathAttachment(d, id, slot, { points, vertices, weights, closed });\n const anchors = points ? points.length : (vertices ? vertices.length / 6 : weights!.length / 3);\n const att = next.attachments.find(a => a.id === id);\n say(`${id}: path through ${anchors} anchors${att?.type === \"path\" && att.closed ? \", closed\" : \"\"} in slot \"${slot}\"${dropped.length ? `; dropped ${dropped.join(\", \")}` : \"\"}`);\n return next;\n }));\n\ntool(\"rig_path_anchor\",\n \"Insert or remove one anchor of a path attachment. `insert` splits the curve AFTER anchor `index` at `t` (strictly between 0 and 1, default 0.5) using de Casteljau, so the curve keeps its exact shape in EVERY pose, not just at rest, and a weighted path keeps its skinning (each new control point is the c*w-weighted blend of the split segment's influences, which is an identity in the bone matrices). \" +\n \"It also keeps the attachment's DEFORM tracks: the same coefficients blend the four source control points' offsets, so the ANIMATED curve is unchanged too \u2014 an insert loses nothing. \" +\n \"`remove` drops the anchor's three control points, which does change the shape, and with it any deform key whose length no longer fits (reported in the reply).\",\n { path: Path, id: z.string().describe(\"path attachment id\"), op: z.enum([\"insert\", \"remove\"]),\n index: z.number().int().nonnegative().describe(\"anchor index, 0-based (anchors are the vertices at 1, 4, 7, \u2026)\"),\n t: z.number().gt(0).lt(1).optional().describe(\"insert only: where in the segment, strictly between 0 and 1 (an endpoint is the anchor that is already there), default 0.5\") },\n async ({ path, id, op, index, t }) => mutateWith(path, (d, say) => {\n const { doc, dropped } = T.pathAnchorOp(d, id, op, index, t);\n if (dropped.length) say(`dropped deform tracks: ${dropped.join(\", \")}`);\n return doc;\n }));\n\n// ---------- animation ----------\n\nconst presetHelp = Object.values(presets).map(p => `${p.name}: ${JSON.stringify(p.defaults)}`).join(\"\\n\");\n\ntool(\"rig_apply_preset\",\n \"Generate an animation from a parametric preset (replaces the animation with the same id). Built-in presets bind to bones by `role`; \" +\n \"template presets (rig_save_as_preset) come from the library and match bones by role, then id. Re-tune by re-applying with different params.\\n\" +\n \"Character: idle_breathing (bulges the torso image, neck/waist pinned), weight_shift (feet stay planted), win_bounce, anticipation_shake, blink, mouth_talk. \" +\n \"Symbol: symbol_idle, symbol_win, dim (state pose, use as base).\\n\" + presetHelp,\n { path: Path, preset: z.string().describe(\"built-in name or a template name from the library\"), params: z.record(z.unknown()).default({}).describe(\"partial override of defaults\"),\n id: z.string().optional().describe(\"animation id for templates (default: template name)\"), library: Library },\n async ({ path, preset, params, id, library }) => mutate(path, async d => {\n if (preset in presets) return applyPreset(d, preset as keyof typeof presets, params);\n const tpl = (await loadLibrary(libraryFor(path, library))).find(t => t.name === preset);\n if (!tpl) throw new Error(`unknown preset \"${preset}\" (built-in: ${Object.keys(presets).join(\", \")}; library: ${libraryFor(path, library)})`);\n return applyTemplate(d, tpl, params as Record<string, number>, id);\n }, true));\n\ntool(\"rig_save_as_preset\",\n \"Turn a finished animation into a reusable template: tracks stored relative to rest and keyed by bone role, params amplitude (all relative values), \" +\n \"speed (time) and optional named groups of source tracks (`{\\\"turn\\\": [\\\"bone.root.rotation\\\"]}`) that become their own multipliers. Apply on any rig with rig_apply_preset.\",\n { path: Path, animation: z.string(), name: z.string().describe(\"snake_case template name\"), groups: z.record(z.array(z.string())).optional(), library: Library },\n async ({ path, animation, name, groups, library }) => {\n try {\n const tpl = extractTemplate(await load(path), animation, name, groups);\n const lib = libraryFor(path, library);\n await saveTemplate(lib, tpl);\n return text(`saved to ${lib}\\n${describeTemplate(tpl)}`);\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_list_presets\", \"Built-in presets with their defaults, and the templates in the library with their params.\",\n { path: Path, library: Library },\n async ({ path, library }) => {\n try {\n const lib = libraryFor(path, library), tpls = await loadLibrary(lib);\n return text(`built-in:\\n${presetHelp}\\ntemplates (${lib}):\\n${tpls.length ? tpls.map(describeTemplate).join(\"\\n\") : \" none\"}`);\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_get_preset\", \"One preset as JSON: {builtin: true, name, defaults} for a built-in, or the library template (tracks, params). For editors that preview parameter changes locally.\",\n { path: Path, preset: z.string(), library: Library },\n async ({ path, preset, library }) => {\n try {\n if (preset in presets) { const p = presets[preset as keyof typeof presets]; return text(JSON.stringify({ builtin: true, name: p.name, defaults: p.defaults })); }\n const tpl = (await loadLibrary(libraryFor(path, library))).find(t => t.name === preset);\n if (!tpl) throw new Error(`unknown preset \"${preset}\"`);\n return text(JSON.stringify(tpl));\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_set_keys\",\n \"Set the keys of ONE track (creates the animation if missing; manual keys drop the animation's preset link). \" +\n \"Replaces all keys unless merge=true, which replaces only keys at the given times and keeps the rest. \" +\n \"duration/loop are optional and persist once set. \" + KEY_DOC,\n { path: Path, animation: z.string(), ...TrackRef, keys: z.array(KeyIn), merge: z.boolean().default(false), duration: z.number().optional(), loop: z.boolean().optional() },\n async ({ path, animation, target, id, prop, interpolation, keys, merge, duration, loop }) => mutate(path, d => {\n let n = T.setKeys(d, animation, { target, id, prop, interpolation } as Omit<Track, \"keys\">, keys.map(roundKey), duration, { merge });\n if (loop !== undefined) n = { ...n, animations: n.animations.map(a => (a.id === animation ? { ...a, loop } : a)) };\n return n;\n }));\n\ntool(\"rig_set_tracks\",\n \"Set several tracks of one animation in a single call (same semantics as rig_set_keys for each). \" + KEY_DOC,\n { path: Path, animation: z.string(), tracks: z.array(z.object({ ...TrackRef, keys: z.array(KeyIn) })).min(1), merge: z.boolean().default(false), duration: z.number().optional(), loop: z.boolean().optional() },\n async ({ path, animation, tracks, merge, duration, loop }) => mutate(path, d => {\n let n = d;\n for (const t of tracks) n = T.setKeys(n, animation, { target: t.target, id: t.id, prop: t.prop, interpolation: t.interpolation } as Omit<Track, \"keys\">, t.keys.map(roundKey), duration, { merge });\n if (loop !== undefined) n = { ...n, animations: n.animations.map(a => (a.id === animation ? { ...a, loop } : a)) };\n return n;\n }));\n\ntool(\"rig_set_goal\",\n \"Put a bone at a point in DOCUMENT coordinates \u2014 the same coordinates rig_get_pose reports and rig_render_preview draws. \" +\n \"Without `animation` it moves the setup pose; with one it keys x and y at `t`, creating the animation if it does not exist yet (`t` and `ease` without an `animation` are an error, not a no-op). \" +\n \"If the bone is driven by a LIVE ik constraint the edit is redirected to that constraint's TARGET BONE, whose origin is then what lands on the point (the answer says so), because writing the bone itself would be overwritten by the solver. \" +\n \"For a rig_add_ik_chain limb that target sits at the chain's tip, so AT FULL MIX the tip reaches the point while the named bone only turns \u2014 a goal on the chain's FIRST bone does not move that bone's origin at all, and a partly mixed chain lands the target but leaves the tip short. \" +\n \"A live transform or path constraint refuses instead: nothing can be written there, so key its mix to 0 at that time or edit the constraint. \" +\n \"The point is converted using the pose AT THAT TIME, so a turned parent is accounted for. \" +\n \"The result is re-evaluated before it is saved: if what was written does not actually land on the point (a target a second solver owns, or one parented inside the chain that aims it) the call fails and writes nothing. \" +\n \"On success the answer gives the NAMED bone's world origin and tip after the edit.\",\n { path: Path, bone: z.string(), x: z.number(), y: z.number(),\n animation: z.string().optional(), t: z.number().min(0).optional(), ease: Ease.optional() },\n async ({ path, bone, x, y, ...opts }) => mutateWith(path, (d, say) => {\n const { doc, wrote, redirected, origin, tip } = T.setGoal(d, bone, x, y, opts);\n say(redirected ? `${bone} is driven by ik \"${redirected}\" \u2014 moved its target \"${wrote}\" instead` : `${wrote} \u2192 ${x}, ${y}`);\n // the numbers a second rig_get_pose call would have cost: after an ik redirect they are the only way to see\n // what the gesture did to the bone that was actually named, which is not the bone that landed on the point\n say(`${bone} is now at ${origin[0]}, ${origin[1]} (tip ${tip[0]}, ${tip[1]})${opts.animation ? ` in \"${opts.animation}\" at t=${opts.t ?? 0}` : \"\"}`);\n return doc;\n }));\n\ntool(\"rig_copy_tracks\",\n \"Copy the bone tracks of one set of bones onto another, pair by pair, optionally shifted in time and mirrored. \" +\n \"`phase` is a fraction of the animation's duration (0.5 = half a cycle later, 1 wraps back to 0). `mirrorX` negates x, rotation, shearX and shearY, which mirrors the motion across the PARENT's y axis \u2014 \" +\n \"that is a left/right mirror only when the destination's parent frame is itself the mirror image of the source's, which is not automatic: on a rig whose shoulders are not conjugate frames a mirrored arm copy points the SAME way in the document. \" +\n \"Destination tracks are replaced per prop, not merged. Data can be lost: a track keyed at both 0 and `duration` with DIFFERENT values loses the segment into that last key when `phase` shifts it, and a non-looping animation has the segment between its last and first key split \u2014 both are reported in the answer. \" +\n \"This is how the second leg of a cycle is made from the first \u2014 it is an operation, not a preset: nothing is stored or reused.\",\n { path: Path, animation: z.string(), from: z.array(z.string()).min(1), to: z.array(z.string()).min(1),\n phase: z.number().min(0).max(1).default(0), mirrorX: z.boolean().default(false) },\n async ({ path, animation, from, to, phase, mirrorX }) => mutateWith(path, (d, say) => {\n const { doc, copied, empty, lossy } = T.copyTracks(d, animation, from, to, { phase, mirrorX });\n say(`copied ${copied} track${copied === 1 ? \"\" : \"s\"}${phase ? ` shifted ${phase} of ${animation}` : \"\"}${mirrorX ? \", mirrored\" : \"\"}${empty.length ? `; no tracks on: ${empty.join(\", \")}` : \"\"}`);\n // the rotation can split the segment that ran from the last key to the first (see copyTracks) \u2014 harmless on\n // a loop, but a one-shot animation now plays a different curve there, and the agent should hear that once.\n // phase 1 is a full turn \u2014 the same identity as phase 0 \u2014 so it gates on `phase % 1`, not `phase !== 0`.\n const anim = d.animations.find(a => a.id === animation)!;\n if (phase % 1 !== 0 && !anim.loop) say(`\"${animation}\" does not loop: the shift may have split the segment between its last key and its first`);\n // a SEPARATE line from the seam note above: that one fires for every benign closed-loop drop too, so it\n // cannot carry \"data was actually lost\" \u2014 this only fires when the two ends of the dropped duplicate disagree\n if (lossy.length) say(`closing value dropped at the seam (endpoints disagreed, so the segment into it is gone): ${lossy.join(\"; \")}`);\n return doc;\n }));\n\ntool(\"rig_adjust_track\",\n \"Re-tune an existing track without retyping keys: amplitude scales its deviation from the rest value (0.5 = half as strong, 2 = twice; scale props as ratios), \" +\n \"offset adds a constant, timeScale stretches its key times (duration grows to fit). Drops the preset link.\",\n { path: Path, animation: z.string(), ...TrackRef, amplitude: z.number().optional(), offset: z.number().optional(), timeScale: z.number().positive().optional() },\n async ({ path, animation, target, id, prop, ...adj }) => mutate(path, d => T.adjustTrack(d, animation, { target, id, prop } as Omit<Track, \"keys\">, adj)));\n\ntool(\"rig_set_animation\", \"Animation properties without touching keys: duration (must cover the last key/event), loop, events (full list), rename. Creates the animation if missing.\",\n { path: Path, id: z.string(), duration: z.number().positive().optional(), loop: z.boolean().optional(),\n events: z.array(z.object({ t: z.number().nonnegative(), name: z.string(), payload: z.record(z.unknown()).optional() })).optional(), rename: z.string().optional() },\n async ({ path, id, ...patch }) => mutate(path, d => T.setAnimation(d, id, patch)));\n\ntool(\"rig_remove_keys\", \"Remove the keys of one track at the given times; an emptied track is dropped. Drops the preset link.\",\n { path: Path, animation: z.string(), ...TrackRef, times: z.array(z.number()).min(1) },\n async ({ path, animation, target, id, prop, times }) => mutate(path, d => T.removeKeys(d, animation, { target, id, prop } as Omit<Track, \"keys\">, times)));\n\ntool(\"rig_remove_animation\", \"Delete an animation.\",\n { path: Path, id: z.string() },\n async ({ path, id }) => mutate(path, d => T.removeAnimation(d, id), true));\n\n// ---------- preview / export ----------\n\ntool(\"rig_order_constraints\", \"Sort constraints by what they read and write, including target ancestors and skinned paths. Cycles are refused.\",\n { path: Path }, async ({ path }) => mutate(path, orderConstraints));\ntool(\"rig_gradient_weights\", \"Skin a mesh with a gradient along ordered chain joints, preserving its setup geometry.\",\n { path: Path, id: z.string(), bones: z.array(z.string()).min(2) }, async ({ path, id, bones }) => mutate(path, d => gradientWeights(d, id, bones)));\ntool(\"rig_smooth_weights\", \"Smooth weights over triangle neighbours. Locked vertex indices keep their weights. Deform tracks are dropped if the influence layout changes.\",\n { path: Path, id: z.string(), iterations: z.number().int().min(1).max(100).default(3), strength: z.number().min(0).max(1).default(0.5), locked: z.array(z.number().int().nonnegative()).default([]) },\n async ({ path, id, iterations, strength, locked }) => mutate(path, d => smoothWeights(d, id, iterations, strength, locked)));\ntool(\"rig_pin_weights\", \"Bind selected mesh vertices rigidly to one bone. Select by indices or document-space rectangle, e.g. the solid body of a prop while leaving its strap flexible.\",\n { path: Path, id: z.string(), bone: z.string(), vertices: z.array(z.number().int().nonnegative()).optional(), region: z.tuple([z.number(), z.number(), z.number().positive(), z.number().positive()]).optional() },\n async ({ path, id, bone, vertices, region }) => mutate(path, d => pinWeights(d, id, bone, vertices, region)));\ntool(\"rig_attach_to_bone\", \"At an animation time, switch a prop bone to follow a target bone without changing its evaluated world pose. Creates keyed transform constraints and computes offsets after IK. Author successive contacts in time order; key hand attachment swaps at the same time.\",\n { path: Path, animation: z.string(), bone: z.string(), target: z.string(), t: z.number().nonnegative() },\n async ({ path, animation, bone, target, t }) => mutate(path, d => attachToBone(d, animation, bone, target, t)));\ntool(\"rig_bake_secondary\", \"Bake velocity-driven damped spring rotations into editable PCHIP tracks. Uses evaluated world rotation or x/y motion (including IK). A looping driver must close; loop state is settled before baking and starts at setup within maxAngle. No runtime physics is required.\",\n { path: Path, animation: z.string(), driver: z.string(), driverProp: z.enum([\"rotation\", \"x\", \"y\"]).default(\"rotation\"), bones: z.array(z.string()).min(1), frequency: z.number().positive().default(2.5), damping: z.number().positive().default(0.65), gain: z.number().default(0.2), fps: z.number().int().min(1).max(240).default(60), maxAngle: z.number().positive().default(30) },\n async ({ path, animation, ...opts }) => mutate(path, d => bakeSecondary(d, animation, opts)));\n\ntool(\"rig_render_preview\",\n \"Render frames of an animation (or the rest pose) as a contact-sheet PNG, plus the rig_check findings for that animation (or a positive one-liner). \" +\n \"Use it after every change to SEE the result. overlayBones=true draws the skeleton with ids; onionSkin=true ghosts the previous frame of the sheet under each frame \" +\n \"(the first frame has no ghost); region=[x,y,w,h] in document px crops to a detail (a face) so small motion is legible at low token cost.\",\n { path: Path, animation: z.string().optional(), fps: z.number().default(8), count: z.number().int().optional(), times: z.array(z.number()).optional(),\n transparent: z.boolean().default(false), background: z.string().optional(), weightBone: z.string().optional(), debugFillMasks: z.record(z.string()).optional(), framesDir: z.string().optional(), overlayBones: z.boolean().default(false), onionSkin: z.boolean().default(false), region: z.tuple([z.number(), z.number(), z.number(), z.number()]).optional(),\n scale: z.number().default(0.5).describe(\"downscale to save tokens\"), sheetColumns: z.number().int().default(4), saveTo: z.string().optional().describe(\"also write sheet PNG here\") },\n async ({ path, saveTo, framesDir, ...opts }) => {\n try {\n const raw = await readFile(path, \"utf8\");\n const doc = parse(JSON.parse(raw));\n const r = await renderPreview(doc, { assetsDir: dirname(path), ...opts });\n if (saveTo) await writeFile(saveTo, r.sheet);\n if (framesDir) {\n const { mkdir } = await import(\"node:fs/promises\");\n await mkdir(framesDir, { recursive: true });\n const frames = r.frames.map((frame, i) => ({ file: `${String(i).padStart(6, \"0\")}.png`, sha256: sha256(frame) }));\n for (let i = 0; i < frames.length; i++) await writeFile(join(framesDir, frames[i].file), r.frames[i]);\n const manifest: RenderManifest = { version: 1, rigFile: sha256(raw), capturedAt: new Date().toISOString(), identity: r.identity, animation: opts.animation ?? null, transparent: opts.transparent, scale: opts.scale, times: r.times, frames,\n render: { background: opts.background, overlayBones: opts.overlayBones, onionSkin: opts.onionSkin, weightBone: opts.weightBone, debugFillMasks: opts.debugFillMasks ?? {}, region: opts.region } };\n await writeFile(join(framesDir, \"manifest.json\"), JSON.stringify(manifest, null, 2));\n }\n return { text: `${r.times.length} frames @ ${r.width}x${r.height}, t=[${r.times.join(\", \")}]\\n${previewCheck(doc, opts.animation)}`, image: r.sheet };\n } catch (e) { return fail(e); }\n });\n\ntool(\"rig_export\",\n \"Export for a game: pack all PNG layers into <outDir>/atlas.png and write <outDir>/rig.json whose assets point into it (asset.frame). One texture per rig instead of one per layer.\",\n { path: Path, outDir: z.string().describe(\"absolute, or relative to rig.json dir\"), padding: z.number().int().default(2), maxSize: z.number().int().default(4096) },\n async ({ path, outDir, padding, maxSize }) => {\n try {\n const out = resolveFrom(path, outDir);\n const doc = await buildAtlas(await load(path), dirname(path), out, { padding, maxSize });\n const [w, h] = pngSize(await readFile(join(out, \"atlas.png\")));\n return text(`\u2192 ${join(out, \"rig.json\")}\\n\u2192 ${join(out, \"atlas.png\")} (${w}x${h}, ${doc.assets.length} frames)`);\n } catch (e) { return fail(e); }\n });\n\n\ntool(\"rig_export_video\", \"Export runtime playback to MP4 (60 fps by default). Requires ffmpeg. Duration is rounded to a whole frame and reported. Output has an opaque presentation background; use transparent preview frames for alpha QA.\",\n { path: Path, animation: z.string(), outFile: z.string(), fps: z.number().int().min(1).max(240).default(60), scale: z.number().positive().default(1), background: z.string().optional(), weightBone: z.string().optional(), debugFillMasks: z.record(z.string()).optional() },\n async ({ path, outFile, ...opts }) => {\n try { const result = await exportVideo(await load(path), { assetsDir: dirname(path), outFile: resolveFrom(path, outFile), ...opts }); return text(`${resolveFrom(path, outFile)}: ${result.frames} frames, ${result.fps} fps, ${result.duration}s`); } catch (e) { return fail(e); }\n });\n\n\ntool(\"rig_verify_render\", \"Fail if render inputs or outputs changed, frames are absent/extra, or the capture does not cover the explicit expected times. Run before image gates; a manifest alone is not an art-quality pass.\",\n { path: Path, framesDir: z.string(), animation: z.string().optional(), times: z.array(z.number().nonnegative()).min(1), transparent: z.boolean().optional() },\n async ({ path, framesDir, ...expected }) => {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n const source = join(here, \"preview/harness.js\"), bundled = join(here, \"harness.js\");\n const manifest = await verifyRenderManifest(path, framesDir, { ...expected, renderer: await exists(source) ? source : bundled });\n return text(`verified ${manifest.frames.length}/${expected.times.length} frames; inputs, renderer and frame hashes match`);\n } catch (e) { return fail(e); }\n });\n\n\ntool(\"rig_run_gates\", \"Run explicit motion, proportion/contact, flash/pose, animation-ID and real AnimationState transition gates. Report sampling, amplitudes, speed/acceleration/jerk and failures; thresholds are supplied by the brief.\",\n { path: Path, config: GateConfig }, async ({ path, config }) => {\n try { const report = runGates(await load(path), config); return { text: JSON.stringify(report, null, 2), isError: !report.pass }; } catch (e) { return fail(e); }\n });\n", "/**\n * rig-io \u2014 the one way this project writes a JSON file that something else reads.\n *\n * `rig.json` has readers that are not the writer: the editor's watcher and its `/api/doc`, the version\n * precondition's read, and the next tool call's own load. `writeFile` truncates and then writes in 1 MiB chunks,\n * so on a multi-megabyte rig anyone reading between two chunks parses a prefix (measured: 21 of 24 concurrent\n * reads of the 1.3 MB cashier rig failed at position 1048576). A rename inside one directory is atomic, so every\n * reader sees either the whole old file or the whole new one.\n */\nimport { mkdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\n\nlet tmpSeq = 0;\n\n/**\n * Write `value` as pretty JSON to `path`, atomically. The temp file is a SIBLING \u2014 a rename across devices is\n * neither atomic nor guaranteed to work \u2014 named so the editor watcher's basename filter ignores it (and matched\n * by `.gitignore`'s `.*.tmp`, so a crash between the write and the rename cannot leave a tracked stray behind).\n * A failed write removes it rather than leaving it around.\n */\n/** Write `data` to `path` atomically \u2014 the temp-sibling-then-rename dance `saveJson` documents above. */\nexport async function saveBytes(path: string, data: Buffer | string): Promise<void> {\n const dir = dirname(path);\n await mkdir(dir, { recursive: true });\n const tmp = join(dir, `.${basename(path)}.${process.pid}.${(tmpSeq++).toString(36)}.tmp`);\n try {\n await writeFile(tmp, data);\n await rename(tmp, path);\n } catch (e) {\n await rm(tmp, { force: true });\n throw e;\n }\n}\n\nexport const saveJson = (path: string, value: unknown) => saveBytes(path, JSON.stringify(value, null, 2));\n", "/** Serialize operations on one rig within a process, including HTTP version checks and history writes. */\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { resolve } from \"node:path\";\n\nconst pending = new Map<string, Promise<void>>();\nconst active = new AsyncLocalStorage<Set<string>>();\n\n/** Reentrant so an HTTP transaction can call the same registry used directly by MCP and CLI. */\nexport async function withRigQueue<T>(path: string, op: () => Promise<T>): Promise<T> {\n const key = resolve(path);\n const held = active.getStore();\n if (held?.has(key)) return op();\n const previous = pending.get(key) ?? Promise.resolve();\n let release!: () => void;\n const next = new Promise<void>(r => { release = r; });\n pending.set(key, next);\n await previous;\n const scope = new Set(held);\n scope.add(key);\n try { return await active.run(scope, op); }\n finally {\n scope.delete(key);\n release();\n if (pending.get(key) === next) pending.delete(key);\n }\n}\n", "/**\n * rig-anim \u2014 pure animation math shared by the runtime, the checker, the importer and tests. No PixiJS.\n *\n * - easing + track sampling, Pose: Map<\"target:id:prop\", value>\n * - 2D affine matrices with PixiJS layout (a b c d tx ty; x' = a\u00B7x + c\u00B7y + tx, y' = b\u00B7x + d\u00B7y + ty)\n * - bone world transforms with shear and inherit modes, constraints (ik / transform / path) applied in `order`\n * - attachment geometry in document space: region corners, skinned mesh vertices, lattice deformation\n */\nimport type { RigDocument, Animation, Track, Bone, Attachment, RegionAttachment, MeshAttachment, PathAttachment, IkConstraint, TransformConstraint, PathConstraint } from \"./rig-format\";\nimport { controlOffsets, evalPatch, type Pivot } from \"./rig-deform\";\n\nconst DEG = Math.PI / 180;\n\n// ---------- easing ----------\n\nexport type EaseSpec = Track[\"keys\"][number][\"ease\"];\n\nconst named: Record<string, (t: number) => number> = {\n linear: t => t,\n step: () => 0,\n ease_in: t => t * t,\n ease_out: t => 1 - (1 - t) * (1 - t),\n ease_in_out: t => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2),\n minimum_jerk: t => t * t * t * (10 + t * (-15 + 6 * t)),\n back_out: t => 1 + 2.70158 * (t - 1) ** 3 + 1.70158 * (t - 1) ** 2,\n elastic_out: t =>\n t === 0 ? 0 : t === 1 ? 1 : 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * ((2 * Math.PI) / 3)) + 1,\n};\n\n/**\n * Cubic bezier easing sampled into 10 linear segments walked in order of the curve parameter (the same\n * approximation Spine uses: 9 interior samples per curve), so control points with non-monotonic times\n * behave identically to Spine.\n */\nconst BEZIER_SEGMENTS = 10;\nfunction bezier(x1: number, y1: number, x2: number, y2: number) {\n const px: number[] = [0], py: number[] = [0];\n for (let i = 1; i <= BEZIER_SEGMENTS; i++) {\n const t = i / BEZIER_SEGMENTS, u = 1 - t;\n px.push(3 * u * u * t * x1 + 3 * u * t * t * x2 + t * t * t);\n py.push(3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t);\n }\n return (x: number) => {\n if (x <= 0) return 0;\n for (let i = 1; i <= BEZIER_SEGMENTS; i++) {\n if (px[i] >= x) {\n const span = px[i] - px[i - 1];\n return py[i - 1] + (span > 0 ? ((x - px[i - 1]) / span) * (py[i] - py[i - 1]) : 0);\n }\n }\n return 1;\n };\n}\n\nconst easeCache = new Map<string, (t: number) => number>();\nexport function ease(spec: EaseSpec): (t: number) => number {\n if (typeof spec === \"string\") return named[spec];\n const key = spec.bezier.join(\",\");\n let f = easeCache.get(key);\n if (!f) easeCache.set(key, (f = bezier(...spec.bezier)));\n return f;\n}\n\n// ---------- sampling ----------\n\nexport type Val = number | string | null | number[] | string[];\n/** key: \"bone:id:prop\" | \"slot:id:prop\" | \"deform:id:prop\" | \"ik:id:prop\" | \"transform:id:prop\" | \"path:id:prop\" | \"drawOrder:order:order\" */\nexport type Pose = Map<string, Val>;\nexport const pk = (target: string, id: string, prop: string) => `${target}:${id}:${prop}`;\n\n/** Shape-preserving cubic, evaluated analytically rather than through the legacy Bezier lookup table. */\nfunction smoothValue(track: Track, i: number, t: number, component: number | undefined, loop: boolean): number {\n const k = track.keys, n = k.length;\n const v = (j: number) => component === undefined ? k[j].v as number : (k[j].v as number[])[component];\n const h = (j: number) => k[j + 1].t - k[j].t;\n const d = (j: number) => (v(j + 1) - v(j)) / h(j);\n const harmonic = (a: number, b: number, h0: number, h1: number) => a * b <= 0 ? 0 : 3 * (h0 + h1) / ((2 * h1 + h0) / a + (h1 + 2 * h0) / b);\n const tangent = (j: number): number => {\n if (j === 0 || j === n - 1) {\n if (loop && n > 2 && v(0) === v(n - 1) && k[0].ease !== \"step\" && k[n - 2].ease !== \"step\")\n return harmonic(d(n - 2), d(0), h(n - 2), h(0));\n return 0;\n }\n if (k[j - 1].ease === \"step\" || k[j].ease === \"step\") return 0;\n return harmonic(d(j - 1), d(j), h(j - 1), h(j));\n };\n const u = (t - k[i].t) / h(i), u2 = u * u, u3 = u2 * u;\n return (2 * u3 - 3 * u2 + 1) * v(i) + (u3 - 2 * u2 + u) * h(i) * tangent(i)\n + (-2 * u3 + 3 * u2) * v(i + 1) + (u3 - u2) * h(i) * tangent(i + 1);\n}\n\nexport function sample(track: Track, t: number, loop = false): Val {\n const keys = track.keys;\n if (t <= keys[0].t) return keys[0].v;\n const last = keys[keys.length - 1];\n if (t >= last.t) return last.v;\n let i = 0;\n while (keys[i + 1].t <= t) i++;\n const a = keys[i], b = keys[i + 1];\n if (a.ease === \"step\") return a.v;\n if (typeof a.v === \"number\" && typeof b.v === \"number\") {\n if (track.interpolation === \"pchip\") return smoothValue(track, i, t, undefined, loop);\n const u = ease(a.ease)((t - a.t) / (b.t - a.t));\n return a.v + (b.v - a.v) * u;\n }\n if (Array.isArray(a.v) && Array.isArray(b.v) && typeof a.v[0] === \"number\") {\n if (track.interpolation === \"pchip\") return (a.v as number[]).map((_, j) => smoothValue(track, i, t, j, loop));\n const u = ease(a.ease)((t - a.t) / (b.t - a.t)), av = a.v as number[], bv = b.v as number[];\n return av.map((v, k) => v + ((bv[k] ?? v) - v) * u);\n }\n return a.v; // discrete\n}\n\nexport function poseOf(anim: Animation, t: number, out: Pose = new Map()): Pose {\n for (const tr of anim.tracks) out.set(pk(tr.target, tr.id, tr.prop), sample(tr, t, anim.loop && tr.keys[0].t === 0 && tr.keys.at(-1)!.t === anim.duration));\n return out;\n}\n\n/** Crossfade: numbers (and number arrays) interpolate toward `to` (or rest when absent there); discrete values hold until w = 1. */\nexport function blendPoses(from: Pose, to: Pose, w: number, restOf: (key: string) => Val): Pose {\n if (w >= 1) return new Map(to);\n const out: Pose = new Map();\n for (const k of new Set([...from.keys(), ...to.keys()])) {\n const f = from.has(k) ? from.get(k)! : restOf(k);\n const cur = to.has(k) ? to.get(k)! : restOf(k);\n if (typeof f === \"number\" && !Array.isArray(cur)) {\n const target = typeof cur === \"number\" ? cur : (restOf(k) as number);\n out.set(k, f + (target - f) * w);\n } else if (Array.isArray(f) && typeof f[0] === \"number\") {\n const fv = f as number[], tv = (Array.isArray(cur) && typeof cur[0] === \"number\" ? cur : fv.map(() => 0)) as number[];\n out.set(k, fv.map((v, i) => v + ((tv[i] ?? 0) - v) * w));\n } else if (Array.isArray(cur) && typeof cur[0] === \"number\" && typeof f !== \"string\") {\n out.set(k, (cur as number[]).map(v => v * w));\n } else out.set(k, f ?? null);\n }\n return out;\n}\n\n/** Setup value of a pose key. */\nexport function restValue(doc: RigDocument, key: string): Val {\n const [target, id, prop] = key.split(\":\");\n if (target === \"bone\") return (doc.bones.find(b => b.id === id)!.transform as Record<string, number>)[prop];\n if (target === \"slot\") {\n const s = doc.slots.find(s => s.id === id)!;\n if (prop === \"color\") return colorToArray(s.color);\n return (s as unknown as Record<string, Val>)[prop];\n }\n if (target === \"ik\" || target === \"transform\" || target === \"path\") {\n const c = (doc[target] as { id: string }[]).find(c => c.id === id) as Record<string, unknown> | undefined;\n const v = c?.[prop];\n return typeof v === \"boolean\" ? (v ? 1 : 0) : ((v as number) ?? 0);\n }\n if (target === \"drawOrder\") return doc.slots.map(s => s.id);\n return 0;\n}\n\n/** \"#rrggbbaa\" \u2192 [r, g, b, a] in 0..1 */\nexport const colorToArray = (c: string): number[] => [0, 2, 4, 6].map(k => parseInt(c.slice(1 + k, 3 + k), 16) / 255);\n\n/** Numeric lattice deform params of one attachment present in the pose, or undefined when it has none. */\nexport function deformParams(pose: Pose, attachmentId: string): Record<string, number> | undefined {\n let out: Record<string, number> | undefined;\n const prefix = `deform:${attachmentId}:`;\n for (const [k, v] of pose)\n if (k.startsWith(prefix) && typeof v === \"number\") (out ??= {})[k.slice(prefix.length)] = v;\n return out;\n}\n\n// ---------- affine ----------\n\nexport interface Affine { a: number; b: number; c: number; d: number; tx: number; ty: number }\n\n/** translate \u00B7 rotate(deg, clockwise in Y-down) \u00B7 shear \u00B7 scale \u2014 PixiJS setTransform semantics with shear as axis angles */\nexport function affineOf(x: number, y: number, rotationDeg: number, sx: number, sy: number, shearX = 0, shearY = 0): Affine {\n const rx = (rotationDeg + shearX) * DEG, ry = (rotationDeg + 90 + shearY) * DEG;\n return { a: Math.cos(rx) * sx, b: Math.sin(rx) * sx, c: Math.cos(ry) * sy, d: Math.sin(ry) * sy, tx: x, ty: y };\n}\n\n/** parent \u2218 local (apply local first, then parent) \u2014 PixiJS Matrix.append */\nexport function mul(p: Affine, l: Affine): Affine {\n return {\n a: p.a * l.a + p.c * l.b, b: p.b * l.a + p.d * l.b,\n c: p.a * l.c + p.c * l.d, d: p.b * l.c + p.d * l.d,\n tx: p.a * l.tx + p.c * l.ty + p.tx, ty: p.b * l.tx + p.d * l.ty + p.ty,\n };\n}\n\nexport const apply = (m: Affine, x: number, y: number): [number, number] => [m.a * x + m.c * y + m.tx, m.b * x + m.d * y + m.ty];\n\nexport function invert(m: Affine): Affine {\n const det = m.a * m.d - m.b * m.c || 1e-12;\n const a = m.d / det, b = -m.b / det, c = -m.c / det, d = m.a / det;\n return { a, b, c, d, tx: -(a * m.tx + c * m.ty), ty: -(b * m.tx + d * m.ty) };\n}\n\n/** rotation of the x axis of an affine, degrees */\nexport const rotationOf = (m: Affine) => Math.atan2(m.b, m.a) / DEG;\n\n/**\n * Where a world matrix puts a bone, which way its x axis points, and how long its axes are \u2014 the inverse of\n * `affineOf` for everything except shear, which cannot be recovered from the axes alone (a sheared y axis is\n * reported by its length, and `angle` follows the x axis only). Reading a posed bone goes through here so the\n * numbers an agent gets are the numbers the runtime drew.\n */\nexport function decompose(m: Affine): { x: number; y: number; angle: number; scaleX: number; scaleY: number } {\n return { x: m.tx, y: m.ty, angle: rotationOf(m), scaleX: Math.hypot(m.a, m.b), scaleY: Math.hypot(m.c, m.d) };\n}\n\nconst num = (pose: Pose, key: string, rest: number) => { const v = pose.get(key); return typeof v === \"number\" ? v : rest; };\n\n// ---------- bones ----------\n\nexport interface BoneState {\n /** effective local values (setup + pose + constraint adjustments) */\n x: number; y: number; rotation: number; scaleX: number; scaleY: number; shearX: number; shearY: number;\n world: Affine;\n}\n\nexport interface Skeleton {\n doc: RigDocument;\n pose: Pose;\n bones: Map<string, BoneState>;\n /** attachment shown per slot (pose or setup), null = hidden */\n attachment: Map<string, Attachment | null>;\n}\n\nconst boneIndex = new WeakMap<RigDocument, Map<string, Bone>>();\nfunction boneOf(doc: RigDocument, id: string): Bone {\n let idx = boneIndex.get(doc);\n if (!idx) boneIndex.set(doc, (idx = new Map(doc.bones.map(b => [b.id, b]))));\n const b = idx.get(id);\n if (!b) throw new Error(`unknown bone \"${id}\"`);\n return b;\n}\n\n/** world transform of one bone from its effective local values and its parent's world transform, honouring `inherit` */\nexport function boneWorldOf(bone: Bone, s: Omit<BoneState, \"world\">, parent: Affine | undefined): Affine {\n const local = affineOf(s.x, s.y, s.rotation, s.scaleX, s.scaleY, s.shearX, s.shearY);\n if (!parent) return local;\n if (bone.inherit === \"normal\") return mul(parent, local);\n const [tx, ty] = apply(parent, s.x, s.y);\n return { ...mul(inheritedParentLinear(bone, parent), { ...local, tx: 0, ty: 0 }), tx, ty };\n}\n\n/** Order bones parent-first (memoized per document). */\nconst orderCache = new WeakMap<RigDocument, Bone[]>();\nexport function boneOrder(doc: RigDocument): Bone[] {\n let order = orderCache.get(doc);\n if (order) return order;\n order = [];\n const emitted = new Set<string>();\n while (order.length < doc.bones.length) {\n let progressed = false;\n for (const b of doc.bones) if (!emitted.has(b.id) && (!b.parent || emitted.has(b.parent))) { emitted.add(b.id); order.push(b); progressed = true; }\n if (!progressed) throw new Error(\"bone hierarchy has a cycle\");\n }\n orderCache.set(doc, order);\n return order;\n}\n\nconst localOf = (doc: RigDocument, pose: Pose, b: Bone): Omit<BoneState, \"world\"> => {\n const r = b.transform, id = b.id;\n return {\n x: num(pose, pk(\"bone\", id, \"x\"), r.x), y: num(pose, pk(\"bone\", id, \"y\"), r.y),\n rotation: num(pose, pk(\"bone\", id, \"rotation\"), r.rotation),\n scaleX: num(pose, pk(\"bone\", id, \"scaleX\"), r.scaleX), scaleY: num(pose, pk(\"bone\", id, \"scaleY\"), r.scaleY),\n shearX: num(pose, pk(\"bone\", id, \"shearX\"), r.shearX), shearY: num(pose, pk(\"bone\", id, \"shearY\"), r.shearY),\n };\n};\n\n/** Recompute world transforms of `bone` and its descendants from their current local values. */\nfunction updateSubtree(skel: Skeleton, root: string) {\n const doc = skel.doc;\n const kids = new Map<string, Bone[]>();\n for (const b of doc.bones) if (b.parent) (kids.get(b.parent) ?? kids.set(b.parent, []).get(b.parent)!).push(b);\n const stack = [root];\n while (stack.length) {\n const id = stack.pop()!, b = boneOf(doc, id), st = skel.bones.get(id)!;\n st.world = boneWorldOf(b, st, b.parent ? skel.bones.get(b.parent)!.world : undefined);\n for (const k of kids.get(id) ?? []) stack.push(k.id);\n }\n}\n\n/** Full skeleton evaluation for a pose: bone locals, constraints in order, world transforms, shown attachments. */\nexport function evaluate(doc: RigDocument, pose: Pose): Skeleton {\n const skel: Skeleton = { doc, pose, bones: new Map(), attachment: new Map() };\n for (const b of boneOrder(doc)) {\n const s = localOf(doc, pose, b);\n const world = boneWorldOf(b, s, b.parent ? skel.bones.get(b.parent)!.world : undefined);\n skel.bones.set(b.id, { ...s, world });\n }\n const attachments = new Map(doc.attachments.map(a => [a.id, a]));\n for (const s of doc.slots) {\n const v = pose.get(pk(\"slot\", s.id, \"attachment\"));\n const id = v === undefined ? s.attachment : (v as string | null);\n skel.attachment.set(s.id, id ? attachments.get(id) ?? null : null);\n }\n // constraints, in document order (ties broken by array order)\n const all: { order: number; kind: \"ik\" | \"transform\" | \"path\"; c: IkConstraint | TransformConstraint | PathConstraint }[] = [\n ...doc.ik.map(c => ({ order: c.order, kind: \"ik\" as const, c })),\n ...doc.transform.map(c => ({ order: c.order, kind: \"transform\" as const, c })),\n ...doc.path.map(c => ({ order: c.order, kind: \"path\" as const, c })),\n ].sort((a, b) => a.order - b.order);\n for (const { kind, c } of all) {\n if (kind === \"ik\") applyIk(skel, c as IkConstraint);\n else if (kind === \"transform\") applyTransformConstraint(skel, c as TransformConstraint);\n else applyPathConstraint(skel, c as PathConstraint);\n }\n return skel;\n}\n\n/** Bone world transforms for a pose (constraints applied). */\nexport function boneWorld(doc: RigDocument, pose: Pose): Map<string, Affine> {\n const skel = evaluate(doc, pose);\n return new Map([...skel.bones].map(([id, s]) => [id, s.world]));\n}\n\n// ---------- constraints ----------\n\n/** a constraint's value at this frame: the keyed one, else the document's \u2014 what every early-out below reads\n * (`applyIk` at `mix <= 0`, the transform/path solvers when all of `MIX_PROPS` are 0). `rig-check`'s `poseNum`\n * answers the same question elsewhere and must keep agreeing with it.\n * Outside the solvers, ask `mixAt` in rig-constraints.ts \u2014 the exported one, so a fourth copy is never needed. */\nconst cnum = (skel: Skeleton, kind: string, id: string, prop: string, rest: number | boolean) =>\n num(skel.pose, pk(kind, id, prop), typeof rest === \"boolean\" ? (rest ? 1 : 0) : rest);\n\n/** point in bone-local space of `bone` for a document-space point */\nfunction toLocal(skel: Skeleton, bone: string, x: number, y: number): [number, number] {\n return apply(invert(skel.bones.get(bone)!.world), x, y);\n}\n/** document-space direction of a bone's local x axis, degrees */\nconst worldRotation = (skel: Skeleton, bone: string) => rotationOf(skel.bones.get(bone)!.world);\n\nconst IDENTITY: Affine = { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 };\nconst wrapRad = (r: number) => (r > Math.PI ? r - 2 * Math.PI : r < -Math.PI ? r + 2 * Math.PI : r);\n\n/**\n * Single-bone IK: rotate `bone` so its (sheared) x axis points at the world point, blended by `mix`. Solved in the\n * parent's local space, which aims correctly under any parent scale; a negative scaleX flips the axis by 180\u00B0.\n * compress/stretch scale the bone's length to the target distance (uniform: both axes).\n */\nfunction aimAt(skel: Skeleton, boneId: string, tx: number, ty: number, mix: number, compress = false, stretch = false, uniform = false) {\n const b = boneOf(skel.doc, boneId), st = skel.bones.get(boneId)!;\n const parent = b.parent ? skel.bones.get(b.parent)!.world : undefined;\n let dx: number, dy: number;\n if (parent && b.inherit === \"onlyTranslation\") { dx = tx - st.world.tx; dy = ty - st.world.ty; }\n else {\n const [px, py] = parent ? apply(invert(parent), tx, ty) : [tx, ty];\n dx = px - st.x; dy = py - st.y;\n }\n let r = Math.atan2(dy, dx) / DEG - st.shearX - st.rotation;\n if (st.scaleX < 0) r += 180;\n r = shortest(r);\n let sx = st.scaleX, sy = st.scaleY;\n if (compress || stretch) {\n const len = b.length * sx;\n if (len > 0.0001) {\n const dd = dx * dx + dy * dy;\n if ((compress && dd < len * len) || (stretch && dd > len * len)) { const f = (Math.sqrt(dd) / len - 1) * mix + 1; sx *= f; if (uniform) sy *= f; }\n }\n }\n st.rotation += r * mix; st.scaleX = sx; st.scaleY = sy;\n updateSubtree(skel, boneId);\n}\n\nconst shortest = (deg: number) => ((((deg + 180) % 360) + 360) % 360) - 180;\n\n/** CCD for longer chains. Solves a fresh pose each evaluation, then blends the local rotations once. */\nfunction applyLongIk(skel: Skeleton, c: IkConstraint, tx: number, ty: number, mix: number) {\n const initial = c.bones.map(id => ({ ...skel.bones.get(id)! }));\n const last = c.bones.at(-1)!, len = boneOf(skel.doc, last).length;\n const end = () => apply(skel.bones.get(last)!.world, len, 0);\n const tolerance = c.tolerance ?? 0.05;\n // A straight chain aimed along its axis has zero CCD gradient even when it must fold.\n const root = skel.bones.get(c.bones[0])!.world, tip = end();\n if (Math.abs((tip[0] - root.tx) * (ty - root.ty) - (tip[1] - root.ty) * (tx - root.tx)) < 1e-7 && Math.hypot(tx - root.tx, ty - root.ty) < Math.hypot(tip[0] - root.tx, tip[1] - root.ty) - tolerance) {\n skel.bones.get(last)!.rotation += cnum(skel, \"ik\", c.id, \"bendPositive\", c.bendPositive) > 0.5 ? 5 : -5;\n updateSubtree(skel, last);\n }\n for (let iter = 0; iter < (c.iterations ?? 100); iter++) {\n const e = end();\n if (Math.hypot(e[0] - tx, e[1] - ty) <= tolerance) break;\n for (let i = c.bones.length - 1; i >= 0; i--) {\n const id = c.bones[i], b = boneOf(skel.doc, id), st = skel.bones.get(id)!, w = st.world, e = end();\n const angle = wrapRad(Math.atan2(ty - w.ty, tx - w.tx) - Math.atan2(e[1] - w.ty, e[0] - w.tx));\n const cos = Math.cos(angle), sin = Math.sin(angle);\n setEffectiveWorld(skel, b, st, { ...w, a: cos * w.a - sin * w.b, b: sin * w.a + cos * w.b, c: cos * w.c - sin * w.d, d: sin * w.c + cos * w.d });\n }\n }\n if (mix < 1) {\n c.bones.forEach((id, i) => {\n const st = skel.bones.get(id)!, from = initial[i];\n for (const p of [\"rotation\", \"shearX\", \"shearY\"] as const) st[p] = from[p] + shortest(st[p] - from[p]) * mix;\n for (const p of [\"x\", \"y\", \"scaleX\", \"scaleY\"] as const) st[p] = from[p] + (st[p] - from[p]) * mix;\n });\n updateSubtree(skel, c.bones[0]);\n }\n}\n\n/**\n * IK constraint. One bone aims at the target. Two bones: the child is moved onto the parent's x axis and both are\n * rotated so the child's tip reaches the target, bending to the requested side. Solved in the parent's parent space:\n * the law of cosines when the parent's scale is uniform, otherwise the child's tip sweeps an ellipse (parent scale)\n * and the reachable point is solved analytically. Negative scales flip axes by 180\u00B0 and mirror the bend; the parent's\n * shear is dropped. Softness eases the last stretch before full extension; stretch lengthens the parent to reach.\n */\nfunction applyIk(skel: Skeleton, c: IkConstraint) {\n const mix = cnum(skel, \"ik\", c.id, \"mix\", c.mix);\n if (mix <= 0) return;\n const target = skel.bones.get(c.target)!.world;\n if (c.bones.length > 2) { applyLongIk(skel, c, target.tx, target.ty, mix); return; }\n const bendDir = cnum(skel, \"ik\", c.id, \"bendPositive\", c.bendPositive) > 0.5 ? 1 : -1;\n const compress = cnum(skel, \"ik\", c.id, \"compress\", c.compress) > 0.5, stretch = cnum(skel, \"ik\", c.id, \"stretch\", c.stretch) > 0.5;\n let softness = cnum(skel, \"ik\", c.id, \"softness\", c.softness);\n if (c.bones.length === 1) { aimAt(skel, c.bones[0], target.tx, target.ty, mix, compress, stretch, c.uniform); return; }\n const [pId, cId] = c.bones;\n const parentBone = boneOf(skel.doc, pId), childBone = boneOf(skel.doc, cId);\n const p = skel.bones.get(pId)!, ch = skel.bones.get(cId)!;\n const px = p.x, py = p.y;\n let psx = p.scaleX, psy = p.scaleY, csx = ch.scaleX, sx = psx, sy = psy;\n let os1 = 0, os2 = 0, s2 = 1;\n if (psx < 0) { psx = -psx; os1 = 180; s2 = -1; }\n if (psy < 0) { psy = -psy; s2 = -s2; }\n if (csx < 0) { csx = -csx; os2 = 180; }\n const uniform = Math.abs(psx - psy) <= 0.0001;\n const cx = ch.x, cy = !uniform || stretch ? 0 : ch.y;\n const [cwx, cwy] = apply(p.world, cx, cy);\n const ppInv = invert(parentBone.parent ? skel.bones.get(parentBone.parent)!.world : IDENTITY);\n const [clx, cly] = apply(ppInv, cwx, cwy);\n const dx = clx - px, dy = cly - py, l1 = Math.hypot(dx, dy);\n let l2 = childBone.length * csx;\n if (l1 < 0.0001) { // parent and child share an origin: aim the parent, the child keeps its offset\n aimAt(skel, pId, target.tx, target.ty, mix, false, stretch, false);\n ch.x = cx; ch.y = cy; ch.rotation = 0;\n updateSubtree(skel, pId);\n return;\n }\n const [tlx, tly] = apply(ppInv, target.tx, target.ty);\n let tx = tlx - px, ty = tly - py, dd = tx * tx + ty * ty;\n if (softness !== 0) {\n softness *= psx * (csx + 1) * 0.5;\n const td = Math.sqrt(dd), sd = td - l1 - l2 * psx + softness;\n if (sd > 0) {\n let q = Math.min(1, sd / (softness * 2)) - 1;\n q = (sd - softness * (1 - q * q)) / td;\n tx -= q * tx; ty -= q * ty; dd = tx * tx + ty * ty;\n }\n }\n let a1: number, a2: number;\n if (uniform) {\n l2 *= psx;\n let cos = (dd - l1 * l1 - l2 * l2) / (2 * l1 * l2);\n if (cos < -1) { cos = -1; a2 = Math.PI * bendDir; }\n else if (cos > 1) {\n cos = 1; a2 = 0;\n if (stretch) { const f = (Math.sqrt(dd) / (l1 + l2) - 1) * mix + 1; sx *= f; if (c.uniform) sy *= f; }\n } else a2 = Math.acos(cos) * bendDir;\n const a = l1 + l2 * cos, b = l2 * Math.sin(a2);\n a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b);\n } else {\n // child tip on the ellipse (l1 + a\u00B7cos \u03B8, b\u00B7sin \u03B8): find the point at distance \u221Add, else the nearest extreme\n const a = psx * l2, b = psy * l2, aa = a * a, bb = b * b, ta = Math.atan2(ty, tx);\n const c0 = bb * l1 * l1 + aa * dd - aa * bb, c1 = -2 * bb * l1, c2 = bb - aa;\n const disc = c1 * c1 - 4 * c2 * c0;\n let solved = false;\n a1 = a2 = 0;\n if (disc >= 0) {\n let q = Math.sqrt(disc);\n if (c1 < 0) q = -q;\n q = -(c1 + q) * 0.5;\n const r0 = q / c2, r1 = c0 / q, r = Math.abs(r0) < Math.abs(r1) ? r0 : r1, yy = dd - r * r;\n if (yy >= 0) {\n const y = Math.sqrt(yy) * bendDir;\n a1 = ta - Math.atan2(y, r);\n a2 = Math.atan2(y / psy, (r - l1) / psx);\n solved = true;\n }\n }\n if (!solved) {\n let minAngle = Math.PI, minX = l1 - a, minDist = minX * minX, minY = 0, maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0;\n const k = -a * l1 / (aa - bb);\n if (k >= -1 && k <= 1) {\n const ang = Math.acos(k), x = a * Math.cos(ang) + l1, y = b * Math.sin(ang), dist = x * x + y * y;\n if (dist < minDist) { minAngle = ang; minDist = dist; minX = x; minY = y; }\n if (dist > maxDist) { maxAngle = ang; maxDist = dist; maxX = x; maxY = y; }\n }\n if (dd <= (minDist + maxDist) * 0.5) { a1 = ta - Math.atan2(minY * bendDir, minX); a2 = minAngle * bendDir; }\n else { a1 = ta - Math.atan2(maxY * bendDir, maxX); a2 = maxAngle * bendDir; }\n }\n }\n const os = Math.atan2(cy, cx) * s2;\n const d1 = shortest((a1 - os) / DEG + os1 - p.rotation);\n const d2 = shortest(((a2 + os) / DEG - ch.shearX) * s2 + os2 - ch.rotation);\n p.rotation += d1 * mix; p.scaleX = sx; p.scaleY = sy; p.shearX = 0; p.shearY = 0;\n ch.x = cx; ch.y = cy; ch.rotation += d2 * mix;\n updateSubtree(skel, pId);\n}\n\n/**\n * Transform constraint: each bone follows the target's rotation / position / scale / shear by the mix amounts, with\n * the constraint's offsets. World mode edits the bone's world matrix (rotation turns the whole matrix, scales the\n * axis lengths, shear turns the y axis) and folds it back into effective locals; local mode mixes the effective\n * local values. `relative` adds the target's values instead of matching them.\n */\nfunction applyTransformConstraint(skel: Skeleton, c: TransformConstraint) {\n const mixRotate = cnum(skel, \"transform\", c.id, \"mixRotate\", c.mixRotate), mixX = cnum(skel, \"transform\", c.id, \"mixX\", c.mixX), mixY = cnum(skel, \"transform\", c.id, \"mixY\", c.mixY);\n const mixScaleX = cnum(skel, \"transform\", c.id, \"mixScaleX\", c.mixScaleX), mixScaleY = cnum(skel, \"transform\", c.id, \"mixScaleY\", c.mixScaleY), mixShearY = cnum(skel, \"transform\", c.id, \"mixShearY\", c.mixShearY);\n if (!mixRotate && !mixX && !mixY && !mixScaleX && !mixScaleY && !mixShearY) return;\n c = { ...c, ...Object.fromEntries([\"x\", \"y\", \"rotation\", \"scaleX\", \"scaleY\", \"shearY\"].map(p => [p, cnum(skel, \"transform\", c.id, p, c[p as \"x\"])])) };\n const target = skel.bones.get(c.target)!, tw = target.world;\n const offsetRotation = c.rotation * DEG, offsetShearY = c.shearY * DEG;\n for (const id of c.bones) {\n const b = boneOf(skel.doc, id), st = skel.bones.get(id)!;\n if (c.local) {\n if (c.relative) {\n st.rotation += (target.rotation + c.rotation) * mixRotate;\n st.x += (target.x + c.x) * mixX; st.y += (target.y + c.y) * mixY;\n st.scaleX *= (target.scaleX - 1 + c.scaleX) * mixScaleX + 1;\n st.scaleY *= (target.scaleY - 1 + c.scaleY) * mixScaleY + 1;\n st.shearY += (target.shearY + c.shearY) * mixShearY;\n } else {\n st.rotation += (target.rotation - st.rotation + c.rotation) * mixRotate;\n st.x += (target.x - st.x + c.x) * mixX; st.y += (target.y - st.y + c.y) * mixY;\n if (st.scaleX !== 0) st.scaleX += (target.scaleX - st.scaleX + c.scaleX) * mixScaleX;\n if (st.scaleY !== 0) st.scaleY += (target.scaleY - st.scaleY + c.scaleY) * mixScaleY;\n st.shearY += (target.shearY - st.shearY + c.shearY) * mixShearY;\n }\n updateSubtree(skel, id);\n continue;\n }\n let w: Affine = { ...st.world };\n const targetRot = Math.atan2(tw.b, tw.a), rotate = (m: Affine, r: number): Affine => {\n const cos = Math.cos(r), sin = Math.sin(r);\n return { a: cos * m.a - sin * m.b, b: sin * m.a + cos * m.b, c: cos * m.c - sin * m.d, d: sin * m.c + cos * m.d, tx: m.tx, ty: m.ty };\n };\n if (mixRotate !== 0) {\n const r = wrapRad(c.relative ? targetRot + offsetRotation : targetRot - Math.atan2(w.b, w.a) + offsetRotation);\n w = rotate(w, r * mixRotate);\n }\n if (mixX !== 0 || mixY !== 0) {\n const [ox, oy] = apply(tw, c.x, c.y); // the offset lives in the target's space\n if (c.relative) { w.tx += ox * mixX; w.ty += oy * mixY; }\n else { w.tx += (ox - w.tx) * mixX; w.ty += (oy - w.ty) * mixY; }\n }\n if (mixScaleX !== 0) {\n const ts = Math.hypot(tw.a, tw.b);\n let f: number;\n if (c.relative) f = (ts - 1 + c.scaleX) * mixScaleX + 1;\n else { const s0 = Math.hypot(w.a, w.b); f = s0 === 0 ? 1 : (s0 + (ts - s0 + c.scaleX) * mixScaleX) / s0; }\n w.a *= f; w.b *= f;\n }\n if (mixScaleY !== 0) {\n const ts = Math.hypot(tw.c, tw.d);\n let f: number;\n if (c.relative) f = (ts - 1 + c.scaleY) * mixScaleY + 1;\n else { const s0 = Math.hypot(w.c, w.d); f = s0 === 0 ? 1 : (s0 + (ts - s0 + c.scaleY) * mixScaleY) / s0; }\n w.c *= f; w.d *= f;\n }\n if (mixShearY > 0) {\n const by = Math.atan2(w.d, w.c), targetShear = Math.atan2(tw.d, tw.c) - targetRot;\n const r = c.relative\n ? by + (wrapRad(targetShear) - Math.PI / 2 + offsetShearY) * mixShearY\n : by + (wrapRad(targetShear - (by - Math.atan2(w.b, w.a))) + offsetShearY) * mixShearY;\n const len = Math.hypot(w.c, w.d);\n w.c = Math.cos(r) * len; w.d = Math.sin(r) * len;\n }\n setEffectiveWorld(skel, b, st, w);\n }\n}\n\n// ---------- paths ----------\n\n/** world-space control points of a path attachment (2 numbers per vertex) */\nexport function pathWorldVertices(skel: Skeleton, slotId: string, att: PathAttachment): number[] {\n return attachmentWorldVertices(skel, slotId, att);\n}\n\n/** path length: `lengths[i]` is the length up to the end of curve i; an open path stores one extra entry */\nexport function pathLength(vertexCount: number, closed: boolean, lengths: number[]): number {\n const curveCount = closed ? vertexCount / 3 : vertexCount / 3 - 1;\n return curveCount >= 1 && lengths.length >= curveCount ? lengths[curveCount - 1] : lengths[lengths.length - 1] ?? 1;\n}\n\n/**\n * Sample positions and tangents along a path made of cubic bezier curves through the attachment vertices\n * (vertex layout: [c_prev, p, c_next] triples; curve i runs p_i \u2192 c_next_i \u2192 c_prev_{i+1} \u2192 p_{i+1}).\n */\n/**\n * Points along a path attachment (document space). `positions` are absolute distances along the path (or fractions of\n * its length when `percent`). With `constantSpeed` the length of the posed curve is measured (4 chords per curve for\n * the total, 10 chords inside the curve that holds the position); otherwise the stored setup `lengths` and the raw\n * curve parameter are used. Closed paths wrap; positions beyond an open path continue along its end tangents.\n * `angle` is the tangent direction in degrees.\n */\nexport function samplePath(points: number[], closed: boolean, lengths: number[], constantSpeed: boolean, positions: number[], percent: boolean): { x: number; y: number; angle: number }[] {\n const n = points.length / 2;\n // anchors sit at indices 1, 4, 7, \u2026 (each vertex = [cPrev, p, cNext]); curve i runs from anchor i to anchor i + 1\n const curveCount = closed ? n / 3 : n / 3 - 1;\n if (curveCount < 1) return positions.map(() => ({ x: points[2] ?? 0, y: points[3] ?? 0, angle: 0 }));\n const curve = (i: number) => {\n const a = ((i * 3 + 1) % n) * 2, c1 = ((i * 3 + 2) % n) * 2, c2 = ((i * 3 + 3) % n) * 2, b = ((i * 3 + 4) % n) * 2;\n return [points[a], points[a + 1], points[c1], points[c1 + 1], points[c2], points[c2 + 1], points[b], points[b + 1]];\n };\n const pointAt = (i: number, t: number) => {\n const [x0, y0, x1, y1, x2, y2, x3, y3] = curve(i), u = 1 - t;\n return { x: u * u * u * x0 + 3 * u * u * t * x1 + 3 * u * t * t * x2 + t * t * t * x3, y: u * u * u * y0 + 3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t * y3 };\n };\n const angleAt = (i: number, t: number) => {\n const [x0, y0, x1, y1, x2, y2, x3, y3] = curve(i), u = 1 - t;\n const dx = 3 * u * u * (x1 - x0) + 6 * u * t * (x2 - x1) + 3 * t * t * (x3 - x2);\n const dy = 3 * u * u * (y1 - y0) + 6 * u * t * (y2 - y1) + 3 * t * t * (y3 - y2);\n return Math.atan2(dy, dx) / DEG;\n };\n const chords = (i: number, count: number) => {\n const acc: number[] = []; let sum = 0, prev = pointAt(i, 0);\n for (let k = 1; k <= count; k++) { const q = pointAt(i, k / count); sum += Math.hypot(q.x - prev.x, q.y - prev.y); acc.push(sum); prev = q; }\n return acc;\n };\n const cum: number[] = [];\n if (constantSpeed) { let acc = 0; for (let i = 0; i < curveCount; i++) { acc += chords(i, 4)[3]; cum.push(acc); } }\n else for (let i = 0; i < curveCount; i++) cum.push(lengths[i] ?? (i ? cum[i - 1] : 0));\n const total = cum[curveCount - 1];\n const out: { x: number; y: number; angle: number }[] = [];\n for (let pos of positions) {\n if (percent) pos *= total;\n if (closed) {\n if (total > 0) { pos %= total; if (pos < 0) pos += total; } else pos = 0;\n } else if (pos < 0) { // before the start: continue the start tangent (anchor 0 towards its outgoing control)\n const r = Math.atan2(points[5] - points[3], points[4] - points[2]);\n out.push({ x: points[2] + pos * Math.cos(r), y: points[3] + pos * Math.sin(r), angle: r / DEG });\n continue;\n } else if (pos > total) { // after the end: continue the end tangent (incoming control towards the last anchor)\n const a = (curveCount * 3 + 1) * 2, c = curveCount * 3 * 2, e = pos - total;\n const r = Math.atan2(points[a + 1] - points[c + 1], points[a] - points[c]);\n out.push({ x: points[a] + e * Math.cos(r), y: points[a + 1] + e * Math.sin(r), angle: r / DEG });\n continue;\n }\n let i = 0;\n while (i < curveCount - 1 && pos > cum[i]) i++;\n const prev = i ? cum[i - 1] : 0, span = cum[i] - prev;\n const f = span > 0 ? (pos - prev) / span : 0;\n let t = f;\n if (constantSpeed) { // weight the parameter by chord lengths inside the curve\n const seg = chords(i, 10), target = f * seg[9];\n let k = 0;\n while (k < 9 && target > seg[k]) k++;\n const sPrev = k ? seg[k - 1] : 0, sSpan = seg[k] - sPrev;\n t = (k + (sSpan > 0 ? (target - sPrev) / sSpan : 0)) / 10;\n }\n out.push({ ...pointAt(i, t), angle: angleAt(i, t) });\n }\n return out;\n}\n\nconst PATH_EPSILON = 0.00001;\n\n/**\n * Path constraint: bones are laid along the target slot's path attachment (spacing modes: length = bone length +\n * spacing, fixed = spacing px, percent = fraction of the path per bone, proportional = the path shared by bone length),\n * translated with mixX/mixY and rotated with mixRotate (tangent = path direction, chain = towards the next bone,\n * chainScale = chain + scaled to reach it). Applied in world space, then folded back into the bones' effective locals.\n */\nfunction applyPathConstraint(skel: Skeleton, c: PathConstraint) {\n const mixRotate = cnum(skel, \"path\", c.id, \"mixRotate\", c.mixRotate), mixX = cnum(skel, \"path\", c.id, \"mixX\", c.mixX), mixY = cnum(skel, \"path\", c.id, \"mixY\", c.mixY);\n if (!mixRotate && !mixX && !mixY) return;\n const att = skel.attachment.get(c.target);\n if (!att || att.type !== \"path\") return;\n const points = pathWorldVertices(skel, c.target, att);\n const position = cnum(skel, \"path\", c.id, \"position\", c.position), spacing = cnum(skel, \"path\", c.id, \"spacing\", c.spacing);\n const tangents = c.rotateMode === \"tangent\", scale = c.rotateMode === \"chainScale\";\n const bones = c.bones.map(id => ({ b: boneOf(skel.doc, id), st: skel.bones.get(id)! }));\n const spacesCount = tangents ? bones.length : bones.length + 1;\n // spacing between consecutive bones; length-based modes scale with the bone's world x axis\n const spaces = new Array<number>(spacesCount).fill(0), worldLengths: number[] = [];\n let sum = 0;\n for (let i = 0; i < spacesCount - 1; i++) {\n const { b, st } = bones[i], setupLength = b.length;\n const len = setupLength < PATH_EPSILON ? 0 : setupLength * Math.hypot(st.world.a, st.world.b);\n worldLengths.push(len);\n if (c.spacingMode === \"percent\") spaces[i + 1] = spacing;\n else if (setupLength < PATH_EPSILON) spaces[i + 1] = spacing;\n else if (c.spacingMode === \"proportional\") { spaces[i + 1] = len; sum += len; }\n else spaces[i + 1] = (c.spacingMode === \"length\" ? setupLength + spacing : spacing) * len / setupLength;\n }\n if (c.spacingMode === \"proportional\" && sum > 0) { const f = spacesCount / sum * spacing; for (let i = 1; i < spacesCount; i++) spaces[i] *= f; }\n const total = measuredPathLength(points, att.closed, att.lengths, att.constantSpeed);\n const multiplier = c.spacingMode === \"percent\" ? total : c.spacingMode === \"proportional\" ? total / spacesCount : 1;\n let p = c.positionMode === \"percent\" ? position * total : position;\n const positions: number[] = [];\n for (let i = 0; i < spacesCount; i++) { p += spaces[i] * multiplier; positions.push(p); }\n const samples = samplePath(points, att.closed, att.lengths, att.constantSpeed, positions, false);\n // offset rotation follows the target bone's handedness; chain mode without an offset links bones tip to tail\n const tip = c.rotation === 0 && c.rotateMode === \"chain\";\n let offsetRotation = c.rotation * DEG;\n if (c.rotation !== 0) {\n const slot = skel.doc.slots.find(sl => sl.id === c.target)!, tw = skel.bones.get(slot.bone)!.world;\n if (tw.a * tw.d - tw.b * tw.c < 0) offsetRotation = -offsetRotation;\n }\n let boneX = samples[0].x, boneY = samples[0].y;\n for (let i = 0; i < bones.length; i++) {\n const { b, st } = bones[i];\n let w: Affine = { ...st.world };\n w.tx += (boneX - w.tx) * mixX;\n w.ty += (boneY - w.ty) * mixY;\n const next = samples[i + 1] ?? { x: 0, y: 0, angle: 0 };\n const dx = next.x - boneX, dy = next.y - boneY;\n if (scale) {\n const len = worldLengths[i];\n if (len !== 0) { const f = (Math.hypot(dx, dy) / len - 1) * mixRotate + 1; w.a *= f; w.b *= f; }\n }\n boneX = next.x; boneY = next.y;\n if (mixRotate > 0) {\n const { a, b: bb, c: cc, d } = w;\n let r = (tangents ? samples[i].angle : spaces[i + 1] === 0 ? next.angle : Math.atan2(dy, dx) / DEG) * DEG;\n r -= Math.atan2(bb, a);\n if (tip) {\n const cos = Math.cos(r), sin = Math.sin(r), length = b.length;\n boneX += (length * (cos * a - sin * bb) - dx) * mixRotate;\n boneY += (length * (sin * a + cos * bb) - dy) * mixRotate;\n } else r += offsetRotation;\n if (r > Math.PI) r -= 2 * Math.PI; else if (r < -Math.PI) r += 2 * Math.PI;\n r *= mixRotate;\n const cos = Math.cos(r), sin = Math.sin(r);\n w = { a: cos * a - sin * bb, b: sin * a + cos * bb, c: cos * cc - sin * d, d: sin * cc + cos * d, tx: w.tx, ty: w.ty };\n }\n setEffectiveWorld(skel, b, st, w);\n }\n}\n\n/** total length used for percent positions/spacing: measured on the posed curve (constant speed) or the stored setup lengths */\nfunction measuredPathLength(points: number[], closed: boolean, lengths: number[], constantSpeed: boolean): number {\n const n = points.length / 2, curveCount = closed ? n / 3 : n / 3 - 1;\n if (curveCount < 1) return 0;\n if (!constantSpeed) return pathLength(n, closed, lengths);\n let total = 0;\n for (let i = 0; i < curveCount; i++) {\n const a = ((i * 3 + 1) % n) * 2, c1 = ((i * 3 + 2) % n) * 2, c2 = ((i * 3 + 3) % n) * 2, b = ((i * 3 + 4) % n) * 2;\n let px = points[a], py = points[a + 1];\n for (let k = 1; k <= 4; k++) {\n const t = k / 4, u = 1 - t;\n const x = u * u * u * points[a] + 3 * u * u * t * points[c1] + 3 * u * t * t * points[c2] + t * t * t * points[b];\n const y = u * u * u * points[a + 1] + 3 * u * u * t * points[c1 + 1] + 3 * u * t * t * points[c2 + 1] + t * t * t * points[b + 1];\n total += Math.hypot(x - px, y - py); px = x; py = y;\n }\n }\n return total;\n}\n\n/** the parent's linear part a bone actually inherits under its `inherit` mode */\nfunction inheritedParentLinear(bone: Bone, parent: Affine): Affine {\n switch (bone.inherit) {\n case \"normal\": return { ...parent, tx: 0, ty: 0 };\n case \"onlyTranslation\": return { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 };\n case \"noRotationOrReflection\": {\n // scale along the parent's axes without its rotation; keeps the parent's area scale, drops reflection\n const lenX = Math.hypot(parent.a, parent.b) || 1;\n const det = parent.a * parent.d - parent.b * parent.c;\n return { a: lenX, b: 0, c: 0, d: Math.abs(det) / lenX, tx: 0, ty: 0 };\n }\n case \"noScale\": case \"noScaleOrReflection\": {\n const lenX = Math.hypot(parent.a, parent.b) || 1;\n const ua = parent.a / lenX, ub = parent.b / lenX;\n const det = parent.a * parent.d - parent.b * parent.c;\n const reflect = det < 0 && bone.inherit === \"noScale\" ? -1 : 1; // noScale keeps the parent's reflection\n return { a: ua, b: ub, c: -ub * reflect, d: ua * reflect, tx: 0, ty: 0 };\n }\n }\n}\n\n/** Give a bone the world transform `world`: its effective locals are decomposed relative to the parent (shearX folds into rotation), descendants follow. */\nfunction setEffectiveWorld(skel: Skeleton, bone: Bone, st: BoneState, world: Affine) {\n const parent = bone.parent ? skel.bones.get(bone.parent)!.world : undefined;\n let lin: Affine = world, tx = world.tx, ty = world.ty;\n if (parent) {\n [tx, ty] = apply(invert(parent), world.tx, world.ty);\n lin = mul(invert(inheritedParentLinear(bone, parent)), { ...world, tx: 0, ty: 0 });\n }\n st.x = tx; st.y = ty;\n st.rotation = Math.atan2(lin.b, lin.a) / DEG;\n st.scaleX = Math.hypot(lin.a, lin.b);\n st.scaleY = Math.hypot(lin.c, lin.d);\n st.shearX = 0;\n st.shearY = shortest(Math.atan2(lin.d, lin.c) / DEG - st.rotation - 90);\n updateSubtree(skel, bone.id);\n}\n\n// ---------- attachment geometry ----------\n\n/** skinned or bone-local vertices of a mesh/path attachment in document space, deform offsets applied */\nexport function attachmentWorldVertices(skel: Skeleton, slotId: string, att: MeshAttachment | PathAttachment): number[] {\n const deform = skel.pose.get(pk(\"deform\", att.id, \"vertices\"));\n const off = Array.isArray(deform) && typeof deform[0] === \"number\" ? (deform as number[]) : undefined;\n const out: number[] = [];\n if (att.weights) {\n let k = 0;\n for (const list of att.weights) {\n let x = 0, y = 0;\n for (const inf of list) {\n const w = skel.bones.get(inf.bone)!.world;\n const vx = inf.x + (off ? off[k] : 0), vy = inf.y + (off ? off[k + 1] : 0);\n k += 2;\n x += (w.a * vx + w.c * vy + w.tx) * inf.w; y += (w.b * vx + w.d * vy + w.ty) * inf.w;\n }\n out.push(x, y);\n }\n } else {\n const slot = skel.doc.slots.find(s => s.id === slotId)!, w = skel.bones.get(slot.bone)!.world, v = att.vertices!;\n for (let i = 0; i < v.length; i += 2) {\n const vx = v[i] + (off ? off[i] : 0), vy = v[i + 1] + (off ? off[i + 1] : 0);\n out.push(w.a * vx + w.c * vy + w.tx, w.b * vx + w.d * vy + w.ty);\n }\n }\n return out;\n}\n\n/** image-local (centre-relative) \u2192 document matrix for a region attachment */\nexport function regionMatrix(skel: Skeleton, slotId: string, att: RegionAttachment): Affine {\n const slot = skel.doc.slots.find(s => s.id === slotId)!;\n return mul(skel.bones.get(slot.bone)!.world, affineOf(att.x, att.y, att.rotation, att.scaleX, att.scaleY));\n}\n\nexport function regionSize(doc: RigDocument, att: RegionAttachment): [number, number] {\n const asset = doc.assets.find(a => a.id === att.asset)!;\n return [att.width ?? asset.width, att.height ?? asset.height];\n}\n\n/**\n * Outline of a slot's shown attachment in document space: region \u2192 `samplesPerEdge` points per edge clockwise\n * from the top-left (lattice deform applied), mesh \u2192 hull vertices (or all), path/hidden \u2192 undefined.\n */\nexport function slotOutline(doc: RigDocument, pose: Pose, slotId: string, samplesPerEdge = 1, skel = evaluate(doc, pose)): [number, number][] | undefined {\n if (!doc.slots.some(s => s.id === slotId)) throw new Error(`unknown slot \"${slotId}\"`);\n const att = skel.attachment.get(slotId);\n if (!att) return undefined;\n if (att.type === \"mesh\") {\n const v = attachmentWorldVertices(skel, slotId, att), n = att.hull > 0 ? att.hull : v.length / 2;\n const pts: [number, number][] = [];\n for (let i = 0; i < n; i++) pts.push([v[i * 2], v[i * 2 + 1]]);\n return pts;\n }\n if (att.type === \"path\") return undefined;\n const [w, h] = regionSize(doc, att), m = regionMatrix(skel, slotId, att), pivot: Pivot = { x: 0.5, y: 0.5 };\n const params = deformParams(pose, att.id);\n const offsets = params ? controlOffsets(params, w, h, pivot) : undefined;\n const pts: [number, number][] = [];\n const push = (u: number, v: number) => {\n const [ox, oy] = offsets ? evalPatch(offsets, u, v) : [0, 0];\n pts.push(apply(m, (u - 0.5) * w + ox, (v - 0.5) * h + oy));\n };\n const n = Math.max(1, samplesPerEdge);\n for (let i = 0; i < n; i++) push(i / n, 0);\n for (let i = 0; i < n; i++) push(1, i / n);\n for (let i = 0; i < n; i++) push(1 - i / n, 1);\n for (let i = 0; i < n; i++) push(0, 1 - i / n);\n return pts;\n}\n", "/**\n * rig-mesh \u2014 pure mesh math shared by the registry tools and the editor: outline tracing from alpha, Delaunay\n * triangulation, distance-based auto weights, vertex fitting, deform offsets and the weight brush. No node:*, no DOM.\n */\nimport Delaunator from \"delaunator\";\nimport { affineOf, apply, attachmentWorldVertices, invert, pk, type Affine, type Skeleton } from \"./rig-anim\";\nimport type { RigDocument, MeshAttachment, RegionAttachment, Asset } from \"./rig-format\";\n\nexport interface AlphaMask { width: number; height: number; alpha: Uint8Array }\nexport type Pt = [number, number];\n\n// ---------- outline ----------\n\nexport interface TraceOptions { threshold?: number; tolerance?: number; margin?: number; minIslandRatio?: number }\n\n/**\n * An island smaller than this fraction of the largest one is antialiasing debris or a stray speck, not a part\n * worth its own triangles \u2014 a layer's second real island (the other eye of a closed-eyes overlay) is within a\n * factor of two of the first, while the specks a cut-out leaves behind are three orders of magnitude smaller.\n */\nconst MIN_ISLAND_AREA = 0.05;\n\n/** unit edges around opaque pixels, oriented clockwise on screen, linked into loops (outer loops and holes alike) */\nfunction traceLoops(mask: AlphaMask, threshold: number): Pt[][] {\n const { width: w, height: h, alpha } = mask;\n const solid = (x: number, y: number) => x >= 0 && y >= 0 && x < w && y < h && alpha[y * w + x] >= threshold;\n // directed edges keyed by start point \"x,y\" \u2192 end point; several edges may start at one corner (diagonal touch)\n const edges = new Map<string, Pt[]>();\n const add = (x1: number, y1: number, x2: number, y2: number) => { const k = `${x1},${y1}`; (edges.get(k) ?? edges.set(k, []).get(k)!).push([x2, y2]); };\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {\n if (!solid(x, y)) continue;\n if (!solid(x, y - 1)) add(x, y, x + 1, y);\n if (!solid(x + 1, y)) add(x + 1, y, x + 1, y + 1);\n if (!solid(x, y + 1)) add(x + 1, y + 1, x, y + 1);\n if (!solid(x - 1, y)) add(x, y + 1, x, y);\n }\n if (!edges.size) throw new Error(\"empty alpha: no opaque pixels above the threshold\");\n const loops: Pt[][] = [];\n while (edges.size) {\n const [startKey] = edges.entries().next().value as [string, Pt[]];\n const start = startKey.split(\",\").map(Number) as Pt;\n const loop: Pt[] = [start];\n let cur = start;\n let dirIn: Pt | null = null;\n for (;;) {\n const k = `${cur[0]},${cur[1]}`, list = edges.get(k);\n if (!list || !list.length) break;\n const next = pickNext(cur, list, dirIn);\n if (!list.length) edges.delete(k);\n if (next[0] === start[0] && next[1] === start[1]) break;\n dirIn = [next[0] - cur[0], next[1] - cur[1]];\n loop.push(next); cur = next;\n }\n if (loop.length >= 4) loops.push(loop);\n }\n return loops;\n}\n\n/**\n * Every separate opaque island's outline, simplified and offset, largest first. A layer is not always one blob \u2014\n * a closed-eyes overlay is two strokes, a dashed outfit trim is a dozen \u2014 and meshing only the biggest one drops\n * the rest of the image silently. Holes (a loop wound against the largest loop's orientation, e.g. the inside of\n * a ring) are dropped, as is any island under `MIN_ISLAND_AREA` of the largest.\n */\nexport function traceHulls(mask: AlphaMask, opts: TraceOptions = {}): Pt[][] {\n const { threshold = 8, tolerance = 2, margin = 1, minIslandRatio = MIN_ISLAND_AREA } = opts;\n const loops = traceLoops(mask, threshold).map(l => ({ l, a: signedArea(l) }));\n const biggest = loops.reduce((m, x) => (Math.abs(x.a) > Math.abs(m.a) ? x : m), loops[0]);\n const islands = loops\n .filter(x => Math.sign(x.a) === Math.sign(biggest.a) && Math.abs(x.a) >= minIslandRatio * Math.abs(biggest.a))\n .sort((p, q) => Math.abs(q.a) - Math.abs(p.a)); // stable: equal-area islands keep their tracing order\n return islands.map(({ l }) => { const s = simplify(dropCollinear(l), tolerance); return margin ? offsetPolygon(s, margin) : s; });\n}\n\n/** the outline of the largest opaque island only \u2014 `traceHulls` when every island matters */\nexport function traceHull(mask: AlphaMask, opts: TraceOptions = {}): Pt[] {\n return traceHulls(mask, opts)[0];\n}\n\n/**\n * At a corner where several edges start (a diagonal touch between two regions), several unit steps leave `cur`.\n * Every traced edge keeps the solid region on the same fixed side (rotate the travel direction by +90\u00B0: (dx,dy) \u2192\n * (-dy,dx)); at a plain vertex that's the only outgoing edge, so this is a no-op. At a branch point, prefer \u2014 in\n * order \u2014 the step that turns toward that side (hugs the region tightest), then straight ahead, then away, then\n * back, so two regions that meet only at a point are traced as two separate loops instead of one figure-eight.\n * The first edge of a loop has no incoming direction (`dirIn === null`): any outgoing edge is a valid start.\n */\nfunction pickNext(cur: Pt, list: Pt[], dirIn: Pt | null): Pt {\n if (list.length === 1 || !dirIn) return list.pop()!;\n const rotate = (d: Pt, sign: 1 | -1): Pt => (sign > 0 ? [-d[1], d[0]] : [d[1], -d[0]]);\n const priority: Pt[] = [rotate(dirIn, 1), dirIn, rotate(dirIn, -1), [-dirIn[0], -dirIn[1]]];\n for (const want of priority) {\n const idx = list.findIndex(p => p[0] - cur[0] === want[0] && p[1] - cur[1] === want[1]);\n if (idx >= 0) return list.splice(idx, 1)[0];\n }\n return list.pop()!;\n}\n\nexport function signedArea(p: Pt[]): number { let a = 0; for (let i = 0; i < p.length; i++) { const [x1, y1] = p[i], [x2, y2] = p[(i + 1) % p.length]; a += x1 * y2 - x2 * y1; } return a / 2; }\nfunction dropCollinear(p: Pt[]): Pt[] {\n return p.filter((_, i) => { const a = p[(i + p.length - 1) % p.length], b = p[i], c = p[(i + 1) % p.length]; return (b[0] - a[0]) * (c[1] - b[1]) - (b[1] - a[1]) * (c[0] - b[0]) !== 0; });\n}\n/** Douglas\u2013Peucker on a closed ring: split at the two farthest-apart points, simplify both halves */\nfunction simplify(ring: Pt[], tol: number): Pt[] {\n if (tol <= 0 || ring.length <= 4) return ring;\n let a = 0, b = 0, best = -1;\n for (let i = 0; i < ring.length; i++) for (let j = i + 1; j < ring.length; j++) { const d = (ring[i][0] - ring[j][0]) ** 2 + (ring[i][1] - ring[j][1]) ** 2; if (d > best) { best = d; a = i; b = j; } }\n const seg1 = ring.slice(a, b + 1), seg2 = [...ring.slice(b), ...ring.slice(0, a + 1)];\n const out = [...dp(seg1, tol).slice(0, -1), ...dp(seg2, tol).slice(0, -1)];\n return out.length >= 3 ? out : ring;\n}\nfunction dp(pts: Pt[], tol: number): Pt[] {\n if (pts.length < 3) return pts;\n const [x1, y1] = pts[0], [x2, y2] = pts[pts.length - 1];\n let idx = 0, dmax = 0;\n for (let i = 1; i < pts.length - 1; i++) { const d = segDist(pts[i][0], pts[i][1], x1, y1, x2, y2); if (d > dmax) { dmax = d; idx = i; } }\n if (dmax <= tol) return [pts[0], pts[pts.length - 1]];\n return [...dp(pts.slice(0, idx + 1), tol).slice(0, -1), ...dp(pts.slice(idx), tol)];\n}\nfunction segDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n const dx = x2 - x1, dy = y2 - y1, l2 = dx * dx + dy * dy;\n const t = l2 ? Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / l2)) : 0;\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n/** push every vertex outward along its angle bisector by `m` px (mitre, clamped to 2m) */\nfunction offsetPolygon(p: Pt[], m: number): Pt[] {\n const out = signedArea(p) > 0 ? 1 : -1;\n return p.map((b, i) => {\n const a = p[(i + p.length - 1) % p.length], c = p[(i + 1) % p.length];\n const n1 = normal(a, b, out), n2 = normal(b, c, out);\n let nx = n1[0] + n2[0], ny = n1[1] + n2[1];\n const l = Math.hypot(nx, ny) || 1; nx /= l; ny /= l;\n const dot = Math.max(0.5, nx * n1[0] + ny * n1[1]);\n return [b[0] + nx * m / dot, b[1] + ny * m / dot];\n });\n}\nconst normal = (a: Pt, b: Pt, out: number): Pt => { const dx = b[0] - a[0], dy = b[1] - a[1], l = Math.hypot(dx, dy) || 1; return [out * dy / l, -out * dx / l]; };\n\nexport function pointInPolygon(poly: Pt[], x: number, y: number): boolean {\n let inside = false;\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const [xi, yi] = poly[i], [xj, yj] = poly[j];\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) inside = !inside;\n }\n return inside;\n}\nexport function distanceToPolygon(poly: Pt[], x: number, y: number): number {\n let d = Infinity;\n for (let i = 0; i < poly.length; i++) { const a = poly[i], b = poly[(i + 1) % poly.length]; d = Math.min(d, segDist(x, y, a[0], a[1], b[0], b[1])); }\n return d;\n}\n\n// ---------- triangulation ----------\n\nexport function interiorPoints(hull: Pt[], spacing: number): Pt[] {\n const xs = hull.map(p => p[0]), ys = hull.map(p => p[1]);\n const x0 = Math.min(...xs), x1 = Math.max(...xs), y0 = Math.min(...ys), y1 = Math.max(...ys);\n const nx = Math.max(1, Math.round((x1 - x0) / spacing)), ny = Math.max(1, Math.round((y1 - y0) / spacing));\n const out: Pt[] = [];\n for (let j = 0; j <= ny; j++) for (let i = 0; i <= nx; i++) {\n const x = x0 + ((x1 - x0) * i) / nx, y = y0 + ((y1 - y0) * j) / ny;\n if (pointInPolygon(hull, x, y) && distanceToPolygon(hull, x, y) >= spacing / 2) out.push([x, y]);\n }\n return out;\n}\n\n/** hull edges longer than `spacing` are subdivided so the outline survives Delaunay; outside triangles are culled */\nexport function triangulate(hull: Pt[], interior: Pt[], spacing: number): { vertices: number[]; triangles: number[]; hull: number } {\n const ring: Pt[] = [];\n for (let i = 0; i < hull.length; i++) {\n const a = hull[i], b = hull[(i + 1) % hull.length], n = Math.max(1, Math.ceil(Math.hypot(b[0] - a[0], b[1] - a[1]) / spacing));\n for (let k = 0; k < n; k++) ring.push([a[0] + ((b[0] - a[0]) * k) / n, a[1] + ((b[1] - a[1]) * k) / n]);\n }\n const pts = [...ring, ...interior];\n const flat = pts.flat();\n const d = new Delaunator(flat);\n const triangles: number[] = [];\n for (let i = 0; i < d.triangles.length; i += 3) {\n const a = d.triangles[i], b = d.triangles[i + 1], c = d.triangles[i + 2];\n const cx = (flat[2 * a] + flat[2 * b] + flat[2 * c]) / 3, cy = (flat[2 * a + 1] + flat[2 * b + 1] + flat[2 * c + 1]) / 3;\n if (pointInPolygon(hull, cx, cy)) triangles.push(a, b, c);\n }\n return { vertices: flat, triangles, hull: ring.length };\n}\n\n// ---------- folds ----------\n\n/** `minArea`: ignore a flipped triangle whose rest-pose area (px\u00B2) is below this \u2014 hairline slivers flip sign from\n * rounding noise alone and aren't a real fold. Default 0 keeps every flip (the pre-existing behaviour). */\nexport function foldedTriangles(rest: number[], world: number[], triangles: number[], minArea = 0): number[] {\n const out: number[] = [];\n for (let i = 0; i < triangles.length; i += 3) {\n const r = triangleArea(rest, triangles[i], triangles[i + 1], triangles[i + 2]), w = triangleArea(world, triangles[i], triangles[i + 1], triangles[i + 2]);\n if (r !== 0 && w !== 0 && Math.sign(r) !== Math.sign(w) && Math.abs(r) >= minArea) out.push(i / 3);\n }\n return out;\n}\n\n/** signed area of triangle (a, b, c) of a flat [x, y, \u2026] vertex array \u2014 negative when it winds the other way */\nexport const triangleArea = (v: number[], a: number, b: number, c: number) =>\n ((v[2 * b] - v[2 * a]) * (v[2 * c + 1] - v[2 * a + 1]) - (v[2 * b + 1] - v[2 * a + 1]) * (v[2 * c] - v[2 * a])) / 2;\n\n/** total area of a mesh's triangles in the given vertex positions \u2014 the denominator for \"how much of it folded\" */\nexport function meshArea(vertices: number[], triangles: number[]): number {\n let total = 0;\n for (let i = 0; i < triangles.length; i += 3) total += Math.abs(triangleArea(vertices, triangles[i], triangles[i + 1], triangles[i + 2]));\n return total;\n}\n\n// ---------- mesh from image / auto weights ----------\n\n/**\n * World positions of a mesh's REST shape under the given skeleton \u2014 `attachmentWorldVertices` with the pose's\n * deform offsets left out, which is what auto-weighting and the weight brush measure distances against (a mesh\n * is skinned to where its rest vertices are, not to where a deform key happens to have pushed them).\n */\nexport function meshWorldVertices(skel: Skeleton, slotId: string, att: MeshAttachment): number[] {\n const key = pk(\"deform\", att.id, \"vertices\");\n if (!skel.pose.has(key)) return attachmentWorldVertices(skel, slotId, att);\n const pose = new Map(skel.pose);\n pose.delete(key);\n return attachmentWorldVertices({ ...skel, pose }, slotId, att);\n}\n\n/** 6 decimals, the precision rest shapes, weights and deform offsets are written at \u2014 what rig.json keeps\n * (`+ 0` turns a rounded -0 back into 0). Shared with the registry tools, the editor's gizmos and verify-mesh. */\nexport const round6 = (v: number) => +v.toFixed(6) + 0;\n\n/**\n * region \u2192 mesh over already-traced islands: each island is filled with an interior grid and triangulated on its\n * own, then the islands are concatenated with their triangle indices offset. uvs are x/imgW, y/imgH; vertices are\n * slot-bone local, through the region placement.\n * `hull` (the leading vertices that form THE outline) only makes sense for a single island, so a multi-island\n * mesh reports 0 \u2014 consumers then treat every vertex as outline, which is right when there is more than one.\n */\nexport function meshFromIslands(islands: Pt[][], region: RegionAttachment, asset: Asset, mask: { width: number; height: number }, spacing = 24): MeshAttachment {\n const w = region.width ?? asset.width, h = region.height ?? asset.height;\n const place: Affine = affineOf(region.x, region.y, region.rotation, region.scaleX, region.scaleY);\n const uvs: number[] = [], vertices: number[] = [], triangles: number[] = [];\n let hull = 0;\n for (const island of islands) {\n const tri = triangulate(island, interiorPoints(island, spacing), spacing);\n const offset = uvs.length / 2;\n for (let i = 0; i < tri.vertices.length; i += 2) {\n const u = tri.vertices[i] / mask.width, v = tri.vertices[i + 1] / mask.height;\n uvs.push(round6(u), round6(v));\n const [x, y] = apply(place, (u - 0.5) * w, (v - 0.5) * h);\n vertices.push(round6(x), round6(y));\n }\n for (const t of tri.triangles) triangles.push(t + offset);\n if (islands.length === 1) hull = tri.hull;\n }\n return {\n id: region.id, slot: region.slot, type: \"mesh\", asset: region.asset,\n uvs, triangles, vertices, hull,\n ...(region.width ? { width: region.width } : {}),\n ...(region.height ? { height: region.height } : {}),\n };\n}\n\n/** region \u2192 mesh: every opaque island's outline + an interior grid, triangulated (see `traceHulls`, `meshFromIslands`) */\nexport function meshFromMask(\n mask: AlphaMask,\n region: RegionAttachment,\n asset: Asset,\n opts: { spacing?: number; tolerance?: number; margin?: number; threshold?: number } = {},\n): MeshAttachment {\n const { spacing, ...trace } = opts;\n return meshFromIslands(traceHulls(mask, trace), region, asset, mask, spacing);\n}\n\n/** `radius` is the falloff's distance scale, in world px \u2014 see `autoWeights` */\nexport interface AutoWeightsOptions { bones: string[]; radius: number; maxInfluences: number }\n/** normalized weights below this are dropped rather than kept as a dead influence that rounds to 0 in the file */\nexport const MIN_AUTO_WEIGHT = 1e-6;\n\n/** default candidates: the slot's bone, its parent, its direct children */\nexport function defaultWeightBones(doc: RigDocument, slotId: string): string[] {\n const slot = doc.slots.find(s => s.id === slotId);\n if (!slot) throw new Error(`unknown slot \"${slotId}\"`);\n const bone = doc.bones.find(b => b.id === slot.bone)!;\n return [...new Set([bone.id, ...(bone.parent ? [bone.parent] : []), ...doc.bones.filter(b => b.parent === bone.id).map(b => b.id)])];\n}\n\n/**\n * Inverse-distance skinning. For every vertex: the distance `d` to each candidate bone's segment (joint \u2192 joint +\n * length along x; length 0 = a point), weight `1 / (d/radius + 1)\u00B2`, top-K by weight, normalized; influences hold\n * the vertex in each bone's local space.\n *\n * `radius` scales the falloff: it is the distance, in world px, at which the weight has fallen to 1/4 of its\n * value at the joint. `1` reproduces the historical law `1 / (d + 1px)\u00B2` exactly \u2014 which is why it is the\n * default, and omitting `radius` changes nothing. A larger radius flattens the curve, so bones farther away keep\n * a meaningful share; a smaller one sharpens it, so the nearest bone dominates within a few px.\n *\n * There is deliberately no cutoff at any radius: every candidate bone keeps a nonzero share, however far past\n * `radius` it sits. A hard cutoff is what this replaced, and it was worse than useless \u2014 the middle of a limb\n * sat beyond `radius` of both of its joints (the old default was half the mesh's extent), so it had no bone in\n * range at all and had to snap to its single nearest bone at w=1; neighbouring vertices snapping to *different*\n * bones is a hard seam with no blend, and it flips the triangles between them as soon as those bones\n * counter-rotate.\n */\nexport function autoWeights(doc: RigDocument, skel: Skeleton, att: MeshAttachment, opts: AutoWeightsOptions): MeshAttachment {\n if (!opts.bones.length) throw new Error(\"autoWeights: at least one candidate bone is required\");\n if (!(opts.radius > 0)) throw new Error(\"autoWeights: radius must be > 0\");\n if (!(opts.maxInfluences >= 1)) throw new Error(\"autoWeights: maxInfluences must be >= 1\");\n const world = meshWorldVertices(skel, att.slot, att);\n const segs: { id: string; x1: number; y1: number; x2: number; y2: number; inv: Affine }[] = opts.bones.map(id => {\n const b = doc.bones.find(x => x.id === id), st = skel.bones.get(id);\n if (!b || !st) throw new Error(`unknown bone \"${id}\"`);\n const [ex, ey] = apply(st.world, b.length, 0);\n return { id, x1: st.world.tx, y1: st.world.ty, x2: ex, y2: ey, inv: invert(st.world) };\n });\n const weights: NonNullable<MeshAttachment[\"weights\"]> = [];\n for (let i = 0; i < world.length; i += 2) {\n const x = world[i], y = world[i + 1];\n const distances = segs.map(s => ({ s, d: segDist(x, y, s.x1, s.y1, s.x2, s.y2) })).sort((a, b) => a.d - b.d);\n // inverse-distance with a falloff scale: `radius` is the distance at which the weight has fallen to 1/4.\n // There is no cutoff \u2014 a hard edge is what produced the seams and folds described above.\n const cands = distances\n .slice(0, opts.maxInfluences)\n .map(c => ({ s: c.s, w: 1 / (c.d / opts.radius + 1) ** 2 }));\n const sum = cands.reduce((s, c) => s + c.w, 0);\n const kept = cands.filter(c => c.w / sum >= MIN_AUTO_WEIGHT);\n const total = kept.reduce((s, c) => s + c.w, 0);\n weights.push(kept.map(c => { const [lx, ly] = apply(c.s.inv, x, y); return { bone: c.s.id, x: round6(lx), y: round6(ly), w: round6(c.w / total) }; }));\n }\n const { vertices: _drop, ...rest } = att;\n return { ...rest, weights };\n}\n\n// ---------- vertex fitting, deform offsets, weight brush ----------\n\n/**\n * What the fitting and deform math below actually reads: the slot the points live in, plus the `VertexData` a\n * mesh and a PATH carry identically (`vertices`, or `weights` skinned to bones). Neither cares which of the two\n * it was handed \u2014 a path attachment is skinned exactly like a mesh, vertex for vertex.\n */\nexport type VertexAttachment = Pick<MeshAttachment, \"slot\" | \"vertices\" | \"weights\">;\n/** one rest shape, never both \u2014 what a vertex gesture commits and what `rig_set_mesh` / `rig_set_path_attachment` take */\nexport type VertexPatch = { vertices: number[]; weights?: undefined } | { weights: NonNullable<MeshAttachment[\"weights\"]>; vertices?: undefined };\n\n/**\n * How many CONTROL POINTS a mesh or a path holds: one influence list each when skinned, two numbers of\n * `vertices` each when not. The same count for both shapes, in one place \u2014 the gizmo, the anchor tool, the tree's\n * delete and the properties panel all ask it, and a copy that got the weighted branch wrong would read half a\n * skinned path as a whole one.\n */\nexport const vertexCount = (att: Pick<VertexAttachment, \"vertices\" | \"weights\">) =>\n att.weights ? att.weights.length : (att.vertices?.length ?? 0) / 2;\n\n/**\n * New local data so the attachment's vertices sit at `targetWorld` (flat, all vertices) under `skel`:\n * `vertices` \u2192 slot-bone local; `weights` \u2192 every influence's x,y re-expressed in its bone.\n *\n * @deprecated Not the way to MOVE a vertex \u2014 `deformOffsetsFor` plus `VertexGizmo.shift` is, and this has no\n * caller left in the project. Kept for a future \"normalize this attachment's vertices to these positions\", which\n * is what it actually is; every gesture that reached for it collapsed the per-bone spread instead.\n *\n * A skinned vertex's influences do not\n * generally agree on where it is (Spine's rarely do, and `blendInfluences` disagrees on purpose), and re-deriving\n * them all from one world point throws that spread away for a position that only matches in the pose `skel` is\n * in \u2014 measured at 489 px of animated drift on `ross`'s `n_fur` for a 0.01 px setup nudge.\n */\nexport function fitVertices(skel: Skeleton, att: VertexAttachment, targetWorld: number[]): VertexPatch {\n if (att.weights) {\n const inv = new Map<string, Affine>();\n const invOf = (id: string) => inv.get(id) ?? inv.set(id, invert(skel.bones.get(id)!.world)).get(id)!;\n return { weights: att.weights.map((list, i) => list.map(inf => { const [x, y] = apply(invOf(inf.bone), targetWorld[2 * i], targetWorld[2 * i + 1]); return { ...inf, x: round6(x), y: round6(y) }; })) };\n }\n const slot = skel.doc.slots.find(s => s.id === att.slot)!, inv = invert(skel.bones.get(slot.bone)!.world);\n const vertices: number[] = [];\n for (let i = 0; i < targetWorld.length; i += 2) { const [x, y] = apply(inv, targetWorld[i], targetWorld[i + 1]); vertices.push(round6(x), round6(y)); }\n return { vertices };\n}\n\n/** flat offset length for an attachment: 2\u00B7n unweighted, 2\u00B7\u03A3 influences weighted */\nexport const deformLength = (att: VertexAttachment) => att.weights ? 2 * att.weights.reduce((s, l) => s + l.length, 0) : (att.vertices?.length ?? 0);\n/** linear part of an inverse: map a world direction into a bone's local direction */\nconst localDelta = (world: Affine, dx: number, dy: number): [number, number] => { const m = invert(world); return [m.a * dx + m.c * dy, m.b * dx + m.d * dy]; };\n\n/** deform offsets (format of the `vertices` key) that move vertex `index` by `worldDelta`, starting from `base` (or zeros) */\nexport function deformOffsetsFor(skel: Skeleton, att: VertexAttachment, base: number[] | undefined, index: number, worldDelta: [number, number]): number[] {\n if (base && base.length !== deformLength(att)) throw new Error(`deformOffsetsFor: base.length (${base.length}) must equal deformLength(att) (${deformLength(att)})`);\n const out = base ? base.slice() : new Array(deformLength(att)).fill(0);\n if (att.weights) {\n let k = 0;\n for (let i = 0; i < index; i++) k += 2 * att.weights[i].length;\n for (const inf of att.weights[index]) { const [dx, dy] = localDelta(skel.bones.get(inf.bone)!.world, worldDelta[0], worldDelta[1]); out[k] = out[k] + dx; out[k + 1] = out[k + 1] + dy; k += 2; }\n } else {\n const slot = skel.doc.slots.find(s => s.id === att.slot)!;\n const [dx, dy] = localDelta(skel.bones.get(slot.bone)!.world, worldDelta[0], worldDelta[1]);\n out[2 * index] = out[2 * index] + dx; out[2 * index + 1] = out[2 * index + 1] + dy;\n }\n return out;\n}\n\nexport interface BrushOptions { bone: string; center: [number, number]; radius: number; strength: number; maxInfluences: number; slotBone: string }\n/**\n * Below this fraction a bone is pure noise: dropped instead of kept alive through renormalization. The falloff\n * `1 - d/radius` only reaches exactly 0 at `d === radius`, so a single \"remove everything\" stroke leaves a\n * residual of `d/radius` on a bone that was a vertex's sole influence (see the singleton branch below) \u2014 e.g.\n * at `radius: 1e6` a vertex 155px from the brush centre leaves a residual of ~1.55e-4. `1e-3` clears that with\n * margin while staying two orders of magnitude below any deliberately painted weight (the lightest weight any\n * test here paints is > 0.3); `1e-4` is tighter than the residual a single realistic-but-large stroke can\n * leave behind and would need a second stroke to clear it.\n */\nconst MIN_WEIGHT = 1e-3;\n/** add strength\u00B7(1 \u2212 d/radius) of `bone` to vertices within radius (negative strength removes), renormalize, keep top-K; a vertex left without influences gets the slot bone at 1 */\nexport function paintWeights(skel: Skeleton, att: MeshAttachment, world: number[], opts: BrushOptions): MeshAttachment {\n const lists = att.weights ?? att.vertices!.reduce<MeshAttachment[\"weights\"] & {}>((acc, _, i) => { if (i % 2 === 0) acc.push([{ bone: opts.slotBone, w: 1, x: att.vertices![i], y: att.vertices![i + 1] }]); return acc; }, []);\n const inv = new Map<string, Affine>();\n const local = (id: string, x: number, y: number) => apply(inv.get(id) ?? inv.set(id, invert(skel.bones.get(id)!.world)).get(id)!, x, y);\n const weights = lists.map((list, i) => {\n const x = world[2 * i], y = world[2 * i + 1], d = Math.hypot(x - opts.center[0], y - opts.center[1]);\n if (d >= opts.radius) return list;\n const f = opts.strength * (1 - d / opts.radius);\n const cur = list.find(l => l.bone === opts.bone)?.w ?? 0;\n const next = Math.max(0, Math.min(1, cur + f));\n if (next === cur) return list;\n let others = list.filter(l => l.bone !== opts.bone);\n // The stroke reduces `bone`'s weight and it's the vertex's only influence: there's nothing else to\n // redistribute into, so dividing the leftover by itself at the final normalize would snap it straight\n // back to 1 and the bone could never be removed. Give the weight it lost to the slot bone instead \u2014 the\n // mesh's rest position \u2014 unless `bone` already *is* the slot bone, in which case there's truly nothing\n // to hand the weight to and the stroke is a no-op (the last influence can't be removed).\n if (next < cur && others.length === 0) {\n if (opts.bone === opts.slotBone) return list;\n const [slx, sly] = local(opts.slotBone, x, y);\n others = [{ bone: opts.slotBone, x: round6(slx), y: round6(sly), w: 1 - next }];\n }\n const otherSum = others.reduce((s, l) => s + l.w, 0);\n const scale = otherSum > 1e-9 ? (1 - next) / otherSum : 0;\n let out = others.map(l => ({ ...l, w: l.w * scale }));\n if (next > MIN_WEIGHT) { const [lx, ly] = local(opts.bone, x, y); out.push({ bone: opts.bone, x: round6(lx), y: round6(ly), w: next }); }\n out = out.filter(l => l.w > MIN_WEIGHT).sort((a, b) => b.w - a.w).slice(0, opts.maxInfluences);\n const sum = out.reduce((s, l) => s + l.w, 0);\n if (!out.length || sum < MIN_WEIGHT) { const [lx, ly] = local(opts.slotBone, x, y); return [{ bone: opts.slotBone, x: round6(lx), y: round6(ly), w: 1 }]; }\n return out.map(l => ({ ...l, w: round6(l.w / sum) }));\n });\n const { vertices: _v, ...rest } = att;\n return { ...rest, weights };\n}\n", "/**\n * rig-path \u2014 pure geometry for path attachments: splitting a curve without changing its shape, blending\n * influence lists, curve lengths and hit-testing. Shared by the registry tools and the editor. No node:*, no DOM.\n *\n * Control-point layout, fixed by the format and verified against spine-core: vertex i*3+1 is anchor i, its\n * triple is [cPrev, p, cNext], and curve i runs p_i \u2192 cNext_i \u2192 cPrev_{i+1} \u2192 p_{i+1}. The index wrapping a\n * CLOSED path needs is taken from `samplePath` (rig-anim.ts) rather than derived again here: that sampler is\n * pinned against the spine-core runtime, so it is what these control points mean.\n */\nimport type { Pt } from \"./rig-constraints\";\nimport type { Influence } from \"./rig-format\";\nimport { MIN_AUTO_WEIGHT, round6 } from \"./rig-mesh\";\n\n/** flat [x, y, \u2026] \u2194 point pairs \u2014 the format stores flat arrays, the geometry below reads points */\nexport const toPoints = (flat: number[]): Pt[] => {\n const out: Pt[] = [];\n for (let i = 0; i + 1 < flat.length; i += 2) out.push([flat[i], flat[i + 1]]);\n return out;\n};\nexport const flatten = (pts: Pt[]): number[] => pts.flatMap(p => [p[0], p[1]]);\n\n/** anchors of a path: the vertices at 1, 4, 7, \u2026 (`vertexCount` counts POINTS, not numbers) */\nexport const anchorCount = (vertexCount: number): number => Math.floor(vertexCount / 3);\n/** curves of a path: one per anchor when closed (the last wraps), one fewer when open */\nexport const curveCount = (vertexCount: number, closed: boolean): number =>\n closed ? anchorCount(vertexCount) : anchorCount(vertexCount) - 1;\n\nconst lerp = (a: Pt, b: Pt, t: number): Pt => [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t];\n\n/** the four control points of curve `i` \u2014 p_i, cNext_i, cPrev_{i+1}, p_{i+1} \u2014 wrapped exactly as `samplePath` wraps them */\nfunction curveOf(worldPoints: number[], i: number): [Pt, Pt, Pt, Pt] {\n const n = worldPoints.length / 2;\n const at = (k: number): Pt => { const j = (k % n) * 2; return [worldPoints[j], worldPoints[j + 1]]; };\n return [at(i * 3 + 1), at(i * 3 + 2), at(i * 3 + 3), at(i * 3 + 4)];\n}\n\n/** point on the cubic bezier through p0..p3 at parameter t */\nexport function bezierPointAt(p0: Pt, p1: Pt, p2: Pt, p3: Pt, t: number): Pt {\n const u = 1 - t;\n return [\n u * u * u * p0[0] + 3 * u * u * t * p1[0] + 3 * u * t * t * p2[0] + t * t * t * p3[0],\n u * u * u * p0[1] + 3 * u * u * t * p1[1] + 3 * u * t * t * p2[1] + t * t * t * p3[1],\n ];\n}\n\n/** cubic bezier length, approximated by 8 chords (the curve bulges outward, so this runs a few % longer than the straight p0\u2192p3 chord) */\nexport function bezierLength(p0: Pt, p1: Pt, p2: Pt, p3: Pt, chords = 8): number {\n let len = 0, prev = p0;\n for (let k = 1; k <= chords; k++) {\n const pt = bezierPointAt(p0, p1, p2, p3, k / chords);\n len += Math.hypot(pt[0] - prev[0], pt[1] - prev[1]);\n prev = pt;\n }\n return len;\n}\n\n/** the point of curve `i` at parameter `t`, in whatever space `worldPoints` are given in (same wrapping as `samplePath`) */\nexport const pathPointAt = (worldPoints: number[], i: number, t: number): Pt => bezierPointAt(...curveOf(worldPoints, i), t);\n\n/**\n * Cumulative curve lengths of a path in the space its points are given in \u2014 one entry per curve, which is the\n * convention `pathFromPoints` writes. (A Spine-imported OPEN path carries one entry more; `pathLength` reads\n * `lengths` by curve index, so shortening to one-per-curve loses nothing, and with `constantSpeed` on the\n * runtime measures the posed curve and never reads these at all.)\n */\nexport function curveLengths(worldPoints: number[], closed: boolean): number[] {\n const out: number[] = [];\n let acc = 0;\n for (let i = 0, n = curveCount(worldPoints.length / 2, closed); i < n; i++) {\n const [p0, c1, c2, p3] = curveOf(worldPoints, i);\n acc += bezierLength(p0, c1, c2, p3);\n out.push(round6(acc));\n }\n return out;\n}\n\n/**\n * De Casteljau split of curve `i` at `t`: the five control points the split changes or adds, in world space.\n * The two halves p0 \u2192 a \u2192 d \u2192 f and f \u2192 e \u2192 c \u2192 p3 are, together, the ORIGINAL curve \u2014 exactly, not to some\n * tolerance \u2014 so inserting an anchor this way moves nothing that was already drawn.\n *\n * `coeffs` are the affine coefficients of those five points over the curve's own four control points\n * `[p_i, cNext_i, cPrev_{i+1}, p_{i+1}]`, in the order `[cNextI, triple[0], triple[1], triple[2], cPrevNext]`.\n * Each row sums to 1 and is non-negative for t in (0, 1), so a WEIGHTED path can rebuild the five influence\n * lists from the four it already has (`blendInfluences`) and stay skinned to the same bones.\n */\nexport function splitCurve(worldPoints: number[], closed: boolean, i: number, t: number):\n { cNextI: Pt; triple: [Pt, Pt, Pt]; cPrevNext: Pt; coeffs: number[][] } {\n const n = curveCount(worldPoints.length / 2, closed);\n if (!Number.isInteger(i) || i < 0 || i >= n) throw new Error(`splitCurve: curve ${i} is out of range (${n} curves)`);\n const [p0, c1, c2, p3] = curveOf(worldPoints, i);\n const a = lerp(p0, c1, t), b = lerp(c1, c2, t), c = lerp(c2, p3, t);\n const d = lerp(a, b, t), e = lerp(b, c, t), f = lerp(d, e, t);\n // curve i becomes p0 \u2192 a \u2192 d \u2192 f, then f \u2192 e \u2192 c \u2192 p3: the union is the original curve, exactly\n return { cNextI: a, triple: [d, f, e], cPrevNext: c, coeffs: [\n [1 - t, t, 0, 0], // a\n [(1 - t) ** 2, 2 * t * (1 - t), t * t, 0], // d\n [(1 - t) ** 3, 3 * t * (1 - t) ** 2, 3 * t * t * (1 - t), t ** 3], // f\n [0, (1 - t) ** 2, 2 * t * (1 - t), t * t], // e\n [0, 0, 1 - t, t], // c\n ] };\n}\n\n/**\n * Apply a `splitCurve` to a list with ONE ENTRY PER CONTROL POINT: `cNext_i` and `cPrev_{i+1}` are replaced\n * (the split moves them) and the new anchor's `[cPrev, p, cNext]` triple goes in between. The point array, the\n * local `vertices` and the `weights` lists are all this shape and must stay in step, so they share this.\n * On a closed path the last curve's `cPrev_{i+1}` is entry 0 and the triple appends at the end \u2014 the same\n * wrapping `curveOf` reads the curve with.\n */\nexport function insertTriple<T>(items: T[], i: number, cNextI: T, triple: [T, T, T], cPrevNext: T): T[] {\n const n = items.length;\n const out = items.slice();\n out[(i * 3 + 2) % n] = cNextI;\n out[(i * 3 + 3) % n] = cPrevNext;\n out.splice(i * 3 + 3, 0, ...triple); // not wrapped: on the last curve of a closed path this appends\n return out;\n}\n\n/** drop anchor `i`'s whole `[cPrev, p, cNext]` triple from a per-control-point list */\nexport function removeTriple<T>(items: T[], i: number): T[] {\n const out = items.slice();\n out.splice(i * 3, 3);\n return out;\n}\n\n/**\n * Blend skinned control points by affine coefficients: the WHOLE influence list, positions included.\n *\n * Under linear blend skinning a control point sits at `P_k = \u03A3_j w_kj \u00B7 W_j(q_kj)`, so the affine combination\n * `P' = \u03A3_k c_k \u00B7 P_k` expands \u2014 every bone matrix `W_j` being affine \u2014 into a control point of the same form:\n *\n * w'_j = \u03A3_k c_k \u00B7 w_kj q'_j = \u03A3_k c_k \u00B7 w_kj \u00B7 q_kj / w'_j\n *\n * That is an identity in the bone matrices, so the blended point follows `P'` in EVERY pose, which is the only\n * thing worth having: a split anchor that is right at rest and wrong the moment the bones move has preserved\n * nothing. Mapping the blended WORLD point back through each bone's inverse instead \u2014 what `fitVertices` does,\n * correctly, for its own job of fitting existing influences to one target position \u2014 agrees with this only\n * where the bones stand in their setup pose. On ross's posed tail that route drifts by ~50 px.\n *\n * `coeffs` must sum to 1 (affine, not linear) and each source list must already be normalized.\n */\nexport function blendInfluences(sources: Influence[][], coeffs: number[]): Influence[] {\n if (sources.length !== coeffs.length) throw new Error(`blendInfluences: ${sources.length} source lists but ${coeffs.length} coefficients`);\n const acc = new Map<string, { x: number; y: number; w: number }>();\n sources.forEach((list, k) => {\n for (const inf of list) {\n const a = acc.get(inf.bone) ?? acc.set(inf.bone, { x: 0, y: 0, w: 0 }).get(inf.bone)!;\n const cw = coeffs[k] * inf.w;\n a.x += cw * inf.x; a.y += cw * inf.y; a.w += cw;\n }\n });\n const total = [...acc.values()].reduce((s, a) => s + a.w, 0);\n if (!(total > 0)) throw new Error(\"blendInfluences: the blended weights sum to zero\");\n // below MIN_AUTO_WEIGHT a bone rounds to 0 in the file anyway \u2014 a dead influence, not a share of the point\n const kept = [...acc].filter(([, a]) => a.w / total >= MIN_AUTO_WEIGHT);\n const sum = kept.reduce((s, [, a]) => s + a.w, 0);\n // the position divides by the bone's OWN unnormalized share \u2014 the same `\u03A3 c\u00B7w` that accumulated its numerator.\n // Only the weight is renormalized, and only when the filter above dropped a bone (otherwise `sum` is already 1).\n return kept.map(([bone, a]) => ({ bone, x: round6(a.x / a.w), y: round6(a.y / a.w), w: round6(a.w / sum) }));\n}\n\n/**\n * The DEFORM OFFSETS of a blended control point \u2014 the same `\u03A3 c\u00B7w\u00B7d / w'` its rest positions get, and for the\n * same reason. An offset adds to the stored position INSIDE each bone's frame (`attachmentWorldVertices` poses\n * `q_kj + d_kj`), so a deformed control point is `\u03A3_j w_kj \u00B7 W_j(q_kj + d_kj)`; running the derivation in\n * `blendInfluences` over that instead of over `q` alone gives back the very same identity with `q + d` in place\n * of `q`, and subtracting the rest half leaves `d'_j = \u03A3_k c_k\u00B7w_kj\u00B7d_kj / w'_j`. The blended anchor therefore\n * sits on the DEFORMED curve in every pose exactly as its rest position sits on the rest curve \u2014 and, the blend\n * being linear in `d`, at every time between two keys as well, not only on them.\n *\n * `sources` are the same four influence lists the positions blend from and `chunks` their offset pairs in the\n * same order, so the result is aligned to `blendInfluences(sources, coeffs)` influence for influence: the weights\n * decide which bones survive and in what order, and they are identical in both calls.\n */\nexport function blendOffsets(sources: Influence[][], chunks: number[][], coeffs: number[]): number[] {\n const asOffsets = sources.map((list, k) => list.map((inf, j) => ({ ...inf, x: chunks[k][2 * j] ?? 0, y: chunks[k][2 * j + 1] ?? 0 })));\n return blendInfluences(asOffsets, coeffs).flatMap(i => [i.x, i.y]);\n}\n\n/** the same blend for an UNWEIGHTED path, where a control point is one pair in the slot bone's space */\nexport const blendPairs = (chunks: number[][], coeffs: number[]): number[] =>\n [0, 1].map(c => round6(coeffs.reduce((sum, k, i) => sum + k * (chunks[i][c] ?? 0), 0)));\n\n/** golden ratio conjugate: each round of the search below keeps 61.8% of the bracket and one of its two probes */\nconst PHI = (Math.sqrt(5) - 1) / 2;\n\n/**\n * Nearest point on the POSED curve: which curve, its parameter, and the world distance \u2014 so the caller can\n * apply its own pick threshold (a click far from the curve is a miss, not a very bad hit).\n * 16 samples per curve locate the minimum, then 8 rounds of golden-section refine it inside the bracket its\n * two neighbours make \u2014 down to ~1/350 of a curve, well under a pixel on any curve a user can see.\n */\nexport function nearestOnPath(worldPoints: number[], closed: boolean, p: Pt): { curve: number; t: number; d: number } {\n const n = curveCount(worldPoints.length / 2, closed);\n if (n < 1) { // a single anchor is not a curve; the anchor itself is the answer\n const [x, y] = worldPoints.length >= 4 ? [worldPoints[2], worldPoints[3]] : [0, 0];\n return { curve: 0, t: 0, d: Math.hypot(x - p[0], y - p[1]) };\n }\n const SAMPLES = 16;\n let best = { curve: 0, t: 0, d2: Infinity };\n for (let i = 0; i < n; i++) {\n const [p0, c1, c2, p3] = curveOf(worldPoints, i);\n const at = (t: number) => { const q = bezierPointAt(p0, c1, c2, p3, t); return (q[0] - p[0]) ** 2 + (q[1] - p[1]) ** 2; };\n let k = 0, kd = Infinity;\n for (let s = 0; s < SAMPLES; s++) { const d2 = at(s / (SAMPLES - 1)); if (d2 < kd) { kd = d2; k = s; } }\n // bracket the sampled minimum with its neighbours, then squeeze it\n let lo = Math.max(0, (k - 1) / (SAMPLES - 1)), hi = Math.min(1, (k + 1) / (SAMPLES - 1));\n let c = hi - PHI * (hi - lo), d = lo + PHI * (hi - lo), fc = at(c), fd = at(d);\n for (let r = 0; r < 8; r++) {\n if (fc < fd) { hi = d; d = c; fd = fc; c = hi - PHI * (hi - lo); fc = at(c); }\n else { lo = c; c = d; fc = fd; d = lo + PHI * (hi - lo); fd = at(d); }\n }\n const t = fc < fd ? c : d, d2 = Math.min(fc, fd, kd);\n if (d2 < best.d2) best = { curve: i, t: d2 === kd ? k / (SAMPLES - 1) : t, d2 };\n }\n return { curve: best.curve, t: best.t, d: Math.sqrt(best.d2) };\n}\n", "/**\n * rig-constraints \u2014 pure helpers for authoring constraints: which bones a constraint drives, the 1\u20132 bone chain\n * behind a limb, the bend sign that reproduces a pose, IK reach, and path geometry from anchor points.\n * The solvers themselves live in rig-anim.ts and are not touched here. No node:*, no DOM.\n */\nimport { MIX_PROPS, type RigDocument, type IkConstraint } from \"./rig-format\";\nimport { apply, invert, pk, type Pose, type Skeleton } from \"./rig-anim\";\nimport { curveLengths, flatten } from \"./rig-path\";\n\nexport type Pt = [number, number];\n\n/** bone id \u2192 ids of the constraints that write that bone, in the order the solver applies them */\nexport function drivenBones(doc: RigDocument): Map<string, string[]> {\n const out = new Map<string, string[]>();\n const add = (bone: string, id: string) => (out.get(bone) ?? out.set(bone, []).get(bone)!).push(id);\n // constraints, in document order (ties broken by array order) \u2014 mirrors the sort in evaluate() (rig-anim.ts)\n const all: { order: number; id: string; bones: string[] }[] = [\n ...doc.ik.map(c => ({ order: c.order, id: c.id, bones: c.bones })),\n ...doc.transform.map(c => ({ order: c.order, id: c.id, bones: c.bones })),\n ...doc.path.map(c => ({ order: c.order, id: c.id, bones: c.bones })),\n ].sort((a, b) => a.order - b.order);\n for (const c of all) for (const b of c.bones) add(b, c.id);\n return out;\n}\n\n/**\n * A constraint's property at one moment: the keyed value, else the document's. That is the read the solvers make\n * to decide whether they run at all (`cnum` in rig-anim.ts), so anything asking \"is this constraint live here?\"\n * has to make the same one \u2014 hence one exported copy rather than a fourth private one.\n */\nexport const mixAt = (pose: Pose, kind: string, id: string, prop: string, rest: number): number => {\n const v = pose.get(pk(kind, id, prop));\n return typeof v === \"number\" ? v : rest;\n};\n\n/**\n * The constraint that owns a bone's transform in this pose, or undefined when the bone is really editable there.\n * The LAST constraint in solver order wins (it writes last), and one counts only while it is actually mixed IN \u2014\n * the solvers' own early-outs, listed once in `MIX_PROPS`. A mixed-out constraint therefore blocks nothing: at\n * that frame the solver skips it and whatever wrote before it stands.\n * `Stage.driverOf` forwards to this function over the editor's own pose signal \u2014 there is no second copy left.\n */\nexport function driverAt(doc: RigDocument, pose: Pose, bone: string): { kind: \"ik\" | \"transform\" | \"path\"; id: string; target: string } | undefined {\n const ids = drivenBones(doc).get(bone);\n for (let i = (ids?.length ?? 0) - 1; i >= 0; i--) {\n const id = ids![i];\n const ik = doc.ik.find(c => c.id === id);\n if (ik) {\n if (mixAt(pose, \"ik\", id, \"mix\", ik.mix) > 0) return { kind: \"ik\", id, target: ik.target };\n continue;\n }\n const tc = doc.transform.find(c => c.id === id);\n if (tc) {\n if (MIX_PROPS.transform.some(m => mixAt(pose, \"transform\", id, m, tc[m]) !== 0)) return { kind: \"transform\", id, target: tc.target };\n continue;\n }\n const pc = doc.path.find(c => c.id === id);\n if (pc && MIX_PROPS.path.some(m => mixAt(pose, \"path\", id, m, pc[m]) !== 0)) return { kind: \"path\", id, target: pc.target };\n }\n return undefined;\n}\n\n/** [parent, bone] when the parent has exactly one child (an unambiguous limb), else [bone] */\nexport function ikChainFor(doc: RigDocument, bone: string): string[] {\n const b = doc.bones.find(x => x.id === bone);\n if (!b) throw new Error(`unknown bone \"${bone}\"`);\n if (!b.parent) throw new Error(`bone \"${bone}\" is a root: an IK chain needs one or two bones with a parent`);\n const siblings = doc.bones.filter(x => x.parent === b.parent);\n return siblings.length === 1 ? [b.parent, bone] : [bone];\n}\n\n/** world point at the far end of the chain's last bone (its `length` along its x axis) */\nexport function chainEnd(skel: Skeleton, chain: string[]): Pt {\n const last = chain[chain.length - 1];\n const st = skel.bones.get(last);\n if (!st) throw new Error(`unknown bone \"${last}\"`);\n const len = skel.doc.bones.find(b => b.id === last)!.length;\n return apply(st.world, len, 0);\n}\n\n/**\n * `bendPositive` for a two-bone chain: the sign of the cross product of the chain's two segments as they are posed\n * now \u2014 parent origin \u2192 child origin, then child origin \u2192 the chain's tip. That is the triangle the two-bone solver\n * works in (`bendDir` picks which side of it the joint falls on), so the sign matches it even when the parent is\n * sheared or its child hangs off its x axis, where \"the parent's x axis\" would not.\n * A straight chain (cross \u2248 0) answers `true`, matching Spine's default.\n * A chain whose last bone has `length: 0` has no measurable bend either (the tip coincides with the bone's own\n * origin, so the cross product is always exactly 0) and likewise answers `true`.\n */\nexport function bendSignFor(skel: Skeleton, chain: string[]): boolean {\n if (chain.length < 2) return true;\n const p = skel.bones.get(chain[0])!.world, c = skel.bones.get(chain[1])!.world;\n const tip = chainEnd(skel, chain);\n const cross = (c.tx - p.tx) * (tip[1] - c.ty) - (c.ty - p.ty) * (tip[0] - c.tx);\n return cross >= 0;\n}\n\n/** distance from the chain root to the target and the chain's maximum reach, both in world px */\nexport function ikReach(skel: Skeleton, c: IkConstraint): { distance: number; reach: number } {\n const root = skel.bones.get(c.bones[0])!.world;\n const target = skel.bones.get(c.target)!.world;\n let reach = 0;\n for (const id of c.bones) {\n const st = skel.bones.get(id)!, len = skel.doc.bones.find(b => b.id === id)!.length;\n reach += len * Math.hypot(st.world.a, st.world.b);\n }\n return { distance: Math.hypot(target.tx - root.tx, target.ty - root.ty), reach };\n}\n\n/** anchor points of a path attachment in document space (every third vertex, starting at index 1) */\nexport const pathAnchors = (world: number[]): Pt[] => {\n const out: Pt[] = [];\n for (let i = 1; i * 2 + 1 < world.length; i += 3) out.push([world[i * 2], world[i * 2 + 1]]);\n return out;\n};\n\nconst r6 = (v: number) => +v.toFixed(6) + 0;\n\n/**\n * Anchor points \u2192 the format's `[cPrev, anchor, cNext]` triples. Control points come from Catmull-Rom tangents\n * ((next \u2212 prev) / 6), which makes the curve pass through every anchor with C1 continuity; the ends of an open\n * path use the single available neighbour. Coordinates are converted into the slot bone's space.\n */\nexport function pathFromPoints(skel: Skeleton, slotId: string, points: Pt[], closed: boolean): { vertices: number[]; closed: boolean; lengths: number[] } {\n if (points.length < 2) throw new Error(\"a path needs at least two points\");\n if (closed && points.length < 3) throw new Error(\"a closed path needs at least three points\");\n const slot = skel.doc.slots.find(s => s.id === slotId);\n if (!slot) throw new Error(`unknown slot \"${slotId}\"`);\n const inv = invert(skel.bones.get(slot.bone)!.world);\n const n = points.length;\n const at = (i: number): Pt => points[closed ? (i + n) % n : Math.max(0, Math.min(n - 1, i))];\n // Catmull-Rom control points in document (world) space, one [cPrev, anchor, cNext] triple per anchor\n const ctrl: [Pt, Pt, Pt][] = [];\n for (let i = 0; i < n; i++) {\n const prev = at(i - 1), cur = points[i], next = at(i + 1);\n const tx = (next[0] - prev[0]) / 6, ty = (next[1] - prev[1]) / 6;\n ctrl.push([[cur[0] - tx, cur[1] - ty], cur, [cur[0] + tx, cur[1] + ty]]);\n }\n const vertices: number[] = [];\n for (const triple of ctrl) for (const [x, y] of triple) { const [lx, ly] = apply(inv, x, y); vertices.push(r6(lx), r6(ly)); }\n // curve lengths are measured by the runtime when constantSpeed is on; store an accurate estimate (sampling the\n // actual bezier, not the straight anchor-to-anchor chord) so a non-constant-speed path still tracks correctly.\n // Measured in DOCUMENT space, on the control points before they were folded into the slot bone \u2014 the runtime\n // samples the posed curve, and a scaled slot bone would otherwise store lengths in the wrong unit.\n return { vertices, closed, lengths: curveLengths(flatten(ctrl.flat()), closed) };\n}\n\n/** Solver-order dependencies, including ancestors and skinned path control points. */\nexport function constraintDependencies(doc: RigDocument) {\n const parent = new Map(doc.bones.map(b => [b.id, b.parent]));\n const ancestors = (id: string) => {\n const out = new Set<string>();\n for (let b: string | undefined = id; b && !out.has(b); b = parent.get(b)) out.add(b);\n return out;\n };\n const all = [\n ...doc.ik.map(c => ({ kind: 'ik' as const, ...c })),\n ...doc.transform.map(c => ({ kind: 'transform' as const, ...c })),\n ...doc.path.map(c => ({ kind: 'path' as const, ...c })),\n ].sort((a, b) => a.order - b.order);\n const active = (c: typeof all[number]) => MIX_PROPS[c.kind].some(p => (c as unknown as Record<string, unknown>)[p] !== 0 ||\n doc.animations.some(a => a.tracks.some(t => t.target === c.kind && t.id === c.id && t.prop === p && t.keys.some(k => typeof k.v === 'number' && k.v !== 0))));\n type Kind = typeof all[number]['kind'];\n const edges: { reader: string; readerKind: Kind; writer: string; writerKind: Kind; bone: string; late: boolean }[] = [];\n all.forEach((reader, ri) => {\n if (!active(reader)) return;\n const reads = new Set<string>();\n const add = (b: string) => ancestors(b).forEach(x => reads.add(x));\n if (reader.kind === 'path') {\n const slot = doc.slots.find(s => s.id === reader.target);\n if (slot) add(slot.bone);\n for (const a of doc.attachments) if (a.slot === reader.target && a.type === 'path')\n for (const list of a.weights ?? []) for (const inf of list) if (inf.w !== 0) add(inf.bone);\n } else add(reader.target);\n // Parent transforms are also inputs when solving a constrained bone.\n for (const b of reader.bones) { const p = parent.get(b); if (p && !reader.bones.includes(p)) add(p); }\n all.forEach((writer, wi) => {\n if (ri === wi || !active(writer)) return;\n const bone = writer.bones.find(b => reads.has(b));\n if (bone) edges.push({ reader: reader.id, readerKind: reader.kind, writer: writer.id, writerKind: writer.kind, bone, late: wi > ri });\n });\n });\n return { all, edges };\n}\n\n/** Stable topological order; cyclic dependencies require an authoring decision. */\nexport function orderConstraints(doc: RigDocument): RigDocument {\n const { all, edges } = constraintDependencies(doc);\n const pending = [...all], ids: string[] = [];\n while (pending.length) {\n const i = pending.findIndex(c => edges.filter(e => e.reader === c.id && e.readerKind === c.kind).every(e => ids.includes(`${e.writerKind}:${e.writer}`)));\n if (i < 0) throw new Error(`constraint dependency cycle: ${pending.map(c => c.id).join(', ')}`);\n const c = pending.splice(i, 1)[0]; ids.push(`${c.kind}:${c.id}`);\n }\n return { ...doc, ik: doc.ik.map(c => ({ ...c, order: ids.indexOf(`ik:${c.id}`) })), transform: doc.transform.map(c => ({ ...c, order: ids.indexOf(`transform:${c.id}`) })), path: doc.path.map(c => ({ ...c, order: ids.indexOf(`path:${c.id}`) })) };\n}\n", "/**\n * rig-tools v0 \u2014 pure operations over RigDocument. No UI, no MCP; both sit on top of this.\n * Every op returns a NEW document (undo-friendly, MCP-friendly).\n */\nimport { RigSchema, Attachment as AttachmentSchema, IkConstraint as IkSchema, TransformConstraint as TransformSchema, PathConstraint as PathSchema, validate, ID_RE,\n type RigDocument, type Bone, type Slot, type Track, type Attachment, type RegionAttachment, type MeshAttachment, type PathAttachment, type Influence, type Animation, type Reference, type Asset } from \"./rig-format\";\nimport { restValue, pk, affineOf, mul, apply, invert, evaluate, attachmentWorldVertices, regionSize, poseOf, decompose, slotOutline, type EaseSpec, type Skeleton, type Pose } from \"./rig-anim\";\nimport { ikChainFor, chainEnd, bendSignFor, driverAt, pathFromPoints, type Pt } from \"./rig-constraints\";\nimport { deformLength, round6, vertexCount } from \"./rig-mesh\";\nimport { anchorCount, blendInfluences, blendOffsets, blendPairs, curveLengths, flatten, insertTriple, removeTriple, splitCurve, toPoints } from \"./rig-path\";\n\ntype Doc = RigDocument;\ntype Key = Track[\"keys\"][number];\ntype Transform = Bone[\"transform\"];\n/** patches may give any subset of transform fields; `parent: null` detaches the bone (makes it a root) */\nexport type BonePatch = Partial<Omit<Bone, \"id\" | \"transform\" | \"parent\">> & { parent?: string | null; transform?: Partial<Transform> };\nexport type SlotPatch = Partial<Omit<Slot, \"id\">>;\nexport type KeyInput = Omit<Key, \"ease\"> & { ease?: Key[\"ease\"] };\n/** region placement: image centre in the slot bone's space */\nexport type RegionPlacement = { x?: number; y?: number; rotation?: number; scaleX?: number; scaleY?: number; width?: number; height?: number };\n\n// ---------- create ----------\n\nexport function createDoc(name: string, width: number, height: number, notes?: string): Doc {\n return RigSchema.parse({\n format: \"energy8.rig\", version: 2,\n meta: { name, width, height, notes },\n assets: [],\n // root at bottom-center: bounce/scale presets pivot around the feet\n bones: [{ id: \"root\", transform: { x: width / 2, y: height }, role: \"root\" }],\n slots: [], animations: [],\n });\n}\n\n/** One image as a rig: canvas = image + margin on every side, root at the image's bottom centre, slot pivot (0.5, 1). */\nexport function createSymbol(name: string, asset: { id?: string; src: string; width: number; height: number }, margin = 0.15, notes?: string): Doc {\n const mx = Math.ceil(asset.width * margin), my = Math.ceil(asset.height * margin);\n const width = asset.width + 2 * mx, height = asset.height + 2 * my;\n const fromFile = asset.src.replace(/^.*\\//, \"\").replace(/\\.[^.]+$/, \"\").toLowerCase().replace(/[^a-z0-9_]/g, \"_\").replace(/^[^a-z]+/, \"\");\n const id = asset.id ?? (fromFile || name);\n let doc = createDoc(name, width, height, notes);\n doc = { ...doc, bones: [{ ...doc.bones[0], transform: { ...doc.bones[0].transform, x: width / 2, y: height - my } }] };\n doc = { ...doc, assets: [RigSchema.shape.assets.element.parse({ id, src: asset.src, width: asset.width, height: asset.height })] };\n doc = setSlot(doc, { id, bone: \"root\" });\n // the image hangs from the root (its bottom centre): the centre is half a height above\n doc = setAttachment(doc, { id, slot: id, asset: id, y: -asset.height / 2 });\n return setSlot(doc, { id, attachment: id });\n}\n\n/** Swap a layer's file (e.g. after regeneration). Pivots are fractions, so slots keep working; provenance is merged. */\nexport function replaceAsset(doc: Doc, id: string, next: { src: string; width: number; height: number; prompt?: string; sourceImage?: string; inpainted?: boolean; bbox?: [number, number, number, number] }): Doc {\n const cur = doc.assets.find(a => a.id === id);\n if (!cur) throw new Error(`unknown asset \"${id}\"`);\n const { src, width, height, ...origin } = next;\n const asset = RigSchema.shape.assets.element.parse({ ...cur, src, width, height, frame: undefined, rotate: 0, trim: undefined,\n origin: { ...cur.origin, ...Object.fromEntries(Object.entries(origin).filter(([, v]) => v !== undefined)) } });\n // keep the point that sat at each region's pivot fraction in place when the image size changes\n const attachments = doc.attachments.map(a => {\n if (a.type !== \"region\" || a.asset !== id || (cur.width === width && cur.height === height)) return a;\n const px = 0.5 - a.x / cur.width, py = 0.5 - a.y / cur.height;\n return { ...a, x: +((0.5 - px) * width).toFixed(4) + 0, y: +((0.5 - py) * height).toFixed(4) + 0 };\n });\n return { ...doc, assets: doc.assets.map(a => (a.id === id ? asset : a)), attachments };\n}\n\n// ---------- assets ----------\n\nexport type AssetPatch = { src?: string; width?: number; height?: number; frame?: [number, number, number, number] | null; origin?: Asset[\"origin\"] };\nconst round4 = (v: number) => +v.toFixed(4) + 0;\n/** the centre of what an asset shows, in the pixels of its source image */\nconst sourceCentre = (a: { width: number; height: number; frame?: [number, number, number, number] }): [number, number] =>\n a.frame ? [a.frame[0] + a.frame[2] / 2, a.frame[1] + a.frame[3] / 2] : [a.width / 2, a.height / 2];\n\n/**\n * Create or patch an asset. `image` is the size of the PNG `src` names (the caller reads it \u2014 this module cannot\n * read files); a `frame` must fit inside it. Size is only derived from `frame`/`image` when this patch actually\n * REFRAMES (a `frame` or `src` was given) \u2014 with a frame the asset's size IS the frame's, without one it's the\n * image's; an unrelated patch (e.g. `origin` only) leaves the current width/height alone, since for a packed\n * atlas asset (rotate/trim) the frame's [w, h] is the packed size, not the true one `width`/`height` store.\n * Re-framing an asset that regions already show keeps the SOURCE pixel that sat under each image centre\n * where it was drawn (spec \u00A73): the old centre lands at (u, v) of the new frame, so each placement moves by\n * \u2212L\u00B7(u, v) in its own rotated, scaled frame. A mesh keeps its uvs \u2014 they index the old pixels \u2014 and is named\n * in `notes` so the caller re-traces it. Only a frame or src change resets `rotate`/`trim` (packer fields).\n */\nexport function setAsset(doc: Doc, id: string, patch: AssetPatch, image?: { width: number; height: number }): { doc: Doc; notes: string[] } {\n const cur = doc.assets.find(a => a.id === id);\n if (!cur && !patch.src) throw new Error(`asset \"${id}\" does not exist \u2014 creating one needs src`);\n // a `src` restated as its own current value is not a source change: it must not skip the shift guard below,\n // nor (on a packed atlas asset) reset rotate/trim/width/height as if the image had actually been swapped\n const srcChanged = patch.src !== undefined && patch.src !== cur?.src;\n const reframed = patch.frame !== undefined || srcChanged;\n const frame = patch.frame === undefined ? cur?.frame : patch.frame ?? undefined;\n if (frame) {\n const [fx, fy, fw, fh] = frame;\n if (!frame.every(Number.isInteger) || fw < 1 || fh < 1 || fx < 0 || fy < 0) throw new Error(`asset \"${id}\": frame must be [x, y, w, h] integers with w, h \u2265 1`);\n if (image && (fx + fw > image.width || fy + fh > image.height)) throw new Error(`asset \"${id}\": frame [${frame.join(\", \")}] is outside the ${image.width}x${image.height} image`);\n }\n const size = reframed && frame ? { width: frame[2], height: frame[3] }\n : reframed && image ? image\n : { width: patch.width ?? cur?.width ?? image?.width, height: patch.height ?? cur?.height ?? image?.height };\n const next = RigSchema.shape.assets.element.parse({\n ...cur, id, src: patch.src ?? cur!.src, ...size, frame,\n ...(reframed ? { rotate: 0, trim: undefined } : {}),\n ...(patch.origin ? { origin: patch.origin } : {}),\n });\n const notes: string[] = [];\n let attachments = doc.attachments;\n if (cur && patch.frame !== undefined && !srcChanged) {\n const [ox, oy] = sourceCentre(cur), [nx, ny] = sourceCentre(next);\n const u = ox - nx, v = oy - ny;\n attachments = doc.attachments.map(a => {\n if (a.type === \"path\" || a.asset !== id) return a;\n if (a.type === \"mesh\") { notes.push(`mesh \"${a.id}\" keeps its uvs \u2014 re-trace it (rig_mesh_from_image) for the new frame`); return a; }\n const L = affineOf(0, 0, a.rotation, a.scaleX, a.scaleY);\n return { ...a, x: round4(a.x - (L.a * u + L.c * v)), y: round4(a.y - (L.b * u + L.d * v)) };\n });\n }\n return { doc: { ...doc, assets: cur ? doc.assets.map(a => (a.id === id ? next : a)) : [...doc.assets, next], attachments }, notes };\n}\n\nexport function removeAsset(doc: Doc, id: string): Doc {\n if (!doc.assets.some(a => a.id === id)) throw new Error(`unknown asset \"${id}\"`);\n const users = doc.attachments.filter(a => a.type !== \"path\" && a.asset === id).map(a => a.id);\n if (users.length) throw new Error(`asset \"${id}\" is shown by ${users.map(u => `\"${u}\"`).join(\", \")} \u2014 remove those attachments first`);\n return { ...doc, assets: doc.assets.filter(a => a.id !== id) };\n}\n\n/**\n * One mutation for \"this picture on that bone, here\": the slot (`slot ?? asset`, created on `bone` when missing \u2014\n * an existing slot keeps its own bone), a region attachment named like the asset with its centre at the DOCUMENT\n * point (x, y) expressed in the slot bone's rest frame, and the slot showing it.\n */\nexport function placeAsset(doc: Doc, p: { asset: string; bone: string; x: number; y: number; slot?: string; z?: number }): Doc {\n if (!doc.assets.some(a => a.id === p.asset)) throw new Error(`unknown asset \"${p.asset}\"`);\n if (doc.attachments.some(a => a.id === p.asset)) throw new Error(`attachment \"${p.asset}\" already exists \u2014 the asset is placed; move it with rig_set_attachment`);\n const slotId = p.slot ?? p.asset;\n const cur = doc.slots.find(s => s.id === slotId);\n const boneId = cur?.bone ?? p.bone;\n const world = evaluate(doc, new Map()).bones.get(boneId)?.world;\n if (!world) throw new Error(`unknown bone \"${boneId}\"`);\n const z = p.z ?? cur?.z ?? (doc.slots.length ? Math.max(...doc.slots.map(s => s.z)) + 1 : 0);\n let next = cur ? doc : setSlot(doc, { id: slotId, bone: boneId, z });\n const [lx, ly] = apply(invert(world), p.x, p.y);\n next = setAttachment(next, { id: p.asset, slot: slotId, asset: p.asset, x: round4(lx), y: round4(ly) });\n return setSlot(next, { id: slotId, attachment: p.asset, ...(p.z !== undefined ? { z: p.z } : {}) });\n}\n\n/** Parts-first regeneration prompt for one layer: style anchor + provenance + rig context + chroma-key rules. */\nexport function layerPrompt(doc: Doc, assetId: string, opts: { method?: \"part\" | \"repair\"; removed?: string[] } = {}): string {\n const a = doc.assets.find(a => a.id === assetId);\n if (!a) throw new Error(`unknown asset \"${assetId}\"`);\n const att = doc.attachments.find(a => a.type !== \"path\" && a.asset === assetId);\n const slot = att ? doc.slots.find(s => s.id === att.slot) : doc.slots.find(s => s.id === assetId);\n const bone = slot && doc.bones.find(b => b.id === slot.bone);\n const children = bone ? doc.bones.filter(b => b.parent === bone.id).map(b => b.id) : [];\n const lines = [\n `Use case: isolated 2D cut-out rig part \"${a.id}\" for the character/symbol \"${doc.meta.name}\".`,\n `Style: ${doc.meta.notes ? doc.meta.notes + \". \" : \"\"}Match the existing layers exactly \u2014 same medium, line weight, palette, light direction.`,\n `Part: ${a.origin?.prompt ?? a.id}.`,\n `Size: ${a.width}\u00D7${a.height} px at source scale${a.origin?.bbox ? ` (source bbox [${a.origin.bbox.join(\", \")}])` : \"\"}; keep the same silhouette registration` +\n (att && att.type === \"region\" ? ` so the image centre stays at (${+att.x.toFixed(1)}, ${+att.y.toFixed(1)}) from the joint.` : \".\"),\n bone ? `Rig context: attached to bone \"${bone.id}\"${bone.parent ? `, parent \"${bone.parent}\"` : \"\"}${children.length ? `; child parts: ${children.join(\", \")}` : \"\"}.` : \"Rig context: not attached yet.\",\n \"Paint overlap beyond each hidden joint end through the planned motion range; choose its depth from the pivot and extreme poses, not a fixed pixel margin.\",\n \"Composition: orthographic front view, one connected opaque part only, same orientation as the current layer, centred with generous padding, no foreshortening.\",\n \"Backdrop: transparent RGBA, no floor, shadow, text or watermark. If the selected generator cannot output alpha, use a flat #00FF00 guide background and remove only the reviewed background region.\",\n ];\n if (opts.method === \"repair\") lines.push(\n \"Complete the host part inside the marked hidden-surface region. Retain surrounding art as a registration guide; small differences outside the repair are acceptable because assembly keeps the approved pixels there.\",\n `Do not recreate removed occluders${opts.removed?.length ? \": \" + opts.removed.join(\", \") : \" (neighbouring parts deliberately removed from the guide)\"}. Continue only this part's own material and contour; no guide magenta in the output.`,\n \"After generation: fit unchanged landmarks, remove explicitly masked background, match host-material tone, feather into the host colour and repair pale fringe only inside the ink mask.\"\n );\n return lines.join(\"\\n\");\n}\n\n// ---------- meta ----------\n\nexport type MetaPatch = { name?: string; width?: number; height?: number; notes?: string; reference?: (Partial<Omit<Reference, 'src'>> & { src: string }) | null };\n\n/**\n * Patch the document's meta. Resizing the canvas moves nothing \u2014 bones keep their document coordinates, only the\n * bounds change. `reference: null` clears the editor's underlay; a reference `src` has to stay inside the rig's\n * directory, since that is the only place the editor server serves images from.\n */\nexport function setMeta(doc: Doc, patch: MetaPatch): Doc {\n const { reference, ...rest } = patch;\n if (reference && (/^([a-zA-Z]:)?[\\\\/]/.test(reference.src) || /(^|[\\\\/])\\.\\.([\\\\/]|$)/.test(reference.src))) {\n throw new Error(`reference.src must be a relative path inside the rig's directory (got \"${reference.src}\")`);\n }\n const meta = RigSchema.shape.meta.parse({ ...doc.meta, ...rest, ...(reference === undefined ? {} : { reference: reference ?? undefined }) });\n return { ...doc, meta };\n}\n\n// ---------- bones ----------\n\nexport function addBone(doc: Doc, bone: BonePatch & { id: string }): Doc {\n if (doc.bones.some(b => b.id === bone.id)) throw new Error(`bone \"${bone.id}\" exists`);\n const parent = bone.parent ?? doc.bones.find(b => !b.parent)!.id;\n const b = RigSchema.shape.bones.element.parse({ ...bone, parent: bone.id === parent ? undefined : parent });\n return { ...doc, bones: [...doc.bones, b] };\n}\n\nexport function updateBone(doc: Doc, id: string, patch: BonePatch): Doc {\n const i = doc.bones.findIndex(b => b.id === id);\n if (i < 0) throw new Error(`unknown bone \"${id}\"`);\n const cur = doc.bones[i];\n // `parent: null` detaches the bone into a root of its own (the format allows several roots \u2014 `validate` only\n // asks for at least one); an absent `parent` leaves the current one alone, like every other field\n const { parent, ...rest } = patch;\n const next = RigSchema.shape.bones.element.parse({ ...cur, ...rest, transform: { ...cur.transform, ...patch.transform },\n ...(parent === undefined ? {} : { parent: parent ?? undefined }) });\n return { ...doc, bones: doc.bones.map((b, j) => (j === i ? next : b)) };\n}\n\n/** `approx` is the largest of its re-bound slots' (see `rebindSlot`), 0 when every re-expression was exact. */\nexport function removeBone(doc: Doc, id: string): { doc: Doc; approx: number } {\n const bone = doc.bones.find(b => b.id === id);\n if (!bone) throw new Error(`unknown bone \"${id}\"`);\n if (!bone.parent) throw new Error(\"cannot remove root\");\n let approx = 0;\n for (const s of doc.slots) if (s.bone === id) { const r = rebindSlot(doc, s.id, bone.parent); doc = r.doc; approx = Math.max(approx, r.approx); } // images stay put\n return {\n doc: {\n ...doc,\n bones: doc.bones.filter(b => b.id !== id).map(b => (b.parent === id ? { ...b, parent: bone.parent } : b)),\n animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.filter(t => !(t.target === \"bone\" && t.id === id)) })),\n },\n approx,\n };\n}\n\n// ---------- slots ----------\n\n/** keep every drawOrder key listing every slot exactly once: `fn` edits one key's slot list */\nfunction patchDrawOrder(doc: Doc, fn: (order: string[]) => string[]): Doc {\n return { ...doc, animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.map(t =>\n t.target !== \"drawOrder\" ? t : { ...t, keys: t.keys.map(k => ({ ...k, v: fn(k.v as string[]) })) }) })) };\n}\n\n/**\n * Create or patch a slot. A NEW slot is appended to every `drawOrder` key (it draws on top \u2014 the same place\n * `z = max + 1` puts it), so a rig with such keys stays valid. A `bone` change on an existing slot goes through\n * `rebindSlot`, so the images stay where they are on the document.\n */\nexport function setSlot(doc: Doc, slot: SlotPatch & { id: string }): Doc {\n const cur = doc.slots.find(s => s.id === slot.id);\n if (cur && slot.bone && slot.bone !== cur.bone) doc = rebindSlot(doc, slot.id, slot.bone).doc;\n const base = doc.slots.find(s => s.id === slot.id);\n const next = RigSchema.shape.slots.element.parse({ ...base, ...slot });\n if (base) return { ...doc, slots: doc.slots.map(s => (s.id === slot.id ? next : s)) };\n return patchDrawOrder({ ...doc, slots: [...doc.slots, next] }, o => (o.includes(slot.id) ? o : [...o, slot.id]));\n}\n\nexport function removeSlot(doc: Doc, id: string): Doc {\n const gone = new Set(doc.attachments.filter(a => a.slot === id).map(a => a.id));\n return patchDrawOrder({\n ...doc,\n slots: doc.slots.filter(s => s.id !== id).map(s => gone.has(s.clip ?? \"\") ? { ...s, clip: undefined } : s),\n attachments: doc.attachments.filter(a => a.slot !== id),\n animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.filter(t => !((t.target === \"slot\" && t.id === id) || (t.target === \"deform\" && gone.has(t.id)))) })),\n }, o => o.filter(s => s !== id));\n}\n\n/**\n * Move `slotId` onto `bone` WITHOUT moving what it shows. Every region's placement and every unweighted mesh or\n * path vertex is re-expressed in the new bone's REST frame; weighted data is left alone \u2014 its points live in the\n * influence bones, and the slot bone is not one of them. A region has no shear, so between two bones whose axes\n * are not similar (a shear, a non-uniform scale, a mirror) the decomposition cannot be exact: `approx` is the\n * largest distance (document px) any region corner moved, 0 when the re-expression is exact.\n */\nexport function rebindSlot(doc: Doc, slotId: string, bone: string): { doc: Doc; approx: number } {\n const slot = doc.slots.find(s => s.id === slotId);\n if (!slot) throw new Error(`unknown slot \"${slotId}\"`);\n if (slot.bone === bone) return { doc, approx: 0 };\n const skel = evaluate(doc, new Map());\n const from = skel.bones.get(slot.bone)?.world, to = skel.bones.get(bone)?.world;\n if (!to) throw new Error(`unknown bone \"${bone}\"`);\n if (!from) throw new Error(`slot \"${slotId}\" sits on unknown bone \"${slot.bone}\"`);\n const toInv = invert(to);\n let approx = 0;\n const attachments = doc.attachments.map(a => {\n if (a.slot !== slotId) return a;\n if (a.type === \"region\") {\n const M = mul(from, affineOf(a.x, a.y, a.rotation, a.scaleX, a.scaleY));\n const L = mul(toInv, M);\n const d = decompose(L);\n // `decompose` reports scaleX/scaleY as hypot()s \u2014 always \u2265 0 \u2014 so it cannot on its own tell a mirror\n // (negative determinant) from a shear: the determinant of the full local delta says which one it is,\n // and the mirror (when that's what it is) always shows up as a sign flip on scaleY, never scaleX.\n const det = L.a * L.d - L.b * L.c;\n // x, y (world position) need the finer 6-decimal rounding here: `to` can carry a scale factor, which\n // amplifies a 4-decimal quantization of a bone-local coordinate past a visible fraction of a pixel \u2014\n // rotation/scale stay at round4 (their own quantization does not get amplified the same way)\n const next = { ...a, x: round6(d.x), y: round6(d.y), rotation: round4(d.angle), scaleX: round4(d.scaleX), scaleY: round4(det < 0 ? -d.scaleY : d.scaleY) };\n const N = mul(to, affineOf(next.x, next.y, next.rotation, next.scaleX, next.scaleY));\n const [w, h] = regionSize(doc, a);\n for (const [cx, cy] of [[-w / 2, -h / 2], [w / 2, -h / 2], [w / 2, h / 2], [-w / 2, h / 2]]) {\n const p = apply(M, cx, cy), q = apply(N, cx, cy);\n approx = Math.max(approx, Math.hypot(p[0] - q[0], p[1] - q[1]));\n }\n return next;\n }\n if (a.vertices) {\n const v = a.vertices.slice();\n for (let i = 0; i < v.length; i += 2) { const [wx, wy] = apply(from, v[i], v[i + 1]); const [lx, ly] = apply(toInv, wx, wy); v[i] = round6(lx); v[i + 1] = round6(ly); }\n return { ...a, vertices: v };\n }\n return a; // weighted: its points live in the influence bones\n });\n return { doc: { ...doc, attachments, slots: doc.slots.map(s => (s.id === slotId ? { ...s, bone } : s)) }, approx: Math.round(approx * 1000) / 1000 };\n}\n\n/** setup draw order in one call: `order` lists every slot back-to-front (the drawOrder key's order); z = index */\nexport function setDrawOrder(doc: Doc, order: string[]): Doc {\n const ids = new Set(doc.slots.map(s => s.id));\n if (order.length !== ids.size || new Set(order).size !== order.length || !order.every(s => ids.has(s))) throw new Error(\"order must list every slot exactly once\");\n const z = new Map(order.map((id, i) => [id, i]));\n return { ...doc, slots: doc.slots.map(s => ({ ...s, z: z.get(s.id)! })) };\n}\n\n// ---------- attachments ----------\n\n/** Create or patch a region attachment (an image placed in a slot). Placement is the image CENTRE in the slot bone's space. */\nexport function setAttachment(doc: Doc, att: RegionPlacement & { id: string; slot?: string; asset?: string }): Doc {\n const cur = doc.attachments.find(a => a.id === att.id);\n if (cur && cur.type !== \"region\") throw new Error(`attachment \"${att.id}\" is a ${cur.type}; use setMesh`);\n const next = AttachmentSchema.parse({ type: \"region\", ...cur, ...att });\n return { ...doc, attachments: cur ? doc.attachments.map(a => (a.id === att.id ? next : a)) : [...doc.attachments, next] };\n}\n\n/** Create or replace any attachment (mesh / path / region) from a full description. */\nexport function setAttachmentRaw(doc: Doc, att: Record<string, unknown> & { id: string }): Doc {\n const next = AttachmentSchema.parse(att) as Attachment;\n const exists = doc.attachments.some(a => a.id === att.id);\n return { ...doc, attachments: exists ? doc.attachments.map(a => (a.id === att.id ? next : a)) : [...doc.attachments, next] };\n}\n\nconst trackId = (t: Omit<Track, \"keys\">) => `${t.target}.${t.id}.${t.prop}`;\n\n/** drop the deform `vertices` tracks of `id` whose keys no longer have the expected offset length */\nfunction dropVertexKeys(doc: Doc, id: string, keep: (len: number) => boolean): { doc: Doc; dropped: string[] } {\n const dropped: string[] = [];\n const animations = doc.animations.map(a => ({ ...a, tracks: a.tracks.filter(t => {\n if (t.target !== \"deform\" || t.id !== id || t.prop !== \"vertices\") return true;\n const ok = t.keys.every(k => Array.isArray(k.v) && keep(k.v.length));\n if (!ok) dropped.push(`deform.${id}.vertices in ${a.id}`);\n return ok;\n }) }));\n return { doc: { ...doc, animations }, dropped };\n}\n\n/**\n * Replace the geometry arrays of a mesh attachment. `vertices` and `weights` are exclusive: giving one drops\n * the other, and exactly one must remain. Deform `vertices` keys whose length no longer matches the mesh are\n * dropped (returned in `dropped`) \u2014 they would otherwise make the document invalid.\n */\nexport function setMesh(doc: Doc, id: string, patch: { vertices?: number[]; weights?: MeshAttachment[\"weights\"]; uvs?: number[]; triangles?: number[]; hull?: number }): { doc: Doc; dropped: string[] } {\n const cur = doc.attachments.find(a => a.id === id);\n if (!cur || cur.type !== \"mesh\") throw new Error(`attachment \"${id}\" is not a mesh`);\n if (patch.vertices && patch.weights) throw new Error(`attachment \"${id}\": give vertices OR weights, not both (a mesh has one rest shape)`);\n const next: MeshAttachment = { ...cur, ...patch };\n if (patch.vertices) delete (next as { weights?: unknown }).weights;\n if (patch.weights) delete (next as { vertices?: unknown }).vertices;\n const n = next.uvs.length / 2;\n if (next.vertices && next.vertices.length !== 2 * n) throw new Error(`vertices must have ${2 * n} numbers (2 per vertex, ${n} vertices), got ${next.vertices.length}`);\n if (next.weights && next.weights.length !== n) throw new Error(`weights must have ${n} influence lists (one per vertex), got ${next.weights.length}`);\n const withAtt = { ...doc, attachments: doc.attachments.map(a => (a.id === id ? AttachmentSchema.parse(next) : a)) };\n const len = deformLength(next);\n return dropVertexKeys(withAtt, id, l => l === len);\n}\n\n/** Replace a mesh's skinning (drops its unweighted `vertices`); stale deform vertex keys are pruned. */\nexport const setWeights = (doc: Doc, id: string, weights: NonNullable<MeshAttachment[\"weights\"]>) => {\n const old = doc.attachments.find(a => a.id === id);\n const sameLayout = old?.type === \"mesh\" && old.weights?.length === weights.length && old.weights.every((list, i) => list.length === weights[i].length && list.every((inf, j) => inf.bone === weights[i][j].bone));\n const result = setMesh(doc, id, { weights });\n if (sameLayout) return result;\n const cleared = dropVertexKeys(result.doc, id, () => false);\n return { doc: cleared.doc, dropped: [...result.dropped, ...cleared.dropped] };\n};\n\n/** Replace a REGION attachment by the given mesh (same id); lattice deform tracks on that id are removed (returned). */\nexport function convertToMesh(doc: Doc, mesh: MeshAttachment): { doc: Doc; droppedTracks: string[] } {\n const cur = doc.attachments.find(a => a.id === mesh.id);\n if (!cur || cur.type !== \"region\") throw new Error(`attachment \"${mesh.id}\" is not a region`);\n const droppedTracks: string[] = [];\n const animations = doc.animations.map(a => ({ ...a, tracks: a.tracks.filter(t => {\n const drop = t.target === \"deform\" && t.id === mesh.id;\n if (drop) droppedTracks.push(`${trackId(t)} in ${a.id}`);\n return !drop;\n }) }));\n return { doc: { ...doc, attachments: doc.attachments.map(a => (a.id === mesh.id ? AttachmentSchema.parse(mesh) : a)), animations }, droppedTracks };\n}\n\nexport function removeAttachment(doc: Doc, id: string): Doc {\n return {\n ...doc,\n attachments: doc.attachments.filter(a => a.id !== id),\n slots: doc.slots.map(s => ({ ...s, attachment: s.attachment === id ? undefined : s.attachment, clip: s.clip === id ? undefined : s.clip })),\n animations: doc.animations.map(a => ({ ...a, tracks: a.tracks\n .filter(t => !(t.target === \"deform\" && t.id === id))\n .map(t => (t.target === \"slot\" && t.prop === \"attachment\" ? { ...t, keys: t.keys.map(k => (k.v === id ? { ...k, v: null } : k)) } : t)) })),\n };\n}\n\n/** the region attachment currently at rest in a slot (undefined when hidden or not a region) */\nexport const restRegion = (doc: Doc, slotId: string): RegionAttachment | undefined => {\n const s = doc.slots.find(s => s.id === slotId);\n const a = s?.attachment ? doc.attachments.find(a => a.id === s.attachment) : undefined;\n return a?.type === \"region\" ? a : undefined;\n};\n\n/** region placement equivalent to a v1 pivot (fraction) + bone-local offset for an image of size w\u00D7h */\nexport function placementFromPivot(pivot: { x: number; y: number }, offset: Partial<Transform>, w: number, h: number): Required<Pick<RegionPlacement, \"x\" | \"y\" | \"rotation\" | \"scaleX\" | \"scaleY\">> {\n const o = { x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1, ...offset };\n const [x, y] = apply(affineOf(o.x, o.y, o.rotation, o.scaleX, o.scaleY), (0.5 - pivot.x) * w, (0.5 - pivot.y) * h);\n return { x: +x.toFixed(4) + 0, y: +y.toFixed(4) + 0, rotation: o.rotation, scaleX: o.scaleX, scaleY: o.scaleY };\n}\n\n// ---------- constraints ----------\n\nexport type ConstraintKind = \"ik\" | \"transform\" | \"path\";\nconst CONSTRAINT_SCHEMA = { ik: IkSchema, transform: TransformSchema, path: PathSchema };\nconst article = (kind: ConstraintKind) => (kind === \"ik\" ? \"an\" : \"a\");\n/** which list holds `id` \u2014 constraint ids are unique across the three kinds */\nexport const constraintKind = (doc: Doc, id: string): ConstraintKind | undefined =>\n doc.ik.some(c => c.id === id) ? \"ik\" : doc.transform.some(c => c.id === id) ? \"transform\" : doc.path.some(c => c.id === id) ? \"path\" : undefined;\n\n/**\n * Create or patch a constraint. The patch is merged over the current value and re-parsed, so schema defaults\n * fill in on creation and a patch only has to name what changes (an explicit `undefined` changes nothing).\n * A constraint's KIND is fixed on creation: changing it means removing the constraint and creating it again,\n * because the three kinds share an id space and their fields (and tracks) do not translate.\n */\nexport function setConstraint(doc: Doc, kind: ConstraintKind, id: string, patch: Record<string, unknown>): Doc {\n const existing = constraintKind(doc, id);\n if (existing && existing !== kind)\n throw new Error(`constraint \"${id}\" is already ${article(existing)} ${existing}; remove it before creating ${article(kind)} ${kind} constraint with that id`);\n const cur = (doc[kind] as { id: string }[]).find(c => c.id === id);\n const given = Object.fromEntries(Object.entries(patch).filter(([, v]) => v !== undefined));\n // a patch may name any subset, but there is nothing to merge over when the constraint is new\n if (!cur && !(given.bones && given.target)) throw new Error(`no ${kind} constraint \"${id}\" yet: creating one needs at least bones and target`);\n const next = CONSTRAINT_SCHEMA[kind].parse({ ...cur, ...given, id });\n // Validate a contiguous chain for direct callers as well as saved documents.\n\n const list = cur ? (doc[kind] as { id: string }[]).map(c => (c.id === id ? next : c)) : [...(doc[kind] as unknown[]), next];\n if (kind === \"ik\") for (let i = 1; i < next.bones.length; i++) if (doc.bones.find(b => b.id === next.bones[i])?.parent !== next.bones[i - 1]) throw new Error(`ik \"${id}\": bones must form a contiguous parent-to-child chain`);\n return { ...doc, [kind]: list } as Doc;\n}\n\n/** Remove a constraint of any kind together with its tracks (mix / position / \u2026). */\nexport function removeConstraint(doc: Doc, id: string): Doc {\n const kind = constraintKind(doc, id);\n if (!kind) throw new Error(`unknown constraint \"${id}\"`);\n return {\n ...doc,\n [kind]: (doc[kind] as { id: string }[]).filter(c => c.id !== id),\n animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.filter(t => !(t.target === kind && t.id === id)) })),\n } as Doc;\n}\n\n/**\n * Rig a limb in one call: `ikChainFor(bone)` gets a target bone at the chain's current tip and an IK constraint\n * `<bone>_ik` whose bend sign reproduces the authored pose, so adding it moves nothing.\n *\n * The target is parented to the ROOT bone, never inside the chain: a target dragged by the bones it drives is a\n * cycle (the solver would read what it just wrote). When the two-bone chain would reach up to the root \u2014 the only\n * parent available for the target \u2014 the chain DEGRADES to the single bone (a one-bone IK aims that bone at the\n * target and is cycle-free), and `note` says so; only a `bone` that is itself a root is refused (by `ikChainFor`).\n */\nexport function addIkChain(doc: Doc, bone: string, opts: { target?: string; mix?: number; softness?: number; bones?: string[] } = {}): { doc: Doc; chain: string[]; target: string; bendPositive: boolean; note?: string } {\n const id = `${bone}_ik`;\n if (constraintKind(doc, id)) throw new Error(`constraint \"${id}\" exists; remove it first (rig_remove_constraint) or patch it`);\n const full = opts.bones ?? ikChainFor(doc, bone);\n if (!full.length || full.at(-1) !== bone) throw new Error(\"explicit chain must end at the named tip bone\");\n const rootId = doc.bones.find(b => !b.parent)!.id;\n if (opts.bones && full.includes(rootId)) throw new Error(\"explicit chain cannot include the root carrying its target\");\n const note = full.includes(rootId) ? \"single bone \u2014 the two-bone chain would include the root, which carries the target\" : undefined;\n const chain = note ? [bone] : full;\n // a one-bone IK aims the bone at the target; with no length the tip IS the bone's own origin, so the target\n // would sit on it and the solver would snap the bone to rotation 0 instead of holding the authored pose\n if (chain.length === 1 && !doc.bones.find(b => b.id === bone)!.length)\n throw new Error(`bone \"${bone}\" has length 0: a one-bone IK aims it at a target placed at its tip, so give it a length first`);\n const target = opts.target ?? id;\n if (doc.bones.some(b => b.id === target)) throw new Error(`bone \"${target}\" exists; pass another target id`);\n const skel = evaluate(doc, new Map());\n const [tipX, tipY] = chainEnd(skel, chain);\n const bendPositive = bendSignFor(skel, chain);\n const [lx, ly] = apply(invert(skel.bones.get(rootId)!.world), tipX, tipY);\n // 6 decimals, like the bone transforms the Spine importer writes: the target's position is the whole limb's\n // pose, and rounding it to the 4 decimals used for image placement already costs ~1e-5 px of drift\n let next = addBone(doc, { id: target, parent: rootId, role: \"ik_target\", transform: { x: +lx.toFixed(6) + 0, y: +ly.toFixed(6) + 0 } });\n const order = Math.max(0, ...next.ik.map(c => c.order), ...next.transform.map(c => c.order), ...next.path.map(c => c.order)) + 1;\n next = setConstraint(next, \"ik\", id, { bones: chain, target, bendPositive, mix: opts.mix ?? 1, softness: opts.softness ?? 0, order });\n return { doc: next, chain, target, bendPositive, note };\n}\n\n// ---------- paths ----------\n\n/** the vertex data of a path: anchors to smooth into a curve, or the raw control points themselves */\nexport interface PathGeometryIn { points?: Pt[]; vertices?: number[]; weights?: Influence[][]; closed?: boolean }\n\n/** vertex data \u2192 the same points in DOCUMENT space, without having to put the attachment in the document first */\nconst pathWorld = (skel: Skeleton, id: string, slot: string, data: { vertices?: number[]; weights?: Influence[][] }, closed: boolean): number[] =>\n attachmentWorldVertices(skel, slot, { id, slot, type: \"path\", ...data, lengths: [], closed, constantSpeed: true });\n\n/** write a path attachment and prune the deform tracks whose offset length no longer fits it */\nfunction putPath(doc: Doc, att: PathAttachment): { doc: Doc; dropped: string[] } {\n const len = deformLength(att);\n return dropVertexKeys(setAttachmentRaw(doc, att), att.id, l => l === len);\n}\n\n/** a flat `deform.<id>.vertices` value split per CONTROL POINT: one chunk per influence list, or one pair each */\nconst offsetChunks = (att: PathAttachment, v: number[]): number[][] => {\n const out: number[][] = [];\n if (!att.weights) { for (let i = 0; i < v.length; i += 2) out.push(v.slice(i, i + 2)); return out; }\n let k = 0;\n for (const list of att.weights) { out.push(v.slice(k, k + 2 * list.length)); k += 2 * list.length; }\n return out;\n};\n\n/**\n * Rewrite the deform `vertices` keys of `id` that still fit `len` through `map`. A key of any other length is\n * already stale against the attachment as it stands \u2014 `putPath`'s prune is what deals with that, not this.\n */\nfunction mapVertexKeys(doc: Doc, id: string, len: number, map: (v: number[]) => number[]): Doc {\n const fits = (v: Key[\"v\"]): v is number[] => Array.isArray(v) && v.length === len && typeof v[0] === \"number\";\n return { ...doc, animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.map(t =>\n (t.target === \"deform\" && t.id === id && t.prop === \"vertices\"\n ? { ...t, keys: t.keys.map(k => (fits(k.v) ? { ...k, v: map(k.v) } : k)) }\n : t) as Track) })) };\n}\n\n/**\n * Create or replace a PATH attachment. Two forms, exactly one per call:\n * `points` \u2014 anchors in DOCUMENT space; the curve is rebuilt with Catmull-Rom tangents (the agent's form).\n * `vertices` / `weights` \u2014 raw control points, [cPrev, p, cNext] per anchor, in the slot bone's space\n * (or skinned), which is the ONLY form that preserves authored tangents and weights.\n * `lengths` are re-measured in both cases. Deform tracks whose length no longer fits are dropped.\n * `closed` and `constantSpeed` keep the attachment's current values when it already exists.\n */\nexport function setPathAttachment(doc: Doc, id: string, slot: string, geom: PathGeometryIn): { doc: Doc; dropped: string[] } {\n const cur = doc.attachments.find(a => a.id === id);\n if (cur && cur.type !== \"path\") throw new Error(`attachment \"${id}\" is a ${cur.type}, not a path`);\n if (!doc.slots.some(s => s.id === slot)) throw new Error(`unknown slot \"${slot}\"`);\n const raw = geom.vertices ?? geom.weights;\n if ((geom.points ? 1 : 0) + (raw ? 1 : 0) !== 1)\n throw new Error(`attachment \"${id}\": give exactly one of \\`points\\` (anchors, re-smoothed) or \\`vertices\\`/\\`weights\\` (raw control points)`);\n if (geom.vertices && geom.weights) throw new Error(`attachment \"${id}\": give vertices OR weights, not both (a path has one rest shape)`);\n const closed = geom.closed ?? (cur?.type === \"path\" ? cur.closed : false);\n const skel = evaluate(doc, new Map());\n // constantSpeed: the runtime measures the posed curve itself, so the stored `lengths` stay an estimate\n const constantSpeed = cur?.type === \"path\" ? cur.constantSpeed : true;\n if (geom.points) {\n const geometry = pathFromPoints(skel, slot, geom.points, closed);\n return putPath(doc, { id, slot, type: \"path\", ...geometry, closed, constantSpeed });\n }\n if (geom.vertices && geom.vertices.length % 6 !== 0)\n throw new Error(`attachment \"${id}\": vertices must hold three control points [cPrev, p, cNext] per anchor (a multiple of 6 numbers), got ${geom.vertices.length}`);\n if (geom.weights && geom.weights.length % 3 !== 0)\n throw new Error(`attachment \"${id}\": weights must hold three control points [cPrev, p, cNext] per anchor (a multiple of 3 lists), got ${geom.weights.length}`);\n const data = geom.vertices ? { vertices: geom.vertices } : { weights: geom.weights! };\n const anchors = anchorCount(geom.vertices ? geom.vertices.length / 2 : geom.weights!.length);\n if (anchors < 2) throw new Error(`attachment \"${id}\": a path needs at least two anchors, got ${anchors}`);\n if (closed && anchors < 3) throw new Error(`attachment \"${id}\": a closed path needs at least three anchors, got ${anchors}`);\n // measuring the curve poses every influence's bone; say which bone is missing rather than crash inside the pose\n for (const inf of geom.weights?.flat() ?? [])\n if (!skel.bones.has(inf.bone)) throw new Error(`attachment \"${id}\": weights reference unknown bone \"${inf.bone}\"`);\n const lengths = curveLengths(pathWorld(skel, id, slot, data, closed), closed);\n return putPath(doc, { id, slot, type: \"path\", ...data, lengths, closed, constantSpeed });\n}\n\n/**\n * Structural path edit. `insert` splits the curve AFTER anchor `index` at parameter `t`, which leaves the curve's\n * shape untouched (de Casteljau); `remove` drops an anchor's triple, which necessarily changes the shape.\n *\n * A skinned path stays skinned: the five control points a split touches get their influence lists \u2014 bones,\n * weights and bone-space positions alike \u2014 blended from the four the curve already had, by the split's own\n * affine coefficients (`blendInfluences`). No bone appears or disappears, every list still sums to 1, and the\n * shape is preserved in every POSE, not only in the setup one.\n *\n * `insert` also carries the DEFORM tracks through: the same coefficients blend the offsets of the same four\n * control points (`blendOffsets`), which is the identity again with `q + d` in place of `q`, so the animated\n * curve is unchanged too. That makes an insert lossless \u2014 which matters, because a single Ctrl-click on `ross`'s\n * `tail_path` reaches 17 of them. `remove` cannot make that promise (it changes the curve's shape by\n * construction), so its stale keys are still dropped and reported in `dropped`.\n */\nexport function pathAnchorOp(doc: Doc, id: string, op: \"insert\" | \"remove\", index: number, t = 0.5): { doc: Doc; dropped: string[] } {\n const att = doc.attachments.find(a => a.id === id);\n if (!att || att.type !== \"path\") throw new Error(`attachment \"${id}\" is not a path`);\n const count = vertexCount(att);\n const anchors = anchorCount(count);\n if (!Number.isInteger(index) || index < 0 || index >= anchors)\n throw new Error(`path \"${id}\": anchor ${index} is out of range (${anchors} anchors)`);\n const skel = evaluate(doc, new Map());\n const world = toPoints(attachmentWorldVertices(skel, att.slot, att));\n\n if (op === \"remove\") {\n if (anchors - 1 < (att.closed ? 3 : 2))\n throw new Error(`path \"${id}\": a path needs at least two anchors (three when closed), so anchor ${index} cannot be removed`);\n const data = att.weights ? { weights: removeTriple(att.weights, index) } : { vertices: flatten(removeTriple(toPoints(att.vertices!), index)) };\n const lengths = curveLengths(flatten(removeTriple(world, index)), att.closed);\n return putPath(doc, { ...att, ...data, lengths });\n }\n\n if (!att.closed && index >= anchors - 1)\n throw new Error(`path \"${id}\": anchor ${index} is the last anchor of an OPEN path, so there is no segment after it to split (insert after anchors 0\u2026${anchors - 2}, or close the path)`);\n if (!(t > 0 && t < 1)) throw new Error(`path \"${id}\": the split parameter must lie strictly inside the curve (0 < t < 1), got ${t}`);\n const { cNextI, triple, cPrevNext, coeffs } = splitCurve(flatten(world), att.closed, index, t);\n const lengths = curveLengths(flatten(insertTriple(world, index, cNextI, triple, cPrevNext)), att.closed);\n // the four SOURCE control points every coefficient row is over: p_i, cNext_i, cPrev_{i+1}, p_{i+1}, wrapped\n // exactly as `samplePath` wraps them, so the last curve of a closed path reads across entry 0\n const src = <T>(items: T[]): T[] => [1, 2, 3, 4].map(k => items[(index * 3 + k) % count]);\n /**\n * The DEFORM tracks come through the split instead of being thrown away. A key holds offsets that add to the\n * stored position inside each bone's frame, so blending them with the SAME de Casteljau coefficients as the\n * rest data preserves the same identity (`blendOffsets`): the inserted anchor sits on the DEFORMED curve in\n * every pose, at every time, exactly as its rest position sits on the rest curve. `ross`'s `tail_path` carries\n * 17 of these tracks and one Ctrl-click used to discard all 17.\n */\n const withKeys = (grow: (chunks: number[][]) => number[][]) =>\n mapVertexKeys(doc, id, deformLength(att), v => grow(offsetChunks(att, v)).flat());\n if (!att.weights) {\n // only the five points the split touches are re-derived; the rest keep their stored values to the last\n // decimal, instead of drifting through a world round trip that should have been the identity\n const inv = invert(skel.bones.get(doc.slots.find(s => s.id === att.slot)!.bone)!.world);\n const local = (p: Pt): Pt => { const [x, y] = apply(inv, p[0], p[1]); return [round6(x), round6(y)]; };\n const vertices = flatten(insertTriple(toPoints(att.vertices!), index, local(cNextI), [local(triple[0]), local(triple[1]), local(triple[2])], local(cPrevNext)));\n // one bone, so a control point's offset is one pair and the blend is the plain affine combination\n const grown = withKeys(c => { const s4 = src(c), at = (k: number) => blendPairs(s4, coeffs[k]); return insertTriple(c, index, at(0), [at(1), at(2), at(3)], at(4)); });\n return putPath(grown, { ...att, vertices, lengths });\n }\n // The blend consumes the whole influence lists, positions and all \u2014 see `blendInfluences` for why the world\n // points play no part here: a split rebuilt from them would only hold in the setup pose.\n const sources = src(att.weights);\n const at = (k: number) => blendInfluences(sources, coeffs[k]);\n const weights = insertTriple(att.weights, index, at(0), [at(1), at(2), at(3)], at(4));\n const grown = withKeys(c => { const s4 = src(c), off = (k: number) => blendOffsets(sources, s4, coeffs[k]); return insertTriple(c, index, off(0), [off(1), off(2), off(3)], off(4)); });\n return putPath(grown, { ...att, weights, lengths });\n}\n\n// ---------- animation ----------\n\n/**\n * Replace the keys of one track (creating the animation/track if missing). Manual edit \u2192 drops `preset`.\n * `merge: true` keeps existing keys except those at the given times (fix one key without retyping all).\n */\nexport function setKeys(doc: Doc, animId: string, track: Omit<Track, \"keys\">, keys: KeyInput[], duration?: number, opts: { merge?: boolean } = {}): Doc {\n const anim = doc.animations.find(a => a.id === animId) ?? { id: animId, duration: duration ?? 1, loop: false, tracks: [], events: [] };\n const same = (t: Track) => t.target === track.target && t.id === track.id && t.prop === track.prop;\n const old = anim.tracks.find(same);\n const given = keys.map(k => ({ ...k, ease: k.ease ?? (\"ease_in_out\" as const) }));\n const kept = opts.merge ? (anim.tracks.find(same)?.keys ?? []).filter(k => !given.some(g => Math.abs(g.t - k.t) < 1e-9)) : [];\n const sorted = [...kept, ...given].sort((a, b) => a.t - b.t);\n // replaced in place, never moved to the end: the editor's timeline rows are this order, and re-keying one\n // property must not shuffle the rows inside its group under the user's cursor\n const edited = { ...old, ...track, interpolation: track.interpolation ?? old?.interpolation, keys: sorted } as Track;\n const tracks = anim.tracks.some(same) ? anim.tracks.map(t => (same(t) ? edited : t)) : [...anim.tracks, edited];\n const dur = duration ?? Math.max(anim.duration, ...sorted.map(k => k.t));\n const next = { ...anim, tracks, duration: dur, preset: undefined };\n return { ...doc, animations: doc.animations.some(a => a.id === animId) ? doc.animations.map(a => (a.id === animId ? next : a)) : [...doc.animations, next] };\n}\n\n/**\n * Re-tune one existing track without retyping keys: `amplitude` scales deviations from the rest value\n * (scale props as ratios), `offset` adds a constant, `timeScale` stretches key times (duration grows to fit).\n */\nexport function adjustTrack(doc: Doc, animId: string, track: Omit<Track, \"keys\">, adj: { amplitude?: number; offset?: number; timeScale?: number }): Doc {\n const anim = doc.animations.find(a => a.id === animId);\n if (!anim) throw new Error(`unknown animation \"${animId}\"`);\n const same = (t: Track) => t.target === track.target && t.id === track.id && t.prop === track.prop;\n const tr = anim.tracks.find(same);\n if (!tr) throw new Error(`unknown track ${track.target}.${track.id}.${track.prop} in \"${animId}\"`);\n if (tr.target === \"slot\" && tr.prop === \"attachment\") throw new Error(\"cannot adjust a discrete (attachment) track\");\n const rest = restValue(doc, pk(tr.target, tr.id, tr.prop)) as number;\n const ratio = tr.target === \"bone\" && (tr.prop === \"scaleX\" || tr.prop === \"scaleY\");\n const r4 = (v: number) => +v.toFixed(4) + 0;\n const keys = tr.keys.map(k => {\n let v = k.v as number;\n if (adj.amplitude !== undefined) v = ratio ? rest * (1 + (v / rest - 1) * adj.amplitude) : rest + (v - rest) * adj.amplitude;\n if (adj.offset) v += adj.offset;\n return { ...k, t: r4(adj.timeScale ? k.t * adj.timeScale : k.t), v: r4(v) };\n });\n const duration = Math.max(anim.duration, keys[keys.length - 1].t);\n const next = { ...anim, duration, tracks: anim.tracks.map(t => (same(t) ? ({ ...t, keys } as Track) : t)), preset: undefined };\n return { ...doc, animations: doc.animations.map(a => (a.id === animId ? next : a)) };\n}\n\nexport function removeAnimation(doc: Doc, id: string): Doc {\n return { ...doc, animations: doc.animations.filter(a => a.id !== id) };\n}\n\n/** Animation properties without touching keys. Creates the animation when missing. `rename` changes the id. */\nexport function setAnimation(doc: Doc, id: string, patch: { duration?: number; loop?: boolean; events?: Animation[\"events\"]; rename?: string }): Doc {\n const cur = doc.animations.find(a => a.id === id) ?? { id, duration: 1, loop: false, tracks: [], events: [] };\n const exists = doc.animations.some(a => a.id === id);\n if (patch.rename && patch.rename !== id && doc.animations.some(a => a.id === patch.rename)) throw new Error(`animation \"${patch.rename}\" exists`);\n const events = patch.events ?? cur.events;\n const last = Math.max(0, ...cur.tracks.flatMap(t => t.keys.map(k => k.t)), ...events.map(e => e.t));\n if (patch.duration !== undefined && patch.duration < last - 1e-9) throw new Error(`duration ${patch.duration}s is below the last key/event at ${last}s`);\n const next: Animation = { ...cur, id: patch.rename ?? id, duration: patch.duration ?? cur.duration, loop: patch.loop ?? cur.loop, events };\n return { ...doc, animations: exists ? doc.animations.map(a => (a.id === id ? next : a)) : [...doc.animations, next] };\n}\n\n/** Remove the keys of one track at the given times (1e-6 tolerance); an emptied track is dropped. Manual edit \u2192 drops `preset`. */\nexport function removeKeys(doc: Doc, animId: string, track: Omit<Track, \"keys\">, times: number[]): Doc {\n const anim = doc.animations.find(a => a.id === animId);\n if (!anim) throw new Error(`unknown animation \"${animId}\"`);\n const same = (t: Track) => t.target === track.target && t.id === track.id && t.prop === track.prop;\n const tr = anim.tracks.find(same);\n if (!tr) throw new Error(`unknown track ${track.target}.${track.id}.${track.prop} in \"${animId}\"`);\n const keys = tr.keys.filter(k => !times.some(t => Math.abs(k.t - t) < 1e-6));\n const tracks = keys.length ? anim.tracks.map(t => (same(t) ? ({ ...t, keys } as Track) : t)) : anim.tracks.filter(t => !same(t));\n return { ...doc, animations: doc.animations.map(a => (a.id === animId ? { ...a, tracks, preset: undefined } : a)) };\n}\n\n/**\n * Exactly the bone properties `mirrorX` flips. Conjugating a bone's local transform by the reflection\n * F = diag(-1, 1) gives F\u00B7affineOf(x, y, r, sx, sy, shx, shy)\u00B7F = affineOf(-x, y, -r, sx, sy, -shx, -shy):\n * F\u00B7M\u00B7F maps (a, b, c, d) to (a, -b, -c, d), and the y axis cos(-r+90-shy), sin(-r+90-shy) is the only way to\n * reach (-c, d) \u2014 with shearY LEFT POSITIVE the y axis is off by 2\u00B7shearY, which `ross`, having shearY tracks,\n * would show. The scales are lengths and survive; y survives because the reflection is across the y axis.\n */\nconst MIRRORED_BONE_PROPS = new Set([\"x\", \"rotation\", \"shearX\", \"shearY\"]);\n\n/**\n * Copy every `target: \"bone\"` track of each `from[i]` bone onto `to[i]`, pair by pair, replacing whatever\n * `to[i]` already held for that prop. `phase` rotates each key's time by a fraction of the animation's duration,\n * wrapping around (0.5 = half a cycle later, 1 is a full turn \u2014 the same identity as 0); `mirrorX` negates the\n * props in `MIRRORED_BONE_PROPS`. A source bone with no bone tracks is collected into `empty` rather than failing the\n * call \u2014 an agent may name a whole limb when only half of it is animated.\n *\n * Easing belongs to the key that STARTS a segment, so rotating keys around the end can split the segment that\n * ran from the last key to the first: on a looping animation that is the same segment and nothing is lost, on a\n * one-shot animation it is a different curve \u2014 `rig_copy_tracks` says so once when that applies. A track keyed at\n * both 0 and `duration` (the standard closed-loop shape) keys the SAME point of the circle twice; any nonzero\n * shift would send both copies to the same time, so the duplicate at `duration` is dropped before shifting. That\n * is lossless when the two ends agree (the ordinary case: the cycle returns to where it started). Nothing forces\n * them to \u2014 a tail can author a different rest angle at the loop's seam \u2014 so a drop where they DISAGREE is\n * collected into `lossy` (bone, prop, both values) instead of silently discarding the segment between them: not\n * an error (the source shape is legal), not something to nudge either key to avoid (there is no basis to pick\n * which end wins), just a fact the caller needs to hear.\n */\nexport function copyTracks(doc: Doc, animId: string, from: string[], to: string[], opts: { phase?: number; mirrorX?: boolean }): { doc: Doc; copied: number; empty: string[]; lossy: string[] } {\n const phase = opts.phase ?? 0, mirrorX = opts.mirrorX ?? false;\n if (from.length !== to.length) throw new Error(`from (${from.length} bones) and to (${to.length} bones) must have the same length, pair by pair`);\n const overlap = [...new Set(from)].filter(id => to.includes(id));\n if (overlap.length) throw new Error(`bone${overlap.length === 1 ? \"\" : \"s\"} in both from and to: ${overlap.join(\", \")} \u2014 the result would depend on order`);\n const dupTo = [...new Set(to)].filter(id => to.filter(x => x === id).length > 1);\n if (dupTo.length) throw new Error(`bone${dupTo.length === 1 ? \"\" : \"s\"} repeated in to: ${dupTo.join(\", \")} \u2014 the last pair would silently win`);\n if (!(phase >= 0 && phase <= 1)) throw new Error(`phase must be 0..1, got ${phase}`);\n const anim = doc.animations.find(a => a.id === animId);\n if (!anim) throw new Error(`unknown animation \"${animId}\"`);\n for (const id of [...from, ...to]) if (!doc.bones.some(b => b.id === id)) throw new Error(`unknown bone \"${id}\"`);\n\n // phase 1 is a full turn: the same identity as phase 0. Both are worth naming, not folded into \"shift\", because\n // a key at `duration` and a key at 0 are the SAME point of the circle \u2014 the standard closed-loop shape keys\n // both \u2014 so ANY nonzero rotation sends them to the same time, and shift === 0 is the only case with nothing to\n // reconcile at all.\n const shift = (phase % 1) * anim.duration;\n const empty: string[] = [], lossy: string[] = [];\n let copied = 0, next = doc;\n for (let i = 0; i < from.length; i++) {\n const srcId = from[i], dstId = to[i];\n let any = false;\n for (const t of anim.tracks) {\n if (t.target !== \"bone\" || t.id !== srcId) continue;\n any = true;\n const mirror = mirrorX && MIRRORED_BONE_PROPS.has(t.prop);\n // the key at 0 already starts the cycle (and keeps its ease into the next key); its duplicate at `duration`\n // \u2014 the standard shape for a track that closes a loop \u2014 would collide with it the instant a nonzero shift\n // moves either one, so it is the duplicate that goes. When the two ends don't actually agree, dropping the\n // second one throws away real authored data (the segment leading up to it) \u2014 say so, once per track.\n const dropDuplicate = shift !== 0 && t.keys.some(k => k.t === 0);\n if (dropDuplicate) {\n const zero = t.keys.find(k => k.t === 0)!;\n for (const dup of t.keys.filter(k => k.t === anim.duration))\n if (Math.abs((dup.v as number) - (zero.v as number)) > 1e-6) lossy.push(`${srcId}.${t.prop}: ${zero.v} vs ${dup.v}`);\n }\n const kept = dropDuplicate ? t.keys.filter(k => k.t !== anim.duration) : t.keys;\n const keys = kept.map(k => {\n if (shift === 0) return { t: k.t, v: mirror ? -(k.v as number) : k.v, ease: k.ease };\n // round BEFORE comparing to `duration`: raw floating point leaves whether a key that landed within\n // ~5e-7 of the boundary counts as \"wrapped\" a coin flip, which is visible on ross's 33ms `setup` animation\n const shifted = round6(k.t + shift);\n return { t: shifted >= anim.duration ? shifted - anim.duration : shifted, v: mirror ? -(k.v as number) : k.v, ease: k.ease };\n });\n next = setKeys(next, animId, { target: \"bone\", id: dstId, prop: t.prop as \"x\", interpolation: t.interpolation }, keys);\n copied++;\n }\n if (!any) empty.push(srcId);\n }\n return { doc: next, copied, empty, lossy };\n}\n\n// ---------- describe (compact text for agents) ----------\n\nconst n3 = (v: number) => String(Math.round(v * 1000) / 1000);\n/** compact key summary for one track: count and value range (or the set of discrete values) */\nexport function trackSummary(t: Track): string {\n const nums = t.keys.map(k => k.v).filter((v): v is number => typeof v === \"number\");\n const range = nums.length ? `[${n3(Math.min(...nums))}..${n3(Math.max(...nums))}]` : `{${[...new Set(t.keys.map(k => String(k.v)))].join(\",\")}}`;\n return `${t.keys.length} key${t.keys.length === 1 ? \"\" : \"s\"} ${range}`;\n}\n\n// ---------- rename ----------\n\nexport type RenameKind = \"bone\" | \"slot\" | \"attachment\" | \"asset\" | \"constraint\";\n\n/**\n * Rename one thing and every reference to it (spec \u00A73). A bone is named by bone parents, slots, ik/transform\n * chains and targets, path chains, every mesh/path influence and bone tracks; a slot by its attachments, path\n * constraint targets (those aim at a slot), slot tracks and every drawOrder key; an attachment by the slot that\n * shows it, `attachment` key values and deform tracks; an asset by regions and meshes; a constraint by its own\n * tracks. Roles are not ids and stay. Templates in presets.json are a separate file and are NOT rewritten.\n */\nexport function rename(doc: Doc, kind: RenameKind, id: string, to: string): Doc {\n if (!ID_RE.test(to)) throw new Error(`\"${to}\" is not a snake_case id`);\n if (to === id) return doc;\n const sub = (v: string) => (v === id ? to : v);\n const subKeys = (t: Track, pred: boolean, f: (v: Key[\"v\"]) => Key[\"v\"]): Track => (pred ? { ...t, keys: t.keys.map(k => ({ ...k, v: f(k.v) })) } : t);\n const retrack = (target: Track[\"target\"]) => (t: Track): Track => (t.target === target && t.id === id ? { ...t, id: to } : t);\n const tracks = (f: (t: Track) => Track): Doc => ({ ...doc, animations: doc.animations.map(a => ({ ...a, tracks: a.tracks.map(f) })) });\n const taken = (list: { id: string }[], what: string) => { if (list.some(x => x.id === to)) throw new Error(`${what} \"${to}\" already exists`); };\n const known = (list: { id: string }[], what: string) => { if (!list.some(x => x.id === id)) throw new Error(`unknown ${what} \"${id}\"`); };\n const influences = (a: Attachment): Attachment => (a.type === \"region\" || !a.weights ? a : { ...a, weights: a.weights.map(l => l.map(i => ({ ...i, bone: sub(i.bone) }))) });\n switch (kind) {\n case \"bone\": {\n known(doc.bones, \"bone\"); taken(doc.bones, \"bone\");\n doc = tracks(retrack(\"bone\"));\n return { ...doc,\n bones: doc.bones.map(b => ({ ...b, id: sub(b.id), ...(b.parent ? { parent: sub(b.parent) } : {}) })),\n slots: doc.slots.map(s => ({ ...s, bone: sub(s.bone) })),\n ik: doc.ik.map(c => ({ ...c, bones: c.bones.map(sub), target: sub(c.target) })),\n transform: doc.transform.map(c => ({ ...c, bones: c.bones.map(sub), target: sub(c.target) })),\n path: doc.path.map(c => ({ ...c, bones: c.bones.map(sub) })),\n attachments: doc.attachments.map(influences),\n };\n }\n case \"slot\": {\n known(doc.slots, \"slot\"); taken(doc.slots, \"slot\");\n doc = tracks(t => subKeys(retrack(\"slot\")(t), t.target === \"drawOrder\", v => (Array.isArray(v) ? (v as string[]).map(sub) : v)));\n return { ...doc,\n slots: doc.slots.map(s => ({ ...s, id: sub(s.id) })),\n attachments: doc.attachments.map(a => ({ ...a, slot: sub(a.slot) })),\n path: doc.path.map(c => ({ ...c, target: sub(c.target) })),\n };\n }\n case \"attachment\": {\n known(doc.attachments, \"attachment\"); taken(doc.attachments, \"attachment\");\n doc = tracks(t => subKeys(retrack(\"deform\")(t), t.target === \"slot\" && t.prop === \"attachment\", v => (typeof v === \"string\" ? sub(v) : v)));\n return { ...doc,\n attachments: doc.attachments.map(a => ({ ...a, id: sub(a.id) })),\n slots: doc.slots.map(s => ({ ...s, attachment: s.attachment ? sub(s.attachment) : undefined, clip: s.clip ? sub(s.clip) : undefined })),\n };\n }\n case \"asset\": {\n known(doc.assets, \"asset\"); taken(doc.assets, \"asset\");\n return { ...doc,\n assets: doc.assets.map(a => ({ ...a, id: sub(a.id) })),\n attachments: doc.attachments.map(a => (a.type === \"path\" ? a : { ...a, asset: sub(a.asset) })),\n };\n }\n case \"constraint\": {\n const all = [...doc.ik, ...doc.transform, ...doc.path];\n known(all, \"constraint\"); taken(all, \"constraint\");\n const kindOf = constraintKind(doc, id)!;\n doc = tracks(retrack(kindOf));\n return { ...doc, [kindOf]: (doc[kindOf] as { id: string }[]).map(c => ({ ...c, id: sub(c.id) })) } as Doc;\n }\n }\n}\n\n/** Compact text for agents. `verbose`: slot pivot/offset and every track with its key summary (no asset prompts). */\n/**\n * One attachment in one line: what shape it is, and the counts an agent needs before it asks for the arrays.\n * `deform.<id>.vertices` keys are `deformLength` numbers long, which is 2\u00B7\u03A3 influences on a skinned shape and\n * 2\u00B7vertices otherwise, so it is stated rather than left to be derived from the two counts.\n */\nexport function describeAttachment(doc: Doc, att: Attachment): string {\n const head = `${att.type} \"${att.id}\" in slot \"${att.slot}\"`;\n if (att.type === \"region\") {\n const a = doc.assets.find(x => x.id === att.asset);\n return `${head}: asset \"${att.asset}\"${a ? ` (${a.width}x${a.height})` : \" (MISSING)\"} at (${n3(att.x)}, ${n3(att.y)}) rot ${n3(att.rotation)} scale ${n3(att.scaleX)}/${n3(att.scaleY)}`;\n }\n const n = vertexCount(att);\n const bones = att.weights ? [...new Set(att.weights.flat().map(i => i.bone))] : [];\n const skin = att.weights\n ? `skinned to ${bones.length} bone${bones.length === 1 ? \"\" : \"s\"} (${bones.join(\", \")}), ${att.weights.reduce((t, l) => t + l.length, 0)} influences`\n : `unskinned (\\`vertices\\` in slot bone \"${doc.slots.find(s => s.id === att.slot)?.bone ?? \"?\"}\"'s space)`;\n const shape = att.type === \"mesh\"\n ? `${n} vertices, ${att.triangles.length / 3} triangles, hull ${att.hull}`\n : `${n} control points = ${anchorCount(n)} anchors, ${att.closed ? \"closed\" : \"open\"}, ${att.constantSpeed ? \"constantSpeed\" : \"stored lengths\"}`;\n const keyed = doc.animations.filter(a => a.tracks.some(t => t.target === \"deform\" && t.id === att.id && t.prop === \"vertices\")).map(a => a.id);\n return `${head}: ${shape}; ${skin}; deform key length ${deformLength(att)}${keyed.length ? `; vertices keyed in ${keyed.length} animation${keyed.length === 1 ? \"\" : \"s\"} (${keyed.join(\", \")})` : \"\"}`;\n}\n\nexport function describe(doc: Doc, opts: { verbose?: boolean } = {}): string {\n const lines = [`${doc.meta.name} ${doc.meta.width}x${doc.meta.height}`];\n if (doc.meta.notes) lines.push(`notes: ${doc.meta.notes}`);\n const kids = (id?: string) => doc.bones.filter(b => b.parent === id);\n const place = (s: Slot) => {\n const extra: string[] = [];\n for (const a of doc.attachments.filter(a => a.slot === s.id)) {\n if (a.type === \"region\") extra.push(`${a.id}${a.id === a.asset ? \"\" : `=${a.asset}`}@(${n3(a.x)}, ${n3(a.y)})${a.rotation ? ` rot ${n3(a.rotation)}` : \"\"}${a.scaleX !== 1 || a.scaleY !== 1 ? ` scale ${n3(a.scaleX)}/${n3(a.scaleY)}` : \"\"}`);\n else if (a.type === \"mesh\") extra.push(`${a.id}=mesh(${a.uvs.length / 2}v, ${a.triangles.length / 3}t, hull ${a.hull}${a.weights ? `, weighted by ${[...new Set(a.weights.flat().map(i => i.bone))].join(\",\")}` : \"\"})`);\n else extra.push(`${a.id}=path`);\n }\n if (s.alpha !== 1) extra.push(`alpha ${n3(s.alpha)}`);\n if (s.blend !== \"normal\") extra.push(`blend ${s.blend}`);\n if (s.color !== \"#ffffffff\") extra.push(`color ${s.color}`);\n return extra.length ? \" [\" + extra.join(\"; \") + \"]\" : \"\";\n };\n const walk = (b: Bone, d: number) => {\n const t = b.transform, s = doc.slots.filter(s => s.bone === b.id).map(s => `${s.id}\u2192${s.attachment ?? \"\u2205\"} z${s.z}${opts.verbose ? place(s) : \"\"}`).join(\", \");\n lines.push(`${\" \".repeat(d)}\u2022 ${b.id}${b.role ? ` [${b.role}]` : \"\"} (${t.x},${t.y} r${t.rotation} s${t.scaleX}/${t.scaleY})${s ? ` slots: ${s}` : \"\"}`);\n kids(b.id).forEach(c => walk(c, d + 1));\n };\n lines.push(\"bones:\"); kids(undefined).forEach(b => walk(b, 1));\n lines.push(`assets: ${doc.assets.map(a => `${a.id}(${a.width}x${a.height})`).join(\", \") || \"none\"}`);\n // constraints: one line for the whole set in a compact summary, one line each WITH the fields that decide\n // what they do when verbose (an agent cannot judge a constraint from `id(bones\u2192target)` alone)\n const ord = (c: { order: number }) => (c.order ? ` order ${c.order}` : \"\");\n if (doc.ik.length || doc.transform.length || doc.path.length) {\n if (opts.verbose) lines.push(\"constraints:\",\n ...doc.ik.map(c => ` ik ${c.id}(${c.bones.join(\",\")}\u2192${c.target}) mix ${n3(c.mix)} bend${c.bendPositive ? \"+\" : \"-\"}${c.softness ? ` soft ${n3(c.softness)}` : \"\"}${c.compress ? \" compress\" : \"\"}${c.stretch ? \" stretch\" : \"\"}${c.uniform ? \" uniform\" : \"\"}${ord(c)}`),\n ...doc.transform.map(c => ` transform ${c.id}(${c.bones.join(\",\")}\u2192${c.target})${c.local ? \" local\" : \"\"}${c.relative ? \" relative\" : \"\"} mix ${[c.mixRotate, c.mixX, c.mixY, c.mixScaleX, c.mixScaleY, c.mixShearY].map(n3).join(\"/\")}${ord(c)}`),\n ...doc.path.map(c => ` path ${c.id}(${c.bones.join(\",\")}\u2192${c.target}) ${c.positionMode}/${c.spacingMode}/${c.rotateMode} pos ${n3(c.position)} spacing ${n3(c.spacing)} mix ${[c.mixRotate, c.mixX, c.mixY].map(n3).join(\"/\")}${ord(c)}`));\n else lines.push(`constraints: ${[...doc.ik.map(c => `ik ${c.id}(${c.bones.join(\",\")}\u2192${c.target})`), ...doc.transform.map(c => `transform ${c.id}(${c.bones.length}\u2192${c.target})`), ...doc.path.map(c => `path ${c.id}(${c.bones.length}\u2192${c.target})`)].join(\", \")}`);\n }\n lines.push(\"animations:\");\n for (const a of doc.animations) {\n lines.push(` \u2022 ${a.id} ${a.duration}s${a.loop ? \" loop\" : \"\"} ${a.tracks.length} tracks${a.preset ? ` preset=${a.preset.name} ${JSON.stringify(a.preset.params)}` : \"\"}${a.events.length ? ` events=${a.events.map(e => `${e.name}@${e.t}`).join(\",\")}` : \"\"}`);\n if (opts.verbose) for (const t of a.tracks) lines.push(` ${t.target}.${t.id}.${t.prop}: ${trackSummary(t)}`);\n }\n const errs = validate(doc);\n if (errs.length) lines.push(\"ERRORS:\", ...errs.map(e => \" \" + e));\n return lines.join(\"\\n\");\n}\n\n// ---------- pose report (agent feedback) ----------\n\nexport interface PoseReport {\n animation?: string; t: number;\n /** the animation's duration, so a caller can see that a `t` beyond it was clamped rather than sampled */\n duration?: number;\n bones: { id: string; x: number; y: number; angle: number; scaleX: number; scaleY: number;\n local: { x: number; y: number; rotation: number } }[];\n slots: { id: string; attachment: string | null; bbox?: [number, number, number, number] }[];\n}\n\n/**\n * Where every bone and slot actually IS after `evaluate`: posed, not rest \u2014 constraints have run, so this is\n * what the runtime draws. Without `animation`, the pose is empty (rest); `bones`/`slots` narrow the report and\n * an id the document does not have is an error, not a silent drop, so a typo shows up at once.\n */\nexport function poseReport(doc: Doc, opts: { animation?: string; t?: number; bones?: string[]; slots?: string[] }): PoseReport {\n const t = opts.t ?? 0;\n let pose: Pose = new Map();\n // an id that is not there gets the same answer everywhere: what was asked for, and enough of what exists to fix it\n const missing = (kind: string, id: string, have: string[]) =>\n new Error(`unknown ${kind} \"${id}\" (the document has ${have.length}: ${have.slice(0, 12).join(\", \")}${have.length > 12 ? \", \u2026\" : \"\"})`);\n let duration: number | undefined;\n if (opts.animation !== undefined) {\n const anim = doc.animations.find(a => a.id === opts.animation);\n if (!anim) throw missing(\"animation\", opts.animation, doc.animations.map(a => a.id));\n // `sample` holds the last key past the end, so a t beyond `duration` is a silently different question from\n // the one asked \u2014 not an error (a caller scrubbing past the end is legitimate), but it has to be said\n duration = anim.duration;\n pose = poseOf(anim, t);\n } else if (opts.t !== undefined) {\n // a time with nothing to sample is a mistake worth naming: the answer would have been the rest pose, silently\n throw new Error(`t=${opts.t} needs an animation to mean anything; omit it for the rest pose`);\n }\n const skel = evaluate(doc, pose);\n for (const id of opts.bones ?? []) if (!skel.bones.has(id)) throw missing(\"bone\", id, doc.bones.map(b => b.id));\n for (const id of opts.slots ?? []) if (!doc.slots.some(s => s.id === id)) throw missing(\"slot\", id, doc.slots.map(s => s.id));\n\n const bones = (opts.bones ?? doc.bones.map(b => b.id)).map(id => {\n const st = skel.bones.get(id)!;\n const { x, y, angle, scaleX, scaleY } = decompose(st.world);\n return { id, x: round6(x), y: round6(y), angle: round6(angle), scaleX: round6(scaleX), scaleY: round6(scaleY),\n local: { x: round6(st.x), y: round6(st.y), rotation: round6(st.rotation) } };\n });\n const slots = (opts.slots ?? doc.slots.map(s => s.id)).map(id => {\n const att = skel.attachment.get(id);\n const pts = slotOutline(doc, pose, id, 1, skel);\n let bbox: [number, number, number, number] | undefined;\n if (pts) {\n const xs = pts.map(p => p[0]), ys = pts.map(p => p[1]);\n bbox = [round6(Math.min(...xs)), round6(Math.min(...ys)), round6(Math.max(...xs)), round6(Math.max(...ys))];\n }\n return { id, attachment: att ? att.id : null, bbox };\n });\n return { animation: opts.animation, t, duration, bones, slots };\n}\n\n/**\n * A bone sent to a point in DOCUMENT coordinates \u2014 the gesture a human gets by dragging the bone in the editor.\n *\n * The point is converted through the parent's world matrix TAKEN FROM THE POSE AT `t`, never from rest: a goal\n * solved against the setup pose is exact at rest and off by the parent's animated turn in every other frame.\n * Which bone is actually written follows the editor's rule (`Stage.grabDriven`), because a bone a solver owns\n * cannot be posed by writing it \u2014 a live ik hands the edit to its target bone, a live transform or path refuses.\n */\nexport function setGoal(doc: Doc, bone: string, x: number, y: number, opts: { animation?: string; t?: number; ease?: EaseSpec }): { doc: Doc; wrote: string; redirected?: string; origin: Pt; tip: Pt } {\n if (!doc.bones.some(b => b.id === bone)) throw new Error(`unknown bone \"${bone}\"`);\n // the same refusal rig_get_pose makes: a time with nothing to sample would silently mean \"the rest pose\",\n // and an easing with no key to carry it is the same kind of argument that quietly does nothing\n const stray = opts.t !== undefined ? `t=${opts.t}` : opts.ease !== undefined ? \"ease\" : undefined;\n if (opts.animation === undefined && stray)\n throw new Error(`${stray} needs an animation to mean anything; omit it to move the setup pose`);\n const t = opts.t ?? 0;\n // an animation that does not exist yet has no keys, so its pose is the rest one; `setKeys` creates it below\n const anim = opts.animation === undefined ? undefined : doc.animations.find(a => a.id === opts.animation);\n const pose: Pose = anim ? poseOf(anim, t) : new Map();\n\n const driver = driverAt(doc, pose, bone);\n if (driver && driver.kind !== \"ik\")\n // no \"move its target\" here: a path constraint's target is a SLOT, and a transform constraint with mixX/mixY\n // at 0 does not take its follower's position from the target at all \u2014 the mix is the only general remedy\n throw new Error(`bone \"${bone}\" is driven by ${driver.kind} constraint \"${driver.id}\"${anim ? ` at t=${t}` : \"\"}: the solver overwrites whatever is written here \u2014 ` +\n `edit the constraint, or key its mix to 0 where you want to pose the bone by hand`);\n const wrote = driver ? driver.target : bone;\n const written = doc.bones.find(b => b.id === wrote);\n if (!written) throw new Error(`ik \"${driver!.id}\" drives \"${bone}\" but its target bone \"${wrote}\" is gone`);\n\n const parent = written.parent ? evaluate(doc, pose).bones.get(written.parent)!.world : undefined;\n // 9 decimals, the same digits the editor's gizmos write (`round9`, editor/gizmos.ts): re-evaluating the rig\n // still reproduces the world matrix, and rig.json keeps no 17-digit float for a round number\n const [lx, ly] = (parent ? apply(invert(parent), x, y) : [x, y]).map(v => +v.toFixed(9) + 0); // a root bone's parent space IS the document\n const redirected = driver?.id;\n let next = doc;\n if (opts.animation === undefined) next = updateBone(doc, wrote, { transform: { x: lx, y: ly } });\n else for (const [prop, v] of [[\"x\", lx], [\"y\", ly]] as const)\n next = setKeys(next, opts.animation, { target: \"bone\", id: wrote, prop } as Omit<Track, \"keys\">, [{ t, v, ease: opts.ease }], undefined, { merge: true });\n\n // Writing the local x/y that solves for the goal is not the same as the goal landing. `driverAt` was asked\n // about `bone`; nobody asked about `wrote` \u2014 an ik target can itself sit under a live transform constraint, or\n // be parented INSIDE the chain that aims at it (devil's `devil_leg_l_ik` hangs off `devil_foot_l_ik`, and a\n // goal on `devil_foot_l` ends 3300 px away). A human sees the limb fly across the canvas; the agent sees \"ok\".\n // So the answer is checked against an evaluate of the RESULT, once, where every path meets.\n const after: Pose = opts.animation === undefined ? new Map() : poseOf(next.animations.find(a => a.id === opts.animation)!, t);\n const skel = evaluate(next, after);\n const landed = skel.bones.get(wrote)!.world;\n const miss = Math.hypot(landed.tx - x, landed.ty - y);\n // the reviewer's ross sweep put 3570 goals within 8e-10 px, so a 1e-3 px miss is a real one, not rounding\n if (miss > 1e-3) {\n const owner = driverAt(next, after, wrote);\n const chain = redirected ? (doc.ik.find(c => c.id === redirected)?.bones ?? []) : [];\n const inChain: string[] = [];\n for (let p = written.parent; p; p = doc.bones.find(b => b.id === p)?.parent) if (chain.includes(p)) inChain.push(p);\n throw new Error(`\"${wrote}\" ended at ${round6(landed.tx)}, ${round6(landed.ty)} \u2014 ${round6(miss)} px from the goal ${x}, ${y}; nothing was written. ` +\n (owner ? `\"${wrote}\" is itself driven by ${owner.kind} constraint \"${owner.id}\"${anim ? ` at t=${t}` : \"\"}: key its mix to 0 there, or aim at a bone the solver does not own.`\n : inChain.length ? `\"${wrote}\" hangs off \"${inChain[0]}\", which ik \"${redirected}\" moves: the target follows what it aims, so no local value settles. Reparent it outside the chain.`\n : `something downstream of the write moves it \u2014 check what \"${wrote}\" inherits.`));\n }\n const named = skel.bones.get(bone)!;\n const pt = (p: [number, number]): Pt => [round6(p[0]), round6(p[1])];\n return { doc: next, wrote, redirected,\n origin: pt([named.world.tx, named.world.ty]),\n tip: pt(apply(named.world, doc.bones.find(b => b.id === bone)!.length, 0)) };\n}\n", "/**\n * rig-import-layers \u2014 node-only: reads PNG layers off disk and imports them into a RigDocument.\n * Split out of rig-tools.ts so that module stays browser-bundleable (no node:* imports).\n */\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport { RigSchema, Attachment, type RigDocument } from \"./rig-format\";\nimport { setSlot, setAttachment, addBone } from \"./rig-tools\";\nimport { apply, invert, evaluate, type Affine } from \"./rig-anim\";\n\ntype Doc = RigDocument;\n\n// ---------- import layers ----------\n\n/**\n * Optional sidecar `layers.json` in the layers dir (written by the segmentation step):\n * [{ \"file\": \"arm_l.png\", \"id\": \"arm_l\", \"role\": \"arm_l\", \"parent\": \"torso\", \"z\": 3,\n * \"bbox\": [x, y, w, h], \"joint\": [x, y], \"inpainted\": true, \"prompt\": \"...\" }]\n * Without it: every PNG is a full-canvas layer, id/role from filename (`03_arm_l.png` \u2192 z=3, id=arm_l).\n * Layers are assumed to share the document canvas size unless bbox is given.\n */\nexport interface LayerSpec {\n file: string; id?: string; role?: string; parent?: string; z?: number;\n bbox?: [number, number, number, number]; joint?: [number, number];\n inpainted?: boolean; prompt?: string; sourceImage?: string;\n /** swap patch (closed eyes, mouth shape): no bone of its own, slot on `parent`'s bone, hidden until an animation shows it */\n swap?: boolean;\n /** attach to this existing bone instead of creating one (accessory drawn with the bone, e.g. a hat on `head`) */\n bone?: string;\n /** slot id for swap layers; several assets with the same `slot` become one hidden slot (mouth shapes) */\n slot?: string;\n /** blend mode of the slot (`add` for glow/fire layers painted on black) */\n blend?: \"normal\" | \"add\" | \"multiply\" | \"screen\";\n}\n\nconst DEFAULT_PARENT: Record<string, string> = {\n head: \"neck\", neck: \"torso\", torso: \"hips\", hips: \"root\", body: \"root\",\n arm_l: \"torso\", arm_r: \"torso\", arm_upper_l: \"torso\", arm_upper_r: \"torso\",\n forearm_l: \"arm_upper_l\", forearm_r: \"arm_upper_r\", hand_l: \"forearm_l\", hand_r: \"forearm_r\",\n leg_l: \"hips\", leg_r: \"hips\", hair: \"head\", eyes: \"head\", mouth: \"head\",\n};\n\nexport function pngSize(buf: Buffer): [number, number] {\n if (buf.length < 24 || buf.readUInt32BE(0) !== 0x89504e47 || buf.readUInt32BE(4) !== 0x0d0a1a0a) throw new Error(\"not a PNG (bad signature)\");\n if (buf.readUInt32BE(12) !== 0x49484452) throw new Error(\"not a PNG (IHDR missing)\");\n return [buf.readUInt32BE(16), buf.readUInt32BE(20)];\n}\n\nexport async function importLayers(doc: Doc, dir: string, relPrefix = \"layers\"): Promise<Doc> {\n let specs: LayerSpec[];\n try { specs = JSON.parse(await readFile(join(dir, \"layers.json\"), \"utf8\")); }\n catch (e) {\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") throw e;\n specs = (await readdir(dir)).filter(f => f.endsWith(\".png\")).sort().map(file => ({ file }));\n }\n if (!Array.isArray(specs)) throw new Error(\"layers.json must be an array\");\n\n let next = doc;\n const parsed: (LayerSpec & { id: string; z: number; role?: string; w: number; h: number; bbox: [number, number, number, number] })[] = [];\n for (const s of specs) {\n const buf = await readFile(join(dir, s.file));\n const [w, h] = pngSize(buf);\n const m = basename(s.file, \".png\").match(/^(?:(\\d+)_)?(.+)$/)!;\n const id = s.id ?? m[2].toLowerCase().replace(/[^a-z0-9_]/g, \"_\");\n const z = s.z ?? (m[1] ? +m[1] : parsed.length);\n const role = s.role ?? (DEFAULT_PARENT[id] || id === \"root\" ? id : undefined);\n const bbox: [number, number, number, number] = s.bbox ?? [0, 0, w, h];\n if (bbox.length !== 4 || bbox.some(v => !Number.isFinite(v)) || bbox[2] <= 0 || bbox[3] <= 0)\n throw new Error(`layer \"${id}\": bbox must have positive width and height`);\n parsed.push({ ...s, id, z, role, w, h, bbox });\n }\n const ids = new Set(parsed.map(p => p.id));\n const rootId = next.bones.find(b => !b.parent)!.id;\n const exists = (id: string) => ids.has(id) || next.bones.some(b => b.id === id);\n // explicit parent, else walk the role chain (head\u2192neck\u2192torso\u2192hips\u2192root) to the first bone that exists\n const resolveParent = (p: (typeof parsed)[number]): string => {\n if (p.parent) { if (!exists(p.parent)) throw new Error(`layer \"${p.id}\": unknown parent \"${p.parent}\"`); return p.parent; }\n let cur = p.role && DEFAULT_PARENT[p.role];\n while (cur && !exists(cur)) cur = DEFAULT_PARENT[cur];\n return cur ?? rootId;\n };\n // the bone a layer hangs from: explicit `bone`, else its (resolved) parent\n const dependency = (p: (typeof parsed)[number]) => {\n if (p.bone) { if (!exists(p.bone)) throw new Error(`layer \"${p.id}\": unknown bone \"${p.bone}\"`); return p.bone; }\n return resolveParent(p);\n };\n const pending = [...parsed];\n while (pending.length) {\n const i = pending.findIndex(p => next.bones.some(b => b.id === dependency(p)));\n const p = pending.splice(i < 0 ? 0 : i, 1)[0];\n const target = dependency(p);\n if (!next.bones.some(b => b.id === target)) throw new Error(`layer \"${p.id}\": bone \"${target}\" is neither in the rig nor in the import`);\n const [bx, by, bw, bh] = p.bbox;\n const joint = p.joint ?? [bx + bw / 2, by + bh / 2];\n const host = evaluate(next, new Map()).bones.get(target)!.world;\n if (Math.abs(host.a * host.d - host.b * host.c) < 1e-10) throw new Error(`layer \"${p.id}\": singular host transform`);\n next = { ...next, assets: [...next.assets, RigSchema.shape.assets.element.parse({\n id: p.id, src: `${relPrefix}/${p.file}`, width: p.w, height: p.h,\n origin: { bboxSpace: \"document\", sourceImage: p.sourceImage, bbox: s_bbox(p), inpainted: p.inpainted ?? false, prompt: p.prompt },\n })] };\n const place = (slotId: string) => {\n const slot = next.slots.find(s => s.id === slotId)!;\n const inv = invert(evaluate(next, new Map()).bones.get(slot.bone)!.world);\n const [x, y] = apply(inv, bx + bw / 2, by + bh / 2);\n const m: Affine = { a: inv.a * bw / p.w, b: inv.b * bw / p.w, c: inv.c * bh / p.h, d: inv.d * bh / p.h, tx: x, ty: y };\n const sx = Math.hypot(m.a, m.b), sy = Math.hypot(m.c, m.d);\n if (Math.abs(m.a * m.c + m.b * m.d) > 1e-8 * sx * sy) {\n // Regions have no shear. A four-vertex mesh preserves all corners exactly.\n const vertices = [[bx, by], [bx + bw, by], [bx + bw, by + bh], [bx, by + bh]].flatMap(([x, y]) => apply(inv, x, y));\n const att = Attachment.parse({ id: p.id, slot: slotId, type: \"mesh\", asset: p.id, vertices, uvs: [0, 0, 1, 0, 1, 1, 0, 1], triangles: [0, 1, 2, 0, 2, 3], hull: 4 });\n next = { ...next, attachments: [...next.attachments.filter(a => a.id !== p.id), att] };\n } else next = setAttachment(next, { id: p.id, slot: slotId, asset: p.id, x: +x.toFixed(12), y: +y.toFixed(12), rotation: Math.atan2(m.b, m.a) * 180 / Math.PI, scaleX: sx, scaleY: (m.a * m.d - m.b * m.c < 0 ? -1 : 1) * sy });\n };\n if (p.swap || p.bone) {\n const slotId = p.slot ?? p.id;\n if (!next.slots.some(s => s.id === slotId)) next = setSlot(next, { id: slotId, bone: target, z: p.z, blend: p.blend });\n place(slotId);\n if (!p.swap) next = setSlot(next, { id: slotId, attachment: p.id });\n continue;\n }\n if (!next.bones.some(b => b.id === p.id)) {\n const [x, y] = apply(invert(host), ...joint);\n next = addBone(next, { id: p.id, parent: target, role: p.role, transform: { x, y } });\n }\n next = setSlot(next, { id: p.id, bone: p.id, z: p.z, blend: p.blend });\n place(p.id);\n next = setSlot(next, { id: p.id, attachment: p.id });\n }\n return next;\n}\n\nconst s_bbox = (p: { bbox: [number, number, number, number] }) => p.bbox;\n", "/**\n * rig-presets v1 \u2014 parametric animation generators.\n *\n * A preset = (doc, params) \u2192 Animation. The Animation keeps `preset: {name, params}`\n * so an agent can re-tune params instead of editing keys.\n * Presets pick bones by `role`; missing roles are skipped, root is the fallback.\n * Image deformation (rig-deform.ts) goes through `deform` tracks on slots: breathing bulges the torso\n * image with the neck and waist pinned instead of scaling the torso bone (which stretched children).\n */\nimport type { RigDocument, Animation, Track, Bone, Slot } from \"./rig-format\";\nimport { affineOf, apply } from \"./rig-anim\";\n\ntype Key = Track[\"keys\"][number];\ntype Ease = Key[\"ease\"];\n\n// ---------- helpers ----------\n\nconst root = (doc: RigDocument) => doc.bones.find(b => !b.parent)!;\nconst byRole = (doc: RigDocument, ...roles: string[]) =>\n doc.bones.filter(b => b.role && roles.includes(b.role));\n/** the visible slot that carries a bone's image: same id as the bone, else the first attached slot on it */\nconst slotOfBone = (doc: RigDocument, bone: Bone): Slot | undefined =>\n doc.slots.find(s => s.bone === bone.id && s.id === bone.id && s.attachment) ?? doc.slots.find(s => s.bone === bone.id && s.attachment);\nconst requireSlot = (doc: RigDocument, id: string): Slot => {\n const s = doc.slots.find(s => s.id === id);\n if (!s) throw new Error(`unknown slot \"${id}\"`);\n return s;\n};\n\n/** sample f(t) into keys */\nfunction sampled(duration: number, n: number, f: (t: number) => number, ease: Ease = \"linear\"): Key[] {\n const keys: Key[] = [];\n for (let i = 0; i <= n; i++) {\n const t = +((duration * i) / n).toFixed(4);\n keys.push({ t, v: +f(t).toFixed(4) + 0, ease });\n }\n return keys;\n}\n\nfunction boneTrack(bone: Bone, prop: \"x\" | \"y\" | \"rotation\" | \"scaleX\" | \"scaleY\", keys: Key[]): Track {\n return { target: \"bone\", id: bone.id, prop, keys };\n}\n/** lattice deform on the slot's REST attachment (deform tracks target attachments) */\nfunction deformTrack(slot: Slot, prop: string, keys: Key[]): Track | undefined {\n return slot.attachment ? { target: \"deform\", id: slot.attachment, prop, keys } : undefined;\n}\nconst pushTrack = (tracks: Track[], t: Track | undefined) => { if (t) tracks.push(t); };\nfunction slotTrack(slot: Slot, prop: \"alpha\" | \"attachment\" | \"z\", keys: Key[]): Track {\n return { target: \"slot\", id: slot.id, prop, keys };\n}\n\n/** keys as explicit [t, v, ease?] tuples \u2014 for hand-shaped curves */\nconst K = (...pts: [number, number, Ease?][]): Key[] =>\n pts.map(([t, v, e]) => ({ t, v, ease: e ?? \"ease_in_out\" }));\n/** discrete keys: [t, value] with step easing */\nconst S = (...pts: [number, string | null][]): Key[] => pts.map(([t, v]) => ({ t, v, ease: \"step\" }));\n\nexport interface Preset<P> {\n name: string;\n defaults: P;\n build(doc: RigDocument, params: P): Animation;\n}\n\nfunction finish<P>(name: string, id: string, duration: number, loop: boolean, tracks: Track[], params: P): Animation {\n return { id, duration, loop, tracks, events: [], preset: { name, params: params as Record<string, unknown> } };\n}\n\n// ---------- idle_breathing ----------\n\nexport interface IdleBreathingParams {\n id: string;\n period: number; // seconds per breath\n amplitude: number; // torso bulge (fraction of the image width) \u2014 or scaleY delta when the torso bone has no image\n headBob: number; // px\n armSway: number; // degrees\n}\n\nexport const idleBreathing: Preset<IdleBreathingParams> = {\n name: \"idle_breathing\",\n defaults: { id: \"idle\", period: 2.4, amplitude: 0.03, headBob: 3, armSway: 2 },\n build(doc, p) {\n const T = p.period, w = (2 * Math.PI) / T, tracks: Track[] = [];\n const torso = byRole(doc, \"torso\", \"body\")[0] ?? root(doc);\n const heads = byRole(doc, \"head\");\n const armsL = byRole(doc, \"arm_l\", \"arm_upper_l\");\n const armsR = byRole(doc, \"arm_r\", \"arm_upper_r\");\n\n const chest = slotOfBone(doc, torso);\n if (chest?.attachment) {\n // deform the image with neck and waist pinned; children (head, arms) are untouched\n pushTrack(tracks, deformTrack(chest, \"bulge\", sampled(T, 8, t => p.amplitude * Math.sin(w * t), \"ease_in_out\")));\n } else {\n const r = torso.transform;\n tracks.push(boneTrack(torso, \"scaleY\", sampled(T, 8, t => r.scaleY + p.amplitude * Math.sin(w * t), \"ease_in_out\")));\n tracks.push(boneTrack(torso, \"scaleX\", sampled(T, 8, t => r.scaleX - p.amplitude * 0.4 * Math.sin(w * t), \"ease_in_out\")));\n }\n for (const h of heads)\n tracks.push(boneTrack(h, \"y\", sampled(T, 8, t => h.transform.y - p.headBob * Math.sin(w * t + 0.4), \"ease_in_out\")));\n for (const a of armsL)\n tracks.push(boneTrack(a, \"rotation\", sampled(T, 8, t => a.transform.rotation + p.armSway * Math.sin(w * t + 0.8), \"ease_in_out\")));\n for (const a of armsR)\n tracks.push(boneTrack(a, \"rotation\", sampled(T, 8, t => a.transform.rotation - p.armSway * Math.sin(w * t + 0.8), \"ease_in_out\")));\n return finish(this.name, p.id, T, true, tracks, p);\n },\n};\n\n// ---------- win_bounce ----------\n\nexport interface WinBounceParams {\n id: string;\n duration: number;\n height: number; // px, first jump\n bounces: number; // 1..3\n squash: number; // 0.15 = 15% squash on landing\n}\n\nexport const winBounce: Preset<WinBounceParams> = {\n name: \"win_bounce\",\n defaults: { id: \"win\", duration: 1.2, height: 40, bounces: 2, squash: 0.15 },\n build(doc, p) {\n const b = root(doc), r = b.transform, tracks: Track[] = [];\n const yK: [number, number, Ease?][] = [[0, r.y, \"ease_out\"]];\n const sxK: [number, number, Ease?][] = [[0, r.scaleX, \"ease_out\"]];\n const syK: [number, number, Ease?][] = [[0, r.scaleY, \"ease_out\"]];\n // each bounce: up (decaying height) then land with squash\n const per = p.duration / p.bounces;\n for (let i = 0; i < p.bounces; i++) {\n const t0 = i * per, h = p.height * 0.55 ** i, s = p.squash * 0.7 ** i;\n // anticipation squash \u2192 apex stretch \u2192 landing squash\n sxK.push([t0 + per * 0.08, r.scaleX * (1 + s), \"ease_out\"], [t0 + per * 0.5, r.scaleX * (1 - s * 0.6), \"ease_in\"], [t0 + per * 0.95, r.scaleX * (1 + s), \"ease_out\"]);\n syK.push([t0 + per * 0.08, r.scaleY * (1 - s), \"ease_out\"], [t0 + per * 0.5, r.scaleY * (1 + s * 0.6), \"ease_in\"], [t0 + per * 0.95, r.scaleY * (1 - s), \"ease_out\"]);\n yK.push([t0 + per * 0.08, r.y, \"ease_out\"], [t0 + per * 0.5, r.y - h, \"ease_in\"], [t0 + per * 0.95, r.y, \"ease_out\"]);\n }\n yK.push([p.duration, r.y]); sxK.push([p.duration, r.scaleX]); syK.push([p.duration, r.scaleY]);\n tracks.push(boneTrack(b, \"y\", K(...yK)), boneTrack(b, \"scaleX\", K(...sxK)), boneTrack(b, \"scaleY\", K(...syK)));\n for (const h of byRole(doc, \"head\"))\n tracks.push(boneTrack(h, \"rotation\", K([0, h.transform.rotation], [p.duration * 0.25, h.transform.rotation - 6, \"back_out\"], [p.duration * 0.6, h.transform.rotation + 4], [p.duration, h.transform.rotation])));\n const anim = finish(this.name, p.id, p.duration, false, tracks, p);\n anim.events.push({ t: 0, name: \"win_start\" }, { t: per * 0.95, name: \"land\" });\n return anim;\n },\n};\n\n// ---------- anticipation_shake ----------\n\nexport interface AnticipationShakeParams {\n id: string;\n duration: number;\n amplitude: number; // px at the end\n frequency: number; // Hz\n grow: boolean; // ramp amplitude 0 \u2192 amplitude\n scaleUp: number; // final scale multiplier, e.g. 1.06\n}\n\nexport const anticipationShake: Preset<AnticipationShakeParams> = {\n name: \"anticipation_shake\",\n defaults: { id: \"anticipation\", duration: 1.5, amplitude: 4, frequency: 14, grow: true, scaleUp: 1.06 },\n build(doc, p) {\n const b = root(doc), r = b.transform, tracks: Track[] = [];\n // Half-period samples hit sin(k*PI) = 0 and erase translation entirely.\n const n = Math.ceil(p.duration * p.frequency * 4); // include quarter-cycle extrema\n const env = (t: number) => (p.grow ? t / p.duration : 1);\n tracks.push(boneTrack(b, \"x\", sampled(p.duration, n, t => r.x + p.amplitude * env(t) * Math.sin(2 * Math.PI * p.frequency * t), \"linear\")));\n tracks.push(boneTrack(b, \"rotation\", sampled(p.duration, n, t => r.rotation + 0.6 * p.amplitude * env(t) * Math.sin(2 * Math.PI * p.frequency * t + 1.2), \"linear\")));\n tracks.push(boneTrack(b, \"scaleX\", K([0, r.scaleX, \"ease_in\"], [p.duration, r.scaleX * p.scaleUp])));\n tracks.push(boneTrack(b, \"scaleY\", K([0, r.scaleY, \"ease_in\"], [p.duration, r.scaleY * p.scaleUp])));\n return finish(this.name, p.id, p.duration, false, tracks, p);\n },\n};\n\n// ---------- blink (swap layer) ----------\n\nexport interface BlinkParams {\n id: string;\n slot: string; // swap slot (hidden at rest) or the eyes slot\n closed?: string; // asset shown while closed; default: same id as the slot\n period: number; // seconds between blinks\n hold: number; // seconds closed\n}\n\nexport const blink: Preset<BlinkParams> = {\n name: \"blink\",\n defaults: { id: \"blink\", slot: \"eyes_closed\", period: 3.5, hold: 0.12 },\n build(doc, p) {\n const slot = requireSlot(doc, p.slot);\n const open = slot.attachment ?? null, closed = p.closed ?? slot.id;\n const at = +(p.period * 0.8).toFixed(4);\n const keys = S([0, open], [at, closed], [Math.min(+(at + p.hold).toFixed(4), p.period), open]);\n return finish(this.name, p.id, p.period, true, [slotTrack(slot, \"attachment\", keys)], p);\n },\n};\n\n// ---------- mouth_talk (swap cycle) ----------\n\nexport interface MouthTalkParams {\n id: string;\n slot: string;\n frames: (string | null)[]; // attachment ids (null = hidden / rest), cycled in order\n rate: number; // frames per second\n duration: number; // loop length in seconds\n}\n\nexport const mouthTalk: Preset<MouthTalkParams> = {\n name: \"mouth_talk\",\n defaults: { id: \"talk\", slot: \"mouth\", frames: [\"mouth_open\", null], rate: 8, duration: 1.5 },\n build(doc, p) {\n const slot = requireSlot(doc, p.slot);\n if (!p.frames.length) throw new Error(\"mouth_talk: frames must not be empty\");\n const n = Math.max(1, Math.round(p.duration * p.rate));\n const keys = S(...Array.from({ length: n }, (_, i): [number, string | null] => [+(i / p.rate).toFixed(4), p.frames[i % p.frames.length]]));\n return finish(this.name, p.id, p.duration, true, [slotTrack(slot, \"attachment\", keys)], p);\n },\n};\n\n// ---------- dim (state pose) ----------\n\nexport interface DimParams { id: string; alpha: number; duration: number }\n\nexport const dim: Preset<DimParams> = {\n name: \"dim\",\n defaults: { id: \"dim\", alpha: 0.4, duration: 0.25 },\n build(doc, p) {\n const tracks = doc.slots.filter(s => s.attachment).map(s => slotTrack(s, \"alpha\", K([0, s.alpha, \"ease_out\"], [p.duration, p.alpha])));\n return finish(this.name, p.id, p.duration, false, tracks, p);\n },\n};\n\n// ---------- symbol_idle ----------\n\nexport interface SymbolIdleParams {\n id: string;\n period: number;\n float: number; // px of vertical float\n pulse: number; // image bulge at the peak (fraction of width)\n tilt: number; // degrees of rotation sway\n}\n\nexport const symbolIdle: Preset<SymbolIdleParams> = {\n name: \"symbol_idle\",\n defaults: { id: \"idle\", period: 2.4, float: 4, pulse: 0.02, tilt: 1.5 },\n build(doc, p) {\n const b = root(doc), r = b.transform, T = p.period, w = (2 * Math.PI) / T, tracks: Track[] = [];\n const rise = (t: number) => 0.5 - 0.5 * Math.cos(w * t); // 0 at t=0 \u2192 1 \u2192 0\n tracks.push(boneTrack(b, \"y\", sampled(T, 8, t => r.y - p.float * rise(t), \"ease_in_out\")));\n if (p.tilt) tracks.push(boneTrack(b, \"rotation\", sampled(T, 8, t => r.rotation + p.tilt * Math.sin(w * t), \"ease_in_out\")));\n if (p.pulse) for (const s of doc.slots.filter(s => s.bone === b.id && s.attachment))\n pushTrack(tracks, deformTrack(s, \"bulge\", sampled(T, 8, t => p.pulse * rise(t), \"ease_in_out\")));\n return finish(this.name, p.id, T, true, tracks, p);\n },\n};\n\n// ---------- symbol_win ----------\n\nexport interface SymbolWinParams {\n id: string;\n duration: number;\n pop: number; // scale overshoot, 0.15 = +15%\n wobble: number; // jelly sway amplitude (fraction of width)\n wobbles: number; // oscillations over the duration\n}\n\nexport const symbolWin: Preset<SymbolWinParams> = {\n name: \"symbol_win\",\n defaults: { id: \"win\", duration: 0.9, pop: 0.15, wobble: 0.08, wobbles: 3 },\n build(doc, p) {\n const b = root(doc), r = b.transform, d = p.duration, tracks: Track[] = [];\n for (const [prop, rest] of [[\"scaleX\", r.scaleX], [\"scaleY\", r.scaleY]] as const)\n tracks.push(boneTrack(b, prop, K([0, rest, \"ease_out\"], [d * 0.2, rest * (1 + p.pop), \"ease_in_out\"], [d * 0.5, rest * (1 - p.pop * 0.3), \"ease_out\"], [d, rest])));\n if (p.wobble) {\n const n = Math.max(8, p.wobbles * 4);\n const keys = sampled(d, n, t => p.wobble * Math.exp(-3 * t / d) * Math.sin(2 * Math.PI * p.wobbles * t / d), \"ease_in_out\");\n keys[keys.length - 1].v = 0;\n for (const s of doc.slots.filter(s => s.bone === b.id && s.attachment)) pushTrack(tracks, deformTrack(s, \"sway\", keys));\n }\n const anim = finish(this.name, p.id, d, false, tracks, p);\n anim.events.push({ t: 0, name: \"win_start\" });\n return anim;\n },\n};\n\n// ---------- weight_shift ----------\n\nexport interface WeightShiftParams {\n id: string;\n period: number; // seconds for a full left-right-left cycle\n shift: number; // px of sideways hip travel\n lean: number; // degrees of torso counter-lean (head counters by half)\n dip: number; // px the hips sink at the extremes\n}\n\n/** Idle variation: hips sway sideways, torso leans against it, legs pivot so the feet stay planted (asin(shift/leg length)). */\nexport const weightShift: Preset<WeightShiftParams> = {\n name: \"weight_shift\",\n defaults: { id: \"idle_b\", period: 4, shift: 6, lean: 1.5, dip: 2 },\n build(doc, p) {\n const T = p.period, w = (2 * Math.PI) / T, N = 16, tracks: Track[] = [];\n const hips = byRole(doc, \"hips\")[0] ?? root(doc), hr = hips.transform;\n const s = (t: number) => Math.sin(w * t);\n tracks.push(boneTrack(hips, \"x\", sampled(T, N, t => hr.x + p.shift * s(t))));\n if (p.dip) tracks.push(boneTrack(hips, \"y\", sampled(T, N, t => hr.y + p.dip * s(t) ** 2)));\n const torso = byRole(doc, \"torso\", \"body\")[0];\n if (torso && torso !== hips) tracks.push(boneTrack(torso, \"rotation\", sampled(T, N, t => torso.transform.rotation - p.lean * s(t))));\n for (const h of byRole(doc, \"head\")) tracks.push(boneTrack(h, \"rotation\", sampled(T, N, t => h.transform.rotation + (p.lean / 2) * s(t))));\n for (const leg of byRole(doc, \"leg_l\", \"leg_r\")) {\n const slot = slotOfBone(doc, leg), att = slot && doc.attachments.find(a => a.id === slot.attachment && a.type === \"region\");\n const asset = att && att.type === \"region\" ? doc.assets.find(a => a.id === att.asset) : undefined;\n let length = leg.length;\n if (!length && att && att.type === \"region\" && asset) {\n const w = att.width ?? asset.width, h = att.height ?? asset.height, m = affineOf(att.x, att.y, att.rotation, att.scaleX, att.scaleY);\n // farthest edge midpoint of the placed image from the joint \u2248 the foot\n length = Math.max(...[[0, -h / 2], [w / 2, 0], [0, h / 2], [-w / 2, 0]].map(([x, y]) => Math.hypot(...apply(m, x, y))));\n }\n if (!(length > p.shift)) continue; // no image to measure the leg by \u2192 leave it\n tracks.push(boneTrack(leg, \"rotation\", sampled(T, N, t => leg.transform.rotation + (Math.asin((p.shift * s(t)) / length) * 180) / Math.PI)));\n // the hips sink, the feet do not: legs rise by the same dip (reads as a knee bend on a rigid cut-out)\n if (p.dip) tracks.push(boneTrack(leg, \"y\", sampled(T, N, t => leg.transform.y - p.dip * s(t) ** 2)));\n }\n return finish(this.name, p.id, T, true, tracks, p);\n },\n};\n\n// ---------- registry ----------\n\nexport const presets = {\n idle_breathing: idleBreathing,\n win_bounce: winBounce,\n anticipation_shake: anticipationShake,\n blink,\n mouth_talk: mouthTalk,\n dim,\n symbol_idle: symbolIdle,\n symbol_win: symbolWin,\n weight_shift: weightShift,\n} as const;\n\nexport type PresetName = keyof typeof presets;\n\n/** Build an animation from a preset name + partial params, replacing any animation with the same id. */\nexport function applyPreset(doc: RigDocument, name: PresetName, params: Record<string, unknown> = {}): RigDocument {\n const preset = presets[name] as Preset<any>;\n const anim = preset.build(doc, { ...preset.defaults, ...params });\n const animations = doc.animations.filter(a => a.id !== anim.id).concat(anim);\n return { ...doc, animations };\n}\n", "import { spawn } from 'node:child_process';\nimport { once } from 'node:events';\nimport { mkdtemp, writeFile, rm, rename, mkdir } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { RigDocument } from '../rig-format';\nimport { renderPreview, type PreviewOptions } from './render-preview';\n\n/** Encode deterministic runtime frames at the requested rate; replace output only after a successful encode. */\nexport async function exportVideo(doc: RigDocument, opts: PreviewOptions & { animation: string; outFile: string; fps?: number }): Promise<{ frames: number; fps: number; duration: number }> {\n const anim = doc.animations.find(a => a.id === opts.animation), fps = opts.fps ?? 60;\n if (!anim) throw new Error(`unknown animation \"${opts.animation}\"`);\n if (!Number.isInteger(fps) || fps < 1 || fps > 240) throw new Error('video fps must be an integer between 1 and 240');\n const count = Math.max(1, Math.round(anim.duration * fps));\n if (count > 10000) throw new Error('video exceeds 10000 frames; export shorter clips');\n await mkdir(dirname(opts.outFile), { recursive: true });\n const temp = await mkdtemp(join(dirname(opts.outFile), '.golem-video-'));\n try {\n // Small batches bound browser contact-sheet and data-URL memory even for long 60 fps clips.\n for (let start = 0; start < count; start += 24) {\n const times = Array.from({ length: Math.min(24, count - start) }, (_, i) => (start + i) / fps);\n const rendered = await renderPreview(doc, { ...opts, transparent: false, times });\n await Promise.all(rendered.frames.map((frame, i) => writeFile(join(temp, `${String(start + i).padStart(6, '0')}.png`), frame)));\n }\n const output = join(temp, 'preview.mp4');\n const proc = spawn('ffmpeg', ['-hide_banner', '-loglevel', 'error', '-y', '-framerate', String(fps), '-i', join(temp, '%06d.png'), '-vf', 'pad=ceil(iw/2)*2:ceil(ih/2)*2', '-c:v', 'libx264', '-pix_fmt', 'yuv420p', '-movflags', '+faststart', output], { stdio: ['ignore', 'ignore', 'pipe'] });\n let diagnostic = '';\n proc.stderr.on('data', chunk => { diagnostic = (diagnostic + chunk).slice(-8000); });\n const [code] = await once(proc, 'close');\n if (code !== 0) throw new Error(`MP4 encoder failed: ${diagnostic}`);\n await rename(output, opts.outFile);\n return { frames: count, fps, duration: count / fps };\n } finally { await rm(temp, { recursive: true, force: true }); }\n}\n", "/**\n * preview/render-preview.ts \u2014 Node side. Drives headless Chromium via Playwright.\n *\n * Usage:\n * const r = await renderPreview(doc, { assetsDir: \"rigs/hero\", animation: \"idle\", fps: 8 });\n * fs.writeFileSync(\"sheet.png\", r.sheet); // hand this to the agent\n *\n * Browser is reused across calls (agents call this in a loop) \u2014 call closePreview() at the end.\n */\nimport { chromium, type Browser, type Page } from \"playwright\";\nimport { readFile } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parse, type RigDocument } from \"../rig-format\";\nimport { sha256, type CaptureIdentity } from \"../rig-qa\";\nimport { PNG } from \"pngjs\";\n\nexport interface PreviewOptions {\n /** directory that asset.src paths are relative to */\n assetsDir: string;\n animation?: string;\n /** explicit sample times, OR fps (+ optional count) evenly over the animation */\n times?: number[];\n fps?: number;\n count?: number;\n overlayBones?: boolean;\n background?: string;\n transparent?: boolean;\n weightBone?: string;\n /** Source image path -> grayscale mask PNG path, resolved relative to assetsDir. */\n debugFillMasks?: Record<string, string>;\n scale?: number;\n sheetColumns?: number;\n /** ghost the previous frame under each frame */\n onionSkin?: boolean;\n /** crop [x, y, w, h] in DOCUMENT pixels \u2014 zoom on a detail without spending tokens on the whole canvas */\n region?: [number, number, number, number];\n}\n\nexport interface PreviewResult {\n identity: CaptureIdentity;\n frames: Buffer[];\n sheet: Buffer;\n times: number[];\n width: number;\n height: number;\n}\n\nconst HERE = dirname(fileURLToPath(import.meta.url));\nlet browser: Browser | undefined;\nlet page: Page | undefined;\nlet harnessJs: string | undefined;\nlet pending: Promise<unknown> = Promise.resolve();\n\nasync function getPage(): Promise<Page> {\n const latestHarness = await readFile(join(HERE, \"harness.js\"), \"utf8\");\n if (page && !page.isClosed() && latestHarness === harnessJs) return page;\n if (page && !page.isClosed()) await page.close();\n harnessJs = latestHarness;\n if (browser && !browser.isConnected()) browser = undefined;\n browser ??= await chromium.launch({\n headless: true,\n args: [\"--use-angle=swiftshader\", \"--enable-unsafe-swiftshader\", \"--ignore-gpu-blocklist\"],\n });\n const next = await browser.newPage({ deviceScaleFactor: 1 });\n try {\n next.on(\"pageerror\", e => console.error(\"[harness]\", e.message));\n await next.setContent(`<!doctype html><html><body style=\"margin:0;background:transparent\"></body></html>`);\n harnessJs ??= await readFile(join(HERE, \"harness.js\"), \"utf8\");\n await next.addScriptTag({ content: harnessJs });\n page = next;\n return next;\n } catch (e) {\n await next.close();\n throw e;\n }\n}\n\nfunction enqueue<T>(op: () => Promise<T>): Promise<T> {\n const result = pending.then(op);\n pending = result.catch(() => {});\n return result;\n}\n\nexport function closePreview() {\n return enqueue(async () => {\n await browser?.close();\n browser = undefined; page = undefined;\n });\n}\n\nconst mime = (p: string) => (p.endsWith(\".webp\") ? \"image/webp\" : p.endsWith(\".jpg\") || p.endsWith(\".jpeg\") ? \"image/jpeg\" : \"image/png\");\nconst fromDataUrl = (u: string) => Buffer.from(u.slice(u.indexOf(\",\") + 1), \"base64\");\n\nexport function renderPreview(doc: RigDocument, opts: PreviewOptions): Promise<PreviewResult> {\n // One harness owns one scene. Concurrent MCP calls must not replace each other's rig.\n return enqueue(() => render(parse(doc), opts));\n}\n\nasync function render(doc: RigDocument, opts: PreviewOptions): Promise<PreviewResult> {\n const positive = (n: number, name: string, integer = false) => {\n if (!Number.isFinite(n) || n <= 0 || (integer && !Number.isInteger(n)))\n throw new Error(`${name} must be a positive ${integer ? \"integer\" : \"number\"}`);\n };\n positive(opts.fps ?? 8, \"fps\");\n positive(opts.scale ?? 1, \"scale\");\n positive(opts.sheetColumns ?? 4, \"sheetColumns\", true);\n if (opts.count !== undefined) positive(opts.count, \"count\", true);\n const anim = opts.animation === undefined ? undefined : doc.animations.find(a => a.id === opts.animation);\n if (opts.animation !== undefined && !anim) throw new Error(`unknown animation \"${opts.animation}\"`);\n if (opts.weightBone && !doc.bones.some(b => b.id === opts.weightBone)) throw new Error(`unknown weight bone \"${opts.weightBone}\"`);\n for (const src of Object.keys(opts.debugFillMasks ?? {})) if (!doc.assets.some(a => a.src === src)) throw new Error(`fill mask refers to unknown texture \"${src}\"`);\n if (opts.times && (!opts.times.length || opts.times.some(t => !Number.isFinite(t) || t < 0)))\n throw new Error(\"times must contain finite, nonnegative sample times\");\n if (opts.region && (opts.region.length !== 4 || opts.region.some(v => !Number.isFinite(v)) || opts.region[2] <= 0 || opts.region[3] <= 0))\n throw new Error(\"region must be [x, y, w, h] with positive w and h\");\n const sc = opts.scale ?? 1;\n const region = opts.region ? opts.region.map((v, i) => Math.round(v * sc) as number) as [number, number, number, number] : undefined;\n // resolve sample times\n let times = opts.times;\n if (!times) {\n if (!anim) times = [0];\n else {\n const fps = opts.fps ?? 8;\n const n = opts.count ?? Math.max(2, Math.round(anim.duration * fps));\n // loop \u2192 don't duplicate t=0 at the end; one-shot \u2192 include the final pose\n times = Array.from({ length: n }, (_, i) => n === 1 ? 0 : +((anim.duration * i) / (anim.loop ? n : n - 1)).toFixed(4));\n }\n }\n\n // asset files \u2192 data URLs keyed by src (agent-friendly: no file serving, no CORS; an atlas is read once)\n const assets: Record<string, string> = {};\n const identity: CaptureIdentity = { document: sha256(JSON.stringify(doc)), assets: {}, renderer: \"\", masks: {} };\n for (const a of doc.assets) {\n if (assets[a.src]) continue;\n let buf: Buffer = await readFile(join(opts.assetsDir, a.src));\n identity.assets[a.src] = sha256(buf);\n if (opts.debugFillMasks?.[a.src]) {\n const maskData = await readFile(join(opts.assetsDir, opts.debugFillMasks[a.src]));\n identity.masks[opts.debugFillMasks[a.src]] = sha256(maskData);\n const png = PNG.sync.read(buf), mask = PNG.sync.read(maskData);\n if (png.width !== mask.width || png.height !== mask.height) throw new Error(`fill mask dimensions differ for ${a.src}`);\n for (let i = 0; i < png.data.length; i += 4) if (mask.data[i] > 127 && mask.data[i + 3] > 0) { png.data[i] = 255; png.data[i + 1] = 0; png.data[i + 2] = 255; }\n buf = PNG.sync.write(png);\n }\n assets[a.src] = `data:${mime(a.src)};base64,${buf.toString(\"base64\")}`;\n }\n\n const p = await getPage();\n identity.renderer = sha256(harnessJs!);\n const res = await p.evaluate(\n async ({ doc, assets, scale, ro }) => {\n const h = (window as any).rigHarness;\n await h.load(doc, assets, scale);\n return h.renderFrames(ro);\n },\n {\n doc, assets, scale: opts.scale ?? 1,\n ro: { animation: opts.animation, times, overlayBones: opts.overlayBones, background: opts.background, transparent: opts.transparent, weightBone: opts.weightBone, sheetColumns: opts.sheetColumns, onionSkin: opts.onionSkin, region },\n },\n );\n\n return {\n identity,\n frames: res.frames.map(fromDataUrl),\n sheet: fromDataUrl(res.sheet),\n times, width: res.width, height: res.height,\n };\n}\n", "/** Render provenance: gates must prove which document, textures, renderer and frames they inspected. */\nimport { createHash } from 'node:crypto';\nimport { readFile, readdir } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { parse } from './rig-format';\nexport const sha256 = (data: string | Buffer) => createHash('sha256').update(data).digest('hex');\nexport interface CaptureIdentity { document: string; assets: Record<string, string>; renderer: string; masks: Record<string, string>; }\nexport interface RenderManifest {\n version: 1; rigFile: string; capturedAt: string; identity: CaptureIdentity;\n animation: string | null; transparent: boolean; scale: number; times: number[];\n render: { background?: string; overlayBones: boolean; onionSkin: boolean; weightBone?: string; debugFillMasks: Record<string, string>; region?: [number, number, number, number] };\n frames: { file: string; sha256: string }[];\n}\nexport async function verifyRenderManifest(rigPath: string, framesDir: string, expected: { animation?: string; times: number[]; renderer: string; transparent?: boolean }): Promise<RenderManifest> {\n const m = JSON.parse(await readFile(join(framesDir, 'manifest.json'), 'utf8')) as RenderManifest;\n if (m.version !== 1 || !m.frames?.length || !m.times?.length) throw new Error('missing or empty capture manifest');\n const raw = await readFile(rigPath, 'utf8');\n if (sha256(raw) !== m.rigFile) throw new Error('stale render: rig file changed');\n const doc = parse(JSON.parse(raw));\n if (sha256(JSON.stringify(doc)) !== m.identity.document) throw new Error('stale render: rig changed');\n if (sha256(await readFile(expected.renderer)) !== m.identity.renderer) throw new Error('stale render: renderer changed');\n for (const a of doc.assets) if (sha256(await readFile(join(dirname(rigPath), a.src))) !== m.identity.assets[a.src]) throw new Error(`stale render: texture ${a.src} changed`);\n for (const [path, hash] of Object.entries(m.identity.masks)) if (sha256(await readFile(join(dirname(rigPath), path))) !== hash) throw new Error(`stale render: fill mask ${path} changed`);\n if (m.animation !== (expected.animation ?? null) || JSON.stringify(m.times) !== JSON.stringify(expected.times)) throw new Error('capture does not cover the requested animation/times');\n if (expected.transparent !== undefined && m.transparent !== expected.transparent) throw new Error('capture has the wrong alpha mode');\n if (m.frames.length !== expected.times.length || new Set(m.frames.map(f => f.file)).size !== m.frames.length) throw new Error('capture has missing or duplicate frames');\n const files = (await readdir(framesDir)).filter(f => f.endsWith('.png')).sort();\n if (JSON.stringify(files) !== JSON.stringify(m.frames.map(f => f.file).sort())) throw new Error('capture directory has missing or unmanifested frames');\n for (const f of m.frames) {\n if (!/^\\d{6}\\.png$/.test(f.file)) throw new Error('invalid capture filename');\n if (sha256(await readFile(join(framesDir, f.file))) !== f.sha256) throw new Error(`frame ${f.file} changed since capture`);\n }\n return m;\n}\n", "/** Motion diagnostics describe measured evidence; semantic rules are supplied by the brief. */\nimport type { Animation, RigDocument, Track } from './rig-format';\nimport { evaluate, poseOf, sample, pk, colorToArray, apply, regionMatrix, regionSize, attachmentWorldVertices } from './rig-anim';\nimport type { Finding } from './rig-check';\n\nexport interface QualityOptions {\n secondaryBones?: string[];\n /** [foreground, background] slot pairs from the art brief, e.g. face above scarf. */\n frontOf?: [string, string][];\n /** Attachment \u2192 named normalized image coordinates (0..1). */\n landmarks?: Record<string, Record<string, [number, number]>>;\n landmarkTolerance?: number;\n}\nconst values = (v: unknown): number[] | undefined => typeof v === 'number' ? [v] : Array.isArray(v) && v.every(n => typeof n === 'number') ? v : undefined;\nconst delta = (a: number[], b: number[]) => a.map((v, i) => v - b[i]);\nconst magnitude = (a: number[]) => Math.max(0, ...a.map(Math.abs));\n\nexport function motionQuality(doc: RigDocument, anim: Animation, opts: QualityOptions = {}): Finding[] {\n const out: Finding[] = [], D = anim.duration;\n const report = (code: string, subject: string, message: string, time?: number, level: Finding['level'] = 'warn') => out.push({ level, code, subject, animation: anim.id, time, message });\n for (const tr of anim.tracks) {\n const id = `${tr.target}.${tr.id}.${tr.prop}`, looping = anim.loop && tr.keys[0].t === 0 && tr.keys.at(-1)!.t === D;\n const at = (t: number) => sample(tr, t, looping), numeric = tr.keys.every(k => values(k.v) !== undefined);\n if (anim.loop) {\n const first = at(0), last = at(D), av = values(first), bv = values(last);\n const diff = av && bv && av.length === bv.length ? magnitude(delta(av, bv)) : first === last || JSON.stringify(first) === JSON.stringify(last) ? 0 : Infinity;\n // Scalar loop values are already reported by the legacy checker.\n if (diff > 1e-3 && typeof first !== 'number') report('loop_seam', id, `loop endpoint values differ (${Number.isFinite(diff) ? `max delta ${diff.toFixed(4)}` : 'discrete state'}); all channels must close`);\n if (numeric && diff <= 1e-3 && tr.keys.length > 1) {\n const h = Math.min(D / 10000, (tr.keys[1].t - tr.keys[0].t) / 100, (tr.keys.at(-1)!.t - tr.keys.at(-2)!.t) / 100);\n const va = delta(values(at(h))!, values(at(0))!).map(v => v / h), vb = delta(values(at(D))!, values(at(D - h))!).map(v => v / h);\n const dv = magnitude(delta(va, vb));\n if (dv > Math.max(0.05, 0.05 * Math.max(magnitude(va), magnitude(vb)))) report('loop_velocity', id, `loop velocity changes by ${dv.toFixed(3)} units/s at the wrap`);\n }\n }\n if (!numeric) continue;\n for (let i = 1; i < tr.keys.length - 1; i++) {\n const p = tr.keys[i - 1], k = tr.keys[i], n = tr.keys[i + 1];\n if (p.ease === 'step' || k.ease === 'step') continue;\n const h = Math.min(k.t - p.t, n.t - k.t) / 1000;\n const left = delta(values(at(k.t))!, values(at(k.t - h))!).map(v => v / h), right = delta(values(at(k.t + h))!, values(at(k.t))!).map(v => v / h);\n const before = delta(values(k.v)!, values(p.v)!), after = delta(values(n.v)!, values(k.v)!);\n const pass = before.some((v, j) => v * after[j] > 1e-6);\n const speed = Math.max(magnitude(before) / (k.t - p.t), magnitude(after) / (n.t - k.t));\n if (pass && Math.max(magnitude(left), magnitude(right)) < speed * 0.02) report('pass_key_stop', id, `motion stops at a pass-through key; use track interpolation pchip or matched tangents`, k.t);\n const jump = magnitude(delta(left, right));\n if (jump > Math.max(0.1, speed * 0.1)) report('velocity_jump', id, `velocity jumps ${jump.toFixed(3)} units/s across this key`, k.t);\n const acceleration = (a: number, b: number, c: number) => values(at(b))!.map((v, j) => (values(at(c))![j] - 2 * v + values(at(a))![j]) / (h * h));\n const al = acceleration(k.t - 2 * h, k.t - h, k.t), ar = acceleration(k.t, k.t + h, k.t + 2 * h);\n const aj = magnitude(delta(al, ar));\n if (aj > Math.max(1, speed / Math.min(k.t - p.t, n.t - k.t) * 2)) report('acceleration_jump', id, `acceleration changes by ${aj.toFixed(2)} units/s\u00B2 at this key; PCHIP guarantees velocity, not acceleration continuity`, k.t, 'info');\n }\n }\n const steps = Math.max(2, Math.ceil(D * 60));\n const times = new Set(Array.from({ length: steps + 1 }, (_, i) => i * D / steps));\n for (const tr of anim.tracks) for (const k of tr.keys) { times.add(k.t); if (k.t > 0) times.add(Math.max(0, k.t - 1e-5)); }\n const samples = [...times].sort((a, b) => a - b).map(t => ({ t, pose: poseOf(anim, t) }));\n for (const bone of opts.secondaryBones ?? []) {\n if (!doc.bones.some(b => b.id === bone)) throw new Error(`unknown secondary bone \"${bone}\"`);\n const local = samples.map(s => evaluate(doc, s.pose).bones.get(bone)!);\n const curves = (['rotation', 'x', 'y'] as const).map(prop => local.map(b => b[prop]));\n if (curves.every(v => Math.max(...v as number[]) - Math.min(...v as number[]) < 1e-3)) report('secondary_frozen', bone, `declared secondary bone has no local motion in this animation`);\n }\n const reported = new Set<string>();\n for (const [front, back] of opts.frontOf ?? []) {\n if (![front, back].every(id => doc.slots.some(s => s.id === id))) throw new Error(`unknown frontOf slots: ${front}, ${back}`);\n for (const { t, pose } of samples) {\n const skel = evaluate(doc, pose);\n if (!skel.attachment.get(front) || !skel.attachment.get(back)) continue;\n const visible = (id: string) => {\n const slot = doc.slots.find(s => s.id === id)!;\n const color = pose.get(pk('slot', id, 'color')) ?? colorToArray(slot.color);\n return Number(pose.get(pk('slot', id, 'alpha')) ?? slot.alpha) * (color as number[])[3] > 0;\n };\n if (!visible(front) || !visible(back)) continue;\n const order = pose.get(pk('drawOrder', 'order', 'order')) as string[] | undefined;\n const z = (id: string) => order ? order.indexOf(id) : Number(pose.get(pk('slot', id, 'z')) ?? doc.slots.find(s => s.id === id)!.z);\n const pair = JSON.stringify([front, back]);\n if (z(front) <= z(back) && !reported.has(pair)) { reported.add(pair); report('draw_order_rule', front, `\"${front}\" must stay explicitly in front of \"${back}\" according to the brief (equal z is ambiguous)`, t); }\n }\n }\n for (const tr of anim.tracks.filter(t => t.target === 'slot' && t.prop === 'attachment')) for (const key of tr.keys.filter(k => k.t > 0)) {\n const a = evaluate(doc, poseOf(anim, Math.max(0, key.t - 1e-6))), b = evaluate(doc, poseOf(anim, key.t));\n const before = a.attachment.get(tr.id), after = b.attachment.get(tr.id);\n if (!before || !after || before.id === after.id) continue;\n const landmarksA = opts.landmarks?.[before.id], landmarksB = opts.landmarks?.[after.id];\n if (!landmarksA && !landmarksB) continue;\n if (!landmarksA || !landmarksB || !Object.keys(landmarksA).some(name => landmarksB[name])) {\n report('landmark_unmeasured', tr.id, `swap ${before.id} \u2192 ${after.id} has no shared declared landmarks`, key.t); continue;\n }\n const point = (skel: typeof a, att: typeof before, uv: [number, number]): [number, number] | undefined => {\n if (att.type === 'region') { const [w, h] = regionSize(doc, att); return apply(regionMatrix(skel, att.slot, att), (uv[0] - 0.5) * w, (uv[1] - 0.5) * h); }\n if (att.type !== 'mesh') return;\n const v = attachmentWorldVertices(skel, att.slot, att);\n for (let i = 0; i < att.triangles.length; i += 3) {\n const [ia, ib, ic] = att.triangles.slice(i, i + 3), ux = att.uvs[ia * 2], uy = att.uvs[ia * 2 + 1], bx = att.uvs[ib * 2] - ux, by = att.uvs[ib * 2 + 1] - uy, cx = att.uvs[ic * 2] - ux, cy = att.uvs[ic * 2 + 1] - uy, det = bx * cy - by * cx;\n if (Math.abs(det) < 1e-12) continue;\n const s = ((uv[0] - ux) * cy - (uv[1] - uy) * cx) / det, r = (bx * (uv[1] - uy) - by * (uv[0] - ux)) / det;\n if (s >= -1e-6 && r >= -1e-6 && s + r <= 1 + 1e-6) return [v[ia * 2] * (1 - s - r) + v[ib * 2] * s + v[ic * 2] * r, v[ia * 2 + 1] * (1 - s - r) + v[ib * 2 + 1] * s + v[ic * 2 + 1] * r];\n }\n };\n for (const [name, uv] of Object.entries(landmarksA)) if (landmarksB[name]) {\n const p = point(a, before, uv), q = point(b, after, landmarksB[name]);\n if (!p || !q) { report('landmark_unmeasured', tr.id, `landmark \"${name}\" is outside attachment geometry`, key.t); continue; }\n const distance = Math.hypot(p[0] - q[0], p[1] - q[1]);\n if (distance > (opts.landmarkTolerance ?? 2)) report('attachment_landmark_jump', tr.id, `\"${name}\" moves ${distance.toFixed(2)}px when ${before.id} changes to ${after.id}`, key.t);\n }\n }\n return out;\n}\n", "/**\n * rig-check \u2014 cheap self-critique for agents, computed from the document alone (no browser).\n *\n * Findings are hints, not a pass/fail gate: `rest_overlap` is normal for cut-out characters,\n * `out_of_canvas` may be intended for a jump. `deform_flip` and `mesh_fold` are the real errors (folded mesh/lattice);\n * `weights_sum` flags skinned-mesh vertices whose influence weights don't add to 1.\n *\n * `mesh_fold` is graded by how much of the mesh folds \u2014 the folded triangles' rest area over the mesh's total rest\n * area, at the worst sampled time. A dense mesh bent hard at a joint almost always pinches one hairline triangle\n * somewhere; that is a `warn`, not something to stop for. `error` is reserved for a fold big enough to see\n * (\u2265 `FOLD_ERROR_RATIO` of the mesh), which is what a torn limb or a collapsed silhouette looks like.\n *\n * Constraints get four of their own: `constraint_dead` (every mix is 0 at rest and no track lifts one \u2014 the solver\n * skips it), `constraint_cycle` (the target is a bone the constraint drives, or hangs off one: it reads what it\n * writes \u2014 an error), `ik_unreachable` (the target sits beyond the chain's reach for most of an animation, so the\n * limb hangs straight instead of following) and `path_missing` (a path constraint whose target slot never shows a\n * path attachment \u2014 an error).\n */\nimport { MIX_PROPS, type RigDocument, type Animation, type Track, type MeshAttachment, type IkConstraint } from \"./rig-format\";\nimport { poseOf, evaluate, slotOutline, regionMatrix, apply, deformParams, sample, restValue, pk, attachmentWorldVertices, type Pose } from \"./rig-anim\";\nimport { controlOffsets, minJacobian } from \"./rig-deform\";\nimport { foldedTriangles, triangleArea, meshArea } from \"./rig-mesh\";\nimport { motionQuality, type QualityOptions } from \"./rig-quality\";\nimport { ikReach, constraintDependencies } from \"./rig-constraints\";\n\n/** fraction of a mesh's rest area that has to fold before `mesh_fold` is an error rather than a warning: a limb\n * bent to its limit pinches a few percent of a dense mesh without reading as broken, a torn one loses far more */\nconst FOLD_ERROR_RATIO = 0.05;\n/** px the IK target may sit beyond the chain's reach before the chain counts as hanging straight (rounding, not authoring) */\nconst IK_SLACK = 1;\n/** share of an animation's frames that has to overshoot before `ik_unreachable` fires: a limb parked at full\n * extension for a beat is an idiom (that is how you lock a leg straight), a limb that never reaches is a bug */\nconst IK_UNREACHABLE_FRAMES = 0.2;\n\nexport interface Finding {\n level: \"error\" | \"warn\" | \"info\";\n code: string;\n /** slot / track / asset the finding is about */\n subject: string;\n message: string;\n animation?: string;\n time?: number;\n}\n\nexport interface CheckOptions extends QualityOptions {\n /** only this animation (plus the rest pose) */\n animation?: string;\n /** sampling rate for outlines (default 30) and for the fold check (default 60) */\n fps?: number;\n deformFps?: number;\n /** rest_overlap threshold as a fraction of the smaller box (default 0.6) */\n overlap?: number;\n /** px of allowed overflow before out_of_canvas fires (default 1) */\n margin?: number;\n}\n\nconst isNumeric = (t: Track) => t.target !== \"slot\" || t.prop !== \"attachment\";\nconst trackId = (t: Track) => `${t.target}.${t.id}.${t.prop}`;\nconst fmt = (n: number) => String(Math.round(n * 1000) / 1000);\nconst times = (a: Animation, fps: number) => {\n const n = Math.max(1, Math.ceil(a.duration * fps)), out: number[] = [];\n for (let i = 0; i <= n; i++) out.push(a.duration * i / n);\n return out;\n};\n\nexport function checkRig(doc: RigDocument, opts: CheckOptions = {}): Finding[] {\n const fps = opts.fps ?? 30, dfps = opts.deformFps ?? 60, overlapMin = opts.overlap ?? 0.6, margin = opts.margin ?? 1;\n if (![fps, dfps].every(v => Number.isFinite(v) && v > 0)) throw new Error(\"check sampling rates must be positive\");\n const anims = opts.animation === undefined ? doc.animations : doc.animations.filter(a => a.id === opts.animation);\n if (opts.animation !== undefined && !anims.length) throw new Error(`unknown animation \"${opts.animation}\"`);\n const out: Finding[] = [];\n for (const e of constraintDependencies(doc).edges.filter(e => e.late)) out.push({ level: \"warn\", code: \"constraint_order\", subject: e.reader,\n message: `constraint \"${e.reader}\" reads bone \"${e.bone}\" before later constraint \"${e.writer}\" moves it; use rig_order_constraints or set explicit order` });\n const W = doc.meta.width, H = doc.meta.height;\n\n // --- overflow helper: worst side of a slot outline against the canvas\n const overflowOf = (pose: Pose, slotId: string, skel: ReturnType<typeof evaluate>) => {\n const pts = slotOutline(doc, pose, slotId, 4, skel);\n if (!pts) return undefined;\n const slot = doc.slots.find(s => s.id === slotId)!, alphaV = pose.get(`slot:${slotId}:alpha`);\n const alpha = typeof alphaV === \"number\" ? alphaV : slot.alpha;\n if (alpha <= 0.01) return undefined; // invisible: cannot leave the canvas visibly\n let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;\n for (const [x, y] of pts) { minX = Math.min(minX, x); maxX = Math.max(maxX, x); minY = Math.min(minY, y); maxY = Math.max(maxY, y); }\n const sides: [string, number][] = [[\"left\", -minX], [\"right\", maxX - W], [\"top\", -minY], [\"bottom\", maxY - H]];\n sides.sort((a, b) => b[1] - a[1]);\n return { side: sides[0][0], px: sides[0][1], box: [minX, minY, maxX, maxY] as const };\n };\n\n // --- rest pose: overflow + overlap\n const parentOf = new Map(doc.bones.map(b => [b.id, b.parent]));\n const knownBones = new Set(doc.bones.map(b => b.id));\n const slotOf = new Map(doc.slots.map(s => [s.id, s]));\n const related = (a: string, b: string) => {\n for (let cur = parentOf.get(a); cur; cur = parentOf.get(cur)) if (cur === b) return true;\n for (let cur = parentOf.get(b); cur; cur = parentOf.get(cur)) if (cur === a) return true;\n return false;\n };\n const restPose: Pose = new Map(), restWorld = evaluate(doc, restPose);\n const restBoxes: { id: string; bone: string; box: readonly [number, number, number, number] }[] = [];\n for (const s of doc.slots) {\n const o = overflowOf(restPose, s.id, restWorld);\n if (!o) continue;\n restBoxes.push({ id: s.id, bone: s.bone, box: o.box });\n if (o.px > margin) out.push({ level: \"warn\", code: \"out_of_canvas\", subject: s.id,\n message: `slot \"${s.id}\" leaves the canvas by ${Math.round(o.px)}px (${o.side}) in the rest pose` });\n }\n for (let i = 0; i < restBoxes.length; i++) for (let j = i + 1; j < restBoxes.length; j++) {\n // a layer over its own ancestor's layer (arm over torso) is how cut-outs work; only unrelated bones are suspicious\n if (related(restBoxes[i].bone, restBoxes[j].bone)) continue;\n const a = restBoxes[i].box, b = restBoxes[j].box;\n const iw = Math.min(a[2], b[2]) - Math.max(a[0], b[0]), ih = Math.min(a[3], b[3]) - Math.max(a[1], b[1]);\n if (iw <= 0 || ih <= 0) continue;\n const smaller = Math.min((a[2] - a[0]) * (a[3] - a[1]), (b[2] - b[0]) * (b[3] - b[1]));\n const ratio = smaller > 0 ? (iw * ih) / smaller : 0;\n if (ratio >= overlapMin) out.push({ level: \"info\", code: \"rest_overlap\", subject: `${restBoxes[i].id}+${restBoxes[j].id}`,\n message: `slots \"${restBoxes[i].id}\" and \"${restBoxes[j].id}\" overlap ${Math.round(ratio * 100)}% of the smaller one in the rest pose` });\n }\n\n // --- constraints: never runs, reads what it writes, or aims at a path that is never shown\n //\n // These three are document-level: a dead constraint is only dead if NO animation revives it, so they look at\n // `doc.animations` even when `opts.animation` narrows the per-animation walks below.\n //\n // \"Mix\" is what switches a constraint on \u2014 one channel for IK, six for a transform, three for a path. Rest mixes\n // of 0 mean the solver skips it (`applyIk` returns on mix <= 0, `applyTransformConstraint`/`applyPathConstraint`\n // on all-zero mixes), so a track that keys any of them away from 0 is what keeps it alive. Away from 0, not\n // above it: a NEGATIVE mix is how a transform constraint is inverted (ross drives `anti_nose` with mixX -0.1).\n const keyedNonZero = new Set<string>(); // constraint track keys that are not all 0, by `kind:id:prop`\n for (const a of doc.animations) for (const t of a.tracks)\n if ((t.target === \"ik\" || t.target === \"transform\" || t.target === \"path\") && t.keys.some(k => typeof k.v === \"number\" && k.v !== 0))\n keyedNonZero.add(pk(t.target, t.id, t.prop));\n const attById = new Map(doc.attachments.map(a => [a.id, a]));\n /** every constraint with its rest mixes and the BONE its target resolves to \u2014 a path constraint aims at a slot */\n const constraints = [\n ...doc.ik.map(c => ({ kind: \"ik\" as const, id: c.id, bones: c.bones, target: c.target, mixes: [c.mix], targetBone: c.target })),\n ...doc.transform.map(c => ({ kind: \"transform\" as const, id: c.id, bones: c.bones, target: c.target,\n mixes: [c.mixRotate, c.mixX, c.mixY, c.mixScaleX, c.mixScaleY, c.mixShearY], targetBone: c.target })),\n ...doc.path.map(c => ({ kind: \"path\" as const, id: c.id, bones: c.bones, target: c.target,\n mixes: [c.mixRotate, c.mixX, c.mixY], targetBone: slotOf.get(c.target)?.bone })),\n ];\n for (const { kind, id, bones, target, mixes, targetBone } of constraints) {\n const props = MIX_PROPS[kind];\n if (mixes.every(m => m === 0) && !props.some(p => keyedNonZero.has(pk(kind, id, p))))\n out.push({ level: \"warn\", code: \"constraint_dead\", subject: id,\n message: `${kind} constraint \"${id}\" never runs: ${props.join(\"/\")} ${props.length === 1 ? \"is\" : \"are all\"} 0 in the rest pose and no animation keys ${props.length === 1 ? \"it\" : \"one\"} away from 0 \u2014 enable it with rig_set_${kind} {id: \"${id}\", ${props[0]}: 1} or key ${kind}.${id}.${props[0]}` });\n // the solver writes the constraint's bones (and, through them, their subtrees) and then reads the target: a\n // target inside that subtree is read after it was written, so the pose depends on the solve order\n if (targetBone !== undefined && knownBones.has(targetBone)) {\n let owner: string | undefined;\n for (let cur: string | undefined = targetBone; cur !== undefined && owner === undefined; cur = parentOf.get(cur)) if (bones.includes(cur)) owner = cur;\n if (owner !== undefined) out.push({ level: \"error\", code: \"constraint_cycle\", subject: id,\n message: `${kind} constraint \"${id}\" targets ${kind === \"path\" ? `slot \"${target}\", which sits on bone \"${targetBone}\"` : `bone \"${targetBone}\"`}${owner === targetBone ? \", one of the bones it drives\" : `, a descendant of \"${owner}\", one of the bones it drives`} \u2014 the solver reads what it writes; move the target off the chain (rig_add_ik_chain parents its target to the root)` });\n }\n }\n for (const c of doc.path) {\n const slot = slotOf.get(c.target);\n if (!slot) continue; // unknown slot: rig_validate's job, not a second report here\n const isPath = (attId: unknown) => typeof attId === \"string\" && attById.get(attId)?.type === \"path\";\n const shown = isPath(slot.attachment) || doc.animations.some(a => a.tracks.some(t =>\n t.target === \"slot\" && t.prop === \"attachment\" && t.id === slot.id && t.keys.some(k => isPath(k.v))));\n if (!shown) out.push({ level: \"error\", code: \"path_missing\", subject: c.id,\n message: `path constraint \"${c.id}\" follows slot \"${c.target}\", which never shows a path attachment (none at rest, none keyed) \u2014 draw the curve with rig_set_path_attachment and show it with rig_set_slot {id: \"${c.target}\", attachment: \u2026}` });\n }\n\n // --- IK that cannot reach: the chain hangs straight and stops following its target\n //\n // `stretch` closes the gap by lengthening the chain, so an overshooting stretchy IK is working as designed; mix 0\n // means the solver never ran. Both are read from the pose, so a track that turns either on mid-animation counts.\n //\n // ONE-bone IK is exempt: it does not reach, it AIMS \u2014 `applyIk` hands a single bone to `aimAt`, which only\n // rotates it towards the target. A head, an eye or a gun tracking a control bone parked far out in the world is\n // the normal way to author that, and it is out of reach in every frame; there is nothing to bend and nothing to\n // report. Only a two-bone chain can run out of reach and hang straight instead of following.\n const ikCheckable = doc.ik.filter(c => c.bones.length > 1 && c.bones.every(b => knownBones.has(b)) && knownBones.has(c.target));\n // keyed value, else the document's \u2014 the same read `applyIk` makes through `cnum`, so this sees the mix (and the\n // `stretch` flag) the solver saw at that frame; `mixAt` (rig-constraints.ts) is the exported form of it\n const poseNum = (pose: Pose, key: string, rest: number) => { const v = pose.get(key); return typeof v === \"number\" ? v : rest; };\n /** px the target sits beyond the chain's reach, or undefined when the constraint is off, stretchy, or reaching */\n const ikOvershoot = (skel: ReturnType<typeof evaluate>, c: IkConstraint) => {\n if (poseNum(skel.pose, pk(\"ik\", c.id, \"mix\"), c.mix) <= 0) return undefined;\n if (poseNum(skel.pose, pk(\"ik\", c.id, \"stretch\"), c.stretch ? 1 : 0) > 0.5) return undefined;\n const { distance, reach } = ikReach(skel, c);\n return distance > reach + IK_SLACK ? distance - reach : undefined;\n };\n for (const c of ikCheckable) {\n const over = ikOvershoot(restWorld, c);\n if (over !== undefined) out.push({ level: \"warn\", code: \"ik_unreachable\", subject: c.id,\n message: `IK \"${c.id}\" cannot reach \"${c.target}\" in the rest pose: ${Math.round(over)}px beyond the chain's reach \u2014 the chain hangs straight instead of bending; move the target closer or set stretch` });\n }\n\n // --- mesh folds: what CAN fold, and the rest geometry to grade a fold against\n //\n // A mesh folds when the bones that place it move apart, so the candidates cannot be read off the track list:\n // a mesh weighted to `n_neck1`/`n_neck2` folds as soon as an ANCESTOR of those bones is keyed, and a static walk\n // over the slot bone's ancestors (plus directly-keyed influences) misses exactly that case. Instead the walks\n // below \u2014 which already evaluate the whole skeleton per sampled time \u2014 ask the skeleton: a mesh is a candidate\n // at time `t` when any bone that places it (its slot's bone, or any of its influences) has a world transform\n // different from its rest one. The answer is cached per bone per time, so all 110 meshes share one comparison.\n const meshes = doc.attachments.filter((att): att is MeshAttachment => att.type === \"mesh\" && doc.slots.some(s => s.id === att.slot));\n const boneIds: string[] = [], boneSlot = new Map<string, number>();\n const slotFor = (id: string) => { let i = boneSlot.get(id); if (i === undefined) { i = boneIds.length; boneIds.push(id); boneSlot.set(id, i); } return i; };\n /** per mesh: the slots (in `boneIds`) of every bone that places it */\n const meshBones = new Map<string, number[]>();\n for (const att of meshes) {\n const set = new Set<string>();\n const slot = slotOf.get(att.slot);\n if (slot && knownBones.has(slot.bone)) set.add(slot.bone);\n if (att.weights) for (const list of att.weights) for (const inf of list) if (knownBones.has(inf.bone)) set.add(inf.bone);\n meshBones.set(att.id, [...set].map(slotFor));\n }\n const restAffines = boneIds.map(id => restWorld.bones.get(id)!.world);\n /** a bone whose world affine differs from its rest one by more than rounding noise can move a mesh off its rest shape */\n const MOVED_EPS = 1e-9;\n const movedFlags = (skel: ReturnType<typeof evaluate>) => {\n const flags = new Uint8Array(boneIds.length);\n for (let i = 0; i < boneIds.length; i++) {\n const w = skel.bones.get(boneIds[i])!.world, r = restAffines[i];\n flags[i] = Math.abs(w.a - r.a) > MOVED_EPS || Math.abs(w.b - r.b) > MOVED_EPS || Math.abs(w.c - r.c) > MOVED_EPS\n || Math.abs(w.d - r.d) > MOVED_EPS || Math.abs(w.tx - r.tx) > MOVED_EPS || Math.abs(w.ty - r.ty) > MOVED_EPS ? 1 : 0;\n }\n return flags;\n };\n // rest shape and rest area per mesh, filled on first use and shared by every animation\n const meshRest = new Map<string, number[]>(), restArea = new Map<string, number>();\n const restOf = (att: MeshAttachment) => {\n let rest = meshRest.get(att.id);\n if (!rest) {\n rest = attachmentWorldVertices(restWorld, att.slot, att);\n meshRest.set(att.id, rest);\n restArea.set(att.id, meshArea(rest, att.triangles));\n }\n return rest;\n };\n\n // --- per animation\n for (const a of anims) {\n out.push(...motionQuality(doc, a, opts));\n // static tracks / loop seams\n for (const t of a.tracks) {\n if (!isNumeric(t)) continue;\n const vals = t.keys.map(k => k.v as number);\n if (vals.length >= 2 && vals.every(v => v === vals[0])) {\n const rest = restValue(doc, pk(t.target, t.id, t.prop));\n const atRest = typeof rest === \"number\" && Math.abs(rest - vals[0]) < 1e-9;\n out.push({ level: atRest ? \"warn\" : \"info\", code: \"static_track\", subject: trackId(t), animation: a.id,\n message: atRest\n ? `animation \"${a.id}\" ${trackId(t)}: all ${vals.length} keys equal the setup value ${fmt(vals[0])} \u2014 the track does nothing, drop it`\n : `animation \"${a.id}\" ${trackId(t)}: holds ${fmt(vals[0])}${typeof rest === \"number\" ? ` (setup ${fmt(rest)})` : \"\"} \u2014 a pose offset, not motion` });\n }\n if (a.loop) {\n const v0 = sample(t, 0) as number, v1 = sample(t, a.duration) as number;\n const range = Math.max(...vals) - Math.min(...vals);\n if (Math.abs(v0 - v1) > Math.max(1e-3, 0.01 * range))\n out.push({ level: \"warn\", code: \"loop_seam\", subject: trackId(t), animation: a.id,\n message: `animation \"${a.id}\" ${trackId(t)}: loop jumps from ${fmt(v1)} back to ${fmt(v0)} at the wrap (${fmt(v0)} \u2192 ${fmt(v1)})` });\n }\n }\n // Deform-authored meshes need dense (dfps) sampling to catch easing overshoot, checked below in the motion-pop\n // dfps walk (they stay in that group whether or not their bones move \u2014 the deform alone can fold them);\n // everything else is bone-driven, moves smoothly enough for fps, and is checked in the overflow-over-time fps\n // walk right below, at the times where its own bones have actually left the rest pose. Both walks already build\n // a full skeleton per sampled time for other checks, so the fold check reuses it instead of calling evaluate().\n const vertexKeyed = new Set(a.tracks.filter(t => t.target === \"deform\" && t.prop === \"vertices\").map(t => t.id));\n const deformMeshes = meshes.filter(att => vertexKeyed.has(att.id));\n const bonesMeshes = meshes.filter(att => !vertexKeyed.has(att.id));\n // the WORST sampled time, not the first one that folds: a fold that starts as a sliver and opens into a tear\n // has to be graded by how bad it gets, so every candidate mesh is sampled at EVERY time of its walk \u2014 there is\n // no early exit once a mesh has folded. Only the bookkeeping is per mesh: one entry, replaced whenever a later\n // sample folds a larger share of the rest area.\n const meshFolds = new Map<string, { t: number; n: number; k: number; ratio: number }>();\n const tryMeshFold = (att: MeshAttachment, skel: ReturnType<typeof evaluate>, t: number) => {\n const rest = restOf(att);\n const tris = foldedTriangles(rest, attachmentWorldVertices(skel, att.slot, att), att.triangles, 1);\n if (!tris.length) return;\n let folded = 0;\n for (const k of tris) folded += Math.abs(triangleArea(rest, att.triangles[3 * k], att.triangles[3 * k + 1], att.triangles[3 * k + 2]));\n const total = restArea.get(att.id)!;\n const ratio = total > 0 ? folded / total : 1;\n const prev = meshFolds.get(att.id);\n if (!prev || ratio > prev.ratio) meshFolds.set(att.id, { t, n: tris.length, k: tris[0], ratio });\n };\n // overflow over time (the IK reach check rides along on this walk \u2014 no second skeleton evaluation)\n const worst = new Map<string, { px: number; side: string; t: number }>();\n const ikOver = new Map<string, { frames: number; over: number; t: number }>();\n const fpsTimes = times(a, fps);\n for (const t of fpsTimes) {\n const pose = poseOf(a, t), world = evaluate(doc, pose);\n for (const s of doc.slots) {\n const o = overflowOf(pose, s.id, world);\n if (o && o.px > (worst.get(s.id)?.px ?? -Infinity)) worst.set(s.id, { px: o.px, side: o.side, t });\n }\n for (const c of ikCheckable) {\n const over = ikOvershoot(world, c);\n if (over === undefined) continue;\n const cur = ikOver.get(c.id);\n if (!cur) ikOver.set(c.id, { frames: 1, over, t });\n else { cur.frames++; if (over > cur.over) { cur.over = over; cur.t = t; } }\n }\n const moved = movedFlags(world);\n for (const att of bonesMeshes) if (meshBones.get(att.id)!.some(i => moved[i])) tryMeshFold(att, world, t);\n }\n for (const [slot, w] of worst) if (w.px > margin)\n out.push({ level: \"warn\", code: \"out_of_canvas\", subject: slot, animation: a.id, time: w.t,\n message: `slot \"${slot}\" leaves the canvas by ${Math.round(w.px)}px (${w.side}) at t=${w.t.toFixed(2)}s in \"${a.id}\"` });\n for (const c of ikCheckable) {\n const o = ikOver.get(c.id);\n if (o && o.frames > IK_UNREACHABLE_FRAMES * fpsTimes.length)\n out.push({ level: \"warn\", code: \"ik_unreachable\", subject: c.id, animation: a.id, time: o.t,\n message: `IK \"${c.id}\" cannot reach \"${c.target}\" in ${Math.round(100 * o.frames / fpsTimes.length)}% of \"${a.id}\" (worst ${Math.round(o.over)}px beyond the chain's reach at t=${o.t.toFixed(2)}s) \u2014 the chain hangs straight there instead of following the target` });\n }\n // keys with a step ease land their value at the next key's time: a pop there is the author's choice\n const stepTimes = a.tracks.flatMap(t => t.keys.slice(0, -1).map((k, i) => (k.ease === \"step\" ? t.keys[i + 1].t : -1)).filter(x => x >= 0));\n // motion pops: a bone that jumps far in one 60 fps frame compared with how it moves the rest of the time\n {\n const ts = times(a, dfps);\n const prev = new Map<string, [number, number]>();\n const deltas = new Map<string, { t: number; d: number }[]>();\n for (const t of ts) {\n const skel = evaluate(doc, poseOf(a, t)), world = skel.bones;\n for (const [id, { world: w }] of world) {\n const p = prev.get(id);\n if (p) (deltas.get(id) ?? deltas.set(id, []).get(id)!).push({ t, d: Math.hypot(w.tx - p[0], w.ty - p[1]) });\n prev.set(id, [w.tx, w.ty]);\n }\n for (const att of deformMeshes) tryMeshFold(att, skel, t);\n }\n for (const [id, ds] of deltas) {\n const sorted = ds.map(x => x.d).filter(d => d > 0).sort((x, y) => x - y);\n if (!sorted.length) continue;\n const typical = sorted[Math.floor(sorted.length / 2)];\n const worst = ds.reduce((m, x) => (x.d > m.d ? x : m), ds[0]);\n const index = ds.indexOf(worst);\n const neighbours = Math.max(ds[index - 1]?.d ?? 0, ds[index + 1]?.d ?? 0);\n if (worst.d > Math.max(6, 5 * typical, 3 * neighbours)) {\n const stepped = stepTimes.some(st => st > worst.t - 1 / dfps - 1e-9 && st <= worst.t + 1e-9);\n out.push({ level: stepped ? \"info\" : \"warn\", code: \"motion_pop\", subject: id, animation: a.id, time: worst.t,\n message: `bone \"${id}\" jumps ${Math.round(worst.d)}px in one frame at t=${worst.t.toFixed(2)}s in \"${a.id}\" (typical frame motion ${fmt(typical)}px) \u2014 a step key or a discontinuity` });\n }\n }\n }\n for (const att of [...deformMeshes, ...bonesMeshes]) {\n const f = meshFolds.get(att.id);\n if (f) out.push({ level: f.ratio >= FOLD_ERROR_RATIO ? \"error\" : \"warn\", code: \"mesh_fold\", subject: att.id, animation: a.id, time: f.t,\n message: `attachment \"${att.id}\" folds ${f.n} triangle${f.n === 1 ? \"\" : \"s\"} (first: triangle ${f.k}) at t=${f.t.toFixed(2)}s in \"${a.id}\" \u2014 reduce the deform or the bone motion (${fmt(100 * f.ratio)}% of the mesh)` });\n }\n // mesh folds (dense sampling catches easing overshoot between keys)\n const deformed = [...new Set(a.tracks.filter(t => t.target === \"deform\" && t.prop !== \"vertices\").map(t => t.id))];\n for (const attId of deformed) {\n const att = doc.attachments.find(x => x.id === attId);\n if (!att || att.type !== \"region\") continue;\n const asset = doc.assets.find(x => x.id === att.asset);\n if (!asset) continue;\n const w = att.width ?? asset.width, h = att.height ?? asset.height;\n let fold: { t: number; det: number } | undefined;\n for (const t of times(a, dfps)) {\n const params = deformParams(poseOf(a, t), attId);\n if (!params) continue;\n const det = minJacobian(controlOffsets(params, w, h, { x: 0.5, y: 0.5 }), w, h);\n if (det <= 0 && (!fold || det < fold.det)) fold = { t, det };\n }\n if (fold) out.push({ level: \"error\", code: \"deform_flip\", subject: attId, animation: a.id, time: fold.t,\n message: `attachment \"${attId}\" folds over itself (jacobian ${fmt(fold.det)}) at t=${fold.t.toFixed(2)}s in \"${a.id}\" \u2014 reduce the deform or its easing overshoot` });\n }\n }\n\n // --- provenance: every asset a slot can show should land where its source bbox says (importer/edit drift)\n for (const att of doc.attachments) {\n if (att.type !== \"region\") continue;\n const asset = doc.assets.find(a => a.id === att.asset), bbox = asset?.origin?.bbox;\n if (!asset || !bbox || asset.origin?.bboxSpace === \"source\" || !doc.slots.some(s => s.id === att.slot)) continue;\n const [cx, cy] = apply(regionMatrix(restWorld, att.slot, att), 0, 0);\n const ex = bbox[0] + bbox[2] / 2, ey = bbox[1] + bbox[3] / 2, dx = cx - ex, dy = cy - ey;\n const dist = Math.hypot(dx, dy);\n if (dist > 2) out.push({ level: \"warn\", code: \"patch_offset\", subject: att.slot,\n message: `slot \"${att.slot}\": attachment \"${att.id}\" sits ${Math.round(dist)}px ${Math.abs(dy) >= Math.abs(dx) ? (dy > 0 ? \"below\" : \"above\") : (dx > 0 ? \"right of\" : \"left of\")} its source bbox (expected centre (${fmt(ex)}, ${fmt(ey)}), rig places it at (${fmt(cx)}, ${fmt(cy)}))` });\n }\n\n // --- document-level: skinned mesh vertices whose influence weights don't sum to 1\n for (const att of doc.attachments) {\n if (att.type !== \"mesh\" || !att.weights) continue;\n let firstIndex = -1, firstSum = 0, count = 0;\n att.weights.forEach((list, i) => {\n const sum = list.reduce((s, inf) => s + inf.w, 0);\n if (Math.abs(sum - 1) > 0.01) { count++; if (firstIndex < 0) { firstIndex = i; firstSum = sum; } }\n });\n if (count > 0) out.push({ level: \"warn\", code: \"weights_sum\", subject: att.id,\n message: `attachment \"${att.id}\": ${count} ${count === 1 ? \"vertex has\" : \"vertices have\"} weights that do not sum to 1 (first: vertex ${firstIndex}, sum ${fmt(firstSum)})` });\n }\n\n // --- document-level: unused assets, never-visible slots\n const shownAttachments = new Set<string>();\n for (const s of doc.slots) if (s.attachment) shownAttachments.add(s.attachment);\n const swappedIn = new Set<string>();\n for (const a of doc.animations) for (const t of a.tracks)\n if (t.target === \"slot\" && t.prop === \"attachment\") for (const k of t.keys) if (typeof k.v === \"string\") { shownAttachments.add(k.v); swappedIn.add(t.id); }\n const used = new Set<string>();\n for (const att of doc.attachments) if (att.type !== \"path\" && shownAttachments.has(att.id)) used.add(att.asset);\n for (const asset of doc.assets) if (!used.has(asset.id))\n out.push({ level: \"info\", code: \"unused_asset\", subject: asset.id, message: `asset \"${asset.id}\" is not shown by any attachment at rest or in any animation` });\n const maskSlots = new Set(doc.slots.flatMap(s => s.clip ? [doc.attachments.find(a => a.id === s.clip)?.slot] : []));\n for (const s of doc.slots) if (!s.attachment && !swappedIn.has(s.id) && !maskSlots.has(s.id))\n out.push({ level: \"warn\", code: \"never_visible\", subject: s.id, message: `slot \"${s.id}\" has no attachment and no animation ever shows one` });\n\n return out;\n}\n\n/** One-line count plus the findings \u2014 appended to preview results and returned by rig_check.\n * A single noisy code (e.g. mesh_fold across 100 meshes) is capped at 5 lines so it can't crowd out every\n * other kind of finding within `max`; the rest fold into one \"\u2026 N more <code>\" line, then the overall `max`\n * still applies on top of that. */\nexport function summarize(findings: Finding[], max = 12): string {\n if (!findings.length) return \"check: OK\";\n const rank = { error: 0, warn: 1, info: 2 };\n const sorted = [...findings].sort((a, b) => rank[a.level] - rank[b.level]);\n const n = (level: Finding[\"level\"]) => findings.filter(f => f.level === level).length;\n const parts = [[n(\"error\"), \"error\"], [n(\"warn\"), \"warning\"], [n(\"info\"), \"info\"]] as const;\n const head = \"check: \" + parts.filter(([c]) => c > 0).map(([c, w]) => `${c} ${w}${c === 1 || w === \"info\" ? \"\" : \"s\"}`).join(\", \");\n\n const PER_CODE = 5;\n const codeTotal = new Map<string, number>();\n for (const f of sorted) codeTotal.set(f.code, (codeTotal.get(f.code) ?? 0) + 1);\n const shownPerCode = new Map<string, number>();\n const lines: string[] = [];\n for (const f of sorted) {\n const shown = shownPerCode.get(f.code) ?? 0;\n if (shown < PER_CODE) lines.push(` [${f.level}] ${f.code}: ${f.message}`);\n else if (shown === PER_CODE) lines.push(` \u2026 ${codeTotal.get(f.code)! - PER_CODE} more ${f.code}`);\n shownPerCode.set(f.code, shown + 1);\n }\n const capped = lines.slice(0, max);\n if (lines.length > max) capped.push(` \u2026 ${lines.length - max} more`);\n return [head, ...capped].join(\"\\n\");\n}\n", "/**\n * rig-history \u2014 version snapshots next to rig.json (`.rig-history/<name>/NNNN.json`) and a structural diff.\n * The MCP server pushes the previous file before every mutation; `rig_undo` pops, `rig_diff` compares.\n */\nimport { mkdir, readdir, readFile, writeFile, unlink } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\nimport type { RigDocument, Animation, Track } from \"./rig-format\";\n\nexport function historyDir(rigPath: string): string {\n return join(dirname(rigPath), \".rig-history\", basename(rigPath).replace(/\\.json$/, \"\"));\n}\n\nasync function files(dir: string): Promise<string[]> {\n try { return (await readdir(dir)).filter(f => /^\\d{4,}\\.json$/.test(f))\n .sort((a, b) => Number(a.slice(0, -5)) - Number(b.slice(0, -5))); }\n catch { return []; }\n}\n\nasync function snapshots(rigPath: string): Promise<string[]> {\n return files(historyDir(rigPath));\n}\n\n/** oldest \u2192 newest absolute paths */\nexport async function listHistory(rigPath: string): Promise<string[]> {\n return (await snapshots(rigPath)).map(f => join(historyDir(rigPath), f));\n}\n\nexport const redoDir = (rigPath: string) => join(historyDir(rigPath), \"redo\");\n\n/** oldest \u2192 newest absolute paths of redo entries */\nexport async function listRedo(rigPath: string): Promise<string[]> {\n return (await files(redoDir(rigPath))).map(f => join(redoDir(rigPath), f));\n}\n\n/** Discard every redo entry (invoked whenever a new mutation is pushed). */\nexport async function clearRedo(rigPath: string): Promise<void> {\n for (const f of await listRedo(rigPath)) await unlink(f);\n}\n\nasync function pushInto(dir: string, contents: string, keep: number): Promise<string> {\n await mkdir(dir, { recursive: true });\n const fs = await files(dir);\n const next = fs.length ? +fs[fs.length - 1].slice(0, -5) + 1 : 1;\n const file = join(dir, `${String(next).padStart(4, \"0\")}.json`);\n await writeFile(file, contents);\n for (const f of fs.slice(0, Math.max(0, fs.length + 1 - keep))) await unlink(join(dir, f));\n return file;\n}\n\n/** Store `contents` as the newest snapshot; keeps the last `keep`. A new mutation invalidates redo unless `keepRedo`. */\nexport async function pushHistory(rigPath: string, contents: string, keep = 50, opts: { keepRedo?: boolean } = {}): Promise<string> {\n if (!opts.keepRedo) await clearRedo(rigPath);\n return pushInto(historyDir(rigPath), contents, keep);\n}\n\n/** Contents of the `steps`-th newest snapshot; it and everything newer are discarded. */\nexport async function popHistory(rigPath: string, steps = 1): Promise<string> {\n const files = await snapshots(rigPath);\n if (!files.length) throw new Error(\"no history for this rig\");\n if (!Number.isInteger(steps) || steps < 1 || steps > files.length)\n throw new Error(`only ${files.length} snapshot${files.length === 1 ? \"\" : \"s\"} available, cannot undo ${steps}`);\n const dir = historyDir(rigPath);\n const contents = await readFile(join(dir, files[files.length - steps]), \"utf8\");\n for (const f of files.slice(files.length - steps)) await unlink(join(dir, f));\n return contents;\n}\n\n/** Undo `steps` mutations: the current file goes to the redo stack; returns the contents to write back. */\nexport async function undo(rigPath: string, steps = 1): Promise<string> {\n const current = await readFile(rigPath, \"utf8\");\n const restored = await popHistory(rigPath, steps);\n await pushInto(redoDir(rigPath), current, 50);\n return restored;\n}\n\n/** Redo the last undo: returns the contents to write back; the pre-redo state is snapshotted into history. */\nexport async function redo(rigPath: string): Promise<string> {\n const entries = await listRedo(rigPath);\n if (!entries.length) throw new Error(\"nothing to redo\");\n const file = entries[entries.length - 1];\n const contents = await readFile(file, \"utf8\");\n await pushHistory(rigPath, await readFile(rigPath, \"utf8\"), 50, { keepRedo: true });\n await unlink(file);\n return contents;\n}\n\n// ---------- diff ----------\n\nconst j = (v: unknown) => JSON.stringify(v);\nconst fmt = (v: unknown) => (typeof v === \"number\" ? String(Math.round(v * 1000) / 1000) : v === undefined ? \"\u2205\" : j(v));\nconst isObj = (v: unknown): v is Record<string, unknown> => typeof v === \"object\" && v !== null && !Array.isArray(v);\n/** an array long enough that printing it costs more than it tells */\nconst long = (v: unknown) => Array.isArray(v) && v.length > 4;\nconst entries = (v: unknown) => (Array.isArray(v) ? `${v.length} entries` : fmt(v));\n\n/** leaf-level changes between two plain objects: \"path: a \u2192 b\" */\nfunction leafDiff(a: Record<string, unknown>, b: Record<string, unknown>, prefix = \"\"): string[] {\n const out: string[] = [];\n for (const k of new Set([...Object.keys(a), ...Object.keys(b)])) {\n const va = a[k], vb = b[k], path = prefix ? `${prefix}.${k}` : k;\n if (j(va) === j(vb)) continue;\n if (isObj(va) && isObj(vb)) out.push(...leafDiff(va, vb, path));\n else if (Array.isArray(va) && Array.isArray(vb) && va.length === vb.length && va.length > 4\n && va.every(n => typeof n === \"number\") && vb.every(n => typeof n === \"number\")) {\n let n = 0, max = 0;\n for (let i = 0; i < va.length; i++) { const d = Math.abs((va[i] as number) - (vb[i] as number)); if (d) { n++; if (d > max) max = d; } }\n out.push(`${path}: ${n} values changed (max |\u0394| ${fmt(max)})`);\n }\n // same length, not all numbers (weights, draw orders): count the positions that differ instead of printing them\n else if (Array.isArray(va) && Array.isArray(vb) && va.length === vb.length && va.length > 4) {\n let n = 0;\n for (let i = 0; i < va.length; i++) if (j(va[i]) !== j(vb[i])) n++;\n out.push(`${path}: ${n} entries changed`);\n }\n // both arrays, different lengths: only a long one is worth summarizing (ik `bones` still prints its ids)\n else if (Array.isArray(va) && Array.isArray(vb))\n out.push(Math.max(va.length, vb.length) > 4 ? `${path}: length ${va.length} \u2192 ${vb.length}` : `${path}: ${fmt(va)} \u2192 ${fmt(vb)}`);\n // a long array appearing or disappearing (a mesh gaining uvs, vertices \u2194 weights): its contents help nobody\n else if (long(va) || long(vb)) out.push(`${path}: ${entries(va)} \u2192 ${entries(vb)}`);\n else out.push(`${path}: ${fmt(va)} \u2192 ${fmt(vb)}`);\n }\n return out;\n}\n\nconst trackId = (t: Track) => `${t.target}.${t.id}.${t.prop}`;\nfunction trackRange(t: Track): string {\n const nums = t.keys.map(k => k.v).filter((v): v is number => typeof v === \"number\");\n return nums.length ? `[${fmt(Math.min(...nums))}..${fmt(Math.max(...nums))}]` : `{${[...new Set(t.keys.map(k => fmt(k.v)))].join(\",\")}}`;\n}\nconst keyCount = (t: Track) => `${t.keys.length} key${t.keys.length === 1 ? \"\" : \"s\"}`;\n\nfunction animDiff(a: Animation, b: Animation): string[] {\n const out: string[] = [], id = `animation ${a.id}`;\n for (const k of [\"duration\", \"loop\"] as const) if (a[k] !== b[k]) out.push(`~ ${id}: ${k}: ${fmt(a[k])} \u2192 ${fmt(b[k])}`);\n if (a.preset && !b.preset) out.push(`~ ${id}: preset ${a.preset.name} dropped (manual keys)`);\n else if (!a.preset && b.preset) out.push(`~ ${id}: preset ${b.preset.name} applied ${j(b.preset.params)}`);\n else if (a.preset && b.preset) {\n if (a.preset.name !== b.preset.name) out.push(`~ ${id}: preset ${a.preset.name} \u2192 ${b.preset.name}`);\n for (const l of leafDiff(a.preset.params, b.preset.params)) out.push(`~ ${id}: preset ${b.preset.name} ${l}`);\n }\n const ta = new Map(a.tracks.map(t => [trackId(t), t])), tb = new Map(b.tracks.map(t => [trackId(t), t]));\n for (const [tid, t] of tb) if (!ta.has(tid)) out.push(`+ track ${tid} (${keyCount(t)}) ${trackRange(t)} in ${a.id}`);\n for (const [tid, t] of ta) {\n const u = tb.get(tid);\n if (!u) out.push(`- track ${tid} (${keyCount(t)}) from ${a.id}`);\n else if (j(t.keys) !== j(u.keys)) out.push(`~ track ${tid} in ${a.id}: ${keyCount(t)} ${trackRange(t)} \u2192 ${t.keys.length === u.keys.length ? \"\" : keyCount(u) + \" \"}${trackRange(u)}`);\n }\n if (j(a.events) !== j(b.events)) out.push(`~ ${id}: events ${a.events.map(e => e.name).join(\",\") || \"\u2205\"} \u2192 ${b.events.map(e => e.name).join(\",\") || \"\u2205\"}`);\n return out;\n}\n\n/** Human-readable structural difference; empty when the documents are identical. */\nexport function diffDocs(a: RigDocument, b: RigDocument): string[] {\n const out: string[] = [];\n for (const l of leafDiff(a.meta, b.meta)) out.push(`~ meta.${l}`);\n const kinds: [keyof RigDocument, string][] = [\n [\"assets\", \"asset\"], [\"bones\", \"bone\"], [\"slots\", \"slot\"],\n [\"attachments\", \"attachment\"], [\"ik\", \"ik\"], [\"transform\", \"transform\"], [\"path\", \"path\"],\n ];\n for (const [kind, name] of kinds) {\n const ma = new Map((a[kind] as { id: string }[]).map(x => [x.id, x as unknown as Record<string, unknown>]));\n const mb = new Map((b[kind] as { id: string }[]).map(x => [x.id, x as unknown as Record<string, unknown>]));\n for (const [id, x] of mb) if (!ma.has(id)) out.push(`+ ${name} ${id} ${j(x)}`);\n for (const [id, x] of ma) {\n const y = mb.get(id);\n if (!y) out.push(`- ${name} ${id}`);\n else for (const l of leafDiff(x, y)) out.push(`~ ${name} ${id}: ${l}`);\n }\n }\n const aa = new Map(a.animations.map(x => [x.id, x])), ab = new Map(b.animations.map(x => [x.id, x]));\n for (const [id, x] of ab) if (!aa.has(id)) out.push(`+ animation ${id} (${x.duration}s${x.loop ? \" loop\" : \"\"}, ${x.tracks.length} tracks${x.preset ? `, preset ${x.preset.name}` : \"\"})`);\n for (const [id, x] of aa) {\n const y = ab.get(id);\n if (!y) out.push(`- animation ${id}`);\n else out.push(...animDiff(x, y));\n }\n return out;\n}\n", "/**\n * rig-atlas \u2014 pack a rig's PNG layers into one sprite sheet for export.\n * Shelf packing (rows of height-sorted rects) with a transparent gutter; good enough for \u2264 a few hundred parts.\n * Each frame's edge pixels are extruded into the gutter so bilinear sampling at a frame edge (deformed meshes,\n * minified sprites) sees the edge colour, like a standalone texture's clamp-to-edge, instead of transparency.\n * Runtime side: `asset.frame` + `createTextures()` in rig-runtime.ts.\n */\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { saveJson } from \"./rig-io\";\nimport { PNG } from \"pngjs\";\nimport type { RigDocument } from \"./rig-format\";\n\nexport interface Rect { id: string; width: number; height: number }\nexport interface Packed { width: number; height: number; frames: Map<string, [number, number, number, number]> }\n\nexport interface PackOptions {\n /** gap between frames in px (default 2); never less than 2\u00B7extrude */\n padding?: number;\n /** px of edge replication into the gutter (default 1) */\n extrude?: number;\n maxSize?: number;\n}\n\nexport function packRects(rects: Rect[], opts: PackOptions = {}): Packed {\n const extrude = opts.extrude ?? 1, pad = Math.max(opts.padding ?? 2, 2 * extrude), max = opts.maxSize ?? 4096;\n const sorted = [...rects].sort((a, b) => b.height - a.height || b.width - a.width || a.id.localeCompare(b.id));\n for (const r of sorted)\n if (r.width + 2 * pad > max || r.height + 2 * pad > max) throw new Error(`asset \"${r.id}\" (${r.width}\u00D7${r.height}) does not fit in a ${max}px atlas`);\n const area = sorted.reduce((s, r) => s + (r.width + pad) * (r.height + pad), 0);\n const widest = Math.max(0, ...sorted.map(r => r.width + 2 * pad));\n let width = 64;\n while (width < max && (width < widest || width * width < area)) width *= 2;\n for (;;) {\n const frames = new Map<string, [number, number, number, number]>();\n let x = pad, y = pad, shelf = 0;\n for (const r of sorted) {\n if (x + r.width + pad > width) { x = pad; y += shelf + pad; shelf = 0; }\n frames.set(r.id, [x, y, r.width, r.height]);\n x += r.width + pad;\n shelf = Math.max(shelf, r.height);\n }\n const height = y + shelf + pad;\n if (height <= max) return { width, height, frames };\n if (width >= max) throw new Error(`atlas does not fit in ${max}\u00D7${max} (needs ${width}\u00D7${height})`);\n width *= 2;\n }\n}\n\n/** Read every PNG asset, pack, write `<outDir>/atlas.png` + `<outDir>/rig.json`; returns the exported document. */\n/** replicate the outer ring of a frame `n` px outward (edges and corners) */\nfunction extrudeFrame(sheet: PNG, x: number, y: number, w: number, h: number, n: number) {\n const W = sheet.width, H = sheet.height, d = sheet.data;\n const copy = (sx: number, sy: number, dx: number, dy: number) => {\n if (dx < 0 || dy < 0 || dx >= W || dy >= H) return;\n d.copy(d, (dy * W + dx) * 4, (sy * W + sx) * 4, (sy * W + sx) * 4 + 4);\n };\n for (let i = 1; i <= n; i++) {\n for (let xx = x; xx < x + w; xx++) { copy(xx, y, xx, y - i); copy(xx, y + h - 1, xx, y + h - 1 + i); }\n for (let yy = y; yy < y + h; yy++) { copy(x, yy, x - i, yy); copy(x + w - 1, yy, x + w - 1 + i, yy); }\n }\n for (let i = 1; i <= n; i++) for (let k = 1; k <= n; k++) {\n copy(x, y, x - i, y - k); copy(x + w - 1, y, x + w - 1 + i, y - k);\n copy(x, y + h - 1, x - i, y + h - 1 + k); copy(x + w - 1, y + h - 1, x + w - 1 + i, y + h - 1 + k);\n }\n}\n\nexport async function buildAtlas(doc: RigDocument, assetsDir: string, outDir: string, opts: PackOptions = {}): Promise<RigDocument> {\n const images = new Map<string, PNG>();\n const files = new Map<string, PNG>();\n for (const a of doc.assets) {\n if (!/\\.png$/i.test(a.src)) throw new Error(`atlas requires PNG assets: \"${a.src}\" (asset \"${a.id}\") is not a PNG`);\n let png = files.get(a.src);\n if (!png) files.set(a.src, (png = PNG.sync.read(await readFile(join(assetsDir, a.src)))));\n if (a.frame) {\n const [fx, fy, fw, fh] = a.frame, sub = new PNG({ width: fw, height: fh });\n PNG.bitblt(png, sub, fx, fy, fw, fh, 0, 0);\n png = sub;\n }\n if (png.width !== a.width || png.height !== a.height)\n throw new Error(`asset \"${a.id}\": document says ${a.width}\u00D7${a.height} but \"${a.src}\" is ${png.width}\u00D7${png.height}`);\n images.set(a.id, png);\n }\n const packed = packRects(doc.assets.map(a => ({ id: a.id, width: a.width, height: a.height })), opts);\n const sheet = new PNG({ width: packed.width, height: packed.height });\n for (const [id, [x, y, w, h]] of packed.frames) {\n PNG.bitblt(images.get(id)!, sheet, 0, 0, w, h, x, y);\n extrudeFrame(sheet, x, y, w, h, opts.extrude ?? 1);\n }\n await mkdir(outDir, { recursive: true });\n await writeFile(join(outDir, \"atlas.png\"), PNG.sync.write(sheet));\n const out: RigDocument = { ...doc, assets: doc.assets.map(a => ({ ...a, src: \"atlas.png\", frame: packed.frames.get(a.id)! })) };\n await saveJson(join(outDir, \"rig.json\"), out); // the same atomic write every other rig.json writer uses\n return out;\n}\n", "/**\n * spine-import \u2014 Spine JSON (3.8 / 4.x) + atlas \u2192 energy8.rig v2 document. Our own reader of the documented format.\n *\n * Coordinates: Spine is y-up with the skeleton origin at (0,0); the document is y-down with the skeleton's bounding\n * box mapped onto the canvas. A reflection R (y \u2190 \u2212y) conjugates every transform: local values become\n * (x, \u2212y, \u2212rotation, scaleX, scaleY, \u2212shearX, \u2212shearY) and attachment-local coordinates are mirrored; a synthetic\n * document root carries the translation. Bone timelines (relative in Spine) are converted to absolute values.\n */\nimport { readFile, stat, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, extname, join, relative } from \"node:path\";\nimport { apply, attachmentWorldVertices, evaluate, pk, poseOf, regionMatrix, regionSize, restValue, type Pose } from \"./rig-anim\";\nimport { parse, type RigDocument } from \"./rig-format\";\nimport { ktx2ToPng } from \"./ktx2\";\n\n/** Spine 4.1+ (and the spine-core runtime) keeps deform timelines under `attachments`; 4.0 files store them under `deform`. Returns a 4.1-shaped copy. */\nexport function spineJson41(j: any): any {\n const out = structuredClone(j);\n for (const a of Object.values(out.animations ?? {}) as any[]) {\n if (!a.deform || a.attachments) continue;\n a.attachments = {};\n for (const [skin, slots] of Object.entries(a.deform as Record<string, Record<string, Record<string, unknown>>>)) {\n a.attachments[skin] = {};\n for (const [slot, atts] of Object.entries(slots)) {\n a.attachments[skin][slot] = {};\n for (const [att, frames] of Object.entries(atts)) a.attachments[skin][slot][att] = { deform: frames };\n }\n }\n }\n return out;\n}\n\n\nexport interface AtlasRegion { name: string; page: string; x: number; y: number; width: number; height: number; rotate: 0 | 90; offsetX: number; offsetY: number; originalWidth: number; originalHeight: number }\nexport interface AtlasPage { name: string; width: number; height: number; scale: number }\n\n/** Parse a Spine atlas (3.8 or 4.x text; base64-wrapped text is accepted too). */\nexport function parseAtlas(text: string): { pages: AtlasPage[]; regions: AtlasRegion[] } {\n if (!/\\n/.test(text.trim()) && /^[A-Za-z0-9+/=\\s]+$/.test(text)) text = Buffer.from(text, \"base64\").toString(\"utf8\");\n const pages: AtlasPage[] = [], regions: AtlasRegion[] = [];\n let page: AtlasPage | undefined, region: AtlasRegion | undefined;\n for (const raw of text.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (!line) { page = undefined; continue; }\n const colon = line.indexOf(\":\");\n if (colon < 0) {\n if (!page || /\\.(png|jpe?g|webp|ktx2?|pvr|dds|astc)$/i.test(line)) { page = { name: line, width: 0, height: 0, scale: 1 }; pages.push(page); region = undefined; continue; }\n region = { name: line, page: page.name, x: 0, y: 0, width: 0, height: 0, rotate: 0, offsetX: 0, offsetY: 0, originalWidth: 0, originalHeight: 0 };\n regions.push(region);\n continue;\n }\n const key = line.slice(0, colon).trim(), vals = line.slice(colon + 1).split(\",\").map(s => s.trim());\n if (!region) {\n if (!page) continue;\n if (key === \"size\") { page.width = +vals[0]; page.height = +vals[1]; }\n else if (key === \"scale\") page.scale = +vals[0];\n continue;\n }\n switch (key) {\n case \"bounds\": region.x = +vals[0]; region.y = +vals[1]; region.width = +vals[2]; region.height = +vals[3]; break;\n case \"xy\": region.x = +vals[0]; region.y = +vals[1]; break;\n case \"size\": region.width = +vals[0]; region.height = +vals[1]; break;\n case \"offsets\": region.offsetX = +vals[0]; region.offsetY = +vals[1]; region.originalWidth = +vals[2]; region.originalHeight = +vals[3]; break;\n case \"offset\": region.offsetX = +vals[0]; region.offsetY = +vals[1]; break;\n case \"orig\": region.originalWidth = +vals[0]; region.originalHeight = +vals[1]; break;\n case \"rotate\": region.rotate = vals[0] === \"true\" || vals[0] === \"90\" ? 90 : 0; break;\n }\n }\n for (const r of regions) if (!r.originalWidth && !r.originalHeight) { r.originalWidth = r.width; r.originalHeight = r.height; }\n return { pages, regions };\n}\n\n// ---------- ids ----------\n\nclass Ids {\n private used = new Set<string>();\n private map = new Map<string, string>();\n constructor(private prefix = \"\") {}\n get(name: string): string {\n const known = this.map.get(name);\n if (known) return known;\n let base = name.toLowerCase().replace(/[^a-z0-9_]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n if (!/^[a-z]/.test(base)) base = this.prefix + (base || \"x\");\n let id = base, n = 2;\n while (this.used.has(id)) id = `${base}_${n++}`;\n this.used.add(id); this.map.set(name, id);\n return id;\n }\n has(name: string) { return this.map.has(name); }\n}\n\n// ---------- import ----------\n\nexport interface ImportOptions {\n name?: string;\n /** file name to use for the atlas page image(s) in asset.src (e.g. \"ross.png\" after transcoding a ktx2) */\n pageImage?: string | ((page: string) => string);\n /** canvas margin around the skeleton bounds, px */\n margin?: number;\n /** canvas = the union of everything shown in every animation (default) or just the setup-pose bounds */\n fit?: \"animations\" | \"setup\";\n notes?: string;\n}\n\nexport interface ImportResult {\n doc: unknown;\n warnings: string[];\n boneId(name: string): string;\n slotId(name: string): string;\n attachmentId(slotName: string, attachmentName: string): string;\n assetId(regionName: string): string;\n animId(name: string): string;\n /** spine (y-up, skeleton origin) \u2192 document */\n toDoc(x: number, y: number): [number, number];\n}\n\nexport const spineToDoc = (x: number, y: number, originX: number, originY: number): [number, number] => [x + originX, originY - y];\n\ntype J = Record<string, any>;\nconst r4 = (v: number) => Math.round(v * 1e6) / 1e6 + 0;\nconst hex8 = (c: string | undefined) => `#${(c ?? \"ffffffff\").toLowerCase().padEnd(8, \"f\").slice(0, 8)}`;\n\nexport function importSpine(json: J, atlasText: string, opts: ImportOptions = {}): ImportResult {\n const warnings: string[] = [];\n const atlas = parseAtlas(atlasText);\n const version = String(json.skeleton?.spine ?? \"4.0\");\n const major = parseFloat(version);\n const bounds = { x: json.skeleton?.x ?? 0, y: json.skeleton?.y ?? 0, w: json.skeleton?.width ?? 0, h: json.skeleton?.height ?? 0 };\n const margin = opts.margin ?? 0;\n let originX = -bounds.x + margin, originY = bounds.y + bounds.h + margin;\n const toDoc = (x: number, y: number) => spineToDoc(x, y, originX, originY);\n\n const boneIds = new Ids(\"b_\"), slotIds = new Ids(\"s_\"), assetIds = new Ids(\"a_\"), attIds = new Ids(\"att_\"), ikIds = new Ids(\"ik_\"), tcIds = new Ids(\"tc_\"), pcIds = new Ids(\"pc_\"), animIds = new Ids(\"anim_\");\n const ROOT = \"origin\";\n const attachmentIdMap = new Map<string, string>();\n const attachmentId = (slot: string, name: string) => {\n const key = `${slot} ${name}`;\n let id = attachmentIdMap.get(key);\n if (!id) { id = attIds.get(attIds.has(name) ? `${slot}_${name}` : name); attachmentIdMap.set(key, id); }\n return id;\n };\n\n // ---- bones\n const spineBones: J[] = json.bones ?? [];\n const boneIndexByName = new Map(spineBones.map((b, i) => [b.name, i]));\n const bones: J[] = [{ id: ROOT, transform: { x: r4(originX), y: r4(originY) }, role: \"root\" }];\n for (const b of spineBones) {\n bones.push({\n id: boneIds.get(b.name),\n parent: b.parent ? boneIds.get(b.parent) : ROOT,\n length: b.length ?? 0,\n transform: { x: r4(b.x ?? 0), y: r4(-(b.y ?? 0)), rotation: r4(-(b.rotation ?? 0)), scaleX: b.scaleX ?? 1, scaleY: b.scaleY ?? 1, shearX: r4(-(b.shearX ?? 0)), shearY: r4(-(b.shearY ?? 0)) },\n inherit: b.transform ?? b.inherit ?? \"normal\",\n ...(b.color ? { color: b.color } : {}),\n });\n }\n\n const skins: { name: string; attachments: J }[] = Array.isArray(json.skins) ? json.skins : Object.entries(json.skins ?? {}).map(([name, attachments]) => ({ name, attachments: attachments as J }));\n /**\n * A slot's setup attachment \u2014 and every `attachment` timeline key \u2014 names a PLAIN attachment; which skin\n * supplies it is a runtime choice in Spine. Attachments below are stored with a `<skin>_` prefix outside the\n * default skin, so a plain name would dangle on any rig whose setup pose comes from a non-default skin (forge\n * has six skins and 51-69 slots in each; ross has one, which is why this never showed). Resolve through the\n * first skin that offers the name, default first.\n */\n /**\n * A sequence attachment is ONE attachment in Spine that shows one of `count` numbered regions; the format here\n * has no such thing, so the import expands it into `count` ordinary attachments and drives them with the\n * `attachment` track the format already has. `Sequence.getPath` in spine-core is this padding, and the index\n * added to `start` is what the runtime appends \u2014 the two must keep agreeing or every frame misses its region.\n */\n const frameSuffix = (seq: J, index: number) => {\n const n = String((seq.start ?? 0) + index);\n return \"0\".repeat(Math.max(0, (seq.digits ?? 0) - n.length)) + n;\n };\n const sequences = new Map<string, J>(); // `${slot} ${prefixed name}` \u2192 the Spine sequence block\n\n const skinnedName = new Map<string, string>();\n for (const skin of skins) {\n const prefix = skin.name === \"default\" ? \"\" : `${skin.name}_`;\n for (const [slotName, atts] of Object.entries(skin.attachments ?? {}))\n for (const [name, a] of Object.entries(atts as J)) {\n const key = `${slotName} ${name}`;\n // a slot naming a sequence attachment means \"show its setup frame\": the base name belongs to no region\n const seq = (a as J).sequence;\n if (!skinnedName.has(key)) skinnedName.set(key, prefix + name + (seq ? frameSuffix(seq, seq.setupIndex ?? 0) : \"\"));\n }\n }\n const attachmentRef = (slot: string, name: string) => attachmentId(slot, skinnedName.get(`${slot} ${name}`) ?? name);\n\n // ---- slots (draw order = array order)\n const spineSlots: J[] = json.slots ?? [];\n const slotIndexByName = new Map(spineSlots.map((s, i) => [s.name, i]));\n const blendOf = (b?: string) => (b === \"additive\" ? \"add\" : b === \"multiply\" ? \"multiply\" : b === \"screen\" ? \"screen\" : \"normal\");\n const slots: J[] = spineSlots.map((s, i) => ({\n id: slotIds.get(s.name), bone: boneIds.get(s.bone), z: i,\n ...(s.attachment ? { attachment: attachmentRef(s.name, s.attachment) } : {}),\n blend: blendOf(s.blend), color: hex8(s.color), alpha: 1,\n }));\n\n // ---- assets from atlas regions (lazily, only the ones used)\n const pageImage = (page: string) => (typeof opts.pageImage === \"function\" ? opts.pageImage(page) : opts.pageImage ?? page);\n const assets = new Map<string, J>();\n const regionByName = new Map(atlas.regions.map(r => [r.name, r]));\n const assetFor = (regionName: string): string | undefined => {\n const r = regionByName.get(regionName);\n if (!r) { warnings.push(`atlas region \"${regionName}\" not found`); return undefined; }\n const id = assetIds.get(regionName);\n if (!assets.has(id)) {\n const trimmed = r.offsetX || r.offsetY || r.originalWidth !== r.width || r.originalHeight !== r.height;\n assets.set(id, { id, src: pageImage(r.page), width: r.originalWidth, height: r.originalHeight,\n frame: [r.x, r.y, r.width, r.height], rotate: r.rotate, ...(trimmed ? { trim: [r.offsetX, r.offsetY] } : {}) });\n }\n return id;\n };\n\n // ---- attachments (default skin + other skins merged with a skin prefix)\n const attachments: J[] = [];\n const readVertices = (a: J, vertexCount: number): { vertices?: number[]; weights?: J[][] } => {\n const v: number[] = a.vertices ?? [];\n if (v.length === vertexCount * 2) {\n const out: number[] = [];\n for (let i = 0; i < v.length; i += 2) out.push(r4(v[i]), r4(-v[i + 1]));\n return { vertices: out };\n }\n const weights: J[][] = [];\n for (let i = 0; i < v.length;) {\n const n = v[i++], list: J[] = [];\n for (let k = 0; k < n; k++) { const bi = v[i++], x = v[i++], y = v[i++], w = v[i++]; list.push({ bone: boneIds.get(spineBones[bi].name), x: r4(x), y: r4(-y), w }); }\n // JSON weights are rounded and rarely sum to exactly 1; normalize so skinning is translation-invariant\n const sum = list.reduce((s, inf) => s + inf.w, 0) || 1;\n for (const inf of list) inf.w = inf.w / sum;\n weights.push(list);\n }\n return { weights };\n };\n for (const skin of skins) {\n const prefix = skin.name === \"default\" ? \"\" : `${skin.name}_`;\n for (const [slotName, atts] of Object.entries(skin.attachments ?? {})) {\n if (!slotIndexByName.has(slotName)) { warnings.push(`skin \"${skin.name}\": unknown slot \"${slotName}\"`); continue; }\n const slot = slotIds.get(slotName);\n for (const [name, a] of Object.entries(atts as J)) {\n if (a.sequence) {\n sequences.set(`${slotName} ${prefix}${name}`, a.sequence);\n const base = a.path ?? name;\n for (let i = 0; i < (a.sequence.count ?? 0); i++) {\n const suffix = frameSuffix(a.sequence, i), asset = assetFor(base + suffix);\n if (!asset) continue;\n attachments.push({ id: attachmentId(slotName, prefix + name + suffix), slot, type: \"region\", asset,\n x: r4(a.x ?? 0), y: r4(-(a.y ?? 0)), rotation: r4(-(a.rotation ?? 0)), scaleX: a.scaleX ?? 1, scaleY: a.scaleY ?? 1,\n ...(a.width ? { width: a.width } : {}), ...(a.height ? { height: a.height } : {}) });\n }\n if ((a.type ?? \"region\") !== \"region\") warnings.push(`sequence \"${slotName}/${name}\" of type ${a.type} imported as regions`);\n continue;\n }\n const type = a.type ?? \"region\", id = attachmentId(slotName, prefix + name);\n if (type === \"region\") {\n const asset = assetFor(a.path ?? name);\n if (!asset) continue;\n attachments.push({ id, slot, type: \"region\", asset, x: r4(a.x ?? 0), y: r4(-(a.y ?? 0)), rotation: r4(-(a.rotation ?? 0)), scaleX: a.scaleX ?? 1, scaleY: a.scaleY ?? 1,\n ...(a.width ? { width: a.width } : {}), ...(a.height ? { height: a.height } : {}) });\n } else if (type === \"mesh\" || type === \"linkedmesh\") {\n if (type === \"linkedmesh\") { warnings.push(`linked mesh \"${slotName}/${name}\" skipped`); continue; }\n const asset = assetFor(a.path ?? name);\n if (!asset) continue;\n const n = (a.uvs?.length ?? 0) / 2;\n attachments.push({ id, slot, type: \"mesh\", asset, uvs: a.uvs, triangles: a.triangles, ...readVertices(a, n), hull: a.hull ?? 0, ...(a.width ? { width: a.width } : {}), ...(a.height ? { height: a.height } : {}) });\n } else if (type === \"path\") {\n attachments.push({ id, slot, type: \"path\", ...readVertices(a, a.vertexCount ?? 0), lengths: a.lengths ?? [], closed: !!a.closed, constantSpeed: a.constantSpeed ?? true });\n } else warnings.push(`attachment \"${slotName}/${name}\" of type ${type} skipped`);\n }\n }\n }\n\n // ---- constraints\n const ik = (json.ik ?? []).map((c: J) => ({\n id: ikIds.get(c.name), order: c.order ?? 0, bones: c.bones.map((b: string) => boneIds.get(b)), target: boneIds.get(c.target),\n mix: c.mix ?? 1, softness: c.softness ?? 0, bendPositive: !(c.bendPositive ?? true), // mirrored: the bend side flips\n compress: !!c.compress, stretch: !!c.stretch, uniform: !!c.uniform,\n }));\n const transform = (json.transform ?? []).map((c: J) => ({\n id: tcIds.get(c.name), order: c.order ?? 0, bones: c.bones.map((b: string) => boneIds.get(b)), target: boneIds.get(c.target),\n local: !!c.local, relative: !!c.relative,\n rotation: r4(-(c.rotation ?? 0)), x: r4(c.x ?? 0), y: r4(-(c.y ?? 0)), scaleX: c.scaleX ?? 0, scaleY: c.scaleY ?? 0, shearY: r4(-(c.shearY ?? 0)),\n mixRotate: c.mixRotate ?? c.rotateMix ?? 1, mixX: c.mixX ?? c.translateMix ?? 1, mixY: c.mixY ?? c.mixX ?? c.translateMix ?? 1,\n mixScaleX: c.mixScaleX ?? c.scaleMix ?? 1, mixScaleY: c.mixScaleY ?? c.mixScaleX ?? c.scaleMix ?? 1, mixShearY: c.mixShearY ?? c.shearMix ?? 1,\n }));\n const path = (json.path ?? []).map((c: J) => ({\n id: pcIds.get(c.name), order: c.order ?? 0, bones: c.bones.map((b: string) => boneIds.get(b)), target: slotIds.get(c.target),\n positionMode: c.positionMode ?? \"percent\", spacingMode: c.spacingMode ?? \"length\", rotateMode: c.rotateMode ?? \"tangent\",\n rotation: r4(-(c.rotation ?? 0)), position: c.position ?? 0, spacing: c.spacing ?? 0,\n mixRotate: c.mixRotate ?? c.rotateMix ?? 1, mixX: c.mixX ?? c.translateMix ?? 1, mixY: c.mixY ?? c.mixX ?? c.translateMix ?? 1,\n }));\n\n // ---- animations\n type Key = { t: number; v: unknown; ease?: unknown };\n /** Spine curve \u2192 our per-key ease. 4.x: absolute [cx1, cy1, cx2, cy2] per component; 3.x: normalized [x1, y1, x2, y2]. */\n const easeOf = (curve: unknown, component: number, t0: number, t1: number, v0: number, v1: number): unknown => {\n if (curve === \"stepped\") return \"step\";\n if (!Array.isArray(curve)) return \"linear\";\n if (major < 4) { const [x1, y1, x2, y2] = curve as number[]; return { bezier: [x1, y1, x2, y2] }; }\n const c = (curve as number[]).slice(component * 4, component * 4 + 4);\n if (c.length < 4) return \"linear\";\n const dt = t1 - t0 || 1, dv = v1 - v0;\n const nx = (x: number) => (x - t0) / dt; // control times may fall outside the segment; the sampled walk copes\n if (Math.abs(dv) < 1e-9) return { bezier: [nx(c[0]), nx(c[0]), nx(c[2]), nx(c[2])] }; // flat segment: value fraction is moot, keep the timing shape\n return { bezier: [nx(c[0]), (c[1] - v0) / dv, nx(c[2]), (c[3] - v0) / dv] };\n };\n const track = (target: string, id: string, prop: string, keys: Key[]) => ({ target, id, prop, keys });\n /** numeric timeline \u2192 keys with absolute values via `abs(spineValue)`, eases from curves (component `comp`) */\n const numeric = (frames: J[], field: string, def: number, abs: (v: number) => number, comp: number): Key[] => {\n const keys: Key[] = [];\n for (let i = 0; i < frames.length; i++) {\n const f = frames[i], next = frames[i + 1], t = f.time ?? 0;\n const ease = next ? easeOf(f.curve, comp, t, next.time ?? 0, f[field] ?? def, next[field] ?? def) : \"linear\";\n keys.push({ t: r4(t), v: r4(abs(f[field] ?? def)), ease });\n }\n return keys;\n };\n const animations: J[] = [];\n for (const [animName, a] of Object.entries((json.animations ?? {}) as J)) {\n const tracks: J[] = [], events: J[] = [];\n let duration = 0;\n const seen = (frames: J[]) => { for (const f of frames) duration = Math.max(duration, f.time ?? 0); };\n // bones (values relative to setup in Spine \u2192 absolute here)\n for (const [boneName, tl] of Object.entries((a.bones ?? {}) as J)) {\n const sb = spineBones[boneIndexByName.get(boneName)!]; if (!sb) { warnings.push(`${animName}: unknown bone ${boneName}`); continue; }\n const id = boneIds.get(boneName), setup = { x: sb.x ?? 0, y: sb.y ?? 0, rotation: sb.rotation ?? 0, scaleX: sb.scaleX ?? 1, scaleY: sb.scaleY ?? 1, shearX: sb.shearX ?? 0, shearY: sb.shearY ?? 0 };\n for (const [kind, frames] of Object.entries(tl as J) as [string, J[]][]) {\n seen(frames);\n if (kind === \"rotate\") tracks.push(track(\"bone\", id, \"rotation\", numeric(frames, major < 4 ? \"angle\" : \"value\", 0, v => -(setup.rotation + v), 0)));\n else if (kind === \"translate\") { tracks.push(track(\"bone\", id, \"x\", numeric(frames, \"x\", 0, v => setup.x + v, 0))); tracks.push(track(\"bone\", id, \"y\", numeric(frames, \"y\", 0, v => -(setup.y + v), 1))); }\n else if (kind === \"translatex\") tracks.push(track(\"bone\", id, \"x\", numeric(frames, \"value\", 0, v => setup.x + v, 0)));\n else if (kind === \"translatey\") tracks.push(track(\"bone\", id, \"y\", numeric(frames, \"value\", 0, v => -(setup.y + v), 0)));\n else if (kind === \"scale\") { tracks.push(track(\"bone\", id, \"scaleX\", numeric(frames, \"x\", 1, v => setup.scaleX * v, 0))); tracks.push(track(\"bone\", id, \"scaleY\", numeric(frames, \"y\", 1, v => setup.scaleY * v, 1))); }\n else if (kind === \"scalex\") tracks.push(track(\"bone\", id, \"scaleX\", numeric(frames, \"value\", 1, v => setup.scaleX * v, 0)));\n else if (kind === \"scaley\") tracks.push(track(\"bone\", id, \"scaleY\", numeric(frames, \"value\", 1, v => setup.scaleY * v, 0)));\n else if (kind === \"shear\") { tracks.push(track(\"bone\", id, \"shearX\", numeric(frames, \"x\", 0, v => -(setup.shearX + v), 0))); tracks.push(track(\"bone\", id, \"shearY\", numeric(frames, \"y\", 0, v => -(setup.shearY + v), 1))); }\n else if (kind === \"shearx\") tracks.push(track(\"bone\", id, \"shearX\", numeric(frames, \"value\", 0, v => -(setup.shearX + v), 0)));\n else if (kind === \"sheary\") tracks.push(track(\"bone\", id, \"shearY\", numeric(frames, \"value\", 0, v => -(setup.shearY + v), 0)));\n else warnings.push(`${animName}/${boneName}: ${kind} timeline skipped`);\n }\n }\n // slots\n const attachmentFrames = new Map<string, J[]>();\n for (const [slotName, tl] of Object.entries((a.slots ?? {}) as J)) {\n if (!slotIndexByName.has(slotName)) { warnings.push(`${animName}: unknown slot ${slotName}`); continue; }\n const id = slotIds.get(slotName);\n for (const [kind, frames] of Object.entries(tl as J) as [string, J[]][]) {\n seen(frames);\n if (kind === \"attachment\") {\n attachmentFrames.set(slotName, frames); // a sequence timeline on this slot layers onto these\n tracks.push(track(\"slot\", id, \"attachment\", frames.map(f => ({ t: r4(f.time ?? 0), v: f.name ? attachmentRef(slotName, f.name) : null, ease: \"step\" }))));\n }\n else if (kind === \"rgba\" || kind === \"color\") {\n const rgbaOf = (f: J) => { const c = hex8(f.color); return [0, 2, 4, 6].map(k => parseInt(c.slice(1 + k, 3 + k), 16) / 255); };\n tracks.push(track(\"slot\", id, \"color\", frames.map((f, i) => {\n const rgba = rgbaOf(f), next = frames[i + 1];\n return { t: r4(f.time ?? 0), v: rgba.map(r4), ease: next ? easeOf(f.curve, 0, f.time ?? 0, next.time ?? 0, rgba[0], rgbaOf(next)[0]) : \"linear\" };\n })));\n } else if (kind === \"rgb\") {\n tracks.push(track(\"slot\", id, \"color\", frames.map(f => { const c = hex8((f.color ?? \"ffffff\") + \"ff\"); return { t: r4(f.time ?? 0), v: [0, 2, 4, 6].map(k => r4(parseInt(c.slice(1 + k, 3 + k), 16) / 255)), ease: \"linear\" }; })));\n } else if (kind === \"alpha\") tracks.push(track(\"slot\", id, \"alpha\", numeric(frames, \"value\", 1, v => v, 0)));\n else warnings.push(`${animName}/${slotName}: ${kind} timeline skipped`);\n }\n }\n // Per-attachment timelines live in two places depending on the exporter: `deform` alone (3.8 and 4.0, which\n // is what ross has) or `attachments[skin][slot][att][kind]` (4.1+, which is what devil has, and where the\n // sequence timeline also lives). Reading only the first silently drops the other \u2014 devil loses 4 deform\n // timelines and 2 sequences that way, with no warning, because nothing ever looks in the second place.\n const perAttachment: [string, string, string, string, J[]][] = [];\n for (const [skinName, slotsMap] of Object.entries((a.deform ?? {}) as J))\n for (const [slotName, attMap] of Object.entries(slotsMap as J))\n for (const [attName, frames] of Object.entries(attMap as J) as [string, J[]][])\n perAttachment.push([skinName, slotName, attName, \"deform\", frames]);\n for (const [skinName, slotsMap] of Object.entries((a.attachments ?? {}) as J))\n for (const [slotName, attMap] of Object.entries(slotsMap as J))\n for (const [attName, kinds] of Object.entries(attMap as J))\n for (const [kind, frames] of Object.entries(kinds as J) as [string, J[]][])\n perAttachment.push([skinName, slotName, attName, kind, frames]);\n\n const pendingSequences: { slotName: string; attName: string; seq: J; frames: J[]; base: string }[] = [];\n for (const [skinName, slotName, attName, kind, frames] of perAttachment) {\n const prefix = skinName === \"default\" ? \"\" : `${skinName}_`;\n seen(frames);\n if (kind === \"sequence\") {\n const seq = sequences.get(`${slotName} ${prefix}${attName}`);\n if (!seq) { warnings.push(`${animName}: sequence timeline on ${slotName}/${attName}, which is not a sequence attachment`); continue; }\n // lowered after the loop: which frame a key shows depends on where the NEXT key is, and the last key\n // runs to the animation's end, which is only known once every timeline has been seen\n pendingSequences.push({ slotName, attName, seq, frames, base: prefix + attName });\n continue;\n }\n if (kind !== \"deform\") { warnings.push(`${animName}: ${kind} timeline on ${slotName}/${attName} skipped`); continue; }\n const id = attachmentId(slotName, prefix + attName);\n const att = attachments.find(x => x.id === id);\n if (!att) { warnings.push(`${animName}: deform of unknown attachment ${slotName}/${attName}`); continue; }\n const length = att.weights ? 2 * att.weights.reduce((s: number, l: J[]) => s + l.length, 0) : (att.vertices?.length ?? 0);\n tracks.push(track(\"deform\", id, \"vertices\", frames.map((f, i) => {\n const full = new Array(length).fill(0);\n const off = f.offset ?? 0, vs: number[] = f.vertices ?? [];\n for (let k = 0; k < vs.length; k++) full[off + k] = (k + off) % 2 === 1 ? -vs[k] : vs[k]; // mirror y\n const next = frames[i + 1];\n return { t: r4(f.time ?? 0), v: full.map(r4), ease: next ? easeOf(f.curve, 0, f.time ?? 0, next.time ?? 0, 0, 1) : \"linear\" };\n })));\n }\n // draw order: offsets \u2192 full order (documented Spine semantics)\n const drawOrderFrames: J[] | undefined = a.drawOrder ?? a.draworder;\n if (Array.isArray(drawOrderFrames)) {\n seen(drawOrderFrames);\n const n = spineSlots.length;\n tracks.push(track(\"drawOrder\", \"order\", \"order\", drawOrderFrames.map(f => {\n const offsets: J[] = f.offsets ?? [];\n const order = new Array<number>(n).fill(-1), unchanged: number[] = [];\n let originalIndex = 0;\n for (const o of offsets) {\n const slotIndex = slotIndexByName.get(o.slot)!;\n while (originalIndex !== slotIndex) unchanged.push(originalIndex++);\n order[originalIndex + o.offset] = originalIndex++;\n }\n while (originalIndex < n) unchanged.push(originalIndex++);\n let u = unchanged.length;\n for (let i = n - 1; i >= 0; i--) if (order[i] === -1) order[i] = unchanged[--u];\n return { t: r4(f.time ?? 0), v: order.map(i => slots[i].id), ease: \"step\" };\n })));\n }\n // constraints\n for (const [name, frames] of Object.entries((a.ik ?? {}) as J) as [string, J[]][]) {\n seen(frames); const id = ikIds.get(name);\n tracks.push(track(\"ik\", id, \"mix\", numeric(frames, \"mix\", 1, v => v, 0)));\n tracks.push(track(\"ik\", id, \"softness\", numeric(frames, \"softness\", 0, v => v, 1)));\n tracks.push(track(\"ik\", id, \"bendPositive\", frames.map(f => ({ t: r4(f.time ?? 0), v: (f.bendPositive ?? true) ? 0 : 1, ease: \"step\" }))));\n tracks.push(track(\"ik\", id, \"compress\", frames.map(f => ({ t: r4(f.time ?? 0), v: f.compress ? 1 : 0, ease: \"step\" }))));\n tracks.push(track(\"ik\", id, \"stretch\", frames.map(f => ({ t: r4(f.time ?? 0), v: f.stretch ? 1 : 0, ease: \"step\" }))));\n }\n const mixTrack = (target: string, id: string, frames: J[], prop: string, old: string, comp: number) =>\n track(target, id, prop, frames.map((f, i) => ({ t: r4(f.time ?? 0), v: r4(f[prop] ?? f[old] ?? 1),\n ease: frames[i + 1] ? easeOf(f.curve, comp, f.time ?? 0, frames[i + 1].time ?? 0, f[prop] ?? f[old] ?? 1, frames[i + 1][prop] ?? frames[i + 1][old] ?? 1) : \"linear\" })));\n for (const [name, frames] of Object.entries((a.transform ?? {}) as J) as [string, J[]][]) {\n seen(frames); const id = tcIds.get(name);\n const props: [string, string, number][] = [[\"mixRotate\", \"rotateMix\", 0], [\"mixX\", \"translateMix\", 1], [\"mixY\", \"translateMix\", 2], [\"mixScaleX\", \"scaleMix\", 3], [\"mixScaleY\", \"scaleMix\", 4], [\"mixShearY\", \"shearMix\", 5]];\n for (const [prop, old, comp] of props) tracks.push(mixTrack(\"transform\", id, frames, prop, old, comp));\n }\n for (const [name, tl] of Object.entries((a.path ?? {}) as J)) {\n const id = pcIds.get(name);\n for (const [kind, frames] of Object.entries(tl as J) as [string, J[]][]) {\n seen(frames);\n if (kind === \"position\" || kind === \"spacing\") tracks.push(track(\"path\", id, kind, numeric(frames, \"value\", 0, v => v, 0)));\n else if (kind === \"mix\") for (const [prop, old, comp] of [[\"mixRotate\", \"rotateMix\", 0], [\"mixX\", \"translateMix\", 1], [\"mixY\", \"translateMix\", 2]] as [string, string, number][])\n tracks.push(mixTrack(\"path\", id, frames, prop, old, comp));\n }\n }\n for (const e of (a.events ?? []) as J[]) {\n events.push({ t: r4(e.time ?? 0), name: e.name, payload: { ...(e.int !== undefined ? { int: e.int } : {}), ...(e.float !== undefined ? { float: e.float } : {}), ...(e.string !== undefined ? { string: e.string } : {}) } });\n duration = Math.max(duration, e.time ?? 0);\n }\n /**\n * A sequence timeline says which numbered frame a sequence attachment shows, by counting `delay` seconds\n * from its own key. Here a sequence IS its frames, so that becomes an `attachment` track: walk each key's\n * span and emit a step key whenever the index changes. The arithmetic is spine-core's `SequenceTimeline`,\n * epsilon included \u2014 without it a delay that divides the span exactly loses its last frame. Lowered here\n * rather than in the loop above because the final key runs to the animation's end, which is only known\n * once every timeline has been seen.\n */\n const seqIndex = (mode: string, raw: number, count: number): number => {\n const fold = () => { const n = (count << 1) - 2, i = n === 0 ? 0 : raw % n; return i >= count ? n - i : i; };\n if (mode === \"once\") return Math.min(count - 1, raw);\n if (mode === \"loop\") return raw % count;\n if (mode === \"pingpong\") return fold();\n if (mode === \"onceReverse\") return Math.max(count - 1 - raw, 0);\n if (mode === \"loopReverse\") return count - 1 - (raw % count);\n if (mode === \"pingpongReverse\") return count - 1 - fold();\n return raw; // hold: the key's own index, held\n };\n for (const { slotName, attName, seq, frames, base } of pendingSequences) {\n const slotId = slotIds.get(slotName), count = seq.count ?? 0;\n const steps: { t: number; k: number }[] = [];\n let delay = 0;\n const push = (t: number, k: number) => { if (steps[steps.length - 1]?.k !== k) steps.push({ t, k }); };\n for (let i = 0; i < frames.length && count > 0; i++) {\n const f = frames[i], t0 = f.time ?? 0, mode: string = f.mode ?? \"hold\", index = f.index ?? 0;\n delay = f.delay ?? delay; // Spine carries the previous key's delay forward\n const end = i + 1 < frames.length ? (frames[i + 1].time ?? 0) : duration;\n if (mode === \"hold\" || !(delay > 0)) { push(t0, seqIndex(mode, index, count)); continue; }\n const steps = Math.min(Math.ceil(Math.max(0, end - t0) / delay), 100000);\n for (let step = 0; step <= steps; step++) {\n const t = t0 + step * delay;\n if (step > 0 && t >= end) break;\n push(t, seqIndex(mode, index + Math.trunc((t - t0) / delay + 0.00001), count));\n }\n }\n if (!steps.length) continue;\n const frameId = (k: number) => attachmentId(slotName, base + frameSuffix(seq, k));\n /**\n * Spine layers the two timelines: the `attachment` one chooses WHICH attachment the slot shows, the\n * sequence one chooses which frame WITHIN it, and the second only means anything while the first is\n * showing the sequence attachment. h1's explosion is exactly that \u2014 the slot is empty until 0.2333, then\n * shows `fx/explosion_` while the sequence loops through it. So evaluate both at every time either of them\n * keys, and let the attachment timeline decide whether the frame applies at all.\n */\n const attFrames = attachmentFrames.get(slotName);\n const setupName: string | null = spineSlots.find(x => x.name === slotName)?.attachment ?? null;\n const at = <T,>(xs: { t: number }[], t: number) => { let hit: T | undefined; for (const x of xs) if (x.t <= t + 1e-9) hit = x as T; return hit; };\n const shownAt = (t: number): string | null => {\n let name = setupName;\n for (const f of attFrames ?? []) if ((f.time ?? 0) <= t + 1e-9) name = f.name ?? null;\n return name;\n };\n const times = [...new Set([...(attFrames ?? []).map(f => r4(f.time ?? 0)), ...steps.map(x => r4(x.t))])].sort((x, y) => x - y);\n const keys: Key[] = [];\n for (const t of times) {\n const name = shownAt(t);\n const v = name === null ? null\n : name === attName ? frameId(at<{ t: number; k: number }>(steps.map(x => ({ ...x, t: r4(x.t) })), t)?.k ?? (seq.setupIndex ?? 0))\n : attachmentRef(slotName, name);\n if (!keys.length || keys[keys.length - 1].v !== v) keys.push({ t, v, ease: \"step\" });\n }\n const existing = tracks.findIndex(t => t.target === \"slot\" && t.id === slotId && t.prop === \"attachment\");\n if (existing >= 0) tracks.splice(existing, 1);\n if (keys.length) tracks.push(track(\"slot\", slotId, \"attachment\", keys));\n }\n // Spine holds the setup value until a track's first key; our tracks hold their first key, so make it explicit.\n // Tracks whose every key equals the setup value change nothing (Spine keys everything) and are dropped.\n const setupOf = (tr: J) => {\n if (tr.target === \"deform\") return (tr.keys[0].v as number[]).map(() => 0);\n const v = restValue({ bones, slots, ik, transform, path } as unknown as RigDocument, pk(tr.target, tr.id, tr.prop));\n return v === undefined ? null : v; // a slot without a setup attachment rests hidden\n };\n const same = (a: unknown, b: unknown): boolean => Array.isArray(a) && Array.isArray(b) ? a.length === b.length && a.every((v, i) => same(v, b[i]))\n : typeof a === \"number\" && typeof b === \"number\" ? Math.abs(a - b) < 1e-9 : a === b;\n const live = tracks.filter(tr => { const rest = setupOf(tr); return !tr.keys.every((k: J) => same(k.v, rest)); });\n for (const tr of live) if (tr.keys[0].t > 0) tr.keys.unshift({ t: 0, v: setupOf(tr), ease: \"step\" });\n animations.push({ id: animIds.get(animName), duration: r4(Math.max(duration, 1 / 30)), loop: false, tracks: live, events });\n }\n\n // An attachment the import decided not to create \u2014 its atlas region is missing, or it is a linked mesh \u2014 must\n // not stay referenced: a slot or an `attachment` key pointing at nothing fails validation and takes the whole\n // rig with it. Drop the reference instead, so what DID import still opens.\n const made = new Set(attachments.map(a => a.id as string));\n const nameOf = new Map([...attachmentIdMap].map(([k, id]) => [id, k]));\n const lost = (id: string) => { warnings.push(`attachment \"${nameOf.get(id) ?? id}\" was not imported; the reference to it is dropped`); };\n for (const slot of slots)\n if (slot.attachment && !made.has(slot.attachment as string)) { lost(slot.attachment as string); delete slot.attachment; }\n for (const anim of animations)\n for (const tr of anim.tracks as J[])\n if (tr.target === \"slot\" && tr.prop === \"attachment\")\n for (const k of tr.keys as J[]) if (k.v && !made.has(k.v as string)) { lost(k.v as string); k.v = null; }\n\n let width = Math.ceil(bounds.w + 2 * margin) || 1, height = Math.ceil(bounds.h + 2 * margin) || 1;\n const build = () => ({\n format: \"energy8.rig\", version: 2,\n meta: { name: opts.name ?? json.skeleton?.hash ?? \"spine\", width, height, notes: opts.notes ?? `imported from Spine ${version}` },\n assets: [...assets.values()], bones, slots, attachments, ik, transform, path, animations,\n });\n if (opts.fit !== \"setup\") {\n // canvas = everything the rig ever shows (sampled at 30 fps, like rig_check), not just the setup bounds Spine exports\n const parsed = parse(build());\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const grow = (pose: Pose) => {\n const skel = evaluate(parsed, pose);\n for (const slot of parsed.slots) {\n const att = skel.attachment.get(slot.id);\n if (!att || att.type === \"path\") continue;\n let pts: number[];\n if (att.type === \"mesh\") pts = attachmentWorldVertices(skel, slot.id, att);\n else {\n const m = regionMatrix(skel, slot.id, att), [w, h] = regionSize(parsed, att);\n pts = [[-w / 2, -h / 2], [w / 2, -h / 2], [w / 2, h / 2], [-w / 2, h / 2]].flatMap(([cx, cy]) => apply(m, cx, cy));\n }\n for (let i = 0; i < pts.length; i += 2) {\n if (pts[i] < minX) minX = pts[i]; if (pts[i] > maxX) maxX = pts[i];\n if (pts[i + 1] < minY) minY = pts[i + 1]; if (pts[i + 1] > maxY) maxY = pts[i + 1];\n }\n }\n };\n grow(new Map());\n for (const a of parsed.animations) for (let i = 0, n = Math.max(1, Math.round(a.duration * 30)); i <= n; i++) grow(poseOf(a, Math.min(a.duration, i / 30)));\n if (Number.isFinite(minX)) {\n const dx = margin - Math.floor(minX), dy = margin - Math.floor(minY);\n bones[0].transform.x = r4(bones[0].transform.x + dx); bones[0].transform.y = r4(bones[0].transform.y + dy);\n originX += dx; originY += dy;\n width = Math.ceil(maxX - minX) + 2 * margin + 1; height = Math.ceil(maxY - minY) + 2 * margin + 1;\n }\n }\n const doc = build();\n return { doc, warnings, boneId: n => boneIds.get(n), slotId: n => slotIds.get(n), attachmentId, assetId: n => assetIds.get(n), animId: n => animIds.get(n), toDoc };\n}\n\n// ---------- files ----------\n\nexport interface SpineProjectOptions {\n /** Spine skeleton .json */\n json: string;\n /** atlas text (plain or base64); default: the json's sibling `.atlas` / `.atlas.txt` */\n atlas?: string;\n /** atlas page image, .png or .ktx2; default: the page named in the atlas, next to the atlas (a .ktx2 twin is tried too) */\n image?: string;\n /** where the rig will live: the page asset is referenced relative to its directory (KTX2 pages are written there as PNG) */\n rigPath: string;\n name?: string;\n margin?: number;\n notes?: string;\n}\n\nconst exists = (p: string) => stat(p).then(() => true, () => false);\nasync function firstExisting(candidates: string[], what: string): Promise<string> {\n for (const c of candidates) if (await exists(c)) return c;\n throw new Error(`${what} not found, tried: ${candidates.join(\", \")}`);\n}\n\n/** Import a Spine project from files. Resolves the atlas and page image, transcodes KTX2 pages to PNG next to the rig. */\nexport async function importSpineProject(opts: SpineProjectOptions): Promise<ReturnType<typeof importSpine> & { imagePath: string }> {\n const json = JSON.parse(await readFile(opts.json, \"utf8\"));\n const stem = opts.json.replace(/\\.json$/i, \"\");\n const atlasPath = opts.atlas ?? await firstExisting([stem + \".atlas\", stem + \".atlas.txt\"], \"atlas\");\n const atlasText = await readFile(atlasPath, \"utf8\");\n const { pages } = parseAtlas(atlasText);\n if (pages.length !== 1) throw new Error(`expected one atlas page, got ${pages.length}`);\n const pageStem = join(dirname(atlasPath), pages[0].name.replace(/\\.[a-z0-9]+$/i, \"\"));\n const imagePath = opts.image ?? await firstExisting([join(dirname(atlasPath), pages[0].name), pageStem + \".png\", pageStem + \".ktx2\", stem + \".png\", stem + \".ktx2\"], \"atlas page image\");\n const rigDir = dirname(opts.rigPath);\n let pngPath = imagePath;\n if (extname(imagePath).toLowerCase() === \".ktx2\") {\n pngPath = join(rigDir, basename(imagePath).replace(/\\.ktx2$/i, \".png\"));\n if (!(await exists(pngPath))) {\n const { png } = await ktx2ToPng(new Uint8Array(await readFile(imagePath)));\n await writeFile(pngPath, png);\n }\n }\n const pageImage = relative(rigDir, pngPath).split(\"\\\\\").join(\"/\");\n const name = opts.name ?? basename(stem);\n return { ...importSpine(json, atlasText, { name, pageImage, margin: opts.margin, notes: opts.notes }), imagePath: pngPath };\n}\n", "/**\n * KTX2 (Basis UASTC / ETC1S, zstd supercompression ok) \u2192 RGBA pixels, via the basis transcoder bundled with three.js.\n * `three` is an optional dependency: it is resolved lazily so everything else works without it.\n */\nimport { readFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { PNG } from \"pngjs\";\n\nconst require = createRequire(import.meta.url);\nlet basisPromise: Promise<any> | undefined;\n\nasync function basis(): Promise<any> {\n if (basisPromise) return basisPromise;\n basisPromise = (async () => {\n let jsPath: string;\n try { jsPath = require.resolve(\"three/examples/jsm/libs/basis/basis_transcoder.js\"); }\n catch { throw new Error(\"KTX2 pages need the basis transcoder from three.js: `npm i -D three`, or convert the page to PNG yourself\"); }\n const wasm = await readFile(jsPath.replace(/\\.js$/, \".wasm\"));\n // Emscripten CommonJS factory (module.exports = BASIS) inside an ESM package: evaluate it as CJS by hand\n const src = await readFile(jsPath, \"utf8\");\n const mod = { exports: {} as any };\n new Function(\"require\", \"module\", \"exports\", \"__dirname\", \"__filename\", src)(require, mod, mod.exports, jsPath.replace(/\\/[^/]+$/, \"\"), jsPath);\n const Basis = await mod.exports({ wasmBinary: wasm });\n Basis.initializeBasis();\n return Basis;\n })();\n return basisPromise;\n}\n\nexport interface Ktx2Info { width: number; height: number; levels: number; hasAlpha: boolean; uastc: boolean }\n\n/** Transcode level 0 of a KTX2 texture to RGBA8. */\nexport async function ktx2ToRgba(data: Uint8Array): Promise<Ktx2Info & { rgba: Uint8Array }> {\n const Basis = await basis();\n const file = new Basis.KTX2File(data);\n try {\n if (!file.isValid()) throw new Error(\"invalid KTX2 file\");\n const info: Ktx2Info = { width: file.getWidth(), height: file.getHeight(), levels: file.getLevels(), hasAlpha: !!file.getHasAlpha(), uastc: !!file.isUASTC() };\n if (!file.startTranscoding()) throw new Error(\"KTX2: startTranscoding failed\");\n const RGBA32 = 13; // transcoder_texture_format::cTFRGBA32\n const rgba = new Uint8Array(file.getImageTranscodedSizeInBytes(0, 0, 0, RGBA32));\n if (!file.transcodeImage(rgba, 0, 0, 0, RGBA32, 0, -1, -1)) throw new Error(\"KTX2: transcodeImage failed\");\n return { ...info, rgba };\n } finally { file.close(); file.delete(); }\n}\n\n/** Transcode a KTX2 texture to a PNG buffer. */\nexport async function ktx2ToPng(data: Uint8Array): Promise<Ktx2Info & { png: Buffer }> {\n const { rgba, ...info } = await ktx2ToRgba(data);\n const png = new PNG({ width: info.width, height: info.height });\n png.data = Buffer.from(rgba.buffer, rgba.byteOffset, rgba.byteLength);\n return { ...info, png: PNG.sync.write(png) };\n}\n", "/**\n * rig-templates \u2014 turn a finished animation into a reusable preset (\"rig_save_as_preset\").\n *\n * A template stores tracks relative to the source rig's rest pose and keyed by bone `role`, so it can be\n * instantiated on a different rig: bone x/y/rotation as deltas, scale as ratios, slot alpha as a delta,\n * deform params as-is, attachment/z unchanged. Params are scalar multipliers: `amplitude` (every relative\n * value), `speed` (time), plus optional named groups that scale only the listed source tracks.\n * Pure (no node:*) so the editor bundles it and previews param changes locally; the library on disk\n * (a JSON array of templates, `presets.json` next to the rig by default) lives in `rig-template-library.ts`.\n */\nimport type { RigDocument, Animation, Track, Slot, Bone } from \"./rig-format\";\n\ntype Key = Track[\"keys\"][number];\n\nexport interface TemplateTrack {\n target: Track[\"target\"];\n /** source id (bone or slot) \u2014 used when the target rig has no matching role */\n id: string;\n /** role of the bone (or of the slot's bone) in the source rig */\n role?: string;\n prop: string;\n /** values relative to rest (see module doc) */\n keys: Key[];\n}\n\nexport interface TemplateParam { default: number; /** source track ids `target.id.prop`; absent = every track */ tracks?: string[] }\n\nexport interface AnimationTemplate {\n name: string;\n duration: number;\n loop: boolean;\n events: Animation[\"events\"];\n tracks: TemplateTrack[];\n params: Record<string, TemplateParam>;\n /** source track ids left out because their keys are arrays (see `extractTemplate`) \u2014 absent when nothing was */\n skipped?: string[];\n source: { rig: string; animation: string };\n}\n\nconst trackId = (t: { target: string; id: string; prop: string }) => `${t.target}.${t.id}.${t.prop}`;\nconst round = (v: number) => +v.toFixed(4);\nconst isScale = (prop: string) => prop === \"scaleX\" || prop === \"scaleY\";\n\nexport function extractTemplate(doc: RigDocument, animId: string, name: string, groups: Record<string, string[]> = {}): AnimationTemplate {\n const anim = doc.animations.find(a => a.id === animId);\n if (!anim) throw new Error(`unknown animation \"${animId}\"`);\n const ids = new Set(anim.tracks.map(trackId));\n for (const [g, list] of Object.entries(groups)) for (const id of list)\n if (!ids.has(id)) throw new Error(`group \"${g}\": unknown track \"${id}\" (tracks: ${[...ids].join(\", \")})`);\n const roleOfBone = (id: string) => doc.bones.find(b => b.id === id)?.role;\n const tracks: TemplateTrack[] = [];\n const skipped: string[] = [];\n for (const t of anim.tracks) {\n // Array-valued keys \u2014 deform `vertices` (2 numbers per vertex or per influence), drawOrder (slot ids), slot\n // colour \u2014 describe THIS rig's geometry and layering. A template stores values relative to rest and scales\n // them by `amplitude`, and neither means anything for an array: `round(v * k)` on one is NaN, and a drawOrder\n // track has no slot at all (`doc.slots.find(...)!` used to throw on it). They are recorded by name instead,\n // so an agent can see what did not come along rather than find it silently missing.\n if (t.target === \"drawOrder\" || t.keys.some(k => Array.isArray(k.v))) { skipped.push(trackId(t)); continue; }\n if (t.target === \"bone\") {\n const bone = doc.bones.find(b => b.id === t.id)!, rest = (bone.transform as Record<string, number>)[t.prop];\n tracks.push({ target: t.target, id: t.id, role: bone.role, prop: t.prop,\n keys: t.keys.map(k => ({ ...k, v: isScale(t.prop) ? round((k.v as number) / rest) : round((k.v as number) - rest) })) });\n continue;\n }\n const slot = t.target === \"deform\"\n ? doc.slots.find(s => s.id === doc.attachments.find(a => a.id === t.id)?.slot)!\n : doc.slots.find(s => s.id === t.id)!;\n const role = roleOfBone(slot.bone);\n if (t.target === \"slot\" && t.prop === \"alpha\")\n tracks.push({ target: t.target, id: t.id, role, prop: t.prop, keys: t.keys.map(k => ({ ...k, v: round((k.v as number) - slot.alpha) })) });\n else tracks.push({ target: t.target, id: t.id, role, prop: t.prop, keys: t.keys.map(k => ({ ...k })) });\n }\n const params: Record<string, TemplateParam> = { amplitude: { default: 1 }, speed: { default: 1 } };\n for (const [g, list] of Object.entries(groups)) params[g] = { default: 1, tracks: list };\n return { name, duration: anim.duration, loop: anim.loop, events: anim.events.map(e => ({ ...e })), tracks, params,\n ...(skipped.length ? { skipped } : {}),\n source: { rig: doc.meta.name, animation: animId } };\n}\n\n/** the slot carrying a bone's image: same id as the bone, else the first attached slot on it */\nconst slotOfBone = (doc: RigDocument, bone: Bone): Slot | undefined =>\n doc.slots.find(s => s.bone === bone.id && s.id === bone.id && s.attachment) ?? doc.slots.find(s => s.bone === bone.id && s.attachment);\n\nexport function instantiateTemplate(doc: RigDocument, tpl: AnimationTemplate, params: Record<string, number> = {}, id = tpl.name): Animation {\n for (const k of Object.keys(params)) if (!(k in tpl.params)) throw new Error(`unknown param \"${k}\" (available: ${Object.keys(tpl.params).join(\", \")})`);\n const p: Record<string, number> = {};\n for (const [k, def] of Object.entries(tpl.params)) p[k] = params[k] ?? def.default;\n const speed = p.speed || 1, assets = new Set(doc.assets.map(a => a.id));\n const factorFor = (src: string) => {\n let k = p.amplitude;\n for (const [name, def] of Object.entries(tpl.params)) if (def.tracks?.includes(src)) k *= p[name];\n return k;\n };\n const tracks: Track[] = [];\n for (const t of tpl.tracks) {\n // a library file written before array keys were skipped can still hold one; `round(v * k)` on an array is NaN\n if (t.keys.some(kk => Array.isArray(kk.v))) continue;\n const k = factorFor(trackId(t)), time = (x: number) => round(x / speed);\n if (t.target === \"bone\") {\n const bone = (t.role && doc.bones.find(b => b.role === t.role)) || doc.bones.find(b => b.id === t.id);\n if (!bone) continue;\n const rest = (bone.transform as Record<string, number>)[t.prop];\n tracks.push({ target: \"bone\", id: bone.id, prop: t.prop as \"x\",\n keys: t.keys.map(kk => ({ ...kk, t: time(kk.t), v: round(isScale(t.prop) ? rest * (1 + ((kk.v as number) - 1) * k) : rest + (kk.v as number) * k) })) });\n continue;\n }\n const byRole = t.role && doc.bones.find(b => b.role === t.role);\n if (t.target === \"deform\") {\n const att = doc.attachments.find(a => a.id === t.id) ?? (byRole ? doc.attachments.find(a => a.id === slotOfBone(doc, byRole)?.attachment) : undefined);\n if (att) tracks.push({ target: \"deform\", id: att.id, prop: t.prop, keys: t.keys.map(kk => ({ ...kk, t: time(kk.t), v: round((kk.v as number) * k) })) });\n continue;\n }\n const slot = doc.slots.find(s => s.id === t.id) ?? (byRole ? slotOfBone(doc, byRole) : undefined);\n if (!slot) continue;\n if (false) {}\n else if (t.prop === \"alpha\")\n tracks.push({ target: \"slot\", id: slot.id, prop: \"alpha\", keys: t.keys.map(kk => ({ ...kk, t: time(kk.t), v: round(Math.min(1, Math.max(0, slot.alpha + (kk.v as number) * k))) })) });\n else if (t.prop === \"attachment\") {\n if (t.keys.some(kk => typeof kk.v === \"string\" && !assets.has(kk.v))) continue;\n tracks.push({ target: \"slot\", id: slot.id, prop: \"attachment\", keys: t.keys.map(kk => ({ ...kk, t: time(kk.t) })) });\n } else tracks.push({ target: \"slot\", id: slot.id, prop: \"z\", keys: t.keys.map(kk => ({ ...kk, t: time(kk.t) })) });\n }\n return { id, duration: round(tpl.duration / speed), loop: tpl.loop, tracks,\n events: tpl.events.map(e => ({ ...e, t: round(e.t / speed) })), preset: { name: `template:${tpl.name}`, params: p } };\n}\n\n/** replace/add the instantiated animation in the document */\nexport function applyTemplate(doc: RigDocument, tpl: AnimationTemplate, params: Record<string, number> = {}, id?: string): RigDocument {\n const anim = instantiateTemplate(doc, tpl, params, id);\n return { ...doc, animations: doc.animations.filter(a => a.id !== anim.id).concat(anim) };\n}\n\nexport function describeTemplate(t: AnimationTemplate): string {\n const params = Object.entries(t.params).map(([k, v]) => `${k}=${v.default}${v.tracks ? `(${v.tracks.join(\",\")})` : \"\"}`).join(\" \");\n const roles = [...new Set(t.tracks.map(x => x.role ?? x.id))].join(\", \");\n const skipped = t.skipped?.length ? `; skipped: ${t.skipped.join(\", \")}` : \"\";\n return `${t.name}: ${t.duration}s${t.loop ? \" loop\" : \"\"}, ${t.tracks.length} tracks on ${roles}; params ${params}${skipped}; from ${t.source.rig}/${t.source.animation}`;\n}\n", "/**\n * rig-template-library \u2014 the on-disk side of rig-templates: `presets.json` (a JSON array of templates).\n *\n * Split out of `rig-templates.ts` so that module stays pure and bundles for the browser: the editor previews\n * template params locally (applyTemplate) and gets the template itself over `rig_get_preset`, never from disk.\n */\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { AnimationTemplate } from \"./rig-templates\";\n\nexport async function loadLibrary(path: string): Promise<AnimationTemplate[]> {\n try { return JSON.parse(await readFile(path, \"utf8\")) as AnimationTemplate[]; }\n catch (e) { if ((e as NodeJS.ErrnoException).code === \"ENOENT\") return []; throw e; }\n}\n\nexport async function saveTemplate(path: string, tpl: AnimationTemplate): Promise<void> {\n const all = await loadLibrary(path);\n const i = all.findIndex(t => t.name === tpl.name);\n if (i >= 0) all[i] = tpl; else all.push(tpl);\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, JSON.stringify(all, null, 2));\n}\n", "/**\n * rig-mesh-image \u2014 Node-only PNG \u2192 AlphaMask reader. Kept separate from rig-mesh.ts so the pure mesh math\n * stays free of node:* / DOM dependencies. `frame` = [x, y, w, h] cuts one rectangle out of a sheet, so a\n * framed asset (a part split off an uploaded PNG in the editor) traces exactly like a file of its own.\n */\nimport { PNG } from \"pngjs\";\nimport type { AlphaMask } from \"./rig-mesh\";\n\nexport function alphaMaskFromPng(buf: Buffer, frame?: [number, number, number, number]): AlphaMask {\n const png = PNG.sync.read(buf);\n const [fx, fy, w, h] = frame ?? [0, 0, png.width, png.height];\n if (fx < 0 || fy < 0 || w < 1 || h < 1 || fx + w > png.width || fy + h > png.height) {\n throw new Error(`frame [${fx}, ${fy}, ${w}, ${h}] is outside the ${png.width}x${png.height} image`);\n }\n const alpha = new Uint8Array(w * h);\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) alpha[y * w + x] = png.data[((fy + y) * png.width + fx + x) * 4 + 3];\n return { width: w, height: h, alpha };\n}\n", "/** Brief-specific pass/fail measurements over the real evaluator and AnimationState. */\nimport { z } from 'zod';\nimport type { RigDocument } from './rig-format';\nimport { evaluate, poseOf, pk, colorToArray, apply, slotOutline, type Pose } from './rig-anim';\nimport { AnimationState } from './rig-state';\nconst Limit = z.number().nonnegative().optional();\nconst Window = z.tuple([z.number().nonnegative(), z.number().nonnegative()]).optional();\nexport const GateConfig = z.object({\n animation: z.string(), fps: z.number().int().min(1).max(240).default(60), requiredAnimations: z.array(z.string()).default([]),\n motion: z.array(z.object({ bone: z.string(), channel: z.enum(['position','rotation']).default('position'), space: z.enum(['world','local']).default('world'), minAmplitude: Limit, maxSpeed: Limit, maxAcceleration: Limit, maxJerk: Limit, maxStep: Limit, maxSetupDrift: Limit, during: Window })).default([]),\n distances: z.array(z.object({ a: z.string(), b: z.string(), min: Limit, max: Limit, minRatio: Limit, maxRatio: Limit, during: Window })).default([]),\n conditions: z.array(z.object({ whenSlotVisible: z.string(), bone: z.string(), prop: z.enum(['x','y','rotation']), space: z.enum(['world','local']).default('world'), min: z.number().optional(), max: z.number().optional(), required: z.boolean().default(true) })).default([]),\n transitions: z.array(z.object({ from: z.string(), to: z.string(), fromTime: z.number().nonnegative().default(0), mix: z.number().nonnegative().default(.18), maxStep: z.number().nonnegative(), duration: z.number().positive().default(.5) })).default([]),\n}).strict();\nexport type GateConfig = z.infer<typeof GateConfig>;\nconst norm = (v: number[]) => Math.hypot(...v);\nconst subtract = (a: number[], b: number[]) => a.map((v,i) => v-b[i]);\nconst wrap = (v: number) => ((v+180)%360+360)%360-180;\nexport function runGates(doc: RigDocument, config: z.input<typeof GateConfig>) {\n const cfg=GateConfig.parse(config), animation=doc.animations.find(a=>a.id===cfg.animation);\n if(!animation) throw new Error(`unknown animation \"${cfg.animation}\"`);\n if (!cfg.requiredAnimations.length && !cfg.motion.length && !cfg.distances.length && !cfg.conditions.length && !cfg.transitions.length) throw new Error('gate config needs at least one explicit rule');\n const failures: string[]=[]; const metrics: Record<string,unknown>={};\n for(const id of cfg.requiredAnimations) if(!doc.animations.some(a=>a.id===id)) failures.push(`required animation missing: ${id}`);\n const n=Math.max(1,Math.ceil(animation.duration*cfg.fps)), dt=animation.duration/n;\n const frames=Array.from({length:n+1},(_,i)=>{const t=i*dt,pose=poseOf(animation,t);return {t,pose,skel:evaluate(doc,pose)};});\n const rest=evaluate(doc,new Map());\n const bone=(s:typeof rest,id:string,channel:string,space:string):number[]=>{\n const b=s.bones.get(id);if(!b)throw new Error(`unknown gate bone \"${id}\"`);\n return channel==='rotation'?[space==='local'?b.rotation:Math.atan2(b.world.b,b.world.a)*180/Math.PI]:space==='local'?[b.x,b.y]:[b.world.tx,b.world.ty];\n };\n const inside=(t:number,w?:[number,number])=>!w||(t>=w[0]-1e-9&&t<=w[1]+1e-9);\n const windowCheck=(w?:[number,number])=>{if(w&&(w[0]>w[1]||w[1]>animation.duration))throw new Error('invalid gate time window');};\n for(const rule of cfg.motion){\n if ([rule.minAmplitude, rule.maxSpeed, rule.maxAcceleration, rule.maxJerk, rule.maxStep, rule.maxSetupDrift].every(v => v === undefined)) throw new Error('motion gate needs an explicit threshold');\n windowCheck(rule.during);\n const fs=frames.filter(f=>inside(f.t,rule.during));if(fs.length<4)throw new Error(`motion gate ${rule.bone} needs at least four samples`);\n const vs=fs.map(f=>bone(f.skel,rule.bone,rule.channel,rule.space));\n if(rule.channel==='rotation')for(let i=1;i<vs.length;i++)vs[i][0]=vs[i-1][0]+wrap(vs[i][0]-vs[i-1][0]);\n const derivative=(xs:number[][])=>xs.slice(1).map((v,i)=>subtract(v,xs[i]).map(v=>v/dt));\n const velocity=derivative(vs),acceleration=derivative(velocity),jerk=derivative(acceleration);\n const range=vs[0].map((_,i)=>Math.max(...vs.map(v=>v[i]))-Math.min(...vs.map(v=>v[i])));\n const setup=bone(rest,rule.bone,rule.channel,rule.space);\n const m={samples:vs.length,amplitude:norm(range),speed:Math.max(...velocity.map(norm)),acceleration:Math.max(...acceleration.map(norm)),jerk:Math.max(...jerk.map(norm)),step:Math.max(...velocity.map(norm))*dt,setupDrift:Math.max(...vs.map(v=>norm(subtract(v,setup))))};\n const id=`${rule.bone}.${rule.channel}.${rule.space}`;metrics[id]=m;\n if(rule.minAmplitude!==undefined&&m.amplitude<rule.minAmplitude)failures.push(`${id}: amplitude ${m.amplitude} < ${rule.minAmplitude}`);\n for(const [limit,key] of [['maxSpeed','speed'],['maxAcceleration','acceleration'],['maxJerk','jerk'],['maxStep','step'],['maxSetupDrift','setupDrift']] as const)\n if(rule[limit]!==undefined&&m[key]>rule[limit]!)failures.push(`${id}: ${key} ${m[key]} > ${rule[limit]}`);\n }\n for(const rule of cfg.distances){\n if ([rule.min, rule.max, rule.minRatio, rule.maxRatio].every(v => v === undefined)) throw new Error('distance gate needs an explicit threshold');\n windowCheck(rule.during);const fs=frames.filter(f=>inside(f.t,rule.during));if(!fs.length)throw new Error('distance gate has no samples');\n const distance=(s:typeof rest)=>norm(subtract(bone(s,rule.a,'position','world'),bone(s,rule.b,'position','world')));\n const setup=distance(rest),values=fs.map(f=>distance(f.skel)),lo=Math.min(...values),hi=Math.max(...values);\n metrics[`${rule.a}-${rule.b}`]={samples:fs.length,min:lo,max:hi,setup};\n if((rule.minRatio!==undefined||rule.maxRatio!==undefined)&&setup<1e-9)throw new Error('distance ratio needs noncoincident setup landmarks');\n if((rule.min!==undefined&&lo<rule.min)||(rule.max!==undefined&&hi>rule.max)||(rule.minRatio!==undefined&&lo<setup*rule.minRatio)||(rule.maxRatio!==undefined&&hi>setup*rule.maxRatio))failures.push(`distance ${rule.a}-${rule.b} outside allowed range`);\n }\n for(const rule of cfg.conditions){\n if (rule.min === undefined && rule.max === undefined) throw new Error('condition gate needs an explicit threshold');\n const slot=doc.slots.find(s=>s.id===rule.whenSlotVisible);if(!slot)throw new Error(`unknown gate slot \"${rule.whenSlotVisible}\"`);\n // Include both sides of every keyed switch so a flash lasting less than one frame cannot escape the gate.\n const ts=new Set(frames.map(f=>f.t));for(const tr of animation.tracks)for(const k of tr.keys){ts.add(k.t);if(k.t>0)ts.add(Math.max(0,k.t-1e-6));}\n let active=0,bad=0;\n for(const t of ts){const pose=poseOf(animation,t),s=evaluate(doc,pose);\n const color = pose.get(pk('slot',slot.id,'color')) ?? colorToArray(slot.color);\n const alpha = Number(pose.get(pk('slot',slot.id,'alpha'))??slot.alpha) * (color as number[])[3];\n if(!s.attachment.get(slot.id)||alpha<=.01)continue;\n active++;const v=bone(s,rule.bone,rule.prop==='rotation'?'rotation':'position',rule.space)[rule.prop==='y'?1:0];\n if((rule.min!==undefined&&v<rule.min)||(rule.max!==undefined&&v>rule.max))bad++;\n }\n metrics[`condition:${slot.id}:${rule.bone}.${rule.prop}`]={active,bad};\n if(bad||(!active&&rule.required))failures.push(`${slot.id} condition: ${bad} invalid visible samples, ${active} active samples`);\n }\n for(const tr of cfg.transitions){\n for(const id of [tr.from,tr.to])if(!doc.animations.some(a=>a.id===id))throw new Error(`missing transition animation ${id}`);\n const sink={doc,pose:new Map() as Pose,setPose(p:Pose){this.pose=p;}},state=new AnimationState(sink,{mix:tr.mix,missingAnimation:'throw'});\n state.setBase(tr.from,{mix:0});state.update(tr.fromTime);\n let previous=evaluate(doc,sink.pose),previousPose=sink.pose,maxStep=0;\n state.play(tr.to); // exercise the actual composed state, including setup defaults and discrete holds\n const measure=()=>{\n const next=evaluate(doc,sink.pose);\n for(const b of doc.bones){\n const a=previous.bones.get(b.id)!.world,c=next.bones.get(b.id)!.world;\n const p=apply(a,b.length,0),q=apply(c,b.length,0);\n maxStep=Math.max(maxStep,Math.hypot(c.tx-a.tx,c.ty-a.ty),Math.hypot(q[0]-p[0],q[1]-p[1]));\n }\n for (const s of doc.slots) {\n if (previous.attachment.get(s.id)?.id !== next.attachment.get(s.id)?.id) continue; // swaps use declared registration landmarks\n const before = slotOutline(doc, previousPose, s.id, 1, previous), after = slotOutline(doc, sink.pose, s.id, 1, next);\n if (before && after && before.length === after.length) for (let i = 0; i < before.length; i++) maxStep = Math.max(maxStep, Math.hypot(after[i][0]-before[i][0], after[i][1]-before[i][1]));\n }\n previous=next;previousPose=sink.pose;\n };\n measure();const count=Math.ceil(tr.duration*cfg.fps);for(let i=0;i<count;i++){state.update(1/cfg.fps);measure();}state.stop();\n metrics[`transition:${tr.from}->${tr.to}`]={samples:count+1,maxStep,mix:tr.mix};if(maxStep>tr.maxStep)failures.push(`transition ${tr.from}->${tr.to}: step ${maxStep} > ${tr.maxStep}`);\n }\n return {pass:failures.length===0,animation:animation.id,fps:cfg.fps,interval:dt,expected:n+1,inspected:frames.length,metrics,failures};\n}\n", "/**\n * rig-state \u2014 animation state machine over a pose sink (RigPlayer, or anything with `setPose`).\n *\n * - base: the looping default (`idle`); shown whenever nothing else is active. A non-looping base holds its end pose.\n * - main: one-shot (or forced loop) requests with priorities and a FIFO queue. Equal/higher priority interrupts,\n * lower priority queues (or is dropped). After completion \u2192 next queued, else base, else hold the last pose.\n * - overlays: named independent loops whose keys override the shown pose (blink, mouth). Non-looping overlays\n * remove themselves when done.\n * - crossfade: numbers blend from the last composed pose; discrete keys (attachment) hold until the mix ends.\n * Every `play` promise resolves \u2014 a game can `await` it without risk of hanging.\n */\nimport type { RigDocument, Animation } from \"./rig-format\";\nimport { poseOf, blendPoses, restValue, type Pose } from \"./rig-anim\";\n\nexport interface PoseSink { doc: RigDocument; setPose(pose: Pose): void }\nexport type PlayResult = \"completed\" | \"interrupted\" | \"dropped\" | \"stopped\";\nexport interface PlayOptions {\n /** default 0; a request interrupts the current one when its priority is >= */\n priority?: number;\n /** default: the animation's own `loop` */\n loop?: boolean;\n /** crossfade seconds from the current pose; default: the state's `mix` */\n mix?: number;\n /** what to do when a higher-priority animation is playing (default \"queue\") */\n ifBusy?: \"queue\" | \"drop\" | \"interrupt\";\n /** synchronous callback, in addition to the returned promise */\n onComplete?: (result: PlayResult) => void;\n}\n\ninterface Channel {\n anim: Animation; time: number; loop: boolean; done: boolean; priority: number;\n /** first advance fires t=0 events */\n fresh: boolean;\n settle?: (r: PlayResult) => void;\n}\n\nexport class AnimationState {\n onEvent?: (name: string, payload?: Record<string, unknown>) => void;\n private base?: Channel;\n private main?: Channel;\n private queue: Channel[] = [];\n private overlays = new Map<string, Channel>();\n /** last composed pose without overlays \u2014 mix snapshots start here */\n private pose: Pose = new Map();\n private from?: Pose;\n private mixLeft = 0;\n private mixTotal = 0;\n /** a mix begun in this update shows weight 0 for the frame it starts on */\n private mixFresh = false;\n private readonly defaultMix: number;\n\n constructor(private readonly sink: PoseSink, private readonly opts: { mix?: number; missingAnimation?: \"warn\" | \"throw\"; onWarning?: (message: string) => void } = {}) {\n this.defaultMix = opts.mix ?? 0;\n }\n\n /** id of the animation currently shown (main, else base) */\n get current(): string | undefined { return (this.main ?? this.base)?.anim.id; }\n get baseId(): string | undefined { return this.base?.anim.id; }\n\n private channel(id: string, loop?: boolean, priority = 0): Channel | undefined {\n const anim = this.sink.doc.animations.find(a => a.id === id);\n if (!anim) {\n const message = `unknown animation \"${id}\"; available: ${this.sink.doc.animations.map(a => a.id).join(\", \")}`;\n if (this.opts.missingAnimation === \"throw\") throw new Error(message);\n (this.opts.onWarning ?? console.warn)(message);\n return undefined;\n }\n return { anim, time: 0, loop: loop ?? anim.loop, done: false, priority, fresh: true };\n }\n\n setBase(id?: string, opts: { mix?: number } = {}) {\n const next = id === undefined ? undefined : this.channel(id);\n if (id !== undefined && !next) return;\n this.base = next;\n if (!this.main || this.main.done) { this.main = undefined; this.beginMix(opts.mix); this.update(0); }\n }\n\n play(id: string, opts: PlayOptions = {}): Promise<PlayResult> {\n const ch = this.channel(id, opts.loop, opts.priority ?? 0);\n if (!ch) {\n this.main?.settle?.(\"interrupted\");\n for (const queued of this.queue) queued.settle?.(\"dropped\");\n this.main = undefined; this.queue = [];\n this.beginMix(opts.mix); this.update(0);\n opts.onComplete?.(\"dropped\");\n return Promise.resolve(\"dropped\");\n }\n const promise = new Promise<PlayResult>(resolve => {\n ch.settle = r => { ch.settle = undefined; opts.onComplete?.(r); resolve(r); };\n });\n const cur = this.main, busy = cur !== undefined && !cur.done, mode = opts.ifBusy ?? \"queue\";\n if (!busy || mode === \"interrupt\" || ch.priority >= cur.priority) {\n if (busy) cur.settle?.(\"interrupted\");\n this.main = ch;\n this.beginMix(opts.mix);\n this.update(0);\n } else if (mode === \"drop\") ch.settle!(\"dropped\");\n else this.queue.push(ch);\n return promise;\n }\n\n /** Independent loop on top of the shown pose; `undefined` removes it. */\n setOverlay(name: string, id?: string) {\n if (id === undefined) this.overlays.delete(name);\n else { const ch = this.channel(id); if (ch) this.overlays.set(name, ch); }\n }\n\n /** Clear everything and show the setup pose. Pending plays resolve as \"stopped\". */\n stop() {\n this.main?.settle?.(\"stopped\");\n for (const ch of this.queue) ch.settle?.(\"stopped\");\n this.main = this.base = undefined; this.queue = []; this.overlays.clear();\n this.from = undefined; this.mixLeft = this.mixTotal = 0; this.mixFresh = false;\n this.pose = new Map();\n this.sink.setPose(new Map());\n }\n\n update(dt: number) {\n if (this.base) this.advance(this.base, dt, this.main === undefined);\n if (this.main) {\n const wasDone = this.main.done;\n this.advance(this.main, dt, true);\n if (this.main.done && !wasDone) {\n this.main.settle?.(\"completed\");\n const next = this.queue.shift();\n if (next || this.base) { this.main = next; this.beginMix(); }\n // else: hold the finished pose until something else is requested\n }\n }\n const shown = this.main ?? this.base;\n let pose: Pose = shown ? poseOf(shown.anim, shown.time) : new Map();\n if (this.from) {\n if (!this.mixFresh) this.mixLeft = Math.max(0, this.mixLeft - dt);\n this.mixFresh = false;\n const w = this.mixTotal > 0 ? 1 - this.mixLeft / this.mixTotal : 1;\n pose = blendPoses(this.from, pose, w, k => restValue(this.sink.doc, k));\n if (this.mixLeft === 0) this.from = undefined;\n }\n this.pose = pose;\n if (this.overlays.size) {\n pose = new Map(pose);\n for (const [name, ov] of this.overlays) {\n this.advance(ov, dt, false);\n poseOf(ov.anim, ov.time, pose);\n if (ov.done) this.overlays.delete(name);\n }\n }\n this.sink.setPose(pose);\n }\n\n private beginMix(mix = this.defaultMix) {\n if (mix > 0) { this.from = new Map(this.pose); this.mixLeft = this.mixTotal = mix; this.mixFresh = true; }\n else { this.from = undefined; this.mixLeft = this.mixTotal = 0; this.mixFresh = false; }\n }\n\n private advance(ch: Channel, dt: number, emit: boolean) {\n if (ch.done) return;\n const prev = ch.fresh ? -1 : ch.time, d = ch.anim.duration;\n ch.fresh = false;\n ch.time += dt;\n if (emit) for (const e of ch.anim.events) if (hit(e.t, prev, ch.time, d, ch.loop)) this.onEvent?.(e.name, e.payload);\n if (ch.time >= d) {\n if (ch.loop) ch.time %= d;\n else { ch.time = d; ch.done = true; }\n }\n }\n}\n\n/** event time t is crossed in (prev, cur]; for loops also across the wrap */\nfunction hit(t: number, prev: number, cur: number, d: number, loop: boolean) {\n if (cur < d || !loop) return t > prev && t <= cur;\n return (t > prev && t <= d) || t <= cur % d;\n}\n", "/** Reusable authoring operations. All output is ordinary editable tracks and constraints. */\nimport type { RigDocument, MeshAttachment, Influence, Track } from './rig-format';\nimport { apply, invert, evaluate, attachmentWorldVertices, poseOf, rotationOf } from './rig-anim';\nimport { setConstraint, setKeys, setWeights } from './rig-tools';\n\nconst wrap = (x: number) => ((x + 180) % 360 + 360) % 360 - 180;\nconst mesh = (doc: RigDocument, id: string): MeshAttachment => {\n const a = doc.attachments.find(a => a.id === id);\n if (a?.type !== 'mesh') throw new Error(`expected mesh \"${id}\"`);\n return a;\n};\nfunction skin(doc: RigDocument, a: MeshAttachment, weights: Map<string, number>[]): Influence[][] {\n const skel = evaluate(doc, new Map()), world = attachmentWorldVertices(skel, a.slot, a);\n return weights.map((list, i) => {\n const sum = [...list.values()].reduce((a, b) => a + b, 0);\n if (!(sum > 0)) throw new Error(`vertex ${i}: weights sum to zero`);\n return [...list].filter(([, w]) => w > 1e-9).map(([bone, w]) => {\n const b = skel.bones.get(bone);\n if (!b) throw new Error(`unknown weight bone \"${bone}\"`);\n const [x, y] = apply(invert(b.world), world[i * 2], world[i * 2 + 1]);\n return { bone, x, y, w: w / sum };\n });\n });\n}\n\n/** Blend between neighbouring chain joints by projected distance along the polyline. */\nexport function gradientWeights(doc: RigDocument, id: string, bones: string[]): RigDocument {\n const a = mesh(doc, id), skel = evaluate(doc, new Map());\n if (bones.length < 2 || new Set(bones).size !== bones.length) throw new Error('gradient needs at least two distinct bones');\n const points = bones.map(id => { const b = skel.bones.get(id); if (!b) throw new Error(`unknown bone \"${id}\"`); return [b.world.tx, b.world.ty]; });\n const world = attachmentWorldVertices(skel, a.slot, a), weights: Map<string, number>[] = [];\n for (let v = 0; v < world.length; v += 2) {\n let best = Infinity, segment = 0, u = 0;\n for (let i = 0; i < points.length - 1; i++) {\n const [x, y] = points[i], dx = points[i + 1][0] - x, dy = points[i + 1][1] - y, l2 = dx * dx + dy * dy;\n if (l2 < 1e-12) throw new Error('gradient chain contains coincident joints');\n const t = Math.max(0, Math.min(1, ((world[v] - x) * dx + (world[v + 1] - y) * dy) / l2));\n const d = (world[v] - x - t * dx) ** 2 + (world[v + 1] - y - t * dy) ** 2;\n if (d < best) { best = d; segment = i; u = t; }\n }\n weights.push(new Map([[bones[segment], 1 - u], [bones[segment + 1], u]]));\n }\n return setWeights(doc, id, skin(doc, a, weights)).doc;\n}\n\n/** Smooth through triangle adjacency; locked vertices are fixed boundary conditions. */\nexport function smoothWeights(doc: RigDocument, id: string, iterations = 3, strength = 0.5, locked: number[] = []): RigDocument {\n const a = mesh(doc, id);\n if (!a.weights) throw new Error('skin the mesh before smoothing weights');\n if (!Number.isInteger(iterations) || iterations < 1 || iterations > 100 || strength < 0 || strength > 1) throw new Error('invalid smoothing options');\n const fixed = new Set(locked), neighbours = a.weights.map(() => new Set<number>());\n for (const v of fixed) if (!Number.isInteger(v) || v < 0 || v >= neighbours.length) throw new Error(`invalid locked vertex ${v}`);\n for (let i = 0; i < a.triangles.length; i += 3) for (const v of a.triangles.slice(i, i + 3)) for (const n of a.triangles.slice(i, i + 3)) if (v !== n) neighbours[v].add(n);\n let w = a.weights.map(list => new Map(list.map(i => [i.bone, i.w])));\n for (let iter = 0; iter < iterations; iter++) w = w.map((own, i) => {\n if (fixed.has(i) || !neighbours[i].size) return own;\n const next = new Map([...own].map(([b, v]) => [b, v * (1 - strength)]));\n for (const n of neighbours[i]) for (const [b, v] of w[n]) next.set(b, (next.get(b) ?? 0) + strength * v / neighbours[i].size);\n return next;\n });\n return setWeights(doc, id, skin(doc, a, w)).doc;\n}\n\n/** Rigid or mixed binding for a vertex selection or document-space rectangle. */\nexport function pinWeights(doc: RigDocument, id: string, bone: string, vertices?: number[], region?: [number, number, number, number]): RigDocument {\n const a = mesh(doc, id), skel = evaluate(doc, new Map()), world = attachmentWorldVertices(skel, a.slot, a);\n if (!skel.bones.has(bone)) throw new Error(`unknown bone \"${bone}\"`);\n if (!vertices?.length && !region) throw new Error('select vertices or a document-space region');\n const selected = new Set(vertices);\n for (const v of selected) if (!Number.isInteger(v) || v < 0 || v >= world.length / 2) throw new Error(`invalid vertex ${v}`);\n const host = doc.slots.find(s => s.id === a.slot)!.bone;\n let count = 0;\n const w = Array.from({ length: world.length / 2 }, (_, i) => {\n const x = world[i * 2], y = world[i * 2 + 1];\n const inside = region && x >= region[0] && y >= region[1] && x <= region[0] + region[2] && y <= region[1] + region[3];\n if (selected.has(i) || inside) { count++; return new Map([[bone, 1]]); }\n return new Map(a.weights?.[i].map(inf => [inf.bone, inf.w]) ?? [[host, 1]]);\n });\n if (!count) throw new Error('selection contains no mesh vertices');\n return setWeights(doc, id, skin(doc, a, w)).doc;\n}\n\n/** Switch following controls while preserving the evaluated world pose at the contact time. */\nexport function attachToBone(doc: RigDocument, animation: string, bone: string, target: string, t: number): RigDocument {\n const anim = doc.animations.find(a => a.id === animation);\n if (!anim || t < 0 || t > anim.duration) throw new Error('attach requires an existing animation and time within its duration');\n const skel = evaluate(doc, poseOf(anim, t)), from = skel.bones.get(bone)?.world, to = skel.bones.get(target)?.world;\n if (!from || !to || bone === target) throw new Error('attach needs distinct existing bones');\n for (let b = doc.bones.find(b => b.id === target); b; b = doc.bones.find(x => x.id === b!.parent)) if (b.id === bone) throw new Error('cannot attach to a descendant');\n if (Math.abs(to.a * to.d - to.b * to.c) < 1e-10) throw new Error('cannot attach to a singular target');\n const [x, y] = apply(invert(to), from.tx, from.ty);\n const id = `attach_${bone}_${target}`;\n const offset = { x, y, rotation: wrap(rotationOf(from) - rotationOf(to)), scaleX: Math.hypot(from.a, from.b) - Math.hypot(to.a, to.b), scaleY: Math.hypot(from.c, from.d) - Math.hypot(to.c, to.d),\n shearY: wrap((Math.atan2(from.d, from.c) - Math.atan2(from.b, from.a) - Math.atan2(to.d, to.c) + Math.atan2(to.b, to.a)) * 180 / Math.PI) };\n const order = Math.max(0, ...doc.ik.map(c => c.order), ...doc.transform.map(c => c.order), ...doc.path.map(c => c.order)) + 1;\n let next = setConstraint(doc, 'transform', id, { bones: [bone], target, order, ...offset, mixX: 0, mixY: 0, mixRotate: 0, mixScaleX: 0, mixScaleY: 0, mixShearY: 0 });\n for (const c of next.transform.filter(c => c.id.startsWith(`attach_${bone}_`) && c.bones.length === 1 && c.bones[0] === bone)) {\n for (const prop of ['mixX', 'mixY', 'mixRotate', 'mixScaleX', 'mixScaleY', 'mixShearY'] as const) {\n const has = anim.tracks.some(tr => tr.target === 'transform' && tr.id === c.id && tr.prop === prop);\n const keys = [...(!has && t > 0 ? [{ t: 0, v: 0, ease: 'step' as const }] : []), { t, v: c.id === id ? 1 : 0, ease: 'step' as const }];\n next = setKeys(next, animation, { target: 'transform', id: c.id, prop }, keys, undefined, { merge: true });\n }\n }\n for (const [prop, v] of Object.entries(offset)) next = setKeys(next, animation, { target: 'transform', id, prop } as Omit<Track, 'keys'>, [{ t, v, ease: 'step' }], undefined, { merge: true });\n return next;\n}\n\nexport interface SpringOptions { driver: string; driverProp?: \"rotation\" | \"x\" | \"y\"; bones: string[]; frequency?: number; damping?: number; gain?: number; fps?: number; maxAngle?: number; }\n/** Velocity-driven damped oscillator, baked at uniform times. No runtime simulation is needed. */\nexport function bakeSecondary(doc: RigDocument, animation: string, opts: SpringOptions): RigDocument {\n const anim = doc.animations.find(a => a.id === animation);\n if (!anim) throw new Error(`unknown animation \"${animation}\"`);\n const fps = opts.fps ?? 60, hz = opts.frequency ?? 2.5, damping = opts.damping ?? 0.65, gain = opts.gain ?? 0.2, maxAngle = opts.maxAngle ?? 30;\n if (fps <= 0 || hz <= 0 || damping <= 0 || maxAngle <= 0 || !opts.bones.length) throw new Error('invalid spring parameters');\n if (!doc.bones.some(b => b.id === opts.driver) || opts.bones.includes(opts.driver)) throw new Error('driver must exist and be outside the secondary chain');\n if (new Set(opts.bones).size !== opts.bones.length) throw new Error('secondary bones must be distinct');\n for (let b = doc.bones.find(b => b.id === opts.driver); b; b = doc.bones.find(x => x.id === b!.parent)) {\n if (opts.bones.includes(b.id)) throw new Error('secondary bones cannot be ancestors of the driver');\n }\n const n = Math.max(2, Math.ceil(anim.duration * fps)), dt = anim.duration / n;\n const base = { ...anim, tracks: anim.tracks.filter(t => !(t.target === 'bone' && opts.bones.includes(t.id) && t.prop === 'rotation')) };\n const angular = (opts.driverProp ?? \"rotation\") === \"rotation\";\n const angles = Array.from({ length: n + 1 }, (_, i) => {\n const world = evaluate(doc, poseOf(base, dt * i)).bones.get(opts.driver)!.world;\n return angular ? rotationOf(world) : opts.driverProp === \"x\" ? world.tx : world.ty;\n });\n const seam = angles[n] - angles[0];\n if (anim.loop && Math.abs(angular ? wrap(seam) : seam) > 1e-3) throw new Error('loop driver must return to its starting world pose before baking');\n let next = doc;\n for (let bi = 0; bi < opts.bones.length; bi++) {\n const bone = doc.bones.find(b => b.id === opts.bones[bi]);\n if (!bone) throw new Error(`unknown secondary bone \"${opts.bones[bi]}\"`);\n const omega = 2 * Math.PI * hz / (1 + bi * 0.25), sub = Math.max(1, Math.ceil(dt * Math.max(240, omega * 12))), h = dt / sub;\n let x = 0, velocity = 0, samples: number[] = [];\n const cycle = () => {\n samples = [x];\n for (let i = 1; i <= n; i++) {\n const difference = angles[i] - angles[i - 1];\n const drive = (angular ? wrap(difference) : difference) / dt;\n for (let j = 0; j < sub; j++) {\n velocity += (-omega * omega * x - 2 * damping * omega * velocity - gain * omega * drive) * h;\n x += velocity * h;\n if (Math.abs(x) > maxAngle) { x = Math.sign(x) * maxAngle; velocity = 0; }\n }\n samples.push(x);\n }\n };\n if (anim.loop) {\n let converged = false;\n for (let i = 0; i < 200; i++) { const oldX = x, oldV = velocity; cycle(); if (Math.abs(x - oldX) < 1e-7 && Math.abs(velocity - oldV) < 1e-7) { converged = true; break; } }\n if (!converged) throw new Error('spring loop did not converge; increase damping or duration');\n samples[n] = samples[0];\n } else cycle();\n // Recenter a periodic oscillator so idle t=0 equals the approved setup pose.\n const origin = anim.loop ? samples[0] : 0;\n const amplitude = Math.max(...samples.map(v => Math.abs(v - origin)));\n const scale = Math.min(1, maxAngle / Math.max(amplitude, 1e-12));\n next = setKeys(next, animation, { target: 'bone', id: bone.id, prop: 'rotation', interpolation: 'pchip' }, samples.map((v, i) => ({ t: i * dt, v: bone.transform.rotation + (v - origin) * scale, ease: 'linear' })), anim.duration);\n }\n return next;\n}\n"],
|
|
5
|
+
"mappings": ";AAKA,SAAS,oBAA+D;AACxE,SAAS,YAAAA,YAAU,QAAAC,OAAM,WAAAC,UAAS,SAAAC,QAAO,YAAY;AACrD,SAAS,SAAS,eAA+B;AACjD,SAAS,WAAAC,UAAS,WAAAC,UAAS,YAAAC,WAAU,WAAAC,UAAS,KAAK,QAAAC,QAAM,YAAAC,iBAAgB;AACzE,SAAS,iBAAAC,sBAAqB;;;ACM9B,SAAS,SAAS;;;ACAX,IAAM,gBAA+D,EAAE,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,QAAQ,IAAI;AAIxH,IAAM,IAAI,CAAC,GAAG,KAAK,CAAC;AACpB,IAAM,QAAQ,CAAC,MAAc,EAAE,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;AACrF,IAAM,SAAS,CAAC,MAAc,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC;AAGvD,SAAS,eAAe,QAAgC,GAAW,GAAW,OAAc,MAAoB,IAAI,aAAa,EAAE,GAAiB;AACzJ,MAAI,KAAK,CAAC;AACV,QAAM,QAAQ,OAAO,SAAS,GAAG,OAAO,OAAO,QAAQ,GAAG,OAAO,OAAO,QAAQ,GAAG,SAAS,OAAO,UAAU;AAC7G,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACtD,UAAM,KAAK,IAAI,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,MAAM,IAAI,IAAI;AAEnE,QAAI,CAAC,IAAI,OAAO,QAAQ,KAAK,IAAI,OAAO,OAAO,KAAK,OAAO,KAAK,IAAI,MAAM,KAAK,SAAS,KAAK,IAAI,MAAM,KAAK,MAAM;AAClH,QAAI,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,IAAI,MAAM,KAAK;AAAA,EAC7C;AACA,aAAW,KAAK,QAAQ;AACtB,QAAI,EAAE,WAAW,KAAK,EAAE,CAAC,MAAM,IAAK;AACpC,UAAM,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;AACzB,QAAI,EAAE,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,MAAO,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,IAAM;AAC7E,SAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,MAAM,MAAM,IAAI,EAAE,KAAK,OAAO,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAGO,SAAS,UAAU,SAA4B,GAAW,GAA6B;AAC5F,QAAM,KAAK,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC;AACjC,MAAI,IAAI,GAAG,IAAI;AACf,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACtD,UAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK;AAC7C,SAAK,MAAM,QAAQ,CAAC;AAAG,SAAK,MAAM,QAAQ,IAAI,CAAC;AAAA,EACjD;AACA,SAAO,CAAC,GAAG,CAAC;AACd;AAcO,SAAS,YAAY,SAA4B,GAAW,GAAW,UAAU,IAAY;AAClG,MAAI,MAAM;AACV,WAASC,KAAI,GAAGA,KAAI,SAASA,KAAK,UAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAClE,UAAM,IAAI,KAAK,UAAU,IAAI,IAAIA,MAAK,UAAU;AAChD,UAAM,KAAK,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC;AACjE,QAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK;AACjC,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACtD,YAAM,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,QAAQ,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC;AAC9D,YAAM,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI;AAAI,YAAM,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI;AAChD,YAAM,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI;AAAI,YAAM,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI;AAAA,IAClD;AACA,UAAM,QAAQ,IAAI,OAAO,IAAI,MAAM,KAAK,OAAO,IAAI;AACnD,QAAI,MAAM,IAAK,OAAM;AAAA,EACvB;AACA,SAAO;AACT;;;AD3DO,IAAM,QAAQ;AACd,IAAM,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,eAAe;AAElD,IAAM,OAAO,EAAE,MAAM;AAAA,EAC1B,EAAE,KAAK,CAAC,UAAU,QAAQ,WAAW,YAAY,eAAe,gBAAgB,YAAY,aAAa,CAAC;AAAA;AAAA,EAE1G,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;AAChF,CAAC;AAEM,IAAM,YAAY,EAAE,OAAO;AAAA,EAChC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EACvB,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EACvB,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC9B,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC5B,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC5B,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC5B,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AAC9B,CAAC;AAEM,IAAM,QAAQ,EAAE,OAAO,EAAE,MAAM,qBAAqB,yBAAyB;AAC7E,IAAM,QAAQ,EAAE,KAAK,CAAC,UAAU,OAAO,YAAY,QAAQ,CAAC;AAC5D,IAAM,UAAU,EAAE,KAAK,CAAC,UAAU,mBAAmB,0BAA0B,WAAW,qBAAqB,CAAC;AAIhH,IAAM,QAAQ,EAAE,OAAO;AAAA,EAC5B,IAAI;AAAA;AAAA,EAEJ,KAAK,EAAE,OAAO;AAAA;AAAA,EAEd,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACjC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA;AAAA,EAElC,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA;AAAA,EAE1E,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC;AAAA;AAAA,EAExD,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA;AAAA,EAEjD,QAAQ,EACL,OAAO;AAAA,IACN,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,IACjC,WAAW,EAAE,KAAK,CAAC,UAAU,UAAU,CAAC,EAAE,SAAS;AAAA;AAAA,IAEnD,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,IACzE,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IACpC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,CAAC,EACA,SAAS;AACd,CAAC;AAIM,IAAM,OAAO,EAAE,OAAO;AAAA,EAC3B,IAAI;AAAA,EACJ,QAAQ,GAAG,SAAS;AAAA;AAAA,EAEpB,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC;AAAA,EAC1C,WAAW,UAAU,QAAQ,CAAC,CAAC;AAAA;AAAA,EAE/B,SAAS,QAAQ,QAAQ,QAAQ;AAAA;AAAA,EAEjC,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAEM,IAAM,OAAO,EAAE,OAAO;AAAA,EAC3B,IAAI;AAAA,EACJ,MAAM;AAAA;AAAA,EAEN,MAAM,GAAG,SAAS;AAAA;AAAA,EAElB,YAAY,GAAG,SAAS;AAAA,EACxB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA;AAAA,EAEzC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA;AAAA,EAE7B,OAAO,MAAM,QAAQ,QAAQ;AAAA;AAAA,EAE7B,OAAO,MAAM,QAAQ,WAAW;AAClC,CAAC;AAKM,IAAM,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,EAAE,OAAO,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC;AAC3F,IAAM,aAAa;AAAA;AAAA,EAEjB,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAEvC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AACvD;AAEO,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,IAAI;AAAA,EAAI,MAAM;AAAA,EAAI,MAAM,EAAE,QAAQ,QAAQ;AAAA,EAC1C,OAAO;AAAA;AAAA,EAEP,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAClF,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA;AAAA,EAE3D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAAG,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAClF,CAAC;AACM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,IAAI;AAAA,EAAI,MAAM;AAAA,EAAI,MAAM,EAAE,QAAQ,MAAM;AAAA,EACxC,OAAO;AAAA;AAAA,EAEP,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EACvB,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC;AAAA,EACjD,GAAG;AAAA;AAAA,EAEH,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC;AAAA,EAC9C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAAG,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAClF,CAAC;AACM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,IAAI;AAAA,EAAI,MAAM;AAAA,EAAI,MAAM,EAAE,QAAQ,MAAM;AAAA,EACxC,GAAG;AAAA;AAAA,EAEH,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACvC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACjC,eAAe,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACzC,CAAC;AACM,IAAM,aAAa,EAAE,mBAAmB,QAAQ,CAAC,kBAAkB,gBAAgB,cAAc,CAAC;AAIlG,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,IAAI;AAAA,EAAI,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,EACzC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC;AAAA,EAAG,QAAQ;AAAA,EACnC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,EACvD,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC1D,cAAc,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAAG,UAAU,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAAG,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAAG,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACxJ,CAAC;AACM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,IAAI;AAAA,EAAI,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,EACzC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC;AAAA,EAAG,QAAQ;AAAA,EACnC,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAAG,UAAU,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACtE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAClF,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC1F,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EACzF,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;AACrG,CAAC;AACM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,IAAI;AAAA,EAAI,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,EACzC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC;AAAA;AAAA,EAExB,QAAQ;AAAA,EACR,cAAc,EAAE,KAAK,CAAC,SAAS,SAAS,CAAC,EAAE,QAAQ,SAAS;AAAA,EAC5D,aAAa,EAAE,KAAK,CAAC,UAAU,SAAS,WAAW,cAAc,CAAC,EAAE,QAAQ,QAAQ;AAAA,EACpF,YAAY,EAAE,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,EAAE,QAAQ,SAAS;AAAA,EACxE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC/F,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;AAC3F,CAAC;AAQM,IAAM,YAAY;AAAA,EACvB,IAAI,CAAC,KAAK;AAAA,EACV,WAAW,CAAC,aAAa,QAAQ,QAAQ,aAAa,aAAa,WAAW;AAAA,EAC9E,MAAM,CAAC,aAAa,QAAQ,MAAM;AACpC;AAIO,IAAM,WAAW,EAAE,KAAK,CAAC,KAAK,KAAK,YAAY,UAAU,UAAU,UAAU,QAAQ,CAAC;AACtF,IAAM,WAAW,EAAE,KAAK,CAAC,SAAS,cAAc,KAAK,OAAO,CAAC;AAE7D,IAAM,aAAa,EAAE,OAAO,EAAE,MAAM,uDAAuD,oEAAoE;AAC/J,IAAM,SAAS,EAAE,KAAK,CAAC,OAAO,YAAY,gBAAgB,YAAY,SAAS,CAAC;AAChF,IAAM,gBAAgB,EAAE,KAAK,CAAC,aAAa,QAAQ,QAAQ,aAAa,aAAa,aAAa,KAAK,KAAK,YAAY,UAAU,UAAU,QAAQ,CAAC;AACrJ,IAAM,WAAW,EAAE,KAAK,CAAC,YAAY,WAAW,aAAa,QAAQ,MAAM,CAAC;AAE5E,IAAM,WAAW,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACrG,IAAM,MAAM,EAAE,OAAO;AAAA,EAC1B,GAAG,EAAE,OAAO,EAAE,YAAY;AAAA,EAC1B,GAAG;AAAA;AAAA,EAEH,MAAM,KAAK,QAAQ,aAAa;AAClC,CAAC;AAED,IAAM,gBAAgB,EAAE,eAAe,EAAE,KAAK,CAAC,WAAW,OAAO,CAAC,EAAE,SAAS,EAAE;AACxE,IAAM,QAAQ,EAAE,mBAAmB,UAAU;AAAA,EAClD,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,MAAM,GAAG,IAAI,IAAI,MAAM,UAAU,GAAG,eAAe,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,EAC3G,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,MAAM,GAAG,IAAI,IAAI,MAAM,UAAU,GAAG,eAAe,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,EAC3G,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,QAAQ,GAAG,IAAI,IAAI,MAAM,YAAY,GAAG,eAAe,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,EAC/G,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,GAAG,eAAe,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,EACvG,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,WAAW,GAAG,IAAI,IAAI,MAAM,eAAe,GAAG,eAAe,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,EACrH,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,MAAM,GAAG,IAAI,IAAI,MAAM,UAAU,GAAG,eAAe,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,EAC3G,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,WAAW,GAAG,IAAI,GAAG,QAAQ,OAAO,GAAG,MAAM,EAAE,QAAQ,OAAO,EAAE,QAAQ,OAAO,GAAG,GAAG,eAAe,MAAM,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;AAC9J,CAAC;AAEM,IAAM,QAAQ,EAAE,OAAO;AAAA,EAC5B,GAAG,EAAE,OAAO,EAAE,YAAY;AAAA,EAC1B,MAAM,EAAE,OAAO;AAAA,EACf,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAC1C,CAAC;AAEM,IAAM,YAAY,EAAE,OAAO;AAAA,EAChC,IAAI;AAAA,EACJ,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC/B,QAAQ,EAAE,MAAM,KAAK,EAAE,QAAQ,CAAC,CAAC;AAAA,EACjC,QAAQ,EAAE,MAAM,KAAK,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEjC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,SAAS;AACjF,CAAC;AAKM,IAAM,YAAY,EAAE,OAAO;AAAA,EAChC,KAAK,EAAE,OAAO;AAAA,EACd,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG;AAAA,EAC7C,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EACjD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;AACxC,CAAC;AAEM,IAAM,YAAY,EAAE,OAAO;AAAA,EAChC,QAAQ,EAAE,QAAQ,aAAa;AAAA,EAC/B,SAAS,EAAE,QAAQ,CAAC;AAAA,EACpB,MAAM,EAAE,OAAO;AAAA,IACb,MAAM,EAAE,OAAO;AAAA,IACf,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IACjC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA;AAAA,IAElC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,WAAW,UAAU,SAAS;AAAA,EAChC,CAAC;AAAA,EACD,QAAQ,EAAE,MAAM,KAAK;AAAA,EACrB,OAAO,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC;AAAA,EAC1B,OAAO,EAAE,MAAM,IAAI;AAAA,EACnB,aAAa,EAAE,MAAM,UAAU,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC3C,IAAI,EAAE,MAAM,YAAY,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,WAAW,EAAE,MAAM,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AAAA,EAClD,MAAM,EAAE,MAAM,cAAc,EAAE,QAAQ,CAAC,CAAC;AAAA,EACxC,YAAY,EAAE,MAAM,SAAS;AAC/B,CAAC;AAGM,IAAM,cAAc,EAAE,WAAW,WAAS;AAC/C,QAAM,IAAK,OAAwC;AACnD,SAAO,MAAM,KAAK,MAAM,IAAI,UAAU,KAAK,IAAI;AACjD,GAAG,SAAS;AAqBZ,IAAM,MAAM,KAAK,KAAK;AAMf,SAAS,UAAU,OAAyB;AACjD,QAAM,MAAM;AACZ,QAAM,SAAgB,IAAI,UAAU,CAAC,GAAG,QAAe,IAAI,SAAS,CAAC,GAAG,QAAe,IAAI,cAAc,CAAC;AAC1G,QAAM,YAAY,IAAI,IAAI,OAAO,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAEpD,QAAM,QAAQ,oBAAI,IAAyB;AAC3C,QAAM,MAAM,CAAC,MAAc,WAAmB,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,MAAM,oBAAI,IAAI,CAAC,EAAE,IAAI,IAAI,GAAI,IAAI,KAAK;AACjH,aAAW,KAAK,MAAO,KAAI,EAAE,WAAY,KAAI,EAAE,IAAI,EAAE,UAAU;AAC/D,aAAW,KAAK,MAAO,YAAW,KAAK,EAAE,UAAU,CAAC;AAClD,QAAI,EAAE,WAAW,UAAU,EAAE,SAAS;AAAc,iBAAW,KAAK,EAAE,QAAQ,CAAC,EAAG,KAAI,OAAO,EAAE,MAAM,SAAU,KAAI,EAAE,IAAI,EAAE,CAAC;AAAA;AAC9H,QAAM,QAAQ,oBAAI,IAAoB;AACtC,aAAW,OAAO,MAAM,OAAO,EAAG,YAAW,SAAS,IAAK,OAAM,IAAI,QAAQ,MAAM,IAAI,KAAK,KAAK,KAAK,CAAC;AACvG,QAAM,eAAe,CAAC,MAAc,WAAoB,MAAM,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,IAAI,KAAK,KAAK;AAE1G,QAAM,cAAqB,CAAC;AAC5B,aAAW,KAAK,OAAO;AACrB,UAAM,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,GAAI,EAAE,UAAU,CAAC,EAAG;AACtH,eAAW,SAAS,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG;AACzC,YAAM,IAAI,UAAU,IAAI,KAAK;AAC7B,UAAI,CAAC,EAAG;AAER,YAAM,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,MAAM,MAAM,MAAM,KAAK,EAAE;AAC/D,YAAM,IAAI,EAAE,WAAW,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC;AAC/D,YAAM,IAAI,EAAE,IAAI,MAAM,EAAE,SAAS,KAAK,MAAM,EAAE,SAAS,IAAI,IAAI,EAAE,IAAI,MAAM,EAAE,SAAS,KAAK,MAAM,EAAE,SAAS;AAC5G,kBAAY,KAAK,EAAE,IAAI,aAAa,EAAE,IAAI,KAAK,GAAG,MAAM,EAAE,IAAI,MAAM,UAAU,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,UAAU,EAAE,UAAU,QAAQ,EAAE,QAAQ,QAAQ,EAAE,OAAO,CAAC;AAAA,IAC3K;AAAA,EACF;AACA,QAAM,iBAAiB,CAAC,SAAiB;AACvC,UAAM,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI;AACvC,UAAM,QAAQ,GAAG,cAAc,CAAC,GAAI,MAAM,IAAI,IAAI,KAAK,CAAC,CAAE,EAAE,CAAC;AAC7D,WAAO,QAAQ,aAAa,MAAM,KAAK,IAAI;AAAA,EAC7C;AACA,QAAM,WAAW,MAAM,IAAI,OAAK;AAC9B,UAAM,EAAE,OAAO,QAAQ,YAAY,GAAG,KAAK,IAAI;AAC/C,WAAO,EAAE,GAAG,MAAM,GAAI,aAAa,EAAE,YAAY,aAAa,EAAE,IAAI,UAAU,EAAE,IAAI,CAAC,EAAG;AAAA,EAC1F,CAAC;AACD,QAAM,WAAW,MAAM,IAAI,QAAM;AAAA,IAC/B,GAAG;AAAA,IACH,SAAS,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,MAAW;AAC3C,UAAI,EAAE,WAAW,UAAU,EAAE,SAAS;AACpC,eAAO,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC,OAAY,EAAE,GAAG,GAAG,GAAG,OAAO,EAAE,MAAM,WAAW,aAAa,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;AACxH,UAAI,EAAE,WAAW,UAAU;AAAE,cAAM,KAAK,eAAe,EAAE,EAAE;AAAG,eAAO,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;AAAA,MAAG;AAC/F,aAAO,CAAC,CAAC;AAAA,IACX,CAAC;AAAA,EACH,EAAE;AACF,SAAO,EAAE,GAAG,KAAK,SAAS,GAAG,OAAO,UAAU,aAAa,CAAC,GAAI,IAAI,eAAe,CAAC,GAAI,GAAG,WAAW,GAAG,YAAY,SAAS;AAChI;AACA,IAAM,QAAQ,CAAC,MAAc,KAAK,MAAM,IAAI,GAAG,IAAI,MAAM;AAIzD,IAAM,UAAU,CAAC,MAAa,GAAG,EAAE,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI;AAEpD,SAAS,SAAS,KAA4B;AACnD,QAAM,OAAiB,CAAC;AACxB,QAAM,MAAM,CAAC,IAAsB,SAAiB;AAClD,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,KAAK,IAAI;AAClB,UAAI,KAAK,IAAI,EAAE,EAAE,EAAG,MAAK,KAAK,GAAG,IAAI,mBAAmB,EAAE,EAAE,GAAG;AAC/D,WAAK,IAAI,EAAE,EAAE;AAAA,IACf;AAAA,EACF;AACA,MAAI,IAAI,QAAQ,OAAO;AAAG,MAAI,IAAI,OAAO,MAAM;AAAG,MAAI,IAAI,OAAO,MAAM;AAAG,MAAI,IAAI,aAAa,YAAY;AAC3G,MAAI,IAAI,YAAY,WAAW;AAAG,MAAI,IAAI,IAAI,IAAI;AAAG,MAAI,IAAI,WAAW,WAAW;AAAG,MAAI,IAAI,MAAM,MAAM;AAE1G,QAAM,QAAQ,IAAI,IAAI,IAAI,MAAM,IAAI,OAAK,EAAE,EAAE,CAAC;AAC9C,QAAM,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACrD,QAAM,QAAQ,IAAI,IAAI,IAAI,MAAM,IAAI,OAAK,EAAE,EAAE,CAAC;AAC9C,QAAM,cAAc,IAAI,IAAI,IAAI,YAAY,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/D,QAAM,MAAM,IAAI,IAAI,IAAI,GAAG,IAAI,OAAK,EAAE,EAAE,CAAC,GAAG,aAAa,IAAI,IAAI,IAAI,UAAU,IAAI,OAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,IAAI,IAAI,IAAI,KAAK,IAAI,OAAK,EAAE,EAAE,CAAC;AAEvI,aAAW,KAAK,IAAI,OAAO;AACzB,QAAI,EAAE,UAAU,CAAC,MAAM,IAAI,EAAE,MAAM,EAAG,MAAK,KAAK,SAAS,EAAE,EAAE,sBAAsB,EAAE,MAAM,GAAG;AAAA,EAChG;AACA,aAAW,KAAK,IAAI,OAAO;AACzB,UAAM,OAAO,oBAAI,IAAY;AAAG,QAAI,MAAwB;AAC5D,WAAO,KAAK,QAAQ;AAClB,UAAI,KAAK,IAAI,IAAI,EAAE,GAAG;AAAE,aAAK,KAAK,SAAS,EAAE,EAAE,iBAAiB;AAAG;AAAA,MAAO;AAC1E,WAAK,IAAI,IAAI,EAAE;AAAG,YAAM,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAK,MAAM;AAAA,IAClE;AAAA,EACF;AACA,MAAI,CAAC,IAAI,MAAM,KAAK,OAAK,CAAC,EAAE,MAAM,EAAG,MAAK,KAAK,cAAc;AAE7D,aAAW,KAAK,IAAI,QAAQ;AAC1B,QAAI,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,KAAK,EAAE,MAAM,CAAC,KAAK,GAAI,MAAK,KAAK,UAAU,EAAE,EAAE,kCAAkC;AAC/G,QAAI,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAS,MAAK,KAAK,UAAU,EAAE,EAAE,mEAAgE;AAAA,EACtL;AACA,aAAW,KAAK,IAAI,OAAO;AACzB,QAAI,EAAE,MAAM;AACV,YAAM,OAAO,YAAY,IAAI,EAAE,IAAI;AACnC,UAAI,MAAM,SAAS,UAAU,CAAC,KAAK,OAAQ,MAAK,KAAK,SAAS,EAAE,EAAE,4CAA4C;AAAA,IAChH;AACA,QAAI,CAAC,MAAM,IAAI,EAAE,IAAI,EAAG,MAAK,KAAK,SAAS,EAAE,EAAE,oBAAoB,EAAE,IAAI,GAAG;AAC5E,QAAI,EAAE,YAAY;AAChB,YAAM,IAAI,YAAY,IAAI,EAAE,UAAU;AACtC,UAAI,CAAC,EAAG,MAAK,KAAK,SAAS,EAAE,EAAE,0BAA0B,EAAE,UAAU,GAAG;AAAA,eAC/D,EAAE,SAAS,EAAE,GAAI,MAAK,KAAK,SAAS,EAAE,EAAE,kBAAkB,EAAE,UAAU,sBAAsB,EAAE,IAAI,GAAG;AAAA,IAChH;AAAA,EACF;AACA,QAAMC,eAAc,CAAC,MAA0B;AAC7C,QAAI,EAAE,SAAS,SAAU,QAAO;AAChC,QAAI,EAAE,SAAS,OAAQ,QAAO,EAAE,IAAI,SAAS;AAC7C,WAAO,EAAE,WAAW,EAAE,SAAS,SAAS,IAAI,EAAE,SAAS,UAAU;AAAA,EACnE;AACA,aAAW,KAAK,IAAI,aAAa;AAC/B,QAAI,CAAC,MAAM,IAAI,EAAE,IAAI,EAAG,MAAK,KAAK,eAAe,EAAE,EAAE,oBAAoB,EAAE,IAAI,GAAG;AAClF,QAAI,EAAE,SAAS,UAAU,CAAC,OAAO,IAAI,EAAE,KAAK,EAAG,MAAK,KAAK,eAAe,EAAE,EAAE,qBAAqB,EAAE,KAAK,GAAG;AAC3G,QAAI,EAAE,SAAS,UAAU,EAAE,SAAS,QAAQ;AAC1C,YAAM,IAAI,EAAE,SAAS,SAAS,EAAE,IAAI,SAAS,IAAIA,aAAY,CAAC;AAC9D,UAAI,EAAE,SAAS,QAAQ;AACrB,YAAI,EAAE,IAAI,SAAS,KAAK,IAAI,EAAG,MAAK,KAAK,eAAe,EAAE,EAAE,4DAA4D;AACxH,YAAI,EAAE,UAAU,SAAS,EAAG,MAAK,KAAK,eAAe,EAAE,EAAE,uCAAuC;AAChG,mBAAW,KAAK,EAAE,UAAW,KAAI,KAAK,EAAG,MAAK,KAAK,eAAe,EAAE,EAAE,qBAAqB,CAAC,kBAAkB,CAAC,YAAY;AAAA,MAC7H;AACA,WAAK,EAAE,WAAW,IAAI,MAAM,EAAE,UAAU,IAAI,OAAO,EAAG,MAAK,KAAK,eAAe,EAAE,EAAE,sCAAsC;AACzH,UAAI,EAAE,YAAY,EAAE,SAAS,WAAW,IAAI,EAAG,MAAK,KAAK,eAAe,EAAE,EAAE,+CAA+C,IAAI,CAAC,SAAS,EAAE,SAAS,MAAM,GAAG;AAC7J,UAAI,EAAE,SAAS;AACb,YAAI,EAAE,QAAQ,WAAW,EAAG,MAAK,KAAK,eAAe,EAAE,EAAE,uDAAuD,CAAC,SAAS,EAAE,QAAQ,MAAM,GAAG;AAC7I,mBAAW,QAAQ,EAAE,QAAS,YAAW,OAAO,KAAM,KAAI,CAAC,MAAM,IAAI,IAAI,IAAI,EAAG,MAAK,KAAK,eAAe,EAAE,EAAE,sCAAsC,IAAI,IAAI,GAAG;AAAA,MAChK;AAAA,IACF;AAAA,EACF;AACA,aAAW,KAAK,IAAI,IAAI;AACtB,aAAS,IAAI,GAAG,IAAI,EAAE,MAAM,QAAQ,IAAK,KAAI,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,WAAW,EAAE,MAAM,IAAI,CAAC;AAC7G,WAAK,KAAK,OAAO,EAAE,EAAE,uDAAuD;AAE9E,eAAW,KAAK,EAAE,MAAO,KAAI,CAAC,MAAM,IAAI,CAAC,EAAG,MAAK,KAAK,OAAO,EAAE,EAAE,oBAAoB,CAAC,GAAG;AACzF,QAAI,CAAC,MAAM,IAAI,EAAE,MAAM,EAAG,MAAK,KAAK,OAAO,EAAE,EAAE,2BAA2B,EAAE,MAAM,GAAG;AAAA,EACvF;AACA,aAAW,KAAK,IAAI,WAAW;AAC7B,eAAW,KAAK,EAAE,MAAO,KAAI,CAAC,MAAM,IAAI,CAAC,EAAG,MAAK,KAAK,cAAc,EAAE,EAAE,oBAAoB,CAAC,GAAG;AAChG,QAAI,CAAC,MAAM,IAAI,EAAE,MAAM,EAAG,MAAK,KAAK,cAAc,EAAE,EAAE,2BAA2B,EAAE,MAAM,GAAG;AAAA,EAC9F;AACA,aAAW,KAAK,IAAI,MAAM;AACxB,eAAW,KAAK,EAAE,MAAO,KAAI,CAAC,MAAM,IAAI,CAAC,EAAG,MAAK,KAAK,SAAS,EAAE,EAAE,oBAAoB,CAAC,GAAG;AAC3F,QAAI,CAAC,MAAM,IAAI,EAAE,MAAM,EAAG,MAAK,KAAK,SAAS,EAAE,EAAE,2BAA2B,EAAE,MAAM,GAAG;AAAA,EACzF;AAEA,aAAW,KAAK,IAAI,YAAY;AAC9B,UAAM,SAAS,oBAAI,IAAY;AAC/B,eAAW,KAAK,EAAE,QAAQ;AACxB,YAAM,MAAM,QAAQ,CAAC;AACrB,UAAI,OAAO,IAAI,GAAG,EAAG,MAAK,KAAK,cAAc,EAAE,EAAE,sBAAsB,GAAG,EAAE;AAC5E,aAAO,IAAI,GAAG;AACd,YAAM,QAAQ,EAAE,WAAW,SAAS,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,SAAS,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,WAAW,YAAY,IAAI,EAAE,EAAE,IACtI,EAAE,WAAW,OAAO,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,cAAc,WAAW,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,SAAS,MAAM,IAAI,EAAE,EAAE,IAAI;AAClI,UAAI,CAAC,MAAO,MAAK,KAAK,cAAc,EAAE,EAAE,cAAc,EAAE,MAAM,KAAK,EAAE,EAAE,GAAG;AAC1E,YAAM,QAAQ,EAAE,WAAW,WAAY,cAAqD,EAAE,IAAI,IAAI;AACtG,YAAM,MAAM,EAAE,WAAW,WAAW,YAAY,IAAI,EAAE,EAAE,IAAI;AAC5D,UAAI,OAAO;AACX,iBAAW,KAAK,EAAE,MAAM;AACtB,YAAI,EAAE,KAAK,QAAQ,QAAQ,EAAG,MAAK,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG,gCAAgC;AAClG,YAAI,EAAE,IAAI,EAAE,SAAU,MAAK,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG,YAAY,EAAE,CAAC,oBAAoB;AAC7F,YAAI,EAAE,WAAW,UAAU,EAAE,SAAS,cAAc;AAClD,cAAI,EAAE,MAAM,QAAQ,OAAO,EAAE,MAAM,SAAU,MAAK,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG,mDAAmD;AAAA,mBAC3H,OAAO,EAAE,MAAM,UAAU;AAChC,kBAAM,SAAS,YAAY,IAAI,EAAE,CAAC;AAClC,gBAAI,CAAC,OAAQ,MAAK,KAAK,cAAc,EAAE,EAAE,0BAA0B,EAAE,CAAC,GAAG;AAAA,qBAChE,OAAO,SAAS,EAAE,GAAI,MAAK,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG,iBAAiB,EAAE,CAAC,sBAAsB,OAAO,IAAI,GAAG;AAAA,UAC7H;AAAA,QACF,WAAW,EAAE,WAAW,UAAU,EAAE,SAAS,SAAS;AACpD,gBAAM,KAAK,MAAM,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,WAAW,KAAK,EAAE,EAAE,MAAM,OAAK,OAAO,MAAM,YAAY,KAAK,KAAK,KAAK,CAAC;AAC7G,cAAI,CAAC,GAAI,MAAK,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG,0CAA0C;AAAA,QACzF,WAAW,EAAE,WAAW,aAAa;AACnC,gBAAM,QAAQ,MAAM,QAAQ,EAAE,CAAC,IAAK,EAAE,IAAkB,CAAC;AACzD,gBAAM,KAAK,MAAM,WAAW,IAAI,MAAM,UAAU,IAAI,IAAI,KAAK,EAAE,SAAS,MAAM,UAAU,MAAM,MAAM,OAAK,OAAO,MAAM,YAAY,MAAM,IAAI,CAAC,CAAC;AAC9I,cAAI,CAAC,GAAI,MAAK,KAAK,cAAc,EAAE,EAAE,sBAAsB,EAAE,CAAC,qCAAqC;AAAA,QACrG,WAAW,EAAE,WAAW,YAAY,EAAE,SAAS,YAAY;AACzD,cAAI,CAAC,MAAM,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,OAAK,OAAO,MAAM,QAAQ,EAAG,MAAK,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG,uCAAuC;AAAA,mBACrI,OAAO,IAAI,SAAS,UAAU;AACrC,kBAAM,WAAW,IAAI,UAAU,IAAI,IAAI,QAAQ,OAAO,CAAC,GAAG,SAAS,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAIA,aAAY,GAAG;AAC5G,gBAAI,EAAE,EAAE,WAAW,SAAU,MAAK,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG,wBAAwB,QAAQ,iBAAiB,EAAE,EAAE,MAAM,EAAE;AAAA,UAChI,WAAW,IAAK,MAAK,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG,mDAAmD;AAAA,QACzG,WAAW,OAAO,EAAE,MAAM,SAAU,MAAK,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG,wBAAwB;AAAA,iBACvF,UAAU,UAAa,KAAK,IAAI,EAAE,CAAC,IAAI,MAAO,MAAK,KAAK,cAAc,EAAE,EAAE,KAAK,GAAG,WAAW,EAAE,CAAC,mBAAmB,KAAK,KAAK,KAAK,GAAG;AAC9I,eAAO,EAAE;AAAA,MACX;AAAA,IACF;AACA,eAAW,KAAK,EAAE,QAAQ;AACxB,UAAI,EAAE,IAAI,EAAE,SAAU,MAAK,KAAK,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,oBAAoB;AAAA,IAC3F;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,MAAM,OAA6B;AACjD,QAAM,MAAM,YAAY,MAAM,KAAK;AACnC,QAAM,OAAO,SAAS,GAAG;AACzB,MAAI,KAAK,OAAQ,OAAM,IAAI,MAAM,6BAA6B,KAAK,KAAK,IAAI,CAAC;AAC7E,SAAO;AACT;;;AE7dA,SAAS,KAAAC,UAAS;AAClB,SAAS,YAAAC,WAAU,aAAAC,YAAW,QAAAC,aAAY;AAC1C,SAAS,WAAAC,UAAS,QAAAC,OAAM,YAAAC,WAAU,kBAAkB;;;ACDpD,SAAS,OAAO,QAAQ,IAAI,iBAAiB;AAC7C,SAAS,UAAU,SAAS,YAAY;AAExC,IAAI,SAAS;AASb,eAAsB,UAAU,MAAc,MAAsC;AAClF,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,MAAM,KAAK,KAAK,IAAI,SAAS,IAAI,CAAC,IAAI,QAAQ,GAAG,KAAK,UAAU,SAAS,EAAE,CAAC,MAAM;AACxF,MAAI;AACF,UAAM,UAAU,KAAK,IAAI;AACzB,UAAM,OAAO,KAAK,IAAI;AAAA,EACxB,SAAS,GAAG;AACV,UAAM,GAAG,KAAK,EAAE,OAAO,KAAK,CAAC;AAC7B,UAAM;AAAA,EACR;AACF;AAEO,IAAM,WAAW,CAAC,MAAc,UAAmB,UAAU,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;;;ACjCxG,SAAS,yBAAyB;AAClC,SAAS,eAAe;AAExB,IAAM,UAAU,oBAAI,IAA2B;AAC/C,IAAM,SAAS,IAAI,kBAA+B;AAGlD,eAAsB,aAAgB,MAAc,IAAkC;AACpF,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,OAAO,OAAO,SAAS;AAC7B,MAAI,MAAM,IAAI,GAAG,EAAG,QAAO,GAAG;AAC9B,QAAM,WAAW,QAAQ,IAAI,GAAG,KAAK,QAAQ,QAAQ;AACrD,MAAI;AACJ,QAAM,OAAO,IAAI,QAAc,OAAK;AAAE,cAAU;AAAA,EAAG,CAAC;AACpD,UAAQ,IAAI,KAAK,IAAI;AACrB,QAAM;AACN,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,IAAI,GAAG;AACb,MAAI;AAAE,WAAO,MAAM,OAAO,IAAI,OAAO,EAAE;AAAA,EAAG,UAC1C;AACE,UAAM,OAAO,GAAG;AAChB,YAAQ;AACR,QAAI,QAAQ,IAAI,GAAG,MAAM,KAAM,SAAQ,OAAO,GAAG;AAAA,EACnD;AACF;;;ACdA,IAAMC,OAAM,KAAK,KAAK;AAMtB,IAAM,QAA+C;AAAA,EACnD,QAAQ,OAAK;AAAA,EACb,MAAM,MAAM;AAAA,EACZ,SAAS,OAAK,IAAI;AAAA,EAClB,UAAU,OAAK,KAAK,IAAI,MAAM,IAAI;AAAA,EAClC,aAAa,OAAM,IAAI,MAAM,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI;AAAA,EACjE,cAAc,OAAK,IAAI,IAAI,KAAK,KAAK,KAAK,MAAM,IAAI;AAAA,EACpD,UAAU,OAAK,IAAI,WAAW,IAAI,MAAM,IAAI,WAAW,IAAI,MAAM;AAAA,EACjE,aAAa,OACX,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,MAAM,KAAK,KAAK,KAAK,IAAI,KAAK,SAAU,IAAI,KAAK,KAAM,EAAE,IAAI;AACnG;AAOA,IAAM,kBAAkB;AACxB,SAAS,OAAO,IAAY,IAAY,IAAY,IAAY;AAC9D,QAAM,KAAe,CAAC,CAAC,GAAG,KAAe,CAAC,CAAC;AAC3C,WAAS,IAAI,GAAG,KAAK,iBAAiB,KAAK;AACzC,UAAM,IAAI,IAAI,iBAAiB,IAAI,IAAI;AACvC,OAAG,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;AAC3D,OAAG,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;AAAA,EAC7D;AACA,SAAO,CAAC,MAAc;AACpB,QAAI,KAAK,EAAG,QAAO;AACnB,aAAS,IAAI,GAAG,KAAK,iBAAiB,KAAK;AACzC,UAAI,GAAG,CAAC,KAAK,GAAG;AACd,cAAM,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;AAC7B,eAAO,GAAG,IAAI,CAAC,KAAK,OAAO,KAAM,IAAI,GAAG,IAAI,CAAC,KAAK,QAAS,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK;AAAA,MAClF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEA,IAAM,YAAY,oBAAI,IAAmC;AAClD,SAAS,KAAK,MAAuC;AAC1D,MAAI,OAAO,SAAS,SAAU,QAAO,MAAM,IAAI;AAC/C,QAAM,MAAM,KAAK,OAAO,KAAK,GAAG;AAChC,MAAI,IAAI,UAAU,IAAI,GAAG;AACzB,MAAI,CAAC,EAAG,WAAU,IAAI,KAAM,IAAI,OAAO,GAAG,KAAK,MAAM,CAAE;AACvD,SAAO;AACT;AAOO,IAAM,KAAK,CAAC,QAAgB,IAAY,SAAiB,GAAG,MAAM,IAAI,EAAE,IAAI,IAAI;AAGvF,SAAS,YAAY,OAAc,GAAW,GAAW,WAA+B,MAAuB;AAC7G,QAAM,IAAI,MAAM,MAAM,IAAI,EAAE;AAC5B,QAAM,IAAI,CAACC,OAAc,cAAc,SAAY,EAAEA,EAAC,EAAE,IAAe,EAAEA,EAAC,EAAE,EAAe,SAAS;AACpG,QAAM,IAAI,CAACA,OAAc,EAAEA,KAAI,CAAC,EAAE,IAAI,EAAEA,EAAC,EAAE;AAC3C,QAAM,IAAI,CAACA,QAAe,EAAEA,KAAI,CAAC,IAAI,EAAEA,EAAC,KAAK,EAAEA,EAAC;AAChD,QAAM,WAAW,CAAC,GAAW,GAAW,IAAY,OAAe,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI,MAAM;AACzI,QAAM,UAAU,CAACA,OAAsB;AACrC,QAAIA,OAAM,KAAKA,OAAM,IAAI,GAAG;AAC1B,UAAI,QAAQ,IAAI,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,UAAU,EAAE,IAAI,CAAC,EAAE,SAAS;AAClF,eAAO,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAChD,aAAO;AAAA,IACT;AACA,QAAI,EAAEA,KAAI,CAAC,EAAE,SAAS,UAAU,EAAEA,EAAC,EAAE,SAAS,OAAQ,QAAO;AAC7D,WAAO,SAAS,EAAEA,KAAI,CAAC,GAAG,EAAEA,EAAC,GAAG,EAAEA,KAAI,CAAC,GAAG,EAAEA,EAAC,CAAC;AAAA,EAChD;AACA,QAAM,KAAK,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,GAAG,KAAK,KAAK;AACrD,UAAQ,IAAI,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE,CAAC,IAAI,QAAQ,CAAC,KACrE,KAAK,KAAK,IAAI,MAAM,EAAE,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC,IAAI,QAAQ,IAAI,CAAC;AACtE;AAEO,SAAS,OAAO,OAAc,GAAW,OAAO,OAAY;AACjE,QAAM,OAAO,MAAM;AACnB,MAAI,KAAK,KAAK,CAAC,EAAE,EAAG,QAAO,KAAK,CAAC,EAAE;AACnC,QAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,MAAI,KAAK,KAAK,EAAG,QAAO,KAAK;AAC7B,MAAI,IAAI;AACR,SAAO,KAAK,IAAI,CAAC,EAAE,KAAK,EAAG;AAC3B,QAAM,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;AACjC,MAAI,EAAE,SAAS,OAAQ,QAAO,EAAE;AAChC,MAAI,OAAO,EAAE,MAAM,YAAY,OAAO,EAAE,MAAM,UAAU;AACtD,QAAI,MAAM,kBAAkB,QAAS,QAAO,YAAY,OAAO,GAAG,GAAG,QAAW,IAAI;AACpF,UAAM,IAAI,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;AAC9C,WAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;AAAA,EAC7B;AACA,MAAI,MAAM,QAAQ,EAAE,CAAC,KAAK,MAAM,QAAQ,EAAE,CAAC,KAAK,OAAO,EAAE,EAAE,CAAC,MAAM,UAAU;AAC1E,QAAI,MAAM,kBAAkB,QAAS,QAAQ,EAAE,EAAe,IAAI,CAAC,GAAGA,OAAM,YAAY,OAAO,GAAG,GAAGA,IAAG,IAAI,CAAC;AAC7G,UAAM,IAAI,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,GAAe,KAAK,EAAE;AAC9E,WAAO,GAAG,IAAI,CAAC,GAAG,MAAM,MAAM,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC;AAAA,EACpD;AACA,SAAO,EAAE;AACX;AAEO,SAAS,OAAO,MAAiB,GAAW,MAAY,oBAAI,IAAI,GAAS;AAC9E,aAAW,MAAM,KAAK,OAAQ,KAAI,IAAI,GAAG,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,IAAI,GAAG,KAAK,QAAQ,GAAG,KAAK,CAAC,EAAE,MAAM,KAAK,GAAG,KAAK,GAAG,EAAE,EAAG,MAAM,KAAK,QAAQ,CAAC;AAC1J,SAAO;AACT;AAGO,SAAS,WAAW,MAAY,IAAU,GAAW,QAAoC;AAC9F,MAAI,KAAK,EAAG,QAAO,IAAI,IAAI,EAAE;AAC7B,QAAM,MAAY,oBAAI,IAAI;AAC1B,aAAW,KAAK,oBAAI,IAAI,CAAC,GAAG,KAAK,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG;AACvD,UAAM,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAK,OAAO,CAAC;AAC/C,UAAM,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAK,OAAO,CAAC;AAC7C,QAAI,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG;AAChD,YAAM,SAAS,OAAO,QAAQ,WAAW,MAAO,OAAO,CAAC;AACxD,UAAI,IAAI,GAAG,KAAK,SAAS,KAAK,CAAC;AAAA,IACjC,WAAW,MAAM,QAAQ,CAAC,KAAK,OAAO,EAAE,CAAC,MAAM,UAAU;AACvD,YAAM,KAAK,GAAe,KAAM,MAAM,QAAQ,GAAG,KAAK,OAAO,IAAI,CAAC,MAAM,WAAW,MAAM,GAAG,IAAI,MAAM,CAAC;AACvG,UAAI,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,MAAM,MAAM,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,IACzD,WAAW,MAAM,QAAQ,GAAG,KAAK,OAAO,IAAI,CAAC,MAAM,YAAY,OAAO,MAAM,UAAU;AACpF,UAAI,IAAI,GAAI,IAAiB,IAAI,OAAK,IAAI,CAAC,CAAC;AAAA,IAC9C,MAAO,KAAI,IAAI,GAAG,KAAK,IAAI;AAAA,EAC7B;AACA,SAAO;AACT;AAGO,SAAS,UAAU,KAAkB,KAAkB;AAC5D,QAAM,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,MAAM,GAAG;AACxC,MAAI,WAAW,OAAQ,QAAQ,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,EAAG,UAAqC,IAAI;AAC1G,MAAI,WAAW,QAAQ;AACrB,UAAM,IAAI,IAAI,MAAM,KAAK,CAAAC,OAAKA,GAAE,OAAO,EAAE;AACzC,QAAI,SAAS,QAAS,QAAO,aAAa,EAAE,KAAK;AACjD,WAAQ,EAAqC,IAAI;AAAA,EACnD;AACA,MAAI,WAAW,QAAQ,WAAW,eAAe,WAAW,QAAQ;AAClE,UAAM,IAAK,IAAI,MAAM,EAAuB,KAAK,CAAAC,OAAKA,GAAE,OAAO,EAAE;AACjE,UAAM,IAAI,IAAI,IAAI;AAClB,WAAO,OAAO,MAAM,YAAa,IAAI,IAAI,IAAO,KAAgB;AAAA,EAClE;AACA,MAAI,WAAW,YAAa,QAAO,IAAI,MAAM,IAAI,OAAK,EAAE,EAAE;AAC1D,SAAO;AACT;AAGO,IAAM,eAAe,CAAC,MAAwB,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,OAAK,SAAS,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG;AAG7G,SAAS,aAAa,MAAY,cAA0D;AACjG,MAAI;AACJ,QAAM,SAAS,UAAU,YAAY;AACrC,aAAW,CAAC,GAAG,CAAC,KAAK;AACnB,QAAI,EAAE,WAAW,MAAM,KAAK,OAAO,MAAM,SAAU,EAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,MAAM,CAAC,IAAI;AAC5F,SAAO;AACT;AAOO,SAAS,SAAS,GAAW,GAAW,aAAqB,IAAY,IAAY,SAAS,GAAG,SAAS,GAAW;AAC1H,QAAM,MAAM,cAAc,UAAUH,MAAK,MAAM,cAAc,KAAK,UAAUA;AAC5E,SAAO,EAAE,GAAG,KAAK,IAAI,EAAE,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE;AAChH;AAGO,SAAS,IAAI,GAAW,GAAmB;AAChD,SAAO;AAAA,IACL,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,IAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,IACjD,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,IAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,IACjD,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;AAAA,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;AAAA,EACtE;AACF;AAEO,IAAM,QAAQ,CAAC,GAAW,GAAW,MAAgC,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE;AAExH,SAAS,OAAO,GAAmB;AACxC,QAAM,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK;AACrC,QAAM,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI;AAC/D,SAAO,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,IAAI;AAC9E;AAGO,IAAM,aAAa,CAAC,MAAc,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,IAAIA;AAQzD,SAAS,UAAU,GAAoF;AAC5G,SAAO,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,OAAO,WAAW,CAAC,GAAG,QAAQ,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE;AAC9G;AAEA,IAAM,MAAM,CAAC,MAAY,KAAa,SAAiB;AAAE,QAAM,IAAI,KAAK,IAAI,GAAG;AAAG,SAAO,OAAO,MAAM,WAAW,IAAI;AAAM;AAkB3H,IAAM,YAAY,oBAAI,QAAwC;AAC9D,SAAS,OAAO,KAAkB,IAAkB;AAClD,MAAI,MAAM,UAAU,IAAI,GAAG;AAC3B,MAAI,CAAC,IAAK,WAAU,IAAI,KAAM,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,CAAAI,OAAK,CAACA,GAAE,IAAIA,EAAC,CAAC,CAAC,CAAE;AAC3E,QAAM,IAAI,IAAI,IAAI,EAAE;AACpB,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,iBAAiB,EAAE,GAAG;AAC9C,SAAO;AACT;AAGO,SAAS,YAAY,MAAY,GAA6B,QAAoC;AACvG,QAAM,QAAQ,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;AACnF,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,KAAK,YAAY,SAAU,QAAO,IAAI,QAAQ,KAAK;AACvD,QAAM,CAAC,IAAI,EAAE,IAAI,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC;AACvC,SAAO,EAAE,GAAG,IAAI,sBAAsB,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,IAAI,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG;AAC3F;AAGA,IAAM,aAAa,oBAAI,QAA6B;AAC7C,SAAS,UAAU,KAA0B;AAClD,MAAI,QAAQ,WAAW,IAAI,GAAG;AAC9B,MAAI,MAAO,QAAO;AAClB,UAAQ,CAAC;AACT,QAAM,UAAU,oBAAI,IAAY;AAChC,SAAO,MAAM,SAAS,IAAI,MAAM,QAAQ;AACtC,QAAI,aAAa;AACjB,eAAW,KAAK,IAAI,MAAO,KAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,UAAU,QAAQ,IAAI,EAAE,MAAM,IAAI;AAAE,cAAQ,IAAI,EAAE,EAAE;AAAG,YAAM,KAAK,CAAC;AAAG,mBAAa;AAAA,IAAM;AAClJ,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,4BAA4B;AAAA,EAC/D;AACA,aAAW,IAAI,KAAK,KAAK;AACzB,SAAO;AACT;AAEA,IAAM,UAAU,CAAC,KAAkB,MAAY,MAAsC;AACnF,QAAM,IAAI,EAAE,WAAW,KAAK,EAAE;AAC9B,SAAO;AAAA,IACL,GAAG,IAAI,MAAM,GAAG,QAAQ,IAAI,GAAG,GAAG,EAAE,CAAC;AAAA,IAAG,GAAG,IAAI,MAAM,GAAG,QAAQ,IAAI,GAAG,GAAG,EAAE,CAAC;AAAA,IAC7E,UAAU,IAAI,MAAM,GAAG,QAAQ,IAAI,UAAU,GAAG,EAAE,QAAQ;AAAA,IAC1D,QAAQ,IAAI,MAAM,GAAG,QAAQ,IAAI,QAAQ,GAAG,EAAE,MAAM;AAAA,IAAG,QAAQ,IAAI,MAAM,GAAG,QAAQ,IAAI,QAAQ,GAAG,EAAE,MAAM;AAAA,IAC3G,QAAQ,IAAI,MAAM,GAAG,QAAQ,IAAI,QAAQ,GAAG,EAAE,MAAM;AAAA,IAAG,QAAQ,IAAI,MAAM,GAAG,QAAQ,IAAI,QAAQ,GAAG,EAAE,MAAM;AAAA,EAC7G;AACF;AAGA,SAAS,cAAc,MAAgBC,OAAc;AACnD,QAAM,MAAM,KAAK;AACjB,QAAM,OAAO,oBAAI,IAAoB;AACrC,aAAW,KAAK,IAAI,MAAO,KAAI,EAAE,OAAQ,EAAC,KAAK,IAAI,EAAE,MAAM,KAAK,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAI,KAAK,CAAC;AAC7G,QAAM,QAAQ,CAACA,KAAI;AACnB,SAAO,MAAM,QAAQ;AACnB,UAAM,KAAK,MAAM,IAAI,GAAI,IAAI,OAAO,KAAK,EAAE,GAAG,KAAK,KAAK,MAAM,IAAI,EAAE;AACpE,OAAG,QAAQ,YAAY,GAAG,IAAI,EAAE,SAAS,KAAK,MAAM,IAAI,EAAE,MAAM,EAAG,QAAQ,MAAS;AACpF,eAAW,KAAK,KAAK,IAAI,EAAE,KAAK,CAAC,EAAG,OAAM,KAAK,EAAE,EAAE;AAAA,EACrD;AACF;AAGO,SAAS,SAAS,KAAkB,MAAsB;AAC/D,QAAM,OAAiB,EAAE,KAAK,MAAM,OAAO,oBAAI,IAAI,GAAG,YAAY,oBAAI,IAAI,EAAE;AAC5E,aAAW,KAAK,UAAU,GAAG,GAAG;AAC9B,UAAM,IAAI,QAAQ,KAAK,MAAM,CAAC;AAC9B,UAAM,QAAQ,YAAY,GAAG,GAAG,EAAE,SAAS,KAAK,MAAM,IAAI,EAAE,MAAM,EAAG,QAAQ,MAAS;AACtF,SAAK,MAAM,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAAC;AAAA,EACtC;AACA,QAAM,cAAc,IAAI,IAAI,IAAI,YAAY,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/D,aAAW,KAAK,IAAI,OAAO;AACzB,UAAM,IAAI,KAAK,IAAI,GAAG,QAAQ,EAAE,IAAI,YAAY,CAAC;AACjD,UAAM,KAAK,MAAM,SAAY,EAAE,aAAc;AAC7C,SAAK,WAAW,IAAI,EAAE,IAAI,KAAK,YAAY,IAAI,EAAE,KAAK,OAAO,IAAI;AAAA,EACnE;AAEA,QAAM,MAAsH;AAAA,IAC1H,GAAG,IAAI,GAAG,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,MAAM,MAAe,EAAE,EAAE;AAAA,IAC/D,GAAG,IAAI,UAAU,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,MAAM,aAAsB,EAAE,EAAE;AAAA,IAC7E,GAAG,IAAI,KAAK,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,MAAM,QAAiB,EAAE,EAAE;AAAA,EACrE,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAClC,aAAW,EAAE,MAAM,EAAE,KAAK,KAAK;AAC7B,QAAI,SAAS,KAAM,SAAQ,MAAM,CAAiB;AAAA,aACzC,SAAS,YAAa,0BAAyB,MAAM,CAAwB;AAAA,QACjF,qBAAoB,MAAM,CAAmB;AAAA,EACpD;AACA,SAAO;AACT;AAcA,IAAM,OAAO,CAAC,MAAgB,MAAc,IAAY,MAAc,SACpE,IAAI,KAAK,MAAM,GAAG,MAAM,IAAI,IAAI,GAAG,OAAO,SAAS,YAAa,OAAO,IAAI,IAAK,IAAI;AAStF,IAAM,WAAmB,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE;AAChE,IAAM,UAAU,CAAC,MAAe,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK;AAOjG,SAAS,MAAM,MAAgB,QAAgB,IAAY,IAAY,KAAa,WAAW,OAAO,UAAU,OAAO,UAAU,OAAO;AACtI,QAAM,IAAI,OAAO,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,MAAM,IAAI,MAAM;AAC9D,QAAM,SAAS,EAAE,SAAS,KAAK,MAAM,IAAI,EAAE,MAAM,EAAG,QAAQ;AAC5D,MAAI,IAAY;AAChB,MAAI,UAAU,EAAE,YAAY,mBAAmB;AAAE,SAAK,KAAK,GAAG,MAAM;AAAI,SAAK,KAAK,GAAG,MAAM;AAAA,EAAI,OAC1F;AACH,UAAM,CAAC,IAAI,EAAE,IAAI,SAAS,MAAM,OAAO,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACjE,SAAK,KAAK,GAAG;AAAG,SAAK,KAAK,GAAG;AAAA,EAC/B;AACA,MAAI,IAAI,KAAK,MAAM,IAAI,EAAE,IAAIC,OAAM,GAAG,SAAS,GAAG;AAClD,MAAI,GAAG,SAAS,EAAG,MAAK;AACxB,MAAI,SAAS,CAAC;AACd,MAAI,KAAK,GAAG,QAAQ,KAAK,GAAG;AAC5B,MAAI,YAAY,SAAS;AACvB,UAAM,MAAM,EAAE,SAAS;AACvB,QAAI,MAAM,MAAQ;AAChB,YAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,UAAK,YAAY,KAAK,MAAM,OAAS,WAAW,KAAK,MAAM,KAAM;AAAE,cAAM,KAAK,KAAK,KAAK,EAAE,IAAI,MAAM,KAAK,MAAM;AAAG,cAAM;AAAG,YAAI,QAAS,OAAM;AAAA,MAAG;AAAA,IACnJ;AAAA,EACF;AACA,KAAG,YAAY,IAAI;AAAK,KAAG,SAAS;AAAI,KAAG,SAAS;AACpD,gBAAc,MAAM,MAAM;AAC5B;AAEA,IAAM,WAAW,CAAC,UAAoB,MAAM,OAAO,MAAO,OAAO,MAAO;AAGxE,SAAS,YAAY,MAAgB,GAAiB,IAAY,IAAY,KAAa;AACzF,QAAM,UAAU,EAAE,MAAM,IAAI,SAAO,EAAE,GAAG,KAAK,MAAM,IAAI,EAAE,EAAG,EAAE;AAC9D,QAAM,OAAO,EAAE,MAAM,GAAG,EAAE,GAAI,MAAM,OAAO,KAAK,KAAK,IAAI,EAAE;AAC3D,QAAM,MAAM,MAAM,MAAM,KAAK,MAAM,IAAI,IAAI,EAAG,OAAO,KAAK,CAAC;AAC3D,QAAM,YAAY,EAAE,aAAa;AAEjC,QAAMC,QAAO,KAAK,MAAM,IAAI,EAAE,MAAM,CAAC,CAAC,EAAG,OAAO,MAAM,IAAI;AAC1D,MAAI,KAAK,KAAK,IAAI,CAAC,IAAIA,MAAK,OAAO,KAAKA,MAAK,OAAO,IAAI,CAAC,IAAIA,MAAK,OAAO,KAAKA,MAAK,GAAG,IAAI,QAAQ,KAAK,MAAM,KAAKA,MAAK,IAAI,KAAKA,MAAK,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,IAAIA,MAAK,IAAI,IAAI,CAAC,IAAIA,MAAK,EAAE,IAAI,WAAW;AACrM,SAAK,MAAM,IAAI,IAAI,EAAG,YAAY,KAAK,MAAM,MAAM,EAAE,IAAI,gBAAgB,EAAE,YAAY,IAAI,MAAM,IAAI;AACrG,kBAAc,MAAM,IAAI;AAAA,EAC1B;AACA,WAAS,OAAO,GAAG,QAAQ,EAAE,cAAc,MAAM,QAAQ;AACvD,UAAM,IAAI,IAAI;AACd,QAAI,KAAK,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,UAAW;AACnD,aAAS,IAAI,EAAE,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC5C,YAAM,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,OAAO,KAAK,KAAK,EAAE,GAAG,KAAK,KAAK,MAAM,IAAI,EAAE,GAAI,IAAI,GAAG,OAAOC,KAAI,IAAI;AACjG,YAAM,QAAQ,QAAQ,KAAK,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,EAAE,IAAI,KAAK,MAAMA,GAAE,CAAC,IAAI,EAAE,IAAIA,GAAE,CAAC,IAAI,EAAE,EAAE,CAAC;AAC7F,YAAM,MAAM,KAAK,IAAI,KAAK,GAAG,MAAM,KAAK,IAAI,KAAK;AACjD,wBAAkB,MAAM,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,EAAE,CAAC;AAAA,IACjJ;AAAA,EACF;AACA,MAAI,MAAM,GAAG;AACX,MAAE,MAAM,QAAQ,CAAC,IAAI,MAAM;AACzB,YAAM,KAAK,KAAK,MAAM,IAAI,EAAE,GAAI,OAAO,QAAQ,CAAC;AAChD,iBAAW,KAAK,CAAC,YAAY,UAAU,QAAQ,EAAY,IAAG,CAAC,IAAI,KAAK,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;AACzG,iBAAW,KAAK,CAAC,KAAK,KAAK,UAAU,QAAQ,EAAY,IAAG,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK;AAAA,IACjG,CAAC;AACD,kBAAc,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,EAChC;AACF;AASA,SAAS,QAAQ,MAAgB,GAAiB;AAChD,QAAM,MAAM,KAAK,MAAM,MAAM,EAAE,IAAI,OAAO,EAAE,GAAG;AAC/C,MAAI,OAAO,EAAG;AACd,QAAM,SAAS,KAAK,MAAM,IAAI,EAAE,MAAM,EAAG;AACzC,MAAI,EAAE,MAAM,SAAS,GAAG;AAAE,gBAAY,MAAM,GAAG,OAAO,IAAI,OAAO,IAAI,GAAG;AAAG;AAAA,EAAQ;AACnF,QAAM,UAAU,KAAK,MAAM,MAAM,EAAE,IAAI,gBAAgB,EAAE,YAAY,IAAI,MAAM,IAAI;AACnF,QAAM,WAAW,KAAK,MAAM,MAAM,EAAE,IAAI,YAAY,EAAE,QAAQ,IAAI,KAAK,UAAU,KAAK,MAAM,MAAM,EAAE,IAAI,WAAW,EAAE,OAAO,IAAI;AAChI,MAAI,WAAW,KAAK,MAAM,MAAM,EAAE,IAAI,YAAY,EAAE,QAAQ;AAC5D,MAAI,EAAE,MAAM,WAAW,GAAG;AAAE,UAAM,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,IAAI,OAAO,IAAI,KAAK,UAAU,SAAS,EAAE,OAAO;AAAG;AAAA,EAAQ;AACtH,QAAM,CAAC,KAAK,GAAG,IAAI,EAAE;AACrB,QAAM,aAAa,OAAO,KAAK,KAAK,GAAG,GAAG,YAAY,OAAO,KAAK,KAAK,GAAG;AAC1E,QAAM,IAAI,KAAK,MAAM,IAAI,GAAG,GAAI,KAAK,KAAK,MAAM,IAAI,GAAG;AACvD,QAAM,KAAK,EAAE,GAAG,KAAK,EAAE;AACvB,MAAI,MAAM,EAAE,QAAQ,MAAM,EAAE,QAAQ,MAAM,GAAG,QAAQ,KAAK,KAAK,KAAK;AACpE,MAAI,MAAM,GAAG,MAAM,GAAG,KAAK;AAC3B,MAAI,MAAM,GAAG;AAAE,UAAM,CAAC;AAAK,UAAM;AAAK,SAAK;AAAA,EAAI;AAC/C,MAAI,MAAM,GAAG;AAAE,UAAM,CAAC;AAAK,SAAK,CAAC;AAAA,EAAI;AACrC,MAAI,MAAM,GAAG;AAAE,UAAM,CAAC;AAAK,UAAM;AAAA,EAAK;AACtC,QAAM,UAAU,KAAK,IAAI,MAAM,GAAG,KAAK;AACvC,QAAM,KAAK,GAAG,GAAG,KAAK,CAAC,WAAW,UAAU,IAAI,GAAG;AACnD,QAAM,CAAC,KAAK,GAAG,IAAI,MAAM,EAAE,OAAO,IAAI,EAAE;AACxC,QAAM,QAAQ,OAAO,WAAW,SAAS,KAAK,MAAM,IAAI,WAAW,MAAM,EAAG,QAAQ,QAAQ;AAC5F,QAAM,CAAC,KAAK,GAAG,IAAI,MAAM,OAAO,KAAK,GAAG;AACxC,QAAM,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,EAAE;AAC1D,MAAI,KAAK,UAAU,SAAS;AAC5B,MAAI,KAAK,MAAQ;AACf,UAAM,MAAM,KAAK,OAAO,IAAI,OAAO,IAAI,KAAK,OAAO,SAAS,KAAK;AACjE,OAAG,IAAI;AAAI,OAAG,IAAI;AAAI,OAAG,WAAW;AACpC,kBAAc,MAAM,GAAG;AACvB;AAAA,EACF;AACA,QAAM,CAAC,KAAK,GAAG,IAAI,MAAM,OAAO,OAAO,IAAI,OAAO,EAAE;AACpD,MAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,KAAK;AACtD,MAAI,aAAa,GAAG;AAClB,gBAAY,OAAO,MAAM,KAAK;AAC9B,UAAM,KAAK,KAAK,KAAK,EAAE,GAAG,KAAK,KAAK,KAAK,KAAK,MAAM;AACpD,QAAI,KAAK,GAAG;AACV,UAAI,IAAI,KAAK,IAAI,GAAG,MAAM,WAAW,EAAE,IAAI;AAC3C,WAAK,KAAK,YAAY,IAAI,IAAI,MAAM;AACpC,YAAM,IAAI;AAAI,YAAM,IAAI;AAAI,WAAK,KAAK,KAAK,KAAK;AAAA,IAClD;AAAA,EACF;AACA,MAAI,IAAY;AAChB,MAAI,SAAS;AACX,UAAM;AACN,QAAI,OAAO,KAAK,KAAK,KAAK,KAAK,OAAO,IAAI,KAAK;AAC/C,QAAI,MAAM,IAAI;AAAE,YAAM;AAAI,WAAK,KAAK,KAAK;AAAA,IAAS,WACzC,MAAM,GAAG;AAChB,YAAM;AAAG,WAAK;AACd,UAAI,SAAS;AAAE,cAAM,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,MAAM,KAAK,MAAM;AAAG,cAAM;AAAG,YAAI,EAAE,QAAS,OAAM;AAAA,MAAG;AAAA,IACvG,MAAO,MAAK,KAAK,KAAK,GAAG,IAAI;AAC7B,UAAM,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,EAAE;AAC7C,SAAK,KAAK,MAAM,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC;AAAA,EAClD,OAAO;AAEL,UAAM,IAAI,MAAM,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,IAAI,EAAE;AAChF,UAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK;AAC1E,UAAM,OAAO,KAAK,KAAK,IAAI,KAAK;AAChC,QAAI,SAAS;AACb,SAAK,KAAK;AACV,QAAI,QAAQ,GAAG;AACb,UAAI,IAAI,KAAK,KAAK,IAAI;AACtB,UAAI,KAAK,EAAG,KAAI,CAAC;AACjB,UAAI,EAAE,KAAK,KAAK;AAChB,YAAM,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI;AACzF,UAAI,MAAM,GAAG;AACX,cAAM,IAAI,KAAK,KAAK,EAAE,IAAI;AAC1B,aAAK,KAAK,KAAK,MAAM,GAAG,CAAC;AACzB,aAAK,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,GAAG;AACvC,iBAAS;AAAA,MACX;AAAA,IACF;AACA,QAAI,CAAC,QAAQ;AACX,UAAI,WAAW,KAAK,IAAI,OAAO,KAAK,GAAG,UAAU,OAAO,MAAM,OAAO,GAAG,WAAW,GAAG,OAAO,KAAK,GAAG,UAAU,OAAO,MAAM,OAAO;AACnI,YAAM,IAAI,CAAC,IAAI,MAAM,KAAK;AAC1B,UAAI,KAAK,MAAM,KAAK,GAAG;AACrB,cAAM,MAAM,KAAK,KAAK,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,GAAG,OAAO,IAAI,IAAI,IAAI;AAChG,YAAI,OAAO,SAAS;AAAE,qBAAW;AAAK,oBAAU;AAAM,iBAAO;AAAG,iBAAO;AAAA,QAAG;AAC1E,YAAI,OAAO,SAAS;AAAE,qBAAW;AAAK,oBAAU;AAAM,iBAAO;AAAG,iBAAO;AAAA,QAAG;AAAA,MAC5E;AACA,UAAI,OAAO,UAAU,WAAW,KAAK;AAAE,aAAK,KAAK,KAAK,MAAM,OAAO,SAAS,IAAI;AAAG,aAAK,WAAW;AAAA,MAAS,OACvG;AAAE,aAAK,KAAK,KAAK,MAAM,OAAO,SAAS,IAAI;AAAG,aAAK,WAAW;AAAA,MAAS;AAAA,IAC9E;AAAA,EACF;AACA,QAAM,KAAK,KAAK,MAAM,IAAI,EAAE,IAAI;AAChC,QAAM,KAAK,UAAU,KAAK,MAAMF,OAAM,MAAM,EAAE,QAAQ;AACtD,QAAM,KAAK,WAAW,KAAK,MAAMA,OAAM,GAAG,UAAU,KAAK,MAAM,GAAG,QAAQ;AAC1E,IAAE,YAAY,KAAK;AAAK,IAAE,SAAS;AAAI,IAAE,SAAS;AAAI,IAAE,SAAS;AAAG,IAAE,SAAS;AAC/E,KAAG,IAAI;AAAI,KAAG,IAAI;AAAI,KAAG,YAAY,KAAK;AAC1C,gBAAc,MAAM,GAAG;AACzB;AAQA,SAAS,yBAAyB,MAAgB,GAAwB;AACxE,QAAM,YAAY,KAAK,MAAM,aAAa,EAAE,IAAI,aAAa,EAAE,SAAS,GAAG,OAAO,KAAK,MAAM,aAAa,EAAE,IAAI,QAAQ,EAAE,IAAI,GAAG,OAAO,KAAK,MAAM,aAAa,EAAE,IAAI,QAAQ,EAAE,IAAI;AACpL,QAAM,YAAY,KAAK,MAAM,aAAa,EAAE,IAAI,aAAa,EAAE,SAAS,GAAG,YAAY,KAAK,MAAM,aAAa,EAAE,IAAI,aAAa,EAAE,SAAS,GAAG,YAAY,KAAK,MAAM,aAAa,EAAE,IAAI,aAAa,EAAE,SAAS;AAClN,MAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,UAAW;AAC5E,MAAI,EAAE,GAAG,GAAG,GAAG,OAAO,YAAY,CAAC,KAAK,KAAK,YAAY,UAAU,UAAU,QAAQ,EAAE,IAAI,OAAK,CAAC,GAAG,KAAK,MAAM,aAAa,EAAE,IAAI,GAAG,EAAE,CAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AACrJ,QAAM,SAAS,KAAK,MAAM,IAAI,EAAE,MAAM,GAAI,KAAK,OAAO;AACtD,QAAM,iBAAiB,EAAE,WAAWA,MAAK,eAAe,EAAE,SAASA;AACnE,aAAW,MAAM,EAAE,OAAO;AACxB,UAAM,IAAI,OAAO,KAAK,KAAK,EAAE,GAAG,KAAK,KAAK,MAAM,IAAI,EAAE;AACtD,QAAI,EAAE,OAAO;AACX,UAAI,EAAE,UAAU;AACd,WAAG,aAAa,OAAO,WAAW,EAAE,YAAY;AAChD,WAAG,MAAM,OAAO,IAAI,EAAE,KAAK;AAAM,WAAG,MAAM,OAAO,IAAI,EAAE,KAAK;AAC5D,WAAG,WAAW,OAAO,SAAS,IAAI,EAAE,UAAU,YAAY;AAC1D,WAAG,WAAW,OAAO,SAAS,IAAI,EAAE,UAAU,YAAY;AAC1D,WAAG,WAAW,OAAO,SAAS,EAAE,UAAU;AAAA,MAC5C,OAAO;AACL,WAAG,aAAa,OAAO,WAAW,GAAG,WAAW,EAAE,YAAY;AAC9D,WAAG,MAAM,OAAO,IAAI,GAAG,IAAI,EAAE,KAAK;AAAM,WAAG,MAAM,OAAO,IAAI,GAAG,IAAI,EAAE,KAAK;AAC1E,YAAI,GAAG,WAAW,EAAG,IAAG,WAAW,OAAO,SAAS,GAAG,SAAS,EAAE,UAAU;AAC3E,YAAI,GAAG,WAAW,EAAG,IAAG,WAAW,OAAO,SAAS,GAAG,SAAS,EAAE,UAAU;AAC3E,WAAG,WAAW,OAAO,SAAS,GAAG,SAAS,EAAE,UAAU;AAAA,MACxD;AACA,oBAAc,MAAM,EAAE;AACtB;AAAA,IACF;AACA,QAAI,IAAY,EAAE,GAAG,GAAG,MAAM;AAC9B,UAAM,YAAY,KAAK,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,GAAW,MAAsB;AACnF,YAAM,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC;AACzC,aAAO,EAAE,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG;AAAA,IACtI;AACA,QAAI,cAAc,GAAG;AACnB,YAAM,IAAI,QAAQ,EAAE,WAAW,YAAY,iBAAiB,YAAY,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc;AAC7G,UAAI,OAAO,GAAG,IAAI,SAAS;AAAA,IAC7B;AACA,QAAI,SAAS,KAAK,SAAS,GAAG;AAC5B,YAAM,CAAC,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE,GAAG,EAAE,CAAC;AACnC,UAAI,EAAE,UAAU;AAAE,UAAE,MAAM,KAAK;AAAM,UAAE,MAAM,KAAK;AAAA,MAAM,OACnD;AAAE,UAAE,OAAO,KAAK,EAAE,MAAM;AAAM,UAAE,OAAO,KAAK,EAAE,MAAM;AAAA,MAAM;AAAA,IACjE;AACA,QAAI,cAAc,GAAG;AACnB,YAAM,KAAK,KAAK,MAAM,GAAG,GAAG,GAAG,CAAC;AAChC,UAAI;AACJ,UAAI,EAAE,SAAU,MAAK,KAAK,IAAI,EAAE,UAAU,YAAY;AAAA,WACjD;AAAE,cAAM,KAAK,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC;AAAG,YAAI,OAAO,IAAI,KAAK,MAAM,KAAK,KAAK,EAAE,UAAU,aAAa;AAAA,MAAI;AACzG,QAAE,KAAK;AAAG,QAAE,KAAK;AAAA,IACnB;AACA,QAAI,cAAc,GAAG;AACnB,YAAM,KAAK,KAAK,MAAM,GAAG,GAAG,GAAG,CAAC;AAChC,UAAI;AACJ,UAAI,EAAE,SAAU,MAAK,KAAK,IAAI,EAAE,UAAU,YAAY;AAAA,WACjD;AAAE,cAAM,KAAK,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC;AAAG,YAAI,OAAO,IAAI,KAAK,MAAM,KAAK,KAAK,EAAE,UAAU,aAAa;AAAA,MAAI;AACzG,QAAE,KAAK;AAAG,QAAE,KAAK;AAAA,IACnB;AACA,QAAI,YAAY,GAAG;AACjB,YAAM,KAAK,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,cAAc,KAAK,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI;AACxE,YAAM,IAAI,EAAE,WACR,MAAM,QAAQ,WAAW,IAAI,KAAK,KAAK,IAAI,gBAAgB,YAC3D,MAAM,QAAQ,eAAe,KAAK,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,gBAAgB;AAC/E,YAAM,MAAM,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC;AAC/B,QAAE,IAAI,KAAK,IAAI,CAAC,IAAI;AAAK,QAAE,IAAI,KAAK,IAAI,CAAC,IAAI;AAAA,IAC/C;AACA,sBAAkB,MAAM,GAAG,IAAI,CAAC;AAAA,EAClC;AACF;AAKO,SAAS,kBAAkB,MAAgB,QAAgB,KAA+B;AAC/F,SAAO,wBAAwB,MAAM,QAAQ,GAAG;AAClD;AAGO,SAAS,WAAWG,cAAqB,QAAiB,SAA2B;AAC1F,QAAMC,cAAa,SAASD,eAAc,IAAIA,eAAc,IAAI;AAChE,SAAOC,eAAc,KAAK,QAAQ,UAAUA,cAAa,QAAQA,cAAa,CAAC,IAAI,QAAQ,QAAQ,SAAS,CAAC,KAAK;AACpH;AAaO,SAAS,WAAW,QAAkB,QAAiB,SAAmB,eAAwB,WAAqB,SAA6D;AACzL,QAAM,IAAI,OAAO,SAAS;AAE1B,QAAMA,cAAa,SAAS,IAAI,IAAI,IAAI,IAAI;AAC5C,MAAIA,cAAa,EAAG,QAAO,UAAU,IAAI,OAAO,EAAE,GAAG,OAAO,CAAC,KAAK,GAAG,GAAG,OAAO,CAAC,KAAK,GAAG,OAAO,EAAE,EAAE;AACnG,QAAM,QAAQ,CAAC,MAAc;AAC3B,UAAM,KAAM,IAAI,IAAI,KAAK,IAAK,GAAG,MAAO,IAAI,IAAI,KAAK,IAAK,GAAG,MAAO,IAAI,IAAI,KAAK,IAAK,GAAG,KAAM,IAAI,IAAI,KAAK,IAAK;AACjH,WAAO,CAAC,OAAO,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,KAAK,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;AAAA,EACpH;AACA,QAAM,UAAU,CAAC,GAAW,MAAc;AACxC,UAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI;AAC3D,WAAO,EAAE,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG;AAAA,EACtK;AACA,QAAM,UAAU,CAAC,GAAW,MAAc;AACxC,UAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI;AAC3D,UAAM,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK;AAC7E,UAAM,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK;AAC7E,WAAO,KAAK,MAAM,IAAI,EAAE,IAAIJ;AAAA,EAC9B;AACA,QAAM,SAAS,CAAC,GAAW,UAAkB;AAC3C,UAAM,MAAgB,CAAC;AAAG,QAAI,MAAM,GAAG,OAAO,QAAQ,GAAG,CAAC;AAC1D,aAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAAE,YAAM,IAAI,QAAQ,GAAG,IAAI,KAAK;AAAG,aAAO,KAAK,MAAM,EAAE,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,CAAC;AAAG,UAAI,KAAK,GAAG;AAAG,aAAO;AAAA,IAAG;AAC5I,WAAO;AAAA,EACT;AACA,QAAM,MAAgB,CAAC;AACvB,MAAI,eAAe;AAAE,QAAI,MAAM;AAAG,aAAS,IAAI,GAAG,IAAII,aAAY,KAAK;AAAE,aAAO,OAAO,GAAG,CAAC,EAAE,CAAC;AAAG,UAAI,KAAK,GAAG;AAAA,IAAG;AAAA,EAAE,MAC7G,UAAS,IAAI,GAAG,IAAIA,aAAY,IAAK,KAAI,KAAK,QAAQ,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;AACrF,QAAM,QAAQ,IAAIA,cAAa,CAAC;AAChC,QAAM,MAAiD,CAAC;AACxD,WAAS,OAAO,WAAW;AACzB,QAAI,QAAS,QAAO;AACpB,QAAI,QAAQ;AACV,UAAI,QAAQ,GAAG;AAAE,eAAO;AAAO,YAAI,MAAM,EAAG,QAAO;AAAA,MAAO,MAAO,OAAM;AAAA,IACzE,WAAW,MAAM,GAAG;AAClB,YAAM,IAAI,KAAK,MAAM,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC;AACjE,UAAI,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,MAAM,KAAK,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,IAAIJ,KAAI,CAAC;AAC/F;AAAA,IACF,WAAW,MAAM,OAAO;AACtB,YAAM,KAAKI,cAAa,IAAI,KAAK,GAAG,IAAIA,cAAa,IAAI,GAAG,IAAI,MAAM;AACtE,YAAM,IAAI,KAAK,MAAM,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC;AACzE,UAAI,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG,GAAG,OAAO,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG,OAAO,IAAIJ,KAAI,CAAC;AAC/F;AAAA,IACF;AACA,QAAI,IAAI;AACR,WAAO,IAAII,cAAa,KAAK,MAAM,IAAI,CAAC,EAAG;AAC3C,UAAM,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI;AACjD,UAAM,IAAI,OAAO,KAAK,MAAM,QAAQ,OAAO;AAC3C,QAAI,IAAI;AACR,QAAI,eAAe;AACjB,YAAM,MAAM,OAAO,GAAG,EAAE,GAAG,SAAS,IAAI,IAAI,CAAC;AAC7C,UAAI,IAAI;AACR,aAAO,IAAI,KAAK,SAAS,IAAI,CAAC,EAAG;AACjC,YAAM,QAAQ,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,IAAI,CAAC,IAAI;AACnD,WAAK,KAAK,QAAQ,KAAK,SAAS,SAAS,QAAQ,MAAM;AAAA,IACzD;AACA,QAAI,KAAK,EAAE,GAAG,QAAQ,GAAG,CAAC,GAAG,OAAO,QAAQ,GAAG,CAAC,EAAE,CAAC;AAAA,EACrD;AACA,SAAO;AACT;AAEA,IAAM,eAAe;AAQrB,SAAS,oBAAoB,MAAgB,GAAmB;AAC9D,QAAM,YAAY,KAAK,MAAM,QAAQ,EAAE,IAAI,aAAa,EAAE,SAAS,GAAG,OAAO,KAAK,MAAM,QAAQ,EAAE,IAAI,QAAQ,EAAE,IAAI,GAAG,OAAO,KAAK,MAAM,QAAQ,EAAE,IAAI,QAAQ,EAAE,IAAI;AACrK,MAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAM;AAClC,QAAM,MAAM,KAAK,WAAW,IAAI,EAAE,MAAM;AACxC,MAAI,CAAC,OAAO,IAAI,SAAS,OAAQ;AACjC,QAAM,SAAS,kBAAkB,MAAM,EAAE,QAAQ,GAAG;AACpD,QAAM,WAAW,KAAK,MAAM,QAAQ,EAAE,IAAI,YAAY,EAAE,QAAQ,GAAG,UAAU,KAAK,MAAM,QAAQ,EAAE,IAAI,WAAW,EAAE,OAAO;AAC1H,QAAM,WAAW,EAAE,eAAe,WAAW,QAAQ,EAAE,eAAe;AACtE,QAAM,QAAQ,EAAE,MAAM,IAAI,SAAO,EAAE,GAAG,OAAO,KAAK,KAAK,EAAE,GAAG,IAAI,KAAK,MAAM,IAAI,EAAE,EAAG,EAAE;AACtF,QAAM,cAAc,WAAW,MAAM,SAAS,MAAM,SAAS;AAE7D,QAAM,SAAS,IAAI,MAAc,WAAW,EAAE,KAAK,CAAC,GAAG,eAAyB,CAAC;AACjF,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,cAAc,GAAG,KAAK;AACxC,UAAM,EAAE,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,cAAc,EAAE;AAC5C,UAAM,MAAM,cAAc,eAAe,IAAI,cAAc,KAAK,MAAM,GAAG,MAAM,GAAG,GAAG,MAAM,CAAC;AAC5F,iBAAa,KAAK,GAAG;AACrB,QAAI,EAAE,gBAAgB,UAAW,QAAO,IAAI,CAAC,IAAI;AAAA,aACxC,cAAc,aAAc,QAAO,IAAI,CAAC,IAAI;AAAA,aAC5C,EAAE,gBAAgB,gBAAgB;AAAE,aAAO,IAAI,CAAC,IAAI;AAAK,aAAO;AAAA,IAAK,MACzE,QAAO,IAAI,CAAC,KAAK,EAAE,gBAAgB,WAAW,cAAc,UAAU,WAAW,MAAM;AAAA,EAC9F;AACA,MAAI,EAAE,gBAAgB,kBAAkB,MAAM,GAAG;AAAE,UAAM,IAAI,cAAc,MAAM;AAAS,aAAS,IAAI,GAAG,IAAI,aAAa,IAAK,QAAO,CAAC,KAAK;AAAA,EAAG;AAChJ,QAAM,QAAQ,mBAAmB,QAAQ,IAAI,QAAQ,IAAI,SAAS,IAAI,aAAa;AACnF,QAAM,aAAa,EAAE,gBAAgB,YAAY,QAAQ,EAAE,gBAAgB,iBAAiB,QAAQ,cAAc;AAClH,MAAI,IAAI,EAAE,iBAAiB,YAAY,WAAW,QAAQ;AAC1D,QAAM,YAAsB,CAAC;AAC7B,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AAAE,SAAK,OAAO,CAAC,IAAI;AAAY,cAAU,KAAK,CAAC;AAAA,EAAG;AACxF,QAAM,UAAU,WAAW,QAAQ,IAAI,QAAQ,IAAI,SAAS,IAAI,eAAe,WAAW,KAAK;AAE/F,QAAM,MAAM,EAAE,aAAa,KAAK,EAAE,eAAe;AACjD,MAAI,iBAAiB,EAAE,WAAWJ;AAClC,MAAI,EAAE,aAAa,GAAG;AACpB,UAAM,OAAO,KAAK,IAAI,MAAM,KAAK,QAAM,GAAG,OAAO,EAAE,MAAM,GAAI,KAAK,KAAK,MAAM,IAAI,KAAK,IAAI,EAAG;AAC7F,QAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,EAAG,kBAAiB,CAAC;AAAA,EACvD;AACA,MAAI,QAAQ,QAAQ,CAAC,EAAE,GAAG,QAAQ,QAAQ,CAAC,EAAE;AAC7C,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,EAAE,GAAG,GAAG,IAAI,MAAM,CAAC;AACzB,QAAI,IAAY,EAAE,GAAG,GAAG,MAAM;AAC9B,MAAE,OAAO,QAAQ,EAAE,MAAM;AACzB,MAAE,OAAO,QAAQ,EAAE,MAAM;AACzB,UAAM,OAAO,QAAQ,IAAI,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,EAAE;AACtD,UAAM,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI;AACzC,QAAI,OAAO;AACT,YAAM,MAAM,aAAa,CAAC;AAC1B,UAAI,QAAQ,GAAG;AAAE,cAAM,KAAK,KAAK,MAAM,IAAI,EAAE,IAAI,MAAM,KAAK,YAAY;AAAG,UAAE,KAAK;AAAG,UAAE,KAAK;AAAA,MAAG;AAAA,IACjG;AACA,YAAQ,KAAK;AAAG,YAAQ,KAAK;AAC7B,QAAI,YAAY,GAAG;AACjB,YAAM,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI;AAC/B,UAAI,KAAK,WAAW,QAAQ,CAAC,EAAE,QAAQ,OAAO,IAAI,CAAC,MAAM,IAAI,KAAK,QAAQ,KAAK,MAAM,IAAI,EAAE,IAAIA,QAAOA;AACtG,WAAK,KAAK,MAAM,IAAI,CAAC;AACrB,UAAI,KAAK;AACP,cAAMK,OAAM,KAAK,IAAI,CAAC,GAAGC,OAAM,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE;AACvD,kBAAU,UAAUD,OAAM,IAAIC,OAAM,MAAM,MAAM;AAChD,kBAAU,UAAUA,OAAM,IAAID,OAAM,MAAM,MAAM;AAAA,MAClD,MAAO,MAAK;AACZ,UAAI,IAAI,KAAK,GAAI,MAAK,IAAI,KAAK;AAAA,eAAa,IAAI,CAAC,KAAK,GAAI,MAAK,IAAI,KAAK;AACxE,WAAK;AACL,YAAM,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC;AACzC,UAAI,EAAE,GAAG,MAAM,IAAI,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,IAAI,GAAG,MAAM,KAAK,MAAM,GAAG,GAAG,MAAM,KAAK,MAAM,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG;AAAA,IACvH;AACA,sBAAkB,MAAM,GAAG,IAAI,CAAC;AAAA,EAClC;AACF;AAGA,SAAS,mBAAmB,QAAkB,QAAiB,SAAmB,eAAgC;AAChH,QAAM,IAAI,OAAO,SAAS,GAAGD,cAAa,SAAS,IAAI,IAAI,IAAI,IAAI;AACnE,MAAIA,cAAa,EAAG,QAAO;AAC3B,MAAI,CAAC,cAAe,QAAO,WAAW,GAAG,QAAQ,OAAO;AACxD,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAIA,aAAY,KAAK;AACnC,UAAM,KAAM,IAAI,IAAI,KAAK,IAAK,GAAG,MAAO,IAAI,IAAI,KAAK,IAAK,GAAG,MAAO,IAAI,IAAI,KAAK,IAAK,GAAG,KAAM,IAAI,IAAI,KAAK,IAAK;AACjH,QAAI,KAAK,OAAO,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC;AACrC,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,YAAM,IAAI,IAAI,GAAG,IAAI,IAAI;AACzB,YAAM,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC;AAChH,YAAM,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC;AAChI,eAAS,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;AAAG,WAAK;AAAG,WAAK;AAAA,IACpD;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,sBAAsB,MAAY,QAAwB;AACjE,UAAQ,KAAK,SAAS;AAAA,IACpB,KAAK;AAAU,aAAO,EAAE,GAAG,QAAQ,IAAI,GAAG,IAAI,EAAE;AAAA,IAChD,KAAK;AAAmB,aAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE;AAAA,IACtE,KAAK,0BAA0B;AAE7B,YAAM,OAAO,KAAK,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK;AAC/C,YAAM,MAAM,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO;AACpD,aAAO,EAAE,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,EAAE;AAAA,IACtE;AAAA,IACA,KAAK;AAAA,IAAW,KAAK,uBAAuB;AAC1C,YAAM,OAAO,KAAK,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK;AAC/C,YAAM,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO,IAAI;AAC5C,YAAM,MAAM,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO;AACpD,YAAM,UAAU,MAAM,KAAK,KAAK,YAAY,YAAY,KAAK;AAC7D,aAAO,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS,IAAI,GAAG,IAAI,EAAE;AAAA,IACzE;AAAA,EACF;AACF;AAGA,SAAS,kBAAkB,MAAgB,MAAY,IAAe,OAAe;AACnF,QAAM,SAAS,KAAK,SAAS,KAAK,MAAM,IAAI,KAAK,MAAM,EAAG,QAAQ;AAClE,MAAI,MAAc,OAAO,KAAK,MAAM,IAAI,KAAK,MAAM;AACnD,MAAI,QAAQ;AACV,KAAC,IAAI,EAAE,IAAI,MAAM,OAAO,MAAM,GAAG,MAAM,IAAI,MAAM,EAAE;AACnD,UAAM,IAAI,OAAO,sBAAsB,MAAM,MAAM,CAAC,GAAG,EAAE,GAAG,OAAO,IAAI,GAAG,IAAI,EAAE,CAAC;AAAA,EACnF;AACA,KAAG,IAAI;AAAI,KAAG,IAAI;AAClB,KAAG,WAAW,KAAK,MAAM,IAAI,GAAG,IAAI,CAAC,IAAIJ;AACzC,KAAG,SAAS,KAAK,MAAM,IAAI,GAAG,IAAI,CAAC;AACnC,KAAG,SAAS,KAAK,MAAM,IAAI,GAAG,IAAI,CAAC;AACnC,KAAG,SAAS;AACZ,KAAG,SAAS,SAAS,KAAK,MAAM,IAAI,GAAG,IAAI,CAAC,IAAIA,OAAM,GAAG,WAAW,EAAE;AACtE,gBAAc,MAAM,KAAK,EAAE;AAC7B;AAKO,SAAS,wBAAwB,MAAgB,QAAgB,KAAgD;AACtH,QAAM,SAAS,KAAK,KAAK,IAAI,GAAG,UAAU,IAAI,IAAI,UAAU,CAAC;AAC7D,QAAM,MAAM,MAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,CAAC,MAAM,WAAY,SAAsB;AAC5F,QAAM,MAAgB,CAAC;AACvB,MAAI,IAAI,SAAS;AACf,QAAI,IAAI;AACR,eAAW,QAAQ,IAAI,SAAS;AAC9B,UAAI,IAAI,GAAG,IAAI;AACf,iBAAW,OAAO,MAAM;AACtB,cAAM,IAAI,KAAK,MAAM,IAAI,IAAI,IAAI,EAAG;AACpC,cAAM,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI;AACxE,aAAK;AACL,cAAM,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,IAAI;AAAG,cAAM,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,IAAI;AAAA,MACrF;AACA,UAAI,KAAK,GAAG,CAAC;AAAA,IACf;AAAA,EACF,OAAO;AACL,UAAM,OAAO,KAAK,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,GAAI,IAAI,KAAK,MAAM,IAAI,KAAK,IAAI,EAAG,OAAO,IAAI,IAAI;AACvG,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,GAAG;AACpC,YAAM,KAAK,EAAE,CAAC,KAAK,MAAM,IAAI,CAAC,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI;AAC1E,UAAI,KAAK,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,EAAE;AAAA,IACjE;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,aAAa,MAAgB,QAAgB,KAA+B;AAC1F,QAAM,OAAO,KAAK,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AACrD,SAAO,IAAI,KAAK,MAAM,IAAI,KAAK,IAAI,EAAG,OAAO,SAAS,IAAI,GAAG,IAAI,GAAG,IAAI,UAAU,IAAI,QAAQ,IAAI,MAAM,CAAC;AAC3G;AAEO,SAAS,WAAW,KAAkB,KAAyC;AACpF,QAAM,QAAQ,IAAI,OAAO,KAAK,OAAK,EAAE,OAAO,IAAI,KAAK;AACrD,SAAO,CAAC,IAAI,SAAS,MAAM,OAAO,IAAI,UAAU,MAAM,MAAM;AAC9D;AAMO,SAAS,YAAY,KAAkB,MAAY,QAAgB,iBAAiB,GAAG,OAAO,SAAS,KAAK,IAAI,GAAmC;AACxJ,MAAI,CAAC,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,EAAG,OAAM,IAAI,MAAM,iBAAiB,MAAM,GAAG;AACrF,QAAM,MAAM,KAAK,WAAW,IAAI,MAAM;AACtC,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,IAAI,SAAS,QAAQ;AACvB,UAAM,IAAI,wBAAwB,MAAM,QAAQ,GAAG,GAAGO,KAAI,IAAI,OAAO,IAAI,IAAI,OAAO,EAAE,SAAS;AAC/F,UAAMC,OAA0B,CAAC;AACjC,aAAS,IAAI,GAAG,IAAID,IAAG,IAAK,CAAAC,KAAI,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;AAC7D,WAAOA;AAAA,EACT;AACA,MAAI,IAAI,SAAS,OAAQ,QAAO;AAChC,QAAM,CAAC,GAAG,CAAC,IAAI,WAAW,KAAK,GAAG,GAAG,IAAI,aAAa,MAAM,QAAQ,GAAG,GAAG,QAAe,EAAE,GAAG,KAAK,GAAG,IAAI;AAC1G,QAAM,SAAS,aAAa,MAAM,IAAI,EAAE;AACxC,QAAM,UAAU,SAAS,eAAe,QAAQ,GAAG,GAAG,KAAK,IAAI;AAC/D,QAAM,MAA0B,CAAC;AACjC,QAAM,OAAO,CAAC,GAAW,MAAc;AACrC,UAAM,CAAC,IAAI,EAAE,IAAI,UAAU,UAAU,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AAC3D,QAAI,KAAK,MAAM,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,IAAI,EAAE,CAAC;AAAA,EAC3D;AACA,QAAM,IAAI,KAAK,IAAI,GAAG,cAAc;AACpC,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,IAAI,GAAG,CAAC;AACzC,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,GAAG,IAAI,CAAC;AACzC,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,IAAI,IAAI,GAAG,CAAC;AAC7C,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,GAAG,IAAI,IAAI,CAAC;AAC7C,SAAO;AACT;;;ACn1BA,OAAO,gBAAgB;AAgBvB,IAAM,kBAAkB;AAGxB,SAAS,WAAW,MAAiB,WAA2B;AAC9D,QAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,IAAI;AACvC,QAAM,QAAQ,CAAC,GAAW,MAAc,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK;AAElG,QAAM,QAAQ,oBAAI,IAAkB;AACpC,QAAM,MAAM,CAAC,IAAY,IAAY,IAAY,OAAe;AAAE,UAAM,IAAI,GAAG,EAAE,IAAI,EAAE;AAAI,KAAC,MAAM,IAAI,CAAC,KAAK,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AAAA,EAAG;AACtJ,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACtD,QAAI,CAAC,MAAM,GAAG,CAAC,EAAG;AAClB,QAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAG,KAAI,GAAG,GAAG,IAAI,GAAG,CAAC;AACxC,QAAI,CAAC,MAAM,IAAI,GAAG,CAAC,EAAG,KAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAChD,QAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAG,KAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC;AAChD,QAAI,CAAC,MAAM,IAAI,GAAG,CAAC,EAAG,KAAI,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,EAC1C;AACA,MAAI,CAAC,MAAM,KAAM,OAAM,IAAI,MAAM,mDAAmD;AACpF,QAAM,QAAgB,CAAC;AACvB,SAAO,MAAM,MAAM;AACjB,UAAM,CAAC,QAAQ,IAAI,MAAM,QAAQ,EAAE,KAAK,EAAE;AAC1C,UAAM,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,MAAM;AAC5C,UAAM,OAAa,CAAC,KAAK;AACzB,QAAI,MAAM;AACV,QAAI,QAAmB;AACvB,eAAS;AACP,YAAM,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,OAAO,MAAM,IAAI,CAAC;AACnD,UAAI,CAAC,QAAQ,CAAC,KAAK,OAAQ;AAC3B,YAAM,OAAO,SAAS,KAAK,MAAM,KAAK;AACtC,UAAI,CAAC,KAAK,OAAQ,OAAM,OAAO,CAAC;AAChC,UAAI,KAAK,CAAC,MAAM,MAAM,CAAC,KAAK,KAAK,CAAC,MAAM,MAAM,CAAC,EAAG;AAClD,cAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;AAC3C,WAAK,KAAK,IAAI;AAAG,YAAM;AAAA,IACzB;AACA,QAAI,KAAK,UAAU,EAAG,OAAM,KAAK,IAAI;AAAA,EACvC;AACA,SAAO;AACT;AAQO,SAAS,WAAW,MAAiB,OAAqB,CAAC,GAAW;AAC3E,QAAM,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,iBAAiB,gBAAgB,IAAI;AACvF,QAAM,QAAQ,WAAW,MAAM,SAAS,EAAE,IAAI,QAAM,EAAE,GAAG,GAAG,WAAW,CAAC,EAAE,EAAE;AAC5E,QAAM,UAAU,MAAM,OAAO,CAAC,GAAG,MAAO,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,GAAI,MAAM,CAAC,CAAC;AACxF,QAAM,UAAU,MACb,OAAO,OAAK,KAAK,KAAK,EAAE,CAAC,MAAM,KAAK,KAAK,QAAQ,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC,KAAK,iBAAiB,KAAK,IAAI,QAAQ,CAAC,CAAC,EAC5G,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;AAC/C,SAAO,QAAQ,IAAI,CAAC,EAAE,EAAE,MAAM;AAAE,UAAM,IAAI,SAAS,cAAc,CAAC,GAAG,SAAS;AAAG,WAAO,SAAS,cAAc,GAAG,MAAM,IAAI;AAAA,EAAG,CAAC;AAClI;AAeA,SAAS,SAAS,KAAS,MAAY,OAAsB;AAC3D,MAAI,KAAK,WAAW,KAAK,CAAC,MAAO,QAAO,KAAK,IAAI;AACjD,QAAM,SAAS,CAAC,GAAO,SAAsB,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACpF,QAAM,WAAiB,CAAC,OAAO,OAAO,CAAC,GAAG,OAAO,OAAO,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1F,aAAW,QAAQ,UAAU;AAC3B,UAAM,MAAM,KAAK,UAAU,OAAK,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AACtF,QAAI,OAAO,EAAG,QAAO,KAAK,OAAO,KAAK,CAAC,EAAE,CAAC;AAAA,EAC5C;AACA,SAAO,KAAK,IAAI;AAClB;AAEO,SAAS,WAAW,GAAiB;AAAE,MAAI,IAAI;AAAG,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AAAE,UAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,EAAE,MAAM;AAAG,SAAK,KAAK,KAAK,KAAK;AAAA,EAAI;AAAE,SAAO,IAAI;AAAG;AAC/L,SAAS,cAAc,GAAe;AACpC,SAAO,EAAE,OAAO,CAAC,GAAG,MAAM;AAAE,UAAM,IAAI,GAAG,IAAI,EAAE,SAAS,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,KAAK,EAAE,MAAM;AAAG,YAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO;AAAA,EAAG,CAAC;AAC5L;AAEA,SAAS,SAAS,MAAY,KAAmB;AAC/C,MAAI,OAAO,KAAK,KAAK,UAAU,EAAG,QAAO;AACzC,MAAI,IAAI,GAAG,IAAI,GAAG,OAAO;AACzB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,UAASC,KAAI,IAAI,GAAGA,KAAI,KAAK,QAAQA,MAAK;AAAE,UAAM,KAAK,KAAK,CAAC,EAAE,CAAC,IAAI,KAAKA,EAAC,EAAE,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC,IAAI,KAAKA,EAAC,EAAE,CAAC,MAAM;AAAG,QAAI,IAAI,MAAM;AAAE,aAAO;AAAG,UAAI;AAAG,UAAIA;AAAA,IAAG;AAAA,EAAE;AACvM,QAAM,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC;AACpF,QAAM,MAAM,CAAC,GAAG,GAAG,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,GAAG,GAAG,GAAG,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;AACzE,SAAO,IAAI,UAAU,IAAI,MAAM;AACjC;AACA,SAAS,GAAG,KAAW,KAAmB;AACxC,MAAI,IAAI,SAAS,EAAG,QAAO;AAC3B,QAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,SAAS,CAAC;AACtD,MAAI,MAAM,GAAG,OAAO;AACpB,WAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;AAAE,UAAM,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE;AAAG,QAAI,IAAI,MAAM;AAAE,aAAO;AAAG,YAAM;AAAA,IAAG;AAAA,EAAE;AACzI,MAAI,QAAQ,IAAK,QAAO,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,CAAC;AACpD,SAAO,CAAC,GAAG,GAAG,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE,MAAM,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC;AACpF;AACA,SAAS,QAAQ,IAAY,IAAY,IAAY,IAAY,IAAY,IAAoB;AAC/F,QAAM,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK;AACtD,QAAM,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,EAAE,CAAC,IAAI;AAClF,SAAO,KAAK,MAAM,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,GAAG;AAC1D;AAEA,SAAS,cAAc,GAAS,GAAiB;AAC/C,QAAM,MAAM,WAAW,CAAC,IAAI,IAAI,IAAI;AACpC,SAAO,EAAE,IAAI,CAAC,GAAG,MAAM;AACrB,UAAM,IAAI,GAAG,IAAI,EAAE,SAAS,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,KAAK,EAAE,MAAM;AACpE,UAAM,KAAK,OAAO,GAAG,GAAG,GAAG,GAAG,KAAK,OAAO,GAAG,GAAG,GAAG;AACnD,QAAI,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC;AACzC,UAAM,IAAI,KAAK,MAAM,IAAI,EAAE,KAAK;AAAG,UAAM;AAAG,UAAM;AAClD,UAAM,MAAM,KAAK,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AACjD,WAAO,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,IAAI,GAAG;AAAA,EAClD,CAAC;AACH;AACA,IAAM,SAAS,CAAC,GAAO,GAAO,QAAoB;AAAE,QAAM,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,MAAM,IAAI,EAAE,KAAK;AAAG,SAAO,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC;AAAG;AAE1J,SAAS,eAAe,MAAY,GAAW,GAAoB;AACxE,MAAI,SAAS;AACb,WAAS,IAAI,GAAGA,KAAI,KAAK,SAAS,GAAG,IAAI,KAAK,QAAQA,KAAI,KAAK;AAC7D,UAAM,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,KAAKA,EAAC;AAC3C,QAAI,KAAK,MAAM,KAAK,KAAK,KAAM,KAAK,OAAO,IAAI,OAAQ,KAAK,MAAM,GAAI,UAAS,CAAC;AAAA,EAClF;AACA,SAAO;AACT;AACO,SAAS,kBAAkB,MAAY,GAAW,GAAmB;AAC1E,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAAE,UAAM,IAAI,KAAK,CAAC,GAAG,IAAI,MAAM,IAAI,KAAK,KAAK,MAAM;AAAG,QAAI,KAAK,IAAI,GAAG,QAAQ,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAA,EAAG;AACpJ,SAAO;AACT;AAIO,SAAS,eAAe,MAAY,SAAuB;AAChE,QAAM,KAAK,KAAK,IAAI,OAAK,EAAE,CAAC,CAAC,GAAG,KAAK,KAAK,IAAI,OAAK,EAAE,CAAC,CAAC;AACvD,QAAM,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,KAAK,KAAK,IAAI,GAAG,EAAE;AAC3F,QAAM,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,MAAM,OAAO,CAAC,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,MAAM,OAAO,CAAC;AACzG,QAAM,MAAY,CAAC;AACnB,WAASA,KAAI,GAAGA,MAAK,IAAIA,KAAK,UAAS,IAAI,GAAG,KAAK,IAAI,KAAK;AAC1D,UAAM,IAAI,MAAO,KAAK,MAAM,IAAK,IAAI,IAAI,MAAO,KAAK,MAAMA,KAAK;AAChE,QAAI,eAAe,MAAM,GAAG,CAAC,KAAK,kBAAkB,MAAM,GAAG,CAAC,KAAK,UAAU,EAAG,KAAI,KAAK,CAAC,GAAG,CAAC,CAAC;AAAA,EACjG;AACA,SAAO;AACT;AAGO,SAAS,YAAY,MAAY,UAAgB,SAA4E;AAClI,QAAM,OAAa,CAAC;AACpB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC,GAAG,IAAI,MAAM,IAAI,KAAK,KAAK,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC;AAC7H,aAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,KAAK,CAAC,EAAE,CAAC,KAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAK,GAAG,EAAE,CAAC,KAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAK,CAAC,CAAC;AAAA,EACxG;AACA,QAAM,MAAM,CAAC,GAAG,MAAM,GAAG,QAAQ;AACjC,QAAM,OAAO,IAAI,KAAK;AACtB,QAAM,IAAI,IAAI,WAAW,IAAI;AAC7B,QAAM,YAAsB,CAAC;AAC7B,WAAS,IAAI,GAAG,IAAI,EAAE,UAAU,QAAQ,KAAK,GAAG;AAC9C,UAAM,IAAI,EAAE,UAAU,CAAC,GAAG,IAAI,EAAE,UAAU,IAAI,CAAC,GAAG,IAAI,EAAE,UAAU,IAAI,CAAC;AACvE,UAAM,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK;AACvH,QAAI,eAAe,MAAM,IAAI,EAAE,EAAG,WAAU,KAAK,GAAG,GAAG,CAAC;AAAA,EAC1D;AACA,SAAO,EAAE,UAAU,MAAM,WAAW,MAAM,KAAK,OAAO;AACxD;AAMO,SAAS,gBAAgB,MAAgB,OAAiB,WAAqB,UAAU,GAAa;AAC3G,QAAM,MAAgB,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK,GAAG;AAC5C,UAAM,IAAI,aAAa,MAAM,UAAU,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC,GAAG,IAAI,aAAa,OAAO,UAAU,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC;AACxJ,QAAI,MAAM,KAAK,MAAM,KAAK,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,QAAS,KAAI,KAAK,IAAI,CAAC;AAAA,EACnG;AACA,SAAO;AACT;AAGO,IAAM,eAAe,CAAC,GAAa,GAAW,GAAW,QAC5D,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM;AAG7G,SAAS,SAAS,UAAoB,WAA6B;AACxE,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK,EAAG,UAAS,KAAK,IAAI,aAAa,UAAU,UAAU,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC,CAAC;AACxI,SAAO;AACT;AASO,SAAS,kBAAkB,MAAgB,QAAgB,KAA+B;AAC/F,QAAM,MAAM,GAAG,UAAU,IAAI,IAAI,UAAU;AAC3C,MAAI,CAAC,KAAK,KAAK,IAAI,GAAG,EAAG,QAAO,wBAAwB,MAAM,QAAQ,GAAG;AACzE,QAAM,OAAO,IAAI,IAAI,KAAK,IAAI;AAC9B,OAAK,OAAO,GAAG;AACf,SAAO,wBAAwB,EAAE,GAAG,MAAM,KAAK,GAAG,QAAQ,GAAG;AAC/D;AAIO,IAAM,SAAS,CAAC,MAAc,CAAC,EAAE,QAAQ,CAAC,IAAI;AAS9C,SAAS,gBAAgB,SAAiB,QAA0B,OAAc,MAAyC,UAAU,IAAoB;AAC9J,QAAM,IAAI,OAAO,SAAS,MAAM,OAAO,IAAI,OAAO,UAAU,MAAM;AAClE,QAAM,QAAgB,SAAS,OAAO,GAAG,OAAO,GAAG,OAAO,UAAU,OAAO,QAAQ,OAAO,MAAM;AAChG,QAAM,MAAgB,CAAC,GAAG,WAAqB,CAAC,GAAG,YAAsB,CAAC;AAC1E,MAAI,OAAO;AACX,aAAW,UAAU,SAAS;AAC5B,UAAM,MAAM,YAAY,QAAQ,eAAe,QAAQ,OAAO,GAAG,OAAO;AACxE,UAAM,SAAS,IAAI,SAAS;AAC5B,aAAS,IAAI,GAAG,IAAI,IAAI,SAAS,QAAQ,KAAK,GAAG;AAC/C,YAAM,IAAI,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,SAAS,IAAI,CAAC,IAAI,KAAK;AACvE,UAAI,KAAK,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAC7B,YAAM,CAAC,GAAG,CAAC,IAAI,MAAM,QAAQ,IAAI,OAAO,IAAI,IAAI,OAAO,CAAC;AACxD,eAAS,KAAK,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,IACpC;AACA,eAAW,KAAK,IAAI,UAAW,WAAU,KAAK,IAAI,MAAM;AACxD,QAAI,QAAQ,WAAW,EAAG,QAAO,IAAI;AAAA,EACvC;AACA,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IAAI,MAAM,OAAO;AAAA,IAAM,MAAM;AAAA,IAAQ,OAAO,OAAO;AAAA,IAC9D;AAAA,IAAK;AAAA,IAAW;AAAA,IAAU;AAAA,IAC1B,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,IAC9C,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,EACnD;AACF;AAgBO,IAAM,kBAAkB;AAGxB,SAAS,mBAAmB,KAAkB,QAA0B;AAC7E,QAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAChD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,iBAAiB,MAAM,GAAG;AACrD,QAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,IAAI;AACnD,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,KAAK,IAAI,GAAI,KAAK,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC,GAAI,GAAG,IAAI,MAAM,OAAO,OAAK,EAAE,WAAW,KAAK,EAAE,EAAE,IAAI,OAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AACrI;AAmBO,SAAS,YAAY,KAAkB,MAAgB,KAAqB,MAA0C;AAC3H,MAAI,CAAC,KAAK,MAAM,OAAQ,OAAM,IAAI,MAAM,sDAAsD;AAC9F,MAAI,EAAE,KAAK,SAAS,GAAI,OAAM,IAAI,MAAM,iCAAiC;AACzE,MAAI,EAAE,KAAK,iBAAiB,GAAI,OAAM,IAAI,MAAM,yCAAyC;AACzF,QAAM,QAAQ,kBAAkB,MAAM,IAAI,MAAM,GAAG;AACnD,QAAM,OAAsF,KAAK,MAAM,IAAI,QAAM;AAC/G,UAAM,IAAI,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,GAAG,KAAK,KAAK,MAAM,IAAI,EAAE;AAClE,QAAI,CAAC,KAAK,CAAC,GAAI,OAAM,IAAI,MAAM,iBAAiB,EAAE,GAAG;AACrD,UAAM,CAAC,IAAI,EAAE,IAAI,MAAM,GAAG,OAAO,EAAE,QAAQ,CAAC;AAC5C,WAAO,EAAE,IAAI,IAAI,GAAG,MAAM,IAAI,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,OAAO,GAAG,KAAK,EAAE;AAAA,EACvF,CAAC;AACD,QAAM,UAAkD,CAAC;AACzD,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,UAAM,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,IAAI,CAAC;AACnC,UAAM,YAAY,KAAK,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AAG3G,UAAM,QAAQ,UACX,MAAM,GAAG,KAAK,aAAa,EAC3B,IAAI,QAAM,EAAE,GAAG,EAAE,GAAG,GAAG,KAAK,EAAE,IAAI,KAAK,SAAS,MAAM,EAAE,EAAE;AAC7D,UAAM,MAAM,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,GAAG,CAAC;AAC7C,UAAM,OAAO,MAAM,OAAO,OAAK,EAAE,IAAI,OAAO,eAAe;AAC3D,UAAM,QAAQ,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,GAAG,CAAC;AAC9C,YAAQ,KAAK,KAAK,IAAI,OAAK;AAAE,YAAM,CAAC,IAAI,EAAE,IAAI,MAAM,EAAE,EAAE,KAAK,GAAG,CAAC;AAAG,aAAO,EAAE,MAAM,EAAE,EAAE,IAAI,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,IAAI,KAAK,EAAE;AAAA,IAAG,CAAC,CAAC;AAAA,EACvJ;AACA,QAAM,EAAE,UAAU,OAAO,GAAG,KAAK,IAAI;AACrC,SAAO,EAAE,GAAG,MAAM,QAAQ;AAC5B;AAmBO,IAAM,cAAc,CAAC,QAC1B,IAAI,UAAU,IAAI,QAAQ,UAAU,IAAI,UAAU,UAAU,KAAK;AA4B5D,IAAM,eAAe,CAAC,QAA0B,IAAI,UAAU,IAAI,IAAI,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,IAAK,IAAI,UAAU,UAAU;;;AC1W3I,IAAM,WAAW,CAAC,SAAyB;AAChD,QAAM,MAAY,CAAC;AACnB,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK,QAAQ,KAAK,EAAG,KAAI,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC;AAC5E,SAAO;AACT;AACO,IAAM,UAAU,CAAC,QAAwB,IAAI,QAAQ,OAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAGtE,IAAM,cAAc,CAACC,iBAAgC,KAAK,MAAMA,eAAc,CAAC;AAE/E,IAAM,aAAa,CAACA,cAAqB,WAC9C,SAAS,YAAYA,YAAW,IAAI,YAAYA,YAAW,IAAI;AAEjE,IAAM,OAAO,CAAC,GAAO,GAAO,MAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AAGjG,SAAS,QAAQ,aAAuB,GAA6B;AACnE,QAAM,IAAI,YAAY,SAAS;AAC/B,QAAM,KAAK,CAAC,MAAkB;AAAE,UAAMC,KAAK,IAAI,IAAK;AAAG,WAAO,CAAC,YAAYA,EAAC,GAAG,YAAYA,KAAI,CAAC,CAAC;AAAA,EAAG;AACpG,SAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC;AACpE;AAGO,SAAS,cAAc,IAAQ,IAAQ,IAAQ,IAAQ,GAAe;AAC3E,QAAM,IAAI,IAAI;AACd,SAAO;AAAA,IACL,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,IACpF,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,EACtF;AACF;AAGO,SAAS,aAAa,IAAQ,IAAQ,IAAQ,IAAQ,SAAS,GAAW;AAC/E,MAAI,MAAM,GAAG,OAAO;AACpB,WAAS,IAAI,GAAG,KAAK,QAAQ,KAAK;AAChC,UAAM,KAAK,cAAc,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM;AACnD,WAAO,KAAK,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;AAClD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAWO,SAAS,aAAa,aAAuB,QAA2B;AAC7E,QAAM,MAAgB,CAAC;AACvB,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,WAAW,YAAY,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK;AAC1E,UAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,QAAQ,aAAa,CAAC;AAC/C,WAAO,aAAa,IAAI,IAAI,IAAI,EAAE;AAClC,QAAI,KAAK,OAAO,GAAG,CAAC;AAAA,EACtB;AACA,SAAO;AACT;AAYO,SAAS,WAAW,aAAuB,QAAiB,GAAW,GACJ;AACxE,QAAM,IAAI,WAAW,YAAY,SAAS,GAAG,MAAM;AACnD,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,KAAK,KAAK,EAAG,OAAM,IAAI,MAAM,qBAAqB,CAAC,qBAAqB,CAAC,UAAU;AACnH,QAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,QAAQ,aAAa,CAAC;AAC/C,QAAM,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,IAAI,CAAC;AAClE,QAAM,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,KAAK,GAAG,GAAG,CAAC;AAE5D,SAAO,EAAE,QAAQ,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,WAAW,GAAG,QAAQ;AAAA,IAC3D,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC;AAAA;AAAA,IACf,EAAE,IAAI,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA;AAAA,IACxC,EAAE,IAAI,MAAM,GAAG,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC;AAAA;AAAA,IAChE,CAAC,IAAI,IAAI,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA;AAAA,IACxC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA;AAAA,EACjB,EAAE;AACJ;AASO,SAAS,aAAgB,OAAY,GAAW,QAAW,QAAmB,WAAmB;AACtG,QAAM,IAAI,MAAM;AAChB,QAAM,MAAM,MAAM,MAAM;AACxB,OAAK,IAAI,IAAI,KAAK,CAAC,IAAI;AACvB,OAAK,IAAI,IAAI,KAAK,CAAC,IAAI;AACvB,MAAI,OAAO,IAAI,IAAI,GAAG,GAAG,GAAG,MAAM;AAClC,SAAO;AACT;AAGO,SAAS,aAAgB,OAAY,GAAgB;AAC1D,QAAM,MAAM,MAAM,MAAM;AACxB,MAAI,OAAO,IAAI,GAAG,CAAC;AACnB,SAAO;AACT;AAkBO,SAAS,gBAAgB,SAAwB,QAA+B;AACrF,MAAI,QAAQ,WAAW,OAAO,OAAQ,OAAM,IAAI,MAAM,oBAAoB,QAAQ,MAAM,qBAAqB,OAAO,MAAM,eAAe;AACzI,QAAM,MAAM,oBAAI,IAAiD;AACjE,UAAQ,QAAQ,CAAC,MAAM,MAAM;AAC3B,eAAW,OAAO,MAAM;AACtB,YAAM,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,IAAI,IAAI;AACnF,YAAM,KAAK,OAAO,CAAC,IAAI,IAAI;AAC3B,QAAE,KAAK,KAAK,IAAI;AAAG,QAAE,KAAK,KAAK,IAAI;AAAG,QAAE,KAAK;AAAA,IAC/C;AAAA,EACF,CAAC;AACD,QAAM,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,GAAG,CAAC;AAC3D,MAAI,EAAE,QAAQ,GAAI,OAAM,IAAI,MAAM,kDAAkD;AAEpF,QAAM,OAAO,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,SAAS,eAAe;AACtE,QAAM,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC;AAGhD,SAAO,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE;AAC7G;AAeO,SAAS,aAAa,SAAwB,QAAoB,QAA4B;AACnG,QAAM,YAAY,QAAQ,IAAI,CAAC,MAAM,MAAM,KAAK,IAAI,CAAC,KAAKC,QAAO,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC,EAAE,IAAIA,EAAC,KAAK,GAAG,GAAG,OAAO,CAAC,EAAE,IAAIA,KAAI,CAAC,KAAK,EAAE,EAAE,CAAC;AACrI,SAAO,gBAAgB,WAAW,MAAM,EAAE,QAAQ,OAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AACnE;AAGO,IAAM,aAAa,CAAC,QAAoB,WAC7C,CAAC,GAAG,CAAC,EAAE,IAAI,OAAK,OAAO,OAAO,OAAO,CAAC,KAAK,GAAG,MAAM,MAAM,KAAK,OAAO,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;AAGxF,IAAM,OAAO,KAAK,KAAK,CAAC,IAAI,KAAK;;;AC7K1B,SAAS,YAAY,KAAyC;AACnE,QAAM,MAAM,oBAAI,IAAsB;AACtC,QAAM,MAAM,CAAC,MAAc,QAAgB,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,EAAE,IAAI,IAAI,GAAI,KAAK,EAAE;AAEjG,QAAM,MAAwD;AAAA,IAC5D,GAAG,IAAI,GAAG,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,IAAI,OAAO,EAAE,MAAM,EAAE;AAAA,IACjE,GAAG,IAAI,UAAU,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,IAAI,OAAO,EAAE,MAAM,EAAE;AAAA,IACxE,GAAG,IAAI,KAAK,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,IAAI,OAAO,EAAE,MAAM,EAAE;AAAA,EACrE,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAClC,aAAW,KAAK,IAAK,YAAW,KAAK,EAAE,MAAO,KAAI,GAAG,EAAE,EAAE;AACzD,SAAO;AACT;AAOO,IAAM,QAAQ,CAAC,MAAY,MAAc,IAAY,MAAc,SAAyB;AACjG,QAAM,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC;AACrC,SAAO,OAAO,MAAM,WAAW,IAAI;AACrC;AASO,SAAS,SAAS,KAAkB,MAAY,MAA6F;AAClJ,QAAM,MAAM,YAAY,GAAG,EAAE,IAAI,IAAI;AACrC,WAAS,KAAK,KAAK,UAAU,KAAK,GAAG,KAAK,GAAG,KAAK;AAChD,UAAM,KAAK,IAAK,CAAC;AACjB,UAAM,KAAK,IAAI,GAAG,KAAK,OAAK,EAAE,OAAO,EAAE;AACvC,QAAI,IAAI;AACN,UAAI,MAAM,MAAM,MAAM,IAAI,OAAO,GAAG,GAAG,IAAI,EAAG,QAAO,EAAE,MAAM,MAAM,IAAI,QAAQ,GAAG,OAAO;AACzF;AAAA,IACF;AACA,UAAM,KAAK,IAAI,UAAU,KAAK,OAAK,EAAE,OAAO,EAAE;AAC9C,QAAI,IAAI;AACN,UAAI,UAAU,UAAU,KAAK,OAAK,MAAM,MAAM,aAAa,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,EAAG,QAAO,EAAE,MAAM,aAAa,IAAI,QAAQ,GAAG,OAAO;AACnI;AAAA,IACF;AACA,UAAM,KAAK,IAAI,KAAK,KAAK,OAAK,EAAE,OAAO,EAAE;AACzC,QAAI,MAAM,UAAU,KAAK,KAAK,OAAK,MAAM,MAAM,QAAQ,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,EAAG,QAAO,EAAE,MAAM,QAAQ,IAAI,QAAQ,GAAG,OAAO;AAAA,EAC5H;AACA,SAAO;AACT;AAGO,SAAS,WAAW,KAAkB,MAAwB;AACnE,QAAM,IAAI,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI;AAC3C,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,iBAAiB,IAAI,GAAG;AAChD,MAAI,CAAC,EAAE,OAAQ,OAAM,IAAI,MAAM,SAAS,IAAI,+DAA+D;AAC3G,QAAM,WAAW,IAAI,MAAM,OAAO,OAAK,EAAE,WAAW,EAAE,MAAM;AAC5D,SAAO,SAAS,WAAW,IAAI,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI;AACzD;AAGO,SAAS,SAAS,MAAgB,OAAqB;AAC5D,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,QAAM,KAAK,KAAK,MAAM,IAAI,IAAI;AAC9B,MAAI,CAAC,GAAI,OAAM,IAAI,MAAM,iBAAiB,IAAI,GAAG;AACjD,QAAM,MAAM,KAAK,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,EAAG;AACrD,SAAO,MAAM,GAAG,OAAO,KAAK,CAAC;AAC/B;AAWO,SAAS,YAAY,MAAgB,OAA0B;AACpE,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,QAAM,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC,EAAG,OAAO,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC,EAAG;AACzE,QAAM,MAAM,SAAS,MAAM,KAAK;AAChC,QAAM,SAAS,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE;AAC5E,SAAO,SAAS;AAClB;AAGO,SAAS,QAAQ,MAAgB,GAAsD;AAC5F,QAAMC,QAAO,KAAK,MAAM,IAAI,EAAE,MAAM,CAAC,CAAC,EAAG;AACzC,QAAM,SAAS,KAAK,MAAM,IAAI,EAAE,MAAM,EAAG;AACzC,MAAI,QAAQ;AACZ,aAAW,MAAM,EAAE,OAAO;AACxB,UAAM,KAAK,KAAK,MAAM,IAAI,EAAE,GAAI,MAAM,KAAK,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,EAAG;AAC7E,aAAS,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,GAAG,MAAM,CAAC;AAAA,EAClD;AACA,SAAO,EAAE,UAAU,KAAK,MAAM,OAAO,KAAKA,MAAK,IAAI,OAAO,KAAKA,MAAK,EAAE,GAAG,MAAM;AACjF;AASA,IAAM,KAAK,CAAC,MAAc,CAAC,EAAE,QAAQ,CAAC,IAAI;AAOnC,SAAS,eAAe,MAAgB,QAAgB,QAAc,QAA6E;AACxJ,MAAI,OAAO,SAAS,EAAG,OAAM,IAAI,MAAM,kCAAkC;AACzE,MAAI,UAAU,OAAO,SAAS,EAAG,OAAM,IAAI,MAAM,2CAA2C;AAC5F,QAAM,OAAO,KAAK,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AACrD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,iBAAiB,MAAM,GAAG;AACrD,QAAM,MAAM,OAAO,KAAK,MAAM,IAAI,KAAK,IAAI,EAAG,KAAK;AACnD,QAAM,IAAI,OAAO;AACjB,QAAM,KAAK,CAAC,MAAkB,OAAO,UAAU,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;AAE3F,QAAM,OAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,OAAO,GAAG,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;AACxD,UAAM,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK;AAC/D,SAAK,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAAA,EACzE;AACA,QAAM,WAAqB,CAAC;AAC5B,aAAW,UAAU,KAAM,YAAW,CAAC,GAAG,CAAC,KAAK,QAAQ;AAAE,UAAM,CAAC,IAAI,EAAE,IAAI,MAAM,KAAK,GAAG,CAAC;AAAG,aAAS,KAAK,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;AAAA,EAAG;AAK5H,SAAO,EAAE,UAAU,QAAQ,SAAS,aAAa,QAAQ,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE;AACjF;AAGO,SAAS,uBAAuB,KAAkB;AACvD,QAAM,SAAS,IAAI,IAAI,IAAI,MAAM,IAAI,OAAK,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3D,QAAM,YAAY,CAAC,OAAe;AAChC,UAAM,MAAM,oBAAI,IAAY;AAC5B,aAAS,IAAwB,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,CAAC,EAAG,KAAI,IAAI,CAAC;AACnF,WAAO;AAAA,EACT;AACA,QAAM,MAAM;AAAA,IACV,GAAG,IAAI,GAAG,IAAI,QAAM,EAAE,MAAM,MAAe,GAAG,EAAE,EAAE;AAAA,IAClD,GAAG,IAAI,UAAU,IAAI,QAAM,EAAE,MAAM,aAAsB,GAAG,EAAE,EAAE;AAAA,IAChE,GAAG,IAAI,KAAK,IAAI,QAAM,EAAE,MAAM,QAAiB,GAAG,EAAE,EAAE;AAAA,EACxD,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAClC,QAAMC,UAAS,CAAC,MAA0B,UAAU,EAAE,IAAI,EAAE,KAAK,OAAM,EAAyC,CAAC,MAAM,KACrH,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,KAAK,OAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,KAAK,EAAE,KAAK,KAAK,OAAK,OAAO,EAAE,MAAM,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAE9J,QAAM,QAA+G,CAAC;AACtH,MAAI,QAAQ,CAAC,QAAQ,OAAO;AAC1B,QAAI,CAACA,QAAO,MAAM,EAAG;AACrB,UAAM,QAAQ,oBAAI,IAAY;AAC9B,UAAM,MAAM,CAAC,MAAc,UAAU,CAAC,EAAE,QAAQ,OAAK,MAAM,IAAI,CAAC,CAAC;AACjE,QAAI,OAAO,SAAS,QAAQ;AAC1B,YAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,OAAO,MAAM;AACvD,UAAI,KAAM,KAAI,KAAK,IAAI;AACvB,iBAAW,KAAK,IAAI,YAAa,KAAI,EAAE,SAAS,OAAO,UAAU,EAAE,SAAS;AAC1E,mBAAW,QAAQ,EAAE,WAAW,CAAC,EAAG,YAAW,OAAO,KAAM,KAAI,IAAI,MAAM,EAAG,KAAI,IAAI,IAAI;AAAA;AAAA,IAC7F,MAAO,KAAI,OAAO,MAAM;AAExB,eAAW,KAAK,OAAO,OAAO;AAAE,YAAM,IAAI,OAAO,IAAI,CAAC;AAAG,UAAI,KAAK,CAAC,OAAO,MAAM,SAAS,CAAC,EAAG,KAAI,CAAC;AAAA,IAAG;AACrG,QAAI,QAAQ,CAAC,QAAQ,OAAO;AAC1B,UAAI,OAAO,MAAM,CAACA,QAAO,MAAM,EAAG;AAClC,YAAM,OAAO,OAAO,MAAM,KAAK,OAAK,MAAM,IAAI,CAAC,CAAC;AAChD,UAAI,KAAM,OAAM,KAAK,EAAE,QAAQ,OAAO,IAAI,YAAY,OAAO,MAAM,QAAQ,OAAO,IAAI,YAAY,OAAO,MAAM,MAAM,MAAM,KAAK,GAAG,CAAC;AAAA,IACtI,CAAC;AAAA,EACH,CAAC;AACD,SAAO,EAAE,KAAK,MAAM;AACtB;AAGO,SAAS,iBAAiB,KAA+B;AAC9D,QAAM,EAAE,KAAK,MAAM,IAAI,uBAAuB,GAAG;AACjD,QAAMC,WAAU,CAAC,GAAG,GAAG,GAAG,MAAgB,CAAC;AAC3C,SAAOA,SAAQ,QAAQ;AACrB,UAAM,IAAIA,SAAQ,UAAU,CAAAC,OAAK,MAAM,OAAO,OAAK,EAAE,WAAWA,GAAE,MAAM,EAAE,eAAeA,GAAE,IAAI,EAAE,MAAM,OAAK,IAAI,SAAS,GAAG,EAAE,UAAU,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACxJ,QAAI,IAAI,EAAG,OAAM,IAAI,MAAM,gCAAgCD,SAAQ,IAAI,CAAAC,OAAKA,GAAE,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAC9F,UAAM,IAAID,SAAQ,OAAO,GAAG,CAAC,EAAE,CAAC;AAAG,QAAI,KAAK,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE;AAAA,EACjE;AACA,SAAO,EAAE,GAAG,KAAK,IAAI,IAAI,GAAG,IAAI,QAAM,EAAE,GAAG,GAAG,OAAO,IAAI,QAAQ,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,WAAW,IAAI,UAAU,IAAI,QAAM,EAAE,GAAG,GAAG,OAAO,IAAI,QAAQ,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,IAAI,QAAM,EAAE,GAAG,GAAG,OAAO,IAAI,QAAQ,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AACtP;;;AC5KO,SAAS,UAAU,MAAc,OAAe,QAAgB,OAAqB;AAC1F,SAAO,UAAU,MAAM;AAAA,IACrB,QAAQ;AAAA,IAAe,SAAS;AAAA,IAChC,MAAM,EAAE,MAAM,OAAO,QAAQ,MAAM;AAAA,IACnC,QAAQ,CAAC;AAAA;AAAA,IAET,OAAO,CAAC,EAAE,IAAI,QAAQ,WAAW,EAAE,GAAG,QAAQ,GAAG,GAAG,OAAO,GAAG,MAAM,OAAO,CAAC;AAAA,IAC5E,OAAO,CAAC;AAAA,IAAG,YAAY,CAAC;AAAA,EAC1B,CAAC;AACH;AAGO,SAAS,aAAa,MAAc,OAAoE,SAAS,MAAM,OAAqB;AACjJ,QAAM,KAAK,KAAK,KAAK,MAAM,QAAQ,MAAM,GAAG,KAAK,KAAK,KAAK,MAAM,SAAS,MAAM;AAChF,QAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,SAAS,MAAM,SAAS,IAAI;AAChE,QAAM,WAAW,MAAM,IAAI,QAAQ,SAAS,EAAE,EAAE,QAAQ,YAAY,EAAE,EAAE,YAAY,EAAE,QAAQ,eAAe,GAAG,EAAE,QAAQ,YAAY,EAAE;AACxI,QAAM,KAAK,MAAM,OAAO,YAAY;AACpC,MAAI,MAAM,UAAU,MAAM,OAAO,QAAQ,KAAK;AAC9C,QAAM,EAAE,GAAG,KAAK,OAAO,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,WAAW,EAAE,GAAG,IAAI,MAAM,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,GAAG,SAAS,GAAG,EAAE,CAAC,EAAE;AACrH,QAAM,EAAE,GAAG,KAAK,QAAQ,CAAC,UAAU,MAAM,OAAO,QAAQ,MAAM,EAAE,IAAI,KAAK,MAAM,KAAK,OAAO,MAAM,OAAO,QAAQ,MAAM,OAAO,CAAC,CAAC,EAAE;AACjI,QAAM,QAAQ,KAAK,EAAE,IAAI,MAAM,OAAO,CAAC;AAEvC,QAAM,cAAc,KAAK,EAAE,IAAI,MAAM,IAAI,OAAO,IAAI,GAAG,CAAC,MAAM,SAAS,EAAE,CAAC;AAC1E,SAAO,QAAQ,KAAK,EAAE,IAAI,YAAY,GAAG,CAAC;AAC5C;AAGO,SAAS,aAAa,KAAU,IAAY,MAAgK;AACjN,QAAM,MAAM,IAAI,OAAO,KAAK,OAAK,EAAE,OAAO,EAAE;AAC5C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,kBAAkB,EAAE,GAAG;AACjD,QAAM,EAAE,KAAK,OAAO,QAAQ,GAAG,OAAO,IAAI;AAC1C,QAAM,QAAQ,UAAU,MAAM,OAAO,QAAQ,MAAM;AAAA,IAAE,GAAG;AAAA,IAAK;AAAA,IAAK;AAAA,IAAO;AAAA,IAAQ,OAAO;AAAA,IAAW,QAAQ;AAAA,IAAG,MAAM;AAAA,IAClH,QAAQ,EAAE,GAAG,IAAI,QAAQ,GAAG,OAAO,YAAY,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS,CAAC,EAAE;AAAA,EAAE,CAAC;AAE/G,QAAM,cAAc,IAAI,YAAY,IAAI,OAAK;AAC3C,QAAI,EAAE,SAAS,YAAY,EAAE,UAAU,MAAO,IAAI,UAAU,SAAS,IAAI,WAAW,OAAS,QAAO;AACpG,UAAM,KAAK,MAAM,EAAE,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,IAAI,IAAI;AACvD,WAAO,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,MAAM,OAAO,QAAQ,CAAC,IAAI,GAAG,GAAG,GAAG,MAAM,MAAM,QAAQ,QAAQ,CAAC,IAAI,EAAE;AAAA,EACnG,CAAC;AACD,SAAO,EAAE,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,OAAM,EAAE,OAAO,KAAK,QAAQ,CAAE,GAAG,YAAY;AACvF;AAKA,IAAM,SAAS,CAAC,MAAc,CAAC,EAAE,QAAQ,CAAC,IAAI;AAE9C,IAAM,eAAe,CAAC,MACpB,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,EAAE,SAAS,CAAC;AAa5F,SAAS,SAAS,KAAU,IAAY,OAAmB,OAA0E;AAC1I,QAAM,MAAM,IAAI,OAAO,KAAK,OAAK,EAAE,OAAO,EAAE;AAC5C,MAAI,CAAC,OAAO,CAAC,MAAM,IAAK,OAAM,IAAI,MAAM,UAAU,EAAE,gDAA2C;AAG/F,QAAM,aAAa,MAAM,QAAQ,UAAa,MAAM,QAAQ,KAAK;AACjE,QAAM,WAAW,MAAM,UAAU,UAAa;AAC9C,QAAM,QAAQ,MAAM,UAAU,SAAY,KAAK,QAAQ,MAAM,SAAS;AACtE,MAAI,OAAO;AACT,UAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI;AACzB,QAAI,CAAC,MAAM,MAAM,OAAO,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAG,OAAM,IAAI,MAAM,UAAU,EAAE,2DAAsD;AAC9J,QAAI,UAAU,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,QAAS,OAAM,IAAI,MAAM,UAAU,EAAE,aAAa,MAAM,KAAK,IAAI,CAAC,oBAAoB,MAAM,KAAK,IAAI,MAAM,MAAM,QAAQ;AAAA,EAClL;AACA,QAAM,OAAO,YAAY,QAAQ,EAAE,OAAO,MAAM,CAAC,GAAG,QAAQ,MAAM,CAAC,EAAE,IACjE,YAAY,QAAQ,QACpB,EAAE,OAAO,MAAM,SAAS,KAAK,SAAS,OAAO,OAAO,QAAQ,MAAM,UAAU,KAAK,UAAU,OAAO,OAAO;AAC7G,QAAM,OAAO,UAAU,MAAM,OAAO,QAAQ,MAAM;AAAA,IAChD,GAAG;AAAA,IAAK;AAAA,IAAI,KAAK,MAAM,OAAO,IAAK;AAAA,IAAK,GAAG;AAAA,IAAM;AAAA,IACjD,GAAI,WAAW,EAAE,QAAQ,GAAG,MAAM,OAAU,IAAI,CAAC;AAAA,IACjD,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,EACjD,CAAC;AACD,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc,IAAI;AACtB,MAAI,OAAO,MAAM,UAAU,UAAa,CAAC,YAAY;AACnD,UAAM,CAAC,IAAI,EAAE,IAAI,aAAa,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,aAAa,IAAI;AAChE,UAAM,IAAI,KAAK,IAAI,IAAI,KAAK;AAC5B,kBAAc,IAAI,YAAY,IAAI,OAAK;AACrC,UAAI,EAAE,SAAS,UAAU,EAAE,UAAU,GAAI,QAAO;AAChD,UAAI,EAAE,SAAS,QAAQ;AAAE,cAAM,KAAK,SAAS,EAAE,EAAE,4EAAuE;AAAG,eAAO;AAAA,MAAG;AACrI,YAAM,IAAI,SAAS,GAAG,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM;AACvD,aAAO,EAAE,GAAG,GAAG,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE;AAAA,IAC5F,CAAC;AAAA,EACH;AACA,SAAO,EAAE,KAAK,EAAE,GAAG,KAAK,QAAQ,MAAM,IAAI,OAAO,IAAI,OAAM,EAAE,OAAO,KAAK,OAAO,CAAE,IAAI,CAAC,GAAG,IAAI,QAAQ,IAAI,GAAG,YAAY,GAAG,MAAM;AACpI;AAEO,SAAS,YAAY,KAAU,IAAiB;AACrD,MAAI,CAAC,IAAI,OAAO,KAAK,OAAK,EAAE,OAAO,EAAE,EAAG,OAAM,IAAI,MAAM,kBAAkB,EAAE,GAAG;AAC/E,QAAM,QAAQ,IAAI,YAAY,OAAO,OAAK,EAAE,SAAS,UAAU,EAAE,UAAU,EAAE,EAAE,IAAI,OAAK,EAAE,EAAE;AAC5F,MAAI,MAAM,OAAQ,OAAM,IAAI,MAAM,UAAU,EAAE,iBAAiB,MAAM,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,wCAAmC;AACrI,SAAO,EAAE,GAAG,KAAK,QAAQ,IAAI,OAAO,OAAO,OAAK,EAAE,OAAO,EAAE,EAAE;AAC/D;AAOO,SAAS,WAAW,KAAU,GAA0F;AAC7H,MAAI,CAAC,IAAI,OAAO,KAAK,OAAK,EAAE,OAAO,EAAE,KAAK,EAAG,OAAM,IAAI,MAAM,kBAAkB,EAAE,KAAK,GAAG;AACzF,MAAI,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE,KAAK,EAAG,OAAM,IAAI,MAAM,eAAe,EAAE,KAAK,8EAAyE;AAChK,QAAM,SAAS,EAAE,QAAQ,EAAE;AAC3B,QAAM,MAAM,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAC/C,QAAM,SAAS,KAAK,QAAQ,EAAE;AAC9B,QAAM,QAAQ,SAAS,KAAK,oBAAI,IAAI,CAAC,EAAE,MAAM,IAAI,MAAM,GAAG;AAC1D,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,iBAAiB,MAAM,GAAG;AACtD,QAAME,KAAI,EAAE,KAAK,KAAK,MAAM,IAAI,MAAM,SAAS,KAAK,IAAI,GAAG,IAAI,MAAM,IAAI,OAAK,EAAE,CAAC,CAAC,IAAI,IAAI;AAC1F,MAAI,OAAO,MAAM,MAAM,QAAQ,KAAK,EAAE,IAAI,QAAQ,MAAM,QAAQ,GAAAA,GAAE,CAAC;AACnE,QAAM,CAAC,IAAI,EAAE,IAAI,MAAM,OAAO,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;AAC9C,SAAO,cAAc,MAAM,EAAE,IAAI,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,EAAE,CAAC;AACtG,SAAO,QAAQ,MAAM,EAAE,IAAI,QAAQ,YAAY,EAAE,OAAO,GAAI,EAAE,MAAM,SAAY,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,EAAG,CAAC;AACpG;AAGO,SAAS,YAAY,KAAU,SAAiB,OAA2D,CAAC,GAAW;AAC5H,QAAM,IAAI,IAAI,OAAO,KAAK,CAAAC,OAAKA,GAAE,OAAO,OAAO;AAC/C,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,kBAAkB,OAAO,GAAG;AACpD,QAAM,MAAM,IAAI,YAAY,KAAK,CAAAA,OAAKA,GAAE,SAAS,UAAUA,GAAE,UAAU,OAAO;AAC9E,QAAM,OAAO,MAAM,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,IAAI,IAAI,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,OAAO;AAChG,QAAM,OAAO,QAAQ,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,IAAI;AAC3D,QAAM,WAAW,OAAO,IAAI,MAAM,OAAO,OAAK,EAAE,WAAW,KAAK,EAAE,EAAE,IAAI,OAAK,EAAE,EAAE,IAAI,CAAC;AACtF,QAAM,QAAQ;AAAA,IACZ,2CAA2C,EAAE,EAAE,+BAA+B,IAAI,KAAK,IAAI;AAAA,IAC3F,UAAU,IAAI,KAAK,QAAQ,IAAI,KAAK,QAAQ,OAAO,EAAE;AAAA,IACrD,SAAS,EAAE,QAAQ,UAAU,EAAE,EAAE;AAAA,IACjC,SAAS,EAAE,KAAK,OAAI,EAAE,MAAM,sBAAsB,EAAE,QAAQ,OAAO,kBAAkB,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,6CACnH,OAAO,IAAI,SAAS,WAAW,kCAAkC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,sBAAsB;AAAA,IACjI,OAAO,kCAAkC,KAAK,EAAE,IAAI,KAAK,SAAS,aAAa,KAAK,MAAM,MAAM,EAAE,GAAG,SAAS,SAAS,kBAAkB,SAAS,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM;AAAA,IACzK;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,KAAK,WAAW,SAAU,OAAM;AAAA,IAClC;AAAA,IACA,oCAAoC,KAAK,SAAS,SAAS,OAAO,KAAK,QAAQ,KAAK,IAAI,IAAI,2DAA2D;AAAA,IACvJ;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAWO,SAAS,QAAQ,KAAU,OAAuB;AACvD,QAAM,EAAE,WAAW,GAAG,KAAK,IAAI;AAC/B,MAAI,cAAc,qBAAqB,KAAK,UAAU,GAAG,KAAK,yBAAyB,KAAK,UAAU,GAAG,IAAI;AAC3G,UAAM,IAAI,MAAM,0EAA0E,UAAU,GAAG,IAAI;AAAA,EAC7G;AACA,QAAM,OAAO,UAAU,MAAM,KAAK,MAAM,EAAE,GAAG,IAAI,MAAM,GAAG,MAAM,GAAI,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,aAAa,OAAU,EAAG,CAAC;AAC3I,SAAO,EAAE,GAAG,KAAK,KAAK;AACxB;AAIO,SAAS,QAAQ,KAAU,MAAuC;AACvE,MAAI,IAAI,MAAM,KAAK,CAAAC,OAAKA,GAAE,OAAO,KAAK,EAAE,EAAG,OAAM,IAAI,MAAM,SAAS,KAAK,EAAE,UAAU;AACrF,QAAM,SAAS,KAAK,UAAU,IAAI,MAAM,KAAK,CAAAA,OAAK,CAACA,GAAE,MAAM,EAAG;AAC9D,QAAM,IAAI,UAAU,MAAM,MAAM,QAAQ,MAAM,EAAE,GAAG,MAAM,QAAQ,KAAK,OAAO,SAAS,SAAY,OAAO,CAAC;AAC1G,SAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE;AAC5C;AAEO,SAAS,WAAW,KAAU,IAAY,OAAuB;AACtE,QAAM,IAAI,IAAI,MAAM,UAAU,OAAK,EAAE,OAAO,EAAE;AAC9C,MAAI,IAAI,EAAG,OAAM,IAAI,MAAM,iBAAiB,EAAE,GAAG;AACjD,QAAM,MAAM,IAAI,MAAM,CAAC;AAGvB,QAAM,EAAE,QAAQ,GAAG,KAAK,IAAI;AAC5B,QAAM,OAAO,UAAU,MAAM,MAAM,QAAQ,MAAM;AAAA,IAAE,GAAG;AAAA,IAAK,GAAG;AAAA,IAAM,WAAW,EAAE,GAAG,IAAI,WAAW,GAAG,MAAM,UAAU;AAAA,IACpH,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,UAAU,OAAU;AAAA,EAAG,CAAC;AACpE,SAAO,EAAE,GAAG,KAAK,OAAO,IAAI,MAAM,IAAI,CAAC,GAAGC,OAAOA,OAAM,IAAI,OAAO,CAAE,EAAE;AACxE;AAGO,SAAS,WAAW,KAAU,IAA0C;AAC7E,QAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE;AAC5C,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,iBAAiB,EAAE,GAAG;AACjD,MAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,oBAAoB;AACtD,MAAI,SAAS;AACb,aAAW,KAAK,IAAI,MAAO,KAAI,EAAE,SAAS,IAAI;AAAE,UAAM,IAAI,WAAW,KAAK,EAAE,IAAI,KAAK,MAAM;AAAG,UAAM,EAAE;AAAK,aAAS,KAAK,IAAI,QAAQ,EAAE,MAAM;AAAA,EAAG;AAChJ,SAAO;AAAA,IACL,KAAK;AAAA,MACH,GAAG;AAAA,MACH,OAAO,IAAI,MAAM,OAAO,OAAK,EAAE,OAAO,EAAE,EAAE,IAAI,OAAM,EAAE,WAAW,KAAK,EAAE,GAAG,GAAG,QAAQ,KAAK,OAAO,IAAI,CAAE;AAAA,MACxG,YAAY,IAAI,WAAW,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,EAAE,OAAO,OAAO,OAAK,EAAE,EAAE,WAAW,UAAU,EAAE,OAAO,GAAG,EAAE,EAAE;AAAA,IACrH;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,eAAe,KAAU,IAAwC;AACxE,SAAO,EAAE,GAAG,KAAK,YAAY,IAAI,WAAW,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,EAAE,OAAO,IAAI,OACjF,EAAE,WAAW,cAAc,IAAI,EAAE,GAAG,GAAG,MAAM,EAAE,KAAK,IAAI,QAAM,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,CAAa,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;AAC5G;AAOO,SAAS,QAAQ,KAAU,MAAuC;AACvE,QAAM,MAAM,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,EAAE;AAChD,MAAI,OAAO,KAAK,QAAQ,KAAK,SAAS,IAAI,KAAM,OAAM,WAAW,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE;AAC1F,QAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,EAAE;AACjD,QAAM,OAAO,UAAU,MAAM,MAAM,QAAQ,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AACrE,MAAI,KAAM,QAAO,EAAE,GAAG,KAAK,OAAO,IAAI,MAAM,IAAI,OAAM,EAAE,OAAO,KAAK,KAAK,OAAO,CAAE,EAAE;AACpF,SAAO,eAAe,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,OAAO,IAAI,EAAE,GAAG,OAAM,EAAE,SAAS,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE,CAAE;AACjH;AAEO,SAAS,WAAW,KAAU,IAAiB;AACpD,QAAM,OAAO,IAAI,IAAI,IAAI,YAAY,OAAO,OAAK,EAAE,SAAS,EAAE,EAAE,IAAI,OAAK,EAAE,EAAE,CAAC;AAC9E,SAAO,eAAe;AAAA,IACpB,GAAG;AAAA,IACH,OAAO,IAAI,MAAM,OAAO,OAAK,EAAE,OAAO,EAAE,EAAE,IAAI,OAAK,KAAK,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,OAAU,IAAI,CAAC;AAAA,IACzG,aAAa,IAAI,YAAY,OAAO,OAAK,EAAE,SAAS,EAAE;AAAA,IACtD,YAAY,IAAI,WAAW,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,EAAE,OAAO,OAAO,OAAK,EAAG,EAAE,WAAW,UAAU,EAAE,OAAO,MAAQ,EAAE,WAAW,YAAY,KAAK,IAAI,EAAE,EAAE,EAAG,EAAE,EAAE;AAAA,EACpK,GAAG,OAAK,EAAE,OAAO,OAAK,MAAM,EAAE,CAAC;AACjC;AASO,SAAS,WAAW,KAAU,QAAgB,MAA4C;AAC/F,QAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAChD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,iBAAiB,MAAM,GAAG;AACrD,MAAI,KAAK,SAAS,KAAM,QAAO,EAAE,KAAK,QAAQ,EAAE;AAChD,QAAM,OAAO,SAAS,KAAK,oBAAI,IAAI,CAAC;AACpC,QAAM,OAAO,KAAK,MAAM,IAAI,KAAK,IAAI,GAAG,OAAO,KAAK,KAAK,MAAM,IAAI,IAAI,GAAG;AAC1E,MAAI,CAAC,GAAI,OAAM,IAAI,MAAM,iBAAiB,IAAI,GAAG;AACjD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,SAAS,MAAM,2BAA2B,KAAK,IAAI,GAAG;AACjF,QAAM,QAAQ,OAAO,EAAE;AACvB,MAAI,SAAS;AACb,QAAM,cAAc,IAAI,YAAY,IAAI,OAAK;AAC3C,QAAI,EAAE,SAAS,OAAQ,QAAO;AAC9B,QAAI,EAAE,SAAS,UAAU;AACvB,YAAM,IAAI,IAAI,MAAM,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;AACtE,YAAM,IAAI,IAAI,OAAO,CAAC;AACtB,YAAM,IAAI,UAAU,CAAC;AAIrB,YAAM,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAIhC,YAAM,OAAO,EAAE,GAAG,GAAG,GAAG,OAAO,EAAE,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC,GAAG,UAAU,OAAO,EAAE,KAAK,GAAG,QAAQ,OAAO,EAAE,MAAM,GAAG,QAAQ,OAAO,MAAM,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;AACzJ,YAAM,IAAI,IAAI,IAAI,SAAS,KAAK,GAAG,KAAK,GAAG,KAAK,UAAU,KAAK,QAAQ,KAAK,MAAM,CAAC;AACnF,YAAM,CAAC,GAAG,CAAC,IAAI,WAAW,KAAK,CAAC;AAChC,iBAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG;AAC3F,cAAM,IAAI,MAAM,GAAG,IAAI,EAAE,GAAG,IAAI,MAAM,GAAG,IAAI,EAAE;AAC/C,iBAAS,KAAK,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAAA,MAChE;AACA,aAAO;AAAA,IACT;AACA,QAAI,EAAE,UAAU;AACd,YAAM,IAAI,EAAE,SAAS,MAAM;AAC3B,eAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,GAAG;AAAE,cAAM,CAAC,IAAI,EAAE,IAAI,MAAM,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAAG,cAAM,CAAC,IAAI,EAAE,IAAI,MAAM,OAAO,IAAI,EAAE;AAAG,UAAE,CAAC,IAAI,OAAO,EAAE;AAAG,UAAE,IAAI,CAAC,IAAI,OAAO,EAAE;AAAA,MAAG;AACvK,aAAO,EAAE,GAAG,GAAG,UAAU,EAAE;AAAA,IAC7B;AACA,WAAO;AAAA,EACT,CAAC;AACD,SAAO,EAAE,KAAK,EAAE,GAAG,KAAK,aAAa,OAAO,IAAI,MAAM,IAAI,OAAM,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,KAAK,IAAI,CAAE,EAAE,GAAG,QAAQ,KAAK,MAAM,SAAS,GAAI,IAAI,IAAK;AACrJ;AAGO,SAAS,aAAa,KAAU,OAAsB;AAC3D,QAAM,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,OAAK,EAAE,EAAE,CAAC;AAC5C,MAAI,MAAM,WAAW,IAAI,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,MAAM,UAAU,CAAC,MAAM,MAAM,OAAK,IAAI,IAAI,CAAC,CAAC,EAAG,OAAM,IAAI,MAAM,yCAAyC;AACjK,QAAMH,KAAI,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,SAAO,EAAE,GAAG,KAAK,OAAO,IAAI,MAAM,IAAI,QAAM,EAAE,GAAG,GAAG,GAAGA,GAAE,IAAI,EAAE,EAAE,EAAG,EAAE,EAAE;AAC1E;AAKO,SAAS,cAAc,KAAU,KAA2E;AACjH,QAAM,MAAM,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,IAAI,EAAE;AACrD,MAAI,OAAO,IAAI,SAAS,SAAU,OAAM,IAAI,MAAM,eAAe,IAAI,EAAE,UAAU,IAAI,IAAI,eAAe;AACxG,QAAM,OAAO,WAAiB,MAAM,EAAE,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;AACtE,SAAO,EAAE,GAAG,KAAK,aAAa,MAAM,IAAI,YAAY,IAAI,OAAM,EAAE,OAAO,IAAI,KAAK,OAAO,CAAE,IAAI,CAAC,GAAG,IAAI,aAAa,IAAI,EAAE;AAC1H;AAGO,SAAS,iBAAiB,KAAU,KAAoD;AAC7F,QAAM,OAAO,WAAiB,MAAM,GAAG;AACvC,QAAMI,UAAS,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,IAAI,EAAE;AACxD,SAAO,EAAE,GAAG,KAAK,aAAaA,UAAS,IAAI,YAAY,IAAI,OAAM,EAAE,OAAO,IAAI,KAAK,OAAO,CAAE,IAAI,CAAC,GAAG,IAAI,aAAa,IAAI,EAAE;AAC7H;AAEA,IAAMC,WAAU,CAAC,MAA2B,GAAG,EAAE,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI;AAGzE,SAAS,eAAe,KAAU,IAAY,MAAiE;AAC7G,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAa,IAAI,WAAW,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,EAAE,OAAO,OAAO,OAAK;AAC/E,QAAI,EAAE,WAAW,YAAY,EAAE,OAAO,MAAM,EAAE,SAAS,WAAY,QAAO;AAC1E,UAAM,KAAK,EAAE,KAAK,MAAM,OAAK,MAAM,QAAQ,EAAE,CAAC,KAAK,KAAK,EAAE,EAAE,MAAM,CAAC;AACnE,QAAI,CAAC,GAAI,SAAQ,KAAK,UAAU,EAAE,gBAAgB,EAAE,EAAE,EAAE;AACxD,WAAO;AAAA,EACT,CAAC,EAAE,EAAE;AACL,SAAO,EAAE,KAAK,EAAE,GAAG,KAAK,WAAW,GAAG,QAAQ;AAChD;AAOO,SAAS,QAAQ,KAAU,IAAY,OAA2J;AACvM,QAAM,MAAM,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE;AACjD,MAAI,CAAC,OAAO,IAAI,SAAS,OAAQ,OAAM,IAAI,MAAM,eAAe,EAAE,iBAAiB;AACnF,MAAI,MAAM,YAAY,MAAM,QAAS,OAAM,IAAI,MAAM,eAAe,EAAE,mEAAmE;AACzI,QAAM,OAAuB,EAAE,GAAG,KAAK,GAAG,MAAM;AAChD,MAAI,MAAM,SAAU,QAAQ,KAA+B;AAC3D,MAAI,MAAM,QAAS,QAAQ,KAAgC;AAC3D,QAAM,IAAI,KAAK,IAAI,SAAS;AAC5B,MAAI,KAAK,YAAY,KAAK,SAAS,WAAW,IAAI,EAAG,OAAM,IAAI,MAAM,sBAAsB,IAAI,CAAC,2BAA2B,CAAC,mBAAmB,KAAK,SAAS,MAAM,EAAE;AACrK,MAAI,KAAK,WAAW,KAAK,QAAQ,WAAW,EAAG,OAAM,IAAI,MAAM,qBAAqB,CAAC,0CAA0C,KAAK,QAAQ,MAAM,EAAE;AACpJ,QAAM,UAAU,EAAE,GAAG,KAAK,aAAa,IAAI,YAAY,IAAI,OAAM,EAAE,OAAO,KAAK,WAAiB,MAAM,IAAI,IAAI,CAAE,EAAE;AAClH,QAAM,MAAM,aAAa,IAAI;AAC7B,SAAO,eAAe,SAAS,IAAI,OAAK,MAAM,GAAG;AACnD;AAGO,IAAM,aAAa,CAAC,KAAU,IAAY,YAAoD;AACnG,QAAM,MAAM,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE;AACjD,QAAM,aAAa,KAAK,SAAS,UAAU,IAAI,SAAS,WAAW,QAAQ,UAAU,IAAI,QAAQ,MAAM,CAAC,MAAM,MAAM,KAAK,WAAW,QAAQ,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,KAAKF,OAAM,IAAI,SAAS,QAAQ,CAAC,EAAEA,EAAC,EAAE,IAAI,CAAC;AAChN,QAAM,SAAS,QAAQ,KAAK,IAAI,EAAE,QAAQ,CAAC;AAC3C,MAAI,WAAY,QAAO;AACvB,QAAM,UAAU,eAAe,OAAO,KAAK,IAAI,MAAM,KAAK;AAC1D,SAAO,EAAE,KAAK,QAAQ,KAAK,SAAS,CAAC,GAAG,OAAO,SAAS,GAAG,QAAQ,OAAO,EAAE;AAC9E;AAGO,SAAS,cAAc,KAAUG,OAA6D;AACnG,QAAM,MAAM,IAAI,YAAY,KAAK,OAAK,EAAE,OAAOA,MAAK,EAAE;AACtD,MAAI,CAAC,OAAO,IAAI,SAAS,SAAU,OAAM,IAAI,MAAM,eAAeA,MAAK,EAAE,mBAAmB;AAC5F,QAAM,gBAA0B,CAAC;AACjC,QAAM,aAAa,IAAI,WAAW,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,EAAE,OAAO,OAAO,OAAK;AAC/E,UAAM,OAAO,EAAE,WAAW,YAAY,EAAE,OAAOA,MAAK;AACpD,QAAI,KAAM,eAAc,KAAK,GAAGD,SAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE;AACvD,WAAO,CAAC;AAAA,EACV,CAAC,EAAE,EAAE;AACL,SAAO,EAAE,KAAK,EAAE,GAAG,KAAK,aAAa,IAAI,YAAY,IAAI,OAAM,EAAE,OAAOC,MAAK,KAAK,WAAiB,MAAMA,KAAI,IAAI,CAAE,GAAG,WAAW,GAAG,cAAc;AACpJ;AAEO,SAAS,iBAAiB,KAAU,IAAiB;AAC1D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa,IAAI,YAAY,OAAO,OAAK,EAAE,OAAO,EAAE;AAAA,IACpD,OAAO,IAAI,MAAM,IAAI,QAAM,EAAE,GAAG,GAAG,YAAY,EAAE,eAAe,KAAK,SAAY,EAAE,YAAY,MAAM,EAAE,SAAS,KAAK,SAAY,EAAE,KAAK,EAAE;AAAA,IAC1I,YAAY,IAAI,WAAW,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,EAAE,OACpD,OAAO,OAAK,EAAE,EAAE,WAAW,YAAY,EAAE,OAAO,GAAG,EACnD,IAAI,OAAM,EAAE,WAAW,UAAU,EAAE,SAAS,eAAe,EAAE,GAAG,GAAG,MAAM,EAAE,KAAK,IAAI,OAAM,EAAE,MAAM,KAAK,EAAE,GAAG,GAAG,GAAG,KAAK,IAAI,CAAE,EAAE,IAAI,CAAE,EAAE,EAAE;AAAA,EAC9I;AACF;AAmBA,IAAM,oBAAoB,EAAE,IAAI,cAAU,WAAW,qBAAiB,MAAM,eAAW;AACvF,IAAM,UAAU,CAAC,SAA0B,SAAS,OAAO,OAAO;AAE3D,IAAM,iBAAiB,CAAC,KAAU,OACvC,IAAI,GAAG,KAAK,OAAK,EAAE,OAAO,EAAE,IAAI,OAAO,IAAI,UAAU,KAAK,OAAK,EAAE,OAAO,EAAE,IAAI,cAAc,IAAI,KAAK,KAAK,OAAK,EAAE,OAAO,EAAE,IAAI,SAAS;AAQlI,SAAS,cAAc,KAAU,MAAsB,IAAY,OAAqC;AAC7G,QAAM,WAAW,eAAe,KAAK,EAAE;AACvC,MAAI,YAAY,aAAa;AAC3B,UAAM,IAAI,MAAM,eAAe,EAAE,gBAAgB,QAAQ,QAAQ,CAAC,IAAI,QAAQ,+BAA+B,QAAQ,IAAI,CAAC,IAAI,IAAI,0BAA0B;AAC9J,QAAM,MAAO,IAAI,IAAI,EAAuB,KAAK,OAAK,EAAE,OAAO,EAAE;AACjE,QAAM,QAAQ,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS,CAAC;AAEzF,MAAI,CAAC,OAAO,EAAE,MAAM,SAAS,MAAM,QAAS,OAAM,IAAI,MAAM,MAAM,IAAI,gBAAgB,EAAE,qDAAqD;AAC7I,QAAM,OAAO,kBAAkB,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,GAAG,OAAO,GAAG,CAAC;AAGnE,QAAM,OAAO,MAAO,IAAI,IAAI,EAAuB,IAAI,OAAM,EAAE,OAAO,KAAK,OAAO,CAAE,IAAI,CAAC,GAAI,IAAI,IAAI,GAAiB,IAAI;AAC1H,MAAI,SAAS;AAAM,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,IAAK,KAAI,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC,GAAG,WAAW,KAAK,MAAM,IAAI,CAAC,EAAG,OAAM,IAAI,MAAM,OAAO,EAAE,uDAAuD;AAAA;AAC9N,SAAO,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK;AAChC;AAGO,SAAS,iBAAiB,KAAU,IAAiB;AAC1D,QAAM,OAAO,eAAe,KAAK,EAAE;AACnC,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,uBAAuB,EAAE,GAAG;AACvD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,CAAC,IAAI,GAAI,IAAI,IAAI,EAAuB,OAAO,OAAK,EAAE,OAAO,EAAE;AAAA,IAC/D,YAAY,IAAI,WAAW,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,EAAE,OAAO,OAAO,OAAK,EAAE,EAAE,WAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,EAAE;AAAA,EACnH;AACF;AAWO,SAAS,WAAW,KAAU,MAAc,OAA+E,CAAC,GAAwF;AACzN,QAAM,KAAK,GAAG,IAAI;AAClB,MAAI,eAAe,KAAK,EAAE,EAAG,OAAM,IAAI,MAAM,eAAe,EAAE,+DAA+D;AAC7H,QAAM,OAAO,KAAK,SAAS,WAAW,KAAK,IAAI;AAC/C,MAAI,CAAC,KAAK,UAAU,KAAK,GAAG,EAAE,MAAM,KAAM,OAAM,IAAI,MAAM,+CAA+C;AACzG,QAAM,SAAS,IAAI,MAAM,KAAK,OAAK,CAAC,EAAE,MAAM,EAAG;AAC/C,MAAI,KAAK,SAAS,KAAK,SAAS,MAAM,EAAG,OAAM,IAAI,MAAM,4DAA4D;AACrH,QAAM,OAAO,KAAK,SAAS,MAAM,IAAI,2FAAsF;AAC3H,QAAM,QAAQ,OAAO,CAAC,IAAI,IAAI;AAG9B,MAAI,MAAM,WAAW,KAAK,CAAC,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,EAAG;AAC7D,UAAM,IAAI,MAAM,SAAS,IAAI,gGAAgG;AAC/H,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,EAAG,OAAM,IAAI,MAAM,SAAS,MAAM,kCAAkC;AAC3G,QAAM,OAAO,SAAS,KAAK,oBAAI,IAAI,CAAC;AACpC,QAAM,CAAC,MAAM,IAAI,IAAI,SAAS,MAAM,KAAK;AACzC,QAAM,eAAe,YAAY,MAAM,KAAK;AAC5C,QAAM,CAAC,IAAI,EAAE,IAAI,MAAM,OAAO,KAAK,MAAM,IAAI,MAAM,EAAG,KAAK,GAAG,MAAM,IAAI;AAGxE,MAAI,OAAO,QAAQ,KAAK,EAAE,IAAI,QAAQ,QAAQ,QAAQ,MAAM,aAAa,WAAW,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;AACtI,QAAM,QAAQ,KAAK,IAAI,GAAG,GAAG,KAAK,GAAG,IAAI,OAAK,EAAE,KAAK,GAAG,GAAG,KAAK,UAAU,IAAI,OAAK,EAAE,KAAK,GAAG,GAAG,KAAK,KAAK,IAAI,OAAK,EAAE,KAAK,CAAC,IAAI;AAC/H,SAAO,cAAc,MAAM,MAAM,IAAI,EAAE,OAAO,OAAO,QAAQ,cAAc,KAAK,KAAK,OAAO,GAAG,UAAU,KAAK,YAAY,GAAG,MAAM,CAAC;AACpI,SAAO,EAAE,KAAK,MAAM,OAAO,QAAQ,cAAc,KAAK;AACxD;AAQA,IAAM,YAAY,CAAC,MAAgB,IAAY,MAAc,MAAwD,WACnH,wBAAwB,MAAM,MAAM,EAAE,IAAI,MAAM,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,QAAQ,eAAe,KAAK,CAAC;AAGnH,SAAS,QAAQ,KAAU,KAAsD;AAC/E,QAAM,MAAM,aAAa,GAAG;AAC5B,SAAO,eAAe,iBAAiB,KAAK,GAAG,GAAG,IAAI,IAAI,OAAK,MAAM,GAAG;AAC1E;AAGA,IAAM,eAAe,CAAC,KAAqB,MAA4B;AACrE,QAAM,MAAkB,CAAC;AACzB,MAAI,CAAC,IAAI,SAAS;AAAE,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,EAAG,KAAI,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AAAG,WAAO;AAAA,EAAK;AACnG,MAAI,IAAI;AACR,aAAW,QAAQ,IAAI,SAAS;AAAE,QAAI,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI,KAAK,MAAM,CAAC;AAAG,SAAK,IAAI,KAAK;AAAA,EAAQ;AACnG,SAAO;AACT;AAMA,SAAS,cAAc,KAAU,IAAY,KAAa,KAAqC;AAC7F,QAAM,OAAO,CAAC,MAA+B,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,OAAO,OAAO,EAAE,CAAC,MAAM;AACrG,SAAO,EAAE,GAAG,KAAK,YAAY,IAAI,WAAW,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,EAAE,OAAO,IAAI,OAChF,EAAE,WAAW,YAAY,EAAE,OAAO,MAAM,EAAE,SAAS,aAChD,EAAE,GAAG,GAAG,MAAM,EAAE,KAAK,IAAI,OAAM,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,CAAE,EAAE,IACvE,CAAW,EAAE,EAAE,EAAE;AACzB;AAUO,SAAS,kBAAkB,KAAU,IAAY,MAAc,MAAuD;AAC3H,QAAM,MAAM,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE;AACjD,MAAI,OAAO,IAAI,SAAS,OAAQ,OAAM,IAAI,MAAM,eAAe,EAAE,UAAU,IAAI,IAAI,cAAc;AACjG,MAAI,CAAC,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,EAAG,OAAM,IAAI,MAAM,iBAAiB,IAAI,GAAG;AACjF,QAAM,MAAM,KAAK,YAAY,KAAK;AAClC,OAAK,KAAK,SAAS,IAAI,MAAM,MAAM,IAAI,OAAO;AAC5C,UAAM,IAAI,MAAM,eAAe,EAAE,2GAA2G;AAC9I,MAAI,KAAK,YAAY,KAAK,QAAS,OAAM,IAAI,MAAM,eAAe,EAAE,mEAAmE;AACvI,QAAM,SAAS,KAAK,WAAW,KAAK,SAAS,SAAS,IAAI,SAAS;AACnE,QAAM,OAAO,SAAS,KAAK,oBAAI,IAAI,CAAC;AAEpC,QAAM,gBAAgB,KAAK,SAAS,SAAS,IAAI,gBAAgB;AACjE,MAAI,KAAK,QAAQ;AACf,UAAM,WAAW,eAAe,MAAM,MAAM,KAAK,QAAQ,MAAM;AAC/D,WAAO,QAAQ,KAAK,EAAE,IAAI,MAAM,MAAM,QAAQ,GAAG,UAAU,QAAQ,cAAc,CAAC;AAAA,EACpF;AACA,MAAI,KAAK,YAAY,KAAK,SAAS,SAAS,MAAM;AAChD,UAAM,IAAI,MAAM,eAAe,EAAE,0GAA0G,KAAK,SAAS,MAAM,EAAE;AACnK,MAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,MAAM;AAC9C,UAAM,IAAI,MAAM,eAAe,EAAE,uGAAuG,KAAK,QAAQ,MAAM,EAAE;AAC/J,QAAM,OAAO,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,EAAE,SAAS,KAAK,QAAS;AACpF,QAAM,UAAU,YAAY,KAAK,WAAW,KAAK,SAAS,SAAS,IAAI,KAAK,QAAS,MAAM;AAC3F,MAAI,UAAU,EAAG,OAAM,IAAI,MAAM,eAAe,EAAE,6CAA6C,OAAO,EAAE;AACxG,MAAI,UAAU,UAAU,EAAG,OAAM,IAAI,MAAM,eAAe,EAAE,sDAAsD,OAAO,EAAE;AAE3H,aAAW,OAAO,KAAK,SAAS,KAAK,KAAK,CAAC;AACzC,QAAI,CAAC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAG,OAAM,IAAI,MAAM,eAAe,EAAE,sCAAsC,IAAI,IAAI,GAAG;AACnH,QAAM,UAAU,aAAa,UAAU,MAAM,IAAI,MAAM,MAAM,MAAM,GAAG,MAAM;AAC5E,SAAO,QAAQ,KAAK,EAAE,IAAI,MAAM,MAAM,QAAQ,GAAG,MAAM,SAAS,QAAQ,cAAc,CAAC;AACzF;AAiBO,SAAS,aAAa,KAAU,IAAY,IAAyB,OAAe,IAAI,KAAsC;AACnI,QAAM,MAAM,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE;AACjD,MAAI,CAAC,OAAO,IAAI,SAAS,OAAQ,OAAM,IAAI,MAAM,eAAe,EAAE,iBAAiB;AACnF,QAAM,QAAQ,YAAY,GAAG;AAC7B,QAAM,UAAU,YAAY,KAAK;AACjC,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,SAAS;AACpD,UAAM,IAAI,MAAM,SAAS,EAAE,aAAa,KAAK,qBAAqB,OAAO,WAAW;AACtF,QAAM,OAAO,SAAS,KAAK,oBAAI,IAAI,CAAC;AACpC,QAAM,QAAQ,SAAS,wBAAwB,MAAM,IAAI,MAAM,GAAG,CAAC;AAEnE,MAAI,OAAO,UAAU;AACnB,QAAI,UAAU,KAAK,IAAI,SAAS,IAAI;AAClC,YAAM,IAAI,MAAM,SAAS,EAAE,uEAAuE,KAAK,oBAAoB;AAC7H,UAAM,OAAO,IAAI,UAAU,EAAE,SAAS,aAAa,IAAI,SAAS,KAAK,EAAE,IAAI,EAAE,UAAU,QAAQ,aAAa,SAAS,IAAI,QAAS,GAAG,KAAK,CAAC,EAAE;AAC7I,UAAMC,WAAU,aAAa,QAAQ,aAAa,OAAO,KAAK,CAAC,GAAG,IAAI,MAAM;AAC5E,WAAO,QAAQ,KAAK,EAAE,GAAG,KAAK,GAAG,MAAM,SAAAA,SAAQ,CAAC;AAAA,EAClD;AAEA,MAAI,CAAC,IAAI,UAAU,SAAS,UAAU;AACpC,UAAM,IAAI,MAAM,SAAS,EAAE,aAAa,KAAK,8GAAyG,UAAU,CAAC,sBAAsB;AACzL,MAAI,EAAE,IAAI,KAAK,IAAI,GAAI,OAAM,IAAI,MAAM,SAAS,EAAE,8EAA8E,CAAC,EAAE;AACnI,QAAM,EAAE,QAAQ,QAAQ,WAAW,OAAO,IAAI,WAAW,QAAQ,KAAK,GAAG,IAAI,QAAQ,OAAO,CAAC;AAC7F,QAAM,UAAU,aAAa,QAAQ,aAAa,OAAO,OAAO,QAAQ,QAAQ,SAAS,CAAC,GAAG,IAAI,MAAM;AAGvG,QAAM,MAAM,CAAI,UAAoB,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,OAAK,OAAO,QAAQ,IAAI,KAAK,KAAK,CAAC;AAQxF,QAAM,WAAW,CAAC,SAChB,cAAc,KAAK,IAAI,aAAa,GAAG,GAAG,OAAK,KAAK,aAAa,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AAClF,MAAI,CAAC,IAAI,SAAS;AAGhB,UAAM,MAAM,OAAO,KAAK,MAAM,IAAI,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,IAAI,EAAG,IAAI,EAAG,KAAK;AACtF,UAAM,QAAQ,CAAC,MAAc;AAAE,YAAM,CAAC,GAAG,CAAC,IAAI,MAAM,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAG,aAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,IAAG;AACrG,UAAM,WAAW,QAAQ,aAAa,SAAS,IAAI,QAAS,GAAG,OAAO,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC;AAE9J,UAAMC,SAAQ,SAAS,OAAK;AAAE,YAAM,KAAK,IAAI,CAAC,GAAGC,MAAK,CAAC,MAAc,WAAW,IAAI,OAAO,CAAC,CAAC;AAAG,aAAO,aAAa,GAAG,OAAOA,IAAG,CAAC,GAAG,CAACA,IAAG,CAAC,GAAGA,IAAG,CAAC,GAAGA,IAAG,CAAC,CAAC,GAAGA,IAAG,CAAC,CAAC;AAAA,IAAG,CAAC;AACrK,WAAO,QAAQD,QAAO,EAAE,GAAG,KAAK,UAAU,QAAQ,CAAC;AAAA,EACrD;AAGA,QAAM,UAAU,IAAI,IAAI,OAAO;AAC/B,QAAM,KAAK,CAAC,MAAc,gBAAgB,SAAS,OAAO,CAAC,CAAC;AAC5D,QAAM,UAAU,aAAa,IAAI,SAAS,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AACpF,QAAM,QAAQ,SAAS,OAAK;AAAE,UAAM,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAc,aAAa,SAAS,IAAI,OAAO,CAAC,CAAC;AAAG,WAAO,aAAa,GAAG,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAAA,EAAG,CAAC;AACtL,SAAO,QAAQ,OAAO,EAAE,GAAG,KAAK,SAAS,QAAQ,CAAC;AACpD;AAQO,SAAS,QAAQ,KAAU,QAAgB,OAA4B,MAAkB,UAAmB,OAA4B,CAAC,GAAQ;AACtJ,QAAM,OAAO,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,MAAM,KAAK,EAAE,IAAI,QAAQ,UAAU,YAAY,GAAG,MAAM,OAAO,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE;AACrI,QAAM,OAAO,CAAC,MAAa,EAAE,WAAW,MAAM,UAAU,EAAE,OAAO,MAAM,MAAM,EAAE,SAAS,MAAM;AAC9F,QAAM,MAAM,KAAK,OAAO,KAAK,IAAI;AACjC,QAAM,QAAQ,KAAK,IAAI,QAAM,EAAE,GAAG,GAAG,MAAM,EAAE,QAAS,cAAwB,EAAE;AAChF,QAAM,OAAO,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC,GAAG,OAAO,OAAK,CAAC,MAAM,KAAK,OAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;AAC5H,QAAM,SAAS,CAAC,GAAG,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AAG3D,QAAM,SAAS,EAAE,GAAG,KAAK,GAAG,OAAO,eAAe,MAAM,iBAAiB,KAAK,eAAe,MAAM,OAAO;AAC1G,QAAM,SAAS,KAAK,OAAO,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,OAAM,KAAK,CAAC,IAAI,SAAS,CAAE,IAAI,CAAC,GAAG,KAAK,QAAQ,MAAM;AAC9G,QAAM,MAAM,YAAY,KAAK,IAAI,KAAK,UAAU,GAAG,OAAO,IAAI,OAAK,EAAE,CAAC,CAAC;AACvE,QAAM,OAAO,EAAE,GAAG,MAAM,QAAQ,UAAU,KAAK,QAAQ,OAAU;AACjE,SAAO,EAAE,GAAG,KAAK,YAAY,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,MAAM,IAAI,IAAI,WAAW,IAAI,OAAM,EAAE,OAAO,SAAS,OAAO,CAAE,IAAI,CAAC,GAAG,IAAI,YAAY,IAAI,EAAE;AAC7J;AAMO,SAAS,YAAY,KAAU,QAAgB,OAA4B,KAAuE;AACvJ,QAAM,OAAO,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,MAAM;AACrD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,sBAAsB,MAAM,GAAG;AAC1D,QAAM,OAAO,CAAC,MAAa,EAAE,WAAW,MAAM,UAAU,EAAE,OAAO,MAAM,MAAM,EAAE,SAAS,MAAM;AAC9F,QAAM,KAAK,KAAK,OAAO,KAAK,IAAI;AAChC,MAAI,CAAC,GAAI,OAAM,IAAI,MAAM,iBAAiB,MAAM,MAAM,IAAI,MAAM,EAAE,IAAI,MAAM,IAAI,QAAQ,MAAM,GAAG;AACjG,MAAI,GAAG,WAAW,UAAU,GAAG,SAAS,aAAc,OAAM,IAAI,MAAM,6CAA6C;AACnH,QAAM,OAAO,UAAU,KAAK,GAAG,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;AACzD,QAAM,QAAQ,GAAG,WAAW,WAAW,GAAG,SAAS,YAAY,GAAG,SAAS;AAC3E,QAAME,MAAK,CAAC,MAAc,CAAC,EAAE,QAAQ,CAAC,IAAI;AAC1C,QAAM,OAAO,GAAG,KAAK,IAAI,OAAK;AAC5B,QAAI,IAAI,EAAE;AACV,QAAI,IAAI,cAAc,OAAW,KAAI,QAAQ,QAAQ,KAAK,IAAI,OAAO,KAAK,IAAI,aAAa,QAAQ,IAAI,QAAQ,IAAI;AACnH,QAAI,IAAI,OAAQ,MAAK,IAAI;AACzB,WAAO,EAAE,GAAG,GAAG,GAAGA,IAAG,IAAI,YAAY,EAAE,IAAI,IAAI,YAAY,EAAE,CAAC,GAAG,GAAGA,IAAG,CAAC,EAAE;AAAA,EAC5E,CAAC;AACD,QAAM,WAAW,KAAK,IAAI,KAAK,UAAU,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;AAChE,QAAM,OAAO,EAAE,GAAG,MAAM,UAAU,QAAQ,KAAK,OAAO,IAAI,OAAM,KAAK,CAAC,IAAK,EAAE,GAAG,GAAG,KAAK,IAAc,CAAE,GAAG,QAAQ,OAAU;AAC7H,SAAO,EAAE,GAAG,KAAK,YAAY,IAAI,WAAW,IAAI,OAAM,EAAE,OAAO,SAAS,OAAO,CAAE,EAAE;AACrF;AAEO,SAAS,gBAAgB,KAAU,IAAiB;AACzD,SAAO,EAAE,GAAG,KAAK,YAAY,IAAI,WAAW,OAAO,OAAK,EAAE,OAAO,EAAE,EAAE;AACvE;AAGO,SAAS,aAAa,KAAU,IAAY,OAAkG;AACnJ,QAAM,MAAM,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,UAAU,GAAG,MAAM,OAAO,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE;AAC5G,QAAMC,UAAS,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,EAAE;AACnD,MAAI,MAAM,UAAU,MAAM,WAAW,MAAM,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,MAAM,MAAM,EAAG,OAAM,IAAI,MAAM,cAAc,MAAM,MAAM,UAAU;AAChJ,QAAM,SAAS,MAAM,UAAU,IAAI;AACnC,QAAM,OAAO,KAAK,IAAI,GAAG,GAAG,IAAI,OAAO,QAAQ,OAAK,EAAE,KAAK,IAAI,OAAK,EAAE,CAAC,CAAC,GAAG,GAAG,OAAO,IAAI,OAAK,EAAE,CAAC,CAAC;AAClG,MAAI,MAAM,aAAa,UAAa,MAAM,WAAW,OAAO,KAAM,OAAM,IAAI,MAAM,YAAY,MAAM,QAAQ,oCAAoC,IAAI,GAAG;AACvJ,QAAM,OAAkB,EAAE,GAAG,KAAK,IAAI,MAAM,UAAU,IAAI,UAAU,MAAM,YAAY,IAAI,UAAU,MAAM,MAAM,QAAQ,IAAI,MAAM,OAAO;AACzI,SAAO,EAAE,GAAG,KAAK,YAAYA,UAAS,IAAI,WAAW,IAAI,OAAM,EAAE,OAAO,KAAK,OAAO,CAAE,IAAI,CAAC,GAAG,IAAI,YAAY,IAAI,EAAE;AACtH;AAGO,SAAS,WAAW,KAAU,QAAgB,OAA4BC,QAAsB;AACrG,QAAM,OAAO,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,MAAM;AACrD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,sBAAsB,MAAM,GAAG;AAC1D,QAAM,OAAO,CAAC,MAAa,EAAE,WAAW,MAAM,UAAU,EAAE,OAAO,MAAM,MAAM,EAAE,SAAS,MAAM;AAC9F,QAAM,KAAK,KAAK,OAAO,KAAK,IAAI;AAChC,MAAI,CAAC,GAAI,OAAM,IAAI,MAAM,iBAAiB,MAAM,MAAM,IAAI,MAAM,EAAE,IAAI,MAAM,IAAI,QAAQ,MAAM,GAAG;AACjG,QAAM,OAAO,GAAG,KAAK,OAAO,OAAK,CAACA,OAAM,KAAK,OAAK,KAAK,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;AAC3E,QAAM,SAAS,KAAK,SAAS,KAAK,OAAO,IAAI,OAAM,KAAK,CAAC,IAAK,EAAE,GAAG,GAAG,KAAK,IAAc,CAAE,IAAI,KAAK,OAAO,OAAO,OAAK,CAAC,KAAK,CAAC,CAAC;AAC/H,SAAO,EAAE,GAAG,KAAK,YAAY,IAAI,WAAW,IAAI,OAAM,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,QAAQ,QAAQ,OAAU,IAAI,CAAE,EAAE;AACpH;AASA,IAAM,sBAAsB,oBAAI,IAAI,CAAC,KAAK,YAAY,UAAU,QAAQ,CAAC;AAoBlE,SAAS,WAAW,KAAU,QAAgB,MAAgB,IAAc,MAA6G;AAC9L,QAAM,QAAQ,KAAK,SAAS,GAAG,UAAU,KAAK,WAAW;AACzD,MAAI,KAAK,WAAW,GAAG,OAAQ,OAAM,IAAI,MAAM,SAAS,KAAK,MAAM,mBAAmB,GAAG,MAAM,iDAAiD;AAChJ,QAAM,UAAU,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,EAAE,OAAO,QAAM,GAAG,SAAS,EAAE,CAAC;AAC/D,MAAI,QAAQ,OAAQ,OAAM,IAAI,MAAM,OAAO,QAAQ,WAAW,IAAI,KAAK,GAAG,yBAAyB,QAAQ,KAAK,IAAI,CAAC,0CAAqC;AAC1J,QAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,EAAE,OAAO,QAAM,GAAG,OAAO,OAAK,MAAM,EAAE,EAAE,SAAS,CAAC;AAC/E,MAAI,MAAM,OAAQ,OAAM,IAAI,MAAM,OAAO,MAAM,WAAW,IAAI,KAAK,GAAG,oBAAoB,MAAM,KAAK,IAAI,CAAC,0CAAqC;AAC/I,MAAI,EAAE,SAAS,KAAK,SAAS,GAAI,OAAM,IAAI,MAAM,2BAA2B,KAAK,EAAE;AACnF,QAAM,OAAO,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,MAAM;AACrD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,sBAAsB,MAAM,GAAG;AAC1D,aAAW,MAAM,CAAC,GAAG,MAAM,GAAG,EAAE,EAAG,KAAI,CAAC,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,EAAG,OAAM,IAAI,MAAM,iBAAiB,EAAE,GAAG;AAMhH,QAAM,QAAS,QAAQ,IAAK,KAAK;AACjC,QAAM,QAAkB,CAAC,GAAG,QAAkB,CAAC;AAC/C,MAAI,SAAS,GAAG,OAAO;AACvB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,QAAQ,KAAK,CAAC,GAAG,QAAQ,GAAG,CAAC;AACnC,QAAI,MAAM;AACV,eAAW,KAAK,KAAK,QAAQ;AAC3B,UAAI,EAAE,WAAW,UAAU,EAAE,OAAO,MAAO;AAC3C,YAAM;AACN,YAAM,SAAS,WAAW,oBAAoB,IAAI,EAAE,IAAI;AAKxD,YAAM,gBAAgB,UAAU,KAAK,EAAE,KAAK,KAAK,OAAK,EAAE,MAAM,CAAC;AAC/D,UAAI,eAAe;AACjB,cAAM,OAAO,EAAE,KAAK,KAAK,OAAK,EAAE,MAAM,CAAC;AACvC,mBAAW,OAAO,EAAE,KAAK,OAAO,OAAK,EAAE,MAAM,KAAK,QAAQ;AACxD,cAAI,KAAK,IAAK,IAAI,IAAgB,KAAK,CAAY,IAAI,KAAM,OAAM,KAAK,GAAG,KAAK,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,EAAE;AAAA,MACvH;AACA,YAAM,OAAO,gBAAgB,EAAE,KAAK,OAAO,OAAK,EAAE,MAAM,KAAK,QAAQ,IAAI,EAAE;AAC3E,YAAM,OAAO,KAAK,IAAI,OAAK;AACzB,YAAI,UAAU,EAAG,QAAO,EAAE,GAAG,EAAE,GAAG,GAAG,SAAS,CAAE,EAAE,IAAe,EAAE,GAAG,MAAM,EAAE,KAAK;AAGnF,cAAM,UAAU,OAAO,EAAE,IAAI,KAAK;AAClC,eAAO,EAAE,GAAG,WAAW,KAAK,WAAW,UAAU,KAAK,WAAW,SAAS,GAAG,SAAS,CAAE,EAAE,IAAe,EAAE,GAAG,MAAM,EAAE,KAAK;AAAA,MAC7H,CAAC;AACD,aAAO,QAAQ,MAAM,QAAQ,EAAE,QAAQ,QAAQ,IAAI,OAAO,MAAM,EAAE,MAAa,eAAe,EAAE,cAAc,GAAG,IAAI;AACrH;AAAA,IACF;AACA,QAAI,CAAC,IAAK,OAAM,KAAK,KAAK;AAAA,EAC5B;AACA,SAAO,EAAE,KAAK,MAAM,QAAQ,OAAO,MAAM;AAC3C;AAIA,IAAM,KAAK,CAAC,MAAc,OAAO,KAAK,MAAM,IAAI,GAAI,IAAI,GAAI;AAErD,SAAS,aAAa,GAAkB;AAC7C,QAAM,OAAO,EAAE,KAAK,IAAI,OAAK,EAAE,CAAC,EAAE,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAClF,QAAM,QAAQ,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,KAAK,IAAI,OAAK,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AAC7I,SAAO,GAAG,EAAE,KAAK,MAAM,OAAO,EAAE,KAAK,WAAW,IAAI,KAAK,GAAG,IAAI,KAAK;AACvE;AAaO,SAASC,QAAO,KAAU,MAAkB,IAAY,IAAiB;AAC9E,MAAI,CAAC,MAAM,KAAK,EAAE,EAAG,OAAM,IAAI,MAAM,IAAI,EAAE,0BAA0B;AACrE,MAAI,OAAO,GAAI,QAAO;AACtB,QAAM,MAAM,CAAC,MAAe,MAAM,KAAK,KAAK;AAC5C,QAAM,UAAU,CAAC,GAAU,MAAe,MAAyC,OAAO,EAAE,GAAG,GAAG,MAAM,EAAE,KAAK,IAAI,QAAM,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI;AACnJ,QAAM,UAAU,CAAC,WAA4B,CAAC,MAAqB,EAAE,WAAW,UAAU,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;AAC3H,QAAM,SAAS,CAAC,OAAiC,EAAE,GAAG,KAAK,YAAY,IAAI,WAAW,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,EAAE,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE;AACpI,QAAM,QAAQ,CAAC,MAAwB,SAAiB;AAAE,QAAI,KAAK,KAAK,OAAK,EAAE,OAAO,EAAE,EAAG,OAAM,IAAI,MAAM,GAAG,IAAI,KAAK,EAAE,kBAAkB;AAAA,EAAG;AAC9I,QAAM,QAAQ,CAAC,MAAwB,SAAiB;AAAE,QAAI,CAAC,KAAK,KAAK,OAAK,EAAE,OAAO,EAAE,EAAG,OAAM,IAAI,MAAM,WAAW,IAAI,KAAK,EAAE,GAAG;AAAA,EAAG;AACxI,QAAM,aAAa,CAAC,MAA+B,EAAE,SAAS,YAAY,CAAC,EAAE,UAAU,IAAI,EAAE,GAAG,GAAG,SAAS,EAAE,QAAQ,IAAI,OAAK,EAAE,IAAI,QAAM,EAAE,GAAG,GAAG,MAAM,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE;AAC1K,UAAQ,MAAM;AAAA,IACZ,KAAK,QAAQ;AACX,YAAM,IAAI,OAAO,MAAM;AAAG,YAAM,IAAI,OAAO,MAAM;AACjD,YAAM,OAAO,QAAQ,MAAM,CAAC;AAC5B,aAAO;AAAA,QAAE,GAAG;AAAA,QACV,OAAO,IAAI,MAAM,IAAI,QAAM,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,GAAG,GAAI,EAAE,SAAS,EAAE,QAAQ,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAG,EAAE;AAAA,QACnG,OAAO,IAAI,MAAM,IAAI,QAAM,EAAE,GAAG,GAAG,MAAM,IAAI,EAAE,IAAI,EAAE,EAAE;AAAA,QACvD,IAAI,IAAI,GAAG,IAAI,QAAM,EAAE,GAAG,GAAG,OAAO,EAAE,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,EAAE,MAAM,EAAE,EAAE;AAAA,QAC9E,WAAW,IAAI,UAAU,IAAI,QAAM,EAAE,GAAG,GAAG,OAAO,EAAE,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,EAAE,MAAM,EAAE,EAAE;AAAA,QAC5F,MAAM,IAAI,KAAK,IAAI,QAAM,EAAE,GAAG,GAAG,OAAO,EAAE,MAAM,IAAI,GAAG,EAAE,EAAE;AAAA,QAC3D,aAAa,IAAI,YAAY,IAAI,UAAU;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,IAAI,OAAO,MAAM;AAAG,YAAM,IAAI,OAAO,MAAM;AACjD,YAAM,OAAO,OAAK,QAAQ,QAAQ,MAAM,EAAE,CAAC,GAAG,EAAE,WAAW,aAAa,OAAM,MAAM,QAAQ,CAAC,IAAK,EAAe,IAAI,GAAG,IAAI,CAAE,CAAC;AAC/H,aAAO;AAAA,QAAE,GAAG;AAAA,QACV,OAAO,IAAI,MAAM,IAAI,QAAM,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE;AAAA,QACnD,aAAa,IAAI,YAAY,IAAI,QAAM,EAAE,GAAG,GAAG,MAAM,IAAI,EAAE,IAAI,EAAE,EAAE;AAAA,QACnE,MAAM,IAAI,KAAK,IAAI,QAAM,EAAE,GAAG,GAAG,QAAQ,IAAI,EAAE,MAAM,EAAE,EAAE;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,IAAI,aAAa,YAAY;AAAG,YAAM,IAAI,aAAa,YAAY;AACzE,YAAM,OAAO,OAAK,QAAQ,QAAQ,QAAQ,EAAE,CAAC,GAAG,EAAE,WAAW,UAAU,EAAE,SAAS,cAAc,OAAM,OAAO,MAAM,WAAW,IAAI,CAAC,IAAI,CAAE,CAAC;AAC1I,aAAO;AAAA,QAAE,GAAG;AAAA,QACV,aAAa,IAAI,YAAY,IAAI,QAAM,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE;AAAA,QAC/D,OAAO,IAAI,MAAM,IAAI,QAAM,EAAE,GAAG,GAAG,YAAY,EAAE,aAAa,IAAI,EAAE,UAAU,IAAI,QAAW,MAAM,EAAE,OAAO,IAAI,EAAE,IAAI,IAAI,OAAU,EAAE;AAAA,MACxI;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,IAAI,QAAQ,OAAO;AAAG,YAAM,IAAI,QAAQ,OAAO;AACrD,aAAO;AAAA,QAAE,GAAG;AAAA,QACV,QAAQ,IAAI,OAAO,IAAI,QAAM,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE;AAAA,QACrD,aAAa,IAAI,YAAY,IAAI,OAAM,EAAE,SAAS,SAAS,IAAI,EAAE,GAAG,GAAG,OAAO,IAAI,EAAE,KAAK,EAAE,CAAE;AAAA,MAC/F;AAAA,IACF;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,MAAM,CAAC,GAAG,IAAI,IAAI,GAAG,IAAI,WAAW,GAAG,IAAI,IAAI;AACrD,YAAM,KAAK,YAAY;AAAG,YAAM,KAAK,YAAY;AACjD,YAAM,SAAS,eAAe,KAAK,EAAE;AACrC,YAAM,OAAO,QAAQ,MAAM,CAAC;AAC5B,aAAO,EAAE,GAAG,KAAK,CAAC,MAAM,GAAI,IAAI,MAAM,EAAuB,IAAI,QAAM,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;AAAA,IACnG;AAAA,EACF;AACF;AAQO,SAAS,mBAAmB,KAAU,KAAyB;AACpE,QAAM,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,cAAc,IAAI,IAAI;AACzD,MAAI,IAAI,SAAS,UAAU;AACzB,UAAM,IAAI,IAAI,OAAO,KAAK,OAAK,EAAE,OAAO,IAAI,KAAK;AACjD,WAAO,GAAG,IAAI,YAAY,IAAI,KAAK,IAAI,IAAI,KAAK,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,YAAY,QAAQ,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC,UAAU,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,EACzL;AACA,QAAM,IAAI,YAAY,GAAG;AACzB,QAAM,QAAQ,IAAI,UAAU,CAAC,GAAG,IAAI,IAAI,IAAI,QAAQ,KAAK,EAAE,IAAI,OAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC;AACjF,QAAMC,QAAO,IAAI,UACb,cAAc,MAAM,MAAM,QAAQ,MAAM,WAAW,IAAI,KAAK,GAAG,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC,CAAC,gBACvI,yCAAyC,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,IAAI,GAAG,QAAQ,GAAG;AAChG,QAAM,QAAQ,IAAI,SAAS,SACvB,GAAG,CAAC,cAAc,IAAI,UAAU,SAAS,CAAC,oBAAoB,IAAI,IAAI,KACtE,GAAG,CAAC,qBAAqB,YAAY,CAAC,CAAC,aAAa,IAAI,SAAS,WAAW,MAAM,KAAK,IAAI,gBAAgB,kBAAkB,gBAAgB;AACjJ,QAAM,QAAQ,IAAI,WAAW,OAAO,OAAK,EAAE,OAAO,KAAK,OAAK,EAAE,WAAW,YAAY,EAAE,OAAO,IAAI,MAAM,EAAE,SAAS,UAAU,CAAC,EAAE,IAAI,OAAK,EAAE,EAAE;AAC7I,SAAO,GAAG,IAAI,KAAK,KAAK,KAAKA,KAAI,uBAAuB,aAAa,GAAG,CAAC,GAAG,MAAM,SAAS,uBAAuB,MAAM,MAAM,aAAa,MAAM,WAAW,IAAI,KAAK,GAAG,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE;AACvM;AAEO,SAAS,SAAS,KAAU,OAA8B,CAAC,GAAW;AAC3E,QAAM,QAAQ,CAAC,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM,EAAE;AACtE,MAAI,IAAI,KAAK,MAAO,OAAM,KAAK,UAAU,IAAI,KAAK,KAAK,EAAE;AACzD,QAAM,OAAO,CAAC,OAAgB,IAAI,MAAM,OAAO,OAAK,EAAE,WAAW,EAAE;AACnE,QAAM,QAAQ,CAAC,MAAY;AACzB,UAAM,QAAkB,CAAC;AACzB,eAAW,KAAK,IAAI,YAAY,OAAO,CAAAC,OAAKA,GAAE,SAAS,EAAE,EAAE,GAAG;AAC5D,UAAI,EAAE,SAAS,SAAU,OAAM,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,KAAK,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,QAAQ,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,KAAK,EAAE,WAAW,IAAI,UAAU,GAAG,EAAE,MAAM,CAAC,IAAI,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE;AAAA,eACrO,EAAE,SAAS,OAAQ,OAAM,KAAK,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,SAAS,CAAC,MAAM,EAAE,UAAU,SAAS,CAAC,WAAW,EAAE,IAAI,GAAG,EAAE,UAAU,iBAAiB,CAAC,GAAG,IAAI,IAAI,EAAE,QAAQ,KAAK,EAAE,IAAI,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,KAAK,EAAE,GAAG;AAAA,UAClN,OAAM,KAAK,GAAG,EAAE,EAAE,OAAO;AAAA,IAChC;AACA,QAAI,EAAE,UAAU,EAAG,OAAM,KAAK,SAAS,GAAG,EAAE,KAAK,CAAC,EAAE;AACpD,QAAI,EAAE,UAAU,SAAU,OAAM,KAAK,SAAS,EAAE,KAAK,EAAE;AACvD,QAAI,EAAE,UAAU,YAAa,OAAM,KAAK,SAAS,EAAE,KAAK,EAAE;AAC1D,WAAO,MAAM,SAAS,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM;AAAA,EACxD;AACA,QAAM,OAAO,CAAC,GAAS,MAAc;AACnC,UAAM,IAAI,EAAE,WAAW,IAAI,IAAI,MAAM,OAAO,CAAAC,OAAKA,GAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAAA,OAAK,GAAGA,GAAE,EAAE,SAAIA,GAAE,cAAc,QAAG,KAAKA,GAAE,CAAC,GAAG,KAAK,UAAU,MAAMA,EAAC,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI;AAC7J,UAAM,KAAK,GAAG,KAAK,OAAO,CAAC,CAAC,UAAK,EAAE,EAAE,GAAG,EAAE,OAAO,KAAK,EAAE,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,EAAE,MAAM,IAAI,EAAE,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,EAAE,EAAE;AACzJ,SAAK,EAAE,EAAE,EAAE,QAAQ,OAAK,KAAK,GAAG,IAAI,CAAC,CAAC;AAAA,EACxC;AACA,QAAM,KAAK,QAAQ;AAAG,OAAK,MAAS,EAAE,QAAQ,OAAK,KAAK,GAAG,CAAC,CAAC;AAC7D,QAAM,KAAK,WAAW,IAAI,OAAO,IAAI,OAAK,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,KAAK,MAAM,EAAE;AAGnG,QAAM,MAAM,CAAC,MAA0B,EAAE,QAAQ,UAAU,EAAE,KAAK,KAAK;AACvE,MAAI,IAAI,GAAG,UAAU,IAAI,UAAU,UAAU,IAAI,KAAK,QAAQ;AAC5D,QAAI,KAAK,QAAS,OAAM;AAAA,MAAK;AAAA,MAC3B,GAAG,IAAI,GAAG,IAAI,OAAK,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC,SAAI,EAAE,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,eAAe,MAAM,GAAG,GAAG,EAAE,WAAW,SAAS,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,cAAc,EAAE,GAAG,EAAE,UAAU,aAAa,EAAE,GAAG,EAAE,UAAU,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE;AAAA,MACzQ,GAAG,IAAI,UAAU,IAAI,OAAK,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC,SAAI,EAAE,MAAM,IAAI,EAAE,QAAQ,WAAW,EAAE,GAAG,EAAE,WAAW,cAAc,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE;AAAA,MAClP,GAAG,IAAI,KAAK,IAAI,OAAK,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC,SAAI,EAAE,MAAM,KAAK,EAAE,YAAY,IAAI,EAAE,WAAW,IAAI,EAAE,UAAU,QAAQ,GAAG,EAAE,QAAQ,CAAC,YAAY,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE;AAAA,IAAC;AAAA,QACvO,OAAM,KAAK,gBAAgB,CAAC,GAAG,IAAI,GAAG,IAAI,OAAK,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC,SAAI,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,UAAU,IAAI,OAAK,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,MAAM,SAAI,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,OAAK,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,MAAM,SAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EACvQ;AACA,QAAM,KAAK,aAAa;AACxB,aAAW,KAAK,IAAI,YAAY;AAC9B,UAAM,KAAK,YAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,OAAO,UAAU,EAAE,IAAI,EAAE,OAAO,MAAM,UAAU,EAAE,SAAS,WAAW,EAAE,OAAO,IAAI,IAAI,KAAK,UAAU,EAAE,OAAO,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,SAAS,WAAW,EAAE,OAAO,IAAI,OAAK,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE;AAC/P,QAAI,KAAK,QAAS,YAAW,KAAK,EAAE,OAAQ,OAAM,KAAK,SAAS,EAAE,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,KAAK,aAAa,CAAC,CAAC,EAAE;AAAA,EAClH;AACA,QAAM,OAAO,SAAS,GAAG;AACzB,MAAI,KAAK,OAAQ,OAAM,KAAK,WAAW,GAAG,KAAK,IAAI,OAAK,OAAO,CAAC,CAAC;AACjE,SAAO,MAAM,KAAK,IAAI;AACxB;AAkBO,SAAS,WAAW,KAAU,MAA0F;AAC7H,QAAM,IAAI,KAAK,KAAK;AACpB,MAAI,OAAa,oBAAI,IAAI;AAEzB,QAAM,UAAU,CAAC,MAAc,IAAY,SACzC,IAAI,MAAM,WAAW,IAAI,KAAK,EAAE,uBAAuB,KAAK,MAAM,KAAK,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG,KAAK,SAAS,KAAK,aAAQ,EAAE,GAAG;AACxI,MAAI;AACJ,MAAI,KAAK,cAAc,QAAW;AAChC,UAAM,OAAO,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,KAAK,SAAS;AAC7D,QAAI,CAAC,KAAM,OAAM,QAAQ,aAAa,KAAK,WAAW,IAAI,WAAW,IAAI,OAAK,EAAE,EAAE,CAAC;AAGnF,eAAW,KAAK;AAChB,WAAO,OAAO,MAAM,CAAC;AAAA,EACvB,WAAW,KAAK,MAAM,QAAW;AAE/B,UAAM,IAAI,MAAM,KAAK,KAAK,CAAC,iEAAiE;AAAA,EAC9F;AACA,QAAM,OAAO,SAAS,KAAK,IAAI;AAC/B,aAAW,MAAM,KAAK,SAAS,CAAC,EAAG,KAAI,CAAC,KAAK,MAAM,IAAI,EAAE,EAAG,OAAM,QAAQ,QAAQ,IAAI,IAAI,MAAM,IAAI,OAAK,EAAE,EAAE,CAAC;AAC9G,aAAW,MAAM,KAAK,SAAS,CAAC,EAAG,KAAI,CAAC,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,EAAG,OAAM,QAAQ,QAAQ,IAAI,IAAI,MAAM,IAAI,OAAK,EAAE,EAAE,CAAC;AAE5H,QAAM,SAAS,KAAK,SAAS,IAAI,MAAM,IAAI,OAAK,EAAE,EAAE,GAAG,IAAI,QAAM;AAC/D,UAAM,KAAK,KAAK,MAAM,IAAI,EAAE;AAC5B,UAAM,EAAE,GAAG,GAAG,OAAO,QAAQ,OAAO,IAAI,UAAU,GAAG,KAAK;AAC1D,WAAO;AAAA,MAAE;AAAA,MAAI,GAAG,OAAO,CAAC;AAAA,MAAG,GAAG,OAAO,CAAC;AAAA,MAAG,OAAO,OAAO,KAAK;AAAA,MAAG,QAAQ,OAAO,MAAM;AAAA,MAAG,QAAQ,OAAO,MAAM;AAAA,MAC1G,OAAO,EAAE,GAAG,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,GAAG,CAAC,GAAG,UAAU,OAAO,GAAG,QAAQ,EAAE;AAAA,IAAE;AAAA,EAC/E,CAAC;AACD,QAAM,SAAS,KAAK,SAAS,IAAI,MAAM,IAAI,OAAK,EAAE,EAAE,GAAG,IAAI,QAAM;AAC/D,UAAM,MAAM,KAAK,WAAW,IAAI,EAAE;AAClC,UAAM,MAAM,YAAY,KAAK,MAAM,IAAI,GAAG,IAAI;AAC9C,QAAI;AACJ,QAAI,KAAK;AACP,YAAM,KAAK,IAAI,IAAI,OAAK,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,OAAK,EAAE,CAAC,CAAC;AACrD,aAAO,CAAC,OAAO,KAAK,IAAI,GAAG,EAAE,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,EAAE,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,EAAE,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;AAAA,IAC5G;AACA,WAAO,EAAE,IAAI,YAAY,MAAM,IAAI,KAAK,MAAM,KAAK;AAAA,EACrD,CAAC;AACD,SAAO,EAAE,WAAW,KAAK,WAAW,GAAG,UAAU,OAAO,MAAM;AAChE;AAUO,SAAS,QAAQ,KAAU,MAAc,GAAW,GAAW,MAAkI;AACtM,MAAI,CAAC,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,EAAG,OAAM,IAAI,MAAM,iBAAiB,IAAI,GAAG;AAGjF,QAAM,QAAQ,KAAK,MAAM,SAAY,KAAK,KAAK,CAAC,KAAK,KAAK,SAAS,SAAY,SAAS;AACxF,MAAI,KAAK,cAAc,UAAa;AAClC,UAAM,IAAI,MAAM,GAAG,KAAK,sEAAsE;AAChG,QAAM,IAAI,KAAK,KAAK;AAEpB,QAAM,OAAO,KAAK,cAAc,SAAY,SAAY,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,KAAK,SAAS;AACxG,QAAM,OAAa,OAAO,OAAO,MAAM,CAAC,IAAI,oBAAI,IAAI;AAEpD,QAAM,SAAS,SAAS,KAAK,MAAM,IAAI;AACvC,MAAI,UAAU,OAAO,SAAS;AAG5B,UAAM,IAAI,MAAM,SAAS,IAAI,kBAAkB,OAAO,IAAI,gBAAgB,OAAO,EAAE,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE,0IAC3B;AACtF,QAAM,QAAQ,SAAS,OAAO,SAAS;AACvC,QAAM,UAAU,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK;AAClD,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,OAAO,OAAQ,EAAE,aAAa,IAAI,0BAA0B,KAAK,WAAW;AAE1G,QAAM,SAAS,QAAQ,SAAS,SAAS,KAAK,IAAI,EAAE,MAAM,IAAI,QAAQ,MAAM,EAAG,QAAQ;AAGvF,QAAM,CAAC,IAAI,EAAE,KAAK,SAAS,MAAM,OAAO,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,OAAK,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;AAC3F,QAAM,aAAa,QAAQ;AAC3B,MAAI,OAAO;AACX,MAAI,KAAK,cAAc,OAAW,QAAO,WAAW,KAAK,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;AAAA,MAC1F,YAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;AAChD,WAAO,QAAQ,MAAM,KAAK,WAAW,EAAE,QAAQ,QAAQ,IAAI,OAAO,KAAK,GAA0B,CAAC,EAAE,GAAG,GAAG,MAAM,KAAK,KAAK,CAAC,GAAG,QAAW,EAAE,OAAO,KAAK,CAAC;AAO1J,QAAM,QAAc,KAAK,cAAc,SAAY,oBAAI,IAAI,IAAI,OAAO,KAAK,WAAW,KAAK,OAAK,EAAE,OAAO,KAAK,SAAS,GAAI,CAAC;AAC5H,QAAM,OAAO,SAAS,MAAM,KAAK;AACjC,QAAM,SAAS,KAAK,MAAM,IAAI,KAAK,EAAG;AACtC,QAAM,OAAO,KAAK,MAAM,OAAO,KAAK,GAAG,OAAO,KAAK,CAAC;AAEpD,MAAI,OAAO,MAAM;AACf,UAAM,QAAQ,SAAS,MAAM,OAAO,KAAK;AACzC,UAAM,QAAQ,aAAc,IAAI,GAAG,KAAK,OAAK,EAAE,OAAO,UAAU,GAAG,SAAS,CAAC,IAAK,CAAC;AACnF,UAAM,UAAoB,CAAC;AAC3B,aAAS,IAAI,QAAQ,QAAQ,GAAG,IAAI,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,CAAC,GAAG,OAAQ,KAAI,MAAM,SAAS,CAAC,EAAG,SAAQ,KAAK,CAAC;AAClH,UAAM,IAAI,MAAM,IAAI,KAAK,cAAc,OAAO,OAAO,EAAE,CAAC,KAAK,OAAO,OAAO,EAAE,CAAC,WAAM,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,6BACzH,QAAQ,IAAI,KAAK,yBAAyB,MAAM,IAAI,gBAAgB,MAAM,EAAE,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE,wEACrG,QAAQ,SAAS,IAAI,KAAK,gBAAgB,QAAQ,CAAC,CAAC,gBAAgB,UAAU,wGAC9E,iEAA4D,KAAK,cAAc;AAAA,EACvF;AACA,QAAMC,SAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,QAAM,KAAK,CAAC,MAA4B,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;AACnE,SAAO;AAAA,IAAE,KAAK;AAAA,IAAM;AAAA,IAAO;AAAA,IACzB,QAAQ,GAAG,CAACA,OAAM,MAAM,IAAIA,OAAM,MAAM,EAAE,CAAC;AAAA,IAC3C,KAAK,GAAG,MAAMA,OAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,EAAG,QAAQ,CAAC,CAAC;AAAA,EAAE;AAC/E;;;ACjiCA,SAAS,SAAS,gBAAgB;AAClC,SAAS,QAAAC,OAAM,YAAAC,iBAAgB;AA8B/B,IAAM,iBAAyC;AAAA,EAC7C,MAAM;AAAA,EAAQ,MAAM;AAAA,EAAS,OAAO;AAAA,EAAQ,MAAM;AAAA,EAAQ,MAAM;AAAA,EAChE,OAAO;AAAA,EAAS,OAAO;AAAA,EAAS,aAAa;AAAA,EAAS,aAAa;AAAA,EACnE,WAAW;AAAA,EAAe,WAAW;AAAA,EAAe,QAAQ;AAAA,EAAa,QAAQ;AAAA,EACjF,OAAO;AAAA,EAAQ,OAAO;AAAA,EAAQ,MAAM;AAAA,EAAQ,MAAM;AAAA,EAAQ,OAAO;AACnE;AAEO,SAAS,QAAQ,KAA+B;AACrD,MAAI,IAAI,SAAS,MAAM,IAAI,aAAa,CAAC,MAAM,cAAc,IAAI,aAAa,CAAC,MAAM,UAAY,OAAM,IAAI,MAAM,2BAA2B;AAC5I,MAAI,IAAI,aAAa,EAAE,MAAM,WAAY,OAAM,IAAI,MAAM,0BAA0B;AACnF,SAAO,CAAC,IAAI,aAAa,EAAE,GAAG,IAAI,aAAa,EAAE,CAAC;AACpD;AAEA,eAAsB,aAAa,KAAU,KAAa,YAAY,UAAwB;AAC5F,MAAI;AACJ,MAAI;AAAE,YAAQ,KAAK,MAAM,MAAM,SAASC,MAAK,KAAK,aAAa,GAAG,MAAM,CAAC;AAAA,EAAG,SACrE,GAAG;AACR,QAAK,EAA4B,SAAS,SAAU,OAAM;AAC1D,aAAS,MAAM,QAAQ,GAAG,GAAG,OAAO,OAAK,EAAE,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,WAAS,EAAE,KAAK,EAAE;AAAA,EAC5F;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,OAAM,IAAI,MAAM,8BAA8B;AAEzE,MAAI,OAAO;AACX,QAAM,SAAiI,CAAC;AACxI,aAAW,KAAK,OAAO;AACrB,UAAM,MAAM,MAAM,SAASA,MAAK,KAAK,EAAE,IAAI,CAAC;AAC5C,UAAM,CAAC,GAAG,CAAC,IAAI,QAAQ,GAAG;AAC1B,UAAM,IAAIC,UAAS,EAAE,MAAM,MAAM,EAAE,MAAM,mBAAmB;AAC5D,UAAM,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,QAAQ,eAAe,GAAG;AAChE,UAAMC,KAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,OAAO;AACxC,UAAM,OAAO,EAAE,SAAS,eAAe,EAAE,KAAK,OAAO,SAAS,KAAK;AACnE,UAAM,OAAyC,EAAE,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AACpE,QAAI,KAAK,WAAW,KAAK,KAAK,KAAK,OAAK,CAAC,OAAO,SAAS,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;AACzF,YAAM,IAAI,MAAM,UAAU,EAAE,6CAA6C;AAC3E,WAAO,KAAK,EAAE,GAAG,GAAG,IAAI,GAAAA,IAAG,MAAM,GAAG,GAAG,KAAK,CAAC;AAAA,EAC/C;AACA,QAAM,MAAM,IAAI,IAAI,OAAO,IAAI,OAAK,EAAE,EAAE,CAAC;AACzC,QAAM,SAAS,KAAK,MAAM,KAAK,OAAK,CAAC,EAAE,MAAM,EAAG;AAChD,QAAMC,UAAS,CAAC,OAAe,IAAI,IAAI,EAAE,KAAK,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE;AAE9E,QAAM,gBAAgB,CAAC,MAAuC;AAC5D,QAAI,EAAE,QAAQ;AAAE,UAAI,CAACA,QAAO,EAAE,MAAM,EAAG,OAAM,IAAI,MAAM,UAAU,EAAE,EAAE,sBAAsB,EAAE,MAAM,GAAG;AAAG,aAAO,EAAE;AAAA,IAAQ;AAC1H,QAAI,MAAM,EAAE,QAAQ,eAAe,EAAE,IAAI;AACzC,WAAO,OAAO,CAACA,QAAO,GAAG,EAAG,OAAM,eAAe,GAAG;AACpD,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,aAAa,CAAC,MAA+B;AACjD,QAAI,EAAE,MAAM;AAAE,UAAI,CAACA,QAAO,EAAE,IAAI,EAAG,OAAM,IAAI,MAAM,UAAU,EAAE,EAAE,oBAAoB,EAAE,IAAI,GAAG;AAAG,aAAO,EAAE;AAAA,IAAM;AAChH,WAAO,cAAc,CAAC;AAAA,EACxB;AACA,QAAMC,WAAU,CAAC,GAAG,MAAM;AAC1B,SAAOA,SAAQ,QAAQ;AACrB,UAAM,IAAIA,SAAQ,UAAU,CAAAC,OAAK,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,WAAWA,EAAC,CAAC,CAAC;AAC7E,UAAM,IAAID,SAAQ,OAAO,IAAI,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;AAC5C,UAAM,SAAS,WAAW,CAAC;AAC3B,QAAI,CAAC,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,EAAG,OAAM,IAAI,MAAM,UAAU,EAAE,EAAE,YAAY,MAAM,2CAA2C;AACvI,UAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE;AAC3B,UAAM,QAAQ,EAAE,SAAS,CAAC,KAAK,KAAK,GAAG,KAAK,KAAK,CAAC;AAClD,UAAM,OAAO,SAAS,MAAM,oBAAI,IAAI,CAAC,EAAE,MAAM,IAAI,MAAM,EAAG;AAC1D,QAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,MAAO,OAAM,IAAI,MAAM,UAAU,EAAE,EAAE,4BAA4B;AACnH,WAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,KAAK,QAAQ,UAAU,MAAM,OAAO,QAAQ,MAAM;AAAA,MAC9E,IAAI,EAAE;AAAA,MAAI,KAAK,GAAG,SAAS,IAAI,EAAE,IAAI;AAAA,MAAI,OAAO,EAAE;AAAA,MAAG,QAAQ,EAAE;AAAA,MAC/D,QAAQ,EAAE,WAAW,YAAY,aAAa,EAAE,aAAa,MAAM,OAAO,CAAC,GAAG,WAAW,EAAE,aAAa,OAAO,QAAQ,EAAE,OAAO;AAAA,IAClI,CAAC,CAAC,EAAE;AACJ,UAAM,QAAQ,CAAC,WAAmB;AAChC,YAAM,OAAO,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AACjD,YAAM,MAAM,OAAO,SAAS,MAAM,oBAAI,IAAI,CAAC,EAAE,MAAM,IAAI,KAAK,IAAI,EAAG,KAAK;AACxE,YAAM,CAAC,GAAG,CAAC,IAAI,MAAM,KAAK,KAAK,KAAK,GAAG,KAAK,KAAK,CAAC;AAClD,YAAM,IAAY,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE,GAAG,GAAG,IAAI,IAAI,KAAK,EAAE,GAAG,GAAG,IAAI,IAAI,KAAK,EAAE,GAAG,GAAG,IAAI,IAAI,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE;AACrH,YAAM,KAAK,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC;AACzD,UAAI,KAAK,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,OAAO,KAAK,IAAI;AAEpD,cAAM,WAAW,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAACE,IAAGC,EAAC,MAAM,MAAM,KAAKD,IAAGC,EAAC,CAAC;AAClH,cAAM,MAAM,WAAW,MAAM,EAAE,IAAI,EAAE,IAAI,MAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,IAAI,UAAU,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC;AACnK,eAAO,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,KAAK,YAAY,OAAO,OAAK,EAAE,OAAO,EAAE,EAAE,GAAG,GAAG,EAAE;AAAA,MACvF,MAAO,QAAO,cAAc,MAAM,EAAE,IAAI,EAAE,IAAI,MAAM,QAAQ,OAAO,EAAE,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,UAAU,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,MAAM,KAAK,IAAI,QAAQ,IAAI,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,IAChO;AACA,QAAI,EAAE,QAAQ,EAAE,MAAM;AACpB,YAAM,SAAS,EAAE,QAAQ,EAAE;AAC3B,UAAI,CAAC,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,EAAG,QAAO,QAAQ,MAAM,EAAE,IAAI,QAAQ,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,EAAE,MAAM,CAAC;AACrH,YAAM,MAAM;AACZ,UAAI,CAAC,EAAE,KAAM,QAAO,QAAQ,MAAM,EAAE,IAAI,QAAQ,YAAY,EAAE,GAAG,CAAC;AAClE;AAAA,IACF;AACA,QAAI,CAAC,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,EAAE,GAAG;AACxC,YAAM,CAAC,GAAG,CAAC,IAAI,MAAM,OAAO,IAAI,GAAG,GAAG,KAAK;AAC3C,aAAO,QAAQ,MAAM,EAAE,IAAI,EAAE,IAAI,QAAQ,QAAQ,MAAM,EAAE,MAAM,WAAW,EAAE,GAAG,EAAE,EAAE,CAAC;AAAA,IACtF;AACA,WAAO,QAAQ,MAAM,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,MAAM,CAAC;AACrE,UAAM,EAAE,EAAE;AACV,WAAO,QAAQ,MAAM,EAAE,IAAI,EAAE,IAAI,YAAY,EAAE,GAAG,CAAC;AAAA,EACrD;AACA,SAAO;AACT;AAEA,IAAM,SAAS,CAAC,MAAkD,EAAE;;;AClHpE,IAAM,OAAO,CAAC,QAAqB,IAAI,MAAM,KAAK,OAAK,CAAC,EAAE,MAAM;AAChE,IAAM,SAAS,CAAC,QAAqB,UACnC,IAAI,MAAM,OAAO,OAAK,EAAE,QAAQ,MAAM,SAAS,EAAE,IAAI,CAAC;AAExD,IAAM,aAAa,CAAC,KAAkB,SACpC,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,KAAK,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE,UAAU,KAAK,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,KAAK,MAAM,EAAE,UAAU;AACvI,IAAM,cAAc,CAAC,KAAkB,OAAqB;AAC1D,QAAM,IAAI,IAAI,MAAM,KAAK,CAAAC,OAAKA,GAAE,OAAO,EAAE;AACzC,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,iBAAiB,EAAE,GAAG;AAC9C,SAAO;AACT;AAGA,SAAS,QAAQ,UAAkB,GAAW,GAA0BC,QAAa,UAAiB;AACpG,QAAM,OAAc,CAAC;AACrB,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,UAAM,IAAI,EAAG,WAAW,IAAK,GAAG,QAAQ,CAAC;AACzC,SAAK,KAAK,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,MAAAA,MAAK,CAAC;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAY,MAAoD,MAAoB;AACrG,SAAO,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,MAAM,KAAK;AACnD;AAEA,SAAS,YAAY,MAAY,MAAc,MAAgC;AAC7E,SAAO,KAAK,aAAa,EAAE,QAAQ,UAAU,IAAI,KAAK,YAAY,MAAM,KAAK,IAAI;AACnF;AACA,IAAM,YAAY,CAAC,QAAiB,MAAyB;AAAE,MAAI,EAAG,QAAO,KAAK,CAAC;AAAG;AACtF,SAAS,UAAU,MAAY,MAAoC,MAAoB;AACrF,SAAO,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,MAAM,KAAK;AACnD;AAGA,IAAM,IAAI,IAAI,QACZ,IAAI,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,KAAK,cAAc,EAAE;AAE7D,IAAM,IAAI,IAAI,QAA0C,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,OAAO,EAAE;AAQpG,SAAS,OAAU,MAAc,IAAY,UAAkB,MAAe,QAAiB,QAAsB;AACnH,SAAO,EAAE,IAAI,UAAU,MAAM,QAAQ,QAAQ,CAAC,GAAG,QAAQ,EAAE,MAAM,OAA0C,EAAE;AAC/G;AAYO,IAAM,gBAA6C;AAAA,EACxD,MAAM;AAAA,EACN,UAAU,EAAE,IAAI,QAAQ,QAAQ,KAAK,WAAW,MAAM,SAAS,GAAG,SAAS,EAAE;AAAA,EAC7E,MAAM,KAAK,GAAG;AACZ,UAAMC,KAAI,EAAE,QAAQ,IAAK,IAAI,KAAK,KAAMA,IAAG,SAAkB,CAAC;AAC9D,UAAM,QAAQ,OAAO,KAAK,SAAS,MAAM,EAAE,CAAC,KAAK,KAAK,GAAG;AACzD,UAAM,QAAQ,OAAO,KAAK,MAAM;AAChC,UAAM,QAAQ,OAAO,KAAK,SAAS,aAAa;AAChD,UAAM,QAAQ,OAAO,KAAK,SAAS,aAAa;AAEhD,UAAM,QAAQ,WAAW,KAAK,KAAK;AACnC,QAAI,OAAO,YAAY;AAErB,gBAAU,QAAQ,YAAY,OAAO,SAAS,QAAQA,IAAG,GAAG,OAAK,EAAE,YAAY,KAAK,IAAI,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;AAAA,IACjH,OAAO;AACL,YAAM,IAAI,MAAM;AAChB,aAAO,KAAK,UAAU,OAAO,UAAU,QAAQA,IAAG,GAAG,OAAK,EAAE,SAAS,EAAE,YAAY,KAAK,IAAI,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;AACnH,aAAO,KAAK,UAAU,OAAO,UAAU,QAAQA,IAAG,GAAG,OAAK,EAAE,SAAS,EAAE,YAAY,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;AAAA,IAC3H;AACA,eAAW,KAAK;AACd,aAAO,KAAK,UAAU,GAAG,KAAK,QAAQA,IAAG,GAAG,OAAK,EAAE,UAAU,IAAI,EAAE,UAAU,KAAK,IAAI,IAAI,IAAI,GAAG,GAAG,aAAa,CAAC,CAAC;AACrH,eAAW,KAAK;AACd,aAAO,KAAK,UAAU,GAAG,YAAY,QAAQA,IAAG,GAAG,OAAK,EAAE,UAAU,WAAW,EAAE,UAAU,KAAK,IAAI,IAAI,IAAI,GAAG,GAAG,aAAa,CAAC,CAAC;AACnI,eAAW,KAAK;AACd,aAAO,KAAK,UAAU,GAAG,YAAY,QAAQA,IAAG,GAAG,OAAK,EAAE,UAAU,WAAW,EAAE,UAAU,KAAK,IAAI,IAAI,IAAI,GAAG,GAAG,aAAa,CAAC,CAAC;AACnI,WAAO,OAAO,KAAK,MAAM,EAAE,IAAIA,IAAG,MAAM,QAAQ,CAAC;AAAA,EACnD;AACF;AAYO,IAAM,YAAqC;AAAA,EAChD,MAAM;AAAA,EACN,UAAU,EAAE,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,SAAS,GAAG,QAAQ,KAAK;AAAA,EAC3E,MAAM,KAAK,GAAG;AACZ,UAAM,IAAI,KAAK,GAAG,GAAG,IAAI,EAAE,WAAW,SAAkB,CAAC;AACzD,UAAM,KAAgC,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;AAC3D,UAAM,MAAiC,CAAC,CAAC,GAAG,EAAE,QAAQ,UAAU,CAAC;AACjE,UAAM,MAAiC,CAAC,CAAC,GAAG,EAAE,QAAQ,UAAU,CAAC;AAEjE,UAAM,MAAM,EAAE,WAAW,EAAE;AAC3B,aAAS,IAAI,GAAG,IAAI,EAAE,SAAS,KAAK;AAClC,YAAM,KAAK,IAAI,KAAK,IAAI,EAAE,SAAS,QAAQ,GAAG,IAAI,EAAE,SAAS,OAAO;AAEpE,UAAI,KAAK,CAAC,KAAK,MAAM,MAAM,EAAE,UAAU,IAAI,IAAI,UAAU,GAAG,CAAC,KAAK,MAAM,KAAK,EAAE,UAAU,IAAI,IAAI,MAAM,SAAS,GAAG,CAAC,KAAK,MAAM,MAAM,EAAE,UAAU,IAAI,IAAI,UAAU,CAAC;AACpK,UAAI,KAAK,CAAC,KAAK,MAAM,MAAM,EAAE,UAAU,IAAI,IAAI,UAAU,GAAG,CAAC,KAAK,MAAM,KAAK,EAAE,UAAU,IAAI,IAAI,MAAM,SAAS,GAAG,CAAC,KAAK,MAAM,MAAM,EAAE,UAAU,IAAI,IAAI,UAAU,CAAC;AACpK,SAAG,KAAK,CAAC,KAAK,MAAM,MAAM,EAAE,GAAG,UAAU,GAAG,CAAC,KAAK,MAAM,KAAK,EAAE,IAAI,GAAG,SAAS,GAAG,CAAC,KAAK,MAAM,MAAM,EAAE,GAAG,UAAU,CAAC;AAAA,IACtH;AACA,OAAG,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AAAG,QAAI,KAAK,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC;AAAG,QAAI,KAAK,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC;AAC7F,WAAO,KAAK,UAAU,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,UAAU,GAAG,UAAU,EAAE,GAAG,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,EAAE,GAAG,GAAG,CAAC,CAAC;AAC7G,eAAW,KAAK,OAAO,KAAK,MAAM;AAChC,aAAO,KAAK,UAAU,GAAG,YAAY,EAAE,CAAC,GAAG,EAAE,UAAU,QAAQ,GAAG,CAAC,EAAE,WAAW,MAAM,EAAE,UAAU,WAAW,GAAG,UAAU,GAAG,CAAC,EAAE,WAAW,KAAK,EAAE,UAAU,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,UAAU,QAAQ,CAAC,CAAC,CAAC;AACjN,UAAM,OAAO,OAAO,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,QAAQ,CAAC;AACjE,SAAK,OAAO,KAAK,EAAE,GAAG,GAAG,MAAM,YAAY,GAAG,EAAE,GAAG,MAAM,MAAM,MAAM,OAAO,CAAC;AAC7E,WAAO;AAAA,EACT;AACF;AAaO,IAAM,oBAAqD;AAAA,EAChE,MAAM;AAAA,EACN,UAAU,EAAE,IAAI,gBAAgB,UAAU,KAAK,WAAW,GAAG,WAAW,IAAI,MAAM,MAAM,SAAS,KAAK;AAAA,EACtG,MAAM,KAAK,GAAG;AACZ,UAAM,IAAI,KAAK,GAAG,GAAG,IAAI,EAAE,WAAW,SAAkB,CAAC;AAEzD,UAAM,IAAI,KAAK,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC;AAChD,UAAM,MAAM,CAAC,MAAe,EAAE,OAAO,IAAI,EAAE,WAAW;AACtD,WAAO,KAAK,UAAU,GAAG,KAAK,QAAQ,EAAE,UAAU,GAAG,OAAK,EAAE,IAAI,EAAE,YAAY,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC;AAC1I,WAAO,KAAK,UAAU,GAAG,YAAY,QAAQ,EAAE,UAAU,GAAG,OAAK,EAAE,WAAW,MAAM,EAAE,YAAY,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,YAAY,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC;AACpK,WAAO,KAAK,UAAU,GAAG,UAAU,EAAE,CAAC,GAAG,EAAE,QAAQ,SAAS,GAAG,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AACnG,WAAO,KAAK,UAAU,GAAG,UAAU,EAAE,CAAC,GAAG,EAAE,QAAQ,SAAS,GAAG,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AACnG,WAAO,OAAO,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,QAAQ,CAAC;AAAA,EAC7D;AACF;AAYO,IAAM,QAA6B;AAAA,EACxC,MAAM;AAAA,EACN,UAAU,EAAE,IAAI,SAAS,MAAM,eAAe,QAAQ,KAAK,MAAM,KAAK;AAAA,EACtE,MAAM,KAAK,GAAG;AACZ,UAAM,OAAO,YAAY,KAAK,EAAE,IAAI;AACpC,UAAMC,QAAO,KAAK,cAAc,MAAM,SAAS,EAAE,UAAU,KAAK;AAChE,UAAM,KAAK,EAAE,EAAE,SAAS,KAAK,QAAQ,CAAC;AACtC,UAAM,OAAO,EAAE,CAAC,GAAGA,KAAI,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAGA,KAAI,CAAC;AAC7F,WAAO,OAAO,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,MAAM,CAAC,UAAU,MAAM,cAAc,IAAI,CAAC,GAAG,CAAC;AAAA,EACzF;AACF;AAYO,IAAM,YAAqC;AAAA,EAChD,MAAM;AAAA,EACN,UAAU,EAAE,IAAI,QAAQ,MAAM,SAAS,QAAQ,CAAC,cAAc,IAAI,GAAG,MAAM,GAAG,UAAU,IAAI;AAAA,EAC5F,MAAM,KAAK,GAAG;AACZ,UAAM,OAAO,YAAY,KAAK,EAAE,IAAI;AACpC,QAAI,CAAC,EAAE,OAAO,OAAQ,OAAM,IAAI,MAAM,sCAAsC;AAC5E,UAAM,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC;AACrD,UAAM,OAAO,EAAE,GAAG,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAA+B,CAAC,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,OAAO,MAAM,CAAC,CAAC,CAAC;AACzI,WAAO,OAAO,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,MAAM,CAAC,UAAU,MAAM,cAAc,IAAI,CAAC,GAAG,CAAC;AAAA,EAC3F;AACF;AAMO,IAAM,MAAyB;AAAA,EACpC,MAAM;AAAA,EACN,UAAU,EAAE,IAAI,OAAO,OAAO,KAAK,UAAU,KAAK;AAAA,EAClD,MAAM,KAAK,GAAG;AACZ,UAAM,SAAS,IAAI,MAAM,OAAO,OAAK,EAAE,UAAU,EAAE,IAAI,OAAK,UAAU,GAAG,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,UAAU,GAAG,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;AACrI,WAAO,OAAO,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,QAAQ,CAAC;AAAA,EAC7D;AACF;AAYO,IAAM,aAAuC;AAAA,EAClD,MAAM;AAAA,EACN,UAAU,EAAE,IAAI,QAAQ,QAAQ,KAAK,OAAO,GAAG,OAAO,MAAM,MAAM,IAAI;AAAA,EACtE,MAAM,KAAK,GAAG;AACZ,UAAM,IAAI,KAAK,GAAG,GAAG,IAAI,EAAE,WAAWD,KAAI,EAAE,QAAQ,IAAK,IAAI,KAAK,KAAMA,IAAG,SAAkB,CAAC;AAC9F,UAAM,OAAO,CAAC,MAAc,MAAM,MAAM,KAAK,IAAI,IAAI,CAAC;AACtD,WAAO,KAAK,UAAU,GAAG,KAAK,QAAQA,IAAG,GAAG,OAAK,EAAE,IAAI,EAAE,QAAQ,KAAK,CAAC,GAAG,aAAa,CAAC,CAAC;AACzF,QAAI,EAAE,KAAM,QAAO,KAAK,UAAU,GAAG,YAAY,QAAQA,IAAG,GAAG,OAAK,EAAE,WAAW,EAAE,OAAO,KAAK,IAAI,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;AAC1H,QAAI,EAAE,MAAO,YAAW,KAAK,IAAI,MAAM,OAAO,CAAAF,OAAKA,GAAE,SAAS,EAAE,MAAMA,GAAE,UAAU;AAChF,gBAAU,QAAQ,YAAY,GAAG,SAAS,QAAQE,IAAG,GAAG,OAAK,EAAE,QAAQ,KAAK,CAAC,GAAG,aAAa,CAAC,CAAC;AACjG,WAAO,OAAO,KAAK,MAAM,EAAE,IAAIA,IAAG,MAAM,QAAQ,CAAC;AAAA,EACnD;AACF;AAYO,IAAM,YAAqC;AAAA,EAChD,MAAM;AAAA,EACN,UAAU,EAAE,IAAI,OAAO,UAAU,KAAK,KAAK,MAAM,QAAQ,MAAM,SAAS,EAAE;AAAA,EAC1E,MAAM,KAAK,GAAG;AACZ,UAAM,IAAI,KAAK,GAAG,GAAG,IAAI,EAAE,WAAW,IAAI,EAAE,UAAU,SAAkB,CAAC;AACzE,eAAW,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC;AACpE,aAAO,KAAK,UAAU,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,UAAU,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,EAAE,MAAM,aAAa,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,EAAE,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACpK,QAAI,EAAE,QAAQ;AACZ,YAAM,IAAI,KAAK,IAAI,GAAG,EAAE,UAAU,CAAC;AACnC,YAAM,OAAO,QAAQ,GAAG,GAAG,OAAK,EAAE,SAAS,KAAK,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,UAAU,IAAI,CAAC,GAAG,aAAa;AAC1H,WAAK,KAAK,SAAS,CAAC,EAAE,IAAI;AAC1B,iBAAW,KAAK,IAAI,MAAM,OAAO,CAAAF,OAAKA,GAAE,SAAS,EAAE,MAAMA,GAAE,UAAU,EAAG,WAAU,QAAQ,YAAY,GAAG,QAAQ,IAAI,CAAC;AAAA,IACxH;AACA,UAAM,OAAO,OAAO,KAAK,MAAM,EAAE,IAAI,GAAG,OAAO,QAAQ,CAAC;AACxD,SAAK,OAAO,KAAK,EAAE,GAAG,GAAG,MAAM,YAAY,CAAC;AAC5C,WAAO;AAAA,EACT;AACF;AAaO,IAAM,cAAyC;AAAA,EACpD,MAAM;AAAA,EACN,UAAU,EAAE,IAAI,UAAU,QAAQ,GAAG,OAAO,GAAG,MAAM,KAAK,KAAK,EAAE;AAAA,EACjE,MAAM,KAAK,GAAG;AACZ,UAAME,KAAI,EAAE,QAAQ,IAAK,IAAI,KAAK,KAAMA,IAAG,IAAI,IAAI,SAAkB,CAAC;AACtE,UAAM,OAAO,OAAO,KAAK,MAAM,EAAE,CAAC,KAAK,KAAK,GAAG,GAAG,KAAK,KAAK;AAC5D,UAAM,IAAI,CAAC,MAAc,KAAK,IAAI,IAAI,CAAC;AACvC,WAAO,KAAK,UAAU,MAAM,KAAK,QAAQA,IAAG,GAAG,OAAK,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3E,QAAI,EAAE,IAAK,QAAO,KAAK,UAAU,MAAM,KAAK,QAAQA,IAAG,GAAG,OAAK,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACzF,UAAM,QAAQ,OAAO,KAAK,SAAS,MAAM,EAAE,CAAC;AAC5C,QAAI,SAAS,UAAU,KAAM,QAAO,KAAK,UAAU,OAAO,YAAY,QAAQA,IAAG,GAAG,OAAK,MAAM,UAAU,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AACnI,eAAW,KAAK,OAAO,KAAK,MAAM,EAAG,QAAO,KAAK,UAAU,GAAG,YAAY,QAAQA,IAAG,GAAG,OAAK,EAAE,UAAU,WAAY,EAAE,OAAO,IAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACzI,eAAW,OAAO,OAAO,KAAK,SAAS,OAAO,GAAG;AAC/C,YAAM,OAAO,WAAW,KAAK,GAAG,GAAG,MAAM,QAAQ,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,KAAK,cAAc,EAAE,SAAS,QAAQ;AAC1H,YAAM,QAAQ,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO,KAAK,OAAK,EAAE,OAAO,IAAI,KAAK,IAAI;AACxF,UAAI,SAAS,IAAI;AACjB,UAAI,CAAC,UAAU,OAAO,IAAI,SAAS,YAAY,OAAO;AACpD,cAAME,KAAI,IAAI,SAAS,MAAM,OAAO,IAAI,IAAI,UAAU,MAAM,QAAQ,IAAI,SAAS,IAAI,GAAG,IAAI,GAAG,IAAI,UAAU,IAAI,QAAQ,IAAI,MAAM;AAEnI,iBAAS,KAAK,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAACA,KAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAACA,KAAI,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,MACxH;AACA,UAAI,EAAE,SAAS,EAAE,OAAQ;AACzB,aAAO,KAAK,UAAU,KAAK,YAAY,QAAQF,IAAG,GAAG,OAAK,IAAI,UAAU,WAAY,KAAK,KAAM,EAAE,QAAQ,EAAE,CAAC,IAAK,MAAM,IAAI,MAAO,KAAK,EAAE,CAAC,CAAC;AAE3I,UAAI,EAAE,IAAK,QAAO,KAAK,UAAU,KAAK,KAAK,QAAQA,IAAG,GAAG,OAAK,IAAI,UAAU,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,IACrG;AACA,WAAO,OAAO,KAAK,MAAM,EAAE,IAAIA,IAAG,MAAM,QAAQ,CAAC;AAAA,EACnD;AACF;AAIO,IAAM,UAAU;AAAA,EACrB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,cAAc;AAChB;AAKO,SAAS,YAAY,KAAkB,MAAkB,SAAkC,CAAC,GAAgB;AACjH,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,OAAO,OAAO,MAAM,KAAK,EAAE,GAAG,OAAO,UAAU,GAAG,OAAO,CAAC;AAChE,QAAM,aAAa,IAAI,WAAW,OAAO,OAAK,EAAE,OAAO,KAAK,EAAE,EAAE,OAAO,IAAI;AAC3E,SAAO,EAAE,GAAG,KAAK,WAAW;AAC9B;;;ACvVA,SAAS,aAAa;AACtB,SAAS,YAAY;AACrB,SAAS,SAAS,aAAAG,YAAW,MAAAC,KAAI,UAAAC,SAAQ,SAAAC,cAAa;AACtD,SAAS,WAAAC,UAAS,QAAAC,aAAY;;;ACM9B,SAAS,gBAAyC;AAClD,SAAS,YAAAC,iBAAgB;AACzB,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,qBAAqB;;;ACX9B,SAAS,kBAAkB;AAC3B,SAAS,YAAAC,WAAU,WAAAC,gBAAe;AAClC,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAEvB,IAAM,SAAS,CAAC,SAA0B,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AAQ/F,eAAsB,qBAAqB,SAAiB,WAAmB,UAAqH;AAClM,QAAM,IAAI,KAAK,MAAM,MAAMC,UAASC,MAAK,WAAW,eAAe,GAAG,MAAM,CAAC;AAC7E,MAAI,EAAE,YAAY,KAAK,CAAC,EAAE,QAAQ,UAAU,CAAC,EAAE,OAAO,OAAQ,OAAM,IAAI,MAAM,mCAAmC;AACjH,QAAM,MAAM,MAAMD,UAAS,SAAS,MAAM;AAC1C,MAAI,OAAO,GAAG,MAAM,EAAE,QAAS,OAAM,IAAI,MAAM,gCAAgC;AAC/E,QAAM,MAAM,MAAM,KAAK,MAAM,GAAG,CAAC;AACjC,MAAI,OAAO,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,SAAS,SAAU,OAAM,IAAI,MAAM,2BAA2B;AACpG,MAAI,OAAO,MAAMA,UAAS,SAAS,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAU,OAAM,IAAI,MAAM,gCAAgC;AACvH,aAAW,KAAK,IAAI,OAAQ,KAAI,OAAO,MAAMA,UAASC,MAAKC,SAAQ,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,EAAG,OAAM,IAAI,MAAM,yBAAyB,EAAE,GAAG,UAAU;AAC5K,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,EAAE,SAAS,KAAK,EAAG,KAAI,OAAO,MAAMF,UAASC,MAAKC,SAAQ,OAAO,GAAG,IAAI,CAAC,CAAC,MAAM,KAAM,OAAM,IAAI,MAAM,2BAA2B,IAAI,UAAU;AACzL,MAAI,EAAE,eAAe,SAAS,aAAa,SAAS,KAAK,UAAU,EAAE,KAAK,MAAM,KAAK,UAAU,SAAS,KAAK,EAAG,OAAM,IAAI,MAAM,sDAAsD;AACtL,MAAI,SAAS,gBAAgB,UAAa,EAAE,gBAAgB,SAAS,YAAa,OAAM,IAAI,MAAM,kCAAkC;AACpI,MAAI,EAAE,OAAO,WAAW,SAAS,MAAM,UAAU,IAAI,IAAI,EAAE,OAAO,IAAI,OAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,OAAQ,OAAM,IAAI,MAAM,yCAAyC;AACvK,QAAMC,UAAS,MAAMC,SAAQ,SAAS,GAAG,OAAO,OAAK,EAAE,SAAS,MAAM,CAAC,EAAE,KAAK;AAC9E,MAAI,KAAK,UAAUD,MAAK,MAAM,KAAK,UAAU,EAAE,OAAO,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,CAAC,EAAG,OAAM,IAAI,MAAM,sDAAsD;AACtJ,aAAW,KAAK,EAAE,QAAQ;AACxB,QAAI,CAAC,eAAe,KAAK,EAAE,IAAI,EAAG,OAAM,IAAI,MAAM,0BAA0B;AAC5E,QAAI,OAAO,MAAMH,UAASC,MAAK,WAAW,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,OAAQ,OAAM,IAAI,MAAM,SAAS,EAAE,IAAI,wBAAwB;AAAA,EAC3H;AACA,SAAO;AACT;;;ADlBA,SAAS,WAAW;AAiCpB,IAAM,OAAOI,SAAQ,cAAc,YAAY,GAAG,CAAC;AACnD,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAIC,WAA4B,QAAQ,QAAQ;AAEhD,eAAe,UAAyB;AACtC,QAAM,gBAAgB,MAAMC,UAASC,MAAK,MAAM,YAAY,GAAG,MAAM;AACrE,MAAI,QAAQ,CAAC,KAAK,SAAS,KAAK,kBAAkB,UAAW,QAAO;AACpE,MAAI,QAAQ,CAAC,KAAK,SAAS,EAAG,OAAM,KAAK,MAAM;AAC/C,cAAY;AACZ,MAAI,WAAW,CAAC,QAAQ,YAAY,EAAG,WAAU;AACjD,cAAY,MAAM,SAAS,OAAO;AAAA,IAChC,UAAU;AAAA,IACV,MAAM,CAAC,2BAA2B,+BAA+B,wBAAwB;AAAA,EAC3F,CAAC;AACD,QAAM,OAAO,MAAM,QAAQ,QAAQ,EAAE,mBAAmB,EAAE,CAAC;AAC3D,MAAI;AACF,SAAK,GAAG,aAAa,OAAK,QAAQ,MAAM,aAAa,EAAE,OAAO,CAAC;AAC/D,UAAM,KAAK,WAAW,mFAAmF;AACzG,kBAAc,MAAMD,UAASC,MAAK,MAAM,YAAY,GAAG,MAAM;AAC7D,UAAM,KAAK,aAAa,EAAE,SAAS,UAAU,CAAC;AAC9C,WAAO;AACP,WAAO;AAAA,EACT,SAAS,GAAG;AACV,UAAM,KAAK,MAAM;AACjB,UAAM;AAAA,EACR;AACF;AAEA,SAAS,QAAW,IAAkC;AACpD,QAAM,SAASF,SAAQ,KAAK,EAAE;AAC9B,EAAAA,WAAU,OAAO,MAAM,MAAM;AAAA,EAAC,CAAC;AAC/B,SAAO;AACT;AASA,IAAM,OAAO,CAAC,MAAe,EAAE,SAAS,OAAO,IAAI,eAAe,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,OAAO,IAAI,eAAe;AAC7H,IAAM,cAAc,CAAC,MAAc,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,QAAQ;AAE7E,SAAS,cAAc,KAAkB,MAA8C;AAE5F,SAAO,QAAQ,MAAM,OAAO,MAAM,GAAG,GAAG,IAAI,CAAC;AAC/C;AAEA,eAAe,OAAO,KAAkB,MAA8C;AACpF,QAAM,WAAW,CAAC,GAAW,MAAc,UAAU,UAAU;AAC7D,QAAI,CAAC,OAAO,SAAS,CAAC,KAAK,KAAK,KAAM,WAAW,CAAC,OAAO,UAAU,CAAC;AAClE,YAAM,IAAI,MAAM,GAAG,IAAI,uBAAuB,UAAU,YAAY,QAAQ,EAAE;AAAA,EAClF;AACA,WAAS,KAAK,OAAO,GAAG,KAAK;AAC7B,WAAS,KAAK,SAAS,GAAG,OAAO;AACjC,WAAS,KAAK,gBAAgB,GAAG,gBAAgB,IAAI;AACrD,MAAI,KAAK,UAAU,OAAW,UAAS,KAAK,OAAO,SAAS,IAAI;AAChE,QAAM,OAAO,KAAK,cAAc,SAAY,SAAY,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,KAAK,SAAS;AACxG,MAAI,KAAK,cAAc,UAAa,CAAC,KAAM,OAAM,IAAI,MAAM,sBAAsB,KAAK,SAAS,GAAG;AAClG,MAAI,KAAK,cAAc,CAAC,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,UAAU,EAAG,OAAM,IAAI,MAAM,wBAAwB,KAAK,UAAU,GAAG;AACjI,aAAW,OAAO,OAAO,KAAK,KAAK,kBAAkB,CAAC,CAAC,EAAG,KAAI,CAAC,IAAI,OAAO,KAAK,OAAK,EAAE,QAAQ,GAAG,EAAG,OAAM,IAAI,MAAM,wCAAwC,GAAG,GAAG;AAClK,MAAI,KAAK,UAAU,CAAC,KAAK,MAAM,UAAU,KAAK,MAAM,KAAK,OAAK,CAAC,OAAO,SAAS,CAAC,KAAK,IAAI,CAAC;AACxF,UAAM,IAAI,MAAM,qDAAqD;AACvE,MAAI,KAAK,WAAW,KAAK,OAAO,WAAW,KAAK,KAAK,OAAO,KAAK,OAAK,CAAC,OAAO,SAAS,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,KAAK,KAAK,OAAO,CAAC,KAAK;AACrI,UAAM,IAAI,MAAM,mDAAmD;AACrE,QAAM,KAAK,KAAK,SAAS;AACzB,QAAM,SAAS,KAAK,SAAS,KAAK,OAAO,IAAI,CAAC,GAAG,MAAM,KAAK,MAAM,IAAI,EAAE,CAAW,IAAwC;AAE3H,MAAIG,SAAQ,KAAK;AACjB,MAAI,CAACA,QAAO;AACV,QAAI,CAAC,KAAM,CAAAA,SAAQ,CAAC,CAAC;AAAA,SAChB;AACH,YAAM,MAAM,KAAK,OAAO;AACxB,YAAM,IAAI,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,WAAW,GAAG,CAAC;AAEnE,MAAAA,SAAQ,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,MAAM,IAAI,IAAI,EAAG,KAAK,WAAW,KAAM,KAAK,OAAO,IAAI,IAAI,IAAI,QAAQ,CAAC,CAAC;AAAA,IACvH;AAAA,EACF;AAGA,QAAM,SAAiC,CAAC;AACxC,QAAM,WAA4B,EAAE,UAAU,OAAO,KAAK,UAAU,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,UAAU,IAAI,OAAO,CAAC,EAAE;AAC/G,aAAW,KAAK,IAAI,QAAQ;AAC1B,QAAI,OAAO,EAAE,GAAG,EAAG;AACnB,QAAI,MAAc,MAAMC,UAASC,MAAK,KAAK,WAAW,EAAE,GAAG,CAAC;AAC5D,aAAS,OAAO,EAAE,GAAG,IAAI,OAAO,GAAG;AACnC,QAAI,KAAK,iBAAiB,EAAE,GAAG,GAAG;AAChC,YAAM,WAAW,MAAMD,UAASC,MAAK,KAAK,WAAW,KAAK,eAAe,EAAE,GAAG,CAAC,CAAC;AAChF,eAAS,MAAM,KAAK,eAAe,EAAE,GAAG,CAAC,IAAI,OAAO,QAAQ;AAC5D,YAAM,MAAM,IAAI,KAAK,KAAK,GAAG,GAAG,OAAO,IAAI,KAAK,KAAK,QAAQ;AAC7D,UAAI,IAAI,UAAU,KAAK,SAAS,IAAI,WAAW,KAAK,OAAQ,OAAM,IAAI,MAAM,mCAAmC,EAAE,GAAG,EAAE;AACtH,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK,QAAQ,KAAK,EAAG,KAAI,KAAK,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,IAAI,GAAG;AAAE,YAAI,KAAK,CAAC,IAAI;AAAK,YAAI,KAAK,IAAI,CAAC,IAAI;AAAG,YAAI,KAAK,IAAI,CAAC,IAAI;AAAA,MAAK;AAC9J,YAAM,IAAI,KAAK,MAAM,GAAG;AAAA,IAC1B;AACA,WAAO,EAAE,GAAG,IAAI,QAAQ,KAAK,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS,QAAQ,CAAC;AAAA,EACtE;AAEA,QAAM,IAAI,MAAM,QAAQ;AACxB,WAAS,WAAW,OAAO,SAAU;AACrC,QAAM,MAAM,MAAM,EAAE;AAAA,IAClB,OAAO,EAAE,KAAAC,MAAK,QAAAC,SAAQ,OAAO,GAAG,MAAM;AACpC,YAAM,IAAK,OAAe;AAC1B,YAAM,EAAE,KAAKD,MAAKC,SAAQ,KAAK;AAC/B,aAAO,EAAE,aAAa,EAAE;AAAA,IAC1B;AAAA,IACA;AAAA,MACE;AAAA,MAAK;AAAA,MAAQ,OAAO,KAAK,SAAS;AAAA,MAClC,IAAI,EAAE,WAAW,KAAK,WAAW,OAAAJ,QAAO,cAAc,KAAK,cAAc,YAAY,KAAK,YAAY,aAAa,KAAK,aAAa,YAAY,KAAK,YAAY,cAAc,KAAK,cAAc,WAAW,KAAK,WAAW,OAAO;AAAA,IACvO;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,IAAI,OAAO,IAAI,WAAW;AAAA,IAClC,OAAO,YAAY,IAAI,KAAK;AAAA,IAC5B,OAAAA;AAAA,IAAO,OAAO,IAAI;AAAA,IAAO,QAAQ,IAAI;AAAA,EACvC;AACF;;;ADhKA,eAAsB,YAAY,KAAkB,MAAyI;AAC3L,QAAM,OAAO,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,KAAK,SAAS,GAAG,MAAM,KAAK,OAAO;AAClF,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,sBAAsB,KAAK,SAAS,GAAG;AAClE,MAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,IAAK,OAAM,IAAI,MAAM,gDAAgD;AACpH,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,WAAW,GAAG,CAAC;AACzD,MAAI,QAAQ,IAAO,OAAM,IAAI,MAAM,kDAAkD;AACrF,QAAMK,OAAMC,SAAQ,KAAK,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,QAAM,OAAO,MAAM,QAAQC,MAAKD,SAAQ,KAAK,OAAO,GAAG,eAAe,CAAC;AACvE,MAAI;AAEF,aAAS,QAAQ,GAAG,QAAQ,OAAO,SAAS,IAAI;AAC9C,YAAME,SAAQ,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE,GAAG,CAAC,GAAG,OAAO,QAAQ,KAAK,GAAG;AAC7F,YAAM,WAAW,MAAM,cAAc,KAAK,EAAE,GAAG,MAAM,aAAa,OAAO,OAAAA,OAAM,CAAC;AAChF,YAAM,QAAQ,IAAI,SAAS,OAAO,IAAI,CAAC,OAAO,MAAMC,WAAUF,MAAK,MAAM,GAAG,OAAO,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;AAAA,IAChI;AACA,UAAM,SAASA,MAAK,MAAM,aAAa;AACvC,UAAM,OAAO,MAAM,UAAU,CAAC,gBAAgB,aAAa,SAAS,MAAM,cAAc,OAAO,GAAG,GAAG,MAAMA,MAAK,MAAM,UAAU,GAAG,OAAO,iCAAiC,QAAQ,WAAW,YAAY,WAAW,aAAa,cAAc,MAAM,GAAG,EAAE,OAAO,CAAC,UAAU,UAAU,MAAM,EAAE,CAAC;AAChS,QAAI,aAAa;AACjB,SAAK,OAAO,GAAG,QAAQ,WAAS;AAAE,oBAAc,aAAa,OAAO,MAAM,IAAK;AAAA,IAAG,CAAC;AACnF,UAAM,CAAC,IAAI,IAAI,MAAM,KAAK,MAAM,OAAO;AACvC,QAAI,SAAS,EAAG,OAAM,IAAI,MAAM,uBAAuB,UAAU,EAAE;AACnE,UAAMG,QAAO,QAAQ,KAAK,OAAO;AACjC,WAAO,EAAE,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI;AAAA,EACrD,UAAE;AAAU,UAAMC,IAAG,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAAG;AAChE;;;AGnBA,IAAM,SAAS,CAAC,MAAqC,OAAO,MAAM,WAAW,CAAC,CAAC,IAAI,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAK,OAAO,MAAM,QAAQ,IAAI,IAAI;AACjJ,IAAM,QAAQ,CAAC,GAAa,MAAgB,EAAE,IAAI,CAAC,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC;AACpE,IAAM,YAAY,CAAC,MAAgB,KAAK,IAAI,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC;AAE1D,SAAS,cAAc,KAAkB,MAAiB,OAAuB,CAAC,GAAc;AACrG,QAAM,MAAiB,CAAC,GAAG,IAAI,KAAK;AACpC,QAAM,SAAS,CAAC,MAAc,SAAiB,SAAiB,MAAe,QAA0B,WAAW,IAAI,KAAK,EAAE,OAAO,MAAM,SAAS,WAAW,KAAK,IAAI,MAAM,QAAQ,CAAC;AACxL,aAAW,MAAM,KAAK,QAAQ;AAC5B,UAAM,KAAK,GAAG,GAAG,MAAM,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,UAAU,KAAK,QAAQ,GAAG,KAAK,CAAC,EAAE,MAAM,KAAK,GAAG,KAAK,GAAG,EAAE,EAAG,MAAM;AAClH,UAAM,KAAK,CAAC,MAAc,OAAO,IAAI,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,MAAM,OAAK,OAAO,EAAE,CAAC,MAAM,MAAS;AACxG,QAAI,KAAK,MAAM;AACb,YAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,OAAO,KAAK,GAAG,KAAK,OAAO,IAAI;AACvE,YAAM,OAAO,MAAM,MAAM,GAAG,WAAW,GAAG,SAAS,UAAU,MAAM,IAAI,EAAE,CAAC,IAAI,UAAU,QAAQ,KAAK,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,IAAI,IAAI;AAErJ,UAAI,OAAO,QAAQ,OAAO,UAAU,SAAU,QAAO,aAAa,IAAI,gCAAgC,OAAO,SAAS,IAAI,IAAI,aAAa,KAAK,QAAQ,CAAC,CAAC,KAAK,gBAAgB,4BAA4B;AAC3M,UAAI,WAAW,QAAQ,QAAQ,GAAG,KAAK,SAAS,GAAG;AACjD,cAAM,IAAI,KAAK,IAAI,IAAI,MAAQ,GAAG,KAAK,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,KAAK,GAAG,EAAE,EAAG,IAAI,GAAG,KAAK,GAAG,EAAE,EAAG,KAAK,GAAG;AAChH,cAAM,KAAK,MAAM,OAAO,GAAG,CAAC,CAAC,GAAI,OAAO,GAAG,CAAC,CAAC,CAAE,EAAE,IAAI,OAAK,IAAI,CAAC,GAAG,KAAK,MAAM,OAAO,GAAG,CAAC,CAAC,GAAI,OAAO,GAAG,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,OAAK,IAAI,CAAC;AAC/H,cAAM,KAAK,UAAU,MAAM,IAAI,EAAE,CAAC;AAClC,YAAI,KAAK,KAAK,IAAI,MAAM,OAAO,KAAK,IAAI,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,EAAG,QAAO,iBAAiB,IAAI,4BAA4B,GAAG,QAAQ,CAAC,CAAC,sBAAsB;AAAA,MACrK;AAAA,IACF;AACA,QAAI,CAAC,QAAS;AACd,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK,SAAS,GAAG,KAAK;AAC3C,YAAM,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,CAAC;AAC3D,UAAI,EAAE,SAAS,UAAU,EAAE,SAAS,OAAQ;AAC5C,YAAM,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI;AAC3C,YAAM,OAAO,MAAM,OAAO,GAAG,EAAE,CAAC,CAAC,GAAI,OAAO,GAAG,EAAE,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,OAAK,IAAI,CAAC,GAAG,QAAQ,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC,CAAC,GAAI,OAAO,GAAG,EAAE,CAAC,CAAC,CAAE,EAAE,IAAI,OAAK,IAAI,CAAC;AAChJ,YAAM,SAAS,MAAM,OAAO,EAAE,CAAC,GAAI,OAAO,EAAE,CAAC,CAAE,GAAG,QAAQ,MAAM,OAAO,EAAE,CAAC,GAAI,OAAO,EAAE,CAAC,CAAE;AAC1F,YAAM,OAAO,OAAO,KAAK,CAAC,GAAGC,OAAM,IAAI,MAAMA,EAAC,IAAI,IAAI;AACtD,YAAM,QAAQ,KAAK,IAAI,UAAU,MAAM,KAAK,EAAE,IAAI,EAAE,IAAI,UAAU,KAAK,KAAK,EAAE,IAAI,EAAE,EAAE;AACtF,UAAI,QAAQ,KAAK,IAAI,UAAU,IAAI,GAAG,UAAU,KAAK,CAAC,IAAI,QAAQ,KAAM,QAAO,iBAAiB,IAAI,yFAAyF,EAAE,CAAC;AAChM,YAAM,OAAO,UAAU,MAAM,MAAM,KAAK,CAAC;AACzC,UAAI,OAAO,KAAK,IAAI,KAAK,QAAQ,GAAG,EAAG,QAAO,iBAAiB,IAAI,kBAAkB,KAAK,QAAQ,CAAC,CAAC,4BAA4B,EAAE,CAAC;AACnI,YAAM,eAAe,CAAC,GAAW,GAAW,MAAc,OAAO,GAAG,CAAC,CAAC,EAAG,IAAI,CAAC,GAAGA,QAAO,OAAO,GAAG,CAAC,CAAC,EAAGA,EAAC,IAAI,IAAI,IAAI,OAAO,GAAG,CAAC,CAAC,EAAGA,EAAC,MAAM,IAAI,EAAE;AAChJ,YAAM,KAAK,aAAa,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,GAAG,KAAK,aAAa,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC;AAC/F,YAAM,KAAK,UAAU,MAAM,IAAI,EAAE,CAAC;AAClC,UAAI,KAAK,KAAK,IAAI,GAAG,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAG,QAAO,qBAAqB,IAAI,2BAA2B,GAAG,QAAQ,CAAC,CAAC,oFAAiF,EAAE,GAAG,MAAM;AAAA,IACxO;AAAA,EACF;AACA,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,EAAE,CAAC;AAC3C,QAAMC,SAAQ,IAAI,IAAI,MAAM,KAAK,EAAE,QAAQ,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,IAAI,IAAI,KAAK,CAAC;AAChF,aAAW,MAAM,KAAK,OAAQ,YAAW,KAAK,GAAG,MAAM;AAAE,IAAAA,OAAM,IAAI,EAAE,CAAC;AAAG,QAAI,EAAE,IAAI,EAAG,CAAAA,OAAM,IAAI,KAAK,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC;AAAA,EAAG;AAC1H,QAAM,UAAU,CAAC,GAAGA,MAAK,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,QAAM,EAAE,GAAG,MAAM,OAAO,MAAM,CAAC,EAAE,EAAE;AACxF,aAAW,QAAQ,KAAK,kBAAkB,CAAC,GAAG;AAC5C,QAAI,CAAC,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,EAAG,OAAM,IAAI,MAAM,2BAA2B,IAAI,GAAG;AAC3F,UAAM,QAAQ,QAAQ,IAAI,OAAK,SAAS,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI,CAAE;AACrE,UAAM,SAAU,CAAC,YAAY,KAAK,GAAG,EAAY,IAAI,UAAQ,MAAM,IAAI,OAAK,EAAE,IAAI,CAAC,CAAC;AACpF,QAAI,OAAO,MAAM,OAAK,KAAK,IAAI,GAAG,CAAa,IAAI,KAAK,IAAI,GAAG,CAAa,IAAI,IAAI,EAAG,QAAO,oBAAoB,MAAM,+DAA+D;AAAA,EACzL;AACA,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,CAAC,OAAO,IAAI,KAAK,KAAK,WAAW,CAAC,GAAG;AAC9C,QAAI,CAAC,CAAC,OAAO,IAAI,EAAE,MAAM,QAAM,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,CAAC,EAAG,OAAM,IAAI,MAAM,0BAA0B,KAAK,KAAK,IAAI,EAAE;AAC5H,eAAW,EAAE,GAAG,KAAK,KAAK,SAAS;AACjC,YAAM,OAAO,SAAS,KAAK,IAAI;AAC/B,UAAI,CAAC,KAAK,WAAW,IAAI,KAAK,KAAK,CAAC,KAAK,WAAW,IAAI,IAAI,EAAG;AAC/D,YAAM,UAAU,CAAC,OAAe;AAC9B,cAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE;AAC5C,cAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,IAAI,OAAO,CAAC,KAAK,aAAa,KAAK,KAAK;AAC1E,eAAO,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,IAAK,MAAmB,CAAC,IAAI;AAAA,MAC5F;AACA,UAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,EAAG;AACvC,YAAM,QAAQ,KAAK,IAAI,GAAG,aAAa,SAAS,OAAO,CAAC;AACxD,YAAMC,KAAI,CAAC,OAAe,QAAQ,MAAM,QAAQ,EAAE,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,EAAG,CAAC;AACjI,YAAM,OAAO,KAAK,UAAU,CAAC,OAAO,IAAI,CAAC;AACzC,UAAIA,GAAE,KAAK,KAAKA,GAAE,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,GAAG;AAAE,iBAAS,IAAI,IAAI;AAAG,eAAO,mBAAmB,OAAO,IAAI,KAAK,uCAAuC,IAAI,mDAAmD,CAAC;AAAA,MAAG;AAAA,IACpN;AAAA,EACF;AACA,aAAW,MAAM,KAAK,OAAO,OAAO,OAAK,EAAE,WAAW,UAAU,EAAE,SAAS,YAAY,EAAG,YAAW,OAAO,GAAG,KAAK,OAAO,OAAK,EAAE,IAAI,CAAC,GAAG;AACxI,UAAM,IAAI,SAAS,KAAK,OAAO,MAAM,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,SAAS,KAAK,OAAO,MAAM,IAAI,CAAC,CAAC;AACvG,UAAM,SAAS,EAAE,WAAW,IAAI,GAAG,EAAE,GAAG,QAAQ,EAAE,WAAW,IAAI,GAAG,EAAE;AACtE,QAAI,CAAC,UAAU,CAAC,SAAS,OAAO,OAAO,MAAM,GAAI;AACjD,UAAM,aAAa,KAAK,YAAY,OAAO,EAAE,GAAG,aAAa,KAAK,YAAY,MAAM,EAAE;AACtF,QAAI,CAAC,cAAc,CAAC,WAAY;AAChC,QAAI,CAAC,cAAc,CAAC,cAAc,CAAC,OAAO,KAAK,UAAU,EAAE,KAAK,UAAQ,WAAW,IAAI,CAAC,GAAG;AACzF,aAAO,uBAAuB,GAAG,IAAI,QAAQ,OAAO,EAAE,WAAM,MAAM,EAAE,qCAAqC,IAAI,CAAC;AAAG;AAAA,IACnH;AACA,UAAM,QAAQ,CAAC,MAAgB,KAAoB,OAAuD;AACxG,UAAI,IAAI,SAAS,UAAU;AAAE,cAAM,CAAC,GAAG,CAAC,IAAI,WAAW,KAAK,GAAG;AAAG,eAAO,MAAM,aAAa,MAAM,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,OAAO,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC;AAAA,MAAG;AACzJ,UAAI,IAAI,SAAS,OAAQ;AACzB,YAAM,IAAI,wBAAwB,MAAM,IAAI,MAAM,GAAG;AACrD,eAAS,IAAI,GAAG,IAAI,IAAI,UAAU,QAAQ,KAAK,GAAG;AAChD,cAAM,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,UAAU,MAAM,GAAG,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,MAAM,KAAK,KAAK,KAAK;AAC7O,YAAI,KAAK,IAAI,GAAG,IAAI,MAAO;AAC3B,cAAM,MAAM,GAAG,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,IAAI,MAAM,MAAM,KAAK,KAAK,MAAM,GAAG,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,IAAI,OAAO;AACvG,YAAI,KAAK,SAAS,KAAK,SAAS,IAAI,KAAK,IAAI,KAAM,QAAO,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,EAAE,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;AAAA,MACzL;AAAA,IACF;AACA,eAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,UAAU,EAAG,KAAI,WAAW,IAAI,GAAG;AACzE,YAAM,IAAI,MAAM,GAAG,QAAQ,EAAE,GAAG,IAAI,MAAM,GAAG,OAAO,WAAW,IAAI,CAAC;AACpE,UAAI,CAAC,KAAK,CAAC,GAAG;AAAE,eAAO,uBAAuB,GAAG,IAAI,aAAa,IAAI,oCAAoC,IAAI,CAAC;AAAG;AAAA,MAAU;AAC5H,YAAM,WAAW,KAAK,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACpD,UAAI,YAAY,KAAK,qBAAqB,GAAI,QAAO,4BAA4B,GAAG,IAAI,IAAI,IAAI,WAAW,SAAS,QAAQ,CAAC,CAAC,WAAW,OAAO,EAAE,eAAe,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,IACpL;AAAA,EACF;AACA,SAAO;AACT;;;AClFA,IAAM,mBAAmB;AAEzB,IAAM,WAAW;AAGjB,IAAM,wBAAwB;AAwB9B,IAAM,YAAY,CAAC,MAAa,EAAE,WAAW,UAAU,EAAE,SAAS;AAClE,IAAMC,WAAU,CAAC,MAAa,GAAG,EAAE,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI;AAC3D,IAAM,MAAM,CAAC,MAAc,OAAO,KAAK,MAAM,IAAI,GAAI,IAAI,GAAI;AAC7D,IAAM,QAAQ,CAAC,GAAc,QAAgB;AAC3C,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,EAAE,WAAW,GAAG,CAAC,GAAG,MAAgB,CAAC;AACrE,WAAS,IAAI,GAAG,KAAK,GAAG,IAAK,KAAI,KAAK,EAAE,WAAW,IAAI,CAAC;AACxD,SAAO;AACT;AAEO,SAAS,SAAS,KAAkB,OAAqB,CAAC,GAAc;AAC7E,QAAM,MAAM,KAAK,OAAO,IAAI,OAAO,KAAK,aAAa,IAAI,aAAa,KAAK,WAAW,KAAK,SAAS,KAAK,UAAU;AACnH,MAAI,CAAC,CAAC,KAAK,IAAI,EAAE,MAAM,OAAK,OAAO,SAAS,CAAC,KAAK,IAAI,CAAC,EAAG,OAAM,IAAI,MAAM,uCAAuC;AACjH,QAAM,QAAQ,KAAK,cAAc,SAAY,IAAI,aAAa,IAAI,WAAW,OAAO,OAAK,EAAE,OAAO,KAAK,SAAS;AAChH,MAAI,KAAK,cAAc,UAAa,CAAC,MAAM,OAAQ,OAAM,IAAI,MAAM,sBAAsB,KAAK,SAAS,GAAG;AAC1G,QAAM,MAAiB,CAAC;AACxB,aAAW,KAAK,uBAAuB,GAAG,EAAE,MAAM,OAAO,CAAAC,OAAKA,GAAE,IAAI,EAAG,KAAI,KAAK;AAAA,IAAE,OAAO;AAAA,IAAQ,MAAM;AAAA,IAAoB,SAAS,EAAE;AAAA,IACpI,SAAS,eAAe,EAAE,MAAM,iBAAiB,EAAE,IAAI,8BAA8B,EAAE,MAAM;AAAA,EAA8D,CAAC;AAC9J,QAAM,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK;AAGvC,QAAM,aAAa,CAAC,MAAY,QAAgB,SAAsC;AACpF,UAAM,MAAM,YAAY,KAAK,MAAM,QAAQ,GAAG,IAAI;AAClD,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,GAAI,SAAS,KAAK,IAAI,QAAQ,MAAM,QAAQ;AAC5F,UAAM,QAAQ,OAAO,WAAW,WAAW,SAAS,KAAK;AACzD,QAAI,SAAS,KAAM,QAAO;AAC1B,QAAI,OAAO,UAAU,OAAO,WAAW,OAAO,UAAU,OAAO;AAC/D,eAAW,CAAC,GAAG,CAAC,KAAK,KAAK;AAAE,aAAO,KAAK,IAAI,MAAM,CAAC;AAAG,aAAO,KAAK,IAAI,MAAM,CAAC;AAAG,aAAO,KAAK,IAAI,MAAM,CAAC;AAAG,aAAO,KAAK,IAAI,MAAM,CAAC;AAAA,IAAG;AACpI,UAAM,QAA4B,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,UAAU,OAAO,CAAC,CAAC;AAC7G,UAAM,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAChC,WAAO,EAAE,MAAM,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,MAAM,MAAM,IAAI,EAAW;AAAA,EACtF;AAGA,QAAM,WAAW,IAAI,IAAI,IAAI,MAAM,IAAI,OAAK,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7D,QAAM,aAAa,IAAI,IAAI,IAAI,MAAM,IAAI,OAAK,EAAE,EAAE,CAAC;AACnD,QAAM,SAAS,IAAI,IAAI,IAAI,MAAM,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACpD,QAAM,UAAU,CAAC,GAAW,MAAc;AACxC,aAAS,MAAM,SAAS,IAAI,CAAC,GAAG,KAAK,MAAM,SAAS,IAAI,GAAG,EAAG,KAAI,QAAQ,EAAG,QAAO;AACpF,aAAS,MAAM,SAAS,IAAI,CAAC,GAAG,KAAK,MAAM,SAAS,IAAI,GAAG,EAAG,KAAI,QAAQ,EAAG,QAAO;AACpF,WAAO;AAAA,EACT;AACA,QAAM,WAAiB,oBAAI,IAAI,GAAG,YAAY,SAAS,KAAK,QAAQ;AACpE,QAAM,YAA4F,CAAC;AACnG,aAAW,KAAK,IAAI,OAAO;AACzB,UAAM,IAAI,WAAW,UAAU,EAAE,IAAI,SAAS;AAC9C,QAAI,CAAC,EAAG;AACR,cAAU,KAAK,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,KAAK,EAAE,IAAI,CAAC;AACrD,QAAI,EAAE,KAAK,OAAQ,KAAI,KAAK;AAAA,MAAE,OAAO;AAAA,MAAQ,MAAM;AAAA,MAAiB,SAAS,EAAE;AAAA,MAC7E,SAAS,SAAS,EAAE,EAAE,0BAA0B,KAAK,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI;AAAA,IAAqB,CAAC;AAAA,EACvG;AACA,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,IAAK,UAASC,KAAI,IAAI,GAAGA,KAAI,UAAU,QAAQA,MAAK;AAExF,QAAI,QAAQ,UAAU,CAAC,EAAE,MAAM,UAAUA,EAAC,EAAE,IAAI,EAAG;AACnD,UAAM,IAAI,UAAU,CAAC,EAAE,KAAK,IAAI,UAAUA,EAAC,EAAE;AAC7C,UAAM,KAAK,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACvG,QAAI,MAAM,KAAK,MAAM,EAAG;AACxB,UAAM,UAAU,KAAK,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE;AACrF,UAAM,QAAQ,UAAU,IAAK,KAAK,KAAM,UAAU;AAClD,QAAI,SAAS,WAAY,KAAI,KAAK;AAAA,MAAE,OAAO;AAAA,MAAQ,MAAM;AAAA,MAAgB,SAAS,GAAG,UAAU,CAAC,EAAE,EAAE,IAAI,UAAUA,EAAC,EAAE,EAAE;AAAA,MACrH,SAAS,UAAU,UAAU,CAAC,EAAE,EAAE,UAAU,UAAUA,EAAC,EAAE,EAAE,aAAa,KAAK,MAAM,QAAQ,GAAG,CAAC;AAAA,IAAwC,CAAC;AAAA,EAC5I;AAWA,QAAM,eAAe,oBAAI,IAAY;AACrC,aAAW,KAAK,IAAI,WAAY,YAAW,KAAK,EAAE;AAChD,SAAK,EAAE,WAAW,QAAQ,EAAE,WAAW,eAAe,EAAE,WAAW,WAAW,EAAE,KAAK,KAAK,OAAK,OAAO,EAAE,MAAM,YAAY,EAAE,MAAM,CAAC;AACjI,mBAAa,IAAI,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;AAC/C,QAAM,UAAU,IAAI,IAAI,IAAI,YAAY,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAE3D,QAAM,cAAc;AAAA,IAClB,GAAG,IAAI,GAAG,IAAI,QAAM,EAAE,MAAM,MAAe,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,QAAQ,EAAE,QAAQ,OAAO,CAAC,EAAE,GAAG,GAAG,YAAY,EAAE,OAAO,EAAE;AAAA,IAC9H,GAAG,IAAI,UAAU,IAAI,QAAM;AAAA,MAAE,MAAM;AAAA,MAAsB,IAAI,EAAE;AAAA,MAAI,OAAO,EAAE;AAAA,MAAO,QAAQ,EAAE;AAAA,MAC3F,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS;AAAA,MAAG,YAAY,EAAE;AAAA,IAAO,EAAE;AAAA,IACtG,GAAG,IAAI,KAAK,IAAI,QAAM;AAAA,MAAE,MAAM;AAAA,MAAiB,IAAI,EAAE;AAAA,MAAI,OAAO,EAAE;AAAA,MAAO,QAAQ,EAAE;AAAA,MACjF,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI;AAAA,MAAG,YAAY,OAAO,IAAI,EAAE,MAAM,GAAG;AAAA,IAAK,EAAE;AAAA,EACnF;AACA,aAAW,EAAE,MAAM,IAAI,OAAO,QAAQ,OAAO,WAAW,KAAK,aAAa;AACxE,UAAM,QAAQ,UAAU,IAAI;AAC5B,QAAI,MAAM,MAAM,OAAK,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,OAAK,aAAa,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC;AACjF,UAAI,KAAK;AAAA,QAAE,OAAO;AAAA,QAAQ,MAAM;AAAA,QAAmB,SAAS;AAAA,QAC1D,SAAS,GAAG,IAAI,gBAAgB,EAAE,iBAAiB,MAAM,KAAK,GAAG,CAAC,IAAI,MAAM,WAAW,IAAI,OAAO,SAAS,6CAA6C,MAAM,WAAW,IAAI,OAAO,KAAK,8CAAyC,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC,CAAC,eAAe,IAAI,IAAI,EAAE,IAAI,MAAM,CAAC,CAAC;AAAA,MAAG,CAAC;AAG7S,QAAI,eAAe,UAAa,WAAW,IAAI,UAAU,GAAG;AAC1D,UAAI;AACJ,eAAS,MAA0B,YAAY,QAAQ,UAAa,UAAU,QAAW,MAAM,SAAS,IAAI,GAAG,EAAG,KAAI,MAAM,SAAS,GAAG,EAAG,SAAQ;AACnJ,UAAI,UAAU,OAAW,KAAI,KAAK;AAAA,QAAE,OAAO;AAAA,QAAS,MAAM;AAAA,QAAoB,SAAS;AAAA,QACrF,SAAS,GAAG,IAAI,gBAAgB,EAAE,aAAa,SAAS,SAAS,SAAS,MAAM,0BAA0B,UAAU,MAAM,SAAS,UAAU,GAAG,GAAG,UAAU,aAAa,iCAAiC,sBAAsB,KAAK,+BAA+B;AAAA,MAAsH,CAAC;AAAA,IAChY;AAAA,EACF;AACA,aAAW,KAAK,IAAI,MAAM;AACxB,UAAM,OAAO,OAAO,IAAI,EAAE,MAAM;AAChC,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,CAAC,UAAmB,OAAO,UAAU,YAAY,QAAQ,IAAI,KAAK,GAAG,SAAS;AAC7F,UAAM,QAAQ,OAAO,KAAK,UAAU,KAAK,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,KAAK,OAC9E,EAAE,WAAW,UAAU,EAAE,SAAS,gBAAgB,EAAE,OAAO,KAAK,MAAM,EAAE,KAAK,KAAK,OAAK,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AACtG,QAAI,CAAC,MAAO,KAAI,KAAK;AAAA,MAAE,OAAO;AAAA,MAAS,MAAM;AAAA,MAAgB,SAAS,EAAE;AAAA,MACtE,SAAS,oBAAoB,EAAE,EAAE,mBAAmB,EAAE,MAAM,4JAAuJ,EAAE,MAAM;AAAA,IAAoB,CAAC;AAAA,EACpP;AAWA,QAAM,cAAc,IAAI,GAAG,OAAO,OAAK,EAAE,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,OAAK,WAAW,IAAI,CAAC,CAAC,KAAK,WAAW,IAAI,EAAE,MAAM,CAAC;AAG9H,QAAM,UAAU,CAAC,MAAY,KAAa,SAAiB;AAAE,UAAM,IAAI,KAAK,IAAI,GAAG;AAAG,WAAO,OAAO,MAAM,WAAW,IAAI;AAAA,EAAM;AAE/H,QAAM,cAAc,CAAC,MAAmC,MAAoB;AAC1E,QAAI,QAAQ,KAAK,MAAM,GAAG,MAAM,EAAE,IAAI,KAAK,GAAG,EAAE,GAAG,KAAK,EAAG,QAAO;AAClE,QAAI,QAAQ,KAAK,MAAM,GAAG,MAAM,EAAE,IAAI,SAAS,GAAG,EAAE,UAAU,IAAI,CAAC,IAAI,IAAK,QAAO;AACnF,UAAM,EAAE,UAAU,MAAM,IAAI,QAAQ,MAAM,CAAC;AAC3C,WAAO,WAAW,QAAQ,WAAW,WAAW,QAAQ;AAAA,EAC1D;AACA,aAAW,KAAK,aAAa;AAC3B,UAAM,OAAO,YAAY,WAAW,CAAC;AACrC,QAAI,SAAS,OAAW,KAAI,KAAK;AAAA,MAAE,OAAO;AAAA,MAAQ,MAAM;AAAA,MAAkB,SAAS,EAAE;AAAA,MACnF,SAAS,OAAO,EAAE,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,KAAK,MAAM,IAAI,CAAC;AAAA,IAAmH,CAAC;AAAA,EAC9M;AAUA,QAAM,SAAS,IAAI,YAAY,OAAO,CAAC,QAA+B,IAAI,SAAS,UAAU,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,IAAI,CAAC;AACnI,QAAM,UAAoB,CAAC,GAAG,WAAW,oBAAI,IAAoB;AACjE,QAAM,UAAU,CAAC,OAAe;AAAE,QAAI,IAAI,SAAS,IAAI,EAAE;AAAG,QAAI,MAAM,QAAW;AAAE,UAAI,QAAQ;AAAQ,cAAQ,KAAK,EAAE;AAAG,eAAS,IAAI,IAAI,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EAAG;AAE1J,QAAM,YAAY,oBAAI,IAAsB;AAC5C,aAAW,OAAO,QAAQ;AACxB,UAAM,MAAM,oBAAI,IAAY;AAC5B,UAAM,OAAO,OAAO,IAAI,IAAI,IAAI;AAChC,QAAI,QAAQ,WAAW,IAAI,KAAK,IAAI,EAAG,KAAI,IAAI,KAAK,IAAI;AACxD,QAAI,IAAI;AAAS,iBAAW,QAAQ,IAAI,QAAS,YAAW,OAAO,KAAM,KAAI,WAAW,IAAI,IAAI,IAAI,EAAG,KAAI,IAAI,IAAI,IAAI;AAAA;AACvH,cAAU,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,EAAE,IAAI,OAAO,CAAC;AAAA,EAC7C;AACA,QAAM,cAAc,QAAQ,IAAI,QAAM,UAAU,MAAM,IAAI,EAAE,EAAG,KAAK;AAEpE,QAAM,YAAY;AAClB,QAAM,aAAa,CAAC,SAAsC;AACxD,UAAM,QAAQ,IAAI,WAAW,QAAQ,MAAM;AAC3C,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC,CAAC,EAAG,OAAO,IAAI,YAAY,CAAC;AAC9D,YAAM,CAAC,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,aAAa,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,aAAa,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,aAClG,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,aAAa,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,aAAa,KAAK,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,YAAY,IAAI;AAAA,IACvH;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,oBAAI,IAAsB,GAAG,WAAW,oBAAI,IAAoB;AACjF,QAAM,SAAS,CAAC,QAAwB;AACtC,QAAI,OAAO,SAAS,IAAI,IAAI,EAAE;AAC9B,QAAI,CAAC,MAAM;AACT,aAAO,wBAAwB,WAAW,IAAI,MAAM,GAAG;AACvD,eAAS,IAAI,IAAI,IAAI,IAAI;AACzB,eAAS,IAAI,IAAI,IAAI,SAAS,MAAM,IAAI,SAAS,CAAC;AAAA,IACpD;AACA,WAAO;AAAA,EACT;AAGA,aAAW,KAAK,OAAO;AACrB,QAAI,KAAK,GAAG,cAAc,KAAK,GAAG,IAAI,CAAC;AAEvC,eAAW,KAAK,EAAE,QAAQ;AACxB,UAAI,CAAC,UAAU,CAAC,EAAG;AACnB,YAAM,OAAO,EAAE,KAAK,IAAI,OAAK,EAAE,CAAW;AAC1C,UAAI,KAAK,UAAU,KAAK,KAAK,MAAM,OAAK,MAAM,KAAK,CAAC,CAAC,GAAG;AACtD,cAAM,OAAO,UAAU,KAAK,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;AACtD,cAAM,SAAS,OAAO,SAAS,YAAY,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI;AACtE,YAAI,KAAK;AAAA,UAAE,OAAO,SAAS,SAAS;AAAA,UAAQ,MAAM;AAAA,UAAgB,SAASF,SAAQ,CAAC;AAAA,UAAG,WAAW,EAAE;AAAA,UAClG,SAAS,SACL,cAAc,EAAE,EAAE,KAAKA,SAAQ,CAAC,CAAC,SAAS,KAAK,MAAM,+BAA+B,IAAI,KAAK,CAAC,CAAC,CAAC,4CAChG,cAAc,EAAE,EAAE,KAAKA,SAAQ,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,SAAS,WAAW,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE;AAAA,QAA+B,CAAC;AAAA,MAC1J;AACA,UAAI,EAAE,MAAM;AACV,cAAM,KAAK,OAAO,GAAG,CAAC,GAAa,KAAK,OAAO,GAAG,EAAE,QAAQ;AAC5D,cAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI;AAClD,YAAI,KAAK,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI,MAAM,OAAO,KAAK;AACjD,cAAI,KAAK;AAAA,YAAE,OAAO;AAAA,YAAQ,MAAM;AAAA,YAAa,SAASA,SAAQ,CAAC;AAAA,YAAG,WAAW,EAAE;AAAA,YAC7E,SAAS,cAAc,EAAE,EAAE,KAAKA,SAAQ,CAAC,CAAC,qBAAqB,IAAI,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,iBAAiB,IAAI,EAAE,CAAC,WAAM,IAAI,EAAE,CAAC;AAAA,UAAI,CAAC;AAAA,MACzI;AAAA,IACF;AAMA,UAAM,cAAc,IAAI,IAAI,EAAE,OAAO,OAAO,OAAK,EAAE,WAAW,YAAY,EAAE,SAAS,UAAU,EAAE,IAAI,OAAK,EAAE,EAAE,CAAC;AAC/G,UAAM,eAAe,OAAO,OAAO,SAAO,YAAY,IAAI,IAAI,EAAE,CAAC;AACjE,UAAM,cAAc,OAAO,OAAO,SAAO,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;AAKjE,UAAM,YAAY,oBAAI,IAAgE;AACtF,UAAM,cAAc,CAAC,KAAqB,MAAmC,MAAc;AACzF,YAAM,OAAO,OAAO,GAAG;AACvB,YAAM,OAAO,gBAAgB,MAAM,wBAAwB,MAAM,IAAI,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC;AACjG,UAAI,CAAC,KAAK,OAAQ;AAClB,UAAI,SAAS;AACb,iBAAW,KAAK,KAAM,WAAU,KAAK,IAAI,aAAa,MAAM,IAAI,UAAU,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,IAAI,CAAC,GAAG,IAAI,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC;AACrI,YAAM,QAAQ,SAAS,IAAI,IAAI,EAAE;AACjC,YAAM,QAAQ,QAAQ,IAAI,SAAS,QAAQ;AAC3C,YAAM,OAAO,UAAU,IAAI,IAAI,EAAE;AACjC,UAAI,CAAC,QAAQ,QAAQ,KAAK,MAAO,WAAU,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,KAAK,QAAQ,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC;AAAA,IACjG;AAEA,UAAM,QAAQ,oBAAI,IAAqD;AACvE,UAAM,SAAS,oBAAI,IAAyD;AAC5E,UAAM,WAAW,MAAM,GAAG,GAAG;AAC7B,eAAW,KAAK,UAAU;AACxB,YAAM,OAAO,OAAO,GAAG,CAAC,GAAG,QAAQ,SAAS,KAAK,IAAI;AACrD,iBAAW,KAAK,IAAI,OAAO;AACzB,cAAM,IAAI,WAAW,MAAM,EAAE,IAAI,KAAK;AACtC,YAAI,KAAK,EAAE,MAAM,MAAM,IAAI,EAAE,EAAE,GAAG,MAAM,WAAY,OAAM,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;AAAA,MACnG;AACA,iBAAW,KAAK,aAAa;AAC3B,cAAM,OAAO,YAAY,OAAO,CAAC;AACjC,YAAI,SAAS,OAAW;AACxB,cAAM,MAAM,OAAO,IAAI,EAAE,EAAE;AAC3B,YAAI,CAAC,IAAK,QAAO,IAAI,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAAC;AAAA,aAC5C;AAAE,cAAI;AAAU,cAAI,OAAO,IAAI,MAAM;AAAE,gBAAI,OAAO;AAAM,gBAAI,IAAI;AAAA,UAAG;AAAA,QAAE;AAAA,MAC5E;AACA,YAAM,QAAQ,WAAW,KAAK;AAC9B,iBAAW,OAAO,YAAa,KAAI,UAAU,IAAI,IAAI,EAAE,EAAG,KAAK,OAAK,MAAM,CAAC,CAAC,EAAG,aAAY,KAAK,OAAO,CAAC;AAAA,IAC1G;AACA,eAAW,CAAC,MAAM,CAAC,KAAK,MAAO,KAAI,EAAE,KAAK;AACxC,UAAI,KAAK;AAAA,QAAE,OAAO;AAAA,QAAQ,MAAM;AAAA,QAAiB,SAAS;AAAA,QAAM,WAAW,EAAE;AAAA,QAAI,MAAM,EAAE;AAAA,QACvF,SAAS,SAAS,IAAI,0BAA0B,KAAK,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,UAAU,EAAE,EAAE,QAAQ,CAAC,CAAC,SAAS,EAAE,EAAE;AAAA,MAAI,CAAC;AAC3H,eAAW,KAAK,aAAa;AAC3B,YAAM,IAAI,OAAO,IAAI,EAAE,EAAE;AACzB,UAAI,KAAK,EAAE,SAAS,wBAAwB,SAAS;AACnD,YAAI,KAAK;AAAA,UAAE,OAAO;AAAA,UAAQ,MAAM;AAAA,UAAkB,SAAS,EAAE;AAAA,UAAI,WAAW,EAAE;AAAA,UAAI,MAAM,EAAE;AAAA,UACxF,SAAS,OAAO,EAAE,EAAE,mBAAmB,EAAE,MAAM,QAAQ,KAAK,MAAM,MAAM,EAAE,SAAS,SAAS,MAAM,CAAC,SAAS,EAAE,EAAE,YAAY,KAAK,MAAM,EAAE,IAAI,CAAC,oCAAoC,EAAE,EAAE,QAAQ,CAAC,CAAC;AAAA,QAAsE,CAAC;AAAA,IAC7Q;AAEA,UAAM,YAAY,EAAE,OAAO,QAAQ,OAAK,EAAE,KAAK,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,MAAO,EAAE,SAAS,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,EAAG,EAAE,OAAO,OAAK,KAAK,CAAC,CAAC;AAEzI;AACE,YAAM,KAAK,MAAM,GAAG,IAAI;AACxB,YAAM,OAAO,oBAAI,IAA8B;AAC/C,YAAM,SAAS,oBAAI,IAAwC;AAC3D,iBAAW,KAAK,IAAI;AAClB,cAAM,OAAO,SAAS,KAAK,OAAO,GAAG,CAAC,CAAC,GAAG,QAAQ,KAAK;AACvD,mBAAW,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,KAAK,OAAO;AACtC,gBAAM,IAAI,KAAK,IAAI,EAAE;AACrB,cAAI,EAAG,EAAC,OAAO,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,GAAI,KAAK,EAAE,GAAG,GAAG,KAAK,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;AAC1G,eAAK,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;AAAA,QAC3B;AACA,mBAAW,OAAO,aAAc,aAAY,KAAK,MAAM,CAAC;AAAA,MAC1D;AACA,iBAAW,CAAC,IAAI,EAAE,KAAK,QAAQ;AAC7B,cAAM,SAAS,GAAG,IAAI,OAAK,EAAE,CAAC,EAAE,OAAO,OAAK,IAAI,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACvE,YAAI,CAAC,OAAO,OAAQ;AACpB,cAAM,UAAU,OAAO,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC;AACpD,cAAMG,SAAQ,GAAG,OAAO,CAAC,GAAG,MAAO,EAAE,IAAI,EAAE,IAAI,IAAI,GAAI,GAAG,CAAC,CAAC;AAC5D,cAAM,QAAQ,GAAG,QAAQA,MAAK;AAC9B,cAAM,aAAa,KAAK,IAAI,GAAG,QAAQ,CAAC,GAAG,KAAK,GAAG,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC;AACxE,YAAIA,OAAM,IAAI,KAAK,IAAI,GAAG,IAAI,SAAS,IAAI,UAAU,GAAG;AACtD,gBAAM,UAAU,UAAU,KAAK,QAAM,KAAKA,OAAM,IAAI,IAAI,OAAO,QAAQ,MAAMA,OAAM,IAAI,IAAI;AAC3F,cAAI,KAAK;AAAA,YAAE,OAAO,UAAU,SAAS;AAAA,YAAQ,MAAM;AAAA,YAAc,SAAS;AAAA,YAAI,WAAW,EAAE;AAAA,YAAI,MAAMA,OAAM;AAAA,YACzG,SAAS,SAAS,EAAE,WAAW,KAAK,MAAMA,OAAM,CAAC,CAAC,wBAAwBA,OAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,EAAE,EAAE,2BAA2B,IAAI,OAAO,CAAC;AAAA,UAAsC,CAAC;AAAA,QAC3L;AAAA,MACF;AAAA,IACF;AACA,eAAW,OAAO,CAAC,GAAG,cAAc,GAAG,WAAW,GAAG;AACnD,YAAM,IAAI,UAAU,IAAI,IAAI,EAAE;AAC9B,UAAI,EAAG,KAAI,KAAK;AAAA,QAAE,OAAO,EAAE,SAAS,mBAAmB,UAAU;AAAA,QAAQ,MAAM;AAAA,QAAa,SAAS,IAAI;AAAA,QAAI,WAAW,EAAE;AAAA,QAAI,MAAM,EAAE;AAAA,QACpI,SAAS,eAAe,IAAI,EAAE,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,IAAI,KAAK,GAAG,qBAAqB,EAAE,CAAC,UAAU,EAAE,EAAE,QAAQ,CAAC,CAAC,SAAS,EAAE,EAAE,kDAA6C,IAAI,MAAM,EAAE,KAAK,CAAC;AAAA,MAAiB,CAAC;AAAA,IAC9N;AAEA,UAAM,WAAW,CAAC,GAAG,IAAI,IAAI,EAAE,OAAO,OAAO,OAAK,EAAE,WAAW,YAAY,EAAE,SAAS,UAAU,EAAE,IAAI,OAAK,EAAE,EAAE,CAAC,CAAC;AACjH,eAAW,SAAS,UAAU;AAC5B,YAAM,MAAM,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,KAAK;AACpD,UAAI,CAAC,OAAO,IAAI,SAAS,SAAU;AACnC,YAAM,QAAQ,IAAI,OAAO,KAAK,OAAK,EAAE,OAAO,IAAI,KAAK;AACrD,UAAI,CAAC,MAAO;AACZ,YAAM,IAAI,IAAI,SAAS,MAAM,OAAO,IAAI,IAAI,UAAU,MAAM;AAC5D,UAAI;AACJ,iBAAW,KAAK,MAAM,GAAG,IAAI,GAAG;AAC9B,cAAM,SAAS,aAAa,OAAO,GAAG,CAAC,GAAG,KAAK;AAC/C,YAAI,CAAC,OAAQ;AACb,cAAM,MAAM,YAAY,eAAe,QAAQ,GAAG,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;AAC9E,YAAI,OAAO,MAAM,CAAC,QAAQ,MAAM,KAAK,KAAM,QAAO,EAAE,GAAG,IAAI;AAAA,MAC7D;AACA,UAAI,KAAM,KAAI,KAAK;AAAA,QAAE,OAAO;AAAA,QAAS,MAAM;AAAA,QAAe,SAAS;AAAA,QAAO,WAAW,EAAE;AAAA,QAAI,MAAM,KAAK;AAAA,QACpG,SAAS,eAAe,KAAK,iCAAiC,IAAI,KAAK,GAAG,CAAC,UAAU,KAAK,EAAE,QAAQ,CAAC,CAAC,SAAS,EAAE,EAAE;AAAA,MAAgD,CAAC;AAAA,IACxK;AAAA,EACF;AAGA,aAAW,OAAO,IAAI,aAAa;AACjC,QAAI,IAAI,SAAS,SAAU;AAC3B,UAAM,QAAQ,IAAI,OAAO,KAAK,OAAK,EAAE,OAAO,IAAI,KAAK,GAAG,OAAO,OAAO,QAAQ;AAC9E,QAAI,CAAC,SAAS,CAAC,QAAQ,MAAM,QAAQ,cAAc,YAAY,CAAC,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,IAAI,EAAG;AACxG,UAAM,CAAC,IAAI,EAAE,IAAI,MAAM,aAAa,WAAW,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC;AACnE,UAAM,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK;AACtF,UAAM,OAAO,KAAK,MAAM,IAAI,EAAE;AAC9B,QAAI,OAAO,EAAG,KAAI,KAAK;AAAA,MAAE,OAAO;AAAA,MAAQ,MAAM;AAAA,MAAgB,SAAS,IAAI;AAAA,MACzE,SAAS,SAAS,IAAI,IAAI,kBAAkB,IAAI,EAAE,UAAU,KAAK,MAAM,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,IAAK,KAAK,IAAI,UAAU,UAAY,KAAK,IAAI,aAAa,SAAU,sCAAsC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,wBAAwB,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;AAAA,IAAK,CAAC;AAAA,EAC/R;AAGA,aAAW,OAAO,IAAI,aAAa;AACjC,QAAI,IAAI,SAAS,UAAU,CAAC,IAAI,QAAS;AACzC,QAAI,aAAa,IAAI,WAAW,GAAG,QAAQ;AAC3C,QAAI,QAAQ,QAAQ,CAAC,MAAM,MAAM;AAC/B,YAAM,MAAM,KAAK,OAAO,CAAC,GAAG,QAAQ,IAAI,IAAI,GAAG,CAAC;AAChD,UAAI,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM;AAAE;AAAS,YAAI,aAAa,GAAG;AAAE,uBAAa;AAAG,qBAAW;AAAA,QAAK;AAAA,MAAE;AAAA,IACnG,CAAC;AACD,QAAI,QAAQ,EAAG,KAAI,KAAK;AAAA,MAAE,OAAO;AAAA,MAAQ,MAAM;AAAA,MAAe,SAAS,IAAI;AAAA,MACzE,SAAS,eAAe,IAAI,EAAE,MAAM,KAAK,IAAI,UAAU,IAAI,eAAe,eAAe,gDAAgD,UAAU,SAAS,IAAI,QAAQ,CAAC;AAAA,IAAI,CAAC;AAAA,EAClL;AAGA,QAAM,mBAAmB,oBAAI,IAAY;AACzC,aAAW,KAAK,IAAI,MAAO,KAAI,EAAE,WAAY,kBAAiB,IAAI,EAAE,UAAU;AAC9E,QAAM,YAAY,oBAAI,IAAY;AAClC,aAAW,KAAK,IAAI,WAAY,YAAW,KAAK,EAAE;AAChD,QAAI,EAAE,WAAW,UAAU,EAAE,SAAS;AAAc,iBAAW,KAAK,EAAE,KAAM,KAAI,OAAO,EAAE,MAAM,UAAU;AAAE,yBAAiB,IAAI,EAAE,CAAC;AAAG,kBAAU,IAAI,EAAE,EAAE;AAAA,MAAG;AAAA;AAC7J,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,OAAO,IAAI,YAAa,KAAI,IAAI,SAAS,UAAU,iBAAiB,IAAI,IAAI,EAAE,EAAG,MAAK,IAAI,IAAI,KAAK;AAC9G,aAAW,SAAS,IAAI,OAAQ,KAAI,CAAC,KAAK,IAAI,MAAM,EAAE;AACpD,QAAI,KAAK,EAAE,OAAO,QAAQ,MAAM,gBAAgB,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,EAAE,+DAA+D,CAAC;AAChK,QAAM,YAAY,IAAI,IAAI,IAAI,MAAM,QAAQ,OAAK,EAAE,OAAO,CAAC,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;AAClH,aAAW,KAAK,IAAI,MAAO,KAAI,CAAC,EAAE,cAAc,CAAC,UAAU,IAAI,EAAE,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE;AACzF,QAAI,KAAK,EAAE,OAAO,QAAQ,MAAM,iBAAiB,SAAS,EAAE,IAAI,SAAS,SAAS,EAAE,EAAE,sDAAsD,CAAC;AAE/I,SAAO;AACT;AAMO,SAAS,UAAU,UAAqB,MAAM,IAAY;AAC/D,MAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,QAAM,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,EAAE;AAC1C,QAAM,SAAS,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE,KAAK,CAAC;AACzE,QAAM,IAAI,CAAC,UAA4B,SAAS,OAAO,OAAK,EAAE,UAAU,KAAK,EAAE;AAC/E,QAAM,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;AACjF,QAAM,OAAO,YAAY,MAAM,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,MAAM,SAAS,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI;AAEjI,QAAM,WAAW;AACjB,QAAM,YAAY,oBAAI,IAAoB;AAC1C,aAAW,KAAK,OAAQ,WAAU,IAAI,EAAE,OAAO,UAAU,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC;AAC9E,QAAM,eAAe,oBAAI,IAAoB;AAC7C,QAAM,QAAkB,CAAC;AACzB,aAAW,KAAK,QAAQ;AACtB,UAAM,QAAQ,aAAa,IAAI,EAAE,IAAI,KAAK;AAC1C,QAAI,QAAQ,SAAU,OAAM,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE;AAAA,aAChE,UAAU,SAAU,OAAM,KAAK,YAAO,UAAU,IAAI,EAAE,IAAI,IAAK,QAAQ,SAAS,EAAE,IAAI,EAAE;AACjG,iBAAa,IAAI,EAAE,MAAM,QAAQ,CAAC;AAAA,EACpC;AACA,QAAM,SAAS,MAAM,MAAM,GAAG,GAAG;AACjC,MAAI,MAAM,SAAS,IAAK,QAAO,KAAK,YAAO,MAAM,SAAS,GAAG,OAAO;AACpE,SAAO,CAAC,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI;AACpC;;;AC7aA,SAAS,SAAAC,QAAO,WAAAC,UAAS,YAAAC,WAAU,aAAAC,YAAW,cAAc;AAC5D,SAAS,YAAAC,WAAU,WAAAC,UAAS,QAAAC,aAAY;AAGjC,SAAS,WAAW,SAAyB;AAClD,SAAOA,MAAKD,SAAQ,OAAO,GAAG,gBAAgBD,UAAS,OAAO,EAAE,QAAQ,WAAW,EAAE,CAAC;AACxF;AAEA,eAAe,MAAM,KAAgC;AACnD,MAAI;AAAE,YAAQ,MAAMH,SAAQ,GAAG,GAAG,OAAO,OAAK,iBAAiB,KAAK,CAAC,CAAC,EACnE,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,IAAI,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,EAAG,QAC9D;AAAE,WAAO,CAAC;AAAA,EAAG;AACrB;AAEA,eAAe,UAAU,SAAoC;AAC3D,SAAO,MAAM,WAAW,OAAO,CAAC;AAClC;AAGA,eAAsB,YAAY,SAAoC;AACpE,UAAQ,MAAM,UAAU,OAAO,GAAG,IAAI,OAAKK,MAAK,WAAW,OAAO,GAAG,CAAC,CAAC;AACzE;AAEO,IAAM,UAAU,CAAC,YAAoBA,MAAK,WAAW,OAAO,GAAG,MAAM;AAG5E,eAAsB,SAAS,SAAoC;AACjE,UAAQ,MAAM,MAAM,QAAQ,OAAO,CAAC,GAAG,IAAI,OAAKA,MAAK,QAAQ,OAAO,GAAG,CAAC,CAAC;AAC3E;AAGA,eAAsB,UAAU,SAAgC;AAC9D,aAAW,KAAK,MAAM,SAAS,OAAO,EAAG,OAAM,OAAO,CAAC;AACzD;AAEA,eAAe,SAAS,KAAa,UAAkB,MAA+B;AACpF,QAAMN,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,KAAK,MAAM,MAAM,GAAG;AAC1B,QAAM,OAAO,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,IAAI;AAC/D,QAAM,OAAOM,MAAK,KAAK,GAAG,OAAO,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC,OAAO;AAC9D,QAAMH,WAAU,MAAM,QAAQ;AAC9B,aAAW,KAAK,GAAG,MAAM,GAAG,KAAK,IAAI,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,EAAG,OAAM,OAAOG,MAAK,KAAK,CAAC,CAAC;AACzF,SAAO;AACT;AAGA,eAAsB,YAAY,SAAiB,UAAkB,OAAO,IAAI,OAA+B,CAAC,GAAoB;AAClI,MAAI,CAAC,KAAK,SAAU,OAAM,UAAU,OAAO;AAC3C,SAAO,SAAS,WAAW,OAAO,GAAG,UAAU,IAAI;AACrD;AAGA,eAAsB,WAAW,SAAiB,QAAQ,GAAoB;AAC5E,QAAMC,SAAQ,MAAM,UAAU,OAAO;AACrC,MAAI,CAACA,OAAM,OAAQ,OAAM,IAAI,MAAM,yBAAyB;AAC5D,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQA,OAAM;AACzD,UAAM,IAAI,MAAM,QAAQA,OAAM,MAAM,YAAYA,OAAM,WAAW,IAAI,KAAK,GAAG,2BAA2B,KAAK,EAAE;AACjH,QAAM,MAAM,WAAW,OAAO;AAC9B,QAAM,WAAW,MAAML,UAASI,MAAK,KAAKC,OAAMA,OAAM,SAAS,KAAK,CAAC,GAAG,MAAM;AAC9E,aAAW,KAAKA,OAAM,MAAMA,OAAM,SAAS,KAAK,EAAG,OAAM,OAAOD,MAAK,KAAK,CAAC,CAAC;AAC5E,SAAO;AACT;AAGA,eAAsB,KAAK,SAAiB,QAAQ,GAAoB;AACtE,QAAM,UAAU,MAAMJ,UAAS,SAAS,MAAM;AAC9C,QAAM,WAAW,MAAM,WAAW,SAAS,KAAK;AAChD,QAAM,SAAS,QAAQ,OAAO,GAAG,SAAS,EAAE;AAC5C,SAAO;AACT;AAGA,eAAsB,KAAK,SAAkC;AAC3D,QAAMM,WAAU,MAAM,SAAS,OAAO;AACtC,MAAI,CAACA,SAAQ,OAAQ,OAAM,IAAI,MAAM,iBAAiB;AACtD,QAAM,OAAOA,SAAQA,SAAQ,SAAS,CAAC;AACvC,QAAM,WAAW,MAAMN,UAAS,MAAM,MAAM;AAC5C,QAAM,YAAY,SAAS,MAAMA,UAAS,SAAS,MAAM,GAAG,IAAI,EAAE,UAAU,KAAK,CAAC;AAClF,QAAM,OAAO,IAAI;AACjB,SAAO;AACT;AAIA,IAAM,IAAI,CAAC,MAAe,KAAK,UAAU,CAAC;AAC1C,IAAMO,OAAM,CAAC,MAAgB,OAAO,MAAM,WAAW,OAAO,KAAK,MAAM,IAAI,GAAI,IAAI,GAAI,IAAI,MAAM,SAAY,WAAM,EAAE,CAAC;AACtH,IAAM,QAAQ,CAAC,MAA6C,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAEnH,IAAM,OAAO,CAAC,MAAe,MAAM,QAAQ,CAAC,KAAK,EAAE,SAAS;AAC5D,IAAM,UAAU,CAAC,MAAgB,MAAM,QAAQ,CAAC,IAAI,GAAG,EAAE,MAAM,aAAaA,KAAI,CAAC;AAGjF,SAAS,SAAS,GAA4B,GAA4B,SAAS,IAAc;AAC/F,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAK,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,CAAC,GAAG,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG;AAC/D,UAAM,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,OAAO,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK;AAC/D,QAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAG;AACrB,QAAI,MAAM,EAAE,KAAK,MAAM,EAAE,EAAG,KAAI,KAAK,GAAG,SAAS,IAAI,IAAI,IAAI,CAAC;AAAA,aACrD,MAAM,QAAQ,EAAE,KAAK,MAAM,QAAQ,EAAE,KAAK,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,KACrF,GAAG,MAAM,OAAK,OAAO,MAAM,QAAQ,KAAK,GAAG,MAAM,OAAK,OAAO,MAAM,QAAQ,GAAG;AACjF,UAAI,IAAI,GAAG,MAAM;AACjB,eAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;AAAE,cAAM,IAAI,KAAK,IAAK,GAAG,CAAC,IAAgB,GAAG,CAAC,CAAY;AAAG,YAAI,GAAG;AAAE;AAAK,cAAI,IAAI,IAAK,OAAM;AAAA,QAAG;AAAA,MAAE;AACvI,UAAI,KAAK,GAAG,IAAI,KAAK,CAAC,iCAA4BA,KAAI,GAAG,CAAC,GAAG;AAAA,IAC/D,WAES,MAAM,QAAQ,EAAE,KAAK,MAAM,QAAQ,EAAE,KAAK,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG;AAC3F,UAAI,IAAI;AACR,eAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,IAAK,KAAI,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAG;AAC/D,UAAI,KAAK,GAAG,IAAI,KAAK,CAAC,kBAAkB;AAAA,IAC1C,WAES,MAAM,QAAQ,EAAE,KAAK,MAAM,QAAQ,EAAE;AAC5C,UAAI,KAAK,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM,IAAI,IAAI,GAAG,IAAI,YAAY,GAAG,MAAM,WAAM,GAAG,MAAM,KAAK,GAAG,IAAI,KAAKA,KAAI,EAAE,CAAC,WAAMA,KAAI,EAAE,CAAC,EAAE;AAAA,aAEzH,KAAK,EAAE,KAAK,KAAK,EAAE,EAAG,KAAI,KAAK,GAAG,IAAI,KAAK,QAAQ,EAAE,CAAC,WAAM,QAAQ,EAAE,CAAC,EAAE;AAAA,QAC7E,KAAI,KAAK,GAAG,IAAI,KAAKA,KAAI,EAAE,CAAC,WAAMA,KAAI,EAAE,CAAC,EAAE;AAAA,EAClD;AACA,SAAO;AACT;AAEA,IAAMC,WAAU,CAAC,MAAa,GAAG,EAAE,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI;AAC3D,SAAS,WAAW,GAAkB;AACpC,QAAM,OAAO,EAAE,KAAK,IAAI,OAAK,EAAE,CAAC,EAAE,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AAClF,SAAO,KAAK,SAAS,IAAID,KAAI,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,KAAKA,KAAI,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,KAAK,IAAI,OAAKA,KAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;AACvI;AACA,IAAM,WAAW,CAAC,MAAa,GAAG,EAAE,KAAK,MAAM,OAAO,EAAE,KAAK,WAAW,IAAI,KAAK,GAAG;AAEpF,SAAS,SAAS,GAAc,GAAwB;AACtD,QAAM,MAAgB,CAAC,GAAG,KAAK,aAAa,EAAE,EAAE;AAChD,aAAW,KAAK,CAAC,YAAY,MAAM,EAAY,KAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,KAAI,KAAK,KAAK,EAAE,KAAK,CAAC,KAAKA,KAAI,EAAE,CAAC,CAAC,CAAC,WAAMA,KAAI,EAAE,CAAC,CAAC,CAAC,EAAE;AACvH,MAAI,EAAE,UAAU,CAAC,EAAE,OAAQ,KAAI,KAAK,KAAK,EAAE,YAAY,EAAE,OAAO,IAAI,wBAAwB;AAAA,WACnF,CAAC,EAAE,UAAU,EAAE,OAAQ,KAAI,KAAK,KAAK,EAAE,YAAY,EAAE,OAAO,IAAI,YAAY,EAAE,EAAE,OAAO,MAAM,CAAC,EAAE;AAAA,WAChG,EAAE,UAAU,EAAE,QAAQ;AAC7B,QAAI,EAAE,OAAO,SAAS,EAAE,OAAO,KAAM,KAAI,KAAK,KAAK,EAAE,YAAY,EAAE,OAAO,IAAI,WAAM,EAAE,OAAO,IAAI,EAAE;AACnG,eAAW,KAAK,SAAS,EAAE,OAAO,QAAQ,EAAE,OAAO,MAAM,EAAG,KAAI,KAAK,KAAK,EAAE,YAAY,EAAE,OAAO,IAAI,IAAI,CAAC,EAAE;AAAA,EAC9G;AACA,QAAM,KAAK,IAAI,IAAI,EAAE,OAAO,IAAI,OAAK,CAACC,SAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,OAAO,IAAI,OAAK,CAACA,SAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACvG,aAAW,CAAC,KAAK,CAAC,KAAK,GAAI,KAAI,CAAC,GAAG,IAAI,GAAG,EAAG,KAAI,KAAK,WAAW,GAAG,KAAK,SAAS,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE;AACnH,aAAW,CAAC,KAAK,CAAC,KAAK,IAAI;AACzB,UAAM,IAAI,GAAG,IAAI,GAAG;AACpB,QAAI,CAAC,EAAG,KAAI,KAAK,WAAW,GAAG,KAAK,SAAS,CAAC,CAAC,UAAU,EAAE,EAAE,EAAE;AAAA,aACtD,EAAE,EAAE,IAAI,MAAM,EAAE,EAAE,IAAI,EAAG,KAAI,KAAK,WAAW,GAAG,OAAO,EAAE,EAAE,KAAK,SAAS,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,WAAM,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,KAAK,SAAS,CAAC,IAAI,GAAG,GAAG,WAAW,CAAC,CAAC,EAAE;AAAA,EACvL;AACA,MAAI,EAAE,EAAE,MAAM,MAAM,EAAE,EAAE,MAAM,EAAG,KAAI,KAAK,KAAK,EAAE,YAAY,EAAE,OAAO,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,QAAG,WAAM,EAAE,OAAO,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,QAAG,EAAE;AACzJ,SAAO;AACT;AAGO,SAAS,SAAS,GAAgB,GAA0B;AACjE,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAK,SAAS,EAAE,MAAM,EAAE,IAAI,EAAG,KAAI,KAAK,UAAU,CAAC,EAAE;AAChE,QAAM,QAAuC;AAAA,IAC3C,CAAC,UAAU,OAAO;AAAA,IAAG,CAAC,SAAS,MAAM;AAAA,IAAG,CAAC,SAAS,MAAM;AAAA,IACxD,CAAC,eAAe,YAAY;AAAA,IAAG,CAAC,MAAM,IAAI;AAAA,IAAG,CAAC,aAAa,WAAW;AAAA,IAAG,CAAC,QAAQ,MAAM;AAAA,EAC1F;AACA,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO;AAChC,UAAM,KAAK,IAAI,IAAK,EAAE,IAAI,EAAuB,IAAI,OAAK,CAAC,EAAE,IAAI,CAAuC,CAAC,CAAC;AAC1G,UAAM,KAAK,IAAI,IAAK,EAAE,IAAI,EAAuB,IAAI,OAAK,CAAC,EAAE,IAAI,CAAuC,CAAC,CAAC;AAC1G,eAAW,CAAC,IAAI,CAAC,KAAK,GAAI,KAAI,CAAC,GAAG,IAAI,EAAE,EAAG,KAAI,KAAK,KAAK,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;AAC7E,eAAW,CAAC,IAAI,CAAC,KAAK,IAAI;AACxB,YAAM,IAAI,GAAG,IAAI,EAAE;AACnB,UAAI,CAAC,EAAG,KAAI,KAAK,KAAK,IAAI,IAAI,EAAE,EAAE;AAAA,UAC7B,YAAW,KAAK,SAAS,GAAG,CAAC,EAAG,KAAI,KAAK,KAAK,IAAI,IAAI,EAAE,KAAK,CAAC,EAAE;AAAA,IACvE;AAAA,EACF;AACA,QAAM,KAAK,IAAI,IAAI,EAAE,WAAW,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,WAAW,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACnG,aAAW,CAAC,IAAI,CAAC,KAAK,GAAI,KAAI,CAAC,GAAG,IAAI,EAAE,EAAG,KAAI,KAAK,eAAe,EAAE,KAAK,EAAE,QAAQ,IAAI,EAAE,OAAO,UAAU,EAAE,KAAK,EAAE,OAAO,MAAM,UAAU,EAAE,SAAS,YAAY,EAAE,OAAO,IAAI,KAAK,EAAE,GAAG;AACzL,aAAW,CAAC,IAAI,CAAC,KAAK,IAAI;AACxB,UAAM,IAAI,GAAG,IAAI,EAAE;AACnB,QAAI,CAAC,EAAG,KAAI,KAAK,eAAe,EAAE,EAAE;AAAA,QAC/B,KAAI,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC;AAAA,EACjC;AACA,SAAO;AACT;;;AC1KA,SAAS,SAAAC,QAAO,YAAAC,WAAU,aAAAC,kBAAiB;AAC3C,SAAS,QAAAC,aAAY;AAErB,SAAS,OAAAC,YAAW;AAcb,SAAS,UAAU,OAAe,OAAoB,CAAC,GAAW;AACvE,QAAM,UAAU,KAAK,WAAW,GAAG,MAAM,KAAK,IAAI,KAAK,WAAW,GAAG,IAAI,OAAO,GAAG,MAAM,KAAK,WAAW;AACzG,QAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AAC7G,aAAW,KAAK;AACd,QAAI,EAAE,QAAQ,IAAI,MAAM,OAAO,EAAE,SAAS,IAAI,MAAM,IAAK,OAAM,IAAI,MAAM,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,OAAI,EAAE,MAAM,uBAAuB,GAAG,UAAU;AACtJ,QAAM,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,QAAQ,QAAQ,EAAE,SAAS,MAAM,CAAC;AAC9E,QAAM,SAAS,KAAK,IAAI,GAAG,GAAG,OAAO,IAAI,OAAK,EAAE,QAAQ,IAAI,GAAG,CAAC;AAChE,MAAI,QAAQ;AACZ,SAAO,QAAQ,QAAQ,QAAQ,UAAU,QAAQ,QAAQ,MAAO,UAAS;AACzE,aAAS;AACP,UAAM,SAAS,oBAAI,IAA8C;AACjE,QAAI,IAAI,KAAK,IAAI,KAAK,QAAQ;AAC9B,eAAW,KAAK,QAAQ;AACtB,UAAI,IAAI,EAAE,QAAQ,MAAM,OAAO;AAAE,YAAI;AAAK,aAAK,QAAQ;AAAK,gBAAQ;AAAA,MAAG;AACvE,aAAO,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC;AAC1C,WAAK,EAAE,QAAQ;AACf,cAAQ,KAAK,IAAI,OAAO,EAAE,MAAM;AAAA,IAClC;AACA,UAAM,SAAS,IAAI,QAAQ;AAC3B,QAAI,UAAU,IAAK,QAAO,EAAE,OAAO,QAAQ,OAAO;AAClD,QAAI,SAAS,IAAK,OAAM,IAAI,MAAM,yBAAyB,GAAG,OAAI,GAAG,WAAW,KAAK,OAAI,MAAM,GAAG;AAClG,aAAS;AAAA,EACX;AACF;AAIA,SAAS,aAAa,OAAY,GAAW,GAAW,GAAW,GAAW,GAAW;AACvF,QAAM,IAAI,MAAM,OAAO,IAAI,MAAM,QAAQ,IAAI,MAAM;AACnD,QAAM,OAAO,CAAC,IAAY,IAAY,IAAY,OAAe;AAC/D,QAAI,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,EAAG;AAC5C,MAAE,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,CAAC;AAAA,EACvE;AACA,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,aAAS,KAAK,GAAG,KAAK,IAAI,GAAG,MAAM;AAAE,WAAK,IAAI,GAAG,IAAI,IAAI,CAAC;AAAG,WAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,IAAG;AACrG,aAAS,KAAK,GAAG,KAAK,IAAI,GAAG,MAAM;AAAE,WAAK,GAAG,IAAI,IAAI,GAAG,EAAE;AAAG,WAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE;AAAA,IAAG;AAAA,EACvG;AACA,WAAS,IAAI,GAAG,KAAK,GAAG,IAAK,UAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AACxD,SAAK,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAAG,SAAK,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AACjE,SAAK,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC;AAAG,SAAK,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC;AAAA,EACnG;AACF;AAEA,eAAsB,WAAW,KAAkB,WAAmB,QAAgB,OAAoB,CAAC,GAAyB;AAClI,QAAM,SAAS,oBAAI,IAAiB;AACpC,QAAMC,SAAQ,oBAAI,IAAiB;AACnC,aAAW,KAAK,IAAI,QAAQ;AAC1B,QAAI,CAAC,UAAU,KAAK,EAAE,GAAG,EAAG,OAAM,IAAI,MAAM,+BAA+B,EAAE,GAAG,aAAa,EAAE,EAAE,iBAAiB;AAClH,QAAI,MAAMA,OAAM,IAAI,EAAE,GAAG;AACzB,QAAI,CAAC,IAAK,CAAAA,OAAM,IAAI,EAAE,KAAM,MAAMD,KAAI,KAAK,KAAK,MAAME,UAASC,MAAK,WAAW,EAAE,GAAG,CAAC,CAAC,CAAE;AACxF,QAAI,EAAE,OAAO;AACX,YAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,OAAO,MAAM,IAAIH,KAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,CAAC;AACzE,MAAAA,KAAI,OAAO,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AACzC,YAAM;AAAA,IACR;AACA,QAAI,IAAI,UAAU,EAAE,SAAS,IAAI,WAAW,EAAE;AAC5C,YAAM,IAAI,MAAM,UAAU,EAAE,EAAE,oBAAoB,EAAE,KAAK,OAAI,EAAE,MAAM,SAAS,EAAE,GAAG,QAAQ,IAAI,KAAK,OAAI,IAAI,MAAM,EAAE;AACtH,WAAO,IAAI,EAAE,IAAI,GAAG;AAAA,EACtB;AACA,QAAM,SAAS,UAAU,IAAI,OAAO,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;AACpG,QAAM,QAAQ,IAAIA,KAAI,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,CAAC;AACpE,aAAW,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,OAAO,QAAQ;AAC9C,IAAAA,KAAI,OAAO,OAAO,IAAI,EAAE,GAAI,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACnD,iBAAa,OAAO,GAAG,GAAG,GAAG,GAAG,KAAK,WAAW,CAAC;AAAA,EACnD;AACA,QAAMI,OAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AACvC,QAAMC,WAAUF,MAAK,QAAQ,WAAW,GAAGH,KAAI,KAAK,MAAM,KAAK,CAAC;AAChE,QAAM,MAAmB,EAAE,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,QAAM,EAAE,GAAG,GAAG,KAAK,aAAa,OAAO,OAAO,OAAO,IAAI,EAAE,EAAE,EAAG,EAAE,EAAE;AAC9H,QAAM,SAASG,MAAK,QAAQ,UAAU,GAAG,GAAG;AAC5C,SAAO;AACT;;;ACtFA,SAAS,YAAAG,WAAU,MAAM,aAAAC,kBAAiB;AAC1C,SAAS,YAAAC,WAAU,WAAAC,UAAS,SAAS,QAAAC,OAAM,gBAAgB;;;ACL3D,SAAS,YAAAC,iBAAgB;AACzB,SAAS,qBAAqB;AAC9B,SAAS,OAAAC,YAAW;AAEpB,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAI;AAEJ,eAAeC,SAAsB;AACnC,MAAI,aAAc,QAAO;AACzB,kBAAgB,YAAY;AAC1B,QAAI;AACJ,QAAI;AAAE,eAASD,SAAQ,QAAQ,mDAAmD;AAAA,IAAG,QAC/E;AAAE,YAAM,IAAI,MAAM,2GAA2G;AAAA,IAAG;AACtI,UAAM,OAAO,MAAMF,UAAS,OAAO,QAAQ,SAAS,OAAO,CAAC;AAE5D,UAAM,MAAM,MAAMA,UAAS,QAAQ,MAAM;AACzC,UAAM,MAAM,EAAE,SAAS,CAAC,EAAS;AACjC,QAAI,SAAS,WAAW,UAAU,WAAW,aAAa,cAAc,GAAG,EAAEE,UAAS,KAAK,IAAI,SAAS,OAAO,QAAQ,YAAY,EAAE,GAAG,MAAM;AAC9I,UAAM,QAAQ,MAAM,IAAI,QAAQ,EAAE,YAAY,KAAK,CAAC;AACpD,UAAM,gBAAgB;AACtB,WAAO;AAAA,EACT,GAAG;AACH,SAAO;AACT;AAKA,eAAsB,WAAW,MAA4D;AAC3F,QAAM,QAAQ,MAAMC,OAAM;AAC1B,QAAM,OAAO,IAAI,MAAM,SAAS,IAAI;AACpC,MAAI;AACF,QAAI,CAAC,KAAK,QAAQ,EAAG,OAAM,IAAI,MAAM,mBAAmB;AACxD,UAAM,OAAiB,EAAE,OAAO,KAAK,SAAS,GAAG,QAAQ,KAAK,UAAU,GAAG,QAAQ,KAAK,UAAU,GAAG,UAAU,CAAC,CAAC,KAAK,YAAY,GAAG,OAAO,CAAC,CAAC,KAAK,QAAQ,EAAE;AAC7J,QAAI,CAAC,KAAK,iBAAiB,EAAG,OAAM,IAAI,MAAM,+BAA+B;AAC7E,UAAM,SAAS;AACf,UAAM,OAAO,IAAI,WAAW,KAAK,8BAA8B,GAAG,GAAG,GAAG,MAAM,CAAC;AAC/E,QAAI,CAAC,KAAK,eAAe,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI,EAAE,EAAG,OAAM,IAAI,MAAM,6BAA6B;AACzG,WAAO,EAAE,GAAG,MAAM,KAAK;AAAA,EACzB,UAAE;AAAU,SAAK,MAAM;AAAG,SAAK,OAAO;AAAA,EAAG;AAC3C;AAGA,eAAsB,UAAU,MAAuD;AACrF,QAAM,EAAE,MAAM,GAAG,KAAK,IAAI,MAAM,WAAW,IAAI;AAC/C,QAAM,MAAM,IAAIF,KAAI,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,CAAC;AAC9D,MAAI,OAAO,OAAO,KAAK,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;AACpE,SAAO,EAAE,GAAG,MAAM,KAAKA,KAAI,KAAK,MAAM,GAAG,EAAE;AAC7C;;;ADhBO,SAAS,WAAWG,OAA8D;AACvF,MAAI,CAAC,KAAK,KAAKA,MAAK,KAAK,CAAC,KAAK,sBAAsB,KAAKA,KAAI,EAAG,CAAAA,QAAO,OAAO,KAAKA,OAAM,QAAQ,EAAE,SAAS,MAAM;AACnH,QAAM,QAAqB,CAAC,GAAG,UAAyB,CAAC;AACzD,MAAIC,OAA6B;AACjC,aAAW,OAAOD,MAAK,MAAM,OAAO,GAAG;AACrC,UAAM,OAAO,IAAI,KAAK;AACtB,QAAI,CAAC,MAAM;AAAE,MAAAC,QAAO;AAAW;AAAA,IAAU;AACzC,UAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,QAAI,QAAQ,GAAG;AACb,UAAI,CAACA,SAAQ,0CAA0C,KAAK,IAAI,GAAG;AAAE,QAAAA,QAAO,EAAE,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAE;AAAG,cAAM,KAAKA,KAAI;AAAG,iBAAS;AAAW;AAAA,MAAU;AAC3K,eAAS,EAAE,MAAM,MAAM,MAAMA,MAAK,MAAM,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,gBAAgB,EAAE;AAChJ,cAAQ,KAAK,MAAM;AACnB;AAAA,IACF;AACA,UAAM,MAAM,KAAK,MAAM,GAAG,KAAK,EAAE,KAAK,GAAG,OAAO,KAAK,MAAM,QAAQ,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AAClG,QAAI,CAAC,QAAQ;AACX,UAAI,CAACA,MAAM;AACX,UAAI,QAAQ,QAAQ;AAAE,QAAAA,MAAK,QAAQ,CAAC,KAAK,CAAC;AAAG,QAAAA,MAAK,SAAS,CAAC,KAAK,CAAC;AAAA,MAAG,WAC5D,QAAQ,QAAS,CAAAA,MAAK,QAAQ,CAAC,KAAK,CAAC;AAC9C;AAAA,IACF;AACA,YAAQ,KAAK;AAAA,MACX,KAAK;AAAU,eAAO,IAAI,CAAC,KAAK,CAAC;AAAG,eAAO,IAAI,CAAC,KAAK,CAAC;AAAG,eAAO,QAAQ,CAAC,KAAK,CAAC;AAAG,eAAO,SAAS,CAAC,KAAK,CAAC;AAAG;AAAA,MAC5G,KAAK;AAAM,eAAO,IAAI,CAAC,KAAK,CAAC;AAAG,eAAO,IAAI,CAAC,KAAK,CAAC;AAAG;AAAA,MACrD,KAAK;AAAQ,eAAO,QAAQ,CAAC,KAAK,CAAC;AAAG,eAAO,SAAS,CAAC,KAAK,CAAC;AAAG;AAAA,MAChE,KAAK;AAAW,eAAO,UAAU,CAAC,KAAK,CAAC;AAAG,eAAO,UAAU,CAAC,KAAK,CAAC;AAAG,eAAO,gBAAgB,CAAC,KAAK,CAAC;AAAG,eAAO,iBAAiB,CAAC,KAAK,CAAC;AAAG;AAAA,MACzI,KAAK;AAAU,eAAO,UAAU,CAAC,KAAK,CAAC;AAAG,eAAO,UAAU,CAAC,KAAK,CAAC;AAAG;AAAA,MACrE,KAAK;AAAQ,eAAO,gBAAgB,CAAC,KAAK,CAAC;AAAG,eAAO,iBAAiB,CAAC,KAAK,CAAC;AAAG;AAAA,MAChF,KAAK;AAAU,eAAO,SAAS,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,MAAM,OAAO,KAAK;AAAG;AAAA,IAClF;AAAA,EACF;AACA,aAAW,KAAK,QAAS,KAAI,CAAC,EAAE,iBAAiB,CAAC,EAAE,gBAAgB;AAAE,MAAE,gBAAgB,EAAE;AAAO,MAAE,iBAAiB,EAAE;AAAA,EAAQ;AAC9H,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAIA,IAAM,MAAN,MAAU;AAAA,EAGR,YAAoB,SAAS,IAAI;AAAb;AAAA,EAAc;AAAA,EAF1B,OAAO,oBAAI,IAAY;AAAA,EACvB,MAAM,oBAAI,IAAoB;AAAA,EAEtC,IAAI,MAAsB;AACxB,UAAM,QAAQ,KAAK,IAAI,IAAI,IAAI;AAC/B,QAAI,MAAO,QAAO;AAClB,QAAI,OAAO,KAAK,YAAY,EAAE,QAAQ,gBAAgB,GAAG,EAAE,QAAQ,YAAY,EAAE;AACjF,QAAI,CAAC,SAAS,KAAK,IAAI,EAAG,QAAO,KAAK,UAAU,QAAQ;AACxD,QAAI,KAAK,MAAM,IAAI;AACnB,WAAO,KAAK,KAAK,IAAI,EAAE,EAAG,MAAK,GAAG,IAAI,IAAI,GAAG;AAC7C,SAAK,KAAK,IAAI,EAAE;AAAG,SAAK,IAAI,IAAI,MAAM,EAAE;AACxC,WAAO;AAAA,EACT;AAAA,EACA,IAAI,MAAc;AAAE,WAAO,KAAK,IAAI,IAAI,IAAI;AAAA,EAAG;AACjD;AA2BO,IAAM,aAAa,CAAC,GAAW,GAAW,SAAiB,YAAsC,CAAC,IAAI,SAAS,UAAU,CAAC;AAGjI,IAAM,KAAK,CAAC,MAAc,KAAK,MAAM,IAAI,GAAG,IAAI,MAAM;AACtD,IAAM,OAAO,CAAC,MAA0B,KAAK,KAAK,YAAY,YAAY,EAAE,OAAO,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC;AAE/F,SAAS,YAAY,MAAS,WAAmB,OAAsB,CAAC,GAAiB;AAC9F,QAAM,WAAqB,CAAC;AAC5B,QAAM,QAAQ,WAAW,SAAS;AAClC,QAAM,UAAU,OAAO,KAAK,UAAU,SAAS,KAAK;AACpD,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,SAAS,EAAE,GAAG,KAAK,UAAU,KAAK,GAAG,GAAG,KAAK,UAAU,KAAK,GAAG,GAAG,KAAK,UAAU,SAAS,GAAG,GAAG,KAAK,UAAU,UAAU,EAAE;AACjI,QAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,UAAU,CAAC,OAAO,IAAI,QAAQ,UAAU,OAAO,IAAI,OAAO,IAAI;AAClE,QAAM,QAAQ,CAAC,GAAW,MAAc,WAAW,GAAG,GAAG,SAAS,OAAO;AAEzE,QAAM,UAAU,IAAI,IAAI,IAAI,GAAG,UAAU,IAAI,IAAI,IAAI,GAAG,WAAW,IAAI,IAAI,IAAI,GAAG,SAAS,IAAI,IAAI,MAAM,GAAG,QAAQ,IAAI,IAAI,KAAK,GAAG,QAAQ,IAAI,IAAI,KAAK,GAAG,QAAQ,IAAI,IAAI,KAAK,GAAG,UAAU,IAAI,IAAI,OAAO;AAC7M,QAAM,OAAO;AACb,QAAM,kBAAkB,oBAAI,IAAoB;AAChD,QAAM,eAAe,CAAC,MAAc,SAAiB;AACnD,UAAM,MAAM,GAAG,IAAI,IAAI,IAAI;AAC3B,QAAI,KAAK,gBAAgB,IAAI,GAAG;AAChC,QAAI,CAAC,IAAI;AAAE,WAAK,OAAO,IAAI,OAAO,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI;AAAG,sBAAgB,IAAI,KAAK,EAAE;AAAA,IAAG;AACvG,WAAO;AAAA,EACT;AAGA,QAAM,aAAkB,KAAK,SAAS,CAAC;AACvC,QAAM,kBAAkB,IAAI,IAAI,WAAW,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACrE,QAAM,QAAa,CAAC,EAAE,IAAI,MAAM,WAAW,EAAE,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC;AAC7F,aAAW,KAAK,YAAY;AAC1B,UAAM,KAAK;AAAA,MACT,IAAI,QAAQ,IAAI,EAAE,IAAI;AAAA,MACtB,QAAQ,EAAE,SAAS,QAAQ,IAAI,EAAE,MAAM,IAAI;AAAA,MAC3C,QAAQ,EAAE,UAAU;AAAA,MACpB,WAAW,EAAE,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,UAAU,GAAG,EAAE,EAAE,YAAY,EAAE,GAAG,QAAQ,EAAE,UAAU,GAAG,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,QAAQ,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE;AAAA,MAC7L,SAAS,EAAE,aAAa,EAAE,WAAW;AAAA,MACrC,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,IACtC,CAAC;AAAA,EACH;AAEA,QAAM,QAA4C,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAMC,YAAW,OAAO,EAAE,MAAM,aAAaA,aAAiB,EAAE;AAclM,QAAM,cAAc,CAAC,KAAQ,UAAkB;AAC7C,UAAM,IAAI,QAAQ,IAAI,SAAS,KAAK,KAAK;AACzC,WAAO,IAAI,OAAO,KAAK,IAAI,IAAI,IAAI,UAAU,KAAK,EAAE,MAAM,CAAC,IAAI;AAAA,EACjE;AACA,QAAM,YAAY,oBAAI,IAAe;AAErC,QAAM,cAAc,oBAAI,IAAoB;AAC5C,aAAWC,SAAQ,OAAO;AACxB,UAAM,SAASA,MAAK,SAAS,YAAY,KAAK,GAAGA,MAAK,IAAI;AAC1D,eAAW,CAAC,UAAU,IAAI,KAAK,OAAO,QAAQA,MAAK,eAAe,CAAC,CAAC;AAClE,iBAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,IAAS,GAAG;AACjD,cAAM,MAAM,GAAG,QAAQ,IAAI,IAAI;AAE/B,cAAM,MAAO,EAAQ;AACrB,YAAI,CAAC,YAAY,IAAI,GAAG,EAAG,aAAY,IAAI,KAAK,SAAS,QAAQ,MAAM,YAAY,KAAK,IAAI,cAAc,CAAC,IAAI,GAAG;AAAA,MACpH;AAAA,EACJ;AACA,QAAM,gBAAgB,CAAC,MAAc,SAAiB,aAAa,MAAM,YAAY,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,KAAK,IAAI;AAGnH,QAAM,aAAkB,KAAK,SAAS,CAAC;AACvC,QAAM,kBAAkB,IAAI,IAAI,WAAW,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACrE,QAAM,UAAU,CAAC,MAAgB,MAAM,aAAa,QAAQ,MAAM,aAAa,aAAa,MAAM,WAAW,WAAW;AACxH,QAAM,QAAa,WAAW,IAAI,CAAC,GAAG,OAAO;AAAA,IAC3C,IAAI,QAAQ,IAAI,EAAE,IAAI;AAAA,IAAG,MAAM,QAAQ,IAAI,EAAE,IAAI;AAAA,IAAG,GAAG;AAAA,IACvD,GAAI,EAAE,aAAa,EAAE,YAAY,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC;AAAA,IAC1E,OAAO,QAAQ,EAAE,KAAK;AAAA,IAAG,OAAO,KAAK,EAAE,KAAK;AAAA,IAAG,OAAO;AAAA,EACxD,EAAE;AAGF,QAAM,YAAY,CAACF,UAAkB,OAAO,KAAK,cAAc,aAAa,KAAK,UAAUA,KAAI,IAAI,KAAK,aAAaA;AACrH,QAAM,SAAS,oBAAI,IAAe;AAClC,QAAM,eAAe,IAAI,IAAI,MAAM,QAAQ,IAAI,OAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAChE,QAAM,WAAW,CAAC,eAA2C;AAC3D,UAAM,IAAI,aAAa,IAAI,UAAU;AACrC,QAAI,CAAC,GAAG;AAAE,eAAS,KAAK,iBAAiB,UAAU,aAAa;AAAG,aAAO;AAAA,IAAW;AACrF,UAAM,KAAK,SAAS,IAAI,UAAU;AAClC,QAAI,CAAC,OAAO,IAAI,EAAE,GAAG;AACnB,YAAM,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,EAAE,mBAAmB,EAAE;AAChG,aAAO,IAAI,IAAI;AAAA,QAAE;AAAA,QAAI,KAAK,UAAU,EAAE,IAAI;AAAA,QAAG,OAAO,EAAE;AAAA,QAAe,QAAQ,EAAE;AAAA,QAC7E,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM;AAAA,QAAG,QAAQ,EAAE;AAAA,QAAQ,GAAI,UAAU,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAAG,CAAC;AAAA,IAClH;AACA,WAAO;AAAA,EACT;AAGA,QAAM,cAAmB,CAAC;AAC1B,QAAM,eAAe,CAAC,GAAMG,iBAAkE;AAC5F,UAAM,IAAc,EAAE,YAAY,CAAC;AACnC,QAAI,EAAE,WAAWA,eAAc,GAAG;AAChC,YAAM,MAAgB,CAAC;AACvB,eAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,EAAG,KAAI,KAAK,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACtE,aAAO,EAAE,UAAU,IAAI;AAAA,IACzB;AACA,UAAM,UAAiB,CAAC;AACxB,aAAS,IAAI,GAAG,IAAI,EAAE,UAAS;AAC7B,YAAM,IAAI,EAAE,GAAG,GAAG,OAAY,CAAC;AAC/B,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAAE,cAAM,KAAK,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG;AAAG,aAAK,KAAK,EAAE,MAAM,QAAQ,IAAI,WAAW,EAAE,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AAAA,MAAG;AAEpK,YAAM,MAAM,KAAK,OAAO,CAAC,GAAG,QAAQ,IAAI,IAAI,GAAG,CAAC,KAAK;AACrD,iBAAW,OAAO,KAAM,KAAI,IAAI,IAAI,IAAI;AACxC,cAAQ,KAAK,IAAI;AAAA,IACnB;AACA,WAAO,EAAE,QAAQ;AAAA,EACnB;AACA,aAAWD,SAAQ,OAAO;AACxB,UAAM,SAASA,MAAK,SAAS,YAAY,KAAK,GAAGA,MAAK,IAAI;AAC1D,eAAW,CAAC,UAAU,IAAI,KAAK,OAAO,QAAQA,MAAK,eAAe,CAAC,CAAC,GAAG;AACrE,UAAI,CAAC,gBAAgB,IAAI,QAAQ,GAAG;AAAE,iBAAS,KAAK,SAASA,MAAK,IAAI,oBAAoB,QAAQ,GAAG;AAAG;AAAA,MAAU;AAClH,YAAM,OAAO,QAAQ,IAAI,QAAQ;AACjC,iBAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,IAAS,GAAG;AACjD,YAAI,EAAE,UAAU;AACd,oBAAU,IAAI,GAAG,QAAQ,IAAI,MAAM,GAAG,IAAI,IAAI,EAAE,QAAQ;AACxD,gBAAM,OAAO,EAAE,QAAQ;AACvB,mBAAS,IAAI,GAAG,KAAK,EAAE,SAAS,SAAS,IAAI,KAAK;AAChD,kBAAM,SAAS,YAAY,EAAE,UAAU,CAAC,GAAG,QAAQ,SAAS,OAAO,MAAM;AACzE,gBAAI,CAAC,MAAO;AACZ,wBAAY,KAAK;AAAA,cAAE,IAAI,aAAa,UAAU,SAAS,OAAO,MAAM;AAAA,cAAG;AAAA,cAAM,MAAM;AAAA,cAAU;AAAA,cAC3F,GAAG,GAAG,EAAE,KAAK,CAAC;AAAA,cAAG,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE;AAAA,cAAG,UAAU,GAAG,EAAE,EAAE,YAAY,EAAE;AAAA,cAAG,QAAQ,EAAE,UAAU;AAAA,cAAG,QAAQ,EAAE,UAAU;AAAA,cAClH,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,cAAI,GAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,YAAG,CAAC;AAAA,UACvF;AACA,eAAK,EAAE,QAAQ,cAAc,SAAU,UAAS,KAAK,aAAa,QAAQ,IAAI,IAAI,aAAa,EAAE,IAAI,sBAAsB;AAC3H;AAAA,QACF;AACA,cAAM,OAAO,EAAE,QAAQ,UAAU,KAAK,aAAa,UAAU,SAAS,IAAI;AAC1E,YAAI,SAAS,UAAU;AACrB,gBAAM,QAAQ,SAAS,EAAE,QAAQ,IAAI;AACrC,cAAI,CAAC,MAAO;AACZ,sBAAY,KAAK;AAAA,YAAE;AAAA,YAAI;AAAA,YAAM,MAAM;AAAA,YAAU;AAAA,YAAO,GAAG,GAAG,EAAE,KAAK,CAAC;AAAA,YAAG,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE;AAAA,YAAG,UAAU,GAAG,EAAE,EAAE,YAAY,EAAE;AAAA,YAAG,QAAQ,EAAE,UAAU;AAAA,YAAG,QAAQ,EAAE,UAAU;AAAA,YACpK,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,YAAI,GAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,UAAG,CAAC;AAAA,QACvF,WAAW,SAAS,UAAU,SAAS,cAAc;AACnD,cAAI,SAAS,cAAc;AAAE,qBAAS,KAAK,gBAAgB,QAAQ,IAAI,IAAI,WAAW;AAAG;AAAA,UAAU;AACnG,gBAAM,QAAQ,SAAS,EAAE,QAAQ,IAAI;AACrC,cAAI,CAAC,MAAO;AACZ,gBAAM,KAAK,EAAE,KAAK,UAAU,KAAK;AACjC,sBAAY,KAAK,EAAE,IAAI,MAAM,MAAM,QAAQ,OAAO,KAAK,EAAE,KAAK,WAAW,EAAE,WAAW,GAAG,aAAa,GAAG,CAAC,GAAG,MAAM,EAAE,QAAQ,GAAG,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,GAAI,GAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC,EAAG,CAAC;AAAA,QACrN,WAAW,SAAS,QAAQ;AAC1B,sBAAY,KAAK,EAAE,IAAI,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,EAAE,eAAe,CAAC,GAAG,SAAS,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,QAAQ,eAAe,EAAE,iBAAiB,KAAK,CAAC;AAAA,QAC3K,MAAO,UAAS,KAAK,eAAe,QAAQ,IAAI,IAAI,aAAa,IAAI,UAAU;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,OAAU;AAAA,IACxC,IAAI,MAAM,IAAI,EAAE,IAAI;AAAA,IAAG,OAAO,EAAE,SAAS;AAAA,IAAG,OAAO,EAAE,MAAM,IAAI,CAAC,MAAc,QAAQ,IAAI,CAAC,CAAC;AAAA,IAAG,QAAQ,QAAQ,IAAI,EAAE,MAAM;AAAA,IAC3H,KAAK,EAAE,OAAO;AAAA,IAAG,UAAU,EAAE,YAAY;AAAA,IAAG,cAAc,EAAE,EAAE,gBAAgB;AAAA;AAAA,IAC9E,UAAU,CAAC,CAAC,EAAE;AAAA,IAAU,SAAS,CAAC,CAAC,EAAE;AAAA,IAAS,SAAS,CAAC,CAAC,EAAE;AAAA,EAC7D,EAAE;AACF,QAAM,aAAa,KAAK,aAAa,CAAC,GAAG,IAAI,CAAC,OAAU;AAAA,IACtD,IAAI,MAAM,IAAI,EAAE,IAAI;AAAA,IAAG,OAAO,EAAE,SAAS;AAAA,IAAG,OAAO,EAAE,MAAM,IAAI,CAAC,MAAc,QAAQ,IAAI,CAAC,CAAC;AAAA,IAAG,QAAQ,QAAQ,IAAI,EAAE,MAAM;AAAA,IAC3H,OAAO,CAAC,CAAC,EAAE;AAAA,IAAO,UAAU,CAAC,CAAC,EAAE;AAAA,IAChC,UAAU,GAAG,EAAE,EAAE,YAAY,EAAE;AAAA,IAAG,GAAG,GAAG,EAAE,KAAK,CAAC;AAAA,IAAG,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE;AAAA,IAAG,QAAQ,EAAE,UAAU;AAAA,IAAG,QAAQ,EAAE,UAAU;AAAA,IAAG,QAAQ,GAAG,EAAE,EAAE,UAAU,EAAE;AAAA,IAChJ,WAAW,EAAE,aAAa,EAAE,aAAa;AAAA,IAAG,MAAM,EAAE,QAAQ,EAAE,gBAAgB;AAAA,IAAG,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB;AAAA,IAC7H,WAAW,EAAE,aAAa,EAAE,YAAY;AAAA,IAAG,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY;AAAA,IAAG,WAAW,EAAE,aAAa,EAAE,YAAY;AAAA,EAC/I,EAAE;AACF,QAAM,QAAQ,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAU;AAAA,IAC5C,IAAI,MAAM,IAAI,EAAE,IAAI;AAAA,IAAG,OAAO,EAAE,SAAS;AAAA,IAAG,OAAO,EAAE,MAAM,IAAI,CAAC,MAAc,QAAQ,IAAI,CAAC,CAAC;AAAA,IAAG,QAAQ,QAAQ,IAAI,EAAE,MAAM;AAAA,IAC3H,cAAc,EAAE,gBAAgB;AAAA,IAAW,aAAa,EAAE,eAAe;AAAA,IAAU,YAAY,EAAE,cAAc;AAAA,IAC/G,UAAU,GAAG,EAAE,EAAE,YAAY,EAAE;AAAA,IAAG,UAAU,EAAE,YAAY;AAAA,IAAG,SAAS,EAAE,WAAW;AAAA,IACnF,WAAW,EAAE,aAAa,EAAE,aAAa;AAAA,IAAG,MAAM,EAAE,QAAQ,EAAE,gBAAgB;AAAA,IAAG,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB;AAAA,EAC/H,EAAE;AAKF,QAAM,SAAS,CAAC,OAAgB,WAAmB,IAAY,IAAY,IAAY,OAAwB;AAC7G,QAAI,UAAU,UAAW,QAAO;AAChC,QAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,QAAI,QAAQ,GAAG;AAAE,YAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI;AAAmB,aAAO,EAAE,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE;AAAA,IAAG;AAClG,UAAM,IAAK,MAAmB,MAAM,YAAY,GAAG,YAAY,IAAI,CAAC;AACpE,QAAI,EAAE,SAAS,EAAG,QAAO;AACzB,UAAM,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK;AACnC,UAAM,KAAK,CAAC,OAAe,IAAI,MAAM;AACrC,QAAI,KAAK,IAAI,EAAE,IAAI,KAAM,QAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE;AACnF,WAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,MAAM,EAAE,EAAE;AAAA,EAC5E;AACA,QAAM,QAAQ,CAAC,QAAgB,IAAY,MAAc,UAAiB,EAAE,QAAQ,IAAI,MAAM,KAAK;AAEnG,QAAM,UAAU,CAAC,QAAa,OAAe,KAAa,KAA4B,SAAwB;AAC5G,UAAM,OAAc,CAAC;AACrB,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,IAAI,OAAO,CAAC,GAAG,OAAO,OAAO,IAAI,CAAC,GAAG,IAAI,EAAE,QAAQ;AACzD,YAAME,QAAO,OAAO,OAAO,EAAE,OAAO,MAAM,GAAG,KAAK,QAAQ,GAAG,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,IAAI;AACpG,WAAK,KAAK,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,EAAE,KAAK,KAAK,GAAG,CAAC,GAAG,MAAAA,MAAK,CAAC;AAAA,IAC3D;AACA,WAAO;AAAA,EACT;AACA,QAAM,aAAkB,CAAC;AACzB,aAAW,CAAC,UAAU,CAAC,KAAK,OAAO,QAAS,KAAK,cAAc,CAAC,CAAO,GAAG;AACxE,UAAM,SAAc,CAAC,GAAG,SAAc,CAAC;AACvC,QAAI,WAAW;AACf,UAAM,OAAO,CAAC,WAAgB;AAAE,iBAAW,KAAK,OAAQ,YAAW,KAAK,IAAI,UAAU,EAAE,QAAQ,CAAC;AAAA,IAAG;AAEpG,eAAW,CAAC,UAAU,EAAE,KAAK,OAAO,QAAS,EAAE,SAAS,CAAC,CAAO,GAAG;AACjE,YAAM,KAAK,WAAW,gBAAgB,IAAI,QAAQ,CAAE;AAAG,UAAI,CAAC,IAAI;AAAE,iBAAS,KAAK,GAAG,QAAQ,kBAAkB,QAAQ,EAAE;AAAG;AAAA,MAAU;AACpI,YAAM,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,EAAE,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,EAAE;AACnM,iBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,EAAO,GAAsB;AACvE,aAAK,MAAM;AACX,YAAI,SAAS,SAAU,QAAO,KAAK,MAAM,QAAQ,IAAI,YAAY,QAAQ,QAAQ,QAAQ,IAAI,UAAU,SAAS,GAAG,OAAK,EAAE,MAAM,WAAW,IAAI,CAAC,CAAC,CAAC;AAAA,iBACzI,SAAS,aAAa;AAAE,iBAAO,KAAK,MAAM,QAAQ,IAAI,KAAK,QAAQ,QAAQ,KAAK,GAAG,OAAK,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;AAAG,iBAAO,KAAK,MAAM,QAAQ,IAAI,KAAK,QAAQ,QAAQ,KAAK,GAAG,OAAK,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;AAAA,QAAG,WACjM,SAAS,aAAc,QAAO,KAAK,MAAM,QAAQ,IAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG,OAAK,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;AAAA,iBAC3G,SAAS,aAAc,QAAO,KAAK,MAAM,QAAQ,IAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG,OAAK,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;AAAA,iBAC9G,SAAS,SAAS;AAAE,iBAAO,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,QAAQ,KAAK,GAAG,OAAK,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC;AAAG,iBAAO,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,QAAQ,KAAK,GAAG,OAAK,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC;AAAA,QAAG,WAC9M,SAAS,SAAU,QAAO,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,QAAQ,SAAS,GAAG,OAAK,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC;AAAA,iBACjH,SAAS,SAAU,QAAO,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,QAAQ,SAAS,GAAG,OAAK,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC;AAAA,iBACjH,SAAS,SAAS;AAAE,iBAAO,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,QAAQ,KAAK,GAAG,OAAK,EAAE,MAAM,SAAS,IAAI,CAAC,CAAC,CAAC;AAAG,iBAAO,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,QAAQ,KAAK,GAAG,OAAK,EAAE,MAAM,SAAS,IAAI,CAAC,CAAC,CAAC;AAAA,QAAG,WACpN,SAAS,SAAU,QAAO,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,QAAQ,SAAS,GAAG,OAAK,EAAE,MAAM,SAAS,IAAI,CAAC,CAAC,CAAC;AAAA,iBACpH,SAAS,SAAU,QAAO,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,QAAQ,SAAS,GAAG,OAAK,EAAE,MAAM,SAAS,IAAI,CAAC,CAAC,CAAC;AAAA,YACxH,UAAS,KAAK,GAAG,QAAQ,IAAI,QAAQ,KAAK,IAAI,mBAAmB;AAAA,MACxE;AAAA,IACF;AAEA,UAAM,mBAAmB,oBAAI,IAAiB;AAC9C,eAAW,CAAC,UAAU,EAAE,KAAK,OAAO,QAAS,EAAE,SAAS,CAAC,CAAO,GAAG;AACjE,UAAI,CAAC,gBAAgB,IAAI,QAAQ,GAAG;AAAE,iBAAS,KAAK,GAAG,QAAQ,kBAAkB,QAAQ,EAAE;AAAG;AAAA,MAAU;AACxG,YAAM,KAAK,QAAQ,IAAI,QAAQ;AAC/B,iBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,EAAO,GAAsB;AACvE,aAAK,MAAM;AACX,YAAI,SAAS,cAAc;AACzB,2BAAiB,IAAI,UAAU,MAAM;AACrC,iBAAO,KAAK,MAAM,QAAQ,IAAI,cAAc,OAAO,IAAI,QAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,EAAE,OAAO,cAAc,UAAU,EAAE,IAAI,IAAI,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC;AAAA,QAC1J,WACS,SAAS,UAAU,SAAS,SAAS;AAC5C,gBAAM,SAAS,CAAC,MAAS;AAAE,kBAAM,IAAI,KAAK,EAAE,KAAK;AAAG,mBAAO,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,OAAK,SAAS,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG;AAAA,UAAG;AAC7H,iBAAO,KAAK,MAAM,QAAQ,IAAI,SAAS,OAAO,IAAI,CAAC,GAAG,MAAM;AAC1D,kBAAM,OAAO,OAAO,CAAC,GAAG,OAAO,OAAO,IAAI,CAAC;AAC3C,mBAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,KAAK,IAAI,EAAE,GAAG,MAAM,OAAO,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,KAAK,QAAQ,GAAG,KAAK,CAAC,GAAG,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,SAAS;AAAA,UAClJ,CAAC,CAAC,CAAC;AAAA,QACL,WAAW,SAAS,OAAO;AACzB,iBAAO,KAAK,MAAM,QAAQ,IAAI,SAAS,OAAO,IAAI,OAAK;AAAE,kBAAM,IAAI,MAAM,EAAE,SAAS,YAAY,IAAI;AAAG,mBAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,OAAK,GAAG,SAAS,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,MAAM,SAAS;AAAA,UAAG,CAAC,CAAC,CAAC;AAAA,QACpO,WAAW,SAAS,QAAS,QAAO,KAAK,MAAM,QAAQ,IAAI,SAAS,QAAQ,QAAQ,SAAS,GAAG,OAAK,GAAG,CAAC,CAAC,CAAC;AAAA,YACtG,UAAS,KAAK,GAAG,QAAQ,IAAI,QAAQ,KAAK,IAAI,mBAAmB;AAAA,MACxE;AAAA,IACF;AAKA,UAAM,gBAAyD,CAAC;AAChE,eAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAS,EAAE,UAAU,CAAC,CAAO;AACrE,iBAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,QAAa;AAC3D,mBAAW,CAAC,SAAS,MAAM,KAAK,OAAO,QAAQ,MAAW;AACxD,wBAAc,KAAK,CAAC,UAAU,UAAU,SAAS,UAAU,MAAM,CAAC;AACxE,eAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAS,EAAE,eAAe,CAAC,CAAO;AAC1E,iBAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,QAAa;AAC3D,mBAAW,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,MAAW;AACvD,qBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,KAAU;AACpD,0BAAc,KAAK,CAAC,UAAU,UAAU,SAAS,MAAM,MAAM,CAAC;AAEtE,UAAM,mBAA+F,CAAC;AACtG,eAAW,CAAC,UAAU,UAAU,SAAS,MAAM,MAAM,KAAK,eAAe;AACvE,YAAM,SAAS,aAAa,YAAY,KAAK,GAAG,QAAQ;AACxD,WAAK,MAAM;AACX,UAAI,SAAS,YAAY;AACvB,cAAM,MAAM,UAAU,IAAI,GAAG,QAAQ,IAAI,MAAM,GAAG,OAAO,EAAE;AAC3D,YAAI,CAAC,KAAK;AAAE,mBAAS,KAAK,GAAG,QAAQ,0BAA0B,QAAQ,IAAI,OAAO,sCAAsC;AAAG;AAAA,QAAU;AAGrI,yBAAiB,KAAK,EAAE,UAAU,SAAS,KAAK,QAAQ,MAAM,SAAS,QAAQ,CAAC;AAChF;AAAA,MACF;AACA,UAAI,SAAS,UAAU;AAAE,iBAAS,KAAK,GAAG,QAAQ,KAAK,IAAI,gBAAgB,QAAQ,IAAI,OAAO,UAAU;AAAG;AAAA,MAAU;AACrH,YAAM,KAAK,aAAa,UAAU,SAAS,OAAO;AAClD,YAAM,MAAM,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE;AAC7C,UAAI,CAAC,KAAK;AAAE,iBAAS,KAAK,GAAG,QAAQ,kCAAkC,QAAQ,IAAI,OAAO,EAAE;AAAG;AAAA,MAAU;AACzG,YAAM,SAAS,IAAI,UAAU,IAAI,IAAI,QAAQ,OAAO,CAAC,GAAW,MAAW,IAAI,EAAE,QAAQ,CAAC,IAAK,IAAI,UAAU,UAAU;AACvH,aAAO,KAAK,MAAM,UAAU,IAAI,YAAY,OAAO,IAAI,CAAC,GAAG,MAAM;AAC/D,cAAM,OAAO,IAAI,MAAM,MAAM,EAAE,KAAK,CAAC;AACrC,cAAM,MAAM,EAAE,UAAU,GAAG,KAAe,EAAE,YAAY,CAAC;AACzD,iBAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,IAAK,MAAK,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACvF,cAAM,OAAO,OAAO,IAAI,CAAC;AACzB,eAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,KAAK,IAAI,EAAE,GAAG,MAAM,OAAO,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,KAAK,QAAQ,GAAG,GAAG,CAAC,IAAI,SAAS;AAAA,MAC9H,CAAC,CAAC,CAAC;AAAA,IACL;AAEA,UAAM,kBAAmC,EAAE,aAAa,EAAE;AAC1D,QAAI,MAAM,QAAQ,eAAe,GAAG;AAClC,WAAK,eAAe;AACpB,YAAM,IAAI,WAAW;AACrB,aAAO,KAAK,MAAM,aAAa,SAAS,SAAS,gBAAgB,IAAI,OAAK;AACxE,cAAM,UAAe,EAAE,WAAW,CAAC;AACnC,cAAM,QAAQ,IAAI,MAAc,CAAC,EAAE,KAAK,EAAE,GAAG,YAAsB,CAAC;AACpE,YAAI,gBAAgB;AACpB,mBAAW,KAAK,SAAS;AACvB,gBAAM,YAAY,gBAAgB,IAAI,EAAE,IAAI;AAC5C,iBAAO,kBAAkB,UAAW,WAAU,KAAK,eAAe;AAClE,gBAAM,gBAAgB,EAAE,MAAM,IAAI;AAAA,QACpC;AACA,eAAO,gBAAgB,EAAG,WAAU,KAAK,eAAe;AACxD,YAAI,IAAI,UAAU;AAClB,iBAAS,IAAI,IAAI,GAAG,KAAK,GAAG,IAAK,KAAI,MAAM,CAAC,MAAM,GAAI,OAAM,CAAC,IAAI,UAAU,EAAE,CAAC;AAC9E,eAAO,EAAE,GAAG,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,MAAM,IAAI,OAAK,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,OAAO;AAAA,MAC5E,CAAC,CAAC,CAAC;AAAA,IACL;AAEA,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAS,EAAE,MAAM,CAAC,CAAO,GAAsB;AACjF,WAAK,MAAM;AAAG,YAAM,KAAK,MAAM,IAAI,IAAI;AACvC,aAAO,KAAK,MAAM,MAAM,IAAI,OAAO,QAAQ,QAAQ,OAAO,GAAG,OAAK,GAAG,CAAC,CAAC,CAAC;AACxE,aAAO,KAAK,MAAM,MAAM,IAAI,YAAY,QAAQ,QAAQ,YAAY,GAAG,OAAK,GAAG,CAAC,CAAC,CAAC;AAClF,aAAO,KAAK,MAAM,MAAM,IAAI,gBAAgB,OAAO,IAAI,QAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAI,EAAE,gBAAgB,OAAQ,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC;AACzI,aAAO,KAAK,MAAM,MAAM,IAAI,YAAY,OAAO,IAAI,QAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,EAAE,WAAW,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC;AACvH,aAAO,KAAK,MAAM,MAAM,IAAI,WAAW,OAAO,IAAI,QAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,EAAE,UAAU,IAAI,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC;AAAA,IACvH;AACA,UAAM,WAAW,CAAC,QAAgB,IAAY,QAAa,MAAc,KAAa,SACpF,MAAM,QAAQ,IAAI,MAAM,OAAO,IAAI,CAAC,GAAG,OAAO;AAAA,MAAE,GAAG,GAAG,EAAE,QAAQ,CAAC;AAAA,MAAG,GAAG,GAAG,EAAE,IAAI,KAAK,EAAE,GAAG,KAAK,CAAC;AAAA,MAC9F,MAAM,OAAO,IAAI,CAAC,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC,EAAE,QAAQ,GAAG,EAAE,IAAI,KAAK,EAAE,GAAG,KAAK,GAAG,OAAO,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI;AAAA,IAAS,EAAE,CAAC;AAC5K,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAS,EAAE,aAAa,CAAC,CAAO,GAAsB;AACxF,WAAK,MAAM;AAAG,YAAM,KAAK,MAAM,IAAI,IAAI;AACvC,YAAM,QAAoC,CAAC,CAAC,aAAa,aAAa,CAAC,GAAG,CAAC,QAAQ,gBAAgB,CAAC,GAAG,CAAC,QAAQ,gBAAgB,CAAC,GAAG,CAAC,aAAa,YAAY,CAAC,GAAG,CAAC,aAAa,YAAY,CAAC,GAAG,CAAC,aAAa,YAAY,CAAC,CAAC;AAC5N,iBAAW,CAAC,MAAM,KAAK,IAAI,KAAK,MAAO,QAAO,KAAK,SAAS,aAAa,IAAI,QAAQ,MAAM,KAAK,IAAI,CAAC;AAAA,IACvG;AACA,eAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAS,EAAE,QAAQ,CAAC,CAAO,GAAG;AAC5D,YAAM,KAAK,MAAM,IAAI,IAAI;AACzB,iBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,EAAO,GAAsB;AACvE,aAAK,MAAM;AACX,YAAI,SAAS,cAAc,SAAS,UAAW,QAAO,KAAK,MAAM,QAAQ,IAAI,MAAM,QAAQ,QAAQ,SAAS,GAAG,OAAK,GAAG,CAAC,CAAC,CAAC;AAAA,iBACjH,SAAS,MAAO,YAAW,CAAC,MAAM,KAAK,IAAI,KAAK,CAAC,CAAC,aAAa,aAAa,CAAC,GAAG,CAAC,QAAQ,gBAAgB,CAAC,GAAG,CAAC,QAAQ,gBAAgB,CAAC,CAAC;AAC/I,iBAAO,KAAK,SAAS,QAAQ,IAAI,QAAQ,MAAM,KAAK,IAAI,CAAC;AAAA,MAC7D;AAAA,IACF;AACA,eAAW,KAAM,EAAE,UAAU,CAAC,GAAW;AACvC,aAAO,KAAK,EAAE,GAAG,GAAG,EAAE,QAAQ,CAAC,GAAG,MAAM,EAAE,MAAM,SAAS,EAAE,GAAI,EAAE,QAAQ,SAAY,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,GAAI,GAAI,EAAE,UAAU,SAAY,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,GAAI,GAAI,EAAE,WAAW,SAAY,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC,EAAG,EAAE,CAAC;AAC5N,iBAAW,KAAK,IAAI,UAAU,EAAE,QAAQ,CAAC;AAAA,IAC3C;AASA,UAAM,WAAW,CAAC,MAAc,KAAa,UAA0B;AACrE,YAAM,OAAO,MAAM;AAAE,cAAM,KAAK,SAAS,KAAK,GAAG,IAAI,MAAM,IAAI,IAAI,MAAM;AAAG,eAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,MAAG;AAC3G,UAAI,SAAS,OAAQ,QAAO,KAAK,IAAI,QAAQ,GAAG,GAAG;AACnD,UAAI,SAAS,OAAQ,QAAO,MAAM;AAClC,UAAI,SAAS,WAAY,QAAO,KAAK;AACrC,UAAI,SAAS,cAAe,QAAO,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC;AAC9D,UAAI,SAAS,cAAe,QAAO,QAAQ,IAAK,MAAM;AACtD,UAAI,SAAS,kBAAmB,QAAO,QAAQ,IAAI,KAAK;AACxD,aAAO;AAAA,IACT;AACA,eAAW,EAAE,UAAU,SAAS,KAAK,QAAQ,KAAK,KAAK,kBAAkB;AACvE,YAAM,SAAS,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,SAAS;AAC3D,YAAM,QAAoC,CAAC;AAC3C,UAAI,QAAQ;AACZ,YAAM,OAAO,CAAC,GAAW,MAAc;AAAE,YAAI,MAAM,MAAM,SAAS,CAAC,GAAG,MAAM,EAAG,OAAM,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA,MAAG;AACrG,eAAS,IAAI,GAAG,IAAI,OAAO,UAAU,QAAQ,GAAG,KAAK;AACnD,cAAM,IAAI,OAAO,CAAC,GAAG,KAAK,EAAE,QAAQ,GAAG,OAAe,EAAE,QAAQ,QAAQ,QAAQ,EAAE,SAAS;AAC3F,gBAAQ,EAAE,SAAS;AACnB,cAAM,MAAM,IAAI,IAAI,OAAO,SAAU,OAAO,IAAI,CAAC,EAAE,QAAQ,IAAK;AAChE,YAAI,SAAS,UAAU,EAAE,QAAQ,IAAI;AAAE,eAAK,IAAI,SAAS,MAAM,OAAO,KAAK,CAAC;AAAG;AAAA,QAAU;AACzF,cAAMC,SAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,MAAM,EAAE,IAAI,KAAK,GAAG,GAAM;AACvE,iBAAS,OAAO,GAAG,QAAQA,QAAO,QAAQ;AACxC,gBAAM,IAAI,KAAK,OAAO;AACtB,cAAI,OAAO,KAAK,KAAK,IAAK;AAC1B,eAAK,GAAG,SAAS,MAAM,QAAQ,KAAK,OAAO,IAAI,MAAM,QAAQ,IAAO,GAAG,KAAK,CAAC;AAAA,QAC/E;AAAA,MACF;AACA,UAAI,CAAC,MAAM,OAAQ;AACnB,YAAM,UAAU,CAAC,MAAc,aAAa,UAAU,OAAO,YAAY,KAAK,CAAC,CAAC;AAQhF,YAAM,YAAY,iBAAiB,IAAI,QAAQ;AAC/C,YAAM,YAA2B,WAAW,KAAK,OAAK,EAAE,SAAS,QAAQ,GAAG,cAAc;AAC1F,YAAM,KAAK,CAAK,IAAqB,MAAc;AAAE,YAAIC;AAAoB,mBAAW,KAAK,GAAI,KAAI,EAAE,KAAK,IAAI,KAAM,CAAAA,OAAM;AAAQ,eAAOA;AAAA,MAAK;AAChJ,YAAM,UAAU,CAAC,MAA6B;AAC5C,YAAI,OAAO;AACX,mBAAW,KAAK,aAAa,CAAC,EAAG,MAAK,EAAE,QAAQ,MAAM,IAAI,KAAM,QAAO,EAAE,QAAQ;AACjF,eAAO;AAAA,MACT;AACA,YAAMC,SAAQ,CAAC,GAAG,oBAAI,IAAI,CAAC,IAAI,aAAa,CAAC,GAAG,IAAI,OAAK,GAAG,EAAE,QAAQ,CAAC,CAAC,GAAG,GAAG,MAAM,IAAI,OAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC7H,YAAM,OAAc,CAAC;AACrB,iBAAW,KAAKA,QAAO;AACrB,cAAM,OAAO,QAAQ,CAAC;AACtB,cAAM,IAAI,SAAS,OAAO,OACtB,SAAS,UAAU,QAAQ,GAA6B,MAAM,IAAI,QAAM,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,MAAM,IAAI,cAAc,EAAE,IAC5H,cAAc,UAAU,IAAI;AAClC,YAAI,CAAC,KAAK,UAAU,KAAK,KAAK,SAAS,CAAC,EAAE,MAAM,EAAG,MAAK,KAAK,EAAE,GAAG,GAAG,MAAM,OAAO,CAAC;AAAA,MACrF;AACA,YAAM,WAAW,OAAO,UAAU,OAAK,EAAE,WAAW,UAAU,EAAE,OAAO,UAAU,EAAE,SAAS,YAAY;AACxG,UAAI,YAAY,EAAG,QAAO,OAAO,UAAU,CAAC;AAC5C,UAAI,KAAK,OAAQ,QAAO,KAAK,MAAM,QAAQ,QAAQ,cAAc,IAAI,CAAC;AAAA,IACxE;AAGA,UAAM,UAAU,CAAC,OAAU;AACzB,UAAI,GAAG,WAAW,SAAU,QAAQ,GAAG,KAAK,CAAC,EAAE,EAAe,IAAI,MAAM,CAAC;AACzE,YAAM,IAAI,UAAU,EAAE,OAAO,OAAO,IAAI,WAAW,KAAK,GAA6B,GAAG,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;AAClH,aAAO,MAAM,SAAY,OAAO;AAAA,IAClC;AACA,UAAM,OAAO,CAACC,IAAY,MAAwB,MAAM,QAAQA,EAAC,KAAK,MAAM,QAAQ,CAAC,IAAIA,GAAE,WAAW,EAAE,UAAUA,GAAE,MAAM,CAAC,GAAG,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,IAC7I,OAAOA,OAAM,YAAY,OAAO,MAAM,WAAW,KAAK,IAAIA,KAAI,CAAC,IAAI,OAAOA,OAAM;AACpF,UAAM,OAAO,OAAO,OAAO,QAAM;AAAE,YAAM,OAAO,QAAQ,EAAE;AAAG,aAAO,CAAC,GAAG,KAAK,MAAM,CAAC,MAAS,KAAK,EAAE,GAAG,IAAI,CAAC;AAAA,IAAG,CAAC;AAChH,eAAW,MAAM,KAAM,KAAI,GAAG,KAAK,CAAC,EAAE,IAAI,EAAG,IAAG,KAAK,QAAQ,EAAE,GAAG,GAAG,GAAG,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC;AACnG,eAAW,KAAK,EAAE,IAAI,QAAQ,IAAI,QAAQ,GAAG,UAAU,GAAG,KAAK,IAAI,UAAU,IAAI,EAAE,CAAC,GAAG,MAAM,OAAO,QAAQ,MAAM,OAAO,CAAC;AAAA,EAC5H;AAKA,QAAM,OAAO,IAAI,IAAI,YAAY,IAAI,OAAK,EAAE,EAAY,CAAC;AACzD,QAAM,SAAS,IAAI,IAAI,CAAC,GAAG,eAAe,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,QAAM,OAAO,CAAC,OAAe;AAAE,aAAS,KAAK,eAAe,OAAO,IAAI,EAAE,KAAK,EAAE,oDAAoD;AAAA,EAAG;AACvI,aAAW,QAAQ;AACjB,QAAI,KAAK,cAAc,CAAC,KAAK,IAAI,KAAK,UAAoB,GAAG;AAAE,WAAK,KAAK,UAAoB;AAAG,aAAO,KAAK;AAAA,IAAY;AAC1H,aAAW,QAAQ;AACjB,eAAW,MAAM,KAAK;AACpB,UAAI,GAAG,WAAW,UAAU,GAAG,SAAS;AACtC,mBAAW,KAAK,GAAG,KAAa,KAAI,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,CAAW,GAAG;AAAE,eAAK,EAAE,CAAW;AAAG,YAAE,IAAI;AAAA,QAAM;AAAA;AAE9G,MAAI,QAAQ,KAAK,KAAK,OAAO,IAAI,IAAI,MAAM,KAAK,GAAG,SAAS,KAAK,KAAK,OAAO,IAAI,IAAI,MAAM,KAAK;AAChG,QAAM,QAAQ,OAAO;AAAA,IACnB,QAAQ;AAAA,IAAe,SAAS;AAAA,IAChC,MAAM,EAAE,MAAM,KAAK,QAAQ,KAAK,UAAU,QAAQ,SAAS,OAAO,QAAQ,OAAO,KAAK,SAAS,uBAAuB,OAAO,GAAG;AAAA,IAChI,QAAQ,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,IAAG;AAAA,IAAO;AAAA,IAAO;AAAA,IAAa;AAAA,IAAI;AAAA,IAAW;AAAA,IAAM;AAAA,EAChF;AACA,MAAI,KAAK,QAAQ,SAAS;AAExB,UAAM,SAAS,MAAM,MAAM,CAAC;AAC5B,QAAI,OAAO,UAAU,OAAO,UAAU,OAAO,WAAW,OAAO;AAC/D,UAAM,OAAO,CAAC,SAAe;AAC3B,YAAM,OAAO,SAAS,QAAQ,IAAI;AAClC,iBAAW,QAAQ,OAAO,OAAO;AAC/B,cAAM,MAAM,KAAK,WAAW,IAAI,KAAK,EAAE;AACvC,YAAI,CAAC,OAAO,IAAI,SAAS,OAAQ;AACjC,YAAI;AACJ,YAAI,IAAI,SAAS,OAAQ,OAAM,wBAAwB,MAAM,KAAK,IAAI,GAAG;AAAA,aACpE;AACH,gBAAM,IAAI,aAAa,MAAM,KAAK,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,WAAW,QAAQ,GAAG;AAC3E,gBAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC;AAAA,QACnH;AACA,iBAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACtC,cAAI,IAAI,CAAC,IAAI,KAAM,QAAO,IAAI,CAAC;AAAG,cAAI,IAAI,CAAC,IAAI,KAAM,QAAO,IAAI,CAAC;AACjE,cAAI,IAAI,IAAI,CAAC,IAAI,KAAM,QAAO,IAAI,IAAI,CAAC;AAAG,cAAI,IAAI,IAAI,CAAC,IAAI,KAAM,QAAO,IAAI,IAAI,CAAC;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AACA,SAAK,oBAAI,IAAI,CAAC;AACd,eAAW,KAAK,OAAO,WAAY,UAAS,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,WAAW,EAAE,CAAC,GAAG,KAAK,GAAG,IAAK,MAAK,OAAO,GAAG,KAAK,IAAI,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;AAC1J,QAAI,OAAO,SAAS,IAAI,GAAG;AACzB,YAAM,KAAK,SAAS,KAAK,MAAM,IAAI,GAAG,KAAK,SAAS,KAAK,MAAM,IAAI;AACnE,YAAM,CAAC,EAAE,UAAU,IAAI,GAAG,MAAM,CAAC,EAAE,UAAU,IAAI,EAAE;AAAG,YAAM,CAAC,EAAE,UAAU,IAAI,GAAG,MAAM,CAAC,EAAE,UAAU,IAAI,EAAE;AACzG,iBAAW;AAAI,iBAAW;AAC1B,cAAQ,KAAK,KAAK,OAAO,IAAI,IAAI,IAAI,SAAS;AAAG,eAAS,KAAK,KAAK,OAAO,IAAI,IAAI,IAAI,SAAS;AAAA,IAClG;AAAA,EACF;AACA,QAAM,MAAM,MAAM;AAClB,SAAO,EAAE,KAAK,UAAU,QAAQ,OAAK,QAAQ,IAAI,CAAC,GAAG,QAAQ,OAAK,QAAQ,IAAI,CAAC,GAAG,cAAc,SAAS,OAAK,SAAS,IAAI,CAAC,GAAG,QAAQ,OAAK,QAAQ,IAAI,CAAC,GAAG,MAAM;AACpK;AAkBA,IAAM,SAAS,CAAC,MAAc,KAAK,CAAC,EAAE,KAAK,MAAM,MAAM,MAAM,KAAK;AAClE,eAAe,cAAc,YAAsB,MAA+B;AAChF,aAAW,KAAK,WAAY,KAAI,MAAM,OAAO,CAAC,EAAG,QAAO;AACxD,QAAM,IAAI,MAAM,GAAG,IAAI,sBAAsB,WAAW,KAAK,IAAI,CAAC,EAAE;AACtE;AAGA,eAAsB,mBAAmB,MAA4F;AACnI,QAAM,OAAO,KAAK,MAAM,MAAMC,UAAS,KAAK,MAAM,MAAM,CAAC;AACzD,QAAM,OAAO,KAAK,KAAK,QAAQ,YAAY,EAAE;AAC7C,QAAM,YAAY,KAAK,SAAS,MAAM,cAAc,CAAC,OAAO,UAAU,OAAO,YAAY,GAAG,OAAO;AACnG,QAAM,YAAY,MAAMA,UAAS,WAAW,MAAM;AAClD,QAAM,EAAE,MAAM,IAAI,WAAW,SAAS;AACtC,MAAI,MAAM,WAAW,EAAG,OAAM,IAAI,MAAM,gCAAgC,MAAM,MAAM,EAAE;AACtF,QAAM,WAAWC,MAAKC,SAAQ,SAAS,GAAG,MAAM,CAAC,EAAE,KAAK,QAAQ,iBAAiB,EAAE,CAAC;AACpF,QAAM,YAAY,KAAK,SAAS,MAAM,cAAc,CAACD,MAAKC,SAAQ,SAAS,GAAG,MAAM,CAAC,EAAE,IAAI,GAAG,WAAW,QAAQ,WAAW,SAAS,OAAO,QAAQ,OAAO,OAAO,GAAG,kBAAkB;AACvL,QAAM,SAASA,SAAQ,KAAK,OAAO;AACnC,MAAI,UAAU;AACd,MAAI,QAAQ,SAAS,EAAE,YAAY,MAAM,SAAS;AAChD,cAAUD,MAAK,QAAQE,UAAS,SAAS,EAAE,QAAQ,YAAY,MAAM,CAAC;AACtE,QAAI,CAAE,MAAM,OAAO,OAAO,GAAI;AAC5B,YAAM,EAAE,IAAI,IAAI,MAAM,UAAU,IAAI,WAAW,MAAMH,UAAS,SAAS,CAAC,CAAC;AACzE,YAAMI,WAAU,SAAS,GAAG;AAAA,IAC9B;AAAA,EACF;AACA,QAAM,YAAY,SAAS,QAAQ,OAAO,EAAE,MAAM,IAAI,EAAE,KAAK,GAAG;AAChE,QAAM,OAAO,KAAK,QAAQD,UAAS,IAAI;AACvC,SAAO,EAAE,GAAG,YAAY,MAAM,WAAW,EAAE,MAAM,WAAW,QAAQ,KAAK,QAAQ,OAAO,KAAK,MAAM,CAAC,GAAG,WAAW,QAAQ;AAC5H;;;AEhlBA,IAAME,WAAU,CAAC,MAAoD,GAAG,EAAE,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI;AAClG,IAAMC,SAAQ,CAAC,MAAc,CAAC,EAAE,QAAQ,CAAC;AACzC,IAAM,UAAU,CAAC,SAAiB,SAAS,YAAY,SAAS;AAEzD,SAAS,gBAAgB,KAAkB,QAAgB,MAAc,SAAmC,CAAC,GAAsB;AACxI,QAAM,OAAO,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,MAAM;AACrD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,sBAAsB,MAAM,GAAG;AAC1D,QAAM,MAAM,IAAI,IAAI,KAAK,OAAO,IAAID,QAAO,CAAC;AAC5C,aAAW,CAAC,GAAG,IAAI,KAAK,OAAO,QAAQ,MAAM,EAAG,YAAW,MAAM;AAC/D,QAAI,CAAC,IAAI,IAAI,EAAE,EAAG,OAAM,IAAI,MAAM,UAAU,CAAC,qBAAqB,EAAE,cAAc,CAAC,GAAG,GAAG,EAAE,KAAK,IAAI,CAAC,GAAG;AAC1G,QAAM,aAAa,CAAC,OAAe,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,GAAG;AACrE,QAAM,SAA0B,CAAC;AACjC,QAAM,UAAoB,CAAC;AAC3B,aAAW,KAAK,KAAK,QAAQ;AAM3B,QAAI,EAAE,WAAW,eAAe,EAAE,KAAK,KAAK,OAAK,MAAM,QAAQ,EAAE,CAAC,CAAC,GAAG;AAAE,cAAQ,KAAKA,SAAQ,CAAC,CAAC;AAAG;AAAA,IAAU;AAC5G,QAAI,EAAE,WAAW,QAAQ;AACvB,YAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,EAAE,GAAI,OAAQ,KAAK,UAAqC,EAAE,IAAI;AAC1G,aAAO,KAAK;AAAA,QAAE,QAAQ,EAAE;AAAA,QAAQ,IAAI,EAAE;AAAA,QAAI,MAAM,KAAK;AAAA,QAAM,MAAM,EAAE;AAAA,QACjE,MAAM,EAAE,KAAK,IAAI,QAAM,EAAE,GAAG,GAAG,GAAG,QAAQ,EAAE,IAAI,IAAIC,OAAO,EAAE,IAAe,IAAI,IAAIA,OAAO,EAAE,IAAe,IAAI,EAAE,EAAE;AAAA,MAAE,CAAC;AACzH;AAAA,IACF;AACA,UAAM,OAAO,EAAE,WAAW,WACtB,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,IAC3E,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,EAAE;AACrC,UAAM,OAAO,WAAW,KAAK,IAAI;AACjC,QAAI,EAAE,WAAW,UAAU,EAAE,SAAS;AACpC,aAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,IAAI,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,IAAI,QAAM,EAAE,GAAG,GAAG,GAAGA,OAAO,EAAE,IAAe,KAAK,KAAK,EAAE,EAAE,EAAE,CAAC;AAAA,QACtI,QAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,IAAI,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,IAAI,QAAM,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;AAAA,EACxG;AACA,QAAM,SAAwC,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,EAAE;AACjG,aAAW,CAAC,GAAG,IAAI,KAAK,OAAO,QAAQ,MAAM,EAAG,QAAO,CAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,KAAK;AACvF,SAAO;AAAA,IAAE;AAAA,IAAM,UAAU,KAAK;AAAA,IAAU,MAAM,KAAK;AAAA,IAAM,QAAQ,KAAK,OAAO,IAAI,QAAM,EAAE,GAAG,EAAE,EAAE;AAAA,IAAG;AAAA,IAAQ;AAAA,IACzG,GAAI,QAAQ,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,IACpC,QAAQ,EAAE,KAAK,IAAI,KAAK,MAAM,WAAW,OAAO;AAAA,EAAE;AACtD;AAGA,IAAMC,cAAa,CAAC,KAAkB,SACpC,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,KAAK,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE,UAAU,KAAK,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,KAAK,MAAM,EAAE,UAAU;AAEhI,SAAS,oBAAoB,KAAkB,KAAwB,SAAiC,CAAC,GAAG,KAAK,IAAI,MAAiB;AAC3I,aAAW,KAAK,OAAO,KAAK,MAAM,EAAG,KAAI,EAAE,KAAK,IAAI,QAAS,OAAM,IAAI,MAAM,kBAAkB,CAAC,iBAAiB,OAAO,KAAK,IAAI,MAAM,EAAE,KAAK,IAAI,CAAC,GAAG;AACtJ,QAAM,IAA4B,CAAC;AACnC,aAAW,CAAC,GAAG,GAAG,KAAK,OAAO,QAAQ,IAAI,MAAM,EAAG,GAAE,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI;AAC3E,QAAM,QAAQ,EAAE,SAAS,GAAG,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,OAAK,EAAE,EAAE,CAAC;AACtE,QAAM,YAAY,CAAC,QAAgB;AACjC,QAAI,IAAI,EAAE;AACV,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,IAAI,MAAM,EAAG,KAAI,IAAI,QAAQ,SAAS,GAAG,EAAG,MAAK,EAAE,IAAI;AAChG,WAAO;AAAA,EACT;AACA,QAAM,SAAkB,CAAC;AACzB,aAAW,KAAK,IAAI,QAAQ;AAE1B,QAAI,EAAE,KAAK,KAAK,QAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAG;AAC5C,UAAM,IAAI,UAAUF,SAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,MAAcC,OAAM,IAAI,KAAK;AACtE,QAAI,EAAE,WAAW,QAAQ;AACvB,YAAM,OAAQ,EAAE,QAAQ,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,EAAE,IAAI,KAAM,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,EAAE;AACpG,UAAI,CAAC,KAAM;AACX,YAAM,OAAQ,KAAK,UAAqC,EAAE,IAAI;AAC9D,aAAO,KAAK;AAAA,QAAE,QAAQ;AAAA,QAAQ,IAAI,KAAK;AAAA,QAAI,MAAM,EAAE;AAAA,QACjD,MAAM,EAAE,KAAK,IAAI,SAAO,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,GAAGA,OAAM,QAAQ,EAAE,IAAI,IAAI,QAAQ,KAAM,GAAG,IAAe,KAAK,KAAK,OAAQ,GAAG,IAAe,CAAC,EAAE,EAAE;AAAA,MAAE,CAAC;AACzJ;AAAA,IACF;AACA,UAAME,UAAS,EAAE,QAAQ,IAAI,MAAM,KAAK,OAAK,EAAE,SAAS,EAAE,IAAI;AAC9D,QAAI,EAAE,WAAW,UAAU;AACzB,YAAM,MAAM,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE,EAAE,MAAMA,UAAS,IAAI,YAAY,KAAK,OAAK,EAAE,OAAOD,YAAW,KAAKC,OAAM,GAAG,UAAU,IAAI;AAC5I,UAAI,IAAK,QAAO,KAAK,EAAE,QAAQ,UAAU,IAAI,IAAI,IAAI,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,IAAI,SAAO,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,GAAGF,OAAO,GAAG,IAAe,CAAC,EAAE,EAAE,EAAE,CAAC;AACvJ;AAAA,IACF;AACA,UAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,EAAE,MAAME,UAASD,YAAW,KAAKC,OAAM,IAAI;AACvF,QAAI,CAAC,KAAM;AACX,QAAI,OAAO;AAAA,IAAC,WACH,EAAE,SAAS;AAClB,aAAO,KAAK,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,MAAM,SAAS,MAAM,EAAE,KAAK,IAAI,SAAO,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,GAAGF,OAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,QAAS,GAAG,IAAe,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;AAAA,aAC9K,EAAE,SAAS,cAAc;AAChC,UAAI,EAAE,KAAK,KAAK,QAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,EAAG;AACtE,aAAO,KAAK,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,MAAM,cAAc,MAAM,EAAE,KAAK,IAAI,SAAO,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;AAAA,IACrH,MAAO,QAAO,KAAK,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,EAAE,KAAK,IAAI,SAAO,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;AAAA,EACnH;AACA,SAAO;AAAA,IAAE;AAAA,IAAI,UAAUA,OAAM,IAAI,WAAW,KAAK;AAAA,IAAG,MAAM,IAAI;AAAA,IAAM;AAAA,IAClE,QAAQ,IAAI,OAAO,IAAI,QAAM,EAAE,GAAG,GAAG,GAAGA,OAAM,EAAE,IAAI,KAAK,EAAE,EAAE;AAAA,IAAG,QAAQ,EAAE,MAAM,YAAY,IAAI,IAAI,IAAI,QAAQ,EAAE;AAAA,EAAE;AACxH;AAGO,SAAS,cAAc,KAAkB,KAAwB,SAAiC,CAAC,GAAG,IAA0B;AACrI,QAAM,OAAO,oBAAoB,KAAK,KAAK,QAAQ,EAAE;AACrD,SAAO,EAAE,GAAG,KAAK,YAAY,IAAI,WAAW,OAAO,OAAK,EAAE,OAAO,KAAK,EAAE,EAAE,OAAO,IAAI,EAAE;AACzF;AAEO,SAAS,iBAAiB,GAA8B;AAC7D,QAAM,SAAS,OAAO,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,EAAE,SAAS,IAAI,EAAE,OAAO,KAAK,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,GAAG;AACjI,QAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,EAAE,OAAO,IAAI,OAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI;AACvE,QAAM,UAAU,EAAE,SAAS,SAAS,cAAc,EAAE,QAAQ,KAAK,IAAI,CAAC,KAAK;AAC3E,SAAO,GAAG,EAAE,IAAI,KAAK,EAAE,QAAQ,IAAI,EAAE,OAAO,UAAU,EAAE,KAAK,EAAE,OAAO,MAAM,cAAc,KAAK,YAAY,MAAM,GAAG,OAAO,UAAU,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,SAAS;AACzK;;;ACpIA,SAAS,YAAAG,WAAU,aAAAC,YAAW,SAAAC,cAAa;AAC3C,SAAS,WAAAC,gBAAe;AAGxB,eAAsB,YAAY,MAA4C;AAC5E,MAAI;AAAE,WAAO,KAAK,MAAM,MAAMH,UAAS,MAAM,MAAM,CAAC;AAAA,EAA0B,SACvE,GAAG;AAAE,QAAK,EAA4B,SAAS,SAAU,QAAO,CAAC;AAAG,UAAM;AAAA,EAAG;AACtF;AAEA,eAAsB,aAAa,MAAc,KAAuC;AACtF,QAAM,MAAM,MAAM,YAAY,IAAI;AAClC,QAAM,IAAI,IAAI,UAAU,OAAK,EAAE,SAAS,IAAI,IAAI;AAChD,MAAI,KAAK,EAAG,KAAI,CAAC,IAAI;AAAA,MAAU,KAAI,KAAK,GAAG;AAC3C,QAAME,OAAMC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAMF,WAAU,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AACpD;;;AChBA,SAAS,OAAAG,YAAW;AAGb,SAAS,iBAAiB,KAAa,OAAqD;AACjG,QAAM,MAAMA,KAAI,KAAK,KAAK,GAAG;AAC7B,QAAM,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,GAAG,IAAI,OAAO,IAAI,MAAM;AAC5D,MAAI,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,IAAI,QAAQ;AACnF,UAAM,IAAI,MAAM,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,oBAAoB,IAAI,KAAK,IAAI,IAAI,MAAM,QAAQ;AAAA,EACpG;AACA,QAAM,QAAQ,IAAI,WAAW,IAAI,CAAC;AAClC,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,UAAS,IAAI,GAAG,IAAI,GAAG,IAAK,OAAM,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,IAAI,CAAC;AAC3H,SAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM;AACtC;;;AChBA,SAAS,KAAAC,UAAS;;;ACmCX,IAAM,iBAAN,MAAqB;AAAA,EAe1B,YAA6B,MAAiC,OAAqG,CAAC,GAAG;AAA1I;AAAiC;AAC5D,SAAK,aAAa,KAAK,OAAO;AAAA,EAChC;AAAA,EAhBA;AAAA,EACQ;AAAA,EACA;AAAA,EACA,QAAmB,CAAC;AAAA,EACpB,WAAW,oBAAI,IAAqB;AAAA;AAAA,EAEpC,OAAa,oBAAI,IAAI;AAAA,EACrB;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA;AAAA,EAEX,WAAW;AAAA,EACF;AAAA;AAAA,EAOjB,IAAI,UAA8B;AAAE,YAAQ,KAAK,QAAQ,KAAK,OAAO,KAAK;AAAA,EAAI;AAAA,EAC9E,IAAI,SAA6B;AAAE,WAAO,KAAK,MAAM,KAAK;AAAA,EAAI;AAAA,EAEtD,QAAQ,IAAY,MAAgB,WAAW,GAAwB;AAC7E,UAAM,OAAO,KAAK,KAAK,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,EAAE;AAC3D,QAAI,CAAC,MAAM;AACT,YAAM,UAAU,sBAAsB,EAAE,iBAAiB,KAAK,KAAK,IAAI,WAAW,IAAI,OAAK,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAC3G,UAAI,KAAK,KAAK,qBAAqB,QAAS,OAAM,IAAI,MAAM,OAAO;AACnE,OAAC,KAAK,KAAK,aAAa,QAAQ,MAAM,OAAO;AAC7C,aAAO;AAAA,IACT;AACA,WAAO,EAAE,MAAM,MAAM,GAAG,MAAM,QAAQ,KAAK,MAAM,MAAM,OAAO,UAAU,OAAO,KAAK;AAAA,EACtF;AAAA,EAEA,QAAQ,IAAa,OAAyB,CAAC,GAAG;AAChD,UAAM,OAAO,OAAO,SAAY,SAAY,KAAK,QAAQ,EAAE;AAC3D,QAAI,OAAO,UAAa,CAAC,KAAM;AAC/B,SAAK,OAAO;AACZ,QAAI,CAAC,KAAK,QAAQ,KAAK,KAAK,MAAM;AAAE,WAAK,OAAO;AAAW,WAAK,SAAS,KAAK,GAAG;AAAG,WAAK,OAAO,CAAC;AAAA,IAAG;AAAA,EACtG;AAAA,EAEA,KAAK,IAAY,OAAoB,CAAC,GAAwB;AAC5D,UAAM,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,YAAY,CAAC;AACzD,QAAI,CAAC,IAAI;AACP,WAAK,MAAM,SAAS,aAAa;AACjC,iBAAW,UAAU,KAAK,MAAO,QAAO,SAAS,SAAS;AAC1D,WAAK,OAAO;AAAW,WAAK,QAAQ,CAAC;AACrC,WAAK,SAAS,KAAK,GAAG;AAAG,WAAK,OAAO,CAAC;AACtC,WAAK,aAAa,SAAS;AAC3B,aAAO,QAAQ,QAAQ,SAAS;AAAA,IAClC;AACA,UAAM,UAAU,IAAI,QAAoB,CAAAC,aAAW;AACjD,SAAG,SAAS,OAAK;AAAE,WAAG,SAAS;AAAW,aAAK,aAAa,CAAC;AAAG,QAAAA,SAAQ,CAAC;AAAA,MAAG;AAAA,IAC9E,CAAC;AACD,UAAM,MAAM,KAAK,MAAM,OAAO,QAAQ,UAAa,CAAC,IAAI,MAAM,OAAO,KAAK,UAAU;AACpF,QAAI,CAAC,QAAQ,SAAS,eAAe,GAAG,YAAY,IAAI,UAAU;AAChE,UAAI,KAAM,KAAI,SAAS,aAAa;AACpC,WAAK,OAAO;AACZ,WAAK,SAAS,KAAK,GAAG;AACtB,WAAK,OAAO,CAAC;AAAA,IACf,WAAW,SAAS,OAAQ,IAAG,OAAQ,SAAS;AAAA,QAC3C,MAAK,MAAM,KAAK,EAAE;AACvB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,WAAW,MAAc,IAAa;AACpC,QAAI,OAAO,OAAW,MAAK,SAAS,OAAO,IAAI;AAAA,SAC1C;AAAE,YAAM,KAAK,KAAK,QAAQ,EAAE;AAAG,UAAI,GAAI,MAAK,SAAS,IAAI,MAAM,EAAE;AAAA,IAAG;AAAA,EAC3E;AAAA;AAAA,EAGA,OAAO;AACL,SAAK,MAAM,SAAS,SAAS;AAC7B,eAAW,MAAM,KAAK,MAAO,IAAG,SAAS,SAAS;AAClD,SAAK,OAAO,KAAK,OAAO;AAAW,SAAK,QAAQ,CAAC;AAAG,SAAK,SAAS,MAAM;AACxE,SAAK,OAAO;AAAW,SAAK,UAAU,KAAK,WAAW;AAAG,SAAK,WAAW;AACzE,SAAK,OAAO,oBAAI,IAAI;AACpB,SAAK,KAAK,QAAQ,oBAAI,IAAI,CAAC;AAAA,EAC7B;AAAA,EAEA,OAAO,IAAY;AACjB,QAAI,KAAK,KAAM,MAAK,QAAQ,KAAK,MAAM,IAAI,KAAK,SAAS,MAAS;AAClE,QAAI,KAAK,MAAM;AACb,YAAM,UAAU,KAAK,KAAK;AAC1B,WAAK,QAAQ,KAAK,MAAM,IAAI,IAAI;AAChC,UAAI,KAAK,KAAK,QAAQ,CAAC,SAAS;AAC9B,aAAK,KAAK,SAAS,WAAW;AAC9B,cAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,YAAI,QAAQ,KAAK,MAAM;AAAE,eAAK,OAAO;AAAM,eAAK,SAAS;AAAA,QAAG;AAAA,MAE9D;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,QAAI,OAAa,QAAQ,OAAO,MAAM,MAAM,MAAM,IAAI,IAAI,oBAAI,IAAI;AAClE,QAAI,KAAK,MAAM;AACb,UAAI,CAAC,KAAK,SAAU,MAAK,UAAU,KAAK,IAAI,GAAG,KAAK,UAAU,EAAE;AAChE,WAAK,WAAW;AAChB,YAAM,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,UAAU,KAAK,WAAW;AACjE,aAAO,WAAW,KAAK,MAAM,MAAM,GAAG,OAAK,UAAU,KAAK,KAAK,KAAK,CAAC,CAAC;AACtE,UAAI,KAAK,YAAY,EAAG,MAAK,OAAO;AAAA,IACtC;AACA,SAAK,OAAO;AACZ,QAAI,KAAK,SAAS,MAAM;AACtB,aAAO,IAAI,IAAI,IAAI;AACnB,iBAAW,CAAC,MAAM,EAAE,KAAK,KAAK,UAAU;AACtC,aAAK,QAAQ,IAAI,IAAI,KAAK;AAC1B,eAAO,GAAG,MAAM,GAAG,MAAM,IAAI;AAC7B,YAAI,GAAG,KAAM,MAAK,SAAS,OAAO,IAAI;AAAA,MACxC;AAAA,IACF;AACA,SAAK,KAAK,QAAQ,IAAI;AAAA,EACxB;AAAA,EAEQ,SAAS,MAAM,KAAK,YAAY;AACtC,QAAI,MAAM,GAAG;AAAE,WAAK,OAAO,IAAI,IAAI,KAAK,IAAI;AAAG,WAAK,UAAU,KAAK,WAAW;AAAK,WAAK,WAAW;AAAA,IAAM,OACpG;AAAE,WAAK,OAAO;AAAW,WAAK,UAAU,KAAK,WAAW;AAAG,WAAK,WAAW;AAAA,IAAO;AAAA,EACzF;AAAA,EAEQ,QAAQ,IAAa,IAAY,MAAe;AACtD,QAAI,GAAG,KAAM;AACb,UAAM,OAAO,GAAG,QAAQ,KAAK,GAAG,MAAM,IAAI,GAAG,KAAK;AAClD,OAAG,QAAQ;AACX,OAAG,QAAQ;AACX,QAAI;AAAM,iBAAW,KAAK,GAAG,KAAK,OAAQ,KAAI,IAAI,EAAE,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,IAAI,EAAG,MAAK,UAAU,EAAE,MAAM,EAAE,OAAO;AAAA;AACnH,QAAI,GAAG,QAAQ,GAAG;AAChB,UAAI,GAAG,KAAM,IAAG,QAAQ;AAAA,WACnB;AAAE,WAAG,OAAO;AAAG,WAAG,OAAO;AAAA,MAAM;AAAA,IACtC;AAAA,EACF;AACF;AAGA,SAAS,IAAI,GAAW,MAAc,KAAa,GAAW,MAAe;AAC3E,MAAI,MAAM,KAAK,CAAC,KAAM,QAAO,IAAI,QAAQ,KAAK;AAC9C,SAAQ,IAAI,QAAQ,KAAK,KAAM,KAAK,MAAM;AAC5C;;;ADvKA,IAAM,QAAQC,GAAE,OAAO,EAAE,YAAY,EAAE,SAAS;AAChD,IAAM,SAASA,GAAE,MAAM,CAACA,GAAE,OAAO,EAAE,YAAY,GAAGA,GAAE,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,SAAS;AAC/E,IAAM,aAAaA,GAAE,OAAO;AAAA,EACjC,WAAWA,GAAE,OAAO;AAAA,EAAG,KAAKA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE;AAAA,EAAG,oBAAoBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC5H,QAAQA,GAAE,MAAMA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,SAASA,GAAE,KAAK,CAAC,YAAW,UAAU,CAAC,EAAE,QAAQ,UAAU,GAAG,OAAOA,GAAE,KAAK,CAAC,SAAQ,OAAO,CAAC,EAAE,QAAQ,OAAO,GAAG,cAAc,OAAO,UAAU,OAAO,iBAAiB,OAAO,SAAS,OAAO,SAAS,OAAO,eAAe,OAAO,QAAQ,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC/S,WAAWA,GAAE,MAAMA,GAAE,OAAO,EAAE,GAAGA,GAAE,OAAO,GAAG,GAAGA,GAAE,OAAO,GAAG,KAAK,OAAO,KAAK,OAAO,UAAU,OAAO,UAAU,OAAO,QAAQ,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACnJ,YAAYA,GAAE,MAAMA,GAAE,OAAO,EAAE,iBAAiBA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAMA,GAAE,KAAK,CAAC,KAAI,KAAI,UAAU,CAAC,GAAG,OAAOA,GAAE,KAAK,CAAC,SAAQ,OAAO,CAAC,EAAE,QAAQ,OAAO,GAAG,KAAKA,GAAE,OAAO,EAAE,SAAS,GAAG,KAAKA,GAAE,OAAO,EAAE,SAAS,GAAG,UAAUA,GAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC/Q,aAAaA,GAAE,MAAMA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,IAAIA,GAAE,OAAO,GAAG,UAAUA,GAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,GAAG,KAAKA,GAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,IAAG,GAAG,SAASA,GAAE,OAAO,EAAE,YAAY,GAAG,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC5P,CAAC,EAAE,OAAO;AAEV,IAAM,OAAO,CAAC,MAAgB,KAAK,MAAM,GAAG,CAAC;AAC7C,IAAM,WAAW,CAAC,GAAa,MAAgB,EAAE,IAAI,CAAC,GAAE,MAAM,IAAE,EAAE,CAAC,CAAC;AACpE,IAAM,OAAO,CAAC,QAAgB,IAAE,OAAK,MAAI,OAAK,MAAI;AAC3C,SAAS,SAAS,KAAkB,QAAoC;AAC7E,QAAM,MAAI,WAAW,MAAM,MAAM,GAAG,YAAU,IAAI,WAAW,KAAK,OAAG,EAAE,OAAK,IAAI,SAAS;AACzF,MAAG,CAAC,UAAW,OAAM,IAAI,MAAM,sBAAsB,IAAI,SAAS,GAAG;AACrE,MAAI,CAAC,IAAI,mBAAmB,UAAU,CAAC,IAAI,OAAO,UAAU,CAAC,IAAI,UAAU,UAAU,CAAC,IAAI,WAAW,UAAU,CAAC,IAAI,YAAY,OAAQ,OAAM,IAAI,MAAM,8CAA8C;AACtM,QAAM,WAAmB,CAAC;AAAG,QAAM,UAAgC,CAAC;AACpE,aAAU,MAAM,IAAI,mBAAoB,KAAG,CAAC,IAAI,WAAW,KAAK,OAAG,EAAE,OAAK,EAAE,EAAG,UAAS,KAAK,+BAA+B,EAAE,EAAE;AAChI,QAAM,IAAE,KAAK,IAAI,GAAE,KAAK,KAAK,UAAU,WAAS,IAAI,GAAG,CAAC,GAAG,KAAG,UAAU,WAAS;AACjF,QAAM,SAAO,MAAM,KAAK,EAAC,QAAO,IAAE,EAAC,GAAE,CAAC,GAAE,MAAI;AAAC,UAAM,IAAE,IAAE,IAAG,OAAK,OAAO,WAAU,CAAC;AAAE,WAAO,EAAC,GAAE,MAAK,MAAK,SAAS,KAAI,IAAI,EAAC;AAAA,EAAE,CAAC;AAC5H,QAAM,OAAK,SAAS,KAAI,oBAAI,IAAI,CAAC;AACjC,QAAM,OAAK,CAAC,GAAc,IAAU,SAAe,UAAwB;AACzE,UAAM,IAAE,EAAE,MAAM,IAAI,EAAE;AAAE,QAAG,CAAC,EAAE,OAAM,IAAI,MAAM,sBAAsB,EAAE,GAAG;AACzE,WAAO,YAAU,aAAW,CAAC,UAAQ,UAAQ,EAAE,WAAS,KAAK,MAAM,EAAE,MAAM,GAAE,EAAE,MAAM,CAAC,IAAE,MAAI,KAAK,EAAE,IAAE,UAAQ,UAAQ,CAAC,EAAE,GAAE,EAAE,CAAC,IAAE,CAAC,EAAE,MAAM,IAAG,EAAE,MAAM,EAAE;AAAA,EACvJ;AACA,QAAM,SAAO,CAAC,GAAS,MAAqB,CAAC,KAAI,KAAG,EAAE,CAAC,IAAE,QAAM,KAAG,EAAE,CAAC,IAAE;AACvE,QAAM,cAAY,CAAC,MAAqB;AAAC,QAAG,MAAI,EAAE,CAAC,IAAE,EAAE,CAAC,KAAG,EAAE,CAAC,IAAE,UAAU,UAAU,OAAM,IAAI,MAAM,0BAA0B;AAAA,EAAE;AAChI,aAAU,QAAQ,IAAI,QAAO;AAC3B,QAAI,CAAC,KAAK,cAAc,KAAK,UAAU,KAAK,iBAAiB,KAAK,SAAS,KAAK,SAAS,KAAK,aAAa,EAAE,MAAM,OAAK,MAAM,MAAS,EAAG,OAAM,IAAI,MAAM,yCAAyC;AACnM,gBAAY,KAAK,MAAM;AACvB,UAAM,KAAG,OAAO,OAAO,OAAG,OAAO,EAAE,GAAE,KAAK,MAAM,CAAC;AAAE,QAAG,GAAG,SAAO,EAAE,OAAM,IAAI,MAAM,eAAe,KAAK,IAAI,8BAA8B;AACxI,UAAM,KAAG,GAAG,IAAI,OAAG,KAAK,EAAE,MAAK,KAAK,MAAK,KAAK,SAAQ,KAAK,KAAK,CAAC;AACjE,QAAG,KAAK,YAAU,WAAW,UAAQ,IAAE,GAAE,IAAE,GAAG,QAAO,IAAI,IAAG,CAAC,EAAE,CAAC,IAAE,GAAG,IAAE,CAAC,EAAE,CAAC,IAAE,KAAK,GAAG,CAAC,EAAE,CAAC,IAAE,GAAG,IAAE,CAAC,EAAE,CAAC,CAAC;AACrG,UAAM,aAAW,CAAC,OAAgB,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,GAAE,MAAI,SAAS,GAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAAC,OAAGA,KAAE,EAAE,CAAC;AACvF,UAAM,WAAS,WAAW,EAAE,GAAE,eAAa,WAAW,QAAQ,GAAE,OAAK,WAAW,YAAY;AAC5F,UAAM,QAAM,GAAG,CAAC,EAAE,IAAI,CAAC,GAAE,MAAI,KAAK,IAAI,GAAG,GAAG,IAAI,OAAG,EAAE,CAAC,CAAC,CAAC,IAAE,KAAK,IAAI,GAAG,GAAG,IAAI,OAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACtF,UAAM,QAAM,KAAK,MAAK,KAAK,MAAK,KAAK,SAAQ,KAAK,KAAK;AACvD,UAAM,IAAE,EAAC,SAAQ,GAAG,QAAO,WAAU,KAAK,KAAK,GAAE,OAAM,KAAK,IAAI,GAAG,SAAS,IAAI,IAAI,CAAC,GAAE,cAAa,KAAK,IAAI,GAAG,aAAa,IAAI,IAAI,CAAC,GAAE,MAAK,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,GAAE,MAAK,KAAK,IAAI,GAAG,SAAS,IAAI,IAAI,CAAC,IAAE,IAAG,YAAW,KAAK,IAAI,GAAG,GAAG,IAAI,OAAG,KAAK,SAAS,GAAE,KAAK,CAAC,CAAC,CAAC,EAAC;AAC3Q,UAAM,KAAG,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK,KAAK;AAAG,YAAQ,EAAE,IAAE;AAClE,QAAG,KAAK,iBAAe,UAAW,EAAE,YAAU,KAAK,aAAa,UAAS,KAAK,GAAG,EAAE,eAAe,EAAE,SAAS,MAAM,KAAK,YAAY,EAAE;AACtI,eAAU,CAAC,OAAM,GAAG,KAAK,CAAC,CAAC,YAAW,OAAO,GAAE,CAAC,mBAAkB,cAAc,GAAE,CAAC,WAAU,MAAM,GAAE,CAAC,WAAU,MAAM,GAAE,CAAC,iBAAgB,YAAY,CAAC;AACpJ,UAAG,KAAK,KAAK,MAAI,UAAW,EAAE,GAAG,IAAE,KAAK,KAAK,EAAG,UAAS,KAAK,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE;AAAA,EAC5G;AACA,aAAU,QAAQ,IAAI,WAAU;AAC9B,QAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,UAAU,KAAK,QAAQ,EAAE,MAAM,OAAK,MAAM,MAAS,EAAG,OAAM,IAAI,MAAM,2CAA2C;AAC/I,gBAAY,KAAK,MAAM;AAAE,UAAM,KAAG,OAAO,OAAO,OAAG,OAAO,EAAE,GAAE,KAAK,MAAM,CAAC;AAAE,QAAG,CAAC,GAAG,OAAO,OAAM,IAAI,MAAM,8BAA8B;AACxI,UAAM,WAAS,CAAC,MAAgB,KAAK,SAAS,KAAK,GAAE,KAAK,GAAE,YAAW,OAAO,GAAE,KAAK,GAAE,KAAK,GAAE,YAAW,OAAO,CAAC,CAAC;AAClH,UAAM,QAAM,SAAS,IAAI,GAAEC,UAAO,GAAG,IAAI,OAAG,SAAS,EAAE,IAAI,CAAC,GAAE,KAAG,KAAK,IAAI,GAAGA,OAAM,GAAE,KAAG,KAAK,IAAI,GAAGA,OAAM;AAC1G,YAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,IAAE,EAAC,SAAQ,GAAG,QAAO,KAAI,IAAG,KAAI,IAAG,MAAK;AACrE,SAAI,KAAK,aAAW,UAAW,KAAK,aAAW,WAAY,QAAM,KAAK,OAAM,IAAI,MAAM,oDAAoD;AAC1I,QAAI,KAAK,QAAM,UAAW,KAAG,KAAK,OAAO,KAAK,QAAM,UAAW,KAAG,KAAK,OAAO,KAAK,aAAW,UAAW,KAAG,QAAM,KAAK,YAAY,KAAK,aAAW,UAAW,KAAG,QAAM,KAAK,SAAU,UAAS,KAAK,YAAY,KAAK,CAAC,IAAI,KAAK,CAAC,wBAAwB;AAAA,EAC1P;AACA,aAAU,QAAQ,IAAI,YAAW;AAC/B,QAAI,KAAK,QAAQ,UAAa,KAAK,QAAQ,OAAW,OAAM,IAAI,MAAM,4CAA4C;AAClH,UAAM,OAAK,IAAI,MAAM,KAAK,OAAG,EAAE,OAAK,KAAK,eAAe;AAAE,QAAG,CAAC,KAAK,OAAM,IAAI,MAAM,sBAAsB,KAAK,eAAe,GAAG;AAEhI,UAAM,KAAG,IAAI,IAAI,OAAO,IAAI,OAAG,EAAE,CAAC,CAAC;AAAE,eAAU,MAAM,UAAU,OAAO,YAAU,KAAK,GAAG,MAAK;AAAC,SAAG,IAAI,EAAE,CAAC;AAAE,UAAG,EAAE,IAAE,EAAE,IAAG,IAAI,KAAK,IAAI,GAAE,EAAE,IAAE,IAAI,CAAC;AAAA,IAAE;AAChJ,QAAIC,UAAO,GAAE,MAAI;AACjB,eAAU,KAAK,IAAG;AAAC,YAAM,OAAK,OAAO,WAAU,CAAC,GAAE,IAAE,SAAS,KAAI,IAAI;AACnE,YAAM,QAAQ,KAAK,IAAI,GAAG,QAAO,KAAK,IAAG,OAAO,CAAC,KAAK,aAAa,KAAK,KAAK;AAC7E,YAAM,QAAQ,OAAO,KAAK,IAAI,GAAG,QAAO,KAAK,IAAG,OAAO,CAAC,KAAG,KAAK,KAAK,IAAK,MAAmB,CAAC;AAC9F,UAAG,CAAC,EAAE,WAAW,IAAI,KAAK,EAAE,KAAG,SAAO,KAAI;AAC1C,MAAAA;AAAS,YAAM,IAAE,KAAK,GAAE,KAAK,MAAK,KAAK,SAAO,aAAW,aAAW,YAAW,KAAK,KAAK,EAAE,KAAK,SAAO,MAAI,IAAE,CAAC;AAC9G,UAAI,KAAK,QAAM,UAAW,IAAE,KAAK,OAAO,KAAK,QAAM,UAAW,IAAE,KAAK,IAAK;AAAA,IAC5E;AACA,YAAQ,aAAa,KAAK,EAAE,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,EAAE,IAAE,EAAC,QAAAA,SAAO,IAAG;AACrE,QAAG,OAAM,CAACA,WAAQ,KAAK,SAAU,UAAS,KAAK,GAAG,KAAK,EAAE,eAAe,GAAG,6BAA6BA,OAAM,iBAAiB;AAAA,EACjI;AACA,aAAU,MAAM,IAAI,aAAY;AAC9B,eAAU,MAAM,CAAC,GAAG,MAAK,GAAG,EAAE,EAAE,KAAG,CAAC,IAAI,WAAW,KAAK,OAAG,EAAE,OAAK,EAAE,EAAE,OAAM,IAAI,MAAM,gCAAgC,EAAE,EAAE;AAC1H,UAAM,OAAK,EAAC,KAAI,MAAK,oBAAI,IAAI,GAAU,QAAQ,GAAO;AAAC,WAAK,OAAK;AAAA,IAAE,EAAC,GAAE,QAAM,IAAI,eAAe,MAAK,EAAC,KAAI,GAAG,KAAI,kBAAiB,QAAO,CAAC;AACzI,UAAM,QAAQ,GAAG,MAAK,EAAC,KAAI,EAAC,CAAC;AAAE,UAAM,OAAO,GAAG,QAAQ;AACvD,QAAI,WAAS,SAAS,KAAI,KAAK,IAAI,GAAE,eAAa,KAAK,MAAK,UAAQ;AACpE,UAAM,KAAK,GAAG,EAAE;AAChB,UAAM,UAAQ,MAAI;AAChB,YAAM,OAAK,SAAS,KAAI,KAAK,IAAI;AACjC,iBAAU,KAAK,IAAI,OAAM;AACvB,cAAM,IAAE,SAAS,MAAM,IAAI,EAAE,EAAE,EAAG,OAAM,IAAE,KAAK,MAAM,IAAI,EAAE,EAAE,EAAG;AAChE,cAAM,IAAE,MAAM,GAAE,EAAE,QAAO,CAAC,GAAE,IAAE,MAAM,GAAE,EAAE,QAAO,CAAC;AAChD,kBAAQ,KAAK,IAAI,SAAQ,KAAK,MAAM,EAAE,KAAG,EAAE,IAAG,EAAE,KAAG,EAAE,EAAE,GAAE,KAAK,MAAM,EAAE,CAAC,IAAE,EAAE,CAAC,GAAE,EAAE,CAAC,IAAE,EAAE,CAAC,CAAC,CAAC;AAAA,MAC1F;AACA,iBAAW,KAAK,IAAI,OAAO;AACzB,YAAI,SAAS,WAAW,IAAI,EAAE,EAAE,GAAG,OAAO,KAAK,WAAW,IAAI,EAAE,EAAE,GAAG,GAAI;AACzE,cAAM,SAAS,YAAY,KAAK,cAAc,EAAE,IAAI,GAAG,QAAQ,GAAG,QAAQ,YAAY,KAAK,KAAK,MAAM,EAAE,IAAI,GAAG,IAAI;AACnH,YAAI,UAAU,SAAS,OAAO,WAAW,MAAM,OAAQ,UAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,WAAU,KAAK,IAAI,SAAS,KAAK,MAAM,MAAM,CAAC,EAAE,CAAC,IAAE,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,MAC3L;AACA,iBAAS;AAAK,qBAAa,KAAK;AAAA,IAClC;AACA,YAAQ;AAAE,UAAM,QAAM,KAAK,KAAK,GAAG,WAAS,IAAI,GAAG;AAAE,aAAQ,IAAE,GAAE,IAAE,OAAM,KAAI;AAAC,YAAM,OAAO,IAAE,IAAI,GAAG;AAAE,cAAQ;AAAA,IAAE;AAAC,UAAM,KAAK;AAC5H,YAAQ,cAAc,GAAG,IAAI,KAAK,GAAG,EAAE,EAAE,IAAE,EAAC,SAAQ,QAAM,GAAE,SAAQ,KAAI,GAAG,IAAG;AAAE,QAAG,UAAQ,GAAG,QAAQ,UAAS,KAAK,cAAc,GAAG,IAAI,KAAK,GAAG,EAAE,UAAU,OAAO,MAAM,GAAG,OAAO,EAAE;AAAA,EACxL;AACA,SAAO,EAAC,MAAK,SAAS,WAAS,GAAE,WAAU,UAAU,IAAG,KAAI,IAAI,KAAI,UAAS,IAAG,UAAS,IAAE,GAAE,WAAU,OAAO,QAAO,SAAQ,SAAQ;AACvI;;;AtBpEA,SAAS,iBAAAC,sBAAqB;;;AwBzB9B,IAAMC,QAAO,CAAC,QAAgB,IAAI,OAAO,MAAM,OAAO,MAAM;AAC5D,IAAM,OAAO,CAAC,KAAkB,OAA+B;AAC7D,QAAM,IAAI,IAAI,YAAY,KAAK,CAAAC,OAAKA,GAAE,OAAO,EAAE;AAC/C,MAAI,GAAG,SAAS,OAAQ,OAAM,IAAI,MAAM,kBAAkB,EAAE,GAAG;AAC/D,SAAO;AACT;AACA,SAAS,KAAK,KAAkB,GAAmB,SAA+C;AAChG,QAAM,OAAO,SAAS,KAAK,oBAAI,IAAI,CAAC,GAAG,QAAQ,wBAAwB,MAAM,EAAE,MAAM,CAAC;AACtF,SAAO,QAAQ,IAAI,CAAC,MAAM,MAAM;AAC9B,UAAM,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE,OAAO,CAACA,IAAG,MAAMA,KAAI,GAAG,CAAC;AACxD,QAAI,EAAE,MAAM,GAAI,OAAM,IAAI,MAAM,UAAU,CAAC,uBAAuB;AAClE,WAAO,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM;AAC9D,YAAM,IAAI,KAAK,MAAM,IAAI,IAAI;AAC7B,UAAI,CAAC,EAAG,OAAM,IAAI,MAAM,wBAAwB,IAAI,GAAG;AACvD,YAAM,CAAC,GAAG,CAAC,IAAI,MAAM,OAAO,EAAE,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC;AACpE,aAAO,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AACH;AAGO,SAAS,gBAAgB,KAAkB,IAAY,OAA8B;AAC1F,QAAM,IAAI,KAAK,KAAK,EAAE,GAAG,OAAO,SAAS,KAAK,oBAAI,IAAI,CAAC;AACvD,MAAI,MAAM,SAAS,KAAK,IAAI,IAAI,KAAK,EAAE,SAAS,MAAM,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AAC1H,QAAM,SAAS,MAAM,IAAI,CAAAC,QAAM;AAAE,UAAM,IAAI,KAAK,MAAM,IAAIA,GAAE;AAAG,QAAI,CAAC,EAAG,OAAM,IAAI,MAAM,iBAAiBA,GAAE,GAAG;AAAG,WAAO,CAAC,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE;AAAA,EAAG,CAAC;AAClJ,QAAM,QAAQ,wBAAwB,MAAM,EAAE,MAAM,CAAC,GAAG,UAAiC,CAAC;AAC1F,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,QAAI,OAAO,UAAU,UAAU,GAAG,IAAI;AACtC,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,YAAM,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,KAAK,KAAK,KAAK;AACpG,UAAI,KAAK,MAAO,OAAM,IAAI,MAAM,2CAA2C;AAC3E,YAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,MAAM,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;AACvF,YAAM,KAAK,MAAM,CAAC,IAAI,IAAI,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,OAAO;AACxE,UAAI,IAAI,MAAM;AAAE,eAAO;AAAG,kBAAU;AAAG,YAAI;AAAA,MAAG;AAAA,IAChD;AACA,YAAQ,KAAK,oBAAI,IAAI,CAAC,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAAA,EAC1E;AACA,SAAO,WAAW,KAAK,IAAI,KAAK,KAAK,GAAG,OAAO,CAAC,EAAE;AACpD;AAGO,SAAS,cAAc,KAAkB,IAAY,aAAa,GAAG,WAAW,KAAK,SAAmB,CAAC,GAAgB;AAC9H,QAAM,IAAI,KAAK,KAAK,EAAE;AACtB,MAAI,CAAC,EAAE,QAAS,OAAM,IAAI,MAAM,wCAAwC;AACxE,MAAI,CAAC,OAAO,UAAU,UAAU,KAAK,aAAa,KAAK,aAAa,OAAO,WAAW,KAAK,WAAW,EAAG,OAAM,IAAI,MAAM,2BAA2B;AACpJ,QAAM,QAAQ,IAAI,IAAI,MAAM,GAAG,aAAa,EAAE,QAAQ,IAAI,MAAM,oBAAI,IAAY,CAAC;AACjF,aAAW,KAAK,MAAO,KAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,KAAK,KAAK,WAAW,OAAQ,OAAM,IAAI,MAAM,yBAAyB,CAAC,EAAE;AAChI,WAAS,IAAI,GAAG,IAAI,EAAE,UAAU,QAAQ,KAAK,EAAG,YAAW,KAAK,EAAE,UAAU,MAAM,GAAG,IAAI,CAAC,EAAG,YAAW,KAAK,EAAE,UAAU,MAAM,GAAG,IAAI,CAAC,EAAG,KAAI,MAAM,EAAG,YAAW,CAAC,EAAE,IAAI,CAAC;AAC1K,MAAI,IAAI,EAAE,QAAQ,IAAI,UAAQ,IAAI,IAAI,KAAK,IAAI,OAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,WAAS,OAAO,GAAG,OAAO,YAAY,OAAQ,KAAI,EAAE,IAAI,CAAC,KAAK,MAAM;AAClE,QAAI,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,KAAM,QAAO;AAChD,UAAM,OAAO,IAAI,IAAI,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,IAAI,SAAS,CAAC,CAAC;AACtE,eAAW,KAAK,WAAW,CAAC,EAAG,YAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAG,MAAK,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,WAAW,CAAC,EAAE,IAAI;AAC5H,WAAO;AAAA,EACT,CAAC;AACD,SAAO,WAAW,KAAK,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAC9C;AAGO,SAAS,WAAW,KAAkB,IAAY,MAAc,UAAqB,QAAwD;AAClJ,QAAM,IAAI,KAAK,KAAK,EAAE,GAAG,OAAO,SAAS,KAAK,oBAAI,IAAI,CAAC,GAAG,QAAQ,wBAAwB,MAAM,EAAE,MAAM,CAAC;AACzG,MAAI,CAAC,KAAK,MAAM,IAAI,IAAI,EAAG,OAAM,IAAI,MAAM,iBAAiB,IAAI,GAAG;AACnE,MAAI,CAAC,UAAU,UAAU,CAAC,OAAQ,OAAM,IAAI,MAAM,4CAA4C;AAC9F,QAAM,WAAW,IAAI,IAAI,QAAQ;AACjC,aAAW,KAAK,SAAU,KAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,KAAK,KAAK,MAAM,SAAS,EAAG,OAAM,IAAI,MAAM,kBAAkB,CAAC,EAAE;AAC3H,QAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,IAAI,EAAG;AACnD,MAAI,QAAQ;AACZ,QAAM,IAAI,MAAM,KAAK,EAAE,QAAQ,MAAM,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM;AAC3D,UAAM,IAAI,MAAM,IAAI,CAAC,GAAG,IAAI,MAAM,IAAI,IAAI,CAAC;AAC3C,UAAM,SAAS,UAAU,KAAK,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,OAAO,CAAC;AACpH,QAAI,SAAS,IAAI,CAAC,KAAK,QAAQ;AAAE;AAAS,aAAO,oBAAI,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,IAAG;AACvE,WAAO,IAAI,IAAI,EAAE,UAAU,CAAC,EAAE,IAAI,SAAO,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,EAC5E,CAAC;AACD,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,qCAAqC;AACjE,SAAO,WAAW,KAAK,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAC9C;AAGO,SAAS,aAAa,KAAkB,WAAmB,MAAc,QAAgB,GAAwB;AACtH,QAAM,OAAO,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,SAAS;AACxD,MAAI,CAAC,QAAQ,IAAI,KAAK,IAAI,KAAK,SAAU,OAAM,IAAI,MAAM,oEAAoE;AAC7H,QAAM,OAAO,SAAS,KAAK,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,KAAK,MAAM,IAAI,IAAI,GAAG,OAAO,KAAK,KAAK,MAAM,IAAI,MAAM,GAAG;AAC9G,MAAI,CAAC,QAAQ,CAAC,MAAM,SAAS,OAAQ,OAAM,IAAI,MAAM,sCAAsC;AAC3F,WAAS,IAAI,IAAI,MAAM,KAAK,CAAAC,OAAKA,GAAE,OAAO,MAAM,GAAG,GAAG,IAAI,IAAI,MAAM,KAAK,CAAAC,OAAKA,GAAE,OAAO,EAAG,MAAM,EAAG,KAAI,EAAE,OAAO,KAAM,OAAM,IAAI,MAAM,+BAA+B;AACrK,MAAI,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,MAAO,OAAM,IAAI,MAAM,oCAAoC;AACrG,QAAM,CAAC,GAAG,CAAC,IAAI,MAAM,OAAO,EAAE,GAAG,KAAK,IAAI,KAAK,EAAE;AACjD,QAAM,KAAK,UAAU,IAAI,IAAI,MAAM;AACnC,QAAM,SAAS;AAAA,IAAE;AAAA,IAAG;AAAA,IAAG,UAAUJ,MAAK,WAAW,IAAI,IAAI,WAAW,EAAE,CAAC;AAAA,IAAG,QAAQ,KAAK,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG,GAAG,GAAG,CAAC;AAAA,IAAG,QAAQ,KAAK,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG,GAAG,GAAG,CAAC;AAAA,IAC/L,QAAQA,OAAM,KAAK,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,MAAM,KAAK,EAAE;AAAA,EAAE;AAC5I,QAAM,QAAQ,KAAK,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,OAAK,EAAE,KAAK,GAAG,GAAG,IAAI,UAAU,IAAI,OAAK,EAAE,KAAK,GAAG,GAAG,IAAI,KAAK,IAAI,OAAK,EAAE,KAAK,CAAC,IAAI;AAC5H,MAAI,OAAO,cAAc,KAAK,aAAa,IAAI,EAAE,OAAO,CAAC,IAAI,GAAG,QAAQ,OAAO,GAAG,QAAQ,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,EAAE,CAAC;AACpK,aAAW,KAAK,KAAK,UAAU,OAAO,CAAAK,OAAKA,GAAE,GAAG,WAAW,UAAU,IAAI,GAAG,KAAKA,GAAE,MAAM,WAAW,KAAKA,GAAE,MAAM,CAAC,MAAM,IAAI,GAAG;AAC7H,eAAW,QAAQ,CAAC,QAAQ,QAAQ,aAAa,aAAa,aAAa,WAAW,GAAY;AAChG,YAAM,MAAM,KAAK,OAAO,KAAK,QAAM,GAAG,WAAW,eAAe,GAAG,OAAO,EAAE,MAAM,GAAG,SAAS,IAAI;AAClG,YAAM,OAAO,CAAC,GAAI,CAAC,OAAO,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,OAAgB,CAAC,IAAI,CAAC,GAAI,EAAE,GAAG,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,OAAgB,CAAC;AACrI,aAAO,QAAQ,MAAM,WAAW,EAAE,QAAQ,aAAa,IAAI,EAAE,IAAI,KAAK,GAAG,MAAM,QAAW,EAAE,OAAO,KAAK,CAAC;AAAA,IAC3G;AAAA,EACF;AACA,aAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,MAAM,EAAG,QAAO,QAAQ,MAAM,WAAW,EAAE,QAAQ,aAAa,IAAI,KAAK,GAA0B,CAAC,EAAE,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,QAAW,EAAE,OAAO,KAAK,CAAC;AAC9L,SAAO;AACT;AAIO,SAAS,cAAc,KAAkB,WAAmB,MAAkC;AACnG,QAAM,OAAO,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,SAAS;AACxD,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,sBAAsB,SAAS,GAAG;AAC7D,QAAM,MAAM,KAAK,OAAO,IAAI,KAAK,KAAK,aAAa,KAAK,UAAU,KAAK,WAAW,MAAM,OAAO,KAAK,QAAQ,KAAK,WAAW,KAAK,YAAY;AAC7I,MAAI,OAAO,KAAK,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,CAAC,KAAK,MAAM,OAAQ,OAAM,IAAI,MAAM,2BAA2B;AAC3H,MAAI,CAAC,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,MAAM,KAAK,KAAK,MAAM,SAAS,KAAK,MAAM,EAAG,OAAM,IAAI,MAAM,sDAAsD;AAC1J,MAAI,IAAI,IAAI,KAAK,KAAK,EAAE,SAAS,KAAK,MAAM,OAAQ,OAAM,IAAI,MAAM,kCAAkC;AACtG,WAAS,IAAI,IAAI,MAAM,KAAK,CAAAF,OAAKA,GAAE,OAAO,KAAK,MAAM,GAAG,GAAG,IAAI,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,EAAG,MAAM,GAAG;AACtG,QAAI,KAAK,MAAM,SAAS,EAAE,EAAE,EAAG,OAAM,IAAI,MAAM,mDAAmD;AAAA,EACpG;AACA,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,WAAW,GAAG,CAAC,GAAG,KAAK,KAAK,WAAW;AAC5E,QAAM,OAAO,EAAE,GAAG,MAAM,QAAQ,KAAK,OAAO,OAAO,OAAK,EAAE,EAAE,WAAW,UAAU,KAAK,MAAM,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE;AACtI,QAAM,WAAW,KAAK,cAAc,gBAAgB;AACpD,QAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,IAAI,EAAE,GAAG,CAAC,GAAG,MAAM;AACrD,UAAM,QAAQ,SAAS,KAAK,OAAO,MAAM,KAAK,CAAC,CAAC,EAAE,MAAM,IAAI,KAAK,MAAM,EAAG;AAC1E,WAAO,UAAU,WAAW,KAAK,IAAI,KAAK,eAAe,MAAM,MAAM,KAAK,MAAM;AAAA,EAClF,CAAC;AACD,QAAM,OAAO,OAAO,CAAC,IAAI,OAAO,CAAC;AACjC,MAAI,KAAK,QAAQ,KAAK,IAAI,UAAUH,MAAK,IAAI,IAAI,IAAI,IAAI,KAAM,OAAM,IAAI,MAAM,kEAAkE;AACjJ,MAAI,OAAO;AACX,WAAS,KAAK,GAAG,KAAK,KAAK,MAAM,QAAQ,MAAM;AAC7C,UAAM,OAAO,IAAI,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC;AACxD,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,2BAA2B,KAAK,MAAM,EAAE,CAAC,GAAG;AACvE,UAAM,QAAQ,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,OAAO,MAAM,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC,GAAG,IAAI,KAAK;AACzH,QAAI,IAAI,GAAG,WAAW,GAAG,UAAoB,CAAC;AAC9C,UAAM,QAAQ,MAAM;AAClB,gBAAU,CAAC,CAAC;AACZ,eAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,cAAM,aAAa,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC;AAC3C,cAAM,SAAS,UAAUA,MAAK,UAAU,IAAI,cAAc;AAC1D,iBAASM,KAAI,GAAGA,KAAI,KAAKA,MAAK;AAC5B,uBAAa,CAAC,QAAQ,QAAQ,IAAI,IAAI,UAAU,QAAQ,WAAW,OAAO,QAAQ,SAAS;AAC3F,eAAK,WAAW;AAChB,cAAI,KAAK,IAAI,CAAC,IAAI,UAAU;AAAE,gBAAI,KAAK,KAAK,CAAC,IAAI;AAAU,uBAAW;AAAA,UAAG;AAAA,QAC3E;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AACA,QAAI,KAAK,MAAM;AACb,UAAI,YAAY;AAChB,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAAE,cAAM,OAAO,GAAG,OAAO;AAAU,cAAM;AAAG,YAAI,KAAK,IAAI,IAAI,IAAI,IAAI,QAAQ,KAAK,IAAI,WAAW,IAAI,IAAI,MAAM;AAAE,sBAAY;AAAM;AAAA,QAAO;AAAA,MAAE;AAC1K,UAAI,CAAC,UAAW,OAAM,IAAI,MAAM,4DAA4D;AAC5F,cAAQ,CAAC,IAAI,QAAQ,CAAC;AAAA,IACxB,MAAO,OAAM;AAEb,UAAM,SAAS,KAAK,OAAO,QAAQ,CAAC,IAAI;AACxC,UAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,IAAI,OAAK,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC;AACpE,UAAM,QAAQ,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,WAAW,KAAK,CAAC;AAC/D,WAAO,QAAQ,MAAM,WAAW,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,MAAM,YAAY,eAAe,QAAQ,GAAG,QAAQ,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,IAAI,IAAI,GAAG,KAAK,UAAU,YAAY,IAAI,UAAU,OAAO,MAAM,SAAS,EAAE,GAAG,KAAK,QAAQ;AAAA,EACrO;AACA,SAAO;AACT;;;AxB3HO,IAAM,QAAmB,CAAC;AAOjC,SAAS,KAA8B,MAAc,aAAqB,OAAU,KAA6D;AAC/I,QAAM,UAAU;AAChB,QAAM,KAAK,EAAE,MAAM,aAAa,OAAOC,GAAE,OAAO,KAAK,EAAE,OAAO,GAAG,KAAK,UACpE,OAAO,KAAK,SAAS,WAAW,aAAa,KAAK,MAAM,MAAM,QAAQ,IAAI,CAAC,IAAI,QAAQ,IAAI,EAAE,CAAC;AAClG;AACA,eAAsB,SAAS,MAAc,MAAoC;AAC/E,QAAM,IAAI,MAAM,KAAK,CAAAC,OAAKA,GAAE,SAAS,IAAI;AACzC,MAAI,CAAC,EAAG,QAAO,EAAE,MAAM,wBAAwB,IAAI,KAAK,SAAS,KAAK;AACtE,QAAM,SAAS,EAAE,MAAM,UAAU,IAAI;AACrC,MAAI,CAAC,OAAO,QAAS,QAAO,EAAE,MAAM,6BAA6B,OAAO,MAAM,OAAO,IAAI,OAAK,GAAG,EAAE,KAAK,KAAK,GAAG,KAAK,QAAQ,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC,IAAI,SAAS,KAAK;AAK3K,MAAI;AAAE,WAAO,MAAM,EAAE,IAAI,OAAO,IAAI;AAAA,EAAG,SAAS,GAAG;AAAE,WAAO,KAAK,CAAC;AAAA,EAAG;AACvE;AAGA,IAAM,OAAO,CAAC,GAAW,SAAmC,EAAE,MAAM,GAAG,IAAI;AAC3E,IAAM,OAAO,CAAC,OAA4B,EAAE,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,IAAI,SAAS,KAAK;AAExH,IAAM,OAAOC,GAAE,OAAO,EAAE,SAAS,iEAAiE;AAClG,IAAM,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8DAA8D;AAE7G,eAAe,KAAK,MAAc;AAAE,SAAO,YAAY,MAAM,KAAK,MAAM,MAAMC,UAAS,MAAM,MAAM,CAAC,CAAC;AAAG;AAExG,IAAM,OAAO,CAAC,MAAc,QAAqB,SAAS,MAAM,GAAG;AACnE,IAAMC,UAAS,CAAC,MAAcC,MAAK,CAAC,EAAE,KAAK,MAAM,MAAM,MAAM,KAAK;AAElE,IAAM,cAAc,CAAC,SAAiB,MAAe,WAAW,CAAC,IAAI,IAAIC,MAAKC,SAAQ,OAAO,GAAG,CAAC;AAEjG,IAAM,SAAS,CAAC,SAAiB,SAAiBC,UAASD,SAAQ,OAAO,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,GAAG;AACvG,IAAM,aAAa,CAAC,SAAiB,QAAkB,MAAM,YAAY,SAAS,GAAG,IAAID,MAAKC,SAAQ,OAAO,GAAG,cAAc;AAC9H,eAAe,QAAQ,SAAiB,MAAc;AACpD,QAAM,MAAM,YAAY,SAAS,IAAI;AACrC,QAAM,CAAC,OAAO,MAAM,IAAI,QAAQ,MAAMJ,UAAS,GAAG,CAAC;AACnD,SAAO,EAAE,KAAK,OAAO,QAAQ,KAAK,OAAO,SAAS,GAAG,EAAE;AACzD;AAGA,eAAe,OAAO,MAAc,IAA4D,UAAU,OAA4B;AACpI,MAAI;AACF,UAAM,MAAM,MAAMA,UAAS,MAAM,MAAM;AACvC,UAAM,OAAO,YAAY,MAAM,KAAK,MAAM,GAAG,CAAC;AAC9C,UAAM,OAAO,MAAM,MAAM,GAAG,IAAI,CAAC;AACjC,UAAM,YAAY,MAAM,GAAG;AAC3B,UAAM,KAAK,MAAM,IAAI;AACrB,UAAM,UAAU,SAAS,MAAM,IAAI;AACnC,UAAM,OAAO,UAAY,SAAS,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM;AAClG,WAAO,KAAK,GAAG,IAAI;AAAA,UAAa,QAAQ,SAAS,SAAS,QAAQ,KAAK,MAAM,IAAI,UAAU,IAAI,IAAI;AAAA,EACrG,SAAS,GAAG;AAAE,WAAO,KAAK,CAAC;AAAA,EAAG;AAChC;AACA,eAAe,OAAO,MAAc,KAAuC;AACzE,MAAI,MAAMC,QAAO,IAAI,EAAG,OAAM,YAAY,MAAM,MAAMD,UAAS,MAAM,MAAM,CAAC;AAC5E,QAAM,QAAQ,MAAM,GAAG;AACvB,QAAM,KAAK,MAAM,KAAK;AACtB,SAAO,KAAO,SAAS,KAAK,GAAG,KAAK;AACtC;AAEA,SAAS,aAAa,KAAkB,WAA4B;AAClE,QAAM,MAAM,SAAS,KAAK,EAAE,UAAU,CAAC;AACvC,QAAM,SAAS,YAAY,IAAI,OAAO,OAAK,EAAE,cAAc,aAAa,EAAE,UAAU,OAAO,IAAI;AAC/F,MAAI,OAAO,OAAQ,QAAO,UAAU,MAAM;AAC1C,QAAM,IAAI,YAAY,IAAI,WAAW,KAAK,OAAK,EAAE,OAAO,SAAS,IAAI;AACrE,SAAO,IAAI,kBAAkB,EAAE,EAAE,MAAM,EAAE,OAAO,MAAM,YAAY,EAAE,QAAQ,IAAI,EAAE,OAAO,UAAU,EAAE,MAAM;AAC7G;AAEA,IAAM,WAAW,EAAE,eAAeD,GAAE,KAAK,CAAC,WAAW,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,iFAAiF,GAAG,QAAQA,GAAE,KAAK,CAAC,QAAQ,QAAQ,UAAU,MAAM,aAAa,QAAQ,WAAW,CAAC,GAAG,IAAIA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,EAAE;AAC5R,IAAM,QAAQA,GAAE,OAAO;AAAA,EAAE,GAAGA,GAAE,OAAO,EAAE,SAAS,SAAS;AAAA,EAAG,GAAGA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,GAAGA,GAAE,KAAK,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC,CAAC;AAAA,EACjJ,MAAM,KAAK,SAAS,EAAE,SAAS,uKAAuK;AAAE,CAAC;AAE3M,IAAM,WAAW,CAAkC,MACjD,MAAM,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,MAAM,OAAK,OAAO,MAAM,QAAQ,IAAI,EAAE,GAAG,GAAG,GAAI,EAAE,EAAe,IAAI,MAAM,EAAE,IAAI;AAC7G,IAAM,UACJ;AAOF;AAAA,EAAK;AAAA,EAAc;AAAA,EACjB,EAAE,MAAM,MAAM,MAAMA,GAAE,OAAO,GAAG,OAAOA,GAAE,OAAO,EAAE,IAAI,GAAG,QAAQA,GAAE,OAAO,EAAE,IAAI,GAAG,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0EAA0E,EAAE;AAAA,EACrM,OAAO,EAAE,MAAM,MAAM,OAAO,QAAQ,MAAM,MAAM;AAC9C,QAAI;AAAE,aAAO,MAAM,OAAO,MAAQ,UAAU,MAAM,OAAO,QAAQ,KAAK,CAAC;AAAA,IAAG,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAC1G;AAAC;AAEH;AAAA,EAAK;AAAA,EACH;AAAA,EAEA,EAAE,MAAM,MAAM,OAAOA,GAAE,OAAO,EAAE,SAAS,gDAAgD,GAAG,MAAMA,GAAE,OAAO,EAAE,SAAS,GAAG,QAAQA,GAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,SAAS,4DAA4D,GAAG,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE;AAAA,EAC/P,OAAO,EAAE,MAAM,OAAO,MAAM,QAAQ,MAAM,MAAM;AAC9C,QAAI;AACF,YAAM,EAAE,OAAO,QAAQ,IAAI,IAAI,MAAM,QAAQ,MAAM,KAAK;AACxD,aAAO,MAAM,OAAO,MAAQ,aAAa,QAAQ,IAAI,QAAQ,SAAS,EAAE,EAAE,QAAQ,WAAW,EAAE,GAAG,EAAE,KAAK,OAAO,OAAO,GAAG,QAAQ,KAAK,CAAC;AAAA,IAC1I,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAEH,IAAM,cAAcA,GAAE,OAAO;AAAA,EAC3B,KAAKA,GAAE,OAAO,EAAE,SAAS,sCAAsC;AAAA,EAC/D,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAAG,GAAGA,GAAE,OAAO,EAAE,SAAS;AAAA,EAAG,GAAGA,GAAE,OAAO,EAAE,SAAS;AAAA,EAAG,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAC1I,CAAC,EAAE,OAAO;AAEV;AAAA,EAAK;AAAA,EACH;AAAA,EAEA;AAAA,IAAE,MAAM;AAAA,IAAM,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,IAAG,QAAQA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,IACrI,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,WAAW,YAAY,SAAS,EAAE,SAAS;AAAA,EAAE;AAAA,EAC7E,OAAO,EAAE,MAAM,GAAG,MAAM,MAAM,OAAO,MAAM,OAAO,QAAQ,GAAG,KAAK,CAAC;AAAC;AAEtE;AAAA,EAAK;AAAA,EAAW;AAAA,EACd,EAAE,MAAM,MAAM,SAASA,GAAE,QAAQ,EAAE,QAAQ,KAAK,GAAG,MAAMA,GAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE;AAAA,EACpF,OAAO,EAAE,MAAM,SAAS,KAAK,MAAM;AAAE,QAAI;AAAE,YAAM,IAAI,MAAM,KAAK,IAAI;AAAG,aAAO,KAAK,OAAO,KAAK,UAAU,GAAG,MAAM,CAAC,IAAM,SAAS,GAAG,EAAE,QAAQ,CAAC,CAAC;AAAA,IAAG,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAAE;AAAC;AAEvL;AAAA,EAAK;AAAA,EACH;AAAA,EAGA,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,EAAE,SAAS,+DAA+D,EAAE;AAAA,EACvG,OAAO,EAAE,MAAM,GAAG,MAAM;AACtB,QAAI;AACF,YAAM,IAAI,MAAM,KAAK,IAAI;AACzB,YAAM,MAAM,EAAE,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE;AAC/C,UAAI,CAAC,IAAK,OAAM,IAAI,MAAM,uBAAuB,EAAE,uBAAuB,EAAE,YAAY,MAAM,KAAK,EAAE,YAAY,MAAM,GAAG,EAAE,EAAE,IAAI,OAAK,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG,EAAE,YAAY,SAAS,KAAK,aAAQ,EAAE,GAAG;AACnM,aAAO,KAAK,GAAK,mBAAmB,GAAG,GAAG,CAAC;AAAA,EAAK,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC,EAAE;AAAA,IAChF,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAEH;AAAA,EAAK;AAAA,EACH;AAAA,EAKA;AAAA,IAAE,MAAM;AAAA,IAAM,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,GAAGA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAC5E,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAAG,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAAE;AAAA,EAC/E,OAAO,EAAE,MAAM,GAAG,KAAK,MAAM;AAC3B,QAAI;AACF,YAAM,IAAI,MAAM,KAAK,IAAI;AACzB,YAAM,IAAM,WAAW,GAAG,IAAI;AAC9B,YAAM,OAAO,EAAE,aAAa,UAAa,EAAE,IAAI,EAAE,WAAW,oBAAe,EAAE,QAAQ,8BAA8B;AACnH,aAAO,KAAK,GAAG,EAAE,MAAM,MAAM,WAAW,EAAE,MAAM,MAAM,eAAe,EAAE,CAAC,GAAG,EAAE,YAAY,QAAQ,EAAE,SAAS,MAAM,SAAS,GAAG,IAAI;AAAA,EAAK,KAAK,UAAU,CAAC,CAAC,EAAE;AAAA,IAC5J,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAEH;AAAA,EAAK;AAAA,EAAgB;AAAA,EACnB,EAAE,MAAM,KAAK;AAAA,EACb,OAAO,EAAE,KAAK,MAAM;AAAE,QAAI;AAAE,YAAM,OAAO,SAAS,MAAM,KAAK,IAAI,CAAC;AAAG,aAAO,KAAK,KAAK,SAAS,KAAK,KAAK,IAAI,IAAI,+DAA+D;AAAA,IAAG,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAAE;AAAC;AAEtN;AAAA,EAAK;AAAA,EACH;AAAA,EAWA,EAAE,MAAM,MAAM,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sDAAsD,GAAG,KAAKA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,GAAG,SAASA,GAAE,MAAMA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,WAAWA,GAAE,OAAOA,GAAE,OAAOA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,mBAAmBA,GAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE;AAAA,EACzb,OAAO,EAAE,MAAM,GAAG,KAAK,MAAM;AAAE,QAAI;AAAE,aAAO,KAAK,UAAU,SAAS,MAAM,KAAK,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,IAAG,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAAE;AAAC;AAEvI;AAAA,EAAK;AAAA,EACH;AAAA,EAGA;AAAA,IAAE,MAAM;AAAA,IAAM,MAAMA,GAAE,OAAO,EAAE,SAAS,4DAA4D;AAAA,IAClG,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uDAAuD;AAAA,IAC7F,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oFAAoF;AAAA,IAC1H,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,IAAG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,IAAG,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAAE;AAAA,EAC5L,OAAO,EAAE,MAAM,MAAM,OAAO,OAAO,MAAM,QAAQ,MAAM,MAAM;AAC3D,QAAI;AACF,YAAM,IAAI,MAAM,mBAAmB,EAAE,MAAM,YAAY,MAAM,IAAI,GAAG,OAAO,SAAS,YAAY,MAAM,KAAK,GAAG,OAAO,SAAS,YAAY,MAAM,KAAK,GAAG,SAAS,MAAM,MAAM,QAAQ,MAAM,CAAC;AAC5L,YAAM,MAAM,MAAM,OAAO,MAAM,MAAM,EAAE,GAAG,CAAC;AAC3C,UAAI,EAAE,SAAS,OAAQ,KAAI,QAAQ;AAAA;AAAA,IAAkB,EAAE,SAAS,KAAK,MAAM,CAAC;AAC5E,aAAO;AAAA,IACT,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAEH;AAAA,EAAK;AAAA,EACH;AAAA,EAIA,EAAE,MAAM,MAAM,WAAWA,GAAE,OAAO,EAAE,SAAS,2CAA2C,GAAG,WAAWA,GAAE,OAAO,EAAE,QAAQ,QAAQ,EAAE,SAAS,uDAAuD,EAAE;AAAA,EACrM,OAAO,EAAE,MAAM,WAAW,UAAU,MAAM,OAAO,MAAM,OAAK,aAAa,GAAG,YAAY,MAAM,SAAS,GAAG,SAAS,GAAG,IAAI;AAAC;AAE7H;AAAA,EAAK;AAAA,EACH;AAAA,EACA,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,EAAE,SAAS,+CAA+C,GAAG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC,EAAE;AAAA,EACrL,OAAO,EAAE,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO,MAAM,OAAM,MAAK;AAAE,UAAM,EAAE,OAAO,QAAQ,IAAI,IAAI,MAAM,QAAQ,MAAM,IAAI;AAAG,WAAS,aAAa,GAAG,IAAI,EAAE,KAAK,OAAO,QAAQ,QAAQ,WAAW,KAAK,CAAC;AAAA,EAAG,CAAC;AAAC;AAE7M;AAAA,EAAK;AAAA,EACH;AAAA,EACA,EAAE,MAAM,MAAM,QAAQA,GAAE,KAAK,CAAC,QAAQ,QAAQ,CAAC,EAAE,QAAQ,MAAM,GAAG,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,GAAG,IAAIA,GAAE,OAAO,EAAE;AAAA,EAC1H,OAAO,EAAE,MAAM,IAAI,QAAQ,QAAQ,MAAM;AAAE,QAAI;AAAE,aAAO,KAAO,YAAY,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE,QAAQ,QAAQ,CAAC,CAAC;AAAA,IAAG,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAAE;AAAC;AAE3J,IAAM,QAAQA,GAAE,MAAM,CAACA,GAAE,OAAO,EAAE,IAAI,GAAGA,GAAE,OAAO,EAAE,IAAI,GAAGA,GAAE,OAAO,EAAE,IAAI,GAAGA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,qDAAqD;AAC9J,IAAM,WAAWA,GAAE,OAAO,EAAE,WAAWA,GAAE,KAAK,CAAC,UAAU,UAAU,CAAC,EAAE,SAAS,GAAG,aAAaA,GAAE,OAAO,EAAE,SAAS,GAAG,MAAM,MAAM,SAAS,GAAG,WAAWA,GAAE,QAAQ,EAAE,QAAQ,KAAK,GAAG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO;AAE7N;AAAA,EAAK;AAAA,EACH;AAAA,EAGA;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIA,GAAE,OAAO;AAAA,IAAG,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,OAAO,MAAM,SAAS,EAAE,SAAS,EAAE,SAAS,8BAA8B;AAAA,IAClI,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,IAAG,QAAQA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,IAAG,QAAQ,SAAS,SAAS;AAAA,EAAE;AAAA,EAC7H,OAAO,EAAE,MAAM,IAAI,KAAK,GAAG,MAAM,MAAM,WAAW,MAAM,OAAO,GAAG,QAAQ;AACxE,UAAM,MAAM,EAAE,OAAO,KAAK,OAAK,EAAE,OAAO,EAAE;AAC1C,UAAM,OAAO,OAAO,KAAK;AACzB,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,UAAU,EAAE,gDAA2C;AAClF,UAAM,OAAO,MAAM,QAAQ,MAAM,IAAI,EAAE,MAAM,CAAC,MAA6B;AAAE,YAAM,IAAI,MAAM,UAAU,EAAE,kBAAkB,IAAI,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG;AAAA,IAAG,CAAC;AAC9J,UAAM,IAAM,SAAS,GAAG,IAAI,EAAE,GAAG,OAAO,GAAI,MAAM,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,EAAG,GAAG,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,CAAC;AACvH,eAAW,KAAK,EAAE,MAAO,KAAI,CAAC;AAC9B,WAAO,EAAE;AAAA,EACX,CAAC;AAAC;AAEJ;AAAA,EAAK;AAAA,EAAoB;AAAA,EACvB,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,EAAE;AAAA,EAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,OAAO,MAAM,OAAO,YAAY,GAAG,EAAE,CAAC;AAAC;AAEjE;AAAA,EAAK;AAAA,EACH;AAAA,EAEA,EAAE,MAAM,MAAM,OAAOA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,GAAG,GAAGA,GAAE,OAAO,GAAG,GAAGA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,EAAE,SAAS,GAAG,GAAGA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;AAAA,EAC7I,OAAO,EAAE,MAAM,GAAG,EAAE,MAAM,OAAO,MAAM,OAAO,WAAW,GAAG,CAAC,GAAG,IAAI;AAAC;AAIvE;AAAA,EAAK;AAAA,EAAY;AAAA,EACf,EAAE,MAAM,MAAM,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE;AAAA,EACxD,OAAO,EAAE,MAAM,MAAM,MAAM;AACzB,QAAI;AACF,YAAM,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,KAAK,CAAC,CAAC;AACrD,YAAM,KAAK,MAAM,GAAG;AACpB,aAAO,KAAK,YAAY,KAAK,QAAQ,UAAU,IAAI,KAAK,GAAG;AAAA,IAAc,SAAS,GAAG,GAAG,GAAG;AAAA,IAC7F,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAEH;AAAA,EAAK;AAAA,EAAY;AAAA,EAA+F,EAAE,MAAM,KAAK;AAAA,EAC3H,OAAO,EAAE,KAAK,MAAM;AAAE,QAAI;AAAE,YAAM,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,IAAI,CAAC,CAAC;AAAG,YAAM,KAAK,MAAM,GAAG;AAAG,aAAO,KAAK,aAAe,SAAS,GAAG,GAAG,GAAG;AAAA,IAAG,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAAE;AAAC;AAEvL;AAAA,EAAK;AAAA,EAAY;AAAA,EACf,EAAE,MAAM,MAAM,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE;AAAA,EACxD,OAAO,EAAE,MAAM,MAAM,MAAM;AACzB,QAAI;AACF,YAAM,UAAU,MAAM,YAAY,IAAI;AACtC,UAAI,CAAC,QAAQ,OAAQ,QAAO,KAAK,yBAAyB;AAC1D,UAAI,QAAQ,QAAQ,OAAQ,QAAO,KAAK,QAAQ,QAAQ,MAAM,YAAY,QAAQ,WAAW,IAAI,KAAK,GAAG,YAAY;AACrH,YAAM,MAAM,YAAY,MAAM,KAAK,MAAM,MAAMC,UAAS,QAAQ,QAAQ,SAAS,KAAK,GAAG,MAAM,CAAC,CAAC;AACjG,YAAM,QAAQ,SAAS,KAAK,MAAM,KAAK,IAAI,CAAC;AAC5C,aAAO,KAAK,MAAM,SAAS,MAAM,KAAK,IAAI,IAAI,gBAAgB;AAAA,IAChE,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAIH,IAAM,iBAAiBD,GAAE,OAAO,EAAE,GAAGA,GAAE,OAAO,GAAG,GAAGA,GAAE,OAAO,GAAG,UAAUA,GAAE,OAAO,GAAG,QAAQA,GAAE,OAAO,GAAG,QAAQA,GAAE,OAAO,GAAG,QAAQA,GAAE,OAAO,GAAG,QAAQA,GAAE,OAAO,EAAE,CAAC,EAAE,QAAQ;AAChL,IAAM,aAAa;AAAA,EAAE,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAAG,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAAG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sEAAsE;AAAA,EAC5L,SAASA,GAAE,KAAK,CAAC,UAAU,mBAAmB,0BAA0B,WAAW,qBAAqB,CAAC,EAAE,SAAS;AAAA,EAAG,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,eAAe;AAAA,EAAG,WAAW,eAAe,SAAS;AAAE;AAEtN;AAAA,EAAK;AAAA,EAAgB;AAAA,EACnB,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,GAAG,GAAG,YAAY,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,6DAA6D,EAAE;AAAA,EAC1J,OAAO,EAAE,MAAM,MAAM,GAAG,KAAK,MAAM,WAAW,MAAM,CAAC,GAAG,QAAQ;AAC9D,QAAI,OAAS,QAAQ,GAAG,IAAI;AAC5B,eAAW,KAAK,QAAQ,CAAC,GAAG;AAC1B,YAAM,IAAM,WAAW,MAAM,GAAG,KAAK,EAAE;AACvC,aAAO,EAAE;AACT,UAAI,EAAE,SAAS,KAAM,KAAI,SAAS,CAAC,kBAAkB,KAAK,EAAE,0CAA0C,EAAE,MAAM,oDAAoD;AAAA,IACpK;AACA,WAAO;AAAA,EACT,GAAG,IAAI;AAAC;AAEV;AAAA,EAAK;AAAA,EAAmB;AAAA,EACtB,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,GAAG,GAAG,YAAY,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,sEAAsE,EAAE;AAAA,EACvK,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,MAAM,OAAO,MAAM,OAAO,WAAW,GAAG,IAAI,KAAK,CAAC;AAAC;AAEjF;AAAA,EAAK;AAAA,EAAmB;AAAA,EACtB,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,EAAE;AAAA,EAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,WAAW,MAAM,CAAC,GAAG,QAAQ;AACnD,UAAM,SAAS,EAAE,MAAM,KAAK,OAAK,EAAE,OAAO,EAAE,GAAG;AAC/C,UAAM,QAAQ,EAAE,MAAM,OAAO,OAAK,EAAE,SAAS,EAAE,EAAE,IAAI,OAAK,EAAE,EAAE;AAC9D,UAAM,IAAM,WAAW,GAAG,EAAE;AAC5B,QAAI,EAAE,SAAS,KAAM,KAAI,SAAS,EAAE,oBAAoB,MAAM,KAAK,IAAI,CAAC,kBAAkB,MAAM,0CAA0C,EAAE,MAAM,oDAAoD;AACtM,WAAO,EAAE;AAAA,EACX,GAAG,IAAI;AAAC;AAEV;AAAA,EAAK;AAAA,EAAgB;AAAA,EAEnB;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIA,GAAE,OAAO;AAAA,IAAG,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAAG,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAAG,GAAGA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IAAG,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC1M,OAAOA,GAAE,KAAK,CAAC,UAAU,OAAO,YAAY,QAAQ,CAAC,EAAE,SAAS;AAAA,IAAG,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAAE;AAAA,EAClG,OAAO,EAAE,MAAM,YAAY,MAAM,MAAM,GAAG,KAAK,MAAM,WAAW,MAAM,CAAC,GAAG,QAAQ;AAChF,QAAI,OAAO;AACX,UAAM,MAAM,EAAE,MAAM,KAAK,OAAK,EAAE,OAAO,KAAK,EAAE;AAC9C,QAAI,OAAO,SAAS,UAAa,SAAS,IAAI,MAAM;AAClD,YAAM,IAAM,WAAW,GAAG,KAAK,IAAI,IAAI;AACvC,aAAO,EAAE;AACT,UAAI,EAAE,SAAS,KAAM,KAAI,SAAS,KAAK,EAAE,kBAAkB,IAAI,0CAA0C,EAAE,MAAM,oDAAoD;AAAA,IACvK;AACA,WAAS,QAAQ,MAAM,EAAE,GAAG,MAAM,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,OAAU,GAAI,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC,GAAI,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,cAAc,OAAU,EAAG,CAAC;AAAA,EACvN,CAAC;AAAC;AAEJ;AAAA,EAAK;AAAA,EACH;AAAA,EAEA;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIA,GAAE,OAAO;AAAA,IAAG,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,GAAGA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,GAAGA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,IACzK,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAAE;AAAA,EAC5H,OAAO,EAAE,MAAM,GAAG,IAAI,MAAM,OAAO,MAAM,OAAO,cAAc,GAAG,GAAG,CAAC;AAAC;AAIxE,IAAMO,aAAYP,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,GAAGA,GAAE,OAAO,GAAG,GAAGA,GAAE,OAAO,GAAG,GAAGA,GAAE,OAAO,EAAE,CAAC,EAAE,SAAS,qEAAqE;AAC5K,IAAM,YAAYA,GAAE,MAAMA,GAAE,MAAMO,UAAS,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,+EAA+E;AAE7I,eAAe,WAAW,MAAc,IAAyF,UAAU,OAA4B;AACrK,QAAM,QAAkB,CAAC;AACzB,QAAM,MAAM,MAAM,OAAO,MAAM,OAAK,GAAG,GAAG,OAAK,MAAM,KAAK,CAAC,CAAC,GAAG,OAAO;AACtE,SAAO,IAAI,WAAW,CAAC,MAAM,SAAS,MAAM,EAAE,GAAG,KAAK,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,EAAK,IAAI,IAAI,GAAG;AACjG;AACA,IAAM,SAAS,CAAC,KAAkB,OAAe;AAC/C,QAAM,MAAM,IAAI,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE;AACjD,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,uBAAuB,EAAE,GAAG;AACtD,MAAI,IAAI,SAAS,OAAQ,OAAM,IAAI,MAAM,eAAe,EAAE,UAAU,IAAI,IAAI,eAAe,IAAI,SAAS,WAAW,2CAA2C,EAAE,EAAE;AAClK,SAAO;AACT;AAEA;AAAA,EAAK;AAAA,EACH;AAAA,EAKA;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIP,GAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,IAC9D,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,4DAA4D;AAAA,IAC5G,WAAWA,GAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,SAAS,wDAAwD;AAAA,IAChH,QAAQA,GAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,4EAA4E;AAAA,IACnH,gBAAgBA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,IAAI,EAAE,SAAS,kFAAkF;AAAA,IAAG,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,+BAA+B;AAAA,EAAE;AAAA,EACxP,OAAO,EAAE,MAAM,IAAI,GAAG,KAAK,MAAM,WAAW,MAAM,OAAO,GAAG,QAAQ;AAClE,UAAM,MAAM,EAAE,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE;AAC/C,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,uBAAuB,EAAE,GAAG;AACtD,QAAI,IAAI,SAAS,SAAU,OAAM,IAAI,MAAM,eAAe,EAAE,kBAAkB,IAAI,IAAI,wDAAwD;AAC9I,UAAM,QAAQ,EAAE,OAAO,KAAK,OAAK,EAAE,OAAO,IAAI,KAAK;AACnD,QAAI,CAAC,MAAO,OAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,GAAG;AAC1D,QAAI,MAAM,UAAU,MAAM,KAAM,OAAM,IAAI,MAAM,UAAU,MAAM,EAAE,oHAAoH;AACtL,UAAM,MAAM,MAAMC,UAAS,YAAY,MAAM,MAAM,GAAG,CAAC,EACpD,MAAM,CAAC,MAA6B;AAAE,YAAM,IAAI,MAAM,UAAU,MAAM,EAAE,kBAAkB,MAAM,GAAG,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG;AAAA,IAAG,CAAC;AACrI,UAAM,EAAE,SAAS,GAAG,MAAM,IAAI;AAC9B,UAAM,OAAO,iBAAiB,KAAK,MAAM,KAAK;AAG9C,UAAM,UAAU,WAAW,MAAM,KAAK;AACtC,UAAMO,QAAO,gBAAgB,SAAS,KAAK,OAAO,MAAM,OAAO;AAC/D,UAAM,EAAE,KAAK,cAAc,IAAM,cAAc,GAAGA,KAAI;AACtD,QAAI,GAAG,EAAE,SAASA,MAAK,IAAI,SAAS,CAAC,MAAMA,MAAK,UAAU,SAAS,CAAC,WAAWA,MAAK,IAAI,GAAG,QAAQ,SAAS,IAAI,cAAc,QAAQ,MAAM,KAAK,EAAE,GAAG;AACtJ,QAAI,cAAc,OAAQ,KAAI,kCAAkC,cAAc,KAAK,IAAI,CAAC,EAAE;AAC1F,WAAO;AAAA,EACT,CAAC;AAAC;AAEJ;AAAA,EAAK;AAAA,EACH;AAAA,EAKA;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIR,GAAE,OAAO,EAAE,SAAS,oBAAoB;AAAA,IAAG,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,uEAAuE;AAAA,IACxL,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,uIAAuI;AAAA,IACzL,eAAeA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS,kBAAkB;AAAA,EAAE;AAAA,EACjF,OAAO,EAAE,MAAM,IAAI,OAAO,QAAQ,cAAc,MAAM,WAAW,MAAM,CAAC,GAAG,QAAQ;AACjF,UAAM,MAAM,OAAO,GAAG,EAAE;AACxB,UAAM,OAAO,SAAS,GAAG,oBAAI,IAAI,CAAC;AAClC,UAAM,aAAa,SAAS,mBAAmB,GAAG,IAAI,IAAI;AAC1D,UAAM,IAAI,UAAU;AACpB,UAAM,UAAU,YAAY,GAAG,MAAM,KAAK,EAAE,OAAO,YAAY,QAAQ,GAAG,cAAc,CAAC,EAAE;AAC3F,UAAM,SAAS,oBAAI,IAAoB;AACvC,eAAW,QAAQ,QAAS,YAAW,KAAK,IAAI,IAAI,KAAK,IAAI,OAAK,EAAE,IAAI,CAAC,EAAG,QAAO,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC;AAClH,UAAM,EAAE,KAAK,QAAQ,IAAM,WAAW,GAAG,IAAI,OAAO;AACpD,QAAI,GAAG,EAAE,KAAK,QAAQ,MAAM,0BAA0B,aAAa,cAAc;AACjF,eAAW,KAAK,WAAY,KAAI,OAAO,IAAI,CAAC,EAAG,KAAI,KAAK,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,WAAW;AACtF,QAAI,QAAQ,OAAQ,KAAI,0BAA0B,QAAQ,KAAK,IAAI,CAAC,EAAE;AACtE,WAAO;AAAA,EACT,CAAC;AAAC;AAEJ;AAAA,EAAK;AAAA,EACH;AAAA,EAGA;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIA,GAAE,OAAO,EAAE,SAAS,oBAAoB;AAAA,IAAG,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAAG,SAAS,UAAU,SAAS;AAAA,IACjI,KAAKA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAAG,WAAWA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,SAAS;AAAA,IAAG,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,EAAE;AAAA,EACtJ,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,MAAM,WAAW,MAAM,CAAC,GAAG,QAAQ;AAC7D,UAAM,EAAE,KAAK,QAAQ,IAAM,QAAQ,GAAG,OAAO,GAAG,EAAE,EAAE,IAAI,KAAK;AAC7D,QAAI,QAAQ,OAAQ,KAAI,0BAA0B,QAAQ,KAAK,IAAI,CAAC,EAAE;AACtE,WAAO;AAAA,EACT,CAAC;AAAC;AAEJ;AAAA,EAAK;AAAA,EACH;AAAA,EAEA,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,EAAE,SAAS,oBAAoB,GAAG,SAAS,UAAU;AAAA,EAChF,OAAO,EAAE,MAAM,IAAI,QAAQ,MAAM,WAAW,MAAM,CAAC,GAAG,QAAQ;AAC5D,UAAM,EAAE,KAAK,QAAQ,IAAM,WAAW,GAAG,OAAO,GAAG,EAAE,EAAE,IAAI,OAAO;AAClE,QAAI,QAAQ,OAAQ,KAAI,0BAA0B,QAAQ,KAAK,IAAI,CAAC,EAAE;AACtE,WAAO;AAAA,EACT,CAAC;AAAC;AAEJ;AAAA,EAAK;AAAA,EAAyB;AAAA,EAC5B,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,EAAE;AAAA,EAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,OAAO,MAAM,OAAO,iBAAiB,GAAG,EAAE,CAAC;AAAC;AAEtE;AAAA,EAAK;AAAA,EAAmB;AAAA,EACtB,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,EAAE;AAAA,EAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,OAAO,MAAM,OAAO,WAAW,GAAG,EAAE,GAAG,IAAI;AAAC;AAEtE;AAAA,EAAK;AAAA,EAAsB;AAAA,EACzB,EAAE,MAAM,MAAM,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;AAAA,EAChD,OAAO,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,OAAO,aAAa,GAAG,KAAK,CAAC;AAAC;AAGxE,SAAS,QAAQ,GAAY,IAAqB;AAChD,MAAI,OAAO,MAAM,SAAU,QAAO,MAAM;AACxC,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO,EAAE,KAAK,OAAK,QAAQ,GAAG,EAAE,CAAC;AACvD,MAAI,KAAK,OAAO,MAAM,SAAU,QAAO,OAAO,OAAO,CAAC,EAAE,KAAK,OAAK,QAAQ,GAAG,EAAE,CAAC;AAChF,SAAO;AACT;AAEA;AAAA,EAAK;AAAA,EACH;AAAA,EAGA,EAAE,MAAM,MAAM,MAAMA,GAAE,KAAK,CAAC,QAAQ,QAAQ,cAAc,SAAS,YAAY,CAAC,GAAG,IAAIA,GAAE,OAAO,GAAG,IAAIA,GAAE,OAAO,EAAE;AAAA,EAClH,OAAO,EAAE,MAAM,MAAM,IAAI,GAAG,MAAM,WAAW,MAAM,OAAO,GAAG,QAAQ;AACnE,QAAI,MAAME,QAAO,WAAW,IAAI,CAAC,EAAG,KAAI,SAAS,WAAW,IAAI,CAAC,iDAA4C,EAAE,kBAAkB;AACjI,UAAM,OAASO,QAAO,GAAG,MAAM,IAAI,EAAE;AACrC,eAAW,KAAK,KAAK,YAAY;AAC/B,UAAI,EAAE,UAAU,QAAQ,EAAE,OAAO,QAAQ,EAAE,EAAG,KAAI,oBAAoB,EAAE,EAAE,yBAAyB,EAAE,OAAO,IAAI,8BAA8B,EAAE,gEAA2D;AAAA,IAC7M;AACA,WAAO;AAAA,EACT,GAAG,IAAI;AAAC;AAIV,IAAM,kBAAkBT,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,oFAAoF;AAC3J,IAAM,kBAAkBA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,0EAA0E;AACvI,IAAM,YAAY,EAAE,WAAWA,GAAE,OAAO,EAAE,SAAS,GAAG,MAAMA,GAAE,OAAO,EAAE,SAAS,GAAG,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE;AAC/G,IAAM,QAAQ,EAAE,GAAG,WAAW,WAAWA,GAAE,OAAO,EAAE,SAAS,GAAG,WAAWA,GAAE,OAAO,EAAE,SAAS,GAAG,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE;AACnI,IAAM,iBACJ;AAGF;AAAA,EAAK;AAAA,EACH,8vBAIuJ;AAAA,EACvJ;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIA,GAAE,OAAO;AAAA,IAAG,OAAO;AAAA,IAAiB,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,IACvH,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,cAAcA,GAAE,QAAQ,EAAE,SAAS;AAAA,IAChG,YAAYA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,SAAS;AAAA,IAAG,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAAG,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,IAAG,SAASA,GAAE,QAAQ,EAAE,SAAS;AAAA,IAAG,SAASA,GAAE,QAAQ,EAAE,SAAS;AAAA,IAAG,OAAO;AAAA,EAAgB;AAAA,EACpO,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,MAAM,OAAO,MAAM,OAAO,cAAc,GAAG,MAAM,IAAI,KAAK,CAAC;AAAC;AAE1F;AAAA,EAAK;AAAA,EACH,omBAEqN;AAAA,EACrN;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIA,GAAE,OAAO;AAAA,IAAG,OAAO;AAAA,IAAiB,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,IAC3H,OAAOA,GAAE,QAAQ,EAAE,SAAS;AAAA,IAAG,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,IAC9D,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,GAAGA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,GAAGA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC/K,GAAG;AAAA,IAAO,OAAO;AAAA,EAAgB;AAAA,EACnC,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,MAAM,OAAO,MAAM,OAAO,cAAc,GAAG,aAAa,IAAI,KAAK,CAAC;AAAC;AAEjG;AAAA,EAAK;AAAA,EACH,uqBAGwK;AAAA,EACxK;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIA,GAAE,OAAO;AAAA,IAAG,OAAO;AAAA,IAAiB,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,IAC3H,cAAcA,GAAE,KAAK,CAAC,SAAS,SAAS,CAAC,EAAE,SAAS;AAAA,IAAG,aAAaA,GAAE,KAAK,CAAC,UAAU,SAAS,WAAW,cAAc,CAAC,EAAE,SAAS;AAAA,IACpI,YAAYA,GAAE,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,EAAE,SAAS;AAAA,IAChE,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,GAAG;AAAA,IAAW,OAAO;AAAA,EAAgB;AAAA,EACzI,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,MAAM,OAAO,MAAM,OAAO,cAAc,GAAG,QAAQ,IAAI,KAAK,CAAC;AAAC;AAE5F;AAAA,EAAK;AAAA,EACH;AAAA,EACA,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,EAAE;AAAA,EAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,OAAO,MAAM,OAAO,iBAAiB,GAAG,EAAE,CAAC;AAAC;AAEtE;AAAA,EAAK;AAAA,EACH;AAAA,EAKA;AAAA,IAAE,MAAM;AAAA,IAAM,MAAMA,GAAE,OAAO,EAAE,SAAS,+DAA+D;AAAA,IACrG,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,IAAG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+CAA+C;AAAA,IACzL,KAAKA,GAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,IAAG,UAAUA,GAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAAE;AAAA,EAC9D,OAAO,EAAE,MAAM,MAAM,QAAQ,KAAK,UAAU,MAAM,MAAM,WAAW,MAAM,CAAC,GAAG,QAAQ;AACnF,UAAM,IAAM,WAAW,GAAG,MAAM,EAAE,QAAQ,KAAK,UAAU,MAAM,CAAC;AAChE,QAAI,OAAO,IAAI,eAAe,EAAE,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,EAAE,IAAI,MAAM,EAAE,4BAAuB,EAAE,MAAM,WAAW,EAAE,eAAe,MAAM,GAAG,mBAAmB,EAAE,MAAM,oBAAoB;AACjM,WAAO,EAAE;AAAA,EACX,GAAG,IAAI;AAAC;AAEV;AAAA,EAAK;AAAA,EACH;AAAA,EAOA;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIA,GAAE,OAAO,EAAE,SAAS,oBAAoB;AAAA,IAAG,MAAMA,GAAE,OAAO;AAAA,IAC1E,QAAQA,GAAE,MAAMA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,4CAAuC;AAAA,IACrH,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAAG,SAAS,UAAU,SAAS;AAAA,IACtE,QAAQA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAAE;AAAA,EACjC,OAAO,EAAE,MAAM,IAAI,MAAM,QAAQ,UAAU,SAAS,OAAO,MAAM,WAAW,MAAM,CAAC,GAAG,QAAQ;AAC5F,UAAM,EAAE,KAAK,MAAM,QAAQ,IAAM,kBAAkB,GAAG,IAAI,MAAM,EAAE,QAAQ,UAAU,SAAS,OAAO,CAAC;AACrG,UAAM,UAAU,SAAS,OAAO,SAAU,WAAW,SAAS,SAAS,IAAI,QAAS,SAAS;AAC7F,UAAM,MAAM,KAAK,YAAY,KAAK,OAAK,EAAE,OAAO,EAAE;AAClD,QAAI,GAAG,EAAE,kBAAkB,OAAO,WAAW,KAAK,SAAS,UAAU,IAAI,SAAS,aAAa,EAAE,aAAa,IAAI,IAAI,QAAQ,SAAS,aAAa,QAAQ,KAAK,IAAI,CAAC,KAAK,EAAE,EAAE;AAC/K,WAAO;AAAA,EACT,CAAC;AAAC;AAEJ;AAAA,EAAK;AAAA,EACH;AAAA,EAGA;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIA,GAAE,OAAO,EAAE,SAAS,oBAAoB;AAAA,IAAG,IAAIA,GAAE,KAAK,CAAC,UAAU,QAAQ,CAAC;AAAA,IAC1F,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,qEAAgE;AAAA,IAC/G,GAAGA,GAAE,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,4HAA4H;AAAA,EAAE;AAAA,EAC9K,OAAO,EAAE,MAAM,IAAI,IAAI,OAAO,EAAE,MAAM,WAAW,MAAM,CAAC,GAAG,QAAQ;AACjE,UAAM,EAAE,KAAK,QAAQ,IAAM,aAAa,GAAG,IAAI,IAAI,OAAO,CAAC;AAC3D,QAAI,QAAQ,OAAQ,KAAI,0BAA0B,QAAQ,KAAK,IAAI,CAAC,EAAE;AACtE,WAAO;AAAA,EACT,CAAC;AAAC;AAIJ,IAAM,aAAa,OAAO,OAAO,OAAO,EAAE,IAAI,OAAK,GAAG,EAAE,IAAI,KAAK,KAAK,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,IAAI;AAExG;AAAA,EAAK;AAAA,EACH,mfAGsE;AAAA,EACtE;AAAA,IAAE,MAAM;AAAA,IAAM,QAAQA,GAAE,OAAO,EAAE,SAAS,mDAAmD;AAAA,IAAG,QAAQA,GAAE,OAAOA,GAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS,8BAA8B;AAAA,IAC/K,IAAIA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qDAAqD;AAAA,IAAG,SAAS;AAAA,EAAQ;AAAA,EAC9G,OAAO,EAAE,MAAM,QAAQ,QAAQ,IAAI,QAAQ,MAAM,OAAO,MAAM,OAAM,MAAK;AACvE,QAAI,UAAU,QAAS,QAAO,YAAY,GAAG,QAAgC,MAAM;AACnF,UAAM,OAAO,MAAM,YAAY,WAAW,MAAM,OAAO,CAAC,GAAG,KAAK,OAAK,EAAE,SAAS,MAAM;AACtF,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,mBAAmB,MAAM,gBAAgB,OAAO,KAAK,OAAO,EAAE,KAAK,IAAI,CAAC,cAAc,WAAW,MAAM,OAAO,CAAC,GAAG;AAC5I,WAAO,cAAc,GAAG,KAAK,QAAkC,EAAE;AAAA,EACnE,GAAG,IAAI;AAAC;AAEV;AAAA,EAAK;AAAA,EACH;AAAA,EAEA,EAAE,MAAM,MAAM,WAAWA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,EAAE,SAAS,0BAA0B,GAAG,QAAQA,GAAE,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,QAAQ;AAAA,EAC/J,OAAO,EAAE,MAAM,WAAW,MAAM,QAAQ,QAAQ,MAAM;AACpD,QAAI;AACF,YAAM,MAAM,gBAAgB,MAAM,KAAK,IAAI,GAAG,WAAW,MAAM,MAAM;AACrE,YAAM,MAAM,WAAW,MAAM,OAAO;AACpC,YAAM,aAAa,KAAK,GAAG;AAC3B,aAAO,KAAK,YAAY,GAAG;AAAA,EAAK,iBAAiB,GAAG,CAAC,EAAE;AAAA,IACzD,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAEH;AAAA,EAAK;AAAA,EAAoB;AAAA,EACvB,EAAE,MAAM,MAAM,SAAS,QAAQ;AAAA,EAC/B,OAAO,EAAE,MAAM,QAAQ,MAAM;AAC3B,QAAI;AACF,YAAM,MAAM,WAAW,MAAM,OAAO,GAAG,OAAO,MAAM,YAAY,GAAG;AACnE,aAAO,KAAK;AAAA,EAAc,UAAU;AAAA,aAAgB,GAAG;AAAA,EAAO,KAAK,SAAS,KAAK,IAAI,gBAAgB,EAAE,KAAK,IAAI,IAAI,QAAQ,EAAE;AAAA,IAChI,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAEH;AAAA,EAAK;AAAA,EAAkB;AAAA,EACrB,EAAE,MAAM,MAAM,QAAQA,GAAE,OAAO,GAAG,SAAS,QAAQ;AAAA,EACnD,OAAO,EAAE,MAAM,QAAQ,QAAQ,MAAM;AACnC,QAAI;AACF,UAAI,UAAU,SAAS;AAAE,cAAM,IAAI,QAAQ,MAA8B;AAAG,eAAO,KAAK,KAAK,UAAU,EAAE,SAAS,MAAM,MAAM,EAAE,MAAM,UAAU,EAAE,SAAS,CAAC,CAAC;AAAA,MAAG;AAChK,YAAM,OAAO,MAAM,YAAY,WAAW,MAAM,OAAO,CAAC,GAAG,KAAK,OAAK,EAAE,SAAS,MAAM;AACtF,UAAI,CAAC,IAAK,OAAM,IAAI,MAAM,mBAAmB,MAAM,GAAG;AACtD,aAAO,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,IACjC,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAEH;AAAA,EAAK;AAAA,EACH,uQAEsD;AAAA,EACtD,EAAE,MAAM,MAAM,WAAWA,GAAE,OAAO,GAAG,GAAG,UAAU,MAAMA,GAAE,MAAM,KAAK,GAAG,OAAOA,GAAE,QAAQ,EAAE,QAAQ,KAAK,GAAG,UAAUA,GAAE,OAAO,EAAE,SAAS,GAAG,MAAMA,GAAE,QAAQ,EAAE,SAAS,EAAE;AAAA,EACzK,OAAO,EAAE,MAAM,WAAW,QAAQ,IAAI,MAAM,eAAe,MAAM,OAAO,UAAU,KAAK,MAAM,OAAO,MAAM,OAAK;AAC7G,QAAI,IAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,IAAI,MAAM,cAAc,GAA0B,KAAK,IAAI,QAAQ,GAAG,UAAU,EAAE,MAAM,CAAC;AACnI,QAAI,SAAS,OAAW,KAAI,EAAE,GAAG,GAAG,YAAY,EAAE,WAAW,IAAI,OAAM,EAAE,OAAO,YAAY,EAAE,GAAG,GAAG,KAAK,IAAI,CAAE,EAAE;AACjH,WAAO;AAAA,EACT,CAAC;AAAC;AAEJ;AAAA,EAAK;AAAA,EACH,qGAAqG;AAAA,EACrG,EAAE,MAAM,MAAM,WAAWA,GAAE,OAAO,GAAG,QAAQA,GAAE,MAAMA,GAAE,OAAO,EAAE,GAAG,UAAU,MAAMA,GAAE,MAAM,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,OAAOA,GAAE,QAAQ,EAAE,QAAQ,KAAK,GAAG,UAAUA,GAAE,OAAO,EAAE,SAAS,GAAG,MAAMA,GAAE,QAAQ,EAAE,SAAS,EAAE;AAAA,EAC/M,OAAO,EAAE,MAAM,WAAW,QAAQ,OAAO,UAAU,KAAK,MAAM,OAAO,MAAM,OAAK;AAC9E,QAAI,IAAI;AACR,eAAW,KAAK,OAAQ,KAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,eAAe,EAAE,cAAc,GAA0B,EAAE,KAAK,IAAI,QAAQ,GAAG,UAAU,EAAE,MAAM,CAAC;AAClM,QAAI,SAAS,OAAW,KAAI,EAAE,GAAG,GAAG,YAAY,EAAE,WAAW,IAAI,OAAM,EAAE,OAAO,YAAY,EAAE,GAAG,GAAG,KAAK,IAAI,CAAE,EAAE;AACjH,WAAO;AAAA,EACT,CAAC;AAAC;AAEJ;AAAA,EAAK;AAAA,EACH;AAAA,EAQA;AAAA,IAAE,MAAM;AAAA,IAAM,MAAMA,GAAE,OAAO;AAAA,IAAG,GAAGA,GAAE,OAAO;AAAA,IAAG,GAAGA,GAAE,OAAO;AAAA,IACzD,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,GAAGA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IAAG,MAAM,KAAK,SAAS;AAAA,EAAE;AAAA,EAC3F,OAAO,EAAE,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK,MAAM,WAAW,MAAM,CAAC,GAAG,QAAQ;AACpE,UAAM,EAAE,KAAK,OAAO,YAAY,QAAQ,IAAI,IAAM,QAAQ,GAAG,MAAM,GAAG,GAAG,IAAI;AAC7E,QAAI,aAAa,GAAG,IAAI,qBAAqB,UAAU,8BAAyB,KAAK,cAAc,GAAG,KAAK,WAAM,CAAC,KAAK,CAAC,EAAE;AAG1H,QAAI,GAAG,IAAI,cAAc,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,QAAQ,KAAK,SAAS,UAAU,KAAK,KAAK,CAAC,KAAK,EAAE,EAAE;AACnJ,WAAO;AAAA,EACT,CAAC;AAAC;AAEJ;AAAA,EAAK;AAAA,EACH;AAAA,EAKA;AAAA,IAAE,MAAM;AAAA,IAAM,WAAWA,GAAE,OAAO;AAAA,IAAG,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,CAAC;AAAA,IAAG,IAAIA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,CAAC;AAAA,IAClG,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IAAG,SAASA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAAE;AAAA,EAClF,OAAO,EAAE,MAAM,WAAW,MAAM,IAAI,OAAO,QAAQ,MAAM,WAAW,MAAM,CAAC,GAAG,QAAQ;AACpF,UAAM,EAAE,KAAK,QAAQ,OAAO,MAAM,IAAM,WAAW,GAAG,WAAW,MAAM,IAAI,EAAE,OAAO,QAAQ,CAAC;AAC7F,QAAI,UAAU,MAAM,SAAS,WAAW,IAAI,KAAK,GAAG,GAAG,QAAQ,YAAY,KAAK,OAAO,SAAS,KAAK,EAAE,GAAG,UAAU,eAAe,EAAE,GAAG,MAAM,SAAS,mBAAmB,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,EAAE;AAInM,UAAM,OAAO,EAAE,WAAW,KAAK,OAAK,EAAE,OAAO,SAAS;AACtD,QAAI,QAAQ,MAAM,KAAK,CAAC,KAAK,KAAM,KAAI,IAAI,SAAS,0FAA0F;AAG9I,QAAI,MAAM,OAAQ,KAAI,4FAA4F,MAAM,KAAK,IAAI,CAAC,EAAE;AACpI,WAAO;AAAA,EACT,CAAC;AAAC;AAEJ;AAAA,EAAK;AAAA,EACH;AAAA,EAEA,EAAE,MAAM,MAAM,WAAWA,GAAE,OAAO,GAAG,GAAG,UAAU,WAAWA,GAAE,OAAO,EAAE,SAAS,GAAG,QAAQA,GAAE,OAAO,EAAE,SAAS,GAAG,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE;AAAA,EAC/J,OAAO,EAAE,MAAM,WAAW,QAAQ,IAAI,MAAM,GAAG,IAAI,MAAM,OAAO,MAAM,OAAO,YAAY,GAAG,WAAW,EAAE,QAAQ,IAAI,KAAK,GAA0B,GAAG,CAAC;AAAC;AAE3J;AAAA,EAAK;AAAA,EAAqB;AAAA,EACxB;AAAA,IAAE,MAAM;AAAA,IAAM,IAAIA,GAAE,OAAO;AAAA,IAAG,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAAG,MAAMA,GAAE,QAAQ,EAAE,SAAS;AAAA,IACnG,QAAQA,GAAE,MAAMA,GAAE,OAAO,EAAE,GAAGA,GAAE,OAAO,EAAE,YAAY,GAAG,MAAMA,GAAE,OAAO,GAAG,SAASA,GAAE,OAAOA,GAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,SAAS;AAAA,IAAG,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAAE;AAAA,EACpK,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,MAAM,OAAO,MAAM,OAAO,aAAa,GAAG,IAAI,KAAK,CAAC;AAAC;AAEnF;AAAA,EAAK;AAAA,EAAmB;AAAA,EACtB,EAAE,MAAM,MAAM,WAAWA,GAAE,OAAO,GAAG,GAAG,UAAU,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;AAAA,EACpF,OAAO,EAAE,MAAM,WAAW,QAAQ,IAAI,MAAM,OAAAU,OAAM,MAAM,OAAO,MAAM,OAAO,WAAW,GAAG,WAAW,EAAE,QAAQ,IAAI,KAAK,GAA0BA,MAAK,CAAC;AAAC;AAE3J;AAAA,EAAK;AAAA,EAAwB;AAAA,EAC3B,EAAE,MAAM,MAAM,IAAIV,GAAE,OAAO,EAAE;AAAA,EAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,OAAO,MAAM,OAAO,gBAAgB,GAAG,EAAE,GAAG,IAAI;AAAC;AAI3E;AAAA,EAAK;AAAA,EAAyB;AAAA,EAC5B,EAAE,MAAM,KAAK;AAAA,EAAG,OAAO,EAAE,KAAK,MAAM,OAAO,MAAM,gBAAgB;AAAC;AACpE;AAAA,EAAK;AAAA,EAAwB;AAAA,EAC3B,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,GAAG,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;AAAA,EAAG,OAAO,EAAE,MAAM,IAAI,MAAM,MAAM,OAAO,MAAM,OAAK,gBAAgB,GAAG,IAAI,KAAK,CAAC;AAAC;AACpJ;AAAA,EAAK;AAAA,EAAsB;AAAA,EACzB,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,GAAG,YAAYA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,CAAC,GAAG,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,GAAG,QAAQA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE;AAAA,EACpM,OAAO,EAAE,MAAM,IAAI,YAAY,UAAU,OAAO,MAAM,OAAO,MAAM,OAAK,cAAc,GAAG,IAAI,YAAY,UAAU,MAAM,CAAC;AAAC;AAC7H;AAAA,EAAK;AAAA,EAAmB;AAAA,EACtB,EAAE,MAAM,MAAM,IAAIA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,GAAG,UAAUA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,SAAS,GAAG,QAAQA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,GAAGA,GAAE,OAAO,EAAE,SAAS,GAAGA,GAAE,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE;AAAA,EACjN,OAAO,EAAE,MAAM,IAAI,MAAM,UAAU,OAAO,MAAM,OAAO,MAAM,OAAK,WAAW,GAAG,IAAI,MAAM,UAAU,MAAM,CAAC;AAAC;AAC9G;AAAA,EAAK;AAAA,EAAsB;AAAA,EACzB,EAAE,MAAM,MAAM,WAAWA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,GAAG,QAAQA,GAAE,OAAO,GAAG,GAAGA,GAAE,OAAO,EAAE,YAAY,EAAE;AAAA,EACvG,OAAO,EAAE,MAAM,WAAW,MAAM,QAAQ,EAAE,MAAM,OAAO,MAAM,OAAK,aAAa,GAAG,WAAW,MAAM,QAAQ,CAAC,CAAC;AAAC;AAChH;AAAA,EAAK;AAAA,EAAsB;AAAA,EACzB,EAAE,MAAM,MAAM,WAAWA,GAAE,OAAO,GAAG,QAAQA,GAAE,OAAO,GAAG,YAAYA,GAAE,KAAK,CAAC,YAAY,KAAK,GAAG,CAAC,EAAE,QAAQ,UAAU,GAAG,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAG,GAAG,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,GAAG,MAAMA,GAAE,OAAO,EAAE,QAAQ,GAAG,GAAG,KAAKA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,GAAG,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;AAAA,EACvX,OAAO,EAAE,MAAM,WAAW,GAAG,KAAK,MAAM,OAAO,MAAM,OAAK,cAAc,GAAG,WAAW,IAAI,CAAC;AAAC;AAE9F;AAAA,EAAK;AAAA,EACH;AAAA,EAGA;AAAA,IAAE,MAAM;AAAA,IAAM,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,KAAKA,GAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,IAAG,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IAAG,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAClJ,aAAaA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAAG,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,gBAAgBA,GAAE,OAAOA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IAAG,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IAAG,cAAcA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAAG,WAAWA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAAG,QAAQA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,GAAGA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA,IAC9V,OAAOA,GAAE,OAAO,EAAE,QAAQ,GAAG,EAAE,SAAS,0BAA0B;AAAA,IAAG,cAAcA,GAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,IAAG,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,EAAE;AAAA,EACtL,OAAO,EAAE,MAAM,QAAQ,WAAW,GAAG,KAAK,MAAM;AAC9C,QAAI;AACF,YAAM,MAAM,MAAMC,UAAS,MAAM,MAAM;AACvC,YAAM,MAAM,MAAM,KAAK,MAAM,GAAG,CAAC;AACjC,YAAM,IAAI,MAAM,cAAc,KAAK,EAAE,WAAWI,SAAQ,IAAI,GAAG,GAAG,KAAK,CAAC;AACxE,UAAI,OAAQ,OAAMM,WAAU,QAAQ,EAAE,KAAK;AAC3C,UAAI,WAAW;AACb,cAAM,EAAE,OAAAC,OAAM,IAAI,MAAM,OAAO,kBAAkB;AACjD,cAAMA,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,cAAM,SAAS,EAAE,OAAO,IAAI,CAAC,OAAO,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,QAAQ,QAAQ,OAAO,KAAK,EAAE,EAAE;AAChH,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,OAAMD,WAAUP,MAAK,WAAW,OAAO,CAAC,EAAE,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC;AACpG,cAAM,WAA2B;AAAA,UAAE,SAAS;AAAA,UAAG,SAAS,OAAO,GAAG;AAAA,UAAG,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,UAAG,UAAU,EAAE;AAAA,UAAU,WAAW,KAAK,aAAa;AAAA,UAAM,aAAa,KAAK;AAAA,UAAa,OAAO,KAAK;AAAA,UAAO,OAAO,EAAE;AAAA,UAAO;AAAA,UACpO,QAAQ,EAAE,YAAY,KAAK,YAAY,cAAc,KAAK,cAAc,WAAW,KAAK,WAAW,YAAY,KAAK,YAAY,gBAAgB,KAAK,kBAAkB,CAAC,GAAG,QAAQ,KAAK,OAAO;AAAA,QAAE;AACnM,cAAMO,WAAUP,MAAK,WAAW,eAAe,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,MACrF;AACA,aAAO,EAAE,MAAM,GAAG,EAAE,MAAM,MAAM,aAAa,EAAE,KAAK,IAAI,EAAE,MAAM,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;AAAA,EAAM,aAAa,KAAK,KAAK,SAAS,CAAC,IAAI,OAAO,EAAE,MAAM;AAAA,IACtJ,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAEH;AAAA,EAAK;AAAA,EACH;AAAA,EACA,EAAE,MAAM,MAAM,QAAQJ,GAAE,OAAO,EAAE,SAAS,uCAAuC,GAAG,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE;AAAA,EAClK,OAAO,EAAE,MAAM,QAAQ,SAAS,QAAQ,MAAM;AAC5C,QAAI;AACF,YAAM,MAAM,YAAY,MAAM,MAAM;AACpC,YAAM,MAAM,MAAM,WAAW,MAAM,KAAK,IAAI,GAAGK,SAAQ,IAAI,GAAG,KAAK,EAAE,SAAS,QAAQ,CAAC;AACvF,YAAM,CAAC,GAAG,CAAC,IAAI,QAAQ,MAAMJ,UAASG,MAAK,KAAK,WAAW,CAAC,CAAC;AAC7D,aAAO,KAAK,UAAKA,MAAK,KAAK,UAAU,CAAC;AAAA,SAAOA,MAAK,KAAK,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,MAAM,UAAU;AAAA,IAChH,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAGH;AAAA,EAAK;AAAA,EAAoB;AAAA,EACvB,EAAE,MAAM,MAAM,WAAWJ,GAAE,OAAO,GAAG,SAASA,GAAE,OAAO,GAAG,KAAKA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,YAAYA,GAAE,OAAO,EAAE,SAAS,GAAG,YAAYA,GAAE,OAAO,EAAE,SAAS,GAAG,gBAAgBA,GAAE,OAAOA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE;AAAA,EAC5Q,OAAO,EAAE,MAAM,SAAS,GAAG,KAAK,MAAM;AACpC,QAAI;AAAE,YAAM,SAAS,MAAM,YAAY,MAAM,KAAK,IAAI,GAAG,EAAE,WAAWK,SAAQ,IAAI,GAAG,SAAS,YAAY,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC;AAAG,aAAO,KAAK,GAAG,YAAY,MAAM,OAAO,CAAC,KAAK,OAAO,MAAM,YAAY,OAAO,GAAG,SAAS,OAAO,QAAQ,GAAG;AAAA,IAAG,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EACrR;AAAC;AAGH;AAAA,EAAK;AAAA,EAAqB;AAAA,EACxB,EAAE,MAAM,MAAM,WAAWL,GAAE,OAAO,GAAG,WAAWA,GAAE,OAAO,EAAE,SAAS,GAAG,OAAOA,GAAE,MAAMA,GAAE,OAAO,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,aAAaA,GAAE,QAAQ,EAAE,SAAS,EAAE;AAAA,EAC5J,OAAO,EAAE,MAAM,WAAW,GAAG,SAAS,MAAM;AAC1C,QAAI;AACF,YAAM,OAAOK,SAAQQ,eAAc,YAAY,GAAG,CAAC;AACnD,YAAM,SAAST,MAAK,MAAM,oBAAoB,GAAG,UAAUA,MAAK,MAAM,YAAY;AAClF,YAAM,WAAW,MAAM,qBAAqB,MAAM,WAAW,EAAE,GAAG,UAAU,UAAU,MAAMF,QAAO,MAAM,IAAI,SAAS,QAAQ,CAAC;AAC/H,aAAO,KAAK,YAAY,SAAS,OAAO,MAAM,IAAI,SAAS,MAAM,MAAM,kDAAkD;AAAA,IAC3H,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAChC;AAAC;AAGH;AAAA,EAAK;AAAA,EAAiB;AAAA,EACpB,EAAE,MAAM,MAAM,QAAQ,WAAW;AAAA,EAAG,OAAO,EAAE,MAAM,OAAO,MAAM;AAC9D,QAAI;AAAE,YAAM,SAAS,SAAS,MAAM,KAAK,IAAI,GAAG,MAAM;AAAG,aAAO,EAAE,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,KAAK;AAAA,IAAG,SAAS,GAAG;AAAE,aAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EAClK;AAAC;;;AHvwBH,IAAM,QAAgC,EAAE,SAAS,4BAA4B,OAAO,mBAAmB,QAAQ,YAAY,QAAQ,oBAAoB,SAAS,oBAAoB,QAAQ,aAAa,QAAQ,cAAc,SAAS,aAAa;AAKrP,eAAsB,kBAAkB,MAA+E;AACrH,QAAMY,QAAOC,SAAQ,KAAK,IAAI;AAC9B,QAAM,SAASA,SAAQ,KAAK,UAAUC,eAAc,IAAI,IAAI,SAAS,YAAY,GAAG,CAAC,CAAC;AACtF,QAAM,SAAS,CAAC,QAAgB;AAAE,UAAM,MAAMD,SAAQD,OAAM,GAAG;AAAG,WAAO,QAAQA,SAAQ,IAAI,WAAWA,QAAO,GAAG,IAAI,MAAM;AAAA,EAAW;AACvI,QAAM,UAAU,OAAO,QAAgB;AAAE,QAAI;AAAE,YAAM,IAAI,MAAMG,MAAK,GAAG;AAAG,aAAO,GAAG,EAAE,OAAO,IAAI,EAAE,IAAI;AAAA,IAAI,QAAQ;AAAE,aAAO;AAAA,IAAW;AAAA,EAAE;AACzI,QAAM,UAAU,OAAO,QAAgB,YAAY,MAAM,KAAK,MAAM,MAAMC,WAAS,KAAK,MAAM,CAAC,CAAC;AAQhG,QAAM,YAAY,OAAO,QAAgB;AACvC,QAAI,IAAI,MAAM,QAAQ,GAAG;AACzB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,MAAM,MAAM,QAAQ,GAAG;AAC7B,YAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,UAAI,UAAU,EAAG,QAAO,EAAE,KAAK,SAAS,EAAE;AAC1C,UAAI;AAAA,IACN;AACA,WAAO,EAAE,KAAK,MAAM,QAAQ,GAAG,GAAG,SAAS,EAAE;AAAA,EAC/C;AACA,QAAM,OAAO,CAAC,KAAqB,QAAgBC,UAAkB;AAAE,QAAI,UAAU,QAAQ,EAAE,gBAAgB,mBAAmB,CAAC;AAAG,QAAI,IAAI,KAAK,UAAUA,KAAI,CAAC;AAAA,EAAG;AAKrK,MAAI,eAAe,oBAAI,IAAY;AACnC,QAAM,SAAS,CAAC,QAAyB,aAAa,IAAI,OAAO,IAAI,QAAQ,QAAQ,EAAE,EAAE,YAAY,CAAC;AAGtG,QAAM,UAAU,oBAAI,IAAiC;AAErD,QAAM,WAAW,oBAAI,IAAqB;AAC1C,WAAS,YAAY,KAAa;AAChC,QAAI,SAAS,IAAI,GAAG,EAAG;AACvB,UAAM,QAAiB,EAAE,GAAG,QAAQC,SAAQ,GAAG,GAAG,EAAE,YAAY,MAAM,GAAG,CAAC,IAAI,SAAS;AAAE,UAAI,QAAQ,SAASC,UAAS,GAAG,EAAG;AAAQ,eAAS;AAAA,IAAG,CAAC,GAAG,MAAM,GAAG;AAC9J,UAAM,WAAW,MAAM;AAAE,mBAAa,MAAM,KAAK;AAAG,YAAM,QAAQ,WAAW,YAAY;AACvF,cAAM,IAAI,MAAM,QAAQ,GAAG;AAC3B,YAAI,MAAM,MAAM,KAAM;AACtB,cAAM,OAAO;AACb,mBAAW,OAAO,QAAQ,IAAI,GAAG,KAAK,CAAC,EAAG,KAAI,MAAM;AAAA,QAAyB,KAAK,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;AAAA;AAAA,CAAM;AAAA,MACnH,GAAG,EAAE;AAAA,IAAG;AACR,YAAQ,GAAG,EAAE,KAAK,OAAK;AAAE,YAAM,OAAO;AAAA,IAAG,CAAC;AAC1C,aAAS,IAAI,KAAK,KAAK;AAAA,EACzB;AAEA,iBAAe,KAAK,KAAwC;AAC1D,UAAM,SAAmB,CAAC;AAAG,qBAAiB,KAAK,IAAK,QAAO,KAAK,CAAW;AAC/E,WAAO,OAAO,SAAS,KAAK,MAAM,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC;AAAA,EAC/E;AAEA,QAAM,OAAO,oBAAI,IAAI,CAAC,gBAAgB,gBAAgB,QAAQ,MAAM,CAAC;AAErE,iBAAe,WAAsE;AACnF,UAAM,MAAwD,CAAC;AAC/D,UAAM,OAAO,OAAO,QAAgB;AAClC,iBAAW,KAAK,MAAMC,SAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC3D,YAAI,EAAE,YAAY,GAAG;AAAE,cAAI,CAAC,KAAK,IAAI,EAAE,IAAI,EAAG,OAAM,KAAKC,OAAK,KAAK,EAAE,IAAI,CAAC;AAAG;AAAA,QAAU;AACvF,YAAI,EAAE,SAAS,WAAY;AAC3B,cAAM,MAAMA,OAAK,KAAK,EAAE,IAAI;AAC5B,YAAI,OAAO;AACX,YAAI;AAAE,iBAAO,OAAO,KAAK,MAAM,MAAML,WAAS,KAAK,MAAM,CAAC,EAAE,MAAM,QAAQ,GAAG;AAAA,QAAG,QAAQ;AAAA,QAAiD;AACzI,YAAI,KAAK,EAAE,KAAKM,UAASV,OAAM,GAAG,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG,GAAG,MAAM,UAAU,MAAMG,MAAK,GAAG,GAAG,QAAQ,CAAC;AAAA,MACtG;AAAA,IACF;AACA,UAAM,KAAKH,KAAI;AACf,WAAO,IAAI,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AAAA,EACjD;AAEA,iBAAe,UAAU,QAA4E;AACnG,UAAM,MAAMM,SAAQ,MAAM,GAAG,MAAyD,CAAC;AACvF,eAAW,MAAM,MAAME,SAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG,OAAO,CAAAG,OAAKA,GAAE,OAAO,KAAK,UAAU,KAAKA,GAAE,IAAI,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,GAAG;AAC5J,YAAM,KAAK,MAAM,KAAKF,OAAK,KAAK,EAAE,IAAI,CAAC;AACvC,UAAI;AACF,cAAM,OAAO,OAAO,MAAM,EAAE;AAC5B,cAAM,EAAE,UAAU,IAAI,MAAM,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC;AAClD,YAAI,YAAY,GAAI;AACpB,cAAM,CAAC,OAAO,MAAM,IAAI,QAAQ,IAAI;AACpC,YAAI,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,OAAO,CAAC;AAAA,MAC1C,QAAQ;AAAA,MAAwC,UAAE;AAAU,cAAM,GAAG,MAAM;AAAA,MAAG;AAAA,IAChF;AACA,WAAO;AAAA,EACT;AACA,QAAM,aAAa,KAAK,OAAO;AAE/B,iBAAe,MAAM,KAAsB,KAA0C;AACnF,UAAM,SAAmB,CAAC;AAAG,QAAI,IAAI;AACrC,qBAAiB,KAAK,KAAK;AAAE,WAAM,EAAa;AAAQ,UAAI,IAAI,IAAK,QAAO;AAAW,aAAO,KAAK,CAAW;AAAA,IAAG;AACjH,WAAO,OAAO,OAAO,MAAM;AAAA,EAC7B;AAEA,QAAM,SAAS,aAAa,OAAO,KAAK,QAAQ;AAC9C,QAAI;AACF,UAAI,CAAC,OAAO,GAAG,EAAG,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,0BAA0B,IAAI,QAAQ,QAAQ,EAAE,6DAAwD,CAAC;AACxK,YAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU;AAC9C,UAAI,IAAI,aAAa,KAAK;AAAE,YAAI,UAAU,KAAK,EAAE,UAAU,iBAAiB,IAAI,OAAO,CAAC;AAAG,eAAO,IAAI,IAAI;AAAA,MAAG;AAC7G,UAAI,IAAI,SAAS,WAAW,OAAO,EAAG,QAAO,MAAM,IAAI,KAAK,KAAK,GAAG;AAIpE,YAAM,SAAS,oBAAI,IAAI,CAAC,gBAAgB,mBAAmB,uBAAuB,oBAAoB,sBAAsB,CAAC;AAC7H,YAAM,MAAM,IAAI,SAAS,WAAW,OAAO,IAAI,OAAO,mBAAmB,IAAI,SAAS,MAAM,CAAC,CAAC,CAAC,IAC3F,OAAO,IAAI,IAAI,QAAQ,IAAIA,OAAK,QAAQ,IAAI,QAAQ,IACpD;AACJ,UAAI,CAAC,KAAK;AAAE,YAAI,UAAU,GAAG;AAAG,eAAO,IAAI,IAAI,WAAW;AAAA,MAAG;AAC7D,UAAI;AAAE,cAAM,OAAO,MAAML,WAAS,GAAG;AAAG,YAAI,UAAU,KAAK,EAAE,gBAAgB,MAAMQ,SAAQ,GAAG,CAAC,KAAK,2BAA2B,CAAC;AAAG,YAAI,IAAI,IAAI;AAAA,MAAG,QAC5I;AAAE,YAAI,UAAU,GAAG;AAAG,YAAI,IAAI,WAAW;AAAA,MAAG;AAAA,IACpD,SAAS,GAAG;AAGV,UAAI,IAAI,aAAa;AAAE,gBAAQ,MAAM,WAAW,IAAI,MAAM,IAAI,IAAI,GAAG,KAAM,EAAY,OAAO,EAAE;AAAG,YAAI,IAAI;AAAG;AAAA,MAAQ;AACtH,WAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,UAAW,EAAY,OAAO,GAAG,CAAC;AAAA,IAC1E;AAAA,EACF,CAAC;AAED,iBAAe,IAAI,KAAU,KAAsB,KAAqB;AACtE,UAAM,QAAQ,CAAC,QAAuB;AAAE,UAAI,CAAC,IAAK,QAAO;AAAW,aAAO,OAAO,GAAG;AAAA,IAAG;AACxF,QAAI,IAAI,aAAa,YAAY;AAC/B,YAAM,MAAM,MAAM,IAAI,aAAa,IAAI,KAAK,CAAC;AAAG,UAAI,CAAC,IAAK,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,mBAAmB,CAAC;AAC3H,aAAO,KAAK,KAAK,KAAK,MAAM,UAAU,GAAG,CAAC;AAAA,IAC5C;AACA,QAAI,IAAI,aAAa,eAAe;AAClC,YAAM,MAAM,MAAM,IAAI,aAAa,IAAI,KAAK,CAAC;AAAG,UAAI,CAAC,KAAK;AAAE,YAAI,UAAU,GAAG;AAAG,eAAO,IAAI,IAAI;AAAA,MAAG;AAGlG,UAAI,CAAE,MAAMT,MAAK,GAAG,EAAE,KAAK,MAAM,MAAM,MAAM,KAAK,EAAI,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,UAAU,IAAI,aAAa,IAAI,KAAK,CAAC,yBAAyBH,KAAI,GAAG,CAAC;AACzK,kBAAY,GAAG;AACf,UAAI,UAAU,KAAK,EAAE,gBAAgB,qBAAqB,iBAAiB,YAAY,YAAY,aAAa,CAAC;AACjH,UAAI,MAAM;AAAA;AAAA,CAAiB;AAC3B,OAAC,QAAQ,IAAI,GAAG,KAAK,QAAQ,IAAI,KAAK,oBAAI,IAAI,CAAC,EAAE,IAAI,GAAG,GAAI,IAAI,GAAG;AACnE,YAAM,KAAK,YAAY,MAAM,IAAI,MAAM,UAAU,GAAG,IAAK;AACzD,UAAI,GAAG,SAAS,MAAM;AAAE,sBAAc,EAAE;AAAG,gBAAQ,IAAI,GAAG,GAAG,OAAO,GAAG;AAAA,MAAG,CAAC;AAC3E;AAAA,IACF;AACA,QAAI,IAAI,SAAS,WAAW,YAAY,KAAK,IAAI,WAAW,QAAQ;AAGlE,YAAM,KAAK,OAAO,IAAI,QAAQ,cAAc,KAAK,EAAE,EAAE,YAAY;AACjE,UAAI,CAAC,GAAG,WAAW,kBAAkB,EAAG,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,sEAAsE,IAAI,QAAQ,cAAc,KAAK,MAAM,KAAK,CAAC;AACtM,YAAM,EAAE,KAAK,MAAM,YAAY,IAAK,MAAM,KAAK,GAAG;AAClD,YAAM,MAAM,MAAM,OAAO,IAAI;AAAG,UAAI,CAAC,IAAK,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,mBAAmB,CAAC;AAC3G,kBAAY,GAAG;AACf,aAAO,MAAM,aAAa,KAAK,YAAY;AAGzC,YAAI,gBAAgB,UAAc,MAAM,QAAQ,GAAG,MAAO,aAAa;AACrE,gBAAM,KAAK,MAAM,UAAU,GAAG;AAC9B,iBAAO,KAAK,KAAK,KAAK;AAAA,YAAE,SAAS;AAAA,YAAM,SAAS,GAAG;AAAA,YAAS,KAAK,GAAG;AAAA,YAClE,MAAM,4CAA4C,WAAW,WAAW,GAAG,OAAO;AAAA,UAAyB,CAAC;AAAA,QAChH;AACA,cAAM,IAAI,MAAM,SAAS,IAAI,SAAS,MAAM,EAAE,GAAG,EAAE,GAAI,QAAQ,CAAC,GAAI,MAAM,IAAI,CAAC;AAC/E,eAAO,KAAK,KAAK,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,EAAE,KAAK,OAAO,EAAE,OAAO,SAAS,QAAQ,GAAG,SAAS,EAAE,SAAS,SAAS,MAAM,QAAQ,GAAG,EAAE,CAAC;AAAA,MACzI,CAAC;AAAA,IACH;AACA,QAAI,IAAI,aAAa,eAAe,IAAI,WAAW,MAAO,QAAO,KAAK,KAAK,KAAK,MAAM,SAAS,CAAC;AAChG,QAAI,IAAI,aAAa,eAAe,IAAI,WAAW,QAAQ;AACzD,YAAM,KAAK,OAAO,IAAI,QAAQ,cAAc,KAAK,EAAE,EAAE,YAAY;AACjE,UAAI,CAAC,GAAG,WAAW,kBAAkB,EAAG,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,6DAA6D,CAAC;AACnJ,YAAM,EAAE,KAAK,MAAM,OAAO,OAAO,IAAK,MAAM,KAAK,GAAG;AACpD,UAAI,OAAO,QAAQ,YAAY,CAAC,mBAAmB,KAAK,GAAG,EAAG,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,0FAAqF,CAAC;AACjM,YAAM,MAAM,OAAO,GAAG;AAAG,UAAI,CAAC,IAAK,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,mBAAmB,CAAC;AACpG,UAAI,MAAMG,MAAK,GAAG,EAAE,KAAK,MAAM,MAAM,MAAM,KAAK,EAAG,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,UAAU,GAAG,4DAAuD,CAAC;AACrK,YAAMU,OAAMP,SAAQ,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7C,YAAM,IAAI,MAAM,SAAS,cAAc,EAAE,MAAM,KAAK,MAAM,QAAQC,UAASD,SAAQ,GAAG,CAAC,GAAG,OAAO,SAAS,KAAK,QAAQ,UAAU,IAAI,CAAC;AACtI,kBAAY,GAAG;AACf,aAAO,KAAK,KAAK,EAAE,UAAU,MAAM,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,EAAE,KAAK,SAAS,EAAE,SAAS,SAAS,MAAM,QAAQ,GAAG,EAAE,CAAC;AAAA,IACvH;AACA,QAAI,IAAI,aAAa,gBAAgB,IAAI,WAAW,OAAO;AACzD,YAAM,MAAM,MAAM,IAAI,aAAa,IAAI,KAAK,CAAC;AAAG,UAAI,CAAC,IAAK,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,mBAAmB,CAAC;AAC3H,aAAO,KAAK,KAAK,KAAK,MAAM,UAAU,GAAG,CAAC;AAAA,IAC5C;AACA,QAAI,IAAI,aAAa,iBAAiB,IAAI,WAAW,QAAQ;AAC3D,YAAM,MAAM,MAAM,IAAI,aAAa,IAAI,KAAK,CAAC;AAAG,UAAI,CAAC,IAAK,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,mBAAmB,CAAC;AAC3H,YAAM,OAAO,IAAI,aAAa,IAAI,MAAM,KAAK;AAC7C,UAAI,CAAC,0BAA0B,KAAK,IAAI,KAAK,KAAK,WAAW,GAAG,EAAG,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,yBAAyB,IAAI,uDAAkD,CAAC;AAChM,UAAI,CAAC,OAAO,IAAI,QAAQ,cAAc,KAAK,EAAE,EAAE,YAAY,EAAE,WAAW,WAAW,EAAG,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,8CAA8C,CAAC;AAClL,YAAM,SAASG,OAAKH,SAAQ,GAAG,GAAG,IAAI;AACtC,UAAI,CAAC,OAAOI,UAASV,OAAM,MAAM,CAAC,EAAG,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,oBAAoB,CAAC;AACvG,UAAI,MAAMG,MAAK,MAAM,EAAE,KAAK,MAAM,MAAM,MAAM,KAAK,EAAG,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,UAAU,IAAI,yDAAoD,CAAC;AACtK,YAAM,OAAO,MAAM,MAAM,KAAK,UAAU;AACxC,UAAI,CAAC,KAAM,QAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,UAAU,IAAI,mBAAmB,aAAa,OAAO,MAAM,CAAC;AACpH,UAAI;AACJ,UAAI;AAAE,eAAO,QAAQ,IAAI;AAAA,MAAG,QAAQ;AAAE,eAAO,KAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,UAAU,IAAI,gBAAgB,CAAC;AAAA,MAAG;AACrH,YAAM,UAAU,QAAQ,IAAI;AAC5B,aAAO,KAAK,KAAK,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAE,CAAC;AAAA,IACjE;AACA,SAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,oBAAoB,CAAC;AAAA,EAC7D;AAEA,QAAM,IAAI,QAAc,CAAC,IAAIW,UAAS;AACpC,WAAO,KAAK,SAASA,KAAI;AACzB,WAAO,OAAO,KAAK,QAAQ,MAAM,aAAa,MAAM;AAAE,aAAO,IAAI,SAASA,KAAI;AAAG,SAAG;AAAA,IAAG,CAAC;AAAA,EAC1F,CAAC;AACD,QAAM,OAAQ,OAAO,QAAQ,EAAuB;AACpD,iBAAe,oBAAI,IAAI,CAAC,aAAa,IAAI,IAAI,aAAa,IAAI,IAAI,SAAS,IAAI,EAAE,CAAC;AAClF,SAAO,EAAE,MAAM,KAAK,oBAAoB,IAAI,IAAI,OAAO,YAAY;AAAE,eAAW,KAAK,SAAS,OAAO,GAAG;AAAE,mBAAa,EAAE,KAAK;AAAG,QAAE,EAAE,MAAM;AAAA,IAAG;AAAE,eAAW,OAAO,QAAQ,OAAO,EAAG,YAAW,KAAK,IAAK,GAAE,IAAI;AAAG,UAAM,IAAI,QAAc,OAAK,OAAO,MAAM,MAAM,EAAE,CAAC,CAAC;AAAA,EAAG,EAAE;AAC7Q;",
|
|
6
|
+
"names": ["readFile", "stat", "readdir", "mkdir", "resolve", "dirname", "basename", "extname", "join", "relative", "fileURLToPath", "j", "vertexCount", "z", "readFile", "writeFile", "stat", "dirname", "join", "relative", "DEG", "j", "s", "c", "b", "root", "DEG", "root", "e", "vertexCount", "curveCount", "cos", "sin", "n", "pts", "j", "vertexCount", "j", "j", "root", "active", "pending", "c", "z", "a", "b", "j", "exists", "trackId", "mesh", "lengths", "grown", "at", "r4", "exists", "times", "rename", "skin", "a", "s", "named", "join", "basename", "join", "basename", "z", "exists", "pending", "p", "x", "y", "s", "ease", "T", "open", "w", "writeFile", "rm", "rename", "mkdir", "dirname", "join", "readFile", "join", "dirname", "readFile", "readdir", "dirname", "join", "readFile", "join", "dirname", "files", "readdir", "dirname", "pending", "readFile", "join", "times", "readFile", "join", "doc", "assets", "mkdir", "dirname", "join", "times", "writeFile", "rename", "rm", "j", "times", "z", "trackId", "e", "j", "worst", "mkdir", "readdir", "readFile", "writeFile", "basename", "dirname", "join", "files", "entries", "fmt", "trackId", "mkdir", "readFile", "writeFile", "join", "PNG", "files", "readFile", "join", "mkdir", "writeFile", "readFile", "writeFile", "basename", "dirname", "join", "readFile", "PNG", "require", "basis", "text", "page", "attachments", "skin", "vertexCount", "ease", "steps", "hit", "times", "a", "readFile", "join", "dirname", "basename", "writeFile", "trackId", "round", "slotOfBone", "byRole", "readFile", "writeFile", "mkdir", "dirname", "PNG", "z", "resolve", "z", "v", "values", "active", "fileURLToPath", "wrap", "a", "id", "b", "x", "c", "j", "z", "t", "z", "readFile", "exists", "stat", "join", "dirname", "relative", "Influence", "mesh", "rename", "times", "writeFile", "mkdir", "fileURLToPath", "root", "resolve", "fileURLToPath", "stat", "readFile", "body", "dirname", "basename", "readdir", "join", "relative", "e", "extname", "mkdir", "fail"]
|
|
7
7
|
}
|