Files
Ringworld/module/ringworld.mjs.map
T

1 line
306 KiB
Plaintext

{"version":3,"file":"ringworld.mjs","sources":["../src/module/utils/dice.ts","../src/module/utils/percentile.ts","../src/module/constants.ts","../src/module/hit-location-schemas.ts","../src/module/utils/hit-locations.ts","../src/module/data-base-skills.ts","../src/module/skill-icons.ts","../src/module/chat.ts","../src/module/mechanics.ts","../src/module/world-catalog.ts","../src/module/character-tools.ts","../src/module/actor/RingworldActor.ts","../src/module/item/RingworldItem.ts","../src/module/sheets/actors/ExplorerSheet.ts","../src/module/sheets/actors/CreatureSheet.ts","../src/module/sheets/actors/VehicleSheet.ts","../src/module/sheets/items/SkillSheet.ts","../src/module/sheets/items/WeaponSheet.ts","../src/module/sheets/items/ArmorSheet.ts","../src/module/sheets/items/GearSheet.ts","../src/module/sheets/items/SpeciesSheet.ts","../src/module/sheets/items/PursuitSheet.ts","../src/module/impulse-tracker.ts","../src/ringworld.ts"],"sourcesContent":["export async function showDiceSoNice(roll: Roll): Promise<void> {\n const dice3d = (game as any)?.dice3d;\n if (!dice3d?.showForRoll) return;\n\n try {\n await dice3d.showForRoll(roll, game.user, true, null, false);\n } catch (_error) {\n // Ignore Dice So Nice integration failures and continue normal flow.\n }\n}\n\nexport async function evaluateRollWithDice(formula: string): Promise<Roll> {\n const roll = await new Roll(formula).evaluate();\n await showDiceSoNice(roll as any);\n return roll as any;\n}\n","import { evaluateRollWithDice } from \"./dice\";\n\nexport type PercentileOutcome = \"special\" | \"success\" | \"failure\" | \"fumble\";\n\nexport interface PercentileResult {\n roll: number;\n target: number;\n outcome: PercentileOutcome;\n isSuccess: boolean;\n isSpecial: boolean;\n isFumble: boolean;\n}\n\nexport async function rollPercentile(target: number): Promise<PercentileResult> {\n const roll = await evaluateRollWithDice(\"1d100\");\n return classifyPercentile(roll.total ?? 0, target);\n}\n\nexport function classifyPercentile(roll: number, target: number): PercentileResult {\n const cleanTarget = Math.max(0, Math.floor(Number(target) || 0));\n const specialThreshold = Math.max(1, Math.floor(cleanTarget / 5));\n const fumbleThreshold = cleanTarget >= 50 ? 100 : 96;\n\n const isSuccess = roll <= cleanTarget;\n const isSpecial = isSuccess && roll <= specialThreshold;\n const isFumble = !isSuccess && roll >= fumbleThreshold;\n\n let outcome: PercentileOutcome = \"failure\";\n if (isFumble) outcome = \"fumble\";\n else if (isSpecial) outcome = \"special\";\n else if (isSuccess) outcome = \"success\";\n\n return {\n roll,\n target: cleanTarget,\n outcome,\n isSuccess,\n isSpecial,\n isFumble\n };\n}\n\nexport function outcomeLabel(outcome: PercentileOutcome): string {\n switch (outcome) {\n case \"special\":\n return \"Special Success\";\n case \"success\":\n return \"Success\";\n case \"fumble\":\n return \"Fumble\";\n default:\n return \"Failure\";\n }\n}\n","export type HitLocationSlug = \"rLeg\" | \"lLeg\" | \"abdomen\" | \"chest\" | \"rArm\" | \"lArm\" | \"head\";\n\nexport interface HitLocationEntry {\n slug: HitLocationSlug;\n label: string;\n min: number;\n max: number;\n}\n\nexport const SYSTEM_ID = \"ringworld\";\n\nexport const HIT_LOCATION_TABLE: HitLocationEntry[] = [\n { slug: \"rLeg\", label: \"Right Leg\", min: 1, max: 3 },\n { slug: \"lLeg\", label: \"Left Leg\", min: 4, max: 6 },\n { slug: \"abdomen\", label: \"Abdomen\", min: 7, max: 10 },\n { slug: \"chest\", label: \"Chest\", min: 11, max: 15 },\n { slug: \"rArm\", label: \"Right Arm\", min: 16, max: 17 },\n { slug: \"lArm\", label: \"Left Arm\", min: 18, max: 19 },\n { slug: \"head\", label: \"Head\", min: 20, max: 20 }\n];\n\nexport const HIT_LOCATION_ORDER: HitLocationSlug[] = [\n \"rLeg\",\n \"lLeg\",\n \"abdomen\",\n \"chest\",\n \"rArm\",\n \"lArm\",\n \"head\"\n];\n\nexport const LIMB_LOCATIONS: HitLocationSlug[] = [\"rArm\", \"lArm\", \"rLeg\", \"lLeg\"];\nexport const LEG_LOCATIONS: HitLocationSlug[] = [\"rLeg\", \"lLeg\"];\n\nexport function isLimb(slug: HitLocationSlug): boolean {\n return LIMB_LOCATIONS.includes(slug);\n}\n","import { HIT_LOCATION_ORDER, HIT_LOCATION_TABLE, type HitLocationEntry, type HitLocationSlug } from \"./constants\";\n\nexport type HitLocationSchemaId = \"humanoid\" | \"dolphin\" | \"puppeteer\" | \"trinoc\" | \"bandersnatchi\" | \"kzinti\";\n\nexport interface HitLocationSchemaEntry extends HitLocationEntry {\n hpFactor: number;\n}\n\nexport interface HitLocationSchema {\n id: HitLocationSchemaId;\n label: string;\n bodyOrder: HitLocationSlug[];\n entries: HitLocationSchemaEntry[];\n}\n\nfunction normalize(value: unknown): string {\n return String(value ?? \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction withFactors(entries: HitLocationEntry[], hpFactors?: Partial<Record<HitLocationSlug, number>>): HitLocationSchemaEntry[] {\n return entries.map((entry) => ({\n ...entry,\n hpFactor: hpFactors?.[entry.slug] ?? (entry.slug === \"chest\" ? 0.35 : (entry.slug === \"rArm\" || entry.slug === \"lArm\") ? 0.25 : 0.3)\n }));\n}\n\nconst HUMANOID_SCHEMA: HitLocationSchema = {\n id: \"humanoid\",\n label: \"Humanoid\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors(HIT_LOCATION_TABLE)\n};\n\nconst DOLPHIN_SCHEMA: HitLocationSchema = {\n id: \"dolphin\",\n label: \"Dolphin\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors([\n { slug: \"rLeg\", label: \"Right Fluke\", min: 1, max: 3 },\n { slug: \"lLeg\", label: \"Left Fluke\", min: 4, max: 6 },\n { slug: \"abdomen\", label: \"Lower Body\", min: 7, max: 9 },\n { slug: \"chest\", label: \"Main Body\", min: 10, max: 15 },\n { slug: \"rArm\", label: \"Right Fin\", min: 16, max: 17 },\n { slug: \"lArm\", label: \"Left Fin\", min: 18, max: 19 },\n { slug: \"head\", label: \"Head\", min: 20, max: 20 }\n ], {\n head: 0.3,\n rArm: 0.2,\n lArm: 0.2,\n chest: 0.4,\n abdomen: 0.35,\n rLeg: 0.25,\n lLeg: 0.25\n })\n};\n\nconst PUPPETEER_SCHEMA: HitLocationSchema = {\n id: \"puppeteer\",\n label: \"Puppeteer\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors([\n { slug: \"rLeg\", label: \"Right Rear Leg\", min: 1, max: 3 },\n { slug: \"lLeg\", label: \"Left Rear Leg\", min: 4, max: 6 },\n { slug: \"rArm\", label: \"Right Foreleg\", min: 7, max: 9 },\n { slug: \"lArm\", label: \"Left Foreleg\", min: 10, max: 12 },\n { slug: \"chest\", label: \"Fore Body\", min: 13, max: 15 },\n { slug: \"abdomen\", label: \"Hind Body\", min: 16, max: 18 },\n { slug: \"head\", label: \"Twin Heads\", min: 19, max: 20 }\n ], {\n head: 0.32,\n chest: 0.35,\n abdomen: 0.35,\n rArm: 0.28,\n lArm: 0.28,\n rLeg: 0.28,\n lLeg: 0.28\n })\n};\n\nconst TRINOC_SCHEMA: HitLocationSchema = {\n id: \"trinoc\",\n label: \"Trinoc\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors([\n { slug: \"rArm\", label: \"Right Wing/Arm\", min: 1, max: 3 },\n { slug: \"lArm\", label: \"Left Wing/Arm\", min: 4, max: 6 },\n { slug: \"chest\", label: \"Upper Torso\", min: 7, max: 11 },\n { slug: \"abdomen\", label: \"Lower Torso\", min: 12, max: 14 },\n { slug: \"rLeg\", label: \"Right Leg\", min: 15, max: 17 },\n { slug: \"lLeg\", label: \"Left Leg\", min: 18, max: 19 },\n { slug: \"head\", label: \"Head\", min: 20, max: 20 }\n ], {\n head: 0.3,\n rArm: 0.27,\n lArm: 0.27,\n chest: 0.36,\n abdomen: 0.3,\n rLeg: 0.27,\n lLeg: 0.27\n })\n};\n\nconst BANDERSNATCHI_SCHEMA: HitLocationSchema = {\n id: \"bandersnatchi\",\n label: \"Bandersnatchi\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors([\n { slug: \"rLeg\", label: \"Right Rear Mass\", min: 1, max: 2 },\n { slug: \"lLeg\", label: \"Left Rear Mass\", min: 3, max: 4 },\n { slug: \"abdomen\", label: \"Lower Body Mass\", min: 5, max: 11 },\n { slug: \"chest\", label: \"Upper Body Mass\", min: 12, max: 17 },\n { slug: \"rArm\", label: \"Right Manipulator\", min: 18, max: 18 },\n { slug: \"lArm\", label: \"Left Manipulator\", min: 19, max: 19 },\n { slug: \"head\", label: \"Head Cluster\", min: 20, max: 20 }\n ], {\n head: 0.28,\n chest: 0.42,\n abdomen: 0.42,\n rArm: 0.2,\n lArm: 0.2,\n rLeg: 0.24,\n lLeg: 0.24\n })\n};\n\nconst KZINTI_SCHEMA: HitLocationSchema = {\n id: \"kzinti\",\n label: \"Kzinti\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors([\n { slug: \"rLeg\", label: \"Right Hind Leg\", min: 1, max: 3 },\n { slug: \"lLeg\", label: \"Left Hind Leg\", min: 4, max: 6 },\n { slug: \"abdomen\", label: \"Abdomen\", min: 7, max: 10 },\n { slug: \"chest\", label: \"Chest\", min: 11, max: 15 },\n { slug: \"rArm\", label: \"Right Foreleg\", min: 16, max: 17 },\n { slug: \"lArm\", label: \"Left Foreleg\", min: 18, max: 19 },\n { slug: \"head\", label: \"Head\", min: 20, max: 20 }\n ])\n};\n\nexport const HIT_LOCATION_SCHEMAS: Record<HitLocationSchemaId, HitLocationSchema> = {\n humanoid: HUMANOID_SCHEMA,\n dolphin: DOLPHIN_SCHEMA,\n puppeteer: PUPPETEER_SCHEMA,\n trinoc: TRINOC_SCHEMA,\n bandersnatchi: BANDERSNATCHI_SCHEMA,\n kzinti: KZINTI_SCHEMA\n};\n\nexport function listHitLocationSchemas(): HitLocationSchema[] {\n return Object.values(HIT_LOCATION_SCHEMAS);\n}\n\nexport function inferHitLocationSchemaId(speciesValue: unknown): HitLocationSchemaId {\n const species = normalize(speciesValue);\n if (!species) return \"humanoid\";\n if (species.includes(\"dolphin\")) return \"dolphin\";\n if (species.includes(\"puppeteer\")) return \"puppeteer\";\n if (species.includes(\"trinoc\")) return \"trinoc\";\n if (species.includes(\"bandersnatch\")) return \"bandersnatchi\";\n if (species.includes(\"kzinti\")) return \"kzinti\";\n return \"humanoid\";\n}\n\nexport function getHitLocationSchemaById(schemaId: unknown): HitLocationSchema {\n const key = normalize(schemaId) as HitLocationSchemaId;\n return HIT_LOCATION_SCHEMAS[key] ?? HUMANOID_SCHEMA;\n}\n\nexport function getActorHitLocationSchema(actor: any): HitLocationSchema {\n const mode = String(actor?.system?.hitLocationSchema || \"auto\").trim().toLowerCase();\n if (mode && mode !== \"auto\") {\n return getHitLocationSchemaById(mode);\n }\n const species = actor?.system?.profile?.species ?? \"\";\n return getHitLocationSchemaById(inferHitLocationSchemaId(species));\n}\n\nexport function getSchemaLocationEntry(schema: HitLocationSchema, slug: HitLocationSlug): HitLocationSchemaEntry {\n return schema.entries.find((entry) => entry.slug === slug) ?? withFactors(HIT_LOCATION_TABLE).find((entry) => entry.slug === slug)!;\n}\n\nexport function getSchemaOrder(schema: HitLocationSchema): HitLocationSlug[] {\n const set = new Set(schema.entries.map((entry) => entry.slug));\n const ordered = schema.bodyOrder.filter((slug) => set.has(slug));\n if (ordered.length === schema.entries.length) return ordered;\n return [...HIT_LOCATION_ORDER];\n}\n\n","import { HIT_LOCATION_TABLE, type HitLocationEntry, type HitLocationSlug } from \"../constants\";\nimport { evaluateRollWithDice } from \"./dice\";\nimport { getActorHitLocationSchema, getHitLocationSchemaById } from \"../hit-location-schemas\";\n\nexport interface HitLocationRollResult {\n roll: number;\n location: HitLocationEntry;\n}\n\nexport function getHitLocationFromRoll(roll: number): HitLocationEntry {\n const found = HIT_LOCATION_TABLE.find((entry) => roll >= entry.min && roll <= entry.max);\n return found ?? HIT_LOCATION_TABLE[HIT_LOCATION_TABLE.length - 1];\n}\n\nfunction getTableForActor(actor?: any): HitLocationEntry[] {\n if (!actor) return HIT_LOCATION_TABLE;\n const schema = getActorHitLocationSchema(actor);\n return schema.entries;\n}\n\nfunction getHitLocationFromRollForTable(roll: number, table: HitLocationEntry[]): HitLocationEntry {\n const found = table.find((entry) => roll >= entry.min && roll <= entry.max);\n return found ?? table[table.length - 1];\n}\n\nexport async function rollHitLocation(actor?: any): Promise<HitLocationRollResult> {\n const roll = await evaluateRollWithDice(\"1d20\");\n const total = roll.total ?? 20;\n const table = getTableForActor(actor);\n return {\n roll: total,\n location: getHitLocationFromRollForTable(total, table)\n };\n}\n\nexport async function chooseOrRollHitLocation(actor?: any): Promise<{\n slug: HitLocationSlug;\n label: string;\n rolled: number | null;\n} | null> {\n const schema = actor ? getActorHitLocationSchema(actor) : getHitLocationSchemaById(\"humanoid\");\n const table = schema.entries;\n const entriesBySlug = new Map(table.map((entry) => [entry.slug, entry]));\n const labelFor = (slug: HitLocationSlug, fallback: string) => entriesBySlug.get(slug)?.label ?? fallback;\n\n const html = `\n <form class=\"ringworld-hit-picker schema-${schema.id}\">\n <input type=\"hidden\" name=\"location\" value=\"random\" />\n <div class=\"rw-hit-picker-top\">\n <button type=\"button\" class=\"rw-hit-picker-choice active\" data-location=\"random\">\n Roll Random (1d20)\n </button>\n </div>\n <div class=\"rw-hit-picker-body\">\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-head\" data-location=\"head\">${labelFor(\"head\", \"Head\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-l-arm\" data-location=\"lArm\">${labelFor(\"lArm\", \"Left Arm\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-chest\" data-location=\"chest\">${labelFor(\"chest\", \"Chest\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-r-arm\" data-location=\"rArm\">${labelFor(\"rArm\", \"Right Arm\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-abdomen\" data-location=\"abdomen\">${labelFor(\"abdomen\", \"Abdomen\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-l-leg\" data-location=\"lLeg\">${labelFor(\"lLeg\", \"Left Leg\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-r-leg\" data-location=\"rLeg\">${labelFor(\"rLeg\", \"Right Leg\")}</button>\n </div>\n </form>\n `;\n\n const result = await new Promise<string | null>((resolve) => {\n let settled = false;\n const done = (value: string | null) => {\n if (settled) return;\n settled = true;\n resolve(value);\n };\n\n const dialog = new Dialog({\n title: \"Choose Hit Location\",\n content: html,\n buttons: {\n apply: {\n label: \"Apply\",\n callback: (dlgHtml: JQuery) => {\n const value = String(dlgHtml.find(\"input[name='location']\").val() || \"random\");\n done(value);\n }\n },\n cancel: {\n label: \"Cancel\",\n callback: () => done(null)\n }\n },\n default: \"apply\",\n render: (dlgHtml: JQuery) => {\n const picker = dlgHtml.find(\".ringworld-hit-picker\");\n picker.find(\".rw-hit-picker-choice\").on(\"click\", (event) => {\n event.preventDefault();\n const button = event.currentTarget as HTMLElement;\n const location = String(button.dataset.location || \"random\");\n picker.find(\".rw-hit-picker-choice\").removeClass(\"active\");\n $(button).addClass(\"active\");\n picker.find(\"input[name='location']\").val(location);\n });\n },\n close: () => done(null)\n }, {\n classes: [\"ringworld-hit-location-dialog\"],\n width: 500,\n resizable: false\n });\n dialog.render(true);\n });\n\n if (!result) return null;\n\n if (result === \"random\") {\n const rolled = await rollHitLocation(actor);\n return {\n slug: rolled.location.slug,\n label: rolled.location.label,\n rolled: rolled.roll\n };\n }\n\n const entry = table.find((loc) => loc.slug === result);\n if (!entry) return null;\n\n return {\n slug: entry.slug,\n label: entry.label,\n rolled: null\n };\n}\n","export interface BaseSkillDef {\n name: string;\n category: \"Agility\" | \"Communication\" | \"Knowledge\" | \"Perception\" | \"Technical\";\n base: number;\n specialization?: string;\n}\n\nexport const BASE_SKILL_CATEGORIES: Array<BaseSkillDef[\"category\"]> = [\n \"Agility\",\n \"Communication\",\n \"Knowledge\",\n \"Perception\",\n \"Technical\"\n];\n\nexport const RINGWORLD_BASE_SKILLS: BaseSkillDef[] = [\n { name: \"Archaic Melee Weapon\", category: \"Agility\", base: 5 },\n { name: \"Archaic Ranged Weapons\", category: \"Agility\", base: 3 },\n { name: \"Athletics\", category: \"Agility\", base: 15 },\n { name: \"Hide\", category: \"Agility\", base: 10 },\n { name: \"Sneak\", category: \"Agility\", base: 5 },\n { name: \"Unarmed Combat\", category: \"Agility\", base: 0 },\n { name: \"V. Sword, F. Laser\", category: \"Agility\", base: 15 },\n\n { name: \"Bargain\", category: \"Communication\", base: 10 },\n { name: \"Debate\", category: \"Communication\", base: 5 },\n { name: \"Fast Talk\", category: \"Communication\", base: 10 },\n { name: \"Fine Arts\", category: \"Communication\", base: 5 },\n { name: \"Musicianship\", category: \"Communication\", base: 5 },\n { name: \"Orate\", category: \"Communication\", base: 5 },\n { name: \"Own Language\", category: \"Communication\", base: 0, specialization: \"INTx5 base\" },\n { name: \"Perform\", category: \"Communication\", base: 5 },\n { name: \"Psychology\", category: \"Communication\", base: 0 },\n\n { name: \"Anthropology\", category: \"Knowledge\", base: 0 },\n { name: \"Astronomy\", category: \"Knowledge\", base: 0 },\n { name: \"Biology\", category: \"Knowledge\", base: 0 },\n { name: \"Botany\", category: \"Knowledge\", base: 0 },\n { name: \"Chemistry\", category: \"Knowledge\", base: 0 },\n { name: \"Computers\", category: \"Knowledge\", base: 0 },\n { name: \"Emergency Treatment\", category: \"Knowledge\", base: 1 },\n { name: \"Engineering\", category: \"Knowledge\", base: 0 },\n { name: \"Farming\", category: \"Knowledge\", base: 0 },\n { name: \"History\", category: \"Knowledge\", base: 5 },\n { name: \"Law\", category: \"Knowledge\", base: 0 },\n { name: \"Mathematics\", category: \"Knowledge\", base: 0 },\n { name: \"Physics\", category: \"Knowledge\", base: 0 },\n { name: \"Planetology\", category: \"Knowledge\", base: 0 },\n { name: \"Second Languages\", category: \"Knowledge\", base: 0 },\n { name: \"Strategy\", category: \"Knowledge\", base: 0 },\n { name: \"Theology\", category: \"Knowledge\", base: 0 },\n { name: \"Zoology\", category: \"Knowledge\", base: 0 },\n\n { name: \"Handgun, Energy\", category: \"Perception\", base: 5 },\n { name: \"Handgun, Projectile\", category: \"Perception\", base: 3 },\n { name: \"Heavy Weapon, Energy\", category: \"Perception\", base: 5 },\n { name: \"Heavy Weapon, Projectile\", category: \"Perception\", base: 3 },\n { name: \"Listen\", category: \"Perception\", base: 5 },\n { name: \"Observe\", category: \"Perception\", base: 5 },\n { name: \"Scent\", category: \"Perception\", base: 0 },\n { name: \"Search\", category: \"Perception\", base: 5 },\n { name: \"Track\", category: \"Perception\", base: 5 },\n\n { name: \"Aquatic Vehicle\", category: \"Technical\", base: 0 },\n { name: \"Atmospheric Craft\", category: \"Technical\", base: 0 },\n { name: \"Ground Vehicle\", category: \"Technical\", base: 0 },\n { name: \"Hyperdrive\", category: \"Technical\", base: 0 },\n { name: \"Personal Flyer\", category: \"Technical\", base: 15 },\n { name: \"Reaction Drive\", category: \"Technical\", base: 0 },\n { name: \"Reactionless Drive\", category: \"Technical\", base: 0 },\n { name: \"Repair\", category: \"Technical\", base: 0 },\n { name: \"Ringworld\", category: \"Technical\", base: 0 },\n { name: \"Weapons System\", category: \"Technical\", base: 0 }\n];\n\nexport function normalizeSkillName(name: string): string {\n return String(name || \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"\")\n .trim();\n}\n\nexport function baseSkillNameSet(): Set<string> {\n return new Set(RINGWORLD_BASE_SKILLS.map((skill) => normalizeSkillName(skill.name)));\n}\n","import { normalizeSkillName, RINGWORLD_BASE_SKILLS } from \"./data-base-skills\";\n\nexport const DEFAULT_SKILL_ICON = \"systems/ringworld/assets/icons/skill.svg\";\n\nfunction iconSlug(name: string): string {\n return String(name)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nexport function skillIconPath(name: string): string {\n return `systems/ringworld/assets/icons/skill/${iconSlug(name)}.svg`;\n}\n\nexport function baseSkillByName(name: string): (typeof RINGWORLD_BASE_SKILLS)[number] | undefined {\n const key = normalizeSkillName(name);\n return RINGWORLD_BASE_SKILLS.find((skill) => normalizeSkillName(skill.name) === key);\n}\n\nexport function resolveSkillIcon(name: string, currentImg?: string): string {\n const img = String(currentImg || \"\").trim();\n if (img && img !== \"icons/svg/item-bag.svg\") return img;\n if (baseSkillByName(name)) return skillIconPath(name);\n return DEFAULT_SKILL_ICON;\n}\n\n","import { SYSTEM_ID } from \"./constants\";\nimport { DEFAULT_SKILL_ICON } from \"./skill-icons\";\n\ninterface CreateChatOptions {\n actor?: any;\n content: string;\n}\n\nasync function createChatMessage(options: CreateChatOptions): Promise<void> {\n const speaker = options.actor ? ChatMessage.getSpeaker({ actor: options.actor }) : ChatMessage.getSpeaker();\n await ChatMessage.create({\n user: game.user?.id,\n speaker,\n content: options.content\n });\n}\n\nexport async function postSkillRollCard(data: {\n actor: any;\n actorName: string;\n actorImg?: string;\n skillName: string;\n skillImg?: string;\n roll: number;\n target: number;\n outcomeLabel: string;\n isSuccess: boolean;\n isSpecial: boolean;\n isFumble: boolean;\n}): Promise<void> {\n const payload = {\n ...data,\n actorImg: data.actorImg || data.actor?.img || \"icons/svg/mystery-man.svg\",\n skillImg: data.skillImg || DEFAULT_SKILL_ICON\n };\n const content = await renderTemplate(`systems/${SYSTEM_ID}/templates/chat/skill-roll-card.hbs`, payload);\n await createChatMessage({ actor: data.actor, content });\n}\n\nexport async function postAttackCard(data: {\n actor: any;\n actorName: string;\n actorImg?: string;\n targetName: string;\n hasTarget?: boolean;\n weaponName: string;\n weaponImg?: string;\n skillName: string;\n skillImg?: string;\n attackRoll: number;\n attackTarget: number;\n attackOutcomeLabel: string;\n isSuccess: boolean;\n isSpecial: boolean;\n isFumble: boolean;\n hitLocationLabel: string;\n hitLocationRoll: number | null;\n rawDamage: number;\n armor: number;\n finalDamage: number;\n remainingLocationHp: number;\n remainingGeneralHp: number;\n energySourceLabel: string;\n energyCost: number;\n energyRemaining: number;\n notes: string;\n}): Promise<void> {\n const payload = {\n ...data,\n actorImg: data.actorImg || data.actor?.img || \"icons/svg/mystery-man.svg\",\n weaponImg: data.weaponImg || \"icons/svg/sword.svg\",\n skillImg: data.skillImg || DEFAULT_SKILL_ICON,\n hasTarget: data.hasTarget ?? true\n };\n const content = await renderTemplate(`systems/${SYSTEM_ID}/templates/chat/attack-card.hbs`, payload);\n await createChatMessage({ actor: data.actor, content });\n}\n","import { outcomeLabel, rollPercentile } from \"./utils/percentile\";\nimport { chooseOrRollHitLocation, rollHitLocation } from \"./utils/hit-locations\";\nimport { LEG_LOCATIONS, SYSTEM_ID, isLimb, type HitLocationSlug } from \"./constants\";\nimport { postAttackCard, postSkillRollCard } from \"./chat\";\nimport { evaluateRollWithDice } from \"./utils/dice\";\nimport { getActorHitLocationSchema } from \"./hit-location-schemas\";\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction getSingleTargetActor(): any | null {\n const targets = Array.from(game.user?.targets ?? []);\n if (!targets.length) return null;\n return (targets[0] as any)?.actor ?? null;\n}\n\nexport async function rollStandaloneHitLocation(actor?: any): Promise<void> {\n const result = await rollHitLocation(actor);\n const speaker = actor ? ChatMessage.getSpeaker({ actor }) : ChatMessage.getSpeaker();\n const content = `\n <div class=\"ringworld-chat-card\">\n <h3>Hit Location</h3>\n <p><strong>Roll:</strong> ${result.roll}</p>\n <p><strong>Location:</strong> ${result.location.label}</p>\n </div>\n `;\n\n await ChatMessage.create({\n user: game.user?.id,\n speaker,\n content\n });\n}\n\nexport async function rollSkillForActor(actor: any, skillName: string, target: number): Promise<void> {\n const result = await rollPercentile(target);\n const skillItem = actor.items.find(\n (item: any) => item.type === \"skill\" && item.name.toLowerCase() === String(skillName).toLowerCase()\n );\n\n await postSkillRollCard({\n actor,\n actorName: actor.name,\n actorImg: actor.img,\n skillName,\n skillImg: skillItem?.img,\n roll: result.roll,\n target: result.target,\n outcomeLabel: outcomeLabel(result.outcome),\n isSuccess: result.isSuccess,\n isSpecial: result.isSpecial,\n isFumble: result.isFumble\n });\n}\n\nfunction resolveLinkedSkill(actor: any, weapon: any): { name: string; target: number; img?: string } {\n const skillId = weapon.system.linkedSkillId;\n const byId = skillId ? actor.items.get(skillId) : null;\n if (byId?.type === \"skill\") {\n return { name: byId.name, target: num(byId.system.value), img: byId.img };\n }\n\n const linkedSkillName = String(weapon.system.linkedSkill || \"\").trim();\n if (linkedSkillName) {\n const byName = actor.items.find(\n (item: any) => item.type === \"skill\" && item.name.toLowerCase() === linkedSkillName.toLowerCase()\n );\n if (byName) {\n return { name: byName.name, target: num(byName.system.value), img: byName.img };\n }\n }\n\n return {\n name: linkedSkillName || \"Unlinked Skill\",\n target: 0\n };\n}\n\ntype AimMode = \"unaimed\" | \"partial\" | \"full\";\n\ninterface AttackRollModifierResult {\n finalTarget: number;\n summary: string;\n aimMode: AimMode;\n aimMultiplier: number;\n flatModifierTotal: number;\n}\n\nfunction clampPercentTarget(value: number): number {\n return Math.max(0, Math.min(99, Math.floor(value)));\n}\n\nasync function promptAttackModifiers(attacker: any, weapon: any, baseSkillTarget: number): Promise<AttackRollModifierResult | null> {\n const attackType = String(weapon.system?.attackType || \"ranged\");\n const isRanged = attackType === \"ranged\";\n const defaultAim: AimMode = \"full\";\n const safeActorName = foundry.utils.escapeHTML(String(attacker?.name || \"Attacker\"));\n const safeWeaponName = foundry.utils.escapeHTML(String(weapon?.name || \"Weapon\"));\n const safeActorImg = foundry.utils.escapeHTML(String(attacker?.img || \"icons/svg/mystery-man.svg\"));\n const safeWeaponImg = foundry.utils.escapeHTML(String(weapon?.img || \"icons/svg/sword.svg\"));\n\n const content = `\n <form class=\"ringworld-attack-modifiers\">\n <header class=\"rw-attack-dialog-head\">\n <img class=\"rw-attack-dialog-avatar\" src=\"${safeActorImg}\" alt=\"${safeActorName}\" />\n <img class=\"rw-attack-dialog-weapon\" src=\"${safeWeaponImg}\" alt=\"${safeWeaponName}\" />\n <div class=\"rw-attack-dialog-title-block\">\n <h3>${safeWeaponName}</h3>\n <p>${safeActorName} Attack Setup</p>\n </div>\n </header>\n <div class=\"form-group\">\n <label>Base Skill</label>\n <input type=\"number\" name=\"baseSkill\" value=\"${baseSkillTarget}\" disabled />\n </div>\n <div class=\"form-group\">\n <label>Aim State</label>\n <select name=\"aimMode\" ${isRanged ? \"\" : \"disabled\"}>\n <option value=\"unaimed\" ${defaultAim === \"unaimed\" ? \"selected\" : \"\"}>Unaimed (Quarter Skill)</option>\n <option value=\"partial\" ${defaultAim === \"partial\" ? \"selected\" : \"\"}>Partially Aimed (Half Skill)</option>\n <option value=\"full\" ${defaultAim === \"full\" ? \"selected\" : \"\"}>Fully Aimed (Full Skill)</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>Cover Modifier</label>\n <input type=\"number\" name=\"coverMod\" value=\"0\" />\n </div>\n <div class=\"form-group\">\n <label>Movement Modifier</label>\n <input type=\"number\" name=\"movementMod\" value=\"0\" />\n </div>\n <div class=\"form-group\">\n <label>Range Modifier</label>\n <input type=\"number\" name=\"rangeMod\" value=\"0\" />\n </div>\n <div class=\"form-group\">\n <label>Situational Modifier</label>\n <input type=\"number\" name=\"situationalMod\" value=\"0\" />\n </div>\n <div class=\"form-group\">\n <label>Custom Modifier Label</label>\n <input type=\"text\" name=\"customLabel\" value=\"\" />\n </div>\n <div class=\"form-group\">\n <label>Custom Modifier Value</label>\n <input type=\"number\" name=\"customMod\" value=\"0\" />\n </div>\n <p class=\"notes\">Ringworld rule support: unaimed ranged attacks use quarter skill, partial aim uses half skill, full aim uses full skill.</p>\n </form>\n `;\n\n return new Promise((resolve) => {\n let settled = false;\n const done = (value: AttackRollModifierResult | null) => {\n if (settled) return;\n settled = true;\n resolve(value);\n };\n\n new Dialog({\n title: `${weapon.name} - Attack Modifiers`,\n content,\n buttons: {\n roll: {\n label: \"Roll Attack\",\n callback: (dlgHtml: JQuery) => {\n const root = dlgHtml[0] as HTMLElement | undefined;\n const query = (name: string) => (root?.querySelector(`[name=\"${name}\"]`) as HTMLInputElement | HTMLSelectElement | null);\n const aimModeRaw = String(query(\"aimMode\")?.value || defaultAim) as AimMode;\n const aimMode: AimMode = (aimModeRaw === \"unaimed\" || aimModeRaw === \"partial\" || aimModeRaw === \"full\")\n ? aimModeRaw\n : defaultAim;\n const aimMultiplier = isRanged ? ({ unaimed: 0.25, partial: 0.5, full: 1 } as const)[aimMode] : 1;\n const coverMod = num(query(\"coverMod\")?.value, 0);\n const movementMod = num(query(\"movementMod\")?.value, 0);\n const rangeMod = num(query(\"rangeMod\")?.value, 0);\n const situationalMod = num(query(\"situationalMod\")?.value, 0);\n const customMod = num(query(\"customMod\")?.value, 0);\n const customLabel = String(query(\"customLabel\")?.value || \"\").trim();\n\n const flatModifierTotal = coverMod + movementMod + rangeMod + situationalMod + customMod;\n const preAimTarget = baseSkillTarget + flatModifierTotal;\n const adjustedByAim = Math.floor(preAimTarget * aimMultiplier);\n const finalTarget = clampPercentTarget(adjustedByAim);\n\n const parts: string[] = [`Base ${baseSkillTarget}`];\n if (coverMod) parts.push(`Cover ${coverMod >= 0 ? \"+\" : \"\"}${coverMod}`);\n if (movementMod) parts.push(`Movement ${movementMod >= 0 ? \"+\" : \"\"}${movementMod}`);\n if (rangeMod) parts.push(`Range ${rangeMod >= 0 ? \"+\" : \"\"}${rangeMod}`);\n if (situationalMod) parts.push(`Situational ${situationalMod >= 0 ? \"+\" : \"\"}${situationalMod}`);\n if (customMod) parts.push(`${customLabel || \"Custom\"} ${customMod >= 0 ? \"+\" : \"\"}${customMod}`);\n parts.push(`Pre-Aim ${preAimTarget}`);\n if (isRanged) {\n const aimLabel = aimMode === \"unaimed\" ? \"Quarter\" : aimMode === \"partial\" ? \"Half\" : \"Full\";\n parts.push(`Aim ${aimLabel} x${aimMultiplier}`);\n }\n parts.push(`Final ${finalTarget}`);\n\n done({\n finalTarget,\n summary: parts.join(\" | \"),\n aimMode,\n aimMultiplier,\n flatModifierTotal\n });\n }\n },\n cancel: {\n label: \"Cancel\",\n callback: () => done(null)\n }\n },\n default: \"roll\",\n close: () => done(null)\n }, {\n classes: [\"ringworld-attack-dialog\"],\n width: 510,\n resizable: false\n }).render(true);\n });\n}\n\nasync function consumeWeaponEnergy(actor: any, weapon: any): Promise<{\n sourceLabel: string;\n remaining: number;\n cost: number;\n insufficient: boolean;\n}> {\n const cost = Math.max(0, num(weapon.system.energyUsedPerAttack));\n if (cost <= 0) {\n return { sourceLabel: \"None\", remaining: 0, cost: 0, insufficient: false };\n }\n\n const source = String(weapon.system.powerSource || \"actor\");\n\n if (source === \"powerPack\") {\n const packId = String(weapon.system.powerPackId || \"\");\n const pack = packId ? actor.items.get(packId) : null;\n\n if (!pack || pack.type !== \"gear\" || !pack.system.isPowerPack) {\n ui.notifications?.warn(\"Weapon is configured for a power pack but no valid power pack is linked.\");\n return { sourceLabel: \"Power Pack\", remaining: 0, cost, insufficient: true };\n }\n\n const current = num(pack.system.energy?.value);\n if (current < cost) {\n ui.notifications?.warn(`${pack.name} does not have enough energy.`);\n return { sourceLabel: pack.name, remaining: current, cost, insufficient: true };\n }\n\n const next = current - cost;\n await actor.updateEmbeddedDocuments(\"Item\", [{ _id: pack.id, \"system.energy.value\": next }]);\n return { sourceLabel: pack.name, remaining: next, cost, insufficient: false };\n }\n\n const current = num(actor.system.resources?.energy?.value);\n if (current < cost) {\n ui.notifications?.warn(`${actor.name} does not have enough actor energy.`);\n return { sourceLabel: \"Actor Energy\", remaining: current, cost, insufficient: true };\n }\n\n const next = current - cost;\n await actor.update({ \"system.resources.energy.value\": next });\n return { sourceLabel: \"Actor Energy\", remaining: next, cost, insufficient: false };\n}\n\nfunction getItemArmorAtLocation(item: any, slug: HitLocationSlug): number {\n if (item.type !== \"armor\" || !item.system.equipped || item.system.stowed) return 0;\n if (!item.system.coverage?.[slug]) return 0;\n\n const specific = num(item.system.perLocation?.[slug]);\n if (specific > 0) return specific;\n return num(item.system.value);\n}\n\nfunction getTotalArmorAtLocation(targetActor: any, slug: HitLocationSlug): number {\n const locArmor = num(targetActor.system.hitLocations?.[slug]?.armor);\n const stackedItemsArmor = targetActor.items\n .filter((item: any) => item.type === \"armor\")\n .reduce((sum: number, item: any) => sum + getItemArmorAtLocation(item, slug), 0);\n\n return locArmor + stackedItemsArmor;\n}\n\nfunction buildConditionUpdates(targetActor: any, slug: HitLocationSlug, locationValue: number, locationMax: number, generalHp: number) {\n const current = foundry.utils.deepClone(targetActor.system.conditions ?? {});\n current.unusableLimbs = current.unusableLimbs ?? { rArm: false, lArm: false, rLeg: false, lLeg: false };\n\n if (locationValue <= 0) {\n if (slug === \"head\" || slug === \"chest\") {\n current.unconscious = true;\n current.prone = true;\n }\n\n if (slug === \"abdomen\") {\n current.prone = true;\n current.unusableLimbs.rLeg = true;\n current.unusableLimbs.lLeg = true;\n }\n\n if (slug === \"rArm\" || slug === \"lArm\") {\n current.unusableLimbs[slug] = true;\n }\n\n if (LEG_LOCATIONS.includes(slug)) {\n current.unusableLimbs[slug] = true;\n current.prone = true;\n }\n }\n\n if (generalHp <= 0) {\n current.dying = true;\n }\n\n if ((slug === \"head\" || slug === \"chest\" || slug === \"abdomen\") && locationValue <= -locationMax) {\n current.dying = true;\n }\n\n if (slug === \"head\" && locationValue <= -locationMax) {\n current.dead = true;\n current.unconscious = true;\n }\n\n return current;\n}\n\nasync function syncCoreStatusEffects(targetActor: any, conditions: any): Promise<void> {\n const toggler = (targetActor as any).toggleStatusEffect;\n if (typeof toggler !== \"function\") return;\n\n try {\n await toggler.call(targetActor, \"prone\", { active: !!conditions.prone });\n await toggler.call(targetActor, \"unconscious\", { active: !!conditions.unconscious });\n await toggler.call(targetActor, \"dead\", { active: !!conditions.dead });\n } catch (_err) {\n // Some worlds lock actor-level status manipulation; system conditions still update.\n }\n}\n\nasync function applyLocationDamage(targetActor: any, slug: HitLocationSlug, rawDamage: number): Promise<{\n armor: number;\n finalDamage: number;\n locationValue: number;\n generalHpValue: number;\n}> {\n const location = targetActor.system.hitLocations?.[slug];\n const currentLoc = num(location?.hp?.value);\n const locMax = Math.max(1, num(location?.hp?.max, 1));\n const armor = getTotalArmorAtLocation(targetActor, slug);\n const finalDamage = Math.max(0, rawDamage - armor);\n\n const unclampedLoc = currentLoc - finalDamage;\n const nextLoc = isLimb(slug) ? Math.max(unclampedLoc, -locMax) : unclampedLoc;\n\n const currentGeneral = num(targetActor.system.generalHp?.value);\n const nextGeneral = currentGeneral - finalDamage;\n\n const conditions = buildConditionUpdates(targetActor, slug, nextLoc, locMax, nextGeneral);\n\n const updates: Record<string, unknown> = {\n [`system.hitLocations.${slug}.hp.value`]: nextLoc,\n \"system.generalHp.value\": nextGeneral,\n \"system.conditions\": conditions\n };\n\n await targetActor.update(updates);\n await syncCoreStatusEffects(targetActor, conditions);\n\n return {\n armor,\n finalDamage,\n locationValue: nextLoc,\n generalHpValue: nextGeneral\n };\n}\n\nexport async function useWeaponWorkflow(attacker: any, weapon: any): Promise<void> {\n const targetActor = getSingleTargetActor();\n const hasTarget = Boolean(targetActor);\n const targetName = targetActor?.name ?? \"No Target\";\n\n const linkedSkill = resolveLinkedSkill(attacker, weapon);\n const modifierResult = await promptAttackModifiers(attacker, weapon, linkedSkill.target);\n if (!modifierResult) return;\n\n const energy = await consumeWeaponEnergy(attacker, weapon);\n if (energy.insufficient) return;\n\n const attack = await rollPercentile(modifierResult.finalTarget);\n\n if (!attack.isSuccess) {\n const remainingGeneralHp = targetActor ? num(targetActor.system.generalHp?.value, 0) : 0;\n await postAttackCard({\n actor: attacker,\n actorName: attacker.name,\n actorImg: attacker.img,\n targetName,\n hasTarget,\n weaponName: weapon.name,\n weaponImg: weapon.img,\n skillName: linkedSkill.name,\n skillImg: linkedSkill.img,\n attackRoll: attack.roll,\n attackTarget: attack.target,\n attackOutcomeLabel: outcomeLabel(attack.outcome),\n isSuccess: false,\n isSpecial: attack.isSpecial,\n isFumble: attack.isFumble,\n hitLocationLabel: \"-\",\n hitLocationRoll: null,\n rawDamage: 0,\n armor: 0,\n finalDamage: 0,\n remainingLocationHp: 0,\n remainingGeneralHp,\n energySourceLabel: energy.sourceLabel,\n energyCost: energy.cost,\n energyRemaining: energy.remaining,\n notes: `Attack failed before damage was rolled. ${modifierResult.summary}`\n });\n return;\n }\n\n const hitSelection = await chooseOrRollHitLocation(targetActor ?? attacker);\n if (!hitSelection) return;\n\n const damageFormula = String(weapon.system.damageFormula || \"0\").trim() || \"0\";\n const damageRoll = await evaluateRollWithDice(damageFormula);\n const rawDamage = Math.max(0, num(damageRoll.total));\n\n const application = targetActor\n ? await applyLocationDamage(targetActor, hitSelection.slug, rawDamage)\n : {\n armor: 0,\n finalDamage: rawDamage,\n locationValue: 0,\n generalHpValue: 0\n };\n\n await postAttackCard({\n actor: attacker,\n actorName: attacker.name,\n actorImg: attacker.img,\n targetName,\n hasTarget,\n weaponName: weapon.name,\n weaponImg: weapon.img,\n skillName: linkedSkill.name,\n skillImg: linkedSkill.img,\n attackRoll: attack.roll,\n attackTarget: attack.target,\n attackOutcomeLabel: outcomeLabel(attack.outcome),\n isSuccess: attack.isSuccess,\n isSpecial: attack.isSpecial,\n isFumble: attack.isFumble,\n hitLocationLabel: hitSelection.label,\n hitLocationRoll: hitSelection.rolled,\n rawDamage,\n armor: application.armor,\n finalDamage: application.finalDamage,\n remainingLocationHp: application.locationValue,\n remainingGeneralHp: application.generalHpValue,\n energySourceLabel: energy.sourceLabel,\n energyCost: energy.cost,\n energyRemaining: energy.remaining,\n notes: targetActor\n ? `Location and general HP were both reduced by final damage, per Ringworld rules. ${modifierResult.summary}`\n : `No target selected: roll resolved with no damage application. ${modifierResult.summary}`\n });\n}\n\nexport function recomputeHitPointMaximums(actor: any): void {\n if (actor.type !== \"explorer\" && actor.type !== \"creature\") return;\n\n // Ringworld general HP is CON + MAS. Location HP then scales from that general HP.\n const con = num(actor.system?.characteristics?.con, 10);\n const mas = num(actor.system?.characteristics?.mas, 10);\n const existingMax = num(actor.system.generalHp?.max, 0);\n const existingValue = num(actor.system.generalHp?.value, 0);\n const generalMax = Math.max(1, Math.floor(con + mas));\n\n actor.system.generalHp = actor.system.generalHp ?? { value: generalMax, max: generalMax };\n actor.system.generalHp.max = generalMax;\n const hadExisting = existingMax > 0;\n const wasFull = hadExisting && existingValue >= existingMax;\n const looksPlaceholder = existingMax <= 1 && existingValue <= 1;\n const preservedDamage = hadExisting ? Math.max(0, existingMax - existingValue) : 0;\n const recomputedValue = (!hadExisting || wasFull || looksPlaceholder)\n ? generalMax\n : Math.max(0, generalMax - preservedDamage);\n\n actor.system.generalHp.value = Math.min(Math.max(0, recomputedValue), generalMax);\n const generalAtFull = num(actor.system.generalHp.value, generalMax) >= generalMax;\n\n actor.system.hitLocations = actor.system.hitLocations ?? {};\n actor.system.hitLocationSchema = actor.system.hitLocationSchema ?? \"auto\";\n const schema = getActorHitLocationSchema(actor);\n\n for (const entry of schema.entries) {\n const slug = entry.slug;\n const loc = actor.system.hitLocations[slug] ?? {\n label: slug,\n hp: { value: 1, max: 1 },\n armor: 0\n };\n loc.label = entry.label;\n const hpFactor = Math.max(0.05, num((entry as any).hpFactor, 0.3));\n const max = Math.max(1, Math.ceil(generalMax * hpFactor));\n\n const previousMax = num(loc.hp?.max, 1);\n const previousValue = num(loc.hp?.value, previousMax);\n const isPlaceholder = previousMax <= 1 && previousValue <= 1;\n const shouldBackfillToFull = generalAtFull && previousValue <= 1 && max > 1;\n\n loc.hp.max = max;\n loc.hp.value = (isPlaceholder || shouldBackfillToFull) ? max : Math.min(previousValue, max);\n actor.system.hitLocations[slug] = loc;\n }\n}\n\nexport function getTemplatePath(path: string): string {\n return `systems/${SYSTEM_ID}/templates/${path}`;\n}\n","import { SYSTEM_ID } from \"./constants\";\nimport { normalizeSkillName, RINGWORLD_BASE_SKILLS } from \"./data-base-skills\";\nimport { skillIconPath } from \"./skill-icons\";\n\nexport type GravityType = \"light\" | \"normal\" | \"heavy\";\n\ninterface SpeciesCatalogEntry {\n name: string;\n playable: boolean;\n gravity: GravityType;\n homeworld: string;\n modifiers: {\n str: number;\n mas: number;\n con: number;\n int: number;\n pow: number;\n dex: number;\n app: number;\n edu: number;\n age: number;\n };\n notes: string;\n}\n\ninterface WeaponCatalogEntry {\n name: string;\n equipped?: boolean;\n weight?: number;\n linkedSkill: string;\n attackType: \"melee\" | \"ranged\";\n damageFormula: string;\n range: { close: string; medium: string; long: string };\n energyUsedPerAttack: number;\n ammoUsedPerAttack: number;\n powerSource: \"actor\" | \"powerPack\";\n notes: string;\n}\n\ninterface ArmorCatalogEntry {\n name: string;\n equipped: boolean;\n weight?: number;\n value: number;\n coverage: Record<string, boolean>;\n notes: string;\n}\n\ninterface GearCatalogEntry {\n name: string;\n equipped?: boolean;\n weight: number;\n cost: number;\n energyUse: number;\n powerSupplyNotes: string;\n isPowerPack: boolean;\n energy: { value: number; max: number };\n notes: string;\n}\n\ninterface PursuitCatalogEntry {\n name: string;\n rollRange: string;\n wealthValue: number;\n occupationPointsPerYear: number;\n fixedSkills: string[];\n optionalSkillGroups?: Array<{\n choose: number;\n skills: string[];\n }>;\n notes: string;\n}\n\ninterface CatalogSeed {\n key: string;\n data: any;\n folderKey: \"species\" | \"skills\" | \"pursuits\" | \"gear\" | \"armor\" | \"weaponMelee\" | \"weaponRanged\";\n img: string;\n}\n\nexport const RINGWORLD_CATALOG_VERSION = 9;\n\nconst ICONS = {\n speciesDefault: \"systems/ringworld/assets/icons/species.svg\",\n skillDefault: \"systems/ringworld/assets/icons/skill.svg\",\n pursuitDefault: \"systems/ringworld/assets/icons/pursuit.svg\",\n weaponMelee: \"systems/ringworld/assets/icons/weapon-melee.svg\",\n weaponRanged: \"systems/ringworld/assets/icons/weapon-ranged.svg\",\n armor: \"systems/ringworld/assets/icons/armor.svg\",\n gearDefault: \"systems/ringworld/assets/icons/gear.svg\",\n powerPackDefault: \"systems/ringworld/assets/icons/power-pack.svg\"\n};\n\nfunction iconSlug(name: string): string {\n return String(name)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction speciesIconPath(name: string): string {\n return `systems/ringworld/assets/icons/species/${iconSlug(name)}.svg`;\n}\n\nfunction weaponIconPath(name: string): string {\n return `systems/ringworld/assets/icons/weapon/${iconSlug(name)}.svg`;\n}\n\nfunction armorIconPath(name: string): string {\n return `systems/ringworld/assets/icons/armor/${iconSlug(name)}.svg`;\n}\n\nfunction gearIconPath(name: string): string {\n return `systems/ringworld/assets/icons/gear/${iconSlug(name)}.svg`;\n}\n\nfunction pursuitIconPath(name: string): string {\n return `systems/ringworld/assets/icons/pursuit/${iconSlug(name)}.svg`;\n}\n\nconst allCoverage = {\n rLeg: true,\n lLeg: true,\n abdomen: true,\n chest: true,\n rArm: true,\n lArm: true,\n head: true\n};\n\nconst torsoCoverage = {\n rLeg: false,\n lLeg: false,\n abdomen: true,\n chest: true,\n rArm: false,\n lArm: false,\n head: false\n};\n\nconst headCoverage = {\n rLeg: false,\n lLeg: false,\n abdomen: false,\n chest: false,\n rArm: false,\n lArm: false,\n head: true\n};\n\nconst armCoverage = {\n rLeg: false,\n lLeg: false,\n abdomen: false,\n chest: false,\n rArm: true,\n lArm: true,\n head: false\n};\n\nconst legCoverage = {\n rLeg: true,\n lLeg: true,\n abdomen: false,\n chest: false,\n rArm: false,\n lArm: false,\n head: false\n};\n\nexport const SPECIES_CATALOG: SpeciesCatalogEntry[] = [\n {\n name: \"Human\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Known Space\",\n modifiers: { str: 0, mas: 0, con: 0, int: 0, pow: 0, dex: 0, app: 0, edu: 0, age: 0 },\n notes: \"Baseline human explorer profile.\"\n },\n {\n name: \"Earth Human\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Earth\",\n modifiers: { str: 0, mas: 0, con: 0, int: 0, pow: 1, dex: 0, app: 0, edu: 0, age: 0 },\n notes: \"Earth-line humans with stronger latent psionic potential.\"\n },\n {\n name: \"Kzinti\",\n playable: true,\n gravity: \"heavy\",\n homeworld: \"Kzin\",\n modifiers: { str: 2, mas: 2, con: 1, int: -1, pow: 0, dex: 0, app: -2, edu: 0, age: 0 },\n notes: \"Predatory felinoids with high physical strength.\"\n },\n {\n name: \"Pierson's Puppeteer\",\n playable: true,\n gravity: \"light\",\n homeworld: \"Fleet of Worlds\",\n modifiers: { str: -2, mas: -2, con: -1, int: 2, pow: 1, dex: 1, app: 0, edu: 1, age: 0 },\n notes: \"Highly intelligent, cautious engineers.\"\n },\n {\n name: \"Dolphin\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Human Space Oceans\",\n modifiers: { str: -2, mas: 1, con: 1, int: 0, pow: 0, dex: 0, app: 0, edu: 0, age: 0 },\n notes: \"Aquatic specialists with enhanced endurance.\"\n },\n {\n name: \"Trinoc\",\n playable: true,\n gravity: \"light\",\n homeworld: \"Trinoc Worlds\",\n modifiers: { str: -1, mas: -1, con: 0, int: 1, pow: 0, dex: 1, app: 0, edu: 0, age: 0 },\n notes: \"Three-eyed flyers with excellent perception.\"\n },\n {\n name: \"Martian\",\n playable: true,\n gravity: \"light\",\n homeworld: \"Mars\",\n modifiers: { str: -1, mas: -1, con: -1, int: 1, pow: 0, dex: 1, app: 0, edu: 0, age: 0 },\n notes: \"Light-gravity adapted intellect-focused profile.\"\n },\n {\n name: \"Pierin\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Pierin Space\",\n modifiers: { str: 0, mas: 0, con: 0, int: 1, pow: 0, dex: 0, app: 1, edu: 0, age: 0 },\n notes: \"Socially adept, technically curious explorers.\"\n },\n {\n name: \"Boat People\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Ringworld\",\n modifiers: { str: 0, mas: 0, con: 1, int: 0, pow: 0, dex: 0, app: 0, edu: -1, age: 0 },\n notes: \"Ringworld hominids adapted to river and sea cultures.\"\n },\n {\n name: \"Builder\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Ringworld\",\n modifiers: { str: 1, mas: 1, con: 0, int: 0, pow: 0, dex: 0, app: -1, edu: 0, age: 0 },\n notes: \"Ringworld labor stock with robust build.\"\n },\n {\n name: \"Ghoul\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Ringworld\",\n modifiers: { str: 0, mas: 0, con: 1, int: -1, pow: 0, dex: 1, app: -2, edu: -1, age: 0 },\n notes: \"Scavenger subspecies with strong survival instincts.\"\n },\n {\n name: \"Bandersnatchi\",\n playable: false,\n gravity: \"heavy\",\n homeworld: \"Known Space\",\n modifiers: { str: 4, mas: 4, con: 3, int: 0, pow: 0, dex: -2, app: -3, edu: 0, age: 10 },\n notes: \"Massive engineered beings; typically GM creature profile.\"\n }\n];\n\nexport const WEAPON_CATALOG: WeaponCatalogEntry[] = [\n {\n name: \"Variable Sword\",\n equipped: true,\n weight: 1.5,\n linkedSkill: \"V. Sword, F. Laser\",\n attackType: \"melee\",\n damageFormula: \"1d10+1\",\n range: { close: \"Melee\", medium: \"-\", long: \"-\" },\n energyUsedPerAttack: 1,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"High-energy blade weapon.\"\n },\n {\n name: \"Monofilament Knife\",\n equipped: true,\n weight: 0.2,\n linkedSkill: \"Archaic Melee Weapon\",\n attackType: \"melee\",\n damageFormula: \"1d6+1\",\n range: { close: \"Melee\", medium: \"-\", long: \"-\" },\n energyUsedPerAttack: 0,\n ammoUsedPerAttack: 0,\n powerSource: \"actor\",\n notes: \"Fine-edge close combat blade.\"\n },\n {\n name: \"Shock Baton\",\n equipped: true,\n weight: 1.2,\n linkedSkill: \"Unarmed Combat\",\n attackType: \"melee\",\n damageFormula: \"1d8+1\",\n range: { close: \"Melee\", medium: \"-\", long: \"-\" },\n energyUsedPerAttack: 1,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"Close-quarters stun baton.\"\n },\n {\n name: \"Flashlight Laser\",\n equipped: true,\n weight: 0.8,\n linkedSkill: \"V. Sword, F. Laser\",\n attackType: \"ranged\",\n damageFormula: \"1d10\",\n range: { close: \"Short\", medium: \"Medium\", long: \"Long\" },\n energyUsedPerAttack: 2,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"Compact laser unit.\"\n },\n {\n name: \"Laser Pistol\",\n equipped: true,\n weight: 1.4,\n linkedSkill: \"Handgun, Energy\",\n attackType: \"ranged\",\n damageFormula: \"1d10+1\",\n range: { close: \"Short\", medium: \"Medium\", long: \"Long\" },\n energyUsedPerAttack: 2,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"Common energy sidearm.\"\n },\n {\n name: \"Laser Rifle\",\n equipped: true,\n weight: 4.5,\n linkedSkill: \"Heavy Weapon, Energy\",\n attackType: \"ranged\",\n damageFormula: \"2d6+2\",\n range: { close: \"Short\", medium: \"Long\", long: \"Extreme\" },\n energyUsedPerAttack: 3,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"Standard long-arm laser weapon.\"\n },\n {\n name: \"Stunner\",\n equipped: true,\n weight: 1.0,\n linkedSkill: \"Handgun, Energy\",\n attackType: \"ranged\",\n damageFormula: \"1d6\",\n range: { close: \"Short\", medium: \"Medium\", long: \"Long\" },\n energyUsedPerAttack: 1,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"Low-lethality disruption sidearm.\"\n },\n {\n name: \"Handgun (Projectile)\",\n equipped: true,\n weight: 1.2,\n linkedSkill: \"Handgun, Projectile\",\n attackType: \"ranged\",\n damageFormula: \"1d10\",\n range: { close: \"Short\", medium: \"Medium\", long: \"Long\" },\n energyUsedPerAttack: 0,\n ammoUsedPerAttack: 1,\n powerSource: \"actor\",\n notes: \"Conventional projectile sidearm.\"\n },\n {\n name: \"Rifle (Projectile)\",\n equipped: true,\n weight: 5.0,\n linkedSkill: \"Heavy Weapon, Projectile\",\n attackType: \"ranged\",\n damageFormula: \"2d6\",\n range: { close: \"Short\", medium: \"Long\", long: \"Extreme\" },\n energyUsedPerAttack: 0,\n ammoUsedPerAttack: 1,\n powerSource: \"actor\",\n notes: \"Conventional projectile rifle.\"\n },\n {\n name: \"Slug Thrower Carbine\",\n equipped: true,\n weight: 3.8,\n linkedSkill: \"Heavy Weapon, Projectile\",\n attackType: \"ranged\",\n damageFormula: \"2d6+1\",\n range: { close: \"Short\", medium: \"Long\", long: \"Extreme\" },\n energyUsedPerAttack: 0,\n ammoUsedPerAttack: 1,\n powerSource: \"actor\",\n notes: \"Compact projectile carbine.\"\n }\n];\n\nexport const ARMOR_CATALOG: ArmorCatalogEntry[] = [\n { name: \"Cloth Vest\", equipped: true, weight: 2, value: 1, coverage: torsoCoverage, notes: \"Basic torso protection.\" },\n { name: \"Soft Combat Vest\", equipped: true, weight: 4, value: 2, coverage: torsoCoverage, notes: \"Flexible tactical vest.\" },\n { name: \"Combat Harness\", equipped: true, weight: 5, value: 2, coverage: { ...torsoCoverage, rArm: true, lArm: true }, notes: \"Torso + upper arms.\" },\n { name: \"Armored Coat\", equipped: true, weight: 7, value: 3, coverage: { ...torsoCoverage, rArm: true, lArm: true }, notes: \"Heavy coat with arm plating.\" },\n { name: \"Leg Guards\", equipped: true, weight: 4, value: 2, coverage: legCoverage, notes: \"Lower-body armor.\" },\n { name: \"Arm Bracers\", equipped: true, weight: 2, value: 2, coverage: armCoverage, notes: \"Forearm and upper arm guards.\" },\n { name: \"Combat Helmet\", equipped: true, weight: 1.5, value: 2, coverage: headCoverage, notes: \"Cranial protection.\" },\n { name: \"Full Combat Suit\", equipped: true, weight: 12, value: 3, coverage: allCoverage, notes: \"Full-body armored suit.\" },\n { name: \"Impact Suit\", equipped: true, weight: 16, value: 4, coverage: allCoverage, notes: \"High-end impact and hazard suit.\" }\n];\n\nexport const GEAR_CATALOG: GearCatalogEntry[] = [\n {\n name: \"Power Pack R20\",\n weight: 1,\n cost: 100,\n energyUse: 0,\n powerSupplyNotes: \"Rechargeable power pack\",\n isPowerPack: true,\n energy: { value: 20, max: 20 },\n notes: \"Standard personal battery pack.\"\n },\n {\n name: \"Power Pack R50\",\n weight: 2,\n cost: 220,\n energyUse: 0,\n powerSupplyNotes: \"Rechargeable power pack\",\n isPowerPack: true,\n energy: { value: 50, max: 50 },\n notes: \"Extended personal battery pack.\"\n },\n {\n name: \"Power Pack R100\",\n weight: 4,\n cost: 400,\n energyUse: 0,\n powerSupplyNotes: \"Rechargeable power pack\",\n isPowerPack: true,\n energy: { value: 100, max: 100 },\n notes: \"High-capacity field battery.\"\n },\n { name: \"Portable Generator\", weight: 8, cost: 700, energyUse: 0, powerSupplyNotes: \"Provides charging capacity\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Portable recharge generator.\" },\n { name: \"MicroMind Unit\", weight: 0.5, cost: 900, energyUse: 1, powerSupplyNotes: \"Requires external power\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Portable advanced computation module.\" },\n { name: \"Memory Bubble Reader\", weight: 0.5, cost: 450, energyUse: 1, powerSupplyNotes: \"Standard battery compatible\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Reads and writes memory bubbles.\" },\n { name: \"Autodoc (Portable)\", weight: 18, cost: 3500, energyUse: 6, powerSupplyNotes: \"High draw medical station\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Field medical support unit.\" },\n { name: \"Medkit\", weight: 1, cost: 120, energyUse: 0, powerSupplyNotes: \"None\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Manual emergency treatment supplies.\" },\n { name: \"Bioscanner\", weight: 1, cost: 300, energyUse: 1, powerSupplyNotes: \"Battery or generator\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Vitals and hazard scanning tool.\" },\n { name: \"Survey Scanner\", weight: 2, cost: 500, energyUse: 2, powerSupplyNotes: \"Battery or generator\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Terrain and structure analysis scanner.\" },\n { name: \"Translator Module\", weight: 0.5, cost: 650, energyUse: 1, powerSupplyNotes: \"Battery compatible\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Linguistic conversion and support.\" },\n { name: \"Holo Projector\", weight: 1.5, cost: 800, energyUse: 2, powerSupplyNotes: \"Battery compatible\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Short-range holographic projection.\" },\n { name: \"Stasis Box\", weight: 12, cost: 2600, energyUse: 5, powerSupplyNotes: \"Continuous power required\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Suspended animation container.\" },\n { name: \"Reactionless Flycycle\", weight: 35, cost: 4200, energyUse: 4, powerSupplyNotes: \"Vehicle power core\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Single-rider reactionless vehicle.\" },\n { name: \"Field Toolkit\", weight: 2, cost: 180, energyUse: 0, powerSupplyNotes: \"None\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Mechanical and electronics repair kit.\" },\n { name: \"Vac Suit\", weight: 7, cost: 1400, energyUse: 1, powerSupplyNotes: \"Suit battery required\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Pressure and vacuum survival suit.\" },\n { name: \"Air Reprocessor\", weight: 3, cost: 950, energyUse: 2, powerSupplyNotes: \"Continuous power\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Atmosphere recycling support unit.\" },\n { name: \"Signal Beacon\", weight: 1, cost: 140, energyUse: 1, powerSupplyNotes: \"Battery compatible\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Emergency and navigation beacon.\" }\n];\n\nexport const PURSUIT_CATALOG: PursuitCatalogEntry[] = [\n {\n name: \"Artist\",\n rollRange: \"01-07\",\n wealthValue: 0,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Athletics\", \"Computers\", \"Fast Talk\", \"Fine Arts\", \"Hide\", \"Musicianship\", \"Observe\", \"Perform\", \"Psychology\", \"Scent\", \"Theology\"],\n notes: \"Creative specialist pursuit.\"\n },\n {\n name: \"Colonist\",\n rollRange: \"08-27\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Atmospheric Craft\", \"Bargain\", \"Ground Vehicle\", \"Farming\", \"Handgun, Energy\", \"Personal Flyer\", \"Listen\", \"Heavy Weapon, Energy\", \"Observe\", \"Planetology\", \"Search\", \"Track\"],\n notes: \"Settlement and frontier operations pursuit.\"\n },\n {\n name: \"Criminal\",\n rollRange: \"28-29\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Bargain\", \"Computers\", \"Fast Talk\", \"Hide\", \"Personal Flyer\", \"Handgun, Energy\", \"Handgun, Projectile\", \"Sneak\", \"Unarmed Combat\"],\n notes: \"Underground survival pursuit.\"\n },\n {\n name: \"Dilettante\",\n rollRange: \"30\",\n wealthValue: 5,\n occupationPointsPerYear: 15,\n fixedSkills: [],\n notes: \"Any skills allowed; uses 15 occupation points per year.\"\n },\n {\n name: \"Engineer\",\n rollRange: \"31-36\",\n wealthValue: 2,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Astronomy\", \"Chemistry\", \"Computers\", \"Engineering\", \"Ground Vehicle\", \"Mathematics\", \"Personal Flyer\", \"Physics\", \"Planetology\", \"Reaction Drive\", \"Reactionless Drive\", \"Repair\"],\n notes: \"Technical design and maintenance pursuit.\"\n },\n {\n name: \"Entertainer\",\n rollRange: \"37-38\",\n wealthValue: 2,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Athletics\", \"Bargain\", \"Own Language\", \"Musicianship\", \"Observe\", \"Orate\", \"Perform\", \"Psychology\", \"Search\", \"Sneak\"],\n notes: \"Performance and social influence pursuit.\"\n },\n {\n name: \"Explorer\",\n rollRange: \"39-52\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Athletics\", \"Atmospheric Craft\", \"Bargain\", \"Biology\", \"Botany\", \"Emergency Treatment\", \"Engineering\", \"Ground Vehicle\", \"Handgun, Energy\", \"Heavy Weapon, Energy\", \"Hyperdrive\", \"Observe\", \"Planetology\", \"Reactionless Drive\", \"Repair\", \"Search\", \"Track\", \"Zoology\"],\n notes: \"Survey and expedition pursuit.\"\n },\n {\n name: \"Functionary\",\n rollRange: \"53-56\",\n wealthValue: 3,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Bargain\", \"Debate\", \"Fast Talk\", \"History\", \"Law\", \"Observe\", \"Orate\", \"Psychology\", \"Strategy\", \"Theology\"],\n notes: \"Administrative and governance pursuit.\"\n },\n {\n name: \"Journalist/Writer\",\n rollRange: \"57-59\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Anthropology\", \"Bargain\", \"Computers\", \"Debate\", \"History\", \"Fine Arts\", \"Own Language\", \"Law\", \"Observe\", \"Psychology\", \"Search\", \"Sneak\", \"Unarmed Combat\", \"Weapons System\"],\n notes: \"Investigation and reporting pursuit.\"\n },\n {\n name: \"Miner\",\n rollRange: \"60-65\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Atmospheric Craft\", \"Aquatic Vehicle\", \"Bargain\", \"Climb (Custom)\", \"Computers\", \"Emergency Treatment\", \"Engineering\", \"Handgun, Energy\", \"Heavy Weapon, Energy\", \"Observe\", \"Personal Flyer\", \"Planetology\", \"Reaction Drive\", \"Reactionless Drive\", \"Repair\", \"Search\"],\n notes: \"Resource extraction frontier pursuit.\"\n },\n {\n name: \"Pilot\",\n rollRange: \"66-68\",\n wealthValue: 3,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Astronomy\", \"Atmospheric Craft\", \"Computers\", \"Engineering\", \"Hyperdrive\", \"History\", \"Law\", \"Mathematics\", \"Physics\", \"Reaction Drive\", \"Reactionless Drive\", \"Repair\", \"Strategy\", \"Weapons System\"],\n notes: \"Flight and spacecraft operations pursuit.\"\n },\n {\n name: \"Police Officer\",\n rollRange: \"69-76\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Atmospheric Craft\", \"Bargain\", \"Computers\", \"Fast Talk\", \"Emergency Treatment\", \"Handgun, Energy\", \"Handgun, Projectile\", \"Heavy Weapon, Energy\", \"Heavy Weapon, Projectile\", \"Law\", \"Observe\", \"Personal Flyer\", \"Psychology\", \"Search\", \"Unarmed Combat\"],\n notes: \"Law enforcement and response pursuit.\"\n },\n {\n name: \"Politician\",\n rollRange: \"77-78\",\n wealthValue: 3,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Bargain\", \"Computers\", \"Debate\", \"Fast Talk\", \"History\", \"Orate\", \"Own Language\", \"Perform\", \"Psychology\"],\n optionalSkillGroups: [\n {\n choose: 1,\n skills: [\"Engineering\", \"Farming\", \"Second Languages\", \"Strategy\", \"Theology\"]\n }\n ],\n notes: \"Public office and influence pursuit.\"\n },\n {\n name: \"Prisoner\",\n rollRange: \"79-80\",\n wealthValue: 0,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Bargain\", \"Fast Talk\", \"Hide\", \"Observe\", \"Psychology\", \"Search\", \"Sneak\", \"Unarmed Combat\"],\n notes: \"Carceral survival pursuit.\"\n },\n {\n name: \"Scholar\",\n rollRange: \"81-84\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [],\n optionalSkillGroups: [\n {\n choose: 2,\n skills: [\"Anthropology\", \"Astronomy\", \"Biology\", \"Botany\", \"Chemistry\", \"Computers\", \"Engineering\", \"Fine Arts\", \"History\", \"Law\", \"Mathematics\", \"Own Language\", \"Physics\", \"Planetology\", \"Second Languages\", \"Theology\", \"Zoology\"]\n }\n ],\n notes: \"Academic pursuit; pick up to two listed skills.\"\n },\n {\n name: \"Scientific Researcher\",\n rollRange: \"85-94\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [],\n optionalSkillGroups: [\n {\n choose: 3,\n skills: [\"Anthropology\", \"Astronomy\", \"Bargain\", \"Biology\", \"Botany\", \"Chemistry\", \"Computers\", \"Engineering\", \"History\", \"Mathematics\", \"Observe\", \"Personal Flyer\", \"Physics\", \"Planetology\", \"Psychology\", \"Repair\", \"Search\", \"Zoology\"]\n }\n ],\n notes: \"Research pursuit; pick up to three listed skills.\"\n },\n {\n name: \"Soldier\",\n rollRange: \"95-98\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Athletics\", \"Atmospheric Craft\", \"Aquatic Vehicle\", \"Computers\", \"Emergency Treatment\", \"Fast Talk\", \"Ground Vehicle\", \"Handgun, Energy\", \"Handgun, Projectile\", \"Heavy Weapon, Energy\", \"Heavy Weapon, Projectile\"],\n notes: \"Military operations pursuit.\"\n },\n {\n name: \"Zealot\",\n rollRange: \"99-00\",\n wealthValue: 0,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Bargain\", \"Debate\", \"Fast Talk\", \"Fine Arts\", \"Handgun, Energy\", \"Handgun, Projectile\", \"Hide\", \"Own Language\", \"Law\", \"Strategy\", \"Orate\", \"Psychology\", \"Theology\"],\n notes: \"Ideological dedication pursuit.\"\n }\n];\n\nexport function speciesCatalogForGeneration(): SpeciesCatalogEntry[] {\n return SPECIES_CATALOG.filter((entry) => entry.playable);\n}\n\nfunction itemKey(type: string, name: string): string {\n return `${type}:${normalizeSkillName(name)}`;\n}\n\nfunction itemTypeAvailable(type: string): boolean {\n const directTypes = (getDocumentClass(\"Item\") as any)?.TYPES;\n if (Array.isArray(directTypes)) return directTypes.includes(type);\n\n const docTypes = (game as any)?.system?.documentTypes?.Item;\n if (Array.isArray(docTypes)) return docTypes.includes(type);\n if (docTypes && typeof docTypes === \"object\") return Object.prototype.hasOwnProperty.call(docTypes, type);\n\n const configModels = (CONFIG as any)?.Item?.dataModels;\n if (configModels && typeof configModels === \"object\" && Object.prototype.hasOwnProperty.call(configModels, type)) {\n return true;\n }\n\n const gameModels = (game as any)?.model?.Item;\n if (gameModels && typeof gameModels === \"object\" && Object.prototype.hasOwnProperty.call(gameModels, type)) {\n return true;\n }\n\n return false;\n}\n\nfunction toSkillItem(entry: (typeof RINGWORLD_BASE_SKILLS)[number]): CatalogSeed {\n return {\n key: itemKey(\"skill\", entry.name),\n folderKey: \"skills\",\n img: skillIconPath(entry.name) || ICONS.skillDefault,\n data: {\n name: entry.name,\n type: \"skill\",\n system: {\n value: entry.base,\n category: entry.category,\n specialization: entry.specialization ?? \"\"\n }\n }\n };\n}\n\nfunction toSpeciesItem(entry: SpeciesCatalogEntry): CatalogSeed {\n const img = speciesIconPath(entry.name) || ICONS.speciesDefault;\n return {\n key: itemKey(\"species\", entry.name),\n folderKey: \"species\",\n img,\n data: {\n name: entry.name,\n type: \"species\",\n system: {\n playable: entry.playable,\n gravity: entry.gravity,\n homeworld: entry.homeworld,\n modifiers: entry.modifiers,\n notes: entry.notes\n }\n }\n };\n}\n\nfunction toWeaponItem(entry: WeaponCatalogEntry): CatalogSeed {\n const folderKey = entry.attackType === \"melee\" ? \"weaponMelee\" : \"weaponRanged\";\n const img = weaponIconPath(entry.name) || (entry.attackType === \"melee\" ? ICONS.weaponMelee : ICONS.weaponRanged);\n return {\n key: itemKey(\"weapon\", entry.name),\n folderKey,\n img,\n data: {\n name: entry.name,\n type: \"weapon\",\n system: {\n equipped: entry.equipped ?? true,\n stowed: false,\n weight: entry.weight ?? 0,\n linkedSkill: entry.linkedSkill,\n linkedSkillId: \"\",\n attackType: entry.attackType,\n damageFormula: entry.damageFormula,\n range: entry.range,\n energyUsedPerAttack: entry.energyUsedPerAttack,\n ammoUsedPerAttack: entry.ammoUsedPerAttack,\n powerSource: entry.powerSource,\n powerPackId: \"\",\n notes: entry.notes\n }\n }\n };\n}\n\nfunction toArmorItem(entry: ArmorCatalogEntry): CatalogSeed {\n const img = armorIconPath(entry.name) || ICONS.armor;\n return {\n key: itemKey(\"armor\", entry.name),\n folderKey: \"armor\",\n img,\n data: {\n name: entry.name,\n type: \"armor\",\n system: {\n equipped: entry.equipped,\n stowed: false,\n weight: entry.weight ?? 0,\n value: entry.value,\n coverage: entry.coverage,\n perLocation: {\n rLeg: 0,\n lLeg: 0,\n abdomen: 0,\n chest: 0,\n rArm: 0,\n lArm: 0,\n head: 0\n },\n notes: entry.notes\n }\n }\n };\n}\n\nfunction toGearItem(entry: GearCatalogEntry): CatalogSeed {\n const img = gearIconPath(entry.name) || (entry.isPowerPack ? ICONS.powerPackDefault : ICONS.gearDefault);\n return {\n key: itemKey(\"gear\", entry.name),\n folderKey: \"gear\",\n img,\n data: {\n name: entry.name,\n type: \"gear\",\n system: {\n equipped: entry.equipped ?? true,\n stowed: false,\n weight: entry.weight,\n cost: entry.cost,\n energyUse: entry.energyUse,\n powerSupplyNotes: entry.powerSupplyNotes,\n isPowerPack: entry.isPowerPack,\n energy: entry.energy,\n notes: entry.notes\n }\n }\n };\n}\n\nfunction toPursuitItem(entry: PursuitCatalogEntry): CatalogSeed {\n const img = pursuitIconPath(entry.name) || ICONS.pursuitDefault;\n return {\n key: itemKey(\"pursuit\", entry.name),\n folderKey: \"pursuits\",\n img,\n data: {\n name: entry.name,\n type: \"pursuit\",\n system: {\n wealthValue: entry.wealthValue,\n occupationPointsPerYear: entry.occupationPointsPerYear,\n rollRange: entry.rollRange,\n fixedSkills: entry.fixedSkills,\n optionalSkillGroups: entry.optionalSkillGroups ?? [],\n notes: entry.notes\n }\n }\n };\n}\n\nfunction pursuitAsGearNotes(entry: PursuitCatalogEntry): string {\n const fixed = entry.fixedSkills.length ? `Fixed skills: ${entry.fixedSkills.join(\", \")}` : \"Fixed skills: (none)\";\n const optional = (entry.optionalSkillGroups ?? []).map((group) => `Choose ${group.choose}: ${group.skills.join(\", \")}`).join(\" | \");\n const optionalText = optional ? ` Optional: ${optional}.` : \"\";\n return `${entry.notes} ${fixed}.${optionalText} Wealth ${entry.wealthValue}. Occupation points/year ${entry.occupationPointsPerYear}.`;\n}\n\nfunction toPursuitFallbackGearItem(entry: PursuitCatalogEntry): CatalogSeed {\n const img = pursuitIconPath(entry.name) || ICONS.pursuitDefault;\n const itemName = `Pursuit: ${entry.name}`;\n return {\n key: itemKey(\"gear\", itemName),\n folderKey: \"pursuits\",\n img,\n data: {\n name: itemName,\n type: \"gear\",\n system: {\n equipped: false,\n stowed: true,\n weight: 0,\n cost: 0,\n energyUse: 0,\n powerSupplyNotes: \"Pursuit reference\",\n isPowerPack: false,\n energy: { value: 0, max: 0 },\n notes: pursuitAsGearNotes(entry)\n },\n flags: {\n ringworld: {\n pursuitData: {\n pursuitName: entry.name,\n rollRange: entry.rollRange,\n wealthValue: entry.wealthValue,\n occupationPointsPerYear: entry.occupationPointsPerYear,\n fixedSkills: entry.fixedSkills,\n optionalSkillGroups: entry.optionalSkillGroups ?? []\n }\n }\n }\n }\n };\n}\n\nasync function getOrCreateItemFolder(name: string, parentId: string | null): Promise<any> {\n const existing = game.folders.find(\n (folder: any) => folder.type === \"Item\" && folder.name === name && (folder.folder?.id ?? null) === parentId\n );\n if (existing) return existing;\n\n return Folder.create({\n name,\n type: \"Item\",\n folder: parentId,\n sorting: \"a\"\n });\n}\n\nasync function ensureCatalogFolders(): Promise<Record<CatalogSeed[\"folderKey\"], string>> {\n const root = await getOrCreateItemFolder(\"Ringworld Catalog\", null);\n const species = await getOrCreateItemFolder(\"Species\", root.id);\n const skills = await getOrCreateItemFolder(\"Skills\", root.id);\n const pursuits = await getOrCreateItemFolder(\"Pursuits\", root.id);\n const gear = await getOrCreateItemFolder(\"Gear\", root.id);\n const armor = await getOrCreateItemFolder(\"Armor\", gear.id);\n const weapons = await getOrCreateItemFolder(\"Weapons\", root.id);\n const weaponMelee = await getOrCreateItemFolder(\"Melee Weapons\", weapons.id);\n const weaponRanged = await getOrCreateItemFolder(\"Ranged Weapons\", weapons.id);\n\n return {\n species: species.id,\n skills: skills.id,\n pursuits: pursuits.id,\n gear: gear.id,\n armor: armor.id,\n weaponMelee: weaponMelee.id,\n weaponRanged: weaponRanged.id\n };\n}\n\nfunction buildAllSeeds(): CatalogSeed[] {\n const canUsePursuitType = itemTypeAvailable(\"pursuit\");\n return [\n ...SPECIES_CATALOG.map(toSpeciesItem),\n ...RINGWORLD_BASE_SKILLS.map(toSkillItem),\n ...(canUsePursuitType ? PURSUIT_CATALOG.map(toPursuitItem) : PURSUIT_CATALOG.map(toPursuitFallbackGearItem)),\n ...WEAPON_CATALOG.map(toWeaponItem),\n ...ARMOR_CATALOG.map(toArmorItem),\n ...GEAR_CATALOG.map(toGearItem)\n ];\n}\n\nexport async function seedWorldCatalog(options?: { notify?: boolean }): Promise<{ added: number; updated: number }> {\n if (!game.user?.isGM) return { added: 0, updated: 0 };\n\n const folderIds = await ensureCatalogFolders();\n const seeds = buildAllSeeds();\n\n const existing = new Map(\n game.items.map((item: any) => [itemKey(item.type, item.name), item])\n );\n\n const createPayload: any[] = [];\n const updatePayload: any[] = [];\n\n for (const seed of seeds) {\n const folderId = folderIds[seed.folderKey];\n const existingItem = existing.get(seed.key);\n\n if (!existingItem) {\n createPayload.push({\n ...seed.data,\n img: seed.img,\n folder: folderId,\n flags: {\n ringworld: {\n catalog: true,\n catalogKey: seed.key\n }\n }\n });\n continue;\n }\n\n const update: Record<string, unknown> = { _id: existingItem.id };\n\n if ((existingItem.folder?.id ?? null) !== folderId) {\n update.folder = folderId;\n }\n\n if (String(existingItem.img || \"\") !== seed.img) {\n update.img = seed.img;\n }\n\n if (existingItem.flags?.ringworld?.catalog !== true) {\n update[\"flags.ringworld.catalog\"] = true;\n }\n\n if (existingItem.flags?.ringworld?.catalogKey !== seed.key) {\n update[\"flags.ringworld.catalogKey\"] = seed.key;\n }\n\n const existingSystem = foundry.utils.deepClone(existingItem.system ?? {});\n const mergedSystem = foundry.utils.mergeObject(existingSystem, seed.data.system ?? {}, {\n inplace: false,\n insertKeys: true,\n insertValues: true,\n overwrite: false\n });\n const systemDiff = foundry.utils.diffObject(existingSystem, mergedSystem);\n if (Object.keys(systemDiff).length > 0) {\n update.system = mergedSystem;\n }\n\n if (Object.keys(update).length > 1) {\n updatePayload.push(update);\n }\n }\n\n if (createPayload.length) {\n await Item.createDocuments(createPayload as any[]);\n }\n\n if (updatePayload.length) {\n await Item.updateDocuments(updatePayload as any[]);\n }\n\n if (options?.notify) {\n ui.notifications?.info(`Ringworld catalog synced: +${createPayload.length} new, ${updatePayload.length} updated.`);\n }\n\n return { added: createPayload.length, updated: updatePayload.length };\n}\n\nexport function getPlayableSpeciesFromWorld(): any[] {\n return game.items.filter((item: any) => item.type === \"species\" && item.system.playable);\n}\n\nexport function ringworldSystemSettingKey(key: string): string {\n return `${SYSTEM_ID}.${key}`;\n}\n","import { speciesCatalogForGeneration, getPlayableSpeciesFromWorld } from \"./world-catalog\";\nimport { evaluateRollWithDice } from \"./utils/dice\";\n\ntype GravityType = \"light\" | \"normal\" | \"heavy\";\n\ninterface CharacteristicSet {\n str: number;\n mas: number;\n con: number;\n int: number;\n pow: number;\n dex: number;\n app: number;\n edu: number;\n age: number;\n}\n\nfunction clampScore(value: number): number {\n return Math.max(1, Math.min(99, Math.floor(value)));\n}\n\nasync function rollTotal(formula: string): Promise<number> {\n const roll = await evaluateRollWithDice(formula);\n return Number(roll.total ?? 0);\n}\n\nasync function rollEdu(): Promise<number> {\n let edu = 10;\n while (true) {\n const die = await rollTotal(\"1d6\");\n edu += die;\n if (die <= 4) break;\n }\n return clampScore(edu);\n}\n\nasync function rollByGravity(gravity: GravityType): Promise<CharacteristicSet> {\n const gravityFormulas = {\n light: { str: \"2d6+3\", mas: \"2d6+3\", con: \"2d6+6\", dex: \"2d6+9\" },\n normal: { str: \"2d6+6\", mas: \"2d6+6\", con: \"2d6+6\", dex: \"2d6+6\" },\n heavy: { str: \"2d6+9\", mas: \"2d6+9\", con: \"2d6+3\", dex: \"2d6+6\" }\n }[gravity];\n\n return {\n str: await rollTotal(gravityFormulas.str),\n mas: await rollTotal(gravityFormulas.mas),\n con: await rollTotal(gravityFormulas.con),\n int: await rollTotal(\"2d6+6\"),\n pow: await rollTotal(\"2d6+6\"),\n dex: await rollTotal(gravityFormulas.dex),\n app: await rollTotal(\"2d6+6\"),\n edu: await rollEdu(),\n age: await rollTotal(\"1d20+16\")\n };\n}\n\nfunction randomPick<T>(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction randomExplorerName(speciesName: string): string {\n const starts = [\"Ar\", \"Bel\", \"Cor\", \"Den\", \"Ela\", \"Far\", \"Gal\", \"Hel\", \"Ira\", \"Jun\", \"Kor\", \"Lys\", \"Mor\", \"Nyr\", \"Or\", \"Pra\", \"Qua\", \"Rin\", \"Sol\", \"Tor\", \"Uri\", \"Val\", \"Wen\", \"Xel\", \"Yor\", \"Zen\"];\n const ends = [\"an\", \"el\", \"is\", \"or\", \"us\", \"a\", \"en\", \"ion\", \"eth\", \"al\", \"ir\", \"os\"];\n return `${randomPick(starts)}${randomPick(ends)} (${speciesName})`;\n}\n\nfunction applySpeciesModifiers(base: CharacteristicSet, speciesSystem: any): CharacteristicSet {\n const mods = speciesSystem?.modifiers ?? {};\n return {\n str: clampScore(base.str + Number(mods.str || 0)),\n mas: clampScore(base.mas + Number(mods.mas || 0)),\n con: clampScore(base.con + Number(mods.con || 0)),\n int: clampScore(base.int + Number(mods.int || 0)),\n pow: clampScore(base.pow + Number(mods.pow || 0)),\n dex: clampScore(base.dex + Number(mods.dex || 0)),\n app: clampScore(base.app + Number(mods.app || 0)),\n edu: clampScore(base.edu + Number(mods.edu || 0)),\n age: clampScore(base.age + Number(mods.age || 0))\n };\n}\n\nexport async function rollCharacteristicsForActor(actor: any): Promise<void> {\n const gravity = String(actor.system?.profile?.gravity || \"normal\") as GravityType;\n const gravityType: GravityType = gravity === \"light\" || gravity === \"heavy\" ? gravity : \"normal\";\n\n const currentSpeciesName = String(actor.system?.profile?.species || \"\");\n const worldSpecies = getPlayableSpeciesFromWorld();\n const speciesItem = worldSpecies.find((item: any) => item.name === currentSpeciesName);\n const builtIn = speciesCatalogForGeneration().find((entry) => entry.name === currentSpeciesName);\n const speciesSystem = speciesItem?.system ?? builtIn ?? null;\n\n const rolled = await rollByGravity(gravityType);\n const finalValues = applySpeciesModifiers(rolled, speciesSystem);\n\n await actor.update({\n \"system.characteristics.str\": finalValues.str,\n \"system.characteristics.mas\": finalValues.mas,\n \"system.characteristics.con\": finalValues.con,\n \"system.characteristics.int\": finalValues.int,\n \"system.characteristics.pow\": finalValues.pow,\n \"system.characteristics.dex\": finalValues.dex,\n \"system.characteristics.app\": finalValues.app,\n \"system.characteristics.edu\": finalValues.edu,\n \"system.characteristics.age\": finalValues.age,\n \"system.profile.chronologicalAge\": finalValues.age,\n \"system.profile.physiologicalAge\": finalValues.age\n });\n\n const ownLanguage = actor.items.find((item: any) => item.type === \"skill\" && item.name.toLowerCase() === \"own language\");\n if (ownLanguage) {\n await actor.updateEmbeddedDocuments(\"Item\", [{\n _id: ownLanguage.id,\n \"system.value\": Math.min(99, finalValues.int * 5)\n }]);\n }\n}\n\nexport async function applyStarterKit(actor: any): Promise<void> {\n const starterNames = [\n [\"weapon\", \"Laser Pistol\"],\n [\"weapon\", \"Variable Sword\"],\n [\"armor\", \"Soft Combat Vest\"],\n [\"gear\", \"Power Pack R20\"],\n [\"gear\", \"Medkit\"],\n [\"gear\", \"Survey Scanner\"]\n ];\n\n const worldItems = game.items;\n const actorExisting = new Set(actor.items.map((item: any) => `${item.type}:${item.name.toLowerCase()}`));\n const createPayload: any[] = [];\n\n for (const [type, name] of starterNames) {\n if (actorExisting.has(`${type}:${String(name).toLowerCase()}`)) continue;\n const worldItem = worldItems.find((item: any) => item.type === type && item.name === name);\n if (!worldItem) continue;\n createPayload.push(worldItem.toObject());\n }\n\n if (createPayload.length) {\n await actor.createEmbeddedDocuments(\"Item\", createPayload);\n }\n}\n\nexport async function randomizeExplorerActor(actor: any): Promise<void> {\n const worldSpecies = getPlayableSpeciesFromWorld();\n const builtInSpecies = speciesCatalogForGeneration();\n\n const pickedWorldSpecies = worldSpecies.length ? randomPick(worldSpecies) : null;\n const pickedBuiltInSpecies = !pickedWorldSpecies ? randomPick(builtInSpecies) : null;\n\n const speciesChoice = pickedWorldSpecies?.system ?? pickedBuiltInSpecies;\n const speciesName = pickedWorldSpecies?.name ?? pickedBuiltInSpecies?.name ?? \"Human\";\n\n const gravity = String(speciesChoice.gravity || \"normal\") as GravityType;\n const homeworld = String(speciesChoice.homeworld || \"Ringworld\");\n\n await actor.update({\n name: randomExplorerName(speciesName),\n \"system.profile.species\": speciesName,\n \"system.profile.gravity\": gravity,\n \"system.profile.homeworld\": homeworld\n });\n\n await rollCharacteristicsForActor(actor);\n await actor.ensureBaseSkills?.();\n await applyStarterKit(actor);\n}\n\nexport async function createRandomExplorer(): Promise<any> {\n const ActorClass = getDocumentClass(\"Actor\");\n const actor = await ActorClass.create({\n name: \"Random Explorer\",\n type: \"explorer\"\n });\n\n await randomizeExplorerActor(actor);\n return actor;\n}\n","import { recomputeHitPointMaximums, rollSkillForActor, rollStandaloneHitLocation, useWeaponWorkflow } from \"../mechanics\";\nimport { normalizeSkillName, RINGWORLD_BASE_SKILLS } from \"../data-base-skills\";\nimport { randomizeExplorerActor, rollCharacteristicsForActor } from \"../character-tools\";\nimport { skillIconPath } from \"../skill-icons\";\n\ntype DerivedCheckKey = \"health\" | \"reasoning\" | \"luck\" | \"dodge\";\ntype SpeciesModifierKey = \"str\" | \"mas\" | \"con\" | \"int\" | \"pow\" | \"dex\" | \"app\" | \"edu\" | \"age\";\nconst SPECIES_MODIFIER_KEYS: SpeciesModifierKey[] = [\"str\", \"mas\", \"con\", \"int\", \"pow\", \"dex\", \"app\", \"edu\", \"age\"];\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction hasValue(value: unknown): boolean {\n return value !== null && value !== undefined && String(value).trim() !== \"\";\n}\n\nfunction clampCharacteristic(value: number): number {\n return Math.max(1, Math.min(99, Math.floor(value)));\n}\n\nfunction computeDamageMod(str: number, mas: number): string {\n const total = str + mas;\n if (total <= 12) return \"-1d6\";\n if (total <= 24) return \"-1d4\";\n if (total <= 32) return \"0\";\n if (total <= 40) return \"+1d4\";\n if (total <= 56) return \"+1d6\";\n if (total <= 72) return \"+2d6\";\n return \"+3d6\";\n}\n\nfunction computeDerivedRolls(characteristics: any): Record<DerivedCheckKey, number> {\n const con = num(characteristics?.con, 10);\n const int = num(characteristics?.int, 10);\n const pow = num(characteristics?.pow, 10);\n const dex = num(characteristics?.dex, 10);\n\n return {\n health: Math.max(0, Math.min(99, con * 5)),\n reasoning: Math.max(0, Math.min(99, int * 5)),\n luck: Math.max(0, Math.min(99, pow * 5)),\n dodge: Math.max(0, Math.min(99, dex * 5))\n };\n}\n\nfunction computeRootMaxes(characteristics: any): Record<string, number> {\n const str = num(characteristics?.str, 10);\n const dex = num(characteristics?.dex, 10);\n const app = num(characteristics?.app, 10);\n const edu = num(characteristics?.edu, 10);\n const int = num(characteristics?.int, 10);\n const pow = num(characteristics?.pow, 10);\n const con = num(characteristics?.con, 10);\n\n return {\n agility: Math.max(0, str + dex),\n communication: Math.max(0, int + app),\n knowledge: Math.max(0, int + edu),\n perception: Math.max(0, pow + con),\n technical: Math.max(0, dex + int)\n };\n}\n\nfunction computeActionRanking(dex: number): number {\n if (dex <= 4) return 7;\n if (dex <= 8) return 6;\n if (dex <= 12) return 5;\n if (dex <= 16) return 4;\n if (dex <= 20) return 3;\n if (dex <= 24) return 2;\n return 1;\n}\n\nfunction gravityLoadMultiplier(gravity: string): number {\n if (gravity === \"light\") return 0.5;\n if (gravity === \"heavy\") return 2;\n return 1;\n}\n\nfunction contributesToEncumbrance(item: any): boolean {\n if (item.type !== \"weapon\" && item.type !== \"armor\" && item.type !== \"gear\") return false;\n return item.system?.stowed !== true;\n}\n\nfunction itemWeightKg(item: any): number {\n return Math.max(0, num(item.system?.weight, 0));\n}\n\nfunction computeEncumbrance(system: any, items: any[]): {\n rawLoadKg: number;\n effectiveLoadKg: number;\n limitKg: number;\n overLimitKg: number;\n actionRankingPenalty: number;\n overLimit: boolean;\n currentMove: number;\n currentRun: number;\n gravityMultiplier: number;\n} {\n const gravity = String(system?.profile?.gravity || \"normal\");\n const gravityMultiplier = gravityLoadMultiplier(gravity);\n const equippedLoadKg = items\n .filter((item) => item.type === \"weapon\" || item.type === \"armor\" || item.type === \"gear\")\n .filter(contributesToEncumbrance)\n .reduce((sum, item) => sum + itemWeightKg(item), 0);\n\n const rawLoadKg = Math.max(0, equippedLoadKg);\n const effectiveLoadKg = rawLoadKg * gravityMultiplier;\n const limitKg = Math.max(0, num(system?.characteristics?.str, 0));\n const overLimitKg = Math.max(0, effectiveLoadKg - limitKg);\n const actionRankingPenalty = overLimitKg > 0 ? Math.ceil(overLimitKg / 10) : 0;\n const overLimit = overLimitKg > 0;\n\n const baseMove = Math.max(1, num(system?.derived?.move, 3));\n const baseRun = Math.max(1, num(system?.derived?.run, baseMove * 2));\n const currentMove = overLimit ? 2 : baseMove;\n const currentRun = overLimit ? 4 : baseRun;\n\n return {\n rawLoadKg,\n effectiveLoadKg,\n limitKg,\n overLimitKg,\n actionRankingPenalty,\n overLimit,\n currentMove,\n currentRun,\n gravityMultiplier\n };\n}\n\nexport class RingworldActor extends Actor {\n prepareDerivedData(): void {\n super.prepareDerivedData();\n recomputeHitPointMaximums(this as any);\n\n if (this.type !== \"explorer\" && this.type !== \"creature\") return;\n\n const system = (this as any).system ?? {};\n const characteristics = system.characteristics ?? {};\n const profile = system.profile ?? {};\n\n profile.chronologicalAge = num(profile.chronologicalAge, num(characteristics.age, 25));\n profile.physiologicalAge = num(profile.physiologicalAge, profile.chronologicalAge);\n system.profile = profile;\n\n system.combat = system.combat ?? {};\n if (!hasValue(system.combat.damageMod)) {\n system.combat.damageMod = computeDamageMod(num(characteristics.str, 10), num(characteristics.mas, 10));\n }\n\n system.derivedRolls = system.derivedRolls ?? {};\n const derivedRollDefaults = computeDerivedRolls(characteristics);\n for (const key of Object.keys(derivedRollDefaults) as DerivedCheckKey[]) {\n system.derivedRolls[key] = num(system.derivedRolls[key], derivedRollDefaults[key]);\n }\n\n system.skillRootMax = system.skillRootMax ?? {};\n const rootMaxDefaults = computeRootMaxes(characteristics);\n for (const [key, value] of Object.entries(rootMaxDefaults)) {\n system.skillRootMax[key] = value;\n }\n\n system.derived = system.derived ?? {};\n system.derived.actionRanking = computeActionRanking(num(characteristics.dex, 10));\n system.derived.move = num(system.derived.move, 3);\n system.derived.run = num(system.derived.run, Math.max(1, num(system.derived.move, 3) * 2));\n\n system.encumbrance = system.encumbrance ?? {};\n const encumbrance = computeEncumbrance(system, this.items as any[]);\n system.encumbrance.rawLoadKg = encumbrance.rawLoadKg;\n system.encumbrance.effectiveLoadKg = encumbrance.effectiveLoadKg;\n system.encumbrance.limitKg = encumbrance.limitKg;\n system.encumbrance.overLimitKg = encumbrance.overLimitKg;\n system.encumbrance.actionRankingPenalty = encumbrance.actionRankingPenalty;\n system.encumbrance.overLimit = encumbrance.overLimit;\n system.encumbrance.gravityMultiplier = encumbrance.gravityMultiplier;\n system.derived.currentMove = encumbrance.currentMove;\n system.derived.currentRun = encumbrance.currentRun;\n\n system.finance = system.finance ?? { money: 0, inBank: 0 };\n system.finance.money = num(system.finance.money, 0);\n system.finance.inBank = num(system.finance.inBank, 0);\n\n system.notes = system.notes ?? { defects: \"\", habits: \"\" };\n if (typeof system.sheetToolsUnlocked !== \"boolean\") {\n system.sheetToolsUnlocked = false;\n }\n system.characterBuilder = system.characterBuilder ?? {\n pursuits: [],\n allocations: {},\n baseBySkillId: {}\n };\n system.unconsciousLevel = num(system.unconsciousLevel, 0);\n }\n\n get skills(): any[] {\n return this.items.filter((item) => item.type === \"skill\");\n }\n\n get weapons(): any[] {\n return this.items.filter((item) => item.type === \"weapon\");\n }\n\n get armors(): any[] {\n return this.items.filter((item) => item.type === \"armor\");\n }\n\n get gears(): any[] {\n return this.items.filter((item) => item.type === \"gear\");\n }\n\n async rollSkillById(skillId: string): Promise<void> {\n const skill = this.items.get(skillId);\n if (!skill || skill.type !== \"skill\") return;\n await rollSkillForActor(this, skill.name, Number((skill as any).system.value ?? 0));\n }\n\n async rollHitLocation(): Promise<void> {\n await rollStandaloneHitLocation(this);\n }\n\n async useWeaponById(weaponId: string): Promise<void> {\n const weapon = this.items.get(weaponId);\n if (!weapon || weapon.type !== \"weapon\") return;\n await useWeaponWorkflow(this, weapon);\n }\n\n async ensureBaseSkills(): Promise<number> {\n if (this.type !== \"explorer\" && this.type !== \"creature\") return 0;\n\n const existing = new Set(\n this.items\n .filter((item) => item.type === \"skill\")\n .map((item) => normalizeSkillName(item.name))\n );\n\n const toCreate = RINGWORLD_BASE_SKILLS\n .filter((skill) => !existing.has(normalizeSkillName(skill.name)))\n .map((skill) => ({\n name: skill.name,\n type: \"skill\",\n img: skillIconPath(skill.name),\n system: {\n value: skill.base,\n category: skill.category,\n specialization: skill.specialization ?? \"\"\n }\n }));\n\n if (!toCreate.length) return 0;\n await this.createEmbeddedDocuments(\"Item\", toCreate as any[]);\n return toCreate.length;\n }\n\n async rollCharacteristics(): Promise<void> {\n if (this.type !== \"explorer\") return;\n await rollCharacteristicsForActor(this as any);\n }\n\n async randomizeCharacter(): Promise<void> {\n if (this.type !== \"explorer\") return;\n await randomizeExplorerActor(this as any);\n }\n\n async applySpeciesItem(speciesData: any): Promise<void> {\n if (this.type !== \"explorer\" && this.type !== \"creature\") return;\n\n const speciesName = String(speciesData?.name || \"\").trim();\n const speciesSystem = speciesData?.system ?? {};\n const incomingMods = speciesSystem?.modifiers ?? {};\n const appliedState = (this as any).system?.speciesApplied ?? {};\n const previousMods = appliedState?.modifiers ?? {};\n\n const currentCharacteristics = (this as any).system?.characteristics ?? {};\n const currentProfile = (this as any).system?.profile ?? {};\n const update: Record<string, unknown> = {};\n const normalizedMods: Record<SpeciesModifierKey, number> = {\n str: 0,\n mas: 0,\n con: 0,\n int: 0,\n pow: 0,\n dex: 0,\n app: 0,\n edu: 0,\n age: 0\n };\n\n for (const key of SPECIES_MODIFIER_KEYS) {\n const prev = num(previousMods?.[key], 0);\n const next = num(incomingMods?.[key], 0);\n normalizedMods[key] = next;\n\n const current = num(currentCharacteristics?.[key], key === \"age\" ? 25 : 10);\n const base = current - prev;\n update[`system.characteristics.${key}`] = clampCharacteristic(base + next);\n }\n\n const agePrev = num(previousMods?.age, 0);\n const ageNext = normalizedMods.age;\n const chronoCurrent = num(currentProfile?.chronologicalAge, num(currentCharacteristics?.age, 25));\n const physCurrent = num(currentProfile?.physiologicalAge, chronoCurrent);\n update[\"system.profile.chronologicalAge\"] = clampCharacteristic((chronoCurrent - agePrev) + ageNext);\n update[\"system.profile.physiologicalAge\"] = clampCharacteristic((physCurrent - agePrev) + ageNext);\n\n if (speciesName) update[\"system.profile.species\"] = speciesName;\n if (speciesSystem?.gravity) update[\"system.profile.gravity\"] = String(speciesSystem.gravity);\n if (speciesSystem?.homeworld !== undefined) update[\"system.profile.homeworld\"] = String(speciesSystem.homeworld || \"\");\n\n update[\"system.speciesApplied\"] = {\n name: speciesName,\n modifiers: normalizedMods\n };\n\n await this.update(update);\n }\n\n async rollDerivedCheck(key: DerivedCheckKey): Promise<void> {\n if (this.type !== \"explorer\" && this.type !== \"creature\") return;\n\n const labels: Record<DerivedCheckKey, string> = {\n health: \"Health Roll\",\n reasoning: \"Reasoning Roll\",\n luck: \"Luck Roll\",\n dodge: \"Dodge Roll\"\n };\n\n const defaults = computeDerivedRolls((this as any).system?.characteristics ?? {});\n const target = num((this as any).system?.derivedRolls?.[key], defaults[key]);\n await rollSkillForActor(this, labels[key], target);\n }\n}\n","import { rollSkillForActor, useWeaponWorkflow } from \"../mechanics\";\n\nexport class RingworldItem extends Item {\n async rollSkill(): Promise<void> {\n if (this.type !== \"skill\") return;\n\n const actor = this.actor;\n if (!actor) {\n ui.notifications?.warn(\"Skill must be owned by an Actor to roll.\");\n return;\n }\n\n await rollSkillForActor(actor, this.name, Number((this as any).system.value ?? 0));\n }\n\n async useWeapon(): Promise<void> {\n if (this.type !== \"weapon\") return;\n\n const actor = this.actor;\n if (!actor) {\n ui.notifications?.warn(\"Weapon must be owned by an Actor to use.\");\n return;\n }\n\n await useWeaponWorkflow(actor, this);\n }\n}\n","import { type HitLocationSlug } from \"../../constants\";\nimport {\n BASE_SKILL_CATEGORIES,\n baseSkillNameSet,\n normalizeSkillName,\n RINGWORLD_BASE_SKILLS\n} from \"../../data-base-skills\";\nimport { baseSkillByName, DEFAULT_SKILL_ICON, resolveSkillIcon, skillIconPath } from \"../../skill-icons\";\nimport { getActorHitLocationSchema, listHitLocationSchemas } from \"../../hit-location-schemas\";\nimport { PURSUIT_CATALOG } from \"../../world-catalog\";\nimport { outcomeLabel, rollPercentile } from \"../../utils/percentile\";\nimport { postSkillRollCard } from \"../../chat\";\n\nconst BaseActorSheet = (foundry as any).appv1.sheets.ActorSheet;\n\nconst ROOT_KEY_BY_CATEGORY: Record<string, string> = {\n Agility: \"agility\",\n Communication: \"communication\",\n Knowledge: \"knowledge\",\n Perception: \"perception\",\n Technical: \"technical\"\n};\n\nconst ROOT_FORMULA_BY_CATEGORY: Record<string, string> = {\n Agility: \"STR + DEX\",\n Communication: \"INT + APP\",\n Knowledge: \"INT + EDU\",\n Perception: \"POW + CON\",\n Technical: \"DEX + INT\"\n};\n\nconst EXCLUDED_EDUCATION_SKILLS = new Set([\n normalizeSkillName(\"Archaic Melee Weapon\"),\n normalizeSkillName(\"Archaic Ranged Weapons\")\n]);\n\nconst HYPERDRIVE_KEY = normalizeSkillName(\"Hyperdrive\");\n\ninterface BuilderAllocation {\n education: number;\n pursuits: number;\n special: number;\n}\n\ninterface BuilderPursuitSelection {\n name: string;\n years: number;\n}\n\ninterface BuilderState {\n pursuits: BuilderPursuitSelection[];\n allocations: Record<string, BuilderAllocation>;\n baseBySkillId: Record<string, number>;\n}\n\ninterface BuilderPool {\n total: number;\n spent: number;\n remaining: number;\n}\n\ninterface BuilderSkillMeta {\n allocation: BuilderAllocation;\n totalAllocated: number;\n baseValue: number;\n rootCap: number;\n maxAllocation: number;\n allowsEducation: boolean;\n allowsPursuits: boolean;\n allowsSpecial: boolean;\n}\n\ninterface BuilderContext {\n state: BuilderState;\n education: BuilderPool;\n pursuits: BuilderPool;\n special: BuilderPool;\n pursuitYears: BuilderPool;\n pursuitOptions: string[];\n pursuitAllowedSkills: Set<string>;\n bySkillId: Map<string, BuilderSkillMeta>;\n}\n\nfunction byName(a: any, b: any): number {\n return a.name.localeCompare(b.name);\n}\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction toInt(value: unknown, fallback = 0): number {\n return Math.max(0, Math.floor(num(value, fallback)));\n}\n\nfunction normalizeAllocation(raw: any): BuilderAllocation {\n return {\n education: toInt(raw?.education, 0),\n pursuits: toInt(raw?.pursuits, 0),\n special: toInt(raw?.special, 0)\n };\n}\n\nfunction normalizePursuitSelection(raw: any): BuilderPursuitSelection | null {\n const name = String(raw?.name || \"\").trim();\n const years = toInt(raw?.years, 0);\n if (!name || years <= 0) return null;\n return { name, years };\n}\n\nfunction normalizeBuilderState(raw: any): BuilderState {\n const pursuits = Array.isArray(raw?.pursuits)\n ? raw.pursuits.map((entry: any) => normalizePursuitSelection(entry)).filter((entry: any) => Boolean(entry))\n : [];\n\n const allocations: Record<string, BuilderAllocation> = {};\n if (raw?.allocations && typeof raw.allocations === \"object\") {\n for (const [skillId, allocation] of Object.entries(raw.allocations)) {\n if (!skillId) continue;\n const normalized = normalizeAllocation(allocation);\n if (normalized.education + normalized.pursuits + normalized.special <= 0) continue;\n allocations[skillId] = normalized;\n }\n }\n\n const baseBySkillId: Record<string, number> = {};\n if (raw?.baseBySkillId && typeof raw.baseBySkillId === \"object\") {\n for (const [skillId, value] of Object.entries(raw.baseBySkillId)) {\n if (!skillId) continue;\n baseBySkillId[skillId] = Math.max(0, toInt(value, 0));\n }\n }\n\n return {\n pursuits,\n allocations,\n baseBySkillId\n };\n}\n\nfunction isEducationEligible(skillName: string): boolean {\n return !EXCLUDED_EDUCATION_SKILLS.has(normalizeSkillName(skillName));\n}\n\nfunction isSpecialEligible(skillName: string): boolean {\n return normalizeSkillName(skillName) !== HYPERDRIVE_KEY;\n}\n\nfunction buildPursuitAllowedSkillSet(pursuits: BuilderPursuitSelection[]): Set<string> {\n const entriesByName = new Map(\n PURSUIT_CATALOG.map((entry) => [normalizeSkillName(entry.name), entry])\n );\n const allowed = new Set<string>();\n\n for (const pursuit of pursuits) {\n const entry = entriesByName.get(normalizeSkillName(pursuit.name));\n if (!entry) continue;\n\n for (const skillName of entry.fixedSkills || []) {\n allowed.add(normalizeSkillName(skillName));\n }\n\n for (const group of entry.optionalSkillGroups || []) {\n for (const skillName of group.skills || []) {\n allowed.add(normalizeSkillName(skillName));\n }\n }\n }\n\n return allowed;\n}\n\nfunction computeBuilderPools(characteristics: any): {\n educationTotal: number;\n pursuitsTotal: number;\n specialTotal: number;\n pursuitYearsTotal: number;\n} {\n const age = toInt(characteristics?.age, 0);\n const edu = toInt(characteristics?.edu, 0);\n const int = toInt(characteristics?.int, 0);\n\n const educationTotal = Math.max(0, (edu - 10) * 20);\n const pursuitYearsTotal = Math.max(0, age - edu - 6);\n const pursuitsTotal = pursuitYearsTotal * 20;\n const specialTotal = Math.max(0, int * 10);\n\n return {\n educationTotal,\n pursuitsTotal,\n specialTotal,\n pursuitYearsTotal\n };\n}\n\nfunction buildBuilderContext(actor: any, skills: any[]): BuilderContext {\n const pools = computeBuilderPools(actor.system?.characteristics ?? {});\n const state = normalizeBuilderState(actor.system?.characterBuilder ?? {});\n\n const pursuitOptions = PURSUIT_CATALOG.map((entry) => entry.name).sort((a, b) => a.localeCompare(b));\n const pursuitAllowedSkills = buildPursuitAllowedSkillSet(state.pursuits);\n\n const bySkillId = new Map<string, BuilderSkillMeta>();\n\n let educationSpent = 0;\n let pursuitsSpent = 0;\n let specialSpent = 0;\n\n for (const skill of skills) {\n const allocation = normalizeAllocation(state.allocations[skill.id]);\n const totalAllocated = allocation.education + allocation.pursuits + allocation.special;\n\n const baseFromState = state.baseBySkillId[skill.id];\n const baseFromDefinition = baseSkillByName(skill.name)?.base;\n const inferredBase = Math.max(0, num(skill.system?.value, 0) - totalAllocated);\n const baseValue = Math.max(\n 0,\n Number.isFinite(baseFromState)\n ? baseFromState\n : (baseFromDefinition ?? inferredBase)\n );\n\n const rootKey = ROOT_KEY_BY_CATEGORY[String(skill.system?.category || \"\")] ?? \"\";\n const rootCap = rootKey ? Math.max(0, toInt(actor.system?.skillRootMax?.[rootKey], 0)) : 99;\n const maxAllocation = Math.max(0, rootCap - baseValue);\n\n const normalizedSkillName = normalizeSkillName(skill.name);\n const allowsEducation = isEducationEligible(skill.name);\n const allowsPursuits = pursuitAllowedSkills.has(normalizedSkillName);\n const allowsSpecial = isSpecialEligible(skill.name);\n\n bySkillId.set(skill.id, {\n allocation,\n totalAllocated,\n baseValue,\n rootCap,\n maxAllocation,\n allowsEducation,\n allowsPursuits,\n allowsSpecial\n });\n\n educationSpent += allocation.education;\n pursuitsSpent += allocation.pursuits;\n specialSpent += allocation.special;\n }\n\n const pursuitYearsAllocated = state.pursuits.reduce((sum, row) => sum + row.years, 0);\n\n return {\n state,\n education: {\n total: pools.educationTotal,\n spent: educationSpent,\n remaining: pools.educationTotal - educationSpent\n },\n pursuits: {\n total: pools.pursuitsTotal,\n spent: pursuitsSpent,\n remaining: pools.pursuitsTotal - pursuitsSpent\n },\n special: {\n total: pools.specialTotal,\n spent: specialSpent,\n remaining: pools.specialTotal - specialSpent\n },\n pursuitYears: {\n total: pools.pursuitYearsTotal,\n spent: pursuitYearsAllocated,\n remaining: pools.pursuitYearsTotal - pursuitYearsAllocated\n },\n pursuitOptions,\n pursuitAllowedSkills,\n bySkillId\n };\n}\n\nfunction getItemArmorAtLocation(item: any, slug: string): number {\n if (item.type !== \"armor\" || !item.system?.equipped || item.system?.stowed) return 0;\n if (!item.system?.coverage?.[slug]) return 0;\n\n const specific = num(item.system?.perLocation?.[slug], 0);\n if (specific > 0) return specific;\n return num(item.system?.value, 0);\n}\n\nfunction getTotalArmorAtLocation(actor: any, slug: string): number {\n const base = num(actor.system?.hitLocations?.[slug]?.armor, 0);\n const fromItems = actor.items\n .filter((item: any) => item.type === \"armor\")\n .reduce((sum: number, item: any) => sum + getItemArmorAtLocation(item, slug), 0);\n return base + fromItems;\n}\n\nfunction getPreparedHitLocation(actor: any, slug: string, rollRange: string): any {\n const locationConfig = getActorHitLocationSchema(actor).entries.find((entry) => entry.slug === slug);\n const source = actor.system?.hitLocations?.[slug] ?? {};\n const hp = source.hp ?? {};\n const rawLabel = String(source.label ?? \"\").trim();\n return {\n slug,\n rollRange,\n label: rawLabel || String(locationConfig?.label || slug),\n armor: num(source.armor, 0),\n totalArmor: getTotalArmorAtLocation(actor, slug),\n hp: {\n value: num(hp.value, 0),\n max: num(hp.max, 0)\n }\n };\n}\n\nfunction chooseRandom<T>(items: T[]): T {\n return items[Math.floor(Math.random() * items.length)];\n}\n\nfunction clampPercent(value: number): number {\n return Math.max(0, Math.min(99, Math.floor(value)));\n}\n\nexport class RingworldExplorerSheet extends BaseActorSheet {\n private isToolsUnlocked(): boolean {\n return Boolean((this.actor as any)?.system?.sheetToolsUnlocked);\n }\n\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"actor\", \"explorer\"],\n width: 930,\n height: 1460,\n tabs: [{ navSelector: \".tabs\", contentSelector: \".sheet-body\", initial: \"overview\" }]\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/actor/explorer-sheet.hbs\";\n }\n\n async getData(options?: any): Promise<any> {\n const data = await super.getData(options);\n const actor = this.actor as any;\n\n if (game.user?.isGM && actor.isOwner) {\n await actor.ensureBaseSkills?.();\n }\n\n const skills = actor.items.filter((item: any) => item.type === \"skill\").sort(byName);\n const builderContext = buildBuilderContext(actor, skills);\n\n const weapons = actor.items.filter((item: any) => item.type === \"weapon\").sort(byName);\n const armors = actor.items.filter((item: any) => item.type === \"armor\").sort(byName);\n const gear = actor.items.filter((item: any) => item.type === \"gear\").sort(byName);\n const speciesOptions = game.items\n .filter((item: any) => item.type === \"species\" && item.system.playable)\n .map((item: any) => item.name)\n .sort();\n const baseSet = baseSkillNameSet();\n\n const skillByNormalized = new Map<string, any>();\n for (const skill of skills) {\n const key = normalizeSkillName(skill.name);\n if (!skillByNormalized.has(key)) {\n skillByNormalized.set(key, skill);\n }\n }\n\n const skillRootMax = actor.system.skillRootMax ?? {};\n const skillsByCategory = BASE_SKILL_CATEGORIES.map((category) => {\n const rootKey = ROOT_KEY_BY_CATEGORY[category] ?? category.toLowerCase();\n const rows = RINGWORLD_BASE_SKILLS\n .filter((skill) => skill.category === category)\n .map((skill) => {\n const existing = skillByNormalized.get(normalizeSkillName(skill.name));\n const meta = existing ? builderContext.bySkillId.get(existing.id) : null;\n return {\n name: skill.name,\n base: skill.base,\n category: skill.category,\n specialization: skill.specialization ?? \"\",\n itemId: existing?.id ?? null,\n icon: existing?.img || skillIconPath(skill.name),\n value: existing?.system?.value ?? skill.base,\n missing: !existing,\n allocationTotal: meta?.totalAllocated ?? 0,\n allocation: meta?.allocation ?? { education: 0, pursuits: 0, special: 0 }\n };\n });\n\n return {\n category,\n rootKey,\n rootFormula: ROOT_FORMULA_BY_CATEGORY[category] ?? \"\",\n rootValue: num(skillRootMax[rootKey], 0),\n rows\n };\n });\n\n const customSkills = skills\n .filter((item: any) => !baseSet.has(normalizeSkillName(item.name)))\n .map((item: any) => {\n const meta = builderContext.bySkillId.get(item.id);\n return {\n id: item.id,\n name: item.name,\n system: item.system,\n img: resolveSkillIcon(item.name, item.img || DEFAULT_SKILL_ICON),\n allocationTotal: meta?.totalAllocated ?? 0,\n allocation: meta?.allocation ?? { education: 0, pursuits: 0, special: 0 }\n };\n });\n\n const missingBaseSkillsCount = skillsByCategory.reduce(\n (total, group) => total + group.rows.filter((row) => row.missing).length,\n 0\n );\n\n const schema = getActorHitLocationSchema(actor);\n const rangesFromSchema = new Map(schema.entries.map((entry) => [entry.slug, `${entry.min}-${entry.max}`]));\n const order = schema.entries.map((entry) => entry.slug as HitLocationSlug);\n const hitLocations = order.map((slug) =>\n getPreparedHitLocation(actor, slug, rangesFromSchema.get(slug) ?? \"\")\n );\n\n const bodyLayoutOrder = schema.bodyOrder;\n const bodyLocations = bodyLayoutOrder.map((slug) =>\n getPreparedHitLocation(actor, slug, rangesFromSchema.get(slug) ?? \"\")\n );\n\n const enc = actor.system?.encumbrance ?? {};\n const encRaw = num(enc.rawLoadKg, 0);\n const encEffective = num(enc.effectiveLoadKg, encRaw);\n const encLimit = num(enc.limitKg, num(actor.system?.characteristics?.str, 0));\n const encPenalty = num(enc.actionRankingPenalty, 0);\n const baseActionRanking = num(actor.system?.derived?.actionRanking, 0);\n const effectiveActionRanking = Math.max(1, baseActionRanking + encPenalty);\n const encumbranceSummary = `${encRaw.toFixed(1)}kg on-person | ${encEffective.toFixed(1)}kg effective / ${encLimit.toFixed(1)}kg limit | AR +${encPenalty} (stowed ignored)`;\n const movementSummary = `${num(actor.system?.derived?.currentMove, num(actor.system?.derived?.move, 3))}m / ${num(actor.system?.derived?.currentRun, num(actor.system?.derived?.run, 6))}m`;\n\n return {\n ...data,\n system: actor.system,\n skills,\n skillsByCategory,\n customSkills,\n missingBaseSkillsCount,\n weapons,\n armors,\n gear,\n speciesOptions,\n hitLocations,\n bodyLocations,\n hitLocationSchemaOptions: listHitLocationSchemas(),\n currentHitLocationSchema: String(actor.system.hitLocationSchema || \"auto\"),\n activeHitLocationSchemaId: schema.id,\n activeHitLocationSchemaLabel: schema.label,\n sheetToolsUnlocked: Boolean(actor.system?.sheetToolsUnlocked),\n baseActionRanking,\n effectiveActionRanking,\n encumbranceSummary,\n movementSummary,\n builder: {\n education: builderContext.education,\n pursuits: builderContext.pursuits,\n special: builderContext.special,\n pursuitYears: builderContext.pursuitYears,\n pursuitsList: builderContext.state.pursuits,\n pursuitOptions: builderContext.pursuitOptions\n }\n };\n }\n\n private async updateBuilderState(state: BuilderState): Promise<void> {\n await this.actor.update({\n \"system.characterBuilder\": {\n pursuits: state.pursuits,\n allocations: state.allocations,\n baseBySkillId: state.baseBySkillId\n }\n });\n }\n\n private async syncSkillsFromBuilderState(state: BuilderState): Promise<void> {\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\");\n const updates: any[] = [];\n\n for (const skill of skills) {\n const allocation = normalizeAllocation(state.allocations[skill.id]);\n const total = allocation.education + allocation.pursuits + allocation.special;\n\n const rootKey = ROOT_KEY_BY_CATEGORY[String(skill.system?.category || \"\")] ?? \"\";\n const rootCap = rootKey ? Math.max(0, toInt(this.actor.system?.skillRootMax?.[rootKey], 0)) : 99;\n\n let base = state.baseBySkillId[skill.id];\n if (!Number.isFinite(base)) {\n const fromBase = baseSkillByName(skill.name)?.base;\n base = Math.max(0, fromBase ?? (num(skill.system?.value, 0) - total));\n state.baseBySkillId[skill.id] = base;\n }\n\n const value = Math.max(0, Math.min(99, Math.min(rootCap, base + total)));\n if (num(skill.system?.value, 0) !== value) {\n updates.push({ _id: skill.id, \"system.value\": value });\n }\n }\n\n if (updates.length) {\n await this.actor.updateEmbeddedDocuments(\"Item\", updates);\n }\n }\n\n private async addOrUpdatePursuit(name: string, years: number): Promise<void> {\n if (!this.isToolsUnlocked()) return;\n const trimmed = String(name || \"\").trim();\n const cleanYears = Math.max(0, Math.floor(Number(years) || 0));\n if (!trimmed || cleanYears <= 0) {\n ui.notifications?.warn(\"Choose a pursuit and set years above 0.\");\n return;\n }\n\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\");\n const context = buildBuilderContext(this.actor, skills);\n const nextState = foundry.utils.deepClone(context.state) as BuilderState;\n\n const existingIndex = nextState.pursuits.findIndex((entry) => normalizeSkillName(entry.name) === normalizeSkillName(trimmed));\n if (existingIndex >= 0) {\n nextState.pursuits[existingIndex].years = cleanYears;\n } else {\n nextState.pursuits.push({ name: trimmed, years: cleanYears });\n }\n\n await this.updateBuilderState(nextState);\n }\n\n private async removePursuit(index: number): Promise<void> {\n if (!this.isToolsUnlocked()) return;\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\");\n const context = buildBuilderContext(this.actor, skills);\n const nextState = foundry.utils.deepClone(context.state) as BuilderState;\n if (index < 0 || index >= nextState.pursuits.length) return;\n\n nextState.pursuits.splice(index, 1);\n await this.updateBuilderState(nextState);\n }\n\n private async resetBuilderAllocations(): Promise<void> {\n if (!this.isToolsUnlocked()) return;\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\");\n const context = buildBuilderContext(this.actor, skills);\n const nextState = foundry.utils.deepClone(context.state) as BuilderState;\n\n nextState.allocations = {};\n await this.updateBuilderState(nextState);\n await this.syncSkillsFromBuilderState(nextState);\n }\n\n private async randomizeBuilderAllocations(): Promise<void> {\n if (!this.isToolsUnlocked()) return;\n await (this.actor as any).ensureBaseSkills?.();\n\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\").sort(byName);\n const context = buildBuilderContext(this.actor, skills);\n const nextState = foundry.utils.deepClone(context.state) as BuilderState;\n\n const totalYears = Math.max(0, context.pursuitYears.total);\n const pursuits = PURSUIT_CATALOG.map((entry) => entry.name);\n nextState.pursuits = [];\n\n if (totalYears > 0 && pursuits.length > 0) {\n const desiredCount = Math.min(\n pursuits.length,\n Math.max(1, Math.min(3, Math.floor(totalYears / 2) || 1))\n );\n\n const available = [...pursuits];\n for (let i = 0; i < desiredCount && available.length; i += 1) {\n const idx = Math.floor(Math.random() * available.length);\n nextState.pursuits.push({ name: available[idx], years: 1 });\n available.splice(idx, 1);\n }\n\n let remainingYears = totalYears - nextState.pursuits.length;\n while (remainingYears > 0 && nextState.pursuits.length) {\n const row = chooseRandom(nextState.pursuits);\n row.years += 1;\n remainingYears -= 1;\n }\n }\n\n const seededState = normalizeBuilderState(nextState);\n seededState.allocations = {};\n\n const freshContext = buildBuilderContext(\n { ...this.actor, system: { ...this.actor.system, characterBuilder: seededState } },\n skills\n );\n\n for (const skill of skills) {\n const meta = freshContext.bySkillId.get(skill.id);\n if (!meta) continue;\n seededState.baseBySkillId[skill.id] = meta.baseValue;\n seededState.allocations[skill.id] = { education: 0, pursuits: 0, special: 0 };\n }\n\n const totalBySkill = new Map<string, number>();\n for (const skill of skills) {\n totalBySkill.set(skill.id, 0);\n }\n\n const maxForSkill = (skillId: string): number => {\n const meta = freshContext.bySkillId.get(skillId);\n return meta ? Math.max(0, meta.maxAllocation) : 0;\n };\n\n const allocatePool = (\n points: number,\n poolKey: keyof BuilderAllocation,\n eligible: (skill: any, meta: BuilderSkillMeta) => boolean\n ): number => {\n let remaining = Math.max(0, points);\n let guard = 0;\n\n while (remaining > 0 && guard < 300000) {\n guard += 1;\n const candidates = skills.filter((skill) => {\n const meta = freshContext.bySkillId.get(skill.id);\n if (!meta || !eligible(skill, meta)) return false;\n const allocated = totalBySkill.get(skill.id) ?? 0;\n return allocated < maxForSkill(skill.id);\n });\n\n if (!candidates.length) break;\n const picked = chooseRandom(candidates);\n const current = seededState.allocations[picked.id] ?? { education: 0, pursuits: 0, special: 0 };\n current[poolKey] += 1;\n seededState.allocations[picked.id] = current;\n totalBySkill.set(picked.id, (totalBySkill.get(picked.id) ?? 0) + 1);\n remaining -= 1;\n }\n\n return remaining;\n };\n\n const educationUnspent = allocatePool(\n Math.max(0, freshContext.education.total),\n \"education\",\n (skill, meta) => meta.allowsEducation\n );\n\n const pursuitsUnspent = allocatePool(\n Math.max(0, freshContext.pursuits.total),\n \"pursuits\",\n (skill, meta) => meta.allowsPursuits\n );\n\n const specialUnspent = allocatePool(\n Math.max(0, freshContext.special.total),\n \"special\",\n (skill, meta) => meta.allowsSpecial\n );\n\n for (const skill of skills) {\n const allocation = normalizeAllocation(seededState.allocations[skill.id]);\n if (allocation.education + allocation.pursuits + allocation.special <= 0) {\n delete seededState.allocations[skill.id];\n }\n }\n\n await this.updateBuilderState(seededState);\n await this.syncSkillsFromBuilderState(seededState);\n\n if (educationUnspent > 0 || pursuitsUnspent > 0 || specialUnspent > 0) {\n ui.notifications?.info(\n `Random build complete. Unspent points: EDU ${educationUnspent}, Pursuits ${pursuitsUnspent}, Special ${specialUnspent}.`\n );\n } else {\n ui.notifications?.info(\"Random build complete. All available points allocated.\");\n }\n }\n\n private async promptSkillAllocation(skillId: string): Promise<void> {\n if (!this.isToolsUnlocked()) return;\n const skill = this.actor.items.get(skillId);\n if (!skill || skill.type !== \"skill\") return;\n\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\");\n const context = buildBuilderContext(this.actor, skills);\n const meta = context.bySkillId.get(skillId);\n if (!meta) return;\n\n const current = meta.allocation;\n const maxEducation = Math.max(0, context.education.remaining + current.education);\n const maxPursuits = Math.max(0, context.pursuits.remaining + current.pursuits);\n const maxSpecial = Math.max(0, context.special.remaining + current.special);\n\n const maxByCap = Math.max(0, meta.maxAllocation);\n\n const content = `\n <form class=\"rw-builder-alloc-form\">\n <header class=\"rw-builder-alloc-head\">\n <img src=\"${skill.img || DEFAULT_SKILL_ICON}\" alt=\"\" />\n <div>\n <h3>${skill.name}</h3>\n <p>Base ${meta.baseValue}% | Root cap ${meta.rootCap}% | Current ${num(skill.system?.value, 0)}%</p>\n </div>\n </header>\n\n <label>Education ${(meta.allowsEducation ? \"\" : \"(Not eligible)\")}\n <input name=\"education\" type=\"number\" min=\"0\" max=\"${maxEducation}\" value=\"${current.education}\" ${meta.allowsEducation ? \"\" : \"disabled\"} />\n </label>\n\n <label>Pursuits ${(meta.allowsPursuits ? \"\" : \"(Not in selected pursuits)\")}\n <input name=\"pursuits\" type=\"number\" min=\"0\" max=\"${maxPursuits}\" value=\"${current.pursuits}\" ${meta.allowsPursuits ? \"\" : \"disabled\"} />\n </label>\n\n <label>Special Interests ${(meta.allowsSpecial ? \"\" : \"(Hyperdrive excluded)\")}\n <input name=\"special\" type=\"number\" min=\"0\" max=\"${maxSpecial}\" value=\"${current.special}\" ${meta.allowsSpecial ? \"\" : \"disabled\"} />\n </label>\n\n <p class=\"hint\">Max additional from root cap: ${maxByCap}. Pools: EDU ${context.education.remaining}, Pursuits ${context.pursuits.remaining}, Special ${context.special.remaining}.</p>\n </form>\n `;\n\n const result = await new Promise<BuilderAllocation | null>((resolve) => {\n new Dialog({\n title: `${skill.name} - Allocate Character Points`,\n content,\n buttons: {\n save: {\n label: \"Apply\",\n callback: (html: JQuery) => {\n const form = html.find(\"form\")[0] as HTMLFormElement | undefined;\n if (!form) {\n resolve(null);\n return;\n }\n const data = new FormData(form);\n resolve({\n education: meta.allowsEducation ? toInt(data.get(\"education\"), current.education) : current.education,\n pursuits: meta.allowsPursuits ? toInt(data.get(\"pursuits\"), current.pursuits) : current.pursuits,\n special: meta.allowsSpecial ? toInt(data.get(\"special\"), current.special) : current.special\n });\n }\n },\n cancel: {\n label: \"Cancel\",\n callback: () => resolve(null)\n }\n },\n default: \"save\",\n close: () => resolve(null)\n }).render(true);\n });\n\n if (!result) return;\n\n const requestedTotal = result.education + result.pursuits + result.special;\n if (requestedTotal > maxByCap) {\n ui.notifications?.warn(`Allocation exceeds this skill's root-cap allowance (${maxByCap}).`);\n return;\n }\n\n if (result.education > maxEducation || result.pursuits > maxPursuits || result.special > maxSpecial) {\n ui.notifications?.warn(\"Allocation exceeds remaining pool points.\");\n return;\n }\n\n const nextState = foundry.utils.deepClone(context.state) as BuilderState;\n nextState.baseBySkillId[skill.id] = meta.baseValue;\n if (requestedTotal <= 0) {\n delete nextState.allocations[skill.id];\n } else {\n nextState.allocations[skill.id] = result;\n }\n\n await this.updateBuilderState(nextState);\n await this.syncSkillsFromBuilderState(nextState);\n }\n\n private async rollCharacteristicCheck(characterKey: string, label: string): Promise<void> {\n const validKeys = new Set([\"str\", \"mas\", \"con\", \"int\", \"pow\", \"dex\", \"app\", \"edu\", \"age\"]);\n if (!validKeys.has(characterKey)) return;\n\n const base = Math.max(0, toInt((this.actor as any).system?.characteristics?.[characterKey], 0));\n const content = `\n <form class=\"rw-stat-roll-form\">\n <div class=\"form-group\">\n <label>Characteristic</label>\n <input type=\"text\" value=\"${foundry.utils.escapeHTML(label)}\" disabled />\n </div>\n <div class=\"form-group\">\n <label>Base Value</label>\n <input type=\"number\" value=\"${base}\" disabled />\n </div>\n <div class=\"form-group\">\n <label>Multiplier</label>\n <select name=\"multiplier\">\n <option value=\"1\">x1</option>\n <option value=\"2\">x2</option>\n <option value=\"3\">x3</option>\n <option value=\"4\">x4</option>\n <option value=\"5\">x5</option>\n <option value=\"6\">x6</option>\n <option value=\"7\">x7</option>\n </select>\n </div>\n <p class=\"hint\">Roll d100 against Characteristic x Multiplier.</p>\n </form>\n `;\n\n const multiplier = await new Promise<number | null>((resolve) => {\n let settled = false;\n const done = (value: number | null) => {\n if (settled) return;\n settled = true;\n resolve(value);\n };\n\n new Dialog({\n title: `${label} Check`,\n content,\n buttons: {\n roll: {\n label: \"Roll\",\n callback: (dlgHtml: JQuery) => {\n const selected = Number((dlgHtml[0]?.querySelector(\"select[name='multiplier']\") as HTMLSelectElement | null)?.value || 1);\n const safeMultiplier = Math.max(1, Math.min(7, Math.floor(selected || 1)));\n done(safeMultiplier);\n }\n },\n cancel: {\n label: \"Cancel\",\n callback: () => done(null)\n }\n },\n default: \"roll\",\n close: () => done(null)\n }).render(true);\n });\n\n if (!multiplier) return;\n const target = clampPercent(base * multiplier);\n const result = await rollPercentile(target);\n\n await postSkillRollCard({\n actor: this.actor,\n actorName: this.actor.name,\n actorImg: this.actor.img,\n skillName: `${label} x${multiplier}`,\n skillImg: DEFAULT_SKILL_ICON,\n roll: result.roll,\n target: result.target,\n outcomeLabel: outcomeLabel(result.outcome),\n isSuccess: result.isSuccess,\n isSpecial: result.isSpecial,\n isFumble: result.isFumble\n });\n }\n\n activateListeners(html: JQuery): void {\n super.activateListeners(html);\n\n html.find(\".toggle-sheet-lock\").on(\"click\", async (event) => {\n event.preventDefault();\n const next = !this.isToolsUnlocked();\n await this.actor.update({ \"system.sheetToolsUnlocked\": next });\n ui.notifications?.info(next ? \"Sheet tools unlocked.\" : \"Sheet tools locked.\");\n });\n\n html.find(\".roll-characteristic\").on(\"click\", async (event) => {\n event.preventDefault();\n const button = event.currentTarget as HTMLElement;\n const key = String(button.dataset.char || \"\").trim().toLowerCase();\n const label = String(button.dataset.label || key.toUpperCase());\n if (!key) return;\n await this.rollCharacteristicCheck(key, label);\n });\n\n html.find(\".item-create\").on(\"click\", async (event) => {\n event.preventDefault();\n const type = String((event.currentTarget as HTMLElement).dataset.type || \"gear\");\n const doc: any = { name: `New ${type}`, type };\n if (type === \"skill\") {\n doc.img = DEFAULT_SKILL_ICON;\n doc.system = { value: 0, category: \"Technical\", specialization: \"\" };\n }\n await this.actor.createEmbeddedDocuments(\"Item\", [doc]);\n });\n\n html.find(\".item-edit\").on(\"click\", (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n const item = li ? this.actor.items.get(li.dataset.itemId ?? \"\") : null;\n item?.sheet?.render(true);\n });\n\n html.find(\".item-delete\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await this.actor.deleteEmbeddedDocuments(\"Item\", [li.dataset.itemId]);\n });\n\n html.find(\".item-roll-skill\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await (this.actor as any).rollSkillById(li.dataset.itemId);\n });\n\n html.find(\".roll-derived\").on(\"click\", async (event) => {\n event.preventDefault();\n const key = String((event.currentTarget as HTMLElement).dataset.check || \"\");\n if (!key) return;\n await (this.actor as any).rollDerivedCheck(key);\n });\n\n html.find(\".item-use-weapon\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await (this.actor as any).useWeaponById(li.dataset.itemId);\n });\n\n html.find(\".item-toggle-equipped\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n const item = this.actor.items.get(li.dataset.itemId);\n if (!item) return;\n\n const nextEquipped = !Boolean(item.system?.equipped);\n const update: Record<string, unknown> = {\n _id: item.id,\n \"system.equipped\": nextEquipped\n };\n if (nextEquipped) {\n update[\"system.stowed\"] = false;\n }\n await this.actor.updateEmbeddedDocuments(\"Item\", [update]);\n });\n\n html.find(\".item-toggle-stowed\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n const item = this.actor.items.get(li.dataset.itemId);\n if (!item) return;\n\n const nextStowed = !Boolean(item.system?.stowed);\n const update: Record<string, unknown> = {\n _id: item.id,\n \"system.stowed\": nextStowed\n };\n if (nextStowed) {\n update[\"system.equipped\"] = false;\n }\n await this.actor.updateEmbeddedDocuments(\"Item\", [update]);\n });\n\n html.find(\".roll-hit-location\").on(\"click\", async (event) => {\n event.preventDefault();\n await (this.actor as any).rollHitLocation();\n });\n\n html.find(\".reset-conditions\").on(\"click\", async (event) => {\n event.preventDefault();\n await this.actor.update({\n \"system.conditions.prone\": false,\n \"system.conditions.unconscious\": false,\n \"system.conditions.dead\": false,\n \"system.conditions.dying\": false,\n \"system.conditions.unusableLimbs.rArm\": false,\n \"system.conditions.unusableLimbs.lArm\": false,\n \"system.conditions.unusableLimbs.rLeg\": false,\n \"system.conditions.unusableLimbs.lLeg\": false\n });\n });\n\n html.find(\".populate-base-skills\").on(\"click\", async (event) => {\n event.preventDefault();\n const added = await (this.actor as any).ensureBaseSkills();\n if (added > 0) ui.notifications?.info(`Added ${added} Ringworld base skills.`);\n else ui.notifications?.info(\"All Ringworld base skills are already present.\");\n });\n\n html.find(\".add-base-skill\").on(\"click\", async (event) => {\n event.preventDefault();\n const button = event.currentTarget as HTMLElement;\n const name = String(button.dataset.skillName || \"\");\n const category = String(button.dataset.skillCategory || \"\");\n const base = Number(button.dataset.skillBase || 0);\n const specialization = String(button.dataset.skillSpecialization || \"\");\n if (!name) return;\n\n await this.actor.createEmbeddedDocuments(\"Item\", [{\n name,\n type: \"skill\",\n img: skillIconPath(name),\n system: { value: base, category, specialization }\n }]);\n });\n\n html.find(\".builder-add-pursuit\").on(\"click\", async (event) => {\n event.preventDefault();\n const root = (event.currentTarget as HTMLElement).closest(\".rw-builder-pursuits\");\n if (!root) return;\n const name = String((root.querySelector(\".builder-new-pursuit\") as HTMLSelectElement | null)?.value || \"\");\n const years = Number((root.querySelector(\".builder-new-years\") as HTMLInputElement | null)?.value || 0);\n await this.addOrUpdatePursuit(name, years);\n });\n\n html.find(\".builder-update-pursuit\").on(\"click\", async (event) => {\n event.preventDefault();\n const row = (event.currentTarget as HTMLElement).closest(\".builder-pursuit-row\");\n if (!row) return;\n const name = String((row.querySelector(\".builder-pursuit-name\") as HTMLSelectElement | null)?.value || \"\");\n const years = Number((row.querySelector(\".builder-pursuit-years\") as HTMLInputElement | null)?.value || 0);\n await this.addOrUpdatePursuit(name, years);\n });\n\n html.find(\".builder-remove-pursuit\").on(\"click\", async (event) => {\n event.preventDefault();\n const index = Number((event.currentTarget as HTMLElement).dataset.index ?? -1);\n if (!Number.isFinite(index) || index < 0) return;\n await this.removePursuit(index);\n });\n\n html.find(\".builder-reset-points\").on(\"click\", async (event) => {\n event.preventDefault();\n await this.resetBuilderAllocations();\n ui.notifications?.info(\"Character-builder allocations reset.\");\n });\n\n html.find(\".roll-characteristics\").on(\"click\", async (event) => {\n event.preventDefault();\n if (!this.isToolsUnlocked()) return;\n await (this.actor as any).rollCharacteristics?.();\n ui.notifications?.info(\"Characteristics rolled.\");\n });\n\n html.find(\".builder-auto-allocate\").on(\"click\", async (event) => {\n event.preventDefault();\n if (!this.isToolsUnlocked()) return;\n await (this.actor as any).ensureBaseSkills?.();\n await this.randomizeBuilderAllocations();\n });\n\n html.find(\".builder-skill-allocate\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n const skillId = String(li?.dataset.itemId || \"\");\n if (!skillId) return;\n await this.promptSkillAllocation(skillId);\n });\n }\n\n protected async _onDropItemCreate(itemData: any): Promise<any> {\n const items = Array.isArray(itemData) ? itemData : [itemData];\n const speciesItems = items.filter((entry: any) => entry?.type === \"species\");\n const createItems = items.filter((entry: any) => entry?.type !== \"species\");\n\n for (const species of speciesItems) {\n await (this.actor as any).applySpeciesItem?.(species);\n }\n if (speciesItems.length > 0) {\n const names = speciesItems.map((entry: any) => String(entry?.name || \"Species\")).join(\", \");\n ui.notifications?.info(`Applied species to actor: ${names}`);\n }\n\n if (createItems.length === 0) return [];\n\n const patched = createItems.map((entry: any) => {\n if (entry?.type !== \"skill\") return entry;\n return {\n ...entry,\n img: resolveSkillIcon(String(entry?.name || \"Skill\"), String(entry?.img || \"\"))\n };\n });\n return super._onDropItemCreate(Array.isArray(itemData) ? patched : patched[0]);\n }\n}\n","import { getActorHitLocationSchema } from \"../../hit-location-schemas\";\n\nconst BaseActorSheet = (foundry as any).appv1.sheets.ActorSheet;\n\nexport class RingworldCreatureSheet extends BaseActorSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"actor\", \"creature\"],\n width: 760,\n height: 700\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/actor/creature-sheet.hbs\";\n }\n\n async getData(options?: any): Promise<any> {\n const data = await super.getData(options);\n const actor = this.actor as any;\n\n return {\n ...data,\n system: actor.system,\n skills: actor.items.filter((item: any) => item.type === \"skill\"),\n weapons: actor.items.filter((item: any) => item.type === \"weapon\"),\n hitLocations: getActorHitLocationSchema(actor).entries.map((entry) => ({\n slug: entry.slug,\n rollRange: `${entry.min}-${entry.max}`,\n label: entry.label,\n ...(actor.system.hitLocations?.[entry.slug] ?? {})\n }))\n };\n }\n\n activateListeners(html: JQuery): void {\n super.activateListeners(html);\n\n html.find(\".item-create\").on(\"click\", async (event) => {\n event.preventDefault();\n const type = String((event.currentTarget as HTMLElement).dataset.type || \"skill\");\n await this.actor.createEmbeddedDocuments(\"Item\", [{ name: `New ${type}`, type }]);\n });\n\n html.find(\".item-edit\").on(\"click\", (event) => {\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n const item = li ? this.actor.items.get(li.dataset.itemId ?? \"\") : null;\n item?.sheet?.render(true);\n });\n\n html.find(\".item-delete\").on(\"click\", async (event) => {\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await this.actor.deleteEmbeddedDocuments(\"Item\", [li.dataset.itemId]);\n });\n\n html.find(\".item-roll-skill\").on(\"click\", async (event) => {\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await (this.actor as any).rollSkillById(li.dataset.itemId);\n });\n\n html.find(\".item-use-weapon\").on(\"click\", async (event) => {\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await (this.actor as any).useWeaponById(li.dataset.itemId);\n });\n\n html.find(\".roll-hit-location\").on(\"click\", async () => {\n await (this.actor as any).rollHitLocation();\n });\n }\n}\n","const BaseActorSheet = (foundry as any).appv1.sheets.ActorSheet;\n\nexport class RingworldVehicleSheet extends BaseActorSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"actor\", \"vehicle\"],\n width: 680,\n height: 560\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/actor/vehicle-sheet.hbs\";\n }\n\n async getData(options?: any): Promise<any> {\n const data = await super.getData(options);\n return {\n ...data,\n system: (this.actor as any).system\n };\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nexport class RingworldSkillSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"skill\"],\n width: 520,\n height: 420\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/skill-sheet.hbs\";\n }\n\n async getData(options?: any): Promise<any> {\n const data = await super.getData(options);\n return {\n ...data,\n system: (this.item as any).system\n };\n }\n\n activateListeners(html: JQuery): void {\n super.activateListeners(html);\n html.find(\".roll-skill\").on(\"click\", async (event) => {\n event.preventDefault();\n await (this.item as any).rollSkill();\n });\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nexport class RingworldWeaponSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"weapon\"],\n width: 620,\n height: 620\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/weapon-sheet.hbs\";\n }\n\n async getData(options?: any): Promise<any> {\n const data = await super.getData(options);\n const actor = this.item.actor as any;\n\n return {\n ...data,\n system: (this.item as any).system,\n skills: actor ? actor.items.filter((item: any) => item.type === \"skill\") : [],\n powerPacks: actor ? actor.items.filter((item: any) => item.type === \"gear\" && item.system.isPowerPack) : []\n };\n }\n\n activateListeners(html: JQuery): void {\n super.activateListeners(html);\n html.find(\".use-weapon\").on(\"click\", async (event) => {\n event.preventDefault();\n await (this.item as any).useWeapon();\n });\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nexport class RingworldArmorSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"armor\"],\n width: 620,\n height: 560\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/armor-sheet.hbs\";\n }\n\n async getData(options?: any): Promise<any> {\n const data = await super.getData(options);\n return {\n ...data,\n system: (this.item as any).system\n };\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nexport class RingworldGearSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"gear\"],\n width: 620,\n height: 520\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/gear-sheet.hbs\";\n }\n\n async getData(options?: any): Promise<any> {\n const data = await super.getData(options);\n return {\n ...data,\n system: (this.item as any).system\n };\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nexport class RingworldSpeciesSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"species\"],\n width: 620,\n height: 560\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/species-sheet.hbs\";\n }\n\n async getData(options?: any): Promise<any> {\n const data = await super.getData(options);\n return {\n ...data,\n system: (this.item as any).system\n };\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nfunction asArray(value: unknown): string[] {\n return Array.isArray(value) ? value.map((entry) => String(entry)) : [];\n}\n\nexport class RingworldPursuitSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"pursuit\"],\n width: 680,\n height: 620\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/pursuit-sheet.hbs\";\n }\n\n async getData(options?: any): Promise<any> {\n const data = await super.getData(options);\n const system = (this.item as any).system ?? {};\n const fixedSkills = asArray(system.fixedSkills);\n const optionalGroups = Array.isArray(system.optionalSkillGroups)\n ? system.optionalSkillGroups.map((group: any) => ({\n choose: Number(group?.choose ?? 1),\n skills: asArray(group?.skills)\n }))\n : [];\n\n return {\n ...data,\n system,\n fixedSkills,\n optionalGroups\n };\n }\n}\n\n","import { SYSTEM_ID } from \"./constants\";\n\ntype MajorActionKind = \"draw\" | \"aim\" | \"melee\" | \"stand\" | \"perception\" | \"unarmed\";\ntype MinorActionKind = \"fire\" | \"fall\" | \"rise\" | \"minorCustom\";\ntype ActionKind = MajorActionKind | MinorActionKind;\n\ninterface ActionEvent {\n id: string;\n actorId: string | null;\n combatantId: string;\n kind: ActionKind;\n major: boolean;\n startImpulse: number;\n completeImpulse: number;\n itemId?: string;\n skillId?: string;\n targetTokenId?: string;\n}\n\ninterface ImpulseState {\n currentImpulse: number;\n queue: ActionEvent[];\n}\n\nconst IMPULSE_FLAG = \"impulseState\";\nconst IMPULSE_HUD_POS_KEY = `${SYSTEM_ID}.impulseHudPos`;\nconst MAJOR_ACTION_OPTIONS: { value: MajorActionKind; label: string }[] = [\n { value: \"draw\", label: \"Draw / Stow Weapon\" },\n { value: \"aim\", label: \"Aim Ranged Weapon\" },\n { value: \"melee\", label: \"Melee Attack\" },\n { value: \"stand\", label: \"Stand / Recover\" },\n { value: \"perception\", label: \"Perception Skill\" },\n { value: \"unarmed\", label: \"Unarmed Combat\" }\n];\nconst MINOR_ACTION_OPTIONS: { value: MinorActionKind; label: string }[] = [\n { value: \"fire\", label: \"Fire Ranged Weapon\" },\n { value: \"fall\", label: \"Fall\" },\n { value: \"rise\", label: \"Rise (Kneeling to Stand/Run)\" },\n { value: \"minorCustom\", label: \"Other Minor Action\" }\n];\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction esc(value: unknown): string {\n return String(value ?? \"\")\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll(\"\\\"\", \"&quot;\");\n}\n\nexport function actionRankingFromDex(dex: number): number {\n if (dex <= 4) return 7;\n if (dex <= 8) return 6;\n if (dex <= 12) return 5;\n if (dex <= 16) return 4;\n if (dex <= 20) return 3;\n if (dex <= 24) return 2;\n return 1;\n}\n\nfunction actionKindLabel(kind: ActionKind): string {\n switch (kind) {\n case \"draw\":\n return \"Draw / Stow\";\n case \"aim\":\n return \"Aim\";\n case \"melee\":\n return \"Melee Attack\";\n case \"stand\":\n return \"Stand / Recover\";\n case \"perception\":\n return \"Perception\";\n case \"unarmed\":\n return \"Unarmed Combat\";\n case \"fire\":\n return \"Fire Ranged Weapon\";\n case \"fall\":\n return \"Fall\";\n case \"rise\":\n return \"Rise\";\n case \"minorCustom\":\n return \"Minor Action\";\n default:\n return String(kind);\n }\n}\n\nfunction getDexForCombatant(combatant: any): number {\n return Math.max(1, num(combatant?.actor?.system?.characteristics?.dex, 10));\n}\n\nfunction getCombatantActionRanking(combatant: any): number {\n const fromFlag = num(combatant?.flags?.[SYSTEM_ID]?.actionRanking, 0);\n if (fromFlag > 0) return fromFlag;\n return actionRankingFromDex(getDexForCombatant(combatant));\n}\n\nfunction getEncumbranceArPenalty(combatant: any): number {\n const fromActor = num(combatant?.actor?.system?.encumbrance?.actionRankingPenalty, 0);\n return Math.max(0, Math.trunc(fromActor));\n}\n\nasync function syncCombatantActionRanking(combatant: any): Promise<number> {\n const ranking = actionRankingFromDex(getDexForCombatant(combatant));\n const existing = num(combatant?.flags?.[SYSTEM_ID]?.actionRanking, 0);\n if (existing !== ranking) {\n await combatant.update({ [`flags.${SYSTEM_ID}.actionRanking`]: ranking });\n }\n return ranking;\n}\n\nfunction getImpulseState(combat: any): ImpulseState {\n const raw = foundry.utils.deepClone(combat.getFlag(SYSTEM_ID, IMPULSE_FLAG) ?? {});\n const queue = Array.isArray(raw.queue) ? raw.queue : [];\n return {\n currentImpulse: Math.max(1, num(raw.currentImpulse, 1)),\n queue\n };\n}\n\nasync function setImpulseState(combat: any, state: ImpulseState): Promise<void> {\n await combat.setFlag(SYSTEM_ID, IMPULSE_FLAG, {\n currentImpulse: Math.max(1, num(state.currentImpulse, 1)),\n queue: Array.isArray(state.queue) ? state.queue : []\n });\n}\n\nfunction sortQueueByCompletion(queue: ActionEvent[], combat: any): ActionEvent[] {\n return [...queue].sort((a, b) => {\n if (a.completeImpulse !== b.completeImpulse) return a.completeImpulse - b.completeImpulse;\n const aDex = getDexForCombatant(combat.combatants.get(a.combatantId));\n const bDex = getDexForCombatant(combat.combatants.get(b.combatantId));\n return bDex - aDex;\n });\n}\n\nfunction pruneQueueToCombatants(queue: ActionEvent[], combat: any): ActionEvent[] {\n const validIds = new Set(combat.combatants.map((c: any) => c.id));\n return queue.filter((entry) => validIds.has(entry.combatantId));\n}\n\nfunction loadHudPosition(): { left: number; top: number } | null {\n try {\n const raw = localStorage.getItem(IMPULSE_HUD_POS_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n const left = num(parsed?.left, NaN);\n const top = num(parsed?.top, NaN);\n if (!Number.isFinite(left) || !Number.isFinite(top)) return null;\n return { left, top };\n } catch (_err) {\n return null;\n }\n}\n\nfunction saveHudPosition(position: { left: number; top: number }): void {\n try {\n localStorage.setItem(\n IMPULSE_HUD_POS_KEY,\n JSON.stringify({ left: Math.round(position.left), top: Math.round(position.top) })\n );\n } catch (_err) {\n // Ignore storage issues.\n }\n}\n\nfunction clearHudPosition(): void {\n try {\n localStorage.removeItem(IMPULSE_HUD_POS_KEY);\n } catch (_err) {\n // Ignore storage issues.\n }\n}\n\nfunction clampHudPosition(position: { left: number; top: number }, element: HTMLElement): { left: number; top: number } {\n const margin = 8;\n const width = element.offsetWidth || 300;\n const height = element.offsetHeight || 220;\n const maxLeft = Math.max(margin, window.innerWidth - width - margin);\n const maxTop = Math.max(margin, window.innerHeight - height - margin);\n return {\n left: Math.min(Math.max(margin, position.left), maxLeft),\n top: Math.min(Math.max(margin, position.top), maxTop)\n };\n}\n\nfunction applyHudAbsolutePosition(hud: JQuery, position: { left: number; top: number }): void {\n const el = hud.get(0) as HTMLElement | undefined;\n if (!el) return;\n const clamped = clampHudPosition(position, el);\n hud.css({\n left: `${clamped.left}px`,\n top: `${clamped.top}px`,\n right: \"auto\",\n bottom: \"auto\"\n });\n}\n\nfunction makeHudDraggable(hud: JQuery): void {\n const el = hud.get(0) as HTMLElement | undefined;\n if (!el) return;\n\n const handle = hud.find(\".rw-imp-mini-head\");\n if (!handle.length) return;\n\n const saved = loadHudPosition();\n if (saved) {\n applyHudAbsolutePosition(hud, saved);\n }\n\n let dragging = false;\n let startX = 0;\n let startY = 0;\n let startLeft = 0;\n let startTop = 0;\n\n handle.on(\"mousedown\", (event) => {\n const mouseEvent = event as JQuery.MouseDownEvent;\n if (mouseEvent.button !== 0) return;\n if ((mouseEvent.target as HTMLElement)?.closest(\"button\")) return;\n mouseEvent.preventDefault();\n\n const rect = el.getBoundingClientRect();\n startX = mouseEvent.clientX;\n startY = mouseEvent.clientY;\n startLeft = rect.left;\n startTop = rect.top;\n dragging = true;\n\n hud.addClass(\"dragging\");\n hud.css({ left: `${startLeft}px`, top: `${startTop}px`, right: \"auto\", bottom: \"auto\" });\n\n $(document).on(\"mousemove.ringworldImpulseHudDrag\", (moveEvent) => {\n if (!dragging) return;\n const evt = moveEvent as JQuery.MouseMoveEvent;\n const deltaX = evt.clientX - startX;\n const deltaY = evt.clientY - startY;\n applyHudAbsolutePosition(hud, { left: startLeft + deltaX, top: startTop + deltaY });\n });\n\n $(document).one(\"mouseup.ringworldImpulseHudDrag\", () => {\n dragging = false;\n hud.removeClass(\"dragging\");\n $(document).off(\"mousemove.ringworldImpulseHudDrag\");\n const latestRect = el.getBoundingClientRect();\n saveHudPosition({ left: latestRect.left, top: latestRect.top });\n });\n });\n\n handle.on(\"dblclick\", () => {\n clearHudPosition();\n hud.css({ left: \"\", top: \"\", right: \"\", bottom: \"\" });\n });\n}\n\nfunction getQueueWithNames(combat: any, queue: ActionEvent[]): Array<{\n combatantId: string;\n name: string;\n label: string;\n completeImpulse: number;\n dex: number;\n}> {\n return sortQueueByCompletion(pruneQueueToCombatants(queue, combat), combat).map((entry) => {\n const combatant = combat.combatants.get(entry.combatantId);\n return {\n combatantId: entry.combatantId,\n name: String(combatant?.name || \"Unknown\"),\n label: actionKindLabel(entry.kind),\n completeImpulse: entry.completeImpulse,\n dex: getDexForCombatant(combatant)\n };\n });\n}\n\nfunction renderQueueRowsMarkup(rows: ReturnType<typeof getQueueWithNames>, limit = 8): string {\n if (!rows.length) return `<div class=\"rw-imp-mini-empty\">No actions queued.</div>`;\n return rows.slice(0, limit).map((row) => `\n <div class=\"rw-imp-mini-row\" data-combatant-id=\"${esc(row.combatantId)}\">\n <span class=\"rw-imp-mini-name\">${esc(row.name)}</span>\n <span class=\"rw-imp-mini-action\">${esc(row.label)} @ ${row.completeImpulse}</span>\n </div>\n `).join(\"\");\n}\n\nfunction attachOverlayControls(root: JQuery, combat: any): void {\n const disabled = game.user?.isGM ? false : true;\n root.find(\".rw-mini-next\").prop(\"disabled\", disabled).on(\"click\", async (event) => {\n event.preventDefault();\n await advanceImpulse(combat, \"next\");\n });\n root.find(\".rw-mini-step\").prop(\"disabled\", disabled).on(\"click\", async (event) => {\n event.preventDefault();\n await advanceImpulse(combat, \"step\");\n });\n root.find(\".rw-mini-reset\").prop(\"disabled\", disabled).on(\"click\", async (event) => {\n event.preventDefault();\n await resetImpulseSequence(combat);\n });\n}\n\nfunction renderChatImpulseMarker(combat: any | null): void {\n const chatEl = (ui as any)?.chat?.element as JQuery | undefined;\n if (!chatEl?.length) return;\n chatEl.find(\".ringworld-impulse-chat-marker\").remove();\n if (!combat) return;\n\n const state = getImpulseState(combat);\n const rows = getQueueWithNames(combat, state.queue);\n const marker = $(`\n <section class=\"ringworld-impulse-chat-marker\">\n <div class=\"rw-imp-mini-head\">\n <strong>Impulse ${state.currentImpulse}</strong>\n <span>Queued ${rows.length}</span>\n </div>\n <div class=\"rw-imp-mini-list\">${renderQueueRowsMarkup(rows, 5)}</div>\n <div class=\"rw-imp-mini-controls\">\n <button type=\"button\" class=\"rw-mini-next\">Next</button>\n <button type=\"button\" class=\"rw-mini-step\">+1</button>\n <button type=\"button\" class=\"rw-mini-reset\">Reset</button>\n </div>\n </section>\n `);\n attachOverlayControls(marker, combat);\n chatEl.prepend(marker);\n}\n\nfunction renderFloatingImpulseHud(combat: any | null): void {\n const existing = $(\"#ringworld-impulse-hud\");\n existing.remove();\n if (!combat) return;\n\n const state = getImpulseState(combat);\n const rows = getQueueWithNames(combat, state.queue);\n const hud = $(`\n <section id=\"ringworld-impulse-hud\" class=\"ringworld-impulse-hud\">\n <div class=\"rw-imp-mini-head\">\n <strong>Impulse ${state.currentImpulse}</strong>\n <span>Queued ${rows.length}</span>\n </div>\n <div class=\"rw-imp-mini-list\">${renderQueueRowsMarkup(rows, 8)}</div>\n <div class=\"rw-imp-mini-controls\">\n <button type=\"button\" class=\"rw-mini-next\">Next Completion</button>\n <button type=\"button\" class=\"rw-mini-step\">+1 Impulse</button>\n <button type=\"button\" class=\"rw-mini-reset\">Break / Reset</button>\n </div>\n </section>\n `);\n attachOverlayControls(hud, combat);\n $(\"body\").append(hud);\n makeHudDraggable(hud);\n}\n\nfunction refreshImpulseOverlays(combat: any | null): void {\n renderChatImpulseMarker(combat);\n renderFloatingImpulseHud(combat);\n}\n\nasync function ensureGmControl(): Promise<boolean> {\n if (game.user?.isGM) return true;\n ui.notifications?.warn(\"Only the GM can modify Ringworld impulse sequencing.\");\n return false;\n}\n\nasync function scheduleAction(\n combat: any,\n combatantId: string,\n kind: ActionKind,\n major: boolean\n): Promise<void> {\n if (!(await ensureGmControl())) return;\n\n const combatant = combat.combatants.get(combatantId);\n if (!combatant) return;\n\n const state = getImpulseState(combat);\n const currentImpulse = state.currentImpulse;\n const actionRanking = await syncCombatantActionRanking(combatant);\n const encPenalty = getEncumbranceArPenalty(combatant);\n const impulseMod = num(combatant.flags?.[SYSTEM_ID]?.impulseModifier, 0);\n const effectiveAr = Math.max(1, actionRanking + encPenalty);\n const baseDuration = major ? effectiveAr : 1;\n const duration = Math.max(1, baseDuration + impulseMod);\n const completeImpulse = currentImpulse + duration;\n\n const event: ActionEvent = {\n id: foundry.utils.randomID(),\n actorId: combatant.actor?.id ?? null,\n combatantId,\n kind,\n major,\n startImpulse: currentImpulse,\n completeImpulse\n };\n\n const queueWithoutCombatant = pruneQueueToCombatants(\n state.queue.filter((entry) => entry.combatantId !== combatantId),\n combat\n );\n queueWithoutCombatant.push(event);\n\n await setImpulseState(combat, {\n currentImpulse,\n queue: sortQueueByCompletion(queueWithoutCombatant, combat)\n });\n\n await combatant.update({\n [`flags.${SYSTEM_ID}.pendingEventId`]: event.id,\n [`flags.${SYSTEM_ID}.pendingKind`]: kind,\n [`flags.${SYSTEM_ID}.actionRanking`]: actionRanking,\n [`flags.${SYSTEM_ID}.effectiveActionRanking`]: effectiveAr\n });\n\n const timingLabel = major\n ? `AR ${actionRanking} + Enc ${encPenalty}${impulseMod ? ` ${impulseMod > 0 ? \"+\" : \"\"} Imp ${impulseMod}` : \"\"}`\n : `Minor 1${impulseMod ? ` ${impulseMod > 0 ? \"+\" : \"\"} Imp ${impulseMod}` : \"\"}`;\n ui.notifications?.info(\n `${combatant.name}: ${actionKindLabel(kind)} completes on impulse ${completeImpulse} (${timingLabel} => ${duration}).`\n );\n refreshImpulseOverlays(combat);\n}\n\nasync function cancelAction(combat: any, combatantId: string): Promise<void> {\n if (!(await ensureGmControl())) return;\n\n const combatant = combat.combatants.get(combatantId);\n if (!combatant) return;\n\n const state = getImpulseState(combat);\n const nextQueue = pruneQueueToCombatants(\n state.queue.filter((entry) => entry.combatantId !== combatantId),\n combat\n );\n\n await setImpulseState(combat, {\n currentImpulse: state.currentImpulse,\n queue: sortQueueByCompletion(nextQueue, combat)\n });\n\n await combatant.update({\n [`flags.${SYSTEM_ID}.pendingEventId`]: null,\n [`flags.${SYSTEM_ID}.pendingKind`]: \"\",\n [`flags.${SYSTEM_ID}.aimState`]: {\n active: false,\n targetId: null,\n sinceImpulse: null\n }\n });\n refreshImpulseOverlays(combat);\n}\n\nasync function resolveActionEvent(combat: any, event: ActionEvent, impulse: number): Promise<void> {\n const combatant = combat.combatants.get(event.combatantId);\n if (!combatant) return;\n\n const updates: Record<string, unknown> = {\n [`flags.${SYSTEM_ID}.pendingEventId`]: null,\n [`flags.${SYSTEM_ID}.pendingKind`]: \"\"\n };\n\n if (event.kind === \"aim\") {\n updates[`flags.${SYSTEM_ID}.aimState`] = {\n active: true,\n targetId: event.targetTokenId ?? null,\n sinceImpulse: impulse\n };\n }\n\n await combatant.update(updates);\n\n const content = `\n <div class=\"ringworld-chat-card\">\n <h3>Impulse ${impulse} Completion</h3>\n <p><strong>${esc(combatant.name)}</strong> completes <strong>${esc(actionKindLabel(event.kind))}</strong>.</p>\n <p><small>DEX ${getDexForCombatant(combatant)} | AR ${getCombatantActionRanking(combatant)}</small></p>\n </div>\n `;\n await ChatMessage.create({\n user: game.user?.id,\n speaker: ChatMessage.getSpeaker({ actor: combatant.actor ?? undefined }),\n content\n });\n}\n\nasync function advanceImpulse(combat: any, mode: \"next\" | \"step\"): Promise<void> {\n if (!(await ensureGmControl())) return;\n\n const state = getImpulseState(combat);\n const queue = sortQueueByCompletion(pruneQueueToCombatants(state.queue, combat), combat);\n const current = state.currentImpulse;\n\n let targetImpulse = current + 1;\n if (mode === \"next\") {\n const next = queue\n .map((event) => event.completeImpulse)\n .filter((impulse) => impulse >= current)\n .sort((a, b) => a - b)[0];\n if (Number.isFinite(next)) {\n targetImpulse = next;\n }\n }\n\n const completing = queue.filter((event) => event.completeImpulse === targetImpulse);\n const remaining = queue.filter((event) => event.completeImpulse !== targetImpulse);\n\n await setImpulseState(combat, {\n currentImpulse: targetImpulse,\n queue: remaining\n });\n\n const ordered = sortQueueByCompletion(completing, combat);\n for (const event of ordered) {\n await resolveActionEvent(combat, event, targetImpulse);\n }\n\n if (!ordered.length) {\n ui.notifications?.info(`Impulse advanced to ${targetImpulse}.`);\n }\n refreshImpulseOverlays(combat);\n}\n\nasync function resetImpulseSequence(combat: any): Promise<void> {\n if (!(await ensureGmControl())) return;\n\n await setImpulseState(combat, { currentImpulse: 1, queue: [] });\n\n for (const combatant of combat.combatants) {\n await combatant.update({\n [`flags.${SYSTEM_ID}.pendingEventId`]: null,\n [`flags.${SYSTEM_ID}.pendingKind`]: \"\",\n [`flags.${SYSTEM_ID}.aimState`]: {\n active: false,\n targetId: null,\n sinceImpulse: null\n },\n [`flags.${SYSTEM_ID}.actionRanking`]: actionRankingFromDex(getDexForCombatant(combatant)),\n [`flags.${SYSTEM_ID}.effectiveActionRanking`]: null,\n [`flags.${SYSTEM_ID}.impulseModifier`]: 0\n });\n }\n refreshImpulseOverlays(combat);\n}\n\nfunction renderImpulsePanel(app: any, htmlLike: JQuery | HTMLElement): void {\n const html = \"find\" in (htmlLike as any) ? (htmlLike as JQuery) : $(htmlLike);\n if (!html?.length) return;\n html.addClass(\"ringworld-impulse-mode ringworld-impulse-only\");\n\n const combat = app?.viewed ?? game.combat;\n if (!combat) return;\n\n const state = getImpulseState(combat);\n const queue = sortQueueByCompletion(pruneQueueToCombatants(state.queue, combat), combat);\n if (queue.length !== state.queue.length) {\n void setImpulseState(combat, { currentImpulse: state.currentImpulse, queue });\n }\n\n html\n .find(\n \".token-initiative, .combatant-initiative, .initiative, [data-action='rollInitiative'], [data-control='rollInitiative'], .combatant .fa-dice-d20\"\n )\n .addClass(\"rw-hide-initiative\");\n\n html.find(\".ringworld-impulse-panel\").remove();\n\n const disabled = game.user?.isGM ? \"\" : \"disabled\";\n const rows = combat.combatants.map((combatant: any) => {\n const ar = getCombatantActionRanking(combatant);\n const encPenalty = getEncumbranceArPenalty(combatant);\n const impMod = num(combatant.flags?.[SYSTEM_ID]?.impulseModifier, 0);\n const effAr = Math.max(1, ar + encPenalty);\n const dex = getDexForCombatant(combatant);\n const pending = queue.find((event) => event.combatantId === combatant.id);\n const pendingLabel = pending\n ? `${actionKindLabel(pending.kind)} @ ${pending.completeImpulse}`\n : \"Ready\";\n const aimState = combatant.flags?.[SYSTEM_ID]?.aimState;\n const aimLabel = aimState?.active ? `Aiming since ${aimState.sinceImpulse}` : \"Not aiming\";\n\n const options = MAJOR_ACTION_OPTIONS.map((opt) => {\n const selected = pending?.major && pending?.kind === opt.value ? \"selected\" : \"\";\n return `<option value=\"${opt.value}\" ${selected}>${opt.label}</option>`;\n }).join(\"\");\n const minorOptions = MINOR_ACTION_OPTIONS.map((opt) => {\n const selected = !pending?.major && pending?.kind === opt.value ? \"selected\" : \"\";\n return `<option value=\"${opt.value}\" ${selected}>${opt.label}</option>`;\n }).join(\"\");\n\n return `\n <div class=\"rw-imp-row\" data-combatant-id=\"${combatant.id}\">\n <div class=\"rw-imp-row-head\">\n <span class=\"rw-imp-name\">${esc(combatant.name)}</span>\n <span class=\"rw-imp-meta\">DEX ${dex} | AR ${ar} + Enc ${encPenalty} = ${effAr} | Imp Mod ${impMod >= 0 ? `+${impMod}` : impMod} | ${esc(pendingLabel)} | ${esc(aimLabel)}</span>\n </div>\n <div class=\"rw-imp-row-controls\">\n <select class=\"rw-major-kind\" ${disabled}>${options}</select>\n <select class=\"rw-minor-kind\" ${disabled}>${minorOptions}</select>\n <button type=\"button\" class=\"rw-major-start\" ${disabled}>Major</button>\n <button type=\"button\" class=\"rw-minor-start\" ${disabled}>Minor</button>\n <button type=\"button\" class=\"rw-cancel-start\" ${disabled}>Cancel</button>\n <label>Imp Mod <input type=\"number\" class=\"rw-imp-mod\" value=\"${impMod}\" ${disabled} /></label>\n <button type=\"button\" class=\"rw-save-mods\" ${disabled}>Save Mods</button>\n </div>\n </div>\n `;\n }).join(\"\");\n\n const panel = $(`\n <section class=\"ringworld-impulse-panel\">\n <div class=\"rw-impulse-top\">\n <div class=\"rw-impulse-clock\">Impulse <strong>${state.currentImpulse}</strong></div>\n <div class=\"rw-impulse-queue\">Queued: ${queue.length}</div>\n <div class=\"rw-impulse-controls\">\n <button type=\"button\" class=\"rw-advance-next\" ${disabled}>Next Completion</button>\n <button type=\"button\" class=\"rw-advance-step\" ${disabled}>+1 Impulse</button>\n <button type=\"button\" class=\"rw-reset-sequence\" ${disabled}>Break / Reset</button>\n </div>\n </div>\n <div class=\"rw-imp-list\">${rows}</div>\n </section>\n `);\n\n html.prepend(panel);\n\n // Hide all native combat tracker blocks so only Ringworld impulse UI is shown.\n const root = html.get(0);\n if (root) {\n for (const child of Array.from(root.children)) {\n if (!(child as HTMLElement).classList.contains(\"ringworld-impulse-panel\")) {\n (child as HTMLElement).classList.add(\"rw-hide-core-tracker\");\n }\n }\n }\n\n panel.find(\".rw-advance-next\").on(\"click\", async (event) => {\n event.preventDefault();\n await advanceImpulse(combat, \"next\");\n });\n\n panel.find(\".rw-advance-step\").on(\"click\", async (event) => {\n event.preventDefault();\n await advanceImpulse(combat, \"step\");\n });\n\n panel.find(\".rw-reset-sequence\").on(\"click\", async (event) => {\n event.preventDefault();\n await resetImpulseSequence(combat);\n });\n\n panel.find(\".rw-major-start\").on(\"click\", async (event) => {\n event.preventDefault();\n const row = (event.currentTarget as HTMLElement).closest(\".rw-imp-row\");\n if (!row) return;\n const combatantId = String(row.getAttribute(\"data-combatant-id\") || \"\");\n const select = row.querySelector(\".rw-major-kind\") as HTMLSelectElement | null;\n const kind = String(select?.value || \"draw\") as MajorActionKind;\n await scheduleAction(combat, combatantId, kind, true);\n });\n\n panel.find(\".rw-minor-start\").on(\"click\", async (event) => {\n event.preventDefault();\n const row = (event.currentTarget as HTMLElement).closest(\".rw-imp-row\");\n if (!row) return;\n const combatantId = String(row.getAttribute(\"data-combatant-id\") || \"\");\n const select = row.querySelector(\".rw-minor-kind\") as HTMLSelectElement | null;\n const kind = String(select?.value || \"minorCustom\") as MinorActionKind;\n await scheduleAction(combat, combatantId, kind, false);\n });\n\n panel.find(\".rw-cancel-start\").on(\"click\", async (event) => {\n event.preventDefault();\n const row = (event.currentTarget as HTMLElement).closest(\".rw-imp-row\");\n if (!row) return;\n const combatantId = String(row.getAttribute(\"data-combatant-id\") || \"\");\n await cancelAction(combat, combatantId);\n });\n\n panel.find(\".rw-save-mods\").on(\"click\", async (event) => {\n event.preventDefault();\n if (!(await ensureGmControl())) return;\n const row = (event.currentTarget as HTMLElement).closest(\".rw-imp-row\");\n if (!row) return;\n const combatantId = String(row.getAttribute(\"data-combatant-id\") || \"\");\n const combatant = combat.combatants.get(combatantId);\n if (!combatant) return;\n\n const impModInput = row.querySelector(\".rw-imp-mod\") as HTMLInputElement | null;\n const impMod = Math.trunc(num(impModInput?.value, 0));\n await combatant.update({\n [`flags.${SYSTEM_ID}.impulseModifier`]: impMod\n });\n });\n\n refreshImpulseOverlays(combat);\n}\n\nexport function initializeImpulseTracker(): void {\n Hooks.on(\"renderCombatTracker\", (app: any, htmlLike: JQuery | HTMLElement) => {\n renderImpulsePanel(app, htmlLike);\n });\n\n Hooks.on(\"createCombat\", async (combat: any) => {\n await setImpulseState(combat, { currentImpulse: 1, queue: [] });\n refreshImpulseOverlays(combat);\n });\n\n Hooks.on(\"createCombatant\", async (combatant: any) => {\n await syncCombatantActionRanking(combatant);\n refreshImpulseOverlays(game.combat ?? null);\n });\n\n Hooks.on(\"deleteCombatant\", async () => {\n refreshImpulseOverlays(game.combat ?? null);\n });\n\n Hooks.on(\"updateCombat\", (combat: any) => {\n refreshImpulseOverlays(combat ?? game.combat ?? null);\n });\n\n Hooks.on(\"deleteCombat\", () => {\n refreshImpulseOverlays(null);\n });\n\n Hooks.on(\"renderChatLog\", () => {\n refreshImpulseOverlays(game.combat ?? null);\n });\n\n Hooks.on(\"canvasReady\", () => {\n refreshImpulseOverlays(game.combat ?? null);\n });\n\n Hooks.on(\"updateActor\", (actor: any) => {\n const combat = game.combat;\n if (!combat) return;\n const inCombat = combat.combatants.some((c: any) => c.actor?.id === actor.id);\n if (inCombat) {\n ui.combat?.render(true);\n refreshImpulseOverlays(combat);\n }\n });\n\n Hooks.on(\"updateItem\", (item: any) => {\n const actor = item?.parent;\n if (!actor) return;\n const combat = game.combat;\n if (!combat) return;\n const inCombat = combat.combatants.some((c: any) => c.actor?.id === actor.id);\n if (inCombat) {\n ui.combat?.render(true);\n refreshImpulseOverlays(combat);\n }\n });\n}\n","import \"./styles/ringworld.scss\";\n\nimport { RingworldActor } from \"./module/actor/RingworldActor\";\nimport { RingworldItem } from \"./module/item/RingworldItem\";\nimport { RingworldExplorerSheet } from \"./module/sheets/actors/ExplorerSheet\";\nimport { RingworldCreatureSheet } from \"./module/sheets/actors/CreatureSheet\";\nimport { RingworldVehicleSheet } from \"./module/sheets/actors/VehicleSheet\";\nimport { RingworldSkillSheet } from \"./module/sheets/items/SkillSheet\";\nimport { RingworldWeaponSheet } from \"./module/sheets/items/WeaponSheet\";\nimport { RingworldArmorSheet } from \"./module/sheets/items/ArmorSheet\";\nimport { RingworldGearSheet } from \"./module/sheets/items/GearSheet\";\nimport { RingworldSpeciesSheet } from \"./module/sheets/items/SpeciesSheet\";\nimport { RingworldPursuitSheet } from \"./module/sheets/items/PursuitSheet\";\nimport { HIT_LOCATION_TABLE } from \"./module/constants\";\nimport { createRandomExplorer } from \"./module/character-tools\";\nimport { RINGWORLD_CATALOG_VERSION, seedWorldCatalog } from \"./module/world-catalog\";\nimport { initializeImpulseTracker } from \"./module/impulse-tracker\";\nimport { DEFAULT_SKILL_ICON, baseSkillByName, resolveSkillIcon } from \"./module/skill-icons\";\n\nconst ENCUMBRANCE_DATA_MIGRATION_VERSION = 2;\n\nfunction normName(value: unknown): string {\n return String(value ?? \"\").trim().toLowerCase();\n}\n\nfunction worldItemWeightMap(): Map<string, number> {\n const map = new Map<string, number>();\n for (const item of game.items ?? []) {\n if (item.type !== \"weapon\" && item.type !== \"armor\" && item.type !== \"gear\") continue;\n const key = `${item.type}:${normName(item.name)}`;\n map.set(key, Number((item as any).system?.weight ?? 0) || 0);\n }\n return map;\n}\n\nasync function migrateActorItemEncumbranceData(): Promise<number> {\n if (!game.user?.isGM) return 0;\n const weightMap = worldItemWeightMap();\n let touched = 0;\n\n for (const actor of game.actors ?? []) {\n const updates: any[] = [];\n\n for (const item of actor.items ?? []) {\n if (item.type !== \"weapon\" && item.type !== \"armor\" && item.type !== \"gear\") continue;\n const patch: Record<string, unknown> = { _id: item.id };\n let changed = false;\n\n if ((item as any).system?.equipped === undefined) {\n patch[\"system.equipped\"] = true;\n changed = true;\n }\n\n if ((item as any).system?.weight === undefined) {\n const key = `${item.type}:${normName(item.name)}`;\n patch[\"system.weight\"] = Number(weightMap.get(key) ?? 0);\n changed = true;\n }\n\n if ((item as any).system?.stowed === undefined) {\n patch[\"system.stowed\"] = false;\n changed = true;\n }\n\n if (changed) {\n updates.push(patch);\n }\n }\n\n if (updates.length) {\n await actor.updateEmbeddedDocuments(\"Item\", updates);\n touched += updates.length;\n }\n }\n\n return touched;\n}\n\nfunction injectDirectoryButton(htmlLike: JQuery | HTMLElement | null | undefined, className: string, label: string, onClick: () => Promise<void> | void): void {\n if (!htmlLike) return;\n const html = \"find\" in (htmlLike as any) ? (htmlLike as JQuery) : $(htmlLike);\n if (!html.length || html.find(`.${className}`).length) return;\n\n const button = $(`<button type=\\\"button\\\" class=\\\"ringworld-directory-button ${className}\\\">${label}</button>`);\n button.on(\"click\", async () => {\n await onClick();\n });\n\n const containers = [\n html.find(\".directory-footer\"),\n html.find(\"footer.directory-footer\"),\n html.find(\"footer\"),\n html.find(\".footer-actions\"),\n html.find(\".header-actions\"),\n html.find(\".action-buttons\")\n ];\n\n const container = containers.find((candidate) => candidate.length);\n if (container) {\n container.first().append(button);\n return;\n }\n\n let fallback = html.find(\".ringworld-directory-controls\");\n if (!fallback.length) {\n fallback = $('<div class=\"ringworld-directory-controls\"></div>');\n html.append(fallback);\n }\n fallback.first().append(button);\n}\n\nasync function handleSeedCatalogClick(): Promise<void> {\n await seedWorldCatalog({ notify: true });\n}\n\nasync function handleCreateRandomExplorerClick(): Promise<void> {\n const actor = await createRandomExplorer();\n actor?.sheet?.render(true);\n}\n\nfunction ensureSidebarDirectoryButtons(): void {\n if (!game.user?.isGM) return;\n\n const itemElement = (ui as any).items?.element;\n injectDirectoryButton(itemElement, \"ringworld-seed-items\", \"Seed Ringworld Items\", handleSeedCatalogClick);\n\n const actorElement = (ui as any).actors?.element;\n injectDirectoryButton(actorElement, \"ringworld-random-actor\", \"Create Random Explorer\", handleCreateRandomExplorerClick);\n}\n\nfunction itemTypeAvailable(type: string): boolean {\n const directTypes = (getDocumentClass(\"Item\") as any)?.TYPES;\n if (Array.isArray(directTypes)) return directTypes.includes(type);\n\n const docTypes = (game as any)?.system?.documentTypes?.Item;\n if (Array.isArray(docTypes)) return docTypes.includes(type);\n if (docTypes && typeof docTypes === \"object\") return Object.prototype.hasOwnProperty.call(docTypes, type);\n\n const configModels = (CONFIG as any)?.Item?.dataModels;\n if (configModels && typeof configModels === \"object\" && Object.prototype.hasOwnProperty.call(configModels, type)) {\n return true;\n }\n return false;\n}\n\nHooks.once(\"init\", async () => {\n console.log(\"ringworld | Initializing Ringworld system\");\n initializeImpulseTracker();\n\n const ActorRegistry = (foundry as any)?.documents?.collections?.Actors;\n const ItemRegistry = (foundry as any)?.documents?.collections?.Items;\n const BaseActorSheet = (foundry as any)?.appv1?.sheets?.ActorSheet;\n const BaseItemSheet = (foundry as any)?.appv1?.sheets?.ItemSheet;\n\n (CONFIG as any).ringworld = {\n hitLocations: HIT_LOCATION_TABLE\n };\n CONFIG.Combat.initiative = foundry.utils.mergeObject(CONFIG.Combat.initiative ?? {}, {\n formula: \"1d100\",\n decimals: 0\n }, { inplace: false });\n\n CONFIG.Actor.documentClass = RingworldActor as any;\n CONFIG.Item.documentClass = RingworldItem as any;\n\n if (!ActorRegistry || !ItemRegistry || !BaseActorSheet || !BaseItemSheet) {\n console.error(\"ringworld | Foundry sheet registries were not available during init.\");\n return;\n }\n\n ActorRegistry.unregisterSheet(\"core\", BaseActorSheet);\n ActorRegistry.registerSheet(\"ringworld\", RingworldExplorerSheet as any, {\n types: [\"explorer\"],\n makeDefault: true\n });\n ActorRegistry.registerSheet(\"ringworld\", RingworldCreatureSheet as any, {\n types: [\"creature\"],\n makeDefault: true\n });\n ActorRegistry.registerSheet(\"ringworld\", RingworldVehicleSheet as any, {\n types: [\"vehicle\"],\n makeDefault: true\n });\n\n ItemRegistry.unregisterSheet(\"core\", BaseItemSheet);\n ItemRegistry.registerSheet(\"ringworld\", RingworldSkillSheet as any, {\n types: [\"skill\"],\n makeDefault: true\n });\n ItemRegistry.registerSheet(\"ringworld\", RingworldWeaponSheet as any, {\n types: [\"weapon\"],\n makeDefault: true\n });\n ItemRegistry.registerSheet(\"ringworld\", RingworldArmorSheet as any, {\n types: [\"armor\"],\n makeDefault: true\n });\n ItemRegistry.registerSheet(\"ringworld\", RingworldGearSheet as any, {\n types: [\"gear\"],\n makeDefault: true\n });\n ItemRegistry.registerSheet(\"ringworld\", RingworldSpeciesSheet as any, {\n types: [\"species\"],\n makeDefault: true\n });\n if (itemTypeAvailable(\"pursuit\")) {\n ItemRegistry.registerSheet(\"ringworld\", RingworldPursuitSheet as any, {\n types: [\"pursuit\"],\n makeDefault: true\n });\n }\n\n game.settings.register(\"ringworld\", \"catalogSeedVersion\", {\n scope: \"world\",\n config: false,\n type: Number,\n default: 0\n });\n game.settings.register(\"ringworld\", \"encumbranceDataMigrationVersion\", {\n scope: \"world\",\n config: false,\n type: Number,\n default: 0\n });\n\n Handlebars.registerHelper(\"eq\", (a: unknown, b: unknown) => a === b);\n Handlebars.registerHelper(\"or\", (a: unknown, b: unknown) => Boolean(a || b));\n});\n\nHooks.once(\"ready\", async () => {\n const path = \"systems/ringworld/resources/hit-locations/humanoid.json\";\n try {\n const response = await fetch(path);\n if (response.ok) {\n const table = await response.json();\n (CONFIG as any).ringworld.hitLocations = table.entries ?? HIT_LOCATION_TABLE;\n }\n } catch (_error) {\n console.warn(`ringworld | Could not load ${path}, using built-in table`);\n }\n\n if (game.user?.isGM) {\n for (const combat of game.combats ?? []) {\n const formula = String(combat?.settings?.initiative?.formula ?? \"\").trim();\n if (!formula || formula.toLowerCase() === \"undefined\") {\n await combat.update({\n \"settings.initiative.formula\": \"1d100\",\n \"settings.initiative.decimals\": 0\n });\n }\n }\n\n const seededVersion = Number(game.settings.get(\"ringworld\", \"catalogSeedVersion\") ?? 0);\n if (seededVersion < RINGWORLD_CATALOG_VERSION) {\n const result = await seedWorldCatalog({ notify: true });\n if (result.added >= 0) {\n await game.settings.set(\"ringworld\", \"catalogSeedVersion\", RINGWORLD_CATALOG_VERSION);\n }\n }\n\n const migratedVersion = Number(game.settings.get(\"ringworld\", \"encumbranceDataMigrationVersion\") ?? 0);\n if (migratedVersion < ENCUMBRANCE_DATA_MIGRATION_VERSION) {\n const touched = await migrateActorItemEncumbranceData();\n await game.settings.set(\"ringworld\", \"encumbranceDataMigrationVersion\", ENCUMBRANCE_DATA_MIGRATION_VERSION);\n if (touched > 0) {\n ui.notifications?.info(`Ringworld encumbrance migration updated ${touched} actor items.`);\n }\n }\n }\n\n ensureSidebarDirectoryButtons();\n window.setTimeout(() => ensureSidebarDirectoryButtons(), 300);\n\n (game as any).ringworld = {\n ...((game as any).ringworld ?? {}),\n seedWorldCatalog: async (options?: { notify?: boolean }) => seedWorldCatalog(options),\n createRandomExplorer: async () => createRandomExplorer(),\n catalogVersion: RINGWORLD_CATALOG_VERSION,\n systemId: \"ringworld\",\n systemVersion: String(game.system?.version ?? \"0.0.0\")\n };\n Hooks.callAll(\"ringworldReady\", (game as any).ringworld);\n});\n\nHooks.on(\"createActor\", async (actor: any, _options: any, userId: string) => {\n if (!game.user?.isGM) return;\n if (userId !== game.user.id) return;\n if (!actor || (actor.type !== \"explorer\" && actor.type !== \"creature\")) return;\n\n try {\n const added = await actor.ensureBaseSkills?.();\n if (Number(added) > 0) {\n console.log(`ringworld | Added ${added} base skills to ${actor.name}`);\n }\n } catch (error) {\n console.error(\"ringworld | Failed to auto-populate base skills\", error);\n }\n});\n\nHooks.on(\"preCreateItem\", (item: any) => {\n if (item.type !== \"skill\") return;\n\n const updates: Record<string, unknown> = {};\n const name = String(item.name || \"Skill\");\n const currentImg = String(item.img || \"\");\n updates.img = resolveSkillIcon(name, currentImg);\n\n const base = baseSkillByName(name);\n const currentSystem = (item as any).system ?? {};\n const currentValue = Number(currentSystem?.value ?? NaN);\n const currentCategory = String(currentSystem?.category ?? \"\").trim();\n\n updates.system = {\n value: Number.isFinite(currentValue) ? currentValue : (base?.base ?? 0),\n category: currentCategory || (base?.category ?? \"Technical\"),\n specialization: String(currentSystem?.specialization ?? base?.specialization ?? \"\")\n };\n\n if (!updates.img) updates.img = DEFAULT_SKILL_ICON;\n item.updateSource(updates);\n});\n\nHooks.on(\"renderItemDirectory\", (_app: any, html: JQuery) => {\n if (!game.user?.isGM) return;\n injectDirectoryButton(html, \"ringworld-seed-items\", \"Seed Ringworld Items\", handleSeedCatalogClick);\n ensureSidebarDirectoryButtons();\n});\n\nHooks.on(\"renderActorDirectory\", (_app: any, html: JQuery) => {\n if (!game.user?.isGM) return;\n injectDirectoryButton(html, \"ringworld-random-actor\", \"Create Random Explorer\", handleCreateRandomExplorerClick);\n ensureSidebarDirectoryButtons();\n});\n\nHooks.on(\"renderSidebar\", () => {\n ensureSidebarDirectoryButtons();\n});\n\nHooks.on(\"changeSidebarTab\", (app: any) => {\n const tabName = String(app?.tabName ?? app?.id ?? app?.options?.id ?? \"\");\n if (tabName === \"items\" || tabName === \"actors\") {\n ensureSidebarDirectoryButtons();\n }\n});\n"],"names":["showDiceSoNice","roll","dice3d","evaluateRollWithDice","formula","rollPercentile","target","classifyPercentile","cleanTarget","specialThreshold","fumbleThreshold","isSuccess","isSpecial","isFumble","outcome","outcomeLabel","SYSTEM_ID","HIT_LOCATION_TABLE","LIMB_LOCATIONS","LEG_LOCATIONS","isLimb","slug","normalize","value","withFactors","entries","hpFactors","entry","HUMANOID_SCHEMA","DOLPHIN_SCHEMA","PUPPETEER_SCHEMA","TRINOC_SCHEMA","BANDERSNATCHI_SCHEMA","KZINTI_SCHEMA","HIT_LOCATION_SCHEMAS","listHitLocationSchemas","inferHitLocationSchemaId","speciesValue","species","getHitLocationSchemaById","schemaId","key","getActorHitLocationSchema","actor","_a","_b","_c","mode","getTableForActor","getHitLocationFromRollForTable","table","rollHitLocation","total","chooseOrRollHitLocation","schema","entriesBySlug","labelFor","fallback","html","result","resolve","settled","done","dlgHtml","picker","event","button","location","rolled","loc","BASE_SKILL_CATEGORIES","RINGWORLD_BASE_SKILLS","normalizeSkillName","name","baseSkillNameSet","skill","DEFAULT_SKILL_ICON","iconSlug","skillIconPath","baseSkillByName","resolveSkillIcon","currentImg","img","createChatMessage","options","speaker","postSkillRollCard","data","payload","content","postAttackCard","num","n","getSingleTargetActor","targets","rollStandaloneHitLocation","rollSkillForActor","skillName","skillItem","item","resolveLinkedSkill","weapon","skillId","byId","linkedSkillName","byName","clampPercentTarget","promptAttackModifiers","attacker","baseSkillTarget","isRanged","defaultAim","safeActorName","safeWeaponName","safeActorImg","safeWeaponImg","_d","_e","_f","_g","root","query","aimModeRaw","aimMode","aimMultiplier","coverMod","movementMod","rangeMod","situationalMod","customMod","customLabel","flatModifierTotal","preAimTarget","adjustedByAim","finalTarget","parts","aimLabel","consumeWeaponEnergy","cost","packId","pack","current","next","getItemArmorAtLocation","specific","getTotalArmorAtLocation","targetActor","locArmor","stackedItemsArmor","sum","buildConditionUpdates","locationValue","locationMax","generalHp","syncCoreStatusEffects","conditions","toggler","applyLocationDamage","rawDamage","currentLoc","locMax","armor","finalDamage","unclampedLoc","nextLoc","nextGeneral","updates","useWeaponWorkflow","hasTarget","targetName","linkedSkill","modifierResult","energy","attack","remainingGeneralHp","hitSelection","damageFormula","damageRoll","application","recomputeHitPointMaximums","_h","con","mas","existingMax","existingValue","generalMax","hadExisting","wasFull","looksPlaceholder","preservedDamage","recomputedValue","generalAtFull","hpFactor","max","previousMax","previousValue","isPlaceholder","shouldBackfillToFull","RINGWORLD_CATALOG_VERSION","ICONS","speciesIconPath","weaponIconPath","armorIconPath","gearIconPath","pursuitIconPath","allCoverage","torsoCoverage","headCoverage","armCoverage","legCoverage","SPECIES_CATALOG","WEAPON_CATALOG","ARMOR_CATALOG","GEAR_CATALOG","PURSUIT_CATALOG","speciesCatalogForGeneration","itemKey","type","itemTypeAvailable","directTypes","docTypes","configModels","gameModels","toSkillItem","toSpeciesItem","toWeaponItem","folderKey","toArmorItem","toGearItem","toPursuitItem","pursuitAsGearNotes","fixed","optional","group","optionalText","toPursuitFallbackGearItem","itemName","getOrCreateItemFolder","parentId","existing","folder","ensureCatalogFolders","skills","pursuits","gear","weapons","weaponMelee","weaponRanged","buildAllSeeds","canUsePursuitType","seedWorldCatalog","folderIds","seeds","createPayload","updatePayload","seed","folderId","existingItem","update","existingSystem","mergedSystem","systemDiff","getPlayableSpeciesFromWorld","clampScore","rollTotal","rollEdu","edu","die","rollByGravity","gravity","gravityFormulas","randomPick","arr","randomExplorerName","speciesName","starts","ends","applySpeciesModifiers","base","speciesSystem","mods","rollCharacteristicsForActor","gravityType","currentSpeciesName","speciesItem","builtIn","finalValues","ownLanguage","applyStarterKit","starterNames","worldItems","actorExisting","worldItem","randomizeExplorerActor","worldSpecies","builtInSpecies","pickedWorldSpecies","pickedBuiltInSpecies","speciesChoice","homeworld","createRandomExplorer","SPECIES_MODIFIER_KEYS","hasValue","clampCharacteristic","computeDamageMod","str","computeDerivedRolls","characteristics","int","pow","dex","computeRootMaxes","app","computeActionRanking","gravityLoadMultiplier","contributesToEncumbrance","itemWeightKg","computeEncumbrance","system","items","gravityMultiplier","equippedLoadKg","rawLoadKg","effectiveLoadKg","limitKg","overLimitKg","actionRankingPenalty","overLimit","baseMove","baseRun","RingworldActor","profile","derivedRollDefaults","rootMaxDefaults","encumbrance","weaponId","toCreate","speciesData","incomingMods","appliedState","previousMods","currentCharacteristics","currentProfile","normalizedMods","prev","agePrev","ageNext","chronoCurrent","physCurrent","labels","defaults","RingworldItem","BaseActorSheet","ROOT_KEY_BY_CATEGORY","ROOT_FORMULA_BY_CATEGORY","EXCLUDED_EDUCATION_SKILLS","HYPERDRIVE_KEY","a","b","toInt","normalizeAllocation","raw","normalizePursuitSelection","years","normalizeBuilderState","allocations","allocation","normalized","baseBySkillId","isEducationEligible","isSpecialEligible","buildPursuitAllowedSkillSet","entriesByName","allowed","pursuit","computeBuilderPools","age","educationTotal","pursuitYearsTotal","pursuitsTotal","specialTotal","buildBuilderContext","pools","state","pursuitOptions","pursuitAllowedSkills","bySkillId","educationSpent","pursuitsSpent","specialSpent","totalAllocated","baseFromState","baseFromDefinition","inferredBase","baseValue","rootKey","rootCap","maxAllocation","normalizedSkillName","allowsEducation","allowsPursuits","allowsSpecial","pursuitYearsAllocated","row","fromItems","getPreparedHitLocation","rollRange","locationConfig","source","hp","rawLabel","chooseRandom","clampPercent","RingworldExplorerSheet","_i","_j","_k","_l","_m","_n","_o","_p","builderContext","armors","speciesOptions","baseSet","skillByNormalized","skillRootMax","skillsByCategory","category","rows","meta","customSkills","missingBaseSkillsCount","rangesFromSchema","hitLocations","bodyLocations","enc","encRaw","encEffective","encLimit","encPenalty","baseActionRanking","effectiveActionRanking","encumbranceSummary","movementSummary","fromBase","trimmed","cleanYears","context","nextState","existingIndex","index","totalYears","desiredCount","available","i","idx","remainingYears","seededState","freshContext","totalBySkill","maxForSkill","allocatePool","points","poolKey","eligible","remaining","guard","candidates","picked","educationUnspent","pursuitsUnspent","specialUnspent","maxEducation","maxPursuits","maxSpecial","maxByCap","form","requestedTotal","characterKey","label","multiplier","selected","safeMultiplier","doc","li","nextEquipped","nextStowed","added","specialization","itemData","speciesItems","createItems","names","patched","RingworldCreatureSheet","RingworldVehicleSheet","BaseItemSheet","RingworldSkillSheet","RingworldWeaponSheet","RingworldArmorSheet","RingworldGearSheet","RingworldSpeciesSheet","asArray","RingworldPursuitSheet","fixedSkills","optionalGroups","IMPULSE_FLAG","IMPULSE_HUD_POS_KEY","MAJOR_ACTION_OPTIONS","MINOR_ACTION_OPTIONS","esc","actionRankingFromDex","actionKindLabel","kind","getDexForCombatant","combatant","getCombatantActionRanking","fromFlag","getEncumbranceArPenalty","fromActor","syncCombatantActionRanking","ranking","getImpulseState","combat","queue","setImpulseState","sortQueueByCompletion","aDex","pruneQueueToCombatants","validIds","c","loadHudPosition","parsed","left","top","saveHudPosition","position","clearHudPosition","clampHudPosition","element","width","height","maxLeft","maxTop","applyHudAbsolutePosition","hud","el","clamped","makeHudDraggable","handle","saved","dragging","startX","startY","startLeft","startTop","mouseEvent","rect","moveEvent","evt","deltaX","deltaY","latestRect","getQueueWithNames","renderQueueRowsMarkup","limit","attachOverlayControls","disabled","advanceImpulse","resetImpulseSequence","renderChatImpulseMarker","chatEl","marker","renderFloatingImpulseHud","refreshImpulseOverlays","ensureGmControl","scheduleAction","combatantId","major","currentImpulse","actionRanking","impulseMod","effectiveAr","duration","completeImpulse","queueWithoutCombatant","timingLabel","cancelAction","nextQueue","resolveActionEvent","impulse","targetImpulse","completing","ordered","renderImpulsePanel","htmlLike","ar","impMod","effAr","pending","pendingLabel","aimState","opt","minorOptions","panel","child","select","impModInput","initializeImpulseTracker","ENCUMBRANCE_DATA_MIGRATION_VERSION","normName","worldItemWeightMap","map","migrateActorItemEncumbranceData","weightMap","touched","patch","changed","injectDirectoryButton","className","onClick","container","candidate","handleSeedCatalogClick","handleCreateRandomExplorerClick","ensureSidebarDirectoryButtons","itemElement","actorElement","ActorRegistry","ItemRegistry","path","response","_options","userId","error","currentSystem","currentValue","currentCategory","_app","tabName"],"mappings":"AAAA,eAAsBA,GAAeC,GAA2B;AAC9D,QAAMC,IAAU,6BAAc;AAC9B,MAAKA,KAAA,QAAAA,EAAQ;AAEb,QAAI;AACF,YAAMA,EAAO,YAAYD,GAAM,KAAK,MAAM,IAAM,MAAM,EAAK;AAAA,IAC7D,QAAiB;AAAA,IAEjB;AACF;AAEA,eAAsBE,GAAqBC,GAAgC;AACzE,QAAMH,IAAO,MAAM,IAAI,KAAKG,CAAO,EAAE,SAAA;AACrC,eAAMJ,GAAeC,CAAW,GACzBA;AACT;ACFA,eAAsBI,GAAeC,GAA2C;AAC9E,QAAML,IAAO,MAAME,GAAqB,OAAO;AAC/C,SAAOI,GAAmBN,EAAK,SAAS,GAAGK,CAAM;AACnD;AAEO,SAASC,GAAmBN,GAAcK,GAAkC;AACjF,QAAME,IAAc,KAAK,IAAI,GAAG,KAAK,MAAM,OAAOF,CAAM,KAAK,CAAC,CAAC,GACzDG,IAAmB,KAAK,IAAI,GAAG,KAAK,MAAMD,IAAc,CAAC,CAAC,GAC1DE,IAAkBF,KAAe,KAAK,MAAM,IAE5CG,IAAYV,KAAQO,GACpBI,IAAYD,KAAaV,KAAQQ,GACjCI,IAAW,CAACF,KAAaV,KAAQS;AAEvC,MAAII,IAA6B;AACjC,SAAID,IAAUC,IAAU,WACfF,IAAWE,IAAU,YACrBH,MAAWG,IAAU,YAEvB;AAAA,IACL,MAAAb;AAAA,IACA,QAAQO;AAAA,IACR,SAAAM;AAAA,IACA,WAAAH;AAAA,IACA,WAAAC;AAAA,IACA,UAAAC;AAAA,EAAA;AAEJ;AAEO,SAASE,GAAaD,GAAoC;AAC/D,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AC5CO,MAAME,IAAY,aAEZC,KAAyC;AAAA,EACpD,EAAE,MAAM,QAAQ,OAAO,aAAa,KAAK,GAAG,KAAK,EAAA;AAAA,EACjD,EAAE,MAAM,QAAQ,OAAO,YAAY,KAAK,GAAG,KAAK,EAAA;AAAA,EAChD,EAAE,MAAM,WAAW,OAAO,WAAW,KAAK,GAAG,KAAK,GAAA;AAAA,EAClD,EAAE,MAAM,SAAS,OAAO,SAAS,KAAK,IAAI,KAAK,GAAA;AAAA,EAC/C,EAAE,MAAM,QAAQ,OAAO,aAAa,KAAK,IAAI,KAAK,GAAA;AAAA,EAClD,EAAE,MAAM,QAAQ,OAAO,YAAY,KAAK,IAAI,KAAK,GAAA;AAAA,EACjD,EAAE,MAAM,QAAQ,OAAO,QAAQ,KAAK,IAAI,KAAK,GAAA;AAC/C,GAYaC,KAAoC,CAAC,QAAQ,QAAQ,QAAQ,MAAM,GACnEC,KAAmC,CAAC,QAAQ,MAAM;AAExD,SAASC,GAAOC,GAAgC;AACrD,SAAOH,GAAe,SAASG,CAAI;AACrC;ACrBA,SAASC,GAAUC,GAAwB;AACzC,SAAO,OAAOA,KAAS,EAAE,EACtB,cACA,QAAQ,eAAe,EAAE;AAC9B;AAEA,SAASC,GAAYC,GAA6BC,GAAgF;AAChI,SAAOD,EAAQ,IAAI,CAACE,OAAW;AAAA,IAC7B,GAAGA;AAAA,IACH,WAAUD,KAAA,gBAAAA,EAAYC,EAAM,WAAUA,EAAM,SAAS,UAAU,OAAQA,EAAM,SAAS,UAAUA,EAAM,SAAS,SAAU,OAAO;AAAA,EAAA,EAChI;AACJ;AAEA,MAAMC,KAAqC;AAAA,EACzC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,WAAW,CAAC,QAAQ,QAAQ,SAAS,QAAQ,WAAW,QAAQ,MAAM;AAAA,EACtE,SAASJ,GAAYP,EAAkB;AACzC,GAEMY,KAAoC;AAAA,EACxC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,WAAW,CAAC,QAAQ,QAAQ,SAAS,QAAQ,WAAW,QAAQ,MAAM;AAAA,EACtE,SAASL,GAAY;AAAA,IACnB,EAAE,MAAM,QAAQ,OAAO,eAAe,KAAK,GAAG,KAAK,EAAA;AAAA,IACnD,EAAE,MAAM,QAAQ,OAAO,cAAc,KAAK,GAAG,KAAK,EAAA;AAAA,IAClD,EAAE,MAAM,WAAW,OAAO,cAAc,KAAK,GAAG,KAAK,EAAA;AAAA,IACrD,EAAE,MAAM,SAAS,OAAO,aAAa,KAAK,IAAI,KAAK,GAAA;AAAA,IACnD,EAAE,MAAM,QAAQ,OAAO,aAAa,KAAK,IAAI,KAAK,GAAA;AAAA,IAClD,EAAE,MAAM,QAAQ,OAAO,YAAY,KAAK,IAAI,KAAK,GAAA;AAAA,IACjD,EAAE,MAAM,QAAQ,OAAO,QAAQ,KAAK,IAAI,KAAK,GAAA;AAAA,EAAG,GAC/C;AAAA,IACD,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EAAA,CACP;AACH,GAEMM,KAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,WAAW,CAAC,QAAQ,QAAQ,SAAS,QAAQ,WAAW,QAAQ,MAAM;AAAA,EACtE,SAASN,GAAY;AAAA,IACnB,EAAE,MAAM,QAAQ,OAAO,kBAAkB,KAAK,GAAG,KAAK,EAAA;AAAA,IACtD,EAAE,MAAM,QAAQ,OAAO,iBAAiB,KAAK,GAAG,KAAK,EAAA;AAAA,IACrD,EAAE,MAAM,QAAQ,OAAO,iBAAiB,KAAK,GAAG,KAAK,EAAA;AAAA,IACrD,EAAE,MAAM,QAAQ,OAAO,gBAAgB,KAAK,IAAI,KAAK,GAAA;AAAA,IACrD,EAAE,MAAM,SAAS,OAAO,aAAa,KAAK,IAAI,KAAK,GAAA;AAAA,IACnD,EAAE,MAAM,WAAW,OAAO,aAAa,KAAK,IAAI,KAAK,GAAA;AAAA,IACrD,EAAE,MAAM,QAAQ,OAAO,cAAc,KAAK,IAAI,KAAK,GAAA;AAAA,EAAG,GACrD;AAAA,IACD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EAAA,CACP;AACH,GAEMO,KAAmC;AAAA,EACvC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,WAAW,CAAC,QAAQ,QAAQ,SAAS,QAAQ,WAAW,QAAQ,MAAM;AAAA,EACtE,SAASP,GAAY;AAAA,IACnB,EAAE,MAAM,QAAQ,OAAO,kBAAkB,KAAK,GAAG,KAAK,EAAA;AAAA,IACtD,EAAE,MAAM,QAAQ,OAAO,iBAAiB,KAAK,GAAG,KAAK,EAAA;AAAA,IACrD,EAAE,MAAM,SAAS,OAAO,eAAe,KAAK,GAAG,KAAK,GAAA;AAAA,IACpD,EAAE,MAAM,WAAW,OAAO,eAAe,KAAK,IAAI,KAAK,GAAA;AAAA,IACvD,EAAE,MAAM,QAAQ,OAAO,aAAa,KAAK,IAAI,KAAK,GAAA;AAAA,IAClD,EAAE,MAAM,QAAQ,OAAO,YAAY,KAAK,IAAI,KAAK,GAAA;AAAA,IACjD,EAAE,MAAM,QAAQ,OAAO,QAAQ,KAAK,IAAI,KAAK,GAAA;AAAA,EAAG,GAC/C;AAAA,IACD,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,EAAA,CACP;AACH,GAEMQ,KAA0C;AAAA,EAC9C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,WAAW,CAAC,QAAQ,QAAQ,SAAS,QAAQ,WAAW,QAAQ,MAAM;AAAA,EACtE,SAASR,GAAY;AAAA,IACnB,EAAE,MAAM,QAAQ,OAAO,mBAAmB,KAAK,GAAG,KAAK,EAAA;AAAA,IACvD,EAAE,MAAM,QAAQ,OAAO,kBAAkB,KAAK,GAAG,KAAK,EAAA;AAAA,IACtD,EAAE,MAAM,WAAW,OAAO,mBAAmB,KAAK,GAAG,KAAK,GAAA;AAAA,IAC1D,EAAE,MAAM,SAAS,OAAO,mBAAmB,KAAK,IAAI,KAAK,GAAA;AAAA,IACzD,EAAE,MAAM,QAAQ,OAAO,qBAAqB,KAAK,IAAI,KAAK,GAAA;AAAA,IAC1D,EAAE,MAAM,QAAQ,OAAO,oBAAoB,KAAK,IAAI,KAAK,GAAA;AAAA,IACzD,EAAE,MAAM,QAAQ,OAAO,gBAAgB,KAAK,IAAI,KAAK,GAAA;AAAA,EAAG,GACvD;AAAA,IACD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EAAA,CACP;AACH,GAEMS,KAAmC;AAAA,EACvC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,WAAW,CAAC,QAAQ,QAAQ,SAAS,QAAQ,WAAW,QAAQ,MAAM;AAAA,EACtE,SAAST,GAAY;AAAA,IACnB,EAAE,MAAM,QAAQ,OAAO,kBAAkB,KAAK,GAAG,KAAK,EAAA;AAAA,IACtD,EAAE,MAAM,QAAQ,OAAO,iBAAiB,KAAK,GAAG,KAAK,EAAA;AAAA,IACrD,EAAE,MAAM,WAAW,OAAO,WAAW,KAAK,GAAG,KAAK,GAAA;AAAA,IAClD,EAAE,MAAM,SAAS,OAAO,SAAS,KAAK,IAAI,KAAK,GAAA;AAAA,IAC/C,EAAE,MAAM,QAAQ,OAAO,iBAAiB,KAAK,IAAI,KAAK,GAAA;AAAA,IACtD,EAAE,MAAM,QAAQ,OAAO,gBAAgB,KAAK,IAAI,KAAK,GAAA;AAAA,IACrD,EAAE,MAAM,QAAQ,OAAO,QAAQ,KAAK,IAAI,KAAK,GAAA;AAAA,EAAG,CACjD;AACH,GAEaU,KAAuE;AAAA,EAClF,UAAUN;AAAA,EACV,SAASC;AAAA,EACT,WAAWC;AAAA,EACX,QAAQC;AAAA,EACR,eAAeC;AAAA,EACf,QAAQC;AACV;AAEO,SAASE,KAA8C;AAC5D,SAAO,OAAO,OAAOD,EAAoB;AAC3C;AAEO,SAASE,GAAyBC,GAA4C;AACnF,QAAMC,IAAUhB,GAAUe,CAAY;AACtC,SAAKC,IACDA,EAAQ,SAAS,SAAS,IAAU,YACpCA,EAAQ,SAAS,WAAW,IAAU,cACtCA,EAAQ,SAAS,QAAQ,IAAU,WACnCA,EAAQ,SAAS,cAAc,IAAU,kBACzCA,EAAQ,SAAS,QAAQ,IAAU,WAChC,aANc;AAOvB;AAEO,SAASC,GAAyBC,GAAsC;AAC7E,QAAMC,IAAMnB,GAAUkB,CAAQ;AAC9B,SAAON,GAAqBO,CAAG,KAAKb;AACtC;AAEO,SAASc,GAA0BC,GAA+B;AH3KzE,MAAAC,GAAAC,GAAAC;AG4KE,QAAMC,IAAO,SAAOH,IAAAD,KAAA,gBAAAA,EAAO,WAAP,gBAAAC,EAAe,sBAAqB,MAAM,EAAE,KAAA,EAAO,YAAA;AACvE,MAAIG,KAAQA,MAAS;AACnB,WAAOR,GAAyBQ,CAAI;AAEtC,QAAMT,MAAUQ,KAAAD,IAAAF,KAAA,gBAAAA,EAAO,WAAP,gBAAAE,EAAe,YAAf,gBAAAC,EAAwB,YAAW;AACnD,SAAOP,GAAyBH,GAAyBE,CAAO,CAAC;AACnE;ACpKA,SAASU,GAAiBL,GAAiC;AACzD,SAAKA,IACUD,GAA0BC,CAAK,EAChC,UAFK1B;AAGrB;AAEA,SAASgC,GAA+BhD,GAAciD,GAA6C;AAEjG,SADcA,EAAM,KAAK,CAACvB,MAAU1B,KAAQ0B,EAAM,OAAO1B,KAAQ0B,EAAM,GAAG,KAC1DuB,EAAMA,EAAM,SAAS,CAAC;AACxC;AAEA,eAAsBC,GAAgBR,GAA6C;AAEjF,QAAMS,KADO,MAAMjD,GAAqB,MAAM,GAC3B,SAAS,IACtB+C,IAAQF,GAAiBL,CAAK;AACpC,SAAO;AAAA,IACL,MAAMS;AAAA,IACN,UAAUH,GAA+BG,GAAOF,CAAK;AAAA,EAAA;AAEzD;AAEA,eAAsBG,GAAwBV,GAIpC;AACR,QAAMW,IAASX,IAAQD,GAA0BC,CAAK,IAAIJ,GAAyB,UAAU,GACvFW,IAAQI,EAAO,SACfC,IAAgB,IAAI,IAAIL,EAAM,IAAI,CAACvB,MAAU,CAACA,EAAM,MAAMA,CAAK,CAAC,CAAC,GACjE6B,IAAW,CAACnC,GAAuBoC,MAAA;AJ3C3C,QAAAb;AI2CgE,aAAAA,IAAAW,EAAc,IAAIlC,CAAI,MAAtB,gBAAAuB,EAAyB,UAASa;AAAA,KAE1FC,IAAO;AAAA,+CACgCJ,EAAO,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8FAQsCE,EAAS,QAAQ,MAAM,CAAC;AAAA,+FACvBA,EAAS,QAAQ,UAAU,CAAC;AAAA,gGAC3BA,EAAS,SAAS,OAAO,CAAC;AAAA,+FAC3BA,EAAS,QAAQ,WAAW,CAAC;AAAA,oGACxBA,EAAS,WAAW,SAAS,CAAC;AAAA,+FACnCA,EAAS,QAAQ,UAAU,CAAC;AAAA,+FAC5BA,EAAS,QAAQ,WAAW,CAAC;AAAA;AAAA;AAAA,KAKpHG,IAAS,MAAM,IAAI,QAAuB,CAACC,MAAY;AAC3D,QAAIC,IAAU;AACd,UAAMC,IAAO,CAACvC,MAAyB;AACrC,MAAIsC,MACJA,IAAU,IACVD,EAAQrC,CAAK;AAAA,IACf;AAoCA,IAlCe,IAAI,OAAO;AAAA,MACxB,OAAO;AAAA,MACP,SAASmC;AAAA,MACT,SAAS;AAAA,QACP,OAAO;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAACK,MAAoB;AAC7B,kBAAMxC,IAAQ,OAAOwC,EAAQ,KAAK,wBAAwB,EAAE,IAAA,KAAS,QAAQ;AAC7E,YAAAD,EAAKvC,CAAK;AAAA,UACZ;AAAA,QAAA;AAAA,QAEF,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,UAAU,MAAMuC,EAAK,IAAI;AAAA,QAAA;AAAA,MAC3B;AAAA,MAEF,SAAS;AAAA,MACT,QAAQ,CAACC,MAAoB;AAC3B,cAAMC,IAASD,EAAQ,KAAK,uBAAuB;AACnD,QAAAC,EAAO,KAAK,uBAAuB,EAAE,GAAG,SAAS,CAACC,MAAU;AAC1D,UAAAA,EAAM,eAAA;AACN,gBAAMC,IAASD,EAAM,eACfE,IAAW,OAAOD,EAAO,QAAQ,YAAY,QAAQ;AAC3D,UAAAF,EAAO,KAAK,uBAAuB,EAAE,YAAY,QAAQ,GACzD,EAAEE,CAAM,EAAE,SAAS,QAAQ,GAC3BF,EAAO,KAAK,wBAAwB,EAAE,IAAIG,CAAQ;AAAA,QACpD,CAAC;AAAA,MACH;AAAA,MACA,OAAO,MAAML,EAAK,IAAI;AAAA,IAAA,GACrB;AAAA,MACD,SAAS,CAAC,+BAA+B;AAAA,MACzC,OAAO;AAAA,MACP,WAAW;AAAA,IAAA,CACZ,EACM,OAAO,EAAI;AAAA,EACpB,CAAC;AAED,MAAI,CAACH,EAAQ,QAAO;AAEpB,MAAIA,MAAW,UAAU;AACvB,UAAMS,IAAS,MAAMjB,GAAgBR,CAAK;AAC1C,WAAO;AAAA,MACL,MAAMyB,EAAO,SAAS;AAAA,MACtB,OAAOA,EAAO,SAAS;AAAA,MACvB,QAAQA,EAAO;AAAA,IAAA;AAAA,EAEnB;AAEA,QAAMzC,IAAQuB,EAAM,KAAK,CAACmB,MAAQA,EAAI,SAASV,CAAM;AACrD,SAAKhC,IAEE;AAAA,IACL,MAAMA,EAAM;AAAA,IACZ,OAAOA,EAAM;AAAA,IACb,QAAQ;AAAA,EAAA,IALS;AAOrB;AC1HO,MAAM2C,KAAyD;AAAA,EACpE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEaC,KAAwC;AAAA,EACnD,EAAE,MAAM,wBAAwB,UAAU,WAAW,MAAM,EAAA;AAAA,EAC3D,EAAE,MAAM,0BAA0B,UAAU,WAAW,MAAM,EAAA;AAAA,EAC7D,EAAE,MAAM,aAAa,UAAU,WAAW,MAAM,GAAA;AAAA,EAChD,EAAE,MAAM,QAAQ,UAAU,WAAW,MAAM,GAAA;AAAA,EAC3C,EAAE,MAAM,SAAS,UAAU,WAAW,MAAM,EAAA;AAAA,EAC5C,EAAE,MAAM,kBAAkB,UAAU,WAAW,MAAM,EAAA;AAAA,EACrD,EAAE,MAAM,sBAAsB,UAAU,WAAW,MAAM,GAAA;AAAA,EAEzD,EAAE,MAAM,WAAW,UAAU,iBAAiB,MAAM,GAAA;AAAA,EACpD,EAAE,MAAM,UAAU,UAAU,iBAAiB,MAAM,EAAA;AAAA,EACnD,EAAE,MAAM,aAAa,UAAU,iBAAiB,MAAM,GAAA;AAAA,EACtD,EAAE,MAAM,aAAa,UAAU,iBAAiB,MAAM,EAAA;AAAA,EACtD,EAAE,MAAM,gBAAgB,UAAU,iBAAiB,MAAM,EAAA;AAAA,EACzD,EAAE,MAAM,SAAS,UAAU,iBAAiB,MAAM,EAAA;AAAA,EAClD,EAAE,MAAM,gBAAgB,UAAU,iBAAiB,MAAM,GAAG,gBAAgB,aAAA;AAAA,EAC5E,EAAE,MAAM,WAAW,UAAU,iBAAiB,MAAM,EAAA;AAAA,EACpD,EAAE,MAAM,cAAc,UAAU,iBAAiB,MAAM,EAAA;AAAA,EAEvD,EAAE,MAAM,gBAAgB,UAAU,aAAa,MAAM,EAAA;AAAA,EACrD,EAAE,MAAM,aAAa,UAAU,aAAa,MAAM,EAAA;AAAA,EAClD,EAAE,MAAM,WAAW,UAAU,aAAa,MAAM,EAAA;AAAA,EAChD,EAAE,MAAM,UAAU,UAAU,aAAa,MAAM,EAAA;AAAA,EAC/C,EAAE,MAAM,aAAa,UAAU,aAAa,MAAM,EAAA;AAAA,EAClD,EAAE,MAAM,aAAa,UAAU,aAAa,MAAM,EAAA;AAAA,EAClD,EAAE,MAAM,uBAAuB,UAAU,aAAa,MAAM,EAAA;AAAA,EAC5D,EAAE,MAAM,eAAe,UAAU,aAAa,MAAM,EAAA;AAAA,EACpD,EAAE,MAAM,WAAW,UAAU,aAAa,MAAM,EAAA;AAAA,EAChD,EAAE,MAAM,WAAW,UAAU,aAAa,MAAM,EAAA;AAAA,EAChD,EAAE,MAAM,OAAO,UAAU,aAAa,MAAM,EAAA;AAAA,EAC5C,EAAE,MAAM,eAAe,UAAU,aAAa,MAAM,EAAA;AAAA,EACpD,EAAE,MAAM,WAAW,UAAU,aAAa,MAAM,EAAA;AAAA,EAChD,EAAE,MAAM,eAAe,UAAU,aAAa,MAAM,EAAA;AAAA,EACpD,EAAE,MAAM,oBAAoB,UAAU,aAAa,MAAM,EAAA;AAAA,EACzD,EAAE,MAAM,YAAY,UAAU,aAAa,MAAM,EAAA;AAAA,EACjD,EAAE,MAAM,YAAY,UAAU,aAAa,MAAM,EAAA;AAAA,EACjD,EAAE,MAAM,WAAW,UAAU,aAAa,MAAM,EAAA;AAAA,EAEhD,EAAE,MAAM,mBAAmB,UAAU,cAAc,MAAM,EAAA;AAAA,EACzD,EAAE,MAAM,uBAAuB,UAAU,cAAc,MAAM,EAAA;AAAA,EAC7D,EAAE,MAAM,wBAAwB,UAAU,cAAc,MAAM,EAAA;AAAA,EAC9D,EAAE,MAAM,4BAA4B,UAAU,cAAc,MAAM,EAAA;AAAA,EAClE,EAAE,MAAM,UAAU,UAAU,cAAc,MAAM,EAAA;AAAA,EAChD,EAAE,MAAM,WAAW,UAAU,cAAc,MAAM,EAAA;AAAA,EACjD,EAAE,MAAM,SAAS,UAAU,cAAc,MAAM,EAAA;AAAA,EAC/C,EAAE,MAAM,UAAU,UAAU,cAAc,MAAM,EAAA;AAAA,EAChD,EAAE,MAAM,SAAS,UAAU,cAAc,MAAM,EAAA;AAAA,EAE/C,EAAE,MAAM,mBAAmB,UAAU,aAAa,MAAM,EAAA;AAAA,EACxD,EAAE,MAAM,qBAAqB,UAAU,aAAa,MAAM,EAAA;AAAA,EAC1D,EAAE,MAAM,kBAAkB,UAAU,aAAa,MAAM,EAAA;AAAA,EACvD,EAAE,MAAM,cAAc,UAAU,aAAa,MAAM,EAAA;AAAA,EACnD,EAAE,MAAM,kBAAkB,UAAU,aAAa,MAAM,GAAA;AAAA,EACvD,EAAE,MAAM,kBAAkB,UAAU,aAAa,MAAM,EAAA;AAAA,EACvD,EAAE,MAAM,sBAAsB,UAAU,aAAa,MAAM,EAAA;AAAA,EAC3D,EAAE,MAAM,UAAU,UAAU,aAAa,MAAM,EAAA;AAAA,EAC/C,EAAE,MAAM,aAAa,UAAU,aAAa,MAAM,EAAA;AAAA,EAClD,EAAE,MAAM,kBAAkB,UAAU,aAAa,MAAM,EAAA;AACzD;AAEO,SAASC,EAAmBC,GAAsB;AACvD,SAAO,OAAOA,KAAQ,EAAE,EACrB,cACA,QAAQ,eAAe,EAAE,EACzB,KAAA;AACL;AAEO,SAASC,KAAgC;AAC9C,SAAO,IAAI,IAAIH,GAAsB,IAAI,CAACI,MAAUH,EAAmBG,EAAM,IAAI,CAAC,CAAC;AACrF;AClFO,MAAMC,IAAqB;AAElC,SAASC,GAASJ,GAAsB;AACtC,SAAO,OAAOA,CAAI,EACf,cACA,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEO,SAASK,GAAcL,GAAsB;AAClD,SAAO,wCAAwCI,GAASJ,CAAI,CAAC;AAC/D;AAEO,SAASM,GAAgBN,GAAkE;AAChG,QAAMhC,IAAM+B,EAAmBC,CAAI;AACnC,SAAOF,GAAsB,KAAK,CAACI,MAAUH,EAAmBG,EAAM,IAAI,MAAMlC,CAAG;AACrF;AAEO,SAASuC,GAAiBP,GAAcQ,GAA6B;AAC1E,QAAMC,IAAM,OAAOD,KAAc,EAAE,EAAE,KAAA;AACrC,SAAIC,KAAOA,MAAQ,2BAAiCA,IAChDH,GAAgBN,CAAI,IAAUK,GAAcL,CAAI,IAC7CG;AACT;ACjBA,eAAeO,GAAkBC,GAA2C;APR5E,MAAAxC;AOSE,QAAMyC,IAAUD,EAAQ,QAAQ,YAAY,WAAW,EAAE,OAAOA,EAAQ,MAAA,CAAO,IAAI,YAAY,WAAA;AAC/F,QAAM,YAAY,OAAO;AAAA,IACvB,OAAMxC,IAAA,KAAK,SAAL,gBAAAA,EAAW;AAAA,IACjB,SAAAyC;AAAA,IACA,SAASD,EAAQ;AAAA,EAAA,CAClB;AACH;AAEA,eAAsBE,GAAkBC,GAYtB;AP7BlB,MAAA3C;AO8BE,QAAM4C,IAAU;AAAA,IACd,GAAGD;AAAA,IACH,UAAUA,EAAK,cAAY3C,IAAA2C,EAAK,UAAL,gBAAA3C,EAAY,QAAO;AAAA,IAC9C,UAAU2C,EAAK,YAAYX;AAAA,EAAA,GAEvBa,IAAU,MAAM,eAAe,WAAWzE,CAAS,uCAAuCwE,CAAO;AACvG,QAAML,GAAkB,EAAE,OAAOI,EAAK,OAAO,SAAAE,GAAS;AACxD;AAEA,eAAsBC,GAAeH,GA2BnB;APlElB,MAAA3C;AOmEE,QAAM4C,IAAU;AAAA,IACd,GAAGD;AAAA,IACH,UAAUA,EAAK,cAAY3C,IAAA2C,EAAK,UAAL,gBAAA3C,EAAY,QAAO;AAAA,IAC9C,WAAW2C,EAAK,aAAa;AAAA,IAC7B,UAAUA,EAAK,YAAYX;AAAA,IAC3B,WAAWW,EAAK,aAAa;AAAA,EAAA,GAEzBE,IAAU,MAAM,eAAe,WAAWzE,CAAS,mCAAmCwE,CAAO;AACnG,QAAML,GAAkB,EAAE,OAAOI,EAAK,OAAO,SAAAE,GAAS;AACxD;ACrEA,SAASE,EAAIpE,GAAgBkC,IAAW,GAAW;AACjD,QAAMmC,IAAI,OAAOrE,CAAK;AACtB,SAAO,OAAO,SAASqE,CAAC,IAAIA,IAAInC;AAClC;AAEA,SAASoC,KAAmC;ARZ5C,MAAAjD,GAAAC;AQaE,QAAMiD,IAAU,MAAM,OAAKlD,IAAA,KAAK,SAAL,gBAAAA,EAAW,YAAW,EAAE;AACnD,SAAKkD,EAAQ,WACLjD,IAAAiD,EAAQ,CAAC,MAAT,gBAAAjD,EAAoB,UAAS,OADT;AAE9B;AAEA,eAAsBkD,GAA0BpD,GAA4B;ARlB5E,MAAAC;AQmBE,QAAMe,IAAS,MAAMR,GAAgBR,CAAK,GACpC0C,IAAU1C,IAAQ,YAAY,WAAW,EAAE,OAAAA,EAAA,CAAO,IAAI,YAAY,WAAA,GAClE8C,IAAU;AAAA;AAAA;AAAA,kCAGgB9B,EAAO,IAAI;AAAA,sCACPA,EAAO,SAAS,KAAK;AAAA;AAAA;AAIzD,QAAM,YAAY,OAAO;AAAA,IACvB,OAAMf,IAAA,KAAK,SAAL,gBAAAA,EAAW;AAAA,IACjB,SAAAyC;AAAA,IACA,SAAAI;AAAA,EAAA,CACD;AACH;AAEA,eAAsBO,GAAkBrD,GAAYsD,GAAmB3F,GAA+B;AACpG,QAAMqD,IAAS,MAAMtD,GAAeC,CAAM,GACpC4F,IAAYvD,EAAM,MAAM;AAAA,IAC5B,CAACwD,MAAcA,EAAK,SAAS,WAAWA,EAAK,KAAK,YAAA,MAAkB,OAAOF,CAAS,EAAE,YAAA;AAAA,EAAY;AAGpG,QAAMX,GAAkB;AAAA,IACtB,OAAA3C;AAAA,IACA,WAAWA,EAAM;AAAA,IACjB,UAAUA,EAAM;AAAA,IAChB,WAAAsD;AAAA,IACA,UAAUC,KAAA,gBAAAA,EAAW;AAAA,IACrB,MAAMvC,EAAO;AAAA,IACb,QAAQA,EAAO;AAAA,IACf,cAAc5C,GAAa4C,EAAO,OAAO;AAAA,IACzC,WAAWA,EAAO;AAAA,IAClB,WAAWA,EAAO;AAAA,IAClB,UAAUA,EAAO;AAAA,EAAA,CAClB;AACH;AAEA,SAASyC,GAAmBzD,GAAY0D,GAA6D;AACnG,QAAMC,IAAUD,EAAO,OAAO,eACxBE,IAAOD,IAAU3D,EAAM,MAAM,IAAI2D,CAAO,IAAI;AAClD,OAAIC,KAAA,gBAAAA,EAAM,UAAS;AACjB,WAAO,EAAE,MAAMA,EAAK,MAAM,QAAQZ,EAAIY,EAAK,OAAO,KAAK,GAAG,KAAKA,EAAK,IAAA;AAGtE,QAAMC,IAAkB,OAAOH,EAAO,OAAO,eAAe,EAAE,EAAE,KAAA;AAChE,MAAIG,GAAiB;AACnB,UAAMC,IAAS9D,EAAM,MAAM;AAAA,MACzB,CAACwD,MAAcA,EAAK,SAAS,WAAWA,EAAK,KAAK,kBAAkBK,EAAgB,YAAA;AAAA,IAAY;AAElG,QAAIC;AACF,aAAO,EAAE,MAAMA,EAAO,MAAM,QAAQd,EAAIc,EAAO,OAAO,KAAK,GAAG,KAAKA,EAAO,IAAA;AAAA,EAE9E;AAEA,SAAO;AAAA,IACL,MAAMD,KAAmB;AAAA,IACzB,QAAQ;AAAA,EAAA;AAEZ;AAYA,SAASE,GAAmBnF,GAAuB;AACjD,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAMA,CAAK,CAAC,CAAC;AACpD;AAEA,eAAeoF,GAAsBC,GAAeP,GAAaQ,GAAmE;AR9FpI,MAAAjE;AQgGE,QAAMkE,IADa,SAAOlE,IAAAyD,EAAO,WAAP,gBAAAzD,EAAe,eAAc,QAAQ,MAC/B,UAC1BmE,IAAsB,QACtBC,IAAgB,QAAQ,MAAM,WAAW,QAAOJ,KAAA,gBAAAA,EAAU,SAAQ,UAAU,CAAC,GAC7EK,IAAiB,QAAQ,MAAM,WAAW,QAAOZ,KAAA,gBAAAA,EAAQ,SAAQ,QAAQ,CAAC,GAC1Ea,IAAe,QAAQ,MAAM,WAAW,QAAON,KAAA,gBAAAA,EAAU,QAAO,2BAA2B,CAAC,GAC5FO,IAAgB,QAAQ,MAAM,WAAW,QAAOd,KAAA,gBAAAA,EAAQ,QAAO,qBAAqB,CAAC,GAErFZ,IAAU;AAAA;AAAA;AAAA,oDAGkCyB,CAAY,UAAUF,CAAa;AAAA,oDACnCG,CAAa,UAAUF,CAAc;AAAA;AAAA,gBAEzEA,CAAc;AAAA,eACfD,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA,uDAK2BH,CAAe;AAAA;AAAA;AAAA;AAAA,iCAIrCC,IAAW,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCzD,SAAO,IAAI,QAAQ,CAAClD,MAAY;AAC9B,QAAIC,IAAU;AACd,UAAMC,IAAO,CAACvC,MAA2C;AACvD,MAAIsC,MACJA,IAAU,IACVD,EAAQrC,CAAK;AAAA,IACf;AAEA,QAAI,OAAO;AAAA,MACT,OAAO,GAAG8E,EAAO,IAAI;AAAA,MACrB,SAAAZ;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,UACJ,OAAO;AAAA,UACP,UAAU,CAAC1B,MAAoB;ARvKzC,gBAAAnB,IAAAC,IAAAC,IAAAsE,IAAAC,IAAAC,IAAAC;AQwKY,kBAAMC,IAAOzD,EAAQ,CAAC,GAChB0D,IAAQ,CAAChD,OAAkB+C,KAAA,gBAAAA,EAAM,cAAc,UAAU/C,EAAI,OAC7DiD,IAAa,SAAO9E,KAAA6E,EAAM,SAAS,MAAf,gBAAA7E,GAAkB,UAASmE,CAAU,GACzDY,IAAoBD,MAAe,aAAaA,MAAe,aAAaA,MAAe,SAC7FA,IACAX,GACEa,IAAgBd,IAAY,EAAE,SAAS,MAAM,SAAS,KAAK,MAAM,IAAca,CAAO,IAAI,GAC1FE,IAAWlC,GAAI9C,KAAA4E,EAAM,UAAU,MAAhB,gBAAA5E,GAAmB,OAAO,CAAC,GAC1CiF,IAAcnC,GAAI7C,KAAA2E,EAAM,aAAa,MAAnB,gBAAA3E,GAAsB,OAAO,CAAC,GAChDiF,IAAWpC,GAAIyB,KAAAK,EAAM,UAAU,MAAhB,gBAAAL,GAAmB,OAAO,CAAC,GAC1CY,IAAiBrC,GAAI0B,KAAAI,EAAM,gBAAgB,MAAtB,gBAAAJ,GAAyB,OAAO,CAAC,GACtDY,IAAYtC,GAAI2B,KAAAG,EAAM,WAAW,MAAjB,gBAAAH,GAAoB,OAAO,CAAC,GAC5CY,IAAc,SAAOX,KAAAE,EAAM,aAAa,MAAnB,gBAAAF,GAAsB,UAAS,EAAE,EAAE,KAAA,GAExDY,IAAoBN,IAAWC,IAAcC,IAAWC,IAAiBC,GACzEG,IAAevB,IAAkBsB,GACjCE,IAAgB,KAAK,MAAMD,IAAeR,CAAa,GACvDU,IAAc5B,GAAmB2B,CAAa,GAE9CE,IAAkB,CAAC,QAAQ1B,CAAe,EAAE;AAOlD,gBANIgB,KAAUU,EAAM,KAAK,SAASV,KAAY,IAAI,MAAM,EAAE,GAAGA,CAAQ,EAAE,GACnEC,KAAaS,EAAM,KAAK,YAAYT,KAAe,IAAI,MAAM,EAAE,GAAGA,CAAW,EAAE,GAC/EC,KAAUQ,EAAM,KAAK,SAASR,KAAY,IAAI,MAAM,EAAE,GAAGA,CAAQ,EAAE,GACnEC,KAAgBO,EAAM,KAAK,eAAeP,KAAkB,IAAI,MAAM,EAAE,GAAGA,CAAc,EAAE,GAC3FC,KAAWM,EAAM,KAAK,GAAGL,KAAe,QAAQ,IAAID,KAAa,IAAI,MAAM,EAAE,GAAGA,CAAS,EAAE,GAC/FM,EAAM,KAAK,WAAWH,CAAY,EAAE,GAChCtB,GAAU;AACZ,oBAAM0B,KAAWb,MAAY,YAAY,YAAYA,MAAY,YAAY,SAAS;AACtF,cAAAY,EAAM,KAAK,OAAOC,EAAQ,KAAKZ,CAAa,EAAE;AAAA,YAChD;AACA,YAAAW,EAAM,KAAK,SAASD,CAAW,EAAE,GAEjCxE,EAAK;AAAA,cACH,aAAAwE;AAAA,cACA,SAASC,EAAM,KAAK,KAAK;AAAA,cACzB,SAAAZ;AAAA,cACA,eAAAC;AAAA,cACA,mBAAAO;AAAA,YAAA,CACD;AAAA,UACH;AAAA,QAAA;AAAA,QAEF,QAAQ;AAAA,UACN,OAAO;AAAA,UACP,UAAU,MAAMrE,EAAK,IAAI;AAAA,QAAA;AAAA,MAC3B;AAAA,MAEF,SAAS;AAAA,MACT,OAAO,MAAMA,EAAK,IAAI;AAAA,IAAA,GACrB;AAAA,MACD,SAAS,CAAC,yBAAyB;AAAA,MACnC,OAAO;AAAA,MACP,WAAW;AAAA,IAAA,CACZ,EAAE,OAAO,EAAI;AAAA,EAChB,CAAC;AACH;AAEA,eAAe2E,GAAoB9F,GAAY0D,GAK5C;ARrOH,MAAAzD,GAAAC,GAAAC,GAAAsE,GAAAC,GAAAC;AQsOE,QAAMoB,IAAO,KAAK,IAAI,GAAG/C,EAAIU,EAAO,OAAO,mBAAmB,CAAC;AAC/D,MAAIqC,KAAQ;AACV,WAAO,EAAE,aAAa,QAAQ,WAAW,GAAG,MAAM,GAAG,cAAc,GAAA;AAKrE,MAFe,OAAOrC,EAAO,OAAO,eAAe,OAAO,MAE3C,aAAa;AAC1B,UAAMsC,IAAS,OAAOtC,EAAO,OAAO,eAAe,EAAE,GAC/CuC,IAAOD,IAAShG,EAAM,MAAM,IAAIgG,CAAM,IAAI;AAEhD,QAAI,CAACC,KAAQA,EAAK,SAAS,UAAU,CAACA,EAAK,OAAO;AAChD,cAAAhG,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK,6EAChB,EAAE,aAAa,cAAc,WAAW,GAAG,MAAA8F,GAAM,cAAc,GAAA;AAGxE,UAAMG,IAAUlD,GAAI9C,IAAA+F,EAAK,OAAO,WAAZ,gBAAA/F,EAAoB,KAAK;AAC7C,QAAIgG,IAAUH;AACZ,cAAA5F,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK,GAAG8F,EAAK,IAAI,kCAC5B,EAAE,aAAaA,EAAK,MAAM,WAAWC,GAAS,MAAAH,GAAM,cAAc,GAAA;AAG3E,UAAMI,IAAOD,IAAUH;AACvB,iBAAM/F,EAAM,wBAAwB,QAAQ,CAAC,EAAE,KAAKiG,EAAK,IAAI,uBAAuBE,EAAAA,CAAM,CAAC,GACpF,EAAE,aAAaF,EAAK,MAAM,WAAWE,GAAM,MAAAJ,GAAM,cAAc,GAAA;AAAA,EACxE;AAEA,QAAMG,IAAUlD,GAAI0B,KAAAD,IAAAzE,EAAM,OAAO,cAAb,gBAAAyE,EAAwB,WAAxB,gBAAAC,EAAgC,KAAK;AACzD,MAAIwB,IAAUH;AACZ,YAAApB,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK,GAAG3E,EAAM,IAAI,wCAC7B,EAAE,aAAa,gBAAgB,WAAWkG,GAAS,MAAAH,GAAM,cAAc,GAAA;AAGhF,QAAMI,IAAOD,IAAUH;AACvB,eAAM/F,EAAM,OAAO,EAAE,iCAAiCmG,GAAM,GACrD,EAAE,aAAa,gBAAgB,WAAWA,GAAM,MAAAJ,GAAM,cAAc,GAAA;AAC7E;AAEA,SAASK,GAAuB5C,GAAW9E,GAA+B;AR5Q1E,MAAAuB,GAAAC;AQ8QE,MADIsD,EAAK,SAAS,WAAW,CAACA,EAAK,OAAO,YAAYA,EAAK,OAAO,UAC9D,GAACvD,IAAAuD,EAAK,OAAO,aAAZ,QAAAvD,EAAuBvB,IAAO,QAAO;AAE1C,QAAM2H,IAAWrD,GAAI9C,IAAAsD,EAAK,OAAO,gBAAZ,gBAAAtD,EAA0BxB,EAAK;AACpD,SAAI2H,IAAW,IAAUA,IAClBrD,EAAIQ,EAAK,OAAO,KAAK;AAC9B;AAEA,SAAS8C,GAAwBC,GAAkB7H,GAA+B;ARrRlF,MAAAuB,GAAAC;AQsRE,QAAMsG,IAAWxD,GAAI9C,KAAAD,IAAAsG,EAAY,OAAO,iBAAnB,gBAAAtG,EAAkCvB,OAAlC,gBAAAwB,EAAyC,KAAK,GAC7DuG,IAAoBF,EAAY,MACnC,OAAO,CAAC/C,MAAcA,EAAK,SAAS,OAAO,EAC3C,OAAO,CAACkD,GAAalD,MAAckD,IAAMN,GAAuB5C,GAAM9E,CAAI,GAAG,CAAC;AAEjF,SAAO8H,IAAWC;AACpB;AAEA,SAASE,GAAsBJ,GAAkB7H,GAAuBkI,GAAuBC,GAAqBC,GAAmB;AACrI,QAAMZ,IAAU,QAAQ,MAAM,UAAUK,EAAY,OAAO,cAAc,EAAE;AAC3E,SAAAL,EAAQ,gBAAgBA,EAAQ,iBAAiB,EAAE,MAAM,IAAO,MAAM,IAAO,MAAM,IAAO,MAAM,GAAA,GAE5FU,KAAiB,OACflI,MAAS,UAAUA,MAAS,aAC9BwH,EAAQ,cAAc,IACtBA,EAAQ,QAAQ,KAGdxH,MAAS,cACXwH,EAAQ,QAAQ,IAChBA,EAAQ,cAAc,OAAO,IAC7BA,EAAQ,cAAc,OAAO,MAG3BxH,MAAS,UAAUA,MAAS,YAC9BwH,EAAQ,cAAcxH,CAAI,IAAI,KAG5BF,GAAc,SAASE,CAAI,MAC7BwH,EAAQ,cAAcxH,CAAI,IAAI,IAC9BwH,EAAQ,QAAQ,MAIhBY,KAAa,MACfZ,EAAQ,QAAQ,MAGbxH,MAAS,UAAUA,MAAS,WAAWA,MAAS,cAAckI,KAAiB,CAACC,MACnFX,EAAQ,QAAQ,KAGdxH,MAAS,UAAUkI,KAAiB,CAACC,MACvCX,EAAQ,OAAO,IACfA,EAAQ,cAAc,KAGjBA;AACT;AAEA,eAAea,GAAsBR,GAAkBS,GAAgC;AACrF,QAAMC,IAAWV,EAAoB;AACrC,MAAI,OAAOU,KAAY;AAEvB,QAAI;AACF,YAAMA,EAAQ,KAAKV,GAAa,SAAS,EAAE,QAAQ,CAAC,CAACS,EAAW,OAAO,GACvE,MAAMC,EAAQ,KAAKV,GAAa,eAAe,EAAE,QAAQ,CAAC,CAACS,EAAW,aAAa,GACnF,MAAMC,EAAQ,KAAKV,GAAa,QAAQ,EAAE,QAAQ,CAAC,CAACS,EAAW,MAAM;AAAA,IACvE,QAAe;AAAA,IAEf;AACF;AAEA,eAAeE,GAAoBX,GAAkB7H,GAAuByI,GAKzE;AR1VH,MAAAlH,GAAAC,GAAAC,GAAAsE;AQ2VE,QAAMjD,KAAWvB,IAAAsG,EAAY,OAAO,iBAAnB,gBAAAtG,EAAkCvB,IAC7C0I,IAAapE,GAAI9C,IAAAsB,KAAA,gBAAAA,EAAU,OAAV,gBAAAtB,EAAc,KAAK,GACpCmH,IAAS,KAAK,IAAI,GAAGrE,GAAI7C,IAAAqB,KAAA,gBAAAA,EAAU,OAAV,gBAAArB,EAAc,KAAK,CAAC,CAAC,GAC9CmH,IAAQhB,GAAwBC,GAAa7H,CAAI,GACjD6I,IAAc,KAAK,IAAI,GAAGJ,IAAYG,CAAK,GAE3CE,IAAeJ,IAAaG,GAC5BE,IAAUhJ,GAAOC,CAAI,IAAI,KAAK,IAAI8I,GAAc,CAACH,CAAM,IAAIG,GAG3DE,IADiB1E,GAAIyB,IAAA8B,EAAY,OAAO,cAAnB,gBAAA9B,EAA8B,KAAK,IACzB8C,GAE/BP,IAAaL,GAAsBJ,GAAa7H,GAAM+I,GAASJ,GAAQK,CAAW,GAElFC,IAAmC;AAAA,IACvC,CAAC,uBAAuBjJ,CAAI,WAAW,GAAG+I;AAAA,IAC1C,0BAA0BC;AAAA,IAC1B,qBAAqBV;AAAA,EAAA;AAGvB,eAAMT,EAAY,OAAOoB,CAAO,GAChC,MAAMZ,GAAsBR,GAAaS,CAAU,GAE5C;AAAA,IACL,OAAAM;AAAA,IACA,aAAAC;AAAA,IACA,eAAeE;AAAA,IACf,gBAAgBC;AAAA,EAAA;AAEpB;AAEA,eAAsBE,GAAkB3D,GAAeP,GAA4B;AR1XnF,MAAAzD;AQ2XE,QAAMsG,IAAcrD,GAAA,GACd2E,IAAY,EAAQtB,GACpBuB,KAAavB,KAAA,gBAAAA,EAAa,SAAQ,aAElCwB,IAActE,GAAmBQ,GAAUP,CAAM,GACjDsE,IAAiB,MAAMhE,GAAsBC,GAAUP,GAAQqE,EAAY,MAAM;AACvF,MAAI,CAACC,EAAgB;AAErB,QAAMC,IAAS,MAAMnC,GAAoB7B,GAAUP,CAAM;AACzD,MAAIuE,EAAO,aAAc;AAEzB,QAAMC,IAAS,MAAMxK,GAAesK,EAAe,WAAW;AAE9D,MAAI,CAACE,EAAO,WAAW;AACrB,UAAMC,IAAqB5B,IAAcvD,GAAI/C,IAAAsG,EAAY,OAAO,cAAnB,gBAAAtG,EAA8B,OAAO,CAAC,IAAI;AACvF,UAAM8C,GAAe;AAAA,MACnB,OAAOkB;AAAA,MACP,WAAWA,EAAS;AAAA,MACpB,UAAUA,EAAS;AAAA,MACnB,YAAA6D;AAAA,MACA,WAAAD;AAAA,MACA,YAAYnE,EAAO;AAAA,MACnB,WAAWA,EAAO;AAAA,MAClB,WAAWqE,EAAY;AAAA,MACvB,UAAUA,EAAY;AAAA,MACtB,YAAYG,EAAO;AAAA,MACnB,cAAcA,EAAO;AAAA,MACrB,oBAAoB9J,GAAa8J,EAAO,OAAO;AAAA,MAC/C,WAAW;AAAA,MACX,WAAWA,EAAO;AAAA,MAClB,UAAUA,EAAO;AAAA,MACjB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,OAAO;AAAA,MACP,aAAa;AAAA,MACb,qBAAqB;AAAA,MACrB,oBAAAC;AAAA,MACA,mBAAmBF,EAAO;AAAA,MAC1B,YAAYA,EAAO;AAAA,MACnB,iBAAiBA,EAAO;AAAA,MACxB,OAAO,2CAA2CD,EAAe,OAAO;AAAA,IAAA,CACzE;AACD;AAAA,EACF;AAEA,QAAMI,IAAe,MAAM1H,GAAwB6F,KAAetC,CAAQ;AAC1E,MAAI,CAACmE,EAAc;AAEnB,QAAMC,IAAgB,OAAO3E,EAAO,OAAO,iBAAiB,GAAG,EAAE,UAAU,KACrE4E,IAAa,MAAM9K,GAAqB6K,CAAa,GACrDlB,IAAY,KAAK,IAAI,GAAGnE,EAAIsF,EAAW,KAAK,CAAC,GAE7CC,IAAchC,IAChB,MAAMW,GAAoBX,GAAa6B,EAAa,MAAMjB,CAAS,IACnE;AAAA,IACA,OAAO;AAAA,IACP,aAAaA;AAAA,IACb,eAAe;AAAA,IACf,gBAAgB;AAAA,EAAA;AAGpB,QAAMpE,GAAe;AAAA,IACnB,OAAOkB;AAAA,IACP,WAAWA,EAAS;AAAA,IACpB,UAAUA,EAAS;AAAA,IACnB,YAAA6D;AAAA,IACA,WAAAD;AAAA,IACA,YAAYnE,EAAO;AAAA,IACnB,WAAWA,EAAO;AAAA,IAClB,WAAWqE,EAAY;AAAA,IACvB,UAAUA,EAAY;AAAA,IACtB,YAAYG,EAAO;AAAA,IACnB,cAAcA,EAAO;AAAA,IACrB,oBAAoB9J,GAAa8J,EAAO,OAAO;AAAA,IAC/C,WAAWA,EAAO;AAAA,IAClB,WAAWA,EAAO;AAAA,IAClB,UAAUA,EAAO;AAAA,IACjB,kBAAkBE,EAAa;AAAA,IAC/B,iBAAiBA,EAAa;AAAA,IAC9B,WAAAjB;AAAA,IACA,OAAOoB,EAAY;AAAA,IACnB,aAAaA,EAAY;AAAA,IACzB,qBAAqBA,EAAY;AAAA,IACjC,oBAAoBA,EAAY;AAAA,IAChC,mBAAmBN,EAAO;AAAA,IAC1B,YAAYA,EAAO;AAAA,IACnB,iBAAiBA,EAAO;AAAA,IACxB,OAAO1B,IACH,mFAAmFyB,EAAe,OAAO,KACzG,iEAAiEA,EAAe,OAAO;AAAA,EAAA,CAC5F;AACH;AAEO,SAASQ,GAA0BxI,GAAkB;ARzd5D,MAAAC,GAAAC,GAAAC,GAAAsE,GAAAC,GAAAC,GAAAC,GAAA6D;AQ0dE,MAAIzI,EAAM,SAAS,cAAcA,EAAM,SAAS,WAAY;AAG5D,QAAM0I,IAAM1F,GAAI9C,KAAAD,IAAAD,EAAM,WAAN,gBAAAC,EAAc,oBAAd,gBAAAC,EAA+B,KAAK,EAAE,GAChDyI,IAAM3F,GAAIyB,KAAAtE,IAAAH,EAAM,WAAN,gBAAAG,EAAc,oBAAd,gBAAAsE,EAA+B,KAAK,EAAE,GAChDmE,IAAc5F,GAAI0B,IAAA1E,EAAM,OAAO,cAAb,gBAAA0E,EAAwB,KAAK,CAAC,GAChDmE,IAAgB7F,GAAI2B,IAAA3E,EAAM,OAAO,cAAb,gBAAA2E,EAAwB,OAAO,CAAC,GACpDmE,IAAa,KAAK,IAAI,GAAG,KAAK,MAAMJ,IAAMC,CAAG,CAAC;AAEpD,EAAA3I,EAAM,OAAO,YAAYA,EAAM,OAAO,aAAa,EAAE,OAAO8I,GAAY,KAAKA,EAAA,GAC7E9I,EAAM,OAAO,UAAU,MAAM8I;AAC7B,QAAMC,IAAcH,IAAc,GAC5BI,IAAUD,KAAeF,KAAiBD,GAC1CK,IAAmBL,KAAe,KAAKC,KAAiB,GACxDK,IAAkBH,IAAc,KAAK,IAAI,GAAGH,IAAcC,CAAa,IAAI,GAC3EM,IAAmB,CAACJ,KAAeC,KAAWC,IAChDH,IACA,KAAK,IAAI,GAAGA,IAAaI,CAAe;AAE5C,EAAAlJ,EAAM,OAAO,UAAU,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAGmJ,CAAe,GAAGL,CAAU;AAChF,QAAMM,IAAgBpG,EAAIhD,EAAM,OAAO,UAAU,OAAO8I,CAAU,KAAKA;AAEvE,EAAA9I,EAAM,OAAO,eAAeA,EAAM,OAAO,gBAAgB,CAAA,GACzDA,EAAM,OAAO,oBAAoBA,EAAM,OAAO,qBAAqB;AACnE,QAAMW,IAASZ,GAA0BC,CAAK;AAE9C,aAAWhB,KAAS2B,EAAO,SAAS;AAClC,UAAMjC,IAAOM,EAAM,MACb0C,IAAM1B,EAAM,OAAO,aAAatB,CAAI,KAAK;AAAA,MAC7C,OAAOA;AAAA,MACP,IAAI,EAAE,OAAO,GAAG,KAAK,EAAA;AAAA,MACrB,OAAO;AAAA,IAAA;AAET,IAAAgD,EAAI,QAAQ1C,EAAM;AAClB,UAAMqK,IAAW,KAAK,IAAI,MAAMrG,EAAKhE,EAAc,UAAU,GAAG,CAAC,GAC3DsK,IAAM,KAAK,IAAI,GAAG,KAAK,KAAKR,IAAaO,CAAQ,CAAC,GAElDE,IAAcvG,GAAI4B,IAAAlD,EAAI,OAAJ,gBAAAkD,EAAQ,KAAK,CAAC,GAChC4E,IAAgBxG,GAAIyF,IAAA/G,EAAI,OAAJ,gBAAA+G,EAAQ,OAAOc,CAAW,GAC9CE,IAAgBF,KAAe,KAAKC,KAAiB,GACrDE,IAAuBN,KAAiBI,KAAiB,KAAKF,IAAM;AAE1E,IAAA5H,EAAI,GAAG,MAAM4H,GACb5H,EAAI,GAAG,QAAS+H,KAAiBC,IAAwBJ,IAAM,KAAK,IAAIE,GAAeF,CAAG,GAC1FtJ,EAAM,OAAO,aAAatB,CAAI,IAAIgD;AAAA,EACpC;AACF;ACxbO,MAAMiI,KAA4B,GAEnCC,IAAQ;AAAA,EACZ,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,OAAO;AAAA,EACP,aAAa;AAAA,EACb,kBAAkB;AACpB;AAEA,SAAS1H,GAASJ,GAAsB;AACtC,SAAO,OAAOA,CAAI,EACf,cACA,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS+H,GAAgB/H,GAAsB;AAC7C,SAAO,0CAA0CI,GAASJ,CAAI,CAAC;AACjE;AAEA,SAASgI,GAAehI,GAAsB;AAC5C,SAAO,yCAAyCI,GAASJ,CAAI,CAAC;AAChE;AAEA,SAASiI,GAAcjI,GAAsB;AAC3C,SAAO,wCAAwCI,GAASJ,CAAI,CAAC;AAC/D;AAEA,SAASkI,GAAalI,GAAsB;AAC1C,SAAO,uCAAuCI,GAASJ,CAAI,CAAC;AAC9D;AAEA,SAASmI,GAAgBnI,GAAsB;AAC7C,SAAO,0CAA0CI,GAASJ,CAAI,CAAC;AACjE;AAEA,MAAMoI,KAAc;AAAA,EAClB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR,GAEMC,KAAgB;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR,GAEMC,KAAe;AAAA,EACnB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR,GAEMC,KAAc;AAAA,EAClB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR,GAEMC,KAAc;AAAA,EAClB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR,GAEaC,KAAyC;AAAA,EACpD;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAA;AAAA,IAClF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAA;AAAA,IAClF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,EAAA;AAAA,IACpF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAA;AAAA,IACrF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAA;AAAA,IACnF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAA;AAAA,IACpF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAA;AAAA,IACrF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,EAAA;AAAA,IAClF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,EAAA;AAAA,IACnF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,EAAA;AAAA,IACnF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,EAAA;AAAA,IACrF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,GAAA;AAAA,IACpF,OAAO;AAAA,EAAA;AAEX,GAEaC,KAAuC;AAAA,EAClD;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO,EAAE,OAAO,SAAS,QAAQ,KAAK,MAAM,IAAA;AAAA,IAC5C,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO,EAAE,OAAO,SAAS,QAAQ,KAAK,MAAM,IAAA;AAAA,IAC5C,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO,EAAE,OAAO,SAAS,QAAQ,KAAK,MAAM,IAAA;AAAA,IAC5C,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO,EAAE,OAAO,SAAS,QAAQ,UAAU,MAAM,OAAA;AAAA,IACjD,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO,EAAE,OAAO,SAAS,QAAQ,UAAU,MAAM,OAAA;AAAA,IACjD,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO,EAAE,OAAO,SAAS,QAAQ,QAAQ,MAAM,UAAA;AAAA,IAC/C,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO,EAAE,OAAO,SAAS,QAAQ,UAAU,MAAM,OAAA;AAAA,IACjD,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO,EAAE,OAAO,SAAS,QAAQ,UAAU,MAAM,OAAA;AAAA,IACjD,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO,EAAE,OAAO,SAAS,QAAQ,QAAQ,MAAM,UAAA;AAAA,IAC/C,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,OAAO,EAAE,OAAO,SAAS,QAAQ,QAAQ,MAAM,UAAA;AAAA,IAC/C,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,OAAO;AAAA,EAAA;AAEX,GAEaC,KAAqC;AAAA,EAChD,EAAE,MAAM,cAAc,UAAU,IAAM,QAAQ,GAAG,OAAO,GAAG,UAAUN,IAAe,OAAO,0BAAA;AAAA,EAC3F,EAAE,MAAM,oBAAoB,UAAU,IAAM,QAAQ,GAAG,OAAO,GAAG,UAAUA,IAAe,OAAO,0BAAA;AAAA,EACjG,EAAE,MAAM,kBAAkB,UAAU,IAAM,QAAQ,GAAG,OAAO,GAAG,UAAU,EAAE,GAAGA,IAAe,MAAM,IAAM,MAAM,GAAA,GAAQ,OAAO,sBAAA;AAAA,EAC9H,EAAE,MAAM,gBAAgB,UAAU,IAAM,QAAQ,GAAG,OAAO,GAAG,UAAU,EAAE,GAAGA,IAAe,MAAM,IAAM,MAAM,GAAA,GAAQ,OAAO,+BAAA;AAAA,EAC5H,EAAE,MAAM,cAAc,UAAU,IAAM,QAAQ,GAAG,OAAO,GAAG,UAAUG,IAAa,OAAO,oBAAA;AAAA,EACzF,EAAE,MAAM,eAAe,UAAU,IAAM,QAAQ,GAAG,OAAO,GAAG,UAAUD,IAAa,OAAO,gCAAA;AAAA,EAC1F,EAAE,MAAM,iBAAiB,UAAU,IAAM,QAAQ,KAAK,OAAO,GAAG,UAAUD,IAAc,OAAO,sBAAA;AAAA,EAC/F,EAAE,MAAM,oBAAoB,UAAU,IAAM,QAAQ,IAAI,OAAO,GAAG,UAAUF,IAAa,OAAO,0BAAA;AAAA,EAChG,EAAE,MAAM,eAAe,UAAU,IAAM,QAAQ,IAAI,OAAO,GAAG,UAAUA,IAAa,OAAO,mCAAA;AAC7F,GAEaQ,KAAmC;AAAA,EAC9C;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,QAAQ,EAAE,OAAO,IAAI,KAAK,GAAA;AAAA,IAC1B,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,QAAQ,EAAE,OAAO,IAAI,KAAK,GAAA;AAAA,IAC1B,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,QAAQ,EAAE,OAAO,KAAK,KAAK,IAAA;AAAA,IAC3B,OAAO;AAAA,EAAA;AAAA,EAET,EAAE,MAAM,sBAAsB,QAAQ,GAAG,MAAM,KAAK,WAAW,GAAG,kBAAkB,8BAA8B,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,+BAAA;AAAA,EAC3K,EAAE,MAAM,kBAAkB,QAAQ,KAAK,MAAM,KAAK,WAAW,GAAG,kBAAkB,2BAA2B,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,wCAAA;AAAA,EACtK,EAAE,MAAM,wBAAwB,QAAQ,KAAK,MAAM,KAAK,WAAW,GAAG,kBAAkB,+BAA+B,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,mCAAA;AAAA,EAChL,EAAE,MAAM,sBAAsB,QAAQ,IAAI,MAAM,MAAM,WAAW,GAAG,kBAAkB,6BAA6B,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,8BAAA;AAAA,EAC5K,EAAE,MAAM,UAAU,QAAQ,GAAG,MAAM,KAAK,WAAW,GAAG,kBAAkB,QAAQ,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,uCAAA;AAAA,EACzI,EAAE,MAAM,cAAc,QAAQ,GAAG,MAAM,KAAK,WAAW,GAAG,kBAAkB,wBAAwB,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,mCAAA;AAAA,EAC7J,EAAE,MAAM,kBAAkB,QAAQ,GAAG,MAAM,KAAK,WAAW,GAAG,kBAAkB,wBAAwB,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,0CAAA;AAAA,EACjK,EAAE,MAAM,qBAAqB,QAAQ,KAAK,MAAM,KAAK,WAAW,GAAG,kBAAkB,sBAAsB,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,qCAAA;AAAA,EACpK,EAAE,MAAM,kBAAkB,QAAQ,KAAK,MAAM,KAAK,WAAW,GAAG,kBAAkB,sBAAsB,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,sCAAA;AAAA,EACjK,EAAE,MAAM,cAAc,QAAQ,IAAI,MAAM,MAAM,WAAW,GAAG,kBAAkB,6BAA6B,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,iCAAA;AAAA,EACpK,EAAE,MAAM,yBAAyB,QAAQ,IAAI,MAAM,MAAM,WAAW,GAAG,kBAAkB,sBAAsB,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,qCAAA;AAAA,EACxK,EAAE,MAAM,iBAAiB,QAAQ,GAAG,MAAM,KAAK,WAAW,GAAG,kBAAkB,QAAQ,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,yCAAA;AAAA,EAChJ,EAAE,MAAM,YAAY,QAAQ,GAAG,MAAM,MAAM,WAAW,GAAG,kBAAkB,yBAAyB,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,qCAAA;AAAA,EAC7J,EAAE,MAAM,mBAAmB,QAAQ,GAAG,MAAM,KAAK,WAAW,GAAG,kBAAkB,oBAAoB,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA,GAAK,OAAO,qCAAA;AAAA,EAC9J,EAAE,MAAM,iBAAiB,QAAQ,GAAG,MAAM,KAAK,WAAW,GAAG,kBAAkB,sBAAsB,aAAa,IAAO,QAAQ,EAAE,OAAO,GAAG,KAAK,KAAK,OAAO,mCAAA;AAChK,GAEaC,KAAyC;AAAA,EACpD;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,aAAa,aAAa,aAAa,aAAa,QAAQ,gBAAgB,WAAW,WAAW,cAAc,SAAS,UAAU;AAAA,IACjJ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,qBAAqB,WAAW,kBAAkB,WAAW,mBAAmB,kBAAkB,UAAU,wBAAwB,WAAW,eAAe,UAAU,OAAO;AAAA,IAC7L,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,WAAW,aAAa,aAAa,QAAQ,kBAAkB,mBAAmB,uBAAuB,SAAS,gBAAgB;AAAA,IAChJ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAA;AAAA,IACb,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,aAAa,aAAa,aAAa,eAAe,kBAAkB,eAAe,kBAAkB,WAAW,eAAe,kBAAkB,sBAAsB,QAAQ;AAAA,IACjM,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,aAAa,WAAW,gBAAgB,gBAAgB,WAAW,SAAS,WAAW,cAAc,UAAU,OAAO;AAAA,IACpI,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,aAAa,qBAAqB,WAAW,WAAW,UAAU,uBAAuB,eAAe,kBAAkB,mBAAmB,wBAAwB,cAAc,WAAW,eAAe,sBAAsB,UAAU,UAAU,SAAS,SAAS;AAAA,IACvR,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,WAAW,UAAU,aAAa,WAAW,OAAO,WAAW,SAAS,cAAc,YAAY,UAAU;AAAA,IAC1H,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,gBAAgB,WAAW,aAAa,UAAU,WAAW,aAAa,gBAAgB,OAAO,WAAW,cAAc,UAAU,SAAS,kBAAkB,gBAAgB;AAAA,IAC7L,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,qBAAqB,mBAAmB,WAAW,kBAAkB,aAAa,uBAAuB,eAAe,mBAAmB,wBAAwB,WAAW,kBAAkB,eAAe,kBAAkB,sBAAsB,UAAU,QAAQ;AAAA,IACvR,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,aAAa,qBAAqB,aAAa,eAAe,cAAc,WAAW,OAAO,eAAe,WAAW,kBAAkB,sBAAsB,UAAU,YAAY,gBAAgB;AAAA,IACpN,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,qBAAqB,WAAW,aAAa,aAAa,uBAAuB,mBAAmB,uBAAuB,wBAAwB,4BAA4B,OAAO,WAAW,kBAAkB,cAAc,UAAU,gBAAgB;AAAA,IACzQ,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,WAAW,aAAa,UAAU,aAAa,WAAW,SAAS,gBAAgB,WAAW,YAAY;AAAA,IACxH,qBAAqB;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ,CAAC,eAAe,WAAW,oBAAoB,YAAY,UAAU;AAAA,MAAA;AAAA,IAC/E;AAAA,IAEF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,WAAW,aAAa,QAAQ,WAAW,cAAc,UAAU,SAAS,gBAAgB;AAAA,IAC1G,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAA;AAAA,IACb,qBAAqB;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ,CAAC,gBAAgB,aAAa,WAAW,UAAU,aAAa,aAAa,eAAe,aAAa,WAAW,OAAO,eAAe,gBAAgB,WAAW,eAAe,oBAAoB,YAAY,SAAS;AAAA,MAAA;AAAA,IACvO;AAAA,IAEF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAA;AAAA,IACb,qBAAqB;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ,CAAC,gBAAgB,aAAa,WAAW,WAAW,UAAU,aAAa,aAAa,eAAe,WAAW,eAAe,WAAW,kBAAkB,WAAW,eAAe,cAAc,UAAU,UAAU,SAAS;AAAA,MAAA;AAAA,IAC7O;AAAA,IAEF,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,aAAa,qBAAqB,mBAAmB,aAAa,uBAAuB,aAAa,kBAAkB,mBAAmB,uBAAuB,wBAAwB,0BAA0B;AAAA,IAClO,OAAO;AAAA,EAAA;AAAA,EAET;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,yBAAyB;AAAA,IACzB,aAAa,CAAC,WAAW,UAAU,aAAa,aAAa,mBAAmB,uBAAuB,QAAQ,gBAAgB,OAAO,YAAY,SAAS,cAAc,UAAU;AAAA,IACnL,OAAO;AAAA,EAAA;AAEX;AAEO,SAASC,KAAqD;AACnE,SAAOL,GAAgB,OAAO,CAACvL,MAAUA,EAAM,QAAQ;AACzD;AAEA,SAAS6L,EAAQC,GAAchJ,GAAsB;AACnD,SAAO,GAAGgJ,CAAI,IAAIjJ,EAAmBC,CAAI,CAAC;AAC5C;AAEA,SAASiJ,GAAkBD,GAAuB;AT3nBlD,MAAA7K,GAAAC,GAAAC,GAAAsE,GAAAC;AS4nBE,QAAMsG,KAAe/K,IAAA,iBAAiB,MAAM,MAAvB,gBAAAA,EAAkC;AACvD,MAAI,MAAM,QAAQ+K,CAAW,EAAG,QAAOA,EAAY,SAASF,CAAI;AAEhE,QAAMG,KAAY9K,KAAAD,IAAA,6BAAc,WAAd,gBAAAA,EAAsB,kBAAtB,gBAAAC,EAAqC;AACvD,MAAI,MAAM,QAAQ8K,CAAQ,EAAG,QAAOA,EAAS,SAASH,CAAI;AAC1D,MAAIG,KAAY,OAAOA,KAAa,SAAU,QAAO,OAAO,UAAU,eAAe,KAAKA,GAAUH,CAAI;AAExG,QAAMI,KAAgBzG,IAAA,iCAAgB,SAAhB,gBAAAA,EAAsB;AAC5C,MAAIyG,KAAgB,OAAOA,KAAiB,YAAY,OAAO,UAAU,eAAe,KAAKA,GAAcJ,CAAI;AAC7G,WAAO;AAGT,QAAMK,KAAczG,IAAA,6BAAc,UAAd,gBAAAA,EAAqB;AACzC,SAAI,GAAAyG,KAAc,OAAOA,KAAe,YAAY,OAAO,UAAU,eAAe,KAAKA,GAAYL,CAAI;AAK3G;AAEA,SAASM,GAAYpM,GAA4D;AAC/E,SAAO;AAAA,IACL,KAAK6L,EAAQ,SAAS7L,EAAM,IAAI;AAAA,IAChC,WAAW;AAAA,IACX,KAAKmD,GAAcnD,EAAM,IAAI,KAAK4K,EAAM;AAAA,IACxC,MAAM;AAAA,MACJ,MAAM5K,EAAM;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,OAAOA,EAAM;AAAA,QACb,UAAUA,EAAM;AAAA,QAChB,gBAAgBA,EAAM,kBAAkB;AAAA,MAAA;AAAA,IAC1C;AAAA,EACF;AAEJ;AAEA,SAASqM,GAAcrM,GAAyC;AAC9D,QAAMuD,IAAMsH,GAAgB7K,EAAM,IAAI,KAAK4K,EAAM;AACjD,SAAO;AAAA,IACL,KAAKiB,EAAQ,WAAW7L,EAAM,IAAI;AAAA,IAClC,WAAW;AAAA,IACX,KAAAuD;AAAA,IACA,MAAM;AAAA,MACJ,MAAMvD,EAAM;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,UAAUA,EAAM;AAAA,QAChB,SAASA,EAAM;AAAA,QACf,WAAWA,EAAM;AAAA,QACjB,WAAWA,EAAM;AAAA,QACjB,OAAOA,EAAM;AAAA,MAAA;AAAA,IACf;AAAA,EACF;AAEJ;AAEA,SAASsM,GAAatM,GAAwC;AAC5D,QAAMuM,IAAYvM,EAAM,eAAe,UAAU,gBAAgB,gBAC3DuD,IAAMuH,GAAe9K,EAAM,IAAI,MAAMA,EAAM,eAAe,UAAU4K,EAAM,cAAcA,EAAM;AACpG,SAAO;AAAA,IACL,KAAKiB,EAAQ,UAAU7L,EAAM,IAAI;AAAA,IACjC,WAAAuM;AAAA,IACA,KAAAhJ;AAAA,IACA,MAAM;AAAA,MACJ,MAAMvD,EAAM;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,UAAUA,EAAM,YAAY;AAAA,QAC5B,QAAQ;AAAA,QACR,QAAQA,EAAM,UAAU;AAAA,QACxB,aAAaA,EAAM;AAAA,QACnB,eAAe;AAAA,QACf,YAAYA,EAAM;AAAA,QAClB,eAAeA,EAAM;AAAA,QACrB,OAAOA,EAAM;AAAA,QACb,qBAAqBA,EAAM;AAAA,QAC3B,mBAAmBA,EAAM;AAAA,QACzB,aAAaA,EAAM;AAAA,QACnB,aAAa;AAAA,QACb,OAAOA,EAAM;AAAA,MAAA;AAAA,IACf;AAAA,EACF;AAEJ;AAEA,SAASwM,GAAYxM,GAAuC;AAC1D,QAAMuD,IAAMwH,GAAc/K,EAAM,IAAI,KAAK4K,EAAM;AAC/C,SAAO;AAAA,IACL,KAAKiB,EAAQ,SAAS7L,EAAM,IAAI;AAAA,IAChC,WAAW;AAAA,IACX,KAAAuD;AAAA,IACA,MAAM;AAAA,MACJ,MAAMvD,EAAM;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,UAAUA,EAAM;AAAA,QAChB,QAAQ;AAAA,QACR,QAAQA,EAAM,UAAU;AAAA,QACxB,OAAOA,EAAM;AAAA,QACb,UAAUA,EAAM;AAAA,QAChB,aAAa;AAAA,UACX,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,OAAO;AAAA,UACP,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QAAA;AAAA,QAER,OAAOA,EAAM;AAAA,MAAA;AAAA,IACf;AAAA,EACF;AAEJ;AAEA,SAASyM,GAAWzM,GAAsC;AACxD,QAAMuD,IAAMyH,GAAahL,EAAM,IAAI,MAAMA,EAAM,cAAc4K,EAAM,mBAAmBA,EAAM;AAC5F,SAAO;AAAA,IACL,KAAKiB,EAAQ,QAAQ7L,EAAM,IAAI;AAAA,IAC/B,WAAW;AAAA,IACX,KAAAuD;AAAA,IACA,MAAM;AAAA,MACJ,MAAMvD,EAAM;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,UAAUA,EAAM,YAAY;AAAA,QAC5B,QAAQ;AAAA,QACR,QAAQA,EAAM;AAAA,QACd,MAAMA,EAAM;AAAA,QACZ,WAAWA,EAAM;AAAA,QACjB,kBAAkBA,EAAM;AAAA,QACxB,aAAaA,EAAM;AAAA,QACnB,QAAQA,EAAM;AAAA,QACd,OAAOA,EAAM;AAAA,MAAA;AAAA,IACf;AAAA,EACF;AAEJ;AAEA,SAAS0M,GAAc1M,GAAyC;AAC9D,QAAMuD,IAAM0H,GAAgBjL,EAAM,IAAI,KAAK4K,EAAM;AACjD,SAAO;AAAA,IACL,KAAKiB,EAAQ,WAAW7L,EAAM,IAAI;AAAA,IAClC,WAAW;AAAA,IACX,KAAAuD;AAAA,IACA,MAAM;AAAA,MACJ,MAAMvD,EAAM;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,aAAaA,EAAM;AAAA,QACnB,yBAAyBA,EAAM;AAAA,QAC/B,WAAWA,EAAM;AAAA,QACjB,aAAaA,EAAM;AAAA,QACnB,qBAAqBA,EAAM,uBAAuB,CAAA;AAAA,QAClD,OAAOA,EAAM;AAAA,MAAA;AAAA,IACf;AAAA,EACF;AAEJ;AAEA,SAAS2M,GAAmB3M,GAAoC;AAC9D,QAAM4M,IAAQ5M,EAAM,YAAY,SAAS,iBAAiBA,EAAM,YAAY,KAAK,IAAI,CAAC,KAAK,wBACrF6M,KAAY7M,EAAM,uBAAuB,CAAA,GAAI,IAAI,CAAC8M,MAAU,UAAUA,EAAM,MAAM,KAAKA,EAAM,OAAO,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,KAAK,GAC5HC,IAAeF,IAAW,cAAcA,CAAQ,MAAM;AAC5D,SAAO,GAAG7M,EAAM,KAAK,IAAI4M,CAAK,IAAIG,CAAY,WAAW/M,EAAM,WAAW,4BAA4BA,EAAM,uBAAuB;AACrI;AAEA,SAASgN,GAA0BhN,GAAyC;AAC1E,QAAMuD,IAAM0H,GAAgBjL,EAAM,IAAI,KAAK4K,EAAM,gBAC3CqC,IAAW,YAAYjN,EAAM,IAAI;AACvC,SAAO;AAAA,IACL,KAAK6L,EAAQ,QAAQoB,CAAQ;AAAA,IAC7B,WAAW;AAAA,IACX,KAAA1J;AAAA,IACA,MAAM;AAAA,MACJ,MAAM0J;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,WAAW;AAAA,QACX,kBAAkB;AAAA,QAClB,aAAa;AAAA,QACb,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAA;AAAA,QACzB,OAAON,GAAmB3M,CAAK;AAAA,MAAA;AAAA,MAEjC,OAAO;AAAA,QACL,WAAW;AAAA,UACT,aAAa;AAAA,YACX,aAAaA,EAAM;AAAA,YACnB,WAAWA,EAAM;AAAA,YACjB,aAAaA,EAAM;AAAA,YACnB,yBAAyBA,EAAM;AAAA,YAC/B,aAAaA,EAAM;AAAA,YACnB,qBAAqBA,EAAM,uBAAuB,CAAA;AAAA,UAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEJ;AAEA,eAAekN,EAAsBpK,GAAcqK,GAAuC;AACxF,QAAMC,IAAW,KAAK,QAAQ;AAAA,IAC5B,CAACC,MAAA;AT30BL,UAAApM;AS20BqB,aAAAoM,EAAO,SAAS,UAAUA,EAAO,SAASvK,QAAS7B,IAAAoM,EAAO,WAAP,gBAAApM,EAAe,OAAM,UAAUkM;AAAA;AAAA,EAAA;AAErG,SAAIC,KAEG,OAAO,OAAO;AAAA,IACnB,MAAAtK;AAAA,IACA,MAAM;AAAA,IACN,QAAQqK;AAAA,IACR,SAAS;AAAA,EAAA,CACV;AACH;AAEA,eAAeG,KAA0E;AACvF,QAAMzH,IAAO,MAAMqH,EAAsB,qBAAqB,IAAI,GAC5DvM,IAAU,MAAMuM,EAAsB,WAAWrH,EAAK,EAAE,GACxD0H,IAAS,MAAML,EAAsB,UAAUrH,EAAK,EAAE,GACtD2H,IAAW,MAAMN,EAAsB,YAAYrH,EAAK,EAAE,GAC1D4H,IAAO,MAAMP,EAAsB,QAAQrH,EAAK,EAAE,GAClDyC,IAAQ,MAAM4E,EAAsB,SAASO,EAAK,EAAE,GACpDC,IAAU,MAAMR,EAAsB,WAAWrH,EAAK,EAAE,GACxD8H,IAAc,MAAMT,EAAsB,iBAAiBQ,EAAQ,EAAE,GACrEE,IAAe,MAAMV,EAAsB,kBAAkBQ,EAAQ,EAAE;AAE7E,SAAO;AAAA,IACL,SAAS/M,EAAQ;AAAA,IACjB,QAAQ4M,EAAO;AAAA,IACf,UAAUC,EAAS;AAAA,IACnB,MAAMC,EAAK;AAAA,IACX,OAAOnF,EAAM;AAAA,IACb,aAAaqF,EAAY;AAAA,IACzB,cAAcC,EAAa;AAAA,EAAA;AAE/B;AAEA,SAASC,KAA+B;AACtC,QAAMC,IAAoB/B,GAAkB,SAAS;AACrD,SAAO;AAAA,IACL,GAAGR,GAAgB,IAAIc,EAAa;AAAA,IACpC,GAAGzJ,GAAsB,IAAIwJ,EAAW;AAAA,IACxC,GAAI0B,IAAoBnC,GAAgB,IAAIe,EAAa,IAAIf,GAAgB,IAAIqB,EAAyB;AAAA,IAC1G,GAAGxB,GAAe,IAAIc,EAAY;AAAA,IAClC,GAAGb,GAAc,IAAIe,EAAW;AAAA,IAChC,GAAGd,GAAa,IAAIe,EAAU;AAAA,EAAA;AAElC;AAEA,eAAsBsB,GAAiBtK,GAA6E;ATz3BpH,MAAAxC,GAAAC,GAAAC,GAAAsE,GAAAC,GAAAC,GAAAC;AS03BE,MAAI,GAAC3E,IAAA,KAAK,SAAL,QAAAA,EAAW,cAAa,EAAE,OAAO,GAAG,SAAS,EAAA;AAElD,QAAM+M,IAAY,MAAMV,GAAA,GAClBW,IAAQJ,GAAA,GAERT,IAAW,IAAI;AAAA,IACnB,KAAK,MAAM,IAAI,CAAC5I,MAAc,CAACqH,EAAQrH,EAAK,MAAMA,EAAK,IAAI,GAAGA,CAAI,CAAC;AAAA,EAAA,GAG/D0J,IAAuB,CAAA,GACvBC,IAAuB,CAAA;AAE7B,aAAWC,KAAQH,GAAO;AACxB,UAAMI,IAAWL,EAAUI,EAAK,SAAS,GACnCE,IAAelB,EAAS,IAAIgB,EAAK,GAAG;AAE1C,QAAI,CAACE,GAAc;AACjB,MAAAJ,EAAc,KAAK;AAAA,QACjB,GAAGE,EAAK;AAAA,QACR,KAAKA,EAAK;AAAA,QACV,QAAQC;AAAA,QACR,OAAO;AAAA,UACL,WAAW;AAAA,YACT,SAAS;AAAA,YACT,YAAYD,EAAK;AAAA,UAAA;AAAA,QACnB;AAAA,MACF,CACD;AACD;AAAA,IACF;AAEA,UAAMG,IAAkC,EAAE,KAAKD,EAAa,GAAA;AAE5D,OAAKpN,IAAAoN,EAAa,WAAb,gBAAApN,EAAqB,OAAM,UAAUmN,MACxCE,EAAO,SAASF,IAGd,OAAOC,EAAa,OAAO,EAAE,MAAMF,EAAK,QAC1CG,EAAO,MAAMH,EAAK,QAGhB3I,KAAAtE,IAAAmN,EAAa,UAAb,gBAAAnN,EAAoB,cAApB,gBAAAsE,EAA+B,aAAY,OAC7C8I,EAAO,yBAAyB,IAAI,OAGlC5I,KAAAD,IAAA4I,EAAa,UAAb,gBAAA5I,EAAoB,cAApB,gBAAAC,EAA+B,gBAAeyI,EAAK,QACrDG,EAAO,4BAA4B,IAAIH,EAAK;AAG9C,UAAMI,IAAiB,QAAQ,MAAM,UAAUF,EAAa,UAAU,EAAE,GAClEG,IAAe,QAAQ,MAAM,YAAYD,GAAgBJ,EAAK,KAAK,UAAU,IAAI;AAAA,MACrF,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,WAAW;AAAA,IAAA,CACZ,GACKM,IAAa,QAAQ,MAAM,WAAWF,GAAgBC,CAAY;AACxE,IAAI,OAAO,KAAKC,CAAU,EAAE,SAAS,MACnCH,EAAO,SAASE,IAGd,OAAO,KAAKF,CAAM,EAAE,SAAS,KAC/BJ,EAAc,KAAKI,CAAM;AAAA,EAE7B;AAEA,SAAIL,EAAc,UAChB,MAAM,KAAK,gBAAgBA,CAAsB,GAG/CC,EAAc,UAChB,MAAM,KAAK,gBAAgBA,CAAsB,GAG/C1K,KAAA,QAAAA,EAAS,YACXmC,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK,8BAA8BsI,EAAc,MAAM,SAASC,EAAc,MAAM,eAGjG,EAAE,OAAOD,EAAc,QAAQ,SAASC,EAAc,OAAA;AAC/D;AAEO,SAASQ,KAAqC;AACnD,SAAO,KAAK,MAAM,OAAO,CAACnK,MAAcA,EAAK,SAAS,aAAaA,EAAK,OAAO,QAAQ;AACzF;AC57BA,SAASoK,EAAWhP,GAAuB;AACzC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAMA,CAAK,CAAC,CAAC;AACpD;AAEA,eAAeiP,EAAUpQ,GAAkC;AACzD,QAAMH,IAAO,MAAME,GAAqBC,CAAO;AAC/C,SAAO,OAAOH,EAAK,SAAS,CAAC;AAC/B;AAEA,eAAewQ,KAA2B;AACxC,MAAIC,IAAM;AACV,aAAa;AACX,UAAMC,IAAM,MAAMH,EAAU,KAAK;AAEjC,QADAE,KAAOC,GACHA,KAAO,EAAG;AAAA,EAChB;AACA,SAAOJ,EAAWG,CAAG;AACvB;AAEA,eAAeE,GAAcC,GAAkD;AAC7E,QAAMC,IAAkB;AAAA,IACtB,OAAO,EAAE,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS,KAAK,QAAA;AAAA,IACxD,QAAQ,EAAE,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS,KAAK,QAAA;AAAA,IACzD,OAAO,EAAE,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS,KAAK,QAAA;AAAA,EAAQ,EAChED,CAAO;AAET,SAAO;AAAA,IACL,KAAK,MAAML,EAAUM,EAAgB,GAAG;AAAA,IACxC,KAAK,MAAMN,EAAUM,EAAgB,GAAG;AAAA,IACxC,KAAK,MAAMN,EAAUM,EAAgB,GAAG;AAAA,IACxC,KAAK,MAAMN,EAAU,OAAO;AAAA,IAC5B,KAAK,MAAMA,EAAU,OAAO;AAAA,IAC5B,KAAK,MAAMA,EAAUM,EAAgB,GAAG;AAAA,IACxC,KAAK,MAAMN,EAAU,OAAO;AAAA,IAC5B,KAAK,MAAMC,GAAA;AAAA,IACX,KAAK,MAAMD,EAAU,SAAS;AAAA,EAAA;AAElC;AAEA,SAASO,GAAcC,GAAa;AAClC,SAAOA,EAAI,KAAK,MAAM,KAAK,WAAWA,EAAI,MAAM,CAAC;AACnD;AAEA,SAASC,GAAmBC,GAA6B;AACvD,QAAMC,IAAS,CAAC,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,GAC5LC,IAAO,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO,OAAO,MAAM,MAAM,IAAI;AACrF,SAAO,GAAGL,GAAWI,CAAM,CAAC,GAAGJ,GAAWK,CAAI,CAAC,KAAKF,CAAW;AACjE;AAEA,SAASG,GAAsBC,GAAyBC,GAAuC;AAC7F,QAAMC,KAAOD,KAAA,gBAAAA,EAAe,cAAa,CAAA;AACzC,SAAO;AAAA,IACL,KAAKhB,EAAWe,EAAK,MAAM,OAAOE,EAAK,OAAO,CAAC,CAAC;AAAA,IAChD,KAAKjB,EAAWe,EAAK,MAAM,OAAOE,EAAK,OAAO,CAAC,CAAC;AAAA,IAChD,KAAKjB,EAAWe,EAAK,MAAM,OAAOE,EAAK,OAAO,CAAC,CAAC;AAAA,IAChD,KAAKjB,EAAWe,EAAK,MAAM,OAAOE,EAAK,OAAO,CAAC,CAAC;AAAA,IAChD,KAAKjB,EAAWe,EAAK,MAAM,OAAOE,EAAK,OAAO,CAAC,CAAC;AAAA,IAChD,KAAKjB,EAAWe,EAAK,MAAM,OAAOE,EAAK,OAAO,CAAC,CAAC;AAAA,IAChD,KAAKjB,EAAWe,EAAK,MAAM,OAAOE,EAAK,OAAO,CAAC,CAAC;AAAA,IAChD,KAAKjB,EAAWe,EAAK,MAAM,OAAOE,EAAK,OAAO,CAAC,CAAC;AAAA,IAChD,KAAKjB,EAAWe,EAAK,MAAM,OAAOE,EAAK,OAAO,CAAC,CAAC;AAAA,EAAA;AAEpD;AAEA,eAAsBC,GAA4B9O,GAA2B;AVjF7E,MAAAC,GAAAC,GAAAC,GAAAsE;AUkFE,QAAMyJ,IAAU,SAAOhO,KAAAD,IAAAD,EAAM,WAAN,gBAAAC,EAAc,YAAd,gBAAAC,EAAuB,YAAW,QAAQ,GAC3D6O,IAA2Bb,MAAY,WAAWA,MAAY,UAAUA,IAAU,UAElFc,IAAqB,SAAOvK,KAAAtE,IAAAH,EAAM,WAAN,gBAAAG,EAAc,YAAd,gBAAAsE,EAAuB,YAAW,EAAE,GAEhEwK,IADetB,GAAA,EACY,KAAK,CAACnK,MAAcA,EAAK,SAASwL,CAAkB,GAC/EE,IAAUtE,KAA8B,KAAK,CAAC5L,MAAUA,EAAM,SAASgQ,CAAkB,GACzFJ,KAAgBK,KAAA,gBAAAA,EAAa,WAAUC,KAAW,MAElDzN,IAAS,MAAMwM,GAAcc,CAAW,GACxCI,IAAcT,GAAsBjN,GAAQmN,CAAa;AAE/D,QAAM5O,EAAM,OAAO;AAAA,IACjB,8BAA8BmP,EAAY;AAAA,IAC1C,8BAA8BA,EAAY;AAAA,IAC1C,8BAA8BA,EAAY;AAAA,IAC1C,8BAA8BA,EAAY;AAAA,IAC1C,8BAA8BA,EAAY;AAAA,IAC1C,8BAA8BA,EAAY;AAAA,IAC1C,8BAA8BA,EAAY;AAAA,IAC1C,8BAA8BA,EAAY;AAAA,IAC1C,8BAA8BA,EAAY;AAAA,IAC1C,mCAAmCA,EAAY;AAAA,IAC/C,mCAAmCA,EAAY;AAAA,EAAA,CAChD;AAED,QAAMC,IAAcpP,EAAM,MAAM,KAAK,CAACwD,MAAcA,EAAK,SAAS,WAAWA,EAAK,KAAK,YAAA,MAAkB,cAAc;AACvH,EAAI4L,KACF,MAAMpP,EAAM,wBAAwB,QAAQ,CAAC;AAAA,IAC3C,KAAKoP,EAAY;AAAA,IACjB,gBAAgB,KAAK,IAAI,IAAID,EAAY,MAAM,CAAC;AAAA,EAAA,CACjD,CAAC;AAEN;AAEA,eAAsBE,GAAgBrP,GAA2B;AAC/D,QAAMsP,IAAe;AAAA,IACnB,CAAC,UAAU,cAAc;AAAA,IACzB,CAAC,UAAU,gBAAgB;AAAA,IAC3B,CAAC,SAAS,kBAAkB;AAAA,IAC5B,CAAC,QAAQ,gBAAgB;AAAA,IACzB,CAAC,QAAQ,QAAQ;AAAA,IACjB,CAAC,QAAQ,gBAAgB;AAAA,EAAA,GAGrBC,IAAa,KAAK,OAClBC,IAAgB,IAAI,IAAIxP,EAAM,MAAM,IAAI,CAACwD,MAAc,GAAGA,EAAK,IAAI,IAAIA,EAAK,KAAK,YAAA,CAAa,EAAE,CAAC,GACjG0J,IAAuB,CAAA;AAE7B,aAAW,CAACpC,GAAMhJ,CAAI,KAAKwN,GAAc;AACvC,QAAIE,EAAc,IAAI,GAAG1E,CAAI,IAAI,OAAOhJ,CAAI,EAAE,YAAA,CAAa,EAAE,EAAG;AAChE,UAAM2N,IAAYF,EAAW,KAAK,CAAC/L,MAAcA,EAAK,SAASsH,KAAQtH,EAAK,SAAS1B,CAAI;AACzF,IAAK2N,KACLvC,EAAc,KAAKuC,EAAU,UAAU;AAAA,EACzC;AAEA,EAAIvC,EAAc,UAChB,MAAMlN,EAAM,wBAAwB,QAAQkN,CAAa;AAE7D;AAEA,eAAsBwC,GAAuB1P,GAA2B;AV/IxE,MAAAC;AUgJE,QAAM0P,IAAehC,GAAA,GACfiC,IAAiBhF,GAAA,GAEjBiF,IAAqBF,EAAa,SAASvB,GAAWuB,CAAY,IAAI,MACtEG,IAAwBD,IAAkD,OAA7BzB,GAAWwB,CAAc,GAEtEG,KAAgBF,KAAA,gBAAAA,EAAoB,WAAUC,GAC9CvB,KAAcsB,KAAA,gBAAAA,EAAoB,UAAQC,KAAA,gBAAAA,EAAsB,SAAQ,SAExE5B,IAAU,OAAO6B,EAAc,WAAW,QAAQ,GAClDC,IAAY,OAAOD,EAAc,aAAa,WAAW;AAE/D,QAAM/P,EAAM,OAAO;AAAA,IACjB,MAAMsO,GAAmBC,CAAW;AAAA,IACpC,0BAA0BA;AAAA,IAC1B,0BAA0BL;AAAA,IAC1B,4BAA4B8B;AAAA,EAAA,CAC7B,GAED,MAAMlB,GAA4B9O,CAAK,GACvC,QAAMC,IAAAD,EAAM,qBAAN,gBAAAC,EAAA,KAAAD,KACN,MAAMqP,GAAgBrP,CAAK;AAC7B;AAEA,eAAsBiQ,KAAqC;AAEzD,QAAMjQ,IAAQ,MADK,iBAAiB,OAAO,EACZ,OAAO;AAAA,IACpC,MAAM;AAAA,IACN,MAAM;AAAA,EAAA,CACP;AAED,eAAM0P,GAAuB1P,CAAK,GAC3BA;AACT;AC1KA,MAAMkQ,KAA8C,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAElH,SAASlN,EAAIpE,GAAgBkC,IAAW,GAAW;AACjD,QAAMmC,IAAI,OAAOrE,CAAK;AACtB,SAAO,OAAO,SAASqE,CAAC,IAAIA,IAAInC;AAClC;AAEA,SAASqP,GAASvR,GAAyB;AACzC,SAAOA,KAAU,QAA+B,OAAOA,CAAK,EAAE,WAAW;AAC3E;AAEA,SAASwR,GAAoBxR,GAAuB;AAClD,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAMA,CAAK,CAAC,CAAC;AACpD;AAEA,SAASyR,GAAiBC,GAAa3H,GAAqB;AAC1D,QAAMlI,IAAQ6P,IAAM3H;AACpB,SAAIlI,KAAS,KAAW,SACpBA,KAAS,KAAW,SACpBA,KAAS,KAAW,MACpBA,KAAS,KAAW,SACpBA,KAAS,KAAW,SACpBA,KAAS,KAAW,SACjB;AACT;AAEA,SAAS8P,GAAoBC,GAAuD;AAClF,QAAM9H,IAAM1F,EAAIwN,KAAA,gBAAAA,EAAiB,KAAK,EAAE,GAClCC,IAAMzN,EAAIwN,KAAA,gBAAAA,EAAiB,KAAK,EAAE,GAClCE,IAAM1N,EAAIwN,KAAA,gBAAAA,EAAiB,KAAK,EAAE,GAClCG,IAAM3N,EAAIwN,KAAA,gBAAAA,EAAiB,KAAK,EAAE;AAExC,SAAO;AAAA,IACL,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI9H,IAAM,CAAC,CAAC;AAAA,IACzC,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI+H,IAAM,CAAC,CAAC;AAAA,IAC5C,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIC,IAAM,CAAC,CAAC;AAAA,IACvC,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIC,IAAM,CAAC,CAAC;AAAA,EAAA;AAE5C;AAEA,SAASC,GAAiBJ,GAA8C;AACtE,QAAMF,IAAMtN,EAAIwN,KAAA,gBAAAA,EAAiB,KAAK,EAAE,GAClCG,IAAM3N,EAAIwN,KAAA,gBAAAA,EAAiB,KAAK,EAAE,GAClCK,IAAM7N,EAAIwN,KAAA,gBAAAA,EAAiB,KAAK,EAAE,GAClCzC,IAAM/K,EAAIwN,KAAA,gBAAAA,EAAiB,KAAK,EAAE,GAClCC,IAAMzN,EAAIwN,KAAA,gBAAAA,EAAiB,KAAK,EAAE,GAClCE,IAAM1N,EAAIwN,KAAA,gBAAAA,EAAiB,KAAK,EAAE,GAClC9H,IAAM1F,EAAIwN,KAAA,gBAAAA,EAAiB,KAAK,EAAE;AAExC,SAAO;AAAA,IACL,SAAS,KAAK,IAAI,GAAGF,IAAMK,CAAG;AAAA,IAC9B,eAAe,KAAK,IAAI,GAAGF,IAAMI,CAAG;AAAA,IACpC,WAAW,KAAK,IAAI,GAAGJ,IAAM1C,CAAG;AAAA,IAChC,YAAY,KAAK,IAAI,GAAG2C,IAAMhI,CAAG;AAAA,IACjC,WAAW,KAAK,IAAI,GAAGiI,IAAMF,CAAG;AAAA,EAAA;AAEpC;AAEA,SAASK,GAAqBH,GAAqB;AACjD,SAAIA,KAAO,IAAU,IACjBA,KAAO,IAAU,IACjBA,KAAO,KAAW,IAClBA,KAAO,KAAW,IAClBA,KAAO,KAAW,IAClBA,KAAO,KAAW,IACf;AACT;AAEA,SAASI,GAAsB7C,GAAyB;AACtD,SAAIA,MAAY,UAAgB,MAC5BA,MAAY,UAAgB,IACzB;AACT;AAEA,SAAS8C,GAAyBxN,GAAoB;AXjFtD,MAAAvD;AWkFE,SAAIuD,EAAK,SAAS,YAAYA,EAAK,SAAS,WAAWA,EAAK,SAAS,SAAe,OAC7EvD,IAAAuD,EAAK,WAAL,gBAAAvD,EAAa,YAAW;AACjC;AAEA,SAASgR,GAAazN,GAAmB;AXtFzC,MAAAvD;AWuFE,SAAO,KAAK,IAAI,GAAG+C,GAAI/C,IAAAuD,EAAK,WAAL,gBAAAvD,EAAa,QAAQ,CAAC,CAAC;AAChD;AAEA,SAASiR,GAAmBC,GAAaC,GAUvC;AXpGF,MAAAnR,GAAAC,GAAAC,GAAAsE;AWqGE,QAAMyJ,IAAU,SAAOjO,IAAAkR,KAAA,gBAAAA,EAAQ,YAAR,gBAAAlR,EAAiB,YAAW,QAAQ,GACrDoR,IAAoBN,GAAsB7C,CAAO,GACjDoD,IAAiBF,EACpB,OAAO,CAAC5N,MAASA,EAAK,SAAS,YAAYA,EAAK,SAAS,WAAWA,EAAK,SAAS,MAAM,EACxF,OAAOwN,EAAwB,EAC/B,OAAO,CAACtK,GAAKlD,MAASkD,IAAMuK,GAAazN,CAAI,GAAG,CAAC,GAE9C+N,IAAY,KAAK,IAAI,GAAGD,CAAc,GACtCE,IAAkBD,IAAYF,GAC9BI,IAAU,KAAK,IAAI,GAAGzO,GAAI9C,IAAAiR,KAAA,gBAAAA,EAAQ,oBAAR,gBAAAjR,EAAyB,KAAK,CAAC,CAAC,GAC1DwR,IAAc,KAAK,IAAI,GAAGF,IAAkBC,CAAO,GACnDE,IAAuBD,IAAc,IAAI,KAAK,KAAKA,IAAc,EAAE,IAAI,GACvEE,IAAYF,IAAc,GAE1BG,IAAW,KAAK,IAAI,GAAG7O,GAAI7C,IAAAgR,KAAA,gBAAAA,EAAQ,YAAR,gBAAAhR,EAAiB,MAAM,CAAC,CAAC,GACpD2R,IAAU,KAAK,IAAI,GAAG9O,GAAIyB,IAAA0M,KAAA,gBAAAA,EAAQ,YAAR,gBAAA1M,EAAiB,KAAKoN,IAAW,CAAC,CAAC;AAInE,SAAO;AAAA,IACL,WAAAN;AAAA,IACA,iBAAAC;AAAA,IACA,SAAAC;AAAA,IACA,aAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,WAAAC;AAAA,IACA,aAVkBA,IAAY,IAAIC;AAAA,IAWlC,YAViBD,IAAY,IAAIE;AAAA,IAWjC,mBAAAT;AAAA,EAAA;AAEJ;AAEO,MAAMU,WAAuB,MAAM;AAAA,EACxC,qBAA2B;AAIzB,QAHA,MAAM,mBAAA,GACNvJ,GAA0B,IAAW,GAEjC,KAAK,SAAS,cAAc,KAAK,SAAS,WAAY;AAE1D,UAAM2I,IAAU,KAAa,UAAU,CAAA,GACjCX,IAAkBW,EAAO,mBAAmB,CAAA,GAC5Ca,IAAUb,EAAO,WAAW,CAAA;AAElC,IAAAa,EAAQ,mBAAmBhP,EAAIgP,EAAQ,kBAAkBhP,EAAIwN,EAAgB,KAAK,EAAE,CAAC,GACrFwB,EAAQ,mBAAmBhP,EAAIgP,EAAQ,kBAAkBA,EAAQ,gBAAgB,GACjFb,EAAO,UAAUa,GAEjBb,EAAO,SAASA,EAAO,UAAU,CAAA,GAC5BhB,GAASgB,EAAO,OAAO,SAAS,MACnCA,EAAO,OAAO,YAAYd,GAAiBrN,EAAIwN,EAAgB,KAAK,EAAE,GAAGxN,EAAIwN,EAAgB,KAAK,EAAE,CAAC,IAGvGW,EAAO,eAAeA,EAAO,gBAAgB,CAAA;AAC7C,UAAMc,IAAsB1B,GAAoBC,CAAe;AAC/D,eAAW1Q,KAAO,OAAO,KAAKmS,CAAmB;AAC/C,MAAAd,EAAO,aAAarR,CAAG,IAAIkD,EAAImO,EAAO,aAAarR,CAAG,GAAGmS,EAAoBnS,CAAG,CAAC;AAGnF,IAAAqR,EAAO,eAAeA,EAAO,gBAAgB,CAAA;AAC7C,UAAMe,IAAkBtB,GAAiBJ,CAAe;AACxD,eAAW,CAAC1Q,GAAKlB,CAAK,KAAK,OAAO,QAAQsT,CAAe;AACvD,MAAAf,EAAO,aAAarR,CAAG,IAAIlB;AAG7B,IAAAuS,EAAO,UAAUA,EAAO,WAAW,CAAA,GACnCA,EAAO,QAAQ,gBAAgBL,GAAqB9N,EAAIwN,EAAgB,KAAK,EAAE,CAAC,GAChFW,EAAO,QAAQ,OAAOnO,EAAImO,EAAO,QAAQ,MAAM,CAAC,GAChDA,EAAO,QAAQ,MAAMnO,EAAImO,EAAO,QAAQ,KAAK,KAAK,IAAI,GAAGnO,EAAImO,EAAO,QAAQ,MAAM,CAAC,IAAI,CAAC,CAAC,GAEzFA,EAAO,cAAcA,EAAO,eAAe,CAAA;AAC3C,UAAMgB,IAAcjB,GAAmBC,GAAQ,KAAK,KAAc;AAClE,IAAAA,EAAO,YAAY,YAAYgB,EAAY,WAC3ChB,EAAO,YAAY,kBAAkBgB,EAAY,iBACjDhB,EAAO,YAAY,UAAUgB,EAAY,SACzChB,EAAO,YAAY,cAAcgB,EAAY,aAC7ChB,EAAO,YAAY,uBAAuBgB,EAAY,sBACtDhB,EAAO,YAAY,YAAYgB,EAAY,WAC3ChB,EAAO,YAAY,oBAAoBgB,EAAY,mBACnDhB,EAAO,QAAQ,cAAcgB,EAAY,aACzChB,EAAO,QAAQ,aAAagB,EAAY,YAExChB,EAAO,UAAUA,EAAO,WAAW,EAAE,OAAO,GAAG,QAAQ,EAAA,GACvDA,EAAO,QAAQ,QAAQnO,EAAImO,EAAO,QAAQ,OAAO,CAAC,GAClDA,EAAO,QAAQ,SAASnO,EAAImO,EAAO,QAAQ,QAAQ,CAAC,GAEpDA,EAAO,QAAQA,EAAO,SAAS,EAAE,SAAS,IAAI,QAAQ,GAAA,GAClD,OAAOA,EAAO,sBAAuB,cACvCA,EAAO,qBAAqB,KAE9BA,EAAO,mBAAmBA,EAAO,oBAAoB;AAAA,MACnD,UAAU,CAAA;AAAA,MACV,aAAa,CAAA;AAAA,MACb,eAAe,CAAA;AAAA,IAAC,GAElBA,EAAO,mBAAmBnO,EAAImO,EAAO,kBAAkB,CAAC;AAAA,EAC1D;AAAA,EAEA,IAAI,SAAgB;AAClB,WAAO,KAAK,MAAM,OAAO,CAAC3N,MAASA,EAAK,SAAS,OAAO;AAAA,EAC1D;AAAA,EAEA,IAAI,UAAiB;AACnB,WAAO,KAAK,MAAM,OAAO,CAACA,MAASA,EAAK,SAAS,QAAQ;AAAA,EAC3D;AAAA,EAEA,IAAI,SAAgB;AAClB,WAAO,KAAK,MAAM,OAAO,CAACA,MAASA,EAAK,SAAS,OAAO;AAAA,EAC1D;AAAA,EAEA,IAAI,QAAe;AACjB,WAAO,KAAK,MAAM,OAAO,CAACA,MAASA,EAAK,SAAS,MAAM;AAAA,EACzD;AAAA,EAEA,MAAM,cAAcG,GAAgC;AAClD,UAAM3B,IAAQ,KAAK,MAAM,IAAI2B,CAAO;AACpC,IAAI,CAAC3B,KAASA,EAAM,SAAS,WAC7B,MAAMqB,GAAkB,MAAMrB,EAAM,MAAM,OAAQA,EAAc,OAAO,SAAS,CAAC,CAAC;AAAA,EACpF;AAAA,EAEA,MAAM,kBAAiC;AACrC,UAAMoB,GAA0B,IAAI;AAAA,EACtC;AAAA,EAEA,MAAM,cAAcgP,GAAiC;AACnD,UAAM1O,IAAS,KAAK,MAAM,IAAI0O,CAAQ;AACtC,IAAI,CAAC1O,KAAUA,EAAO,SAAS,YAC/B,MAAMkE,GAAkB,MAAMlE,CAAM;AAAA,EACtC;AAAA,EAEA,MAAM,mBAAoC;AACxC,QAAI,KAAK,SAAS,cAAc,KAAK,SAAS,WAAY,QAAO;AAEjE,UAAM0I,IAAW,IAAI;AAAA,MACnB,KAAK,MACF,OAAO,CAAC5I,MAASA,EAAK,SAAS,OAAO,EACtC,IAAI,CAACA,MAAS3B,EAAmB2B,EAAK,IAAI,CAAC;AAAA,IAAA,GAG1C6O,IAAWzQ,GACd,OAAO,CAACI,MAAU,CAACoK,EAAS,IAAIvK,EAAmBG,EAAM,IAAI,CAAC,CAAC,EAC/D,IAAI,CAACA,OAAW;AAAA,MACf,MAAMA,EAAM;AAAA,MACZ,MAAM;AAAA,MACN,KAAKG,GAAcH,EAAM,IAAI;AAAA,MAC7B,QAAQ;AAAA,QACN,OAAOA,EAAM;AAAA,QACb,UAAUA,EAAM;AAAA,QAChB,gBAAgBA,EAAM,kBAAkB;AAAA,MAAA;AAAA,IAC1C,EACA;AAEJ,WAAKqQ,EAAS,UACd,MAAM,KAAK,wBAAwB,QAAQA,CAAiB,GACrDA,EAAS,UAFa;AAAA,EAG/B;AAAA,EAEA,MAAM,sBAAqC;AACzC,IAAI,KAAK,SAAS,cAClB,MAAMvD,GAA4B,IAAW;AAAA,EAC/C;AAAA,EAEA,MAAM,qBAAoC;AACxC,IAAI,KAAK,SAAS,cAClB,MAAMY,GAAuB,IAAW;AAAA,EAC1C;AAAA,EAEA,MAAM,iBAAiB4C,GAAiC;AX3Q1D,QAAArS,GAAAC,GAAAC;AW4QI,QAAI,KAAK,SAAS,cAAc,KAAK,SAAS,WAAY;AAE1D,UAAMoO,IAAc,QAAO+D,KAAA,gBAAAA,EAAa,SAAQ,EAAE,EAAE,KAAA,GAC9C1D,KAAgB0D,KAAA,gBAAAA,EAAa,WAAU,CAAA,GACvCC,KAAe3D,KAAA,gBAAAA,EAAe,cAAa,CAAA,GAC3C4D,MAAgBvS,IAAA,KAAa,WAAb,gBAAAA,EAAqB,mBAAkB,CAAA,GACvDwS,KAAeD,KAAA,gBAAAA,EAAc,cAAa,CAAA,GAE1CE,MAA0BxS,IAAA,KAAa,WAAb,gBAAAA,EAAqB,oBAAmB,CAAA,GAClEyS,MAAkBxS,IAAA,KAAa,WAAb,gBAAAA,EAAqB,YAAW,CAAA,GAClDoN,IAAkC,CAAA,GAClCqF,IAAqD;AAAA,MACzD,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA;AAGP,eAAW9S,KAAOoQ,IAAuB;AACvC,YAAM2C,IAAO7P,EAAIyP,KAAA,gBAAAA,EAAe3S,IAAM,CAAC,GACjCqG,IAAOnD,EAAIuP,KAAA,gBAAAA,EAAezS,IAAM,CAAC;AACvC,MAAA8S,EAAe9S,CAAG,IAAIqG;AAGtB,YAAMwI,IADU3L,EAAI0P,KAAA,gBAAAA,EAAyB5S,IAAMA,MAAQ,QAAQ,KAAK,EAAE,IACnD+S;AACvB,MAAAtF,EAAO,0BAA0BzN,CAAG,EAAE,IAAIsQ,GAAoBzB,IAAOxI,CAAI;AAAA,IAC3E;AAEA,UAAM2M,IAAU9P,EAAIyP,KAAA,gBAAAA,EAAc,KAAK,CAAC,GAClCM,IAAUH,EAAe,KACzBI,IAAgBhQ,EAAI2P,KAAA,gBAAAA,EAAgB,kBAAkB3P,EAAI0P,KAAA,gBAAAA,EAAwB,KAAK,EAAE,CAAC,GAC1FO,IAAcjQ,EAAI2P,KAAA,gBAAAA,EAAgB,kBAAkBK,CAAa;AACvE,IAAAzF,EAAO,iCAAiC,IAAI6C,GAAqB4C,IAAgBF,IAAWC,CAAO,GACnGxF,EAAO,iCAAiC,IAAI6C,GAAqB6C,IAAcH,IAAWC,CAAO,GAE7FxE,MAAahB,EAAO,wBAAwB,IAAIgB,IAChDK,KAAA,QAAAA,EAAe,YAASrB,EAAO,wBAAwB,IAAI,OAAOqB,EAAc,OAAO,KACvFA,KAAA,gBAAAA,EAAe,eAAc,WAAWrB,EAAO,0BAA0B,IAAI,OAAOqB,EAAc,aAAa,EAAE,IAErHrB,EAAO,uBAAuB,IAAI;AAAA,MAChC,MAAMgB;AAAA,MACN,WAAWqE;AAAA,IAAA,GAGb,MAAM,KAAK,OAAOrF,CAAM;AAAA,EAC1B;AAAA,EAEA,MAAM,iBAAiBzN,GAAqC;AXhU9D,QAAAG,GAAAC,GAAAC;AWiUI,QAAI,KAAK,SAAS,cAAc,KAAK,SAAS,WAAY;AAE1D,UAAM+S,IAA0C;AAAA,MAC9C,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,IAAA,GAGHC,IAAW5C,KAAqBtQ,IAAA,KAAa,WAAb,gBAAAA,EAAqB,oBAAmB,CAAA,CAAE,GAC1EtC,IAASqF,GAAK7C,KAAAD,IAAA,KAAa,WAAb,gBAAAA,EAAqB,iBAArB,gBAAAC,EAAoCL,IAAMqT,EAASrT,CAAG,CAAC;AAC3E,UAAMuD,GAAkB,MAAM6P,EAAOpT,CAAG,GAAGnC,CAAM;AAAA,EACnD;AACF;AC5UO,MAAMyV,WAAsB,KAAK;AAAA,EACtC,MAAM,YAA2B;AZHnC,QAAAnT;AYII,QAAI,KAAK,SAAS,QAAS;AAE3B,UAAMD,IAAQ,KAAK;AACnB,QAAI,CAACA,GAAO;AACV,OAAAC,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK;AACvB;AAAA,IACF;AAEA,UAAMoD,GAAkBrD,GAAO,KAAK,MAAM,OAAQ,KAAa,OAAO,SAAS,CAAC,CAAC;AAAA,EACnF;AAAA,EAEA,MAAM,YAA2B;AZfnC,QAAAC;AYgBI,QAAI,KAAK,SAAS,SAAU;AAE5B,UAAMD,IAAQ,KAAK;AACnB,QAAI,CAACA,GAAO;AACV,OAAAC,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK;AACvB;AAAA,IACF;AAEA,UAAM2H,GAAkB5H,GAAO,IAAI;AAAA,EACrC;AACF;ACbA,MAAMqT,KAAkB,QAAgB,MAAM,OAAO,YAE/CC,KAA+C;AAAA,EACnD,SAAS;AAAA,EACT,eAAe;AAAA,EACf,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AACb,GAEMC,KAAmD;AAAA,EACvD,SAAS;AAAA,EACT,eAAe;AAAA,EACf,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AACb,GAEMC,yBAAgC,IAAI;AAAA,EACxC3R,EAAmB,sBAAsB;AAAA,EACzCA,EAAmB,wBAAwB;AAC7C,CAAC,GAEK4R,KAAiB5R,EAAmB,YAAY;AA+CtD,SAASiC,GAAO4P,GAAQC,GAAgB;AACtC,SAAOD,EAAE,KAAK,cAAcC,EAAE,IAAI;AACpC;AAEA,SAAS3Q,EAAIpE,GAAgBkC,IAAW,GAAW;AACjD,QAAMmC,IAAI,OAAOrE,CAAK;AACtB,SAAO,OAAO,SAASqE,CAAC,IAAIA,IAAInC;AAClC;AAEA,SAAS8S,EAAMhV,GAAgBkC,IAAW,GAAW;AACnD,SAAO,KAAK,IAAI,GAAG,KAAK,MAAMkC,EAAIpE,GAAOkC,CAAQ,CAAC,CAAC;AACrD;AAEA,SAAS+S,GAAoBC,GAA6B;AACxD,SAAO;AAAA,IACL,WAAWF,EAAME,KAAA,gBAAAA,EAAK,WAAW,CAAC;AAAA,IAClC,UAAUF,EAAME,KAAA,gBAAAA,EAAK,UAAU,CAAC;AAAA,IAChC,SAASF,EAAME,KAAA,gBAAAA,EAAK,SAAS,CAAC;AAAA,EAAA;AAElC;AAEA,SAASC,GAA0BD,GAA0C;AAC3E,QAAMhS,IAAO,QAAOgS,KAAA,gBAAAA,EAAK,SAAQ,EAAE,EAAE,KAAA,GAC/BE,IAAQJ,EAAME,KAAA,gBAAAA,EAAK,OAAO,CAAC;AACjC,SAAI,CAAChS,KAAQkS,KAAS,IAAU,OACzB,EAAE,MAAAlS,GAAM,OAAAkS,EAAA;AACjB;AAEA,SAASC,GAAsBH,GAAwB;AACrD,QAAMtH,IAAW,MAAM,QAAQsH,KAAA,gBAAAA,EAAK,QAAQ,IACxCA,EAAI,SAAS,IAAI,CAAC9U,MAAe+U,GAA0B/U,CAAK,CAAC,EAAE,OAAO,CAACA,MAAe,EAAQA,CAAM,IACxG,CAAA,GAEEkV,IAAiD,CAAA;AACvD,MAAIJ,KAAA,QAAAA,EAAK,eAAe,OAAOA,EAAI,eAAgB;AACjD,eAAW,CAACnQ,GAASwQ,CAAU,KAAK,OAAO,QAAQL,EAAI,WAAW,GAAG;AACnE,UAAI,CAACnQ,EAAS;AACd,YAAMyQ,IAAaP,GAAoBM,CAAU;AACjD,MAAIC,EAAW,YAAYA,EAAW,WAAWA,EAAW,WAAW,MACvEF,EAAYvQ,CAAO,IAAIyQ;AAAA,IACzB;AAGF,QAAMC,IAAwC,CAAA;AAC9C,MAAIP,KAAA,QAAAA,EAAK,iBAAiB,OAAOA,EAAI,iBAAkB;AACrD,eAAW,CAACnQ,GAAS/E,CAAK,KAAK,OAAO,QAAQkV,EAAI,aAAa;AAC7D,MAAKnQ,MACL0Q,EAAc1Q,CAAO,IAAI,KAAK,IAAI,GAAGiQ,EAAMhV,GAAO,CAAC,CAAC;AAIxD,SAAO;AAAA,IACL,UAAA4N;AAAA,IACA,aAAA0H;AAAA,IACA,eAAAG;AAAA,EAAA;AAEJ;AAEA,SAASC,GAAoBhR,GAA4B;AACvD,SAAO,CAACkQ,GAA0B,IAAI3R,EAAmByB,CAAS,CAAC;AACrE;AAEA,SAASiR,GAAkBjR,GAA4B;AACrD,SAAOzB,EAAmByB,CAAS,MAAMmQ;AAC3C;AAEA,SAASe,GAA4BhI,GAAkD;AACrF,QAAMiI,IAAgB,IAAI;AAAA,IACxB9J,GAAgB,IAAI,CAAC3L,MAAU,CAAC6C,EAAmB7C,EAAM,IAAI,GAAGA,CAAK,CAAC;AAAA,EAAA,GAElE0V,wBAAc,IAAA;AAEpB,aAAWC,KAAWnI,GAAU;AAC9B,UAAMxN,IAAQyV,EAAc,IAAI5S,EAAmB8S,EAAQ,IAAI,CAAC;AAChE,QAAK3V,GAEL;AAAA,iBAAWsE,KAAatE,EAAM,eAAe,CAAA;AAC3C,QAAA0V,EAAQ,IAAI7S,EAAmByB,CAAS,CAAC;AAG3C,iBAAWwI,KAAS9M,EAAM,uBAAuB,CAAA;AAC/C,mBAAWsE,KAAawI,EAAM,UAAU,CAAA;AACtC,UAAA4I,EAAQ,IAAI7S,EAAmByB,CAAS,CAAC;AAAA;AAAA,EAG/C;AAEA,SAAOoR;AACT;AAEA,SAASE,GAAoBpE,GAK3B;AACA,QAAMqE,IAAMjB,EAAMpD,KAAA,gBAAAA,EAAiB,KAAK,CAAC,GACnCzC,IAAM6F,EAAMpD,KAAA,gBAAAA,EAAiB,KAAK,CAAC,GACnCC,IAAMmD,EAAMpD,KAAA,gBAAAA,EAAiB,KAAK,CAAC,GAEnCsE,IAAiB,KAAK,IAAI,IAAI/G,IAAM,MAAM,EAAE,GAC5CgH,IAAoB,KAAK,IAAI,GAAGF,IAAM9G,IAAM,CAAC,GAC7CiH,IAAgBD,IAAoB,IACpCE,IAAe,KAAK,IAAI,GAAGxE,IAAM,EAAE;AAEzC,SAAO;AAAA,IACL,gBAAAqE;AAAA,IACA,eAAAE;AAAA,IACA,cAAAC;AAAA,IACA,mBAAAF;AAAA,EAAA;AAEJ;AAEA,SAASG,EAAoBlV,GAAYuM,GAA+B;AbpMxE,MAAAtM,GAAAC,GAAAC,GAAAsE,GAAAC,GAAAC,GAAAC;AaqME,QAAMuQ,IAAQP,KAAoB3U,IAAAD,EAAM,WAAN,gBAAAC,EAAc,oBAAmB,CAAA,CAAE,GAC/DmV,IAAQnB,KAAsB/T,IAAAF,EAAM,WAAN,gBAAAE,EAAc,qBAAoB,CAAA,CAAE,GAElEmV,IAAiB1K,GAAgB,IAAI,CAAC3L,MAAUA,EAAM,IAAI,EAAE,KAAK,CAAC0U,GAAGC,MAAMD,EAAE,cAAcC,CAAC,CAAC,GAC7F2B,IAAuBd,GAA4BY,EAAM,QAAQ,GAEjEG,wBAAgB,IAAA;AAEtB,MAAIC,IAAiB,GACjBC,IAAgB,GAChBC,IAAe;AAEnB,aAAW1T,KAASuK,GAAQ;AAC1B,UAAM4H,IAAaN,GAAoBuB,EAAM,YAAYpT,EAAM,EAAE,CAAC,GAC5D2T,IAAiBxB,EAAW,YAAYA,EAAW,WAAWA,EAAW,SAEzEyB,IAAgBR,EAAM,cAAcpT,EAAM,EAAE,GAC5C6T,KAAqB1V,IAAAiC,GAAgBJ,EAAM,IAAI,MAA1B,gBAAA7B,EAA6B,MAClD2V,IAAe,KAAK,IAAI,GAAG9S,GAAIyB,IAAAzC,EAAM,WAAN,gBAAAyC,EAAc,OAAO,CAAC,IAAIkR,CAAc,GACvEI,IAAY,KAAK;AAAA,MACrB;AAAA,MACA,OAAO,SAASH,CAAa,IACzBA,IACCC,KAAsBC;AAAA,IAAA,GAGvBE,IAAU1C,GAAqB,SAAO5O,IAAA1C,EAAM,WAAN,gBAAA0C,EAAc,aAAY,EAAE,CAAC,KAAK,IACxEuR,IAAUD,IAAU,KAAK,IAAI,GAAGpC,GAAMhP,KAAAD,IAAA3E,EAAM,WAAN,gBAAA2E,EAAc,iBAAd,gBAAAC,EAA6BoR,IAAU,CAAC,CAAC,IAAI,IACnFE,IAAgB,KAAK,IAAI,GAAGD,IAAUF,CAAS,GAE/CI,IAAsBtU,EAAmBG,EAAM,IAAI,GACnDoU,IAAkB9B,GAAoBtS,EAAM,IAAI,GAChDqU,IAAiBf,EAAqB,IAAIa,CAAmB,GAC7DG,IAAgB/B,GAAkBvS,EAAM,IAAI;AAElD,IAAAuT,EAAU,IAAIvT,EAAM,IAAI;AAAA,MACtB,YAAAmS;AAAA,MACA,gBAAAwB;AAAA,MACA,WAAAI;AAAA,MACA,SAAAE;AAAA,MACA,eAAAC;AAAA,MACA,iBAAAE;AAAA,MACA,gBAAAC;AAAA,MACA,eAAAC;AAAA,IAAA,CACD,GAEDd,KAAkBrB,EAAW,WAC7BsB,KAAiBtB,EAAW,UAC5BuB,KAAgBvB,EAAW;AAAA,EAC7B;AAEA,QAAMoC,IAAwBnB,EAAM,SAAS,OAAO,CAAC1O,GAAK8P,MAAQ9P,IAAM8P,EAAI,OAAO,CAAC;AAEpF,SAAO;AAAA,IACL,OAAApB;AAAA,IACA,WAAW;AAAA,MACT,OAAOD,EAAM;AAAA,MACb,OAAOK;AAAA,MACP,WAAWL,EAAM,iBAAiBK;AAAA,IAAA;AAAA,IAEpC,UAAU;AAAA,MACR,OAAOL,EAAM;AAAA,MACb,OAAOM;AAAA,MACP,WAAWN,EAAM,gBAAgBM;AAAA,IAAA;AAAA,IAEnC,SAAS;AAAA,MACP,OAAON,EAAM;AAAA,MACb,OAAOO;AAAA,MACP,WAAWP,EAAM,eAAeO;AAAA,IAAA;AAAA,IAElC,cAAc;AAAA,MACZ,OAAOP,EAAM;AAAA,MACb,OAAOoB;AAAA,MACP,WAAWpB,EAAM,oBAAoBoB;AAAA,IAAA;AAAA,IAEvC,gBAAAlB;AAAA,IACA,sBAAAC;AAAA,IACA,WAAAC;AAAA,EAAA;AAEJ;AAEA,SAASnP,GAAuB5C,GAAW9E,GAAsB;AbtRjE,MAAAuB,GAAAC,GAAAC,GAAAsE,GAAAC,GAAAC,GAAAC;AawRE,MADIpB,EAAK,SAAS,WAAW,GAACvD,IAAAuD,EAAK,WAAL,QAAAvD,EAAa,cAAYC,IAAAsD,EAAK,WAAL,QAAAtD,EAAa,UAChE,GAACuE,KAAAtE,IAAAqD,EAAK,WAAL,gBAAArD,EAAa,aAAb,QAAAsE,EAAwB/F,IAAO,QAAO;AAE3C,QAAM2H,IAAWrD,GAAI2B,KAAAD,IAAAlB,EAAK,WAAL,gBAAAkB,EAAa,gBAAb,gBAAAC,EAA2BjG,IAAO,CAAC;AACxD,SAAI2H,IAAW,IAAUA,IAClBrD,GAAI4B,IAAApB,EAAK,WAAL,gBAAAoB,EAAa,OAAO,CAAC;AAClC;AAEA,SAAS0B,GAAwBtG,GAAYtB,GAAsB;Ab/RnE,MAAAuB,GAAAC,GAAAC;AagSE,QAAMwO,IAAO3L,GAAI7C,KAAAD,KAAAD,IAAAD,EAAM,WAAN,gBAAAC,EAAc,iBAAd,gBAAAC,EAA6BxB,OAA7B,gBAAAyB,EAAoC,OAAO,CAAC,GACvDsW,IAAYzW,EAAM,MACrB,OAAO,CAACwD,MAAcA,EAAK,SAAS,OAAO,EAC3C,OAAO,CAACkD,GAAalD,MAAckD,IAAMN,GAAuB5C,GAAM9E,CAAI,GAAG,CAAC;AACjF,SAAOiQ,IAAO8H;AAChB;AAEA,SAASC,GAAuB1W,GAAYtB,GAAciY,GAAwB;AbvSlF,MAAA1W,GAAAC;AawSE,QAAM0W,IAAiB7W,GAA0BC,CAAK,EAAE,QAAQ,KAAK,CAAChB,MAAUA,EAAM,SAASN,CAAI,GAC7FmY,MAAS3W,KAAAD,IAAAD,EAAM,WAAN,gBAAAC,EAAc,iBAAd,gBAAAC,EAA6BxB,OAAS,CAAA,GAC/CoY,IAAKD,EAAO,MAAM,CAAA,GAClBE,IAAW,OAAOF,EAAO,SAAS,EAAE,EAAE,KAAA;AAC5C,SAAO;AAAA,IACL,MAAAnY;AAAA,IACA,WAAAiY;AAAA,IACA,OAAOI,KAAY,QAAOH,KAAA,gBAAAA,EAAgB,UAASlY,CAAI;AAAA,IACvD,OAAOsE,EAAI6T,EAAO,OAAO,CAAC;AAAA,IAC1B,YAAYvQ,GAAwBtG,GAAOtB,CAAI;AAAA,IAC/C,IAAI;AAAA,MACF,OAAOsE,EAAI8T,EAAG,OAAO,CAAC;AAAA,MACtB,KAAK9T,EAAI8T,EAAG,KAAK,CAAC;AAAA,IAAA;AAAA,EACpB;AAEJ;AAEA,SAASE,GAAgB5F,GAAe;AACtC,SAAOA,EAAM,KAAK,MAAM,KAAK,WAAWA,EAAM,MAAM,CAAC;AACvD;AAEA,SAAS6F,GAAarY,GAAuB;AAC3C,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAMA,CAAK,CAAC,CAAC;AACpD;AAEO,MAAMsY,WAA+B7D,GAAe;AAAA,EACjD,kBAA2B;AblUrC,QAAApT,GAAAC;AamUI,WAAO,IAASA,KAAAD,IAAA,KAAK,UAAL,gBAAAA,EAAoB,WAApB,QAAAC,EAA4B;AAAA,EAC9C;AAAA,EAEA,WAAW,iBAAsB;AAC/B,WAAO,QAAQ,MAAM,YAAY,MAAM,gBAAgB;AAAA,MACrD,SAAS,CAAC,aAAa,SAAS,SAAS,UAAU;AAAA,MACnD,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM,CAAC,EAAE,aAAa,SAAS,iBAAiB,eAAe,SAAS,WAAA,CAAY;AAAA,IAAA,CACrF;AAAA,EACH;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQuC,GAA6B;AbnV7C,QAAAxC,GAAAC,IAAAC,IAAAsE,IAAAC,IAAAC,IAAAC,IAAA6D,IAAA0O,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC,IAAAC;AaoVI,UAAM9U,IAAO,MAAM,MAAM,QAAQH,CAAO,GAClCzC,IAAQ,KAAK;AAEnB,KAAIC,IAAA,KAAK,SAAL,QAAAA,EAAW,QAAQD,EAAM,WAC3B,QAAME,KAAAF,EAAM,qBAAN,gBAAAE,GAAA,KAAAF;AAGR,UAAMuM,IAASvM,EAAM,MAAM,OAAO,CAACwD,MAAcA,EAAK,SAAS,OAAO,EAAE,KAAKM,EAAM,GAC7E6T,IAAiBzC,EAAoBlV,GAAOuM,CAAM,GAElDG,IAAU1M,EAAM,MAAM,OAAO,CAACwD,MAAcA,EAAK,SAAS,QAAQ,EAAE,KAAKM,EAAM,GAC/E8T,IAAS5X,EAAM,MAAM,OAAO,CAACwD,MAAcA,EAAK,SAAS,OAAO,EAAE,KAAKM,EAAM,GAC7E2I,IAAOzM,EAAM,MAAM,OAAO,CAACwD,MAAcA,EAAK,SAAS,MAAM,EAAE,KAAKM,EAAM,GAC1E+T,IAAiB,KAAK,MACzB,OAAO,CAACrU,MAAcA,EAAK,SAAS,aAAaA,EAAK,OAAO,QAAQ,EACrE,IAAI,CAACA,MAAcA,EAAK,IAAI,EAC5B,KAAA,GACGsU,IAAU/V,GAAA,GAEVgW,wBAAwB,IAAA;AAC9B,eAAW/V,KAASuK,GAAQ;AAC1B,YAAMzM,IAAM+B,EAAmBG,EAAM,IAAI;AACzC,MAAK+V,EAAkB,IAAIjY,CAAG,KAC5BiY,EAAkB,IAAIjY,GAAKkC,CAAK;AAAA,IAEpC;AAEA,UAAMgW,IAAehY,EAAM,OAAO,gBAAgB,CAAA,GAC5CiY,IAAmBtW,GAAsB,IAAI,CAACuW,MAAa;AAC/D,YAAMlC,IAAU1C,GAAqB4E,CAAQ,KAAKA,EAAS,YAAA,GACrDC,KAAOvW,GACV,OAAO,CAACI,MAAUA,EAAM,aAAakW,CAAQ,EAC7C,IAAI,CAAClW,MAAU;AbpXxB,YAAA/B;AaqXU,cAAMmM,IAAW2L,EAAkB,IAAIlW,EAAmBG,EAAM,IAAI,CAAC,GAC/DoW,KAAOhM,IAAWuL,EAAe,UAAU,IAAIvL,EAAS,EAAE,IAAI;AACpE,eAAO;AAAA,UACL,MAAMpK,EAAM;AAAA,UACZ,MAAMA,EAAM;AAAA,UACZ,UAAUA,EAAM;AAAA,UAChB,gBAAgBA,EAAM,kBAAkB;AAAA,UACxC,SAAQoK,KAAA,gBAAAA,EAAU,OAAM;AAAA,UACxB,OAAMA,KAAA,gBAAAA,EAAU,QAAOjK,GAAcH,EAAM,IAAI;AAAA,UAC/C,SAAO/B,KAAAmM,KAAA,gBAAAA,EAAU,WAAV,gBAAAnM,GAAkB,UAAS+B,EAAM;AAAA,UACxC,SAAS,CAACoK;AAAA,UACV,kBAAiBgM,MAAA,gBAAAA,GAAM,mBAAkB;AAAA,UACzC,aAAYA,MAAA,gBAAAA,GAAM,eAAc,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,EAAA;AAAA,QAAE;AAAA,MAE5E,CAAC;AAEH,aAAO;AAAA,QACL,UAAAF;AAAA,QACA,SAAAlC;AAAA,QACA,aAAazC,GAAyB2E,CAAQ,KAAK;AAAA,QACnD,WAAWlV,EAAIgV,EAAahC,CAAO,GAAG,CAAC;AAAA,QACvC,MAAAmC;AAAA,MAAA;AAAA,IAEJ,CAAC,GAEKE,IAAe9L,EAClB,OAAO,CAAC/I,MAAc,CAACsU,EAAQ,IAAIjW,EAAmB2B,EAAK,IAAI,CAAC,CAAC,EACjE,IAAI,CAACA,MAAc;AAClB,YAAM4U,IAAOT,EAAe,UAAU,IAAInU,EAAK,EAAE;AACjD,aAAO;AAAA,QACL,IAAIA,EAAK;AAAA,QACT,MAAMA,EAAK;AAAA,QACX,QAAQA,EAAK;AAAA,QACb,KAAKnB,GAAiBmB,EAAK,MAAMA,EAAK,OAAOvB,CAAkB;AAAA,QAC/D,kBAAiBmW,KAAA,gBAAAA,EAAM,mBAAkB;AAAA,QACzC,aAAYA,KAAA,gBAAAA,EAAM,eAAc,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,EAAA;AAAA,MAAE;AAAA,IAE5E,CAAC,GAEGE,IAAyBL,EAAiB;AAAA,MAC9C,CAACxX,GAAOqL,MAAUrL,IAAQqL,EAAM,KAAK,OAAO,CAAC0K,OAAQA,GAAI,OAAO,EAAE;AAAA,MAClE;AAAA,IAAA,GAGI7V,IAASZ,GAA0BC,CAAK,GACxCuY,IAAmB,IAAI,IAAI5X,EAAO,QAAQ,IAAI,CAAC3B,MAAU,CAACA,EAAM,MAAM,GAAGA,EAAM,GAAG,IAAIA,EAAM,GAAG,EAAE,CAAC,CAAC,GAEnGwZ,IADQ7X,EAAO,QAAQ,IAAI,CAAC3B,MAAUA,EAAM,IAAuB,EAC9C;AAAA,MAAI,CAACN,MAC9BgY,GAAuB1W,GAAOtB,GAAM6Z,EAAiB,IAAI7Z,CAAI,KAAK,EAAE;AAAA,IAAA,GAIhE+Z,IADkB9X,EAAO,UACO;AAAA,MAAI,CAACjC,MACzCgY,GAAuB1W,GAAOtB,GAAM6Z,EAAiB,IAAI7Z,CAAI,KAAK,EAAE;AAAA,IAAA,GAGhEga,MAAMvY,KAAAH,EAAM,WAAN,gBAAAG,GAAc,gBAAe,CAAA,GACnCwY,IAAS3V,EAAI0V,EAAI,WAAW,CAAC,GAC7BE,IAAe5V,EAAI0V,EAAI,iBAAiBC,CAAM,GAC9CE,IAAW7V,EAAI0V,EAAI,SAAS1V,GAAI0B,MAAAD,KAAAzE,EAAM,WAAN,gBAAAyE,GAAc,oBAAd,gBAAAC,GAA+B,KAAK,CAAC,CAAC,GACtEoU,IAAa9V,EAAI0V,EAAI,sBAAsB,CAAC,GAC5CK,IAAoB/V,GAAI4B,MAAAD,KAAA3E,EAAM,WAAN,gBAAA2E,GAAc,YAAd,gBAAAC,GAAuB,eAAe,CAAC,GAC/DoU,IAAyB,KAAK,IAAI,GAAGD,IAAoBD,CAAU,GACnEG,IAAqB,GAAGN,EAAO,QAAQ,CAAC,CAAC,kBAAkBC,EAAa,QAAQ,CAAC,CAAC,kBAAkBC,EAAS,QAAQ,CAAC,CAAC,kBAAkBC,CAAU,qBACnJI,IAAkB,GAAGlW,GAAImU,MAAA1O,KAAAzI,EAAM,WAAN,gBAAAyI,GAAc,YAAd,gBAAA0O,GAAuB,aAAanU,GAAIqU,MAAAD,KAAApX,EAAM,WAAN,gBAAAoX,GAAc,YAAd,gBAAAC,GAAuB,MAAM,CAAC,CAAC,CAAC,OAAOrU,GAAIuU,MAAAD,KAAAtX,EAAM,WAAN,gBAAAsX,GAAc,YAAd,gBAAAC,GAAuB,YAAYvU,GAAIyU,MAAAD,KAAAxX,EAAM,WAAN,gBAAAwX,GAAc,YAAd,gBAAAC,GAAuB,KAAK,CAAC,CAAC,CAAC;AAExL,WAAO;AAAA,MACL,GAAG7U;AAAA,MACH,QAAQ5C,EAAM;AAAA,MACd,QAAAuM;AAAA,MACA,kBAAA0L;AAAA,MACA,cAAAI;AAAA,MACA,wBAAAC;AAAA,MACA,SAAA5L;AAAA,MACA,QAAAkL;AAAA,MACA,MAAAnL;AAAA,MACA,gBAAAoL;AAAA,MACA,cAAAW;AAAA,MACA,eAAAC;AAAA,MACA,0BAA0BjZ,GAAA;AAAA,MAC1B,0BAA0B,OAAOQ,EAAM,OAAO,qBAAqB,MAAM;AAAA,MACzE,2BAA2BW,EAAO;AAAA,MAClC,8BAA8BA,EAAO;AAAA,MACrC,oBAAoB,IAAQ+W,KAAA1X,EAAM,WAAN,QAAA0X,GAAc;AAAA,MAC1C,mBAAAqB;AAAA,MACA,wBAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,SAAS;AAAA,QACP,WAAWvB,EAAe;AAAA,QAC1B,UAAUA,EAAe;AAAA,QACzB,SAASA,EAAe;AAAA,QACxB,cAAcA,EAAe;AAAA,QAC7B,cAAcA,EAAe,MAAM;AAAA,QACnC,gBAAgBA,EAAe;AAAA,MAAA;AAAA,IACjC;AAAA,EAEJ;AAAA,EAEA,MAAc,mBAAmBvC,GAAoC;AACnE,UAAM,KAAK,MAAM,OAAO;AAAA,MACtB,2BAA2B;AAAA,QACzB,UAAUA,EAAM;AAAA,QAChB,aAAaA,EAAM;AAAA,QACnB,eAAeA,EAAM;AAAA,MAAA;AAAA,IACvB,CACD;AAAA,EACH;AAAA,EAEA,MAAc,2BAA2BA,GAAoC;Able/E,QAAAnV,GAAAC,GAAAC,GAAAsE,GAAAC,GAAAC;AameI,UAAM4H,IAAS,KAAK,MAAM,MAAM,OAAO,CAAC/I,MAAcA,EAAK,SAAS,OAAO,GACrEmE,IAAiB,CAAA;AAEvB,eAAW3F,KAASuK,GAAQ;AAC1B,YAAM4H,IAAaN,GAAoBuB,EAAM,YAAYpT,EAAM,EAAE,CAAC,GAC5DvB,IAAQ0T,EAAW,YAAYA,EAAW,WAAWA,EAAW,SAEhE6B,IAAU1C,GAAqB,SAAOrT,IAAA+B,EAAM,WAAN,gBAAA/B,EAAc,aAAY,EAAE,CAAC,KAAK,IACxEgW,IAAUD,IAAU,KAAK,IAAI,GAAGpC,GAAMzT,KAAAD,IAAA,KAAK,MAAM,WAAX,gBAAAA,EAAmB,iBAAnB,gBAAAC,EAAkC6V,IAAU,CAAC,CAAC,IAAI;AAE9F,UAAIrH,IAAOyG,EAAM,cAAcpT,EAAM,EAAE;AACvC,UAAI,CAAC,OAAO,SAAS2M,CAAI,GAAG;AAC1B,cAAMwK,KAAW1U,IAAArC,GAAgBJ,EAAM,IAAI,MAA1B,gBAAAyC,EAA6B;AAC9C,QAAAkK,IAAO,KAAK,IAAI,GAAGwK,KAAanW,GAAI0B,IAAA1C,EAAM,WAAN,gBAAA0C,EAAc,OAAO,CAAC,IAAIjE,CAAM,GACpE2U,EAAM,cAAcpT,EAAM,EAAE,IAAI2M;AAAA,MAClC;AAEA,YAAM/P,IAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,IAAIqX,GAAStH,IAAOlO,CAAK,CAAC,CAAC;AACvE,MAAIuC,GAAI2B,IAAA3C,EAAM,WAAN,gBAAA2C,EAAc,OAAO,CAAC,MAAM/F,KAClC+I,EAAQ,KAAK,EAAE,KAAK3F,EAAM,IAAI,gBAAgBpD,GAAO;AAAA,IAEzD;AAEA,IAAI+I,EAAQ,UACV,MAAM,KAAK,MAAM,wBAAwB,QAAQA,CAAO;AAAA,EAE5D;AAAA,EAEA,MAAc,mBAAmB7F,GAAckS,GAA8B;Ab/f/E,QAAA/T;AaggBI,QAAI,CAAC,KAAK,kBAAmB;AAC7B,UAAMmZ,IAAU,OAAOtX,KAAQ,EAAE,EAAE,KAAA,GAC7BuX,IAAa,KAAK,IAAI,GAAG,KAAK,MAAM,OAAOrF,CAAK,KAAK,CAAC,CAAC;AAC7D,QAAI,CAACoF,KAAWC,KAAc,GAAG;AAC/B,OAAApZ,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK;AACvB;AAAA,IACF;AAEA,UAAMsM,IAAS,KAAK,MAAM,MAAM,OAAO,CAAC/I,MAAcA,EAAK,SAAS,OAAO,GACrE8V,IAAUpE,EAAoB,KAAK,OAAO3I,CAAM,GAChDgN,IAAY,QAAQ,MAAM,UAAUD,EAAQ,KAAK,GAEjDE,IAAgBD,EAAU,SAAS,UAAU,CAACva,MAAU6C,EAAmB7C,EAAM,IAAI,MAAM6C,EAAmBuX,CAAO,CAAC;AAC5H,IAAII,KAAiB,IACnBD,EAAU,SAASC,CAAa,EAAE,QAAQH,IAE1CE,EAAU,SAAS,KAAK,EAAE,MAAMH,GAAS,OAAOC,GAAY,GAG9D,MAAM,KAAK,mBAAmBE,CAAS;AAAA,EACzC;AAAA,EAEA,MAAc,cAAcE,GAA8B;AACxD,QAAI,CAAC,KAAK,kBAAmB;AAC7B,UAAMlN,IAAS,KAAK,MAAM,MAAM,OAAO,CAAC/I,MAAcA,EAAK,SAAS,OAAO,GACrE8V,IAAUpE,EAAoB,KAAK,OAAO3I,CAAM,GAChDgN,IAAY,QAAQ,MAAM,UAAUD,EAAQ,KAAK;AACvD,IAAIG,IAAQ,KAAKA,KAASF,EAAU,SAAS,WAE7CA,EAAU,SAAS,OAAOE,GAAO,CAAC,GAClC,MAAM,KAAK,mBAAmBF,CAAS;AAAA,EACzC;AAAA,EAEA,MAAc,0BAAyC;AACrD,QAAI,CAAC,KAAK,kBAAmB;AAC7B,UAAMhN,IAAS,KAAK,MAAM,MAAM,OAAO,CAAC/I,MAAcA,EAAK,SAAS,OAAO,GACrE8V,IAAUpE,EAAoB,KAAK,OAAO3I,CAAM,GAChDgN,IAAY,QAAQ,MAAM,UAAUD,EAAQ,KAAK;AAEvD,IAAAC,EAAU,cAAc,CAAA,GACxB,MAAM,KAAK,mBAAmBA,CAAS,GACvC,MAAM,KAAK,2BAA2BA,CAAS;AAAA,EACjD;AAAA,EAEA,MAAc,8BAA6C;Ab5iB7D,QAAAtZ,GAAAC,GAAAC,GAAAsE;Aa6iBI,QAAI,CAAC,KAAK,kBAAmB;AAC7B,YAAOvE,KAAAD,IAAA,KAAK,OAAc,qBAAnB,gBAAAC,EAAA,KAAAD;AAEP,UAAMsM,IAAS,KAAK,MAAM,MAAM,OAAO,CAAC/I,MAAcA,EAAK,SAAS,OAAO,EAAE,KAAKM,EAAM,GAClFwV,IAAUpE,EAAoB,KAAK,OAAO3I,CAAM,GAChDgN,IAAY,QAAQ,MAAM,UAAUD,EAAQ,KAAK,GAEjDI,IAAa,KAAK,IAAI,GAAGJ,EAAQ,aAAa,KAAK,GACnD9M,IAAW7B,GAAgB,IAAI,CAAC3L,MAAUA,EAAM,IAAI;AAG1D,QAFAua,EAAU,WAAW,CAAA,GAEjBG,IAAa,KAAKlN,EAAS,SAAS,GAAG;AACzC,YAAMmN,IAAe,KAAK;AAAA,QACxBnN,EAAS;AAAA,QACT,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAMkN,IAAa,CAAC,KAAK,CAAC,CAAC;AAAA,MAAA,GAGpDE,IAAY,CAAC,GAAGpN,CAAQ;AAC9B,eAASqN,IAAI,GAAGA,IAAIF,KAAgBC,EAAU,QAAQC,KAAK,GAAG;AAC5D,cAAMC,IAAM,KAAK,MAAM,KAAK,OAAA,IAAWF,EAAU,MAAM;AACvD,QAAAL,EAAU,SAAS,KAAK,EAAE,MAAMK,EAAUE,CAAG,GAAG,OAAO,GAAG,GAC1DF,EAAU,OAAOE,GAAK,CAAC;AAAA,MACzB;AAEA,UAAIC,IAAiBL,IAAaH,EAAU,SAAS;AACrD,aAAOQ,IAAiB,KAAKR,EAAU,SAAS,UAAQ;AACtD,cAAM/C,IAAMQ,GAAauC,EAAU,QAAQ;AAC3C,QAAA/C,EAAI,SAAS,GACbuD,KAAkB;AAAA,MACpB;AAAA,IACF;AAEA,UAAMC,IAAc/F,GAAsBsF,CAAS;AACnD,IAAAS,EAAY,cAAc,CAAA;AAE1B,UAAMC,IAAe/E;AAAA,MACnB,EAAE,GAAG,KAAK,OAAO,QAAQ,EAAE,GAAG,KAAK,MAAM,QAAQ,kBAAkB8E,IAAY;AAAA,MAC/EzN;AAAA,IAAA;AAGF,eAAWvK,KAASuK,GAAQ;AAC1B,YAAM6L,IAAO6B,EAAa,UAAU,IAAIjY,EAAM,EAAE;AAChD,MAAKoW,MACL4B,EAAY,cAAchY,EAAM,EAAE,IAAIoW,EAAK,WAC3C4B,EAAY,YAAYhY,EAAM,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,EAAA;AAAA,IAC5E;AAEA,UAAMkY,wBAAmB,IAAA;AACzB,eAAWlY,KAASuK;AAClB,MAAA2N,EAAa,IAAIlY,EAAM,IAAI,CAAC;AAG9B,UAAMmY,IAAc,CAACxW,MAA4B;AAC/C,YAAMyU,IAAO6B,EAAa,UAAU,IAAItW,CAAO;AAC/C,aAAOyU,IAAO,KAAK,IAAI,GAAGA,EAAK,aAAa,IAAI;AAAA,IAClD,GAEMgC,IAAe,CACnBC,GACAC,GACAC,MACW;AACX,UAAIC,IAAY,KAAK,IAAI,GAAGH,CAAM,GAC9BI,IAAQ;AAEZ,aAAOD,IAAY,KAAKC,IAAQ,OAAQ;AACtC,QAAAA,KAAS;AACT,cAAMC,IAAanO,EAAO,OAAO,CAACvK,MAAU;AAC1C,gBAAMoW,IAAO6B,EAAa,UAAU,IAAIjY,EAAM,EAAE;AAChD,iBAAI,CAACoW,KAAQ,CAACmC,EAASvY,GAAOoW,CAAI,IAAU,MAC1B8B,EAAa,IAAIlY,EAAM,EAAE,KAAK,KAC7BmY,EAAYnY,EAAM,EAAE;AAAA,QACzC,CAAC;AAED,YAAI,CAAC0Y,EAAW,OAAQ;AACxB,cAAMC,IAAS3D,GAAa0D,CAAU,GAChCxU,IAAU8T,EAAY,YAAYW,EAAO,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,EAAA;AAC5F,QAAAzU,EAAQoU,CAAO,KAAK,GACpBN,EAAY,YAAYW,EAAO,EAAE,IAAIzU,GACrCgU,EAAa,IAAIS,EAAO,KAAKT,EAAa,IAAIS,EAAO,EAAE,KAAK,KAAK,CAAC,GAClEH,KAAa;AAAA,MACf;AAEA,aAAOA;AAAA,IACT,GAEMI,IAAmBR;AAAA,MACvB,KAAK,IAAI,GAAGH,EAAa,UAAU,KAAK;AAAA,MACxC;AAAA,MACA,CAACjY,GAAOoW,MAASA,EAAK;AAAA,IAAA,GAGlByC,IAAkBT;AAAA,MACtB,KAAK,IAAI,GAAGH,EAAa,SAAS,KAAK;AAAA,MACvC;AAAA,MACA,CAACjY,GAAOoW,MAASA,EAAK;AAAA,IAAA,GAGlB0C,IAAiBV;AAAA,MACrB,KAAK,IAAI,GAAGH,EAAa,QAAQ,KAAK;AAAA,MACtC;AAAA,MACA,CAACjY,GAAOoW,MAASA,EAAK;AAAA,IAAA;AAGxB,eAAWpW,KAASuK,GAAQ;AAC1B,YAAM4H,IAAaN,GAAoBmG,EAAY,YAAYhY,EAAM,EAAE,CAAC;AACxE,MAAImS,EAAW,YAAYA,EAAW,WAAWA,EAAW,WAAW,KACrE,OAAO6F,EAAY,YAAYhY,EAAM,EAAE;AAAA,IAE3C;AAEA,UAAM,KAAK,mBAAmBgY,CAAW,GACzC,MAAM,KAAK,2BAA2BA,CAAW,GAE7CY,IAAmB,KAAKC,IAAkB,KAAKC,IAAiB,KAClE3a,IAAA,GAAG,kBAAH,QAAAA,EAAkB;AAAA,MAChB,8CAA8Cya,CAAgB,cAAcC,CAAe,aAAaC,CAAc;AAAA,SAGxHrW,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK;AAAA,EAE3B;AAAA,EAEA,MAAc,sBAAsBd,GAAgC;AbxqBtE,QAAA1D,GAAAC,GAAAC;AayqBI,QAAI,CAAC,KAAK,kBAAmB;AAC7B,UAAM6B,IAAQ,KAAK,MAAM,MAAM,IAAI2B,CAAO;AAC1C,QAAI,CAAC3B,KAASA,EAAM,SAAS,QAAS;AAEtC,UAAMuK,IAAS,KAAK,MAAM,MAAM,OAAO,CAAC/I,MAAcA,EAAK,SAAS,OAAO,GACrE8V,IAAUpE,EAAoB,KAAK,OAAO3I,CAAM,GAChD6L,IAAOkB,EAAQ,UAAU,IAAI3V,CAAO;AAC1C,QAAI,CAACyU,EAAM;AAEX,UAAMlS,IAAUkS,EAAK,YACf2C,IAAe,KAAK,IAAI,GAAGzB,EAAQ,UAAU,YAAYpT,EAAQ,SAAS,GAC1E8U,IAAc,KAAK,IAAI,GAAG1B,EAAQ,SAAS,YAAYpT,EAAQ,QAAQ,GACvE+U,IAAa,KAAK,IAAI,GAAG3B,EAAQ,QAAQ,YAAYpT,EAAQ,OAAO,GAEpEgV,IAAW,KAAK,IAAI,GAAG9C,EAAK,aAAa,GAEzCtV,IAAU;AAAA;AAAA;AAAA,sBAGEd,EAAM,OAAOC,CAAkB;AAAA;AAAA,kBAEnCD,EAAM,IAAI;AAAA,sBACNoW,EAAK,SAAS,gBAAgBA,EAAK,OAAO,eAAepV,GAAI/C,IAAA+B,EAAM,WAAN,gBAAA/B,EAAc,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,2BAI9EmY,EAAK,kBAAkB,KAAK,gBAAiB;AAAA,+DACV2C,CAAY,YAAY7U,EAAQ,SAAS,KAAKkS,EAAK,kBAAkB,KAAK,UAAU;AAAA;AAAA;AAAA,0BAGxHA,EAAK,iBAAiB,KAAK,4BAA6B;AAAA,8DACrB4C,CAAW,YAAY9U,EAAQ,QAAQ,KAAKkS,EAAK,iBAAiB,KAAK,UAAU;AAAA;AAAA;AAAA,mCAG3GA,EAAK,gBAAgB,KAAK,uBAAwB;AAAA,6DACzB6C,CAAU,YAAY/U,EAAQ,OAAO,KAAKkS,EAAK,gBAAgB,KAAK,UAAU;AAAA;AAAA;AAAA,wDAGnF8C,CAAQ,gBAAgB5B,EAAQ,UAAU,SAAS,cAAcA,EAAQ,SAAS,SAAS,aAAaA,EAAQ,QAAQ,SAAS;AAAA;AAAA,OAI/KtY,IAAS,MAAM,IAAI,QAAkC,CAACC,MAAY;AACtE,UAAI,OAAO;AAAA,QACT,OAAO,GAAGe,EAAM,IAAI;AAAA,QACpB,SAAAc;AAAA,QACA,SAAS;AAAA,UACP,MAAM;AAAA,YACJ,OAAO;AAAA,YACP,UAAU,CAAC/B,MAAiB;AAC1B,oBAAMoa,IAAOpa,EAAK,KAAK,MAAM,EAAE,CAAC;AAChC,kBAAI,CAACoa,GAAM;AACT,gBAAAla,EAAQ,IAAI;AACZ;AAAA,cACF;AACA,oBAAM2B,IAAO,IAAI,SAASuY,CAAI;AAC9B,cAAAla,EAAQ;AAAA,gBACN,WAAWmX,EAAK,kBAAkBxE,EAAMhR,EAAK,IAAI,WAAW,GAAGsD,EAAQ,SAAS,IAAIA,EAAQ;AAAA,gBAC5F,UAAUkS,EAAK,iBAAiBxE,EAAMhR,EAAK,IAAI,UAAU,GAAGsD,EAAQ,QAAQ,IAAIA,EAAQ;AAAA,gBACxF,SAASkS,EAAK,gBAAgBxE,EAAMhR,EAAK,IAAI,SAAS,GAAGsD,EAAQ,OAAO,IAAIA,EAAQ;AAAA,cAAA,CACrF;AAAA,YACH;AAAA,UAAA;AAAA,UAEF,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,UAAU,MAAMjF,EAAQ,IAAI;AAAA,UAAA;AAAA,QAC9B;AAAA,QAEF,SAAS;AAAA,QACT,OAAO,MAAMA,EAAQ,IAAI;AAAA,MAAA,CAC1B,EAAE,OAAO,EAAI;AAAA,IAChB,CAAC;AAED,QAAI,CAACD,EAAQ;AAEb,UAAMoa,IAAiBpa,EAAO,YAAYA,EAAO,WAAWA,EAAO;AACnE,QAAIoa,IAAiBF,GAAU;AAC7B,OAAAhb,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK,uDAAuDgb,CAAQ;AACtF;AAAA,IACF;AAEA,QAAIla,EAAO,YAAY+Z,KAAgB/Z,EAAO,WAAWga,KAAeha,EAAO,UAAUia,GAAY;AACnG,OAAA9a,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK;AACvB;AAAA,IACF;AAEA,UAAMoZ,IAAY,QAAQ,MAAM,UAAUD,EAAQ,KAAK;AACvD,IAAAC,EAAU,cAAcvX,EAAM,EAAE,IAAIoW,EAAK,WACrCgD,KAAkB,IACpB,OAAO7B,EAAU,YAAYvX,EAAM,EAAE,IAErCuX,EAAU,YAAYvX,EAAM,EAAE,IAAIhB,GAGpC,MAAM,KAAK,mBAAmBuY,CAAS,GACvC,MAAM,KAAK,2BAA2BA,CAAS;AAAA,EACjD;AAAA,EAEA,MAAc,wBAAwB8B,GAAsBC,GAA8B;Ab3wB5F,QAAArb,GAAAC;Aa6wBI,QAAI,EADc,oBAAI,IAAI,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,CAAC,GAC1E,IAAImb,CAAY,EAAG;AAElC,UAAM1M,IAAO,KAAK,IAAI,GAAGiF,GAAO1T,KAAAD,IAAA,KAAK,MAAc,WAAnB,gBAAAA,EAA2B,oBAA3B,gBAAAC,EAA6Cmb,IAAe,CAAC,CAAC,GACxFvY,IAAU;AAAA;AAAA;AAAA;AAAA,sCAIkB,QAAQ,MAAM,WAAWwY,CAAK,CAAC;AAAA;AAAA;AAAA;AAAA,wCAI7B3M,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAkBlC4M,IAAa,MAAM,IAAI,QAAuB,CAACta,MAAY;AAC/D,UAAIC,IAAU;AACd,YAAMC,IAAO,CAACvC,MAAyB;AACrC,QAAIsC,MACJA,IAAU,IACVD,EAAQrC,CAAK;AAAA,MACf;AAEA,UAAI,OAAO;AAAA,QACT,OAAO,GAAG0c,CAAK;AAAA,QACf,SAAAxY;AAAA,QACA,SAAS;AAAA,UACP,MAAM;AAAA,YACJ,OAAO;AAAA,YACP,UAAU,CAAC1B,MAAoB;AbxzB3C,kBAAAnB,GAAAC;AayzBc,oBAAMsb,IAAW,SAAQtb,KAAAD,IAAAmB,EAAQ,CAAC,MAAT,gBAAAnB,EAAY,cAAc,iCAA1B,gBAAAC,EAAqF,UAAS,CAAC,GAClHub,IAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAMD,KAAY,CAAC,CAAC,CAAC;AACzE,cAAAra,EAAKsa,CAAc;AAAA,YACrB;AAAA,UAAA;AAAA,UAEF,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,UAAU,MAAMta,EAAK,IAAI;AAAA,UAAA;AAAA,QAC3B;AAAA,QAEF,SAAS;AAAA,QACT,OAAO,MAAMA,EAAK,IAAI;AAAA,MAAA,CACvB,EAAE,OAAO,EAAI;AAAA,IAChB,CAAC;AAED,QAAI,CAACoa,EAAY;AACjB,UAAM5d,IAASsZ,GAAatI,IAAO4M,CAAU,GACvCva,IAAS,MAAMtD,GAAeC,CAAM;AAE1C,UAAMgF,GAAkB;AAAA,MACtB,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK,MAAM;AAAA,MACtB,UAAU,KAAK,MAAM;AAAA,MACrB,WAAW,GAAG2Y,CAAK,KAAKC,CAAU;AAAA,MAClC,UAAUtZ;AAAA,MACV,MAAMjB,EAAO;AAAA,MACb,QAAQA,EAAO;AAAA,MACf,cAAc5C,GAAa4C,EAAO,OAAO;AAAA,MACzC,WAAWA,EAAO;AAAA,MAClB,WAAWA,EAAO;AAAA,MAClB,UAAUA,EAAO;AAAA,IAAA,CAClB;AAAA,EACH;AAAA,EAEA,kBAAkBD,GAAoB;AACpC,UAAM,kBAAkBA,CAAI,GAE5BA,EAAK,KAAK,oBAAoB,EAAE,GAAG,SAAS,OAAOO,MAAU;Ab91BjE,UAAArB;Aa+1BM,MAAAqB,EAAM,eAAA;AACN,YAAM6E,IAAO,CAAC,KAAK,gBAAA;AACnB,YAAM,KAAK,MAAM,OAAO,EAAE,6BAA6BA,GAAM,IAC7DlG,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAKkG,IAAO,0BAA0B;AAAA,IAC1D,CAAC,GAEDpF,EAAK,KAAK,sBAAsB,EAAE,GAAG,SAAS,OAAOO,MAAU;AAC7D,MAAAA,EAAM,eAAA;AACN,YAAMC,IAASD,EAAM,eACfxB,IAAM,OAAOyB,EAAO,QAAQ,QAAQ,EAAE,EAAE,KAAA,EAAO,YAAA,GAC/C+Z,IAAQ,OAAO/Z,EAAO,QAAQ,SAASzB,EAAI,aAAa;AAC9D,MAAKA,KACL,MAAM,KAAK,wBAAwBA,GAAKwb,CAAK;AAAA,IAC/C,CAAC,GAEDva,EAAK,KAAK,cAAc,EAAE,GAAG,SAAS,OAAOO,MAAU;AACrD,MAAAA,EAAM,eAAA;AACN,YAAMwJ,IAAO,OAAQxJ,EAAM,cAA8B,QAAQ,QAAQ,MAAM,GACzEoa,IAAW,EAAE,MAAM,OAAO5Q,CAAI,IAAI,MAAAA,EAAA;AACxC,MAAIA,MAAS,YACX4Q,EAAI,MAAMzZ,GACVyZ,EAAI,SAAS,EAAE,OAAO,GAAG,UAAU,aAAa,gBAAgB,GAAA,IAElE,MAAM,KAAK,MAAM,wBAAwB,QAAQ,CAACA,CAAG,CAAC;AAAA,IACxD,CAAC,GAED3a,EAAK,KAAK,YAAY,EAAE,GAAG,SAAS,CAACO,MAAU;Abz3BnD,UAAArB;Aa03BM,MAAAqB,EAAM,eAAA;AACN,YAAMqa,IAAMra,EAAM,cAA8B,QAAQ,OAAO,GACzDkC,IAAOmY,IAAK,KAAK,MAAM,MAAM,IAAIA,EAAG,QAAQ,UAAU,EAAE,IAAI;AAClE,OAAA1b,IAAAuD,KAAA,gBAAAA,EAAM,UAAN,QAAAvD,EAAa,OAAO;AAAA,IACtB,CAAC,GAEDc,EAAK,KAAK,cAAc,EAAE,GAAG,SAAS,OAAOO,MAAU;AACrD,MAAAA,EAAM,eAAA;AACN,YAAMqa,IAAMra,EAAM,cAA8B,QAAQ,OAAO;AAC/D,MAAKqa,KAAA,QAAAA,EAAI,QAAQ,UACjB,MAAM,KAAK,MAAM,wBAAwB,QAAQ,CAACA,EAAG,QAAQ,MAAM,CAAC;AAAA,IACtE,CAAC,GAED5a,EAAK,KAAK,kBAAkB,EAAE,GAAG,SAAS,OAAOO,MAAU;AACzD,MAAAA,EAAM,eAAA;AACN,YAAMqa,IAAMra,EAAM,cAA8B,QAAQ,OAAO;AAC/D,MAAKqa,KAAA,QAAAA,EAAI,QAAQ,UACjB,MAAO,KAAK,MAAc,cAAcA,EAAG,QAAQ,MAAM;AAAA,IAC3D,CAAC,GAED5a,EAAK,KAAK,eAAe,EAAE,GAAG,SAAS,OAAOO,MAAU;AACtD,MAAAA,EAAM,eAAA;AACN,YAAMxB,IAAM,OAAQwB,EAAM,cAA8B,QAAQ,SAAS,EAAE;AAC3E,MAAKxB,KACL,MAAO,KAAK,MAAc,iBAAiBA,CAAG;AAAA,IAChD,CAAC,GAEDiB,EAAK,KAAK,kBAAkB,EAAE,GAAG,SAAS,OAAOO,MAAU;AACzD,MAAAA,EAAM,eAAA;AACN,YAAMqa,IAAMra,EAAM,cAA8B,QAAQ,OAAO;AAC/D,MAAKqa,KAAA,QAAAA,EAAI,QAAQ,UACjB,MAAO,KAAK,MAAc,cAAcA,EAAG,QAAQ,MAAM;AAAA,IAC3D,CAAC,GAED5a,EAAK,KAAK,uBAAuB,EAAE,GAAG,SAAS,OAAOO,MAAU;Ab55BpE,UAAArB;Aa65BM,MAAAqB,EAAM,eAAA;AACN,YAAMqa,IAAMra,EAAM,cAA8B,QAAQ,OAAO;AAC/D,UAAI,EAACqa,KAAA,QAAAA,EAAI,QAAQ,QAAQ;AACzB,YAAMnY,IAAO,KAAK,MAAM,MAAM,IAAImY,EAAG,QAAQ,MAAM;AACnD,UAAI,CAACnY,EAAM;AAEX,YAAMoY,IAAe,GAAS3b,IAAAuD,EAAK,WAAL,QAAAvD,EAAa,WACrCsN,IAAkC;AAAA,QACtC,KAAK/J,EAAK;AAAA,QACV,mBAAmBoY;AAAA,MAAA;AAErB,MAAIA,MACFrO,EAAO,eAAe,IAAI,KAE5B,MAAM,KAAK,MAAM,wBAAwB,QAAQ,CAACA,CAAM,CAAC;AAAA,IAC3D,CAAC,GAEDxM,EAAK,KAAK,qBAAqB,EAAE,GAAG,SAAS,OAAOO,MAAU;Ab96BlE,UAAArB;Aa+6BM,MAAAqB,EAAM,eAAA;AACN,YAAMqa,IAAMra,EAAM,cAA8B,QAAQ,OAAO;AAC/D,UAAI,EAACqa,KAAA,QAAAA,EAAI,QAAQ,QAAQ;AACzB,YAAMnY,IAAO,KAAK,MAAM,MAAM,IAAImY,EAAG,QAAQ,MAAM;AACnD,UAAI,CAACnY,EAAM;AAEX,YAAMqY,IAAa,GAAS5b,IAAAuD,EAAK,WAAL,QAAAvD,EAAa,SACnCsN,IAAkC;AAAA,QACtC,KAAK/J,EAAK;AAAA,QACV,iBAAiBqY;AAAA,MAAA;AAEnB,MAAIA,MACFtO,EAAO,iBAAiB,IAAI,KAE9B,MAAM,KAAK,MAAM,wBAAwB,QAAQ,CAACA,CAAM,CAAC;AAAA,IAC3D,CAAC,GAEDxM,EAAK,KAAK,oBAAoB,EAAE,GAAG,SAAS,OAAOO,MAAU;AAC3D,MAAAA,EAAM,eAAA,GACN,MAAO,KAAK,MAAc,gBAAA;AAAA,IAC5B,CAAC,GAEDP,EAAK,KAAK,mBAAmB,EAAE,GAAG,SAAS,OAAOO,MAAU;AAC1D,MAAAA,EAAM,eAAA,GACN,MAAM,KAAK,MAAM,OAAO;AAAA,QACtB,2BAA2B;AAAA,QAC3B,iCAAiC;AAAA,QACjC,0BAA0B;AAAA,QAC1B,2BAA2B;AAAA,QAC3B,wCAAwC;AAAA,QACxC,wCAAwC;AAAA,QACxC,wCAAwC;AAAA,QACxC,wCAAwC;AAAA,MAAA,CACzC;AAAA,IACH,CAAC,GAEDP,EAAK,KAAK,uBAAuB,EAAE,GAAG,SAAS,OAAOO,MAAU;Abn9BpE,UAAArB,GAAAC;Aao9BM,MAAAoB,EAAM,eAAA;AACN,YAAMwa,IAAQ,MAAO,KAAK,MAAc,iBAAA;AACxC,MAAIA,IAAQ,KAAG7b,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK,SAAS6b,CAAK,8BAC/C5b,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK;AAAA,IAC9B,CAAC,GAEDa,EAAK,KAAK,iBAAiB,EAAE,GAAG,SAAS,OAAOO,MAAU;AACxD,MAAAA,EAAM,eAAA;AACN,YAAMC,IAASD,EAAM,eACfQ,IAAO,OAAOP,EAAO,QAAQ,aAAa,EAAE,GAC5C2W,IAAW,OAAO3W,EAAO,QAAQ,iBAAiB,EAAE,GACpDoN,IAAO,OAAOpN,EAAO,QAAQ,aAAa,CAAC,GAC3Cwa,IAAiB,OAAOxa,EAAO,QAAQ,uBAAuB,EAAE;AACtE,MAAKO,KAEL,MAAM,KAAK,MAAM,wBAAwB,QAAQ,CAAC;AAAA,QAChD,MAAAA;AAAA,QACA,MAAM;AAAA,QACN,KAAKK,GAAcL,CAAI;AAAA,QACvB,QAAQ,EAAE,OAAO6M,GAAM,UAAAuJ,GAAU,gBAAA6D,EAAA;AAAA,MAAe,CACjD,CAAC;AAAA,IACJ,CAAC,GAEDhb,EAAK,KAAK,sBAAsB,EAAE,GAAG,SAAS,OAAOO,MAAU;Ab3+BnE,UAAArB,GAAAC;Aa4+BM,MAAAoB,EAAM,eAAA;AACN,YAAMuD,IAAQvD,EAAM,cAA8B,QAAQ,sBAAsB;AAChF,UAAI,CAACuD,EAAM;AACX,YAAM/C,IAAO,SAAQ7B,IAAA4E,EAAK,cAAc,sBAAsB,MAAzC,gBAAA5E,EAAyE,UAAS,EAAE,GACnG+T,IAAQ,SAAQ9T,IAAA2E,EAAK,cAAc,oBAAoB,MAAvC,gBAAA3E,EAAsE,UAAS,CAAC;AACtG,YAAM,KAAK,mBAAmB4B,GAAMkS,CAAK;AAAA,IAC3C,CAAC,GAEDjT,EAAK,KAAK,yBAAyB,EAAE,GAAG,SAAS,OAAOO,MAAU;Abp/BtE,UAAArB,GAAAC;Aaq/BM,MAAAoB,EAAM,eAAA;AACN,YAAMkV,IAAOlV,EAAM,cAA8B,QAAQ,sBAAsB;AAC/E,UAAI,CAACkV,EAAK;AACV,YAAM1U,IAAO,SAAQ7B,IAAAuW,EAAI,cAAc,uBAAuB,MAAzC,gBAAAvW,EAAyE,UAAS,EAAE,GACnG+T,IAAQ,SAAQ9T,IAAAsW,EAAI,cAAc,wBAAwB,MAA1C,gBAAAtW,EAAyE,UAAS,CAAC;AACzG,YAAM,KAAK,mBAAmB4B,GAAMkS,CAAK;AAAA,IAC3C,CAAC,GAEDjT,EAAK,KAAK,yBAAyB,EAAE,GAAG,SAAS,OAAOO,MAAU;AAChE,MAAAA,EAAM,eAAA;AACN,YAAMmY,IAAQ,OAAQnY,EAAM,cAA8B,QAAQ,SAAS,EAAE;AAC7E,MAAI,CAAC,OAAO,SAASmY,CAAK,KAAKA,IAAQ,KACvC,MAAM,KAAK,cAAcA,CAAK;AAAA,IAChC,CAAC,GAED1Y,EAAK,KAAK,uBAAuB,EAAE,GAAG,SAAS,OAAOO,MAAU;AbpgCpE,UAAArB;AaqgCM,MAAAqB,EAAM,eAAA,GACN,MAAM,KAAK,wBAAA,IACXrB,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK;AAAA,IACzB,CAAC,GAEDc,EAAK,KAAK,uBAAuB,EAAE,GAAG,SAAS,OAAOO,MAAU;Ab1gCpE,UAAArB,GAAAC,GAAAC;Aa4gCM,MADAmB,EAAM,eAAA,GACD,KAAK,sBACV,QAAOpB,KAAAD,IAAA,KAAK,OAAc,wBAAnB,gBAAAC,EAAA,KAAAD,MACPE,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK;AAAA,IACzB,CAAC,GAEDY,EAAK,KAAK,wBAAwB,EAAE,GAAG,SAAS,OAAOO,MAAU;AbjhCrE,UAAArB,GAAAC;AamhCM,MADAoB,EAAM,eAAA,GACD,KAAK,sBACV,QAAOpB,KAAAD,IAAA,KAAK,OAAc,qBAAnB,gBAAAC,EAAA,KAAAD,KACP,MAAM,KAAK,4BAAA;AAAA,IACb,CAAC,GAEDc,EAAK,KAAK,yBAAyB,EAAE,GAAG,SAAS,OAAOO,MAAU;AAChE,MAAAA,EAAM,eAAA;AACN,YAAMqa,IAAMra,EAAM,cAA8B,QAAQ,OAAO,GACzDqC,IAAU,QAAOgY,KAAA,gBAAAA,EAAI,QAAQ,WAAU,EAAE;AAC/C,MAAKhY,KACL,MAAM,KAAK,sBAAsBA,CAAO;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAEA,MAAgB,kBAAkBqY,GAA6B;AbjiCjE,QAAA/b,GAAAC,GAAAC;AakiCI,UAAMiR,IAAQ,MAAM,QAAQ4K,CAAQ,IAAIA,IAAW,CAACA,CAAQ,GACtDC,IAAe7K,EAAM,OAAO,CAACpS,OAAeA,KAAA,gBAAAA,EAAO,UAAS,SAAS,GACrEkd,IAAc9K,EAAM,OAAO,CAACpS,OAAeA,KAAA,gBAAAA,EAAO,UAAS,SAAS;AAE1E,eAAWW,KAAWsc;AACpB,cAAO/b,KAAAD,IAAA,KAAK,OAAc,qBAAnB,gBAAAC,EAAA,KAAAD,GAAsCN;AAE/C,QAAIsc,EAAa,SAAS,GAAG;AAC3B,YAAME,IAAQF,EAAa,IAAI,CAACjd,MAAe,QAAOA,KAAA,gBAAAA,EAAO,SAAQ,SAAS,CAAC,EAAE,KAAK,IAAI;AAC1F,OAAAmB,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK,6BAA6Bgc,CAAK;AAAA,IAC3D;AAEA,QAAID,EAAY,WAAW,EAAG,QAAO,CAAA;AAErC,UAAME,IAAUF,EAAY,IAAI,CAACld,OAC3BA,KAAA,gBAAAA,EAAO,UAAS,UAAgBA,IAC7B;AAAA,MACL,GAAGA;AAAA,MACH,KAAKqD,GAAiB,QAAOrD,KAAA,gBAAAA,EAAO,SAAQ,OAAO,GAAG,QAAOA,KAAA,gBAAAA,EAAO,QAAO,EAAE,CAAC;AAAA,IAAA,CAEjF;AACD,WAAO,MAAM,kBAAkB,MAAM,QAAQgd,CAAQ,IAAII,IAAUA,EAAQ,CAAC,CAAC;AAAA,EAC/E;AACF;ACvjCA,MAAM/I,KAAkB,QAAgB,MAAM,OAAO;AAE9C,MAAMgJ,WAA+BhJ,GAAe;AAAA,EACzD,WAAW,iBAAsB;AAC/B,WAAO,QAAQ,MAAM,YAAY,MAAM,gBAAgB;AAAA,MACrD,SAAS,CAAC,aAAa,SAAS,SAAS,UAAU;AAAA,MACnD,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ5Q,GAA6B;AACzC,UAAMG,IAAO,MAAM,MAAM,QAAQH,CAAO,GAClCzC,IAAQ,KAAK;AAEnB,WAAO;AAAA,MACL,GAAG4C;AAAA,MACH,QAAQ5C,EAAM;AAAA,MACd,QAAQA,EAAM,MAAM,OAAO,CAACwD,MAAcA,EAAK,SAAS,OAAO;AAAA,MAC/D,SAASxD,EAAM,MAAM,OAAO,CAACwD,MAAcA,EAAK,SAAS,QAAQ;AAAA,MACjE,cAAczD,GAA0BC,CAAK,EAAE,QAAQ,IAAI,CAAChB,MAAA;Ad1BlE,YAAAiB;Ac0B6E;AAAA,UACrE,MAAMjB,EAAM;AAAA,UACZ,WAAW,GAAGA,EAAM,GAAG,IAAIA,EAAM,GAAG;AAAA,UACpC,OAAOA,EAAM;AAAA,UACb,KAAIiB,IAAAD,EAAM,OAAO,iBAAb,gBAAAC,EAA4BjB,EAAM,UAAS,CAAA;AAAA,QAAC;AAAA,OAChD;AAAA,IAAA;AAAA,EAEN;AAAA,EAEA,kBAAkB+B,GAAoB;AACpC,UAAM,kBAAkBA,CAAI,GAE5BA,EAAK,KAAK,cAAc,EAAE,GAAG,SAAS,OAAOO,MAAU;AACrD,MAAAA,EAAM,eAAA;AACN,YAAMwJ,IAAO,OAAQxJ,EAAM,cAA8B,QAAQ,QAAQ,OAAO;AAChF,YAAM,KAAK,MAAM,wBAAwB,QAAQ,CAAC,EAAE,MAAM,OAAOwJ,CAAI,IAAI,MAAAA,EAAA,CAAM,CAAC;AAAA,IAClF,CAAC,GAED/J,EAAK,KAAK,YAAY,EAAE,GAAG,SAAS,CAACO,MAAU;Ad5CnD,UAAArB;Ac6CM,YAAM0b,IAAMra,EAAM,cAA8B,QAAQ,OAAO,GACzDkC,IAAOmY,IAAK,KAAK,MAAM,MAAM,IAAIA,EAAG,QAAQ,UAAU,EAAE,IAAI;AAClE,OAAA1b,IAAAuD,KAAA,gBAAAA,EAAM,UAAN,QAAAvD,EAAa,OAAO;AAAA,IACtB,CAAC,GAEDc,EAAK,KAAK,cAAc,EAAE,GAAG,SAAS,OAAOO,MAAU;AACrD,YAAMqa,IAAMra,EAAM,cAA8B,QAAQ,OAAO;AAC/D,MAAKqa,KAAA,QAAAA,EAAI,QAAQ,UACjB,MAAM,KAAK,MAAM,wBAAwB,QAAQ,CAACA,EAAG,QAAQ,MAAM,CAAC;AAAA,IACtE,CAAC,GAED5a,EAAK,KAAK,kBAAkB,EAAE,GAAG,SAAS,OAAOO,MAAU;AACzD,YAAMqa,IAAMra,EAAM,cAA8B,QAAQ,OAAO;AAC/D,MAAKqa,KAAA,QAAAA,EAAI,QAAQ,UACjB,MAAO,KAAK,MAAc,cAAcA,EAAG,QAAQ,MAAM;AAAA,IAC3D,CAAC,GAED5a,EAAK,KAAK,kBAAkB,EAAE,GAAG,SAAS,OAAOO,MAAU;AACzD,YAAMqa,IAAMra,EAAM,cAA8B,QAAQ,OAAO;AAC/D,MAAKqa,KAAA,QAAAA,EAAI,QAAQ,UACjB,MAAO,KAAK,MAAc,cAAcA,EAAG,QAAQ,MAAM;AAAA,IAC3D,CAAC,GAED5a,EAAK,KAAK,oBAAoB,EAAE,GAAG,SAAS,YAAY;AACtD,YAAO,KAAK,MAAc,gBAAA;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;ACxEA,MAAMsS,KAAkB,QAAgB,MAAM,OAAO;AAE9C,MAAMiJ,WAA8BjJ,GAAe;AAAA,EACxD,WAAW,iBAAsB;AAC/B,WAAO,QAAQ,MAAM,YAAY,MAAM,gBAAgB;AAAA,MACrD,SAAS,CAAC,aAAa,SAAS,SAAS,SAAS;AAAA,MAClD,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ5Q,GAA6B;AAEzC,WAAO;AAAA,MACL,GAFW,MAAM,MAAM,QAAQA,CAAO;AAAA,MAGtC,QAAS,KAAK,MAAc;AAAA,IAAA;AAAA,EAEhC;AACF;ACtBA,MAAM8Z,KAAiB,QAAgB,MAAM,OAAO;AAE7C,MAAMC,WAA4BD,GAAc;AAAA,EACrD,WAAW,iBAAsB;AAC/B,WAAO,QAAQ,MAAM,YAAY,MAAM,gBAAgB;AAAA,MACrD,SAAS,CAAC,aAAa,SAAS,QAAQ,OAAO;AAAA,MAC/C,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ9Z,GAA6B;AAEzC,WAAO;AAAA,MACL,GAFW,MAAM,MAAM,QAAQA,CAAO;AAAA,MAGtC,QAAS,KAAK,KAAa;AAAA,IAAA;AAAA,EAE/B;AAAA,EAEA,kBAAkB1B,GAAoB;AACpC,UAAM,kBAAkBA,CAAI,GAC5BA,EAAK,KAAK,aAAa,EAAE,GAAG,SAAS,OAAOO,MAAU;AACpD,MAAAA,EAAM,eAAA,GACN,MAAO,KAAK,KAAa,UAAA;AAAA,IAC3B,CAAC;AAAA,EACH;AACF;AC9BA,MAAMib,KAAiB,QAAgB,MAAM,OAAO;AAE7C,MAAME,WAA6BF,GAAc;AAAA,EACtD,WAAW,iBAAsB;AAC/B,WAAO,QAAQ,MAAM,YAAY,MAAM,gBAAgB;AAAA,MACrD,SAAS,CAAC,aAAa,SAAS,QAAQ,QAAQ;AAAA,MAChD,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ9Z,GAA6B;AACzC,UAAMG,IAAO,MAAM,MAAM,QAAQH,CAAO,GAClCzC,IAAQ,KAAK,KAAK;AAExB,WAAO;AAAA,MACL,GAAG4C;AAAA,MACH,QAAS,KAAK,KAAa;AAAA,MAC3B,QAAQ5C,IAAQA,EAAM,MAAM,OAAO,CAACwD,MAAcA,EAAK,SAAS,OAAO,IAAI,CAAA;AAAA,MAC3E,YAAYxD,IAAQA,EAAM,MAAM,OAAO,CAACwD,MAAcA,EAAK,SAAS,UAAUA,EAAK,OAAO,WAAW,IAAI,CAAA;AAAA,IAAC;AAAA,EAE9G;AAAA,EAEA,kBAAkBzC,GAAoB;AACpC,UAAM,kBAAkBA,CAAI,GAC5BA,EAAK,KAAK,aAAa,EAAE,GAAG,SAAS,OAAOO,MAAU;AACpD,MAAAA,EAAM,eAAA,GACN,MAAO,KAAK,KAAa,UAAA;AAAA,IAC3B,CAAC;AAAA,EACH;AACF;AClCA,MAAMib,KAAiB,QAAgB,MAAM,OAAO;AAE7C,MAAMG,WAA4BH,GAAc;AAAA,EACrD,WAAW,iBAAsB;AAC/B,WAAO,QAAQ,MAAM,YAAY,MAAM,gBAAgB;AAAA,MACrD,SAAS,CAAC,aAAa,SAAS,QAAQ,OAAO;AAAA,MAC/C,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ9Z,GAA6B;AAEzC,WAAO;AAAA,MACL,GAFW,MAAM,MAAM,QAAQA,CAAO;AAAA,MAGtC,QAAS,KAAK,KAAa;AAAA,IAAA;AAAA,EAE/B;AACF;ACtBA,MAAM8Z,KAAiB,QAAgB,MAAM,OAAO;AAE7C,MAAMI,WAA2BJ,GAAc;AAAA,EACpD,WAAW,iBAAsB;AAC/B,WAAO,QAAQ,MAAM,YAAY,MAAM,gBAAgB;AAAA,MACrD,SAAS,CAAC,aAAa,SAAS,QAAQ,MAAM;AAAA,MAC9C,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ9Z,GAA6B;AAEzC,WAAO;AAAA,MACL,GAFW,MAAM,MAAM,QAAQA,CAAO;AAAA,MAGtC,QAAS,KAAK,KAAa;AAAA,IAAA;AAAA,EAE/B;AACF;ACtBA,MAAM8Z,KAAiB,QAAgB,MAAM,OAAO;AAE7C,MAAMK,WAA8BL,GAAc;AAAA,EACvD,WAAW,iBAAsB;AAC/B,WAAO,QAAQ,MAAM,YAAY,MAAM,gBAAgB;AAAA,MACrD,SAAS,CAAC,aAAa,SAAS,QAAQ,SAAS;AAAA,MACjD,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ9Z,GAA6B;AAEzC,WAAO;AAAA,MACL,GAFW,MAAM,MAAM,QAAQA,CAAO;AAAA,MAGtC,QAAS,KAAK,KAAa;AAAA,IAAA;AAAA,EAE/B;AACF;ACtBA,MAAM8Z,KAAiB,QAAgB,MAAM,OAAO;AAEpD,SAASM,GAAQje,GAA0B;AACzC,SAAO,MAAM,QAAQA,CAAK,IAAIA,EAAM,IAAI,CAACI,MAAU,OAAOA,CAAK,CAAC,IAAI,CAAA;AACtE;AAEO,MAAM8d,WAA8BP,GAAc;AAAA,EACvD,WAAW,iBAAsB;AAC/B,WAAO,QAAQ,MAAM,YAAY,MAAM,gBAAgB;AAAA,MACrD,SAAS,CAAC,aAAa,SAAS,QAAQ,SAAS;AAAA,MACjD,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ9Z,GAA6B;AACzC,UAAMG,IAAO,MAAM,MAAM,QAAQH,CAAO,GAClC0O,IAAU,KAAK,KAAa,UAAU,CAAA,GACtC4L,IAAcF,GAAQ1L,EAAO,WAAW,GACxC6L,IAAiB,MAAM,QAAQ7L,EAAO,mBAAmB,IAC3DA,EAAO,oBAAoB,IAAI,CAACrF,OAAgB;AAAA,MAChD,QAAQ,QAAOA,KAAA,gBAAAA,EAAO,WAAU,CAAC;AAAA,MACjC,QAAQ+Q,GAAQ/Q,KAAA,gBAAAA,EAAO,MAAM;AAAA,IAAA,EAC7B,IACA,CAAA;AAEJ,WAAO;AAAA,MACL,GAAGlJ;AAAA,MACH,QAAAuO;AAAA,MACA,aAAA4L;AAAA,MACA,gBAAAC;AAAA,IAAA;AAAA,EAEJ;AACF;ACbA,MAAMC,KAAe,gBACfC,KAAsB,GAAG7e,CAAS,kBAClC8e,KAAoE;AAAA,EACxE,EAAE,OAAO,QAAQ,OAAO,qBAAA;AAAA,EACxB,EAAE,OAAO,OAAO,OAAO,oBAAA;AAAA,EACvB,EAAE,OAAO,SAAS,OAAO,eAAA;AAAA,EACzB,EAAE,OAAO,SAAS,OAAO,kBAAA;AAAA,EACzB,EAAE,OAAO,cAAc,OAAO,mBAAA;AAAA,EAC9B,EAAE,OAAO,WAAW,OAAO,iBAAA;AAC7B,GACMC,KAAoE;AAAA,EACxE,EAAE,OAAO,QAAQ,OAAO,qBAAA;AAAA,EACxB,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,EACxB,EAAE,OAAO,QAAQ,OAAO,+BAAA;AAAA,EACxB,EAAE,OAAO,eAAe,OAAO,qBAAA;AACjC;AAEA,SAASpa,EAAIpE,GAAgBkC,IAAW,GAAW;AACjD,QAAMmC,IAAI,OAAOrE,CAAK;AACtB,SAAO,OAAO,SAASqE,CAAC,IAAIA,IAAInC;AAClC;AAEA,SAASuc,EAAIze,GAAwB;AACnC,SAAO,OAAOA,KAAS,EAAE,EACtB,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAM,QAAQ;AAC9B;AAEO,SAAS0e,GAAqB3M,GAAqB;AACxD,SAAIA,KAAO,IAAU,IACjBA,KAAO,IAAU,IACjBA,KAAO,KAAW,IAClBA,KAAO,KAAW,IAClBA,KAAO,KAAW,IAClBA,KAAO,KAAW,IACf;AACT;AAEA,SAAS4M,GAAgBC,GAA0B;AACjD,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,OAAOA,CAAI;AAAA,EAAA;AAExB;AAEA,SAASC,EAAmBC,GAAwB;AtB3FpD,MAAAzd,GAAAC,GAAAC;AsB4FE,SAAO,KAAK,IAAI,GAAG6C,GAAI7C,KAAAD,KAAAD,IAAAyd,KAAA,gBAAAA,EAAW,UAAX,gBAAAzd,EAAkB,WAAlB,gBAAAC,EAA0B,oBAA1B,gBAAAC,EAA2C,KAAK,EAAE,CAAC;AAC5E;AAEA,SAASwd,GAA0BD,GAAwB;AtB/F3D,MAAAzd,GAAAC;AsBgGE,QAAM0d,IAAW5a,GAAI9C,KAAAD,IAAAyd,KAAA,gBAAAA,EAAW,UAAX,gBAAAzd,EAAmB5B,OAAnB,gBAAA6B,EAA+B,eAAe,CAAC;AACpE,SAAI0d,IAAW,IAAUA,IAClBN,GAAqBG,EAAmBC,CAAS,CAAC;AAC3D;AAEA,SAASG,GAAwBH,GAAwB;AtBrGzD,MAAAzd,GAAAC,GAAAC;AsBsGE,QAAM2d,IAAY9a,GAAI7C,KAAAD,KAAAD,IAAAyd,KAAA,gBAAAA,EAAW,UAAX,gBAAAzd,EAAkB,WAAlB,gBAAAC,EAA0B,gBAA1B,gBAAAC,EAAuC,sBAAsB,CAAC;AACpF,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM2d,CAAS,CAAC;AAC1C;AAEA,eAAeC,GAA2BL,GAAiC;AtB1G3E,MAAAzd,GAAAC;AsB2GE,QAAM8d,IAAUV,GAAqBG,EAAmBC,CAAS,CAAC;AAElE,SADiB1a,GAAI9C,KAAAD,IAAAyd,KAAA,gBAAAA,EAAW,UAAX,gBAAAzd,EAAmB5B,OAAnB,gBAAA6B,EAA+B,eAAe,CAAC,MACnD8d,KACf,MAAMN,EAAU,OAAO,EAAE,CAAC,SAASrf,CAAS,gBAAgB,GAAG2f,GAAS,GAEnEA;AACT;AAEA,SAASC,GAAgBC,GAA2B;AAClD,QAAMpK,IAAM,QAAQ,MAAM,UAAUoK,EAAO,QAAQ7f,GAAW4e,EAAY,KAAK,EAAE,GAC3EkB,IAAQ,MAAM,QAAQrK,EAAI,KAAK,IAAIA,EAAI,QAAQ,CAAA;AACrD,SAAO;AAAA,IACL,gBAAgB,KAAK,IAAI,GAAG9Q,EAAI8Q,EAAI,gBAAgB,CAAC,CAAC;AAAA,IACtD,OAAAqK;AAAA,EAAA;AAEJ;AAEA,eAAeC,GAAgBF,GAAa9I,GAAoC;AAC9E,QAAM8I,EAAO,QAAQ7f,GAAW4e,IAAc;AAAA,IAC5C,gBAAgB,KAAK,IAAI,GAAGja,EAAIoS,EAAM,gBAAgB,CAAC,CAAC;AAAA,IACxD,OAAO,MAAM,QAAQA,EAAM,KAAK,IAAIA,EAAM,QAAQ,CAAA;AAAA,EAAC,CACpD;AACH;AAEA,SAASiJ,GAAsBF,GAAsBD,GAA4B;AAC/E,SAAO,CAAC,GAAGC,CAAK,EAAE,KAAK,CAAC,GAAGxK,MAAM;AAC/B,QAAI,EAAE,oBAAoBA,EAAE,gBAAiB,QAAO,EAAE,kBAAkBA,EAAE;AAC1E,UAAM2K,IAAOb,EAAmBS,EAAO,WAAW,IAAI,EAAE,WAAW,CAAC;AAEpE,WADaT,EAAmBS,EAAO,WAAW,IAAIvK,EAAE,WAAW,CAAC,IACtD2K;AAAA,EAChB,CAAC;AACH;AAEA,SAASC,GAAuBJ,GAAsBD,GAA4B;AAChF,QAAMM,IAAW,IAAI,IAAIN,EAAO,WAAW,IAAI,CAACO,MAAWA,EAAE,EAAE,CAAC;AAChE,SAAON,EAAM,OAAO,CAACnf,MAAUwf,EAAS,IAAIxf,EAAM,WAAW,CAAC;AAChE;AAEA,SAAS0f,KAAwD;AAC/D,MAAI;AACF,UAAM5K,IAAM,aAAa,QAAQoJ,EAAmB;AACpD,QAAI,CAACpJ,EAAK,QAAO;AACjB,UAAM6K,IAAS,KAAK,MAAM7K,CAAG,GACvB8K,IAAO5b,EAAI2b,KAAA,gBAAAA,EAAQ,MAAM,GAAG,GAC5BE,IAAM7b,EAAI2b,KAAA,gBAAAA,EAAQ,KAAK,GAAG;AAChC,WAAI,CAAC,OAAO,SAASC,CAAI,KAAK,CAAC,OAAO,SAASC,CAAG,IAAU,OACrD,EAAE,MAAAD,GAAM,KAAAC,EAAA;AAAA,EACjB,QAAe;AACb,WAAO;AAAA,EACT;AACF;AAEA,SAASC,GAAgBC,GAA+C;AACtE,MAAI;AACF,iBAAa;AAAA,MACX7B;AAAA,MACA,KAAK,UAAU,EAAE,MAAM,KAAK,MAAM6B,EAAS,IAAI,GAAG,KAAK,KAAK,MAAMA,EAAS,GAAG,GAAG;AAAA,IAAA;AAAA,EAErF,QAAe;AAAA,EAEf;AACF;AAEA,SAASC,KAAyB;AAChC,MAAI;AACF,iBAAa,WAAW9B,EAAmB;AAAA,EAC7C,QAAe;AAAA,EAEf;AACF;AAEA,SAAS+B,GAAiBF,GAAyCG,GAAqD;AAEtH,QAAMC,IAAQD,EAAQ,eAAe,KAC/BE,IAASF,EAAQ,gBAAgB,KACjCG,IAAU,KAAK,IAAI,GAAQ,OAAO,aAAaF,IAAQ,CAAM,GAC7DG,IAAS,KAAK,IAAI,GAAQ,OAAO,cAAcF,IAAS,CAAM;AACpE,SAAO;AAAA,IACL,MAAM,KAAK,IAAI,KAAK,IAAI,GAAQL,EAAS,IAAI,GAAGM,CAAO;AAAA,IACvD,KAAK,KAAK,IAAI,KAAK,IAAI,GAAQN,EAAS,GAAG,GAAGO,CAAM;AAAA,EAAA;AAExD;AAEA,SAASC,GAAyBC,GAAaT,GAA+C;AAC5F,QAAMU,IAAKD,EAAI,IAAI,CAAC;AACpB,MAAI,CAACC,EAAI;AACT,QAAMC,IAAUT,GAAiBF,GAAUU,CAAE;AAC7C,EAAAD,EAAI,IAAI;AAAA,IACN,MAAM,GAAGE,EAAQ,IAAI;AAAA,IACrB,KAAK,GAAGA,EAAQ,GAAG;AAAA,IACnB,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA,CACT;AACH;AAEA,SAASC,GAAiBH,GAAmB;AAC3C,QAAMC,IAAKD,EAAI,IAAI,CAAC;AACpB,MAAI,CAACC,EAAI;AAET,QAAMG,IAASJ,EAAI,KAAK,mBAAmB;AAC3C,MAAI,CAACI,EAAO,OAAQ;AAEpB,QAAMC,IAAQnB,GAAA;AACd,EAAImB,KACFN,GAAyBC,GAAKK,CAAK;AAGrC,MAAIC,IAAW,IACXC,IAAS,GACTC,IAAS,GACTC,IAAY,GACZC,IAAW;AAEf,EAAAN,EAAO,GAAG,aAAa,CAACte,MAAU;AtB5NpC,QAAArB;AsB6NI,UAAMkgB,IAAa7e;AAEnB,QADI6e,EAAW,WAAW,MACrBlgB,IAAAkgB,EAAW,WAAX,QAAAlgB,EAAmC,QAAQ,UAAW;AAC3D,IAAAkgB,EAAW,eAAA;AAEX,UAAMC,IAAOX,EAAG,sBAAA;AAChB,IAAAM,IAASI,EAAW,SACpBH,IAASG,EAAW,SACpBF,IAAYG,EAAK,MACjBF,IAAWE,EAAK,KAChBN,IAAW,IAEXN,EAAI,SAAS,UAAU,GACvBA,EAAI,IAAI,EAAE,MAAM,GAAGS,CAAS,MAAM,KAAK,GAAGC,CAAQ,MAAM,OAAO,QAAQ,QAAQ,QAAQ,GAEvF,EAAE,QAAQ,EAAE,GAAG,qCAAqC,CAACG,MAAc;AACjE,UAAI,CAACP,EAAU;AACf,YAAMQ,IAAMD,GACNE,IAASD,EAAI,UAAUP,GACvBS,IAASF,EAAI,UAAUN;AAC7B,MAAAT,GAAyBC,GAAK,EAAE,MAAMS,IAAYM,GAAQ,KAAKL,IAAWM,GAAQ;AAAA,IACpF,CAAC,GAED,EAAE,QAAQ,EAAE,IAAI,mCAAmC,MAAM;AACvD,MAAAV,IAAW,IACXN,EAAI,YAAY,UAAU,GAC1B,EAAE,QAAQ,EAAE,IAAI,mCAAmC;AACnD,YAAMiB,IAAahB,EAAG,sBAAA;AACtB,MAAAX,GAAgB,EAAE,MAAM2B,EAAW,MAAM,KAAKA,EAAW,KAAK;AAAA,IAChE,CAAC;AAAA,EACH,CAAC,GAEDb,EAAO,GAAG,YAAY,MAAM;AAC1B,IAAAZ,GAAA,GACAQ,EAAI,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,OAAO,IAAI,QAAQ,GAAA,CAAI;AAAA,EACtD,CAAC;AACH;AAEA,SAASkB,GAAkBxC,GAAaC,GAMrC;AACD,SAAOE,GAAsBE,GAAuBJ,GAAOD,CAAM,GAAGA,CAAM,EAAE,IAAI,CAAClf,MAAU;AACzF,UAAM0e,IAAYQ,EAAO,WAAW,IAAIlf,EAAM,WAAW;AACzD,WAAO;AAAA,MACL,aAAaA,EAAM;AAAA,MACnB,MAAM,QAAO0e,KAAA,gBAAAA,EAAW,SAAQ,SAAS;AAAA,MACzC,OAAOH,GAAgBve,EAAM,IAAI;AAAA,MACjC,iBAAiBA,EAAM;AAAA,MACvB,KAAKye,EAAmBC,CAAS;AAAA,IAAA;AAAA,EAErC,CAAC;AACH;AAEA,SAASiD,GAAsBxI,GAA4CyI,IAAQ,GAAW;AAC5F,SAAKzI,EAAK,SACHA,EAAK,MAAM,GAAGyI,CAAK,EAAE,IAAI,CAACpK,MAAQ;AAAA,sDACW6G,EAAI7G,EAAI,WAAW,CAAC;AAAA,uCACnC6G,EAAI7G,EAAI,IAAI,CAAC;AAAA,yCACX6G,EAAI7G,EAAI,KAAK,CAAC,MAAMA,EAAI,eAAe;AAAA;AAAA,GAE7E,EAAE,KAAK,EAAE,IANe;AAO3B;AAEA,SAASqK,GAAsBhc,GAAcqZ,GAAmB;AtBhShE,MAAAje;AsBiSE,QAAM6gB,IAAW,GAAA7gB,IAAA,KAAK,SAAL,QAAAA,EAAW;AAC5B,EAAA4E,EAAK,KAAK,eAAe,EAAE,KAAK,YAAYic,CAAQ,EAAE,GAAG,SAAS,OAAOxf,MAAU;AACjF,IAAAA,EAAM,eAAA,GACN,MAAMyf,GAAe7C,GAAQ,MAAM;AAAA,EACrC,CAAC,GACDrZ,EAAK,KAAK,eAAe,EAAE,KAAK,YAAYic,CAAQ,EAAE,GAAG,SAAS,OAAOxf,MAAU;AACjF,IAAAA,EAAM,eAAA,GACN,MAAMyf,GAAe7C,GAAQ,MAAM;AAAA,EACrC,CAAC,GACDrZ,EAAK,KAAK,gBAAgB,EAAE,KAAK,YAAYic,CAAQ,EAAE,GAAG,SAAS,OAAOxf,MAAU;AAClF,IAAAA,EAAM,eAAA,GACN,MAAM0f,GAAqB9C,CAAM;AAAA,EACnC,CAAC;AACH;AAEA,SAAS+C,GAAwB/C,GAA0B;AtBhT3D,MAAAje;AsBiTE,QAAMihB,KAAUjhB,IAAA,yBAAY,SAAZ,gBAAAA,EAAkB;AAGlC,MAFI,EAACihB,KAAA,QAAAA,EAAQ,YACbA,EAAO,KAAK,gCAAgC,EAAE,OAAA,GAC1C,CAAChD,GAAQ;AAEb,QAAM9I,IAAQ6I,GAAgBC,CAAM,GAC9B/F,IAAOuI,GAAkBxC,GAAQ9I,EAAM,KAAK,GAC5C+L,IAAS,EAAE;AAAA;AAAA;AAAA,0BAGO/L,EAAM,cAAc;AAAA,uBACvB+C,EAAK,MAAM;AAAA;AAAA,sCAEIwI,GAAsBxI,GAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOjE;AACD,EAAA0I,GAAsBM,GAAQjD,CAAM,GACpCgD,EAAO,QAAQC,CAAM;AACvB;AAEA,SAASC,GAAyBlD,GAA0B;AAG1D,MAFiB,EAAE,wBAAwB,EAClC,OAAA,GACL,CAACA,EAAQ;AAEb,QAAM9I,IAAQ6I,GAAgBC,CAAM,GAC9B/F,IAAOuI,GAAkBxC,GAAQ9I,EAAM,KAAK,GAC5CoK,IAAM,EAAE;AAAA;AAAA;AAAA,0BAGUpK,EAAM,cAAc;AAAA,uBACvB+C,EAAK,MAAM;AAAA;AAAA,sCAEIwI,GAAsBxI,GAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOjE;AACD,EAAA0I,GAAsBrB,GAAKtB,CAAM,GACjC,EAAE,MAAM,EAAE,OAAOsB,CAAG,GACpBG,GAAiBH,CAAG;AACtB;AAEA,SAAS6B,EAAuBnD,GAA0B;AACxD,EAAA+C,GAAwB/C,CAAM,GAC9BkD,GAAyBlD,CAAM;AACjC;AAEA,eAAeoD,KAAoC;AtBzWnD,MAAArhB,GAAAC;AsB0WE,UAAID,IAAA,KAAK,SAAL,QAAAA,EAAW,OAAa,OAC5BC,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK,yDAChB;AACT;AAEA,eAAeqhB,GACbrD,GACAsD,GACAhE,GACAiE,GACe;AtBpXjB,MAAAxhB,GAAAC,GAAAC,GAAAsE;AsBqXE,MAAI,CAAE,MAAM6c,KAAoB;AAEhC,QAAM5D,IAAYQ,EAAO,WAAW,IAAIsD,CAAW;AACnD,MAAI,CAAC9D,EAAW;AAEhB,QAAMtI,IAAQ6I,GAAgBC,CAAM,GAC9BwD,IAAiBtM,EAAM,gBACvBuM,IAAgB,MAAM5D,GAA2BL,CAAS,GAC1D5E,IAAa+E,GAAwBH,CAAS,GAC9CkE,IAAa5e,GAAI9C,KAAAD,IAAAyd,EAAU,UAAV,gBAAAzd,EAAkB5B,OAAlB,gBAAA6B,EAA8B,iBAAiB,CAAC,GACjE2hB,IAAc,KAAK,IAAI,GAAGF,IAAgB7I,CAAU,GAEpDgJ,IAAW,KAAK,IAAI,IADLL,IAAQI,IAAc,KACCD,CAAU,GAChDG,IAAkBL,IAAiBI,GAEnCxgB,IAAqB;AAAA,IACzB,IAAI,QAAQ,MAAM,SAAA;AAAA,IAClB,WAASnB,IAAAud,EAAU,UAAV,gBAAAvd,EAAiB,OAAM;AAAA,IAChC,aAAAqhB;AAAA,IACA,MAAAhE;AAAA,IACA,OAAAiE;AAAA,IACA,cAAcC;AAAA,IACd,iBAAAK;AAAA,EAAA,GAGIC,IAAwBzD;AAAA,IAC5BnJ,EAAM,MAAM,OAAO,CAACpW,MAAUA,EAAM,gBAAgBwiB,CAAW;AAAA,IAC/DtD;AAAA,EAAA;AAEF,EAAA8D,EAAsB,KAAK1gB,CAAK,GAEhC,MAAM8c,GAAgBF,GAAQ;AAAA,IAC5B,gBAAAwD;AAAA,IACA,OAAOrD,GAAsB2D,GAAuB9D,CAAM;AAAA,EAAA,CAC3D,GAED,MAAMR,EAAU,OAAO;AAAA,IACrB,CAAC,SAASrf,CAAS,iBAAiB,GAAGiD,EAAM;AAAA,IAC7C,CAAC,SAASjD,CAAS,cAAc,GAAGmf;AAAA,IACpC,CAAC,SAASnf,CAAS,gBAAgB,GAAGsjB;AAAA,IACtC,CAAC,SAAStjB,CAAS,yBAAyB,GAAGwjB;AAAA,EAAA,CAChD;AAED,QAAMI,IAAcR,IAChB,MAAME,CAAa,UAAU7I,CAAU,GAAG8I,IAAa,IAAIA,IAAa,IAAI,MAAM,EAAE,QAAQA,CAAU,KAAK,EAAE,KAC7G,UAAUA,IAAa,IAAIA,IAAa,IAAI,MAAM,EAAE,QAAQA,CAAU,KAAK,EAAE;AACjF,GAAAnd,IAAA,GAAG,kBAAH,QAAAA,EAAkB;AAAA,IAChB,GAAGiZ,EAAU,IAAI,KAAKH,GAAgBC,CAAI,CAAC,yBAAyBuE,CAAe,KAAKE,CAAW,OAAOH,CAAQ;AAAA,KAEpHT,EAAuBnD,CAAM;AAC/B;AAEA,eAAegE,GAAahE,GAAasD,GAAoC;AAC3E,MAAI,CAAE,MAAMF,KAAoB;AAEhC,QAAM5D,IAAYQ,EAAO,WAAW,IAAIsD,CAAW;AACnD,MAAI,CAAC9D,EAAW;AAEhB,QAAMtI,IAAQ6I,GAAgBC,CAAM,GAC9BiE,IAAY5D;AAAA,IAChBnJ,EAAM,MAAM,OAAO,CAACpW,MAAUA,EAAM,gBAAgBwiB,CAAW;AAAA,IAC/DtD;AAAA,EAAA;AAGF,QAAME,GAAgBF,GAAQ;AAAA,IAC5B,gBAAgB9I,EAAM;AAAA,IACtB,OAAOiJ,GAAsB8D,GAAWjE,CAAM;AAAA,EAAA,CAC/C,GAED,MAAMR,EAAU,OAAO;AAAA,IACrB,CAAC,SAASrf,CAAS,iBAAiB,GAAG;AAAA,IACvC,CAAC,SAASA,CAAS,cAAc,GAAG;AAAA,IACpC,CAAC,SAASA,CAAS,WAAW,GAAG;AAAA,MAC/B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,cAAc;AAAA,IAAA;AAAA,EAChB,CACD,GACDgjB,EAAuBnD,CAAM;AAC/B;AAEA,eAAekE,GAAmBlE,GAAa5c,GAAoB+gB,GAAgC;AtBtcnG,MAAApiB;AsBucE,QAAMyd,IAAYQ,EAAO,WAAW,IAAI5c,EAAM,WAAW;AACzD,MAAI,CAACoc,EAAW;AAEhB,QAAM/V,IAAmC;AAAA,IACvC,CAAC,SAAStJ,CAAS,iBAAiB,GAAG;AAAA,IACvC,CAAC,SAASA,CAAS,cAAc,GAAG;AAAA,EAAA;AAGtC,EAAIiD,EAAM,SAAS,UACjBqG,EAAQ,SAAStJ,CAAS,WAAW,IAAI;AAAA,IACvC,QAAQ;AAAA,IACR,UAAUiD,EAAM,iBAAiB;AAAA,IACjC,cAAc+gB;AAAA,EAAA,IAIlB,MAAM3E,EAAU,OAAO/V,CAAO;AAE9B,QAAM7E,IAAU;AAAA;AAAA,oBAEEuf,CAAO;AAAA,mBACRhF,EAAIK,EAAU,IAAI,CAAC,+BAA+BL,EAAIE,GAAgBjc,EAAM,IAAI,CAAC,CAAC;AAAA,sBAC/Emc,EAAmBC,CAAS,CAAC,SAASC,GAA0BD,CAAS,CAAC;AAAA;AAAA;AAG9F,QAAM,YAAY,OAAO;AAAA,IACvB,OAAMzd,IAAA,KAAK,SAAL,gBAAAA,EAAW;AAAA,IACjB,SAAS,YAAY,WAAW,EAAE,OAAOyd,EAAU,SAAS,QAAW;AAAA,IACvE,SAAA5a;AAAA,EAAA,CACD;AACH;AAEA,eAAeie,GAAe7C,GAAa9d,GAAsC;AtBvejF,MAAAH;AsBweE,MAAI,CAAE,MAAMqhB,KAAoB;AAEhC,QAAMlM,IAAQ6I,GAAgBC,CAAM,GAC9BC,IAAQE,GAAsBE,GAAuBnJ,EAAM,OAAO8I,CAAM,GAAGA,CAAM,GACjFhY,IAAUkP,EAAM;AAEtB,MAAIkN,IAAgBpc,IAAU;AAC9B,MAAI9F,MAAS,QAAQ;AACnB,UAAM+F,IAAOgY,EACV,IAAI,CAAC7c,MAAUA,EAAM,eAAe,EACpC,OAAO,CAAC+gB,MAAYA,KAAWnc,CAAO,EACtC,KAAK,CAACwN,GAAGC,MAAMD,IAAIC,CAAC,EAAE,CAAC;AAC1B,IAAI,OAAO,SAASxN,CAAI,MACtBmc,IAAgBnc;AAAA,EAEpB;AAEA,QAAMoc,IAAapE,EAAM,OAAO,CAAC7c,MAAUA,EAAM,oBAAoBghB,CAAa,GAC5E9H,IAAY2D,EAAM,OAAO,CAAC7c,MAAUA,EAAM,oBAAoBghB,CAAa;AAEjF,QAAMlE,GAAgBF,GAAQ;AAAA,IAC5B,gBAAgBoE;AAAA,IAChB,OAAO9H;AAAA,EAAA,CACR;AAED,QAAMgI,IAAUnE,GAAsBkE,GAAYrE,CAAM;AACxD,aAAW5c,KAASkhB;AAClB,UAAMJ,GAAmBlE,GAAQ5c,GAAOghB,CAAa;AAGvD,EAAKE,EAAQ,WACXviB,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK,uBAAuBqiB,CAAa,MAE7DjB,EAAuBnD,CAAM;AAC/B;AAEA,eAAe8C,GAAqB9C,GAA4B;AAC9D,MAAM,MAAMoD,MAEZ;AAAA,UAAMlD,GAAgBF,GAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAA,GAAI;AAE9D,eAAWR,KAAaQ,EAAO;AAC7B,YAAMR,EAAU,OAAO;AAAA,QACrB,CAAC,SAASrf,CAAS,iBAAiB,GAAG;AAAA,QACvC,CAAC,SAASA,CAAS,cAAc,GAAG;AAAA,QACpC,CAAC,SAASA,CAAS,WAAW,GAAG;AAAA,UAC/B,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,cAAc;AAAA,QAAA;AAAA,QAEhB,CAAC,SAASA,CAAS,gBAAgB,GAAGif,GAAqBG,EAAmBC,CAAS,CAAC;AAAA,QACxF,CAAC,SAASrf,CAAS,yBAAyB,GAAG;AAAA,QAC/C,CAAC,SAASA,CAAS,kBAAkB,GAAG;AAAA,MAAA,CACzC;AAEH,IAAAgjB,EAAuBnD,CAAM;AAAA;AAC/B;AAEA,SAASuE,GAAmB5R,GAAU6R,GAAsC;AtBliB5E,MAAAziB;AsBmiBE,QAAMc,IAAO,UAAW2hB,IAAoBA,IAAsB,EAAEA,CAAQ;AAC5E,MAAI,EAAC3hB,KAAA,QAAAA,EAAM,QAAQ;AACnB,EAAAA,EAAK,SAAS,+CAA+C;AAE7D,QAAMmd,KAASrN,KAAA,gBAAAA,EAAK,WAAU,KAAK;AACnC,MAAI,CAACqN,EAAQ;AAEb,QAAM9I,IAAQ6I,GAAgBC,CAAM,GAC9BC,IAAQE,GAAsBE,GAAuBnJ,EAAM,OAAO8I,CAAM,GAAGA,CAAM;AACvF,EAAIC,EAAM,WAAW/I,EAAM,MAAM,UAC1BgJ,GAAgBF,GAAQ,EAAE,gBAAgB9I,EAAM,gBAAgB,OAAA+I,GAAO,GAG9Epd,EACG;AAAA,IACC;AAAA,EAAA,EAED,SAAS,oBAAoB,GAEhCA,EAAK,KAAK,0BAA0B,EAAE,OAAA;AAEtC,QAAM+f,KAAW7gB,IAAA,KAAK,SAAL,QAAAA,EAAW,OAAO,KAAK,YAClCkY,IAAO+F,EAAO,WAAW,IAAI,CAACR,MAAmB;AtBzjBzD,QAAAzd,GAAAC,GAAAC,GAAAsE;AsB0jBI,UAAMke,IAAKhF,GAA0BD,CAAS,GACxC5E,IAAa+E,GAAwBH,CAAS,GAC9CkF,IAAS5f,GAAI9C,KAAAD,IAAAyd,EAAU,UAAV,gBAAAzd,EAAkB5B,OAAlB,gBAAA6B,EAA8B,iBAAiB,CAAC,GAC7D2iB,IAAQ,KAAK,IAAI,GAAGF,IAAK7J,CAAU,GACnCnI,IAAM8M,EAAmBC,CAAS,GAClCoF,IAAU3E,EAAM,KAAK,CAAC7c,MAAUA,EAAM,gBAAgBoc,EAAU,EAAE,GAClEqF,IAAeD,IACjB,GAAGvF,GAAgBuF,EAAQ,IAAI,CAAC,MAAMA,EAAQ,eAAe,KAC7D,SACEE,KAAWve,KAAAtE,IAAAud,EAAU,UAAV,gBAAAvd,EAAkB9B,OAAlB,gBAAAoG,EAA8B,UACzCoB,IAAWmd,KAAA,QAAAA,EAAU,SAAS,gBAAgBA,EAAS,YAAY,KAAK,cAExEvgB,IAAU0a,GAAqB,IAAI,CAAC8F,MAAQ;AAChD,YAAMzH,IAAWsH,KAAA,QAAAA,EAAS,UAASA,KAAA,gBAAAA,EAAS,UAASG,EAAI,QAAQ,aAAa;AAC9E,aAAO,kBAAkBA,EAAI,KAAK,KAAKzH,CAAQ,IAAIyH,EAAI,KAAK;AAAA,IAC9D,CAAC,EAAE,KAAK,EAAE,GACJC,IAAe9F,GAAqB,IAAI,CAAC6F,MAAQ;AACrD,YAAMzH,IAAW,EAACsH,KAAA,QAAAA,EAAS,WAASA,KAAA,gBAAAA,EAAS,UAASG,EAAI,QAAQ,aAAa;AAC/E,aAAO,kBAAkBA,EAAI,KAAK,KAAKzH,CAAQ,IAAIyH,EAAI,KAAK;AAAA,IAC9D,CAAC,EAAE,KAAK,EAAE;AAEV,WAAO;AAAA,mDACwCvF,EAAU,EAAE;AAAA;AAAA,sCAEzBL,EAAIK,EAAU,IAAI,CAAC;AAAA,0CACf/M,CAAG,SAASgS,CAAE,UAAU7J,CAAU,MAAM+J,CAAK,cAAcD,KAAU,IAAI,IAAIA,CAAM,KAAKA,CAAM,MAAMvF,EAAI0F,CAAY,CAAC,MAAM1F,EAAIxX,CAAQ,CAAC;AAAA;AAAA;AAAA,0CAGxIib,CAAQ,IAAIre,CAAO;AAAA,0CACnBqe,CAAQ,IAAIoC,CAAY;AAAA,yDACTpC,CAAQ;AAAA,yDACRA,CAAQ;AAAA,0DACPA,CAAQ;AAAA,0EACQ8B,CAAM,KAAK9B,CAAQ;AAAA,uDACtCA,CAAQ;AAAA;AAAA;AAAA;AAAA,EAI7D,CAAC,EAAE,KAAK,EAAE,GAEJqC,IAAQ,EAAE;AAAA;AAAA;AAAA,wDAGsC/N,EAAM,cAAc;AAAA,gDAC5B+I,EAAM,MAAM;AAAA;AAAA,0DAEF2C,CAAQ;AAAA,0DACRA,CAAQ;AAAA,4DACNA,CAAQ;AAAA;AAAA;AAAA,iCAGnC3I,CAAI;AAAA;AAAA,GAElC;AAED,EAAApX,EAAK,QAAQoiB,CAAK;AAGlB,QAAMte,IAAO9D,EAAK,IAAI,CAAC;AACvB,MAAI8D;AACF,eAAWue,KAAS,MAAM,KAAKve,EAAK,QAAQ;AAC1C,MAAMue,EAAsB,UAAU,SAAS,yBAAyB,KACrEA,EAAsB,UAAU,IAAI,sBAAsB;AAKjE,EAAAD,EAAM,KAAK,kBAAkB,EAAE,GAAG,SAAS,OAAO7hB,MAAU;AAC1D,IAAAA,EAAM,eAAA,GACN,MAAMyf,GAAe7C,GAAQ,MAAM;AAAA,EACrC,CAAC,GAEDiF,EAAM,KAAK,kBAAkB,EAAE,GAAG,SAAS,OAAO7hB,MAAU;AAC1D,IAAAA,EAAM,eAAA,GACN,MAAMyf,GAAe7C,GAAQ,MAAM;AAAA,EACrC,CAAC,GAEDiF,EAAM,KAAK,oBAAoB,EAAE,GAAG,SAAS,OAAO7hB,MAAU;AAC5D,IAAAA,EAAM,eAAA,GACN,MAAM0f,GAAqB9C,CAAM;AAAA,EACnC,CAAC,GAEDiF,EAAM,KAAK,iBAAiB,EAAE,GAAG,SAAS,OAAO7hB,MAAU;AACzD,IAAAA,EAAM,eAAA;AACN,UAAMkV,IAAOlV,EAAM,cAA8B,QAAQ,aAAa;AACtE,QAAI,CAACkV,EAAK;AACV,UAAMgL,IAAc,OAAOhL,EAAI,aAAa,mBAAmB,KAAK,EAAE,GAChE6M,IAAS7M,EAAI,cAAc,gBAAgB,GAC3CgH,IAAO,QAAO6F,KAAA,gBAAAA,EAAQ,UAAS,MAAM;AAC3C,UAAM9B,GAAerD,GAAQsD,GAAahE,GAAM,EAAI;AAAA,EACtD,CAAC,GAED2F,EAAM,KAAK,iBAAiB,EAAE,GAAG,SAAS,OAAO7hB,MAAU;AACzD,IAAAA,EAAM,eAAA;AACN,UAAMkV,IAAOlV,EAAM,cAA8B,QAAQ,aAAa;AACtE,QAAI,CAACkV,EAAK;AACV,UAAMgL,IAAc,OAAOhL,EAAI,aAAa,mBAAmB,KAAK,EAAE,GAChE6M,IAAS7M,EAAI,cAAc,gBAAgB,GAC3CgH,IAAO,QAAO6F,KAAA,gBAAAA,EAAQ,UAAS,aAAa;AAClD,UAAM9B,GAAerD,GAAQsD,GAAahE,GAAM,EAAK;AAAA,EACvD,CAAC,GAED2F,EAAM,KAAK,kBAAkB,EAAE,GAAG,SAAS,OAAO7hB,MAAU;AAC1D,IAAAA,EAAM,eAAA;AACN,UAAMkV,IAAOlV,EAAM,cAA8B,QAAQ,aAAa;AACtE,QAAI,CAACkV,EAAK;AACV,UAAMgL,IAAc,OAAOhL,EAAI,aAAa,mBAAmB,KAAK,EAAE;AACtE,UAAM0L,GAAahE,GAAQsD,CAAW;AAAA,EACxC,CAAC,GAED2B,EAAM,KAAK,eAAe,EAAE,GAAG,SAAS,OAAO7hB,MAAU;AAEvD,QADAA,EAAM,eAAA,GACF,CAAE,MAAMggB,KAAoB;AAChC,UAAM9K,IAAOlV,EAAM,cAA8B,QAAQ,aAAa;AACtE,QAAI,CAACkV,EAAK;AACV,UAAMgL,IAAc,OAAOhL,EAAI,aAAa,mBAAmB,KAAK,EAAE,GAChEkH,IAAYQ,EAAO,WAAW,IAAIsD,CAAW;AACnD,QAAI,CAAC9D,EAAW;AAEhB,UAAM4F,IAAc9M,EAAI,cAAc,aAAa,GAC7CoM,IAAS,KAAK,MAAM5f,EAAIsgB,KAAA,gBAAAA,EAAa,OAAO,CAAC,CAAC;AACpD,UAAM5F,EAAU,OAAO;AAAA,MACrB,CAAC,SAASrf,CAAS,kBAAkB,GAAGukB;AAAA,IAAA,CACzC;AAAA,EACH,CAAC,GAEDvB,EAAuBnD,CAAM;AAC/B;AAEO,SAASqF,KAAiC;AAC/C,QAAM,GAAG,uBAAuB,CAAC1S,GAAU6R,MAAmC;AAC5E,IAAAD,GAAmB5R,GAAK6R,CAAQ;AAAA,EAClC,CAAC,GAED,MAAM,GAAG,gBAAgB,OAAOxE,MAAgB;AAC9C,UAAME,GAAgBF,GAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAA,GAAI,GAC9DmD,EAAuBnD,CAAM;AAAA,EAC/B,CAAC,GAED,MAAM,GAAG,mBAAmB,OAAOR,MAAmB;AACpD,UAAMK,GAA2BL,CAAS,GAC1C2D,EAAuB,KAAK,UAAU,IAAI;AAAA,EAC5C,CAAC,GAED,MAAM,GAAG,mBAAmB,YAAY;AACtC,IAAAA,EAAuB,KAAK,UAAU,IAAI;AAAA,EAC5C,CAAC,GAED,MAAM,GAAG,gBAAgB,CAACnD,MAAgB;AACxC,IAAAmD,EAAuBnD,KAAU,KAAK,UAAU,IAAI;AAAA,EACtD,CAAC,GAED,MAAM,GAAG,gBAAgB,MAAM;AAC7B,IAAAmD,EAAuB,IAAI;AAAA,EAC7B,CAAC,GAED,MAAM,GAAG,iBAAiB,MAAM;AAC9B,IAAAA,EAAuB,KAAK,UAAU,IAAI;AAAA,EAC5C,CAAC,GAED,MAAM,GAAG,eAAe,MAAM;AAC5B,IAAAA,EAAuB,KAAK,UAAU,IAAI;AAAA,EAC5C,CAAC,GAED,MAAM,GAAG,eAAe,CAACrhB,MAAe;AtB9tB1C,QAAAC;AsB+tBI,UAAMie,IAAS,KAAK;AACpB,QAAI,CAACA,EAAQ;AAEb,IADiBA,EAAO,WAAW,KAAK,CAACO;AtBjuB7C,UAAAxe;AsBiuBwD,eAAAA,IAAAwe,EAAE,UAAF,gBAAAxe,EAAS,QAAOD,EAAM;AAAA,KAAE,OAE1EC,IAAA,GAAG,WAAH,QAAAA,EAAW,OAAO,KAClBohB,EAAuBnD,CAAM;AAAA,EAEjC,CAAC,GAED,MAAM,GAAG,cAAc,CAAC1a,MAAc;AtBxuBxC,QAAAvD;AsByuBI,UAAMD,IAAQwD,KAAA,gBAAAA,EAAM;AACpB,QAAI,CAACxD,EAAO;AACZ,UAAMke,IAAS,KAAK;AACpB,QAAI,CAACA,EAAQ;AAEb,IADiBA,EAAO,WAAW,KAAK,CAACO;AtB7uB7C,UAAAxe;AsB6uBwD,eAAAA,IAAAwe,EAAE,UAAF,gBAAAxe,EAAS,QAAOD,EAAM;AAAA,KAAE,OAE1EC,IAAA,GAAG,WAAH,QAAAA,EAAW,OAAO,KAClBohB,EAAuBnD,CAAM;AAAA,EAEjC,CAAC;AACH;AChuBA,MAAMsF,KAAqC;AAE3C,SAASC,GAAS7kB,GAAwB;AACxC,SAAO,OAAOA,KAAS,EAAE,EAAE,KAAA,EAAO,YAAA;AACpC;AAEA,SAAS8kB,KAA0C;AvBzBnD,MAAAzjB;AuB0BE,QAAM0jB,wBAAU,IAAA;AAChB,aAAWngB,KAAQ,KAAK,SAAS,CAAA,GAAI;AACnC,QAAIA,EAAK,SAAS,YAAYA,EAAK,SAAS,WAAWA,EAAK,SAAS,OAAQ;AAC7E,UAAM1D,IAAM,GAAG0D,EAAK,IAAI,IAAIigB,GAASjgB,EAAK,IAAI,CAAC;AAC/C,IAAAmgB,EAAI,IAAI7jB,GAAK,SAAQG,IAAAuD,EAAa,WAAb,gBAAAvD,EAAqB,WAAU,CAAC,KAAK,CAAC;AAAA,EAC7D;AACA,SAAO0jB;AACT;AAEA,eAAeC,KAAmD;AvBnClE,MAAA3jB,GAAAC,GAAAC,GAAAsE;AuBoCE,MAAI,GAACxE,IAAA,KAAK,SAAL,QAAAA,EAAW,MAAM,QAAO;AAC7B,QAAM4jB,IAAYH,GAAA;AAClB,MAAII,IAAU;AAEd,aAAW9jB,KAAS,KAAK,UAAU,CAAA,GAAI;AACrC,UAAM2H,IAAiB,CAAA;AAEvB,eAAWnE,KAAQxD,EAAM,SAAS,CAAA,GAAI;AACpC,UAAIwD,EAAK,SAAS,YAAYA,EAAK,SAAS,WAAWA,EAAK,SAAS,OAAQ;AAC7E,YAAMugB,IAAiC,EAAE,KAAKvgB,EAAK,GAAA;AACnD,UAAIwgB,IAAU;AAOd,YALK9jB,IAAAsD,EAAa,WAAb,gBAAAtD,EAAqB,cAAa,WACrC6jB,EAAM,iBAAiB,IAAI,IAC3BC,IAAU,OAGP7jB,IAAAqD,EAAa,WAAb,gBAAArD,EAAqB,YAAW,QAAW;AAC9C,cAAML,IAAM,GAAG0D,EAAK,IAAI,IAAIigB,GAASjgB,EAAK,IAAI,CAAC;AAC/C,QAAAugB,EAAM,eAAe,IAAI,OAAOF,EAAU,IAAI/jB,CAAG,KAAK,CAAC,GACvDkkB,IAAU;AAAA,MACZ;AAEA,QAAKvf,IAAAjB,EAAa,WAAb,gBAAAiB,EAAqB,YAAW,WACnCsf,EAAM,eAAe,IAAI,IACzBC,IAAU,KAGRA,KACFrc,EAAQ,KAAKoc,CAAK;AAAA,IAEtB;AAEA,IAAIpc,EAAQ,WACV,MAAM3H,EAAM,wBAAwB,QAAQ2H,CAAO,GACnDmc,KAAWnc,EAAQ;AAAA,EAEvB;AAEA,SAAOmc;AACT;AAEA,SAASG,GAAsBvB,GAAmDwB,GAAmB5I,GAAe6I,GAA2C;AAC7J,MAAI,CAACzB,EAAU;AACf,QAAM3hB,IAAO,UAAW2hB,IAAoBA,IAAsB,EAAEA,CAAQ;AAC5E,MAAI,CAAC3hB,EAAK,UAAUA,EAAK,KAAK,IAAImjB,CAAS,EAAE,EAAE,OAAQ;AAEvD,QAAM3iB,IAAS,EAAE,2DAA8D2iB,CAAS,KAAM5I,CAAK,WAAW;AAC9G,EAAA/Z,EAAO,GAAG,SAAS,YAAY;AAC7B,UAAM4iB,EAAA;AAAA,EACR,CAAC;AAWD,QAAMC,IATa;AAAA,IACjBrjB,EAAK,KAAK,mBAAmB;AAAA,IAC7BA,EAAK,KAAK,yBAAyB;AAAA,IACnCA,EAAK,KAAK,QAAQ;AAAA,IAClBA,EAAK,KAAK,iBAAiB;AAAA,IAC3BA,EAAK,KAAK,iBAAiB;AAAA,IAC3BA,EAAK,KAAK,iBAAiB;AAAA,EAAA,EAGA,KAAK,CAACsjB,MAAcA,EAAU,MAAM;AACjE,MAAID,GAAW;AACb,IAAAA,EAAU,MAAA,EAAQ,OAAO7iB,CAAM;AAC/B;AAAA,EACF;AAEA,MAAIT,IAAWC,EAAK,KAAK,+BAA+B;AACxD,EAAKD,EAAS,WACZA,IAAW,EAAE,kDAAkD,GAC/DC,EAAK,OAAOD,CAAQ,IAEtBA,EAAS,MAAA,EAAQ,OAAOS,CAAM;AAChC;AAEA,eAAe+iB,KAAwC;AACrD,QAAMvX,GAAiB,EAAE,QAAQ,IAAM;AACzC;AAEA,eAAewX,KAAiD;AvBnHhE,MAAAtkB;AuBoHE,QAAMD,IAAQ,MAAMiQ,GAAA;AACpB,GAAAhQ,IAAAD,KAAA,gBAAAA,EAAO,UAAP,QAAAC,EAAc,OAAO;AACvB;AAEA,SAASukB,KAAsC;AvBxH/C,MAAAvkB,GAAAC,GAAAC;AuByHE,MAAI,GAACF,IAAA,KAAK,SAAL,QAAAA,EAAW,MAAM;AAEtB,QAAMwkB,KAAevkB,IAAA,GAAW,UAAX,gBAAAA,EAAkB;AACvC,EAAA+jB,GAAsBQ,GAAa,wBAAwB,wBAAwBH,EAAsB;AAEzG,QAAMI,KAAgBvkB,IAAA,GAAW,WAAX,gBAAAA,EAAmB;AACzC,EAAA8jB,GAAsBS,GAAc,0BAA0B,0BAA0BH,EAA+B;AACzH;AAEA,SAASxZ,GAAkBD,GAAuB;AvBlIlD,MAAA7K,GAAAC,GAAAC,GAAAsE;AuBmIE,QAAMuG,KAAe/K,IAAA,iBAAiB,MAAM,MAAvB,gBAAAA,EAAkC;AACvD,MAAI,MAAM,QAAQ+K,CAAW,EAAG,QAAOA,EAAY,SAASF,CAAI;AAEhE,QAAMG,KAAY9K,KAAAD,IAAA,6BAAc,WAAd,gBAAAA,EAAsB,kBAAtB,gBAAAC,EAAqC;AACvD,MAAI,MAAM,QAAQ8K,CAAQ,EAAG,QAAOA,EAAS,SAASH,CAAI;AAC1D,MAAIG,KAAY,OAAOA,KAAa,SAAU,QAAO,OAAO,UAAU,eAAe,KAAKA,GAAUH,CAAI;AAExG,QAAMI,KAAgBzG,IAAA,iCAAgB,SAAhB,gBAAAA,EAAsB;AAC5C,SAAI,GAAAyG,KAAgB,OAAOA,KAAiB,YAAY,OAAO,UAAU,eAAe,KAAKA,GAAcJ,CAAI;AAIjH;AAEA,MAAM,KAAK,QAAQ,YAAY;AvBjJ/B,MAAA7K,GAAAC,GAAAC,GAAAsE,GAAAC,GAAAC,GAAAC,GAAA6D;AuBkJE,UAAQ,IAAI,2CAA2C,GACvD8a,GAAA;AAEA,QAAMoB,KAAiBzkB,KAAAD,IAAA,mCAAiB,cAAjB,gBAAAA,EAA4B,gBAA5B,gBAAAC,EAAyC,QAC1D0kB,KAAgBngB,KAAAtE,IAAA,mCAAiB,cAAjB,gBAAAA,EAA4B,gBAA5B,gBAAAsE,EAAyC,OACzD4O,KAAkB1O,KAAAD,IAAA,mCAAiB,UAAjB,gBAAAA,EAAwB,WAAxB,gBAAAC,EAAgC,YAClD4X,KAAiB9T,KAAA7D,IAAA,mCAAiB,UAAjB,gBAAAA,EAAwB,WAAxB,gBAAA6D,EAAgC;AAavD,MAXC,OAAe,YAAY;AAAA,IAC1B,cAAcnK;AAAA,EAAA,GAEhB,OAAO,OAAO,aAAa,QAAQ,MAAM,YAAY,OAAO,OAAO,cAAc,IAAI;AAAA,IACnF,SAAS;AAAA,IACT,UAAU;AAAA,EAAA,GACT,EAAE,SAAS,IAAO,GAErB,OAAO,MAAM,gBAAgByT,IAC7B,OAAO,KAAK,gBAAgBqB,IAExB,CAACuR,KAAiB,CAACC,KAAgB,CAACvR,KAAkB,CAACkJ,GAAe;AACxE,YAAQ,MAAM,sEAAsE;AACpF;AAAA,EACF;AAEA,EAAAoI,EAAc,gBAAgB,QAAQtR,CAAc,GACpDsR,EAAc,cAAc,aAAazN,IAA+B;AAAA,IACtE,OAAO,CAAC,UAAU;AAAA,IAClB,aAAa;AAAA,EAAA,CACd,GACDyN,EAAc,cAAc,aAAatI,IAA+B;AAAA,IACtE,OAAO,CAAC,UAAU;AAAA,IAClB,aAAa;AAAA,EAAA,CACd,GACDsI,EAAc,cAAc,aAAarI,IAA8B;AAAA,IACrE,OAAO,CAAC,SAAS;AAAA,IACjB,aAAa;AAAA,EAAA,CACd,GAEDsI,EAAa,gBAAgB,QAAQrI,CAAa,GAClDqI,EAAa,cAAc,aAAapI,IAA4B;AAAA,IAClE,OAAO,CAAC,OAAO;AAAA,IACf,aAAa;AAAA,EAAA,CACd,GACDoI,EAAa,cAAc,aAAanI,IAA6B;AAAA,IACnE,OAAO,CAAC,QAAQ;AAAA,IAChB,aAAa;AAAA,EAAA,CACd,GACDmI,EAAa,cAAc,aAAalI,IAA4B;AAAA,IAClE,OAAO,CAAC,OAAO;AAAA,IACf,aAAa;AAAA,EAAA,CACd,GACDkI,EAAa,cAAc,aAAajI,IAA2B;AAAA,IACjE,OAAO,CAAC,MAAM;AAAA,IACd,aAAa;AAAA,EAAA,CACd,GACDiI,EAAa,cAAc,aAAahI,IAA8B;AAAA,IACpE,OAAO,CAAC,SAAS;AAAA,IACjB,aAAa;AAAA,EAAA,CACd,GACG7R,GAAkB,SAAS,KAC7B6Z,EAAa,cAAc,aAAa9H,IAA8B;AAAA,IACpE,OAAO,CAAC,SAAS;AAAA,IACjB,aAAa;AAAA,EAAA,CACd,GAGH,KAAK,SAAS,SAAS,aAAa,sBAAsB;AAAA,IACxD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,EAAA,CACV,GACD,KAAK,SAAS,SAAS,aAAa,mCAAmC;AAAA,IACrE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,EAAA,CACV,GAED,WAAW,eAAe,MAAM,CAACpJ,GAAYC,MAAeD,MAAMC,CAAC,GACnE,WAAW,eAAe,MAAM,CAACD,GAAYC,MAAe,GAAQD,KAAKC,EAAE;AAC7E,CAAC;AAED,MAAM,KAAK,SAAS,YAAY;AvBrOhC,MAAA1T,GAAAC,GAAAC,GAAAsE,GAAAC;AuBsOE,QAAMmgB,IAAO;AACb,MAAI;AACF,UAAMC,IAAW,MAAM,MAAMD,CAAI;AACjC,QAAIC,EAAS,IAAI;AACf,YAAMvkB,IAAQ,MAAMukB,EAAS,KAAA;AAC5B,aAAe,UAAU,eAAevkB,EAAM,WAAWjC;AAAA,IAC5D;AAAA,EACF,QAAiB;AACf,YAAQ,KAAK,8BAA8BumB,CAAI,wBAAwB;AAAA,EACzE;AAEA,OAAI5kB,IAAA,KAAK,SAAL,QAAAA,EAAW,MAAM;AACnB,eAAWie,KAAU,KAAK,WAAW,CAAA,GAAI;AACvC,YAAMzgB,IAAU,SAAO0C,KAAAD,IAAAge,KAAA,gBAAAA,EAAQ,aAAR,gBAAAhe,EAAkB,eAAlB,gBAAAC,EAA8B,YAAW,EAAE,EAAE,KAAA;AACpE,OAAI,CAAC1C,KAAWA,EAAQ,YAAA,MAAkB,gBACxC,MAAMygB,EAAO,OAAO;AAAA,QAClB,+BAA+B;AAAA,QAC/B,gCAAgC;AAAA,MAAA,CACjC;AAAA,IAEL;AAWA,QATsB,OAAO,KAAK,SAAS,IAAI,aAAa,oBAAoB,KAAK,CAAC,IAClEvU,OACH,MAAMoD,GAAiB,EAAE,QAAQ,IAAM,GAC3C,SAAS,KAClB,MAAM,KAAK,SAAS,IAAI,aAAa,sBAAsBpD,EAAyB,GAIhE,OAAO,KAAK,SAAS,IAAI,aAAa,iCAAiC,KAAK,CAAC,IAC/E6Z,IAAoC;AACxD,YAAMM,IAAU,MAAMF,GAAA;AACtB,YAAM,KAAK,SAAS,IAAI,aAAa,mCAAmCJ,EAAkC,GACtGM,IAAU,OACZrf,IAAA,GAAG,kBAAH,QAAAA,EAAkB,KAAK,2CAA2Cqf,CAAO;AAAA,IAE7E;AAAA,EACF;AAEA,EAAAU,GAAA,GACA,OAAO,WAAW,MAAMA,GAAA,GAAiC,GAAG,GAE3D,KAAa,YAAY;AAAA,IACxB,GAAK,KAAa,aAAa,CAAA;AAAA,IAC/B,kBAAkB,OAAO/hB,MAAmCsK,GAAiBtK,CAAO;AAAA,IACpF,sBAAsB,YAAYwN,GAAA;AAAA,IAClC,gBAAgBtG;AAAA,IAChB,UAAU;AAAA,IACV,eAAe,SAAOjF,IAAA,KAAK,WAAL,gBAAAA,EAAa,YAAW,OAAO;AAAA,EAAA,GAEvD,MAAM,QAAQ,kBAAmB,KAAa,SAAS;AACzD,CAAC;AAED,MAAM,GAAG,eAAe,OAAO1E,GAAY+kB,GAAeC,MAAmB;AvB5R7E,MAAA/kB,GAAAC;AuB6RE,OAAKD,IAAA,KAAK,SAAL,QAAAA,EAAW,QACZ+kB,MAAW,KAAK,KAAK,MACrB,GAAChlB,KAAUA,EAAM,SAAS,cAAcA,EAAM,SAAS;AAE3D,QAAI;AACF,YAAM8b,IAAQ,QAAM5b,IAAAF,EAAM,qBAAN,gBAAAE,EAAA,KAAAF;AACpB,MAAI,OAAO8b,CAAK,IAAI,KAClB,QAAQ,IAAI,qBAAqBA,CAAK,mBAAmB9b,EAAM,IAAI,EAAE;AAAA,IAEzE,SAASilB,GAAO;AACd,cAAQ,MAAM,mDAAmDA,CAAK;AAAA,IACxE;AACF,CAAC;AAED,MAAM,GAAG,iBAAiB,CAACzhB,MAAc;AACvC,MAAIA,EAAK,SAAS,QAAS;AAE3B,QAAMmE,IAAmC,CAAA,GACnC7F,IAAO,OAAO0B,EAAK,QAAQ,OAAO,GAClClB,IAAa,OAAOkB,EAAK,OAAO,EAAE;AACxC,EAAAmE,EAAQ,MAAMtF,GAAiBP,GAAMQ,CAAU;AAE/C,QAAMqM,IAAOvM,GAAgBN,CAAI,GAC3BojB,IAAiB1hB,EAAa,UAAU,CAAA,GACxC2hB,IAAe,QAAOD,KAAA,gBAAAA,EAAe,UAAS,GAAG,GACjDE,IAAkB,QAAOF,KAAA,gBAAAA,EAAe,aAAY,EAAE,EAAE,KAAA;AAE9D,EAAAvd,EAAQ,SAAS;AAAA,IACf,OAAO,OAAO,SAASwd,CAAY,IAAIA,KAAgBxW,KAAA,gBAAAA,EAAM,SAAQ;AAAA,IACrE,UAAUyW,OAAoBzW,KAAA,gBAAAA,EAAM,aAAY;AAAA,IAChD,gBAAgB,QAAOuW,KAAA,gBAAAA,EAAe,oBAAkBvW,KAAA,gBAAAA,EAAM,mBAAkB,EAAE;AAAA,EAAA,GAG/EhH,EAAQ,QAAKA,EAAQ,MAAM1F,IAChCuB,EAAK,aAAamE,CAAO;AAC3B,CAAC;AAED,MAAM,GAAG,uBAAuB,CAAC0d,GAAWtkB,MAAiB;AvBlU7D,MAAAd;AuBmUE,GAAKA,IAAA,KAAK,SAAL,QAAAA,EAAW,SAChBgkB,GAAsBljB,GAAM,wBAAwB,wBAAwBujB,EAAsB,GAClGE,GAAA;AACF,CAAC;AAED,MAAM,GAAG,wBAAwB,CAACa,GAAWtkB,MAAiB;AvBxU9D,MAAAd;AuByUE,GAAKA,IAAA,KAAK,SAAL,QAAAA,EAAW,SAChBgkB,GAAsBljB,GAAM,0BAA0B,0BAA0BwjB,EAA+B,GAC/GC,GAAA;AACF,CAAC;AAED,MAAM,GAAG,iBAAiB,MAAM;AAC9B,EAAAA,GAAA;AACF,CAAC;AAED,MAAM,GAAG,oBAAoB,CAAC3T,MAAa;AvBlV3C,MAAA5Q;AuBmVE,QAAMqlB,IAAU,QAAOzU,KAAA,gBAAAA,EAAK,aAAWA,KAAA,gBAAAA,EAAK,SAAM5Q,IAAA4Q,KAAA,gBAAAA,EAAK,YAAL,gBAAA5Q,EAAc,OAAM,EAAE;AACxE,GAAIqlB,MAAY,WAAWA,MAAY,aACrCd,GAAA;AAEJ,CAAC;"}