@guidelytech/guide-runtime 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/capture.cjs +5 -0
- package/dist/capture.cjs.map +1 -1
- package/dist/capture.js +2 -2
- package/dist/{chunk-H3CROHPR.js → chunk-KEQ2VEEC.js} +2 -2
- package/dist/{chunk-VJSQM23R.js → chunk-KQGSHCNW.js} +6 -1
- package/dist/chunk-KQGSHCNW.js.map +1 -0
- package/dist/{chunk-VQJ7MZ2K.js → chunk-YU6SKJK4.js} +2 -2
- package/dist/index.cjs +100 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -4
- package/dist/index.d.ts +11 -4
- package/dist/index.js +76 -5
- package/dist/index.js.map +1 -1
- package/dist/messenger.js +2 -2
- package/package.json +4 -4
- package/dist/chunk-4FKYF6OB.js +0 -466
- package/dist/chunk-4FKYF6OB.js.map +0 -1
- package/dist/chunk-4UW6YF44.js +0 -464
- package/dist/chunk-4UW6YF44.js.map +0 -1
- package/dist/chunk-7DOGZKWD.js +0 -322
- package/dist/chunk-7DOGZKWD.js.map +0 -1
- package/dist/chunk-GUH2PQJ7.js +0 -462
- package/dist/chunk-GUH2PQJ7.js.map +0 -1
- package/dist/chunk-GUSKGNNR.js +0 -301
- package/dist/chunk-GUSKGNNR.js.map +0 -1
- package/dist/chunk-KJRXCITD.js +0 -515
- package/dist/chunk-KJRXCITD.js.map +0 -1
- package/dist/chunk-PG7CMBHD.js +0 -330
- package/dist/chunk-PG7CMBHD.js.map +0 -1
- package/dist/chunk-VJSQM23R.js.map +0 -1
- package/dist/chunk-VNJPNGZ4.js +0 -301
- package/dist/chunk-VNJPNGZ4.js.map +0 -1
- /package/dist/{chunk-H3CROHPR.js.map → chunk-KEQ2VEEC.js.map} +0 -0
- /package/dist/{chunk-VQJ7MZ2K.js.map → chunk-YU6SKJK4.js.map} +0 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/selectors.ts","../src/sanitize.ts","../src/pdf-viewer.ts","../src/host.ts","../src/styles.ts","../src/position.ts","../src/render.ts","../src/controller.ts","../src/checklist.ts","../src/survey.ts","../src/resource-center.ts","../src/help-view.ts","../src/authoring.ts"],"sourcesContent":["/**\n * @guidelytech/guide-runtime — framework-free DOM engine for Guidely guides.\n *\n * Selectors, Shadow-DOM host, step renderers, guide controller, checklist/survey/resource-center\n * widgets, HTML sanitizer and authoring (element picker) utilities. The messenger and how-to capture\n * recorder are separate entries (`/messenger`, `/capture`) so they load only when used.\n */\nexport { resolveTarget, waitForTarget, generateSelectors, describeElement, textSnapshotOf, isVisible, isStableId, isStableClass, isGuidelyElement, querySelectorStrategy, normalizeText, urlMatches, TargetTimeoutError, SHADOW_SEPARATOR, closestComposed, composedParent, composedTarget, containsComposed, deepElementFromPoint, shadowHostChain, componentAnchor, visualRect } from \"./selectors\";\nexport type { WaitForTargetOptions, ElementDescription, QueryRoot } from \"./selectors\";\nexport { sanitizeHtml, sanitizeToFragment, setSanitizedHtml } from \"./sanitize\";\nexport { enhancePdfViewers } from \"./pdf-viewer\";\nexport { ensureHost, destroyHost, createScope, resolveTheme, applyTheme, prefersReducedMotion, DEFAULT_THEME, HOST_ID } from \"./host\";\nexport type { HostHandle, ThemeVars, ResolvedThemeMode } from \"./host\";\nexport { anchor, trackRect } from \"./position\";\nexport type { AnchorOptions } from \"./position\";\nexport { renderStep, buildCard, isAnchoredStep, renderModal, renderTooltip, renderSpotlight, renderHotspot, renderBanner, renderSlideout, renderCustom } from \"./render\";\nexport type { RenderStepOptions, StepView } from \"./render\";\nexport { runGuide } from \"./controller\";\nexport type { GuideController, RunGuideOptions, RunnableGuide, RuntimeEvent, GuideEndReason, GuideStatus } from \"./controller\";\nexport { renderChecklist, isChecklistComplete } from \"./checklist\";\nexport type { ChecklistWidget, ChecklistWidgetOptions, ChecklistProgress } from \"./checklist\";\nexport { renderSurvey, isQuestionVisible } from \"./survey\";\nexport type { SurveyWidget, SurveyWidgetOptions, SurveyAnswers, SurveyAnswer } from \"./survey\";\nexport { renderResourceCenter } from \"./resource-center\";\nexport type { ResourceCenterWidget, ResourceCenterOptions, ResourceCenterGuideRef } from \"./resource-center\";\nexport { startAuthoring, previewStep, highlightSelectors } from \"./authoring\";\nexport type { AuthoringOptions, AuthoringSession, PreviewHandle, HighlightHandle } from \"./authoring\";\n// How-to capture is its own entry (`@guidelytech/guide-runtime/capture`), loaded on demand.\nexport type { CaptureOptions, CaptureSession, CapturedStep, CaptureStepDraft } from \"./capture\";\nexport { STYLES } from \"./styles\";\n","import { matchUrlPattern } from \"@guidelytech/shared/runtime\";\nimport type { SelectorStrategy, StepTarget } from \"@guidelytech/shared\";\n\n/**\n * URL matching used for `step.url`, `urlPatterns` and `trigger.urlPattern`: a pattern matches the\n * full URL, the path+query+hash, or the bare path (so `/deals` also matches `/deals?x=1`).\n */\nexport function urlMatches(pattern: string | undefined | null, url: string): boolean {\n if (!pattern) return true;\n if (matchUrlPattern(pattern, url)) return true;\n try {\n const u = new URL(url, \"http://localhost\");\n if (!pattern.includes(\"?\") && !pattern.includes(\"#\")) return matchUrlPattern(pattern, u.pathname) || matchUrlPattern(pattern, u.origin + u.pathname);\n } catch {\n /* ignore */\n }\n return false;\n}\n\nexport type QueryRoot = Document | DocumentFragment | Element;\n\nconst TEXT_CANDIDATES =\n \"button, a, [role='button'], [role='link'], [role='tab'], [role='menuitem'], h1, h2, h3, h4, h5, h6, label, summary\";\n\nconst HOST_ID = \"guidely-root\";\n\nfunction docOf(root: QueryRoot): Document {\n return root.nodeType === 9 ? (root as Document) : (root.ownerDocument as Document);\n}\n\n/** True when the environment has a layout engine (real browsers). happy-dom/jsdom report zero sizes. */\nfunction hasLayout(doc: Document): boolean {\n const de = doc.documentElement;\n if (!de) return false;\n const r = de.getBoundingClientRect();\n return r.width > 0 || r.height > 0;\n}\n\n/** Normalises whitespace in a text snippet. */\nexport function normalizeText(text: string | null | undefined): string {\n return (text || \"\").replace(/\\s+/g, \" \").trim();\n}\n\n/** Is the element rendered (not hidden by `hidden`, `display:none`, `visibility:hidden`, or zero size)? */\nexport function isVisible(el: Element): boolean {\n if (!el.isConnected) return false;\n const doc = el.ownerDocument;\n const win = doc.defaultView;\n let cur: Element | null = el;\n while (cur && cur !== doc.documentElement) {\n if ((cur as HTMLElement).hidden) return false;\n if (win) {\n const cs = win.getComputedStyle(cur);\n if (cs.display === \"none\" || cs.visibility === \"hidden\") return false;\n }\n cur = cur.parentElement ?? ((cur.getRootNode() as ShadowRoot).host as Element | undefined) ?? null;\n }\n if (hasLayout(doc)) {\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) return false;\n }\n return true;\n}\n\n/** Elements that belong to Guidely's own UI are never valid targets. */\nexport function isGuidelyElement(el: Element | null): boolean {\n if (!el) return false;\n const root = el.getRootNode();\n if (root instanceof ShadowRoot && root.host.id === HOST_ID) return true;\n return el.id === HOST_ID || !!el.closest?.(`#${HOST_ID}`);\n}\n\nfunction safeQueryAll(root: QueryRoot, selector: string): Element[] {\n try {\n return Array.from(root.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shadow DOM. Web-component apps (Salesforce Lightning Web Components, Shoelace, Ionic, Lit) keep\n// most of their elements inside shadow roots, which `querySelectorAll` never enters. Selectors\n// therefore search open shadow roots too, and a CSS value can step into one explicitly:\n// `c-app >>> button.save` is `button.save` anywhere inside `c-app`'s shadow tree. Closed shadow\n// roots are unreachable by design.\n// ---------------------------------------------------------------------------\n\n/** Separates the shadow-host steps of a CSS selector (`>>>` is not valid CSS, so it never clashes). */\nexport const SHADOW_SEPARATOR = \" >>> \";\nconst SHADOW_SPLIT = /\\s*>>>\\s*/;\n\nfunction isShadowRoot(node: Node | null | undefined): node is ShadowRoot {\n return !!node && node.nodeType === 11 && !!(node as ShadowRoot).host;\n}\n\n/** The shadow root an element lives in, or null when it is in the document itself. */\nfunction shadowRootOf(el: Element): ShadowRoot | null {\n const root = el.getRootNode?.();\n return isShadowRoot(root) ? root : null;\n}\n\n/** The element's parent in the composed tree: its parent element, or its shadow host at the top of a shadow root. */\nexport function composedParent(el: Element): Element | null {\n return el.parentElement ?? shadowRootOf(el)?.host ?? null;\n}\n\n/** Does `ancestor` contain `node`, looking through shadow boundaries? */\nexport function containsComposed(ancestor: Element, node: Node | null): boolean {\n let cur: Element | null = node ? (node.nodeType === 1 ? (node as Element) : node.parentElement) : null;\n for (; cur; cur = composedParent(cur)) if (cur === ancestor) return true;\n return false;\n}\n\n/** The element an event really started on: inside a shadow root `e.target` is retargeted to the host. */\nexport function composedTarget(e: Event): Element | null {\n const path = typeof e.composedPath === \"function\" ? e.composedPath() : [];\n const first = (path[0] ?? e.target) as Node | null;\n if (!first) return null;\n return first.nodeType === 1 ? (first as Element) : first.parentElement;\n}\n\n/** Set while `resolveTarget` runs, so its strategies share one walk of the page per root. */\nlet shadowRootCache: Map<QueryRoot, ShadowRoot[]> | null = null;\n\n/** Every open shadow root below `root`, nested ones included, except Guidely's own UI. */\nfunction shadowRootsIn(root: QueryRoot): ShadowRoot[] {\n const cached = shadowRootCache?.get(root);\n if (cached) return cached;\n const out: ShadowRoot[] = [];\n const visit = (scope: QueryRoot) => {\n const own = scope.nodeType === 1 ? (scope as Element).shadowRoot : null;\n const hosts = own ? [scope as Element] : [];\n for (const el of safeQueryAll(scope, \"*\")) if (el.shadowRoot) hosts.push(el);\n for (const host of hosts) {\n if (host.id === HOST_ID || !host.shadowRoot || out.includes(host.shadowRoot)) continue;\n out.push(host.shadowRoot);\n visit(host.shadowRoot);\n }\n };\n visit(root);\n shadowRootCache?.set(root, out);\n return out;\n}\n\n/** `querySelectorAll` that also searches every open shadow root below `root`. */\nfunction queryAllDeep(root: QueryRoot, selector: string): Element[] {\n const out = safeQueryAll(root, selector);\n for (const sr of shadowRootsIn(root)) out.push(...safeQueryAll(sr, selector));\n return out;\n}\n\n/**\n * Resolves a CSS selector. With `deep`, open shadow roots are searched too. A `>>>` chain is always\n * deep: each step is looked for anywhere inside the shadow trees of the previous step's matches.\n */\nfunction queryCss(root: QueryRoot, selector: string, deep: boolean): Element[] {\n if (!selector.includes(\">>>\")) return deep ? queryAllDeep(root, selector) : safeQueryAll(root, selector);\n const steps = selector.split(SHADOW_SPLIT).filter(Boolean);\n let scopes: QueryRoot[] = [root];\n let matches: Element[] = [];\n steps.forEach((step, i) => {\n matches = Array.from(new Set(scopes.flatMap((scope) => queryAllDeep(scope, step))));\n if (i < steps.length - 1) scopes = matches.map((el) => el.shadowRoot).filter((sr): sr is ShadowRoot => !!sr);\n });\n return matches;\n}\n\n/**\n * `Element.closest` across shadow boundaries: the nearest element, from `el` up through its shadow\n * hosts, that matches `selector` (which may be a `>>>` chain). Throws on an invalid plain selector,\n * like `closest` does.\n */\nexport function closestComposed(el: Element, selector: string): Element | null {\n if (selector.includes(\">>>\")) {\n const hits = new Set(queryCss(docOf(el), selector, true));\n for (let cur: Element | null = el; cur; cur = composedParent(cur)) if (hits.has(cur)) return cur;\n return null;\n }\n for (let cur: Element | null = el; cur; cur = composedParent(cur)) if (cur.matches(selector)) return cur;\n return null;\n}\n\n/** The innermost element at a point, looking inside open shadow roots (`elementFromPoint` stops at the host). */\nexport function deepElementFromPoint(doc: Document, x: number, y: number): Element | null {\n let el = doc.elementFromPoint(x, y);\n while (el?.shadowRoot && el.id !== HOST_ID && typeof el.shadowRoot.elementFromPoint === \"function\") {\n const inner = el.shadowRoot.elementFromPoint(x, y);\n if (!inner || inner === el) break;\n el = inner;\n }\n return el;\n}\n\nfunction escapeCss(value: string): string {\n const g = globalThis as { CSS?: { escape?: (v: string) => string } };\n if (g.CSS && typeof g.CSS.escape === \"function\") return g.CSS.escape(value);\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n\nfunction queryXPath(root: QueryRoot, expr: string): Element[] {\n const doc = docOf(root);\n const d = doc as Document & { evaluate?: Document[\"evaluate\"] };\n if (typeof d.evaluate !== \"function\") return [];\n try {\n const result = d.evaluate(expr, root, null, 7 /* ORDERED_NODE_SNAPSHOT_TYPE */, null);\n const out: Element[] = [];\n for (let i = 0; i < result.snapshotLength; i++) {\n const n = result.snapshotItem(i);\n if (n && n.nodeType === 1) out.push(n as Element);\n }\n return out;\n } catch {\n return [];\n }\n}\n\nfunction queryText(root: QueryRoot, text: string, deep: boolean): Element[] {\n const needle = normalizeText(text).toLowerCase();\n if (!needle) return [];\n const candidates = queryCss(root, TEXT_CANDIDATES, deep);\n const exact = candidates.filter((c) => normalizeText(c.textContent).toLowerCase() === needle);\n if (exact.length) return exact;\n return candidates.filter((c) => normalizeText(c.textContent).toLowerCase().includes(needle));\n}\n\n/**\n * Resolves every element matching one strategy (visible or not). `deep` (the default) also searches\n * open shadow roots; `>>>` chains are always followed. XPath cannot cross shadow boundaries.\n */\nexport function querySelectorStrategy(strategy: SelectorStrategy, root: QueryRoot, deep = true): Element[] {\n const value = strategy.value.trim();\n if (!value) return [];\n switch (strategy.kind) {\n case \"id\": {\n const id = value.startsWith(\"#\") ? value.slice(1) : value;\n return queryCss(root, `#${escapeCss(id)}`, deep);\n }\n case \"guidely-id\": {\n const id = value.startsWith(\"#\") ? value.slice(1) : value;\n return queryCss(root, attrSelector(\"data-guidely-id\", id), deep);\n }\n case \"data-attr\":\n case \"aria\":\n case \"css\":\n return queryCss(root, value.startsWith(\"[\") || /^[a-z*#.[]/i.test(value) ? value : `[${value}]`, deep);\n case \"text\":\n return queryText(root, value, deep);\n case \"xpath\":\n return queryXPath(root, value);\n default:\n return [];\n }\n}\n\n/**\n * Resolves a step target by trying each strategy in order. A strategy wins only when it\n * resolves to exactly one *visible* element; otherwise the next strategy is tried. Each strategy\n * looks in the document first and only searches shadow roots when nothing there is visible, so a\n * target that resolved before shadow-DOM support still resolves to the same element.\n */\nexport function resolveTarget(target: Pick<StepTarget, \"selectors\"> | SelectorStrategy[], root: QueryRoot = document): Element | null {\n const selectors = Array.isArray(target) ? target : target.selectors;\n const visibleMatches = (strategy: SelectorStrategy, deep: boolean) => querySelectorStrategy(strategy, root, deep).filter((el) => !isGuidelyElement(el) && isVisible(el));\n const outer = shadowRootCache;\n shadowRootCache ??= new Map();\n try {\n for (const strategy of selectors) {\n let matches = visibleMatches(strategy, false);\n if (!matches.length && strategy.kind !== \"xpath\") matches = visibleMatches(strategy, true);\n if (matches.length === 1) return matches[0] as Element;\n }\n return null;\n } finally {\n shadowRootCache = outer;\n }\n}\n\nexport interface WaitForTargetOptions {\n /** Give up after this many milliseconds (default 5000). */\n timeoutMs?: number;\n /** Abort early. */\n signal?: AbortSignal;\n root?: QueryRoot;\n /** Polling fallback interval (default 250ms, which is also the maximum). */\n pollMs?: number;\n}\n\nexport class TargetTimeoutError extends Error {\n override name = \"TargetTimeoutError\";\n constructor(message = \"Target element not found before timeout\") {\n super(message);\n }\n}\n\n/**\n * Waits until `resolveTarget` finds an element. Uses a MutationObserver plus a polling fallback\n * (at most every 250ms) so visibility changes without DOM mutations, and changes inside shadow\n * roots (which the observer does not see), are also detected.\n */\nexport function waitForTarget(target: Pick<StepTarget, \"selectors\"> | SelectorStrategy[], options: WaitForTargetOptions = {}): Promise<Element> {\n const timeoutMs = options.timeoutMs ?? 5000;\n const root = options.root ?? document;\n const pollMs = Math.min(250, Math.max(16, options.pollMs ?? 250));\n return new Promise<Element>((resolve, reject) => {\n const immediate = resolveTarget(target, root);\n if (immediate) return resolve(immediate);\n if (options.signal?.aborted) return reject(new DOMException(\"Aborted\", \"AbortError\"));\n let done = false;\n let observer: MutationObserver | null = null;\n let timer: ReturnType<typeof setInterval> | null = null;\n let timeout: ReturnType<typeof setTimeout> | null = null;\n const cleanup = () => {\n done = true;\n observer?.disconnect();\n if (timer) clearInterval(timer);\n if (timeout) clearTimeout(timeout);\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n const check = () => {\n if (done) return;\n const el = resolveTarget(target, root);\n if (el) {\n cleanup();\n resolve(el);\n }\n };\n const onAbort = () => {\n cleanup();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n options.signal?.addEventListener(\"abort\", onAbort);\n const observeRoot = root.nodeType === 9 ? (root as Document).documentElement : (root as Element);\n if (typeof MutationObserver !== \"undefined\" && observeRoot) {\n observer = new MutationObserver(check);\n observer.observe(observeRoot, { childList: true, subtree: true, attributes: true, attributeFilter: [\"class\", \"style\", \"hidden\", \"id\", \"data-tour\", \"data-guidely-id\", \"aria-label\"] });\n }\n timer = setInterval(check, pollMs);\n if (timeoutMs > 0) {\n timeout = setTimeout(() => {\n cleanup();\n reject(new TargetTimeoutError());\n }, timeoutMs);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Selector generation (used by the element picker)\n// ---------------------------------------------------------------------------\n\nconst GENERATED_ID = /(\\d{4,}|:r[0-9a-z]+:|^radix-|^headlessui-|^mui-|^ember\\d|^react-|^\\w*-\\d+$|__|^[a-f0-9]{8,}$|^svelte-)/i;\nconst GENERATED_CLASS = /(^css-|^sc-|^jss\\d|^svelte-|^emotion-|^chakra-|^Mui|^_|[0-9a-f]{6,}|^\\w{1,2}$|^[a-z]+-\\d+$|[:[\\]/])/;\nconst PREFERRED_DATA_ATTRS = [\"data-testid\", \"data-tour\", \"data-test\", \"data-test-id\", \"data-cy\", \"data-qa\", \"data-id\", \"data-name\", \"data-guidely\"];\nconst IGNORED_DATA_ATTRS = /^data-(guidely-id|state|v-|reactid|react|radix|headlessui|svelte|hydrated|orientation|highlighted|focus|key|index|rbd|dnd|rk-|sveltekit)/i;\n\n/** Is this id stable enough to be used as a selector (not generated by a framework)? */\nexport function isStableId(id: string): boolean {\n return !!id && /^[A-Za-z][\\w-]*$/.test(id) && !GENERATED_ID.test(id);\n}\n\n/** Is this class name stable enough to describe an element (not a CSS-in-JS hash or framework id)? */\nexport function isStableClass(cls: string): boolean {\n return !!cls && !GENERATED_CLASS.test(cls) && cls.length <= 40;\n}\n\n/** Does `selector` match exactly `el` and nothing else directly inside `root` (shadow roots below are not searched)? */\nfunction uniqueWithin(root: QueryRoot, selector: string, el: Element): boolean {\n const all = safeQueryAll(root, selector);\n return all.length === 1 && all[0] === el;\n}\n\nfunction attrSelector(name: string, value: string): string {\n return `[${name}='${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\")}']`;\n}\n\n/** Shortest unique `>`-path to `el` within its own root (the document, or the shadow root it lives in). */\nfunction cssPath(el: Element, root: Document | ShadowRoot): string | null {\n const doc = el.ownerDocument;\n const segments: string[] = [];\n let cur: Element | null = el;\n while (cur && cur.nodeType === 1 && cur !== doc.body && cur !== doc.documentElement) {\n const tag = cur.tagName.toLowerCase();\n if (isStableId(cur.id)) {\n segments.unshift(`#${cur.id}`);\n break;\n }\n let seg = tag;\n const parent: Element | null = cur.parentElement;\n if (parent) {\n const sameTag = Array.from(parent.children).filter((c) => c.tagName === cur!.tagName);\n if (sameTag.length > 1) {\n const stableCls = Array.from(cur.classList).find((c) => isStableClass(c) && sameTag.filter((s) => s.classList.contains(c)).length === 1);\n seg += stableCls ? `.${escapeCss(stableCls)}` : `:nth-of-type(${sameTag.indexOf(cur) + 1})`;\n }\n }\n segments.unshift(seg);\n const candidate = segments.join(\" > \");\n if (uniqueWithin(root, candidate, el)) return candidate;\n cur = parent;\n }\n const full = segments.join(\" > \");\n return uniqueWithin(root, full, el) ? full : null;\n}\n\n/**\n * The `>>>` chain of shadow hosts above an element (`c-app >>> c-form`), or \"\" for an element in\n * the document itself; null when some host has no unique path within its own root.\n */\nexport function shadowHostChain(el: Element): string | null {\n const steps: string[] = [];\n for (let root = shadowRootOf(el); root; root = shadowRootOf(root.host)) {\n const host = root.host;\n const step = cssPath(host, shadowRootOf(host) ?? host.ownerDocument);\n if (!step) return null;\n steps.unshift(step);\n }\n return steps.join(SHADOW_SEPARATOR);\n}\n\n/**\n * Turns a selector that is unique within `el`'s own root into one the resolver maps back to `el`.\n * In the document that is the selector itself (as before shadow-DOM support). Inside a shadow root\n * the bare selector is kept when no other match exists in any shadow tree; otherwise it is scoped\n * with the host chain. Returns null when neither form resolves to exactly `el`.\n */\nfunction selectorFor(el: Element, selector: string): string | null {\n const root = shadowRootOf(el);\n if (!root) return uniqueWithin(el.ownerDocument, selector, el) ? selector : null;\n if (!uniqueWithin(root, selector, el)) return null;\n const doc = el.ownerDocument;\n const only = (sel: string) => {\n const all = queryCss(doc, sel, true);\n return all.length === 1 && all[0] === el;\n };\n if (only(selector)) return selector;\n const chain = shadowHostChain(el);\n const scoped = chain ? chain + SHADOW_SEPARATOR + selector : null;\n return scoped && only(scoped) ? scoped : null;\n}\n\n/** Text a component renders in its shadow root (`innerText` of a host only covers its light DOM). */\nfunction shadowText(el: Element): string {\n if (!el.shadowRoot) return \"\";\n const parts = Array.from(el.shadowRoot.children).filter((c) => !/^(STYLE|SCRIPT|TEMPLATE)$/.test(c.tagName));\n return normalizeText(parts.map((c) => (c as HTMLElement).innerText ?? c.textContent).join(\" \"));\n}\n\n/** Short human-readable text for an element, trimmed to 200 characters. */\nexport function textSnapshotOf(el: Element): string {\n const he = el as HTMLElement;\n const own = normalizeText(he.innerText ?? el.textContent) || shadowText(el);\n const alt = normalizeText(el.getAttribute(\"aria-label\") || el.getAttribute(\"title\") || el.getAttribute(\"placeholder\") || el.getAttribute(\"alt\") || (el as HTMLInputElement).value);\n return (own || alt).slice(0, 200);\n}\n\n/**\n * Generates an ordered list of selector strategies for an element, most robust first:\n * stable id → data-* attributes → aria-label → role/name → short unique CSS path → visible text.\n */\nexport function generateSelectors(el: Element): SelectorStrategy[] {\n const out: SelectorStrategy[] = [];\n const seen = new Set<string>();\n const push = (s: SelectorStrategy) => {\n const k = `${s.kind}:${s.value}`;\n if (!seen.has(k)) {\n seen.add(k);\n out.push(s);\n }\n };\n const tag = el.tagName.toLowerCase();\n // A selector scoped into a shadow root (`host >>> sel`) is always pushed as plain CSS.\n const pushFor = (kind: SelectorStrategy[\"kind\"], selector: string, value: string, label: string) => {\n const resolved = selectorFor(el, selector);\n if (resolved === selector) push({ kind, value, label });\n else if (resolved) push({ kind: \"css\", value: resolved, label });\n return !!resolved;\n };\n\n // A Guidely id is shared with the mobile apps, so it is the most portable target there is.\n const guidelyId = el.getAttribute(\"data-guidely-id\");\n if (guidelyId) pushFor(\"guidely-id\", attrSelector(\"data-guidely-id\", guidelyId), guidelyId, `Guidely id ${guidelyId}`);\n if (isStableId(el.id)) pushFor(\"id\", `#${escapeCss(el.id)}`, `#${el.id}`, `id ${el.id}`);\n\n const dataAttrs = Array.from(el.attributes).filter((a) => a.name.startsWith(\"data-\") && !IGNORED_DATA_ATTRS.test(a.name) && a.value && a.value.length <= 120 && !/\\d{5,}/.test(a.value));\n dataAttrs.sort((a, b) => {\n const ia = PREFERRED_DATA_ATTRS.indexOf(a.name);\n const ib = PREFERRED_DATA_ATTRS.indexOf(b.name);\n return (ia === -1 ? 99 : ia) - (ib === -1 ? 99 : ib);\n });\n for (const a of dataAttrs) {\n const sel = attrSelector(a.name, a.value);\n if (!pushFor(\"data-attr\", sel, sel, `${a.name}=${a.value}`)) pushFor(\"data-attr\", tag + sel, tag + sel, `${a.name}=${a.value}`);\n }\n\n const aria = el.getAttribute(\"aria-label\");\n if (aria && aria.length <= 120) {\n const sel = attrSelector(\"aria-label\", aria);\n if (!pushFor(\"aria\", sel, sel, aria)) pushFor(\"aria\", tag + sel, tag + sel, aria);\n }\n\n const name = el.getAttribute(\"name\");\n if (name) pushFor(\"css\", tag + attrSelector(\"name\", name), tag + attrSelector(\"name\", name), `${tag} name=${name}`);\n const role = el.getAttribute(\"role\");\n if (role) {\n const title = el.getAttribute(\"title\") || el.getAttribute(\"aria-labelledby\");\n const sel = title ? `[role='${role}']${attrSelector(el.getAttribute(\"title\") ? \"title\" : \"aria-labelledby\", title)}` : `[role='${role}']`;\n pushFor(\"css\", sel, sel, `role ${role}`);\n }\n if (tag === \"a\") {\n const href = el.getAttribute(\"href\");\n if (href && href.length <= 200) pushFor(\"css\", `a${attrSelector(\"href\", href)}`, `a${attrSelector(\"href\", href)}`, `link ${href}`);\n }\n\n const path = cssPath(el, shadowRootOf(el) ?? el.ownerDocument);\n if (path) pushFor(\"css\", path, path, \"css path\");\n\n if (/^(button|a|h[1-6]|label|summary)$/.test(tag) || role === \"button\" || role === \"link\" || role === \"tab\" || role === \"menuitem\") {\n const text = normalizeText((el as HTMLElement).innerText ?? el.textContent);\n if (text && text.length <= 80) push({ kind: \"text\", value: text, label: `text \"${text}\"` });\n }\n return out.slice(0, 10);\n}\n\nexport interface ElementDescription {\n selectors: SelectorStrategy[];\n textSnapshot: string;\n rect: { x: number; y: number; width: number; height: number };\n tag: string;\n}\n\n/**\n * An element's on-screen box. For a shadow host that is its own box joined with its shadow content's:\n * an `inline` host (the default for custom elements) is only a line tall around a taller button, and\n * a `display: contents` host has no box at all.\n */\nexport function visualRect(el: Element): DOMRect {\n const own = el.getBoundingClientRect();\n if (!el.shadowRoot) return own;\n const boxes = [own, ...Array.from(el.shadowRoot.children).map((c) => c.getBoundingClientRect())].filter((r) => r.width > 0 && r.height > 0);\n if (boxes.length < 2) return boxes[0] ?? own;\n const left = Math.min(...boxes.map((r) => r.left));\n const top = Math.min(...boxes.map((r) => r.top));\n const right = Math.max(...boxes.map((r) => r.right));\n const bottom = Math.max(...boxes.map((r) => r.bottom));\n return new DOMRect(left, top, right - left, bottom - top);\n}\n\n/** Growth from a control's box to its component's that still counts as \"the same control\" (label + field). */\nconst ANCHOR_MAX_AREA_RATIO = 4;\nconst CONTROL_SELECTOR = \"button, a[href], input, select, textarea, [role='button'], [role='link'], [role='checkbox'], [role='radio'], [role='switch'], [role='tab'], [role='menuitem'], [role='combobox'], [role='option']\";\n\n/**\n * The element a pick should target. Inside a component (a shadow host) that is little more than the\n * picked control (`lightning-button` around its `<button>`, also when the pick is the button's icon;\n * `lightning-input` around its label and field), that is the component itself: the app's markup around a component is the app's, while a\n * design system can change a component's internals in any release. Repeats up nested components and\n * stops at the first one that is clearly more (a list, a form, the whole app). Without layout (tests,\n * hidden pages) the element is kept.\n */\nexport function componentAnchor(el: Element): Element {\n if (!hasLayout(el.ownerDocument)) return el;\n let cur = el;\n for (let root = shadowRootOf(cur); root; root = shadowRootOf(cur)) {\n const host = root.host;\n if (host.id === HOST_ID) break;\n let control: Element | null = null;\n try {\n control = cur.closest(CONTROL_SELECTOR); // stays within this shadow root\n } catch {\n /* ignore */\n }\n const r = visualRect(control ?? cur);\n const area = r.width * r.height;\n const h = visualRect(host);\n const hostArea = h.width * h.height;\n const inside = r.left >= h.left - 1 && r.top >= h.top - 1 && r.right <= h.right + 1 && r.bottom <= h.bottom + 1;\n if (!area || !inside || hostArea > area * ANCHOR_MAX_AREA_RATIO) break;\n cur = host;\n }\n return cur;\n}\n\n/**\n * Everything the authoring picker and how-to capture need for one element. Selectors and rect are\n * for its `componentAnchor`; the text falls back to the element's own.\n */\nexport function describeElement(el: Element): ElementDescription {\n const target = componentAnchor(el);\n const r = visualRect(target);\n return {\n selectors: generateSelectors(target),\n textSnapshot: textSnapshotOf(target) || textSnapshotOf(el),\n rect: { x: r.x, y: r.y, width: r.width, height: r.height },\n tag: target.tagName.toLowerCase(),\n };\n}\n","import { EMBED_IFRAME_ATTRS, VIDEO_ATTRS, isAllowedEmbedSrc, isSafeMediaUrl } from \"@guidelytech/shared/runtime\";\n\nconst ALLOWED_TAGS = new Set([\"p\", \"br\", \"strong\", \"b\", \"em\", \"i\", \"u\", \"a\", \"ul\", \"ol\", \"li\", \"img\", \"h1\", \"h2\", \"h3\", \"h4\", \"code\", \"pre\", \"blockquote\", \"span\", \"div\", \"hr\", \"button\"]);\nconst DROP_TAGS = new Set([\"script\", \"style\", \"object\", \"embed\", \"form\", \"input\", \"textarea\", \"select\", \"link\", \"meta\", \"base\", \"template\", \"svg\", \"math\", \"frame\", \"frameset\", \"noscript\"]);\nconst ALLOWED_ATTRS = new Set([\"href\", \"src\", \"alt\", \"title\", \"target\", \"rel\", \"class\", \"width\", \"height\", \"data-g-action\", \"data-g-value\"]);\nfunction isSafeUrl(value: string, attr: string, tag: string): boolean {\n // eslint-disable-next-line no-control-regex\n const v = value.trim().replace(/[\\u0000-\\u001f\\s]/g, \"\").toLowerCase();\n if (!v) return false;\n const m = /^([a-z][a-z0-9+.-]*):/.exec(v);\n if (!m) return true; // relative URL\n const scheme = m[1];\n if (scheme === \"data\") return tag === \"img\" && attr === \"src\" && v.startsWith(\"data:image/\");\n return scheme === \"http\" || scheme === \"https\" || scheme === \"mailto\" || scheme === \"tel\";\n}\n\nfunction sanitizeElement(el: Element): void {\n const tag = el.tagName.toLowerCase();\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n if (name.startsWith(\"on\") || !ALLOWED_ATTRS.has(name)) {\n el.removeAttribute(attr.name);\n continue;\n }\n if ((name === \"href\" || name === \"src\") && !isSafeUrl(attr.value, name, tag)) el.removeAttribute(attr.name);\n }\n if (tag === \"a\") {\n const target = el.getAttribute(\"target\");\n if (target && target !== \"_blank\" && target !== \"_self\") el.removeAttribute(\"target\");\n if (el.getAttribute(\"target\") === \"_blank\") el.setAttribute(\"rel\", \"noopener noreferrer\");\n }\n if (tag === \"button\") el.setAttribute(\"type\", \"button\");\n if (tag === \"img\") {\n for (const dim of [\"width\", \"height\"]) if (el.hasAttribute(dim) && !/^\\d{1,5}$/.test(el.getAttribute(dim)!)) el.removeAttribute(dim);\n el.setAttribute(\"loading\", \"lazy\");\n if (!el.getAttribute(\"alt\")) el.setAttribute(\"alt\", \"\");\n }\n}\n\n/**\n * Media elements are rebuilt from scratch rather than filtered: an `<iframe>` only for a canonical\n * YouTube/Vimeo/Loom/Wistia embed, a `<video>` only for an absolute http(s) file, each with fixed\n * attributes. Returns null when the element must go.\n */\nfunction rebuildMedia(el: Element): Element | null {\n const doc = el.ownerDocument;\n const tag = el.tagName.toLowerCase();\n const src = el.getAttribute(\"src\");\n let out: Element;\n if (tag === \"iframe\") {\n if (!isAllowedEmbedSrc(src)) return null;\n out = doc.createElement(\"iframe\");\n out.setAttribute(\"src\", src!);\n out.setAttribute(\"title\", el.getAttribute(\"title\") || \"Embedded video\");\n for (const [k, v] of Object.entries(EMBED_IFRAME_ATTRS)) out.setAttribute(k, v);\n } else {\n if (!isSafeMediaUrl(src)) return null;\n out = doc.createElement(\"video\");\n out.setAttribute(\"src\", src!);\n const poster = el.getAttribute(\"poster\");\n if (isSafeMediaUrl(poster)) out.setAttribute(\"poster\", poster!);\n for (const [k, v] of Object.entries(VIDEO_ATTRS)) out.setAttribute(k, v);\n }\n return out;\n}\n\nfunction walk(node: Node): void {\n const children = Array.from(node.childNodes);\n for (const child of children) {\n if (child.nodeType === 8 /* comment */) {\n node.removeChild(child);\n continue;\n }\n if (child.nodeType !== 1) continue;\n const el = child as Element;\n const tag = el.tagName.toLowerCase();\n if (DROP_TAGS.has(tag)) {\n node.removeChild(el);\n continue;\n }\n if (tag === \"iframe\" || tag === \"video\") {\n const media = rebuildMedia(el);\n if (media) node.replaceChild(media, el);\n else node.removeChild(el);\n continue;\n }\n if (!ALLOWED_TAGS.has(tag)) {\n // Unwrap: keep text/children, drop the element itself.\n while (el.firstChild) node.insertBefore(el.firstChild, el);\n node.removeChild(el);\n // Re-walk the parent since children moved up.\n walk(node);\n return;\n }\n sanitizeElement(el);\n walk(el);\n }\n}\n\n/**\n * Parses HTML into a sanitized DocumentFragment using a strict allowlist. No external\n * dependency: a `<template>` element parses inertly and the tree is walked element by element.\n */\nexport function sanitizeToFragment(html: string, doc: Document = document): DocumentFragment {\n const tpl = doc.createElement(\"template\");\n tpl.innerHTML = html || \"\";\n walk(tpl.content);\n return tpl.content;\n}\n\n/** Returns sanitized HTML as a string. */\nexport function sanitizeHtml(html: string, doc: Document = document): string {\n const frag = sanitizeToFragment(html, doc);\n const div = doc.createElement(\"div\");\n div.appendChild(frag);\n return div.innerHTML;\n}\n\n/** Replaces the content of `el` with the sanitized HTML. */\nexport function setSanitizedHtml(el: Element, html: string): void {\n el.textContent = \"\";\n el.appendChild(sanitizeToFragment(html, el.ownerDocument));\n}\n","import { FILE_LINK_CLASS, PDF_BLOCK_CLASS, PDF_PAGES_CLASS } from \"@guidelytech/shared/runtime\";\nimport { prefersReducedMotion } from \"./host\";\n\n/**\n * Turns the PDFs in a sanitized article body (`div.gd-pdf`: the PDF link plus its pages as images)\n * into inline viewers: pages swipe sideways with a page counter and previous/next buttons, and the\n * header or a tap on a page opens a full-screen reader inside the widget, so visitors read the\n * document without downloading it. The original PDF stays one tap away in the reader. Without this\n * (or without script) the CSS alone still shows a scrollable strip of pages.\n */\nexport function enhancePdfViewers(root: Element, doc: Document = root.ownerDocument): void {\n for (const block of Array.from(root.querySelectorAll(`div.${PDF_BLOCK_CLASS}`))) {\n const link = block.querySelector<HTMLAnchorElement>(`a.${FILE_LINK_CLASS}`);\n const strip = block.querySelector<HTMLElement>(`.${PDF_PAGES_CLASS}`);\n if (!link || !strip || block.hasAttribute(\"data-g-ready\")) continue;\n // The sanitizer strips unsafe sources; those images aren't pages.\n for (const img of Array.from(strip.querySelectorAll(\"img:not([src])\"))) img.remove();\n const pages = Array.from(strip.querySelectorAll(\"img\"));\n if (!pages.length) {\n strip.remove();\n continue;\n }\n block.setAttribute(\"data-g-ready\", \"\");\n const name = (link.textContent || \"\").trim() || \"PDF\";\n block.setAttribute(\"role\", \"group\");\n block.setAttribute(\"aria-label\", `${name}, ${pages.length} ${pages.length === 1 ? \"page\" : \"pages\"}`);\n link.setAttribute(\"aria-label\", `Read ${name} full screen`);\n link.addEventListener(\"click\", (e) => {\n e.preventDefault();\n openReader(doc, block, link, pages, 0);\n });\n\n const viewport = doc.createElement(\"div\");\n viewport.className = \"g-pdf-viewport\";\n strip.replaceWith(viewport);\n viewport.appendChild(strip);\n strip.tabIndex = 0;\n strip.setAttribute(\"aria-label\", `${name} pages`);\n\n const counter = doc.createElement(\"span\");\n counter.className = \"g-pdf-count\";\n counter.setAttribute(\"aria-live\", \"polite\");\n const prev = navButton(doc, \"prev\", \"Previous page\", \"‹\");\n const next = navButton(doc, \"next\", \"Next page\", \"›\");\n viewport.append(prev, next, counter);\n\n // Distance between page starts: one page width plus the gap.\n const stride = () => Math.max(1, pages.length > 1 ? pages[1]!.offsetLeft - pages[0]!.offsetLeft : strip.clientWidth);\n const current = () => Math.round(strip.scrollLeft / stride());\n const go = (i: number) => strip.scrollTo({ left: Math.max(0, Math.min(pages.length - 1, i)) * stride(), behavior: prefersReducedMotion() ? \"auto\" : \"smooth\" });\n const update = () => {\n const i = Math.min(pages.length - 1, current());\n counter.textContent = `${i + 1} / ${pages.length}`;\n prev.disabled = i === 0;\n next.disabled = i >= pages.length - 1;\n };\n prev.addEventListener(\"click\", () => go(current() - 1));\n next.addEventListener(\"click\", () => go(current() + 1));\n strip.addEventListener(\"scroll\", update, { passive: true });\n strip.addEventListener(\"keydown\", (e) => {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") {\n e.preventDefault();\n go(current() + (e.key === \"ArrowRight\" ? 1 : -1));\n } else if (e.key === \"Enter\") openReader(doc, block, link, pages, current());\n });\n pages.forEach((img, i) => img.addEventListener(\"click\", () => openReader(doc, block, link, pages, i)));\n if (pages.length === 1) viewport.classList.add(\"g-pdf-single\");\n update();\n }\n}\n\nfunction navButton(doc: Document, cls: string, label: string, text: string) {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.className = `g-pdf-nav g-pdf-${cls}`;\n b.setAttribute(\"aria-label\", label);\n b.textContent = text;\n return b;\n}\n\n/** Full-screen reader: every page stacked vertically, the original PDF linked, Escape to close. */\nfunction openReader(doc: Document, block: Element, link: HTMLAnchorElement, pages: HTMLImageElement[], start: number) {\n const host = (block.closest(\".g-scope\") as HTMLElement | null) ?? doc.body;\n // Inside the shadow root, `document.activeElement` is only the host.\n const returnFocus = (block.getRootNode() as Document | ShadowRoot).activeElement as HTMLElement | null;\n const name = (link.textContent || \"\").trim() || \"PDF\";\n\n const reader = doc.createElement(\"div\");\n reader.className = \"g-pdf-reader\";\n reader.setAttribute(\"role\", \"dialog\");\n reader.setAttribute(\"aria-modal\", \"true\");\n reader.setAttribute(\"aria-label\", name);\n const bar = doc.createElement(\"div\");\n bar.className = \"g-pdf-bar\";\n const title = doc.createElement(\"span\");\n title.className = \"g-pdf-title\";\n title.textContent = name;\n const original = doc.createElement(\"a\");\n original.className = \"g-btn g-btn-secondary\";\n original.href = link.href;\n original.target = \"_blank\";\n original.rel = \"noopener noreferrer\";\n original.textContent = \"Open PDF ↗\";\n const close = doc.createElement(\"button\");\n close.type = \"button\";\n close.className = \"g-close g-pdf-close\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.textContent = \"×\";\n bar.append(title, original, close);\n\n const scroller = doc.createElement(\"div\");\n scroller.className = \"g-pdf-scroll\";\n scroller.tabIndex = 0;\n for (const page of pages) {\n const img = doc.createElement(\"img\");\n img.src = page.src;\n img.alt = page.alt;\n img.decoding = \"async\";\n // Sizes up front so every page has its height before loading, and opening at page N lands on it.\n for (const dim of [\"width\", \"height\"]) if (page.hasAttribute(dim)) img.setAttribute(dim, page.getAttribute(dim)!);\n scroller.appendChild(img);\n }\n reader.append(bar, scroller);\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n done();\n } else if (e.key === \"Tab\") {\n // Keep focus inside the reader.\n const items: HTMLElement[] = [original, close, scroller];\n const at = items.indexOf((reader.getRootNode() as Document | ShadowRoot).activeElement as HTMLElement);\n e.preventDefault();\n items[(at + (e.shiftKey ? items.length - 1 : 1)) % items.length]!.focus();\n }\n };\n const done = () => {\n reader.remove();\n returnFocus?.focus?.({ preventScroll: true });\n };\n close.addEventListener(\"click\", done);\n reader.addEventListener(\"keydown\", onKey);\n host.appendChild(reader);\n close.focus();\n const target = scroller.children[start] as HTMLImageElement | undefined;\n if (target && start > 0) {\n const land = () => (scroller.scrollTop = target.offsetTop - 12);\n requestAnimationFrame(land);\n // Pages without stored sizes only get their height once the pages above have loaded.\n if (!target.hasAttribute(\"height\")) for (const img of Array.from(scroller.children).slice(0, start)) img.addEventListener(\"load\", land, { once: true });\n }\n}\n","import type { Appearance, ProjectTheme } from \"@guidelytech/shared\";\nimport { readableTextOn, scopeCustomCss } from \"@guidelytech/shared/runtime\";\nimport { STYLES } from \"./styles\";\n\nexport const HOST_ID = \"guidely-root\";\n\nexport interface HostHandle {\n host: HTMLElement;\n shadow: ShadowRoot;\n /** Polite live region for screen-reader announcements. */\n live: HTMLElement;\n announce(text: string): void;\n destroy(): void;\n}\n\nlet current: HostHandle | null = null;\n\n/** Default project theme used when the config has not loaded yet. */\nexport const DEFAULT_THEME: ProjectTheme = {\n primaryColor: \"#4f46e5\",\n backgroundColor: \"#ffffff\",\n textColor: \"#111827\",\n borderRadius: 12,\n fontFamily: \"Inter, system-ui, -apple-system, sans-serif\",\n};\n\n/** Returns (creating when needed) the single Shadow-DOM host appended to `document.body`. */\nexport function ensureHost(doc: Document = document): HostHandle {\n if (current && current.host.isConnected && current.host.ownerDocument === doc) return current;\n let host = doc.getElementById(HOST_ID) as HTMLElement | null;\n if (!host) {\n host = doc.createElement(\"div\");\n host.id = HOST_ID;\n host.setAttribute(\"data-guidely\", \"\");\n (doc.body || doc.documentElement).appendChild(host);\n }\n const shadow = host.shadowRoot ?? host.attachShadow({ mode: \"open\" });\n if (!shadow.querySelector(\"style[data-g-base]\")) {\n const style = doc.createElement(\"style\");\n style.setAttribute(\"data-g-base\", \"\");\n style.textContent = STYLES;\n shadow.appendChild(style);\n }\n let live = shadow.querySelector<HTMLElement>(\".g-live\");\n if (!live) {\n live = doc.createElement(\"div\");\n live.className = \"g-live\";\n live.setAttribute(\"aria-live\", \"polite\");\n live.setAttribute(\"aria-atomic\", \"true\");\n shadow.appendChild(live);\n }\n const liveEl = live;\n current = {\n host,\n shadow,\n live: liveEl,\n announce(text: string) {\n liveEl.textContent = \"\";\n setTimeout(() => {\n liveEl.textContent = text;\n }, 30);\n },\n destroy() {\n host?.remove();\n if (current?.host === host) current = null;\n },\n };\n return current;\n}\n\n/** Removes the host from the document (all overlays with it). */\nexport function destroyHost(): void {\n current?.destroy();\n const stray = typeof document !== \"undefined\" ? document.getElementById(HOST_ID) : null;\n stray?.remove();\n current = null;\n}\n\nexport type ResolvedThemeMode = \"light\" | \"dark\";\n\nfunction prefersDark(): boolean {\n try {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n } catch {\n return false;\n }\n}\n\nexport function prefersReducedMotion(): boolean {\n try {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n } catch {\n return false;\n }\n}\n\nexport interface ThemeVars {\n primary: string;\n bg: string;\n text: string;\n radius: number;\n font: string;\n z: number;\n overlay: number;\n mode: ResolvedThemeMode;\n animation: Appearance[\"animation\"];\n}\n\n/** Merges project theme + guide appearance into CSS custom property values. */\nexport function resolveTheme(theme: Partial<ProjectTheme> | null | undefined, appearance?: Partial<Appearance> | null): ThemeVars {\n const t = { ...DEFAULT_THEME, ...(theme || {}) };\n const a = appearance || {};\n const requested = a.theme ?? \"auto\";\n const mode: ResolvedThemeMode = requested === \"auto\" ? (prefersDark() ? \"dark\" : \"light\") : requested;\n const dark = mode === \"dark\";\n return {\n primary: a.primaryColor || t.primaryColor,\n bg: a.backgroundColor || (dark ? \"#1f2937\" : t.backgroundColor),\n text: a.textColor || (dark ? \"#f9fafb\" : t.textColor),\n radius: a.borderRadius ?? t.borderRadius,\n font: a.fontFamily || t.fontFamily,\n z: a.zIndex ?? 2147483000,\n overlay: a.overlayOpacity ?? 0.5,\n mode,\n animation: prefersReducedMotion() ? \"none\" : (a.animation ?? \"fade\"),\n };\n}\n\n/** Applies theme variables to a scope element. */\nexport function applyTheme(el: HTMLElement, vars: ThemeVars): void {\n el.style.setProperty(\"--g-primary\", vars.primary);\n // Button labels, banners and badges on the primary colour use whichever of white or dark text reads better (WCAG AA).\n if (/^#[0-9a-f]{3}([0-9a-f]{3})?$/i.test(vars.primary)) el.style.setProperty(\"--g-primary-text\", readableTextOn(vars.primary));\n el.style.setProperty(\"--g-bg\", vars.bg);\n el.style.setProperty(\"--g-text\", vars.text);\n el.style.setProperty(\"--g-radius\", `${vars.radius}px`);\n el.style.setProperty(\"--g-font\", vars.font);\n el.style.setProperty(\"--g-z\", String(vars.z));\n el.style.setProperty(\"--g-overlay\", String(vars.overlay));\n el.setAttribute(\"data-theme\", vars.mode);\n el.setAttribute(\"data-anim\", vars.animation);\n}\n\n/**\n * Creates a themed scope container inside the shadow root. Each guide/widget renders inside its\n * own scope so appearance settings never leak between guides.\n */\nexport function createScope(theme?: Partial<ProjectTheme> | null, appearance?: Partial<Appearance> | null, doc: Document = document): { el: HTMLElement; vars: ThemeVars; destroy(): void } {\n const handle = ensureHost(doc);\n const el = doc.createElement(\"div\");\n el.className = \"g-scope\";\n const vars = resolveTheme(theme, appearance);\n applyTheme(el, vars);\n handle.shadow.appendChild(el);\n // Custom CSS (theme first, then the guide's) is sanitized and prefixed with this scope only. The\n // theme's CSS styles guides (scopes created with an appearance), not the resource center or messenger.\n const css = [appearance ? theme?.customCss : undefined, appearance?.customCss].filter((c): c is string => !!c && !!c.trim());\n let style: HTMLStyleElement | null = null;\n if (css.length) {\n const id = `c${++cssScopeSeq}`;\n el.setAttribute(\"data-g-css\", id);\n style = doc.createElement(\"style\");\n style.setAttribute(\"data-g-custom\", id);\n style.textContent = css.map((c) => scopeCustomCss(c, `.g-scope[data-g-css=\"${id}\"]`)).join(\"\\n\");\n handle.shadow.insertBefore(style, el);\n }\n let mq: MediaQueryList | null = null;\n const onChange = () => applyTheme(el, resolveTheme(theme, appearance));\n if ((appearance?.theme ?? \"auto\") === \"auto\" && typeof window !== \"undefined\" && typeof window.matchMedia === \"function\") {\n try {\n mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener?.(\"change\", onChange);\n } catch {\n mq = null;\n }\n }\n return {\n el,\n vars,\n destroy() {\n mq?.removeEventListener?.(\"change\", onChange);\n style?.remove();\n el.remove();\n },\n };\n}\n\nlet cssScopeSeq = 0;\n","/** All runtime CSS, injected once into the Shadow DOM host. Tokens are CSS custom properties. */\nexport const STYLES = `\n:host{all:initial;position:static;display:block;contain:none}\n*,*::before,*::after{box-sizing:border-box}\n.g-scope [hidden]{display:none!important}\n.g-scope{\n --g-primary:#4f46e5;--g-bg:#ffffff;--g-text:#111827;--g-radius:12px;--g-font:Inter,system-ui,-apple-system,sans-serif;--g-z:2147483000;--g-overlay:.5;\n --g-muted:color-mix(in srgb,var(--g-text) 62%,transparent);--g-border:color-mix(in srgb,var(--g-text) 12%,transparent);\n --g-subtle:color-mix(in srgb,var(--g-text) 5%,transparent);--g-shadow:0 10px 40px rgba(0,0,0,.18),0 2px 8px rgba(0,0,0,.08);\n --g-primary-text:#ffffff;\n font-family:var(--g-font);font-size:14px;line-height:1.5;color:var(--g-text);-webkit-font-smoothing:antialiased;\n}\n.g-scope[data-theme=\"dark\"]{--g-shadow:0 10px 40px rgba(0,0,0,.5),0 2px 8px rgba(0,0,0,.3)}\n.g-live{position:fixed;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\n.g-layer{position:fixed;inset:0;z-index:var(--g-z);pointer-events:none}\n.g-overlay{position:fixed;inset:0;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}\n.g-overlay.g-transparent{background:transparent}\n.g-spot-rect{position:fixed;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}\n.g-spot-ring{position:fixed;z-index:calc(var(--g-z) + 3);pointer-events:none;border-radius:6px;box-shadow:0 0 0 2px var(--g-primary),0 0 0 6px color-mix(in srgb,var(--g-primary) 30%,transparent)}\n.g-card{\n position:fixed;z-index:calc(var(--g-z) + 4);pointer-events:auto;background:var(--g-bg);color:var(--g-text);border-radius:var(--g-radius);\n box-shadow:var(--g-shadow);border:1px solid var(--g-border);width:min(360px,calc(100vw - 32px));max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow:auto;outline:none;\n}\n.g-card.g-modal{left:50%;top:50%;transform:translate(-50%,-50%);width:min(480px,calc(100vw - 32px))}\n.g-card.g-tooltip,.g-card.g-popover,.g-card.g-spotlight-card,.g-card.g-hotspot-card{top:0;left:0;width:min(320px,calc(100vw - 32px))}\n.g-card.g-slideout{width:min(360px,calc(100vw - 32px));margin:16px}\n.g-pos-bottom-right{right:0;bottom:0}.g-pos-bottom-left{left:0;bottom:0}.g-pos-top-right{right:0;top:0}.g-pos-top-left{left:0;top:0}\n.g-pos-center{left:50%;top:50%;transform:translate(-50%,-50%)}\n.g-pos-top{top:0;left:0;right:0}.g-pos-bottom{bottom:0;left:0;right:0}\n.g-banner{position:fixed;left:0;right:0;z-index:calc(var(--g-z) + 1);pointer-events:auto;background:var(--g-primary);color:var(--g-primary-text);padding:10px 48px 10px 16px;display:flex;align-items:center;gap:12px;font-size:14px;box-shadow:0 2px 10px rgba(0,0,0,.15);max-width:100vw}\n.g-banner .g-body{flex:1;min-width:0}\n.g-banner .g-body a{color:inherit;text-decoration:underline}\n.g-banner .g-close{color:inherit;right:8px;top:50%;transform:translateY(-50%)}\n.g-banner .g-btn{background:rgba(255,255,255,.18);color:inherit;border-color:transparent;min-height:36px}\n.g-banner.g-pos-top{top:0}.g-banner.g-pos-bottom{bottom:0}\n.g-inner{padding:20px}\n.g-close{position:absolute;top:8px;right:8px;width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border:0;background:transparent;color:var(--g-muted);border-radius:999px;cursor:pointer;font:inherit;font-size:20px;line-height:1}\n.g-close:hover,.g-close:focus-visible{background:var(--g-subtle);color:var(--g-text);outline:none}\n.g-close:focus-visible,.g-btn:focus-visible,.g-task:focus-visible,.g-choice:focus-visible,.g-scale button:focus-visible,.g-launcher:focus-visible,.g-input:focus-visible,.g-rc-item:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-image{display:block;width:100%;max-height:220px;object-fit:cover;border-radius:var(--g-radius) var(--g-radius) 0 0}\n.g-title{margin:0 28px 6px 0;font-size:16px;font-weight:600;line-height:1.3}\n.g-body{font-size:14px;color:var(--g-text)}\n.g-body p{margin:0 0 8px}.g-body p:last-child{margin-bottom:0}\n.g-body ul,.g-body ol{margin:6px 0;padding-left:20px}\n.g-body a{color:var(--g-primary)}\n.g-body img{max-width:100%;height:auto;border-radius:6px}\n.g-body video,.g-body iframe{display:block;width:100%;max-width:100%;border:0;border-radius:6px;margin:8px 0;background:#000}\n.g-body video{height:auto;max-height:60vh}\n.g-body iframe{aspect-ratio:16/9;height:auto}\n.g-body .gd-pdf{margin:10px 0;border:1px solid var(--g-border);border-radius:10px;background:var(--g-subtle);overflow:hidden}\n.g-body a.gd-file{display:flex;align-items:center;gap:8px;padding:8px 10px;color:var(--g-text);font-size:13px;font-weight:500;text-decoration:none;min-height:40px;overflow-wrap:anywhere}\n.g-body a.gd-file::before{content:\"PDF\";flex:none;font-size:9px;font-weight:700;letter-spacing:.04em;line-height:1;color:#fff;background:#e5484d;border-radius:4px;padding:4px 5px}\n.g-body a.gd-file::after{content:\"⤢\";margin-left:auto;padding-left:8px;color:var(--g-muted);font-size:15px}\n.g-body a.gd-file:hover::after,.g-body a.gd-file:focus-visible::after{color:var(--g-primary)}\n.g-body a.gd-file:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px;border-radius:10px}\n.g-body > a.gd-file,.g-body p > a.gd-file{margin:10px 0;border:1px solid var(--g-border);border-radius:10px;background:var(--g-subtle)}\n.g-body > a.gd-file::after,.g-body p > a.gd-file::after,.g-body .gd-pdf:not([data-g-ready]) > a.gd-file::after{content:\"↗\"}\n.g-pdf-viewport{position:relative}\n.g-body .gd-pdf-pages{display:flex;gap:10px;overflow-x:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;scrollbar-width:none;padding:0 10px 10px;scroll-padding:0 10px}\n.g-body .gd-pdf-pages::-webkit-scrollbar{display:none}\n.g-body .gd-pdf-pages:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px}\n.g-body .gd-pdf-pages img{flex:0 0 100%;width:100%;height:auto;margin:0;scroll-snap-align:center;background:#fff;border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.18);cursor:zoom-in}\n.g-pdf-viewport .gd-pdf-pages{padding:0;scroll-padding:0;margin:0 10px 10px}\n.g-pdf-count{position:absolute;right:18px;bottom:18px;padding:2px 8px;border-radius:999px;background:rgba(17,17,17,.72);color:#fff;font-size:11px;font-weight:500;pointer-events:none;font-variant-numeric:tabular-nums}\n.g-pdf-nav{position:absolute;top:calc(50% - 21px);width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:999px;background:rgba(17,17,17,.6);color:#fff;font:inherit;font-size:20px;line-height:1;cursor:pointer;opacity:0;transition:opacity .15s}\n.g-pdf-prev{left:16px}.g-pdf-next{right:16px}\n.g-pdf-viewport:hover .g-pdf-nav,.g-pdf-nav:focus-visible{opacity:1}\n.g-pdf-nav:disabled,.g-pdf-single .g-pdf-nav,.g-pdf-single .g-pdf-count{display:none}\n.g-pdf-nav:focus-visible{outline:2px solid #fff;outline-offset:1px}\n@media (hover:none){.g-pdf-nav{display:none}}\n.g-pdf-reader{position:fixed;inset:0;z-index:calc(var(--g-z) + 10);display:flex;flex-direction:column;background:#0b0b0d;pointer-events:auto;color:#fff}\n.g-pdf-bar{display:flex;align-items:center;gap:10px;padding:8px 8px 8px 16px;min-height:56px}\n.g-pdf-title{flex:1;min-width:0;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.g-pdf-bar .g-btn{min-height:36px;color:#fff;background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.18)}\n.g-pdf-close{position:static;color:#fff}\n.g-pdf-close:hover,.g-pdf-close:focus-visible{background:rgba(255,255,255,.14);color:#fff}\n.g-pdf-scroll{position:relative;flex:1;overflow-y:auto;overscroll-behavior:contain;padding:4px 16px 24px;display:flex;flex-direction:column;align-items:center;gap:12px;outline:none}\n.g-pdf-scroll img{display:block;width:100%;max-width:900px;height:auto;background:#fff;border-radius:2px;box-shadow:0 2px 12px rgba(0,0,0,.4)}\n.g-body code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;background:var(--g-subtle);padding:1px 4px;border-radius:4px}\n.g-body pre{background:var(--g-subtle);padding:10px;border-radius:6px;overflow:auto}\n.g-body blockquote{margin:6px 0;padding-left:10px;border-left:3px solid var(--g-border);color:var(--g-muted)}\n.g-footer{display:flex;align-items:center;gap:8px;margin-top:14px;flex-wrap:wrap}\n.g-progress{font-size:12px;color:var(--g-muted);margin-right:auto}\n.g-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:8px 14px;border-radius:calc(var(--g-radius) * .66);border:1px solid transparent;font:inherit;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;transition:background .15s,color .15s,border-color .15s}\n.g-btn-primary{background:var(--g-primary);color:var(--g-primary-text)}\n.g-btn-primary:hover{filter:brightness(1.08)}\n.g-btn-secondary{background:var(--g-subtle);color:var(--g-text);border-color:var(--g-border)}\n.g-btn-secondary:hover{background:color-mix(in srgb,var(--g-text) 10%,transparent)}\n.g-btn-ghost{background:transparent;color:var(--g-muted)}\n.g-btn-ghost:hover{background:var(--g-subtle);color:var(--g-text)}\n.g-btn-link{background:transparent;color:var(--g-primary);padding-left:4px;padding-right:4px}\n.g-btn-link:hover{text-decoration:underline}\n.g-btn:disabled{opacity:.5;cursor:not-allowed}\n.g-arrow{position:absolute;width:12px;height:12px;background:var(--g-bg);transform:rotate(45deg);border:1px solid var(--g-border);z-index:-1}\n.g-hotspot{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;border-radius:999px;background:var(--g-primary);border:2px solid #fff;box-shadow:0 0 0 2px color-mix(in srgb,var(--g-primary) 40%,transparent);cursor:pointer;padding:0;margin:0}\n.g-hotspot::after{content:\"\";position:absolute;inset:-4px;border-radius:999px;border:2px solid var(--g-primary);opacity:0}\n.g-hotspot.g-pulse::after{animation:g-pulse 1.8s ease-out infinite}\n.g-hotspot-hit{position:absolute;inset:-14px}\n.g-custom{position:fixed;z-index:calc(var(--g-z) + 4);pointer-events:auto;left:50%;top:50%;transform:translate(-50%,-50%);max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow:auto}\n/* animations */\n.g-scope[data-anim=\"fade\"] .g-card,.g-scope[data-anim=\"fade\"] .g-banner,.g-scope[data-anim=\"fade\"] .g-panel{animation:g-fade .18s ease-out}\n.g-scope[data-anim=\"slide\"] .g-card,.g-scope[data-anim=\"slide\"] .g-panel{animation:g-slide .22s ease-out}\n.g-scope[data-anim=\"none\"] *{animation:none!important;transition:none!important}\n@keyframes g-fade{from{opacity:0}to{opacity:1}}\n@keyframes g-slide{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}\n@keyframes g-pulse{0%{transform:scale(.6);opacity:.9}100%{transform:scale(2.2);opacity:0}}\n@media (prefers-reduced-motion:reduce){.g-scope *{animation:none!important;transition:none!important}}\n/* launcher + panel (checklist / resource center) */\n.g-launcher{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:10px 16px;border-radius:999px;border:0;background:var(--g-primary);color:var(--g-primary-text);font:inherit;font-size:14px;font-weight:600;cursor:pointer;box-shadow:var(--g-shadow);margin:16px}\n.g-launcher .g-ring{width:22px;height:22px;border-radius:999px;background:conic-gradient(#fff var(--g-pct,0%),rgba(255,255,255,.3) 0);display:inline-flex;align-items:center;justify-content:center;font-size:10px;position:relative}\n.g-launcher .g-ring::after{content:\"\";position:absolute;inset:3px;border-radius:999px;background:var(--g-primary)}\n.g-launcher .g-count{position:relative;z-index:1}\n.g-panel{position:fixed;z-index:calc(var(--g-z) + 2);pointer-events:auto;width:min(380px,calc(100vw - 32px));max-height:min(620px,calc(100vh - 100px));display:flex;flex-direction:column;background:var(--g-bg);color:var(--g-text);border-radius:var(--g-radius);box-shadow:var(--g-shadow);border:1px solid var(--g-border);margin:16px;bottom:60px;overflow:hidden}\n.g-panel-head{padding:16px 48px 12px 20px;border-bottom:1px solid var(--g-border);position:relative}\n.g-panel-title{margin:0;font-size:16px;font-weight:600}\n.g-panel-sub{margin:4px 0 0;font-size:12px;color:var(--g-muted)}\n.g-panel-body{overflow:auto;padding:8px 0;flex:1}\n.g-help{display:flex;flex-direction:column;min-height:0;flex:1}\n.g-bar{height:6px;border-radius:999px;background:var(--g-subtle);overflow:hidden;margin-top:10px}\n.g-bar > span{display:block;height:100%;background:var(--g-primary);transition:width .3s}\n.g-task{display:flex;gap:12px;align-items:flex-start;width:100%;padding:12px 20px;border:0;background:transparent;text-align:left;font:inherit;color:inherit;cursor:pointer;min-height:44px}\n.g-task:hover{background:var(--g-subtle)}\n.g-task[disabled]{cursor:not-allowed;opacity:.55}\n.g-task .g-check{flex:none;width:22px;height:22px;border-radius:999px;border:2px solid var(--g-border);display:inline-flex;align-items:center;justify-content:center;font-size:13px;margin-top:1px;color:#fff}\n.g-task.g-done .g-check{background:var(--g-primary);border-color:var(--g-primary)}\n.g-task.g-done .g-task-title{text-decoration:line-through;color:var(--g-muted)}\n.g-task-title{font-weight:500}\n.g-task-desc{font-size:12px;color:var(--g-muted);margin-top:2px}\n.g-panel-foot{padding:10px 20px;border-top:1px solid var(--g-border);display:flex;justify-content:flex-end;gap:8px}\n.g-complete{padding:28px 20px;text-align:center}\n.g-complete .g-title{margin-right:0;font-size:18px}\n/* survey */\n.g-question{margin-bottom:16px}\n.g-q-title{font-weight:600;margin:0 0 4px}\n.g-q-desc{font-size:12px;color:var(--g-muted);margin:0 0 8px}\n.g-scale{display:flex;gap:4px;flex-wrap:wrap}\n.g-scale button{min-width:34px;height:40px;flex:1;padding:0 4px;border-radius:6px;border:1px solid var(--g-border);background:var(--g-subtle);color:var(--g-text);font:inherit;cursor:pointer}\n.g-scale button[aria-pressed=\"true\"],.g-scale button:hover{background:var(--g-primary);color:var(--g-primary-text);border-color:var(--g-primary)}\n.g-scale-labels{display:flex;justify-content:space-between;font-size:11px;color:var(--g-muted);margin-top:4px}\n.g-stars button,.g-thumbs button{font-size:22px;background:transparent;border:0;cursor:pointer;color:var(--g-muted);min-width:40px;height:40px;font:inherit}\n.g-stars button[aria-pressed=\"true\"],.g-stars button.g-on{color:#f59e0b}\n.g-thumbs button[aria-pressed=\"true\"]{color:var(--g-primary)}\n.g-choice{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--g-border);border-radius:8px;margin-bottom:6px;cursor:pointer;min-height:40px;font:inherit;background:transparent;color:inherit;width:100%;text-align:left}\n.g-choice[aria-checked=\"true\"]{border-color:var(--g-primary);background:color-mix(in srgb,var(--g-primary) 8%,transparent)}\n.g-choice .g-dot{width:16px;height:16px;border-radius:999px;border:2px solid var(--g-border);flex:none}\n.g-choice.g-multi .g-dot{border-radius:4px}\n.g-choice[aria-checked=\"true\"] .g-dot{background:var(--g-primary);border-color:var(--g-primary)}\n.g-input{width:100%;min-height:40px;padding:8px 10px;border:1px solid var(--g-border);border-radius:8px;background:var(--g-bg);color:var(--g-text);font:inherit;resize:vertical}\n.g-error{color:#dc2626;font-size:12px;margin-top:4px}\n/* resource center */\n.g-rc-search{padding:12px 20px 4px}\n.g-rc-section{padding:8px 20px 4px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--g-muted);font-weight:600}\n.g-rc-section[data-depth]{text-transform:none;letter-spacing:0;font-size:12px}\n.g-rc-item{display:flex;align-items:flex-start;gap:10px;width:100%;padding:10px 20px;border:0;background:transparent;font:inherit;color:inherit;text-align:left;cursor:pointer;min-height:44px;text-decoration:none}\n.g-rc-item:hover{background:var(--g-subtle)}\n.g-rc-item .g-rc-title{font-weight:500}\n.g-rc-item .g-rc-sum{font-size:12px;color:var(--g-muted);margin-top:2px}\n.g-rc-item .g-rc-icon{flex:none;width:20px;text-align:center;color:var(--g-primary)}\n.g-rc-row{display:flex;align-items:center;gap:6px;padding-right:16px}\n.g-rc-row>.g-rc-item{flex:1;min-width:0;padding-right:4px}\n.g-rc-row:hover{background:var(--g-subtle)}\n.g-rc-row:hover>.g-rc-item{background:transparent}\n.g-rc-showme{flex:none;min-height:32px;padding:4px 10px;font-size:12px;white-space:nowrap}\n.g-help-showme{margin:4px 0 12px}\n.g-rc-article{padding:16px 20px}\n.g-resource-center .g-panel{transition:width .2s ease,max-height .2s ease}\n.g-resource-center .g-panel.g-panel-reading{width:min(720px,calc(100vw - 32px));max-height:calc(100vh - 100px)}\n.g-rc-back{margin-bottom:8px}\n.g-rc-empty{padding:24px 20px;color:var(--g-muted);text-align:center}\n.g-faq-a{padding:0 20px 12px 50px;font-size:13px;color:var(--g-muted)}\n.g-faq-a[hidden]{display:none}\n/* authoring */\n.g-auth-bar{position:fixed;top:0;left:0;right:0;z-index:calc(var(--g-z) + 10);pointer-events:auto;display:flex;align-items:center;gap:12px;padding:8px 16px;background:#111827;color:#fff;font:500 13px/1.4 var(--g-font);box-shadow:0 2px 10px rgba(0,0,0,.3)}\n.g-auth-bar .g-dot-live{width:8px;height:8px;border-radius:999px;background:#22c55e;box-shadow:0 0 0 3px rgba(34,197,94,.3)}\n.g-auth-bar .g-spacer{flex:1}\n.g-auth-bar .g-btn{min-height:32px;padding:4px 12px;font-size:13px}\n.g-auth-bar .g-btn-secondary{background:rgba(255,255,255,.12);color:#fff;border-color:transparent}\n.g-auth-outline{position:fixed;z-index:calc(var(--g-z) + 9);pointer-events:none;border:2px solid var(--g-primary);background:color-mix(in srgb,var(--g-primary) 12%,transparent);border-radius:4px;transition:all .06s linear}\n.g-auth-label{position:absolute;left:-2px;top:-24px;background:var(--g-primary);color:#fff;font:600 11px/1 var(--g-font);padding:5px 7px;border-radius:4px;white-space:nowrap;max-width:320px;overflow:hidden;text-overflow:ellipsis}\n.g-auth-outline.g-picked{border-style:dashed;border-color:#22c55e;background:rgba(34,197,94,.12)}\n.g-auth-outline.g-picked .g-auth-label{background:#16a34a}\n.g-highlight{position:fixed;z-index:calc(var(--g-z) + 8);pointer-events:none;border:2px dashed #f59e0b;background:rgba(245,158,11,.12);border-radius:4px}\n@media (max-width:480px){.g-card.g-modal,.g-panel{width:calc(100vw - 32px)}.g-inner{padding:16px}}\n/* resource center: unread badge + \"What's new\" */\n.g-launcher-badge{position:absolute;top:-4px;right:-4px;min-width:20px;height:20px;padding:0 6px;border-radius:999px;background:#dc2626;color:#fff;font-size:11px;font-weight:700;line-height:20px;text-align:center;box-shadow:0 0 0 2px var(--g-bg)}\n.g-rc-news{padding:10px 20px 12px;border-bottom:1px solid var(--g-border)}\n.g-rc-news:last-of-type{border-bottom:0}\n.g-rc-news-head{display:flex;align-items:baseline;gap:8px}\n.g-rc-news-title{margin:0;font-size:14px;font-weight:600;line-height:1.35;flex:1}\n.g-rc-news-new{flex:none;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--g-primary-text);background:var(--g-primary);border-radius:999px;padding:2px 7px}\n.g-rc-news-date{display:block;font-size:12px;color:var(--g-muted);margin:2px 0 6px}\n.g-rc-news-body{font-size:13px}\n.g-rc-news-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}\n.g-rc-news-actions .g-btn{min-height:32px;padding:6px 12px;font-size:13px}\n/* accessibility */\n.g-sr-only{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n.g-hotspot:focus-visible,.g-custom:focus-visible,.g-card:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n@media (forced-colors:active){.g-card,.g-panel,.g-banner{border:1px solid CanvasText}.g-btn{border:1px solid ButtonText}}\n`;\n","import { arrow, autoPlacement, autoUpdate, computePosition, flip, offset, shift, type Placement as FuiPlacement } from \"@floating-ui/dom\";\nimport type { Placement } from \"@guidelytech/shared\";\nimport { visualRect } from \"./selectors\";\n\nexport interface AnchorOptions {\n placement?: Placement;\n offset?: number;\n arrowEl?: HTMLElement | null;\n /** Called after every position update. */\n onUpdate?: (placement: FuiPlacement) => void;\n}\n\n/**\n * Anchors `floating` next to `reference` using floating-ui (`flip`, `shift`, `offset`, `arrow`).\n * `placement: \"auto\"` uses `autoPlacement`. Returns a cleanup function that stops `autoUpdate`.\n */\nexport function anchor(target: Element, floating: HTMLElement, options: AnchorOptions = {}): () => void {\n // A shadow host is measured with its shadow content (see `visualRect`).\n const reference = target.shadowRoot ? { getBoundingClientRect: () => visualRect(target), contextElement: target } : target;\n const placement = options.placement ?? \"auto\";\n const gap = options.offset ?? 10;\n const middleware = [offset(gap + (options.arrowEl ? 4 : 0))];\n if (placement === \"auto\") middleware.push(autoPlacement({ padding: 16 }));\n else middleware.push(flip({ padding: 16 }));\n middleware.push(shift({ padding: 16 }));\n if (options.arrowEl) middleware.push(arrow({ element: options.arrowEl, padding: 8 }));\n let stopped = false;\n const update = async () => {\n if (stopped || !floating.isConnected) return;\n try {\n const result = await computePosition(reference, floating, {\n placement: placement === \"auto\" ? \"bottom\" : placement,\n strategy: \"fixed\",\n middleware,\n });\n if (stopped) return;\n floating.style.left = `${Math.round(result.x)}px`;\n floating.style.top = `${Math.round(result.y)}px`;\n floating.setAttribute(\"data-placement\", result.placement);\n if (options.arrowEl && result.middlewareData.arrow) {\n const { x, y } = result.middlewareData.arrow;\n const side = result.placement.split(\"-\")[0];\n const staticSide = { top: \"bottom\", right: \"left\", bottom: \"top\", left: \"right\" }[side as \"top\" | \"right\" | \"bottom\" | \"left\"];\n Object.assign(options.arrowEl.style, {\n left: x != null ? `${x}px` : \"\",\n top: y != null ? `${y}px` : \"\",\n right: \"\",\n bottom: \"\",\n [staticSide]: \"-7px\",\n });\n }\n options.onUpdate?.(result.placement);\n } catch {\n /* positioning must never crash the host */\n }\n };\n let stopAuto: (() => void) | null = null;\n try {\n stopAuto = autoUpdate(reference, floating, () => void update(), { animationFrame: false });\n } catch {\n void update();\n }\n return () => {\n stopped = true;\n stopAuto?.();\n };\n}\n\n/** Tracks the bounding rect of an element and calls `cb` on scroll/resize/mutation. */\nexport function trackRect(el: Element, cb: (rect: DOMRect) => void): () => void {\n let raf = 0;\n let stopped = false;\n const run = () => {\n if (stopped) return;\n cb(visualRect(el));\n };\n const schedule = () => {\n if (stopped) return;\n if (typeof requestAnimationFrame === \"function\") {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(run);\n } else run();\n };\n run();\n const win = el.ownerDocument.defaultView;\n win?.addEventListener(\"scroll\", schedule, true);\n win?.addEventListener(\"resize\", schedule);\n // `scroll` is not composed: scrolling a container inside a shadow root never reaches `window`.\n const shadowRoots: ShadowRoot[] = [];\n for (let root = el.getRootNode(); root.nodeType === 11 && (root as ShadowRoot).host; root = (root as ShadowRoot).host.getRootNode()) shadowRoots.push(root as ShadowRoot);\n for (const root of shadowRoots) root.addEventListener(\"scroll\", schedule, true);\n let ro: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n try {\n ro = new ResizeObserver(schedule);\n ro.observe(el);\n if (el.ownerDocument.documentElement) ro.observe(el.ownerDocument.documentElement);\n } catch {\n ro = null;\n }\n }\n const interval = setInterval(run, 500);\n return () => {\n stopped = true;\n win?.removeEventListener(\"scroll\", schedule, true);\n win?.removeEventListener(\"resize\", schedule);\n for (const root of shadowRoots) root.removeEventListener(\"scroll\", schedule, true);\n ro?.disconnect();\n clearInterval(interval);\n if (typeof cancelAnimationFrame === \"function\") cancelAnimationFrame(raf);\n };\n}\n","import { visibleButtons, type GuideStep, type StepButton } from \"@guidelytech/shared\";\nimport { anchor, trackRect } from \"./position\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nexport interface RenderStepOptions {\n /** Themed scope element inside the shadow root. */\n scope: HTMLElement;\n step: GuideStep;\n index: number;\n total: number;\n /** Whether a \"back\" action has a step to return to; back buttons are hidden otherwise. */\n canGoBack?: boolean;\n target?: Element | null;\n /** Render anchored steps as a centered modal (target fallback). */\n asModal?: boolean;\n onButton: (button: StepButton) => void;\n /** Close button / Escape / outside click. */\n onClose: () => void;\n /** Called when a hotspot is expanded. */\n onOpen?: () => void;\n announce?: (text: string) => void;\n /** Run the step's code block (custom steps; see RunGuideOptions.runCode). */\n runCode?: boolean;\n onError?: (error: unknown) => void;\n}\n\nexport interface StepView {\n /** Root element of the rendered step (card, banner, hotspot...). */\n el: HTMLElement;\n /** Element that received focus (card), when any. */\n card: HTMLElement | null;\n destroy(): void;\n}\n\nconst FOCUSABLE = \"button:not([disabled]),[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex='-1'])\";\nlet uid = 0;\nconst nextId = (p: string) => `g-${p}-${++uid}`;\n\nfunction h<K extends keyof HTMLElementTagNameMap>(doc: Document, tag: K, className?: string, text?: string): HTMLElementTagNameMap[K] {\n const el = doc.createElement(tag);\n if (className) el.className = className;\n if (text != null) el.textContent = text;\n return el;\n}\n\nfunction buildButtons(doc: Document, step: GuideStep, canGoBack: boolean, onButton: (b: StepButton) => void): HTMLElement[] {\n return visibleButtons(step, canGoBack).map((b) => {\n const btn = h(doc, \"button\", `g-btn g-btn-${b.variant}`, b.label);\n btn.type = \"button\";\n btn.setAttribute(\"data-action\", b.action);\n btn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n onButton(b);\n });\n return btn;\n });\n}\n\n/** Builds the shared chrome: close, image, title, body, progress and buttons. */\nexport function buildCard(doc: Document, opts: RenderStepOptions, extraClass: string): { card: HTMLElement; inner: HTMLElement; titleId: string; bodyId: string } {\n const { step } = opts;\n const card = h(doc, \"div\", `g-card ${extraClass}`);\n card.tabIndex = -1;\n card.setAttribute(\"data-step-id\", step.id);\n if (step.width) card.style.width = `min(${step.width}px, calc(100vw - 32px))`;\n const titleId = nextId(\"title\");\n const bodyId = nextId(\"body\");\n if (step.imageUrl) {\n const img = h(doc, \"img\", \"g-image\");\n img.src = step.imageUrl;\n // Empty alt = decorative (the default), so screen readers skip it.\n img.alt = step.imageAlt ?? \"\";\n card.appendChild(img);\n }\n const inner = h(doc, \"div\", \"g-inner\");\n if (step.showClose) {\n const close = h(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.addEventListener(\"click\", (e) => {\n e.preventDefault();\n opts.onClose();\n });\n card.appendChild(close);\n }\n if (step.title) {\n const t = h(doc, \"h2\", \"g-title\", step.title);\n t.id = titleId;\n inner.appendChild(t);\n }\n if (step.body) {\n const b = h(doc, \"div\", \"g-body\");\n b.id = bodyId;\n setSanitizedHtml(b, step.body);\n inner.appendChild(b);\n }\n const buttons = buildButtons(doc, step, opts.canGoBack ?? opts.index > 0, opts.onButton);\n if (buttons.length || (step.showProgress && opts.total > 1)) {\n const footer = h(doc, \"div\", \"g-footer\");\n if (step.showProgress && opts.total > 1) {\n const progress = h(doc, \"span\", \"g-progress\", `${opts.index + 1} of ${opts.total}`);\n progress.setAttribute(\"aria-label\", `Step ${opts.index + 1} of ${opts.total}`);\n footer.appendChild(progress);\n }\n buttons.forEach((b) => footer.appendChild(b));\n inner.appendChild(footer);\n }\n card.appendChild(inner);\n if (step.title) card.setAttribute(\"aria-labelledby\", titleId);\n else card.setAttribute(\"aria-label\", opts.total > 1 ? `Step ${opts.index + 1} of ${opts.total}` : \"Guide\");\n if (step.body) card.setAttribute(\"aria-describedby\", bodyId);\n return { card, inner, titleId, bodyId };\n}\n\nfunction focusables(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE));\n}\n\nfunction isTextEntry(el: EventTarget | null): boolean {\n const t = el as HTMLElement | null;\n if (!t || !t.tagName) return false;\n const tag = t.tagName.toLowerCase();\n return tag === \"input\" || tag === \"textarea\" || tag === \"select\" || t.isContentEditable === true;\n}\n\n/**\n * Keyboard handling: Escape closes (when allowed), Tab is trapped inside modals, and the arrow keys\n * move between steps (→ = the step's Next / Done button, ← = Back) unless focus is in a text field.\n */\nfunction installKeyboard(card: HTMLElement, step: GuideStep, trap: boolean, onClose: () => void): () => void {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && step.showClose) {\n e.stopPropagation();\n onClose();\n return;\n }\n if ((e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") && !e.altKey && !e.ctrlKey && !e.metaKey && !isTextEntry(e.target)) {\n const actions = e.key === \"ArrowRight\" ? [\"next\", \"complete\"] : [\"back\"];\n const btn = actions.map((a) => card.querySelector<HTMLButtonElement>(`button[data-action=\"${a}\"]`)).find(Boolean);\n if (btn) {\n e.preventDefault();\n e.stopPropagation();\n btn.click();\n }\n return;\n }\n if (trap && e.key === \"Tab\") {\n const items = focusables(card);\n if (!items.length) {\n e.preventDefault();\n card.focus();\n return;\n }\n const first = items[0] as HTMLElement;\n const last = items[items.length - 1] as HTMLElement;\n const active = (card.getRootNode() as ShadowRoot | Document).activeElement;\n if (e.shiftKey && (active === first || active === card)) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n card.addEventListener(\"keydown\", onKey);\n return () => card.removeEventListener(\"keydown\", onKey);\n}\n\nfunction focusInto(card: HTMLElement): () => void {\n const doc = card.ownerDocument;\n const active = doc.activeElement as HTMLElement | null;\n // Focus inside the Guidely host (a previous step) is not worth returning to; the controller restores the page's.\n const previous = active && active.id !== \"guidely-root\" ? active : null;\n const primary = card.querySelector<HTMLElement>(\".g-btn-primary\") || focusables(card)[0] || card;\n try {\n primary.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n return () => {\n try {\n if (previous && previous.isConnected && typeof previous.focus === \"function\") previous.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n };\n}\n\nfunction overlayEl(doc: Document, opts: RenderStepOptions, transparent = false): HTMLElement {\n const overlay = h(doc, \"div\", `g-overlay${transparent ? \" g-transparent\" : \"\"}`);\n if (opts.step.dismissOnOutsideClick) overlay.addEventListener(\"click\", () => opts.onClose());\n return overlay;\n}\n\nfunction positionClass(position: GuideStep[\"position\"]): string {\n return `g-pos-${position}`;\n}\n\nexport function renderModal(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const { card } = buildCard(doc, opts, \"g-modal\");\n card.setAttribute(\"role\", \"dialog\");\n card.setAttribute(\"aria-modal\", \"true\");\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay || opts.asModal) wrapper.appendChild(overlayEl(doc, opts));\n else if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(card, opts.step, true, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nfunction cleanupAll(cleanups: Array<() => void>, el: HTMLElement) {\n cleanups.splice(0).forEach((fn) => {\n try {\n fn();\n } catch {\n /* ignore */\n }\n });\n el.remove();\n}\n\nfunction setTargetDescribedBy(target: Element, id: string): () => void {\n const prev = target.getAttribute(\"aria-describedby\");\n try {\n target.setAttribute(\"aria-describedby\", prev ? `${prev} ${id}` : id);\n } catch {\n return () => {};\n }\n return () => {\n if (prev) target.setAttribute(\"aria-describedby\", prev);\n else target.removeAttribute(\"aria-describedby\");\n };\n}\n\nexport function renderTooltip(doc: Document, opts: RenderStepOptions, kind: \"tooltip\" | \"popover\"): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const { card } = buildCard(doc, opts, `g-${kind}`);\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n card.setAttribute(\"role\", kind === \"tooltip\" ? \"tooltip\" : \"dialog\");\n card.id = nextId(kind);\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay) wrapper.appendChild(overlayEl(doc, opts));\n else if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n if (opts.step.target?.scrollIntoView !== false) scrollTo(target);\n cleanups.push(anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset, arrowEl }));\n cleanups.push(setTargetDescribedBy(target, card.id));\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nfunction scrollTo(target: Element) {\n try {\n target.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\", behavior: \"auto\" });\n } catch {\n /* ignore */\n }\n}\n\n/** Overlay with a cut-out around the target (4 rects), so the target itself stays clickable. */\nexport function renderSpotlight(doc: Document, opts: RenderStepOptions): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const wrapper = h(doc, \"div\", \"g-step\");\n const pad = opts.step.spotlightPadding ?? 6;\n const rects = [\"top\", \"left\", \"right\", \"bottom\"].map((side) => {\n const r = h(doc, \"div\", `g-spot-rect g-spot-${side}`);\n if (opts.step.dismissOnOutsideClick) r.addEventListener(\"click\", () => opts.onClose());\n wrapper.appendChild(r);\n return r;\n });\n const ring = h(doc, \"div\", \"g-spot-ring\");\n wrapper.appendChild(ring);\n const { card } = buildCard(doc, opts, \"g-spotlight-card\");\n card.setAttribute(\"role\", \"dialog\");\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n if (opts.step.target?.scrollIntoView !== false) scrollTo(target);\n const win = doc.defaultView;\n const layout = (r: DOMRect) => {\n const vw = win?.innerWidth ?? 0;\n const vh = win?.innerHeight ?? 0;\n const x = Math.max(0, r.left - pad);\n const y = Math.max(0, r.top - pad);\n const w = Math.min(vw, r.right + pad) - x;\n const hgt = Math.min(vh, r.bottom + pad) - y;\n const [top, left, right, bottom] = rects as unknown as [HTMLElement, HTMLElement, HTMLElement, HTMLElement];\n Object.assign(top.style, { left: \"0\", top: \"0\", width: \"100%\", height: `${y}px` });\n Object.assign(left.style, { left: \"0\", top: `${y}px`, width: `${x}px`, height: `${hgt}px` });\n Object.assign(right.style, { left: `${x + w}px`, top: `${y}px`, width: `${Math.max(0, vw - x - w)}px`, height: `${hgt}px` });\n Object.assign(bottom.style, { left: \"0\", top: `${y + hgt}px`, width: \"100%\", height: `${Math.max(0, vh - y - hgt)}px` });\n Object.assign(ring.style, { left: `${x}px`, top: `${y}px`, width: `${w}px`, height: `${hgt}px` });\n };\n cleanups.push(trackRect(target, layout));\n cleanups.push(anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset + pad, arrowEl }));\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/** Pulsing dot at the target; opens an anchored card on click/hover. */\nexport function renderHotspot(doc: Document, opts: RenderStepOptions): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const cfg = opts.step.hotspot ?? { size: 14, pulse: true, openOn: \"click\" as const };\n const wrapper = h(doc, \"div\", \"g-step\");\n const dot = h(doc, \"button\", `g-hotspot${cfg.pulse ? \" g-pulse\" : \"\"}`);\n dot.type = \"button\";\n dot.setAttribute(\"aria-label\", opts.step.title || \"Open hint\");\n dot.setAttribute(\"aria-expanded\", \"false\");\n dot.style.width = `${cfg.size}px`;\n dot.style.height = `${cfg.size}px`;\n dot.appendChild(h(doc, \"span\", \"g-hotspot-hit\"));\n wrapper.appendChild(dot);\n opts.scope.appendChild(wrapper);\n cleanups.push(trackRect(target, (r) => {\n dot.style.left = `${Math.round(r.right - cfg.size / 2)}px`;\n dot.style.top = `${Math.round(r.top - cfg.size / 2)}px`;\n }));\n let card: HTMLElement | null = null;\n let stopAnchor: (() => void) | null = null;\n let stopKeys: (() => void) | null = null;\n const close = (returnFocus = false) => {\n const hadFocus = !!card && (card.getRootNode() as ShadowRoot | Document).activeElement !== null && card.contains((card.getRootNode() as ShadowRoot | Document).activeElement);\n stopAnchor?.();\n stopKeys?.();\n card?.remove();\n card = null;\n dot.setAttribute(\"aria-expanded\", \"false\");\n // Keyboard users land back on the dot that opened the card.\n if (returnFocus || hadFocus) {\n try {\n dot.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n }\n };\n const open = () => {\n if (card) return;\n const built = buildCard(doc, { ...opts, onClose: () => opts.onClose() }, \"g-hotspot-card\");\n card = built.card;\n card.setAttribute(\"role\", \"dialog\");\n card.id = nextId(\"hotspot\");\n dot.setAttribute(\"aria-controls\", card.id);\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n wrapper.appendChild(card);\n stopAnchor = anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset, arrowEl });\n stopKeys = installKeyboard(card, opts.step, false, () => close(true));\n dot.setAttribute(\"aria-expanded\", \"true\");\n opts.onOpen?.();\n if (cfg.openOn === \"click\") focusInto(card);\n };\n dot.addEventListener(\"click\", (e) => {\n e.preventDefault();\n if (card) close();\n else open();\n });\n if (cfg.openOn === \"hover\") {\n dot.addEventListener(\"mouseenter\", open);\n dot.addEventListener(\"focus\", open);\n }\n cleanups.push(close);\n return { el: wrapper, card: dot, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nexport function renderBanner(doc: Document, opts: RenderStepOptions): StepView {\n const { step } = opts;\n const cleanups: Array<() => void> = [];\n const pos = step.position === \"top\" || step.placement === \"top\" || step.position.startsWith(\"top\") ? \"top\" : \"bottom\";\n const banner = h(doc, \"div\", `g-banner g-pos-${pos}`);\n // A labelled region (not a live region: the controller announces it once).\n banner.setAttribute(\"role\", \"region\");\n banner.setAttribute(\"aria-label\", step.title || \"Announcement\");\n banner.setAttribute(\"data-step-id\", step.id);\n const body = h(doc, \"div\", \"g-body\");\n if (step.title) body.appendChild(h(doc, \"strong\", \"\", `${step.title} `));\n const text = h(doc, \"span\");\n setSanitizedHtml(text, step.body);\n body.appendChild(text);\n banner.appendChild(body);\n buildButtons(doc, step, opts.canGoBack ?? opts.index > 0, opts.onButton).forEach((b) => banner.appendChild(b));\n if (step.showClose) {\n const close = h(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Dismiss\");\n close.addEventListener(\"click\", () => opts.onClose());\n banner.appendChild(close);\n }\n opts.scope.appendChild(banner);\n cleanups.push(installKeyboard(banner, step, false, opts.onClose));\n return { el: banner, card: banner, destroy: () => cleanupAll(cleanups, banner) };\n}\n\nexport function renderSlideout(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const pos = opts.step.position === \"top\" ? \"top-right\" : opts.step.position === \"bottom\" ? \"bottom-right\" : opts.step.position;\n const { card } = buildCard(doc, opts, `g-slideout ${positionClass(pos)}`);\n card.setAttribute(\"role\", \"dialog\");\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/**\n * Runs a code-block step's JavaScript (`step.code`) with `guidely` (next, back, dismiss, complete,\n * skip) and `container` (the step's element). It may return a cleanup function, called when the\n * step goes away. Errors are reported, never thrown into the host app. Pages whose Content\n * Security Policy forbids `unsafe-eval` won't run it.\n */\nfunction runCodeBlock(code: string, container: HTMLElement, opts: RenderStepOptions): () => void {\n const act = (action: StepButton[\"action\"]) => () => opts.onButton({ id: `code-${action}`, label: action, action, variant: \"primary\" });\n const api = Object.freeze({ next: act(\"next\"), back: act(\"back\"), complete: act(\"complete\"), skip: act(\"skip\"), dismiss: () => opts.onClose(), stepId: opts.step.id });\n try {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const fn = new Function(\"guidely\", \"container\", `\"use strict\";\\n${code}`) as (g: typeof api, c: HTMLElement) => unknown;\n const result = fn(api, container);\n return typeof result === \"function\" ? () => {\n try {\n (result as () => void)();\n } catch (err) {\n opts.onError?.(err);\n }\n } : () => {};\n } catch (err) {\n opts.onError?.(err);\n return () => {};\n }\n}\n\n/** Sanitized custom HTML with no chrome. Elements with `data-g-action=\"next|back|dismiss|complete|skip\"` act as buttons. */\nexport function renderCustom(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay) wrapper.appendChild(overlayEl(doc, opts));\n const el = h(doc, \"div\", \"g-custom\");\n el.tabIndex = -1;\n el.setAttribute(\"data-step-id\", opts.step.id);\n setSanitizedHtml(el, opts.step.customHtml || opts.step.body || \"\");\n el.setAttribute(\"role\", opts.step.showOverlay ? \"dialog\" : \"group\");\n el.setAttribute(\"aria-label\", opts.step.title || \"Guide\");\n if (opts.step.showOverlay) el.setAttribute(\"aria-modal\", \"true\");\n const onClick = (e: Event) => {\n const t = (e.target as Element | null)?.closest?.(\"[data-g-action]\") as HTMLElement | null;\n const action = t?.getAttribute(\"data-g-action\");\n if (!action) return;\n e.preventDefault();\n if (action === \"dismiss\") opts.onClose();\n else opts.onButton({ id: `custom-${action}`, label: action, action: action as StepButton[\"action\"], variant: \"primary\", value: t?.getAttribute(\"data-g-value\") || undefined });\n };\n el.addEventListener(\"click\", onClick);\n wrapper.appendChild(el);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(el, opts.step, false, opts.onClose));\n cleanups.push(focusInto(el));\n if (opts.runCode && opts.step.code) cleanups.push(runCodeBlock(opts.step.code, el, opts));\n return { el: wrapper, card: el, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/**\n * Renders a step of any type into the scope. Checklist and survey steps are rendered by the\n * dedicated widgets (`renderChecklist`, `renderSurvey`) and fall back to a modal here.\n */\nexport function renderStep(opts: RenderStepOptions): StepView {\n const doc = opts.scope.ownerDocument;\n const type = opts.asModal ? \"modal\" : opts.step.type;\n switch (type) {\n case \"tooltip\":\n return renderTooltip(doc, opts, \"tooltip\");\n case \"popover\":\n return renderTooltip(doc, opts, \"popover\");\n case \"spotlight\":\n return renderSpotlight(doc, opts);\n case \"hotspot\":\n return renderHotspot(doc, opts);\n case \"banner\":\n return renderBanner(doc, opts);\n case \"slideout\":\n return renderSlideout(doc, opts);\n case \"custom\":\n return renderCustom(doc, opts);\n case \"modal\":\n case \"checklist\":\n case \"survey\":\n default:\n return renderModal(doc, opts);\n }\n}\n\n/** Does the step type anchor to a target element? */\nexport function isAnchoredStep(step: GuideStep): boolean {\n return (step.type === \"tooltip\" || step.type === \"popover\" || step.type === \"spotlight\" || step.type === \"hotspot\") && !!step.target && step.target.selectors.length > 0;\n}\n","import { evaluateRules } from \"@guidelytech/shared/runtime\";\nimport { type EventName, type GuideConfig, type GuideKind, type GuideStep, type ProjectTheme, type StepButton, type TargetingContext } from \"@guidelytech/shared\";\nimport { createScope, ensureHost } from \"./host\";\nimport { isAnchoredStep, renderStep, type StepView } from \"./render\";\nimport { closestComposed, composedTarget, containsComposed, urlMatches, waitForTarget } from \"./selectors\";\n\n/** Minimal guide shape the runtime needs (a `PublishedGuide` or an authoring draft). */\nexport interface RunnableGuide {\n id: string;\n key: string;\n name: string;\n kind: GuideKind | string;\n version: number;\n config: GuideConfig;\n}\n\nexport interface RuntimeEvent {\n name: EventName;\n guideId: string;\n guideKey: string;\n guideVersion: number;\n stepId?: string;\n stepIndex?: number;\n properties?: Record<string, unknown>;\n}\n\nexport type GuideEndReason = \"completed\" | \"dismissed\" | \"skipped\" | \"destroyed\";\nexport type GuideStatus = \"idle\" | \"running\" | \"waiting_url\" | \"waiting_target\" | \"ended\";\n\nexport interface RunGuideOptions {\n /** Project theme (merged with the guide's appearance). */\n theme?: Partial<ProjectTheme> | null;\n /** Targeting context used for branches and step-level targeting. */\n ctx?: TargetingContext | (() => TargetingContext);\n /** Receives lifecycle events (`guide_viewed`, `guide_started`, `step_viewed`, ...). */\n onEvent?: (event: RuntimeEvent) => void;\n /** Called for `url` button actions. Defaults to `location.assign` / `window.open`. */\n onNavigate?: (url: string, newTab?: boolean) => void;\n /** Called for `start_guide`, `event` and `open_resource_center` button actions. */\n onAction?: (action: \"start_guide\" | \"event\" | \"open_resource_center\", value?: string, button?: StepButton) => void;\n /** Rendering errors are reported here instead of being thrown into the host app. */\n onError?: (error: unknown) => void;\n /** Called exactly once when the guide ends for any reason. */\n onEnd?: (reason: GuideEndReason) => void;\n /** Event bus used by `advanceOn: \"event\"` steps. */\n eventBus?: { on(name: string, cb: () => void): () => void };\n /** Start at this step id instead of the first step. */\n startAtStep?: string;\n /** Returns the current URL (defaults to `location.href`). */\n currentUrl?: () => string;\n /**\n * The user started this guide on demand (\"Show me\"): a step on another page offers to take them\n * there after `urlPromptDelayMs` (default 1200 ms, so a click that navigates doesn't flash it)\n * instead of waiting silently.\n */\n promptForUrl?: boolean;\n urlPromptDelayMs?: number;\n /** The step the guide is on, shown or waiting for its page or element (to resume it after a page load). */\n onPosition?: (stepId: string) => void;\n /**\n * Run code-block steps (`step.code`). Only the SDK sets this, for published guides; the server\n * leaves code out unless a workspace admin allowed code blocks. Previews never run code.\n */\n runCode?: boolean;\n /** Render into this element instead of creating a scope in the Shadow-DOM host. */\n container?: HTMLElement;\n doc?: Document;\n}\n\nexport interface GuideController {\n readonly guide: RunnableGuide;\n start(): void;\n next(): void;\n back(): void;\n goTo(stepId: string): void;\n dismiss(): void;\n complete(): void;\n skip(): void;\n /** Re-evaluate a step waiting for a URL (call after SPA navigation). */\n resume(): void;\n destroy(): void;\n getState(): { status: GuideStatus; stepId: string | null; stepIndex: number; total: number };\n}\n\nfunction noop() {}\n\nconst escapeHtml = (s: string) => s.replace(/[&<>\"']/g, (c) => `&#${c.charCodeAt(0)};`);\n\n/** A step URL pattern the browser can open as is: a same-site path without wildcards. */\nexport function navigableUrl(pattern: string | undefined): string | null {\n if (!pattern || /[*?#\\s]/.test(pattern) || pattern.includes(\"/:\")) return null;\n if (pattern.startsWith(\"/\") && !pattern.startsWith(\"//\")) return pattern;\n try {\n const u = new URL(pattern);\n if (typeof location !== \"undefined\" && u.origin === location.origin) return u.pathname;\n } catch {\n /* not a URL */\n }\n return null;\n}\n/**\n * Runs a guide: walks steps, waits for targets, handles advancement, branches, multi-page steps,\n * buttons and cleanup. Rendering is wrapped in try/catch so the host app can never crash.\n */\nexport function runGuide(guide: RunnableGuide, options: RunGuideOptions = {}): GuideController {\n const doc = options.doc ?? (options.container?.ownerDocument || document);\n const steps = guide.config.steps;\n const total = steps.length;\n const onEvent = options.onEvent ?? noop;\n const onError = options.onError ?? noop;\n const getCtx = () => (typeof options.ctx === \"function\" ? options.ctx() : options.ctx) ?? null;\n const currentUrl = options.currentUrl ?? (() => (typeof location !== \"undefined\" ? location.href : \"\"));\n\n let status: GuideStatus = \"idle\";\n let index = -1;\n let pendingIndex = -1;\n let view: StepView | null = null;\n const stepCleanups: Array<() => void> = [];\n let started = false;\n let stepDone = false;\n let ended = false;\n const history: number[] = [];\n let scope: { el: HTMLElement; destroy(): void } | null = null;\n\n const emit = (name: EventName, step?: GuideStep | null, stepIndex?: number, properties?: Record<string, unknown>) => {\n try {\n onEvent({ name, guideId: guide.id, guideKey: guide.key, guideVersion: guide.version, stepId: step?.id, stepIndex, properties });\n } catch (err) {\n onError(err);\n }\n };\n\n const announce = (text: string) => {\n try {\n ensureHost(doc).announce(text);\n } catch {\n /* ignore */\n }\n };\n\n const getScope = (): HTMLElement => {\n if (options.container) return options.container;\n if (!scope) scope = createScope(options.theme, guide.config.appearance, doc);\n return scope.el;\n };\n\n const clearStep = () => {\n stepCleanups.splice(0).forEach((fn) => {\n try {\n fn();\n } catch {\n /* ignore */\n }\n });\n try {\n view?.destroy();\n } catch (err) {\n onError(err);\n }\n view = null;\n stepDone = false;\n };\n\n // Focus returns to where the visitor was when the guide started (steps move focus inside the guide).\n let returnFocusTo: HTMLElement | null = null;\n const restoreFocus = () => {\n const el = returnFocusTo;\n returnFocusTo = null;\n try {\n const now = doc.activeElement as HTMLElement | null;\n const lost = !now || now === doc.body || now.id === \"guidely-root\";\n if (el && lost && el.isConnected && typeof el.focus === \"function\") el.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n };\n\n const end = (reason: GuideEndReason) => {\n if (ended) return;\n ended = true;\n const step = steps[index];\n clearStep();\n status = \"ended\";\n if (reason === \"completed\") emit(\"guide_completed\", step, index);\n else if (reason === \"dismissed\") emit(\"guide_dismissed\", step, index);\n else if (reason === \"skipped\") emit(\"guide_skipped\", step, index);\n scope?.destroy();\n scope = null;\n restoreFocus();\n try {\n options.onEnd?.(reason);\n } catch (err) {\n onError(err);\n }\n };\n\n const completeStep = () => {\n if (stepDone || index < 0) return;\n stepDone = true;\n emit(\"step_completed\", steps[index], index);\n };\n\n const goNext = (overrideStepId?: string) => {\n const step = steps[index];\n let target = -1;\n const ctx = getCtx();\n if (step && ctx) {\n for (const branch of step.branches) {\n if (evaluateRules(branch.when, ctx)) {\n target = steps.findIndex((s) => s.id === branch.goTo);\n if (target >= 0) break;\n }\n }\n }\n if (target < 0 && overrideStepId) target = steps.findIndex((s) => s.id === overrideStepId);\n if (target < 0) target = index + 1;\n if (target >= total) return end(\"completed\");\n history.push(index);\n showStep(target, 1);\n };\n\n const advance = () => {\n if (ended) return;\n completeStep();\n goNext();\n };\n\n const handleButton = (b: StepButton) => {\n try {\n switch (b.action) {\n case \"next\":\n completeStep();\n goNext(b.value);\n break;\n case \"back\":\n controller.back();\n break;\n case \"dismiss\":\n end(\"dismissed\");\n break;\n case \"complete\":\n completeStep();\n end(\"completed\");\n break;\n case \"skip\":\n end(\"skipped\");\n break;\n case \"url\": {\n completeStep();\n const url = b.value || \"\";\n if (options.onNavigate) options.onNavigate(url, b.newTab);\n else if (b.newTab) window.open(url, \"_blank\", \"noopener\");\n else location.assign(url);\n if (index + 1 >= total) end(\"completed\");\n else goNext();\n break;\n }\n case \"start_guide\":\n completeStep();\n end(\"completed\");\n options.onAction?.(\"start_guide\", b.value, b);\n break;\n case \"event\":\n options.onAction?.(\"event\", b.value, b);\n break;\n case \"open_resource_center\":\n options.onAction?.(\"open_resource_center\", b.value, b);\n break;\n default:\n break;\n }\n } catch (err) {\n onError(err);\n }\n };\n\n const setupAdvance = (step: GuideStep, target: Element | null) => {\n const modes = step.advanceOn === \"any\" ? [\"element_click\", \"element_visible\", \"event\", \"delay\"] : [step.advanceOn];\n for (const mode of modes) {\n // Without a selector, clicking the highlighted element itself moves on (tours made from how-tos).\n if (mode === \"element_click\" && (step.advanceValue || target)) {\n const selector = step.advanceValue;\n const handler = (e: Event) => {\n const t = composedTarget(e);\n try {\n if (selector ? t && closestComposed(t, selector) : t && target && containsComposed(target, t)) advance();\n } catch {\n /* invalid selector */\n }\n };\n doc.addEventListener(\"click\", handler, true);\n doc.addEventListener(\"focusin\", handler, true);\n stepCleanups.push(() => {\n doc.removeEventListener(\"click\", handler, true);\n doc.removeEventListener(\"focusin\", handler, true);\n });\n } else if (mode === \"element_visible\" && step.advanceValue) {\n const ac = new AbortController();\n stepCleanups.push(() => ac.abort());\n waitForTarget([{ kind: \"css\", value: step.advanceValue }], { timeoutMs: 0, signal: ac.signal, root: doc })\n .then((el) => {\n if (ac.signal.aborted) return;\n if (typeof IntersectionObserver === \"undefined\") return advance();\n const io = new IntersectionObserver((entries) => {\n if (entries.some((en) => en.isIntersecting)) {\n io.disconnect();\n advance();\n }\n });\n io.observe(el);\n stepCleanups.push(() => io.disconnect());\n })\n .catch(noop);\n } else if (mode === \"event\" && step.advanceValue && options.eventBus) {\n stepCleanups.push(options.eventBus.on(step.advanceValue, advance));\n } else if (mode === \"delay\") {\n const t = setTimeout(advance, step.advanceDelayMs ?? 3000);\n stepCleanups.push(() => clearTimeout(t));\n }\n }\n };\n\n const render = (step: GuideStep, target: Element | null, asModal = false) => {\n if (ended) return;\n status = \"running\";\n // A \"click the element\" step whose element is missing would leave the user stuck: give it a Next button.\n const shown = !target && step.advanceOn === \"element_click\" && !step.advanceValue && !step.buttons.length ? { ...step, buttons: [{ id: \"g-next\", label: index + 1 >= total ? \"Done\" : \"Next\", action: index + 1 >= total ? (\"complete\" as const) : (\"next\" as const), variant: \"primary\" as const }] } : step;\n try {\n view = renderStep({\n scope: getScope(),\n step: shown,\n index,\n total,\n canGoBack: history.length > 0 || index > 0,\n target,\n asModal,\n onButton: handleButton,\n onClose: () => end(\"dismissed\"),\n announce,\n runCode: options.runCode,\n onError,\n });\n } catch (err) {\n onError(err);\n view = null;\n // Rendering failed: skip the step rather than leaving the guide stuck.\n if (index + 1 < total) return goNext();\n return end(\"skipped\");\n }\n if (!started) {\n started = true;\n emit(\"guide_started\", step, index);\n }\n emit(\"step_viewed\", step, index, asModal ? { fallback: \"show_as_modal\" } : undefined);\n announce(step.title ? `${step.title}. Step ${index + 1} of ${total}` : `Step ${index + 1} of ${total}`);\n setupAdvance(step, target);\n };\n\n /** \"Continue on another page\": the waiting step's page, with a button to go there when it's a plain path. */\n const showUrlPrompt = (step: GuideStep) => {\n if (ended || status !== \"waiting_url\" || view) return;\n const href = navigableUrl(step.url);\n const where = (step.url ?? \"\").replace(/^https?:\\/\\/[^/]+/i, \"\") || \"another page\";\n const prompt: GuideStep = {\n ...step,\n type: \"modal\",\n title: \"Continue on another page\",\n body: `<p>The next step${step.title ? `, <strong>${escapeHtml(step.title)}</strong>,` : \"\"} is on <code>${escapeHtml(where)}</code>.</p>`,\n imageUrl: \"\",\n buttons: [\n ...(href ? [{ id: \"g-go\", label: \"Take me there\", action: \"url\" as const, value: href, variant: \"primary\" as const }] : []),\n { id: \"g-exit\", label: \"Exit\", action: \"dismiss\" as const, variant: href ? (\"secondary\" as const) : (\"primary\" as const) },\n ],\n };\n try {\n view = renderStep({\n scope: getScope(),\n step: prompt,\n index,\n total,\n canGoBack: false,\n target: null,\n asModal: true,\n onButton: (b) => {\n if (b.action !== \"url\" || !b.value) return end(\"dismissed\");\n if (options.onNavigate) options.onNavigate(b.value);\n else location.assign(b.value);\n },\n onClose: () => end(\"dismissed\"),\n announce,\n });\n } catch (err) {\n onError(err);\n }\n };\n\n const applyFallback = (step: GuideStep, direction: 1 | -1) => {\n const fallback = step.target?.fallback ?? \"skip\";\n emit(\"step_viewed\", step, index, { fallback, targetMissing: true });\n if (fallback === \"show_as_modal\") return render(step, null, true);\n if (fallback === \"end_guide\") return end(\"skipped\");\n // skip\n const nextIndex = index + direction;\n if (nextIndex < 0) return showStep(0, 1);\n if (nextIndex >= total) return end(\"completed\");\n showStep(nextIndex, direction);\n };\n\n function showStep(i: number, direction: 1 | -1 = 1): void {\n if (ended) return;\n clearStep();\n if (i < 0) i = 0;\n if (i >= total) return end(\"completed\");\n index = i;\n const step = steps[i] as GuideStep;\n const ctx = getCtx();\n if (step.targeting && step.targeting.rules.length && ctx && !evaluateRules(step.targeting, ctx)) {\n const nextIndex = i + direction;\n if (nextIndex >= total) return end(\"completed\");\n if (nextIndex < 0) return;\n return showStep(nextIndex, direction);\n }\n try {\n options.onPosition?.(step.id);\n } catch (err) {\n onError(err);\n }\n if (step.url && !urlMatches(step.url, currentUrl())) {\n status = \"waiting_url\";\n pendingIndex = i;\n if (options.promptForUrl) {\n const t = setTimeout(() => showUrlPrompt(step), options.urlPromptDelayMs ?? 1200);\n stepCleanups.push(() => clearTimeout(t));\n }\n return;\n }\n pendingIndex = -1;\n if (isAnchoredStep(step) && step.target) {\n status = \"waiting_target\";\n const ac = new AbortController();\n stepCleanups.push(() => ac.abort());\n const timeoutMs = step.target.fallback === \"wait\" ? 0 : step.target.waitMs;\n waitForTarget(step.target, { timeoutMs, signal: ac.signal, root: doc })\n .then((el) => {\n if (ac.signal.aborted || ended) return;\n render(step, el);\n })\n .catch((err) => {\n if (ac.signal.aborted || ended) return;\n if (err && (err as Error).name === \"AbortError\") return;\n applyFallback(step, direction);\n });\n return;\n }\n render(step, null);\n }\n\n const controller: GuideController = {\n guide,\n start() {\n if (status !== \"idle\") return;\n const focused = doc.activeElement as HTMLElement | null;\n if (focused && focused !== doc.body && focused.id !== \"guidely-root\") returnFocusTo = focused;\n emit(\"guide_viewed\");\n if (total === 0) return end(\"completed\");\n let startIndex = options.startAtStep ? steps.findIndex((s) => s.id === options.startAtStep) : 0;\n if (startIndex < 0) startIndex = 0;\n showStep(startIndex, 1);\n },\n next() {\n if (ended || index < 0) return;\n completeStep();\n goNext();\n },\n back() {\n if (ended) return;\n const prev = history.pop();\n if (prev == null) {\n if (index > 0) showStep(index - 1, -1);\n return;\n }\n showStep(prev, -1);\n },\n goTo(stepId: string) {\n const i = steps.findIndex((s) => s.id === stepId);\n if (i >= 0 && !ended) {\n if (index >= 0) history.push(index);\n showStep(i, 1);\n }\n },\n dismiss: () => end(\"dismissed\"),\n complete() {\n completeStep();\n end(\"completed\");\n },\n skip: () => end(\"skipped\"),\n resume() {\n if (ended) return;\n if (status === \"waiting_url\" && pendingIndex >= 0) {\n showStep(pendingIndex, 1);\n return;\n }\n // A rendered step whose URL no longer matches must wait again.\n const step = steps[index];\n if (step?.url && status === \"running\" && !urlMatches(step.url, currentUrl())) showStep(index, 1);\n },\n destroy() {\n if (ended) return;\n ended = true;\n clearStep();\n status = \"ended\";\n scope?.destroy();\n scope = null;\n try {\n options.onEnd?.(\"destroyed\");\n } catch (err) {\n onError(err);\n }\n },\n getState: () => ({ status, stepId: steps[index]?.id ?? null, stepIndex: index, total }),\n };\n return controller;\n}\n","import type { ChecklistConfig, ChecklistTask } from \"@guidelytech/shared\";\nimport { isChecklistComplete } from \"@guidelytech/shared/runtime\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nexport interface ChecklistProgress {\n completedTaskIds: string[];\n completedAt?: string | null;\n dismissedAt?: string | null;\n}\n\nexport interface ChecklistWidgetOptions {\n scope: HTMLElement;\n config: ChecklistConfig;\n progress?: ChecklistProgress;\n /** Initially open? Defaults to `config.autoOpen`. */\n open?: boolean;\n onTaskClick?: (task: ChecklistTask) => void;\n onDismiss?: () => void;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nexport interface ChecklistWidget {\n el: HTMLElement;\n open(): void;\n close(): void;\n toggle(): void;\n isOpen(): boolean;\n setProgress(progress: ChecklistProgress): void;\n destroy(): void;\n}\n\nexport { isChecklistComplete };\n\n/** Launcher pill + expandable panel listing tasks with checkmarks and a progress bar. */\nexport function renderChecklist(options: ChecklistWidgetOptions): ChecklistWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n let progress: ChecklistProgress = options.progress ?? { completedTaskIds: [] };\n let open = options.open ?? config.autoOpen;\n const pos = `g-pos-${config.position}`;\n\n const root = doc.createElement(\"div\");\n root.className = \"g-checklist\";\n const launcher = doc.createElement(\"button\");\n launcher.type = \"button\";\n launcher.className = `g-launcher ${pos}`;\n launcher.setAttribute(\"aria-expanded\", \"false\");\n const ring = doc.createElement(\"span\");\n ring.className = \"g-ring\";\n const count = doc.createElement(\"span\");\n count.className = \"g-count\";\n ring.appendChild(count);\n launcher.appendChild(ring);\n const label = doc.createElement(\"span\");\n label.textContent = config.launcherLabel;\n launcher.appendChild(label);\n\n const panel = doc.createElement(\"div\");\n panel.className = `g-panel ${pos}`;\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", config.launcherLabel);\n panel.hidden = true;\n\n const head = doc.createElement(\"div\");\n head.className = \"g-panel-head\";\n const title = doc.createElement(\"h2\");\n title.className = \"g-panel-title\";\n title.textContent = config.launcherLabel;\n const sub = doc.createElement(\"p\");\n sub.className = \"g-panel-sub\";\n const bar = doc.createElement(\"div\");\n bar.className = \"g-bar\";\n const fill = doc.createElement(\"span\");\n bar.appendChild(fill);\n const close = doc.createElement(\"button\");\n close.type = \"button\";\n close.className = \"g-close\";\n close.textContent = \"×\";\n close.setAttribute(\"aria-label\", \"Minimize checklist\");\n head.append(title, sub, bar, close);\n const body = doc.createElement(\"div\");\n body.className = \"g-panel-body\";\n const foot = doc.createElement(\"div\");\n foot.className = \"g-panel-foot\";\n panel.append(head, body, foot);\n root.append(launcher, panel);\n scope.appendChild(root);\n\n const setOpen = (v: boolean) => {\n open = v;\n panel.hidden = !v;\n launcher.setAttribute(\"aria-expanded\", String(v));\n if (v) {\n (panel.querySelector<HTMLElement>(\".g-task:not([disabled])\") || close).focus?.({ preventScroll: true });\n options.onOpen?.();\n } else options.onClose?.();\n };\n\n const renderTasks = () => {\n const done = new Set(progress.completedTaskIds);\n const doneCount = config.tasks.filter((t) => done.has(t.id)).length;\n const pct = config.tasks.length ? Math.round((doneCount / config.tasks.length) * 100) : 0;\n count.textContent = `${doneCount}/${config.tasks.length}`;\n launcher.style.setProperty(\"--g-pct\", `${pct}%`);\n launcher.setAttribute(\"aria-label\", `${config.launcherLabel}: ${doneCount} of ${config.tasks.length} tasks completed`);\n sub.textContent = `${doneCount} of ${config.tasks.length} completed`;\n fill.style.width = `${pct}%`;\n bar.setAttribute(\"role\", \"progressbar\");\n bar.setAttribute(\"aria-valuenow\", String(pct));\n bar.setAttribute(\"aria-valuemin\", \"0\");\n bar.setAttribute(\"aria-valuemax\", \"100\");\n body.textContent = \"\";\n foot.textContent = \"\";\n const complete = isChecklistComplete(config, progress);\n if (complete) {\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-complete\";\n const t = doc.createElement(\"h3\");\n t.className = \"g-title\";\n t.textContent = config.completionTitle;\n const b = doc.createElement(\"div\");\n b.className = \"g-body\";\n setSanitizedHtml(b, config.completionBody);\n wrap.append(t, b);\n body.appendChild(wrap);\n }\n const list = doc.createElement(\"div\");\n list.setAttribute(\"role\", \"list\");\n let locked = false;\n config.tasks.forEach((task, i) => {\n const isDone = done.has(task.id);\n const btn = doc.createElement(\"button\");\n btn.type = \"button\";\n btn.className = `g-task${isDone ? \" g-done\" : \"\"}`;\n btn.setAttribute(\"role\", \"listitem\");\n btn.setAttribute(\"data-task-id\", task.id);\n btn.setAttribute(\"aria-checked\", String(isDone));\n if (config.ordered && locked && !isDone) {\n btn.disabled = true;\n btn.title = \"Complete the previous task first\";\n }\n if (config.ordered && !isDone) locked = true;\n const check = doc.createElement(\"span\");\n check.className = \"g-check\";\n check.setAttribute(\"aria-hidden\", \"true\");\n check.textContent = isDone ? \"✓\" : \"\";\n const text = doc.createElement(\"span\");\n const tt = doc.createElement(\"div\");\n tt.className = \"g-task-title\";\n tt.textContent = `${i + 1}. ${task.title}`;\n text.appendChild(tt);\n if (task.description) {\n const td = doc.createElement(\"div\");\n td.className = \"g-task-desc\";\n td.textContent = task.description;\n text.appendChild(td);\n }\n btn.append(check, text);\n btn.addEventListener(\"click\", () => options.onTaskClick?.(task));\n list.appendChild(btn);\n });\n body.appendChild(list);\n if (config.dismissible) {\n const dismiss = doc.createElement(\"button\");\n dismiss.type = \"button\";\n dismiss.className = \"g-btn g-btn-ghost\";\n dismiss.textContent = complete ? \"Close\" : \"Dismiss checklist\";\n dismiss.addEventListener(\"click\", () => options.onDismiss?.());\n foot.appendChild(dismiss);\n }\n };\n\n launcher.addEventListener(\"click\", () => setOpen(!open));\n close.addEventListener(\"click\", () => setOpen(false));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open) {\n e.stopPropagation();\n setOpen(false);\n launcher.focus();\n }\n };\n panel.addEventListener(\"keydown\", onKey);\n renderTasks();\n if (open) setOpen(true);\n\n return {\n el: root,\n open: () => setOpen(true),\n close: () => setOpen(false),\n toggle: () => setOpen(!open),\n isOpen: () => open,\n setProgress(p) {\n progress = p;\n renderTasks();\n },\n destroy() {\n panel.removeEventListener(\"keydown\", onKey);\n root.remove();\n },\n };\n}\n","import type { SurveyConfig, SurveyQuestion } from \"@guidelytech/shared\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nimport { isQuestionVisible, type SurveyAnswer, type SurveyAnswers } from \"@guidelytech/shared/runtime\";\n\nexport { isQuestionVisible };\nexport type { SurveyAnswer, SurveyAnswers };\n\nexport interface SurveyWidgetOptions {\n scope: HTMLElement;\n config: SurveyConfig;\n title?: string;\n onSubmit: (answers: SurveyAnswers) => void;\n onDismiss?: () => void;\n onChange?: (answers: SurveyAnswers) => void;\n}\n\nexport interface SurveyWidget {\n el: HTMLElement;\n getAnswers(): SurveyAnswers;\n showThankYou(): void;\n destroy(): void;\n}\n\n/** Survey card: NPS/CSAT/thumbs/choice/text/rating questions with conditional follow-ups and a thank-you state. */\nexport function renderSurvey(options: SurveyWidgetOptions): SurveyWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n const answers: SurveyAnswers = {};\n const card = doc.createElement(\"div\");\n card.className = `g-card g-survey g-slideout g-pos-${config.position}`;\n card.setAttribute(\"role\", \"dialog\");\n card.setAttribute(\"aria-label\", options.title || \"Survey\");\n card.tabIndex = -1;\n const inner = doc.createElement(\"div\");\n inner.className = \"g-inner\";\n card.appendChild(inner);\n if (options.onDismiss) {\n const close = doc.createElement(\"button\");\n close.type = \"button\";\n close.className = \"g-close\";\n close.textContent = \"×\";\n close.setAttribute(\"aria-label\", \"Close survey\");\n close.addEventListener(\"click\", () => options.onDismiss?.());\n card.appendChild(close);\n }\n scope.appendChild(card);\n\n const form = doc.createElement(\"form\");\n form.noValidate = true;\n inner.appendChild(form);\n const errorEl = doc.createElement(\"div\");\n errorEl.className = \"g-error\";\n errorEl.setAttribute(\"role\", \"alert\");\n\n const setAnswer = (id: string, v: SurveyAnswer | undefined) => {\n if (v === undefined || v === \"\" || (Array.isArray(v) && v.length === 0)) delete answers[id];\n else answers[id] = v;\n options.onChange?.({ ...answers });\n updateVisibility();\n };\n\n const questionEls = new Map<string, HTMLElement>();\n\n const scaleButtons = (q: SurveyQuestion, min: number, max: number, labels?: boolean) => {\n const wrap = doc.createElement(\"div\");\n const row = doc.createElement(\"div\");\n row.className = \"g-scale\";\n row.setAttribute(\"role\", \"radiogroup\");\n row.setAttribute(\"aria-label\", q.title);\n for (let i = min; i <= max; i++) {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = String(i);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n row.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-pressed\", \"false\"));\n b.setAttribute(\"aria-pressed\", \"true\");\n setAnswer(q.id, i);\n });\n row.appendChild(b);\n }\n wrap.appendChild(row);\n if (labels && (q.lowLabel || q.highLabel)) {\n const l = doc.createElement(\"div\");\n l.className = \"g-scale-labels\";\n l.append(Object.assign(doc.createElement(\"span\"), { textContent: q.lowLabel || \"\" }), Object.assign(doc.createElement(\"span\"), { textContent: q.highLabel || \"\" }));\n wrap.appendChild(l);\n }\n return wrap;\n };\n\n const buildInput = (q: SurveyQuestion): HTMLElement => {\n switch (q.type) {\n case \"nps\":\n return scaleButtons(q, 0, 10, true);\n case \"csat\":\n return scaleButtons(q, 1, q.scaleMax ?? 5, true);\n case \"rating\": {\n const max = q.scaleMax ?? 5;\n const row = doc.createElement(\"div\");\n row.className = \"g-stars\";\n row.setAttribute(\"role\", \"radiogroup\");\n row.setAttribute(\"aria-label\", q.title);\n const btns: HTMLButtonElement[] = [];\n for (let i = 1; i <= max; i++) {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = \"★\";\n b.setAttribute(\"aria-label\", `${i} of ${max}`);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n btns.forEach((x, j) => {\n x.classList.toggle(\"g-on\", j < i);\n x.setAttribute(\"aria-pressed\", String(j === i - 1));\n });\n setAnswer(q.id, i);\n });\n btns.push(b);\n row.appendChild(b);\n }\n return row;\n }\n case \"thumbs\": {\n const row = doc.createElement(\"div\");\n row.className = \"g-thumbs\";\n row.setAttribute(\"role\", \"radiogroup\");\n [\n [\"up\", \"👍\", \"Thumbs up\"],\n [\"down\", \"👎\", \"Thumbs down\"],\n ].forEach(([val, icon, lbl]) => {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = icon as string;\n b.setAttribute(\"aria-label\", lbl as string);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n row.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-pressed\", \"false\"));\n b.setAttribute(\"aria-pressed\", \"true\");\n setAnswer(q.id, val === \"up\");\n });\n row.appendChild(b);\n });\n return row;\n }\n case \"single_choice\":\n case \"multiple_choice\": {\n const multi = q.type === \"multiple_choice\";\n const group = doc.createElement(\"div\");\n group.setAttribute(\"role\", multi ? \"group\" : \"radiogroup\");\n group.setAttribute(\"aria-label\", q.title);\n q.options.forEach((opt) => {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.className = `g-choice${multi ? \" g-multi\" : \"\"}`;\n b.setAttribute(\"role\", multi ? \"checkbox\" : \"radio\");\n b.setAttribute(\"aria-checked\", \"false\");\n b.setAttribute(\"data-option-id\", opt.id);\n const dot = doc.createElement(\"span\");\n dot.className = \"g-dot\";\n b.append(dot, Object.assign(doc.createElement(\"span\"), { textContent: opt.label }));\n b.addEventListener(\"click\", () => {\n if (multi) {\n const cur = new Set((answers[q.id] as string[] | undefined) ?? []);\n if (cur.has(opt.id)) cur.delete(opt.id);\n else cur.add(opt.id);\n b.setAttribute(\"aria-checked\", String(cur.has(opt.id)));\n setAnswer(q.id, Array.from(cur));\n } else {\n group.querySelectorAll(\".g-choice\").forEach((x) => x.setAttribute(\"aria-checked\", \"false\"));\n b.setAttribute(\"aria-checked\", \"true\");\n setAnswer(q.id, opt.id);\n }\n });\n group.appendChild(b);\n });\n return group;\n }\n case \"text\":\n default: {\n const ta = doc.createElement(\"textarea\");\n ta.className = \"g-input\";\n ta.rows = 3;\n ta.placeholder = q.placeholder || \"\";\n ta.setAttribute(\"aria-label\", q.title);\n ta.addEventListener(\"input\", () => setAnswer(q.id, ta.value.slice(0, 5000)));\n return ta;\n }\n }\n };\n\n config.questions.forEach((q) => {\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-question\";\n wrap.setAttribute(\"data-question-id\", q.id);\n const t = doc.createElement(\"p\");\n t.className = \"g-q-title\";\n t.textContent = q.title + (q.required ? \"\" : \" (optional)\");\n wrap.appendChild(t);\n if (q.description) {\n const d = doc.createElement(\"p\");\n d.className = \"g-q-desc\";\n d.textContent = q.description;\n wrap.appendChild(d);\n }\n wrap.appendChild(buildInput(q));\n questionEls.set(q.id, wrap);\n form.appendChild(wrap);\n });\n\n const footer = doc.createElement(\"div\");\n footer.className = \"g-footer\";\n const submit = doc.createElement(\"button\");\n submit.type = \"submit\";\n submit.className = \"g-btn g-btn-primary\";\n submit.textContent = \"Submit\";\n footer.appendChild(submit);\n form.appendChild(errorEl);\n form.appendChild(footer);\n\n function updateVisibility() {\n config.questions.forEach((q) => {\n const el = questionEls.get(q.id);\n if (!el) return;\n const visible = isQuestionVisible(q, answers);\n el.hidden = !visible;\n if (!visible && answers[q.id] !== undefined) delete answers[q.id];\n });\n }\n\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n const missing = config.questions.filter((q) => q.required && isQuestionVisible(q, answers) && answers[q.id] === undefined);\n if (missing.length) {\n errorEl.textContent = `Please answer: ${missing.map((q) => q.title).join(\", \")}`;\n questionEls.get(missing[0]!.id)?.querySelector<HTMLElement>(\"button,textarea\")?.focus();\n return;\n }\n errorEl.textContent = \"\";\n options.onSubmit({ ...answers });\n });\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && options.onDismiss) {\n e.stopPropagation();\n options.onDismiss();\n }\n };\n card.addEventListener(\"keydown\", onKey);\n updateVisibility();\n (form.querySelector<HTMLElement>(\"button,textarea\") || card).focus?.({ preventScroll: true });\n\n return {\n el: card,\n getAnswers: () => ({ ...answers }),\n showThankYou() {\n inner.textContent = \"\";\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-complete\";\n const t = doc.createElement(\"h3\");\n t.className = \"g-title\";\n t.textContent = config.thankYouTitle;\n const b = doc.createElement(\"div\");\n b.className = \"g-body\";\n setSanitizedHtml(b, config.thankYouBody);\n const done = doc.createElement(\"button\");\n done.type = \"button\";\n done.className = \"g-btn g-btn-primary\";\n done.textContent = \"Done\";\n done.style.marginTop = \"12px\";\n done.addEventListener(\"click\", () => options.onDismiss?.());\n wrap.append(t, b, done);\n inner.appendChild(wrap);\n done.focus?.({ preventScroll: true });\n },\n destroy() {\n card.removeEventListener(\"keydown\", onKey);\n card.remove();\n },\n };\n}\n","import type { ResourceCenterArticle, ResourceCenterConfig, ResourceCenterModuleId, RuleGroup } from \"@guidelytech/shared\";\nimport { orderedModules, unreadAnnouncements, visibleAnnouncements } from \"@guidelytech/shared/runtime\";\nimport { createHelpView, el, type HelpGuideRef } from \"./help-view\";\n\nexport type ResourceCenterGuideRef = HelpGuideRef;\n\nexport interface ResourceCenterOptions {\n scope: HTMLElement;\n config: ResourceCenterConfig;\n /** Published guides (used to display recommended guides and checklists by id/key). */\n guides?: ResourceCenterGuideRef[];\n /** Server search. Results are merged with the client-side title/summary filter. */\n search?: (q: string) => Promise<ResourceCenterArticle[]>;\n /** The visitor's audiences (for audience-targeted articles and collections). */\n audienceIds?: () => ReadonlySet<string> | readonly string[];\n /** Loads bodies the published config left out to stay small (`bodyOmitted`). */\n loadArticle?: (id: string) => Promise<ResourceCenterArticle | null>;\n onStartGuide?: (guideId: string) => void;\n onOpenChecklist?: (guideId: string) => void;\n onArticleView?: (article: ResourceCenterArticle) => void;\n onOpen?: () => void;\n onClose?: () => void;\n /** Hide the launcher (when the host app provides its own trigger). */\n hideLauncher?: boolean;\n /** Evaluates a module's targeting for the current visitor (absent = every module shows). */\n evaluate?: (rules: RuleGroup) => boolean;\n /** When the visitor last opened \"What's new\" (for the unread badge). */\n announcementsSeenAt?: () => string | null | undefined;\n /** The panel opened with \"What's new\" visible: everything listed is now read. */\n onAnnouncementsSeen?: () => void;\n}\n\nexport interface ResourceCenterWidget {\n el: HTMLElement;\n open(): void;\n close(): void;\n toggle(): void;\n isOpen(): boolean;\n destroy(): void;\n}\n\n/** Launcher + panel with search, collections, articles, recommended guides, checklists, FAQs and links. */\nexport function renderResourceCenter(options: ResourceCenterOptions): ResourceCenterWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n const guides = options.guides ?? [];\n let open = false;\n const pos = `g-pos-${config.launcher.position}`;\n const byId = (ids: string[]) => ids.map((id) => guides.find((g) => g.id === id || g.key === id)).filter((g): g is ResourceCenterGuideRef => !!g);\n\n const root = el(doc, \"div\", \"g-resource-center\");\n const launcher = el(doc, \"button\", `g-launcher ${pos}`);\n launcher.type = \"button\";\n launcher.setAttribute(\"aria-expanded\", \"false\");\n if (config.launcher.showIcon) {\n const icon = el(doc, \"span\", \"\", \"?\");\n icon.setAttribute(\"aria-hidden\", \"true\");\n launcher.appendChild(icon);\n }\n launcher.appendChild(el(doc, \"span\", \"\", config.launcher.label || config.title));\n launcher.setAttribute(\"aria-label\", config.launcher.label || config.title);\n if (options.hideLauncher) launcher.hidden = true;\n const badge = el(doc, \"span\", \"g-launcher-badge\");\n badge.hidden = true;\n launcher.appendChild(badge);\n\n /** Sections this visitor sees, in order (disabled ones and ones whose targeting doesn't match are left out). */\n const modules = (): ResourceCenterModuleId[] =>\n orderedModules(config.modules)\n .filter((m) => m.enabled && (!(\"targeting\" in m) || !m.targeting || !options.evaluate || options.evaluate(m.targeting)))\n .map((m) => m.id as ResourceCenterModuleId);\n const announcements = () => (modules().includes(\"announcements\") ? visibleAnnouncements(config.announcements, options.audienceIds?.() ?? []) : []);\n const updateBadge = () => {\n const unread = unreadAnnouncements(announcements(), options.announcementsSeenAt?.());\n badge.hidden = unread === 0;\n badge.textContent = unread > 9 ? \"9+\" : String(unread);\n const label = config.launcher.label || config.title;\n launcher.setAttribute(\"aria-label\", unread ? `${label} (${unread} new update${unread === 1 ? \"\" : \"s\"})` : label);\n };\n updateBadge();\n\n const panel = el(doc, \"div\", `g-panel ${pos}`);\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", config.title);\n panel.hidden = true;\n const head = el(doc, \"div\", \"g-panel-head\");\n head.appendChild(el(doc, \"h2\", \"g-panel-title\", config.title));\n const close = el(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Close\");\n head.appendChild(close);\n let seenAtOpen: string | null = options.announcementsSeenAt?.() ?? null;\n const help = createHelpView({\n doc,\n data: () => ({\n collections: config.collections,\n articles: config.articles,\n recommended: byId(config.recommendedGuideIds),\n checklists: byId(config.checklistGuideIds),\n faqs: config.faqs,\n links: config.links,\n announcements: announcements(),\n announcementsSeenAt: seenAtOpen,\n modules: modules(),\n }),\n search: options.search,\n audienceIds: options.audienceIds,\n loadArticle: options.loadArticle,\n onStartGuide: options.onStartGuide,\n onOpenChecklist: options.onOpenChecklist,\n onArticleView: options.onArticleView,\n guides: () => guides,\n onShowMe: (key) => {\n setOpen(false);\n options.onStartGuide?.(key);\n },\n // Articles read in a larger panel.\n onArticleChange: (reading) => panel.classList.toggle(\"g-panel-reading\", reading),\n });\n panel.append(head, help.el);\n root.append(launcher, panel);\n scope.appendChild(root);\n\n const setOpen = (v: boolean) => {\n if (open === v) return;\n open = v;\n panel.hidden = !v;\n launcher.setAttribute(\"aria-expanded\", String(v));\n if (v) {\n // Entries stay marked \"New\" while the panel is open; the badge clears now.\n seenAtOpen = options.announcementsSeenAt?.() ?? null;\n help.render();\n help.focusSearch();\n if (announcements().length) {\n options.onAnnouncementsSeen?.();\n updateBadge();\n }\n options.onOpen?.();\n } else {\n help.reset();\n options.onClose?.();\n }\n };\n launcher.addEventListener(\"click\", () => setOpen(!open));\n close.addEventListener(\"click\", () => setOpen(false));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n setOpen(false);\n launcher.focus();\n }\n };\n panel.addEventListener(\"keydown\", onKey);\n\n return {\n el: root,\n open: () => setOpen(true),\n close: () => setOpen(false),\n toggle: () => setOpen(!open),\n isOpen: () => open,\n destroy() {\n help.destroy();\n panel.removeEventListener(\"keydown\", onKey);\n root.remove();\n },\n };\n}\n","import type { ResourceCenterAnnouncement, ResourceCenterArticle, ResourceCenterConfig, ResourceCenterModuleId } from \"@guidelytech/shared\";\nimport { isArticleListed, matchesHelpQuery, RC_MODULE_IDS, RC_MODULE_LABELS, resourceCenterSections, showMeKeyFromHref, SHOW_ME_HREF_PREFIX } from \"@guidelytech/shared/runtime\";\nimport { enhancePdfViewers } from \"./pdf-viewer\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nexport interface HelpGuideRef {\n id: string;\n key: string;\n name: string;\n kind: string;\n}\n\n/** A page-aware suggestion at the top of the help view (the messenger works out what and how it opens). */\nexport interface HelpSuggestion {\n kind: \"guide\" | \"howto\" | \"article\";\n title: string;\n summary?: string;\n run: () => void;\n}\n\n/** What the help view lists. Article bodies may be missing (`bodyOmitted` or summaries only): they load on open. */\nexport interface HelpData {\n collections: ResourceCenterConfig[\"collections\"];\n articles: Array<Omit<ResourceCenterArticle, \"body\"> & { body?: string }>;\n /** Shown first, under its own title (\"For the Invoices page\"). */\n suggested?: { title: string; items: HelpSuggestion[] };\n recommended?: HelpGuideRef[];\n checklists?: HelpGuideRef[];\n faqs?: ResourceCenterConfig[\"faqs\"];\n links?: ResourceCenterConfig[\"links\"];\n /** \"What's new\" entries (already filtered for the visitor, newest first). */\n announcements?: ResourceCenterAnnouncement[];\n /** Announcements published after this time are marked new. */\n announcementsSeenAt?: string | null;\n /** Sections to show, in order (absent = all, default order). */\n modules?: ResourceCenterModuleId[];\n}\n\nexport interface HelpViewOptions {\n doc: Document;\n data: () => HelpData;\n /** Server search. Results are merged with the client-side title/summary filter. */\n search?: (q: string) => Promise<ResourceCenterArticle[]>;\n /** The visitor's audiences; articles and collections targeted at others aren't listed. */\n audienceIds?: () => ReadonlySet<string> | readonly string[];\n /** Loads an article body that isn't in `data()`. */\n loadArticle?: (id: string) => Promise<ResourceCenterArticle | null>;\n onStartGuide?: (guideId: string) => void;\n onOpenChecklist?: (guideId: string) => void;\n onArticleView?: (article: ResourceCenterArticle) => void;\n /** Extra items above the list (`query` empty) or above the article results (the messenger's how-tos). */\n extra?: (query: string) => Node[];\n /** Live guides in this environment: \"Show me\" prompts only appear for ones that can be started. */\n guides?: () => readonly HelpGuideRef[];\n /** Starts a walkthrough from a Show me prompt (an article's, or a search result's). */\n onShowMe?: (guideKey: string) => void;\n /** An article opened (`true`) or the view went back to the list (`false`); hosts enlarge their panel to read it. */\n onArticleChange?: (open: boolean) => void;\n}\n\n/** Guide kinds a Show me prompt can start on demand. */\nconst SHOW_ME_KINDS = new Set([\"flow\", \"modal\", \"tooltip\", \"announcement\"]);\n\n/** The guide a Show me prompt names, when it is live here and can be started. */\nexport function startableGuide(guides: readonly HelpGuideRef[] | undefined, keyOrId: string | null | undefined): HelpGuideRef | null {\n if (!keyOrId || !guides) return null;\n return guides.find((g) => (g.key === keyOrId || g.id === keyOrId) && SHOW_ME_KINDS.has(g.kind)) ?? null;\n}\n\n/**\n * A result row: the item opens on click, and a separate \"Show me\" button starts its walkthrough\n * right away. Two sibling buttons, never one inside the other.\n */\nexport function resultRow(doc: Document, icon: string, title: string, summary: string | undefined, onOpen: () => void, showMe?: () => void): HTMLElement {\n const item = listItem(doc, icon, title, summary);\n item.addEventListener(\"click\", onOpen);\n if (!showMe) return item;\n const row = el(doc, \"div\", \"g-rc-row\");\n const b = el(doc, \"button\", \"g-btn g-btn-primary g-rc-showme\", \"▶ Show me\");\n b.type = \"button\";\n b.setAttribute(\"aria-label\", `Show me: ${title}`);\n b.addEventListener(\"click\", showMe);\n row.append(item, b);\n return row;\n}\n\n/**\n * Turns the Show me links in a rendered article (`<a href=\"#guidely-show-me:<key>\">`) into buttons\n * that start the walkthrough, and removes the ones whose guide isn't live here.\n */\nexport function enhanceShowMe(root: HTMLElement, doc: Document, canStart: (key: string) => boolean, start: (key: string) => void): void {\n for (const a of Array.from(root.querySelectorAll<HTMLAnchorElement>(`a[href^=\"${SHOW_ME_HREF_PREFIX}\"]`))) {\n const key = showMeKeyFromHref(a.getAttribute(\"href\"));\n const holder = a.closest(\"p.gd-show-me\") ?? a;\n if (!key || !canStart(key)) {\n // A prompt alone in its paragraph goes with it; one inside text keeps its words.\n if (holder !== a) holder.remove();\n else a.replaceWith(doc.createTextNode(a.textContent ?? \"\"));\n continue;\n }\n const b = el(doc, \"button\", \"g-btn g-btn-primary g-help-showme\", `▶ ${(a.textContent ?? \"\").trim() || \"Show me\"}`);\n b.type = \"button\";\n b.addEventListener(\"click\", () => start(key));\n a.replaceWith(b);\n }\n}\n\nexport interface HelpView {\n /** Search box + scrollable body. */\n el: HTMLElement;\n render(): void;\n /** Back to the article list and clear the search. */\n reset(): void;\n openArticle(id: string): void;\n /** True while an article is open. */\n isArticleOpen(): boolean;\n focusSearch(): void;\n setQuery(q: string): void;\n destroy(): void;\n}\n\nexport function el<K extends keyof HTMLElementTagNameMap>(doc: Document, tag: K, cls?: string, text?: string): HTMLElementTagNameMap[K] {\n const e = doc.createElement(tag);\n if (cls) e.className = cls;\n if (text != null) e.textContent = text;\n return e;\n}\n\nexport function listItem(doc: Document, icon: string, title: string, summary?: string): HTMLButtonElement {\n const b = el(doc, \"button\", \"g-rc-item\");\n b.type = \"button\";\n const i = el(doc, \"span\", \"g-rc-icon\", icon);\n i.setAttribute(\"aria-hidden\", \"true\");\n const text = el(doc, \"span\");\n text.appendChild(el(doc, \"div\", \"g-rc-title\", title));\n if (summary) text.appendChild(el(doc, \"div\", \"g-rc-sum\", summary));\n b.append(i, text);\n return b;\n}\n\ntype ListedArticle = HelpData[\"articles\"][number];\n\n/** Article browser shared by the resource center and the messenger Help tab. */\nexport function createHelpView(options: HelpViewOptions): HelpView {\n const { doc } = options;\n let query = \"\";\n let serverResults: ResourceCenterArticle[] = [];\n let searchSeq = 0;\n let openSeq = 0;\n let active: { article: ListedArticle; loading: boolean } | null = null;\n const setActive = (next: typeof active) => {\n const was = !!active;\n active = next;\n if (was !== !!next) options.onArticleChange?.(!!next);\n };\n\n const root = el(doc, \"div\", \"g-help\");\n const searchWrap = el(doc, \"div\", \"g-rc-search\");\n const input = el(doc, \"input\", \"g-input\");\n input.type = \"search\";\n input.placeholder = \"Search help articles…\";\n input.setAttribute(\"aria-label\", \"Search help articles\");\n searchWrap.appendChild(input);\n const body = el(doc, \"div\", \"g-panel-body\");\n root.append(searchWrap, body);\n\n const hasBody = (a: ListedArticle): a is ResourceCenterArticle => typeof a.body === \"string\" && !a.bodyOmitted;\n const canShowMe = (key: string) => !!options.onShowMe && !!startableGuide(options.guides?.(), key);\n const showMe = (key: string) => options.onShowMe?.(startableGuide(options.guides?.(), key)?.key ?? key);\n\n const openArticle = (article: ListedArticle) => {\n if (article.externalUrl) {\n window.open(article.externalUrl, \"_blank\", \"noopener,noreferrer\");\n if (hasBody(article)) options.onArticleView?.(article);\n return;\n }\n const seq = ++openSeq;\n if (hasBody(article) || !options.loadArticle) {\n setActive({ article, loading: false });\n if (hasBody(article)) options.onArticleView?.(article);\n return render();\n }\n setActive({ article, loading: true });\n render();\n options\n .loadArticle(article.id)\n .then((full) => {\n if (seq !== openSeq || !active) return;\n setActive({ article: full ?? { ...article, body: \"\" }, loading: false });\n if (full) options.onArticleView?.(full);\n render();\n })\n .catch(() => {\n if (seq !== openSeq || !active) return;\n setActive({ article: { ...article, body: \"\" }, loading: false });\n render();\n });\n };\n\n const renderArticle = ({ article, loading }: NonNullable<typeof active>) => {\n const wrap = el(doc, \"div\", \"g-rc-article\");\n const back = el(doc, \"button\", \"g-btn g-btn-link g-rc-back\", \"← Back\");\n back.type = \"button\";\n back.addEventListener(\"click\", () => {\n openSeq++;\n setActive(null);\n render();\n });\n const title = el(doc, \"h3\", \"g-title\", article.title);\n const content = el(doc, \"div\", \"g-body\");\n if (loading) content.appendChild(el(doc, \"div\", \"g-rc-empty\", \"Loading…\"));\n else if (article.body) {\n setSanitizedHtml(content, article.body);\n enhancePdfViewers(content, doc);\n enhanceShowMe(content, doc, canShowMe, showMe);\n }\n else content.appendChild(el(doc, \"div\", \"g-rc-empty\", \"This article couldn't be loaded.\"));\n wrap.append(back, title, content);\n body.appendChild(wrap);\n back.focus?.({ preventScroll: true });\n };\n\n const section = (label: string, depth = 0) => {\n const s = body.appendChild(el(doc, \"div\", \"g-rc-section\", label));\n if (depth) s.dataset.depth = String(depth);\n return s;\n };\n const articleButton = (a: ListedArticle) => {\n const key = a.walkthroughs?.find(canShowMe);\n const summary = a.hasVideo ? (a.summary ? `Video · ${a.summary}` : \"Video\") : a.summary;\n body.appendChild(resultRow(doc, a.hasVideo ? \"▶\" : \"📄\", a.title, summary, () => openArticle(a), key ? () => showMe(key) : undefined));\n };\n\n function render() {\n body.textContent = \"\";\n if (active) return renderArticle(active);\n const data = options.data();\n const member = options.audienceIds?.() ?? [];\n searchWrap.hidden = !!data.modules && !data.modules.includes(\"search\");\n const sections = resourceCenterSections(data.collections, data.articles, member);\n const q = query.trim().toLowerCase();\n if (q) {\n // Walkthroughs the team lists in Help (recommended guides) whose name matches, ready to start.\n const walkthroughs = (data.recommended ?? []).filter((g) => matchesHelpQuery(g.name, q) && startableGuide(options.guides?.() ?? data.recommended, g.id));\n if (walkthroughs.length) {\n section(`Walkthroughs (${walkthroughs.length})`);\n for (const g of walkthroughs) body.appendChild(resultRow(doc, \"▶\", g.name, \"Show me, step by step\", () => options.onStartGuide?.(g.id)));\n }\n }\n body.append(...(options.extra?.(q) ?? []));\n if (q) {\n const visible = sections.flatMap((s) => s.articles);\n const local = visible.filter((a) => matchesHelpQuery(`${a.title} ${a.summary}`, q));\n const seen = new Set(local.map((a) => a.id));\n // Server search covers every published article: keep only the ones listed for this visitor.\n const hidden = new Set(data.articles.map((a) => a.id).filter((id) => !visible.some((v) => v.id === id)));\n const merged: ListedArticle[] = [...local, ...serverResults.filter((a) => !seen.has(a.id) && !hidden.has(a.id) && isArticleListed(data.collections, a, member))];\n section(`Results (${merged.length})`);\n if (!merged.length) body.appendChild(el(doc, \"div\", \"g-rc-empty\", \"No articles match your search.\"));\n merged.forEach(articleButton);\n return;\n }\n if (data.suggested?.items.length) {\n section(data.suggested.title);\n const glyph = { guide: \"▶\", howto: \"☰\", article: \"📄\" } as const;\n data.suggested.items.forEach((item) => {\n const b = listItem(doc, glyph[item.kind], item.title, item.summary);\n b.addEventListener(\"click\", item.run);\n body.appendChild(b);\n });\n }\n const renderers: Record<ResourceCenterModuleId, () => void> = {\n search: () => {},\n announcements: () => {\n if (!data.announcements?.length) return;\n section(RC_MODULE_LABELS.announcements);\n const seen = data.announcementsSeenAt ? Date.parse(data.announcementsSeenAt) : NaN;\n data.announcements.slice(0, 20).forEach((n) => body.appendChild(announcementItem(n, Number.isNaN(seen) || Date.parse(n.publishedAt) > seen)));\n },\n guides: () => {\n if (!data.recommended?.length) return;\n section(\"Recommended\");\n data.recommended.forEach((g) => {\n const b = listItem(doc, \"▶\", g.name, \"Start guide\");\n b.addEventListener(\"click\", () => options.onStartGuide?.(g.id));\n body.appendChild(b);\n });\n },\n checklists: () => {\n if (!data.checklists?.length) return;\n section(\"Checklists\");\n data.checklists.forEach((g) => {\n const b = listItem(doc, \"☑\", g.name, \"Open checklist\");\n b.addEventListener(\"click\", () => options.onOpenChecklist?.(g.id));\n body.appendChild(b);\n });\n },\n articles: () => {\n // Nested collections read as \"Billing › Invoices\", depth first.\n for (const s of sections) {\n section(s.collection ? s.path.join(\" › \") : \"Articles\", s.depth);\n s.articles.forEach(articleButton);\n }\n },\n faqs: () => {\n if (!data.faqs?.length) return;\n section(\"FAQ\");\n data.faqs.forEach((f) => {\n const b = listItem(doc, \"?\", f.question);\n b.setAttribute(\"aria-expanded\", \"false\");\n const a = el(doc, \"div\", \"g-faq-a\");\n a.id = `g-faq-${f.id}`;\n b.setAttribute(\"aria-controls\", a.id);\n setSanitizedHtml(a, f.answer);\n a.hidden = true;\n b.addEventListener(\"click\", () => {\n a.hidden = !a.hidden;\n b.setAttribute(\"aria-expanded\", String(!a.hidden));\n });\n body.append(b, a);\n });\n },\n links: () => {\n if (!data.links?.length) return;\n section(\"Links\");\n data.links.forEach((l) => {\n const a = el(doc, \"a\", \"g-rc-item\");\n a.href = l.url;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n const i = el(doc, \"span\", \"g-rc-icon\", \"↗\");\n i.setAttribute(\"aria-hidden\", \"true\");\n a.append(i, el(doc, \"span\", \"g-rc-title\", l.label));\n a.setAttribute(\"aria-label\", `${l.label} (opens in a new tab)`);\n body.appendChild(a);\n });\n },\n };\n for (const id of data.modules ?? RC_MODULE_IDS) renderers[id]?.();\n if (!body.childNodes.length) body.appendChild(el(doc, \"div\", \"g-rc-empty\", \"Nothing here yet.\"));\n }\n\n /** One \"What's new\" entry: title, date, body and its links (Show me, the article, a URL). */\n function announcementItem(n: ResourceCenterAnnouncement, unread: boolean): HTMLElement {\n const item = el(doc, \"article\", `g-rc-news${unread ? \" g-rc-news-unread\" : \"\"}`);\n const head = el(doc, \"div\", \"g-rc-news-head\");\n const title = el(doc, \"h3\", \"g-rc-news-title\", n.title);\n head.appendChild(title);\n if (unread) {\n const dot = el(doc, \"span\", \"g-rc-news-new\", \"New\");\n head.appendChild(dot);\n }\n const date = el(doc, \"time\", \"g-rc-news-date\");\n date.dateTime = n.publishedAt;\n try {\n date.textContent = new Date(n.publishedAt).toLocaleDateString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" });\n } catch {\n date.textContent = n.publishedAt.slice(0, 10);\n }\n item.append(head, date);\n if (n.body) {\n const b = el(doc, \"div\", \"g-body g-rc-news-body\");\n setSanitizedHtml(b, n.body);\n item.appendChild(b);\n }\n const actions = el(doc, \"div\", \"g-rc-news-actions\");\n const guide = n.guideId ? startableGuide(options.guides?.(), n.guideId) : null;\n if (guide) {\n const b = el(doc, \"button\", \"g-btn g-btn-primary\", n.linkLabel || \"Show me\");\n b.type = \"button\";\n b.addEventListener(\"click\", () => (options.onShowMe ? options.onShowMe(guide.key) : options.onStartGuide?.(guide.id)));\n actions.appendChild(b);\n }\n if (n.articleId) {\n const listed = options.data().articles.find((a) => a.id === n.articleId);\n if (listed) {\n const b = el(doc, \"button\", \"g-btn g-btn-secondary\", guide ? \"Read more\" : n.linkLabel || \"Read more\");\n b.type = \"button\";\n b.addEventListener(\"click\", () => openArticle(listed));\n actions.appendChild(b);\n }\n }\n if (n.url && /^https?:\\/\\//i.test(n.url)) {\n const a = el(doc, \"a\", \"g-btn g-btn-link\", !guide && !n.articleId && n.linkLabel ? n.linkLabel : \"Learn more\");\n a.href = n.url;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n actions.appendChild(a);\n }\n if (actions.childNodes.length) item.appendChild(actions);\n return item;\n }\n\n let debounce: ReturnType<typeof setTimeout> | null = null;\n const onInput = () => {\n query = input.value;\n openSeq++;\n setActive(null);\n render();\n if (debounce) clearTimeout(debounce);\n if (!options.search || !query.trim()) {\n serverResults = [];\n return;\n }\n const seq = ++searchSeq;\n debounce = setTimeout(() => {\n options\n .search?.(query.trim())\n .then((results) => {\n if (seq !== searchSeq) return;\n serverResults = Array.isArray(results) ? results : [];\n render();\n })\n .catch(() => {});\n }, 250);\n };\n input.addEventListener(\"input\", onInput);\n\n return {\n el: root,\n render,\n reset() {\n openSeq++;\n setActive(null);\n query = \"\";\n input.value = \"\";\n serverResults = [];\n },\n openArticle(id: string) {\n const listed = options.data().articles.find((a) => a.id === id) ?? { id, slug: id, title: \"Article\", summary: \"\", updatedAt: \"\", bodyOmitted: true };\n openArticle(listed);\n },\n isArticleOpen: () => !!active,\n focusSearch: () => input.focus?.({ preventScroll: true }),\n setQuery(q: string) {\n input.value = q;\n onInput();\n },\n destroy() {\n if (debounce) clearTimeout(debounce);\n input.removeEventListener(\"input\", onInput);\n root.remove();\n },\n };\n}\n","import type { AuthoringPick, GuideStep, ProjectTheme, SelectorStrategy } from \"@guidelytech/shared\";\nimport { runGuide, type GuideController, type RunnableGuide } from \"./controller\";\nimport { createScope, ensureHost } from \"./host\";\nimport { componentAnchor, composedTarget, deepElementFromPoint, describeElement, isGuidelyElement, querySelectorStrategy, resolveTarget, visualRect } from \"./selectors\";\n\nexport interface AuthoringOptions {\n /** Called with the pick for each clicked element. */\n onPick: (pick: AuthoringPick & { element: Element }) => void;\n /** Called when the user exits authoring mode (Done / Exit / Esc with nothing hovered). */\n onExit: () => void;\n dashboardOrigin?: string;\n /** Text shown in the toolbar. */\n message?: string;\n doc?: Document;\n}\n\nexport interface AuthoringSession {\n /** Replace the toolbar status text. */\n setStatus(text: string): void;\n /** Pause/resume picking (e.g. while a preview is shown). */\n setPicking(enabled: boolean): void;\n stop(): void;\n}\n\nconst DEFAULT_MESSAGE = \"Guidely authoring — hover an element and click to select · Esc to cancel\";\n\n/**\n * Enters authoring mode: Shadow-DOM toolbar, hover outline following `elementFromPoint`, and\n * click-to-pick (captured in the capture phase so the host app never receives the click).\n */\nexport function startAuthoring(options: AuthoringOptions): AuthoringSession {\n const doc = options.doc ?? document;\n const win = doc.defaultView ?? window;\n const scope = createScope(null, { theme: \"light\", animation: \"none\" }, doc);\n const bar = doc.createElement(\"div\");\n bar.className = \"g-auth-bar\";\n bar.setAttribute(\"role\", \"toolbar\");\n const dot = doc.createElement(\"span\");\n dot.className = \"g-dot-live\";\n const status = doc.createElement(\"span\");\n status.textContent = options.message ?? DEFAULT_MESSAGE;\n const spacer = doc.createElement(\"span\");\n spacer.className = \"g-spacer\";\n const done = doc.createElement(\"button\");\n done.type = \"button\";\n done.className = \"g-btn g-btn-primary\";\n done.textContent = \"Done\";\n const exit = doc.createElement(\"button\");\n exit.type = \"button\";\n exit.className = \"g-btn g-btn-secondary\";\n exit.textContent = \"Exit authoring\";\n bar.append(dot, status, spacer, done, exit);\n const outline = doc.createElement(\"div\");\n outline.className = \"g-auth-outline\";\n outline.hidden = true;\n const label = doc.createElement(\"span\");\n label.className = \"g-auth-label\";\n outline.appendChild(label);\n scope.el.append(bar, outline);\n\n let picking = true;\n let hovered: Element | null = null;\n let stopped = false;\n\n const describe = (el: Element): string => {\n const tag = el.tagName.toLowerCase();\n const id = el.id ? `#${el.id}` : \"\";\n const tour = el.getAttribute(\"data-tour\") || el.getAttribute(\"data-testid\");\n const text = (el.textContent || \"\").replace(/\\s+/g, \" \").trim().slice(0, 40);\n return `${tag}${id}${tour ? `[${tour}]` : \"\"}${text ? ` “${text}”` : \"\"}`;\n };\n\n const paint = (el: Element | null, picked = false) => {\n if (!el) {\n outline.hidden = true;\n return;\n }\n const r = visualRect(el);\n outline.hidden = false;\n outline.classList.toggle(\"g-picked\", picked);\n Object.assign(outline.style, { left: `${r.left}px`, top: `${r.top}px`, width: `${r.width}px`, height: `${r.height}px` });\n label.textContent = describe(el);\n label.style.top = r.top < 30 ? \"100%\" : \"-24px\";\n };\n\n const elementAt = (x: number, y: number): Element | null => {\n const el = deepElementFromPoint(doc, x, y);\n if (!el || isGuidelyElement(el) || el === doc.documentElement || el === doc.body) return null;\n // Outline what will be targeted: a component rather than its internals.\n return componentAnchor(el);\n };\n\n const onMove = (e: MouseEvent) => {\n if (!picking || stopped) return;\n const el = elementAt(e.clientX, e.clientY);\n if (el !== hovered) {\n hovered = el;\n paint(el);\n }\n };\n const onScroll = () => {\n if (hovered) paint(hovered);\n };\n const onClick = (e: MouseEvent) => {\n if (!picking || stopped) return;\n if (isGuidelyElement(composedTarget(e))) return;\n const el = elementAt(e.clientX, e.clientY) ?? hovered;\n if (!el) return;\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n const d = describeElement(el);\n paint(el, true);\n status.textContent = `Selected ${describe(el)} — click another element or press Done`;\n options.onPick({ selectors: d.selectors, textSnapshot: d.textSnapshot, rect: d.rect, url: win.location.href, element: el });\n };\n const swallow = (e: Event) => {\n if (!picking || stopped) return;\n if (isGuidelyElement(composedTarget(e))) return;\n e.preventDefault();\n e.stopPropagation();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n stop();\n options.onExit();\n }\n };\n const stop = () => {\n if (stopped) return;\n stopped = true;\n doc.removeEventListener(\"mousemove\", onMove, true);\n doc.removeEventListener(\"click\", onClick, true);\n doc.removeEventListener(\"mousedown\", swallow, true);\n doc.removeEventListener(\"mouseup\", swallow, true);\n doc.removeEventListener(\"keydown\", onKey, true);\n win.removeEventListener(\"scroll\", onScroll, true);\n win.removeEventListener(\"resize\", onScroll);\n scope.destroy();\n };\n done.addEventListener(\"click\", () => {\n stop();\n options.onExit();\n });\n exit.addEventListener(\"click\", () => {\n stop();\n options.onExit();\n });\n doc.addEventListener(\"mousemove\", onMove, true);\n doc.addEventListener(\"click\", onClick, true);\n doc.addEventListener(\"mousedown\", swallow, true);\n doc.addEventListener(\"mouseup\", swallow, true);\n doc.addEventListener(\"keydown\", onKey, true);\n win.addEventListener(\"scroll\", onScroll, true);\n win.addEventListener(\"resize\", onScroll);\n\n return {\n setStatus: (text) => {\n status.textContent = text;\n },\n setPicking: (enabled) => {\n picking = enabled;\n if (!enabled) paint(null);\n },\n stop,\n };\n}\n\nexport interface PreviewHandle {\n controller: GuideController;\n destroy(): void;\n}\n\n/**\n * Renders a single draft step on the current page (used by the dashboard editor's \"preview in\n * app\" and by the simulated preview). Anchored steps resolve their target; when it cannot be\n * found the step is shown as a modal so authors always see something.\n */\nexport function previewStep(step: GuideStep, theme?: Partial<ProjectTheme> | null, options: { appearance?: RunnableGuide[\"config\"][\"appearance\"]; onEnd?: () => void; doc?: Document; index?: number; total?: number } = {}): PreviewHandle {\n const previewStepConfig: GuideStep = { ...step, target: step.target ? { ...step.target, fallback: \"show_as_modal\", waitMs: Math.min(step.target.waitMs, 1500) } : step.target };\n const guide: RunnableGuide = {\n id: `preview-${step.id}`,\n key: \"preview\",\n name: \"Preview\",\n kind: \"flow\",\n version: 0,\n config: { steps: [previewStepConfig], visibility: \"everyone\", targeting: { id: \"root\", op: \"and\", rules: [] }, trigger: { type: \"manual\", delayMs: 0 }, frequency: { mode: \"every_time\", cooldownHours: 0, priority: 0, mutuallyExclusiveWith: [], reshowAfterDismiss: true }, appearance: options.appearance ?? { theme: \"auto\", animation: \"fade\" }, urlPatterns: [], platforms: [\"web\"] },\n };\n const controller = runGuide(guide, { theme, doc: options.doc, onEnd: () => options.onEnd?.(), onNavigate: () => {}, onAction: () => {} });\n controller.start();\n return { controller, destroy: () => controller.destroy() };\n}\n\nexport interface HighlightHandle {\n /** Number of matched elements per strategy. */\n counts: number[];\n /** Element resolved as the step target (first strategy with exactly one visible match). */\n resolved: Element | null;\n destroy(): void;\n}\n\n/** Draws dashed boxes around every element matched by the selectors, for testing selectors while authoring. */\nexport function highlightSelectors(selectors: SelectorStrategy[], options: { durationMs?: number; doc?: Document } = {}): HighlightHandle {\n const doc = options.doc ?? document;\n const scope = createScope(null, { theme: \"light\", animation: \"none\" }, doc);\n const boxes: HTMLElement[] = [];\n const counts: number[] = [];\n const resolved = resolveTarget(selectors, doc);\n const matched = new Set<Element>();\n selectors.forEach((s) => {\n const els = querySelectorStrategy(s, doc).filter((el) => !isGuidelyElement(el));\n counts.push(els.length);\n els.forEach((el) => matched.add(el));\n });\n matched.forEach((el) => {\n const r = visualRect(el);\n const box = doc.createElement(\"div\");\n box.className = \"g-highlight\";\n Object.assign(box.style, { left: `${r.left}px`, top: `${r.top}px`, width: `${r.width}px`, height: `${r.height}px` });\n if (el === resolved) box.style.borderColor = \"#22c55e\";\n scope.el.appendChild(box);\n boxes.push(box);\n });\n let timer: ReturnType<typeof setTimeout> | null = null;\n const destroy = () => {\n if (timer) clearTimeout(timer);\n scope.destroy();\n };\n if (options.durationMs !== 0) timer = setTimeout(destroy, options.durationMs ?? 2500);\n ensureHost(doc);\n return { counts, resolved, destroy };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA,iBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,qBAAgC;AAOzB,SAAS,WAAW,SAAoC,KAAsB;AACnF,MAAI,CAAC,QAAS,QAAO;AACrB,UAAI,gCAAgB,SAAS,GAAG,EAAG,QAAO;AAC1C,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,KAAK,kBAAkB;AACzC,QAAI,CAAC,QAAQ,SAAS,GAAG,KAAK,CAAC,QAAQ,SAAS,GAAG,EAAG,YAAO,gCAAgB,SAAS,EAAE,QAAQ,SAAK,gCAAgB,SAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,EACrJ,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAIA,IAAM,kBACJ;AAEF,IAAM,UAAU;AAEhB,SAAS,MAAM,MAA2B;AACxC,SAAO,KAAK,aAAa,IAAK,OAAqB,KAAK;AAC1D;AAGA,SAAS,UAAU,KAAwB;AACzC,QAAM,KAAK,IAAI;AACf,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,IAAI,GAAG,sBAAsB;AACnC,SAAO,EAAE,QAAQ,KAAK,EAAE,SAAS;AACnC;AAGO,SAAS,cAAc,MAAyC;AACrE,UAAQ,QAAQ,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAChD;AAGO,SAAS,UAAUC,KAAsB;AAC9C,MAAI,CAACA,IAAG,YAAa,QAAO;AAC5B,QAAM,MAAMA,IAAG;AACf,QAAM,MAAM,IAAI;AAChB,MAAI,MAAsBA;AAC1B,SAAO,OAAO,QAAQ,IAAI,iBAAiB;AACzC,QAAK,IAAoB,OAAQ,QAAO;AACxC,QAAI,KAAK;AACP,YAAM,KAAK,IAAI,iBAAiB,GAAG;AACnC,UAAI,GAAG,YAAY,UAAU,GAAG,eAAe,SAAU,QAAO;AAAA,IAClE;AACA,UAAM,IAAI,iBAAmB,IAAI,YAAY,EAAiB,QAAgC;AAAA,EAChG;AACA,MAAI,UAAU,GAAG,GAAG;AAClB,UAAM,IAAIA,IAAG,sBAAsB;AACnC,QAAI,EAAE,UAAU,KAAK,EAAE,WAAW,EAAG,QAAO;AAAA,EAC9C;AACA,SAAO;AACT;AAGO,SAAS,iBAAiBA,KAA6B;AAC5D,MAAI,CAACA,IAAI,QAAO;AAChB,QAAM,OAAOA,IAAG,YAAY;AAC5B,MAAI,gBAAgB,cAAc,KAAK,KAAK,OAAO,QAAS,QAAO;AACnE,SAAOA,IAAG,OAAO,WAAW,CAAC,CAACA,IAAG,UAAU,IAAI,OAAO,EAAE;AAC1D;AAEA,SAAS,aAAa,MAAiB,UAA6B;AAClE,MAAI;AACF,WAAO,MAAM,KAAK,KAAK,iBAAiB,QAAQ,CAAC;AAAA,EACnD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAWO,IAAM,mBAAmB;AAChC,IAAM,eAAe;AAErB,SAAS,aAAa,MAAmD;AACvE,SAAO,CAAC,CAAC,QAAQ,KAAK,aAAa,MAAM,CAAC,CAAE,KAAoB;AAClE;AAGA,SAAS,aAAaA,KAAgC;AACpD,QAAM,OAAOA,IAAG,cAAc;AAC9B,SAAO,aAAa,IAAI,IAAI,OAAO;AACrC;AAGO,SAAS,eAAeA,KAA6B;AAC1D,SAAOA,IAAG,iBAAiB,aAAaA,GAAE,GAAG,QAAQ;AACvD;AAGO,SAAS,iBAAiB,UAAmB,MAA4B;AAC9E,MAAI,MAAsB,OAAQ,KAAK,aAAa,IAAK,OAAmB,KAAK,gBAAiB;AAClG,SAAO,KAAK,MAAM,eAAe,GAAG,EAAG,KAAI,QAAQ,SAAU,QAAO;AACpE,SAAO;AACT;AAGO,SAAS,eAAe,GAA0B;AACvD,QAAM,OAAO,OAAO,EAAE,iBAAiB,aAAa,EAAE,aAAa,IAAI,CAAC;AACxE,QAAM,QAAS,KAAK,CAAC,KAAK,EAAE;AAC5B,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,aAAa,IAAK,QAAoB,MAAM;AAC3D;AAGA,IAAI,kBAAuD;AAG3D,SAAS,cAAc,MAA+B;AACpD,QAAM,SAAS,iBAAiB,IAAI,IAAI;AACxC,MAAI,OAAQ,QAAO;AACnB,QAAM,MAAoB,CAAC;AAC3B,QAAM,QAAQ,CAAC,UAAqB;AAClC,UAAM,MAAM,MAAM,aAAa,IAAK,MAAkB,aAAa;AACnE,UAAM,QAAQ,MAAM,CAAC,KAAgB,IAAI,CAAC;AAC1C,eAAWA,OAAM,aAAa,OAAO,GAAG,EAAG,KAAIA,IAAG,WAAY,OAAM,KAAKA,GAAE;AAC3E,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,OAAO,WAAW,CAAC,KAAK,cAAc,IAAI,SAAS,KAAK,UAAU,EAAG;AAC9E,UAAI,KAAK,KAAK,UAAU;AACxB,YAAM,KAAK,UAAU;AAAA,IACvB;AAAA,EACF;AACA,QAAM,IAAI;AACV,mBAAiB,IAAI,MAAM,GAAG;AAC9B,SAAO;AACT;AAGA,SAAS,aAAa,MAAiB,UAA6B;AAClE,QAAM,MAAM,aAAa,MAAM,QAAQ;AACvC,aAAW,MAAM,cAAc,IAAI,EAAG,KAAI,KAAK,GAAG,aAAa,IAAI,QAAQ,CAAC;AAC5E,SAAO;AACT;AAMA,SAAS,SAAS,MAAiB,UAAkB,MAA0B;AAC7E,MAAI,CAAC,SAAS,SAAS,KAAK,EAAG,QAAO,OAAO,aAAa,MAAM,QAAQ,IAAI,aAAa,MAAM,QAAQ;AACvG,QAAM,QAAQ,SAAS,MAAM,YAAY,EAAE,OAAO,OAAO;AACzD,MAAI,SAAsB,CAAC,IAAI;AAC/B,MAAI,UAAqB,CAAC;AAC1B,QAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,cAAU,MAAM,KAAK,IAAI,IAAI,OAAO,QAAQ,CAAC,UAAU,aAAa,OAAO,IAAI,CAAC,CAAC,CAAC;AAClF,QAAI,IAAI,MAAM,SAAS,EAAG,UAAS,QAAQ,IAAI,CAACA,QAAOA,IAAG,UAAU,EAAE,OAAO,CAAC,OAAyB,CAAC,CAAC,EAAE;AAAA,EAC7G,CAAC;AACD,SAAO;AACT;AAOO,SAAS,gBAAgBA,KAAa,UAAkC;AAC7E,MAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,UAAM,OAAO,IAAI,IAAI,SAAS,MAAMA,GAAE,GAAG,UAAU,IAAI,CAAC;AACxD,aAAS,MAAsBA,KAAI,KAAK,MAAM,eAAe,GAAG,EAAG,KAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC7F,WAAO;AAAA,EACT;AACA,WAAS,MAAsBA,KAAI,KAAK,MAAM,eAAe,GAAG,EAAG,KAAI,IAAI,QAAQ,QAAQ,EAAG,QAAO;AACrG,SAAO;AACT;AAGO,SAAS,qBAAqB,KAAe,GAAW,GAA2B;AACxF,MAAIA,MAAK,IAAI,iBAAiB,GAAG,CAAC;AAClC,SAAOA,KAAI,cAAcA,IAAG,OAAO,WAAW,OAAOA,IAAG,WAAW,qBAAqB,YAAY;AAClG,UAAM,QAAQA,IAAG,WAAW,iBAAiB,GAAG,CAAC;AACjD,QAAI,CAAC,SAAS,UAAUA,IAAI;AAC5B,IAAAA,MAAK;AAAA,EACP;AACA,SAAOA;AACT;AAEA,SAAS,UAAU,OAAuB;AACxC,QAAM,IAAI;AACV,MAAI,EAAE,OAAO,OAAO,EAAE,IAAI,WAAW,WAAY,QAAO,EAAE,IAAI,OAAO,KAAK;AAC1E,SAAO,MAAM,QAAQ,UAAU,MAAM;AACvC;AAEA,SAAS,WAAW,MAAiB,MAAyB;AAC5D,QAAM,MAAM,MAAM,IAAI;AACtB,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,aAAa,WAAY,QAAO,CAAC;AAC9C,MAAI;AACF,UAAM,SAAS,EAAE,SAAS,MAAM,MAAM,MAAM,GAAoC,IAAI;AACpF,UAAM,MAAiB,CAAC;AACxB,aAAS,IAAI,GAAG,IAAI,OAAO,gBAAgB,KAAK;AAC9C,YAAM,IAAI,OAAO,aAAa,CAAC;AAC/B,UAAI,KAAK,EAAE,aAAa,EAAG,KAAI,KAAK,CAAY;AAAA,IAClD;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,UAAU,MAAiB,MAAc,MAA0B;AAC1E,QAAM,SAAS,cAAc,IAAI,EAAE,YAAY;AAC/C,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,QAAM,aAAa,SAAS,MAAM,iBAAiB,IAAI;AACvD,QAAM,QAAQ,WAAW,OAAO,CAAC,MAAM,cAAc,EAAE,WAAW,EAAE,YAAY,MAAM,MAAM;AAC5F,MAAI,MAAM,OAAQ,QAAO;AACzB,SAAO,WAAW,OAAO,CAAC,MAAM,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,MAAM,CAAC;AAC7F;AAMO,SAAS,sBAAsB,UAA4B,MAAiB,OAAO,MAAiB;AACzG,QAAM,QAAQ,SAAS,MAAM,KAAK;AAClC,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,MAAM;AACT,YAAM,KAAK,MAAM,WAAW,GAAG,IAAI,MAAM,MAAM,CAAC,IAAI;AACpD,aAAO,SAAS,MAAM,IAAI,UAAU,EAAE,CAAC,IAAI,IAAI;AAAA,IACjD;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,KAAK,MAAM,WAAW,GAAG,IAAI,MAAM,MAAM,CAAC,IAAI;AACpD,aAAO,SAAS,MAAM,aAAa,mBAAmB,EAAE,GAAG,IAAI;AAAA,IACjE;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,SAAS,MAAM,MAAM,WAAW,GAAG,KAAK,cAAc,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,IAAI;AAAA,IACvG,KAAK;AACH,aAAO,UAAU,MAAM,OAAO,IAAI;AAAA,IACpC,KAAK;AACH,aAAO,WAAW,MAAM,KAAK;AAAA,IAC/B;AACE,aAAO,CAAC;AAAA,EACZ;AACF;AAQO,SAAS,cAAc,QAA4D,OAAkB,UAA0B;AACpI,QAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,SAAS,OAAO;AAC1D,QAAM,iBAAiB,CAAC,UAA4B,SAAkB,sBAAsB,UAAU,MAAM,IAAI,EAAE,OAAO,CAACA,QAAO,CAAC,iBAAiBA,GAAE,KAAK,UAAUA,GAAE,CAAC;AACvK,QAAM,QAAQ;AACd,wCAAoB,oBAAI,IAAI;AAC5B,MAAI;AACF,eAAW,YAAY,WAAW;AAChC,UAAI,UAAU,eAAe,UAAU,KAAK;AAC5C,UAAI,CAAC,QAAQ,UAAU,SAAS,SAAS,QAAS,WAAU,eAAe,UAAU,IAAI;AACzF,UAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,EACT,UAAE;AACA,sBAAkB;AAAA,EACpB;AACF;AAYO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAE5C,YAAY,UAAU,2CAA2C;AAC/D,UAAM,OAAO;AAFf,wBAAS,QAAO;AAAA,EAGhB;AACF;AAOO,SAAS,cAAc,QAA4D,UAAgC,CAAC,GAAqB;AAC9I,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,SAAS,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,UAAU,GAAG,CAAC;AAChE,SAAO,IAAI,QAAiB,CAAC,SAAS,WAAW;AAC/C,UAAM,YAAY,cAAc,QAAQ,IAAI;AAC5C,QAAI,UAAW,QAAO,QAAQ,SAAS;AACvC,QAAI,QAAQ,QAAQ,QAAS,QAAO,OAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AACpF,QAAI,OAAO;AACX,QAAI,WAAoC;AACxC,QAAI,QAA+C;AACnD,QAAI,UAAgD;AACpD,UAAM,UAAU,MAAM;AACpB,aAAO;AACP,gBAAU,WAAW;AACrB,UAAI,MAAO,eAAc,KAAK;AAC9B,UAAI,QAAS,cAAa,OAAO;AACjC,cAAQ,QAAQ,oBAAoB,SAAS,OAAO;AAAA,IACtD;AACA,UAAM,QAAQ,MAAM;AAClB,UAAI,KAAM;AACV,YAAMA,MAAK,cAAc,QAAQ,IAAI;AACrC,UAAIA,KAAI;AACN,gBAAQ;AACR,gBAAQA,GAAE;AAAA,MACZ;AAAA,IACF;AACA,UAAM,UAAU,MAAM;AACpB,cAAQ;AACR,aAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AAAA,IAClD;AACA,YAAQ,QAAQ,iBAAiB,SAAS,OAAO;AACjD,UAAM,cAAc,KAAK,aAAa,IAAK,KAAkB,kBAAmB;AAChF,QAAI,OAAO,qBAAqB,eAAe,aAAa;AAC1D,iBAAW,IAAI,iBAAiB,KAAK;AACrC,eAAS,QAAQ,aAAa,EAAE,WAAW,MAAM,SAAS,MAAM,YAAY,MAAM,iBAAiB,CAAC,SAAS,SAAS,UAAU,MAAM,aAAa,mBAAmB,YAAY,EAAE,CAAC;AAAA,IACvL;AACA,YAAQ,YAAY,OAAO,MAAM;AACjC,QAAI,YAAY,GAAG;AACjB,gBAAU,WAAW,MAAM;AACzB,gBAAQ;AACR,eAAO,IAAI,mBAAmB,CAAC;AAAA,MACjC,GAAG,SAAS;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAMA,IAAM,eAAe;AACrB,IAAM,kBAAkB;AACxB,IAAM,uBAAuB,CAAC,eAAe,aAAa,aAAa,gBAAgB,WAAW,WAAW,WAAW,aAAa,cAAc;AACnJ,IAAM,qBAAqB;AAGpB,SAAS,WAAW,IAAqB;AAC9C,SAAO,CAAC,CAAC,MAAM,mBAAmB,KAAK,EAAE,KAAK,CAAC,aAAa,KAAK,EAAE;AACrE;AAGO,SAAS,cAAc,KAAsB;AAClD,SAAO,CAAC,CAAC,OAAO,CAAC,gBAAgB,KAAK,GAAG,KAAK,IAAI,UAAU;AAC9D;AAGA,SAAS,aAAa,MAAiB,UAAkBA,KAAsB;AAC7E,QAAM,MAAM,aAAa,MAAM,QAAQ;AACvC,SAAO,IAAI,WAAW,KAAK,IAAI,CAAC,MAAMA;AACxC;AAEA,SAAS,aAAa,MAAc,OAAuB;AACzD,SAAO,IAAI,IAAI,KAAK,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,CAAC;AACvE;AAGA,SAAS,QAAQA,KAAa,MAA4C;AACxE,QAAM,MAAMA,IAAG;AACf,QAAM,WAAqB,CAAC;AAC5B,MAAI,MAAsBA;AAC1B,SAAO,OAAO,IAAI,aAAa,KAAK,QAAQ,IAAI,QAAQ,QAAQ,IAAI,iBAAiB;AACnF,UAAM,MAAM,IAAI,QAAQ,YAAY;AACpC,QAAI,WAAW,IAAI,EAAE,GAAG;AACtB,eAAS,QAAQ,IAAI,IAAI,EAAE,EAAE;AAC7B;AAAA,IACF;AACA,QAAI,MAAM;AACV,UAAM,SAAyB,IAAI;AACnC,QAAI,QAAQ;AACV,YAAM,UAAU,MAAM,KAAK,OAAO,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,IAAK,OAAO;AACpF,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,YAAY,MAAM,KAAK,IAAI,SAAS,EAAE,KAAK,CAAC,MAAM,cAAc,CAAC,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC;AACvI,eAAO,YAAY,IAAI,UAAU,SAAS,CAAC,KAAK,gBAAgB,QAAQ,QAAQ,GAAG,IAAI,CAAC;AAAA,MAC1F;AAAA,IACF;AACA,aAAS,QAAQ,GAAG;AACpB,UAAM,YAAY,SAAS,KAAK,KAAK;AACrC,QAAI,aAAa,MAAM,WAAWA,GAAE,EAAG,QAAO;AAC9C,UAAM;AAAA,EACR;AACA,QAAM,OAAO,SAAS,KAAK,KAAK;AAChC,SAAO,aAAa,MAAM,MAAMA,GAAE,IAAI,OAAO;AAC/C;AAMO,SAAS,gBAAgBA,KAA4B;AAC1D,QAAM,QAAkB,CAAC;AACzB,WAAS,OAAO,aAAaA,GAAE,GAAG,MAAM,OAAO,aAAa,KAAK,IAAI,GAAG;AACtE,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,QAAQ,MAAM,aAAa,IAAI,KAAK,KAAK,aAAa;AACnE,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,QAAQ,IAAI;AAAA,EACpB;AACA,SAAO,MAAM,KAAK,gBAAgB;AACpC;AAQA,SAAS,YAAYA,KAAa,UAAiC;AACjE,QAAM,OAAO,aAAaA,GAAE;AAC5B,MAAI,CAAC,KAAM,QAAO,aAAaA,IAAG,eAAe,UAAUA,GAAE,IAAI,WAAW;AAC5E,MAAI,CAAC,aAAa,MAAM,UAAUA,GAAE,EAAG,QAAO;AAC9C,QAAM,MAAMA,IAAG;AACf,QAAM,OAAO,CAAC,QAAgB;AAC5B,UAAM,MAAM,SAAS,KAAK,KAAK,IAAI;AACnC,WAAO,IAAI,WAAW,KAAK,IAAI,CAAC,MAAMA;AAAA,EACxC;AACA,MAAI,KAAK,QAAQ,EAAG,QAAO;AAC3B,QAAM,QAAQ,gBAAgBA,GAAE;AAChC,QAAM,SAAS,QAAQ,QAAQ,mBAAmB,WAAW;AAC7D,SAAO,UAAU,KAAK,MAAM,IAAI,SAAS;AAC3C;AAGA,SAAS,WAAWA,KAAqB;AACvC,MAAI,CAACA,IAAG,WAAY,QAAO;AAC3B,QAAM,QAAQ,MAAM,KAAKA,IAAG,WAAW,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,4BAA4B,KAAK,EAAE,OAAO,CAAC;AAC3G,SAAO,cAAc,MAAM,IAAI,CAAC,MAAO,EAAkB,aAAa,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC;AAChG;AAGO,SAAS,eAAeA,KAAqB;AAClD,QAAM,KAAKA;AACX,QAAM,MAAM,cAAc,GAAG,aAAaA,IAAG,WAAW,KAAK,WAAWA,GAAE;AAC1E,QAAM,MAAM,cAAcA,IAAG,aAAa,YAAY,KAAKA,IAAG,aAAa,OAAO,KAAKA,IAAG,aAAa,aAAa,KAAKA,IAAG,aAAa,KAAK,KAAMA,IAAwB,KAAK;AACjL,UAAQ,OAAO,KAAK,MAAM,GAAG,GAAG;AAClC;AAMO,SAAS,kBAAkBA,KAAiC;AACjE,QAAM,MAA0B,CAAC;AACjC,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,OAAO,CAAC,MAAwB;AACpC,UAAM,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK;AAC9B,QAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAChB,WAAK,IAAI,CAAC;AACV,UAAI,KAAK,CAAC;AAAA,IACZ;AAAA,EACF;AACA,QAAM,MAAMA,IAAG,QAAQ,YAAY;AAEnC,QAAM,UAAU,CAAC,MAAgC,UAAkB,OAAe,UAAkB;AAClG,UAAM,WAAW,YAAYA,KAAI,QAAQ;AACzC,QAAI,aAAa,SAAU,MAAK,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,aAC7C,SAAU,MAAK,EAAE,MAAM,OAAO,OAAO,UAAU,MAAM,CAAC;AAC/D,WAAO,CAAC,CAAC;AAAA,EACX;AAGA,QAAM,YAAYA,IAAG,aAAa,iBAAiB;AACnD,MAAI,UAAW,SAAQ,cAAc,aAAa,mBAAmB,SAAS,GAAG,WAAW,cAAc,SAAS,EAAE;AACrH,MAAI,WAAWA,IAAG,EAAE,EAAG,SAAQ,MAAM,IAAI,UAAUA,IAAG,EAAE,CAAC,IAAI,IAAIA,IAAG,EAAE,IAAI,MAAMA,IAAG,EAAE,EAAE;AAEvF,QAAM,YAAY,MAAM,KAAKA,IAAG,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,WAAW,OAAO,KAAK,CAAC,mBAAmB,KAAK,EAAE,IAAI,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,CAAC,SAAS,KAAK,EAAE,KAAK,CAAC;AACvL,YAAU,KAAK,CAAC,GAAG,MAAM;AACvB,UAAM,KAAK,qBAAqB,QAAQ,EAAE,IAAI;AAC9C,UAAM,KAAK,qBAAqB,QAAQ,EAAE,IAAI;AAC9C,YAAQ,OAAO,KAAK,KAAK,OAAO,OAAO,KAAK,KAAK;AAAA,EACnD,CAAC;AACD,aAAW,KAAK,WAAW;AACzB,UAAM,MAAM,aAAa,EAAE,MAAM,EAAE,KAAK;AACxC,QAAI,CAAC,QAAQ,aAAa,KAAK,KAAK,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,EAAG,SAAQ,aAAa,MAAM,KAAK,MAAM,KAAK,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE;AAAA,EAChI;AAEA,QAAM,OAAOA,IAAG,aAAa,YAAY;AACzC,MAAI,QAAQ,KAAK,UAAU,KAAK;AAC9B,UAAM,MAAM,aAAa,cAAc,IAAI;AAC3C,QAAI,CAAC,QAAQ,QAAQ,KAAK,KAAK,IAAI,EAAG,SAAQ,QAAQ,MAAM,KAAK,MAAM,KAAK,IAAI;AAAA,EAClF;AAEA,QAAM,OAAOA,IAAG,aAAa,MAAM;AACnC,MAAI,KAAM,SAAQ,OAAO,MAAM,aAAa,QAAQ,IAAI,GAAG,MAAM,aAAa,QAAQ,IAAI,GAAG,GAAG,GAAG,SAAS,IAAI,EAAE;AAClH,QAAM,OAAOA,IAAG,aAAa,MAAM;AACnC,MAAI,MAAM;AACR,UAAM,QAAQA,IAAG,aAAa,OAAO,KAAKA,IAAG,aAAa,iBAAiB;AAC3E,UAAM,MAAM,QAAQ,UAAU,IAAI,KAAK,aAAaA,IAAG,aAAa,OAAO,IAAI,UAAU,mBAAmB,KAAK,CAAC,KAAK,UAAU,IAAI;AACrI,YAAQ,OAAO,KAAK,KAAK,QAAQ,IAAI,EAAE;AAAA,EACzC;AACA,MAAI,QAAQ,KAAK;AACf,UAAM,OAAOA,IAAG,aAAa,MAAM;AACnC,QAAI,QAAQ,KAAK,UAAU,IAAK,SAAQ,OAAO,IAAI,aAAa,QAAQ,IAAI,CAAC,IAAI,IAAI,aAAa,QAAQ,IAAI,CAAC,IAAI,QAAQ,IAAI,EAAE;AAAA,EACnI;AAEA,QAAM,OAAO,QAAQA,KAAI,aAAaA,GAAE,KAAKA,IAAG,aAAa;AAC7D,MAAI,KAAM,SAAQ,OAAO,MAAM,MAAM,UAAU;AAE/C,MAAI,oCAAoC,KAAK,GAAG,KAAK,SAAS,YAAY,SAAS,UAAU,SAAS,SAAS,SAAS,YAAY;AAClI,UAAM,OAAO,cAAeA,IAAmB,aAAaA,IAAG,WAAW;AAC1E,QAAI,QAAQ,KAAK,UAAU,GAAI,MAAK,EAAE,MAAM,QAAQ,OAAO,MAAM,OAAO,SAAS,IAAI,IAAI,CAAC;AAAA,EAC5F;AACA,SAAO,IAAI,MAAM,GAAG,EAAE;AACxB;AAcO,SAAS,WAAWA,KAAsB;AAC/C,QAAM,MAAMA,IAAG,sBAAsB;AACrC,MAAI,CAACA,IAAG,WAAY,QAAO;AAC3B,QAAM,QAAQ,CAAC,KAAK,GAAG,MAAM,KAAKA,IAAG,WAAW,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,KAAK,EAAE,SAAS,CAAC;AAC1I,MAAI,MAAM,SAAS,EAAG,QAAO,MAAM,CAAC,KAAK;AACzC,QAAM,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACjD,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAC/C,QAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACnD,QAAM,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACrD,SAAO,IAAI,QAAQ,MAAM,KAAK,QAAQ,MAAM,SAAS,GAAG;AAC1D;AAGA,IAAM,wBAAwB;AAC9B,IAAM,mBAAmB;AAUlB,SAAS,gBAAgBA,KAAsB;AACpD,MAAI,CAAC,UAAUA,IAAG,aAAa,EAAG,QAAOA;AACzC,MAAI,MAAMA;AACV,WAAS,OAAO,aAAa,GAAG,GAAG,MAAM,OAAO,aAAa,GAAG,GAAG;AACjE,UAAM,OAAO,KAAK;AAClB,QAAI,KAAK,OAAO,QAAS;AACzB,QAAI,UAA0B;AAC9B,QAAI;AACF,gBAAU,IAAI,QAAQ,gBAAgB;AAAA,IACxC,QAAQ;AAAA,IAER;AACA,UAAM,IAAI,WAAW,WAAW,GAAG;AACnC,UAAM,OAAO,EAAE,QAAQ,EAAE;AACzB,UAAMC,KAAI,WAAW,IAAI;AACzB,UAAM,WAAWA,GAAE,QAAQA,GAAE;AAC7B,UAAM,SAAS,EAAE,QAAQA,GAAE,OAAO,KAAK,EAAE,OAAOA,GAAE,MAAM,KAAK,EAAE,SAASA,GAAE,QAAQ,KAAK,EAAE,UAAUA,GAAE,SAAS;AAC9G,QAAI,CAAC,QAAQ,CAAC,UAAU,WAAW,OAAO,sBAAuB;AACjE,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAMO,SAAS,gBAAgBD,KAAiC;AAC/D,QAAM,SAAS,gBAAgBA,GAAE;AACjC,QAAM,IAAI,WAAW,MAAM;AAC3B,SAAO;AAAA,IACL,WAAW,kBAAkB,MAAM;AAAA,IACnC,cAAc,eAAe,MAAM,KAAK,eAAeA,GAAE;AAAA,IACzD,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,IACzD,KAAK,OAAO,QAAQ,YAAY;AAAA,EAClC;AACF;;;ACplBA,IAAAE,kBAAmF;AAEnF,IAAM,eAAe,oBAAI,IAAI,CAAC,KAAK,MAAM,UAAU,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM,QAAQ,OAAO,cAAc,QAAQ,OAAO,MAAM,QAAQ,CAAC;AACzL,IAAM,YAAY,oBAAI,IAAI,CAAC,UAAU,SAAS,UAAU,SAAS,QAAQ,SAAS,YAAY,UAAU,QAAQ,QAAQ,QAAQ,YAAY,OAAO,QAAQ,SAAS,YAAY,UAAU,CAAC;AAC3L,IAAM,gBAAgB,oBAAI,IAAI,CAAC,QAAQ,OAAO,OAAO,SAAS,UAAU,OAAO,SAAS,SAAS,UAAU,iBAAiB,cAAc,CAAC;AAC3I,SAAS,UAAU,OAAe,MAAc,KAAsB;AAEpE,QAAM,IAAI,MAAM,KAAK,EAAE,QAAQ,sBAAsB,EAAE,EAAE,YAAY;AACrE,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,wBAAwB,KAAK,CAAC;AACxC,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,SAAS,EAAE,CAAC;AAClB,MAAI,WAAW,OAAQ,QAAO,QAAQ,SAAS,SAAS,SAAS,EAAE,WAAW,aAAa;AAC3F,SAAO,WAAW,UAAU,WAAW,WAAW,WAAW,YAAY,WAAW;AACtF;AAEA,SAAS,gBAAgBC,KAAmB;AAC1C,QAAM,MAAMA,IAAG,QAAQ,YAAY;AACnC,aAAW,QAAQ,MAAM,KAAKA,IAAG,UAAU,GAAG;AAC5C,UAAM,OAAO,KAAK,KAAK,YAAY;AACnC,QAAI,KAAK,WAAW,IAAI,KAAK,CAAC,cAAc,IAAI,IAAI,GAAG;AACrD,MAAAA,IAAG,gBAAgB,KAAK,IAAI;AAC5B;AAAA,IACF;AACA,SAAK,SAAS,UAAU,SAAS,UAAU,CAAC,UAAU,KAAK,OAAO,MAAM,GAAG,EAAG,CAAAA,IAAG,gBAAgB,KAAK,IAAI;AAAA,EAC5G;AACA,MAAI,QAAQ,KAAK;AACf,UAAM,SAASA,IAAG,aAAa,QAAQ;AACvC,QAAI,UAAU,WAAW,YAAY,WAAW,QAAS,CAAAA,IAAG,gBAAgB,QAAQ;AACpF,QAAIA,IAAG,aAAa,QAAQ,MAAM,SAAU,CAAAA,IAAG,aAAa,OAAO,qBAAqB;AAAA,EAC1F;AACA,MAAI,QAAQ,SAAU,CAAAA,IAAG,aAAa,QAAQ,QAAQ;AACtD,MAAI,QAAQ,OAAO;AACjB,eAAW,OAAO,CAAC,SAAS,QAAQ,EAAG,KAAIA,IAAG,aAAa,GAAG,KAAK,CAAC,YAAY,KAAKA,IAAG,aAAa,GAAG,CAAE,EAAG,CAAAA,IAAG,gBAAgB,GAAG;AACnI,IAAAA,IAAG,aAAa,WAAW,MAAM;AACjC,QAAI,CAACA,IAAG,aAAa,KAAK,EAAG,CAAAA,IAAG,aAAa,OAAO,EAAE;AAAA,EACxD;AACF;AAOA,SAAS,aAAaA,KAA6B;AACjD,QAAM,MAAMA,IAAG;AACf,QAAM,MAAMA,IAAG,QAAQ,YAAY;AACnC,QAAM,MAAMA,IAAG,aAAa,KAAK;AACjC,MAAI;AACJ,MAAI,QAAQ,UAAU;AACpB,QAAI,KAAC,mCAAkB,GAAG,EAAG,QAAO;AACpC,UAAM,IAAI,cAAc,QAAQ;AAChC,QAAI,aAAa,OAAO,GAAI;AAC5B,QAAI,aAAa,SAASA,IAAG,aAAa,OAAO,KAAK,gBAAgB;AACtE,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,kCAAkB,EAAG,KAAI,aAAa,GAAG,CAAC;AAAA,EAChF,OAAO;AACL,QAAI,KAAC,gCAAe,GAAG,EAAG,QAAO;AACjC,UAAM,IAAI,cAAc,OAAO;AAC/B,QAAI,aAAa,OAAO,GAAI;AAC5B,UAAM,SAASA,IAAG,aAAa,QAAQ;AACvC,YAAI,gCAAe,MAAM,EAAG,KAAI,aAAa,UAAU,MAAO;AAC9D,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,2BAAW,EAAG,KAAI,aAAa,GAAG,CAAC;AAAA,EACzE;AACA,SAAO;AACT;AAEA,SAAS,KAAK,MAAkB;AAC9B,QAAM,WAAW,MAAM,KAAK,KAAK,UAAU;AAC3C,aAAW,SAAS,UAAU;AAC5B,QAAI,MAAM,aAAa,GAAiB;AACtC,WAAK,YAAY,KAAK;AACtB;AAAA,IACF;AACA,QAAI,MAAM,aAAa,EAAG;AAC1B,UAAMA,MAAK;AACX,UAAM,MAAMA,IAAG,QAAQ,YAAY;AACnC,QAAI,UAAU,IAAI,GAAG,GAAG;AACtB,WAAK,YAAYA,GAAE;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,YAAY,QAAQ,SAAS;AACvC,YAAM,QAAQ,aAAaA,GAAE;AAC7B,UAAI,MAAO,MAAK,aAAa,OAAOA,GAAE;AAAA,UACjC,MAAK,YAAYA,GAAE;AACxB;AAAA,IACF;AACA,QAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAE1B,aAAOA,IAAG,WAAY,MAAK,aAAaA,IAAG,YAAYA,GAAE;AACzD,WAAK,YAAYA,GAAE;AAEnB,WAAK,IAAI;AACT;AAAA,IACF;AACA,oBAAgBA,GAAE;AAClB,SAAKA,GAAE;AAAA,EACT;AACF;AAMO,SAAS,mBAAmB,MAAc,MAAgB,UAA4B;AAC3F,QAAM,MAAM,IAAI,cAAc,UAAU;AACxC,MAAI,YAAY,QAAQ;AACxB,OAAK,IAAI,OAAO;AAChB,SAAO,IAAI;AACb;AAGO,SAAS,aAAa,MAAc,MAAgB,UAAkB;AAC3E,QAAM,OAAO,mBAAmB,MAAM,GAAG;AACzC,QAAM,MAAM,IAAI,cAAc,KAAK;AACnC,MAAI,YAAY,IAAI;AACpB,SAAO,IAAI;AACb;AAGO,SAAS,iBAAiBA,KAAa,MAAoB;AAChE,EAAAA,IAAG,cAAc;AACjB,EAAAA,IAAG,YAAY,mBAAmB,MAAMA,IAAG,aAAa,CAAC;AAC3D;;;AC1HA,IAAAC,kBAAkE;;;ACClE,IAAAC,kBAA+C;;;ACAxC,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADGf,IAAMC,WAAU;AAWvB,IAAI,UAA6B;AAG1B,IAAM,gBAA8B;AAAA,EACzC,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AACd;AAGO,SAAS,WAAW,MAAgB,UAAsB;AAC/D,MAAI,WAAW,QAAQ,KAAK,eAAe,QAAQ,KAAK,kBAAkB,IAAK,QAAO;AACtF,MAAI,OAAO,IAAI,eAAeA,QAAO;AACrC,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,cAAc,KAAK;AAC9B,SAAK,KAAKA;AACV,SAAK,aAAa,gBAAgB,EAAE;AACpC,KAAC,IAAI,QAAQ,IAAI,iBAAiB,YAAY,IAAI;AAAA,EACpD;AACA,QAAM,SAAS,KAAK,cAAc,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AACpE,MAAI,CAAC,OAAO,cAAc,oBAAoB,GAAG;AAC/C,UAAM,QAAQ,IAAI,cAAc,OAAO;AACvC,UAAM,aAAa,eAAe,EAAE;AACpC,UAAM,cAAc;AACpB,WAAO,YAAY,KAAK;AAAA,EAC1B;AACA,MAAI,OAAO,OAAO,cAA2B,SAAS;AACtD,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,cAAc,KAAK;AAC9B,SAAK,YAAY;AACjB,SAAK,aAAa,aAAa,QAAQ;AACvC,SAAK,aAAa,eAAe,MAAM;AACvC,WAAO,YAAY,IAAI;AAAA,EACzB;AACA,QAAM,SAAS;AACf,YAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,SAAS,MAAc;AACrB,aAAO,cAAc;AACrB,iBAAW,MAAM;AACf,eAAO,cAAc;AAAA,MACvB,GAAG,EAAE;AAAA,IACP;AAAA,IACA,UAAU;AACR,YAAM,OAAO;AACb,UAAI,SAAS,SAAS,KAAM,WAAU;AAAA,IACxC;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,cAAoB;AAClC,WAAS,QAAQ;AACjB,QAAM,QAAQ,OAAO,aAAa,cAAc,SAAS,eAAeA,QAAO,IAAI;AACnF,SAAO,OAAO;AACd,YAAU;AACZ;AAIA,SAAS,cAAuB;AAC9B,MAAI;AACF,WAAO,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,cAAc,OAAO,WAAW,8BAA8B,EAAE;AAAA,EACvI,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,uBAAgC;AAC9C,MAAI;AACF,WAAO,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,cAAc,OAAO,WAAW,kCAAkC,EAAE;AAAA,EAC3I,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAeO,SAAS,aAAa,OAAiD,YAAoD;AAChI,QAAM,IAAI,EAAE,GAAG,eAAe,GAAI,SAAS,CAAC,EAAG;AAC/C,QAAM,IAAI,cAAc,CAAC;AACzB,QAAM,YAAY,EAAE,SAAS;AAC7B,QAAM,OAA0B,cAAc,SAAU,YAAY,IAAI,SAAS,UAAW;AAC5F,QAAM,OAAO,SAAS;AACtB,SAAO;AAAA,IACL,SAAS,EAAE,gBAAgB,EAAE;AAAA,IAC7B,IAAI,EAAE,oBAAoB,OAAO,YAAY,EAAE;AAAA,IAC/C,MAAM,EAAE,cAAc,OAAO,YAAY,EAAE;AAAA,IAC3C,QAAQ,EAAE,gBAAgB,EAAE;AAAA,IAC5B,MAAM,EAAE,cAAc,EAAE;AAAA,IACxB,GAAG,EAAE,UAAU;AAAA,IACf,SAAS,EAAE,kBAAkB;AAAA,IAC7B;AAAA,IACA,WAAW,qBAAqB,IAAI,SAAU,EAAE,aAAa;AAAA,EAC/D;AACF;AAGO,SAAS,WAAWC,KAAiB,MAAuB;AACjE,EAAAA,IAAG,MAAM,YAAY,eAAe,KAAK,OAAO;AAEhD,MAAI,gCAAgC,KAAK,KAAK,OAAO,EAAG,CAAAA,IAAG,MAAM,YAAY,wBAAoB,gCAAe,KAAK,OAAO,CAAC;AAC7H,EAAAA,IAAG,MAAM,YAAY,UAAU,KAAK,EAAE;AACtC,EAAAA,IAAG,MAAM,YAAY,YAAY,KAAK,IAAI;AAC1C,EAAAA,IAAG,MAAM,YAAY,cAAc,GAAG,KAAK,MAAM,IAAI;AACrD,EAAAA,IAAG,MAAM,YAAY,YAAY,KAAK,IAAI;AAC1C,EAAAA,IAAG,MAAM,YAAY,SAAS,OAAO,KAAK,CAAC,CAAC;AAC5C,EAAAA,IAAG,MAAM,YAAY,eAAe,OAAO,KAAK,OAAO,CAAC;AACxD,EAAAA,IAAG,aAAa,cAAc,KAAK,IAAI;AACvC,EAAAA,IAAG,aAAa,aAAa,KAAK,SAAS;AAC7C;AAMO,SAAS,YAAY,OAAsC,YAAyC,MAAgB,UAAiE;AAC1L,QAAM,SAAS,WAAW,GAAG;AAC7B,QAAMA,MAAK,IAAI,cAAc,KAAK;AAClC,EAAAA,IAAG,YAAY;AACf,QAAM,OAAO,aAAa,OAAO,UAAU;AAC3C,aAAWA,KAAI,IAAI;AACnB,SAAO,OAAO,YAAYA,GAAE;AAG5B,QAAM,MAAM,CAAC,aAAa,OAAO,YAAY,QAAW,YAAY,SAAS,EAAE,OAAO,CAAC,MAAmB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AAC3H,MAAI,QAAiC;AACrC,MAAI,IAAI,QAAQ;AACd,UAAM,KAAK,IAAI,EAAE,WAAW;AAC5B,IAAAA,IAAG,aAAa,cAAc,EAAE;AAChC,YAAQ,IAAI,cAAc,OAAO;AACjC,UAAM,aAAa,iBAAiB,EAAE;AACtC,UAAM,cAAc,IAAI,IAAI,CAAC,UAAM,gCAAe,GAAG,wBAAwB,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI;AAC/F,WAAO,OAAO,aAAa,OAAOA,GAAE;AAAA,EACtC;AACA,MAAI,KAA4B;AAChC,QAAM,WAAW,MAAM,WAAWA,KAAI,aAAa,OAAO,UAAU,CAAC;AACrE,OAAK,YAAY,SAAS,YAAY,UAAU,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AACxH,QAAI;AACF,WAAK,OAAO,WAAW,8BAA8B;AACrD,SAAG,mBAAmB,UAAU,QAAQ;AAAA,IAC1C,QAAQ;AACN,WAAK;AAAA,IACP;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAAA;AAAA,IACA;AAAA,IACA,UAAU;AACR,UAAI,sBAAsB,UAAU,QAAQ;AAC5C,aAAO,OAAO;AACd,MAAAA,IAAG,OAAO;AAAA,IACZ;AAAA,EACF;AACF;AAEA,IAAI,cAAc;;;ADjLX,SAAS,kBAAkB,MAAe,MAAgB,KAAK,eAAqB;AACzF,aAAW,SAAS,MAAM,KAAK,KAAK,iBAAiB,OAAO,+BAAe,EAAE,CAAC,GAAG;AAC/E,UAAM,OAAO,MAAM,cAAiC,KAAK,+BAAe,EAAE;AAC1E,UAAM,QAAQ,MAAM,cAA2B,IAAI,+BAAe,EAAE;AACpE,QAAI,CAAC,QAAQ,CAAC,SAAS,MAAM,aAAa,cAAc,EAAG;AAE3D,eAAW,OAAO,MAAM,KAAK,MAAM,iBAAiB,gBAAgB,CAAC,EAAG,KAAI,OAAO;AACnF,UAAM,QAAQ,MAAM,KAAK,MAAM,iBAAiB,KAAK,CAAC;AACtD,QAAI,CAAC,MAAM,QAAQ;AACjB,YAAM,OAAO;AACb;AAAA,IACF;AACA,UAAM,aAAa,gBAAgB,EAAE;AACrC,UAAM,QAAQ,KAAK,eAAe,IAAI,KAAK,KAAK;AAChD,UAAM,aAAa,QAAQ,OAAO;AAClC,UAAM,aAAa,cAAc,GAAG,IAAI,KAAK,MAAM,MAAM,IAAI,MAAM,WAAW,IAAI,SAAS,OAAO,EAAE;AACpG,SAAK,aAAa,cAAc,QAAQ,IAAI,cAAc;AAC1D,SAAK,iBAAiB,SAAS,CAAC,MAAM;AACpC,QAAE,eAAe;AACjB,iBAAW,KAAK,OAAO,MAAM,OAAO,CAAC;AAAA,IACvC,CAAC;AAED,UAAM,WAAW,IAAI,cAAc,KAAK;AACxC,aAAS,YAAY;AACrB,UAAM,YAAY,QAAQ;AAC1B,aAAS,YAAY,KAAK;AAC1B,UAAM,WAAW;AACjB,UAAM,aAAa,cAAc,GAAG,IAAI,QAAQ;AAEhD,UAAM,UAAU,IAAI,cAAc,MAAM;AACxC,YAAQ,YAAY;AACpB,YAAQ,aAAa,aAAa,QAAQ;AAC1C,UAAM,OAAO,UAAU,KAAK,QAAQ,iBAAiB,QAAG;AACxD,UAAM,OAAO,UAAU,KAAK,QAAQ,aAAa,QAAG;AACpD,aAAS,OAAO,MAAM,MAAM,OAAO;AAGnC,UAAM,SAAS,MAAM,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,MAAM,CAAC,EAAG,aAAa,MAAM,CAAC,EAAG,aAAa,MAAM,WAAW;AACnH,UAAMC,WAAU,MAAM,KAAK,MAAM,MAAM,aAAa,OAAO,CAAC;AAC5D,UAAM,KAAK,CAAC,MAAc,MAAM,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,OAAO,GAAG,UAAU,qBAAqB,IAAI,SAAS,SAAS,CAAC;AAC9J,UAAM,SAAS,MAAM;AACnB,YAAM,IAAI,KAAK,IAAI,MAAM,SAAS,GAAGA,SAAQ,CAAC;AAC9C,cAAQ,cAAc,GAAG,IAAI,CAAC,MAAM,MAAM,MAAM;AAChD,WAAK,WAAW,MAAM;AACtB,WAAK,WAAW,KAAK,MAAM,SAAS;AAAA,IACtC;AACA,SAAK,iBAAiB,SAAS,MAAM,GAAGA,SAAQ,IAAI,CAAC,CAAC;AACtD,SAAK,iBAAiB,SAAS,MAAM,GAAGA,SAAQ,IAAI,CAAC,CAAC;AACtD,UAAM,iBAAiB,UAAU,QAAQ,EAAE,SAAS,KAAK,CAAC;AAC1D,UAAM,iBAAiB,WAAW,CAAC,MAAM;AACvC,UAAI,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,aAAa;AACnD,UAAE,eAAe;AACjB,WAAGA,SAAQ,KAAK,EAAE,QAAQ,eAAe,IAAI,GAAG;AAAA,MAClD,WAAW,EAAE,QAAQ,QAAS,YAAW,KAAK,OAAO,MAAM,OAAOA,SAAQ,CAAC;AAAA,IAC7E,CAAC;AACD,UAAM,QAAQ,CAAC,KAAK,MAAM,IAAI,iBAAiB,SAAS,MAAM,WAAW,KAAK,OAAO,MAAM,OAAO,CAAC,CAAC,CAAC;AACrG,QAAI,MAAM,WAAW,EAAG,UAAS,UAAU,IAAI,cAAc;AAC7D,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,KAAe,KAAa,OAAe,MAAc;AAC1E,QAAM,IAAI,IAAI,cAAc,QAAQ;AACpC,IAAE,OAAO;AACT,IAAE,YAAY,mBAAmB,GAAG;AACpC,IAAE,aAAa,cAAc,KAAK;AAClC,IAAE,cAAc;AAChB,SAAO;AACT;AAGA,SAAS,WAAW,KAAe,OAAgB,MAAyB,OAA2B,OAAe;AACpH,QAAM,OAAQ,MAAM,QAAQ,UAAU,KAA4B,IAAI;AAEtE,QAAM,cAAe,MAAM,YAAY,EAA4B;AACnE,QAAM,QAAQ,KAAK,eAAe,IAAI,KAAK,KAAK;AAEhD,QAAM,SAAS,IAAI,cAAc,KAAK;AACtC,SAAO,YAAY;AACnB,SAAO,aAAa,QAAQ,QAAQ;AACpC,SAAO,aAAa,cAAc,MAAM;AACxC,SAAO,aAAa,cAAc,IAAI;AACtC,QAAM,MAAM,IAAI,cAAc,KAAK;AACnC,MAAI,YAAY;AAChB,QAAM,QAAQ,IAAI,cAAc,MAAM;AACtC,QAAM,YAAY;AAClB,QAAM,cAAc;AACpB,QAAM,WAAW,IAAI,cAAc,GAAG;AACtC,WAAS,YAAY;AACrB,WAAS,OAAO,KAAK;AACrB,WAAS,SAAS;AAClB,WAAS,MAAM;AACf,WAAS,cAAc;AACvB,QAAM,QAAQ,IAAI,cAAc,QAAQ;AACxC,QAAM,OAAO;AACb,QAAM,YAAY;AAClB,QAAM,aAAa,cAAc,OAAO;AACxC,QAAM,cAAc;AACpB,MAAI,OAAO,OAAO,UAAU,KAAK;AAEjC,QAAM,WAAW,IAAI,cAAc,KAAK;AACxC,WAAS,YAAY;AACrB,WAAS,WAAW;AACpB,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,IAAI,cAAc,KAAK;AACnC,QAAI,MAAM,KAAK;AACf,QAAI,MAAM,KAAK;AACf,QAAI,WAAW;AAEf,eAAW,OAAO,CAAC,SAAS,QAAQ,EAAG,KAAI,KAAK,aAAa,GAAG,EAAG,KAAI,aAAa,KAAK,KAAK,aAAa,GAAG,CAAE;AAChH,aAAS,YAAY,GAAG;AAAA,EAC1B;AACA,SAAO,OAAO,KAAK,QAAQ;AAE3B,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,UAAU;AACtB,QAAE,gBAAgB;AAClB,WAAK;AAAA,IACP,WAAW,EAAE,QAAQ,OAAO;AAE1B,YAAM,QAAuB,CAAC,UAAU,OAAO,QAAQ;AACvD,YAAM,KAAK,MAAM,QAAS,OAAO,YAAY,EAA4B,aAA4B;AACrG,QAAE,eAAe;AACjB,aAAO,MAAM,EAAE,WAAW,MAAM,SAAS,IAAI,MAAM,MAAM,MAAM,EAAG,MAAM;AAAA,IAC1E;AAAA,EACF;AACA,QAAM,OAAO,MAAM;AACjB,WAAO,OAAO;AACd,iBAAa,QAAQ,EAAE,eAAe,KAAK,CAAC;AAAA,EAC9C;AACA,QAAM,iBAAiB,SAAS,IAAI;AACpC,SAAO,iBAAiB,WAAW,KAAK;AACxC,OAAK,YAAY,MAAM;AACvB,QAAM,MAAM;AACZ,QAAM,SAAS,SAAS,SAAS,KAAK;AACtC,MAAI,UAAU,QAAQ,GAAG;AACvB,UAAM,OAAO,MAAO,SAAS,YAAY,OAAO,YAAY;AAC5D,0BAAsB,IAAI;AAE1B,QAAI,CAAC,OAAO,aAAa,QAAQ,EAAG,YAAW,OAAO,MAAM,KAAK,SAAS,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAG,KAAI,iBAAiB,QAAQ,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,EACxJ;AACF;;;AGvJA,iBAAuH;AAgBhH,SAAS,OAAO,QAAiB,UAAuB,UAAyB,CAAC,GAAe;AAEtG,QAAM,YAAY,OAAO,aAAa,EAAE,uBAAuB,MAAM,WAAW,MAAM,GAAG,gBAAgB,OAAO,IAAI;AACpH,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,MAAM,QAAQ,UAAU;AAC9B,QAAM,aAAa,KAAC,mBAAO,OAAO,QAAQ,UAAU,IAAI,EAAE,CAAC;AAC3D,MAAI,cAAc,OAAQ,YAAW,SAAK,0BAAc,EAAE,SAAS,GAAG,CAAC,CAAC;AAAA,MACnE,YAAW,SAAK,iBAAK,EAAE,SAAS,GAAG,CAAC,CAAC;AAC1C,aAAW,SAAK,kBAAM,EAAE,SAAS,GAAG,CAAC,CAAC;AACtC,MAAI,QAAQ,QAAS,YAAW,SAAK,kBAAM,EAAE,SAAS,QAAQ,SAAS,SAAS,EAAE,CAAC,CAAC;AACpF,MAAI,UAAU;AACd,QAAM,SAAS,YAAY;AACzB,QAAI,WAAW,CAAC,SAAS,YAAa;AACtC,QAAI;AACF,YAAM,SAAS,UAAM,4BAAgB,WAAW,UAAU;AAAA,QACxD,WAAW,cAAc,SAAS,WAAW;AAAA,QAC7C,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AACD,UAAI,QAAS;AACb,eAAS,MAAM,OAAO,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;AAC7C,eAAS,MAAM,MAAM,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;AAC5C,eAAS,aAAa,kBAAkB,OAAO,SAAS;AACxD,UAAI,QAAQ,WAAW,OAAO,eAAe,OAAO;AAClD,cAAM,EAAE,GAAG,EAAE,IAAI,OAAO,eAAe;AACvC,cAAM,OAAO,OAAO,UAAU,MAAM,GAAG,EAAE,CAAC;AAC1C,cAAM,aAAa,EAAE,KAAK,UAAU,OAAO,QAAQ,QAAQ,OAAO,MAAM,QAAQ,EAAE,IAA2C;AAC7H,eAAO,OAAO,QAAQ,QAAQ,OAAO;AAAA,UACnC,MAAM,KAAK,OAAO,GAAG,CAAC,OAAO;AAAA,UAC7B,KAAK,KAAK,OAAO,GAAG,CAAC,OAAO;AAAA,UAC5B,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,CAAC,UAAU,GAAG;AAAA,QAChB,CAAC;AAAA,MACH;AACA,cAAQ,WAAW,OAAO,SAAS;AAAA,IACrC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,WAAgC;AACpC,MAAI;AACF,mBAAW,uBAAW,WAAW,UAAU,MAAM,KAAK,OAAO,GAAG,EAAE,gBAAgB,MAAM,CAAC;AAAA,EAC3F,QAAQ;AACN,SAAK,OAAO;AAAA,EACd;AACA,SAAO,MAAM;AACX,cAAU;AACV,eAAW;AAAA,EACb;AACF;AAGO,SAAS,UAAUC,KAAa,IAAyC;AAC9E,MAAI,MAAM;AACV,MAAI,UAAU;AACd,QAAM,MAAM,MAAM;AAChB,QAAI,QAAS;AACb,OAAG,WAAWA,GAAE,CAAC;AAAA,EACnB;AACA,QAAM,WAAW,MAAM;AACrB,QAAI,QAAS;AACb,QAAI,OAAO,0BAA0B,YAAY;AAC/C,2BAAqB,GAAG;AACxB,YAAM,sBAAsB,GAAG;AAAA,IACjC,MAAO,KAAI;AAAA,EACb;AACA,MAAI;AACJ,QAAM,MAAMA,IAAG,cAAc;AAC7B,OAAK,iBAAiB,UAAU,UAAU,IAAI;AAC9C,OAAK,iBAAiB,UAAU,QAAQ;AAExC,QAAM,cAA4B,CAAC;AACnC,WAAS,OAAOA,IAAG,YAAY,GAAG,KAAK,aAAa,MAAO,KAAoB,MAAM,OAAQ,KAAoB,KAAK,YAAY,EAAG,aAAY,KAAK,IAAkB;AACxK,aAAW,QAAQ,YAAa,MAAK,iBAAiB,UAAU,UAAU,IAAI;AAC9E,MAAI,KAA4B;AAChC,MAAI,OAAO,mBAAmB,aAAa;AACzC,QAAI;AACF,WAAK,IAAI,eAAe,QAAQ;AAChC,SAAG,QAAQA,GAAE;AACb,UAAIA,IAAG,cAAc,gBAAiB,IAAG,QAAQA,IAAG,cAAc,eAAe;AAAA,IACnF,QAAQ;AACN,WAAK;AAAA,IACP;AAAA,EACF;AACA,QAAM,WAAW,YAAY,KAAK,GAAG;AACrC,SAAO,MAAM;AACX,cAAU;AACV,SAAK,oBAAoB,UAAU,UAAU,IAAI;AACjD,SAAK,oBAAoB,UAAU,QAAQ;AAC3C,eAAW,QAAQ,YAAa,MAAK,oBAAoB,UAAU,UAAU,IAAI;AACjF,QAAI,WAAW;AACf,kBAAc,QAAQ;AACtB,QAAI,OAAO,yBAAyB,WAAY,sBAAqB,GAAG;AAAA,EAC1E;AACF;;;AC/GA,oBAAgE;AAkChE,IAAM,YAAY;AAClB,IAAI,MAAM;AACV,IAAM,SAAS,CAAC,MAAc,KAAK,CAAC,IAAI,EAAE,GAAG;AAE7C,SAAS,EAAyC,KAAe,KAAQ,WAAoB,MAAyC;AACpI,QAAMC,MAAK,IAAI,cAAc,GAAG;AAChC,MAAI,UAAW,CAAAA,IAAG,YAAY;AAC9B,MAAI,QAAQ,KAAM,CAAAA,IAAG,cAAc;AACnC,SAAOA;AACT;AAEA,SAAS,aAAa,KAAe,MAAiB,WAAoB,UAAkD;AAC1H,aAAO,8BAAe,MAAM,SAAS,EAAE,IAAI,CAAC,MAAM;AAChD,UAAM,MAAM,EAAE,KAAK,UAAU,eAAe,EAAE,OAAO,IAAI,EAAE,KAAK;AAChE,QAAI,OAAO;AACX,QAAI,aAAa,eAAe,EAAE,MAAM;AACxC,QAAI,iBAAiB,SAAS,CAAC,MAAM;AACnC,QAAE,eAAe;AACjB,eAAS,CAAC;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AACH;AAGO,SAAS,UAAU,KAAe,MAAyB,YAAgG;AAChK,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,OAAO,EAAE,KAAK,OAAO,UAAU,UAAU,EAAE;AACjD,OAAK,WAAW;AAChB,OAAK,aAAa,gBAAgB,KAAK,EAAE;AACzC,MAAI,KAAK,MAAO,MAAK,MAAM,QAAQ,OAAO,KAAK,KAAK;AACpD,QAAM,UAAU,OAAO,OAAO;AAC9B,QAAM,SAAS,OAAO,MAAM;AAC5B,MAAI,KAAK,UAAU;AACjB,UAAM,MAAM,EAAE,KAAK,OAAO,SAAS;AACnC,QAAI,MAAM,KAAK;AAEf,QAAI,MAAM,KAAK,YAAY;AAC3B,SAAK,YAAY,GAAG;AAAA,EACtB;AACA,QAAM,QAAQ,EAAE,KAAK,OAAO,SAAS;AACrC,MAAI,KAAK,WAAW;AAClB,UAAM,QAAQ,EAAE,KAAK,UAAU,WAAW,MAAG;AAC7C,UAAM,OAAO;AACb,UAAM,aAAa,cAAc,OAAO;AACxC,UAAM,iBAAiB,SAAS,CAAC,MAAM;AACrC,QAAE,eAAe;AACjB,WAAK,QAAQ;AAAA,IACf,CAAC;AACD,SAAK,YAAY,KAAK;AAAA,EACxB;AACA,MAAI,KAAK,OAAO;AACd,UAAM,IAAI,EAAE,KAAK,MAAM,WAAW,KAAK,KAAK;AAC5C,MAAE,KAAK;AACP,UAAM,YAAY,CAAC;AAAA,EACrB;AACA,MAAI,KAAK,MAAM;AACb,UAAM,IAAI,EAAE,KAAK,OAAO,QAAQ;AAChC,MAAE,KAAK;AACP,qBAAiB,GAAG,KAAK,IAAI;AAC7B,UAAM,YAAY,CAAC;AAAA,EACrB;AACA,QAAM,UAAU,aAAa,KAAK,MAAM,KAAK,aAAa,KAAK,QAAQ,GAAG,KAAK,QAAQ;AACvF,MAAI,QAAQ,UAAW,KAAK,gBAAgB,KAAK,QAAQ,GAAI;AAC3D,UAAM,SAAS,EAAE,KAAK,OAAO,UAAU;AACvC,QAAI,KAAK,gBAAgB,KAAK,QAAQ,GAAG;AACvC,YAAM,WAAW,EAAE,KAAK,QAAQ,cAAc,GAAG,KAAK,QAAQ,CAAC,OAAO,KAAK,KAAK,EAAE;AAClF,eAAS,aAAa,cAAc,QAAQ,KAAK,QAAQ,CAAC,OAAO,KAAK,KAAK,EAAE;AAC7E,aAAO,YAAY,QAAQ;AAAA,IAC7B;AACA,YAAQ,QAAQ,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAC5C,UAAM,YAAY,MAAM;AAAA,EAC1B;AACA,OAAK,YAAY,KAAK;AACtB,MAAI,KAAK,MAAO,MAAK,aAAa,mBAAmB,OAAO;AAAA,MACvD,MAAK,aAAa,cAAc,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC,OAAO,KAAK,KAAK,KAAK,OAAO;AACzG,MAAI,KAAK,KAAM,MAAK,aAAa,oBAAoB,MAAM;AAC3D,SAAO,EAAE,MAAM,OAAO,SAAS,OAAO;AACxC;AAEA,SAAS,WAAW,MAAkC;AACpD,SAAO,MAAM,KAAK,KAAK,iBAA8B,SAAS,CAAC;AACjE;AAEA,SAAS,YAAYA,KAAiC;AACpD,QAAM,IAAIA;AACV,MAAI,CAAC,KAAK,CAAC,EAAE,QAAS,QAAO;AAC7B,QAAM,MAAM,EAAE,QAAQ,YAAY;AAClC,SAAO,QAAQ,WAAW,QAAQ,cAAc,QAAQ,YAAY,EAAE,sBAAsB;AAC9F;AAMA,SAAS,gBAAgB,MAAmB,MAAiB,MAAe,SAAiC;AAC3G,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,YAAY,KAAK,WAAW;AACxC,QAAE,gBAAgB;AAClB,cAAQ;AACR;AAAA,IACF;AACA,SAAK,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,gBAAgB,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG;AACxH,YAAM,UAAU,EAAE,QAAQ,eAAe,CAAC,QAAQ,UAAU,IAAI,CAAC,MAAM;AACvE,YAAM,MAAM,QAAQ,IAAI,CAAC,MAAM,KAAK,cAAiC,uBAAuB,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO;AAChH,UAAI,KAAK;AACP,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,YAAI,MAAM;AAAA,MACZ;AACA;AAAA,IACF;AACA,QAAI,QAAQ,EAAE,QAAQ,OAAO;AAC3B,YAAM,QAAQ,WAAW,IAAI;AAC7B,UAAI,CAAC,MAAM,QAAQ;AACjB,UAAE,eAAe;AACjB,aAAK,MAAM;AACX;AAAA,MACF;AACA,YAAM,QAAQ,MAAM,CAAC;AACrB,YAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,YAAM,SAAU,KAAK,YAAY,EAA4B;AAC7D,UAAI,EAAE,aAAa,WAAW,SAAS,WAAW,OAAO;AACvD,UAAE,eAAe;AACjB,aAAK,MAAM;AAAA,MACb,WAAW,CAAC,EAAE,YAAY,WAAW,MAAM;AACzC,UAAE,eAAe;AACjB,cAAM,MAAM;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,OAAK,iBAAiB,WAAW,KAAK;AACtC,SAAO,MAAM,KAAK,oBAAoB,WAAW,KAAK;AACxD;AAEA,SAAS,UAAU,MAA+B;AAChD,QAAM,MAAM,KAAK;AACjB,QAAM,SAAS,IAAI;AAEnB,QAAM,WAAW,UAAU,OAAO,OAAO,iBAAiB,SAAS;AACnE,QAAM,UAAU,KAAK,cAA2B,gBAAgB,KAAK,WAAW,IAAI,EAAE,CAAC,KAAK;AAC5F,MAAI;AACF,YAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EACvC,QAAQ;AAAA,EAER;AACA,SAAO,MAAM;AACX,QAAI;AACF,UAAI,YAAY,SAAS,eAAe,OAAO,SAAS,UAAU,WAAY,UAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,IACtH,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAAS,UAAU,KAAe,MAAyB,cAAc,OAAoB;AAC3F,QAAM,UAAU,EAAE,KAAK,OAAO,YAAY,cAAc,mBAAmB,EAAE,EAAE;AAC/E,MAAI,KAAK,KAAK,sBAAuB,SAAQ,iBAAiB,SAAS,MAAM,KAAK,QAAQ,CAAC;AAC3F,SAAO;AACT;AAEA,SAAS,cAAc,UAAyC;AAC9D,SAAO,SAAS,QAAQ;AAC1B;AAEO,SAAS,YAAY,KAAe,MAAmC;AAC5E,QAAM,WAA8B,CAAC;AACrC,QAAM,EAAE,KAAK,IAAI,UAAU,KAAK,MAAM,SAAS;AAC/C,OAAK,aAAa,QAAQ,QAAQ;AAClC,OAAK,aAAa,cAAc,MAAM;AACtC,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,MAAI,KAAK,KAAK,eAAe,KAAK,QAAS,SAAQ,YAAY,UAAU,KAAK,IAAI,CAAC;AAAA,WAC1E,KAAK,KAAK,sBAAuB,SAAQ,YAAY,UAAU,KAAK,MAAM,IAAI,CAAC;AACxF,UAAQ,YAAY,IAAI;AACxB,OAAK,MAAM,YAAY,OAAO;AAC9B,WAAS,KAAK,gBAAgB,MAAM,KAAK,MAAM,MAAM,KAAK,OAAO,CAAC;AAClE,WAAS,KAAK,UAAU,IAAI,CAAC;AAC7B,SAAO,EAAE,IAAI,SAAS,MAAM,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAC3E;AAEA,SAAS,WAAW,UAA6BA,KAAiB;AAChE,WAAS,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO;AACjC,QAAI;AACF,SAAG;AAAA,IACL,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AACD,EAAAA,IAAG,OAAO;AACZ;AAEA,SAAS,qBAAqB,QAAiB,IAAwB;AACrE,QAAM,OAAO,OAAO,aAAa,kBAAkB;AACnD,MAAI;AACF,WAAO,aAAa,oBAAoB,OAAO,GAAG,IAAI,IAAI,EAAE,KAAK,EAAE;AAAA,EACrE,QAAQ;AACN,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACA,SAAO,MAAM;AACX,QAAI,KAAM,QAAO,aAAa,oBAAoB,IAAI;AAAA,QACjD,QAAO,gBAAgB,kBAAkB;AAAA,EAChD;AACF;AAEO,SAAS,cAAc,KAAe,MAAyB,MAAuC;AAC3G,QAAM,SAAS,KAAK;AACpB,MAAI,CAAC,OAAQ,QAAO,YAAY,KAAK,EAAE,GAAG,MAAM,SAAS,KAAK,CAAC;AAC/D,QAAM,WAA8B,CAAC;AACrC,QAAM,EAAE,KAAK,IAAI,UAAU,KAAK,MAAM,KAAK,IAAI,EAAE;AACjD,QAAM,UAAU,EAAE,KAAK,OAAO,SAAS;AACvC,OAAK,YAAY,OAAO;AACxB,OAAK,aAAa,QAAQ,SAAS,YAAY,YAAY,QAAQ;AACnE,OAAK,KAAK,OAAO,IAAI;AACrB,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,MAAI,KAAK,KAAK,YAAa,SAAQ,YAAY,UAAU,KAAK,IAAI,CAAC;AAAA,WAC1D,KAAK,KAAK,sBAAuB,SAAQ,YAAY,UAAU,KAAK,MAAM,IAAI,CAAC;AACxF,UAAQ,YAAY,IAAI;AACxB,OAAK,MAAM,YAAY,OAAO;AAC9B,MAAI,KAAK,KAAK,QAAQ,mBAAmB,MAAO,UAAS,MAAM;AAC/D,WAAS,KAAK,OAAO,QAAQ,MAAM,EAAE,WAAW,KAAK,KAAK,WAAW,QAAQ,KAAK,KAAK,QAAQ,QAAQ,CAAC,CAAC;AACzG,WAAS,KAAK,qBAAqB,QAAQ,KAAK,EAAE,CAAC;AACnD,WAAS,KAAK,gBAAgB,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC;AACnE,WAAS,KAAK,UAAU,IAAI,CAAC;AAC7B,SAAO,EAAE,IAAI,SAAS,MAAM,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAC3E;AAEA,SAAS,SAAS,QAAiB;AACjC,MAAI;AACF,WAAO,iBAAiB,EAAE,OAAO,WAAW,QAAQ,WAAW,UAAU,OAAO,CAAC;AAAA,EACnF,QAAQ;AAAA,EAER;AACF;AAGO,SAAS,gBAAgB,KAAe,MAAmC;AAChF,QAAM,SAAS,KAAK;AACpB,MAAI,CAAC,OAAQ,QAAO,YAAY,KAAK,EAAE,GAAG,MAAM,SAAS,KAAK,CAAC;AAC/D,QAAM,WAA8B,CAAC;AACrC,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,QAAM,MAAM,KAAK,KAAK,oBAAoB;AAC1C,QAAM,QAAQ,CAAC,OAAO,QAAQ,SAAS,QAAQ,EAAE,IAAI,CAAC,SAAS;AAC7D,UAAM,IAAI,EAAE,KAAK,OAAO,sBAAsB,IAAI,EAAE;AACpD,QAAI,KAAK,KAAK,sBAAuB,GAAE,iBAAiB,SAAS,MAAM,KAAK,QAAQ,CAAC;AACrF,YAAQ,YAAY,CAAC;AACrB,WAAO;AAAA,EACT,CAAC;AACD,QAAM,OAAO,EAAE,KAAK,OAAO,aAAa;AACxC,UAAQ,YAAY,IAAI;AACxB,QAAM,EAAE,KAAK,IAAI,UAAU,KAAK,MAAM,kBAAkB;AACxD,OAAK,aAAa,QAAQ,QAAQ;AAClC,QAAM,UAAU,EAAE,KAAK,OAAO,SAAS;AACvC,OAAK,YAAY,OAAO;AACxB,UAAQ,YAAY,IAAI;AACxB,OAAK,MAAM,YAAY,OAAO;AAC9B,MAAI,KAAK,KAAK,QAAQ,mBAAmB,MAAO,UAAS,MAAM;AAC/D,QAAM,MAAM,IAAI;AAChB,QAAM,SAAS,CAAC,MAAe;AAC7B,UAAM,KAAK,KAAK,cAAc;AAC9B,UAAM,KAAK,KAAK,eAAe;AAC/B,UAAM,IAAI,KAAK,IAAI,GAAG,EAAE,OAAO,GAAG;AAClC,UAAM,IAAI,KAAK,IAAI,GAAG,EAAE,MAAM,GAAG;AACjC,UAAM,IAAI,KAAK,IAAI,IAAI,EAAE,QAAQ,GAAG,IAAI;AACxC,UAAM,MAAM,KAAK,IAAI,IAAI,EAAE,SAAS,GAAG,IAAI;AAC3C,UAAM,CAAC,KAAK,MAAM,OAAO,MAAM,IAAI;AACnC,WAAO,OAAO,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,CAAC,KAAK,CAAC;AACjF,WAAO,OAAO,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,GAAG,CAAC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC;AAC3F,WAAO,OAAO,MAAM,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC;AAC3H,WAAO,OAAO,OAAO,OAAO,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI,GAAG,MAAM,OAAO,QAAQ,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;AACvH,WAAO,OAAO,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC;AAAA,EAClG;AACA,WAAS,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC,WAAS,KAAK,OAAO,QAAQ,MAAM,EAAE,WAAW,KAAK,KAAK,WAAW,QAAQ,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC;AAC/G,WAAS,KAAK,gBAAgB,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC;AACnE,WAAS,KAAK,UAAU,IAAI,CAAC;AAC7B,SAAO,EAAE,IAAI,SAAS,MAAM,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAC3E;AAGO,SAAS,cAAc,KAAe,MAAmC;AAC9E,QAAM,SAAS,KAAK;AACpB,MAAI,CAAC,OAAQ,QAAO,YAAY,KAAK,EAAE,GAAG,MAAM,SAAS,KAAK,CAAC;AAC/D,QAAM,WAA8B,CAAC;AACrC,QAAM,MAAM,KAAK,KAAK,WAAW,EAAE,MAAM,IAAI,OAAO,MAAM,QAAQ,QAAiB;AACnF,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,QAAM,MAAM,EAAE,KAAK,UAAU,YAAY,IAAI,QAAQ,aAAa,EAAE,EAAE;AACtE,MAAI,OAAO;AACX,MAAI,aAAa,cAAc,KAAK,KAAK,SAAS,WAAW;AAC7D,MAAI,aAAa,iBAAiB,OAAO;AACzC,MAAI,MAAM,QAAQ,GAAG,IAAI,IAAI;AAC7B,MAAI,MAAM,SAAS,GAAG,IAAI,IAAI;AAC9B,MAAI,YAAY,EAAE,KAAK,QAAQ,eAAe,CAAC;AAC/C,UAAQ,YAAY,GAAG;AACvB,OAAK,MAAM,YAAY,OAAO;AAC9B,WAAS,KAAK,UAAU,QAAQ,CAAC,MAAM;AACrC,QAAI,MAAM,OAAO,GAAG,KAAK,MAAM,EAAE,QAAQ,IAAI,OAAO,CAAC,CAAC;AACtD,QAAI,MAAM,MAAM,GAAG,KAAK,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,CAAC;AAAA,EACrD,CAAC,CAAC;AACF,MAAI,OAA2B;AAC/B,MAAI,aAAkC;AACtC,MAAI,WAAgC;AACpC,QAAM,QAAQ,CAAC,cAAc,UAAU;AACrC,UAAM,WAAW,CAAC,CAAC,QAAS,KAAK,YAAY,EAA4B,kBAAkB,QAAQ,KAAK,SAAU,KAAK,YAAY,EAA4B,aAAa;AAC5K,iBAAa;AACb,eAAW;AACX,UAAM,OAAO;AACb,WAAO;AACP,QAAI,aAAa,iBAAiB,OAAO;AAEzC,QAAI,eAAe,UAAU;AAC3B,UAAI;AACF,YAAI,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,MACnC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,MAAM;AACjB,QAAI,KAAM;AACV,UAAM,QAAQ,UAAU,KAAK,EAAE,GAAG,MAAM,SAAS,MAAM,KAAK,QAAQ,EAAE,GAAG,gBAAgB;AACzF,WAAO,MAAM;AACb,SAAK,aAAa,QAAQ,QAAQ;AAClC,SAAK,KAAK,OAAO,SAAS;AAC1B,QAAI,aAAa,iBAAiB,KAAK,EAAE;AACzC,UAAM,UAAU,EAAE,KAAK,OAAO,SAAS;AACvC,SAAK,YAAY,OAAO;AACxB,YAAQ,YAAY,IAAI;AACxB,iBAAa,OAAO,QAAQ,MAAM,EAAE,WAAW,KAAK,KAAK,WAAW,QAAQ,KAAK,KAAK,QAAQ,QAAQ,CAAC;AACvG,eAAW,gBAAgB,MAAM,KAAK,MAAM,OAAO,MAAM,MAAM,IAAI,CAAC;AACpE,QAAI,aAAa,iBAAiB,MAAM;AACxC,SAAK,SAAS;AACd,QAAI,IAAI,WAAW,QAAS,WAAU,IAAI;AAAA,EAC5C;AACA,MAAI,iBAAiB,SAAS,CAAC,MAAM;AACnC,MAAE,eAAe;AACjB,QAAI,KAAM,OAAM;AAAA,QACX,MAAK;AAAA,EACZ,CAAC;AACD,MAAI,IAAI,WAAW,SAAS;AAC1B,QAAI,iBAAiB,cAAc,IAAI;AACvC,QAAI,iBAAiB,SAAS,IAAI;AAAA,EACpC;AACA,WAAS,KAAK,KAAK;AACnB,SAAO,EAAE,IAAI,SAAS,MAAM,KAAK,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAChF;AAEO,SAAS,aAAa,KAAe,MAAmC;AAC7E,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,WAA8B,CAAC;AACrC,QAAM,MAAM,KAAK,aAAa,SAAS,KAAK,cAAc,SAAS,KAAK,SAAS,WAAW,KAAK,IAAI,QAAQ;AAC7G,QAAM,SAAS,EAAE,KAAK,OAAO,kBAAkB,GAAG,EAAE;AAEpD,SAAO,aAAa,QAAQ,QAAQ;AACpC,SAAO,aAAa,cAAc,KAAK,SAAS,cAAc;AAC9D,SAAO,aAAa,gBAAgB,KAAK,EAAE;AAC3C,QAAM,OAAO,EAAE,KAAK,OAAO,QAAQ;AACnC,MAAI,KAAK,MAAO,MAAK,YAAY,EAAE,KAAK,UAAU,IAAI,GAAG,KAAK,KAAK,GAAG,CAAC;AACvE,QAAM,OAAO,EAAE,KAAK,MAAM;AAC1B,mBAAiB,MAAM,KAAK,IAAI;AAChC,OAAK,YAAY,IAAI;AACrB,SAAO,YAAY,IAAI;AACvB,eAAa,KAAK,MAAM,KAAK,aAAa,KAAK,QAAQ,GAAG,KAAK,QAAQ,EAAE,QAAQ,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAC7G,MAAI,KAAK,WAAW;AAClB,UAAM,QAAQ,EAAE,KAAK,UAAU,WAAW,MAAG;AAC7C,UAAM,OAAO;AACb,UAAM,aAAa,cAAc,SAAS;AAC1C,UAAM,iBAAiB,SAAS,MAAM,KAAK,QAAQ,CAAC;AACpD,WAAO,YAAY,KAAK;AAAA,EAC1B;AACA,OAAK,MAAM,YAAY,MAAM;AAC7B,WAAS,KAAK,gBAAgB,QAAQ,MAAM,OAAO,KAAK,OAAO,CAAC;AAChE,SAAO,EAAE,IAAI,QAAQ,MAAM,QAAQ,SAAS,MAAM,WAAW,UAAU,MAAM,EAAE;AACjF;AAEO,SAAS,eAAe,KAAe,MAAmC;AAC/E,QAAM,WAA8B,CAAC;AACrC,QAAM,MAAM,KAAK,KAAK,aAAa,QAAQ,cAAc,KAAK,KAAK,aAAa,WAAW,iBAAiB,KAAK,KAAK;AACtH,QAAM,EAAE,KAAK,IAAI,UAAU,KAAK,MAAM,cAAc,cAAc,GAAG,CAAC,EAAE;AACxE,OAAK,aAAa,QAAQ,QAAQ;AAClC,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,MAAI,KAAK,KAAK,sBAAuB,SAAQ,YAAY,UAAU,KAAK,MAAM,IAAI,CAAC;AACnF,UAAQ,YAAY,IAAI;AACxB,OAAK,MAAM,YAAY,OAAO;AAC9B,WAAS,KAAK,gBAAgB,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC;AACnE,WAAS,KAAK,UAAU,IAAI,CAAC;AAC7B,SAAO,EAAE,IAAI,SAAS,MAAM,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAC3E;AAQA,SAAS,aAAa,MAAc,WAAwB,MAAqC;AAC/F,QAAM,MAAM,CAAC,WAAiC,MAAM,KAAK,SAAS,EAAE,IAAI,QAAQ,MAAM,IAAI,OAAO,QAAQ,QAAQ,SAAS,UAAU,CAAC;AACrI,QAAM,MAAM,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,UAAU,IAAI,UAAU,GAAG,MAAM,IAAI,MAAM,GAAG,SAAS,MAAM,KAAK,QAAQ,GAAG,QAAQ,KAAK,KAAK,GAAG,CAAC;AACrK,MAAI;AAEF,UAAM,KAAK,IAAI,SAAS,WAAW,aAAa;AAAA,EAAkB,IAAI,EAAE;AACxE,UAAM,SAAS,GAAG,KAAK,SAAS;AAChC,WAAO,OAAO,WAAW,aAAa,MAAM;AAC1C,UAAI;AACF,QAAC,OAAsB;AAAA,MACzB,SAAS,KAAK;AACZ,aAAK,UAAU,GAAG;AAAA,MACpB;AAAA,IACF,IAAI,MAAM;AAAA,IAAC;AAAA,EACb,SAAS,KAAK;AACZ,SAAK,UAAU,GAAG;AAClB,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACF;AAGO,SAAS,aAAa,KAAe,MAAmC;AAC7E,QAAM,WAA8B,CAAC;AACrC,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,MAAI,KAAK,KAAK,YAAa,SAAQ,YAAY,UAAU,KAAK,IAAI,CAAC;AACnE,QAAMA,MAAK,EAAE,KAAK,OAAO,UAAU;AACnC,EAAAA,IAAG,WAAW;AACd,EAAAA,IAAG,aAAa,gBAAgB,KAAK,KAAK,EAAE;AAC5C,mBAAiBA,KAAI,KAAK,KAAK,cAAc,KAAK,KAAK,QAAQ,EAAE;AACjE,EAAAA,IAAG,aAAa,QAAQ,KAAK,KAAK,cAAc,WAAW,OAAO;AAClE,EAAAA,IAAG,aAAa,cAAc,KAAK,KAAK,SAAS,OAAO;AACxD,MAAI,KAAK,KAAK,YAAa,CAAAA,IAAG,aAAa,cAAc,MAAM;AAC/D,QAAM,UAAU,CAAC,MAAa;AAC5B,UAAM,IAAK,EAAE,QAA2B,UAAU,iBAAiB;AACnE,UAAM,SAAS,GAAG,aAAa,eAAe;AAC9C,QAAI,CAAC,OAAQ;AACb,MAAE,eAAe;AACjB,QAAI,WAAW,UAAW,MAAK,QAAQ;AAAA,QAClC,MAAK,SAAS,EAAE,IAAI,UAAU,MAAM,IAAI,OAAO,QAAQ,QAAwC,SAAS,WAAW,OAAO,GAAG,aAAa,cAAc,KAAK,OAAU,CAAC;AAAA,EAC/K;AACA,EAAAA,IAAG,iBAAiB,SAAS,OAAO;AACpC,UAAQ,YAAYA,GAAE;AACtB,OAAK,MAAM,YAAY,OAAO;AAC9B,WAAS,KAAK,gBAAgBA,KAAI,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC;AACjE,WAAS,KAAK,UAAUA,GAAE,CAAC;AAC3B,MAAI,KAAK,WAAW,KAAK,KAAK,KAAM,UAAS,KAAK,aAAa,KAAK,KAAK,MAAMA,KAAI,IAAI,CAAC;AACxF,SAAO,EAAE,IAAI,SAAS,MAAMA,KAAI,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAC/E;AAMO,SAAS,WAAW,MAAmC;AAC5D,QAAM,MAAM,KAAK,MAAM;AACvB,QAAM,OAAO,KAAK,UAAU,UAAU,KAAK,KAAK;AAChD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,cAAc,KAAK,MAAM,SAAS;AAAA,IAC3C,KAAK;AACH,aAAO,cAAc,KAAK,MAAM,SAAS;AAAA,IAC3C,KAAK;AACH,aAAO,gBAAgB,KAAK,IAAI;AAAA,IAClC,KAAK;AACH,aAAO,cAAc,KAAK,IAAI;AAAA,IAChC,KAAK;AACH,aAAO,aAAa,KAAK,IAAI;AAAA,IAC/B,KAAK;AACH,aAAO,eAAe,KAAK,IAAI;AAAA,IACjC,KAAK;AACH,aAAO,aAAa,KAAK,IAAI;AAAA,IAC/B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO,YAAY,KAAK,IAAI;AAAA,EAChC;AACF;AAGO,SAAS,eAAe,MAA0B;AACvD,UAAQ,KAAK,SAAS,aAAa,KAAK,SAAS,aAAa,KAAK,SAAS,eAAe,KAAK,SAAS,cAAc,CAAC,CAAC,KAAK,UAAU,KAAK,OAAO,UAAU,SAAS;AACzK;;;AC9fA,IAAAC,kBAA8B;AAoF9B,SAAS,OAAO;AAAC;AAEjB,IAAM,aAAa,CAAC,MAAc,EAAE,QAAQ,YAAY,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG;AAG/E,SAAS,aAAa,SAA4C;AACvE,MAAI,CAAC,WAAW,UAAU,KAAK,OAAO,KAAK,QAAQ,SAAS,IAAI,EAAG,QAAO;AAC1E,MAAI,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,WAAW,IAAI,EAAG,QAAO;AACjE,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,OAAO;AACzB,QAAI,OAAO,aAAa,eAAe,EAAE,WAAW,SAAS,OAAQ,QAAO,EAAE;AAAA,EAChF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAKO,SAAS,SAAS,OAAsB,UAA2B,CAAC,GAAoB;AAC7F,QAAM,MAAM,QAAQ,QAAQ,QAAQ,WAAW,iBAAiB;AAChE,QAAM,QAAQ,MAAM,OAAO;AAC3B,QAAM,QAAQ,MAAM;AACpB,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,SAAS,OAAO,OAAO,QAAQ,QAAQ,aAAa,QAAQ,IAAI,IAAI,QAAQ,QAAQ;AAC1F,QAAM,aAAa,QAAQ,eAAe,MAAO,OAAO,aAAa,cAAc,SAAS,OAAO;AAEnG,MAAI,SAAsB;AAC1B,MAAI,QAAQ;AACZ,MAAI,eAAe;AACnB,MAAI,OAAwB;AAC5B,QAAM,eAAkC,CAAC;AACzC,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,QAAQ;AACZ,QAAM,UAAoB,CAAC;AAC3B,MAAI,QAAqD;AAEzD,QAAM,OAAO,CAAC,MAAiB,MAAyB,WAAoB,eAAyC;AACnH,QAAI;AACF,cAAQ,EAAE,MAAM,SAAS,MAAM,IAAI,UAAU,MAAM,KAAK,cAAc,MAAM,SAAS,QAAQ,MAAM,IAAI,WAAW,WAAW,CAAC;AAAA,IAChI,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AAEA,QAAM,WAAW,CAAC,SAAiB;AACjC,QAAI;AACF,iBAAW,GAAG,EAAE,SAAS,IAAI;AAAA,IAC/B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,WAAW,MAAmB;AAClC,QAAI,QAAQ,UAAW,QAAO,QAAQ;AACtC,QAAI,CAAC,MAAO,SAAQ,YAAY,QAAQ,OAAO,MAAM,OAAO,YAAY,GAAG;AAC3E,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,YAAY,MAAM;AACtB,iBAAa,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO;AACrC,UAAI;AACF,WAAG;AAAA,MACL,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AACD,QAAI;AACF,YAAM,QAAQ;AAAA,IAChB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AACA,WAAO;AACP,eAAW;AAAA,EACb;AAGA,MAAI,gBAAoC;AACxC,QAAM,eAAe,MAAM;AACzB,UAAMC,MAAK;AACX,oBAAgB;AAChB,QAAI;AACF,YAAM,MAAM,IAAI;AAChB,YAAM,OAAO,CAAC,OAAO,QAAQ,IAAI,QAAQ,IAAI,OAAO;AACpD,UAAIA,OAAM,QAAQA,IAAG,eAAe,OAAOA,IAAG,UAAU,WAAY,CAAAA,IAAG,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,IACtG,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,MAAM,CAAC,WAA2B;AACtC,QAAI,MAAO;AACX,YAAQ;AACR,UAAM,OAAO,MAAM,KAAK;AACxB,cAAU;AACV,aAAS;AACT,QAAI,WAAW,YAAa,MAAK,mBAAmB,MAAM,KAAK;AAAA,aACtD,WAAW,YAAa,MAAK,mBAAmB,MAAM,KAAK;AAAA,aAC3D,WAAW,UAAW,MAAK,iBAAiB,MAAM,KAAK;AAChE,WAAO,QAAQ;AACf,YAAQ;AACR,iBAAa;AACb,QAAI;AACF,cAAQ,QAAQ,MAAM;AAAA,IACxB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AAEA,QAAM,eAAe,MAAM;AACzB,QAAI,YAAY,QAAQ,EAAG;AAC3B,eAAW;AACX,SAAK,kBAAkB,MAAM,KAAK,GAAG,KAAK;AAAA,EAC5C;AAEA,QAAM,SAAS,CAAC,mBAA4B;AAC1C,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,SAAS;AACb,UAAM,MAAM,OAAO;AACnB,QAAI,QAAQ,KAAK;AACf,iBAAW,UAAU,KAAK,UAAU;AAClC,gBAAI,+BAAc,OAAO,MAAM,GAAG,GAAG;AACnC,mBAAS,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,OAAO,IAAI;AACpD,cAAI,UAAU,EAAG;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS,KAAK,eAAgB,UAAS,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,cAAc;AACzF,QAAI,SAAS,EAAG,UAAS,QAAQ;AACjC,QAAI,UAAU,MAAO,QAAO,IAAI,WAAW;AAC3C,YAAQ,KAAK,KAAK;AAClB,aAAS,QAAQ,CAAC;AAAA,EACpB;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,MAAO;AACX,iBAAa;AACb,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,CAAC,MAAkB;AACtC,QAAI;AACF,cAAQ,EAAE,QAAQ;AAAA,QAChB,KAAK;AACH,uBAAa;AACb,iBAAO,EAAE,KAAK;AACd;AAAA,QACF,KAAK;AACH,qBAAW,KAAK;AAChB;AAAA,QACF,KAAK;AACH,cAAI,WAAW;AACf;AAAA,QACF,KAAK;AACH,uBAAa;AACb,cAAI,WAAW;AACf;AAAA,QACF,KAAK;AACH,cAAI,SAAS;AACb;AAAA,QACF,KAAK,OAAO;AACV,uBAAa;AACb,gBAAM,MAAM,EAAE,SAAS;AACvB,cAAI,QAAQ,WAAY,SAAQ,WAAW,KAAK,EAAE,MAAM;AAAA,mBAC/C,EAAE,OAAQ,QAAO,KAAK,KAAK,UAAU,UAAU;AAAA,cACnD,UAAS,OAAO,GAAG;AACxB,cAAI,QAAQ,KAAK,MAAO,KAAI,WAAW;AAAA,cAClC,QAAO;AACZ;AAAA,QACF;AAAA,QACA,KAAK;AACH,uBAAa;AACb,cAAI,WAAW;AACf,kBAAQ,WAAW,eAAe,EAAE,OAAO,CAAC;AAC5C;AAAA,QACF,KAAK;AACH,kBAAQ,WAAW,SAAS,EAAE,OAAO,CAAC;AACtC;AAAA,QACF,KAAK;AACH,kBAAQ,WAAW,wBAAwB,EAAE,OAAO,CAAC;AACrD;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,MAAiB,WAA2B;AAChE,UAAM,QAAQ,KAAK,cAAc,QAAQ,CAAC,iBAAiB,mBAAmB,SAAS,OAAO,IAAI,CAAC,KAAK,SAAS;AACjH,eAAW,QAAQ,OAAO;AAExB,UAAI,SAAS,oBAAoB,KAAK,gBAAgB,SAAS;AAC7D,cAAM,WAAW,KAAK;AACtB,cAAM,UAAU,CAAC,MAAa;AAC5B,gBAAM,IAAI,eAAe,CAAC;AAC1B,cAAI;AACF,gBAAI,WAAW,KAAK,gBAAgB,GAAG,QAAQ,IAAI,KAAK,UAAU,iBAAiB,QAAQ,CAAC,EAAG,SAAQ;AAAA,UACzG,QAAQ;AAAA,UAER;AAAA,QACF;AACA,YAAI,iBAAiB,SAAS,SAAS,IAAI;AAC3C,YAAI,iBAAiB,WAAW,SAAS,IAAI;AAC7C,qBAAa,KAAK,MAAM;AACtB,cAAI,oBAAoB,SAAS,SAAS,IAAI;AAC9C,cAAI,oBAAoB,WAAW,SAAS,IAAI;AAAA,QAClD,CAAC;AAAA,MACH,WAAW,SAAS,qBAAqB,KAAK,cAAc;AAC1D,cAAM,KAAK,IAAI,gBAAgB;AAC/B,qBAAa,KAAK,MAAM,GAAG,MAAM,CAAC;AAClC,sBAAc,CAAC,EAAE,MAAM,OAAO,OAAO,KAAK,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,MAAM,IAAI,CAAC,EACtG,KAAK,CAACA,QAAO;AACZ,cAAI,GAAG,OAAO,QAAS;AACvB,cAAI,OAAO,yBAAyB,YAAa,QAAO,QAAQ;AAChE,gBAAM,KAAK,IAAI,qBAAqB,CAAC,YAAY;AAC/C,gBAAI,QAAQ,KAAK,CAAC,OAAO,GAAG,cAAc,GAAG;AAC3C,iBAAG,WAAW;AACd,sBAAQ;AAAA,YACV;AAAA,UACF,CAAC;AACD,aAAG,QAAQA,GAAE;AACb,uBAAa,KAAK,MAAM,GAAG,WAAW,CAAC;AAAA,QACzC,CAAC,EACA,MAAM,IAAI;AAAA,MACf,WAAW,SAAS,WAAW,KAAK,gBAAgB,QAAQ,UAAU;AACpE,qBAAa,KAAK,QAAQ,SAAS,GAAG,KAAK,cAAc,OAAO,CAAC;AAAA,MACnE,WAAW,SAAS,SAAS;AAC3B,cAAM,IAAI,WAAW,SAAS,KAAK,kBAAkB,GAAI;AACzD,qBAAa,KAAK,MAAM,aAAa,CAAC,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,MAAiB,QAAwB,UAAU,UAAU;AAC3E,QAAI,MAAO;AACX,aAAS;AAET,UAAM,QAAQ,CAAC,UAAU,KAAK,cAAc,mBAAmB,CAAC,KAAK,gBAAgB,CAAC,KAAK,QAAQ,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,EAAE,IAAI,UAAU,OAAO,QAAQ,KAAK,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,KAAK,QAAS,aAAwB,QAAkB,SAAS,UAAmB,CAAC,EAAE,IAAI;AACzS,QAAI;AACF,aAAO,WAAW;AAAA,QAChB,OAAO,SAAS;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,WAAW,QAAQ,SAAS,KAAK,QAAQ;AAAA,QACzC;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,SAAS,MAAM,IAAI,WAAW;AAAA,QAC9B;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,cAAQ,GAAG;AACX,aAAO;AAEP,UAAI,QAAQ,IAAI,MAAO,QAAO,OAAO;AACrC,aAAO,IAAI,SAAS;AAAA,IACtB;AACA,QAAI,CAAC,SAAS;AACZ,gBAAU;AACV,WAAK,iBAAiB,MAAM,KAAK;AAAA,IACnC;AACA,SAAK,eAAe,MAAM,OAAO,UAAU,EAAE,UAAU,gBAAgB,IAAI,MAAS;AACpF,aAAS,KAAK,QAAQ,GAAG,KAAK,KAAK,UAAU,QAAQ,CAAC,OAAO,KAAK,KAAK,QAAQ,QAAQ,CAAC,OAAO,KAAK,EAAE;AACtG,iBAAa,MAAM,MAAM;AAAA,EAC3B;AAGA,QAAM,gBAAgB,CAAC,SAAoB;AACzC,QAAI,SAAS,WAAW,iBAAiB,KAAM;AAC/C,UAAM,OAAO,aAAa,KAAK,GAAG;AAClC,UAAM,SAAS,KAAK,OAAO,IAAI,QAAQ,sBAAsB,EAAE,KAAK;AACpE,UAAM,SAAoB;AAAA,MACxB,GAAG;AAAA,MACH,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,mBAAmB,KAAK,QAAQ,aAAa,WAAW,KAAK,KAAK,CAAC,eAAe,EAAE,gBAAgB,WAAW,KAAK,CAAC;AAAA,MAC3H,UAAU;AAAA,MACV,SAAS;AAAA,QACP,GAAI,OAAO,CAAC,EAAE,IAAI,QAAQ,OAAO,iBAAiB,QAAQ,OAAgB,OAAO,MAAM,SAAS,UAAmB,CAAC,IAAI,CAAC;AAAA,QACzH,EAAE,IAAI,UAAU,OAAO,QAAQ,QAAQ,WAAoB,SAAS,OAAQ,cAAyB,UAAoB;AAAA,MAC3H;AAAA,IACF;AACA,QAAI;AACF,aAAO,WAAW;AAAA,QAChB,OAAO,SAAS;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU,CAAC,MAAM;AACf,cAAI,EAAE,WAAW,SAAS,CAAC,EAAE,MAAO,QAAO,IAAI,WAAW;AAC1D,cAAI,QAAQ,WAAY,SAAQ,WAAW,EAAE,KAAK;AAAA,cAC7C,UAAS,OAAO,EAAE,KAAK;AAAA,QAC9B;AAAA,QACA,SAAS,MAAM,IAAI,WAAW;AAAA,QAC9B;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,MAAiB,cAAsB;AAC5D,UAAM,WAAW,KAAK,QAAQ,YAAY;AAC1C,SAAK,eAAe,MAAM,OAAO,EAAE,UAAU,eAAe,KAAK,CAAC;AAClE,QAAI,aAAa,gBAAiB,QAAO,OAAO,MAAM,MAAM,IAAI;AAChE,QAAI,aAAa,YAAa,QAAO,IAAI,SAAS;AAElD,UAAM,YAAY,QAAQ;AAC1B,QAAI,YAAY,EAAG,QAAO,SAAS,GAAG,CAAC;AACvC,QAAI,aAAa,MAAO,QAAO,IAAI,WAAW;AAC9C,aAAS,WAAW,SAAS;AAAA,EAC/B;AAEA,WAAS,SAAS,GAAW,YAAoB,GAAS;AACxD,QAAI,MAAO;AACX,cAAU;AACV,QAAI,IAAI,EAAG,KAAI;AACf,QAAI,KAAK,MAAO,QAAO,IAAI,WAAW;AACtC,YAAQ;AACR,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,MAAM,OAAO;AACnB,QAAI,KAAK,aAAa,KAAK,UAAU,MAAM,UAAU,OAAO,KAAC,+BAAc,KAAK,WAAW,GAAG,GAAG;AAC/F,YAAM,YAAY,IAAI;AACtB,UAAI,aAAa,MAAO,QAAO,IAAI,WAAW;AAC9C,UAAI,YAAY,EAAG;AACnB,aAAO,SAAS,WAAW,SAAS;AAAA,IACtC;AACA,QAAI;AACF,cAAQ,aAAa,KAAK,EAAE;AAAA,IAC9B,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AACA,QAAI,KAAK,OAAO,CAAC,WAAW,KAAK,KAAK,WAAW,CAAC,GAAG;AACnD,eAAS;AACT,qBAAe;AACf,UAAI,QAAQ,cAAc;AACxB,cAAM,IAAI,WAAW,MAAM,cAAc,IAAI,GAAG,QAAQ,oBAAoB,IAAI;AAChF,qBAAa,KAAK,MAAM,aAAa,CAAC,CAAC;AAAA,MACzC;AACA;AAAA,IACF;AACA,mBAAe;AACf,QAAI,eAAe,IAAI,KAAK,KAAK,QAAQ;AACvC,eAAS;AACT,YAAM,KAAK,IAAI,gBAAgB;AAC/B,mBAAa,KAAK,MAAM,GAAG,MAAM,CAAC;AAClC,YAAM,YAAY,KAAK,OAAO,aAAa,SAAS,IAAI,KAAK,OAAO;AACpE,oBAAc,KAAK,QAAQ,EAAE,WAAW,QAAQ,GAAG,QAAQ,MAAM,IAAI,CAAC,EACnE,KAAK,CAACA,QAAO;AACZ,YAAI,GAAG,OAAO,WAAW,MAAO;AAChC,eAAO,MAAMA,GAAE;AAAA,MACjB,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,YAAI,GAAG,OAAO,WAAW,MAAO;AAChC,YAAI,OAAQ,IAAc,SAAS,aAAc;AACjD,sBAAc,MAAM,SAAS;AAAA,MAC/B,CAAC;AACH;AAAA,IACF;AACA,WAAO,MAAM,IAAI;AAAA,EACnB;AAEA,QAAM,aAA8B;AAAA,IAClC;AAAA,IACA,QAAQ;AACN,UAAI,WAAW,OAAQ;AACvB,YAAM,UAAU,IAAI;AACpB,UAAI,WAAW,YAAY,IAAI,QAAQ,QAAQ,OAAO,eAAgB,iBAAgB;AACtF,WAAK,cAAc;AACnB,UAAI,UAAU,EAAG,QAAO,IAAI,WAAW;AACvC,UAAI,aAAa,QAAQ,cAAc,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ,WAAW,IAAI;AAC9F,UAAI,aAAa,EAAG,cAAa;AACjC,eAAS,YAAY,CAAC;AAAA,IACxB;AAAA,IACA,OAAO;AACL,UAAI,SAAS,QAAQ,EAAG;AACxB,mBAAa;AACb,aAAO;AAAA,IACT;AAAA,IACA,OAAO;AACL,UAAI,MAAO;AACX,YAAM,OAAO,QAAQ,IAAI;AACzB,UAAI,QAAQ,MAAM;AAChB,YAAI,QAAQ,EAAG,UAAS,QAAQ,GAAG,EAAE;AACrC;AAAA,MACF;AACA,eAAS,MAAM,EAAE;AAAA,IACnB;AAAA,IACA,KAAK,QAAgB;AACnB,YAAM,IAAI,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,MAAM;AAChD,UAAI,KAAK,KAAK,CAAC,OAAO;AACpB,YAAI,SAAS,EAAG,SAAQ,KAAK,KAAK;AAClC,iBAAS,GAAG,CAAC;AAAA,MACf;AAAA,IACF;AAAA,IACA,SAAS,MAAM,IAAI,WAAW;AAAA,IAC9B,WAAW;AACT,mBAAa;AACb,UAAI,WAAW;AAAA,IACjB;AAAA,IACA,MAAM,MAAM,IAAI,SAAS;AAAA,IACzB,SAAS;AACP,UAAI,MAAO;AACX,UAAI,WAAW,iBAAiB,gBAAgB,GAAG;AACjD,iBAAS,cAAc,CAAC;AACxB;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,KAAK;AACxB,UAAI,MAAM,OAAO,WAAW,aAAa,CAAC,WAAW,KAAK,KAAK,WAAW,CAAC,EAAG,UAAS,OAAO,CAAC;AAAA,IACjG;AAAA,IACA,UAAU;AACR,UAAI,MAAO;AACX,cAAQ;AACR,gBAAU;AACV,eAAS;AACT,aAAO,QAAQ;AACf,cAAQ;AACR,UAAI;AACF,gBAAQ,QAAQ,WAAW;AAAA,MAC7B,SAAS,KAAK;AACZ,gBAAQ,GAAG;AAAA,MACb;AAAA,IACF;AAAA,IACA,UAAU,OAAO,EAAE,QAAQ,QAAQ,MAAM,KAAK,GAAG,MAAM,MAAM,WAAW,OAAO,MAAM;AAAA,EACvF;AACA,SAAO;AACT;;;ACzgBA,IAAAC,kBAAoC;AAkC7B,SAAS,gBAAgB,SAAkD;AAChF,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAM,MAAM,MAAM;AAClB,MAAI,WAA8B,QAAQ,YAAY,EAAE,kBAAkB,CAAC,EAAE;AAC7E,MAAI,OAAO,QAAQ,QAAQ,OAAO;AAClC,QAAM,MAAM,SAAS,OAAO,QAAQ;AAEpC,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,YAAY;AACjB,QAAM,WAAW,IAAI,cAAc,QAAQ;AAC3C,WAAS,OAAO;AAChB,WAAS,YAAY,cAAc,GAAG;AACtC,WAAS,aAAa,iBAAiB,OAAO;AAC9C,QAAM,OAAO,IAAI,cAAc,MAAM;AACrC,OAAK,YAAY;AACjB,QAAM,QAAQ,IAAI,cAAc,MAAM;AACtC,QAAM,YAAY;AAClB,OAAK,YAAY,KAAK;AACtB,WAAS,YAAY,IAAI;AACzB,QAAM,QAAQ,IAAI,cAAc,MAAM;AACtC,QAAM,cAAc,OAAO;AAC3B,WAAS,YAAY,KAAK;AAE1B,QAAM,QAAQ,IAAI,cAAc,KAAK;AACrC,QAAM,YAAY,WAAW,GAAG;AAChC,QAAM,aAAa,QAAQ,QAAQ;AACnC,QAAM,aAAa,cAAc,OAAO,aAAa;AACrD,QAAM,SAAS;AAEf,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,YAAY;AACjB,QAAM,QAAQ,IAAI,cAAc,IAAI;AACpC,QAAM,YAAY;AAClB,QAAM,cAAc,OAAO;AAC3B,QAAM,MAAM,IAAI,cAAc,GAAG;AACjC,MAAI,YAAY;AAChB,QAAM,MAAM,IAAI,cAAc,KAAK;AACnC,MAAI,YAAY;AAChB,QAAM,OAAO,IAAI,cAAc,MAAM;AACrC,MAAI,YAAY,IAAI;AACpB,QAAM,QAAQ,IAAI,cAAc,QAAQ;AACxC,QAAM,OAAO;AACb,QAAM,YAAY;AAClB,QAAM,cAAc;AACpB,QAAM,aAAa,cAAc,oBAAoB;AACrD,OAAK,OAAO,OAAO,KAAK,KAAK,KAAK;AAClC,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,YAAY;AACjB,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,YAAY;AACjB,QAAM,OAAO,MAAM,MAAM,IAAI;AAC7B,OAAK,OAAO,UAAU,KAAK;AAC3B,QAAM,YAAY,IAAI;AAEtB,QAAM,UAAU,CAAC,MAAe;AAC9B,WAAO;AACP,UAAM,SAAS,CAAC;AAChB,aAAS,aAAa,iBAAiB,OAAO,CAAC,CAAC;AAChD,QAAI,GAAG;AACL,OAAC,MAAM,cAA2B,yBAAyB,KAAK,OAAO,QAAQ,EAAE,eAAe,KAAK,CAAC;AACtG,cAAQ,SAAS;AAAA,IACnB,MAAO,SAAQ,UAAU;AAAA,EAC3B;AAEA,QAAM,cAAc,MAAM;AACxB,UAAM,OAAO,IAAI,IAAI,SAAS,gBAAgB;AAC9C,UAAM,YAAY,OAAO,MAAM,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE;AAC7D,UAAM,MAAM,OAAO,MAAM,SAAS,KAAK,MAAO,YAAY,OAAO,MAAM,SAAU,GAAG,IAAI;AACxF,UAAM,cAAc,GAAG,SAAS,IAAI,OAAO,MAAM,MAAM;AACvD,aAAS,MAAM,YAAY,WAAW,GAAG,GAAG,GAAG;AAC/C,aAAS,aAAa,cAAc,GAAG,OAAO,aAAa,KAAK,SAAS,OAAO,OAAO,MAAM,MAAM,kBAAkB;AACrH,QAAI,cAAc,GAAG,SAAS,OAAO,OAAO,MAAM,MAAM;AACxD,SAAK,MAAM,QAAQ,GAAG,GAAG;AACzB,QAAI,aAAa,QAAQ,aAAa;AACtC,QAAI,aAAa,iBAAiB,OAAO,GAAG,CAAC;AAC7C,QAAI,aAAa,iBAAiB,GAAG;AACrC,QAAI,aAAa,iBAAiB,KAAK;AACvC,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,UAAM,eAAW,qCAAoB,QAAQ,QAAQ;AACrD,QAAI,UAAU;AACZ,YAAM,OAAO,IAAI,cAAc,KAAK;AACpC,WAAK,YAAY;AACjB,YAAM,IAAI,IAAI,cAAc,IAAI;AAChC,QAAE,YAAY;AACd,QAAE,cAAc,OAAO;AACvB,YAAM,IAAI,IAAI,cAAc,KAAK;AACjC,QAAE,YAAY;AACd,uBAAiB,GAAG,OAAO,cAAc;AACzC,WAAK,OAAO,GAAG,CAAC;AAChB,WAAK,YAAY,IAAI;AAAA,IACvB;AACA,UAAM,OAAO,IAAI,cAAc,KAAK;AACpC,SAAK,aAAa,QAAQ,MAAM;AAChC,QAAI,SAAS;AACb,WAAO,MAAM,QAAQ,CAAC,MAAM,MAAM;AAChC,YAAM,SAAS,KAAK,IAAI,KAAK,EAAE;AAC/B,YAAM,MAAM,IAAI,cAAc,QAAQ;AACtC,UAAI,OAAO;AACX,UAAI,YAAY,SAAS,SAAS,YAAY,EAAE;AAChD,UAAI,aAAa,QAAQ,UAAU;AACnC,UAAI,aAAa,gBAAgB,KAAK,EAAE;AACxC,UAAI,aAAa,gBAAgB,OAAO,MAAM,CAAC;AAC/C,UAAI,OAAO,WAAW,UAAU,CAAC,QAAQ;AACvC,YAAI,WAAW;AACf,YAAI,QAAQ;AAAA,MACd;AACA,UAAI,OAAO,WAAW,CAAC,OAAQ,UAAS;AACxC,YAAM,QAAQ,IAAI,cAAc,MAAM;AACtC,YAAM,YAAY;AAClB,YAAM,aAAa,eAAe,MAAM;AACxC,YAAM,cAAc,SAAS,WAAM;AACnC,YAAM,OAAO,IAAI,cAAc,MAAM;AACrC,YAAM,KAAK,IAAI,cAAc,KAAK;AAClC,SAAG,YAAY;AACf,SAAG,cAAc,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK;AACxC,WAAK,YAAY,EAAE;AACnB,UAAI,KAAK,aAAa;AACpB,cAAM,KAAK,IAAI,cAAc,KAAK;AAClC,WAAG,YAAY;AACf,WAAG,cAAc,KAAK;AACtB,aAAK,YAAY,EAAE;AAAA,MACrB;AACA,UAAI,OAAO,OAAO,IAAI;AACtB,UAAI,iBAAiB,SAAS,MAAM,QAAQ,cAAc,IAAI,CAAC;AAC/D,WAAK,YAAY,GAAG;AAAA,IACtB,CAAC;AACD,SAAK,YAAY,IAAI;AACrB,QAAI,OAAO,aAAa;AACtB,YAAM,UAAU,IAAI,cAAc,QAAQ;AAC1C,cAAQ,OAAO;AACf,cAAQ,YAAY;AACpB,cAAQ,cAAc,WAAW,UAAU;AAC3C,cAAQ,iBAAiB,SAAS,MAAM,QAAQ,YAAY,CAAC;AAC7D,WAAK,YAAY,OAAO;AAAA,IAC1B;AAAA,EACF;AAEA,WAAS,iBAAiB,SAAS,MAAM,QAAQ,CAAC,IAAI,CAAC;AACvD,QAAM,iBAAiB,SAAS,MAAM,QAAQ,KAAK,CAAC;AACpD,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,YAAY,MAAM;AAC9B,QAAE,gBAAgB;AAClB,cAAQ,KAAK;AACb,eAAS,MAAM;AAAA,IACjB;AAAA,EACF;AACA,QAAM,iBAAiB,WAAW,KAAK;AACvC,cAAY;AACZ,MAAI,KAAM,SAAQ,IAAI;AAEtB,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,MAAM,QAAQ,IAAI;AAAA,IACxB,OAAO,MAAM,QAAQ,KAAK;AAAA,IAC1B,QAAQ,MAAM,QAAQ,CAAC,IAAI;AAAA,IAC3B,QAAQ,MAAM;AAAA,IACd,YAAY,GAAG;AACb,iBAAW;AACX,kBAAY;AAAA,IACd;AAAA,IACA,UAAU;AACR,YAAM,oBAAoB,WAAW,KAAK;AAC1C,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;;;ACtMA,IAAAC,kBAAyE;AAsBlE,SAAS,aAAa,SAA4C;AACvE,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAM,MAAM,MAAM;AAClB,QAAM,UAAyB,CAAC;AAChC,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,YAAY,oCAAoC,OAAO,QAAQ;AACpE,OAAK,aAAa,QAAQ,QAAQ;AAClC,OAAK,aAAa,cAAc,QAAQ,SAAS,QAAQ;AACzD,OAAK,WAAW;AAChB,QAAM,QAAQ,IAAI,cAAc,KAAK;AACrC,QAAM,YAAY;AAClB,OAAK,YAAY,KAAK;AACtB,MAAI,QAAQ,WAAW;AACrB,UAAM,QAAQ,IAAI,cAAc,QAAQ;AACxC,UAAM,OAAO;AACb,UAAM,YAAY;AAClB,UAAM,cAAc;AACpB,UAAM,aAAa,cAAc,cAAc;AAC/C,UAAM,iBAAiB,SAAS,MAAM,QAAQ,YAAY,CAAC;AAC3D,SAAK,YAAY,KAAK;AAAA,EACxB;AACA,QAAM,YAAY,IAAI;AAEtB,QAAM,OAAO,IAAI,cAAc,MAAM;AACrC,OAAK,aAAa;AAClB,QAAM,YAAY,IAAI;AACtB,QAAM,UAAU,IAAI,cAAc,KAAK;AACvC,UAAQ,YAAY;AACpB,UAAQ,aAAa,QAAQ,OAAO;AAEpC,QAAM,YAAY,CAAC,IAAY,MAAgC;AAC7D,QAAI,MAAM,UAAa,MAAM,MAAO,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAI,QAAO,QAAQ,EAAE;AAAA,QACrF,SAAQ,EAAE,IAAI;AACnB,YAAQ,WAAW,EAAE,GAAG,QAAQ,CAAC;AACjC,qBAAiB;AAAA,EACnB;AAEA,QAAM,cAAc,oBAAI,IAAyB;AAEjD,QAAM,eAAe,CAAC,GAAmB,KAAa,KAAa,WAAqB;AACtF,UAAM,OAAO,IAAI,cAAc,KAAK;AACpC,UAAM,MAAM,IAAI,cAAc,KAAK;AACnC,QAAI,YAAY;AAChB,QAAI,aAAa,QAAQ,YAAY;AACrC,QAAI,aAAa,cAAc,EAAE,KAAK;AACtC,aAAS,IAAI,KAAK,KAAK,KAAK,KAAK;AAC/B,YAAM,IAAI,IAAI,cAAc,QAAQ;AACpC,QAAE,OAAO;AACT,QAAE,cAAc,OAAO,CAAC;AACxB,QAAE,aAAa,gBAAgB,OAAO;AACtC,QAAE,iBAAiB,SAAS,MAAM;AAChC,YAAI,iBAAiB,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,gBAAgB,OAAO,CAAC;AACrF,UAAE,aAAa,gBAAgB,MAAM;AACrC,kBAAU,EAAE,IAAI,CAAC;AAAA,MACnB,CAAC;AACD,UAAI,YAAY,CAAC;AAAA,IACnB;AACA,SAAK,YAAY,GAAG;AACpB,QAAI,WAAW,EAAE,YAAY,EAAE,YAAY;AACzC,YAAM,IAAI,IAAI,cAAc,KAAK;AACjC,QAAE,YAAY;AACd,QAAE,OAAO,OAAO,OAAO,IAAI,cAAc,MAAM,GAAG,EAAE,aAAa,EAAE,YAAY,GAAG,CAAC,GAAG,OAAO,OAAO,IAAI,cAAc,MAAM,GAAG,EAAE,aAAa,EAAE,aAAa,GAAG,CAAC,CAAC;AAClK,WAAK,YAAY,CAAC;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,MAAmC;AACrD,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,eAAO,aAAa,GAAG,GAAG,IAAI,IAAI;AAAA,MACpC,KAAK;AACH,eAAO,aAAa,GAAG,GAAG,EAAE,YAAY,GAAG,IAAI;AAAA,MACjD,KAAK,UAAU;AACb,cAAM,MAAM,EAAE,YAAY;AAC1B,cAAM,MAAM,IAAI,cAAc,KAAK;AACnC,YAAI,YAAY;AAChB,YAAI,aAAa,QAAQ,YAAY;AACrC,YAAI,aAAa,cAAc,EAAE,KAAK;AACtC,cAAM,OAA4B,CAAC;AACnC,iBAAS,IAAI,GAAG,KAAK,KAAK,KAAK;AAC7B,gBAAM,IAAI,IAAI,cAAc,QAAQ;AACpC,YAAE,OAAO;AACT,YAAE,cAAc;AAChB,YAAE,aAAa,cAAc,GAAG,CAAC,OAAO,GAAG,EAAE;AAC7C,YAAE,aAAa,gBAAgB,OAAO;AACtC,YAAE,iBAAiB,SAAS,MAAM;AAChC,iBAAK,QAAQ,CAAC,GAAG,MAAM;AACrB,gBAAE,UAAU,OAAO,QAAQ,IAAI,CAAC;AAChC,gBAAE,aAAa,gBAAgB,OAAO,MAAM,IAAI,CAAC,CAAC;AAAA,YACpD,CAAC;AACD,sBAAU,EAAE,IAAI,CAAC;AAAA,UACnB,CAAC;AACD,eAAK,KAAK,CAAC;AACX,cAAI,YAAY,CAAC;AAAA,QACnB;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,UAAU;AACb,cAAM,MAAM,IAAI,cAAc,KAAK;AACnC,YAAI,YAAY;AAChB,YAAI,aAAa,QAAQ,YAAY;AACrC;AAAA,UACE,CAAC,MAAM,aAAM,WAAW;AAAA,UACxB,CAAC,QAAQ,aAAM,aAAa;AAAA,QAC9B,EAAE,QAAQ,CAAC,CAAC,KAAK,MAAM,GAAG,MAAM;AAC9B,gBAAM,IAAI,IAAI,cAAc,QAAQ;AACpC,YAAE,OAAO;AACT,YAAE,cAAc;AAChB,YAAE,aAAa,cAAc,GAAa;AAC1C,YAAE,aAAa,gBAAgB,OAAO;AACtC,YAAE,iBAAiB,SAAS,MAAM;AAChC,gBAAI,iBAAiB,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,gBAAgB,OAAO,CAAC;AACrF,cAAE,aAAa,gBAAgB,MAAM;AACrC,sBAAU,EAAE,IAAI,QAAQ,IAAI;AAAA,UAC9B,CAAC;AACD,cAAI,YAAY,CAAC;AAAA,QACnB,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,KAAK,mBAAmB;AACtB,cAAM,QAAQ,EAAE,SAAS;AACzB,cAAM,QAAQ,IAAI,cAAc,KAAK;AACrC,cAAM,aAAa,QAAQ,QAAQ,UAAU,YAAY;AACzD,cAAM,aAAa,cAAc,EAAE,KAAK;AACxC,UAAE,QAAQ,QAAQ,CAAC,QAAQ;AACzB,gBAAM,IAAI,IAAI,cAAc,QAAQ;AACpC,YAAE,OAAO;AACT,YAAE,YAAY,WAAW,QAAQ,aAAa,EAAE;AAChD,YAAE,aAAa,QAAQ,QAAQ,aAAa,OAAO;AACnD,YAAE,aAAa,gBAAgB,OAAO;AACtC,YAAE,aAAa,kBAAkB,IAAI,EAAE;AACvC,gBAAM,MAAM,IAAI,cAAc,MAAM;AACpC,cAAI,YAAY;AAChB,YAAE,OAAO,KAAK,OAAO,OAAO,IAAI,cAAc,MAAM,GAAG,EAAE,aAAa,IAAI,MAAM,CAAC,CAAC;AAClF,YAAE,iBAAiB,SAAS,MAAM;AAChC,gBAAI,OAAO;AACT,oBAAM,MAAM,IAAI,IAAK,QAAQ,EAAE,EAAE,KAA8B,CAAC,CAAC;AACjE,kBAAI,IAAI,IAAI,IAAI,EAAE,EAAG,KAAI,OAAO,IAAI,EAAE;AAAA,kBACjC,KAAI,IAAI,IAAI,EAAE;AACnB,gBAAE,aAAa,gBAAgB,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;AACtD,wBAAU,EAAE,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,YACjC,OAAO;AACL,oBAAM,iBAAiB,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,gBAAgB,OAAO,CAAC;AAC1F,gBAAE,aAAa,gBAAgB,MAAM;AACrC,wBAAU,EAAE,IAAI,IAAI,EAAE;AAAA,YACxB;AAAA,UACF,CAAC;AACD,gBAAM,YAAY,CAAC;AAAA,QACrB,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,SAAS;AACP,cAAM,KAAK,IAAI,cAAc,UAAU;AACvC,WAAG,YAAY;AACf,WAAG,OAAO;AACV,WAAG,cAAc,EAAE,eAAe;AAClC,WAAG,aAAa,cAAc,EAAE,KAAK;AACrC,WAAG,iBAAiB,SAAS,MAAM,UAAU,EAAE,IAAI,GAAG,MAAM,MAAM,GAAG,GAAI,CAAC,CAAC;AAC3E,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO,UAAU,QAAQ,CAAC,MAAM;AAC9B,UAAM,OAAO,IAAI,cAAc,KAAK;AACpC,SAAK,YAAY;AACjB,SAAK,aAAa,oBAAoB,EAAE,EAAE;AAC1C,UAAM,IAAI,IAAI,cAAc,GAAG;AAC/B,MAAE,YAAY;AACd,MAAE,cAAc,EAAE,SAAS,EAAE,WAAW,KAAK;AAC7C,SAAK,YAAY,CAAC;AAClB,QAAI,EAAE,aAAa;AACjB,YAAM,IAAI,IAAI,cAAc,GAAG;AAC/B,QAAE,YAAY;AACd,QAAE,cAAc,EAAE;AAClB,WAAK,YAAY,CAAC;AAAA,IACpB;AACA,SAAK,YAAY,WAAW,CAAC,CAAC;AAC9B,gBAAY,IAAI,EAAE,IAAI,IAAI;AAC1B,SAAK,YAAY,IAAI;AAAA,EACvB,CAAC;AAED,QAAM,SAAS,IAAI,cAAc,KAAK;AACtC,SAAO,YAAY;AACnB,QAAM,SAAS,IAAI,cAAc,QAAQ;AACzC,SAAO,OAAO;AACd,SAAO,YAAY;AACnB,SAAO,cAAc;AACrB,SAAO,YAAY,MAAM;AACzB,OAAK,YAAY,OAAO;AACxB,OAAK,YAAY,MAAM;AAEvB,WAAS,mBAAmB;AAC1B,WAAO,UAAU,QAAQ,CAAC,MAAM;AAC9B,YAAMC,MAAK,YAAY,IAAI,EAAE,EAAE;AAC/B,UAAI,CAACA,IAAI;AACT,YAAM,cAAU,mCAAkB,GAAG,OAAO;AAC5C,MAAAA,IAAG,SAAS,CAAC;AACb,UAAI,CAAC,WAAW,QAAQ,EAAE,EAAE,MAAM,OAAW,QAAO,QAAQ,EAAE,EAAE;AAAA,IAClE,CAAC;AAAA,EACH;AAEA,OAAK,iBAAiB,UAAU,CAAC,MAAM;AACrC,MAAE,eAAe;AACjB,UAAM,UAAU,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,gBAAY,mCAAkB,GAAG,OAAO,KAAK,QAAQ,EAAE,EAAE,MAAM,MAAS;AACzH,QAAI,QAAQ,QAAQ;AAClB,cAAQ,cAAc,kBAAkB,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;AAC9E,kBAAY,IAAI,QAAQ,CAAC,EAAG,EAAE,GAAG,cAA2B,iBAAiB,GAAG,MAAM;AACtF;AAAA,IACF;AACA,YAAQ,cAAc;AACtB,YAAQ,SAAS,EAAE,GAAG,QAAQ,CAAC;AAAA,EACjC,CAAC;AAED,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,YAAY,QAAQ,WAAW;AAC3C,QAAE,gBAAgB;AAClB,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AACA,OAAK,iBAAiB,WAAW,KAAK;AACtC,mBAAiB;AACjB,GAAC,KAAK,cAA2B,iBAAiB,KAAK,MAAM,QAAQ,EAAE,eAAe,KAAK,CAAC;AAE5F,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,YAAY,OAAO,EAAE,GAAG,QAAQ;AAAA,IAChC,eAAe;AACb,YAAM,cAAc;AACpB,YAAM,OAAO,IAAI,cAAc,KAAK;AACpC,WAAK,YAAY;AACjB,YAAM,IAAI,IAAI,cAAc,IAAI;AAChC,QAAE,YAAY;AACd,QAAE,cAAc,OAAO;AACvB,YAAM,IAAI,IAAI,cAAc,KAAK;AACjC,QAAE,YAAY;AACd,uBAAiB,GAAG,OAAO,YAAY;AACvC,YAAM,OAAO,IAAI,cAAc,QAAQ;AACvC,WAAK,OAAO;AACZ,WAAK,YAAY;AACjB,WAAK,cAAc;AACnB,WAAK,MAAM,YAAY;AACvB,WAAK,iBAAiB,SAAS,MAAM,QAAQ,YAAY,CAAC;AAC1D,WAAK,OAAO,GAAG,GAAG,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,WAAK,QAAQ,EAAE,eAAe,KAAK,CAAC;AAAA,IACtC;AAAA,IACA,UAAU;AACR,WAAK,oBAAoB,WAAW,KAAK;AACzC,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;;;ACvRA,IAAAC,mBAA0E;;;ACA1E,IAAAC,kBAAmJ;AA4DnJ,IAAM,gBAAgB,oBAAI,IAAI,CAAC,QAAQ,SAAS,WAAW,cAAc,CAAC;AAGnE,SAAS,eAAe,QAA6C,SAAyD;AACnI,MAAI,CAAC,WAAW,CAAC,OAAQ,QAAO;AAChC,SAAO,OAAO,KAAK,CAAC,OAAO,EAAE,QAAQ,WAAW,EAAE,OAAO,YAAY,cAAc,IAAI,EAAE,IAAI,CAAC,KAAK;AACrG;AAMO,SAAS,UAAU,KAAe,MAAc,OAAe,SAA6B,QAAoB,QAAkC;AACvJ,QAAM,OAAO,SAAS,KAAK,MAAM,OAAO,OAAO;AAC/C,OAAK,iBAAiB,SAAS,MAAM;AACrC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,MAAM,GAAG,KAAK,OAAO,UAAU;AACrC,QAAM,IAAI,GAAG,KAAK,UAAU,mCAAmC,gBAAW;AAC1E,IAAE,OAAO;AACT,IAAE,aAAa,cAAc,YAAY,KAAK,EAAE;AAChD,IAAE,iBAAiB,SAAS,MAAM;AAClC,MAAI,OAAO,MAAM,CAAC;AAClB,SAAO;AACT;AAMO,SAAS,cAAc,MAAmB,KAAe,UAAoC,OAAoC;AACtI,aAAW,KAAK,MAAM,KAAK,KAAK,iBAAoC,YAAY,mCAAmB,IAAI,CAAC,GAAG;AACzG,UAAM,UAAM,mCAAkB,EAAE,aAAa,MAAM,CAAC;AACpD,UAAM,SAAS,EAAE,QAAQ,cAAc,KAAK;AAC5C,QAAI,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG;AAE1B,UAAI,WAAW,EAAG,QAAO,OAAO;AAAA,UAC3B,GAAE,YAAY,IAAI,eAAe,EAAE,eAAe,EAAE,CAAC;AAC1D;AAAA,IACF;AACA,UAAM,IAAI,GAAG,KAAK,UAAU,qCAAqC,WAAM,EAAE,eAAe,IAAI,KAAK,KAAK,SAAS,EAAE;AACjH,MAAE,OAAO;AACT,MAAE,iBAAiB,SAAS,MAAM,MAAM,GAAG,CAAC;AAC5C,MAAE,YAAY,CAAC;AAAA,EACjB;AACF;AAgBO,SAAS,GAA0C,KAAe,KAAQ,KAAc,MAAyC;AACtI,QAAM,IAAI,IAAI,cAAc,GAAG;AAC/B,MAAI,IAAK,GAAE,YAAY;AACvB,MAAI,QAAQ,KAAM,GAAE,cAAc;AAClC,SAAO;AACT;AAEO,SAAS,SAAS,KAAe,MAAc,OAAe,SAAqC;AACxG,QAAM,IAAI,GAAG,KAAK,UAAU,WAAW;AACvC,IAAE,OAAO;AACT,QAAM,IAAI,GAAG,KAAK,QAAQ,aAAa,IAAI;AAC3C,IAAE,aAAa,eAAe,MAAM;AACpC,QAAM,OAAO,GAAG,KAAK,MAAM;AAC3B,OAAK,YAAY,GAAG,KAAK,OAAO,cAAc,KAAK,CAAC;AACpD,MAAI,QAAS,MAAK,YAAY,GAAG,KAAK,OAAO,YAAY,OAAO,CAAC;AACjE,IAAE,OAAO,GAAG,IAAI;AAChB,SAAO;AACT;AAKO,SAAS,eAAe,SAAoC;AACjE,QAAM,EAAE,IAAI,IAAI;AAChB,MAAI,QAAQ;AACZ,MAAI,gBAAyC,CAAC;AAC9C,MAAI,YAAY;AAChB,MAAI,UAAU;AACd,MAAI,SAA8D;AAClE,QAAM,YAAY,CAAC,SAAwB;AACzC,UAAM,MAAM,CAAC,CAAC;AACd,aAAS;AACT,QAAI,QAAQ,CAAC,CAAC,KAAM,SAAQ,kBAAkB,CAAC,CAAC,IAAI;AAAA,EACtD;AAEA,QAAM,OAAO,GAAG,KAAK,OAAO,QAAQ;AACpC,QAAM,aAAa,GAAG,KAAK,OAAO,aAAa;AAC/C,QAAM,QAAQ,GAAG,KAAK,SAAS,SAAS;AACxC,QAAM,OAAO;AACb,QAAM,cAAc;AACpB,QAAM,aAAa,cAAc,sBAAsB;AACvD,aAAW,YAAY,KAAK;AAC5B,QAAM,OAAO,GAAG,KAAK,OAAO,cAAc;AAC1C,OAAK,OAAO,YAAY,IAAI;AAE5B,QAAM,UAAU,CAAC,MAAiD,OAAO,EAAE,SAAS,YAAY,CAAC,EAAE;AACnG,QAAM,YAAY,CAAC,QAAgB,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,eAAe,QAAQ,SAAS,GAAG,GAAG;AACjG,QAAM,SAAS,CAAC,QAAgB,QAAQ,WAAW,eAAe,QAAQ,SAAS,GAAG,GAAG,GAAG,OAAO,GAAG;AAEtG,QAAM,cAAc,CAAC,YAA2B;AAC9C,QAAI,QAAQ,aAAa;AACvB,aAAO,KAAK,QAAQ,aAAa,UAAU,qBAAqB;AAChE,UAAI,QAAQ,OAAO,EAAG,SAAQ,gBAAgB,OAAO;AACrD;AAAA,IACF;AACA,UAAM,MAAM,EAAE;AACd,QAAI,QAAQ,OAAO,KAAK,CAAC,QAAQ,aAAa;AAC5C,gBAAU,EAAE,SAAS,SAAS,MAAM,CAAC;AACrC,UAAI,QAAQ,OAAO,EAAG,SAAQ,gBAAgB,OAAO;AACrD,aAAO,OAAO;AAAA,IAChB;AACA,cAAU,EAAE,SAAS,SAAS,KAAK,CAAC;AACpC,WAAO;AACP,YACG,YAAY,QAAQ,EAAE,EACtB,KAAK,CAAC,SAAS;AACd,UAAI,QAAQ,WAAW,CAAC,OAAQ;AAChC,gBAAU,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,MAAM,GAAG,GAAG,SAAS,MAAM,CAAC;AACvE,UAAI,KAAM,SAAQ,gBAAgB,IAAI;AACtC,aAAO;AAAA,IACT,CAAC,EACA,MAAM,MAAM;AACX,UAAI,QAAQ,WAAW,CAAC,OAAQ;AAChC,gBAAU,EAAE,SAAS,EAAE,GAAG,SAAS,MAAM,GAAG,GAAG,SAAS,MAAM,CAAC;AAC/D,aAAO;AAAA,IACT,CAAC;AAAA,EACL;AAEA,QAAM,gBAAgB,CAAC,EAAE,SAAS,QAAQ,MAAkC;AAC1E,UAAM,OAAO,GAAG,KAAK,OAAO,cAAc;AAC1C,UAAM,OAAO,GAAG,KAAK,UAAU,8BAA8B,aAAQ;AACrE,SAAK,OAAO;AACZ,SAAK,iBAAiB,SAAS,MAAM;AACnC;AACA,gBAAU,IAAI;AACd,aAAO;AAAA,IACT,CAAC;AACD,UAAM,QAAQ,GAAG,KAAK,MAAM,WAAW,QAAQ,KAAK;AACpD,UAAM,UAAU,GAAG,KAAK,OAAO,QAAQ;AACvC,QAAI,QAAS,SAAQ,YAAY,GAAG,KAAK,OAAO,cAAc,eAAU,CAAC;AAAA,aAChE,QAAQ,MAAM;AACrB,uBAAiB,SAAS,QAAQ,IAAI;AACtC,wBAAkB,SAAS,GAAG;AAC9B,oBAAc,SAAS,KAAK,WAAW,MAAM;AAAA,IAC/C,MACK,SAAQ,YAAY,GAAG,KAAK,OAAO,cAAc,kCAAkC,CAAC;AACzF,SAAK,OAAO,MAAM,OAAO,OAAO;AAChC,SAAK,YAAY,IAAI;AACrB,SAAK,QAAQ,EAAE,eAAe,KAAK,CAAC;AAAA,EACtC;AAEA,QAAM,UAAU,CAAC,OAAe,QAAQ,MAAM;AAC5C,UAAM,IAAI,KAAK,YAAY,GAAG,KAAK,OAAO,gBAAgB,KAAK,CAAC;AAChE,QAAI,MAAO,GAAE,QAAQ,QAAQ,OAAO,KAAK;AACzC,WAAO;AAAA,EACT;AACA,QAAM,gBAAgB,CAAC,MAAqB;AAC1C,UAAM,MAAM,EAAE,cAAc,KAAK,SAAS;AAC1C,UAAM,UAAU,EAAE,WAAY,EAAE,UAAU,cAAW,EAAE,OAAO,KAAK,UAAW,EAAE;AAChF,SAAK,YAAY,UAAU,KAAK,EAAE,WAAW,WAAM,aAAM,EAAE,OAAO,SAAS,MAAM,YAAY,CAAC,GAAG,MAAM,MAAM,OAAO,GAAG,IAAI,MAAS,CAAC;AAAA,EACvI;AAEA,WAAS,SAAS;AAChB,SAAK,cAAc;AACnB,QAAI,OAAQ,QAAO,cAAc,MAAM;AACvC,UAAM,OAAO,QAAQ,KAAK;AAC1B,UAAM,SAAS,QAAQ,cAAc,KAAK,CAAC;AAC3C,eAAW,SAAS,CAAC,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,SAAS,QAAQ;AACrE,UAAM,eAAW,wCAAuB,KAAK,aAAa,KAAK,UAAU,MAAM;AAC/E,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,QAAI,GAAG;AAEL,YAAM,gBAAgB,KAAK,eAAe,CAAC,GAAG,OAAO,CAAC,UAAM,kCAAiB,EAAE,MAAM,CAAC,KAAK,eAAe,QAAQ,SAAS,KAAK,KAAK,aAAa,EAAE,EAAE,CAAC;AACvJ,UAAI,aAAa,QAAQ;AACvB,gBAAQ,iBAAiB,aAAa,MAAM,GAAG;AAC/C,mBAAW,KAAK,aAAc,MAAK,YAAY,UAAU,KAAK,UAAK,EAAE,MAAM,yBAAyB,MAAM,QAAQ,eAAe,EAAE,EAAE,CAAC,CAAC;AAAA,MACzI;AAAA,IACF;AACA,SAAK,OAAO,GAAI,QAAQ,QAAQ,CAAC,KAAK,CAAC,CAAE;AACzC,QAAI,GAAG;AACL,YAAM,UAAU,SAAS,QAAQ,CAAC,MAAM,EAAE,QAAQ;AAClD,YAAM,QAAQ,QAAQ,OAAO,CAAC,UAAM,kCAAiB,GAAG,EAAE,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC;AAClF,YAAM,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAE3C,YAAM,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AACvG,YAAM,SAA0B,CAAC,GAAG,OAAO,GAAG,cAAc,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,SAAK,iCAAgB,KAAK,aAAa,GAAG,MAAM,CAAC,CAAC;AAC/J,cAAQ,YAAY,OAAO,MAAM,GAAG;AACpC,UAAI,CAAC,OAAO,OAAQ,MAAK,YAAY,GAAG,KAAK,OAAO,cAAc,gCAAgC,CAAC;AACnG,aAAO,QAAQ,aAAa;AAC5B;AAAA,IACF;AACA,QAAI,KAAK,WAAW,MAAM,QAAQ;AAChC,cAAQ,KAAK,UAAU,KAAK;AAC5B,YAAM,QAAQ,EAAE,OAAO,UAAK,OAAO,UAAK,SAAS,YAAK;AACtD,WAAK,UAAU,MAAM,QAAQ,CAAC,SAAS;AACrC,cAAM,IAAI,SAAS,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,OAAO;AAClE,UAAE,iBAAiB,SAAS,KAAK,GAAG;AACpC,aAAK,YAAY,CAAC;AAAA,MACpB,CAAC;AAAA,IACH;AACA,UAAM,YAAwD;AAAA,MAC5D,QAAQ,MAAM;AAAA,MAAC;AAAA,MACf,eAAe,MAAM;AACnB,YAAI,CAAC,KAAK,eAAe,OAAQ;AACjC,gBAAQ,iCAAiB,aAAa;AACtC,cAAM,OAAO,KAAK,sBAAsB,KAAK,MAAM,KAAK,mBAAmB,IAAI;AAC/E,aAAK,cAAc,MAAM,GAAG,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,YAAY,iBAAiB,GAAG,OAAO,MAAM,IAAI,KAAK,KAAK,MAAM,EAAE,WAAW,IAAI,IAAI,CAAC,CAAC;AAAA,MAC9I;AAAA,MACA,QAAQ,MAAM;AACZ,YAAI,CAAC,KAAK,aAAa,OAAQ;AAC/B,gBAAQ,aAAa;AACrB,aAAK,YAAY,QAAQ,CAAC,MAAM;AAC9B,gBAAM,IAAI,SAAS,KAAK,UAAK,EAAE,MAAM,aAAa;AAClD,YAAE,iBAAiB,SAAS,MAAM,QAAQ,eAAe,EAAE,EAAE,CAAC;AAC9D,eAAK,YAAY,CAAC;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,MACA,YAAY,MAAM;AAChB,YAAI,CAAC,KAAK,YAAY,OAAQ;AAC9B,gBAAQ,YAAY;AACpB,aAAK,WAAW,QAAQ,CAAC,MAAM;AAC7B,gBAAM,IAAI,SAAS,KAAK,UAAK,EAAE,MAAM,gBAAgB;AACrD,YAAE,iBAAiB,SAAS,MAAM,QAAQ,kBAAkB,EAAE,EAAE,CAAC;AACjE,eAAK,YAAY,CAAC;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,MACA,UAAU,MAAM;AAEd,mBAAW,KAAK,UAAU;AACxB,kBAAQ,EAAE,aAAa,EAAE,KAAK,KAAK,UAAK,IAAI,YAAY,EAAE,KAAK;AAC/D,YAAE,SAAS,QAAQ,aAAa;AAAA,QAClC;AAAA,MACF;AAAA,MACA,MAAM,MAAM;AACV,YAAI,CAAC,KAAK,MAAM,OAAQ;AACxB,gBAAQ,KAAK;AACb,aAAK,KAAK,QAAQ,CAAC,MAAM;AACvB,gBAAM,IAAI,SAAS,KAAK,KAAK,EAAE,QAAQ;AACvC,YAAE,aAAa,iBAAiB,OAAO;AACvC,gBAAM,IAAI,GAAG,KAAK,OAAO,SAAS;AAClC,YAAE,KAAK,SAAS,EAAE,EAAE;AACpB,YAAE,aAAa,iBAAiB,EAAE,EAAE;AACpC,2BAAiB,GAAG,EAAE,MAAM;AAC5B,YAAE,SAAS;AACX,YAAE,iBAAiB,SAAS,MAAM;AAChC,cAAE,SAAS,CAAC,EAAE;AACd,cAAE,aAAa,iBAAiB,OAAO,CAAC,EAAE,MAAM,CAAC;AAAA,UACnD,CAAC;AACD,eAAK,OAAO,GAAG,CAAC;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,MACA,OAAO,MAAM;AACX,YAAI,CAAC,KAAK,OAAO,OAAQ;AACzB,gBAAQ,OAAO;AACf,aAAK,MAAM,QAAQ,CAAC,MAAM;AACxB,gBAAM,IAAI,GAAG,KAAK,KAAK,WAAW;AAClC,YAAE,OAAO,EAAE;AACX,YAAE,SAAS;AACX,YAAE,MAAM;AACR,gBAAM,IAAI,GAAG,KAAK,QAAQ,aAAa,QAAG;AAC1C,YAAE,aAAa,eAAe,MAAM;AACpC,YAAE,OAAO,GAAG,GAAG,KAAK,QAAQ,cAAc,EAAE,KAAK,CAAC;AAClD,YAAE,aAAa,cAAc,GAAG,EAAE,KAAK,uBAAuB;AAC9D,eAAK,YAAY,CAAC;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AACA,eAAW,MAAM,KAAK,WAAW,8BAAe,WAAU,EAAE,IAAI;AAChE,QAAI,CAAC,KAAK,WAAW,OAAQ,MAAK,YAAY,GAAG,KAAK,OAAO,cAAc,mBAAmB,CAAC;AAAA,EACjG;AAGA,WAAS,iBAAiB,GAA+B,QAA8B;AACrF,UAAM,OAAO,GAAG,KAAK,WAAW,YAAY,SAAS,sBAAsB,EAAE,EAAE;AAC/E,UAAM,OAAO,GAAG,KAAK,OAAO,gBAAgB;AAC5C,UAAM,QAAQ,GAAG,KAAK,MAAM,mBAAmB,EAAE,KAAK;AACtD,SAAK,YAAY,KAAK;AACtB,QAAI,QAAQ;AACV,YAAM,MAAM,GAAG,KAAK,QAAQ,iBAAiB,KAAK;AAClD,WAAK,YAAY,GAAG;AAAA,IACtB;AACA,UAAM,OAAO,GAAG,KAAK,QAAQ,gBAAgB;AAC7C,SAAK,WAAW,EAAE;AAClB,QAAI;AACF,WAAK,cAAc,IAAI,KAAK,EAAE,WAAW,EAAE,mBAAmB,QAAW,EAAE,MAAM,WAAW,OAAO,SAAS,KAAK,UAAU,CAAC;AAAA,IAC9H,QAAQ;AACN,WAAK,cAAc,EAAE,YAAY,MAAM,GAAG,EAAE;AAAA,IAC9C;AACA,SAAK,OAAO,MAAM,IAAI;AACtB,QAAI,EAAE,MAAM;AACV,YAAM,IAAI,GAAG,KAAK,OAAO,uBAAuB;AAChD,uBAAiB,GAAG,EAAE,IAAI;AAC1B,WAAK,YAAY,CAAC;AAAA,IACpB;AACA,UAAM,UAAU,GAAG,KAAK,OAAO,mBAAmB;AAClD,UAAM,QAAQ,EAAE,UAAU,eAAe,QAAQ,SAAS,GAAG,EAAE,OAAO,IAAI;AAC1E,QAAI,OAAO;AACT,YAAM,IAAI,GAAG,KAAK,UAAU,uBAAuB,EAAE,aAAa,SAAS;AAC3E,QAAE,OAAO;AACT,QAAE,iBAAiB,SAAS,MAAO,QAAQ,WAAW,QAAQ,SAAS,MAAM,GAAG,IAAI,QAAQ,eAAe,MAAM,EAAE,CAAE;AACrH,cAAQ,YAAY,CAAC;AAAA,IACvB;AACA,QAAI,EAAE,WAAW;AACf,YAAM,SAAS,QAAQ,KAAK,EAAE,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS;AACvE,UAAI,QAAQ;AACV,cAAM,IAAI,GAAG,KAAK,UAAU,yBAAyB,QAAQ,cAAc,EAAE,aAAa,WAAW;AACrG,UAAE,OAAO;AACT,UAAE,iBAAiB,SAAS,MAAM,YAAY,MAAM,CAAC;AACrD,gBAAQ,YAAY,CAAC;AAAA,MACvB;AAAA,IACF;AACA,QAAI,EAAE,OAAO,gBAAgB,KAAK,EAAE,GAAG,GAAG;AACxC,YAAM,IAAI,GAAG,KAAK,KAAK,oBAAoB,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,YAAY;AAC7G,QAAE,OAAO,EAAE;AACX,QAAE,SAAS;AACX,QAAE,MAAM;AACR,cAAQ,YAAY,CAAC;AAAA,IACvB;AACA,QAAI,QAAQ,WAAW,OAAQ,MAAK,YAAY,OAAO;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,WAAiD;AACrD,QAAM,UAAU,MAAM;AACpB,YAAQ,MAAM;AACd;AACA,cAAU,IAAI;AACd,WAAO;AACP,QAAI,SAAU,cAAa,QAAQ;AACnC,QAAI,CAAC,QAAQ,UAAU,CAAC,MAAM,KAAK,GAAG;AACpC,sBAAgB,CAAC;AACjB;AAAA,IACF;AACA,UAAM,MAAM,EAAE;AACd,eAAW,WAAW,MAAM;AAC1B,cACG,SAAS,MAAM,KAAK,CAAC,EACrB,KAAK,CAAC,YAAY;AACjB,YAAI,QAAQ,UAAW;AACvB,wBAAgB,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AACpD,eAAO;AAAA,MACT,CAAC,EACA,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnB,GAAG,GAAG;AAAA,EACR;AACA,QAAM,iBAAiB,SAAS,OAAO;AAEvC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,QAAQ;AACN;AACA,gBAAU,IAAI;AACd,cAAQ;AACR,YAAM,QAAQ;AACd,sBAAgB,CAAC;AAAA,IACnB;AAAA,IACA,YAAY,IAAY;AACtB,YAAM,SAAS,QAAQ,KAAK,EAAE,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,MAAM,IAAI,OAAO,WAAW,SAAS,IAAI,WAAW,IAAI,aAAa,KAAK;AACnJ,kBAAY,MAAM;AAAA,IACpB;AAAA,IACA,eAAe,MAAM,CAAC,CAAC;AAAA,IACvB,aAAa,MAAM,MAAM,QAAQ,EAAE,eAAe,KAAK,CAAC;AAAA,IACxD,SAAS,GAAW;AAClB,YAAM,QAAQ;AACd,cAAQ;AAAA,IACV;AAAA,IACA,UAAU;AACR,UAAI,SAAU,cAAa,QAAQ;AACnC,YAAM,oBAAoB,SAAS,OAAO;AAC1C,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;;;ADlZO,SAAS,qBAAqB,SAAsD;AACzF,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAM,MAAM,MAAM;AAClB,QAAM,SAAS,QAAQ,UAAU,CAAC;AAClC,MAAI,OAAO;AACX,QAAM,MAAM,SAAS,OAAO,SAAS,QAAQ;AAC7C,QAAM,OAAO,CAAC,QAAkB,IAAI,IAAI,CAAC,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,MAAmC,CAAC,CAAC,CAAC;AAE/I,QAAM,OAAO,GAAG,KAAK,OAAO,mBAAmB;AAC/C,QAAM,WAAW,GAAG,KAAK,UAAU,cAAc,GAAG,EAAE;AACtD,WAAS,OAAO;AAChB,WAAS,aAAa,iBAAiB,OAAO;AAC9C,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG;AACpC,SAAK,aAAa,eAAe,MAAM;AACvC,aAAS,YAAY,IAAI;AAAA,EAC3B;AACA,WAAS,YAAY,GAAG,KAAK,QAAQ,IAAI,OAAO,SAAS,SAAS,OAAO,KAAK,CAAC;AAC/E,WAAS,aAAa,cAAc,OAAO,SAAS,SAAS,OAAO,KAAK;AACzE,MAAI,QAAQ,aAAc,UAAS,SAAS;AAC5C,QAAM,QAAQ,GAAG,KAAK,QAAQ,kBAAkB;AAChD,QAAM,SAAS;AACf,WAAS,YAAY,KAAK;AAG1B,QAAM,UAAU,UACd,iCAAe,OAAO,OAAO,EAC1B,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,eAAe,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,YAAY,QAAQ,SAAS,EAAE,SAAS,EAAE,EACtH,IAAI,CAAC,MAAM,EAAE,EAA4B;AAC9C,QAAM,gBAAgB,MAAO,QAAQ,EAAE,SAAS,eAAe,QAAI,uCAAqB,OAAO,eAAe,QAAQ,cAAc,KAAK,CAAC,CAAC,IAAI,CAAC;AAChJ,QAAM,cAAc,MAAM;AACxB,UAAM,aAAS,sCAAoB,cAAc,GAAG,QAAQ,sBAAsB,CAAC;AACnF,UAAM,SAAS,WAAW;AAC1B,UAAM,cAAc,SAAS,IAAI,OAAO,OAAO,MAAM;AACrD,UAAM,QAAQ,OAAO,SAAS,SAAS,OAAO;AAC9C,aAAS,aAAa,cAAc,SAAS,GAAG,KAAK,KAAK,MAAM,cAAc,WAAW,IAAI,KAAK,GAAG,MAAM,KAAK;AAAA,EAClH;AACA,cAAY;AAEZ,QAAM,QAAQ,GAAG,KAAK,OAAO,WAAW,GAAG,EAAE;AAC7C,QAAM,aAAa,QAAQ,QAAQ;AACnC,QAAM,aAAa,cAAc,OAAO,KAAK;AAC7C,QAAM,SAAS;AACf,QAAM,OAAO,GAAG,KAAK,OAAO,cAAc;AAC1C,OAAK,YAAY,GAAG,KAAK,MAAM,iBAAiB,OAAO,KAAK,CAAC;AAC7D,QAAM,QAAQ,GAAG,KAAK,UAAU,WAAW,MAAG;AAC9C,QAAM,OAAO;AACb,QAAM,aAAa,cAAc,OAAO;AACxC,OAAK,YAAY,KAAK;AACtB,MAAI,aAA4B,QAAQ,sBAAsB,KAAK;AACnE,QAAM,OAAO,eAAe;AAAA,IAC1B;AAAA,IACA,MAAM,OAAO;AAAA,MACX,aAAa,OAAO;AAAA,MACpB,UAAU,OAAO;AAAA,MACjB,aAAa,KAAK,OAAO,mBAAmB;AAAA,MAC5C,YAAY,KAAK,OAAO,iBAAiB;AAAA,MACzC,MAAM,OAAO;AAAA,MACb,OAAO,OAAO;AAAA,MACd,eAAe,cAAc;AAAA,MAC7B,qBAAqB;AAAA,MACrB,SAAS,QAAQ;AAAA,IACnB;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,aAAa,QAAQ;AAAA,IACrB,aAAa,QAAQ;AAAA,IACrB,cAAc,QAAQ;AAAA,IACtB,iBAAiB,QAAQ;AAAA,IACzB,eAAe,QAAQ;AAAA,IACvB,QAAQ,MAAM;AAAA,IACd,UAAU,CAAC,QAAQ;AACjB,cAAQ,KAAK;AACb,cAAQ,eAAe,GAAG;AAAA,IAC5B;AAAA;AAAA,IAEA,iBAAiB,CAAC,YAAY,MAAM,UAAU,OAAO,mBAAmB,OAAO;AAAA,EACjF,CAAC;AACD,QAAM,OAAO,MAAM,KAAK,EAAE;AAC1B,OAAK,OAAO,UAAU,KAAK;AAC3B,QAAM,YAAY,IAAI;AAEtB,QAAM,UAAU,CAAC,MAAe;AAC9B,QAAI,SAAS,EAAG;AAChB,WAAO;AACP,UAAM,SAAS,CAAC;AAChB,aAAS,aAAa,iBAAiB,OAAO,CAAC,CAAC;AAChD,QAAI,GAAG;AAEL,mBAAa,QAAQ,sBAAsB,KAAK;AAChD,WAAK,OAAO;AACZ,WAAK,YAAY;AACjB,UAAI,cAAc,EAAE,QAAQ;AAC1B,gBAAQ,sBAAsB;AAC9B,oBAAY;AAAA,MACd;AACA,cAAQ,SAAS;AAAA,IACnB,OAAO;AACL,WAAK,MAAM;AACX,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AACA,WAAS,iBAAiB,SAAS,MAAM,QAAQ,CAAC,IAAI,CAAC;AACvD,QAAM,iBAAiB,SAAS,MAAM,QAAQ,KAAK,CAAC;AACpD,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,UAAU;AACtB,QAAE,gBAAgB;AAClB,cAAQ,KAAK;AACb,eAAS,MAAM;AAAA,IACjB;AAAA,EACF;AACA,QAAM,iBAAiB,WAAW,KAAK;AAEvC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,MAAM,QAAQ,IAAI;AAAA,IACxB,OAAO,MAAM,QAAQ,KAAK;AAAA,IAC1B,QAAQ,MAAM,QAAQ,CAAC,IAAI;AAAA,IAC3B,QAAQ,MAAM;AAAA,IACd,UAAU;AACR,WAAK,QAAQ;AACb,YAAM,oBAAoB,WAAW,KAAK;AAC1C,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;;;AE9IA,IAAM,kBAAkB;AAMjB,SAAS,eAAe,SAA6C;AAC1E,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,MAAM,IAAI,eAAe;AAC/B,QAAM,QAAQ,YAAY,MAAM,EAAE,OAAO,SAAS,WAAW,OAAO,GAAG,GAAG;AAC1E,QAAM,MAAM,IAAI,cAAc,KAAK;AACnC,MAAI,YAAY;AAChB,MAAI,aAAa,QAAQ,SAAS;AAClC,QAAM,MAAM,IAAI,cAAc,MAAM;AACpC,MAAI,YAAY;AAChB,QAAM,SAAS,IAAI,cAAc,MAAM;AACvC,SAAO,cAAc,QAAQ,WAAW;AACxC,QAAM,SAAS,IAAI,cAAc,MAAM;AACvC,SAAO,YAAY;AACnB,QAAM,OAAO,IAAI,cAAc,QAAQ;AACvC,OAAK,OAAO;AACZ,OAAK,YAAY;AACjB,OAAK,cAAc;AACnB,QAAM,OAAO,IAAI,cAAc,QAAQ;AACvC,OAAK,OAAO;AACZ,OAAK,YAAY;AACjB,OAAK,cAAc;AACnB,MAAI,OAAO,KAAK,QAAQ,QAAQ,MAAM,IAAI;AAC1C,QAAM,UAAU,IAAI,cAAc,KAAK;AACvC,UAAQ,YAAY;AACpB,UAAQ,SAAS;AACjB,QAAM,QAAQ,IAAI,cAAc,MAAM;AACtC,QAAM,YAAY;AAClB,UAAQ,YAAY,KAAK;AACzB,QAAM,GAAG,OAAO,KAAK,OAAO;AAE5B,MAAI,UAAU;AACd,MAAI,UAA0B;AAC9B,MAAI,UAAU;AAEd,QAAM,WAAW,CAACC,QAAwB;AACxC,UAAM,MAAMA,IAAG,QAAQ,YAAY;AACnC,UAAM,KAAKA,IAAG,KAAK,IAAIA,IAAG,EAAE,KAAK;AACjC,UAAM,OAAOA,IAAG,aAAa,WAAW,KAAKA,IAAG,aAAa,aAAa;AAC1E,UAAM,QAAQA,IAAG,eAAe,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE;AAC3E,WAAO,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,IAAI,IAAI,MAAM,EAAE,GAAG,OAAO,UAAK,IAAI,WAAM,EAAE;AAAA,EACzE;AAEA,QAAM,QAAQ,CAACA,KAAoB,SAAS,UAAU;AACpD,QAAI,CAACA,KAAI;AACP,cAAQ,SAAS;AACjB;AAAA,IACF;AACA,UAAM,IAAI,WAAWA,GAAE;AACvB,YAAQ,SAAS;AACjB,YAAQ,UAAU,OAAO,YAAY,MAAM;AAC3C,WAAO,OAAO,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,OAAO,GAAG,EAAE,KAAK,MAAM,QAAQ,GAAG,EAAE,MAAM,KAAK,CAAC;AACvH,UAAM,cAAc,SAASA,GAAE;AAC/B,UAAM,MAAM,MAAM,EAAE,MAAM,KAAK,SAAS;AAAA,EAC1C;AAEA,QAAM,YAAY,CAAC,GAAW,MAA8B;AAC1D,UAAMA,MAAK,qBAAqB,KAAK,GAAG,CAAC;AACzC,QAAI,CAACA,OAAM,iBAAiBA,GAAE,KAAKA,QAAO,IAAI,mBAAmBA,QAAO,IAAI,KAAM,QAAO;AAEzF,WAAO,gBAAgBA,GAAE;AAAA,EAC3B;AAEA,QAAM,SAAS,CAAC,MAAkB;AAChC,QAAI,CAAC,WAAW,QAAS;AACzB,UAAMA,MAAK,UAAU,EAAE,SAAS,EAAE,OAAO;AACzC,QAAIA,QAAO,SAAS;AAClB,gBAAUA;AACV,YAAMA,GAAE;AAAA,IACV;AAAA,EACF;AACA,QAAM,WAAW,MAAM;AACrB,QAAI,QAAS,OAAM,OAAO;AAAA,EAC5B;AACA,QAAM,UAAU,CAAC,MAAkB;AACjC,QAAI,CAAC,WAAW,QAAS;AACzB,QAAI,iBAAiB,eAAe,CAAC,CAAC,EAAG;AACzC,UAAMA,MAAK,UAAU,EAAE,SAAS,EAAE,OAAO,KAAK;AAC9C,QAAI,CAACA,IAAI;AACT,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,MAAE,yBAAyB;AAC3B,UAAM,IAAI,gBAAgBA,GAAE;AAC5B,UAAMA,KAAI,IAAI;AACd,WAAO,cAAc,YAAY,SAASA,GAAE,CAAC;AAC7C,YAAQ,OAAO,EAAE,WAAW,EAAE,WAAW,cAAc,EAAE,cAAc,MAAM,EAAE,MAAM,KAAK,IAAI,SAAS,MAAM,SAASA,IAAG,CAAC;AAAA,EAC5H;AACA,QAAM,UAAU,CAAC,MAAa;AAC5B,QAAI,CAAC,WAAW,QAAS;AACzB,QAAI,iBAAiB,eAAe,CAAC,CAAC,EAAG;AACzC,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAAA,EACpB;AACA,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,UAAU;AACtB,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,WAAK;AACL,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF;AACA,QAAM,OAAO,MAAM;AACjB,QAAI,QAAS;AACb,cAAU;AACV,QAAI,oBAAoB,aAAa,QAAQ,IAAI;AACjD,QAAI,oBAAoB,SAAS,SAAS,IAAI;AAC9C,QAAI,oBAAoB,aAAa,SAAS,IAAI;AAClD,QAAI,oBAAoB,WAAW,SAAS,IAAI;AAChD,QAAI,oBAAoB,WAAW,OAAO,IAAI;AAC9C,QAAI,oBAAoB,UAAU,UAAU,IAAI;AAChD,QAAI,oBAAoB,UAAU,QAAQ;AAC1C,UAAM,QAAQ;AAAA,EAChB;AACA,OAAK,iBAAiB,SAAS,MAAM;AACnC,SAAK;AACL,YAAQ,OAAO;AAAA,EACjB,CAAC;AACD,OAAK,iBAAiB,SAAS,MAAM;AACnC,SAAK;AACL,YAAQ,OAAO;AAAA,EACjB,CAAC;AACD,MAAI,iBAAiB,aAAa,QAAQ,IAAI;AAC9C,MAAI,iBAAiB,SAAS,SAAS,IAAI;AAC3C,MAAI,iBAAiB,aAAa,SAAS,IAAI;AAC/C,MAAI,iBAAiB,WAAW,SAAS,IAAI;AAC7C,MAAI,iBAAiB,WAAW,OAAO,IAAI;AAC3C,MAAI,iBAAiB,UAAU,UAAU,IAAI;AAC7C,MAAI,iBAAiB,UAAU,QAAQ;AAEvC,SAAO;AAAA,IACL,WAAW,CAAC,SAAS;AACnB,aAAO,cAAc;AAAA,IACvB;AAAA,IACA,YAAY,CAAC,YAAY;AACvB,gBAAU;AACV,UAAI,CAAC,QAAS,OAAM,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,EACF;AACF;AAYO,SAAS,YAAY,MAAiB,OAAsC,UAAsI,CAAC,GAAkB;AAC1O,QAAM,oBAA+B,EAAE,GAAG,MAAM,QAAQ,KAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,UAAU,iBAAiB,QAAQ,KAAK,IAAI,KAAK,OAAO,QAAQ,IAAI,EAAE,IAAI,KAAK,OAAO;AAC9K,QAAM,QAAuB;AAAA,IAC3B,IAAI,WAAW,KAAK,EAAE;AAAA,IACtB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ,EAAE,OAAO,CAAC,iBAAiB,GAAG,YAAY,YAAY,WAAW,EAAE,IAAI,QAAQ,IAAI,OAAO,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,MAAM,UAAU,SAAS,EAAE,GAAG,WAAW,EAAE,MAAM,cAAc,eAAe,GAAG,UAAU,GAAG,uBAAuB,CAAC,GAAG,oBAAoB,KAAK,GAAG,YAAY,QAAQ,cAAc,EAAE,OAAO,QAAQ,WAAW,OAAO,GAAG,aAAa,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE;AAAA,EAC7X;AACA,QAAM,aAAa,SAAS,OAAO,EAAE,OAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,QAAQ,QAAQ,GAAG,YAAY,MAAM;AAAA,EAAC,GAAG,UAAU,MAAM;AAAA,EAAC,EAAE,CAAC;AACxI,aAAW,MAAM;AACjB,SAAO,EAAE,YAAY,SAAS,MAAM,WAAW,QAAQ,EAAE;AAC3D;AAWO,SAAS,mBAAmB,WAA+B,UAAmD,CAAC,GAAoB;AACxI,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,QAAQ,YAAY,MAAM,EAAE,OAAO,SAAS,WAAW,OAAO,GAAG,GAAG;AAC1E,QAAM,QAAuB,CAAC;AAC9B,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAW,cAAc,WAAW,GAAG;AAC7C,QAAM,UAAU,oBAAI,IAAa;AACjC,YAAU,QAAQ,CAAC,MAAM;AACvB,UAAM,MAAM,sBAAsB,GAAG,GAAG,EAAE,OAAO,CAACA,QAAO,CAAC,iBAAiBA,GAAE,CAAC;AAC9E,WAAO,KAAK,IAAI,MAAM;AACtB,QAAI,QAAQ,CAACA,QAAO,QAAQ,IAAIA,GAAE,CAAC;AAAA,EACrC,CAAC;AACD,UAAQ,QAAQ,CAACA,QAAO;AACtB,UAAM,IAAI,WAAWA,GAAE;AACvB,UAAM,MAAM,IAAI,cAAc,KAAK;AACnC,QAAI,YAAY;AAChB,WAAO,OAAO,IAAI,OAAO,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,OAAO,GAAG,EAAE,KAAK,MAAM,QAAQ,GAAG,EAAE,MAAM,KAAK,CAAC;AACnH,QAAIA,QAAO,SAAU,KAAI,MAAM,cAAc;AAC7C,UAAM,GAAG,YAAY,GAAG;AACxB,UAAM,KAAK,GAAG;AAAA,EAChB,CAAC;AACD,MAAI,QAA8C;AAClD,QAAM,UAAU,MAAM;AACpB,QAAI,MAAO,cAAa,KAAK;AAC7B,UAAM,QAAQ;AAAA,EAChB;AACA,MAAI,QAAQ,eAAe,EAAG,SAAQ,WAAW,SAAS,QAAQ,cAAc,IAAI;AACpF,aAAW,GAAG;AACd,SAAO,EAAE,QAAQ,UAAU,QAAQ;AACrC;","names":["HOST_ID","el","h","import_runtime","el","import_runtime","import_runtime","HOST_ID","el","current","el","el","import_runtime","el","import_runtime","import_runtime","el","import_runtime","import_runtime","el"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/selectors.ts","../src/sanitize.ts","../src/pdf-viewer.ts","../src/host.ts","../src/styles.ts","../src/position.ts","../src/render.ts","../src/controller.ts","../src/checklist.ts","../src/survey.ts","../src/resource-center.ts","../src/help-view.ts","../src/authoring.ts"],"sourcesContent":["/**\n * @guidelytech/guide-runtime — framework-free DOM engine for Guidely guides.\n *\n * Selectors, Shadow-DOM host, step renderers, guide controller, checklist/survey/resource-center\n * widgets, HTML sanitizer and authoring (element picker) utilities. The messenger and how-to capture\n * recorder are separate entries (`/messenger`, `/capture`) so they load only when used.\n */\nexport { resolveTarget, waitForTarget, generateSelectors, describeElement, textSnapshotOf, isVisible, isStableId, isStableClass, isGuidelyElement, querySelectorStrategy, normalizeText, urlMatches, TargetTimeoutError, SHADOW_SEPARATOR, closestComposed, composedParent, composedTarget, containsComposed, deepElementFromPoint, shadowHostChain, componentAnchor, visualRect } from \"./selectors\";\nexport type { WaitForTargetOptions, ElementDescription, QueryRoot } from \"./selectors\";\nexport { sanitizeHtml, sanitizeToFragment, setSanitizedHtml } from \"./sanitize\";\nexport { enhancePdfViewers } from \"./pdf-viewer\";\nexport { ensureHost, destroyHost, createScope, resolveTheme, applyTheme, prefersReducedMotion, DEFAULT_THEME, HOST_ID } from \"./host\";\nexport type { HostHandle, ThemeVars, ResolvedThemeMode } from \"./host\";\nexport { anchor, trackRect } from \"./position\";\nexport type { AnchorOptions } from \"./position\";\nexport { renderStep, buildCard, isAnchoredStep, renderModal, renderTooltip, renderSpotlight, renderHotspot, renderBanner, renderSlideout, renderCustom } from \"./render\";\nexport type { RenderStepOptions, StepView } from \"./render\";\nexport { runGuide } from \"./controller\";\nexport type { GuideController, RunGuideOptions, RunnableGuide, RuntimeEvent, GuideEndReason, GuideStatus } from \"./controller\";\nexport { renderChecklist, isChecklistComplete } from \"./checklist\";\nexport type { ChecklistWidget, ChecklistWidgetOptions, ChecklistProgress } from \"./checklist\";\nexport { renderSurvey, isQuestionVisible } from \"./survey\";\nexport type { SurveyWidget, SurveyWidgetOptions, SurveyAnswers, SurveyAnswer } from \"./survey\";\nexport { renderResourceCenter } from \"./resource-center\";\nexport type { ResourceCenterWidget, ResourceCenterOptions, ResourceCenterGuideRef } from \"./resource-center\";\nexport { startAuthoring, previewStep, highlightSelectors } from \"./authoring\";\nexport type { AuthoringOptions, AuthoringSession, PreviewHandle, HighlightHandle } from \"./authoring\";\n// How-to capture is its own entry (`@guidelytech/guide-runtime/capture`), loaded on demand.\nexport type { CaptureOptions, CaptureSession, CapturedStep, CaptureStepDraft } from \"./capture\";\nexport { STYLES } from \"./styles\";\n","import { matchUrlPattern } from \"@guidelytech/shared/runtime\";\nimport type { SelectorStrategy, StepTarget } from \"@guidelytech/shared\";\n\n/**\n * URL matching used for `step.url`, `urlPatterns` and `trigger.urlPattern`: a pattern matches the\n * full URL, the path+query+hash, or the bare path (so `/deals` also matches `/deals?x=1`).\n */\nexport function urlMatches(pattern: string | undefined | null, url: string): boolean {\n if (!pattern) return true;\n if (matchUrlPattern(pattern, url)) return true;\n try {\n const u = new URL(url, \"http://localhost\");\n if (!pattern.includes(\"?\") && !pattern.includes(\"#\")) return matchUrlPattern(pattern, u.pathname) || matchUrlPattern(pattern, u.origin + u.pathname);\n } catch {\n /* ignore */\n }\n return false;\n}\n\nexport type QueryRoot = Document | DocumentFragment | Element;\n\nconst TEXT_CANDIDATES =\n \"button, a, [role='button'], [role='link'], [role='tab'], [role='menuitem'], h1, h2, h3, h4, h5, h6, label, summary\";\n\nconst HOST_ID = \"guidely-root\";\n\nfunction docOf(root: QueryRoot): Document {\n return root.nodeType === 9 ? (root as Document) : (root.ownerDocument as Document);\n}\n\n/** True when the environment has a layout engine (real browsers). happy-dom/jsdom report zero sizes. */\nfunction hasLayout(doc: Document): boolean {\n const de = doc.documentElement;\n if (!de) return false;\n const r = de.getBoundingClientRect();\n return r.width > 0 || r.height > 0;\n}\n\n/** Normalises whitespace in a text snippet. */\nexport function normalizeText(text: string | null | undefined): string {\n return (text || \"\").replace(/\\s+/g, \" \").trim();\n}\n\n/** Is the element rendered (not hidden by `hidden`, `display:none`, `visibility:hidden`, or zero size)? */\nexport function isVisible(el: Element): boolean {\n if (!el.isConnected) return false;\n const doc = el.ownerDocument;\n const win = doc.defaultView;\n let cur: Element | null = el;\n while (cur && cur !== doc.documentElement) {\n if ((cur as HTMLElement).hidden) return false;\n if (win) {\n const cs = win.getComputedStyle(cur);\n if (cs.display === \"none\" || cs.visibility === \"hidden\") return false;\n }\n cur = cur.parentElement ?? ((cur.getRootNode() as ShadowRoot).host as Element | undefined) ?? null;\n }\n if (hasLayout(doc)) {\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) return false;\n }\n return true;\n}\n\n/** Elements that belong to Guidely's own UI are never valid targets. */\nexport function isGuidelyElement(el: Element | null): boolean {\n if (!el) return false;\n const root = el.getRootNode();\n if (root instanceof ShadowRoot && root.host.id === HOST_ID) return true;\n return el.id === HOST_ID || !!el.closest?.(`#${HOST_ID}`);\n}\n\nfunction safeQueryAll(root: QueryRoot, selector: string): Element[] {\n try {\n return Array.from(root.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shadow DOM. Web-component apps (Salesforce Lightning Web Components, Shoelace, Ionic, Lit) keep\n// most of their elements inside shadow roots, which `querySelectorAll` never enters. Selectors\n// therefore search open shadow roots too, and a CSS value can step into one explicitly:\n// `c-app >>> button.save` is `button.save` anywhere inside `c-app`'s shadow tree. Closed shadow\n// roots are unreachable by design.\n// ---------------------------------------------------------------------------\n\n/** Separates the shadow-host steps of a CSS selector (`>>>` is not valid CSS, so it never clashes). */\nexport const SHADOW_SEPARATOR = \" >>> \";\nconst SHADOW_SPLIT = /\\s*>>>\\s*/;\n\nfunction isShadowRoot(node: Node | null | undefined): node is ShadowRoot {\n return !!node && node.nodeType === 11 && !!(node as ShadowRoot).host;\n}\n\n/** The shadow root an element lives in, or null when it is in the document itself. */\nfunction shadowRootOf(el: Element): ShadowRoot | null {\n const root = el.getRootNode?.();\n return isShadowRoot(root) ? root : null;\n}\n\n/** The element's parent in the composed tree: its parent element, or its shadow host at the top of a shadow root. */\nexport function composedParent(el: Element): Element | null {\n return el.parentElement ?? shadowRootOf(el)?.host ?? null;\n}\n\n/** Does `ancestor` contain `node`, looking through shadow boundaries? */\nexport function containsComposed(ancestor: Element, node: Node | null): boolean {\n let cur: Element | null = node ? (node.nodeType === 1 ? (node as Element) : node.parentElement) : null;\n for (; cur; cur = composedParent(cur)) if (cur === ancestor) return true;\n return false;\n}\n\n/** The element an event really started on: inside a shadow root `e.target` is retargeted to the host. */\nexport function composedTarget(e: Event): Element | null {\n const path = typeof e.composedPath === \"function\" ? e.composedPath() : [];\n const first = (path[0] ?? e.target) as Node | null;\n if (!first) return null;\n return first.nodeType === 1 ? (first as Element) : first.parentElement;\n}\n\n/** Set while `resolveTarget` runs, so its strategies share one walk of the page per root. */\nlet shadowRootCache: Map<QueryRoot, ShadowRoot[]> | null = null;\n\n/** Every open shadow root below `root`, nested ones included, except Guidely's own UI. */\nfunction shadowRootsIn(root: QueryRoot): ShadowRoot[] {\n const cached = shadowRootCache?.get(root);\n if (cached) return cached;\n const out: ShadowRoot[] = [];\n const visit = (scope: QueryRoot) => {\n const own = scope.nodeType === 1 ? (scope as Element).shadowRoot : null;\n const hosts = own ? [scope as Element] : [];\n for (const el of safeQueryAll(scope, \"*\")) if (el.shadowRoot) hosts.push(el);\n for (const host of hosts) {\n if (host.id === HOST_ID || !host.shadowRoot || out.includes(host.shadowRoot)) continue;\n out.push(host.shadowRoot);\n visit(host.shadowRoot);\n }\n };\n visit(root);\n shadowRootCache?.set(root, out);\n return out;\n}\n\n/** `querySelectorAll` that also searches every open shadow root below `root`. */\nfunction queryAllDeep(root: QueryRoot, selector: string): Element[] {\n const out = safeQueryAll(root, selector);\n for (const sr of shadowRootsIn(root)) out.push(...safeQueryAll(sr, selector));\n return out;\n}\n\n/**\n * Resolves a CSS selector. With `deep`, open shadow roots are searched too. A `>>>` chain is always\n * deep: each step is looked for anywhere inside the shadow trees of the previous step's matches.\n */\nfunction queryCss(root: QueryRoot, selector: string, deep: boolean): Element[] {\n if (!selector.includes(\">>>\")) return deep ? queryAllDeep(root, selector) : safeQueryAll(root, selector);\n const steps = selector.split(SHADOW_SPLIT).filter(Boolean);\n let scopes: QueryRoot[] = [root];\n let matches: Element[] = [];\n steps.forEach((step, i) => {\n matches = Array.from(new Set(scopes.flatMap((scope) => queryAllDeep(scope, step))));\n if (i < steps.length - 1) scopes = matches.map((el) => el.shadowRoot).filter((sr): sr is ShadowRoot => !!sr);\n });\n return matches;\n}\n\n/**\n * `Element.closest` across shadow boundaries: the nearest element, from `el` up through its shadow\n * hosts, that matches `selector` (which may be a `>>>` chain). Throws on an invalid plain selector,\n * like `closest` does.\n */\nexport function closestComposed(el: Element, selector: string): Element | null {\n if (selector.includes(\">>>\")) {\n const hits = new Set(queryCss(docOf(el), selector, true));\n for (let cur: Element | null = el; cur; cur = composedParent(cur)) if (hits.has(cur)) return cur;\n return null;\n }\n for (let cur: Element | null = el; cur; cur = composedParent(cur)) if (cur.matches(selector)) return cur;\n return null;\n}\n\n/** The innermost element at a point, looking inside open shadow roots (`elementFromPoint` stops at the host). */\nexport function deepElementFromPoint(doc: Document, x: number, y: number): Element | null {\n let el = doc.elementFromPoint(x, y);\n while (el?.shadowRoot && el.id !== HOST_ID && typeof el.shadowRoot.elementFromPoint === \"function\") {\n const inner = el.shadowRoot.elementFromPoint(x, y);\n if (!inner || inner === el) break;\n el = inner;\n }\n return el;\n}\n\nfunction escapeCss(value: string): string {\n const g = globalThis as { CSS?: { escape?: (v: string) => string } };\n if (g.CSS && typeof g.CSS.escape === \"function\") return g.CSS.escape(value);\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n\nfunction queryXPath(root: QueryRoot, expr: string): Element[] {\n const doc = docOf(root);\n const d = doc as Document & { evaluate?: Document[\"evaluate\"] };\n if (typeof d.evaluate !== \"function\") return [];\n try {\n const result = d.evaluate(expr, root, null, 7 /* ORDERED_NODE_SNAPSHOT_TYPE */, null);\n const out: Element[] = [];\n for (let i = 0; i < result.snapshotLength; i++) {\n const n = result.snapshotItem(i);\n if (n && n.nodeType === 1) out.push(n as Element);\n }\n return out;\n } catch {\n return [];\n }\n}\n\nfunction queryText(root: QueryRoot, text: string, deep: boolean): Element[] {\n const needle = normalizeText(text).toLowerCase();\n if (!needle) return [];\n const candidates = queryCss(root, TEXT_CANDIDATES, deep);\n const exact = candidates.filter((c) => normalizeText(c.textContent).toLowerCase() === needle);\n if (exact.length) return exact;\n return candidates.filter((c) => normalizeText(c.textContent).toLowerCase().includes(needle));\n}\n\n/**\n * Resolves every element matching one strategy (visible or not). `deep` (the default) also searches\n * open shadow roots; `>>>` chains are always followed. XPath cannot cross shadow boundaries.\n */\nexport function querySelectorStrategy(strategy: SelectorStrategy, root: QueryRoot, deep = true): Element[] {\n const value = strategy.value.trim();\n if (!value) return [];\n switch (strategy.kind) {\n case \"id\": {\n const id = value.startsWith(\"#\") ? value.slice(1) : value;\n return queryCss(root, `#${escapeCss(id)}`, deep);\n }\n case \"guidely-id\": {\n const id = value.startsWith(\"#\") ? value.slice(1) : value;\n return queryCss(root, attrSelector(\"data-guidely-id\", id), deep);\n }\n case \"data-attr\":\n case \"aria\":\n case \"css\":\n return queryCss(root, value.startsWith(\"[\") || /^[a-z*#.[]/i.test(value) ? value : `[${value}]`, deep);\n case \"text\":\n return queryText(root, value, deep);\n case \"xpath\":\n return queryXPath(root, value);\n default:\n return [];\n }\n}\n\n/**\n * Resolves a step target by trying each strategy in order. A strategy wins only when it\n * resolves to exactly one *visible* element; otherwise the next strategy is tried. Each strategy\n * looks in the document first and only searches shadow roots when nothing there is visible, so a\n * target that resolved before shadow-DOM support still resolves to the same element.\n */\nexport function resolveTarget(target: Pick<StepTarget, \"selectors\"> | SelectorStrategy[], root: QueryRoot = document): Element | null {\n const selectors = Array.isArray(target) ? target : target.selectors;\n const visibleMatches = (strategy: SelectorStrategy, deep: boolean) => querySelectorStrategy(strategy, root, deep).filter((el) => !isGuidelyElement(el) && isVisible(el));\n const outer = shadowRootCache;\n shadowRootCache ??= new Map();\n try {\n for (const strategy of selectors) {\n let matches = visibleMatches(strategy, false);\n if (!matches.length && strategy.kind !== \"xpath\") matches = visibleMatches(strategy, true);\n if (matches.length === 1) return matches[0] as Element;\n }\n return null;\n } finally {\n shadowRootCache = outer;\n }\n}\n\nexport interface WaitForTargetOptions {\n /** Give up after this many milliseconds (default 5000). */\n timeoutMs?: number;\n /** Abort early. */\n signal?: AbortSignal;\n root?: QueryRoot;\n /** Polling fallback interval (default 250ms, which is also the maximum). */\n pollMs?: number;\n}\n\nexport class TargetTimeoutError extends Error {\n override name = \"TargetTimeoutError\";\n constructor(message = \"Target element not found before timeout\") {\n super(message);\n }\n}\n\n/**\n * Waits until `resolveTarget` finds an element. Uses a MutationObserver plus a polling fallback\n * (at most every 250ms) so visibility changes without DOM mutations, and changes inside shadow\n * roots (which the observer does not see), are also detected.\n */\nexport function waitForTarget(target: Pick<StepTarget, \"selectors\"> | SelectorStrategy[], options: WaitForTargetOptions = {}): Promise<Element> {\n const timeoutMs = options.timeoutMs ?? 5000;\n const root = options.root ?? document;\n const pollMs = Math.min(250, Math.max(16, options.pollMs ?? 250));\n return new Promise<Element>((resolve, reject) => {\n const immediate = resolveTarget(target, root);\n if (immediate) return resolve(immediate);\n if (options.signal?.aborted) return reject(new DOMException(\"Aborted\", \"AbortError\"));\n let done = false;\n let observer: MutationObserver | null = null;\n let timer: ReturnType<typeof setInterval> | null = null;\n let timeout: ReturnType<typeof setTimeout> | null = null;\n const cleanup = () => {\n done = true;\n observer?.disconnect();\n if (timer) clearInterval(timer);\n if (timeout) clearTimeout(timeout);\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n const check = () => {\n if (done) return;\n const el = resolveTarget(target, root);\n if (el) {\n cleanup();\n resolve(el);\n }\n };\n const onAbort = () => {\n cleanup();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n options.signal?.addEventListener(\"abort\", onAbort);\n const observeRoot = root.nodeType === 9 ? (root as Document).documentElement : (root as Element);\n if (typeof MutationObserver !== \"undefined\" && observeRoot) {\n observer = new MutationObserver(check);\n observer.observe(observeRoot, { childList: true, subtree: true, attributes: true, attributeFilter: [\"class\", \"style\", \"hidden\", \"id\", \"data-tour\", \"data-guidely-id\", \"aria-label\"] });\n }\n timer = setInterval(check, pollMs);\n if (timeoutMs > 0) {\n timeout = setTimeout(() => {\n cleanup();\n reject(new TargetTimeoutError());\n }, timeoutMs);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Selector generation (used by the element picker)\n// ---------------------------------------------------------------------------\n\nconst GENERATED_ID = /(\\d{4,}|:r[0-9a-z]+:|^radix-|^headlessui-|^mui-|^ember\\d|^react-|^\\w*-\\d+$|__|^[a-f0-9]{8,}$|^svelte-)/i;\nconst GENERATED_CLASS = /(^css-|^sc-|^jss\\d|^svelte-|^emotion-|^chakra-|^Mui|^_|[0-9a-f]{6,}|^\\w{1,2}$|^[a-z]+-\\d+$|[:[\\]/])/;\nconst PREFERRED_DATA_ATTRS = [\"data-testid\", \"data-tour\", \"data-test\", \"data-test-id\", \"data-cy\", \"data-qa\", \"data-id\", \"data-name\", \"data-guidely\"];\nconst IGNORED_DATA_ATTRS = /^data-(guidely-id|state|v-|reactid|react|radix|headlessui|svelte|hydrated|orientation|highlighted|focus|key|index|rbd|dnd|rk-|sveltekit)/i;\n\n/** Is this id stable enough to be used as a selector (not generated by a framework)? */\nexport function isStableId(id: string): boolean {\n return !!id && /^[A-Za-z][\\w-]*$/.test(id) && !GENERATED_ID.test(id);\n}\n\n/** Is this class name stable enough to describe an element (not a CSS-in-JS hash or framework id)? */\nexport function isStableClass(cls: string): boolean {\n return !!cls && !GENERATED_CLASS.test(cls) && cls.length <= 40;\n}\n\n/** Does `selector` match exactly `el` and nothing else directly inside `root` (shadow roots below are not searched)? */\nfunction uniqueWithin(root: QueryRoot, selector: string, el: Element): boolean {\n const all = safeQueryAll(root, selector);\n return all.length === 1 && all[0] === el;\n}\n\nfunction attrSelector(name: string, value: string): string {\n return `[${name}='${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\")}']`;\n}\n\n/** Shortest unique `>`-path to `el` within its own root (the document, or the shadow root it lives in). */\nfunction cssPath(el: Element, root: Document | ShadowRoot): string | null {\n const doc = el.ownerDocument;\n const segments: string[] = [];\n let cur: Element | null = el;\n while (cur && cur.nodeType === 1 && cur !== doc.body && cur !== doc.documentElement) {\n const tag = cur.tagName.toLowerCase();\n if (isStableId(cur.id)) {\n segments.unshift(`#${cur.id}`);\n break;\n }\n let seg = tag;\n const parent: Element | null = cur.parentElement;\n if (parent) {\n const sameTag = Array.from(parent.children).filter((c) => c.tagName === cur!.tagName);\n if (sameTag.length > 1) {\n const stableCls = Array.from(cur.classList).find((c) => isStableClass(c) && sameTag.filter((s) => s.classList.contains(c)).length === 1);\n seg += stableCls ? `.${escapeCss(stableCls)}` : `:nth-of-type(${sameTag.indexOf(cur) + 1})`;\n }\n }\n segments.unshift(seg);\n const candidate = segments.join(\" > \");\n if (uniqueWithin(root, candidate, el)) return candidate;\n cur = parent;\n }\n const full = segments.join(\" > \");\n return uniqueWithin(root, full, el) ? full : null;\n}\n\n/**\n * The `>>>` chain of shadow hosts above an element (`c-app >>> c-form`), or \"\" for an element in\n * the document itself; null when some host has no unique path within its own root.\n */\nexport function shadowHostChain(el: Element): string | null {\n const steps: string[] = [];\n for (let root = shadowRootOf(el); root; root = shadowRootOf(root.host)) {\n const host = root.host;\n const step = cssPath(host, shadowRootOf(host) ?? host.ownerDocument);\n if (!step) return null;\n steps.unshift(step);\n }\n return steps.join(SHADOW_SEPARATOR);\n}\n\n/**\n * Turns a selector that is unique within `el`'s own root into one the resolver maps back to `el`.\n * In the document that is the selector itself (as before shadow-DOM support). Inside a shadow root\n * the bare selector is kept when no other match exists in any shadow tree; otherwise it is scoped\n * with the host chain. Returns null when neither form resolves to exactly `el`.\n */\nfunction selectorFor(el: Element, selector: string): string | null {\n const root = shadowRootOf(el);\n if (!root) return uniqueWithin(el.ownerDocument, selector, el) ? selector : null;\n if (!uniqueWithin(root, selector, el)) return null;\n const doc = el.ownerDocument;\n const only = (sel: string) => {\n const all = queryCss(doc, sel, true);\n return all.length === 1 && all[0] === el;\n };\n if (only(selector)) return selector;\n const chain = shadowHostChain(el);\n const scoped = chain ? chain + SHADOW_SEPARATOR + selector : null;\n return scoped && only(scoped) ? scoped : null;\n}\n\n/** Text a component renders in its shadow root (`innerText` of a host only covers its light DOM). */\nfunction shadowText(el: Element): string {\n if (!el.shadowRoot) return \"\";\n const parts = Array.from(el.shadowRoot.children).filter((c) => !/^(STYLE|SCRIPT|TEMPLATE)$/.test(c.tagName));\n return normalizeText(parts.map((c) => (c as HTMLElement).innerText ?? c.textContent).join(\" \"));\n}\n\n/** Short human-readable text for an element, trimmed to 200 characters. */\nexport function textSnapshotOf(el: Element): string {\n const he = el as HTMLElement;\n const own = normalizeText(he.innerText ?? el.textContent) || shadowText(el);\n const alt = normalizeText(el.getAttribute(\"aria-label\") || el.getAttribute(\"title\") || el.getAttribute(\"placeholder\") || el.getAttribute(\"alt\") || (el as HTMLInputElement).value);\n return (own || alt).slice(0, 200);\n}\n\n/**\n * Generates an ordered list of selector strategies for an element, most robust first:\n * stable id → data-* attributes → aria-label → role/name → short unique CSS path → visible text.\n */\nexport function generateSelectors(el: Element): SelectorStrategy[] {\n const out: SelectorStrategy[] = [];\n const seen = new Set<string>();\n const push = (s: SelectorStrategy) => {\n const k = `${s.kind}:${s.value}`;\n if (!seen.has(k)) {\n seen.add(k);\n out.push(s);\n }\n };\n const tag = el.tagName.toLowerCase();\n // A selector scoped into a shadow root (`host >>> sel`) is always pushed as plain CSS.\n const pushFor = (kind: SelectorStrategy[\"kind\"], selector: string, value: string, label: string) => {\n const resolved = selectorFor(el, selector);\n if (resolved === selector) push({ kind, value, label });\n else if (resolved) push({ kind: \"css\", value: resolved, label });\n return !!resolved;\n };\n\n // A Guidely id is shared with the mobile apps, so it is the most portable target there is.\n const guidelyId = el.getAttribute(\"data-guidely-id\");\n if (guidelyId) pushFor(\"guidely-id\", attrSelector(\"data-guidely-id\", guidelyId), guidelyId, `Guidely id ${guidelyId}`);\n if (isStableId(el.id)) pushFor(\"id\", `#${escapeCss(el.id)}`, `#${el.id}`, `id ${el.id}`);\n\n const dataAttrs = Array.from(el.attributes).filter((a) => a.name.startsWith(\"data-\") && !IGNORED_DATA_ATTRS.test(a.name) && a.value && a.value.length <= 120 && !/\\d{5,}/.test(a.value));\n dataAttrs.sort((a, b) => {\n const ia = PREFERRED_DATA_ATTRS.indexOf(a.name);\n const ib = PREFERRED_DATA_ATTRS.indexOf(b.name);\n return (ia === -1 ? 99 : ia) - (ib === -1 ? 99 : ib);\n });\n for (const a of dataAttrs) {\n const sel = attrSelector(a.name, a.value);\n if (!pushFor(\"data-attr\", sel, sel, `${a.name}=${a.value}`)) pushFor(\"data-attr\", tag + sel, tag + sel, `${a.name}=${a.value}`);\n }\n\n const aria = el.getAttribute(\"aria-label\");\n if (aria && aria.length <= 120) {\n const sel = attrSelector(\"aria-label\", aria);\n if (!pushFor(\"aria\", sel, sel, aria)) pushFor(\"aria\", tag + sel, tag + sel, aria);\n }\n\n const name = el.getAttribute(\"name\");\n if (name) pushFor(\"css\", tag + attrSelector(\"name\", name), tag + attrSelector(\"name\", name), `${tag} name=${name}`);\n const role = el.getAttribute(\"role\");\n if (role) {\n const title = el.getAttribute(\"title\") || el.getAttribute(\"aria-labelledby\");\n const sel = title ? `[role='${role}']${attrSelector(el.getAttribute(\"title\") ? \"title\" : \"aria-labelledby\", title)}` : `[role='${role}']`;\n pushFor(\"css\", sel, sel, `role ${role}`);\n }\n if (tag === \"a\") {\n const href = el.getAttribute(\"href\");\n if (href && href.length <= 200) pushFor(\"css\", `a${attrSelector(\"href\", href)}`, `a${attrSelector(\"href\", href)}`, `link ${href}`);\n }\n\n const path = cssPath(el, shadowRootOf(el) ?? el.ownerDocument);\n if (path) pushFor(\"css\", path, path, \"css path\");\n\n if (/^(button|a|h[1-6]|label|summary)$/.test(tag) || role === \"button\" || role === \"link\" || role === \"tab\" || role === \"menuitem\") {\n const text = normalizeText((el as HTMLElement).innerText ?? el.textContent);\n if (text && text.length <= 80) push({ kind: \"text\", value: text, label: `text \"${text}\"` });\n }\n return out.slice(0, 10);\n}\n\nexport interface ElementDescription {\n selectors: SelectorStrategy[];\n textSnapshot: string;\n rect: { x: number; y: number; width: number; height: number };\n tag: string;\n}\n\n/**\n * An element's on-screen box. For a shadow host that is its own box joined with its shadow content's:\n * an `inline` host (the default for custom elements) is only a line tall around a taller button, and\n * a `display: contents` host has no box at all.\n */\nexport function visualRect(el: Element): DOMRect {\n const own = el.getBoundingClientRect();\n if (!el.shadowRoot) return own;\n const boxes = [own, ...Array.from(el.shadowRoot.children).map((c) => c.getBoundingClientRect())].filter((r) => r.width > 0 && r.height > 0);\n if (boxes.length < 2) return boxes[0] ?? own;\n const left = Math.min(...boxes.map((r) => r.left));\n const top = Math.min(...boxes.map((r) => r.top));\n const right = Math.max(...boxes.map((r) => r.right));\n const bottom = Math.max(...boxes.map((r) => r.bottom));\n return new DOMRect(left, top, right - left, bottom - top);\n}\n\n/** Growth from a control's box to its component's that still counts as \"the same control\" (label + field). */\nconst ANCHOR_MAX_AREA_RATIO = 4;\nconst CONTROL_SELECTOR = \"button, a[href], input, select, textarea, [role='button'], [role='link'], [role='checkbox'], [role='radio'], [role='switch'], [role='tab'], [role='menuitem'], [role='combobox'], [role='option']\";\n\n/**\n * The element a pick should target. Inside a component (a shadow host) that is little more than the\n * picked control (`lightning-button` around its `<button>`, also when the pick is the button's icon;\n * `lightning-input` around its label and field), that is the component itself: the app's markup around a component is the app's, while a\n * design system can change a component's internals in any release. Repeats up nested components and\n * stops at the first one that is clearly more (a list, a form, the whole app). Without layout (tests,\n * hidden pages) the element is kept.\n */\nexport function componentAnchor(el: Element): Element {\n if (!hasLayout(el.ownerDocument)) return el;\n let cur = el;\n for (let root = shadowRootOf(cur); root; root = shadowRootOf(cur)) {\n const host = root.host;\n if (host.id === HOST_ID) break;\n let control: Element | null = null;\n try {\n control = cur.closest(CONTROL_SELECTOR); // stays within this shadow root\n } catch {\n /* ignore */\n }\n const r = visualRect(control ?? cur);\n const area = r.width * r.height;\n const h = visualRect(host);\n const hostArea = h.width * h.height;\n const inside = r.left >= h.left - 1 && r.top >= h.top - 1 && r.right <= h.right + 1 && r.bottom <= h.bottom + 1;\n if (!area || !inside || hostArea > area * ANCHOR_MAX_AREA_RATIO) break;\n cur = host;\n }\n return cur;\n}\n\n/**\n * Everything the authoring picker and how-to capture need for one element. Selectors and rect are\n * for its `componentAnchor`; the text falls back to the element's own.\n */\nexport function describeElement(el: Element): ElementDescription {\n const target = componentAnchor(el);\n const r = visualRect(target);\n return {\n selectors: generateSelectors(target),\n textSnapshot: textSnapshotOf(target) || textSnapshotOf(el),\n rect: { x: r.x, y: r.y, width: r.width, height: r.height },\n tag: target.tagName.toLowerCase(),\n };\n}\n","import { EMBED_IFRAME_ATTRS, VIDEO_ATTRS, isAllowedEmbedSrc, isSafeMediaUrl } from \"@guidelytech/shared/runtime\";\n\nconst ALLOWED_TAGS = new Set([\"p\", \"br\", \"strong\", \"b\", \"em\", \"i\", \"u\", \"a\", \"ul\", \"ol\", \"li\", \"img\", \"h1\", \"h2\", \"h3\", \"h4\", \"code\", \"pre\", \"blockquote\", \"span\", \"div\", \"hr\", \"button\"]);\nconst DROP_TAGS = new Set([\"script\", \"style\", \"object\", \"embed\", \"form\", \"input\", \"textarea\", \"select\", \"link\", \"meta\", \"base\", \"template\", \"svg\", \"math\", \"frame\", \"frameset\", \"noscript\"]);\nconst ALLOWED_ATTRS = new Set([\"href\", \"src\", \"alt\", \"title\", \"target\", \"rel\", \"class\", \"width\", \"height\", \"data-g-action\", \"data-g-value\"]);\nfunction isSafeUrl(value: string, attr: string, tag: string): boolean {\n // eslint-disable-next-line no-control-regex\n const v = value.trim().replace(/[\\u0000-\\u001f\\s]/g, \"\").toLowerCase();\n if (!v) return false;\n const m = /^([a-z][a-z0-9+.-]*):/.exec(v);\n if (!m) return true; // relative URL\n const scheme = m[1];\n if (scheme === \"data\") return tag === \"img\" && attr === \"src\" && v.startsWith(\"data:image/\");\n return scheme === \"http\" || scheme === \"https\" || scheme === \"mailto\" || scheme === \"tel\";\n}\n\nfunction sanitizeElement(el: Element): void {\n const tag = el.tagName.toLowerCase();\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n if (name.startsWith(\"on\") || !ALLOWED_ATTRS.has(name)) {\n el.removeAttribute(attr.name);\n continue;\n }\n if ((name === \"href\" || name === \"src\") && !isSafeUrl(attr.value, name, tag)) el.removeAttribute(attr.name);\n }\n if (tag === \"a\") {\n const target = el.getAttribute(\"target\");\n if (target && target !== \"_blank\" && target !== \"_self\") el.removeAttribute(\"target\");\n if (el.getAttribute(\"target\") === \"_blank\") el.setAttribute(\"rel\", \"noopener noreferrer\");\n }\n if (tag === \"button\") el.setAttribute(\"type\", \"button\");\n if (tag === \"img\") {\n for (const dim of [\"width\", \"height\"]) if (el.hasAttribute(dim) && !/^\\d{1,5}$/.test(el.getAttribute(dim)!)) el.removeAttribute(dim);\n el.setAttribute(\"loading\", \"lazy\");\n if (!el.getAttribute(\"alt\")) el.setAttribute(\"alt\", \"\");\n }\n}\n\n/**\n * Media elements are rebuilt from scratch rather than filtered: an `<iframe>` only for a canonical\n * YouTube/Vimeo/Loom/Wistia embed, a `<video>` only for an absolute http(s) file, each with fixed\n * attributes. Returns null when the element must go.\n */\nfunction rebuildMedia(el: Element): Element | null {\n const doc = el.ownerDocument;\n const tag = el.tagName.toLowerCase();\n const src = el.getAttribute(\"src\");\n let out: Element;\n if (tag === \"iframe\") {\n if (!isAllowedEmbedSrc(src)) return null;\n out = doc.createElement(\"iframe\");\n out.setAttribute(\"src\", src!);\n out.setAttribute(\"title\", el.getAttribute(\"title\") || \"Embedded video\");\n for (const [k, v] of Object.entries(EMBED_IFRAME_ATTRS)) out.setAttribute(k, v);\n } else {\n if (!isSafeMediaUrl(src)) return null;\n out = doc.createElement(\"video\");\n out.setAttribute(\"src\", src!);\n const poster = el.getAttribute(\"poster\");\n if (isSafeMediaUrl(poster)) out.setAttribute(\"poster\", poster!);\n for (const [k, v] of Object.entries(VIDEO_ATTRS)) out.setAttribute(k, v);\n }\n return out;\n}\n\nfunction walk(node: Node): void {\n const children = Array.from(node.childNodes);\n for (const child of children) {\n if (child.nodeType === 8 /* comment */) {\n node.removeChild(child);\n continue;\n }\n if (child.nodeType !== 1) continue;\n const el = child as Element;\n const tag = el.tagName.toLowerCase();\n if (DROP_TAGS.has(tag)) {\n node.removeChild(el);\n continue;\n }\n if (tag === \"iframe\" || tag === \"video\") {\n const media = rebuildMedia(el);\n if (media) node.replaceChild(media, el);\n else node.removeChild(el);\n continue;\n }\n if (!ALLOWED_TAGS.has(tag)) {\n // Unwrap: keep text/children, drop the element itself.\n while (el.firstChild) node.insertBefore(el.firstChild, el);\n node.removeChild(el);\n // Re-walk the parent since children moved up.\n walk(node);\n return;\n }\n sanitizeElement(el);\n walk(el);\n }\n}\n\n/**\n * Parses HTML into a sanitized DocumentFragment using a strict allowlist. No external\n * dependency: a `<template>` element parses inertly and the tree is walked element by element.\n */\nexport function sanitizeToFragment(html: string, doc: Document = document): DocumentFragment {\n const tpl = doc.createElement(\"template\");\n tpl.innerHTML = html || \"\";\n walk(tpl.content);\n return tpl.content;\n}\n\n/** Returns sanitized HTML as a string. */\nexport function sanitizeHtml(html: string, doc: Document = document): string {\n const frag = sanitizeToFragment(html, doc);\n const div = doc.createElement(\"div\");\n div.appendChild(frag);\n return div.innerHTML;\n}\n\n/** Replaces the content of `el` with the sanitized HTML. */\nexport function setSanitizedHtml(el: Element, html: string): void {\n el.textContent = \"\";\n el.appendChild(sanitizeToFragment(html, el.ownerDocument));\n}\n","import { FILE_LINK_CLASS, PDF_BLOCK_CLASS, PDF_PAGES_CLASS } from \"@guidelytech/shared/runtime\";\nimport { prefersReducedMotion } from \"./host\";\n\n/**\n * Turns the PDFs in a sanitized article body (`div.gd-pdf`: the PDF link plus its pages as images)\n * into inline viewers: pages swipe sideways with a page counter and previous/next buttons, and the\n * header or a tap on a page opens a full-screen reader inside the widget, so visitors read the\n * document without downloading it. The original PDF stays one tap away in the reader. Without this\n * (or without script) the CSS alone still shows a scrollable strip of pages.\n */\nexport function enhancePdfViewers(root: Element, doc: Document = root.ownerDocument): void {\n for (const block of Array.from(root.querySelectorAll(`div.${PDF_BLOCK_CLASS}`))) {\n const link = block.querySelector<HTMLAnchorElement>(`a.${FILE_LINK_CLASS}`);\n const strip = block.querySelector<HTMLElement>(`.${PDF_PAGES_CLASS}`);\n if (!link || !strip || block.hasAttribute(\"data-g-ready\")) continue;\n // The sanitizer strips unsafe sources; those images aren't pages.\n for (const img of Array.from(strip.querySelectorAll(\"img:not([src])\"))) img.remove();\n const pages = Array.from(strip.querySelectorAll(\"img\"));\n if (!pages.length) {\n strip.remove();\n continue;\n }\n block.setAttribute(\"data-g-ready\", \"\");\n const name = (link.textContent || \"\").trim() || \"PDF\";\n block.setAttribute(\"role\", \"group\");\n block.setAttribute(\"aria-label\", `${name}, ${pages.length} ${pages.length === 1 ? \"page\" : \"pages\"}`);\n link.setAttribute(\"aria-label\", `Read ${name} full screen`);\n link.addEventListener(\"click\", (e) => {\n e.preventDefault();\n openReader(doc, block, link, pages, 0);\n });\n\n const viewport = doc.createElement(\"div\");\n viewport.className = \"g-pdf-viewport\";\n strip.replaceWith(viewport);\n viewport.appendChild(strip);\n strip.tabIndex = 0;\n strip.setAttribute(\"aria-label\", `${name} pages`);\n\n const counter = doc.createElement(\"span\");\n counter.className = \"g-pdf-count\";\n counter.setAttribute(\"aria-live\", \"polite\");\n const prev = navButton(doc, \"prev\", \"Previous page\", \"‹\");\n const next = navButton(doc, \"next\", \"Next page\", \"›\");\n viewport.append(prev, next, counter);\n\n // Distance between page starts: one page width plus the gap.\n const stride = () => Math.max(1, pages.length > 1 ? pages[1]!.offsetLeft - pages[0]!.offsetLeft : strip.clientWidth);\n const current = () => Math.round(strip.scrollLeft / stride());\n const go = (i: number) => strip.scrollTo({ left: Math.max(0, Math.min(pages.length - 1, i)) * stride(), behavior: prefersReducedMotion() ? \"auto\" : \"smooth\" });\n const update = () => {\n const i = Math.min(pages.length - 1, current());\n counter.textContent = `${i + 1} / ${pages.length}`;\n prev.disabled = i === 0;\n next.disabled = i >= pages.length - 1;\n };\n prev.addEventListener(\"click\", () => go(current() - 1));\n next.addEventListener(\"click\", () => go(current() + 1));\n strip.addEventListener(\"scroll\", update, { passive: true });\n strip.addEventListener(\"keydown\", (e) => {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") {\n e.preventDefault();\n go(current() + (e.key === \"ArrowRight\" ? 1 : -1));\n } else if (e.key === \"Enter\") openReader(doc, block, link, pages, current());\n });\n pages.forEach((img, i) => img.addEventListener(\"click\", () => openReader(doc, block, link, pages, i)));\n if (pages.length === 1) viewport.classList.add(\"g-pdf-single\");\n update();\n }\n}\n\nfunction navButton(doc: Document, cls: string, label: string, text: string) {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.className = `g-pdf-nav g-pdf-${cls}`;\n b.setAttribute(\"aria-label\", label);\n b.textContent = text;\n return b;\n}\n\n/** Full-screen reader: every page stacked vertically, the original PDF linked, Escape to close. */\nfunction openReader(doc: Document, block: Element, link: HTMLAnchorElement, pages: HTMLImageElement[], start: number) {\n const host = (block.closest(\".g-scope\") as HTMLElement | null) ?? doc.body;\n // Inside the shadow root, `document.activeElement` is only the host.\n const returnFocus = (block.getRootNode() as Document | ShadowRoot).activeElement as HTMLElement | null;\n const name = (link.textContent || \"\").trim() || \"PDF\";\n\n const reader = doc.createElement(\"div\");\n reader.className = \"g-pdf-reader\";\n reader.setAttribute(\"role\", \"dialog\");\n reader.setAttribute(\"aria-modal\", \"true\");\n reader.setAttribute(\"aria-label\", name);\n const bar = doc.createElement(\"div\");\n bar.className = \"g-pdf-bar\";\n const title = doc.createElement(\"span\");\n title.className = \"g-pdf-title\";\n title.textContent = name;\n const original = doc.createElement(\"a\");\n original.className = \"g-btn g-btn-secondary\";\n original.href = link.href;\n original.target = \"_blank\";\n original.rel = \"noopener noreferrer\";\n original.textContent = \"Open PDF ↗\";\n const close = doc.createElement(\"button\");\n close.type = \"button\";\n close.className = \"g-close g-pdf-close\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.textContent = \"×\";\n bar.append(title, original, close);\n\n const scroller = doc.createElement(\"div\");\n scroller.className = \"g-pdf-scroll\";\n scroller.tabIndex = 0;\n for (const page of pages) {\n const img = doc.createElement(\"img\");\n img.src = page.src;\n img.alt = page.alt;\n img.decoding = \"async\";\n // Sizes up front so every page has its height before loading, and opening at page N lands on it.\n for (const dim of [\"width\", \"height\"]) if (page.hasAttribute(dim)) img.setAttribute(dim, page.getAttribute(dim)!);\n scroller.appendChild(img);\n }\n reader.append(bar, scroller);\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n done();\n } else if (e.key === \"Tab\") {\n // Keep focus inside the reader.\n const items: HTMLElement[] = [original, close, scroller];\n const at = items.indexOf((reader.getRootNode() as Document | ShadowRoot).activeElement as HTMLElement);\n e.preventDefault();\n items[(at + (e.shiftKey ? items.length - 1 : 1)) % items.length]!.focus();\n }\n };\n const done = () => {\n reader.remove();\n returnFocus?.focus?.({ preventScroll: true });\n };\n close.addEventListener(\"click\", done);\n reader.addEventListener(\"keydown\", onKey);\n host.appendChild(reader);\n close.focus();\n const target = scroller.children[start] as HTMLImageElement | undefined;\n if (target && start > 0) {\n const land = () => (scroller.scrollTop = target.offsetTop - 12);\n requestAnimationFrame(land);\n // Pages without stored sizes only get their height once the pages above have loaded.\n if (!target.hasAttribute(\"height\")) for (const img of Array.from(scroller.children).slice(0, start)) img.addEventListener(\"load\", land, { once: true });\n }\n}\n","import type { Appearance, ProjectTheme } from \"@guidelytech/shared\";\nimport { readableTextOn, scopeCustomCss } from \"@guidelytech/shared/runtime\";\nimport { STYLES } from \"./styles\";\n\nexport const HOST_ID = \"guidely-root\";\n\nexport interface HostHandle {\n host: HTMLElement;\n shadow: ShadowRoot;\n /** Polite live region for screen-reader announcements. */\n live: HTMLElement;\n announce(text: string): void;\n destroy(): void;\n}\n\nlet current: HostHandle | null = null;\n\n/** Default project theme used when the config has not loaded yet. */\nexport const DEFAULT_THEME: ProjectTheme = {\n primaryColor: \"#4f46e5\",\n backgroundColor: \"#ffffff\",\n textColor: \"#111827\",\n borderRadius: 12,\n fontFamily: \"Inter, system-ui, -apple-system, sans-serif\",\n};\n\n/** Returns (creating when needed) the single Shadow-DOM host appended to `document.body`. */\nexport function ensureHost(doc: Document = document): HostHandle {\n if (current && current.host.isConnected && current.host.ownerDocument === doc) return current;\n let host = doc.getElementById(HOST_ID) as HTMLElement | null;\n if (!host) {\n host = doc.createElement(\"div\");\n host.id = HOST_ID;\n host.setAttribute(\"data-guidely\", \"\");\n (doc.body || doc.documentElement).appendChild(host);\n }\n const shadow = host.shadowRoot ?? host.attachShadow({ mode: \"open\" });\n if (!shadow.querySelector(\"style[data-g-base]\")) {\n const style = doc.createElement(\"style\");\n style.setAttribute(\"data-g-base\", \"\");\n style.textContent = STYLES;\n shadow.appendChild(style);\n }\n let live = shadow.querySelector<HTMLElement>(\".g-live\");\n if (!live) {\n live = doc.createElement(\"div\");\n live.className = \"g-live\";\n live.setAttribute(\"aria-live\", \"polite\");\n live.setAttribute(\"aria-atomic\", \"true\");\n shadow.appendChild(live);\n }\n const liveEl = live;\n current = {\n host,\n shadow,\n live: liveEl,\n announce(text: string) {\n liveEl.textContent = \"\";\n setTimeout(() => {\n liveEl.textContent = text;\n }, 30);\n },\n destroy() {\n host?.remove();\n if (current?.host === host) current = null;\n },\n };\n return current;\n}\n\n/** Removes the host from the document (all overlays with it). */\nexport function destroyHost(): void {\n current?.destroy();\n const stray = typeof document !== \"undefined\" ? document.getElementById(HOST_ID) : null;\n stray?.remove();\n current = null;\n}\n\nexport type ResolvedThemeMode = \"light\" | \"dark\";\n\nfunction prefersDark(): boolean {\n try {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n } catch {\n return false;\n }\n}\n\nexport function prefersReducedMotion(): boolean {\n try {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n } catch {\n return false;\n }\n}\n\nexport interface ThemeVars {\n primary: string;\n bg: string;\n text: string;\n radius: number;\n font: string;\n z: number;\n overlay: number;\n mode: ResolvedThemeMode;\n animation: Appearance[\"animation\"];\n}\n\n/** Merges project theme + guide appearance into CSS custom property values. */\nexport function resolveTheme(theme: Partial<ProjectTheme> | null | undefined, appearance?: Partial<Appearance> | null): ThemeVars {\n const t = { ...DEFAULT_THEME, ...(theme || {}) };\n const a = appearance || {};\n const requested = a.theme ?? \"auto\";\n const mode: ResolvedThemeMode = requested === \"auto\" ? (prefersDark() ? \"dark\" : \"light\") : requested;\n const dark = mode === \"dark\";\n return {\n primary: a.primaryColor || t.primaryColor,\n bg: a.backgroundColor || (dark ? \"#1f2937\" : t.backgroundColor),\n text: a.textColor || (dark ? \"#f9fafb\" : t.textColor),\n radius: a.borderRadius ?? t.borderRadius,\n font: a.fontFamily || t.fontFamily,\n z: a.zIndex ?? 2147483000,\n overlay: a.overlayOpacity ?? 0.5,\n mode,\n animation: prefersReducedMotion() ? \"none\" : (a.animation ?? \"fade\"),\n };\n}\n\n/** Applies theme variables to a scope element. */\nexport function applyTheme(el: HTMLElement, vars: ThemeVars): void {\n el.style.setProperty(\"--g-primary\", vars.primary);\n // Button labels, banners and badges on the primary colour use whichever of white or dark text reads better (WCAG AA).\n if (/^#[0-9a-f]{3}([0-9a-f]{3})?$/i.test(vars.primary)) el.style.setProperty(\"--g-primary-text\", readableTextOn(vars.primary));\n el.style.setProperty(\"--g-bg\", vars.bg);\n el.style.setProperty(\"--g-text\", vars.text);\n el.style.setProperty(\"--g-radius\", `${vars.radius}px`);\n el.style.setProperty(\"--g-font\", vars.font);\n el.style.setProperty(\"--g-z\", String(vars.z));\n el.style.setProperty(\"--g-overlay\", String(vars.overlay));\n el.setAttribute(\"data-theme\", vars.mode);\n el.setAttribute(\"data-anim\", vars.animation);\n}\n\n/**\n * Creates a themed scope container inside the shadow root. Each guide/widget renders inside its\n * own scope so appearance settings never leak between guides.\n */\nexport function createScope(theme?: Partial<ProjectTheme> | null, appearance?: Partial<Appearance> | null, doc: Document = document): { el: HTMLElement; vars: ThemeVars; destroy(): void } {\n const handle = ensureHost(doc);\n const el = doc.createElement(\"div\");\n el.className = \"g-scope\";\n const vars = resolveTheme(theme, appearance);\n applyTheme(el, vars);\n handle.shadow.appendChild(el);\n // Custom CSS (theme first, then the guide's) is sanitized and prefixed with this scope only. The\n // theme's CSS styles guides (scopes created with an appearance), not the resource center or messenger.\n const css = [appearance ? theme?.customCss : undefined, appearance?.customCss].filter((c): c is string => !!c && !!c.trim());\n let style: HTMLStyleElement | null = null;\n if (css.length) {\n const id = `c${++cssScopeSeq}`;\n el.setAttribute(\"data-g-css\", id);\n style = doc.createElement(\"style\");\n style.setAttribute(\"data-g-custom\", id);\n style.textContent = css.map((c) => scopeCustomCss(c, `.g-scope[data-g-css=\"${id}\"]`)).join(\"\\n\");\n handle.shadow.insertBefore(style, el);\n }\n let mq: MediaQueryList | null = null;\n const onChange = () => applyTheme(el, resolveTheme(theme, appearance));\n if ((appearance?.theme ?? \"auto\") === \"auto\" && typeof window !== \"undefined\" && typeof window.matchMedia === \"function\") {\n try {\n mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener?.(\"change\", onChange);\n } catch {\n mq = null;\n }\n }\n return {\n el,\n vars,\n destroy() {\n mq?.removeEventListener?.(\"change\", onChange);\n style?.remove();\n el.remove();\n },\n };\n}\n\nlet cssScopeSeq = 0;\n","/** All runtime CSS, injected once into the Shadow DOM host. Tokens are CSS custom properties. */\nexport const STYLES = `\n:host{all:initial;position:static;display:block;contain:none}\n*,*::before,*::after{box-sizing:border-box}\n.g-scope [hidden]{display:none!important}\n.g-scope{\n --g-primary:#4f46e5;--g-bg:#ffffff;--g-text:#111827;--g-radius:12px;--g-font:Inter,system-ui,-apple-system,sans-serif;--g-z:2147483000;--g-overlay:.5;\n --g-muted:color-mix(in srgb,var(--g-text) 62%,transparent);--g-border:color-mix(in srgb,var(--g-text) 12%,transparent);\n --g-subtle:color-mix(in srgb,var(--g-text) 5%,transparent);--g-shadow:0 10px 40px rgba(0,0,0,.18),0 2px 8px rgba(0,0,0,.08);\n --g-primary-text:#ffffff;\n font-family:var(--g-font);font-size:14px;line-height:1.5;color:var(--g-text);-webkit-font-smoothing:antialiased;\n}\n.g-scope[data-theme=\"dark\"]{--g-shadow:0 10px 40px rgba(0,0,0,.5),0 2px 8px rgba(0,0,0,.3)}\n.g-live{position:fixed;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\n.g-layer{position:fixed;inset:0;z-index:var(--g-z);pointer-events:none}\n.g-overlay{position:fixed;inset:0;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}\n.g-overlay.g-transparent{background:transparent}\n.g-spot-rect{position:fixed;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}\n.g-spot-ring{position:fixed;z-index:calc(var(--g-z) + 3);pointer-events:none;border-radius:6px;box-shadow:0 0 0 2px var(--g-primary),0 0 0 6px color-mix(in srgb,var(--g-primary) 30%,transparent)}\n.g-card{\n position:fixed;z-index:calc(var(--g-z) + 4);pointer-events:auto;background:var(--g-bg);color:var(--g-text);border-radius:var(--g-radius);\n box-shadow:var(--g-shadow);border:1px solid var(--g-border);width:min(360px,calc(100vw - 32px));max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow:auto;outline:none;\n}\n.g-card.g-modal{left:50%;top:50%;transform:translate(-50%,-50%);width:min(480px,calc(100vw - 32px))}\n.g-card.g-tooltip,.g-card.g-popover,.g-card.g-spotlight-card,.g-card.g-hotspot-card{top:0;left:0;width:min(320px,calc(100vw - 32px))}\n.g-card.g-slideout{width:min(360px,calc(100vw - 32px));margin:16px}\n.g-pos-bottom-right{right:0;bottom:0}.g-pos-bottom-left{left:0;bottom:0}.g-pos-top-right{right:0;top:0}.g-pos-top-left{left:0;top:0}\n.g-pos-center{left:50%;top:50%;transform:translate(-50%,-50%)}\n.g-pos-top{top:0;left:0;right:0}.g-pos-bottom{bottom:0;left:0;right:0}\n.g-banner{position:fixed;left:0;right:0;z-index:calc(var(--g-z) + 1);pointer-events:auto;background:var(--g-primary);color:var(--g-primary-text);padding:10px 48px 10px 16px;display:flex;align-items:center;gap:12px;font-size:14px;box-shadow:0 2px 10px rgba(0,0,0,.15);max-width:100vw}\n.g-banner .g-body{flex:1;min-width:0}\n.g-banner .g-body a{color:inherit;text-decoration:underline}\n.g-banner .g-close{color:inherit;right:8px;top:50%;transform:translateY(-50%)}\n.g-banner .g-btn{background:rgba(255,255,255,.18);color:inherit;border-color:transparent;min-height:36px}\n.g-banner.g-pos-top{top:0}.g-banner.g-pos-bottom{bottom:0}\n.g-inner{padding:20px}\n.g-close{position:absolute;top:8px;right:8px;width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border:0;background:transparent;color:var(--g-muted);border-radius:999px;cursor:pointer;font:inherit;font-size:20px;line-height:1}\n.g-close:hover,.g-close:focus-visible{background:var(--g-subtle);color:var(--g-text);outline:none}\n.g-close:focus-visible,.g-btn:focus-visible,.g-task:focus-visible,.g-choice:focus-visible,.g-scale button:focus-visible,.g-launcher:focus-visible,.g-input:focus-visible,.g-rc-item:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-image{display:block;width:100%;max-height:220px;object-fit:cover;border-radius:var(--g-radius) var(--g-radius) 0 0}\n.g-video{position:relative;display:block;width:100%;aspect-ratio:16/9;max-height:240px;overflow:hidden;background:#0f172a;border-radius:var(--g-radius) var(--g-radius) 0 0;cursor:pointer}\n.g-video-poster{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;pointer-events:none}\n.g-video-play{position:absolute;left:50%;top:50%;width:56px;height:56px;margin:-28px 0 0 -28px;display:flex;align-items:center;justify-content:center;padding-left:3px;box-sizing:border-box;border-radius:999px;background:rgba(15,23,42,.72);color:#fff;box-shadow:0 4px 14px rgba(0,0,0,.3);transition:transform .15s ease,background .15s ease}\n.g-video:hover .g-video-play,.g-video:focus-visible .g-video-play{transform:scale(1.08);background:var(--g-primary);color:var(--g-primary-text)}\n.g-video:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px}\n.g-title{margin:0 28px 6px 0;font-size:16px;font-weight:600;line-height:1.3}\n.g-body{font-size:14px;color:var(--g-text)}\n.g-body p{margin:0 0 8px}.g-body p:last-child{margin-bottom:0}\n.g-body ul,.g-body ol{margin:6px 0;padding-left:20px}\n.g-body a{color:var(--g-primary)}\n.g-body img{max-width:100%;height:auto;border-radius:6px}\n.g-body video,.g-body iframe{display:block;width:100%;max-width:100%;border:0;border-radius:6px;margin:8px 0;background:#000}\n.g-body video{height:auto;max-height:60vh}\n.g-body iframe{aspect-ratio:16/9;height:auto}\n.g-body .gd-pdf{margin:10px 0;border:1px solid var(--g-border);border-radius:10px;background:var(--g-subtle);overflow:hidden}\n.g-body a.gd-file{display:flex;align-items:center;gap:8px;padding:8px 10px;color:var(--g-text);font-size:13px;font-weight:500;text-decoration:none;min-height:40px;overflow-wrap:anywhere}\n.g-body a.gd-file::before{content:\"PDF\";flex:none;font-size:9px;font-weight:700;letter-spacing:.04em;line-height:1;color:#fff;background:#e5484d;border-radius:4px;padding:4px 5px}\n.g-body a.gd-file::after{content:\"⤢\";margin-left:auto;padding-left:8px;color:var(--g-muted);font-size:15px}\n.g-body a.gd-file:hover::after,.g-body a.gd-file:focus-visible::after{color:var(--g-primary)}\n.g-body a.gd-file:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px;border-radius:10px}\n.g-body > a.gd-file,.g-body p > a.gd-file{margin:10px 0;border:1px solid var(--g-border);border-radius:10px;background:var(--g-subtle)}\n.g-body > a.gd-file::after,.g-body p > a.gd-file::after,.g-body .gd-pdf:not([data-g-ready]) > a.gd-file::after{content:\"↗\"}\n.g-pdf-viewport{position:relative}\n.g-body .gd-pdf-pages{display:flex;gap:10px;overflow-x:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;scrollbar-width:none;padding:0 10px 10px;scroll-padding:0 10px}\n.g-body .gd-pdf-pages::-webkit-scrollbar{display:none}\n.g-body .gd-pdf-pages:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px}\n.g-body .gd-pdf-pages img{flex:0 0 100%;width:100%;height:auto;margin:0;scroll-snap-align:center;background:#fff;border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.18);cursor:zoom-in}\n.g-pdf-viewport .gd-pdf-pages{padding:0;scroll-padding:0;margin:0 10px 10px}\n.g-pdf-count{position:absolute;right:18px;bottom:18px;padding:2px 8px;border-radius:999px;background:rgba(17,17,17,.72);color:#fff;font-size:11px;font-weight:500;pointer-events:none;font-variant-numeric:tabular-nums}\n.g-pdf-nav{position:absolute;top:calc(50% - 21px);width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:999px;background:rgba(17,17,17,.6);color:#fff;font:inherit;font-size:20px;line-height:1;cursor:pointer;opacity:0;transition:opacity .15s}\n.g-pdf-prev{left:16px}.g-pdf-next{right:16px}\n.g-pdf-viewport:hover .g-pdf-nav,.g-pdf-nav:focus-visible{opacity:1}\n.g-pdf-nav:disabled,.g-pdf-single .g-pdf-nav,.g-pdf-single .g-pdf-count{display:none}\n.g-pdf-nav:focus-visible{outline:2px solid #fff;outline-offset:1px}\n@media (hover:none){.g-pdf-nav{display:none}}\n.g-pdf-reader{position:fixed;inset:0;z-index:calc(var(--g-z) + 10);display:flex;flex-direction:column;background:#0b0b0d;pointer-events:auto;color:#fff}\n.g-pdf-bar{display:flex;align-items:center;gap:10px;padding:8px 8px 8px 16px;min-height:56px}\n.g-pdf-title{flex:1;min-width:0;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.g-pdf-bar .g-btn{min-height:36px;color:#fff;background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.18)}\n.g-pdf-close{position:static;color:#fff}\n.g-pdf-close:hover,.g-pdf-close:focus-visible{background:rgba(255,255,255,.14);color:#fff}\n.g-pdf-scroll{position:relative;flex:1;overflow-y:auto;overscroll-behavior:contain;padding:4px 16px 24px;display:flex;flex-direction:column;align-items:center;gap:12px;outline:none}\n.g-pdf-scroll img{display:block;width:100%;max-width:900px;height:auto;background:#fff;border-radius:2px;box-shadow:0 2px 12px rgba(0,0,0,.4)}\n.g-body code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;background:var(--g-subtle);padding:1px 4px;border-radius:4px}\n.g-body pre{background:var(--g-subtle);padding:10px;border-radius:6px;overflow:auto}\n.g-body blockquote{margin:6px 0;padding-left:10px;border-left:3px solid var(--g-border);color:var(--g-muted)}\n.g-footer{display:flex;align-items:center;gap:8px;margin-top:14px;flex-wrap:wrap}\n.g-progress{font-size:12px;color:var(--g-muted);margin-right:auto}\n.g-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:8px 14px;border-radius:calc(var(--g-radius) * .66);border:1px solid transparent;font:inherit;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;transition:background .15s,color .15s,border-color .15s}\n.g-btn-primary{background:var(--g-primary);color:var(--g-primary-text)}\n.g-btn-primary:hover{filter:brightness(1.08)}\n.g-btn-secondary{background:var(--g-subtle);color:var(--g-text);border-color:var(--g-border)}\n.g-btn-secondary:hover{background:color-mix(in srgb,var(--g-text) 10%,transparent)}\n.g-btn-ghost{background:transparent;color:var(--g-muted)}\n.g-btn-ghost:hover{background:var(--g-subtle);color:var(--g-text)}\n.g-btn-link{background:transparent;color:var(--g-primary);padding-left:4px;padding-right:4px}\n.g-btn-link:hover{text-decoration:underline}\n.g-btn:disabled{opacity:.5;cursor:not-allowed}\n.g-arrow{position:absolute;width:12px;height:12px;background:var(--g-bg);transform:rotate(45deg);border:1px solid var(--g-border);z-index:-1}\n.g-hotspot{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;border-radius:999px;background:var(--g-primary);border:2px solid #fff;box-shadow:0 0 0 2px color-mix(in srgb,var(--g-primary) 40%,transparent);cursor:pointer;padding:0;margin:0}\n.g-hotspot::after{content:\"\";position:absolute;inset:-4px;border-radius:999px;border:2px solid var(--g-primary);opacity:0}\n.g-hotspot.g-pulse::after{animation:g-pulse 1.8s ease-out infinite}\n.g-hotspot-hit{position:absolute;inset:-14px}\n.g-custom{position:fixed;z-index:calc(var(--g-z) + 4);pointer-events:auto;left:50%;top:50%;transform:translate(-50%,-50%);max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow:auto}\n/* animations */\n.g-scope[data-anim=\"fade\"] .g-card,.g-scope[data-anim=\"fade\"] .g-banner,.g-scope[data-anim=\"fade\"] .g-panel{animation:g-fade .18s ease-out}\n.g-scope[data-anim=\"slide\"] .g-card,.g-scope[data-anim=\"slide\"] .g-panel{animation:g-slide .22s ease-out}\n.g-scope[data-anim=\"none\"] *{animation:none!important;transition:none!important}\n@keyframes g-fade{from{opacity:0}to{opacity:1}}\n@keyframes g-slide{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}\n@keyframes g-pulse{0%{transform:scale(.6);opacity:.9}100%{transform:scale(2.2);opacity:0}}\n@media (prefers-reduced-motion:reduce){.g-scope *{animation:none!important;transition:none!important}}\n/* launcher + panel (checklist / resource center) */\n.g-launcher{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:10px 16px;border-radius:999px;border:0;background:var(--g-primary);color:var(--g-primary-text);font:inherit;font-size:14px;font-weight:600;cursor:pointer;box-shadow:var(--g-shadow);margin:16px}\n.g-launcher .g-ring{width:22px;height:22px;border-radius:999px;background:conic-gradient(#fff var(--g-pct,0%),rgba(255,255,255,.3) 0);display:inline-flex;align-items:center;justify-content:center;font-size:10px;position:relative}\n.g-launcher .g-ring::after{content:\"\";position:absolute;inset:3px;border-radius:999px;background:var(--g-primary)}\n.g-launcher .g-count{position:relative;z-index:1}\n.g-panel{position:fixed;z-index:calc(var(--g-z) + 2);pointer-events:auto;width:min(380px,calc(100vw - 32px));max-height:min(620px,calc(100vh - 100px));display:flex;flex-direction:column;background:var(--g-bg);color:var(--g-text);border-radius:var(--g-radius);box-shadow:var(--g-shadow);border:1px solid var(--g-border);margin:16px;bottom:60px;overflow:hidden}\n.g-panel-head{padding:16px 48px 12px 20px;border-bottom:1px solid var(--g-border);position:relative}\n.g-panel-title{margin:0;font-size:16px;font-weight:600}\n.g-panel-sub{margin:4px 0 0;font-size:12px;color:var(--g-muted)}\n.g-panel-body{overflow:auto;padding:8px 0;flex:1}\n.g-help{display:flex;flex-direction:column;min-height:0;flex:1}\n.g-bar{height:6px;border-radius:999px;background:var(--g-subtle);overflow:hidden;margin-top:10px}\n.g-bar > span{display:block;height:100%;background:var(--g-primary);transition:width .3s}\n.g-task{display:flex;gap:12px;align-items:flex-start;width:100%;padding:12px 20px;border:0;background:transparent;text-align:left;font:inherit;color:inherit;cursor:pointer;min-height:44px}\n.g-task:hover{background:var(--g-subtle)}\n.g-task[disabled]{cursor:not-allowed;opacity:.55}\n.g-task .g-check{flex:none;width:22px;height:22px;border-radius:999px;border:2px solid var(--g-border);display:inline-flex;align-items:center;justify-content:center;font-size:13px;margin-top:1px;color:#fff}\n.g-task.g-done .g-check{background:var(--g-primary);border-color:var(--g-primary)}\n.g-task.g-done .g-task-title{text-decoration:line-through;color:var(--g-muted)}\n.g-task-title{font-weight:500}\n.g-task-desc{font-size:12px;color:var(--g-muted);margin-top:2px}\n.g-panel-foot{padding:10px 20px;border-top:1px solid var(--g-border);display:flex;justify-content:flex-end;gap:8px}\n.g-complete{padding:28px 20px;text-align:center}\n.g-complete .g-title{margin-right:0;font-size:18px}\n/* survey */\n.g-question{margin-bottom:16px}\n.g-q-title{font-weight:600;margin:0 0 4px}\n.g-q-desc{font-size:12px;color:var(--g-muted);margin:0 0 8px}\n.g-scale{display:flex;gap:4px;flex-wrap:wrap}\n.g-scale button{min-width:34px;height:40px;flex:1;padding:0 4px;border-radius:6px;border:1px solid var(--g-border);background:var(--g-subtle);color:var(--g-text);font:inherit;cursor:pointer}\n.g-scale button[aria-pressed=\"true\"],.g-scale button:hover{background:var(--g-primary);color:var(--g-primary-text);border-color:var(--g-primary)}\n.g-scale-labels{display:flex;justify-content:space-between;font-size:11px;color:var(--g-muted);margin-top:4px}\n.g-stars button,.g-thumbs button{font-size:22px;background:transparent;border:0;cursor:pointer;color:var(--g-muted);min-width:40px;height:40px;font:inherit}\n.g-stars button[aria-pressed=\"true\"],.g-stars button.g-on{color:#f59e0b}\n.g-thumbs button[aria-pressed=\"true\"]{color:var(--g-primary)}\n.g-choice{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--g-border);border-radius:8px;margin-bottom:6px;cursor:pointer;min-height:40px;font:inherit;background:transparent;color:inherit;width:100%;text-align:left}\n.g-choice[aria-checked=\"true\"]{border-color:var(--g-primary);background:color-mix(in srgb,var(--g-primary) 8%,transparent)}\n.g-choice .g-dot{width:16px;height:16px;border-radius:999px;border:2px solid var(--g-border);flex:none}\n.g-choice.g-multi .g-dot{border-radius:4px}\n.g-choice[aria-checked=\"true\"] .g-dot{background:var(--g-primary);border-color:var(--g-primary)}\n.g-input{width:100%;min-height:40px;padding:8px 10px;border:1px solid var(--g-border);border-radius:8px;background:var(--g-bg);color:var(--g-text);font:inherit;resize:vertical}\n.g-error{color:#dc2626;font-size:12px;margin-top:4px}\n/* resource center */\n.g-rc-search{padding:12px 20px 4px}\n.g-rc-section{padding:8px 20px 4px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--g-muted);font-weight:600}\n.g-rc-section[data-depth]{text-transform:none;letter-spacing:0;font-size:12px}\n.g-rc-item{display:flex;align-items:flex-start;gap:10px;width:100%;padding:10px 20px;border:0;background:transparent;font:inherit;color:inherit;text-align:left;cursor:pointer;min-height:44px;text-decoration:none}\n.g-rc-item:hover{background:var(--g-subtle)}\n.g-rc-item .g-rc-title{font-weight:500}\n.g-rc-item .g-rc-sum{font-size:12px;color:var(--g-muted);margin-top:2px}\n.g-rc-item .g-rc-icon{flex:none;width:20px;text-align:center;color:var(--g-primary)}\n.g-rc-row{display:flex;align-items:center;gap:6px;padding-right:16px}\n.g-rc-row>.g-rc-item{flex:1;min-width:0;padding-right:4px}\n.g-rc-row:hover{background:var(--g-subtle)}\n.g-rc-row:hover>.g-rc-item{background:transparent}\n.g-rc-showme{flex:none;min-height:32px;padding:4px 10px;font-size:12px;white-space:nowrap}\n.g-help-showme{margin:4px 0 12px}\n.g-rc-article{padding:16px 20px}\n.g-resource-center .g-panel{transition:width .2s ease,max-height .2s ease}\n.g-resource-center .g-panel.g-panel-reading{width:min(720px,calc(100vw - 32px));max-height:calc(100vh - 100px)}\n.g-rc-back{margin-bottom:8px}\n.g-rc-empty{padding:24px 20px;color:var(--g-muted);text-align:center}\n.g-faq-a{padding:0 20px 12px 50px;font-size:13px;color:var(--g-muted)}\n.g-faq-a[hidden]{display:none}\n/* authoring */\n.g-auth-bar{position:fixed;top:0;left:0;right:0;z-index:calc(var(--g-z) + 10);pointer-events:auto;display:flex;align-items:center;gap:12px;padding:8px 16px;background:#111827;color:#fff;font:500 13px/1.4 var(--g-font);box-shadow:0 2px 10px rgba(0,0,0,.3)}\n.g-auth-bar .g-dot-live{width:8px;height:8px;border-radius:999px;background:#22c55e;box-shadow:0 0 0 3px rgba(34,197,94,.3)}\n.g-auth-bar .g-spacer{flex:1}\n.g-auth-bar .g-btn{min-height:32px;padding:4px 12px;font-size:13px}\n.g-auth-bar .g-btn-secondary{background:rgba(255,255,255,.12);color:#fff;border-color:transparent}\n.g-auth-outline{position:fixed;z-index:calc(var(--g-z) + 9);pointer-events:none;border:2px solid var(--g-primary);background:color-mix(in srgb,var(--g-primary) 12%,transparent);border-radius:4px;transition:all .06s linear}\n.g-auth-label{position:absolute;left:-2px;top:-24px;background:var(--g-primary);color:#fff;font:600 11px/1 var(--g-font);padding:5px 7px;border-radius:4px;white-space:nowrap;max-width:320px;overflow:hidden;text-overflow:ellipsis}\n.g-auth-outline.g-picked{border-style:dashed;border-color:#22c55e;background:rgba(34,197,94,.12)}\n.g-auth-outline.g-picked .g-auth-label{background:#16a34a}\n.g-highlight{position:fixed;z-index:calc(var(--g-z) + 8);pointer-events:none;border:2px dashed #f59e0b;background:rgba(245,158,11,.12);border-radius:4px}\n@media (max-width:480px){.g-card.g-modal,.g-panel{width:calc(100vw - 32px)}.g-inner{padding:16px}}\n/* resource center: unread badge + \"What's new\" */\n.g-launcher-badge{position:absolute;top:-4px;right:-4px;min-width:20px;height:20px;padding:0 6px;border-radius:999px;background:#dc2626;color:#fff;font-size:11px;font-weight:700;line-height:20px;text-align:center;box-shadow:0 0 0 2px var(--g-bg)}\n.g-rc-news{padding:10px 20px 12px;border-bottom:1px solid var(--g-border)}\n.g-rc-news:last-of-type{border-bottom:0}\n.g-rc-news-head{display:flex;align-items:baseline;gap:8px}\n.g-rc-news-title{margin:0;font-size:14px;font-weight:600;line-height:1.35;flex:1}\n.g-rc-news-new{flex:none;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--g-primary-text);background:var(--g-primary);border-radius:999px;padding:2px 7px}\n.g-rc-news-date{display:block;font-size:12px;color:var(--g-muted);margin:2px 0 6px}\n.g-rc-news-body{font-size:13px}\n.g-rc-news-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}\n.g-rc-news-actions .g-btn{min-height:32px;padding:6px 12px;font-size:13px}\n/* accessibility */\n.g-sr-only{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n.g-hotspot:focus-visible,.g-custom:focus-visible,.g-card:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n@media (forced-colors:active){.g-card,.g-panel,.g-banner{border:1px solid CanvasText}.g-btn{border:1px solid ButtonText}}\n`;\n","import { arrow, autoPlacement, autoUpdate, computePosition, flip, offset, shift, type Placement as FuiPlacement } from \"@floating-ui/dom\";\nimport type { Placement } from \"@guidelytech/shared\";\nimport { visualRect } from \"./selectors\";\n\nexport interface AnchorOptions {\n placement?: Placement;\n offset?: number;\n arrowEl?: HTMLElement | null;\n /** Called after every position update. */\n onUpdate?: (placement: FuiPlacement) => void;\n}\n\n/**\n * Anchors `floating` next to `reference` using floating-ui (`flip`, `shift`, `offset`, `arrow`).\n * `placement: \"auto\"` uses `autoPlacement`. Returns a cleanup function that stops `autoUpdate`.\n */\nexport function anchor(target: Element, floating: HTMLElement, options: AnchorOptions = {}): () => void {\n // A shadow host is measured with its shadow content (see `visualRect`).\n const reference = target.shadowRoot ? { getBoundingClientRect: () => visualRect(target), contextElement: target } : target;\n const placement = options.placement ?? \"auto\";\n const gap = options.offset ?? 10;\n const middleware = [offset(gap + (options.arrowEl ? 4 : 0))];\n if (placement === \"auto\") middleware.push(autoPlacement({ padding: 16 }));\n else middleware.push(flip({ padding: 16 }));\n middleware.push(shift({ padding: 16 }));\n if (options.arrowEl) middleware.push(arrow({ element: options.arrowEl, padding: 8 }));\n let stopped = false;\n const update = async () => {\n if (stopped || !floating.isConnected) return;\n try {\n const result = await computePosition(reference, floating, {\n placement: placement === \"auto\" ? \"bottom\" : placement,\n strategy: \"fixed\",\n middleware,\n });\n if (stopped) return;\n floating.style.left = `${Math.round(result.x)}px`;\n floating.style.top = `${Math.round(result.y)}px`;\n floating.setAttribute(\"data-placement\", result.placement);\n if (options.arrowEl && result.middlewareData.arrow) {\n const { x, y } = result.middlewareData.arrow;\n const side = result.placement.split(\"-\")[0];\n const staticSide = { top: \"bottom\", right: \"left\", bottom: \"top\", left: \"right\" }[side as \"top\" | \"right\" | \"bottom\" | \"left\"];\n Object.assign(options.arrowEl.style, {\n left: x != null ? `${x}px` : \"\",\n top: y != null ? `${y}px` : \"\",\n right: \"\",\n bottom: \"\",\n [staticSide]: \"-7px\",\n });\n }\n options.onUpdate?.(result.placement);\n } catch {\n /* positioning must never crash the host */\n }\n };\n let stopAuto: (() => void) | null = null;\n try {\n stopAuto = autoUpdate(reference, floating, () => void update(), { animationFrame: false });\n } catch {\n void update();\n }\n return () => {\n stopped = true;\n stopAuto?.();\n };\n}\n\n/** Tracks the bounding rect of an element and calls `cb` on scroll/resize/mutation. */\nexport function trackRect(el: Element, cb: (rect: DOMRect) => void): () => void {\n let raf = 0;\n let stopped = false;\n const run = () => {\n if (stopped) return;\n cb(visualRect(el));\n };\n const schedule = () => {\n if (stopped) return;\n if (typeof requestAnimationFrame === \"function\") {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(run);\n } else run();\n };\n run();\n const win = el.ownerDocument.defaultView;\n win?.addEventListener(\"scroll\", schedule, true);\n win?.addEventListener(\"resize\", schedule);\n // `scroll` is not composed: scrolling a container inside a shadow root never reaches `window`.\n const shadowRoots: ShadowRoot[] = [];\n for (let root = el.getRootNode(); root.nodeType === 11 && (root as ShadowRoot).host; root = (root as ShadowRoot).host.getRootNode()) shadowRoots.push(root as ShadowRoot);\n for (const root of shadowRoots) root.addEventListener(\"scroll\", schedule, true);\n let ro: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n try {\n ro = new ResizeObserver(schedule);\n ro.observe(el);\n if (el.ownerDocument.documentElement) ro.observe(el.ownerDocument.documentElement);\n } catch {\n ro = null;\n }\n }\n const interval = setInterval(run, 500);\n return () => {\n stopped = true;\n win?.removeEventListener(\"scroll\", schedule, true);\n win?.removeEventListener(\"resize\", schedule);\n for (const root of shadowRoots) root.removeEventListener(\"scroll\", schedule, true);\n ro?.disconnect();\n clearInterval(interval);\n if (typeof cancelAnimationFrame === \"function\") cancelAnimationFrame(raf);\n };\n}\n","import { visibleButtons, type GuideStep, type StepButton } from \"@guidelytech/shared\";\nimport { isVideoFileUrl, stepVideo } from \"@guidelytech/shared/runtime\";\nimport { anchor, trackRect } from \"./position\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nexport interface RenderStepOptions {\n /** Themed scope element inside the shadow root. */\n scope: HTMLElement;\n step: GuideStep;\n index: number;\n total: number;\n /** Whether a \"back\" action has a step to return to; back buttons are hidden otherwise. */\n canGoBack?: boolean;\n target?: Element | null;\n /** Render anchored steps as a centered modal (target fallback). */\n asModal?: boolean;\n onButton: (button: StepButton) => void;\n /** Close button / Escape / outside click. */\n onClose: () => void;\n /** Called when a hotspot is expanded. */\n onOpen?: () => void;\n /** The step's video was clicked (it opens in a new tab on its own). */\n onVideo?: (url: string) => void;\n announce?: (text: string) => void;\n /** Run the step's code block (custom steps; see RunGuideOptions.runCode). */\n runCode?: boolean;\n onError?: (error: unknown) => void;\n}\n\nexport interface StepView {\n /** Root element of the rendered step (card, banner, hotspot...). */\n el: HTMLElement;\n /** Element that received focus (card), when any. */\n card: HTMLElement | null;\n destroy(): void;\n}\n\nconst FOCUSABLE = \"button:not([disabled]),[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex='-1'])\";\nlet uid = 0;\nconst nextId = (p: string) => `g-${p}-${++uid}`;\n\nfunction h<K extends keyof HTMLElementTagNameMap>(doc: Document, tag: K, className?: string, text?: string): HTMLElementTagNameMap[K] {\n const el = doc.createElement(tag);\n if (className) el.className = className;\n if (text != null) el.textContent = text;\n return el;\n}\n\nfunction buildButtons(doc: Document, step: GuideStep, canGoBack: boolean, onButton: (b: StepButton) => void): HTMLElement[] {\n return visibleButtons(step, canGoBack).map((b) => {\n const btn = h(doc, \"button\", `g-btn g-btn-${b.variant}`, b.label);\n btn.type = \"button\";\n btn.setAttribute(\"data-action\", b.action);\n btn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n onButton(b);\n });\n return btn;\n });\n}\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nfunction playIcon(doc: Document): SVGSVGElement {\n const svg = doc.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"width\", \"22\");\n svg.setAttribute(\"height\", \"22\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n const path = doc.createElementNS(SVG_NS, \"path\");\n path.setAttribute(\"fill\", \"currentColor\");\n path.setAttribute(\"d\", \"M8 5.5v13a.75.75 0 0 0 1.14.64l10.4-6.5a.75.75 0 0 0 0-1.28L9.14 4.86A.75.75 0 0 0 8 5.5Z\");\n svg.appendChild(path);\n return svg;\n}\n\n/** The step's video as a poster with a play button: a plain link, so it opens in a new tab. */\nfunction buildVideo(doc: Document, step: GuideStep, video: { url: string; poster: string | null }, onVideo?: (url: string) => void): HTMLElement {\n const a = h(doc, \"a\", \"g-video\");\n a.href = video.url;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n // Middle clicks open a tab too, so count them.\n const opened = (e: MouseEvent) => {\n if (e.type === \"auxclick\" && e.button !== 1) return;\n onVideo?.(video.url);\n };\n a.addEventListener(\"click\", opened);\n a.addEventListener(\"auxclick\", opened);\n a.setAttribute(\"aria-label\", `${step.title ? `Play video: ${step.title}` : \"Play video\"} (opens in a new tab)`);\n if (video.poster) {\n const img = h(doc, \"img\", \"g-video-poster\");\n img.src = video.poster;\n img.alt = \"\";\n img.addEventListener(\"error\", () => img.remove());\n a.appendChild(img);\n } else if (isVideoFileUrl(video.url)) {\n // No poster: the file's first frame.\n const v = h(doc, \"video\", \"g-video-poster\");\n v.src = `${video.url}#t=0.1`;\n v.preload = \"metadata\";\n v.muted = true;\n v.playsInline = true;\n v.tabIndex = -1;\n v.setAttribute(\"aria-hidden\", \"true\");\n a.appendChild(v);\n }\n const play = h(doc, \"span\", \"g-video-play\");\n play.appendChild(playIcon(doc));\n a.appendChild(play);\n return a;\n}\n\n/** Builds the shared chrome: close, image or video, title, body, progress and buttons. */\nexport function buildCard(doc: Document, opts: RenderStepOptions, extraClass: string): { card: HTMLElement; inner: HTMLElement; titleId: string; bodyId: string } {\n const { step } = opts;\n const card = h(doc, \"div\", `g-card ${extraClass}`);\n card.tabIndex = -1;\n card.setAttribute(\"data-step-id\", step.id);\n if (step.width) card.style.width = `min(${step.width}px, calc(100vw - 32px))`;\n const titleId = nextId(\"title\");\n const bodyId = nextId(\"body\");\n const video = stepVideo(step);\n if (video) {\n card.appendChild(buildVideo(doc, step, video, opts.onVideo));\n } else if (step.imageUrl) {\n const img = h(doc, \"img\", \"g-image\");\n img.src = step.imageUrl;\n // Empty alt = decorative (the default), so screen readers skip it.\n img.alt = step.imageAlt ?? \"\";\n card.appendChild(img);\n }\n const inner = h(doc, \"div\", \"g-inner\");\n if (step.showClose) {\n const close = h(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.addEventListener(\"click\", (e) => {\n e.preventDefault();\n opts.onClose();\n });\n card.appendChild(close);\n }\n if (step.title) {\n const t = h(doc, \"h2\", \"g-title\", step.title);\n t.id = titleId;\n inner.appendChild(t);\n }\n if (step.body) {\n const b = h(doc, \"div\", \"g-body\");\n b.id = bodyId;\n setSanitizedHtml(b, step.body);\n inner.appendChild(b);\n }\n const buttons = buildButtons(doc, step, opts.canGoBack ?? opts.index > 0, opts.onButton);\n if (buttons.length || (step.showProgress && opts.total > 1)) {\n const footer = h(doc, \"div\", \"g-footer\");\n if (step.showProgress && opts.total > 1) {\n const progress = h(doc, \"span\", \"g-progress\", `${opts.index + 1} of ${opts.total}`);\n progress.setAttribute(\"aria-label\", `Step ${opts.index + 1} of ${opts.total}`);\n footer.appendChild(progress);\n }\n buttons.forEach((b) => footer.appendChild(b));\n inner.appendChild(footer);\n }\n card.appendChild(inner);\n if (step.title) card.setAttribute(\"aria-labelledby\", titleId);\n else card.setAttribute(\"aria-label\", opts.total > 1 ? `Step ${opts.index + 1} of ${opts.total}` : \"Guide\");\n if (step.body) card.setAttribute(\"aria-describedby\", bodyId);\n return { card, inner, titleId, bodyId };\n}\n\nfunction focusables(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE));\n}\n\nfunction isTextEntry(el: EventTarget | null): boolean {\n const t = el as HTMLElement | null;\n if (!t || !t.tagName) return false;\n const tag = t.tagName.toLowerCase();\n return tag === \"input\" || tag === \"textarea\" || tag === \"select\" || t.isContentEditable === true;\n}\n\n/**\n * Keyboard handling: Escape closes (when allowed), Tab is trapped inside modals, and the arrow keys\n * move between steps (→ = the step's Next / Done button, ← = Back) unless focus is in a text field.\n */\nfunction installKeyboard(card: HTMLElement, step: GuideStep, trap: boolean, onClose: () => void): () => void {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && step.showClose) {\n e.stopPropagation();\n onClose();\n return;\n }\n if ((e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") && !e.altKey && !e.ctrlKey && !e.metaKey && !isTextEntry(e.target)) {\n const actions = e.key === \"ArrowRight\" ? [\"next\", \"complete\"] : [\"back\"];\n const btn = actions.map((a) => card.querySelector<HTMLButtonElement>(`button[data-action=\"${a}\"]`)).find(Boolean);\n if (btn) {\n e.preventDefault();\n e.stopPropagation();\n btn.click();\n }\n return;\n }\n if (trap && e.key === \"Tab\") {\n const items = focusables(card);\n if (!items.length) {\n e.preventDefault();\n card.focus();\n return;\n }\n const first = items[0] as HTMLElement;\n const last = items[items.length - 1] as HTMLElement;\n const active = (card.getRootNode() as ShadowRoot | Document).activeElement;\n if (e.shiftKey && (active === first || active === card)) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n card.addEventListener(\"keydown\", onKey);\n return () => card.removeEventListener(\"keydown\", onKey);\n}\n\nfunction focusInto(card: HTMLElement): () => void {\n const doc = card.ownerDocument;\n const active = doc.activeElement as HTMLElement | null;\n // Focus inside the Guidely host (a previous step) is not worth returning to; the controller restores the page's.\n const previous = active && active.id !== \"guidely-root\" ? active : null;\n const primary = card.querySelector<HTMLElement>(\".g-btn-primary\") || focusables(card)[0] || card;\n try {\n primary.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n return () => {\n try {\n if (previous && previous.isConnected && typeof previous.focus === \"function\") previous.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n };\n}\n\nfunction overlayEl(doc: Document, opts: RenderStepOptions, transparent = false): HTMLElement {\n const overlay = h(doc, \"div\", `g-overlay${transparent ? \" g-transparent\" : \"\"}`);\n if (opts.step.dismissOnOutsideClick) overlay.addEventListener(\"click\", () => opts.onClose());\n return overlay;\n}\n\nfunction positionClass(position: GuideStep[\"position\"]): string {\n return `g-pos-${position}`;\n}\n\nexport function renderModal(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const { card } = buildCard(doc, opts, \"g-modal\");\n card.setAttribute(\"role\", \"dialog\");\n card.setAttribute(\"aria-modal\", \"true\");\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay || opts.asModal) wrapper.appendChild(overlayEl(doc, opts));\n else if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(card, opts.step, true, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nfunction cleanupAll(cleanups: Array<() => void>, el: HTMLElement) {\n cleanups.splice(0).forEach((fn) => {\n try {\n fn();\n } catch {\n /* ignore */\n }\n });\n el.remove();\n}\n\nfunction setTargetDescribedBy(target: Element, id: string): () => void {\n const prev = target.getAttribute(\"aria-describedby\");\n try {\n target.setAttribute(\"aria-describedby\", prev ? `${prev} ${id}` : id);\n } catch {\n return () => {};\n }\n return () => {\n if (prev) target.setAttribute(\"aria-describedby\", prev);\n else target.removeAttribute(\"aria-describedby\");\n };\n}\n\nexport function renderTooltip(doc: Document, opts: RenderStepOptions, kind: \"tooltip\" | \"popover\"): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const { card } = buildCard(doc, opts, `g-${kind}`);\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n card.setAttribute(\"role\", kind === \"tooltip\" ? \"tooltip\" : \"dialog\");\n card.id = nextId(kind);\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay) wrapper.appendChild(overlayEl(doc, opts));\n else if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n if (opts.step.target?.scrollIntoView !== false) scrollTo(target);\n cleanups.push(anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset, arrowEl }));\n cleanups.push(setTargetDescribedBy(target, card.id));\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nfunction scrollTo(target: Element) {\n try {\n target.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\", behavior: \"auto\" });\n } catch {\n /* ignore */\n }\n}\n\n/** Overlay with a cut-out around the target (4 rects), so the target itself stays clickable. */\nexport function renderSpotlight(doc: Document, opts: RenderStepOptions): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const wrapper = h(doc, \"div\", \"g-step\");\n const pad = opts.step.spotlightPadding ?? 6;\n const rects = [\"top\", \"left\", \"right\", \"bottom\"].map((side) => {\n const r = h(doc, \"div\", `g-spot-rect g-spot-${side}`);\n if (opts.step.dismissOnOutsideClick) r.addEventListener(\"click\", () => opts.onClose());\n wrapper.appendChild(r);\n return r;\n });\n const ring = h(doc, \"div\", \"g-spot-ring\");\n wrapper.appendChild(ring);\n const { card } = buildCard(doc, opts, \"g-spotlight-card\");\n card.setAttribute(\"role\", \"dialog\");\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n if (opts.step.target?.scrollIntoView !== false) scrollTo(target);\n const win = doc.defaultView;\n const layout = (r: DOMRect) => {\n const vw = win?.innerWidth ?? 0;\n const vh = win?.innerHeight ?? 0;\n const x = Math.max(0, r.left - pad);\n const y = Math.max(0, r.top - pad);\n const w = Math.min(vw, r.right + pad) - x;\n const hgt = Math.min(vh, r.bottom + pad) - y;\n const [top, left, right, bottom] = rects as unknown as [HTMLElement, HTMLElement, HTMLElement, HTMLElement];\n Object.assign(top.style, { left: \"0\", top: \"0\", width: \"100%\", height: `${y}px` });\n Object.assign(left.style, { left: \"0\", top: `${y}px`, width: `${x}px`, height: `${hgt}px` });\n Object.assign(right.style, { left: `${x + w}px`, top: `${y}px`, width: `${Math.max(0, vw - x - w)}px`, height: `${hgt}px` });\n Object.assign(bottom.style, { left: \"0\", top: `${y + hgt}px`, width: \"100%\", height: `${Math.max(0, vh - y - hgt)}px` });\n Object.assign(ring.style, { left: `${x}px`, top: `${y}px`, width: `${w}px`, height: `${hgt}px` });\n };\n cleanups.push(trackRect(target, layout));\n cleanups.push(anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset + pad, arrowEl }));\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/** Pulsing dot at the target; opens an anchored card on click/hover. */\nexport function renderHotspot(doc: Document, opts: RenderStepOptions): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const cfg = opts.step.hotspot ?? { size: 14, pulse: true, openOn: \"click\" as const };\n const wrapper = h(doc, \"div\", \"g-step\");\n const dot = h(doc, \"button\", `g-hotspot${cfg.pulse ? \" g-pulse\" : \"\"}`);\n dot.type = \"button\";\n dot.setAttribute(\"aria-label\", opts.step.title || \"Open hint\");\n dot.setAttribute(\"aria-expanded\", \"false\");\n dot.style.width = `${cfg.size}px`;\n dot.style.height = `${cfg.size}px`;\n dot.appendChild(h(doc, \"span\", \"g-hotspot-hit\"));\n wrapper.appendChild(dot);\n opts.scope.appendChild(wrapper);\n cleanups.push(trackRect(target, (r) => {\n dot.style.left = `${Math.round(r.right - cfg.size / 2)}px`;\n dot.style.top = `${Math.round(r.top - cfg.size / 2)}px`;\n }));\n let card: HTMLElement | null = null;\n let stopAnchor: (() => void) | null = null;\n let stopKeys: (() => void) | null = null;\n const close = (returnFocus = false) => {\n const hadFocus = !!card && (card.getRootNode() as ShadowRoot | Document).activeElement !== null && card.contains((card.getRootNode() as ShadowRoot | Document).activeElement);\n stopAnchor?.();\n stopKeys?.();\n card?.remove();\n card = null;\n dot.setAttribute(\"aria-expanded\", \"false\");\n // Keyboard users land back on the dot that opened the card.\n if (returnFocus || hadFocus) {\n try {\n dot.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n }\n };\n const open = () => {\n if (card) return;\n const built = buildCard(doc, { ...opts, onClose: () => opts.onClose() }, \"g-hotspot-card\");\n card = built.card;\n card.setAttribute(\"role\", \"dialog\");\n card.id = nextId(\"hotspot\");\n dot.setAttribute(\"aria-controls\", card.id);\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n wrapper.appendChild(card);\n stopAnchor = anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset, arrowEl });\n stopKeys = installKeyboard(card, opts.step, false, () => close(true));\n dot.setAttribute(\"aria-expanded\", \"true\");\n opts.onOpen?.();\n if (cfg.openOn === \"click\") focusInto(card);\n };\n dot.addEventListener(\"click\", (e) => {\n e.preventDefault();\n if (card) close();\n else open();\n });\n if (cfg.openOn === \"hover\") {\n dot.addEventListener(\"mouseenter\", open);\n dot.addEventListener(\"focus\", open);\n }\n cleanups.push(close);\n return { el: wrapper, card: dot, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nexport function renderBanner(doc: Document, opts: RenderStepOptions): StepView {\n const { step } = opts;\n const cleanups: Array<() => void> = [];\n const pos = step.position === \"top\" || step.placement === \"top\" || step.position.startsWith(\"top\") ? \"top\" : \"bottom\";\n const banner = h(doc, \"div\", `g-banner g-pos-${pos}`);\n // A labelled region (not a live region: the controller announces it once).\n banner.setAttribute(\"role\", \"region\");\n banner.setAttribute(\"aria-label\", step.title || \"Announcement\");\n banner.setAttribute(\"data-step-id\", step.id);\n const body = h(doc, \"div\", \"g-body\");\n if (step.title) body.appendChild(h(doc, \"strong\", \"\", `${step.title} `));\n const text = h(doc, \"span\");\n setSanitizedHtml(text, step.body);\n body.appendChild(text);\n banner.appendChild(body);\n buildButtons(doc, step, opts.canGoBack ?? opts.index > 0, opts.onButton).forEach((b) => banner.appendChild(b));\n if (step.showClose) {\n const close = h(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Dismiss\");\n close.addEventListener(\"click\", () => opts.onClose());\n banner.appendChild(close);\n }\n opts.scope.appendChild(banner);\n cleanups.push(installKeyboard(banner, step, false, opts.onClose));\n return { el: banner, card: banner, destroy: () => cleanupAll(cleanups, banner) };\n}\n\nexport function renderSlideout(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const pos = opts.step.position === \"top\" ? \"top-right\" : opts.step.position === \"bottom\" ? \"bottom-right\" : opts.step.position;\n const { card } = buildCard(doc, opts, `g-slideout ${positionClass(pos)}`);\n card.setAttribute(\"role\", \"dialog\");\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/**\n * Runs a code-block step's JavaScript (`step.code`) with `guidely` (next, back, dismiss, complete,\n * skip) and `container` (the step's element). It may return a cleanup function, called when the\n * step goes away. Errors are reported, never thrown into the host app. Pages whose Content\n * Security Policy forbids `unsafe-eval` won't run it.\n */\nfunction runCodeBlock(code: string, container: HTMLElement, opts: RenderStepOptions): () => void {\n const act = (action: StepButton[\"action\"]) => () => opts.onButton({ id: `code-${action}`, label: action, action, variant: \"primary\" });\n const api = Object.freeze({ next: act(\"next\"), back: act(\"back\"), complete: act(\"complete\"), skip: act(\"skip\"), dismiss: () => opts.onClose(), stepId: opts.step.id });\n try {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const fn = new Function(\"guidely\", \"container\", `\"use strict\";\\n${code}`) as (g: typeof api, c: HTMLElement) => unknown;\n const result = fn(api, container);\n return typeof result === \"function\" ? () => {\n try {\n (result as () => void)();\n } catch (err) {\n opts.onError?.(err);\n }\n } : () => {};\n } catch (err) {\n opts.onError?.(err);\n return () => {};\n }\n}\n\n/** Sanitized custom HTML with no chrome. Elements with `data-g-action=\"next|back|dismiss|complete|skip\"` act as buttons. */\nexport function renderCustom(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay) wrapper.appendChild(overlayEl(doc, opts));\n const el = h(doc, \"div\", \"g-custom\");\n el.tabIndex = -1;\n el.setAttribute(\"data-step-id\", opts.step.id);\n setSanitizedHtml(el, opts.step.customHtml || opts.step.body || \"\");\n el.setAttribute(\"role\", opts.step.showOverlay ? \"dialog\" : \"group\");\n el.setAttribute(\"aria-label\", opts.step.title || \"Guide\");\n if (opts.step.showOverlay) el.setAttribute(\"aria-modal\", \"true\");\n const onClick = (e: Event) => {\n const t = (e.target as Element | null)?.closest?.(\"[data-g-action]\") as HTMLElement | null;\n const action = t?.getAttribute(\"data-g-action\");\n if (!action) return;\n e.preventDefault();\n if (action === \"dismiss\") opts.onClose();\n else opts.onButton({ id: `custom-${action}`, label: action, action: action as StepButton[\"action\"], variant: \"primary\", value: t?.getAttribute(\"data-g-value\") || undefined });\n };\n el.addEventListener(\"click\", onClick);\n wrapper.appendChild(el);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(el, opts.step, false, opts.onClose));\n cleanups.push(focusInto(el));\n if (opts.runCode && opts.step.code) cleanups.push(runCodeBlock(opts.step.code, el, opts));\n return { el: wrapper, card: el, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/**\n * Renders a step of any type into the scope. Checklist and survey steps are rendered by the\n * dedicated widgets (`renderChecklist`, `renderSurvey`) and fall back to a modal here.\n */\nexport function renderStep(opts: RenderStepOptions): StepView {\n const doc = opts.scope.ownerDocument;\n const type = opts.asModal ? \"modal\" : opts.step.type;\n switch (type) {\n case \"tooltip\":\n return renderTooltip(doc, opts, \"tooltip\");\n case \"popover\":\n return renderTooltip(doc, opts, \"popover\");\n case \"spotlight\":\n return renderSpotlight(doc, opts);\n case \"hotspot\":\n return renderHotspot(doc, opts);\n case \"banner\":\n return renderBanner(doc, opts);\n case \"slideout\":\n return renderSlideout(doc, opts);\n case \"custom\":\n return renderCustom(doc, opts);\n case \"modal\":\n case \"checklist\":\n case \"survey\":\n default:\n return renderModal(doc, opts);\n }\n}\n\n/** Does the step type anchor to a target element? */\nexport function isAnchoredStep(step: GuideStep): boolean {\n return (step.type === \"tooltip\" || step.type === \"popover\" || step.type === \"spotlight\" || step.type === \"hotspot\") && !!step.target && step.target.selectors.length > 0;\n}\n","import { articleIdFromHref, evaluateRules } from \"@guidelytech/shared/runtime\";\nimport { type EventName, type GuideConfig, type GuideKind, type GuideStep, type ProjectTheme, type StepButton, type TargetingContext } from \"@guidelytech/shared\";\nimport { createScope, ensureHost } from \"./host\";\nimport { isAnchoredStep, renderStep, type StepView } from \"./render\";\nimport { closestComposed, composedTarget, containsComposed, urlMatches, waitForTarget } from \"./selectors\";\n\n/** Minimal guide shape the runtime needs (a `PublishedGuide` or an authoring draft). */\nexport interface RunnableGuide {\n id: string;\n key: string;\n name: string;\n kind: GuideKind | string;\n version: number;\n config: GuideConfig;\n}\n\nexport interface RuntimeEvent {\n name: EventName;\n guideId: string;\n guideKey: string;\n guideVersion: number;\n stepId?: string;\n stepIndex?: number;\n properties?: Record<string, unknown>;\n}\n\nexport type GuideEndReason = \"completed\" | \"dismissed\" | \"skipped\" | \"destroyed\";\nexport type GuideStatus = \"idle\" | \"running\" | \"waiting_url\" | \"waiting_target\" | \"ended\";\n\nexport interface RunGuideOptions {\n /** Project theme (merged with the guide's appearance). */\n theme?: Partial<ProjectTheme> | null;\n /** Targeting context used for branches and step-level targeting. */\n ctx?: TargetingContext | (() => TargetingContext);\n /** Receives lifecycle events (`guide_viewed`, `guide_started`, `step_viewed`, ...). */\n onEvent?: (event: RuntimeEvent) => void;\n /** Called for `url` button actions. Defaults to `location.assign` / `window.open`. */\n onNavigate?: (url: string, newTab?: boolean) => void;\n /**\n * Called for `start_guide`, `event` and `open_resource_center` button actions, and with\n * `open_article` (the article id) when a help-article link in a step is clicked.\n */\n onAction?: (action: \"start_guide\" | \"event\" | \"open_resource_center\" | \"open_article\", value?: string, button?: StepButton) => void;\n /** Rendering errors are reported here instead of being thrown into the host app. */\n onError?: (error: unknown) => void;\n /** Called exactly once when the guide ends for any reason. */\n onEnd?: (reason: GuideEndReason) => void;\n /** Event bus used by `advanceOn: \"event\"` steps. */\n eventBus?: { on(name: string, cb: () => void): () => void };\n /** Start at this step id instead of the first step. */\n startAtStep?: string;\n /** Returns the current URL (defaults to `location.href`). */\n currentUrl?: () => string;\n /**\n * The user started this guide on demand (\"Show me\"): a step on another page offers to take them\n * there after `urlPromptDelayMs` (default 1200 ms, so a click that navigates doesn't flash it)\n * instead of waiting silently.\n */\n promptForUrl?: boolean;\n urlPromptDelayMs?: number;\n /** The step the guide is on, shown or waiting for its page or element (to resume it after a page load). */\n onPosition?: (stepId: string) => void;\n /**\n * Run code-block steps (`step.code`). Only the SDK sets this, for published guides; the server\n * leaves code out unless a workspace admin allowed code blocks. Previews never run code.\n */\n runCode?: boolean;\n /** Render into this element instead of creating a scope in the Shadow-DOM host. */\n container?: HTMLElement;\n doc?: Document;\n}\n\nexport interface GuideController {\n readonly guide: RunnableGuide;\n start(): void;\n next(): void;\n back(): void;\n goTo(stepId: string): void;\n dismiss(): void;\n complete(): void;\n skip(): void;\n /** Re-evaluate a step waiting for a URL (call after SPA navigation). */\n resume(): void;\n destroy(): void;\n getState(): { status: GuideStatus; stepId: string | null; stepIndex: number; total: number };\n}\n\nfunction noop() {}\n\nconst escapeHtml = (s: string) => s.replace(/[&<>\"']/g, (c) => `&#${c.charCodeAt(0)};`);\n\n/** A step URL pattern the browser can open as is: a same-site path without wildcards. */\nexport function navigableUrl(pattern: string | undefined): string | null {\n if (!pattern || /[*?#\\s]/.test(pattern) || pattern.includes(\"/:\")) return null;\n if (pattern.startsWith(\"/\") && !pattern.startsWith(\"//\")) return pattern;\n try {\n const u = new URL(pattern);\n if (typeof location !== \"undefined\" && u.origin === location.origin) return u.pathname;\n } catch {\n /* not a URL */\n }\n return null;\n}\n/**\n * Runs a guide: walks steps, waits for targets, handles advancement, branches, multi-page steps,\n * buttons and cleanup. Rendering is wrapped in try/catch so the host app can never crash.\n */\nexport function runGuide(guide: RunnableGuide, options: RunGuideOptions = {}): GuideController {\n const doc = options.doc ?? (options.container?.ownerDocument || document);\n const steps = guide.config.steps;\n const total = steps.length;\n const onEvent = options.onEvent ?? noop;\n const onError = options.onError ?? noop;\n const getCtx = () => (typeof options.ctx === \"function\" ? options.ctx() : options.ctx) ?? null;\n const currentUrl = options.currentUrl ?? (() => (typeof location !== \"undefined\" ? location.href : \"\"));\n\n let status: GuideStatus = \"idle\";\n let index = -1;\n let pendingIndex = -1;\n let view: StepView | null = null;\n const stepCleanups: Array<() => void> = [];\n let started = false;\n let stepDone = false;\n let ended = false;\n const history: number[] = [];\n let scope: { el: HTMLElement; destroy(): void } | null = null;\n\n const emit = (name: EventName, step?: GuideStep | null, stepIndex?: number, properties?: Record<string, unknown>) => {\n try {\n onEvent({ name, guideId: guide.id, guideKey: guide.key, guideVersion: guide.version, stepId: step?.id, stepIndex, properties });\n } catch (err) {\n onError(err);\n }\n };\n\n const announce = (text: string) => {\n try {\n ensureHost(doc).announce(text);\n } catch {\n /* ignore */\n }\n };\n\n const getScope = (): HTMLElement => {\n if (options.container) return options.container;\n if (!scope) scope = createScope(options.theme, guide.config.appearance, doc);\n return scope.el;\n };\n\n const clearStep = () => {\n stepCleanups.splice(0).forEach((fn) => {\n try {\n fn();\n } catch {\n /* ignore */\n }\n });\n try {\n view?.destroy();\n } catch (err) {\n onError(err);\n }\n view = null;\n stepDone = false;\n };\n\n // Focus returns to where the visitor was when the guide started (steps move focus inside the guide).\n let returnFocusTo: HTMLElement | null = null;\n const restoreFocus = () => {\n const el = returnFocusTo;\n returnFocusTo = null;\n try {\n const now = doc.activeElement as HTMLElement | null;\n const lost = !now || now === doc.body || now.id === \"guidely-root\";\n if (el && lost && el.isConnected && typeof el.focus === \"function\") el.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n };\n\n const end = (reason: GuideEndReason) => {\n if (ended) return;\n ended = true;\n const step = steps[index];\n clearStep();\n status = \"ended\";\n if (reason === \"completed\") emit(\"guide_completed\", step, index);\n else if (reason === \"dismissed\") emit(\"guide_dismissed\", step, index);\n else if (reason === \"skipped\") emit(\"guide_skipped\", step, index);\n scope?.destroy();\n scope = null;\n restoreFocus();\n try {\n options.onEnd?.(reason);\n } catch (err) {\n onError(err);\n }\n };\n\n const completeStep = () => {\n if (stepDone || index < 0) return;\n stepDone = true;\n emit(\"step_completed\", steps[index], index);\n };\n\n const goNext = (overrideStepId?: string) => {\n const step = steps[index];\n let target = -1;\n const ctx = getCtx();\n if (step && ctx) {\n for (const branch of step.branches) {\n if (evaluateRules(branch.when, ctx)) {\n target = steps.findIndex((s) => s.id === branch.goTo);\n if (target >= 0) break;\n }\n }\n }\n if (target < 0 && overrideStepId) target = steps.findIndex((s) => s.id === overrideStepId);\n if (target < 0) target = index + 1;\n if (target >= total) return end(\"completed\");\n history.push(index);\n showStep(target, 1);\n };\n\n const advance = () => {\n if (ended) return;\n completeStep();\n goNext();\n };\n\n const handleButton = (b: StepButton) => {\n try {\n switch (b.action) {\n case \"next\":\n completeStep();\n goNext(b.value);\n break;\n case \"back\":\n controller.back();\n break;\n case \"dismiss\":\n end(\"dismissed\");\n break;\n case \"complete\":\n completeStep();\n end(\"completed\");\n break;\n case \"skip\":\n end(\"skipped\");\n break;\n case \"url\": {\n completeStep();\n const url = b.value || \"\";\n if (options.onNavigate) options.onNavigate(url, b.newTab);\n else if (b.newTab) window.open(url, \"_blank\", \"noopener\");\n else location.assign(url);\n if (index + 1 >= total) end(\"completed\");\n else goNext();\n break;\n }\n case \"start_guide\":\n completeStep();\n end(\"completed\");\n options.onAction?.(\"start_guide\", b.value, b);\n break;\n case \"event\":\n options.onAction?.(\"event\", b.value, b);\n break;\n case \"open_resource_center\":\n options.onAction?.(\"open_resource_center\", b.value, b);\n break;\n default:\n break;\n }\n } catch (err) {\n onError(err);\n }\n };\n\n const setupAdvance = (step: GuideStep, target: Element | null) => {\n const modes = step.advanceOn === \"any\" ? [\"element_click\", \"element_visible\", \"event\", \"delay\"] : [step.advanceOn];\n for (const mode of modes) {\n // Without a selector, clicking the highlighted element itself moves on (tours made from how-tos).\n if (mode === \"element_click\" && (step.advanceValue || target)) {\n const selector = step.advanceValue;\n const handler = (e: Event) => {\n const t = composedTarget(e);\n try {\n if (selector ? t && closestComposed(t, selector) : t && target && containsComposed(target, t)) advance();\n } catch {\n /* invalid selector */\n }\n };\n doc.addEventListener(\"click\", handler, true);\n doc.addEventListener(\"focusin\", handler, true);\n stepCleanups.push(() => {\n doc.removeEventListener(\"click\", handler, true);\n doc.removeEventListener(\"focusin\", handler, true);\n });\n } else if (mode === \"element_visible\" && step.advanceValue) {\n const ac = new AbortController();\n stepCleanups.push(() => ac.abort());\n waitForTarget([{ kind: \"css\", value: step.advanceValue }], { timeoutMs: 0, signal: ac.signal, root: doc })\n .then((el) => {\n if (ac.signal.aborted) return;\n if (typeof IntersectionObserver === \"undefined\") return advance();\n const io = new IntersectionObserver((entries) => {\n if (entries.some((en) => en.isIntersecting)) {\n io.disconnect();\n advance();\n }\n });\n io.observe(el);\n stepCleanups.push(() => io.disconnect());\n })\n .catch(noop);\n } else if (mode === \"event\" && step.advanceValue && options.eventBus) {\n stepCleanups.push(options.eventBus.on(step.advanceValue, advance));\n } else if (mode === \"delay\") {\n const t = setTimeout(advance, step.advanceDelayMs ?? 3000);\n stepCleanups.push(() => clearTimeout(t));\n }\n }\n };\n\n const render = (step: GuideStep, target: Element | null, asModal = false) => {\n if (ended) return;\n status = \"running\";\n const shownIndex = index;\n // A \"click the element\" step whose element is missing would leave the user stuck: give it a Next button.\n const shown = !target && step.advanceOn === \"element_click\" && !step.advanceValue && !step.buttons.length ? { ...step, buttons: [{ id: \"g-next\", label: index + 1 >= total ? \"Done\" : \"Next\", action: index + 1 >= total ? (\"complete\" as const) : (\"next\" as const), variant: \"primary\" as const }] } : step;\n try {\n view = renderStep({\n scope: getScope(),\n step: shown,\n index,\n total,\n canGoBack: history.length > 0 || index > 0,\n target,\n asModal,\n onButton: handleButton,\n onClose: () => end(\"dismissed\"),\n onVideo: (url) => emit(\"guide_video_clicked\", step, shownIndex, { videoUrl: url }),\n announce,\n runCode: options.runCode,\n onError,\n });\n } catch (err) {\n onError(err);\n view = null;\n // Rendering failed: skip the step rather than leaving the guide stuck.\n if (index + 1 < total) return goNext();\n return end(\"skipped\");\n }\n if (view && options.onAction) {\n const shownView = view;\n shownView.el.addEventListener(\"click\", (e) => {\n const link = composedTarget(e)?.closest?.(\"a[href]\");\n const articleId = articleIdFromHref(link?.getAttribute(\"href\"));\n if (!articleId) return;\n e.preventDefault();\n options.onAction?.(\"open_article\", articleId);\n // A modal, spotlight or backdrop would cover the article: the step makes way for it.\n if (step.type === \"modal\" || step.type === \"spotlight\" || asModal || shownView.el.querySelector(\".g-overlay, .g-spot-rect\")) {\n completeStep();\n end(shownIndex + 1 >= total ? \"completed\" : \"dismissed\");\n }\n });\n }\n if (!started) {\n started = true;\n emit(\"guide_started\", step, index);\n }\n emit(\"step_viewed\", step, index, asModal ? { fallback: \"show_as_modal\" } : undefined);\n announce(step.title ? `${step.title}. Step ${index + 1} of ${total}` : `Step ${index + 1} of ${total}`);\n setupAdvance(step, target);\n };\n\n /** \"Continue on another page\": the waiting step's page, with a button to go there when it's a plain path. */\n const showUrlPrompt = (step: GuideStep) => {\n if (ended || status !== \"waiting_url\" || view) return;\n const href = navigableUrl(step.url);\n const where = (step.url ?? \"\").replace(/^https?:\\/\\/[^/]+/i, \"\") || \"another page\";\n const prompt: GuideStep = {\n ...step,\n type: \"modal\",\n title: \"Continue on another page\",\n body: `<p>The next step${step.title ? `, <strong>${escapeHtml(step.title)}</strong>,` : \"\"} is on <code>${escapeHtml(where)}</code>.</p>`,\n imageUrl: \"\",\n videoUrl: \"\",\n buttons: [\n ...(href ? [{ id: \"g-go\", label: \"Take me there\", action: \"url\" as const, value: href, variant: \"primary\" as const }] : []),\n { id: \"g-exit\", label: \"Exit\", action: \"dismiss\" as const, variant: href ? (\"secondary\" as const) : (\"primary\" as const) },\n ],\n };\n try {\n view = renderStep({\n scope: getScope(),\n step: prompt,\n index,\n total,\n canGoBack: false,\n target: null,\n asModal: true,\n onButton: (b) => {\n if (b.action !== \"url\" || !b.value) return end(\"dismissed\");\n if (options.onNavigate) options.onNavigate(b.value);\n else location.assign(b.value);\n },\n onClose: () => end(\"dismissed\"),\n announce,\n });\n } catch (err) {\n onError(err);\n }\n };\n\n const applyFallback = (step: GuideStep, direction: 1 | -1) => {\n const fallback = step.target?.fallback ?? \"skip\";\n emit(\"step_viewed\", step, index, { fallback, targetMissing: true });\n if (fallback === \"show_as_modal\") return render(step, null, true);\n if (fallback === \"end_guide\") return end(\"skipped\");\n // skip\n const nextIndex = index + direction;\n if (nextIndex < 0) return showStep(0, 1);\n if (nextIndex >= total) return end(\"completed\");\n showStep(nextIndex, direction);\n };\n\n function showStep(i: number, direction: 1 | -1 = 1): void {\n if (ended) return;\n clearStep();\n if (i < 0) i = 0;\n if (i >= total) return end(\"completed\");\n index = i;\n const step = steps[i] as GuideStep;\n const ctx = getCtx();\n if (step.targeting && step.targeting.rules.length && ctx && !evaluateRules(step.targeting, ctx)) {\n const nextIndex = i + direction;\n if (nextIndex >= total) return end(\"completed\");\n if (nextIndex < 0) return;\n return showStep(nextIndex, direction);\n }\n try {\n options.onPosition?.(step.id);\n } catch (err) {\n onError(err);\n }\n if (step.url && !urlMatches(step.url, currentUrl())) {\n status = \"waiting_url\";\n pendingIndex = i;\n if (options.promptForUrl) {\n const t = setTimeout(() => showUrlPrompt(step), options.urlPromptDelayMs ?? 1200);\n stepCleanups.push(() => clearTimeout(t));\n }\n return;\n }\n pendingIndex = -1;\n if (isAnchoredStep(step) && step.target) {\n status = \"waiting_target\";\n const ac = new AbortController();\n stepCleanups.push(() => ac.abort());\n const timeoutMs = step.target.fallback === \"wait\" ? 0 : step.target.waitMs;\n waitForTarget(step.target, { timeoutMs, signal: ac.signal, root: doc })\n .then((el) => {\n if (ac.signal.aborted || ended) return;\n render(step, el);\n })\n .catch((err) => {\n if (ac.signal.aborted || ended) return;\n if (err && (err as Error).name === \"AbortError\") return;\n applyFallback(step, direction);\n });\n return;\n }\n render(step, null);\n }\n\n const controller: GuideController = {\n guide,\n start() {\n if (status !== \"idle\") return;\n const focused = doc.activeElement as HTMLElement | null;\n if (focused && focused !== doc.body && focused.id !== \"guidely-root\") returnFocusTo = focused;\n emit(\"guide_viewed\");\n if (total === 0) return end(\"completed\");\n let startIndex = options.startAtStep ? steps.findIndex((s) => s.id === options.startAtStep) : 0;\n if (startIndex < 0) startIndex = 0;\n showStep(startIndex, 1);\n },\n next() {\n if (ended || index < 0) return;\n completeStep();\n goNext();\n },\n back() {\n if (ended) return;\n const prev = history.pop();\n if (prev == null) {\n if (index > 0) showStep(index - 1, -1);\n return;\n }\n showStep(prev, -1);\n },\n goTo(stepId: string) {\n const i = steps.findIndex((s) => s.id === stepId);\n if (i >= 0 && !ended) {\n if (index >= 0) history.push(index);\n showStep(i, 1);\n }\n },\n dismiss: () => end(\"dismissed\"),\n complete() {\n completeStep();\n end(\"completed\");\n },\n skip: () => end(\"skipped\"),\n resume() {\n if (ended) return;\n if (status === \"waiting_url\" && pendingIndex >= 0) {\n showStep(pendingIndex, 1);\n return;\n }\n // A rendered step whose URL no longer matches must wait again.\n const step = steps[index];\n if (step?.url && status === \"running\" && !urlMatches(step.url, currentUrl())) showStep(index, 1);\n },\n destroy() {\n if (ended) return;\n ended = true;\n clearStep();\n status = \"ended\";\n scope?.destroy();\n scope = null;\n try {\n options.onEnd?.(\"destroyed\");\n } catch (err) {\n onError(err);\n }\n },\n getState: () => ({ status, stepId: steps[index]?.id ?? null, stepIndex: index, total }),\n };\n return controller;\n}\n","import type { ChecklistConfig, ChecklistTask } from \"@guidelytech/shared\";\nimport { isChecklistComplete } from \"@guidelytech/shared/runtime\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nexport interface ChecklistProgress {\n completedTaskIds: string[];\n completedAt?: string | null;\n dismissedAt?: string | null;\n}\n\nexport interface ChecklistWidgetOptions {\n scope: HTMLElement;\n config: ChecklistConfig;\n progress?: ChecklistProgress;\n /** Initially open? Defaults to `config.autoOpen`. */\n open?: boolean;\n onTaskClick?: (task: ChecklistTask) => void;\n onDismiss?: () => void;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nexport interface ChecklistWidget {\n el: HTMLElement;\n open(): void;\n close(): void;\n toggle(): void;\n isOpen(): boolean;\n setProgress(progress: ChecklistProgress): void;\n destroy(): void;\n}\n\nexport { isChecklistComplete };\n\n/** Launcher pill + expandable panel listing tasks with checkmarks and a progress bar. */\nexport function renderChecklist(options: ChecklistWidgetOptions): ChecklistWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n let progress: ChecklistProgress = options.progress ?? { completedTaskIds: [] };\n let open = options.open ?? config.autoOpen;\n const pos = `g-pos-${config.position}`;\n\n const root = doc.createElement(\"div\");\n root.className = \"g-checklist\";\n const launcher = doc.createElement(\"button\");\n launcher.type = \"button\";\n launcher.className = `g-launcher ${pos}`;\n launcher.setAttribute(\"aria-expanded\", \"false\");\n const ring = doc.createElement(\"span\");\n ring.className = \"g-ring\";\n const count = doc.createElement(\"span\");\n count.className = \"g-count\";\n ring.appendChild(count);\n launcher.appendChild(ring);\n const label = doc.createElement(\"span\");\n label.textContent = config.launcherLabel;\n launcher.appendChild(label);\n\n const panel = doc.createElement(\"div\");\n panel.className = `g-panel ${pos}`;\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", config.launcherLabel);\n panel.hidden = true;\n\n const head = doc.createElement(\"div\");\n head.className = \"g-panel-head\";\n const title = doc.createElement(\"h2\");\n title.className = \"g-panel-title\";\n title.textContent = config.launcherLabel;\n const sub = doc.createElement(\"p\");\n sub.className = \"g-panel-sub\";\n const bar = doc.createElement(\"div\");\n bar.className = \"g-bar\";\n const fill = doc.createElement(\"span\");\n bar.appendChild(fill);\n const close = doc.createElement(\"button\");\n close.type = \"button\";\n close.className = \"g-close\";\n close.textContent = \"×\";\n close.setAttribute(\"aria-label\", \"Minimize checklist\");\n head.append(title, sub, bar, close);\n const body = doc.createElement(\"div\");\n body.className = \"g-panel-body\";\n const foot = doc.createElement(\"div\");\n foot.className = \"g-panel-foot\";\n panel.append(head, body, foot);\n root.append(launcher, panel);\n scope.appendChild(root);\n\n const setOpen = (v: boolean) => {\n open = v;\n panel.hidden = !v;\n launcher.setAttribute(\"aria-expanded\", String(v));\n if (v) {\n (panel.querySelector<HTMLElement>(\".g-task:not([disabled])\") || close).focus?.({ preventScroll: true });\n options.onOpen?.();\n } else options.onClose?.();\n };\n\n const renderTasks = () => {\n const done = new Set(progress.completedTaskIds);\n const doneCount = config.tasks.filter((t) => done.has(t.id)).length;\n const pct = config.tasks.length ? Math.round((doneCount / config.tasks.length) * 100) : 0;\n count.textContent = `${doneCount}/${config.tasks.length}`;\n launcher.style.setProperty(\"--g-pct\", `${pct}%`);\n launcher.setAttribute(\"aria-label\", `${config.launcherLabel}: ${doneCount} of ${config.tasks.length} tasks completed`);\n sub.textContent = `${doneCount} of ${config.tasks.length} completed`;\n fill.style.width = `${pct}%`;\n bar.setAttribute(\"role\", \"progressbar\");\n bar.setAttribute(\"aria-valuenow\", String(pct));\n bar.setAttribute(\"aria-valuemin\", \"0\");\n bar.setAttribute(\"aria-valuemax\", \"100\");\n body.textContent = \"\";\n foot.textContent = \"\";\n const complete = isChecklistComplete(config, progress);\n if (complete) {\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-complete\";\n const t = doc.createElement(\"h3\");\n t.className = \"g-title\";\n t.textContent = config.completionTitle;\n const b = doc.createElement(\"div\");\n b.className = \"g-body\";\n setSanitizedHtml(b, config.completionBody);\n wrap.append(t, b);\n body.appendChild(wrap);\n }\n const list = doc.createElement(\"div\");\n list.setAttribute(\"role\", \"list\");\n let locked = false;\n config.tasks.forEach((task, i) => {\n const isDone = done.has(task.id);\n const btn = doc.createElement(\"button\");\n btn.type = \"button\";\n btn.className = `g-task${isDone ? \" g-done\" : \"\"}`;\n btn.setAttribute(\"role\", \"listitem\");\n btn.setAttribute(\"data-task-id\", task.id);\n btn.setAttribute(\"aria-checked\", String(isDone));\n if (config.ordered && locked && !isDone) {\n btn.disabled = true;\n btn.title = \"Complete the previous task first\";\n }\n if (config.ordered && !isDone) locked = true;\n const check = doc.createElement(\"span\");\n check.className = \"g-check\";\n check.setAttribute(\"aria-hidden\", \"true\");\n check.textContent = isDone ? \"✓\" : \"\";\n const text = doc.createElement(\"span\");\n const tt = doc.createElement(\"div\");\n tt.className = \"g-task-title\";\n tt.textContent = `${i + 1}. ${task.title}`;\n text.appendChild(tt);\n if (task.description) {\n const td = doc.createElement(\"div\");\n td.className = \"g-task-desc\";\n td.textContent = task.description;\n text.appendChild(td);\n }\n btn.append(check, text);\n btn.addEventListener(\"click\", () => options.onTaskClick?.(task));\n list.appendChild(btn);\n });\n body.appendChild(list);\n if (config.dismissible) {\n const dismiss = doc.createElement(\"button\");\n dismiss.type = \"button\";\n dismiss.className = \"g-btn g-btn-ghost\";\n dismiss.textContent = complete ? \"Close\" : \"Dismiss checklist\";\n dismiss.addEventListener(\"click\", () => options.onDismiss?.());\n foot.appendChild(dismiss);\n }\n };\n\n launcher.addEventListener(\"click\", () => setOpen(!open));\n close.addEventListener(\"click\", () => setOpen(false));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open) {\n e.stopPropagation();\n setOpen(false);\n launcher.focus();\n }\n };\n panel.addEventListener(\"keydown\", onKey);\n renderTasks();\n if (open) setOpen(true);\n\n return {\n el: root,\n open: () => setOpen(true),\n close: () => setOpen(false),\n toggle: () => setOpen(!open),\n isOpen: () => open,\n setProgress(p) {\n progress = p;\n renderTasks();\n },\n destroy() {\n panel.removeEventListener(\"keydown\", onKey);\n root.remove();\n },\n };\n}\n","import type { SurveyConfig, SurveyQuestion } from \"@guidelytech/shared\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nimport { isQuestionVisible, type SurveyAnswer, type SurveyAnswers } from \"@guidelytech/shared/runtime\";\n\nexport { isQuestionVisible };\nexport type { SurveyAnswer, SurveyAnswers };\n\nexport interface SurveyWidgetOptions {\n scope: HTMLElement;\n config: SurveyConfig;\n title?: string;\n onSubmit: (answers: SurveyAnswers) => void;\n onDismiss?: () => void;\n onChange?: (answers: SurveyAnswers) => void;\n}\n\nexport interface SurveyWidget {\n el: HTMLElement;\n getAnswers(): SurveyAnswers;\n showThankYou(): void;\n destroy(): void;\n}\n\n/** Survey card: NPS/CSAT/thumbs/choice/text/rating questions with conditional follow-ups and a thank-you state. */\nexport function renderSurvey(options: SurveyWidgetOptions): SurveyWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n const answers: SurveyAnswers = {};\n const card = doc.createElement(\"div\");\n card.className = `g-card g-survey g-slideout g-pos-${config.position}`;\n card.setAttribute(\"role\", \"dialog\");\n card.setAttribute(\"aria-label\", options.title || \"Survey\");\n card.tabIndex = -1;\n const inner = doc.createElement(\"div\");\n inner.className = \"g-inner\";\n card.appendChild(inner);\n if (options.onDismiss) {\n const close = doc.createElement(\"button\");\n close.type = \"button\";\n close.className = \"g-close\";\n close.textContent = \"×\";\n close.setAttribute(\"aria-label\", \"Close survey\");\n close.addEventListener(\"click\", () => options.onDismiss?.());\n card.appendChild(close);\n }\n scope.appendChild(card);\n\n const form = doc.createElement(\"form\");\n form.noValidate = true;\n inner.appendChild(form);\n const errorEl = doc.createElement(\"div\");\n errorEl.className = \"g-error\";\n errorEl.setAttribute(\"role\", \"alert\");\n\n const setAnswer = (id: string, v: SurveyAnswer | undefined) => {\n if (v === undefined || v === \"\" || (Array.isArray(v) && v.length === 0)) delete answers[id];\n else answers[id] = v;\n options.onChange?.({ ...answers });\n updateVisibility();\n };\n\n const questionEls = new Map<string, HTMLElement>();\n\n const scaleButtons = (q: SurveyQuestion, min: number, max: number, labels?: boolean) => {\n const wrap = doc.createElement(\"div\");\n const row = doc.createElement(\"div\");\n row.className = \"g-scale\";\n row.setAttribute(\"role\", \"radiogroup\");\n row.setAttribute(\"aria-label\", q.title);\n for (let i = min; i <= max; i++) {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = String(i);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n row.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-pressed\", \"false\"));\n b.setAttribute(\"aria-pressed\", \"true\");\n setAnswer(q.id, i);\n });\n row.appendChild(b);\n }\n wrap.appendChild(row);\n if (labels && (q.lowLabel || q.highLabel)) {\n const l = doc.createElement(\"div\");\n l.className = \"g-scale-labels\";\n l.append(Object.assign(doc.createElement(\"span\"), { textContent: q.lowLabel || \"\" }), Object.assign(doc.createElement(\"span\"), { textContent: q.highLabel || \"\" }));\n wrap.appendChild(l);\n }\n return wrap;\n };\n\n const buildInput = (q: SurveyQuestion): HTMLElement => {\n switch (q.type) {\n case \"nps\":\n return scaleButtons(q, 0, 10, true);\n case \"csat\":\n return scaleButtons(q, 1, q.scaleMax ?? 5, true);\n case \"rating\": {\n const max = q.scaleMax ?? 5;\n const row = doc.createElement(\"div\");\n row.className = \"g-stars\";\n row.setAttribute(\"role\", \"radiogroup\");\n row.setAttribute(\"aria-label\", q.title);\n const btns: HTMLButtonElement[] = [];\n for (let i = 1; i <= max; i++) {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = \"★\";\n b.setAttribute(\"aria-label\", `${i} of ${max}`);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n btns.forEach((x, j) => {\n x.classList.toggle(\"g-on\", j < i);\n x.setAttribute(\"aria-pressed\", String(j === i - 1));\n });\n setAnswer(q.id, i);\n });\n btns.push(b);\n row.appendChild(b);\n }\n return row;\n }\n case \"thumbs\": {\n const row = doc.createElement(\"div\");\n row.className = \"g-thumbs\";\n row.setAttribute(\"role\", \"radiogroup\");\n [\n [\"up\", \"👍\", \"Thumbs up\"],\n [\"down\", \"👎\", \"Thumbs down\"],\n ].forEach(([val, icon, lbl]) => {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = icon as string;\n b.setAttribute(\"aria-label\", lbl as string);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n row.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-pressed\", \"false\"));\n b.setAttribute(\"aria-pressed\", \"true\");\n setAnswer(q.id, val === \"up\");\n });\n row.appendChild(b);\n });\n return row;\n }\n case \"single_choice\":\n case \"multiple_choice\": {\n const multi = q.type === \"multiple_choice\";\n const group = doc.createElement(\"div\");\n group.setAttribute(\"role\", multi ? \"group\" : \"radiogroup\");\n group.setAttribute(\"aria-label\", q.title);\n q.options.forEach((opt) => {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.className = `g-choice${multi ? \" g-multi\" : \"\"}`;\n b.setAttribute(\"role\", multi ? \"checkbox\" : \"radio\");\n b.setAttribute(\"aria-checked\", \"false\");\n b.setAttribute(\"data-option-id\", opt.id);\n const dot = doc.createElement(\"span\");\n dot.className = \"g-dot\";\n b.append(dot, Object.assign(doc.createElement(\"span\"), { textContent: opt.label }));\n b.addEventListener(\"click\", () => {\n if (multi) {\n const cur = new Set((answers[q.id] as string[] | undefined) ?? []);\n if (cur.has(opt.id)) cur.delete(opt.id);\n else cur.add(opt.id);\n b.setAttribute(\"aria-checked\", String(cur.has(opt.id)));\n setAnswer(q.id, Array.from(cur));\n } else {\n group.querySelectorAll(\".g-choice\").forEach((x) => x.setAttribute(\"aria-checked\", \"false\"));\n b.setAttribute(\"aria-checked\", \"true\");\n setAnswer(q.id, opt.id);\n }\n });\n group.appendChild(b);\n });\n return group;\n }\n case \"text\":\n default: {\n const ta = doc.createElement(\"textarea\");\n ta.className = \"g-input\";\n ta.rows = 3;\n ta.placeholder = q.placeholder || \"\";\n ta.setAttribute(\"aria-label\", q.title);\n ta.addEventListener(\"input\", () => setAnswer(q.id, ta.value.slice(0, 5000)));\n return ta;\n }\n }\n };\n\n config.questions.forEach((q) => {\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-question\";\n wrap.setAttribute(\"data-question-id\", q.id);\n const t = doc.createElement(\"p\");\n t.className = \"g-q-title\";\n t.textContent = q.title + (q.required ? \"\" : \" (optional)\");\n wrap.appendChild(t);\n if (q.description) {\n const d = doc.createElement(\"p\");\n d.className = \"g-q-desc\";\n d.textContent = q.description;\n wrap.appendChild(d);\n }\n wrap.appendChild(buildInput(q));\n questionEls.set(q.id, wrap);\n form.appendChild(wrap);\n });\n\n const footer = doc.createElement(\"div\");\n footer.className = \"g-footer\";\n const submit = doc.createElement(\"button\");\n submit.type = \"submit\";\n submit.className = \"g-btn g-btn-primary\";\n submit.textContent = \"Submit\";\n footer.appendChild(submit);\n form.appendChild(errorEl);\n form.appendChild(footer);\n\n function updateVisibility() {\n config.questions.forEach((q) => {\n const el = questionEls.get(q.id);\n if (!el) return;\n const visible = isQuestionVisible(q, answers);\n el.hidden = !visible;\n if (!visible && answers[q.id] !== undefined) delete answers[q.id];\n });\n }\n\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n const missing = config.questions.filter((q) => q.required && isQuestionVisible(q, answers) && answers[q.id] === undefined);\n if (missing.length) {\n errorEl.textContent = `Please answer: ${missing.map((q) => q.title).join(\", \")}`;\n questionEls.get(missing[0]!.id)?.querySelector<HTMLElement>(\"button,textarea\")?.focus();\n return;\n }\n errorEl.textContent = \"\";\n options.onSubmit({ ...answers });\n });\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && options.onDismiss) {\n e.stopPropagation();\n options.onDismiss();\n }\n };\n card.addEventListener(\"keydown\", onKey);\n updateVisibility();\n (form.querySelector<HTMLElement>(\"button,textarea\") || card).focus?.({ preventScroll: true });\n\n return {\n el: card,\n getAnswers: () => ({ ...answers }),\n showThankYou() {\n inner.textContent = \"\";\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-complete\";\n const t = doc.createElement(\"h3\");\n t.className = \"g-title\";\n t.textContent = config.thankYouTitle;\n const b = doc.createElement(\"div\");\n b.className = \"g-body\";\n setSanitizedHtml(b, config.thankYouBody);\n const done = doc.createElement(\"button\");\n done.type = \"button\";\n done.className = \"g-btn g-btn-primary\";\n done.textContent = \"Done\";\n done.style.marginTop = \"12px\";\n done.addEventListener(\"click\", () => options.onDismiss?.());\n wrap.append(t, b, done);\n inner.appendChild(wrap);\n done.focus?.({ preventScroll: true });\n },\n destroy() {\n card.removeEventListener(\"keydown\", onKey);\n card.remove();\n },\n };\n}\n","import type { ResourceCenterArticle, ResourceCenterConfig, ResourceCenterModuleId, RuleGroup } from \"@guidelytech/shared\";\nimport { orderedModules, unreadAnnouncements, visibleAnnouncements } from \"@guidelytech/shared/runtime\";\nimport { createHelpView, el, type HelpGuideRef } from \"./help-view\";\n\nexport type ResourceCenterGuideRef = HelpGuideRef;\n\nexport interface ResourceCenterOptions {\n scope: HTMLElement;\n config: ResourceCenterConfig;\n /** Published guides (used to display recommended guides and checklists by id/key). */\n guides?: ResourceCenterGuideRef[];\n /** Server search. Results are merged with the client-side title/summary filter. */\n search?: (q: string) => Promise<ResourceCenterArticle[]>;\n /** The visitor's audiences (for audience-targeted articles and collections). */\n audienceIds?: () => ReadonlySet<string> | readonly string[];\n /** Loads bodies the published config left out to stay small (`bodyOmitted`). */\n loadArticle?: (id: string) => Promise<ResourceCenterArticle | null>;\n onStartGuide?: (guideId: string) => void;\n onOpenChecklist?: (guideId: string) => void;\n onArticleView?: (article: ResourceCenterArticle) => void;\n onOpen?: () => void;\n onClose?: () => void;\n /** Hide the launcher (when the host app provides its own trigger). */\n hideLauncher?: boolean;\n /** Evaluates a module's targeting for the current visitor (absent = every module shows). */\n evaluate?: (rules: RuleGroup) => boolean;\n /** When the visitor last opened \"What's new\" (for the unread badge). */\n announcementsSeenAt?: () => string | null | undefined;\n /** The panel opened with \"What's new\" visible: everything listed is now read. */\n onAnnouncementsSeen?: () => void;\n}\n\nexport interface ResourceCenterWidget {\n el: HTMLElement;\n open(): void;\n /** Opens the panel on one article (a help-article link in a guide or another article). */\n openArticle(id: string): void;\n close(): void;\n toggle(): void;\n isOpen(): boolean;\n destroy(): void;\n}\n\n/** Launcher + panel with search, collections, articles, recommended guides, checklists, FAQs and links. */\nexport function renderResourceCenter(options: ResourceCenterOptions): ResourceCenterWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n const guides = options.guides ?? [];\n let open = false;\n const pos = `g-pos-${config.launcher.position}`;\n const byId = (ids: string[]) => ids.map((id) => guides.find((g) => g.id === id || g.key === id)).filter((g): g is ResourceCenterGuideRef => !!g);\n\n const root = el(doc, \"div\", \"g-resource-center\");\n const launcher = el(doc, \"button\", `g-launcher ${pos}`);\n launcher.type = \"button\";\n launcher.setAttribute(\"aria-expanded\", \"false\");\n if (config.launcher.showIcon) {\n const icon = el(doc, \"span\", \"\", \"?\");\n icon.setAttribute(\"aria-hidden\", \"true\");\n launcher.appendChild(icon);\n }\n launcher.appendChild(el(doc, \"span\", \"\", config.launcher.label || config.title));\n launcher.setAttribute(\"aria-label\", config.launcher.label || config.title);\n if (options.hideLauncher) launcher.hidden = true;\n const badge = el(doc, \"span\", \"g-launcher-badge\");\n badge.hidden = true;\n launcher.appendChild(badge);\n\n /** Sections this visitor sees, in order (disabled ones and ones whose targeting doesn't match are left out). */\n const modules = (): ResourceCenterModuleId[] =>\n orderedModules(config.modules)\n .filter((m) => m.enabled && (!(\"targeting\" in m) || !m.targeting || !options.evaluate || options.evaluate(m.targeting)))\n .map((m) => m.id as ResourceCenterModuleId);\n const announcements = () => (modules().includes(\"announcements\") ? visibleAnnouncements(config.announcements, options.audienceIds?.() ?? []) : []);\n const updateBadge = () => {\n const unread = unreadAnnouncements(announcements(), options.announcementsSeenAt?.());\n badge.hidden = unread === 0;\n badge.textContent = unread > 9 ? \"9+\" : String(unread);\n const label = config.launcher.label || config.title;\n launcher.setAttribute(\"aria-label\", unread ? `${label} (${unread} new update${unread === 1 ? \"\" : \"s\"})` : label);\n };\n updateBadge();\n\n const panel = el(doc, \"div\", `g-panel ${pos}`);\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", config.title);\n panel.hidden = true;\n const head = el(doc, \"div\", \"g-panel-head\");\n head.appendChild(el(doc, \"h2\", \"g-panel-title\", config.title));\n const close = el(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Close\");\n head.appendChild(close);\n let seenAtOpen: string | null = options.announcementsSeenAt?.() ?? null;\n const help = createHelpView({\n doc,\n data: () => ({\n collections: config.collections,\n articles: config.articles,\n recommended: byId(config.recommendedGuideIds),\n checklists: byId(config.checklistGuideIds),\n faqs: config.faqs,\n links: config.links,\n announcements: announcements(),\n announcementsSeenAt: seenAtOpen,\n modules: modules(),\n }),\n search: options.search,\n audienceIds: options.audienceIds,\n loadArticle: options.loadArticle,\n onStartGuide: options.onStartGuide,\n onOpenChecklist: options.onOpenChecklist,\n onArticleView: options.onArticleView,\n guides: () => guides,\n onShowMe: (key) => {\n setOpen(false);\n options.onStartGuide?.(key);\n },\n // Articles read in a larger panel.\n onArticleChange: (reading) => panel.classList.toggle(\"g-panel-reading\", reading),\n });\n panel.append(head, help.el);\n root.append(launcher, panel);\n scope.appendChild(root);\n\n const setOpen = (v: boolean) => {\n if (open === v) return;\n open = v;\n panel.hidden = !v;\n launcher.setAttribute(\"aria-expanded\", String(v));\n if (v) {\n // Entries stay marked \"New\" while the panel is open; the badge clears now.\n seenAtOpen = options.announcementsSeenAt?.() ?? null;\n help.render();\n help.focusSearch();\n if (announcements().length) {\n options.onAnnouncementsSeen?.();\n updateBadge();\n }\n options.onOpen?.();\n } else {\n help.reset();\n options.onClose?.();\n }\n };\n launcher.addEventListener(\"click\", () => setOpen(!open));\n close.addEventListener(\"click\", () => setOpen(false));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n setOpen(false);\n launcher.focus();\n }\n };\n panel.addEventListener(\"keydown\", onKey);\n\n return {\n el: root,\n open: () => setOpen(true),\n openArticle(id: string) {\n setOpen(true);\n help.openArticle(id);\n },\n close: () => setOpen(false),\n toggle: () => setOpen(!open),\n isOpen: () => open,\n destroy() {\n help.destroy();\n panel.removeEventListener(\"keydown\", onKey);\n root.remove();\n },\n };\n}\n","import type { ResourceCenterAnnouncement, ResourceCenterArticle, ResourceCenterConfig, ResourceCenterModuleId } from \"@guidelytech/shared\";\nimport { isArticleListed, matchesHelpQuery, RC_MODULE_IDS, RC_MODULE_LABELS, resourceCenterSections, showMeKeyFromHref, SHOW_ME_HREF_PREFIX } from \"@guidelytech/shared/runtime\";\nimport { enhancePdfViewers } from \"./pdf-viewer\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nexport interface HelpGuideRef {\n id: string;\n key: string;\n name: string;\n kind: string;\n}\n\n/** A page-aware suggestion at the top of the help view (the messenger works out what and how it opens). */\nexport interface HelpSuggestion {\n kind: \"guide\" | \"howto\" | \"article\";\n title: string;\n summary?: string;\n run: () => void;\n}\n\n/** What the help view lists. Article bodies may be missing (`bodyOmitted` or summaries only): they load on open. */\nexport interface HelpData {\n collections: ResourceCenterConfig[\"collections\"];\n articles: Array<Omit<ResourceCenterArticle, \"body\"> & { body?: string }>;\n /** Shown first, under its own title (\"For the Invoices page\"). */\n suggested?: { title: string; items: HelpSuggestion[] };\n recommended?: HelpGuideRef[];\n checklists?: HelpGuideRef[];\n faqs?: ResourceCenterConfig[\"faqs\"];\n links?: ResourceCenterConfig[\"links\"];\n /** \"What's new\" entries (already filtered for the visitor, newest first). */\n announcements?: ResourceCenterAnnouncement[];\n /** Announcements published after this time are marked new. */\n announcementsSeenAt?: string | null;\n /** Sections to show, in order (absent = all, default order). */\n modules?: ResourceCenterModuleId[];\n}\n\nexport interface HelpViewOptions {\n doc: Document;\n data: () => HelpData;\n /** Server search. Results are merged with the client-side title/summary filter. */\n search?: (q: string) => Promise<ResourceCenterArticle[]>;\n /** The visitor's audiences; articles and collections targeted at others aren't listed. */\n audienceIds?: () => ReadonlySet<string> | readonly string[];\n /** Loads an article body that isn't in `data()`. */\n loadArticle?: (id: string) => Promise<ResourceCenterArticle | null>;\n onStartGuide?: (guideId: string) => void;\n onOpenChecklist?: (guideId: string) => void;\n onArticleView?: (article: ResourceCenterArticle) => void;\n /** Extra items above the list (`query` empty) or above the article results (the messenger's how-tos). */\n extra?: (query: string) => Node[];\n /** Live guides in this environment: \"Show me\" prompts only appear for ones that can be started. */\n guides?: () => readonly HelpGuideRef[];\n /** Starts a walkthrough from a Show me prompt (an article's, or a search result's). */\n onShowMe?: (guideKey: string) => void;\n /** An article opened (`true`) or the view went back to the list (`false`); hosts enlarge their panel to read it. */\n onArticleChange?: (open: boolean) => void;\n}\n\n/** Guide kinds a Show me prompt can start on demand. */\nconst SHOW_ME_KINDS = new Set([\"flow\", \"modal\", \"tooltip\", \"announcement\"]);\n\n/** The guide a Show me prompt names, when it is live here and can be started. */\nexport function startableGuide(guides: readonly HelpGuideRef[] | undefined, keyOrId: string | null | undefined): HelpGuideRef | null {\n if (!keyOrId || !guides) return null;\n return guides.find((g) => (g.key === keyOrId || g.id === keyOrId) && SHOW_ME_KINDS.has(g.kind)) ?? null;\n}\n\n/**\n * A result row: the item opens on click, and a separate \"Show me\" button starts its walkthrough\n * right away. Two sibling buttons, never one inside the other.\n */\nexport function resultRow(doc: Document, icon: string, title: string, summary: string | undefined, onOpen: () => void, showMe?: () => void): HTMLElement {\n const item = listItem(doc, icon, title, summary);\n item.addEventListener(\"click\", onOpen);\n if (!showMe) return item;\n const row = el(doc, \"div\", \"g-rc-row\");\n const b = el(doc, \"button\", \"g-btn g-btn-primary g-rc-showme\", \"▶ Show me\");\n b.type = \"button\";\n b.setAttribute(\"aria-label\", `Show me: ${title}`);\n b.addEventListener(\"click\", showMe);\n row.append(item, b);\n return row;\n}\n\n/**\n * Turns the Show me links in a rendered article (`<a href=\"#guidely-show-me:<key>\">`) into buttons\n * that start the walkthrough, and removes the ones whose guide isn't live here.\n */\nexport function enhanceShowMe(root: HTMLElement, doc: Document, canStart: (key: string) => boolean, start: (key: string) => void): void {\n for (const a of Array.from(root.querySelectorAll<HTMLAnchorElement>(`a[href^=\"${SHOW_ME_HREF_PREFIX}\"]`))) {\n const key = showMeKeyFromHref(a.getAttribute(\"href\"));\n const holder = a.closest(\"p.gd-show-me\") ?? a;\n if (!key || !canStart(key)) {\n // A prompt alone in its paragraph goes with it; one inside text keeps its words.\n if (holder !== a) holder.remove();\n else a.replaceWith(doc.createTextNode(a.textContent ?? \"\"));\n continue;\n }\n const b = el(doc, \"button\", \"g-btn g-btn-primary g-help-showme\", `▶ ${(a.textContent ?? \"\").trim() || \"Show me\"}`);\n b.type = \"button\";\n b.addEventListener(\"click\", () => start(key));\n a.replaceWith(b);\n }\n}\n\nexport interface HelpView {\n /** Search box + scrollable body. */\n el: HTMLElement;\n render(): void;\n /** Back to the article list and clear the search. */\n reset(): void;\n openArticle(id: string): void;\n /** True while an article is open. */\n isArticleOpen(): boolean;\n focusSearch(): void;\n setQuery(q: string): void;\n destroy(): void;\n}\n\nexport function el<K extends keyof HTMLElementTagNameMap>(doc: Document, tag: K, cls?: string, text?: string): HTMLElementTagNameMap[K] {\n const e = doc.createElement(tag);\n if (cls) e.className = cls;\n if (text != null) e.textContent = text;\n return e;\n}\n\nexport function listItem(doc: Document, icon: string, title: string, summary?: string): HTMLButtonElement {\n const b = el(doc, \"button\", \"g-rc-item\");\n b.type = \"button\";\n const i = el(doc, \"span\", \"g-rc-icon\", icon);\n i.setAttribute(\"aria-hidden\", \"true\");\n const text = el(doc, \"span\");\n text.appendChild(el(doc, \"div\", \"g-rc-title\", title));\n if (summary) text.appendChild(el(doc, \"div\", \"g-rc-sum\", summary));\n b.append(i, text);\n return b;\n}\n\ntype ListedArticle = HelpData[\"articles\"][number];\n\n/** Article browser shared by the resource center and the messenger Help tab. */\nexport function createHelpView(options: HelpViewOptions): HelpView {\n const { doc } = options;\n let query = \"\";\n let serverResults: ResourceCenterArticle[] = [];\n let searchSeq = 0;\n let openSeq = 0;\n let active: { article: ListedArticle; loading: boolean } | null = null;\n const setActive = (next: typeof active) => {\n const was = !!active;\n active = next;\n if (was !== !!next) options.onArticleChange?.(!!next);\n };\n\n const root = el(doc, \"div\", \"g-help\");\n const searchWrap = el(doc, \"div\", \"g-rc-search\");\n const input = el(doc, \"input\", \"g-input\");\n input.type = \"search\";\n input.placeholder = \"Search help articles…\";\n input.setAttribute(\"aria-label\", \"Search help articles\");\n searchWrap.appendChild(input);\n const body = el(doc, \"div\", \"g-panel-body\");\n root.append(searchWrap, body);\n\n const hasBody = (a: ListedArticle): a is ResourceCenterArticle => typeof a.body === \"string\" && !a.bodyOmitted;\n const canShowMe = (key: string) => !!options.onShowMe && !!startableGuide(options.guides?.(), key);\n const showMe = (key: string) => options.onShowMe?.(startableGuide(options.guides?.(), key)?.key ?? key);\n\n const openArticle = (article: ListedArticle) => {\n if (article.externalUrl) {\n window.open(article.externalUrl, \"_blank\", \"noopener,noreferrer\");\n if (hasBody(article)) options.onArticleView?.(article);\n return;\n }\n const seq = ++openSeq;\n if (hasBody(article) || !options.loadArticle) {\n setActive({ article, loading: false });\n if (hasBody(article)) options.onArticleView?.(article);\n return render();\n }\n setActive({ article, loading: true });\n render();\n options\n .loadArticle(article.id)\n .then((full) => {\n if (seq !== openSeq || !active) return;\n setActive({ article: full ?? { ...article, body: \"\" }, loading: false });\n if (full) options.onArticleView?.(full);\n render();\n })\n .catch(() => {\n if (seq !== openSeq || !active) return;\n setActive({ article: { ...article, body: \"\" }, loading: false });\n render();\n });\n };\n\n const renderArticle = ({ article, loading }: NonNullable<typeof active>) => {\n const wrap = el(doc, \"div\", \"g-rc-article\");\n const back = el(doc, \"button\", \"g-btn g-btn-link g-rc-back\", \"← Back\");\n back.type = \"button\";\n back.addEventListener(\"click\", () => {\n openSeq++;\n setActive(null);\n render();\n });\n const title = el(doc, \"h3\", \"g-title\", article.title);\n const content = el(doc, \"div\", \"g-body\");\n if (loading) content.appendChild(el(doc, \"div\", \"g-rc-empty\", \"Loading…\"));\n else if (article.body) {\n setSanitizedHtml(content, article.body);\n enhancePdfViewers(content, doc);\n enhanceShowMe(content, doc, canShowMe, showMe);\n }\n else content.appendChild(el(doc, \"div\", \"g-rc-empty\", \"This article couldn't be loaded.\"));\n wrap.append(back, title, content);\n body.appendChild(wrap);\n back.focus?.({ preventScroll: true });\n };\n\n const section = (label: string, depth = 0) => {\n const s = body.appendChild(el(doc, \"div\", \"g-rc-section\", label));\n if (depth) s.dataset.depth = String(depth);\n return s;\n };\n const articleButton = (a: ListedArticle) => {\n const key = a.walkthroughs?.find(canShowMe);\n const summary = a.hasVideo ? (a.summary ? `Video · ${a.summary}` : \"Video\") : a.summary;\n body.appendChild(resultRow(doc, a.hasVideo ? \"▶\" : \"📄\", a.title, summary, () => openArticle(a), key ? () => showMe(key) : undefined));\n };\n\n function render() {\n body.textContent = \"\";\n if (active) return renderArticle(active);\n const data = options.data();\n const member = options.audienceIds?.() ?? [];\n searchWrap.hidden = !!data.modules && !data.modules.includes(\"search\");\n const sections = resourceCenterSections(data.collections, data.articles, member);\n const q = query.trim().toLowerCase();\n if (q) {\n // Walkthroughs the team lists in Help (recommended guides) whose name matches, ready to start.\n const walkthroughs = (data.recommended ?? []).filter((g) => matchesHelpQuery(g.name, q) && startableGuide(options.guides?.() ?? data.recommended, g.id));\n if (walkthroughs.length) {\n section(`Walkthroughs (${walkthroughs.length})`);\n for (const g of walkthroughs) body.appendChild(resultRow(doc, \"▶\", g.name, \"Show me, step by step\", () => options.onStartGuide?.(g.id)));\n }\n }\n body.append(...(options.extra?.(q) ?? []));\n if (q) {\n const visible = sections.flatMap((s) => s.articles);\n const local = visible.filter((a) => matchesHelpQuery(`${a.title} ${a.summary}`, q));\n const seen = new Set(local.map((a) => a.id));\n // Server search covers every published article: keep only the ones listed for this visitor.\n const hidden = new Set(data.articles.map((a) => a.id).filter((id) => !visible.some((v) => v.id === id)));\n const merged: ListedArticle[] = [...local, ...serverResults.filter((a) => !seen.has(a.id) && !hidden.has(a.id) && isArticleListed(data.collections, a, member))];\n section(`Results (${merged.length})`);\n if (!merged.length) body.appendChild(el(doc, \"div\", \"g-rc-empty\", \"No articles match your search.\"));\n merged.forEach(articleButton);\n return;\n }\n if (data.suggested?.items.length) {\n section(data.suggested.title);\n const glyph = { guide: \"▶\", howto: \"☰\", article: \"📄\" } as const;\n data.suggested.items.forEach((item) => {\n const b = listItem(doc, glyph[item.kind], item.title, item.summary);\n b.addEventListener(\"click\", item.run);\n body.appendChild(b);\n });\n }\n const renderers: Record<ResourceCenterModuleId, () => void> = {\n search: () => {},\n announcements: () => {\n if (!data.announcements?.length) return;\n section(RC_MODULE_LABELS.announcements);\n const seen = data.announcementsSeenAt ? Date.parse(data.announcementsSeenAt) : NaN;\n data.announcements.slice(0, 20).forEach((n) => body.appendChild(announcementItem(n, Number.isNaN(seen) || Date.parse(n.publishedAt) > seen)));\n },\n guides: () => {\n if (!data.recommended?.length) return;\n section(\"Recommended\");\n data.recommended.forEach((g) => {\n const b = listItem(doc, \"▶\", g.name, \"Start guide\");\n b.addEventListener(\"click\", () => options.onStartGuide?.(g.id));\n body.appendChild(b);\n });\n },\n checklists: () => {\n if (!data.checklists?.length) return;\n section(\"Checklists\");\n data.checklists.forEach((g) => {\n const b = listItem(doc, \"☑\", g.name, \"Open checklist\");\n b.addEventListener(\"click\", () => options.onOpenChecklist?.(g.id));\n body.appendChild(b);\n });\n },\n articles: () => {\n // Nested collections read as \"Billing › Invoices\", depth first.\n for (const s of sections) {\n section(s.collection ? s.path.join(\" › \") : \"Articles\", s.depth);\n s.articles.forEach(articleButton);\n }\n },\n faqs: () => {\n if (!data.faqs?.length) return;\n section(\"FAQ\");\n data.faqs.forEach((f) => {\n const b = listItem(doc, \"?\", f.question);\n b.setAttribute(\"aria-expanded\", \"false\");\n const a = el(doc, \"div\", \"g-faq-a\");\n a.id = `g-faq-${f.id}`;\n b.setAttribute(\"aria-controls\", a.id);\n setSanitizedHtml(a, f.answer);\n a.hidden = true;\n b.addEventListener(\"click\", () => {\n a.hidden = !a.hidden;\n b.setAttribute(\"aria-expanded\", String(!a.hidden));\n });\n body.append(b, a);\n });\n },\n links: () => {\n if (!data.links?.length) return;\n section(\"Links\");\n data.links.forEach((l) => {\n const a = el(doc, \"a\", \"g-rc-item\");\n a.href = l.url;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n const i = el(doc, \"span\", \"g-rc-icon\", \"↗\");\n i.setAttribute(\"aria-hidden\", \"true\");\n a.append(i, el(doc, \"span\", \"g-rc-title\", l.label));\n a.setAttribute(\"aria-label\", `${l.label} (opens in a new tab)`);\n body.appendChild(a);\n });\n },\n };\n for (const id of data.modules ?? RC_MODULE_IDS) renderers[id]?.();\n if (!body.childNodes.length) body.appendChild(el(doc, \"div\", \"g-rc-empty\", \"Nothing here yet.\"));\n }\n\n /** One \"What's new\" entry: title, date, body and its links (Show me, the article, a URL). */\n function announcementItem(n: ResourceCenterAnnouncement, unread: boolean): HTMLElement {\n const item = el(doc, \"article\", `g-rc-news${unread ? \" g-rc-news-unread\" : \"\"}`);\n const head = el(doc, \"div\", \"g-rc-news-head\");\n const title = el(doc, \"h3\", \"g-rc-news-title\", n.title);\n head.appendChild(title);\n if (unread) {\n const dot = el(doc, \"span\", \"g-rc-news-new\", \"New\");\n head.appendChild(dot);\n }\n const date = el(doc, \"time\", \"g-rc-news-date\");\n date.dateTime = n.publishedAt;\n try {\n date.textContent = new Date(n.publishedAt).toLocaleDateString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" });\n } catch {\n date.textContent = n.publishedAt.slice(0, 10);\n }\n item.append(head, date);\n if (n.body) {\n const b = el(doc, \"div\", \"g-body g-rc-news-body\");\n setSanitizedHtml(b, n.body);\n item.appendChild(b);\n }\n const actions = el(doc, \"div\", \"g-rc-news-actions\");\n const guide = n.guideId ? startableGuide(options.guides?.(), n.guideId) : null;\n if (guide) {\n const b = el(doc, \"button\", \"g-btn g-btn-primary\", n.linkLabel || \"Show me\");\n b.type = \"button\";\n b.addEventListener(\"click\", () => (options.onShowMe ? options.onShowMe(guide.key) : options.onStartGuide?.(guide.id)));\n actions.appendChild(b);\n }\n if (n.articleId) {\n const listed = options.data().articles.find((a) => a.id === n.articleId);\n if (listed) {\n const b = el(doc, \"button\", \"g-btn g-btn-secondary\", guide ? \"Read more\" : n.linkLabel || \"Read more\");\n b.type = \"button\";\n b.addEventListener(\"click\", () => openArticle(listed));\n actions.appendChild(b);\n }\n }\n if (n.url && /^https?:\\/\\//i.test(n.url)) {\n const a = el(doc, \"a\", \"g-btn g-btn-link\", !guide && !n.articleId && n.linkLabel ? n.linkLabel : \"Learn more\");\n a.href = n.url;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n actions.appendChild(a);\n }\n if (actions.childNodes.length) item.appendChild(actions);\n return item;\n }\n\n let debounce: ReturnType<typeof setTimeout> | null = null;\n const onInput = () => {\n query = input.value;\n openSeq++;\n setActive(null);\n render();\n if (debounce) clearTimeout(debounce);\n if (!options.search || !query.trim()) {\n serverResults = [];\n return;\n }\n const seq = ++searchSeq;\n debounce = setTimeout(() => {\n options\n .search?.(query.trim())\n .then((results) => {\n if (seq !== searchSeq) return;\n serverResults = Array.isArray(results) ? results : [];\n render();\n })\n .catch(() => {});\n }, 250);\n };\n input.addEventListener(\"input\", onInput);\n\n return {\n el: root,\n render,\n reset() {\n openSeq++;\n setActive(null);\n query = \"\";\n input.value = \"\";\n serverResults = [];\n },\n openArticle(id: string) {\n const listed = options.data().articles.find((a) => a.id === id) ?? { id, slug: id, title: \"Article\", summary: \"\", updatedAt: \"\", bodyOmitted: true };\n openArticle(listed);\n },\n isArticleOpen: () => !!active,\n focusSearch: () => input.focus?.({ preventScroll: true }),\n setQuery(q: string) {\n input.value = q;\n onInput();\n },\n destroy() {\n if (debounce) clearTimeout(debounce);\n input.removeEventListener(\"input\", onInput);\n root.remove();\n },\n };\n}\n","import type { AuthoringPick, GuideStep, ProjectTheme, SelectorStrategy } from \"@guidelytech/shared\";\nimport { runGuide, type GuideController, type RunnableGuide } from \"./controller\";\nimport { createScope, ensureHost } from \"./host\";\nimport { componentAnchor, composedTarget, deepElementFromPoint, describeElement, isGuidelyElement, querySelectorStrategy, resolveTarget, visualRect } from \"./selectors\";\n\nexport interface AuthoringOptions {\n /** Called with the pick for each clicked element. */\n onPick: (pick: AuthoringPick & { element: Element }) => void;\n /** Called when the user exits authoring mode (Done / Exit / Esc with nothing hovered). */\n onExit: () => void;\n dashboardOrigin?: string;\n /** Text shown in the toolbar. */\n message?: string;\n doc?: Document;\n}\n\nexport interface AuthoringSession {\n /** Replace the toolbar status text. */\n setStatus(text: string): void;\n /** Pause/resume picking (e.g. while a preview is shown). */\n setPicking(enabled: boolean): void;\n stop(): void;\n}\n\nconst DEFAULT_MESSAGE = \"Guidely authoring — hover an element and click to select · Esc to cancel\";\n\n/**\n * Enters authoring mode: Shadow-DOM toolbar, hover outline following `elementFromPoint`, and\n * click-to-pick (captured in the capture phase so the host app never receives the click).\n */\nexport function startAuthoring(options: AuthoringOptions): AuthoringSession {\n const doc = options.doc ?? document;\n const win = doc.defaultView ?? window;\n const scope = createScope(null, { theme: \"light\", animation: \"none\" }, doc);\n const bar = doc.createElement(\"div\");\n bar.className = \"g-auth-bar\";\n bar.setAttribute(\"role\", \"toolbar\");\n const dot = doc.createElement(\"span\");\n dot.className = \"g-dot-live\";\n const status = doc.createElement(\"span\");\n status.textContent = options.message ?? DEFAULT_MESSAGE;\n const spacer = doc.createElement(\"span\");\n spacer.className = \"g-spacer\";\n const done = doc.createElement(\"button\");\n done.type = \"button\";\n done.className = \"g-btn g-btn-primary\";\n done.textContent = \"Done\";\n const exit = doc.createElement(\"button\");\n exit.type = \"button\";\n exit.className = \"g-btn g-btn-secondary\";\n exit.textContent = \"Exit authoring\";\n bar.append(dot, status, spacer, done, exit);\n const outline = doc.createElement(\"div\");\n outline.className = \"g-auth-outline\";\n outline.hidden = true;\n const label = doc.createElement(\"span\");\n label.className = \"g-auth-label\";\n outline.appendChild(label);\n scope.el.append(bar, outline);\n\n let picking = true;\n let hovered: Element | null = null;\n let stopped = false;\n\n const describe = (el: Element): string => {\n const tag = el.tagName.toLowerCase();\n const id = el.id ? `#${el.id}` : \"\";\n const tour = el.getAttribute(\"data-tour\") || el.getAttribute(\"data-testid\");\n const text = (el.textContent || \"\").replace(/\\s+/g, \" \").trim().slice(0, 40);\n return `${tag}${id}${tour ? `[${tour}]` : \"\"}${text ? ` “${text}”` : \"\"}`;\n };\n\n const paint = (el: Element | null, picked = false) => {\n if (!el) {\n outline.hidden = true;\n return;\n }\n const r = visualRect(el);\n outline.hidden = false;\n outline.classList.toggle(\"g-picked\", picked);\n Object.assign(outline.style, { left: `${r.left}px`, top: `${r.top}px`, width: `${r.width}px`, height: `${r.height}px` });\n label.textContent = describe(el);\n label.style.top = r.top < 30 ? \"100%\" : \"-24px\";\n };\n\n const elementAt = (x: number, y: number): Element | null => {\n const el = deepElementFromPoint(doc, x, y);\n if (!el || isGuidelyElement(el) || el === doc.documentElement || el === doc.body) return null;\n // Outline what will be targeted: a component rather than its internals.\n return componentAnchor(el);\n };\n\n const onMove = (e: MouseEvent) => {\n if (!picking || stopped) return;\n const el = elementAt(e.clientX, e.clientY);\n if (el !== hovered) {\n hovered = el;\n paint(el);\n }\n };\n const onScroll = () => {\n if (hovered) paint(hovered);\n };\n const onClick = (e: MouseEvent) => {\n if (!picking || stopped) return;\n if (isGuidelyElement(composedTarget(e))) return;\n const el = elementAt(e.clientX, e.clientY) ?? hovered;\n if (!el) return;\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n const d = describeElement(el);\n paint(el, true);\n status.textContent = `Selected ${describe(el)} — click another element or press Done`;\n options.onPick({ selectors: d.selectors, textSnapshot: d.textSnapshot, rect: d.rect, url: win.location.href, element: el });\n };\n const swallow = (e: Event) => {\n if (!picking || stopped) return;\n if (isGuidelyElement(composedTarget(e))) return;\n e.preventDefault();\n e.stopPropagation();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n stop();\n options.onExit();\n }\n };\n const stop = () => {\n if (stopped) return;\n stopped = true;\n doc.removeEventListener(\"mousemove\", onMove, true);\n doc.removeEventListener(\"click\", onClick, true);\n doc.removeEventListener(\"mousedown\", swallow, true);\n doc.removeEventListener(\"mouseup\", swallow, true);\n doc.removeEventListener(\"keydown\", onKey, true);\n win.removeEventListener(\"scroll\", onScroll, true);\n win.removeEventListener(\"resize\", onScroll);\n scope.destroy();\n };\n done.addEventListener(\"click\", () => {\n stop();\n options.onExit();\n });\n exit.addEventListener(\"click\", () => {\n stop();\n options.onExit();\n });\n doc.addEventListener(\"mousemove\", onMove, true);\n doc.addEventListener(\"click\", onClick, true);\n doc.addEventListener(\"mousedown\", swallow, true);\n doc.addEventListener(\"mouseup\", swallow, true);\n doc.addEventListener(\"keydown\", onKey, true);\n win.addEventListener(\"scroll\", onScroll, true);\n win.addEventListener(\"resize\", onScroll);\n\n return {\n setStatus: (text) => {\n status.textContent = text;\n },\n setPicking: (enabled) => {\n picking = enabled;\n if (!enabled) paint(null);\n },\n stop,\n };\n}\n\nexport interface PreviewHandle {\n controller: GuideController;\n destroy(): void;\n}\n\n/**\n * Renders a single draft step on the current page (used by the dashboard editor's \"preview in\n * app\" and by the simulated preview). Anchored steps resolve their target; when it cannot be\n * found the step is shown as a modal so authors always see something.\n */\nexport function previewStep(step: GuideStep, theme?: Partial<ProjectTheme> | null, options: { appearance?: RunnableGuide[\"config\"][\"appearance\"]; onEnd?: () => void; doc?: Document; index?: number; total?: number } = {}): PreviewHandle {\n const previewStepConfig: GuideStep = { ...step, target: step.target ? { ...step.target, fallback: \"show_as_modal\", waitMs: Math.min(step.target.waitMs, 1500) } : step.target };\n const guide: RunnableGuide = {\n id: `preview-${step.id}`,\n key: \"preview\",\n name: \"Preview\",\n kind: \"flow\",\n version: 0,\n config: { steps: [previewStepConfig], visibility: \"everyone\", targeting: { id: \"root\", op: \"and\", rules: [] }, trigger: { type: \"manual\", delayMs: 0 }, frequency: { mode: \"every_time\", cooldownHours: 0, priority: 0, mutuallyExclusiveWith: [], reshowAfterDismiss: true }, appearance: options.appearance ?? { theme: \"auto\", animation: \"fade\" }, urlPatterns: [], platforms: [\"web\"] },\n };\n const controller = runGuide(guide, { theme, doc: options.doc, onEnd: () => options.onEnd?.(), onNavigate: () => {}, onAction: () => {} });\n controller.start();\n return { controller, destroy: () => controller.destroy() };\n}\n\nexport interface HighlightHandle {\n /** Number of matched elements per strategy. */\n counts: number[];\n /** Element resolved as the step target (first strategy with exactly one visible match). */\n resolved: Element | null;\n destroy(): void;\n}\n\n/** Draws dashed boxes around every element matched by the selectors, for testing selectors while authoring. */\nexport function highlightSelectors(selectors: SelectorStrategy[], options: { durationMs?: number; doc?: Document } = {}): HighlightHandle {\n const doc = options.doc ?? document;\n const scope = createScope(null, { theme: \"light\", animation: \"none\" }, doc);\n const boxes: HTMLElement[] = [];\n const counts: number[] = [];\n const resolved = resolveTarget(selectors, doc);\n const matched = new Set<Element>();\n selectors.forEach((s) => {\n const els = querySelectorStrategy(s, doc).filter((el) => !isGuidelyElement(el));\n counts.push(els.length);\n els.forEach((el) => matched.add(el));\n });\n matched.forEach((el) => {\n const r = visualRect(el);\n const box = doc.createElement(\"div\");\n box.className = \"g-highlight\";\n Object.assign(box.style, { left: `${r.left}px`, top: `${r.top}px`, width: `${r.width}px`, height: `${r.height}px` });\n if (el === resolved) box.style.borderColor = \"#22c55e\";\n scope.el.appendChild(box);\n boxes.push(box);\n });\n let timer: ReturnType<typeof setTimeout> | null = null;\n const destroy = () => {\n if (timer) clearTimeout(timer);\n scope.destroy();\n };\n if (options.durationMs !== 0) timer = setTimeout(destroy, options.durationMs ?? 2500);\n ensureHost(doc);\n return { counts, resolved, destroy };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA,iBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,qBAAgC;AAOzB,SAAS,WAAW,SAAoC,KAAsB;AACnF,MAAI,CAAC,QAAS,QAAO;AACrB,UAAI,gCAAgB,SAAS,GAAG,EAAG,QAAO;AAC1C,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,KAAK,kBAAkB;AACzC,QAAI,CAAC,QAAQ,SAAS,GAAG,KAAK,CAAC,QAAQ,SAAS,GAAG,EAAG,YAAO,gCAAgB,SAAS,EAAE,QAAQ,SAAK,gCAAgB,SAAS,EAAE,SAAS,EAAE,QAAQ;AAAA,EACrJ,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAIA,IAAM,kBACJ;AAEF,IAAM,UAAU;AAEhB,SAAS,MAAM,MAA2B;AACxC,SAAO,KAAK,aAAa,IAAK,OAAqB,KAAK;AAC1D;AAGA,SAAS,UAAU,KAAwB;AACzC,QAAM,KAAK,IAAI;AACf,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,IAAI,GAAG,sBAAsB;AACnC,SAAO,EAAE,QAAQ,KAAK,EAAE,SAAS;AACnC;AAGO,SAAS,cAAc,MAAyC;AACrE,UAAQ,QAAQ,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAChD;AAGO,SAAS,UAAUC,KAAsB;AAC9C,MAAI,CAACA,IAAG,YAAa,QAAO;AAC5B,QAAM,MAAMA,IAAG;AACf,QAAM,MAAM,IAAI;AAChB,MAAI,MAAsBA;AAC1B,SAAO,OAAO,QAAQ,IAAI,iBAAiB;AACzC,QAAK,IAAoB,OAAQ,QAAO;AACxC,QAAI,KAAK;AACP,YAAM,KAAK,IAAI,iBAAiB,GAAG;AACnC,UAAI,GAAG,YAAY,UAAU,GAAG,eAAe,SAAU,QAAO;AAAA,IAClE;AACA,UAAM,IAAI,iBAAmB,IAAI,YAAY,EAAiB,QAAgC;AAAA,EAChG;AACA,MAAI,UAAU,GAAG,GAAG;AAClB,UAAM,IAAIA,IAAG,sBAAsB;AACnC,QAAI,EAAE,UAAU,KAAK,EAAE,WAAW,EAAG,QAAO;AAAA,EAC9C;AACA,SAAO;AACT;AAGO,SAAS,iBAAiBA,KAA6B;AAC5D,MAAI,CAACA,IAAI,QAAO;AAChB,QAAM,OAAOA,IAAG,YAAY;AAC5B,MAAI,gBAAgB,cAAc,KAAK,KAAK,OAAO,QAAS,QAAO;AACnE,SAAOA,IAAG,OAAO,WAAW,CAAC,CAACA,IAAG,UAAU,IAAI,OAAO,EAAE;AAC1D;AAEA,SAAS,aAAa,MAAiB,UAA6B;AAClE,MAAI;AACF,WAAO,MAAM,KAAK,KAAK,iBAAiB,QAAQ,CAAC;AAAA,EACnD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAWO,IAAM,mBAAmB;AAChC,IAAM,eAAe;AAErB,SAAS,aAAa,MAAmD;AACvE,SAAO,CAAC,CAAC,QAAQ,KAAK,aAAa,MAAM,CAAC,CAAE,KAAoB;AAClE;AAGA,SAAS,aAAaA,KAAgC;AACpD,QAAM,OAAOA,IAAG,cAAc;AAC9B,SAAO,aAAa,IAAI,IAAI,OAAO;AACrC;AAGO,SAAS,eAAeA,KAA6B;AAC1D,SAAOA,IAAG,iBAAiB,aAAaA,GAAE,GAAG,QAAQ;AACvD;AAGO,SAAS,iBAAiB,UAAmB,MAA4B;AAC9E,MAAI,MAAsB,OAAQ,KAAK,aAAa,IAAK,OAAmB,KAAK,gBAAiB;AAClG,SAAO,KAAK,MAAM,eAAe,GAAG,EAAG,KAAI,QAAQ,SAAU,QAAO;AACpE,SAAO;AACT;AAGO,SAAS,eAAe,GAA0B;AACvD,QAAM,OAAO,OAAO,EAAE,iBAAiB,aAAa,EAAE,aAAa,IAAI,CAAC;AACxE,QAAM,QAAS,KAAK,CAAC,KAAK,EAAE;AAC5B,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,aAAa,IAAK,QAAoB,MAAM;AAC3D;AAGA,IAAI,kBAAuD;AAG3D,SAAS,cAAc,MAA+B;AACpD,QAAM,SAAS,iBAAiB,IAAI,IAAI;AACxC,MAAI,OAAQ,QAAO;AACnB,QAAM,MAAoB,CAAC;AAC3B,QAAM,QAAQ,CAAC,UAAqB;AAClC,UAAM,MAAM,MAAM,aAAa,IAAK,MAAkB,aAAa;AACnE,UAAM,QAAQ,MAAM,CAAC,KAAgB,IAAI,CAAC;AAC1C,eAAWA,OAAM,aAAa,OAAO,GAAG,EAAG,KAAIA,IAAG,WAAY,OAAM,KAAKA,GAAE;AAC3E,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,OAAO,WAAW,CAAC,KAAK,cAAc,IAAI,SAAS,KAAK,UAAU,EAAG;AAC9E,UAAI,KAAK,KAAK,UAAU;AACxB,YAAM,KAAK,UAAU;AAAA,IACvB;AAAA,EACF;AACA,QAAM,IAAI;AACV,mBAAiB,IAAI,MAAM,GAAG;AAC9B,SAAO;AACT;AAGA,SAAS,aAAa,MAAiB,UAA6B;AAClE,QAAM,MAAM,aAAa,MAAM,QAAQ;AACvC,aAAW,MAAM,cAAc,IAAI,EAAG,KAAI,KAAK,GAAG,aAAa,IAAI,QAAQ,CAAC;AAC5E,SAAO;AACT;AAMA,SAAS,SAAS,MAAiB,UAAkB,MAA0B;AAC7E,MAAI,CAAC,SAAS,SAAS,KAAK,EAAG,QAAO,OAAO,aAAa,MAAM,QAAQ,IAAI,aAAa,MAAM,QAAQ;AACvG,QAAM,QAAQ,SAAS,MAAM,YAAY,EAAE,OAAO,OAAO;AACzD,MAAI,SAAsB,CAAC,IAAI;AAC/B,MAAI,UAAqB,CAAC;AAC1B,QAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,cAAU,MAAM,KAAK,IAAI,IAAI,OAAO,QAAQ,CAAC,UAAU,aAAa,OAAO,IAAI,CAAC,CAAC,CAAC;AAClF,QAAI,IAAI,MAAM,SAAS,EAAG,UAAS,QAAQ,IAAI,CAACA,QAAOA,IAAG,UAAU,EAAE,OAAO,CAAC,OAAyB,CAAC,CAAC,EAAE;AAAA,EAC7G,CAAC;AACD,SAAO;AACT;AAOO,SAAS,gBAAgBA,KAAa,UAAkC;AAC7E,MAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,UAAM,OAAO,IAAI,IAAI,SAAS,MAAMA,GAAE,GAAG,UAAU,IAAI,CAAC;AACxD,aAAS,MAAsBA,KAAI,KAAK,MAAM,eAAe,GAAG,EAAG,KAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC7F,WAAO;AAAA,EACT;AACA,WAAS,MAAsBA,KAAI,KAAK,MAAM,eAAe,GAAG,EAAG,KAAI,IAAI,QAAQ,QAAQ,EAAG,QAAO;AACrG,SAAO;AACT;AAGO,SAAS,qBAAqB,KAAe,GAAW,GAA2B;AACxF,MAAIA,MAAK,IAAI,iBAAiB,GAAG,CAAC;AAClC,SAAOA,KAAI,cAAcA,IAAG,OAAO,WAAW,OAAOA,IAAG,WAAW,qBAAqB,YAAY;AAClG,UAAM,QAAQA,IAAG,WAAW,iBAAiB,GAAG,CAAC;AACjD,QAAI,CAAC,SAAS,UAAUA,IAAI;AAC5B,IAAAA,MAAK;AAAA,EACP;AACA,SAAOA;AACT;AAEA,SAAS,UAAU,OAAuB;AACxC,QAAM,IAAI;AACV,MAAI,EAAE,OAAO,OAAO,EAAE,IAAI,WAAW,WAAY,QAAO,EAAE,IAAI,OAAO,KAAK;AAC1E,SAAO,MAAM,QAAQ,UAAU,MAAM;AACvC;AAEA,SAAS,WAAW,MAAiB,MAAyB;AAC5D,QAAM,MAAM,MAAM,IAAI;AACtB,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,aAAa,WAAY,QAAO,CAAC;AAC9C,MAAI;AACF,UAAM,SAAS,EAAE,SAAS,MAAM,MAAM,MAAM,GAAoC,IAAI;AACpF,UAAM,MAAiB,CAAC;AACxB,aAAS,IAAI,GAAG,IAAI,OAAO,gBAAgB,KAAK;AAC9C,YAAM,IAAI,OAAO,aAAa,CAAC;AAC/B,UAAI,KAAK,EAAE,aAAa,EAAG,KAAI,KAAK,CAAY;AAAA,IAClD;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,UAAU,MAAiB,MAAc,MAA0B;AAC1E,QAAM,SAAS,cAAc,IAAI,EAAE,YAAY;AAC/C,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,QAAM,aAAa,SAAS,MAAM,iBAAiB,IAAI;AACvD,QAAM,QAAQ,WAAW,OAAO,CAAC,MAAM,cAAc,EAAE,WAAW,EAAE,YAAY,MAAM,MAAM;AAC5F,MAAI,MAAM,OAAQ,QAAO;AACzB,SAAO,WAAW,OAAO,CAAC,MAAM,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,MAAM,CAAC;AAC7F;AAMO,SAAS,sBAAsB,UAA4B,MAAiB,OAAO,MAAiB;AACzG,QAAM,QAAQ,SAAS,MAAM,KAAK;AAClC,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,MAAM;AACT,YAAM,KAAK,MAAM,WAAW,GAAG,IAAI,MAAM,MAAM,CAAC,IAAI;AACpD,aAAO,SAAS,MAAM,IAAI,UAAU,EAAE,CAAC,IAAI,IAAI;AAAA,IACjD;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,KAAK,MAAM,WAAW,GAAG,IAAI,MAAM,MAAM,CAAC,IAAI;AACpD,aAAO,SAAS,MAAM,aAAa,mBAAmB,EAAE,GAAG,IAAI;AAAA,IACjE;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,SAAS,MAAM,MAAM,WAAW,GAAG,KAAK,cAAc,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,IAAI;AAAA,IACvG,KAAK;AACH,aAAO,UAAU,MAAM,OAAO,IAAI;AAAA,IACpC,KAAK;AACH,aAAO,WAAW,MAAM,KAAK;AAAA,IAC/B;AACE,aAAO,CAAC;AAAA,EACZ;AACF;AAQO,SAAS,cAAc,QAA4D,OAAkB,UAA0B;AACpI,QAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,SAAS,OAAO;AAC1D,QAAM,iBAAiB,CAAC,UAA4B,SAAkB,sBAAsB,UAAU,MAAM,IAAI,EAAE,OAAO,CAACA,QAAO,CAAC,iBAAiBA,GAAE,KAAK,UAAUA,GAAE,CAAC;AACvK,QAAM,QAAQ;AACd,wCAAoB,oBAAI,IAAI;AAC5B,MAAI;AACF,eAAW,YAAY,WAAW;AAChC,UAAI,UAAU,eAAe,UAAU,KAAK;AAC5C,UAAI,CAAC,QAAQ,UAAU,SAAS,SAAS,QAAS,WAAU,eAAe,UAAU,IAAI;AACzF,UAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,EACT,UAAE;AACA,sBAAkB;AAAA,EACpB;AACF;AAYO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAE5C,YAAY,UAAU,2CAA2C;AAC/D,UAAM,OAAO;AAFf,wBAAS,QAAO;AAAA,EAGhB;AACF;AAOO,SAAS,cAAc,QAA4D,UAAgC,CAAC,GAAqB;AAC9I,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,SAAS,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,UAAU,GAAG,CAAC;AAChE,SAAO,IAAI,QAAiB,CAAC,SAAS,WAAW;AAC/C,UAAM,YAAY,cAAc,QAAQ,IAAI;AAC5C,QAAI,UAAW,QAAO,QAAQ,SAAS;AACvC,QAAI,QAAQ,QAAQ,QAAS,QAAO,OAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AACpF,QAAI,OAAO;AACX,QAAI,WAAoC;AACxC,QAAI,QAA+C;AACnD,QAAI,UAAgD;AACpD,UAAM,UAAU,MAAM;AACpB,aAAO;AACP,gBAAU,WAAW;AACrB,UAAI,MAAO,eAAc,KAAK;AAC9B,UAAI,QAAS,cAAa,OAAO;AACjC,cAAQ,QAAQ,oBAAoB,SAAS,OAAO;AAAA,IACtD;AACA,UAAM,QAAQ,MAAM;AAClB,UAAI,KAAM;AACV,YAAMA,MAAK,cAAc,QAAQ,IAAI;AACrC,UAAIA,KAAI;AACN,gBAAQ;AACR,gBAAQA,GAAE;AAAA,MACZ;AAAA,IACF;AACA,UAAM,UAAU,MAAM;AACpB,cAAQ;AACR,aAAO,IAAI,aAAa,WAAW,YAAY,CAAC;AAAA,IAClD;AACA,YAAQ,QAAQ,iBAAiB,SAAS,OAAO;AACjD,UAAM,cAAc,KAAK,aAAa,IAAK,KAAkB,kBAAmB;AAChF,QAAI,OAAO,qBAAqB,eAAe,aAAa;AAC1D,iBAAW,IAAI,iBAAiB,KAAK;AACrC,eAAS,QAAQ,aAAa,EAAE,WAAW,MAAM,SAAS,MAAM,YAAY,MAAM,iBAAiB,CAAC,SAAS,SAAS,UAAU,MAAM,aAAa,mBAAmB,YAAY,EAAE,CAAC;AAAA,IACvL;AACA,YAAQ,YAAY,OAAO,MAAM;AACjC,QAAI,YAAY,GAAG;AACjB,gBAAU,WAAW,MAAM;AACzB,gBAAQ;AACR,eAAO,IAAI,mBAAmB,CAAC;AAAA,MACjC,GAAG,SAAS;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAMA,IAAM,eAAe;AACrB,IAAM,kBAAkB;AACxB,IAAM,uBAAuB,CAAC,eAAe,aAAa,aAAa,gBAAgB,WAAW,WAAW,WAAW,aAAa,cAAc;AACnJ,IAAM,qBAAqB;AAGpB,SAAS,WAAW,IAAqB;AAC9C,SAAO,CAAC,CAAC,MAAM,mBAAmB,KAAK,EAAE,KAAK,CAAC,aAAa,KAAK,EAAE;AACrE;AAGO,SAAS,cAAc,KAAsB;AAClD,SAAO,CAAC,CAAC,OAAO,CAAC,gBAAgB,KAAK,GAAG,KAAK,IAAI,UAAU;AAC9D;AAGA,SAAS,aAAa,MAAiB,UAAkBA,KAAsB;AAC7E,QAAM,MAAM,aAAa,MAAM,QAAQ;AACvC,SAAO,IAAI,WAAW,KAAK,IAAI,CAAC,MAAMA;AACxC;AAEA,SAAS,aAAa,MAAc,OAAuB;AACzD,SAAO,IAAI,IAAI,KAAK,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,CAAC;AACvE;AAGA,SAAS,QAAQA,KAAa,MAA4C;AACxE,QAAM,MAAMA,IAAG;AACf,QAAM,WAAqB,CAAC;AAC5B,MAAI,MAAsBA;AAC1B,SAAO,OAAO,IAAI,aAAa,KAAK,QAAQ,IAAI,QAAQ,QAAQ,IAAI,iBAAiB;AACnF,UAAM,MAAM,IAAI,QAAQ,YAAY;AACpC,QAAI,WAAW,IAAI,EAAE,GAAG;AACtB,eAAS,QAAQ,IAAI,IAAI,EAAE,EAAE;AAC7B;AAAA,IACF;AACA,QAAI,MAAM;AACV,UAAM,SAAyB,IAAI;AACnC,QAAI,QAAQ;AACV,YAAM,UAAU,MAAM,KAAK,OAAO,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,IAAK,OAAO;AACpF,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,YAAY,MAAM,KAAK,IAAI,SAAS,EAAE,KAAK,CAAC,MAAM,cAAc,CAAC,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC;AACvI,eAAO,YAAY,IAAI,UAAU,SAAS,CAAC,KAAK,gBAAgB,QAAQ,QAAQ,GAAG,IAAI,CAAC;AAAA,MAC1F;AAAA,IACF;AACA,aAAS,QAAQ,GAAG;AACpB,UAAM,YAAY,SAAS,KAAK,KAAK;AACrC,QAAI,aAAa,MAAM,WAAWA,GAAE,EAAG,QAAO;AAC9C,UAAM;AAAA,EACR;AACA,QAAM,OAAO,SAAS,KAAK,KAAK;AAChC,SAAO,aAAa,MAAM,MAAMA,GAAE,IAAI,OAAO;AAC/C;AAMO,SAAS,gBAAgBA,KAA4B;AAC1D,QAAM,QAAkB,CAAC;AACzB,WAAS,OAAO,aAAaA,GAAE,GAAG,MAAM,OAAO,aAAa,KAAK,IAAI,GAAG;AACtE,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,QAAQ,MAAM,aAAa,IAAI,KAAK,KAAK,aAAa;AACnE,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,QAAQ,IAAI;AAAA,EACpB;AACA,SAAO,MAAM,KAAK,gBAAgB;AACpC;AAQA,SAAS,YAAYA,KAAa,UAAiC;AACjE,QAAM,OAAO,aAAaA,GAAE;AAC5B,MAAI,CAAC,KAAM,QAAO,aAAaA,IAAG,eAAe,UAAUA,GAAE,IAAI,WAAW;AAC5E,MAAI,CAAC,aAAa,MAAM,UAAUA,GAAE,EAAG,QAAO;AAC9C,QAAM,MAAMA,IAAG;AACf,QAAM,OAAO,CAAC,QAAgB;AAC5B,UAAM,MAAM,SAAS,KAAK,KAAK,IAAI;AACnC,WAAO,IAAI,WAAW,KAAK,IAAI,CAAC,MAAMA;AAAA,EACxC;AACA,MAAI,KAAK,QAAQ,EAAG,QAAO;AAC3B,QAAM,QAAQ,gBAAgBA,GAAE;AAChC,QAAM,SAAS,QAAQ,QAAQ,mBAAmB,WAAW;AAC7D,SAAO,UAAU,KAAK,MAAM,IAAI,SAAS;AAC3C;AAGA,SAAS,WAAWA,KAAqB;AACvC,MAAI,CAACA,IAAG,WAAY,QAAO;AAC3B,QAAM,QAAQ,MAAM,KAAKA,IAAG,WAAW,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,4BAA4B,KAAK,EAAE,OAAO,CAAC;AAC3G,SAAO,cAAc,MAAM,IAAI,CAAC,MAAO,EAAkB,aAAa,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC;AAChG;AAGO,SAAS,eAAeA,KAAqB;AAClD,QAAM,KAAKA;AACX,QAAM,MAAM,cAAc,GAAG,aAAaA,IAAG,WAAW,KAAK,WAAWA,GAAE;AAC1E,QAAM,MAAM,cAAcA,IAAG,aAAa,YAAY,KAAKA,IAAG,aAAa,OAAO,KAAKA,IAAG,aAAa,aAAa,KAAKA,IAAG,aAAa,KAAK,KAAMA,IAAwB,KAAK;AACjL,UAAQ,OAAO,KAAK,MAAM,GAAG,GAAG;AAClC;AAMO,SAAS,kBAAkBA,KAAiC;AACjE,QAAM,MAA0B,CAAC;AACjC,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,OAAO,CAAC,MAAwB;AACpC,UAAM,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK;AAC9B,QAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAChB,WAAK,IAAI,CAAC;AACV,UAAI,KAAK,CAAC;AAAA,IACZ;AAAA,EACF;AACA,QAAM,MAAMA,IAAG,QAAQ,YAAY;AAEnC,QAAM,UAAU,CAAC,MAAgC,UAAkB,OAAe,UAAkB;AAClG,UAAM,WAAW,YAAYA,KAAI,QAAQ;AACzC,QAAI,aAAa,SAAU,MAAK,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,aAC7C,SAAU,MAAK,EAAE,MAAM,OAAO,OAAO,UAAU,MAAM,CAAC;AAC/D,WAAO,CAAC,CAAC;AAAA,EACX;AAGA,QAAM,YAAYA,IAAG,aAAa,iBAAiB;AACnD,MAAI,UAAW,SAAQ,cAAc,aAAa,mBAAmB,SAAS,GAAG,WAAW,cAAc,SAAS,EAAE;AACrH,MAAI,WAAWA,IAAG,EAAE,EAAG,SAAQ,MAAM,IAAI,UAAUA,IAAG,EAAE,CAAC,IAAI,IAAIA,IAAG,EAAE,IAAI,MAAMA,IAAG,EAAE,EAAE;AAEvF,QAAM,YAAY,MAAM,KAAKA,IAAG,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,WAAW,OAAO,KAAK,CAAC,mBAAmB,KAAK,EAAE,IAAI,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,CAAC,SAAS,KAAK,EAAE,KAAK,CAAC;AACvL,YAAU,KAAK,CAAC,GAAG,MAAM;AACvB,UAAM,KAAK,qBAAqB,QAAQ,EAAE,IAAI;AAC9C,UAAM,KAAK,qBAAqB,QAAQ,EAAE,IAAI;AAC9C,YAAQ,OAAO,KAAK,KAAK,OAAO,OAAO,KAAK,KAAK;AAAA,EACnD,CAAC;AACD,aAAW,KAAK,WAAW;AACzB,UAAM,MAAM,aAAa,EAAE,MAAM,EAAE,KAAK;AACxC,QAAI,CAAC,QAAQ,aAAa,KAAK,KAAK,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,EAAG,SAAQ,aAAa,MAAM,KAAK,MAAM,KAAK,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE;AAAA,EAChI;AAEA,QAAM,OAAOA,IAAG,aAAa,YAAY;AACzC,MAAI,QAAQ,KAAK,UAAU,KAAK;AAC9B,UAAM,MAAM,aAAa,cAAc,IAAI;AAC3C,QAAI,CAAC,QAAQ,QAAQ,KAAK,KAAK,IAAI,EAAG,SAAQ,QAAQ,MAAM,KAAK,MAAM,KAAK,IAAI;AAAA,EAClF;AAEA,QAAM,OAAOA,IAAG,aAAa,MAAM;AACnC,MAAI,KAAM,SAAQ,OAAO,MAAM,aAAa,QAAQ,IAAI,GAAG,MAAM,aAAa,QAAQ,IAAI,GAAG,GAAG,GAAG,SAAS,IAAI,EAAE;AAClH,QAAM,OAAOA,IAAG,aAAa,MAAM;AACnC,MAAI,MAAM;AACR,UAAM,QAAQA,IAAG,aAAa,OAAO,KAAKA,IAAG,aAAa,iBAAiB;AAC3E,UAAM,MAAM,QAAQ,UAAU,IAAI,KAAK,aAAaA,IAAG,aAAa,OAAO,IAAI,UAAU,mBAAmB,KAAK,CAAC,KAAK,UAAU,IAAI;AACrI,YAAQ,OAAO,KAAK,KAAK,QAAQ,IAAI,EAAE;AAAA,EACzC;AACA,MAAI,QAAQ,KAAK;AACf,UAAM,OAAOA,IAAG,aAAa,MAAM;AACnC,QAAI,QAAQ,KAAK,UAAU,IAAK,SAAQ,OAAO,IAAI,aAAa,QAAQ,IAAI,CAAC,IAAI,IAAI,aAAa,QAAQ,IAAI,CAAC,IAAI,QAAQ,IAAI,EAAE;AAAA,EACnI;AAEA,QAAM,OAAO,QAAQA,KAAI,aAAaA,GAAE,KAAKA,IAAG,aAAa;AAC7D,MAAI,KAAM,SAAQ,OAAO,MAAM,MAAM,UAAU;AAE/C,MAAI,oCAAoC,KAAK,GAAG,KAAK,SAAS,YAAY,SAAS,UAAU,SAAS,SAAS,SAAS,YAAY;AAClI,UAAM,OAAO,cAAeA,IAAmB,aAAaA,IAAG,WAAW;AAC1E,QAAI,QAAQ,KAAK,UAAU,GAAI,MAAK,EAAE,MAAM,QAAQ,OAAO,MAAM,OAAO,SAAS,IAAI,IAAI,CAAC;AAAA,EAC5F;AACA,SAAO,IAAI,MAAM,GAAG,EAAE;AACxB;AAcO,SAAS,WAAWA,KAAsB;AAC/C,QAAM,MAAMA,IAAG,sBAAsB;AACrC,MAAI,CAACA,IAAG,WAAY,QAAO;AAC3B,QAAM,QAAQ,CAAC,KAAK,GAAG,MAAM,KAAKA,IAAG,WAAW,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,KAAK,EAAE,SAAS,CAAC;AAC1I,MAAI,MAAM,SAAS,EAAG,QAAO,MAAM,CAAC,KAAK;AACzC,QAAM,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACjD,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAC/C,QAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACnD,QAAM,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACrD,SAAO,IAAI,QAAQ,MAAM,KAAK,QAAQ,MAAM,SAAS,GAAG;AAC1D;AAGA,IAAM,wBAAwB;AAC9B,IAAM,mBAAmB;AAUlB,SAAS,gBAAgBA,KAAsB;AACpD,MAAI,CAAC,UAAUA,IAAG,aAAa,EAAG,QAAOA;AACzC,MAAI,MAAMA;AACV,WAAS,OAAO,aAAa,GAAG,GAAG,MAAM,OAAO,aAAa,GAAG,GAAG;AACjE,UAAM,OAAO,KAAK;AAClB,QAAI,KAAK,OAAO,QAAS;AACzB,QAAI,UAA0B;AAC9B,QAAI;AACF,gBAAU,IAAI,QAAQ,gBAAgB;AAAA,IACxC,QAAQ;AAAA,IAER;AACA,UAAM,IAAI,WAAW,WAAW,GAAG;AACnC,UAAM,OAAO,EAAE,QAAQ,EAAE;AACzB,UAAMC,KAAI,WAAW,IAAI;AACzB,UAAM,WAAWA,GAAE,QAAQA,GAAE;AAC7B,UAAM,SAAS,EAAE,QAAQA,GAAE,OAAO,KAAK,EAAE,OAAOA,GAAE,MAAM,KAAK,EAAE,SAASA,GAAE,QAAQ,KAAK,EAAE,UAAUA,GAAE,SAAS;AAC9G,QAAI,CAAC,QAAQ,CAAC,UAAU,WAAW,OAAO,sBAAuB;AACjE,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAMO,SAAS,gBAAgBD,KAAiC;AAC/D,QAAM,SAAS,gBAAgBA,GAAE;AACjC,QAAM,IAAI,WAAW,MAAM;AAC3B,SAAO;AAAA,IACL,WAAW,kBAAkB,MAAM;AAAA,IACnC,cAAc,eAAe,MAAM,KAAK,eAAeA,GAAE;AAAA,IACzD,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,IACzD,KAAK,OAAO,QAAQ,YAAY;AAAA,EAClC;AACF;;;ACplBA,IAAAE,kBAAmF;AAEnF,IAAM,eAAe,oBAAI,IAAI,CAAC,KAAK,MAAM,UAAU,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM,QAAQ,OAAO,cAAc,QAAQ,OAAO,MAAM,QAAQ,CAAC;AACzL,IAAM,YAAY,oBAAI,IAAI,CAAC,UAAU,SAAS,UAAU,SAAS,QAAQ,SAAS,YAAY,UAAU,QAAQ,QAAQ,QAAQ,YAAY,OAAO,QAAQ,SAAS,YAAY,UAAU,CAAC;AAC3L,IAAM,gBAAgB,oBAAI,IAAI,CAAC,QAAQ,OAAO,OAAO,SAAS,UAAU,OAAO,SAAS,SAAS,UAAU,iBAAiB,cAAc,CAAC;AAC3I,SAAS,UAAU,OAAe,MAAc,KAAsB;AAEpE,QAAM,IAAI,MAAM,KAAK,EAAE,QAAQ,sBAAsB,EAAE,EAAE,YAAY;AACrE,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,wBAAwB,KAAK,CAAC;AACxC,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,SAAS,EAAE,CAAC;AAClB,MAAI,WAAW,OAAQ,QAAO,QAAQ,SAAS,SAAS,SAAS,EAAE,WAAW,aAAa;AAC3F,SAAO,WAAW,UAAU,WAAW,WAAW,WAAW,YAAY,WAAW;AACtF;AAEA,SAAS,gBAAgBC,KAAmB;AAC1C,QAAM,MAAMA,IAAG,QAAQ,YAAY;AACnC,aAAW,QAAQ,MAAM,KAAKA,IAAG,UAAU,GAAG;AAC5C,UAAM,OAAO,KAAK,KAAK,YAAY;AACnC,QAAI,KAAK,WAAW,IAAI,KAAK,CAAC,cAAc,IAAI,IAAI,GAAG;AACrD,MAAAA,IAAG,gBAAgB,KAAK,IAAI;AAC5B;AAAA,IACF;AACA,SAAK,SAAS,UAAU,SAAS,UAAU,CAAC,UAAU,KAAK,OAAO,MAAM,GAAG,EAAG,CAAAA,IAAG,gBAAgB,KAAK,IAAI;AAAA,EAC5G;AACA,MAAI,QAAQ,KAAK;AACf,UAAM,SAASA,IAAG,aAAa,QAAQ;AACvC,QAAI,UAAU,WAAW,YAAY,WAAW,QAAS,CAAAA,IAAG,gBAAgB,QAAQ;AACpF,QAAIA,IAAG,aAAa,QAAQ,MAAM,SAAU,CAAAA,IAAG,aAAa,OAAO,qBAAqB;AAAA,EAC1F;AACA,MAAI,QAAQ,SAAU,CAAAA,IAAG,aAAa,QAAQ,QAAQ;AACtD,MAAI,QAAQ,OAAO;AACjB,eAAW,OAAO,CAAC,SAAS,QAAQ,EAAG,KAAIA,IAAG,aAAa,GAAG,KAAK,CAAC,YAAY,KAAKA,IAAG,aAAa,GAAG,CAAE,EAAG,CAAAA,IAAG,gBAAgB,GAAG;AACnI,IAAAA,IAAG,aAAa,WAAW,MAAM;AACjC,QAAI,CAACA,IAAG,aAAa,KAAK,EAAG,CAAAA,IAAG,aAAa,OAAO,EAAE;AAAA,EACxD;AACF;AAOA,SAAS,aAAaA,KAA6B;AACjD,QAAM,MAAMA,IAAG;AACf,QAAM,MAAMA,IAAG,QAAQ,YAAY;AACnC,QAAM,MAAMA,IAAG,aAAa,KAAK;AACjC,MAAI;AACJ,MAAI,QAAQ,UAAU;AACpB,QAAI,KAAC,mCAAkB,GAAG,EAAG,QAAO;AACpC,UAAM,IAAI,cAAc,QAAQ;AAChC,QAAI,aAAa,OAAO,GAAI;AAC5B,QAAI,aAAa,SAASA,IAAG,aAAa,OAAO,KAAK,gBAAgB;AACtE,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,kCAAkB,EAAG,KAAI,aAAa,GAAG,CAAC;AAAA,EAChF,OAAO;AACL,QAAI,KAAC,gCAAe,GAAG,EAAG,QAAO;AACjC,UAAM,IAAI,cAAc,OAAO;AAC/B,QAAI,aAAa,OAAO,GAAI;AAC5B,UAAM,SAASA,IAAG,aAAa,QAAQ;AACvC,YAAI,gCAAe,MAAM,EAAG,KAAI,aAAa,UAAU,MAAO;AAC9D,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,2BAAW,EAAG,KAAI,aAAa,GAAG,CAAC;AAAA,EACzE;AACA,SAAO;AACT;AAEA,SAAS,KAAK,MAAkB;AAC9B,QAAM,WAAW,MAAM,KAAK,KAAK,UAAU;AAC3C,aAAW,SAAS,UAAU;AAC5B,QAAI,MAAM,aAAa,GAAiB;AACtC,WAAK,YAAY,KAAK;AACtB;AAAA,IACF;AACA,QAAI,MAAM,aAAa,EAAG;AAC1B,UAAMA,MAAK;AACX,UAAM,MAAMA,IAAG,QAAQ,YAAY;AACnC,QAAI,UAAU,IAAI,GAAG,GAAG;AACtB,WAAK,YAAYA,GAAE;AACnB;AAAA,IACF;AACA,QAAI,QAAQ,YAAY,QAAQ,SAAS;AACvC,YAAM,QAAQ,aAAaA,GAAE;AAC7B,UAAI,MAAO,MAAK,aAAa,OAAOA,GAAE;AAAA,UACjC,MAAK,YAAYA,GAAE;AACxB;AAAA,IACF;AACA,QAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAE1B,aAAOA,IAAG,WAAY,MAAK,aAAaA,IAAG,YAAYA,GAAE;AACzD,WAAK,YAAYA,GAAE;AAEnB,WAAK,IAAI;AACT;AAAA,IACF;AACA,oBAAgBA,GAAE;AAClB,SAAKA,GAAE;AAAA,EACT;AACF;AAMO,SAAS,mBAAmB,MAAc,MAAgB,UAA4B;AAC3F,QAAM,MAAM,IAAI,cAAc,UAAU;AACxC,MAAI,YAAY,QAAQ;AACxB,OAAK,IAAI,OAAO;AAChB,SAAO,IAAI;AACb;AAGO,SAAS,aAAa,MAAc,MAAgB,UAAkB;AAC3E,QAAM,OAAO,mBAAmB,MAAM,GAAG;AACzC,QAAM,MAAM,IAAI,cAAc,KAAK;AACnC,MAAI,YAAY,IAAI;AACpB,SAAO,IAAI;AACb;AAGO,SAAS,iBAAiBA,KAAa,MAAoB;AAChE,EAAAA,IAAG,cAAc;AACjB,EAAAA,IAAG,YAAY,mBAAmB,MAAMA,IAAG,aAAa,CAAC;AAC3D;;;AC1HA,IAAAC,kBAAkE;;;ACClE,IAAAC,kBAA+C;;;ACAxC,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADGf,IAAMC,WAAU;AAWvB,IAAI,UAA6B;AAG1B,IAAM,gBAA8B;AAAA,EACzC,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AACd;AAGO,SAAS,WAAW,MAAgB,UAAsB;AAC/D,MAAI,WAAW,QAAQ,KAAK,eAAe,QAAQ,KAAK,kBAAkB,IAAK,QAAO;AACtF,MAAI,OAAO,IAAI,eAAeA,QAAO;AACrC,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,cAAc,KAAK;AAC9B,SAAK,KAAKA;AACV,SAAK,aAAa,gBAAgB,EAAE;AACpC,KAAC,IAAI,QAAQ,IAAI,iBAAiB,YAAY,IAAI;AAAA,EACpD;AACA,QAAM,SAAS,KAAK,cAAc,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AACpE,MAAI,CAAC,OAAO,cAAc,oBAAoB,GAAG;AAC/C,UAAM,QAAQ,IAAI,cAAc,OAAO;AACvC,UAAM,aAAa,eAAe,EAAE;AACpC,UAAM,cAAc;AACpB,WAAO,YAAY,KAAK;AAAA,EAC1B;AACA,MAAI,OAAO,OAAO,cAA2B,SAAS;AACtD,MAAI,CAAC,MAAM;AACT,WAAO,IAAI,cAAc,KAAK;AAC9B,SAAK,YAAY;AACjB,SAAK,aAAa,aAAa,QAAQ;AACvC,SAAK,aAAa,eAAe,MAAM;AACvC,WAAO,YAAY,IAAI;AAAA,EACzB;AACA,QAAM,SAAS;AACf,YAAU;AAAA,IACR;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,SAAS,MAAc;AACrB,aAAO,cAAc;AACrB,iBAAW,MAAM;AACf,eAAO,cAAc;AAAA,MACvB,GAAG,EAAE;AAAA,IACP;AAAA,IACA,UAAU;AACR,YAAM,OAAO;AACb,UAAI,SAAS,SAAS,KAAM,WAAU;AAAA,IACxC;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,cAAoB;AAClC,WAAS,QAAQ;AACjB,QAAM,QAAQ,OAAO,aAAa,cAAc,SAAS,eAAeA,QAAO,IAAI;AACnF,SAAO,OAAO;AACd,YAAU;AACZ;AAIA,SAAS,cAAuB;AAC9B,MAAI;AACF,WAAO,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,cAAc,OAAO,WAAW,8BAA8B,EAAE;AAAA,EACvI,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,uBAAgC;AAC9C,MAAI;AACF,WAAO,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,cAAc,OAAO,WAAW,kCAAkC,EAAE;AAAA,EAC3I,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAeO,SAAS,aAAa,OAAiD,YAAoD;AAChI,QAAM,IAAI,EAAE,GAAG,eAAe,GAAI,SAAS,CAAC,EAAG;AAC/C,QAAM,IAAI,cAAc,CAAC;AACzB,QAAM,YAAY,EAAE,SAAS;AAC7B,QAAM,OAA0B,cAAc,SAAU,YAAY,IAAI,SAAS,UAAW;AAC5F,QAAM,OAAO,SAAS;AACtB,SAAO;AAAA,IACL,SAAS,EAAE,gBAAgB,EAAE;AAAA,IAC7B,IAAI,EAAE,oBAAoB,OAAO,YAAY,EAAE;AAAA,IAC/C,MAAM,EAAE,cAAc,OAAO,YAAY,EAAE;AAAA,IAC3C,QAAQ,EAAE,gBAAgB,EAAE;AAAA,IAC5B,MAAM,EAAE,cAAc,EAAE;AAAA,IACxB,GAAG,EAAE,UAAU;AAAA,IACf,SAAS,EAAE,kBAAkB;AAAA,IAC7B;AAAA,IACA,WAAW,qBAAqB,IAAI,SAAU,EAAE,aAAa;AAAA,EAC/D;AACF;AAGO,SAAS,WAAWC,KAAiB,MAAuB;AACjE,EAAAA,IAAG,MAAM,YAAY,eAAe,KAAK,OAAO;AAEhD,MAAI,gCAAgC,KAAK,KAAK,OAAO,EAAG,CAAAA,IAAG,MAAM,YAAY,wBAAoB,gCAAe,KAAK,OAAO,CAAC;AAC7H,EAAAA,IAAG,MAAM,YAAY,UAAU,KAAK,EAAE;AACtC,EAAAA,IAAG,MAAM,YAAY,YAAY,KAAK,IAAI;AAC1C,EAAAA,IAAG,MAAM,YAAY,cAAc,GAAG,KAAK,MAAM,IAAI;AACrD,EAAAA,IAAG,MAAM,YAAY,YAAY,KAAK,IAAI;AAC1C,EAAAA,IAAG,MAAM,YAAY,SAAS,OAAO,KAAK,CAAC,CAAC;AAC5C,EAAAA,IAAG,MAAM,YAAY,eAAe,OAAO,KAAK,OAAO,CAAC;AACxD,EAAAA,IAAG,aAAa,cAAc,KAAK,IAAI;AACvC,EAAAA,IAAG,aAAa,aAAa,KAAK,SAAS;AAC7C;AAMO,SAAS,YAAY,OAAsC,YAAyC,MAAgB,UAAiE;AAC1L,QAAM,SAAS,WAAW,GAAG;AAC7B,QAAMA,MAAK,IAAI,cAAc,KAAK;AAClC,EAAAA,IAAG,YAAY;AACf,QAAM,OAAO,aAAa,OAAO,UAAU;AAC3C,aAAWA,KAAI,IAAI;AACnB,SAAO,OAAO,YAAYA,GAAE;AAG5B,QAAM,MAAM,CAAC,aAAa,OAAO,YAAY,QAAW,YAAY,SAAS,EAAE,OAAO,CAAC,MAAmB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AAC3H,MAAI,QAAiC;AACrC,MAAI,IAAI,QAAQ;AACd,UAAM,KAAK,IAAI,EAAE,WAAW;AAC5B,IAAAA,IAAG,aAAa,cAAc,EAAE;AAChC,YAAQ,IAAI,cAAc,OAAO;AACjC,UAAM,aAAa,iBAAiB,EAAE;AACtC,UAAM,cAAc,IAAI,IAAI,CAAC,UAAM,gCAAe,GAAG,wBAAwB,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI;AAC/F,WAAO,OAAO,aAAa,OAAOA,GAAE;AAAA,EACtC;AACA,MAAI,KAA4B;AAChC,QAAM,WAAW,MAAM,WAAWA,KAAI,aAAa,OAAO,UAAU,CAAC;AACrE,OAAK,YAAY,SAAS,YAAY,UAAU,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AACxH,QAAI;AACF,WAAK,OAAO,WAAW,8BAA8B;AACrD,SAAG,mBAAmB,UAAU,QAAQ;AAAA,IAC1C,QAAQ;AACN,WAAK;AAAA,IACP;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAAA;AAAA,IACA;AAAA,IACA,UAAU;AACR,UAAI,sBAAsB,UAAU,QAAQ;AAC5C,aAAO,OAAO;AACd,MAAAA,IAAG,OAAO;AAAA,IACZ;AAAA,EACF;AACF;AAEA,IAAI,cAAc;;;ADjLX,SAAS,kBAAkB,MAAe,MAAgB,KAAK,eAAqB;AACzF,aAAW,SAAS,MAAM,KAAK,KAAK,iBAAiB,OAAO,+BAAe,EAAE,CAAC,GAAG;AAC/E,UAAM,OAAO,MAAM,cAAiC,KAAK,+BAAe,EAAE;AAC1E,UAAM,QAAQ,MAAM,cAA2B,IAAI,+BAAe,EAAE;AACpE,QAAI,CAAC,QAAQ,CAAC,SAAS,MAAM,aAAa,cAAc,EAAG;AAE3D,eAAW,OAAO,MAAM,KAAK,MAAM,iBAAiB,gBAAgB,CAAC,EAAG,KAAI,OAAO;AACnF,UAAM,QAAQ,MAAM,KAAK,MAAM,iBAAiB,KAAK,CAAC;AACtD,QAAI,CAAC,MAAM,QAAQ;AACjB,YAAM,OAAO;AACb;AAAA,IACF;AACA,UAAM,aAAa,gBAAgB,EAAE;AACrC,UAAM,QAAQ,KAAK,eAAe,IAAI,KAAK,KAAK;AAChD,UAAM,aAAa,QAAQ,OAAO;AAClC,UAAM,aAAa,cAAc,GAAG,IAAI,KAAK,MAAM,MAAM,IAAI,MAAM,WAAW,IAAI,SAAS,OAAO,EAAE;AACpG,SAAK,aAAa,cAAc,QAAQ,IAAI,cAAc;AAC1D,SAAK,iBAAiB,SAAS,CAAC,MAAM;AACpC,QAAE,eAAe;AACjB,iBAAW,KAAK,OAAO,MAAM,OAAO,CAAC;AAAA,IACvC,CAAC;AAED,UAAM,WAAW,IAAI,cAAc,KAAK;AACxC,aAAS,YAAY;AACrB,UAAM,YAAY,QAAQ;AAC1B,aAAS,YAAY,KAAK;AAC1B,UAAM,WAAW;AACjB,UAAM,aAAa,cAAc,GAAG,IAAI,QAAQ;AAEhD,UAAM,UAAU,IAAI,cAAc,MAAM;AACxC,YAAQ,YAAY;AACpB,YAAQ,aAAa,aAAa,QAAQ;AAC1C,UAAM,OAAO,UAAU,KAAK,QAAQ,iBAAiB,QAAG;AACxD,UAAM,OAAO,UAAU,KAAK,QAAQ,aAAa,QAAG;AACpD,aAAS,OAAO,MAAM,MAAM,OAAO;AAGnC,UAAM,SAAS,MAAM,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,MAAM,CAAC,EAAG,aAAa,MAAM,CAAC,EAAG,aAAa,MAAM,WAAW;AACnH,UAAMC,WAAU,MAAM,KAAK,MAAM,MAAM,aAAa,OAAO,CAAC;AAC5D,UAAM,KAAK,CAAC,MAAc,MAAM,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,OAAO,GAAG,UAAU,qBAAqB,IAAI,SAAS,SAAS,CAAC;AAC9J,UAAM,SAAS,MAAM;AACnB,YAAM,IAAI,KAAK,IAAI,MAAM,SAAS,GAAGA,SAAQ,CAAC;AAC9C,cAAQ,cAAc,GAAG,IAAI,CAAC,MAAM,MAAM,MAAM;AAChD,WAAK,WAAW,MAAM;AACtB,WAAK,WAAW,KAAK,MAAM,SAAS;AAAA,IACtC;AACA,SAAK,iBAAiB,SAAS,MAAM,GAAGA,SAAQ,IAAI,CAAC,CAAC;AACtD,SAAK,iBAAiB,SAAS,MAAM,GAAGA,SAAQ,IAAI,CAAC,CAAC;AACtD,UAAM,iBAAiB,UAAU,QAAQ,EAAE,SAAS,KAAK,CAAC;AAC1D,UAAM,iBAAiB,WAAW,CAAC,MAAM;AACvC,UAAI,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,aAAa;AACnD,UAAE,eAAe;AACjB,WAAGA,SAAQ,KAAK,EAAE,QAAQ,eAAe,IAAI,GAAG;AAAA,MAClD,WAAW,EAAE,QAAQ,QAAS,YAAW,KAAK,OAAO,MAAM,OAAOA,SAAQ,CAAC;AAAA,IAC7E,CAAC;AACD,UAAM,QAAQ,CAAC,KAAK,MAAM,IAAI,iBAAiB,SAAS,MAAM,WAAW,KAAK,OAAO,MAAM,OAAO,CAAC,CAAC,CAAC;AACrG,QAAI,MAAM,WAAW,EAAG,UAAS,UAAU,IAAI,cAAc;AAC7D,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,KAAe,KAAa,OAAe,MAAc;AAC1E,QAAM,IAAI,IAAI,cAAc,QAAQ;AACpC,IAAE,OAAO;AACT,IAAE,YAAY,mBAAmB,GAAG;AACpC,IAAE,aAAa,cAAc,KAAK;AAClC,IAAE,cAAc;AAChB,SAAO;AACT;AAGA,SAAS,WAAW,KAAe,OAAgB,MAAyB,OAA2B,OAAe;AACpH,QAAM,OAAQ,MAAM,QAAQ,UAAU,KAA4B,IAAI;AAEtE,QAAM,cAAe,MAAM,YAAY,EAA4B;AACnE,QAAM,QAAQ,KAAK,eAAe,IAAI,KAAK,KAAK;AAEhD,QAAM,SAAS,IAAI,cAAc,KAAK;AACtC,SAAO,YAAY;AACnB,SAAO,aAAa,QAAQ,QAAQ;AACpC,SAAO,aAAa,cAAc,MAAM;AACxC,SAAO,aAAa,cAAc,IAAI;AACtC,QAAM,MAAM,IAAI,cAAc,KAAK;AACnC,MAAI,YAAY;AAChB,QAAM,QAAQ,IAAI,cAAc,MAAM;AACtC,QAAM,YAAY;AAClB,QAAM,cAAc;AACpB,QAAM,WAAW,IAAI,cAAc,GAAG;AACtC,WAAS,YAAY;AACrB,WAAS,OAAO,KAAK;AACrB,WAAS,SAAS;AAClB,WAAS,MAAM;AACf,WAAS,cAAc;AACvB,QAAM,QAAQ,IAAI,cAAc,QAAQ;AACxC,QAAM,OAAO;AACb,QAAM,YAAY;AAClB,QAAM,aAAa,cAAc,OAAO;AACxC,QAAM,cAAc;AACpB,MAAI,OAAO,OAAO,UAAU,KAAK;AAEjC,QAAM,WAAW,IAAI,cAAc,KAAK;AACxC,WAAS,YAAY;AACrB,WAAS,WAAW;AACpB,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,IAAI,cAAc,KAAK;AACnC,QAAI,MAAM,KAAK;AACf,QAAI,MAAM,KAAK;AACf,QAAI,WAAW;AAEf,eAAW,OAAO,CAAC,SAAS,QAAQ,EAAG,KAAI,KAAK,aAAa,GAAG,EAAG,KAAI,aAAa,KAAK,KAAK,aAAa,GAAG,CAAE;AAChH,aAAS,YAAY,GAAG;AAAA,EAC1B;AACA,SAAO,OAAO,KAAK,QAAQ;AAE3B,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,UAAU;AACtB,QAAE,gBAAgB;AAClB,WAAK;AAAA,IACP,WAAW,EAAE,QAAQ,OAAO;AAE1B,YAAM,QAAuB,CAAC,UAAU,OAAO,QAAQ;AACvD,YAAM,KAAK,MAAM,QAAS,OAAO,YAAY,EAA4B,aAA4B;AACrG,QAAE,eAAe;AACjB,aAAO,MAAM,EAAE,WAAW,MAAM,SAAS,IAAI,MAAM,MAAM,MAAM,EAAG,MAAM;AAAA,IAC1E;AAAA,EACF;AACA,QAAM,OAAO,MAAM;AACjB,WAAO,OAAO;AACd,iBAAa,QAAQ,EAAE,eAAe,KAAK,CAAC;AAAA,EAC9C;AACA,QAAM,iBAAiB,SAAS,IAAI;AACpC,SAAO,iBAAiB,WAAW,KAAK;AACxC,OAAK,YAAY,MAAM;AACvB,QAAM,MAAM;AACZ,QAAM,SAAS,SAAS,SAAS,KAAK;AACtC,MAAI,UAAU,QAAQ,GAAG;AACvB,UAAM,OAAO,MAAO,SAAS,YAAY,OAAO,YAAY;AAC5D,0BAAsB,IAAI;AAE1B,QAAI,CAAC,OAAO,aAAa,QAAQ,EAAG,YAAW,OAAO,MAAM,KAAK,SAAS,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAG,KAAI,iBAAiB,QAAQ,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,EACxJ;AACF;;;AGvJA,iBAAuH;AAgBhH,SAAS,OAAO,QAAiB,UAAuB,UAAyB,CAAC,GAAe;AAEtG,QAAM,YAAY,OAAO,aAAa,EAAE,uBAAuB,MAAM,WAAW,MAAM,GAAG,gBAAgB,OAAO,IAAI;AACpH,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,MAAM,QAAQ,UAAU;AAC9B,QAAM,aAAa,KAAC,mBAAO,OAAO,QAAQ,UAAU,IAAI,EAAE,CAAC;AAC3D,MAAI,cAAc,OAAQ,YAAW,SAAK,0BAAc,EAAE,SAAS,GAAG,CAAC,CAAC;AAAA,MACnE,YAAW,SAAK,iBAAK,EAAE,SAAS,GAAG,CAAC,CAAC;AAC1C,aAAW,SAAK,kBAAM,EAAE,SAAS,GAAG,CAAC,CAAC;AACtC,MAAI,QAAQ,QAAS,YAAW,SAAK,kBAAM,EAAE,SAAS,QAAQ,SAAS,SAAS,EAAE,CAAC,CAAC;AACpF,MAAI,UAAU;AACd,QAAM,SAAS,YAAY;AACzB,QAAI,WAAW,CAAC,SAAS,YAAa;AACtC,QAAI;AACF,YAAM,SAAS,UAAM,4BAAgB,WAAW,UAAU;AAAA,QACxD,WAAW,cAAc,SAAS,WAAW;AAAA,QAC7C,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AACD,UAAI,QAAS;AACb,eAAS,MAAM,OAAO,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;AAC7C,eAAS,MAAM,MAAM,GAAG,KAAK,MAAM,OAAO,CAAC,CAAC;AAC5C,eAAS,aAAa,kBAAkB,OAAO,SAAS;AACxD,UAAI,QAAQ,WAAW,OAAO,eAAe,OAAO;AAClD,cAAM,EAAE,GAAG,EAAE,IAAI,OAAO,eAAe;AACvC,cAAM,OAAO,OAAO,UAAU,MAAM,GAAG,EAAE,CAAC;AAC1C,cAAM,aAAa,EAAE,KAAK,UAAU,OAAO,QAAQ,QAAQ,OAAO,MAAM,QAAQ,EAAE,IAA2C;AAC7H,eAAO,OAAO,QAAQ,QAAQ,OAAO;AAAA,UACnC,MAAM,KAAK,OAAO,GAAG,CAAC,OAAO;AAAA,UAC7B,KAAK,KAAK,OAAO,GAAG,CAAC,OAAO;AAAA,UAC5B,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,CAAC,UAAU,GAAG;AAAA,QAChB,CAAC;AAAA,MACH;AACA,cAAQ,WAAW,OAAO,SAAS;AAAA,IACrC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,WAAgC;AACpC,MAAI;AACF,mBAAW,uBAAW,WAAW,UAAU,MAAM,KAAK,OAAO,GAAG,EAAE,gBAAgB,MAAM,CAAC;AAAA,EAC3F,QAAQ;AACN,SAAK,OAAO;AAAA,EACd;AACA,SAAO,MAAM;AACX,cAAU;AACV,eAAW;AAAA,EACb;AACF;AAGO,SAAS,UAAUC,KAAa,IAAyC;AAC9E,MAAI,MAAM;AACV,MAAI,UAAU;AACd,QAAM,MAAM,MAAM;AAChB,QAAI,QAAS;AACb,OAAG,WAAWA,GAAE,CAAC;AAAA,EACnB;AACA,QAAM,WAAW,MAAM;AACrB,QAAI,QAAS;AACb,QAAI,OAAO,0BAA0B,YAAY;AAC/C,2BAAqB,GAAG;AACxB,YAAM,sBAAsB,GAAG;AAAA,IACjC,MAAO,KAAI;AAAA,EACb;AACA,MAAI;AACJ,QAAM,MAAMA,IAAG,cAAc;AAC7B,OAAK,iBAAiB,UAAU,UAAU,IAAI;AAC9C,OAAK,iBAAiB,UAAU,QAAQ;AAExC,QAAM,cAA4B,CAAC;AACnC,WAAS,OAAOA,IAAG,YAAY,GAAG,KAAK,aAAa,MAAO,KAAoB,MAAM,OAAQ,KAAoB,KAAK,YAAY,EAAG,aAAY,KAAK,IAAkB;AACxK,aAAW,QAAQ,YAAa,MAAK,iBAAiB,UAAU,UAAU,IAAI;AAC9E,MAAI,KAA4B;AAChC,MAAI,OAAO,mBAAmB,aAAa;AACzC,QAAI;AACF,WAAK,IAAI,eAAe,QAAQ;AAChC,SAAG,QAAQA,GAAE;AACb,UAAIA,IAAG,cAAc,gBAAiB,IAAG,QAAQA,IAAG,cAAc,eAAe;AAAA,IACnF,QAAQ;AACN,WAAK;AAAA,IACP;AAAA,EACF;AACA,QAAM,WAAW,YAAY,KAAK,GAAG;AACrC,SAAO,MAAM;AACX,cAAU;AACV,SAAK,oBAAoB,UAAU,UAAU,IAAI;AACjD,SAAK,oBAAoB,UAAU,QAAQ;AAC3C,eAAW,QAAQ,YAAa,MAAK,oBAAoB,UAAU,UAAU,IAAI;AACjF,QAAI,WAAW;AACf,kBAAc,QAAQ;AACtB,QAAI,OAAO,yBAAyB,WAAY,sBAAqB,GAAG;AAAA,EAC1E;AACF;;;AC/GA,oBAAgE;AAChE,IAAAC,kBAA0C;AAoC1C,IAAM,YAAY;AAClB,IAAI,MAAM;AACV,IAAM,SAAS,CAAC,MAAc,KAAK,CAAC,IAAI,EAAE,GAAG;AAE7C,SAAS,EAAyC,KAAe,KAAQ,WAAoB,MAAyC;AACpI,QAAMC,MAAK,IAAI,cAAc,GAAG;AAChC,MAAI,UAAW,CAAAA,IAAG,YAAY;AAC9B,MAAI,QAAQ,KAAM,CAAAA,IAAG,cAAc;AACnC,SAAOA;AACT;AAEA,SAAS,aAAa,KAAe,MAAiB,WAAoB,UAAkD;AAC1H,aAAO,8BAAe,MAAM,SAAS,EAAE,IAAI,CAAC,MAAM;AAChD,UAAM,MAAM,EAAE,KAAK,UAAU,eAAe,EAAE,OAAO,IAAI,EAAE,KAAK;AAChE,QAAI,OAAO;AACX,QAAI,aAAa,eAAe,EAAE,MAAM;AACxC,QAAI,iBAAiB,SAAS,CAAC,MAAM;AACnC,QAAE,eAAe;AACjB,eAAS,CAAC;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AACH;AAEA,IAAM,SAAS;AAEf,SAAS,SAAS,KAA8B;AAC9C,QAAM,MAAM,IAAI,gBAAgB,QAAQ,KAAK;AAC7C,MAAI,aAAa,WAAW,WAAW;AACvC,MAAI,aAAa,SAAS,IAAI;AAC9B,MAAI,aAAa,UAAU,IAAI;AAC/B,MAAI,aAAa,eAAe,MAAM;AACtC,QAAM,OAAO,IAAI,gBAAgB,QAAQ,MAAM;AAC/C,OAAK,aAAa,QAAQ,cAAc;AACxC,OAAK,aAAa,KAAK,2FAA2F;AAClH,MAAI,YAAY,IAAI;AACpB,SAAO;AACT;AAGA,SAAS,WAAW,KAAe,MAAiB,OAA+C,SAA8C;AAC/I,QAAM,IAAI,EAAE,KAAK,KAAK,SAAS;AAC/B,IAAE,OAAO,MAAM;AACf,IAAE,SAAS;AACX,IAAE,MAAM;AAER,QAAM,SAAS,CAAC,MAAkB;AAChC,QAAI,EAAE,SAAS,cAAc,EAAE,WAAW,EAAG;AAC7C,cAAU,MAAM,GAAG;AAAA,EACrB;AACA,IAAE,iBAAiB,SAAS,MAAM;AAClC,IAAE,iBAAiB,YAAY,MAAM;AACrC,IAAE,aAAa,cAAc,GAAG,KAAK,QAAQ,eAAe,KAAK,KAAK,KAAK,YAAY,uBAAuB;AAC9G,MAAI,MAAM,QAAQ;AAChB,UAAM,MAAM,EAAE,KAAK,OAAO,gBAAgB;AAC1C,QAAI,MAAM,MAAM;AAChB,QAAI,MAAM;AACV,QAAI,iBAAiB,SAAS,MAAM,IAAI,OAAO,CAAC;AAChD,MAAE,YAAY,GAAG;AAAA,EACnB,eAAW,gCAAe,MAAM,GAAG,GAAG;AAEpC,UAAM,IAAI,EAAE,KAAK,SAAS,gBAAgB;AAC1C,MAAE,MAAM,GAAG,MAAM,GAAG;AACpB,MAAE,UAAU;AACZ,MAAE,QAAQ;AACV,MAAE,cAAc;AAChB,MAAE,WAAW;AACb,MAAE,aAAa,eAAe,MAAM;AACpC,MAAE,YAAY,CAAC;AAAA,EACjB;AACA,QAAM,OAAO,EAAE,KAAK,QAAQ,cAAc;AAC1C,OAAK,YAAY,SAAS,GAAG,CAAC;AAC9B,IAAE,YAAY,IAAI;AAClB,SAAO;AACT;AAGO,SAAS,UAAU,KAAe,MAAyB,YAAgG;AAChK,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,OAAO,EAAE,KAAK,OAAO,UAAU,UAAU,EAAE;AACjD,OAAK,WAAW;AAChB,OAAK,aAAa,gBAAgB,KAAK,EAAE;AACzC,MAAI,KAAK,MAAO,MAAK,MAAM,QAAQ,OAAO,KAAK,KAAK;AACpD,QAAM,UAAU,OAAO,OAAO;AAC9B,QAAM,SAAS,OAAO,MAAM;AAC5B,QAAM,YAAQ,2BAAU,IAAI;AAC5B,MAAI,OAAO;AACT,SAAK,YAAY,WAAW,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC;AAAA,EAC7D,WAAW,KAAK,UAAU;AACxB,UAAM,MAAM,EAAE,KAAK,OAAO,SAAS;AACnC,QAAI,MAAM,KAAK;AAEf,QAAI,MAAM,KAAK,YAAY;AAC3B,SAAK,YAAY,GAAG;AAAA,EACtB;AACA,QAAM,QAAQ,EAAE,KAAK,OAAO,SAAS;AACrC,MAAI,KAAK,WAAW;AAClB,UAAM,QAAQ,EAAE,KAAK,UAAU,WAAW,MAAG;AAC7C,UAAM,OAAO;AACb,UAAM,aAAa,cAAc,OAAO;AACxC,UAAM,iBAAiB,SAAS,CAAC,MAAM;AACrC,QAAE,eAAe;AACjB,WAAK,QAAQ;AAAA,IACf,CAAC;AACD,SAAK,YAAY,KAAK;AAAA,EACxB;AACA,MAAI,KAAK,OAAO;AACd,UAAM,IAAI,EAAE,KAAK,MAAM,WAAW,KAAK,KAAK;AAC5C,MAAE,KAAK;AACP,UAAM,YAAY,CAAC;AAAA,EACrB;AACA,MAAI,KAAK,MAAM;AACb,UAAM,IAAI,EAAE,KAAK,OAAO,QAAQ;AAChC,MAAE,KAAK;AACP,qBAAiB,GAAG,KAAK,IAAI;AAC7B,UAAM,YAAY,CAAC;AAAA,EACrB;AACA,QAAM,UAAU,aAAa,KAAK,MAAM,KAAK,aAAa,KAAK,QAAQ,GAAG,KAAK,QAAQ;AACvF,MAAI,QAAQ,UAAW,KAAK,gBAAgB,KAAK,QAAQ,GAAI;AAC3D,UAAM,SAAS,EAAE,KAAK,OAAO,UAAU;AACvC,QAAI,KAAK,gBAAgB,KAAK,QAAQ,GAAG;AACvC,YAAM,WAAW,EAAE,KAAK,QAAQ,cAAc,GAAG,KAAK,QAAQ,CAAC,OAAO,KAAK,KAAK,EAAE;AAClF,eAAS,aAAa,cAAc,QAAQ,KAAK,QAAQ,CAAC,OAAO,KAAK,KAAK,EAAE;AAC7E,aAAO,YAAY,QAAQ;AAAA,IAC7B;AACA,YAAQ,QAAQ,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAC5C,UAAM,YAAY,MAAM;AAAA,EAC1B;AACA,OAAK,YAAY,KAAK;AACtB,MAAI,KAAK,MAAO,MAAK,aAAa,mBAAmB,OAAO;AAAA,MACvD,MAAK,aAAa,cAAc,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC,OAAO,KAAK,KAAK,KAAK,OAAO;AACzG,MAAI,KAAK,KAAM,MAAK,aAAa,oBAAoB,MAAM;AAC3D,SAAO,EAAE,MAAM,OAAO,SAAS,OAAO;AACxC;AAEA,SAAS,WAAW,MAAkC;AACpD,SAAO,MAAM,KAAK,KAAK,iBAA8B,SAAS,CAAC;AACjE;AAEA,SAAS,YAAYA,KAAiC;AACpD,QAAM,IAAIA;AACV,MAAI,CAAC,KAAK,CAAC,EAAE,QAAS,QAAO;AAC7B,QAAM,MAAM,EAAE,QAAQ,YAAY;AAClC,SAAO,QAAQ,WAAW,QAAQ,cAAc,QAAQ,YAAY,EAAE,sBAAsB;AAC9F;AAMA,SAAS,gBAAgB,MAAmB,MAAiB,MAAe,SAAiC;AAC3G,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,YAAY,KAAK,WAAW;AACxC,QAAE,gBAAgB;AAClB,cAAQ;AACR;AAAA,IACF;AACA,SAAK,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,gBAAgB,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG;AACxH,YAAM,UAAU,EAAE,QAAQ,eAAe,CAAC,QAAQ,UAAU,IAAI,CAAC,MAAM;AACvE,YAAM,MAAM,QAAQ,IAAI,CAAC,MAAM,KAAK,cAAiC,uBAAuB,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO;AAChH,UAAI,KAAK;AACP,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,YAAI,MAAM;AAAA,MACZ;AACA;AAAA,IACF;AACA,QAAI,QAAQ,EAAE,QAAQ,OAAO;AAC3B,YAAM,QAAQ,WAAW,IAAI;AAC7B,UAAI,CAAC,MAAM,QAAQ;AACjB,UAAE,eAAe;AACjB,aAAK,MAAM;AACX;AAAA,MACF;AACA,YAAM,QAAQ,MAAM,CAAC;AACrB,YAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,YAAM,SAAU,KAAK,YAAY,EAA4B;AAC7D,UAAI,EAAE,aAAa,WAAW,SAAS,WAAW,OAAO;AACvD,UAAE,eAAe;AACjB,aAAK,MAAM;AAAA,MACb,WAAW,CAAC,EAAE,YAAY,WAAW,MAAM;AACzC,UAAE,eAAe;AACjB,cAAM,MAAM;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,OAAK,iBAAiB,WAAW,KAAK;AACtC,SAAO,MAAM,KAAK,oBAAoB,WAAW,KAAK;AACxD;AAEA,SAAS,UAAU,MAA+B;AAChD,QAAM,MAAM,KAAK;AACjB,QAAM,SAAS,IAAI;AAEnB,QAAM,WAAW,UAAU,OAAO,OAAO,iBAAiB,SAAS;AACnE,QAAM,UAAU,KAAK,cAA2B,gBAAgB,KAAK,WAAW,IAAI,EAAE,CAAC,KAAK;AAC5F,MAAI;AACF,YAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EACvC,QAAQ;AAAA,EAER;AACA,SAAO,MAAM;AACX,QAAI;AACF,UAAI,YAAY,SAAS,eAAe,OAAO,SAAS,UAAU,WAAY,UAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,IACtH,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAAS,UAAU,KAAe,MAAyB,cAAc,OAAoB;AAC3F,QAAM,UAAU,EAAE,KAAK,OAAO,YAAY,cAAc,mBAAmB,EAAE,EAAE;AAC/E,MAAI,KAAK,KAAK,sBAAuB,SAAQ,iBAAiB,SAAS,MAAM,KAAK,QAAQ,CAAC;AAC3F,SAAO;AACT;AAEA,SAAS,cAAc,UAAyC;AAC9D,SAAO,SAAS,QAAQ;AAC1B;AAEO,SAAS,YAAY,KAAe,MAAmC;AAC5E,QAAM,WAA8B,CAAC;AACrC,QAAM,EAAE,KAAK,IAAI,UAAU,KAAK,MAAM,SAAS;AAC/C,OAAK,aAAa,QAAQ,QAAQ;AAClC,OAAK,aAAa,cAAc,MAAM;AACtC,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,MAAI,KAAK,KAAK,eAAe,KAAK,QAAS,SAAQ,YAAY,UAAU,KAAK,IAAI,CAAC;AAAA,WAC1E,KAAK,KAAK,sBAAuB,SAAQ,YAAY,UAAU,KAAK,MAAM,IAAI,CAAC;AACxF,UAAQ,YAAY,IAAI;AACxB,OAAK,MAAM,YAAY,OAAO;AAC9B,WAAS,KAAK,gBAAgB,MAAM,KAAK,MAAM,MAAM,KAAK,OAAO,CAAC;AAClE,WAAS,KAAK,UAAU,IAAI,CAAC;AAC7B,SAAO,EAAE,IAAI,SAAS,MAAM,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAC3E;AAEA,SAAS,WAAW,UAA6BA,KAAiB;AAChE,WAAS,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO;AACjC,QAAI;AACF,SAAG;AAAA,IACL,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AACD,EAAAA,IAAG,OAAO;AACZ;AAEA,SAAS,qBAAqB,QAAiB,IAAwB;AACrE,QAAM,OAAO,OAAO,aAAa,kBAAkB;AACnD,MAAI;AACF,WAAO,aAAa,oBAAoB,OAAO,GAAG,IAAI,IAAI,EAAE,KAAK,EAAE;AAAA,EACrE,QAAQ;AACN,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACA,SAAO,MAAM;AACX,QAAI,KAAM,QAAO,aAAa,oBAAoB,IAAI;AAAA,QACjD,QAAO,gBAAgB,kBAAkB;AAAA,EAChD;AACF;AAEO,SAAS,cAAc,KAAe,MAAyB,MAAuC;AAC3G,QAAM,SAAS,KAAK;AACpB,MAAI,CAAC,OAAQ,QAAO,YAAY,KAAK,EAAE,GAAG,MAAM,SAAS,KAAK,CAAC;AAC/D,QAAM,WAA8B,CAAC;AACrC,QAAM,EAAE,KAAK,IAAI,UAAU,KAAK,MAAM,KAAK,IAAI,EAAE;AACjD,QAAM,UAAU,EAAE,KAAK,OAAO,SAAS;AACvC,OAAK,YAAY,OAAO;AACxB,OAAK,aAAa,QAAQ,SAAS,YAAY,YAAY,QAAQ;AACnE,OAAK,KAAK,OAAO,IAAI;AACrB,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,MAAI,KAAK,KAAK,YAAa,SAAQ,YAAY,UAAU,KAAK,IAAI,CAAC;AAAA,WAC1D,KAAK,KAAK,sBAAuB,SAAQ,YAAY,UAAU,KAAK,MAAM,IAAI,CAAC;AACxF,UAAQ,YAAY,IAAI;AACxB,OAAK,MAAM,YAAY,OAAO;AAC9B,MAAI,KAAK,KAAK,QAAQ,mBAAmB,MAAO,UAAS,MAAM;AAC/D,WAAS,KAAK,OAAO,QAAQ,MAAM,EAAE,WAAW,KAAK,KAAK,WAAW,QAAQ,KAAK,KAAK,QAAQ,QAAQ,CAAC,CAAC;AACzG,WAAS,KAAK,qBAAqB,QAAQ,KAAK,EAAE,CAAC;AACnD,WAAS,KAAK,gBAAgB,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC;AACnE,WAAS,KAAK,UAAU,IAAI,CAAC;AAC7B,SAAO,EAAE,IAAI,SAAS,MAAM,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAC3E;AAEA,SAAS,SAAS,QAAiB;AACjC,MAAI;AACF,WAAO,iBAAiB,EAAE,OAAO,WAAW,QAAQ,WAAW,UAAU,OAAO,CAAC;AAAA,EACnF,QAAQ;AAAA,EAER;AACF;AAGO,SAAS,gBAAgB,KAAe,MAAmC;AAChF,QAAM,SAAS,KAAK;AACpB,MAAI,CAAC,OAAQ,QAAO,YAAY,KAAK,EAAE,GAAG,MAAM,SAAS,KAAK,CAAC;AAC/D,QAAM,WAA8B,CAAC;AACrC,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,QAAM,MAAM,KAAK,KAAK,oBAAoB;AAC1C,QAAM,QAAQ,CAAC,OAAO,QAAQ,SAAS,QAAQ,EAAE,IAAI,CAAC,SAAS;AAC7D,UAAM,IAAI,EAAE,KAAK,OAAO,sBAAsB,IAAI,EAAE;AACpD,QAAI,KAAK,KAAK,sBAAuB,GAAE,iBAAiB,SAAS,MAAM,KAAK,QAAQ,CAAC;AACrF,YAAQ,YAAY,CAAC;AACrB,WAAO;AAAA,EACT,CAAC;AACD,QAAM,OAAO,EAAE,KAAK,OAAO,aAAa;AACxC,UAAQ,YAAY,IAAI;AACxB,QAAM,EAAE,KAAK,IAAI,UAAU,KAAK,MAAM,kBAAkB;AACxD,OAAK,aAAa,QAAQ,QAAQ;AAClC,QAAM,UAAU,EAAE,KAAK,OAAO,SAAS;AACvC,OAAK,YAAY,OAAO;AACxB,UAAQ,YAAY,IAAI;AACxB,OAAK,MAAM,YAAY,OAAO;AAC9B,MAAI,KAAK,KAAK,QAAQ,mBAAmB,MAAO,UAAS,MAAM;AAC/D,QAAM,MAAM,IAAI;AAChB,QAAM,SAAS,CAAC,MAAe;AAC7B,UAAM,KAAK,KAAK,cAAc;AAC9B,UAAM,KAAK,KAAK,eAAe;AAC/B,UAAM,IAAI,KAAK,IAAI,GAAG,EAAE,OAAO,GAAG;AAClC,UAAM,IAAI,KAAK,IAAI,GAAG,EAAE,MAAM,GAAG;AACjC,UAAM,IAAI,KAAK,IAAI,IAAI,EAAE,QAAQ,GAAG,IAAI;AACxC,UAAM,MAAM,KAAK,IAAI,IAAI,EAAE,SAAS,GAAG,IAAI;AAC3C,UAAM,CAAC,KAAK,MAAM,OAAO,MAAM,IAAI;AACnC,WAAO,OAAO,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,CAAC,KAAK,CAAC;AACjF,WAAO,OAAO,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,GAAG,CAAC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC;AAC3F,WAAO,OAAO,MAAM,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC;AAC3H,WAAO,OAAO,OAAO,OAAO,EAAE,MAAM,KAAK,KAAK,GAAG,IAAI,GAAG,MAAM,OAAO,QAAQ,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;AACvH,WAAO,OAAO,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC;AAAA,EAClG;AACA,WAAS,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC,WAAS,KAAK,OAAO,QAAQ,MAAM,EAAE,WAAW,KAAK,KAAK,WAAW,QAAQ,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC;AAC/G,WAAS,KAAK,gBAAgB,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC;AACnE,WAAS,KAAK,UAAU,IAAI,CAAC;AAC7B,SAAO,EAAE,IAAI,SAAS,MAAM,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAC3E;AAGO,SAAS,cAAc,KAAe,MAAmC;AAC9E,QAAM,SAAS,KAAK;AACpB,MAAI,CAAC,OAAQ,QAAO,YAAY,KAAK,EAAE,GAAG,MAAM,SAAS,KAAK,CAAC;AAC/D,QAAM,WAA8B,CAAC;AACrC,QAAM,MAAM,KAAK,KAAK,WAAW,EAAE,MAAM,IAAI,OAAO,MAAM,QAAQ,QAAiB;AACnF,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,QAAM,MAAM,EAAE,KAAK,UAAU,YAAY,IAAI,QAAQ,aAAa,EAAE,EAAE;AACtE,MAAI,OAAO;AACX,MAAI,aAAa,cAAc,KAAK,KAAK,SAAS,WAAW;AAC7D,MAAI,aAAa,iBAAiB,OAAO;AACzC,MAAI,MAAM,QAAQ,GAAG,IAAI,IAAI;AAC7B,MAAI,MAAM,SAAS,GAAG,IAAI,IAAI;AAC9B,MAAI,YAAY,EAAE,KAAK,QAAQ,eAAe,CAAC;AAC/C,UAAQ,YAAY,GAAG;AACvB,OAAK,MAAM,YAAY,OAAO;AAC9B,WAAS,KAAK,UAAU,QAAQ,CAAC,MAAM;AACrC,QAAI,MAAM,OAAO,GAAG,KAAK,MAAM,EAAE,QAAQ,IAAI,OAAO,CAAC,CAAC;AACtD,QAAI,MAAM,MAAM,GAAG,KAAK,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,CAAC;AAAA,EACrD,CAAC,CAAC;AACF,MAAI,OAA2B;AAC/B,MAAI,aAAkC;AACtC,MAAI,WAAgC;AACpC,QAAM,QAAQ,CAAC,cAAc,UAAU;AACrC,UAAM,WAAW,CAAC,CAAC,QAAS,KAAK,YAAY,EAA4B,kBAAkB,QAAQ,KAAK,SAAU,KAAK,YAAY,EAA4B,aAAa;AAC5K,iBAAa;AACb,eAAW;AACX,UAAM,OAAO;AACb,WAAO;AACP,QAAI,aAAa,iBAAiB,OAAO;AAEzC,QAAI,eAAe,UAAU;AAC3B,UAAI;AACF,YAAI,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,MACnC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,MAAM;AACjB,QAAI,KAAM;AACV,UAAM,QAAQ,UAAU,KAAK,EAAE,GAAG,MAAM,SAAS,MAAM,KAAK,QAAQ,EAAE,GAAG,gBAAgB;AACzF,WAAO,MAAM;AACb,SAAK,aAAa,QAAQ,QAAQ;AAClC,SAAK,KAAK,OAAO,SAAS;AAC1B,QAAI,aAAa,iBAAiB,KAAK,EAAE;AACzC,UAAM,UAAU,EAAE,KAAK,OAAO,SAAS;AACvC,SAAK,YAAY,OAAO;AACxB,YAAQ,YAAY,IAAI;AACxB,iBAAa,OAAO,QAAQ,MAAM,EAAE,WAAW,KAAK,KAAK,WAAW,QAAQ,KAAK,KAAK,QAAQ,QAAQ,CAAC;AACvG,eAAW,gBAAgB,MAAM,KAAK,MAAM,OAAO,MAAM,MAAM,IAAI,CAAC;AACpE,QAAI,aAAa,iBAAiB,MAAM;AACxC,SAAK,SAAS;AACd,QAAI,IAAI,WAAW,QAAS,WAAU,IAAI;AAAA,EAC5C;AACA,MAAI,iBAAiB,SAAS,CAAC,MAAM;AACnC,MAAE,eAAe;AACjB,QAAI,KAAM,OAAM;AAAA,QACX,MAAK;AAAA,EACZ,CAAC;AACD,MAAI,IAAI,WAAW,SAAS;AAC1B,QAAI,iBAAiB,cAAc,IAAI;AACvC,QAAI,iBAAiB,SAAS,IAAI;AAAA,EACpC;AACA,WAAS,KAAK,KAAK;AACnB,SAAO,EAAE,IAAI,SAAS,MAAM,KAAK,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAChF;AAEO,SAAS,aAAa,KAAe,MAAmC;AAC7E,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,WAA8B,CAAC;AACrC,QAAM,MAAM,KAAK,aAAa,SAAS,KAAK,cAAc,SAAS,KAAK,SAAS,WAAW,KAAK,IAAI,QAAQ;AAC7G,QAAM,SAAS,EAAE,KAAK,OAAO,kBAAkB,GAAG,EAAE;AAEpD,SAAO,aAAa,QAAQ,QAAQ;AACpC,SAAO,aAAa,cAAc,KAAK,SAAS,cAAc;AAC9D,SAAO,aAAa,gBAAgB,KAAK,EAAE;AAC3C,QAAM,OAAO,EAAE,KAAK,OAAO,QAAQ;AACnC,MAAI,KAAK,MAAO,MAAK,YAAY,EAAE,KAAK,UAAU,IAAI,GAAG,KAAK,KAAK,GAAG,CAAC;AACvE,QAAM,OAAO,EAAE,KAAK,MAAM;AAC1B,mBAAiB,MAAM,KAAK,IAAI;AAChC,OAAK,YAAY,IAAI;AACrB,SAAO,YAAY,IAAI;AACvB,eAAa,KAAK,MAAM,KAAK,aAAa,KAAK,QAAQ,GAAG,KAAK,QAAQ,EAAE,QAAQ,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAC7G,MAAI,KAAK,WAAW;AAClB,UAAM,QAAQ,EAAE,KAAK,UAAU,WAAW,MAAG;AAC7C,UAAM,OAAO;AACb,UAAM,aAAa,cAAc,SAAS;AAC1C,UAAM,iBAAiB,SAAS,MAAM,KAAK,QAAQ,CAAC;AACpD,WAAO,YAAY,KAAK;AAAA,EAC1B;AACA,OAAK,MAAM,YAAY,MAAM;AAC7B,WAAS,KAAK,gBAAgB,QAAQ,MAAM,OAAO,KAAK,OAAO,CAAC;AAChE,SAAO,EAAE,IAAI,QAAQ,MAAM,QAAQ,SAAS,MAAM,WAAW,UAAU,MAAM,EAAE;AACjF;AAEO,SAAS,eAAe,KAAe,MAAmC;AAC/E,QAAM,WAA8B,CAAC;AACrC,QAAM,MAAM,KAAK,KAAK,aAAa,QAAQ,cAAc,KAAK,KAAK,aAAa,WAAW,iBAAiB,KAAK,KAAK;AACtH,QAAM,EAAE,KAAK,IAAI,UAAU,KAAK,MAAM,cAAc,cAAc,GAAG,CAAC,EAAE;AACxE,OAAK,aAAa,QAAQ,QAAQ;AAClC,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,MAAI,KAAK,KAAK,sBAAuB,SAAQ,YAAY,UAAU,KAAK,MAAM,IAAI,CAAC;AACnF,UAAQ,YAAY,IAAI;AACxB,OAAK,MAAM,YAAY,OAAO;AAC9B,WAAS,KAAK,gBAAgB,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC;AACnE,WAAS,KAAK,UAAU,IAAI,CAAC;AAC7B,SAAO,EAAE,IAAI,SAAS,MAAM,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAC3E;AAQA,SAAS,aAAa,MAAc,WAAwB,MAAqC;AAC/F,QAAM,MAAM,CAAC,WAAiC,MAAM,KAAK,SAAS,EAAE,IAAI,QAAQ,MAAM,IAAI,OAAO,QAAQ,QAAQ,SAAS,UAAU,CAAC;AACrI,QAAM,MAAM,OAAO,OAAO,EAAE,MAAM,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,UAAU,IAAI,UAAU,GAAG,MAAM,IAAI,MAAM,GAAG,SAAS,MAAM,KAAK,QAAQ,GAAG,QAAQ,KAAK,KAAK,GAAG,CAAC;AACrK,MAAI;AAEF,UAAM,KAAK,IAAI,SAAS,WAAW,aAAa;AAAA,EAAkB,IAAI,EAAE;AACxE,UAAM,SAAS,GAAG,KAAK,SAAS;AAChC,WAAO,OAAO,WAAW,aAAa,MAAM;AAC1C,UAAI;AACF,QAAC,OAAsB;AAAA,MACzB,SAAS,KAAK;AACZ,aAAK,UAAU,GAAG;AAAA,MACpB;AAAA,IACF,IAAI,MAAM;AAAA,IAAC;AAAA,EACb,SAAS,KAAK;AACZ,SAAK,UAAU,GAAG;AAClB,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACF;AAGO,SAAS,aAAa,KAAe,MAAmC;AAC7E,QAAM,WAA8B,CAAC;AACrC,QAAM,UAAU,EAAE,KAAK,OAAO,QAAQ;AACtC,MAAI,KAAK,KAAK,YAAa,SAAQ,YAAY,UAAU,KAAK,IAAI,CAAC;AACnE,QAAMA,MAAK,EAAE,KAAK,OAAO,UAAU;AACnC,EAAAA,IAAG,WAAW;AACd,EAAAA,IAAG,aAAa,gBAAgB,KAAK,KAAK,EAAE;AAC5C,mBAAiBA,KAAI,KAAK,KAAK,cAAc,KAAK,KAAK,QAAQ,EAAE;AACjE,EAAAA,IAAG,aAAa,QAAQ,KAAK,KAAK,cAAc,WAAW,OAAO;AAClE,EAAAA,IAAG,aAAa,cAAc,KAAK,KAAK,SAAS,OAAO;AACxD,MAAI,KAAK,KAAK,YAAa,CAAAA,IAAG,aAAa,cAAc,MAAM;AAC/D,QAAM,UAAU,CAAC,MAAa;AAC5B,UAAM,IAAK,EAAE,QAA2B,UAAU,iBAAiB;AACnE,UAAM,SAAS,GAAG,aAAa,eAAe;AAC9C,QAAI,CAAC,OAAQ;AACb,MAAE,eAAe;AACjB,QAAI,WAAW,UAAW,MAAK,QAAQ;AAAA,QAClC,MAAK,SAAS,EAAE,IAAI,UAAU,MAAM,IAAI,OAAO,QAAQ,QAAwC,SAAS,WAAW,OAAO,GAAG,aAAa,cAAc,KAAK,OAAU,CAAC;AAAA,EAC/K;AACA,EAAAA,IAAG,iBAAiB,SAAS,OAAO;AACpC,UAAQ,YAAYA,GAAE;AACtB,OAAK,MAAM,YAAY,OAAO;AAC9B,WAAS,KAAK,gBAAgBA,KAAI,KAAK,MAAM,OAAO,KAAK,OAAO,CAAC;AACjE,WAAS,KAAK,UAAUA,GAAE,CAAC;AAC3B,MAAI,KAAK,WAAW,KAAK,KAAK,KAAM,UAAS,KAAK,aAAa,KAAK,KAAK,MAAMA,KAAI,IAAI,CAAC;AACxF,SAAO,EAAE,IAAI,SAAS,MAAMA,KAAI,SAAS,MAAM,WAAW,UAAU,OAAO,EAAE;AAC/E;AAMO,SAAS,WAAW,MAAmC;AAC5D,QAAM,MAAM,KAAK,MAAM;AACvB,QAAM,OAAO,KAAK,UAAU,UAAU,KAAK,KAAK;AAChD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,cAAc,KAAK,MAAM,SAAS;AAAA,IAC3C,KAAK;AACH,aAAO,cAAc,KAAK,MAAM,SAAS;AAAA,IAC3C,KAAK;AACH,aAAO,gBAAgB,KAAK,IAAI;AAAA,IAClC,KAAK;AACH,aAAO,cAAc,KAAK,IAAI;AAAA,IAChC,KAAK;AACH,aAAO,aAAa,KAAK,IAAI;AAAA,IAC/B,KAAK;AACH,aAAO,eAAe,KAAK,IAAI;AAAA,IACjC,KAAK;AACH,aAAO,aAAa,KAAK,IAAI;AAAA,IAC/B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO,YAAY,KAAK,IAAI;AAAA,EAChC;AACF;AAGO,SAAS,eAAe,MAA0B;AACvD,UAAQ,KAAK,SAAS,aAAa,KAAK,SAAS,aAAa,KAAK,SAAS,eAAe,KAAK,SAAS,cAAc,CAAC,CAAC,KAAK,UAAU,KAAK,OAAO,UAAU,SAAS;AACzK;;;ACxjBA,IAAAC,kBAAiD;AAuFjD,SAAS,OAAO;AAAC;AAEjB,IAAM,aAAa,CAAC,MAAc,EAAE,QAAQ,YAAY,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG;AAG/E,SAAS,aAAa,SAA4C;AACvE,MAAI,CAAC,WAAW,UAAU,KAAK,OAAO,KAAK,QAAQ,SAAS,IAAI,EAAG,QAAO;AAC1E,MAAI,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,WAAW,IAAI,EAAG,QAAO;AACjE,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,OAAO;AACzB,QAAI,OAAO,aAAa,eAAe,EAAE,WAAW,SAAS,OAAQ,QAAO,EAAE;AAAA,EAChF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAKO,SAAS,SAAS,OAAsB,UAA2B,CAAC,GAAoB;AAC7F,QAAM,MAAM,QAAQ,QAAQ,QAAQ,WAAW,iBAAiB;AAChE,QAAM,QAAQ,MAAM,OAAO;AAC3B,QAAM,QAAQ,MAAM;AACpB,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,SAAS,OAAO,OAAO,QAAQ,QAAQ,aAAa,QAAQ,IAAI,IAAI,QAAQ,QAAQ;AAC1F,QAAM,aAAa,QAAQ,eAAe,MAAO,OAAO,aAAa,cAAc,SAAS,OAAO;AAEnG,MAAI,SAAsB;AAC1B,MAAI,QAAQ;AACZ,MAAI,eAAe;AACnB,MAAI,OAAwB;AAC5B,QAAM,eAAkC,CAAC;AACzC,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,QAAQ;AACZ,QAAM,UAAoB,CAAC;AAC3B,MAAI,QAAqD;AAEzD,QAAM,OAAO,CAAC,MAAiB,MAAyB,WAAoB,eAAyC;AACnH,QAAI;AACF,cAAQ,EAAE,MAAM,SAAS,MAAM,IAAI,UAAU,MAAM,KAAK,cAAc,MAAM,SAAS,QAAQ,MAAM,IAAI,WAAW,WAAW,CAAC;AAAA,IAChI,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AAEA,QAAM,WAAW,CAAC,SAAiB;AACjC,QAAI;AACF,iBAAW,GAAG,EAAE,SAAS,IAAI;AAAA,IAC/B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,WAAW,MAAmB;AAClC,QAAI,QAAQ,UAAW,QAAO,QAAQ;AACtC,QAAI,CAAC,MAAO,SAAQ,YAAY,QAAQ,OAAO,MAAM,OAAO,YAAY,GAAG;AAC3E,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,YAAY,MAAM;AACtB,iBAAa,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO;AACrC,UAAI;AACF,WAAG;AAAA,MACL,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AACD,QAAI;AACF,YAAM,QAAQ;AAAA,IAChB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AACA,WAAO;AACP,eAAW;AAAA,EACb;AAGA,MAAI,gBAAoC;AACxC,QAAM,eAAe,MAAM;AACzB,UAAMC,MAAK;AACX,oBAAgB;AAChB,QAAI;AACF,YAAM,MAAM,IAAI;AAChB,YAAM,OAAO,CAAC,OAAO,QAAQ,IAAI,QAAQ,IAAI,OAAO;AACpD,UAAIA,OAAM,QAAQA,IAAG,eAAe,OAAOA,IAAG,UAAU,WAAY,CAAAA,IAAG,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,IACtG,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,MAAM,CAAC,WAA2B;AACtC,QAAI,MAAO;AACX,YAAQ;AACR,UAAM,OAAO,MAAM,KAAK;AACxB,cAAU;AACV,aAAS;AACT,QAAI,WAAW,YAAa,MAAK,mBAAmB,MAAM,KAAK;AAAA,aACtD,WAAW,YAAa,MAAK,mBAAmB,MAAM,KAAK;AAAA,aAC3D,WAAW,UAAW,MAAK,iBAAiB,MAAM,KAAK;AAChE,WAAO,QAAQ;AACf,YAAQ;AACR,iBAAa;AACb,QAAI;AACF,cAAQ,QAAQ,MAAM;AAAA,IACxB,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AAEA,QAAM,eAAe,MAAM;AACzB,QAAI,YAAY,QAAQ,EAAG;AAC3B,eAAW;AACX,SAAK,kBAAkB,MAAM,KAAK,GAAG,KAAK;AAAA,EAC5C;AAEA,QAAM,SAAS,CAAC,mBAA4B;AAC1C,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,SAAS;AACb,UAAM,MAAM,OAAO;AACnB,QAAI,QAAQ,KAAK;AACf,iBAAW,UAAU,KAAK,UAAU;AAClC,gBAAI,+BAAc,OAAO,MAAM,GAAG,GAAG;AACnC,mBAAS,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,OAAO,IAAI;AACpD,cAAI,UAAU,EAAG;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS,KAAK,eAAgB,UAAS,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,cAAc;AACzF,QAAI,SAAS,EAAG,UAAS,QAAQ;AACjC,QAAI,UAAU,MAAO,QAAO,IAAI,WAAW;AAC3C,YAAQ,KAAK,KAAK;AAClB,aAAS,QAAQ,CAAC;AAAA,EACpB;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,MAAO;AACX,iBAAa;AACb,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,CAAC,MAAkB;AACtC,QAAI;AACF,cAAQ,EAAE,QAAQ;AAAA,QAChB,KAAK;AACH,uBAAa;AACb,iBAAO,EAAE,KAAK;AACd;AAAA,QACF,KAAK;AACH,qBAAW,KAAK;AAChB;AAAA,QACF,KAAK;AACH,cAAI,WAAW;AACf;AAAA,QACF,KAAK;AACH,uBAAa;AACb,cAAI,WAAW;AACf;AAAA,QACF,KAAK;AACH,cAAI,SAAS;AACb;AAAA,QACF,KAAK,OAAO;AACV,uBAAa;AACb,gBAAM,MAAM,EAAE,SAAS;AACvB,cAAI,QAAQ,WAAY,SAAQ,WAAW,KAAK,EAAE,MAAM;AAAA,mBAC/C,EAAE,OAAQ,QAAO,KAAK,KAAK,UAAU,UAAU;AAAA,cACnD,UAAS,OAAO,GAAG;AACxB,cAAI,QAAQ,KAAK,MAAO,KAAI,WAAW;AAAA,cAClC,QAAO;AACZ;AAAA,QACF;AAAA,QACA,KAAK;AACH,uBAAa;AACb,cAAI,WAAW;AACf,kBAAQ,WAAW,eAAe,EAAE,OAAO,CAAC;AAC5C;AAAA,QACF,KAAK;AACH,kBAAQ,WAAW,SAAS,EAAE,OAAO,CAAC;AACtC;AAAA,QACF,KAAK;AACH,kBAAQ,WAAW,wBAAwB,EAAE,OAAO,CAAC;AACrD;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,MAAiB,WAA2B;AAChE,UAAM,QAAQ,KAAK,cAAc,QAAQ,CAAC,iBAAiB,mBAAmB,SAAS,OAAO,IAAI,CAAC,KAAK,SAAS;AACjH,eAAW,QAAQ,OAAO;AAExB,UAAI,SAAS,oBAAoB,KAAK,gBAAgB,SAAS;AAC7D,cAAM,WAAW,KAAK;AACtB,cAAM,UAAU,CAAC,MAAa;AAC5B,gBAAM,IAAI,eAAe,CAAC;AAC1B,cAAI;AACF,gBAAI,WAAW,KAAK,gBAAgB,GAAG,QAAQ,IAAI,KAAK,UAAU,iBAAiB,QAAQ,CAAC,EAAG,SAAQ;AAAA,UACzG,QAAQ;AAAA,UAER;AAAA,QACF;AACA,YAAI,iBAAiB,SAAS,SAAS,IAAI;AAC3C,YAAI,iBAAiB,WAAW,SAAS,IAAI;AAC7C,qBAAa,KAAK,MAAM;AACtB,cAAI,oBAAoB,SAAS,SAAS,IAAI;AAC9C,cAAI,oBAAoB,WAAW,SAAS,IAAI;AAAA,QAClD,CAAC;AAAA,MACH,WAAW,SAAS,qBAAqB,KAAK,cAAc;AAC1D,cAAM,KAAK,IAAI,gBAAgB;AAC/B,qBAAa,KAAK,MAAM,GAAG,MAAM,CAAC;AAClC,sBAAc,CAAC,EAAE,MAAM,OAAO,OAAO,KAAK,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,MAAM,IAAI,CAAC,EACtG,KAAK,CAACA,QAAO;AACZ,cAAI,GAAG,OAAO,QAAS;AACvB,cAAI,OAAO,yBAAyB,YAAa,QAAO,QAAQ;AAChE,gBAAM,KAAK,IAAI,qBAAqB,CAAC,YAAY;AAC/C,gBAAI,QAAQ,KAAK,CAAC,OAAO,GAAG,cAAc,GAAG;AAC3C,iBAAG,WAAW;AACd,sBAAQ;AAAA,YACV;AAAA,UACF,CAAC;AACD,aAAG,QAAQA,GAAE;AACb,uBAAa,KAAK,MAAM,GAAG,WAAW,CAAC;AAAA,QACzC,CAAC,EACA,MAAM,IAAI;AAAA,MACf,WAAW,SAAS,WAAW,KAAK,gBAAgB,QAAQ,UAAU;AACpE,qBAAa,KAAK,QAAQ,SAAS,GAAG,KAAK,cAAc,OAAO,CAAC;AAAA,MACnE,WAAW,SAAS,SAAS;AAC3B,cAAM,IAAI,WAAW,SAAS,KAAK,kBAAkB,GAAI;AACzD,qBAAa,KAAK,MAAM,aAAa,CAAC,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,MAAiB,QAAwB,UAAU,UAAU;AAC3E,QAAI,MAAO;AACX,aAAS;AACT,UAAM,aAAa;AAEnB,UAAM,QAAQ,CAAC,UAAU,KAAK,cAAc,mBAAmB,CAAC,KAAK,gBAAgB,CAAC,KAAK,QAAQ,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC,EAAE,IAAI,UAAU,OAAO,QAAQ,KAAK,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,KAAK,QAAS,aAAwB,QAAkB,SAAS,UAAmB,CAAC,EAAE,IAAI;AACzS,QAAI;AACF,aAAO,WAAW;AAAA,QAChB,OAAO,SAAS;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,WAAW,QAAQ,SAAS,KAAK,QAAQ;AAAA,QACzC;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,SAAS,MAAM,IAAI,WAAW;AAAA,QAC9B,SAAS,CAAC,QAAQ,KAAK,uBAAuB,MAAM,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,QACjF;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,cAAQ,GAAG;AACX,aAAO;AAEP,UAAI,QAAQ,IAAI,MAAO,QAAO,OAAO;AACrC,aAAO,IAAI,SAAS;AAAA,IACtB;AACA,QAAI,QAAQ,QAAQ,UAAU;AAC5B,YAAM,YAAY;AAClB,gBAAU,GAAG,iBAAiB,SAAS,CAAC,MAAM;AAC5C,cAAM,OAAO,eAAe,CAAC,GAAG,UAAU,SAAS;AACnD,cAAM,gBAAY,mCAAkB,MAAM,aAAa,MAAM,CAAC;AAC9D,YAAI,CAAC,UAAW;AAChB,UAAE,eAAe;AACjB,gBAAQ,WAAW,gBAAgB,SAAS;AAE5C,YAAI,KAAK,SAAS,WAAW,KAAK,SAAS,eAAe,WAAW,UAAU,GAAG,cAAc,0BAA0B,GAAG;AAC3H,uBAAa;AACb,cAAI,aAAa,KAAK,QAAQ,cAAc,WAAW;AAAA,QACzD;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,CAAC,SAAS;AACZ,gBAAU;AACV,WAAK,iBAAiB,MAAM,KAAK;AAAA,IACnC;AACA,SAAK,eAAe,MAAM,OAAO,UAAU,EAAE,UAAU,gBAAgB,IAAI,MAAS;AACpF,aAAS,KAAK,QAAQ,GAAG,KAAK,KAAK,UAAU,QAAQ,CAAC,OAAO,KAAK,KAAK,QAAQ,QAAQ,CAAC,OAAO,KAAK,EAAE;AACtG,iBAAa,MAAM,MAAM;AAAA,EAC3B;AAGA,QAAM,gBAAgB,CAAC,SAAoB;AACzC,QAAI,SAAS,WAAW,iBAAiB,KAAM;AAC/C,UAAM,OAAO,aAAa,KAAK,GAAG;AAClC,UAAM,SAAS,KAAK,OAAO,IAAI,QAAQ,sBAAsB,EAAE,KAAK;AACpE,UAAM,SAAoB;AAAA,MACxB,GAAG;AAAA,MACH,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,mBAAmB,KAAK,QAAQ,aAAa,WAAW,KAAK,KAAK,CAAC,eAAe,EAAE,gBAAgB,WAAW,KAAK,CAAC;AAAA,MAC3H,UAAU;AAAA,MACV,UAAU;AAAA,MACV,SAAS;AAAA,QACP,GAAI,OAAO,CAAC,EAAE,IAAI,QAAQ,OAAO,iBAAiB,QAAQ,OAAgB,OAAO,MAAM,SAAS,UAAmB,CAAC,IAAI,CAAC;AAAA,QACzH,EAAE,IAAI,UAAU,OAAO,QAAQ,QAAQ,WAAoB,SAAS,OAAQ,cAAyB,UAAoB;AAAA,MAC3H;AAAA,IACF;AACA,QAAI;AACF,aAAO,WAAW;AAAA,QAChB,OAAO,SAAS;AAAA,QAChB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU,CAAC,MAAM;AACf,cAAI,EAAE,WAAW,SAAS,CAAC,EAAE,MAAO,QAAO,IAAI,WAAW;AAC1D,cAAI,QAAQ,WAAY,SAAQ,WAAW,EAAE,KAAK;AAAA,cAC7C,UAAS,OAAO,EAAE,KAAK;AAAA,QAC9B;AAAA,QACA,SAAS,MAAM,IAAI,WAAW;AAAA,QAC9B;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,MAAiB,cAAsB;AAC5D,UAAM,WAAW,KAAK,QAAQ,YAAY;AAC1C,SAAK,eAAe,MAAM,OAAO,EAAE,UAAU,eAAe,KAAK,CAAC;AAClE,QAAI,aAAa,gBAAiB,QAAO,OAAO,MAAM,MAAM,IAAI;AAChE,QAAI,aAAa,YAAa,QAAO,IAAI,SAAS;AAElD,UAAM,YAAY,QAAQ;AAC1B,QAAI,YAAY,EAAG,QAAO,SAAS,GAAG,CAAC;AACvC,QAAI,aAAa,MAAO,QAAO,IAAI,WAAW;AAC9C,aAAS,WAAW,SAAS;AAAA,EAC/B;AAEA,WAAS,SAAS,GAAW,YAAoB,GAAS;AACxD,QAAI,MAAO;AACX,cAAU;AACV,QAAI,IAAI,EAAG,KAAI;AACf,QAAI,KAAK,MAAO,QAAO,IAAI,WAAW;AACtC,YAAQ;AACR,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,MAAM,OAAO;AACnB,QAAI,KAAK,aAAa,KAAK,UAAU,MAAM,UAAU,OAAO,KAAC,+BAAc,KAAK,WAAW,GAAG,GAAG;AAC/F,YAAM,YAAY,IAAI;AACtB,UAAI,aAAa,MAAO,QAAO,IAAI,WAAW;AAC9C,UAAI,YAAY,EAAG;AACnB,aAAO,SAAS,WAAW,SAAS;AAAA,IACtC;AACA,QAAI;AACF,cAAQ,aAAa,KAAK,EAAE;AAAA,IAC9B,SAAS,KAAK;AACZ,cAAQ,GAAG;AAAA,IACb;AACA,QAAI,KAAK,OAAO,CAAC,WAAW,KAAK,KAAK,WAAW,CAAC,GAAG;AACnD,eAAS;AACT,qBAAe;AACf,UAAI,QAAQ,cAAc;AACxB,cAAM,IAAI,WAAW,MAAM,cAAc,IAAI,GAAG,QAAQ,oBAAoB,IAAI;AAChF,qBAAa,KAAK,MAAM,aAAa,CAAC,CAAC;AAAA,MACzC;AACA;AAAA,IACF;AACA,mBAAe;AACf,QAAI,eAAe,IAAI,KAAK,KAAK,QAAQ;AACvC,eAAS;AACT,YAAM,KAAK,IAAI,gBAAgB;AAC/B,mBAAa,KAAK,MAAM,GAAG,MAAM,CAAC;AAClC,YAAM,YAAY,KAAK,OAAO,aAAa,SAAS,IAAI,KAAK,OAAO;AACpE,oBAAc,KAAK,QAAQ,EAAE,WAAW,QAAQ,GAAG,QAAQ,MAAM,IAAI,CAAC,EACnE,KAAK,CAACA,QAAO;AACZ,YAAI,GAAG,OAAO,WAAW,MAAO;AAChC,eAAO,MAAMA,GAAE;AAAA,MACjB,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,YAAI,GAAG,OAAO,WAAW,MAAO;AAChC,YAAI,OAAQ,IAAc,SAAS,aAAc;AACjD,sBAAc,MAAM,SAAS;AAAA,MAC/B,CAAC;AACH;AAAA,IACF;AACA,WAAO,MAAM,IAAI;AAAA,EACnB;AAEA,QAAM,aAA8B;AAAA,IAClC;AAAA,IACA,QAAQ;AACN,UAAI,WAAW,OAAQ;AACvB,YAAM,UAAU,IAAI;AACpB,UAAI,WAAW,YAAY,IAAI,QAAQ,QAAQ,OAAO,eAAgB,iBAAgB;AACtF,WAAK,cAAc;AACnB,UAAI,UAAU,EAAG,QAAO,IAAI,WAAW;AACvC,UAAI,aAAa,QAAQ,cAAc,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,QAAQ,WAAW,IAAI;AAC9F,UAAI,aAAa,EAAG,cAAa;AACjC,eAAS,YAAY,CAAC;AAAA,IACxB;AAAA,IACA,OAAO;AACL,UAAI,SAAS,QAAQ,EAAG;AACxB,mBAAa;AACb,aAAO;AAAA,IACT;AAAA,IACA,OAAO;AACL,UAAI,MAAO;AACX,YAAM,OAAO,QAAQ,IAAI;AACzB,UAAI,QAAQ,MAAM;AAChB,YAAI,QAAQ,EAAG,UAAS,QAAQ,GAAG,EAAE;AACrC;AAAA,MACF;AACA,eAAS,MAAM,EAAE;AAAA,IACnB;AAAA,IACA,KAAK,QAAgB;AACnB,YAAM,IAAI,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,MAAM;AAChD,UAAI,KAAK,KAAK,CAAC,OAAO;AACpB,YAAI,SAAS,EAAG,SAAQ,KAAK,KAAK;AAClC,iBAAS,GAAG,CAAC;AAAA,MACf;AAAA,IACF;AAAA,IACA,SAAS,MAAM,IAAI,WAAW;AAAA,IAC9B,WAAW;AACT,mBAAa;AACb,UAAI,WAAW;AAAA,IACjB;AAAA,IACA,MAAM,MAAM,IAAI,SAAS;AAAA,IACzB,SAAS;AACP,UAAI,MAAO;AACX,UAAI,WAAW,iBAAiB,gBAAgB,GAAG;AACjD,iBAAS,cAAc,CAAC;AACxB;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,KAAK;AACxB,UAAI,MAAM,OAAO,WAAW,aAAa,CAAC,WAAW,KAAK,KAAK,WAAW,CAAC,EAAG,UAAS,OAAO,CAAC;AAAA,IACjG;AAAA,IACA,UAAU;AACR,UAAI,MAAO;AACX,cAAQ;AACR,gBAAU;AACV,eAAS;AACT,aAAO,QAAQ;AACf,cAAQ;AACR,UAAI;AACF,gBAAQ,QAAQ,WAAW;AAAA,MAC7B,SAAS,KAAK;AACZ,gBAAQ,GAAG;AAAA,MACb;AAAA,IACF;AAAA,IACA,UAAU,OAAO,EAAE,QAAQ,QAAQ,MAAM,KAAK,GAAG,MAAM,MAAM,WAAW,OAAO,MAAM;AAAA,EACvF;AACA,SAAO;AACT;;;AC9hBA,IAAAC,kBAAoC;AAkC7B,SAAS,gBAAgB,SAAkD;AAChF,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAM,MAAM,MAAM;AAClB,MAAI,WAA8B,QAAQ,YAAY,EAAE,kBAAkB,CAAC,EAAE;AAC7E,MAAI,OAAO,QAAQ,QAAQ,OAAO;AAClC,QAAM,MAAM,SAAS,OAAO,QAAQ;AAEpC,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,YAAY;AACjB,QAAM,WAAW,IAAI,cAAc,QAAQ;AAC3C,WAAS,OAAO;AAChB,WAAS,YAAY,cAAc,GAAG;AACtC,WAAS,aAAa,iBAAiB,OAAO;AAC9C,QAAM,OAAO,IAAI,cAAc,MAAM;AACrC,OAAK,YAAY;AACjB,QAAM,QAAQ,IAAI,cAAc,MAAM;AACtC,QAAM,YAAY;AAClB,OAAK,YAAY,KAAK;AACtB,WAAS,YAAY,IAAI;AACzB,QAAM,QAAQ,IAAI,cAAc,MAAM;AACtC,QAAM,cAAc,OAAO;AAC3B,WAAS,YAAY,KAAK;AAE1B,QAAM,QAAQ,IAAI,cAAc,KAAK;AACrC,QAAM,YAAY,WAAW,GAAG;AAChC,QAAM,aAAa,QAAQ,QAAQ;AACnC,QAAM,aAAa,cAAc,OAAO,aAAa;AACrD,QAAM,SAAS;AAEf,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,YAAY;AACjB,QAAM,QAAQ,IAAI,cAAc,IAAI;AACpC,QAAM,YAAY;AAClB,QAAM,cAAc,OAAO;AAC3B,QAAM,MAAM,IAAI,cAAc,GAAG;AACjC,MAAI,YAAY;AAChB,QAAM,MAAM,IAAI,cAAc,KAAK;AACnC,MAAI,YAAY;AAChB,QAAM,OAAO,IAAI,cAAc,MAAM;AACrC,MAAI,YAAY,IAAI;AACpB,QAAM,QAAQ,IAAI,cAAc,QAAQ;AACxC,QAAM,OAAO;AACb,QAAM,YAAY;AAClB,QAAM,cAAc;AACpB,QAAM,aAAa,cAAc,oBAAoB;AACrD,OAAK,OAAO,OAAO,KAAK,KAAK,KAAK;AAClC,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,YAAY;AACjB,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,YAAY;AACjB,QAAM,OAAO,MAAM,MAAM,IAAI;AAC7B,OAAK,OAAO,UAAU,KAAK;AAC3B,QAAM,YAAY,IAAI;AAEtB,QAAM,UAAU,CAAC,MAAe;AAC9B,WAAO;AACP,UAAM,SAAS,CAAC;AAChB,aAAS,aAAa,iBAAiB,OAAO,CAAC,CAAC;AAChD,QAAI,GAAG;AACL,OAAC,MAAM,cAA2B,yBAAyB,KAAK,OAAO,QAAQ,EAAE,eAAe,KAAK,CAAC;AACtG,cAAQ,SAAS;AAAA,IACnB,MAAO,SAAQ,UAAU;AAAA,EAC3B;AAEA,QAAM,cAAc,MAAM;AACxB,UAAM,OAAO,IAAI,IAAI,SAAS,gBAAgB;AAC9C,UAAM,YAAY,OAAO,MAAM,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE;AAC7D,UAAM,MAAM,OAAO,MAAM,SAAS,KAAK,MAAO,YAAY,OAAO,MAAM,SAAU,GAAG,IAAI;AACxF,UAAM,cAAc,GAAG,SAAS,IAAI,OAAO,MAAM,MAAM;AACvD,aAAS,MAAM,YAAY,WAAW,GAAG,GAAG,GAAG;AAC/C,aAAS,aAAa,cAAc,GAAG,OAAO,aAAa,KAAK,SAAS,OAAO,OAAO,MAAM,MAAM,kBAAkB;AACrH,QAAI,cAAc,GAAG,SAAS,OAAO,OAAO,MAAM,MAAM;AACxD,SAAK,MAAM,QAAQ,GAAG,GAAG;AACzB,QAAI,aAAa,QAAQ,aAAa;AACtC,QAAI,aAAa,iBAAiB,OAAO,GAAG,CAAC;AAC7C,QAAI,aAAa,iBAAiB,GAAG;AACrC,QAAI,aAAa,iBAAiB,KAAK;AACvC,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,UAAM,eAAW,qCAAoB,QAAQ,QAAQ;AACrD,QAAI,UAAU;AACZ,YAAM,OAAO,IAAI,cAAc,KAAK;AACpC,WAAK,YAAY;AACjB,YAAM,IAAI,IAAI,cAAc,IAAI;AAChC,QAAE,YAAY;AACd,QAAE,cAAc,OAAO;AACvB,YAAM,IAAI,IAAI,cAAc,KAAK;AACjC,QAAE,YAAY;AACd,uBAAiB,GAAG,OAAO,cAAc;AACzC,WAAK,OAAO,GAAG,CAAC;AAChB,WAAK,YAAY,IAAI;AAAA,IACvB;AACA,UAAM,OAAO,IAAI,cAAc,KAAK;AACpC,SAAK,aAAa,QAAQ,MAAM;AAChC,QAAI,SAAS;AACb,WAAO,MAAM,QAAQ,CAAC,MAAM,MAAM;AAChC,YAAM,SAAS,KAAK,IAAI,KAAK,EAAE;AAC/B,YAAM,MAAM,IAAI,cAAc,QAAQ;AACtC,UAAI,OAAO;AACX,UAAI,YAAY,SAAS,SAAS,YAAY,EAAE;AAChD,UAAI,aAAa,QAAQ,UAAU;AACnC,UAAI,aAAa,gBAAgB,KAAK,EAAE;AACxC,UAAI,aAAa,gBAAgB,OAAO,MAAM,CAAC;AAC/C,UAAI,OAAO,WAAW,UAAU,CAAC,QAAQ;AACvC,YAAI,WAAW;AACf,YAAI,QAAQ;AAAA,MACd;AACA,UAAI,OAAO,WAAW,CAAC,OAAQ,UAAS;AACxC,YAAM,QAAQ,IAAI,cAAc,MAAM;AACtC,YAAM,YAAY;AAClB,YAAM,aAAa,eAAe,MAAM;AACxC,YAAM,cAAc,SAAS,WAAM;AACnC,YAAM,OAAO,IAAI,cAAc,MAAM;AACrC,YAAM,KAAK,IAAI,cAAc,KAAK;AAClC,SAAG,YAAY;AACf,SAAG,cAAc,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK;AACxC,WAAK,YAAY,EAAE;AACnB,UAAI,KAAK,aAAa;AACpB,cAAM,KAAK,IAAI,cAAc,KAAK;AAClC,WAAG,YAAY;AACf,WAAG,cAAc,KAAK;AACtB,aAAK,YAAY,EAAE;AAAA,MACrB;AACA,UAAI,OAAO,OAAO,IAAI;AACtB,UAAI,iBAAiB,SAAS,MAAM,QAAQ,cAAc,IAAI,CAAC;AAC/D,WAAK,YAAY,GAAG;AAAA,IACtB,CAAC;AACD,SAAK,YAAY,IAAI;AACrB,QAAI,OAAO,aAAa;AACtB,YAAM,UAAU,IAAI,cAAc,QAAQ;AAC1C,cAAQ,OAAO;AACf,cAAQ,YAAY;AACpB,cAAQ,cAAc,WAAW,UAAU;AAC3C,cAAQ,iBAAiB,SAAS,MAAM,QAAQ,YAAY,CAAC;AAC7D,WAAK,YAAY,OAAO;AAAA,IAC1B;AAAA,EACF;AAEA,WAAS,iBAAiB,SAAS,MAAM,QAAQ,CAAC,IAAI,CAAC;AACvD,QAAM,iBAAiB,SAAS,MAAM,QAAQ,KAAK,CAAC;AACpD,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,YAAY,MAAM;AAC9B,QAAE,gBAAgB;AAClB,cAAQ,KAAK;AACb,eAAS,MAAM;AAAA,IACjB;AAAA,EACF;AACA,QAAM,iBAAiB,WAAW,KAAK;AACvC,cAAY;AACZ,MAAI,KAAM,SAAQ,IAAI;AAEtB,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,MAAM,QAAQ,IAAI;AAAA,IACxB,OAAO,MAAM,QAAQ,KAAK;AAAA,IAC1B,QAAQ,MAAM,QAAQ,CAAC,IAAI;AAAA,IAC3B,QAAQ,MAAM;AAAA,IACd,YAAY,GAAG;AACb,iBAAW;AACX,kBAAY;AAAA,IACd;AAAA,IACA,UAAU;AACR,YAAM,oBAAoB,WAAW,KAAK;AAC1C,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;;;ACtMA,IAAAC,kBAAyE;AAsBlE,SAAS,aAAa,SAA4C;AACvE,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAM,MAAM,MAAM;AAClB,QAAM,UAAyB,CAAC;AAChC,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,YAAY,oCAAoC,OAAO,QAAQ;AACpE,OAAK,aAAa,QAAQ,QAAQ;AAClC,OAAK,aAAa,cAAc,QAAQ,SAAS,QAAQ;AACzD,OAAK,WAAW;AAChB,QAAM,QAAQ,IAAI,cAAc,KAAK;AACrC,QAAM,YAAY;AAClB,OAAK,YAAY,KAAK;AACtB,MAAI,QAAQ,WAAW;AACrB,UAAM,QAAQ,IAAI,cAAc,QAAQ;AACxC,UAAM,OAAO;AACb,UAAM,YAAY;AAClB,UAAM,cAAc;AACpB,UAAM,aAAa,cAAc,cAAc;AAC/C,UAAM,iBAAiB,SAAS,MAAM,QAAQ,YAAY,CAAC;AAC3D,SAAK,YAAY,KAAK;AAAA,EACxB;AACA,QAAM,YAAY,IAAI;AAEtB,QAAM,OAAO,IAAI,cAAc,MAAM;AACrC,OAAK,aAAa;AAClB,QAAM,YAAY,IAAI;AACtB,QAAM,UAAU,IAAI,cAAc,KAAK;AACvC,UAAQ,YAAY;AACpB,UAAQ,aAAa,QAAQ,OAAO;AAEpC,QAAM,YAAY,CAAC,IAAY,MAAgC;AAC7D,QAAI,MAAM,UAAa,MAAM,MAAO,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAI,QAAO,QAAQ,EAAE;AAAA,QACrF,SAAQ,EAAE,IAAI;AACnB,YAAQ,WAAW,EAAE,GAAG,QAAQ,CAAC;AACjC,qBAAiB;AAAA,EACnB;AAEA,QAAM,cAAc,oBAAI,IAAyB;AAEjD,QAAM,eAAe,CAAC,GAAmB,KAAa,KAAa,WAAqB;AACtF,UAAM,OAAO,IAAI,cAAc,KAAK;AACpC,UAAM,MAAM,IAAI,cAAc,KAAK;AACnC,QAAI,YAAY;AAChB,QAAI,aAAa,QAAQ,YAAY;AACrC,QAAI,aAAa,cAAc,EAAE,KAAK;AACtC,aAAS,IAAI,KAAK,KAAK,KAAK,KAAK;AAC/B,YAAM,IAAI,IAAI,cAAc,QAAQ;AACpC,QAAE,OAAO;AACT,QAAE,cAAc,OAAO,CAAC;AACxB,QAAE,aAAa,gBAAgB,OAAO;AACtC,QAAE,iBAAiB,SAAS,MAAM;AAChC,YAAI,iBAAiB,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,gBAAgB,OAAO,CAAC;AACrF,UAAE,aAAa,gBAAgB,MAAM;AACrC,kBAAU,EAAE,IAAI,CAAC;AAAA,MACnB,CAAC;AACD,UAAI,YAAY,CAAC;AAAA,IACnB;AACA,SAAK,YAAY,GAAG;AACpB,QAAI,WAAW,EAAE,YAAY,EAAE,YAAY;AACzC,YAAM,IAAI,IAAI,cAAc,KAAK;AACjC,QAAE,YAAY;AACd,QAAE,OAAO,OAAO,OAAO,IAAI,cAAc,MAAM,GAAG,EAAE,aAAa,EAAE,YAAY,GAAG,CAAC,GAAG,OAAO,OAAO,IAAI,cAAc,MAAM,GAAG,EAAE,aAAa,EAAE,aAAa,GAAG,CAAC,CAAC;AAClK,WAAK,YAAY,CAAC;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,MAAmC;AACrD,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,eAAO,aAAa,GAAG,GAAG,IAAI,IAAI;AAAA,MACpC,KAAK;AACH,eAAO,aAAa,GAAG,GAAG,EAAE,YAAY,GAAG,IAAI;AAAA,MACjD,KAAK,UAAU;AACb,cAAM,MAAM,EAAE,YAAY;AAC1B,cAAM,MAAM,IAAI,cAAc,KAAK;AACnC,YAAI,YAAY;AAChB,YAAI,aAAa,QAAQ,YAAY;AACrC,YAAI,aAAa,cAAc,EAAE,KAAK;AACtC,cAAM,OAA4B,CAAC;AACnC,iBAAS,IAAI,GAAG,KAAK,KAAK,KAAK;AAC7B,gBAAM,IAAI,IAAI,cAAc,QAAQ;AACpC,YAAE,OAAO;AACT,YAAE,cAAc;AAChB,YAAE,aAAa,cAAc,GAAG,CAAC,OAAO,GAAG,EAAE;AAC7C,YAAE,aAAa,gBAAgB,OAAO;AACtC,YAAE,iBAAiB,SAAS,MAAM;AAChC,iBAAK,QAAQ,CAAC,GAAG,MAAM;AACrB,gBAAE,UAAU,OAAO,QAAQ,IAAI,CAAC;AAChC,gBAAE,aAAa,gBAAgB,OAAO,MAAM,IAAI,CAAC,CAAC;AAAA,YACpD,CAAC;AACD,sBAAU,EAAE,IAAI,CAAC;AAAA,UACnB,CAAC;AACD,eAAK,KAAK,CAAC;AACX,cAAI,YAAY,CAAC;AAAA,QACnB;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,UAAU;AACb,cAAM,MAAM,IAAI,cAAc,KAAK;AACnC,YAAI,YAAY;AAChB,YAAI,aAAa,QAAQ,YAAY;AACrC;AAAA,UACE,CAAC,MAAM,aAAM,WAAW;AAAA,UACxB,CAAC,QAAQ,aAAM,aAAa;AAAA,QAC9B,EAAE,QAAQ,CAAC,CAAC,KAAK,MAAM,GAAG,MAAM;AAC9B,gBAAM,IAAI,IAAI,cAAc,QAAQ;AACpC,YAAE,OAAO;AACT,YAAE,cAAc;AAChB,YAAE,aAAa,cAAc,GAAa;AAC1C,YAAE,aAAa,gBAAgB,OAAO;AACtC,YAAE,iBAAiB,SAAS,MAAM;AAChC,gBAAI,iBAAiB,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,gBAAgB,OAAO,CAAC;AACrF,cAAE,aAAa,gBAAgB,MAAM;AACrC,sBAAU,EAAE,IAAI,QAAQ,IAAI;AAAA,UAC9B,CAAC;AACD,cAAI,YAAY,CAAC;AAAA,QACnB,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,KAAK,mBAAmB;AACtB,cAAM,QAAQ,EAAE,SAAS;AACzB,cAAM,QAAQ,IAAI,cAAc,KAAK;AACrC,cAAM,aAAa,QAAQ,QAAQ,UAAU,YAAY;AACzD,cAAM,aAAa,cAAc,EAAE,KAAK;AACxC,UAAE,QAAQ,QAAQ,CAAC,QAAQ;AACzB,gBAAM,IAAI,IAAI,cAAc,QAAQ;AACpC,YAAE,OAAO;AACT,YAAE,YAAY,WAAW,QAAQ,aAAa,EAAE;AAChD,YAAE,aAAa,QAAQ,QAAQ,aAAa,OAAO;AACnD,YAAE,aAAa,gBAAgB,OAAO;AACtC,YAAE,aAAa,kBAAkB,IAAI,EAAE;AACvC,gBAAM,MAAM,IAAI,cAAc,MAAM;AACpC,cAAI,YAAY;AAChB,YAAE,OAAO,KAAK,OAAO,OAAO,IAAI,cAAc,MAAM,GAAG,EAAE,aAAa,IAAI,MAAM,CAAC,CAAC;AAClF,YAAE,iBAAiB,SAAS,MAAM;AAChC,gBAAI,OAAO;AACT,oBAAM,MAAM,IAAI,IAAK,QAAQ,EAAE,EAAE,KAA8B,CAAC,CAAC;AACjE,kBAAI,IAAI,IAAI,IAAI,EAAE,EAAG,KAAI,OAAO,IAAI,EAAE;AAAA,kBACjC,KAAI,IAAI,IAAI,EAAE;AACnB,gBAAE,aAAa,gBAAgB,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;AACtD,wBAAU,EAAE,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,YACjC,OAAO;AACL,oBAAM,iBAAiB,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,gBAAgB,OAAO,CAAC;AAC1F,gBAAE,aAAa,gBAAgB,MAAM;AACrC,wBAAU,EAAE,IAAI,IAAI,EAAE;AAAA,YACxB;AAAA,UACF,CAAC;AACD,gBAAM,YAAY,CAAC;AAAA,QACrB,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,SAAS;AACP,cAAM,KAAK,IAAI,cAAc,UAAU;AACvC,WAAG,YAAY;AACf,WAAG,OAAO;AACV,WAAG,cAAc,EAAE,eAAe;AAClC,WAAG,aAAa,cAAc,EAAE,KAAK;AACrC,WAAG,iBAAiB,SAAS,MAAM,UAAU,EAAE,IAAI,GAAG,MAAM,MAAM,GAAG,GAAI,CAAC,CAAC;AAC3E,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO,UAAU,QAAQ,CAAC,MAAM;AAC9B,UAAM,OAAO,IAAI,cAAc,KAAK;AACpC,SAAK,YAAY;AACjB,SAAK,aAAa,oBAAoB,EAAE,EAAE;AAC1C,UAAM,IAAI,IAAI,cAAc,GAAG;AAC/B,MAAE,YAAY;AACd,MAAE,cAAc,EAAE,SAAS,EAAE,WAAW,KAAK;AAC7C,SAAK,YAAY,CAAC;AAClB,QAAI,EAAE,aAAa;AACjB,YAAM,IAAI,IAAI,cAAc,GAAG;AAC/B,QAAE,YAAY;AACd,QAAE,cAAc,EAAE;AAClB,WAAK,YAAY,CAAC;AAAA,IACpB;AACA,SAAK,YAAY,WAAW,CAAC,CAAC;AAC9B,gBAAY,IAAI,EAAE,IAAI,IAAI;AAC1B,SAAK,YAAY,IAAI;AAAA,EACvB,CAAC;AAED,QAAM,SAAS,IAAI,cAAc,KAAK;AACtC,SAAO,YAAY;AACnB,QAAM,SAAS,IAAI,cAAc,QAAQ;AACzC,SAAO,OAAO;AACd,SAAO,YAAY;AACnB,SAAO,cAAc;AACrB,SAAO,YAAY,MAAM;AACzB,OAAK,YAAY,OAAO;AACxB,OAAK,YAAY,MAAM;AAEvB,WAAS,mBAAmB;AAC1B,WAAO,UAAU,QAAQ,CAAC,MAAM;AAC9B,YAAMC,MAAK,YAAY,IAAI,EAAE,EAAE;AAC/B,UAAI,CAACA,IAAI;AACT,YAAM,cAAU,mCAAkB,GAAG,OAAO;AAC5C,MAAAA,IAAG,SAAS,CAAC;AACb,UAAI,CAAC,WAAW,QAAQ,EAAE,EAAE,MAAM,OAAW,QAAO,QAAQ,EAAE,EAAE;AAAA,IAClE,CAAC;AAAA,EACH;AAEA,OAAK,iBAAiB,UAAU,CAAC,MAAM;AACrC,MAAE,eAAe;AACjB,UAAM,UAAU,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,gBAAY,mCAAkB,GAAG,OAAO,KAAK,QAAQ,EAAE,EAAE,MAAM,MAAS;AACzH,QAAI,QAAQ,QAAQ;AAClB,cAAQ,cAAc,kBAAkB,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;AAC9E,kBAAY,IAAI,QAAQ,CAAC,EAAG,EAAE,GAAG,cAA2B,iBAAiB,GAAG,MAAM;AACtF;AAAA,IACF;AACA,YAAQ,cAAc;AACtB,YAAQ,SAAS,EAAE,GAAG,QAAQ,CAAC;AAAA,EACjC,CAAC;AAED,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,YAAY,QAAQ,WAAW;AAC3C,QAAE,gBAAgB;AAClB,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AACA,OAAK,iBAAiB,WAAW,KAAK;AACtC,mBAAiB;AACjB,GAAC,KAAK,cAA2B,iBAAiB,KAAK,MAAM,QAAQ,EAAE,eAAe,KAAK,CAAC;AAE5F,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,YAAY,OAAO,EAAE,GAAG,QAAQ;AAAA,IAChC,eAAe;AACb,YAAM,cAAc;AACpB,YAAM,OAAO,IAAI,cAAc,KAAK;AACpC,WAAK,YAAY;AACjB,YAAM,IAAI,IAAI,cAAc,IAAI;AAChC,QAAE,YAAY;AACd,QAAE,cAAc,OAAO;AACvB,YAAM,IAAI,IAAI,cAAc,KAAK;AACjC,QAAE,YAAY;AACd,uBAAiB,GAAG,OAAO,YAAY;AACvC,YAAM,OAAO,IAAI,cAAc,QAAQ;AACvC,WAAK,OAAO;AACZ,WAAK,YAAY;AACjB,WAAK,cAAc;AACnB,WAAK,MAAM,YAAY;AACvB,WAAK,iBAAiB,SAAS,MAAM,QAAQ,YAAY,CAAC;AAC1D,WAAK,OAAO,GAAG,GAAG,IAAI;AACtB,YAAM,YAAY,IAAI;AACtB,WAAK,QAAQ,EAAE,eAAe,KAAK,CAAC;AAAA,IACtC;AAAA,IACA,UAAU;AACR,WAAK,oBAAoB,WAAW,KAAK;AACzC,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;;;ACvRA,IAAAC,mBAA0E;;;ACA1E,IAAAC,mBAAmJ;AA4DnJ,IAAM,gBAAgB,oBAAI,IAAI,CAAC,QAAQ,SAAS,WAAW,cAAc,CAAC;AAGnE,SAAS,eAAe,QAA6C,SAAyD;AACnI,MAAI,CAAC,WAAW,CAAC,OAAQ,QAAO;AAChC,SAAO,OAAO,KAAK,CAAC,OAAO,EAAE,QAAQ,WAAW,EAAE,OAAO,YAAY,cAAc,IAAI,EAAE,IAAI,CAAC,KAAK;AACrG;AAMO,SAAS,UAAU,KAAe,MAAc,OAAe,SAA6B,QAAoB,QAAkC;AACvJ,QAAM,OAAO,SAAS,KAAK,MAAM,OAAO,OAAO;AAC/C,OAAK,iBAAiB,SAAS,MAAM;AACrC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,MAAM,GAAG,KAAK,OAAO,UAAU;AACrC,QAAM,IAAI,GAAG,KAAK,UAAU,mCAAmC,gBAAW;AAC1E,IAAE,OAAO;AACT,IAAE,aAAa,cAAc,YAAY,KAAK,EAAE;AAChD,IAAE,iBAAiB,SAAS,MAAM;AAClC,MAAI,OAAO,MAAM,CAAC;AAClB,SAAO;AACT;AAMO,SAAS,cAAc,MAAmB,KAAe,UAAoC,OAAoC;AACtI,aAAW,KAAK,MAAM,KAAK,KAAK,iBAAoC,YAAY,oCAAmB,IAAI,CAAC,GAAG;AACzG,UAAM,UAAM,oCAAkB,EAAE,aAAa,MAAM,CAAC;AACpD,UAAM,SAAS,EAAE,QAAQ,cAAc,KAAK;AAC5C,QAAI,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG;AAE1B,UAAI,WAAW,EAAG,QAAO,OAAO;AAAA,UAC3B,GAAE,YAAY,IAAI,eAAe,EAAE,eAAe,EAAE,CAAC;AAC1D;AAAA,IACF;AACA,UAAM,IAAI,GAAG,KAAK,UAAU,qCAAqC,WAAM,EAAE,eAAe,IAAI,KAAK,KAAK,SAAS,EAAE;AACjH,MAAE,OAAO;AACT,MAAE,iBAAiB,SAAS,MAAM,MAAM,GAAG,CAAC;AAC5C,MAAE,YAAY,CAAC;AAAA,EACjB;AACF;AAgBO,SAAS,GAA0C,KAAe,KAAQ,KAAc,MAAyC;AACtI,QAAM,IAAI,IAAI,cAAc,GAAG;AAC/B,MAAI,IAAK,GAAE,YAAY;AACvB,MAAI,QAAQ,KAAM,GAAE,cAAc;AAClC,SAAO;AACT;AAEO,SAAS,SAAS,KAAe,MAAc,OAAe,SAAqC;AACxG,QAAM,IAAI,GAAG,KAAK,UAAU,WAAW;AACvC,IAAE,OAAO;AACT,QAAM,IAAI,GAAG,KAAK,QAAQ,aAAa,IAAI;AAC3C,IAAE,aAAa,eAAe,MAAM;AACpC,QAAM,OAAO,GAAG,KAAK,MAAM;AAC3B,OAAK,YAAY,GAAG,KAAK,OAAO,cAAc,KAAK,CAAC;AACpD,MAAI,QAAS,MAAK,YAAY,GAAG,KAAK,OAAO,YAAY,OAAO,CAAC;AACjE,IAAE,OAAO,GAAG,IAAI;AAChB,SAAO;AACT;AAKO,SAAS,eAAe,SAAoC;AACjE,QAAM,EAAE,IAAI,IAAI;AAChB,MAAI,QAAQ;AACZ,MAAI,gBAAyC,CAAC;AAC9C,MAAI,YAAY;AAChB,MAAI,UAAU;AACd,MAAI,SAA8D;AAClE,QAAM,YAAY,CAAC,SAAwB;AACzC,UAAM,MAAM,CAAC,CAAC;AACd,aAAS;AACT,QAAI,QAAQ,CAAC,CAAC,KAAM,SAAQ,kBAAkB,CAAC,CAAC,IAAI;AAAA,EACtD;AAEA,QAAM,OAAO,GAAG,KAAK,OAAO,QAAQ;AACpC,QAAM,aAAa,GAAG,KAAK,OAAO,aAAa;AAC/C,QAAM,QAAQ,GAAG,KAAK,SAAS,SAAS;AACxC,QAAM,OAAO;AACb,QAAM,cAAc;AACpB,QAAM,aAAa,cAAc,sBAAsB;AACvD,aAAW,YAAY,KAAK;AAC5B,QAAM,OAAO,GAAG,KAAK,OAAO,cAAc;AAC1C,OAAK,OAAO,YAAY,IAAI;AAE5B,QAAM,UAAU,CAAC,MAAiD,OAAO,EAAE,SAAS,YAAY,CAAC,EAAE;AACnG,QAAM,YAAY,CAAC,QAAgB,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,eAAe,QAAQ,SAAS,GAAG,GAAG;AACjG,QAAM,SAAS,CAAC,QAAgB,QAAQ,WAAW,eAAe,QAAQ,SAAS,GAAG,GAAG,GAAG,OAAO,GAAG;AAEtG,QAAM,cAAc,CAAC,YAA2B;AAC9C,QAAI,QAAQ,aAAa;AACvB,aAAO,KAAK,QAAQ,aAAa,UAAU,qBAAqB;AAChE,UAAI,QAAQ,OAAO,EAAG,SAAQ,gBAAgB,OAAO;AACrD;AAAA,IACF;AACA,UAAM,MAAM,EAAE;AACd,QAAI,QAAQ,OAAO,KAAK,CAAC,QAAQ,aAAa;AAC5C,gBAAU,EAAE,SAAS,SAAS,MAAM,CAAC;AACrC,UAAI,QAAQ,OAAO,EAAG,SAAQ,gBAAgB,OAAO;AACrD,aAAO,OAAO;AAAA,IAChB;AACA,cAAU,EAAE,SAAS,SAAS,KAAK,CAAC;AACpC,WAAO;AACP,YACG,YAAY,QAAQ,EAAE,EACtB,KAAK,CAAC,SAAS;AACd,UAAI,QAAQ,WAAW,CAAC,OAAQ;AAChC,gBAAU,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,MAAM,GAAG,GAAG,SAAS,MAAM,CAAC;AACvE,UAAI,KAAM,SAAQ,gBAAgB,IAAI;AACtC,aAAO;AAAA,IACT,CAAC,EACA,MAAM,MAAM;AACX,UAAI,QAAQ,WAAW,CAAC,OAAQ;AAChC,gBAAU,EAAE,SAAS,EAAE,GAAG,SAAS,MAAM,GAAG,GAAG,SAAS,MAAM,CAAC;AAC/D,aAAO;AAAA,IACT,CAAC;AAAA,EACL;AAEA,QAAM,gBAAgB,CAAC,EAAE,SAAS,QAAQ,MAAkC;AAC1E,UAAM,OAAO,GAAG,KAAK,OAAO,cAAc;AAC1C,UAAM,OAAO,GAAG,KAAK,UAAU,8BAA8B,aAAQ;AACrE,SAAK,OAAO;AACZ,SAAK,iBAAiB,SAAS,MAAM;AACnC;AACA,gBAAU,IAAI;AACd,aAAO;AAAA,IACT,CAAC;AACD,UAAM,QAAQ,GAAG,KAAK,MAAM,WAAW,QAAQ,KAAK;AACpD,UAAM,UAAU,GAAG,KAAK,OAAO,QAAQ;AACvC,QAAI,QAAS,SAAQ,YAAY,GAAG,KAAK,OAAO,cAAc,eAAU,CAAC;AAAA,aAChE,QAAQ,MAAM;AACrB,uBAAiB,SAAS,QAAQ,IAAI;AACtC,wBAAkB,SAAS,GAAG;AAC9B,oBAAc,SAAS,KAAK,WAAW,MAAM;AAAA,IAC/C,MACK,SAAQ,YAAY,GAAG,KAAK,OAAO,cAAc,kCAAkC,CAAC;AACzF,SAAK,OAAO,MAAM,OAAO,OAAO;AAChC,SAAK,YAAY,IAAI;AACrB,SAAK,QAAQ,EAAE,eAAe,KAAK,CAAC;AAAA,EACtC;AAEA,QAAM,UAAU,CAAC,OAAe,QAAQ,MAAM;AAC5C,UAAM,IAAI,KAAK,YAAY,GAAG,KAAK,OAAO,gBAAgB,KAAK,CAAC;AAChE,QAAI,MAAO,GAAE,QAAQ,QAAQ,OAAO,KAAK;AACzC,WAAO;AAAA,EACT;AACA,QAAM,gBAAgB,CAAC,MAAqB;AAC1C,UAAM,MAAM,EAAE,cAAc,KAAK,SAAS;AAC1C,UAAM,UAAU,EAAE,WAAY,EAAE,UAAU,cAAW,EAAE,OAAO,KAAK,UAAW,EAAE;AAChF,SAAK,YAAY,UAAU,KAAK,EAAE,WAAW,WAAM,aAAM,EAAE,OAAO,SAAS,MAAM,YAAY,CAAC,GAAG,MAAM,MAAM,OAAO,GAAG,IAAI,MAAS,CAAC;AAAA,EACvI;AAEA,WAAS,SAAS;AAChB,SAAK,cAAc;AACnB,QAAI,OAAQ,QAAO,cAAc,MAAM;AACvC,UAAM,OAAO,QAAQ,KAAK;AAC1B,UAAM,SAAS,QAAQ,cAAc,KAAK,CAAC;AAC3C,eAAW,SAAS,CAAC,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,SAAS,QAAQ;AACrE,UAAM,eAAW,yCAAuB,KAAK,aAAa,KAAK,UAAU,MAAM;AAC/E,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,QAAI,GAAG;AAEL,YAAM,gBAAgB,KAAK,eAAe,CAAC,GAAG,OAAO,CAAC,UAAM,mCAAiB,EAAE,MAAM,CAAC,KAAK,eAAe,QAAQ,SAAS,KAAK,KAAK,aAAa,EAAE,EAAE,CAAC;AACvJ,UAAI,aAAa,QAAQ;AACvB,gBAAQ,iBAAiB,aAAa,MAAM,GAAG;AAC/C,mBAAW,KAAK,aAAc,MAAK,YAAY,UAAU,KAAK,UAAK,EAAE,MAAM,yBAAyB,MAAM,QAAQ,eAAe,EAAE,EAAE,CAAC,CAAC;AAAA,MACzI;AAAA,IACF;AACA,SAAK,OAAO,GAAI,QAAQ,QAAQ,CAAC,KAAK,CAAC,CAAE;AACzC,QAAI,GAAG;AACL,YAAM,UAAU,SAAS,QAAQ,CAAC,MAAM,EAAE,QAAQ;AAClD,YAAM,QAAQ,QAAQ,OAAO,CAAC,UAAM,mCAAiB,GAAG,EAAE,KAAK,IAAI,EAAE,OAAO,IAAI,CAAC,CAAC;AAClF,YAAM,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAE3C,YAAM,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AACvG,YAAM,SAA0B,CAAC,GAAG,OAAO,GAAG,cAAc,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,SAAK,kCAAgB,KAAK,aAAa,GAAG,MAAM,CAAC,CAAC;AAC/J,cAAQ,YAAY,OAAO,MAAM,GAAG;AACpC,UAAI,CAAC,OAAO,OAAQ,MAAK,YAAY,GAAG,KAAK,OAAO,cAAc,gCAAgC,CAAC;AACnG,aAAO,QAAQ,aAAa;AAC5B;AAAA,IACF;AACA,QAAI,KAAK,WAAW,MAAM,QAAQ;AAChC,cAAQ,KAAK,UAAU,KAAK;AAC5B,YAAM,QAAQ,EAAE,OAAO,UAAK,OAAO,UAAK,SAAS,YAAK;AACtD,WAAK,UAAU,MAAM,QAAQ,CAAC,SAAS;AACrC,cAAM,IAAI,SAAS,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,OAAO;AAClE,UAAE,iBAAiB,SAAS,KAAK,GAAG;AACpC,aAAK,YAAY,CAAC;AAAA,MACpB,CAAC;AAAA,IACH;AACA,UAAM,YAAwD;AAAA,MAC5D,QAAQ,MAAM;AAAA,MAAC;AAAA,MACf,eAAe,MAAM;AACnB,YAAI,CAAC,KAAK,eAAe,OAAQ;AACjC,gBAAQ,kCAAiB,aAAa;AACtC,cAAM,OAAO,KAAK,sBAAsB,KAAK,MAAM,KAAK,mBAAmB,IAAI;AAC/E,aAAK,cAAc,MAAM,GAAG,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,YAAY,iBAAiB,GAAG,OAAO,MAAM,IAAI,KAAK,KAAK,MAAM,EAAE,WAAW,IAAI,IAAI,CAAC,CAAC;AAAA,MAC9I;AAAA,MACA,QAAQ,MAAM;AACZ,YAAI,CAAC,KAAK,aAAa,OAAQ;AAC/B,gBAAQ,aAAa;AACrB,aAAK,YAAY,QAAQ,CAAC,MAAM;AAC9B,gBAAM,IAAI,SAAS,KAAK,UAAK,EAAE,MAAM,aAAa;AAClD,YAAE,iBAAiB,SAAS,MAAM,QAAQ,eAAe,EAAE,EAAE,CAAC;AAC9D,eAAK,YAAY,CAAC;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,MACA,YAAY,MAAM;AAChB,YAAI,CAAC,KAAK,YAAY,OAAQ;AAC9B,gBAAQ,YAAY;AACpB,aAAK,WAAW,QAAQ,CAAC,MAAM;AAC7B,gBAAM,IAAI,SAAS,KAAK,UAAK,EAAE,MAAM,gBAAgB;AACrD,YAAE,iBAAiB,SAAS,MAAM,QAAQ,kBAAkB,EAAE,EAAE,CAAC;AACjE,eAAK,YAAY,CAAC;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,MACA,UAAU,MAAM;AAEd,mBAAW,KAAK,UAAU;AACxB,kBAAQ,EAAE,aAAa,EAAE,KAAK,KAAK,UAAK,IAAI,YAAY,EAAE,KAAK;AAC/D,YAAE,SAAS,QAAQ,aAAa;AAAA,QAClC;AAAA,MACF;AAAA,MACA,MAAM,MAAM;AACV,YAAI,CAAC,KAAK,MAAM,OAAQ;AACxB,gBAAQ,KAAK;AACb,aAAK,KAAK,QAAQ,CAAC,MAAM;AACvB,gBAAM,IAAI,SAAS,KAAK,KAAK,EAAE,QAAQ;AACvC,YAAE,aAAa,iBAAiB,OAAO;AACvC,gBAAM,IAAI,GAAG,KAAK,OAAO,SAAS;AAClC,YAAE,KAAK,SAAS,EAAE,EAAE;AACpB,YAAE,aAAa,iBAAiB,EAAE,EAAE;AACpC,2BAAiB,GAAG,EAAE,MAAM;AAC5B,YAAE,SAAS;AACX,YAAE,iBAAiB,SAAS,MAAM;AAChC,cAAE,SAAS,CAAC,EAAE;AACd,cAAE,aAAa,iBAAiB,OAAO,CAAC,EAAE,MAAM,CAAC;AAAA,UACnD,CAAC;AACD,eAAK,OAAO,GAAG,CAAC;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,MACA,OAAO,MAAM;AACX,YAAI,CAAC,KAAK,OAAO,OAAQ;AACzB,gBAAQ,OAAO;AACf,aAAK,MAAM,QAAQ,CAAC,MAAM;AACxB,gBAAM,IAAI,GAAG,KAAK,KAAK,WAAW;AAClC,YAAE,OAAO,EAAE;AACX,YAAE,SAAS;AACX,YAAE,MAAM;AACR,gBAAM,IAAI,GAAG,KAAK,QAAQ,aAAa,QAAG;AAC1C,YAAE,aAAa,eAAe,MAAM;AACpC,YAAE,OAAO,GAAG,GAAG,KAAK,QAAQ,cAAc,EAAE,KAAK,CAAC;AAClD,YAAE,aAAa,cAAc,GAAG,EAAE,KAAK,uBAAuB;AAC9D,eAAK,YAAY,CAAC;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AACA,eAAW,MAAM,KAAK,WAAW,+BAAe,WAAU,EAAE,IAAI;AAChE,QAAI,CAAC,KAAK,WAAW,OAAQ,MAAK,YAAY,GAAG,KAAK,OAAO,cAAc,mBAAmB,CAAC;AAAA,EACjG;AAGA,WAAS,iBAAiB,GAA+B,QAA8B;AACrF,UAAM,OAAO,GAAG,KAAK,WAAW,YAAY,SAAS,sBAAsB,EAAE,EAAE;AAC/E,UAAM,OAAO,GAAG,KAAK,OAAO,gBAAgB;AAC5C,UAAM,QAAQ,GAAG,KAAK,MAAM,mBAAmB,EAAE,KAAK;AACtD,SAAK,YAAY,KAAK;AACtB,QAAI,QAAQ;AACV,YAAM,MAAM,GAAG,KAAK,QAAQ,iBAAiB,KAAK;AAClD,WAAK,YAAY,GAAG;AAAA,IACtB;AACA,UAAM,OAAO,GAAG,KAAK,QAAQ,gBAAgB;AAC7C,SAAK,WAAW,EAAE;AAClB,QAAI;AACF,WAAK,cAAc,IAAI,KAAK,EAAE,WAAW,EAAE,mBAAmB,QAAW,EAAE,MAAM,WAAW,OAAO,SAAS,KAAK,UAAU,CAAC;AAAA,IAC9H,QAAQ;AACN,WAAK,cAAc,EAAE,YAAY,MAAM,GAAG,EAAE;AAAA,IAC9C;AACA,SAAK,OAAO,MAAM,IAAI;AACtB,QAAI,EAAE,MAAM;AACV,YAAM,IAAI,GAAG,KAAK,OAAO,uBAAuB;AAChD,uBAAiB,GAAG,EAAE,IAAI;AAC1B,WAAK,YAAY,CAAC;AAAA,IACpB;AACA,UAAM,UAAU,GAAG,KAAK,OAAO,mBAAmB;AAClD,UAAM,QAAQ,EAAE,UAAU,eAAe,QAAQ,SAAS,GAAG,EAAE,OAAO,IAAI;AAC1E,QAAI,OAAO;AACT,YAAM,IAAI,GAAG,KAAK,UAAU,uBAAuB,EAAE,aAAa,SAAS;AAC3E,QAAE,OAAO;AACT,QAAE,iBAAiB,SAAS,MAAO,QAAQ,WAAW,QAAQ,SAAS,MAAM,GAAG,IAAI,QAAQ,eAAe,MAAM,EAAE,CAAE;AACrH,cAAQ,YAAY,CAAC;AAAA,IACvB;AACA,QAAI,EAAE,WAAW;AACf,YAAM,SAAS,QAAQ,KAAK,EAAE,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS;AACvE,UAAI,QAAQ;AACV,cAAM,IAAI,GAAG,KAAK,UAAU,yBAAyB,QAAQ,cAAc,EAAE,aAAa,WAAW;AACrG,UAAE,OAAO;AACT,UAAE,iBAAiB,SAAS,MAAM,YAAY,MAAM,CAAC;AACrD,gBAAQ,YAAY,CAAC;AAAA,MACvB;AAAA,IACF;AACA,QAAI,EAAE,OAAO,gBAAgB,KAAK,EAAE,GAAG,GAAG;AACxC,YAAM,IAAI,GAAG,KAAK,KAAK,oBAAoB,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,YAAY;AAC7G,QAAE,OAAO,EAAE;AACX,QAAE,SAAS;AACX,QAAE,MAAM;AACR,cAAQ,YAAY,CAAC;AAAA,IACvB;AACA,QAAI,QAAQ,WAAW,OAAQ,MAAK,YAAY,OAAO;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,WAAiD;AACrD,QAAM,UAAU,MAAM;AACpB,YAAQ,MAAM;AACd;AACA,cAAU,IAAI;AACd,WAAO;AACP,QAAI,SAAU,cAAa,QAAQ;AACnC,QAAI,CAAC,QAAQ,UAAU,CAAC,MAAM,KAAK,GAAG;AACpC,sBAAgB,CAAC;AACjB;AAAA,IACF;AACA,UAAM,MAAM,EAAE;AACd,eAAW,WAAW,MAAM;AAC1B,cACG,SAAS,MAAM,KAAK,CAAC,EACrB,KAAK,CAAC,YAAY;AACjB,YAAI,QAAQ,UAAW;AACvB,wBAAgB,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC;AACpD,eAAO;AAAA,MACT,CAAC,EACA,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnB,GAAG,GAAG;AAAA,EACR;AACA,QAAM,iBAAiB,SAAS,OAAO;AAEvC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,QAAQ;AACN;AACA,gBAAU,IAAI;AACd,cAAQ;AACR,YAAM,QAAQ;AACd,sBAAgB,CAAC;AAAA,IACnB;AAAA,IACA,YAAY,IAAY;AACtB,YAAM,SAAS,QAAQ,KAAK,EAAE,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,MAAM,IAAI,OAAO,WAAW,SAAS,IAAI,WAAW,IAAI,aAAa,KAAK;AACnJ,kBAAY,MAAM;AAAA,IACpB;AAAA,IACA,eAAe,MAAM,CAAC,CAAC;AAAA,IACvB,aAAa,MAAM,MAAM,QAAQ,EAAE,eAAe,KAAK,CAAC;AAAA,IACxD,SAAS,GAAW;AAClB,YAAM,QAAQ;AACd,cAAQ;AAAA,IACV;AAAA,IACA,UAAU;AACR,UAAI,SAAU,cAAa,QAAQ;AACnC,YAAM,oBAAoB,SAAS,OAAO;AAC1C,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;;;ADhZO,SAAS,qBAAqB,SAAsD;AACzF,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAM,MAAM,MAAM;AAClB,QAAM,SAAS,QAAQ,UAAU,CAAC;AAClC,MAAI,OAAO;AACX,QAAM,MAAM,SAAS,OAAO,SAAS,QAAQ;AAC7C,QAAM,OAAO,CAAC,QAAkB,IAAI,IAAI,CAAC,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC,MAAmC,CAAC,CAAC,CAAC;AAE/I,QAAM,OAAO,GAAG,KAAK,OAAO,mBAAmB;AAC/C,QAAM,WAAW,GAAG,KAAK,UAAU,cAAc,GAAG,EAAE;AACtD,WAAS,OAAO;AAChB,WAAS,aAAa,iBAAiB,OAAO;AAC9C,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG;AACpC,SAAK,aAAa,eAAe,MAAM;AACvC,aAAS,YAAY,IAAI;AAAA,EAC3B;AACA,WAAS,YAAY,GAAG,KAAK,QAAQ,IAAI,OAAO,SAAS,SAAS,OAAO,KAAK,CAAC;AAC/E,WAAS,aAAa,cAAc,OAAO,SAAS,SAAS,OAAO,KAAK;AACzE,MAAI,QAAQ,aAAc,UAAS,SAAS;AAC5C,QAAM,QAAQ,GAAG,KAAK,QAAQ,kBAAkB;AAChD,QAAM,SAAS;AACf,WAAS,YAAY,KAAK;AAG1B,QAAM,UAAU,UACd,iCAAe,OAAO,OAAO,EAC1B,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,eAAe,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,YAAY,QAAQ,SAAS,EAAE,SAAS,EAAE,EACtH,IAAI,CAAC,MAAM,EAAE,EAA4B;AAC9C,QAAM,gBAAgB,MAAO,QAAQ,EAAE,SAAS,eAAe,QAAI,uCAAqB,OAAO,eAAe,QAAQ,cAAc,KAAK,CAAC,CAAC,IAAI,CAAC;AAChJ,QAAM,cAAc,MAAM;AACxB,UAAM,aAAS,sCAAoB,cAAc,GAAG,QAAQ,sBAAsB,CAAC;AACnF,UAAM,SAAS,WAAW;AAC1B,UAAM,cAAc,SAAS,IAAI,OAAO,OAAO,MAAM;AACrD,UAAM,QAAQ,OAAO,SAAS,SAAS,OAAO;AAC9C,aAAS,aAAa,cAAc,SAAS,GAAG,KAAK,KAAK,MAAM,cAAc,WAAW,IAAI,KAAK,GAAG,MAAM,KAAK;AAAA,EAClH;AACA,cAAY;AAEZ,QAAM,QAAQ,GAAG,KAAK,OAAO,WAAW,GAAG,EAAE;AAC7C,QAAM,aAAa,QAAQ,QAAQ;AACnC,QAAM,aAAa,cAAc,OAAO,KAAK;AAC7C,QAAM,SAAS;AACf,QAAM,OAAO,GAAG,KAAK,OAAO,cAAc;AAC1C,OAAK,YAAY,GAAG,KAAK,MAAM,iBAAiB,OAAO,KAAK,CAAC;AAC7D,QAAM,QAAQ,GAAG,KAAK,UAAU,WAAW,MAAG;AAC9C,QAAM,OAAO;AACb,QAAM,aAAa,cAAc,OAAO;AACxC,OAAK,YAAY,KAAK;AACtB,MAAI,aAA4B,QAAQ,sBAAsB,KAAK;AACnE,QAAM,OAAO,eAAe;AAAA,IAC1B;AAAA,IACA,MAAM,OAAO;AAAA,MACX,aAAa,OAAO;AAAA,MACpB,UAAU,OAAO;AAAA,MACjB,aAAa,KAAK,OAAO,mBAAmB;AAAA,MAC5C,YAAY,KAAK,OAAO,iBAAiB;AAAA,MACzC,MAAM,OAAO;AAAA,MACb,OAAO,OAAO;AAAA,MACd,eAAe,cAAc;AAAA,MAC7B,qBAAqB;AAAA,MACrB,SAAS,QAAQ;AAAA,IACnB;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,aAAa,QAAQ;AAAA,IACrB,aAAa,QAAQ;AAAA,IACrB,cAAc,QAAQ;AAAA,IACtB,iBAAiB,QAAQ;AAAA,IACzB,eAAe,QAAQ;AAAA,IACvB,QAAQ,MAAM;AAAA,IACd,UAAU,CAAC,QAAQ;AACjB,cAAQ,KAAK;AACb,cAAQ,eAAe,GAAG;AAAA,IAC5B;AAAA;AAAA,IAEA,iBAAiB,CAAC,YAAY,MAAM,UAAU,OAAO,mBAAmB,OAAO;AAAA,EACjF,CAAC;AACD,QAAM,OAAO,MAAM,KAAK,EAAE;AAC1B,OAAK,OAAO,UAAU,KAAK;AAC3B,QAAM,YAAY,IAAI;AAEtB,QAAM,UAAU,CAAC,MAAe;AAC9B,QAAI,SAAS,EAAG;AAChB,WAAO;AACP,UAAM,SAAS,CAAC;AAChB,aAAS,aAAa,iBAAiB,OAAO,CAAC,CAAC;AAChD,QAAI,GAAG;AAEL,mBAAa,QAAQ,sBAAsB,KAAK;AAChD,WAAK,OAAO;AACZ,WAAK,YAAY;AACjB,UAAI,cAAc,EAAE,QAAQ;AAC1B,gBAAQ,sBAAsB;AAC9B,oBAAY;AAAA,MACd;AACA,cAAQ,SAAS;AAAA,IACnB,OAAO;AACL,WAAK,MAAM;AACX,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AACA,WAAS,iBAAiB,SAAS,MAAM,QAAQ,CAAC,IAAI,CAAC;AACvD,QAAM,iBAAiB,SAAS,MAAM,QAAQ,KAAK,CAAC;AACpD,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,UAAU;AACtB,QAAE,gBAAgB;AAClB,cAAQ,KAAK;AACb,eAAS,MAAM;AAAA,IACjB;AAAA,EACF;AACA,QAAM,iBAAiB,WAAW,KAAK;AAEvC,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM,MAAM,QAAQ,IAAI;AAAA,IACxB,YAAY,IAAY;AACtB,cAAQ,IAAI;AACZ,WAAK,YAAY,EAAE;AAAA,IACrB;AAAA,IACA,OAAO,MAAM,QAAQ,KAAK;AAAA,IAC1B,QAAQ,MAAM,QAAQ,CAAC,IAAI;AAAA,IAC3B,QAAQ,MAAM;AAAA,IACd,UAAU;AACR,WAAK,QAAQ;AACb,YAAM,oBAAoB,WAAW,KAAK;AAC1C,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AACF;;;AEpJA,IAAM,kBAAkB;AAMjB,SAAS,eAAe,SAA6C;AAC1E,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,MAAM,IAAI,eAAe;AAC/B,QAAM,QAAQ,YAAY,MAAM,EAAE,OAAO,SAAS,WAAW,OAAO,GAAG,GAAG;AAC1E,QAAM,MAAM,IAAI,cAAc,KAAK;AACnC,MAAI,YAAY;AAChB,MAAI,aAAa,QAAQ,SAAS;AAClC,QAAM,MAAM,IAAI,cAAc,MAAM;AACpC,MAAI,YAAY;AAChB,QAAM,SAAS,IAAI,cAAc,MAAM;AACvC,SAAO,cAAc,QAAQ,WAAW;AACxC,QAAM,SAAS,IAAI,cAAc,MAAM;AACvC,SAAO,YAAY;AACnB,QAAM,OAAO,IAAI,cAAc,QAAQ;AACvC,OAAK,OAAO;AACZ,OAAK,YAAY;AACjB,OAAK,cAAc;AACnB,QAAM,OAAO,IAAI,cAAc,QAAQ;AACvC,OAAK,OAAO;AACZ,OAAK,YAAY;AACjB,OAAK,cAAc;AACnB,MAAI,OAAO,KAAK,QAAQ,QAAQ,MAAM,IAAI;AAC1C,QAAM,UAAU,IAAI,cAAc,KAAK;AACvC,UAAQ,YAAY;AACpB,UAAQ,SAAS;AACjB,QAAM,QAAQ,IAAI,cAAc,MAAM;AACtC,QAAM,YAAY;AAClB,UAAQ,YAAY,KAAK;AACzB,QAAM,GAAG,OAAO,KAAK,OAAO;AAE5B,MAAI,UAAU;AACd,MAAI,UAA0B;AAC9B,MAAI,UAAU;AAEd,QAAM,WAAW,CAACC,QAAwB;AACxC,UAAM,MAAMA,IAAG,QAAQ,YAAY;AACnC,UAAM,KAAKA,IAAG,KAAK,IAAIA,IAAG,EAAE,KAAK;AACjC,UAAM,OAAOA,IAAG,aAAa,WAAW,KAAKA,IAAG,aAAa,aAAa;AAC1E,UAAM,QAAQA,IAAG,eAAe,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE;AAC3E,WAAO,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,IAAI,IAAI,MAAM,EAAE,GAAG,OAAO,UAAK,IAAI,WAAM,EAAE;AAAA,EACzE;AAEA,QAAM,QAAQ,CAACA,KAAoB,SAAS,UAAU;AACpD,QAAI,CAACA,KAAI;AACP,cAAQ,SAAS;AACjB;AAAA,IACF;AACA,UAAM,IAAI,WAAWA,GAAE;AACvB,YAAQ,SAAS;AACjB,YAAQ,UAAU,OAAO,YAAY,MAAM;AAC3C,WAAO,OAAO,QAAQ,OAAO,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,OAAO,GAAG,EAAE,KAAK,MAAM,QAAQ,GAAG,EAAE,MAAM,KAAK,CAAC;AACvH,UAAM,cAAc,SAASA,GAAE;AAC/B,UAAM,MAAM,MAAM,EAAE,MAAM,KAAK,SAAS;AAAA,EAC1C;AAEA,QAAM,YAAY,CAAC,GAAW,MAA8B;AAC1D,UAAMA,MAAK,qBAAqB,KAAK,GAAG,CAAC;AACzC,QAAI,CAACA,OAAM,iBAAiBA,GAAE,KAAKA,QAAO,IAAI,mBAAmBA,QAAO,IAAI,KAAM,QAAO;AAEzF,WAAO,gBAAgBA,GAAE;AAAA,EAC3B;AAEA,QAAM,SAAS,CAAC,MAAkB;AAChC,QAAI,CAAC,WAAW,QAAS;AACzB,UAAMA,MAAK,UAAU,EAAE,SAAS,EAAE,OAAO;AACzC,QAAIA,QAAO,SAAS;AAClB,gBAAUA;AACV,YAAMA,GAAE;AAAA,IACV;AAAA,EACF;AACA,QAAM,WAAW,MAAM;AACrB,QAAI,QAAS,OAAM,OAAO;AAAA,EAC5B;AACA,QAAM,UAAU,CAAC,MAAkB;AACjC,QAAI,CAAC,WAAW,QAAS;AACzB,QAAI,iBAAiB,eAAe,CAAC,CAAC,EAAG;AACzC,UAAMA,MAAK,UAAU,EAAE,SAAS,EAAE,OAAO,KAAK;AAC9C,QAAI,CAACA,IAAI;AACT,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,MAAE,yBAAyB;AAC3B,UAAM,IAAI,gBAAgBA,GAAE;AAC5B,UAAMA,KAAI,IAAI;AACd,WAAO,cAAc,YAAY,SAASA,GAAE,CAAC;AAC7C,YAAQ,OAAO,EAAE,WAAW,EAAE,WAAW,cAAc,EAAE,cAAc,MAAM,EAAE,MAAM,KAAK,IAAI,SAAS,MAAM,SAASA,IAAG,CAAC;AAAA,EAC5H;AACA,QAAM,UAAU,CAAC,MAAa;AAC5B,QAAI,CAAC,WAAW,QAAS;AACzB,QAAI,iBAAiB,eAAe,CAAC,CAAC,EAAG;AACzC,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAAA,EACpB;AACA,QAAM,QAAQ,CAAC,MAAqB;AAClC,QAAI,EAAE,QAAQ,UAAU;AACtB,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,WAAK;AACL,cAAQ,OAAO;AAAA,IACjB;AAAA,EACF;AACA,QAAM,OAAO,MAAM;AACjB,QAAI,QAAS;AACb,cAAU;AACV,QAAI,oBAAoB,aAAa,QAAQ,IAAI;AACjD,QAAI,oBAAoB,SAAS,SAAS,IAAI;AAC9C,QAAI,oBAAoB,aAAa,SAAS,IAAI;AAClD,QAAI,oBAAoB,WAAW,SAAS,IAAI;AAChD,QAAI,oBAAoB,WAAW,OAAO,IAAI;AAC9C,QAAI,oBAAoB,UAAU,UAAU,IAAI;AAChD,QAAI,oBAAoB,UAAU,QAAQ;AAC1C,UAAM,QAAQ;AAAA,EAChB;AACA,OAAK,iBAAiB,SAAS,MAAM;AACnC,SAAK;AACL,YAAQ,OAAO;AAAA,EACjB,CAAC;AACD,OAAK,iBAAiB,SAAS,MAAM;AACnC,SAAK;AACL,YAAQ,OAAO;AAAA,EACjB,CAAC;AACD,MAAI,iBAAiB,aAAa,QAAQ,IAAI;AAC9C,MAAI,iBAAiB,SAAS,SAAS,IAAI;AAC3C,MAAI,iBAAiB,aAAa,SAAS,IAAI;AAC/C,MAAI,iBAAiB,WAAW,SAAS,IAAI;AAC7C,MAAI,iBAAiB,WAAW,OAAO,IAAI;AAC3C,MAAI,iBAAiB,UAAU,UAAU,IAAI;AAC7C,MAAI,iBAAiB,UAAU,QAAQ;AAEvC,SAAO;AAAA,IACL,WAAW,CAAC,SAAS;AACnB,aAAO,cAAc;AAAA,IACvB;AAAA,IACA,YAAY,CAAC,YAAY;AACvB,gBAAU;AACV,UAAI,CAAC,QAAS,OAAM,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,EACF;AACF;AAYO,SAAS,YAAY,MAAiB,OAAsC,UAAsI,CAAC,GAAkB;AAC1O,QAAM,oBAA+B,EAAE,GAAG,MAAM,QAAQ,KAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,UAAU,iBAAiB,QAAQ,KAAK,IAAI,KAAK,OAAO,QAAQ,IAAI,EAAE,IAAI,KAAK,OAAO;AAC9K,QAAM,QAAuB;AAAA,IAC3B,IAAI,WAAW,KAAK,EAAE;AAAA,IACtB,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ,EAAE,OAAO,CAAC,iBAAiB,GAAG,YAAY,YAAY,WAAW,EAAE,IAAI,QAAQ,IAAI,OAAO,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,MAAM,UAAU,SAAS,EAAE,GAAG,WAAW,EAAE,MAAM,cAAc,eAAe,GAAG,UAAU,GAAG,uBAAuB,CAAC,GAAG,oBAAoB,KAAK,GAAG,YAAY,QAAQ,cAAc,EAAE,OAAO,QAAQ,WAAW,OAAO,GAAG,aAAa,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE;AAAA,EAC7X;AACA,QAAM,aAAa,SAAS,OAAO,EAAE,OAAO,KAAK,QAAQ,KAAK,OAAO,MAAM,QAAQ,QAAQ,GAAG,YAAY,MAAM;AAAA,EAAC,GAAG,UAAU,MAAM;AAAA,EAAC,EAAE,CAAC;AACxI,aAAW,MAAM;AACjB,SAAO,EAAE,YAAY,SAAS,MAAM,WAAW,QAAQ,EAAE;AAC3D;AAWO,SAAS,mBAAmB,WAA+B,UAAmD,CAAC,GAAoB;AACxI,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,QAAQ,YAAY,MAAM,EAAE,OAAO,SAAS,WAAW,OAAO,GAAG,GAAG;AAC1E,QAAM,QAAuB,CAAC;AAC9B,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAW,cAAc,WAAW,GAAG;AAC7C,QAAM,UAAU,oBAAI,IAAa;AACjC,YAAU,QAAQ,CAAC,MAAM;AACvB,UAAM,MAAM,sBAAsB,GAAG,GAAG,EAAE,OAAO,CAACA,QAAO,CAAC,iBAAiBA,GAAE,CAAC;AAC9E,WAAO,KAAK,IAAI,MAAM;AACtB,QAAI,QAAQ,CAACA,QAAO,QAAQ,IAAIA,GAAE,CAAC;AAAA,EACrC,CAAC;AACD,UAAQ,QAAQ,CAACA,QAAO;AACtB,UAAM,IAAI,WAAWA,GAAE;AACvB,UAAM,MAAM,IAAI,cAAc,KAAK;AACnC,QAAI,YAAY;AAChB,WAAO,OAAO,IAAI,OAAO,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,OAAO,GAAG,EAAE,KAAK,MAAM,QAAQ,GAAG,EAAE,MAAM,KAAK,CAAC;AACnH,QAAIA,QAAO,SAAU,KAAI,MAAM,cAAc;AAC7C,UAAM,GAAG,YAAY,GAAG;AACxB,UAAM,KAAK,GAAG;AAAA,EAChB,CAAC;AACD,MAAI,QAA8C;AAClD,QAAM,UAAU,MAAM;AACpB,QAAI,MAAO,cAAa,KAAK;AAC7B,UAAM,QAAQ;AAAA,EAChB;AACA,MAAI,QAAQ,eAAe,EAAG,SAAQ,WAAW,SAAS,QAAQ,cAAc,IAAI;AACpF,aAAW,GAAG;AACd,SAAO,EAAE,QAAQ,UAAU,QAAQ;AACrC;","names":["HOST_ID","el","h","import_runtime","el","import_runtime","import_runtime","HOST_ID","el","current","el","import_runtime","el","import_runtime","el","import_runtime","import_runtime","el","import_runtime","import_runtime","el"]}
|