@merittdev/horus-lens 0.0.1
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/browser.cjs +31594 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +125 -0
- package/dist/browser.d.ts +125 -0
- package/dist/browser.js +24 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunk-DU7HNRF4.js +1644 -0
- package/dist/chunk-DU7HNRF4.js.map +1 -0
- package/dist/chunk-DWOH2ENF.js +17613 -0
- package/dist/chunk-DWOH2ENF.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-S6S3ZZQA.js +17225 -0
- package/dist/chunk-S6S3ZZQA.js.map +1 -0
- package/dist/dashboard.cjs +19774 -0
- package/dist/dashboard.cjs.map +1 -0
- package/dist/dashboard.css +2233 -0
- package/dist/dashboard.d.cts +707 -0
- package/dist/dashboard.d.ts +707 -0
- package/dist/dashboard.js +2237 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/index.cjs +30040 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d-BA540Fae.d.ts +80 -0
- package/dist/index.d-Bzgtl7-B.d.cts +161 -0
- package/dist/index.d-Bzgtl7-B.d.ts +161 -0
- package/dist/index.d-DOCLVJGS.d.cts +80 -0
- package/dist/index.d.cts +906 -0
- package/dist/index.d.ts +906 -0
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -0
- package/dist/lens.min.js +770 -0
- package/dist/lens.min.js.map +1 -0
- package/dist/react.cjs +31683 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +100 -0
- package/dist/react.d.ts +100 -0
- package/dist/react.js +108 -0
- package/dist/react.js.map +1 -0
- package/dist/rrweb-EYUUZIYR.js +30 -0
- package/dist/rrweb-EYUUZIYR.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../browser/src/index.ts","../../browser/src/gate.ts","../../browser/src/overlay/env.ts","../../browser/src/overlay/dom.ts","../../browser/src/overlay/annotator.ts","../../browser/src/overlay/icons.ts","../../browser/src/overlay/panel.ts","../../browser/src/overlay/picker.ts","../../browser/src/overlay/styles.ts","../../browser/src/overlay/overlay.ts","../../browser/src/queue.ts","../../browser/src/snippet.ts"],"sourcesContent":["import { LensClient, type LensConfig } from '@horus-lens/core';\nimport { clearGate, DEFAULT_PARAM_NAME, evaluateGate, isGateActive } from './gate.js';\nimport { detectBrowser, detectOs, currentRoute, viewport } from './overlay/env.js';\nimport { mountOverlay, type OverlayHandle, type OverlayStats } from './overlay/index.js';\nimport { applyContext, installGlobal, processQueue, type QueuedCommands } from './queue.js';\n\nexport interface BootOptions extends Partial<Omit<LensConfig, 'accessId'>> {\n /** Falls back to a `<script data-lens-id>` attribute or a queued `init` call. */\n accessId?: string;\n /** Query param that gates activation. Default `'lens'` → `?lens=true`. */\n paramName?: string;\n /** Bypass the query-param gate (preview envs / the React provider). */\n force?: boolean;\n}\n\nexport interface LensBrowser {\n client: LensClient;\n /** Open the report panel. */\n open(): void;\n /** Close the report panel (overlay stays mounted). */\n close(): void;\n /** Remove the overlay, stop the client, and clear gate persistence. */\n destroy(): void;\n}\n\nexport { isGateActive } from './gate.js';\nexport { loaderSnippet, LOADER_SNIPPET, DEFAULT_CDN_URL } from './snippet.js';\nexport type { SnippetOptions } from './snippet.js';\nexport { processQueue, installGlobal } from './queue.js';\nexport type { QueuedCommands, LensCommand, LensGlobal } from './queue.js';\nexport type { OverlayStats } from './overlay/index.js';\n\nfunction hasDom(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction scriptAccessId(): string | undefined {\n const tag = document.querySelector('script[data-lens-id]');\n return tag?.getAttribute('data-lens-id') ?? undefined;\n}\n\n/** Resolve access id + base config from options, script tag, and queued init. */\nfunction resolveConfig(\n options: BootOptions,\n commands: QueuedCommands,\n): { accessId: string; config: LensConfig } | null {\n const { accessId: optAccessId, paramName: _p, force: _f, ...rest } = options;\n\n let queuedConfig: Record<string, unknown> = {};\n let queuedAccessId: string | undefined;\n if (typeof commands.init === 'string') {\n queuedAccessId = commands.init;\n } else if (commands.init && typeof commands.init === 'object') {\n queuedConfig = commands.init;\n if (typeof commands.init.accessId === 'string') queuedAccessId = commands.init.accessId;\n }\n\n const accessId = optAccessId ?? scriptAccessId() ?? queuedAccessId;\n if (!accessId) return null;\n\n const config = { ...queuedConfig, ...rest, accessId } as unknown as LensConfig;\n return { accessId, config };\n}\n\n/**\n * Boot the overlay: gate check → resolve access id → start a LensClient →\n * mount the overlay → wire the global command dispatcher. Returns `null` on the\n * server, when the gate is inactive, or when no access id can be resolved.\n */\nexport function boot(options: BootOptions = {}): LensBrowser | null {\n if (!hasDom()) return null;\n\n const commands = processQueue();\n const paramName = options.paramName ?? DEFAULT_PARAM_NAME;\n\n const active = options.force === true || evaluateGate(paramName);\n if (!active) {\n installGlobal(null);\n return null;\n }\n\n const resolved = resolveConfig(options, commands);\n if (!resolved) {\n if (options.debug) console.warn('[lens] no accessId — overlay not booted');\n installGlobal(null);\n return null;\n }\n\n const client = new LensClient(resolved.config);\n client.start();\n\n const snapshotStats = (): OverlayStats => ({\n url: window.location.href,\n route: currentRoute(),\n browser: detectBrowser(),\n os: detectOs(),\n viewport: viewport(),\n replay: resolved.config.replay !== false,\n // Console / network / error counts are not exposed by the public core API.\n console: null,\n network: null,\n errors: null,\n });\n\n let overlay: OverlayHandle | null = null;\n const browser: LensBrowser = {\n client,\n open: () => overlay?.open(),\n close: () => overlay?.close(),\n destroy: () => {\n overlay?.destroy();\n overlay = null;\n client.stop();\n clearGate();\n installGlobal(null);\n },\n };\n\n overlay = mountOverlay({\n client,\n snapshotStats,\n onDismiss: () => {\n client.stop();\n clearGate();\n installGlobal(null);\n },\n });\n\n installGlobal(browser);\n applyContext(browser, commands);\n\n return browser;\n}\n\n/**\n * Auto-boot on bundle load when a queued `init` command or a\n * `<script data-lens-id>` attribute supplies an access id and the gate is\n * active. No-op during SSR. Exposed so the entry can self-initialize when\n * loaded via the CDN snippet, while ESM consumers call `boot()` directly.\n */\nexport function autoBoot(): LensBrowser | null {\n if (!hasDom()) return null;\n const hasQueuedInit = Array.from(window.Lens?.q ?? []).some(\n (entry) => (entry as ArrayLike<unknown>)[0] === 'init',\n );\n const hasScriptId = !!document.querySelector('script[data-lens-id]');\n if (!hasQueuedInit && !hasScriptId) return null;\n if (!isGateActive()) return null;\n return boot();\n}\n\n// Self-initialize when loaded via the CDN snippet: a queued `init` command or a\n// `<script data-lens-id>` attribute plus an active gate is enough to boot. This\n// is a no-op for bundler/ESM consumers (React provider, composition package),\n// which have neither and drive `boot({ force })` themselves.\nif (hasDom()) autoBoot();\n","/**\n * Activation gate — decides whether the overlay should mount on this page.\n *\n * The overlay is opt-in per session: it activates when the URL carries\n * `?lens=true` (param name configurable). Once seen we persist a flag in\n * sessionStorage so client-side navigations that drop the query param keep the\n * overlay alive for the rest of the tab session. Passing `?lens=false` (or\n * `off` / `0`) clears the flag and deactivates.\n */\n\nexport const DEFAULT_PARAM_NAME = 'lens';\nexport const GATE_STORAGE_KEY = 'lens:active';\n\n// Deprecated pre-rename (\"Lense\") identifiers, still honoured read-only so\n// existing links/sessions minted before the Lens rename keep working.\nconst LEGACY_PARAM_NAME = 'lense';\nconst LEGACY_STORAGE_KEY = 'lense:active';\n\nconst TRUTHY = new Set(['', 'true', '1', 'on', 'yes']);\nconst FALSY = new Set(['false', '0', 'off', 'no']);\n\nfunction hasWindow(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction readParam(paramName: string): string | null {\n try {\n const params = new URLSearchParams(window.location.search);\n // Prefer the new param; fall back to the deprecated `?lense=` for back-compat.\n const value = params.get(paramName);\n if (value !== null) return value;\n if (paramName === DEFAULT_PARAM_NAME) return params.get(LEGACY_PARAM_NAME);\n return null;\n } catch {\n return null;\n }\n}\n\nfunction readStorage(): boolean {\n try {\n const s = window.sessionStorage;\n // Deprecated `lense:active` key is read-only back-compat for old sessions.\n return s.getItem(GATE_STORAGE_KEY) === '1' || s.getItem(LEGACY_STORAGE_KEY) === '1';\n } catch {\n return false;\n }\n}\n\nfunction writeStorage(active: boolean): void {\n try {\n if (active) window.sessionStorage.setItem(GATE_STORAGE_KEY, '1');\n else window.sessionStorage.removeItem(GATE_STORAGE_KEY);\n } catch {\n /* storage may be unavailable (private mode, sandbox) — degrade gracefully */\n }\n}\n\n/**\n * Evaluate the gate against the URL param and persisted session flag, applying\n * any side effects (persist on activate, clear on explicit deactivate).\n */\nexport function evaluateGate(paramName: string = DEFAULT_PARAM_NAME): boolean {\n if (!hasWindow()) return false;\n\n const raw = readParam(paramName);\n if (raw !== null) {\n const value = raw.trim().toLowerCase();\n if (FALSY.has(value)) {\n writeStorage(false);\n return false;\n }\n if (TRUTHY.has(value)) {\n writeStorage(true);\n return true;\n }\n // Unrecognised value — fall through to persisted state.\n }\n\n return readStorage();\n}\n\n/** Read-only gate check (param OR persisted flag). Never mutates storage. */\nexport function isGateActive(paramName: string = DEFAULT_PARAM_NAME): boolean {\n if (!hasWindow()) return false;\n\n const raw = readParam(paramName);\n if (raw !== null) {\n const value = raw.trim().toLowerCase();\n if (FALSY.has(value)) return false;\n if (TRUTHY.has(value)) return true;\n }\n return readStorage();\n}\n\n/** Clear the persisted session flag (used when the user closes the overlay). */\nexport function clearGate(): void {\n if (!hasWindow()) return;\n writeStorage(false);\n}\n","/**\n * Best-effort browser/OS detection from the user agent, plus viewport/route\n * readers. These feed the read-only context chips shown in the report panel;\n * the authoritative capture lives in @horus-lens/core.\n */\n\nexport function detectBrowser(ua: string = navigator.userAgent): string {\n if (/Edg\\//.test(ua)) return 'Edge';\n if (/OPR\\/|Opera/.test(ua)) return 'Opera';\n if (/Firefox\\//.test(ua)) return 'Firefox';\n if (/Chrome\\//.test(ua) && !/Chromium/.test(ua)) return 'Chrome';\n if (/Chromium\\//.test(ua)) return 'Chromium';\n if (/Safari\\//.test(ua) && /Version\\//.test(ua)) return 'Safari';\n return 'Browser';\n}\n\nexport function detectOs(ua: string = navigator.userAgent): string {\n if (/Windows NT/.test(ua)) return 'Windows';\n if (/Mac OS X|Macintosh/.test(ua)) return 'macOS';\n if (/Android/.test(ua)) return 'Android';\n if (/iPhone|iPad|iPod/.test(ua)) return 'iOS';\n if (/Linux/.test(ua)) return 'Linux';\n return 'Unknown';\n}\n\nexport function viewport(): { width: number; height: number } {\n return {\n width: window.innerWidth || document.documentElement.clientWidth || 0,\n height: window.innerHeight || document.documentElement.clientHeight || 0,\n };\n}\n\nexport function currentRoute(): string {\n return (window.location.pathname || '/') + (window.location.search || '');\n}\n","/** Tiny framework-free DOM helpers used to build the overlay tree. */\n\ntype Child = Node | string | null | undefined | false;\n\nexport interface ElProps {\n class?: string;\n text?: string;\n html?: string;\n title?: string;\n type?: string;\n placeholder?: string;\n ariaLabel?: string;\n attrs?: Record<string, string>;\n style?: Partial<CSSStyleDeclaration>;\n on?: Partial<Record<keyof HTMLElementEventMap, (e: Event) => void>>;\n}\n\nexport function el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n props: ElProps = {},\n children: Child[] = [],\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (props.class) node.className = props.class;\n if (props.text !== undefined) node.textContent = props.text;\n if (props.html !== undefined) node.innerHTML = props.html;\n if (props.title) node.title = props.title;\n if (props.ariaLabel) node.setAttribute('aria-label', props.ariaLabel);\n if (props.type && 'type' in node) (node as unknown as { type: string }).type = props.type;\n if (props.placeholder && 'placeholder' in node) {\n (node as unknown as { placeholder: string }).placeholder = props.placeholder;\n }\n if (props.attrs) {\n for (const [k, v] of Object.entries(props.attrs)) node.setAttribute(k, v);\n }\n if (props.style) Object.assign(node.style, props.style);\n if (props.on) {\n for (const [event, handler] of Object.entries(props.on)) {\n if (handler) node.addEventListener(event, handler as EventListener);\n }\n }\n for (const child of children) {\n if (child === null || child === undefined || child === false) continue;\n node.append(child);\n }\n return node;\n}\n\nexport function clear(node: Node): void {\n while (node.firstChild) node.removeChild(node.firstChild);\n}\n","import type { Annotation } from '@horus-lens/shared';\nimport { el } from './dom.js';\n\n/**\n * Annotation mode: a full-viewport transparent capture layer lets the user drag\n * rectangles over the page. Rects are stored in viewport coordinates alongside\n * the viewport size at capture time. Multiple annotations are supported.\n *\n * Pointer-based with `touch-action: none` on the draw layer so a finger drag\n * draws instead of scrolling. Floating \"Done / Cancel\" chips are shown (mobile\n * has no Escape); Escape still finishes on desktop. \"Cancel\" discards the\n * rectangles drawn during this session; \"Done\" keeps them.\n */\nexport class Annotator {\n private layer: HTMLElement | null = null;\n private chips: HTMLElement | null = null;\n private draft: HTMLElement | null = null;\n private startX = 0;\n private startY = 0;\n private active = false;\n private dragging = false;\n private annotations: Annotation[] = [];\n private renderedRects: HTMLElement[] = [];\n private sessionBase = 0;\n private onExit: (() => void) | null = null;\n\n constructor(private readonly host: HTMLElement) {}\n\n get isActive(): boolean {\n return this.active;\n }\n\n get count(): number {\n return this.annotations.length;\n }\n\n list(): Annotation[] {\n return this.annotations.map((a) => ({ ...a, viewport: { ...a.viewport } }));\n }\n\n clear(): void {\n this.annotations = [];\n for (const rect of this.renderedRects) rect.remove();\n this.renderedRects = [];\n }\n\n start(onExit: () => void): void {\n if (this.active) return;\n this.active = true;\n this.onExit = onExit;\n this.sessionBase = this.annotations.length;\n\n this.layer = el('div', { class: 'lens-annotate' });\n this.layer.addEventListener('pointerdown', this.onDown);\n\n this.chips = el('div', { class: 'lens-annotate-chips' }, [\n el('span', { class: 'lens-annotate-chips__label', text: 'Drag to mark an area' }),\n el('button', {\n class: 'lens-pick-chip__btn',\n text: 'Cancel',\n on: { click: () => this.cancel() },\n }),\n el('button', {\n class: 'lens-pick-chip__btn lens-pick-chip__btn--primary',\n text: 'Done',\n on: { click: () => this.exit() },\n }),\n ]);\n\n this.host.append(this.layer, this.chips);\n window.addEventListener('keydown', this.onKey, true);\n }\n\n /** Discard rectangles drawn during this session, then exit. */\n private cancel(): void {\n const removed = this.renderedRects.splice(this.sessionBase);\n for (const rect of removed) rect.remove();\n this.annotations.splice(this.sessionBase);\n this.exit();\n }\n\n exit(): void {\n if (!this.active) return;\n this.active = false;\n this.dragging = false;\n window.removeEventListener('keydown', this.onKey, true);\n window.removeEventListener('pointermove', this.onMove, true);\n window.removeEventListener('pointerup', this.onUp, true);\n if (this.draft) {\n this.draft.remove();\n this.draft = null;\n }\n if (this.layer) {\n this.layer.removeEventListener('pointerdown', this.onDown);\n this.layer.remove();\n this.layer = null;\n }\n if (this.chips) {\n this.chips.remove();\n this.chips = null;\n }\n const exit = this.onExit;\n this.onExit = null;\n exit?.();\n }\n\n private onDown = (e: PointerEvent): void => {\n e.preventDefault();\n this.dragging = true;\n this.startX = e.clientX;\n this.startY = e.clientY;\n this.draft = el('div', { class: 'lens-rect' });\n this.host.append(this.draft);\n this.position(this.draft, e.clientX, e.clientY);\n window.addEventListener('pointermove', this.onMove, true);\n window.addEventListener('pointerup', this.onUp, true);\n };\n\n private onMove = (e: PointerEvent): void => {\n if (this.dragging && this.draft) this.position(this.draft, e.clientX, e.clientY);\n };\n\n private onUp = (e: PointerEvent): void => {\n window.removeEventListener('pointermove', this.onMove, true);\n window.removeEventListener('pointerup', this.onUp, true);\n this.dragging = false;\n const x = Math.min(this.startX, e.clientX);\n const y = Math.min(this.startY, e.clientY);\n const width = Math.abs(e.clientX - this.startX);\n const height = Math.abs(e.clientY - this.startY);\n if (this.draft) {\n this.draft.remove();\n this.draft = null;\n }\n // Minimum drag threshold distinguishes a rectangle from a tap.\n if (width < 6 || height < 6) return;\n const rect = el('div', { class: 'lens-rect' });\n Object.assign(rect.style, {\n left: `${x}px`,\n top: `${y}px`,\n width: `${width}px`,\n height: `${height}px`,\n });\n this.host.append(rect);\n this.renderedRects.push(rect);\n this.annotations.push({\n kind: 'rect',\n x,\n y,\n width,\n height,\n viewport: { width: window.innerWidth, height: window.innerHeight },\n });\n };\n\n private position(node: HTMLElement, curX: number, curY: number): void {\n const x = Math.min(this.startX, curX);\n const y = Math.min(this.startY, curY);\n Object.assign(node.style, {\n left: `${x}px`,\n top: `${y}px`,\n width: `${Math.abs(curX - this.startX)}px`,\n height: `${Math.abs(curY - this.startY)}px`,\n });\n }\n\n private onKey = (e: KeyboardEvent): void => {\n if (e.key !== 'Escape') return;\n e.preventDefault();\n e.stopPropagation();\n this.exit();\n };\n}\n","/** Inline SVG icon strings (16px, currentColor). Used via ElProps.html. */\n\nconst svg = (inner: string): string =>\n `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${inner}</svg>`;\n\nexport const iconEye = svg(\n '<path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n);\n\nexport const iconCrosshair = svg(\n '<circle cx=\"12\" cy=\"12\" r=\"8\"/><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"6\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"22\"/><line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\"/><line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\"/>',\n);\n\nexport const iconClose = svg('<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>');\n\nexport const iconMark = svg(\n '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" stroke-dasharray=\"4 3\"/>',\n);\n\nexport const iconCopy = svg(\n '<rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"/><path d=\"M5 15V5a2 2 0 0 1 2-2h10\"/>',\n);\n\nexport const iconCheck = svg('<polyline points=\"20 6 9 17 4 12\"/>');\n\nexport const iconSend = svg('<line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"/>');\n\n/** Filled red dot — \"record steps\". Uses a fixed fill so it reads as a record cue. */\nexport const iconRecord = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"6\" fill=\"#ef4444\"/></svg>`;\n\n/** Square \"stop\" glyph. */\nexport const iconStop = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"/></svg>`;\n","import type { TargetElement } from '@horus-lens/shared';\nimport { clear, el } from './dom.js';\nimport { iconCheck, iconClose, iconCopy, iconMark, iconRecord, iconSend } from './icons.js';\nimport type { IncludeKey, IncludeState, OverlayStats, SubmitReportIncludes } from './types.js';\n\nexport interface PanelCallbacks {\n getStats: () => OverlayStats;\n getTarget: () => TargetElement | null;\n getAnnotationCount: () => number;\n /** Duration of a retained \"record steps\" recording, or `null` if none. */\n getRecording: () => { durationMs: number } | null;\n onRemoveTarget: () => void;\n onMarkArea: () => void;\n onRecordSteps: () => void;\n onDiscardRecording: () => void;\n onClose: () => void;\n onSubmit: (comment: string, include: SubmitReportIncludes) => Promise<{ reportId: string }>;\n}\n\n/** Include toggles rendered (in order) in the \"Include:\" row. All default ON. */\nconst INCLUDE_ITEMS: ReadonlyArray<{ key: IncludeKey; label: string }> = [\n { key: 'replay', label: 'Replay' },\n { key: 'console', label: 'Console' },\n { key: 'network', label: 'Network' },\n { key: 'errors', label: 'Errors' },\n { key: 'screenshot', label: 'Screenshot' },\n];\n\n/** The bottom-right report card: compose, submit, success / error states. */\nexport class Panel {\n readonly root: HTMLElement;\n private body: HTMLElement;\n private textarea!: HTMLTextAreaElement;\n private submitBtn!: HTMLButtonElement;\n private autoCloseTimer: ReturnType<typeof setTimeout> | null = null;\n private submitting = false;\n /** Selected capture toggles; every flag starts ON. Persists across refresh. */\n private readonly include: IncludeState = {\n replay: true,\n console: true,\n network: true,\n errors: true,\n screenshot: true,\n };\n\n constructor(private readonly cb: PanelCallbacks) {\n this.body = el('div', { class: 'lens-panel__body' });\n this.root = el('div', { class: 'lens-panel', attrs: { role: 'dialog', 'aria-label': 'Report an issue' } }, [\n el('div', { class: 'lens-panel__head' }, [\n el('div', { class: 'lens-panel__title', text: 'Report an issue' }),\n el('button', {\n class: 'lens-panel__x',\n ariaLabel: 'Close',\n html: iconClose,\n on: { click: () => this.cb.onClose() },\n }),\n ]),\n this.body,\n ]);\n this.renderForm();\n }\n\n /** Re-render the compose view (chips reflect latest target / annotations). */\n refresh(): void {\n if (!this.submitting) this.renderForm();\n }\n\n focus(): void {\n this.textarea?.focus();\n }\n\n destroy(): void {\n if (this.autoCloseTimer) clearTimeout(this.autoCloseTimer);\n this.root.remove();\n }\n\n private renderForm(): void {\n const prior = this.textarea?.value ?? '';\n clear(this.body);\n\n this.textarea = el('textarea', {\n class: 'lens-textarea',\n placeholder: \"What's wrong? Describe the issue…\",\n ariaLabel: 'Issue description',\n });\n this.textarea.value = prior;\n\n this.body.append(\n this.textarea,\n this.buildContext(),\n this.buildIncludes(),\n this.buildChips(),\n this.buildActions(),\n );\n }\n\n /** Static, non-interactive page context: route · browser · os · viewport. */\n private buildContext(): HTMLElement {\n const s = this.cb.getStats();\n const parts = [\n truncate(s.route || s.url, 40),\n `${s.browser} · ${s.os}`,\n `${s.viewport.width}×${s.viewport.height}`,\n ];\n const nodes: (HTMLElement | string)[] = [];\n parts.forEach((part, i) => {\n if (i > 0) nodes.push(el('span', { class: 'lens-context__dot', text: '·' }));\n nodes.push(el('span', { class: 'lens-context__item', text: part }));\n });\n return el('div', { class: 'lens-context', title: s.url }, nodes);\n }\n\n /** Real toggles (\"switch\"): which captured data to attach. All ON by default. */\n private buildIncludes(): HTMLElement {\n const s = this.cb.getStats();\n const counts: Partial<Record<IncludeKey, number | null>> = {\n console: s.console,\n network: s.network,\n errors: s.errors,\n };\n const toggles = INCLUDE_ITEMS.map((item) => this.buildToggle(item.key, item.label, counts[item.key]));\n return el('div', { class: 'lens-includes' }, [\n el('span', { class: 'lens-includes__label', text: 'Include:' }),\n ...toggles,\n ]);\n }\n\n private buildToggle(key: IncludeKey, label: string, count?: number | null): HTMLButtonElement {\n const on = this.include[key];\n const btn = el('button', {\n class: `lens-tgl${on ? ' is-on' : ''}`,\n attrs: { type: 'button', role: 'switch', 'aria-checked': String(on) },\n html: `<span class=\"lens-tgl__check\" aria-hidden=\"true\">${iconCheck}</span>`,\n });\n btn.append(el('span', { class: 'lens-tgl__label', text: label }));\n if (typeof count === 'number' && count > 0) {\n btn.append(el('span', { class: 'lens-tgl__count', text: String(count) }));\n }\n btn.addEventListener('click', () => {\n const next = !this.include[key];\n this.include[key] = next;\n btn.classList.toggle('is-on', next);\n btn.setAttribute('aria-checked', String(next));\n });\n return btn;\n }\n\n /** Removable context chips: annotations, retained recording, picked element. */\n private buildChips(): HTMLElement {\n const row = el('div', { class: 'lens-chips' });\n\n const annCount = this.cb.getAnnotationCount();\n if (annCount > 0) {\n row.append(chip(`${annCount} annotation${annCount === 1 ? '' : 's'}`));\n }\n\n const recording = this.cb.getRecording();\n if (recording) {\n const recChip = el('span', { class: 'lens-chip lens-chip--ok lens-chip--rec' }, [\n el('span', { text: `recording ✓ ${formatDuration(recording.durationMs)}` }),\n el('button', {\n class: 'lens-chip__x',\n ariaLabel: 'Discard recording',\n text: '×',\n on: { click: () => this.cb.onDiscardRecording() },\n }),\n ]);\n row.append(recChip);\n }\n\n const target = this.cb.getTarget();\n if (target) {\n const label = target.domPath || target.tagName || 'element';\n const targetChip = el('span', { class: 'lens-chip lens-chip--target', title: label }, [\n el('span', { class: 'lens-chip__code', text: truncate(label, 40) }),\n el('button', {\n class: 'lens-chip__x',\n ariaLabel: 'Remove element',\n text: '×',\n on: { click: () => this.cb.onRemoveTarget() },\n }),\n ]);\n row.append(targetChip);\n }\n\n // Collapse to nothing when empty so the section gap doesn't leave a void.\n row.style.display = row.childElementCount > 0 ? '' : 'none';\n return row;\n }\n\n private buildActions(): HTMLElement {\n const mark = el('button', {\n class: 'lens-abtn lens-abtn--ghost lens-abtn--compact',\n html: iconMark + '<span>Mark area</span>',\n on: { click: () => this.cb.onMarkArea() },\n });\n const record = el('button', {\n class: 'lens-abtn lens-abtn--ghost lens-abtn--compact',\n html: iconRecord + '<span>Record steps</span>',\n on: { click: () => this.cb.onRecordSteps() },\n });\n const cancel = el('button', {\n class: 'lens-abtn lens-abtn--ghost',\n text: 'Cancel',\n on: { click: () => this.cb.onClose() },\n });\n this.submitBtn = el('button', {\n class: 'lens-abtn lens-abtn--primary lens-abtn--submit',\n html: iconSend + '<span>Submit</span>',\n on: { click: () => void this.submit() },\n });\n return el('div', { class: 'lens-actions' }, [\n el('div', { class: 'lens-actions__row lens-actions__secondary' }, [mark, record]),\n el('div', { class: 'lens-actions__row lens-actions__primary' }, [cancel, this.submitBtn]),\n ]);\n }\n\n private async submit(): Promise<void> {\n if (this.submitting) return;\n const comment = this.textarea.value.trim();\n this.submitting = true;\n this.submitBtn.disabled = true;\n this.submitBtn.innerHTML = '<span>Submitting…</span>';\n try {\n const { reportId } = await this.cb.onSubmit(comment, { ...this.include });\n this.renderSuccess(reportId);\n } catch (err) {\n this.renderError(err instanceof Error ? err.message : 'Something went wrong');\n } finally {\n this.submitting = false;\n }\n }\n\n private renderSuccess(reportId: string): void {\n clear(this.body);\n const idPill = el('div', { class: 'lens-idpill' }, [\n el('span', { text: reportId }),\n el('button', {\n ariaLabel: 'Copy report id',\n html: iconCopy,\n on: {\n click: (e) => {\n const btn = e.currentTarget as HTMLButtonElement;\n void copy(reportId).then(() => {\n btn.innerHTML = iconCheck;\n setTimeout(() => (btn.innerHTML = iconCopy), 1200);\n });\n },\n },\n }),\n ]);\n this.body.append(\n el('div', { class: 'lens-state' }, [\n el('div', { class: 'lens-state__badge lens-state__badge--ok', html: iconCheck }),\n el('div', { class: 'lens-state__title', text: 'Report submitted' }),\n el('div', { class: 'lens-state__msg', text: 'Thanks — the team can see the full context.' }),\n idPill,\n ]),\n );\n this.autoCloseTimer = setTimeout(() => this.cb.onClose(), 2500);\n }\n\n private renderError(message: string): void {\n clear(this.body);\n this.body.append(\n el('div', { class: 'lens-state' }, [\n el('div', { class: 'lens-state__badge lens-state__badge--err', html: iconClose }),\n el('div', { class: 'lens-state__title', text: 'Submission failed' }),\n el('div', { class: 'lens-state__msg', text: truncate(message, 120) }),\n el('div', { class: 'lens-actions' }, [\n el('button', {\n class: 'lens-abtn lens-abtn--ghost',\n text: 'Cancel',\n on: { click: () => this.cb.onClose() },\n }),\n el('button', {\n class: 'lens-abtn lens-abtn--primary',\n text: 'Retry',\n on: { click: () => this.renderForm() },\n }),\n ]),\n ]),\n );\n }\n}\n\nfunction chip(text: string, title?: string, extra?: string): HTMLElement {\n return el('span', { class: `lens-chip${extra ? ' ' + extra : ''}`, text, title: title ?? text });\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length > max ? value.slice(0, max - 1) + '…' : value;\n}\n\n/** Format milliseconds as `m:ss` (e.g. 42000 → \"0:42\"). */\nexport function formatDuration(ms: number): string {\n const total = Math.max(0, Math.round(ms / 1000));\n const m = Math.floor(total / 60);\n const s = total % 60;\n return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\nasync function copy(text: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n /* clipboard blocked — silently ignore */\n }\n}\n","import { el } from './dom.js';\n\n/**\n * Element picker. Highlights an element with a fixed overlay box (never mutates\n * host element styles) and resolves the chosen element. Events originating\n * inside the overlay's own shadow tree are ignored so the pill / panel stay\n * interactive.\n *\n * Pointer-based so it works with mouse, pen and touch:\n * - Fine pointers (mouse/pen): hover highlights; a click confirms.\n * - Coarse pointers (touch): no hover, so the first tap highlights the element\n * under the finger, a second tap on the *same* element confirms, and a tap\n * elsewhere moves the highlight. A floating \"Tap an element — Cancel\" chip is\n * shown since mobile has no Escape key. Escape still cancels on desktop.\n */\nexport class ElementPicker {\n private highlight: HTMLElement;\n private tag: HTMLElement;\n private hint: HTMLElement;\n private current: Element | null = null;\n private active = false;\n private onPick: ((elem: Element) => void) | null = null;\n private onCancel: (() => void) | null = null;\n\n constructor(\n private readonly layer: HTMLElement,\n private readonly rootHost: HTMLElement,\n ) {\n this.tag = el('div', { class: 'lens-highlight__tag' });\n this.highlight = el('div', { class: 'lens-highlight' }, [this.tag]);\n this.hint = el('div', { class: 'lens-pick-chip' }, [\n el('span', { class: 'lens-pick-chip__label', text: 'Tap an element' }),\n el('button', {\n class: 'lens-pick-chip__btn',\n text: 'Cancel',\n on: { click: () => this.cancel() },\n }),\n ]);\n this.layer.append(this.highlight, this.hint);\n this.hide();\n }\n\n get isActive(): boolean {\n return this.active;\n }\n\n start(onPick: (elem: Element) => void, onCancel: () => void): void {\n if (this.active) return;\n this.active = true;\n this.onPick = onPick;\n this.onCancel = onCancel;\n this.current = null;\n this.hint.style.display = '';\n window.addEventListener('pointermove', this.onMove, true);\n window.addEventListener('pointerdown', this.onDown, true);\n window.addEventListener('pointerup', this.onUp, true);\n window.addEventListener('click', this.onClick, true);\n window.addEventListener('keydown', this.onKey, true);\n }\n\n stop(): void {\n if (!this.active) return;\n this.active = false;\n this.current = null;\n this.onPick = null;\n this.onCancel = null;\n this.hide();\n window.removeEventListener('pointermove', this.onMove, true);\n window.removeEventListener('pointerdown', this.onDown, true);\n window.removeEventListener('pointerup', this.onUp, true);\n window.removeEventListener('click', this.onClick, true);\n window.removeEventListener('keydown', this.onKey, true);\n }\n\n private cancel(): void {\n const cancel = this.onCancel;\n this.stop();\n cancel?.();\n }\n\n private hide(): void {\n this.highlight.style.display = 'none';\n this.hint.style.display = 'none';\n }\n\n private isOverlayEvent(e: Event): boolean {\n return e.composedPath().includes(this.rootHost);\n }\n\n private isCoarse(): boolean {\n return typeof window.matchMedia === 'function' && window.matchMedia('(pointer: coarse)').matches;\n }\n\n private elementAt(x: number, y: number): Element | null {\n const found = document.elementFromPoint(x, y);\n if (!found || found === this.rootHost) return null;\n return found;\n }\n\n private highlightElement(target: Element): void {\n this.current = target;\n const rect = target.getBoundingClientRect();\n Object.assign(this.highlight.style, {\n display: 'block',\n left: `${rect.left}px`,\n top: `${rect.top}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n });\n this.tag.textContent = describe(target);\n }\n\n private confirm(target: Element): void {\n const pick = this.onPick;\n // The browser dispatches `click` AFTER pointerup — by then stop() has\n // removed our click suppressor, so a picked link/button would fire its own\n // action. Swallow exactly one trailing click before handing over.\n this.suppressNextClick();\n this.stop();\n pick?.(target);\n }\n\n private suppressNextClick(): void {\n const swallow = (e: MouseEvent): void => {\n e.preventDefault();\n e.stopImmediatePropagation();\n cleanup();\n };\n const cleanup = (): void => {\n window.removeEventListener('click', swallow, true);\n clearTimeout(timer);\n };\n window.addEventListener('click', swallow, { capture: true });\n // Safety: if no click arrives (e.g. keyboard-driven pick), don't leak the\n // suppressor into the next real interaction.\n const timer = setTimeout(cleanup, 500);\n }\n\n private onMove = (e: PointerEvent): void => {\n if (this.isOverlayEvent(e)) return;\n // On coarse pointers there is no hover; highlight is driven by taps instead.\n if (this.isCoarse()) return;\n const target = this.elementAt(e.clientX, e.clientY);\n if (!target || target === this.current) return;\n this.highlightElement(target);\n };\n\n private onDown = (e: PointerEvent): void => {\n if (this.isOverlayEvent(e)) return;\n // Block the underlying page from reacting to the press.\n e.preventDefault();\n e.stopImmediatePropagation();\n };\n\n private onUp = (e: PointerEvent): void => {\n if (this.isOverlayEvent(e)) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n const target = this.elementAt(e.clientX, e.clientY);\n if (this.isCoarse()) {\n // Two-tap: first tap (or a tap on a different element) highlights; a\n // second tap on the same element confirms.\n if (target && target === this.current) {\n this.confirm(target);\n } else if (target) {\n this.highlightElement(target);\n }\n return;\n }\n const chosen = target ?? this.current;\n if (chosen) this.confirm(chosen);\n };\n\n private onClick = (e: MouseEvent): void => {\n if (this.isOverlayEvent(e)) return;\n // Swallow the synthetic click so links / buttons don't navigate.\n e.preventDefault();\n e.stopImmediatePropagation();\n };\n\n private onKey = (e: KeyboardEvent): void => {\n if (e.key !== 'Escape') return;\n e.preventDefault();\n e.stopPropagation();\n this.cancel();\n };\n}\n\nfunction describe(elem: Element): string {\n const tag = elem.tagName.toLowerCase();\n const id = elem.id ? `#${elem.id}` : '';\n const cls =\n typeof elem.className === 'string' && elem.className.trim()\n ? '.' + elem.className.trim().split(/\\s+/).slice(0, 2).join('.')\n : '';\n return `${tag}${id}${cls}`;\n}\n","/**\n * Overlay stylesheet, injected once into the shadow root. Scoped by `:host`\n * with `all: initial` so no host-page CSS can leak in and nothing here leaks\n * out. Dark, glassy pill; a light-aware panel that respects prefers-color-scheme;\n * an 8px radius/spacing grid and 150ms transitions throughout.\n */\nexport const OVERLAY_CSS = /* css */ `\n:host {\n all: initial;\n --lens-accent: #6366f1;\n --lens-accent-strong: #4f46e5;\n --lens-radius: 8px;\n --lens-font: system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n --lens-z: 2147483000;\n font-family: var(--lens-font);\n line-height: 1.4;\n}\n\n*, *::before, *::after { box-sizing: border-box; }\n\n.lens-layer {\n position: fixed;\n inset: 0;\n z-index: var(--lens-z);\n pointer-events: none;\n font-family: var(--lens-font);\n}\n.lens-layer > * { pointer-events: auto; }\n\n/* ---------------- Pill ---------------- */\n.lens-pill {\n position: fixed;\n bottom: calc(12px + env(safe-area-inset-bottom));\n left: 50%;\n transform: translateX(-50%);\n max-width: calc(100vw - 16px);\n flex-wrap: wrap;\n justify-content: center;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px;\n border-radius: 999px;\n background: rgba(20, 20, 23, 0.82);\n -webkit-backdrop-filter: blur(12px) saturate(180%);\n backdrop-filter: blur(12px) saturate(180%);\n border: 1px solid rgba(255, 255, 255, 0.12);\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.06);\n color: #f4f4f5;\n user-select: none;\n transition: opacity 150ms ease, transform 150ms ease;\n}\n.lens-pill__dot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n margin-left: 4px;\n border-radius: 999px;\n color: #a5b4fc;\n}\n.lens-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 30px;\n padding: 0 12px;\n border: 0;\n border-radius: 999px;\n background: transparent;\n color: #e4e4e7;\n font-family: var(--lens-font);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 150ms ease, color 150ms ease;\n}\n.lens-btn:hover { background: rgba(255, 255, 255, 0.1); }\n.lens-btn:focus-visible { outline: 2px solid var(--lens-accent); outline-offset: 1px; }\n.lens-btn--primary { background: var(--lens-accent); color: #fff; }\n.lens-btn--primary:hover { background: var(--lens-accent-strong); }\n.lens-btn--icon { width: 30px; padding: 0; justify-content: center; }\n.lens-btn--icon.is-active { background: var(--lens-accent); color: #fff; }\n.lens-pill__sep {\n width: 1px;\n height: 18px;\n background: rgba(255, 255, 255, 0.14);\n margin: 0 2px;\n}\n\n/* ---------------- Picker highlight ---------------- */\n.lens-highlight {\n position: fixed;\n z-index: calc(var(--lens-z) - 2);\n pointer-events: none;\n border: 2px solid var(--lens-accent);\n background: rgba(99, 102, 241, 0.14);\n border-radius: 3px;\n transition: all 60ms linear;\n display: none;\n}\n.lens-highlight__tag {\n position: absolute;\n top: -22px;\n left: -2px;\n padding: 1px 6px;\n border-radius: 4px;\n background: var(--lens-accent);\n color: #fff;\n font: 500 11px/1.5 var(--lens-font);\n white-space: nowrap;\n}\n.lens-hint {\n position: fixed;\n bottom: 64px;\n left: 50%;\n transform: translateX(-50%);\n padding: 6px 12px;\n border-radius: 999px;\n background: rgba(20, 20, 23, 0.9);\n color: #e4e4e7;\n font-size: 12px;\n font-weight: 500;\n border: 1px solid rgba(255, 255, 255, 0.12);\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);\n pointer-events: none;\n}\n\n/* ---------------- Annotation layer ---------------- */\n.lens-annotate {\n position: fixed;\n inset: 0;\n z-index: calc(var(--lens-z) - 1);\n cursor: crosshair;\n background: rgba(15, 15, 20, 0.04);\n touch-action: none;\n}\n.lens-rect {\n position: fixed;\n border: 2px solid var(--lens-accent);\n background: rgba(99, 102, 241, 0.1);\n border-radius: 3px;\n pointer-events: none;\n}\n\n/* ---------------- Panel ---------------- */\n.lens-panel {\n position: fixed;\n right: 20px;\n bottom: 64px;\n width: min(520px, calc(100vw - 40px));\n max-width: 520px;\n max-height: calc(100vh - 96px);\n display: flex;\n flex-direction: column;\n border-radius: 14px;\n background: #ffffff;\n color: #18181b;\n border: 1px solid rgba(0, 0, 0, 0.08);\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.22), 0 2px 8px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n transform-origin: bottom right;\n animation: lens-in 150ms ease;\n}\n@keyframes lens-in {\n from { opacity: 0; transform: translateY(6px) scale(0.98); }\n to { opacity: 1; transform: none; }\n}\n.lens-panel__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.07);\n}\n.lens-panel__title { font-size: 14px; font-weight: 600; }\n.lens-panel__x {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: #52525b;\n cursor: pointer;\n transition: background 150ms ease;\n}\n.lens-panel__x:hover { background: rgba(0, 0, 0, 0.06); }\n.lens-panel__body {\n padding: 14px 16px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.lens-textarea {\n width: 100%;\n min-height: 120px;\n resize: vertical;\n padding: 10px 12px;\n border-radius: var(--lens-radius);\n border: 1px solid rgba(0, 0, 0, 0.14);\n background: #fafafa;\n color: inherit;\n font-family: var(--lens-font);\n font-size: 13px;\n transition: border-color 150ms ease, box-shadow 150ms ease;\n}\n.lens-textarea:focus {\n outline: none;\n border-color: var(--lens-accent);\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.18);\n}\n/* ---- Context row: static, non-interactive page facts (muted, dot-joined) ---- */\n.lens-context {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n font-size: 11.5px;\n line-height: 1.4;\n color: #71717a;\n}\n.lens-context__item { white-space: nowrap; }\n.lens-context__dot { opacity: 0.55; }\n\n/* ---- Include row: real toggles (role=switch) for which data to attach ---- */\n.lens-includes {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n}\n.lens-includes__label {\n font-size: 11.5px;\n font-weight: 600;\n color: #71717a;\n margin-right: 2px;\n}\n.lens-tgl {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n border: 1px solid rgba(0, 0, 0, 0.14);\n background: #fafafa;\n color: #a1a1aa;\n font-family: var(--lens-font);\n font-size: 11.5px;\n font-weight: 600;\n white-space: nowrap;\n cursor: pointer;\n opacity: 0.75;\n transition: background 150ms ease, border-color 150ms ease, color 150ms ease, opacity 150ms ease;\n}\n.lens-tgl:hover { opacity: 1; }\n.lens-tgl:focus-visible { outline: 2px solid var(--lens-accent); outline-offset: 1px; }\n.lens-tgl__check { display: none; align-items: center; }\n.lens-tgl__check svg { width: 13px; height: 13px; }\n.lens-tgl__count { font-weight: 500; opacity: 0.75; font-variant-numeric: tabular-nums; }\n.lens-tgl.is-on {\n opacity: 1;\n color: var(--lens-accent-strong);\n border-color: rgba(99, 102, 241, 0.5);\n background: #eef2ff;\n}\n.lens-tgl.is-on .lens-tgl__check { display: inline-flex; }\n\n.lens-chips { display: flex; flex-wrap: wrap; gap: 6px; }\n.lens-chip {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n max-width: 100%;\n padding: 3px 9px;\n border-radius: 999px;\n background: #f4f4f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n color: #3f3f46;\n font-size: 11.5px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.lens-chip--ok { color: #15803d; background: #f0fdf4; border-color: rgba(21, 128, 61, 0.18); }\n.lens-chip--target {\n max-width: 100%;\n background: #eef2ff;\n border-color: rgba(99, 102, 241, 0.25);\n color: var(--lens-accent-strong);\n}\n.lens-chip__code {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.lens-chip__x {\n display: inline-flex;\n border: 0;\n background: transparent;\n color: inherit;\n cursor: pointer;\n padding: 0;\n opacity: 0.7;\n font-size: 13px;\n line-height: 1;\n}\n.lens-chip__x:hover { opacity: 1; }\n/* ---- Actions: secondary row (mark / record) then primary row (cancel / submit) ---- */\n.lens-actions { display: flex; flex-direction: column; gap: 8px; }\n.lens-actions__row { display: flex; align-items: center; gap: 8px; }\n/* Mark area / Record steps split the row evenly, one line, never wrap. */\n.lens-actions__secondary .lens-abtn { flex: 1; min-width: 0; justify-content: center; }\n/* Submit always fills remaining width; Cancel stays intrinsic. */\n.lens-actions__primary .lens-abtn--submit { flex: 1; }\n.lens-abtn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 34px;\n padding: 0 14px;\n border-radius: var(--lens-radius);\n border: 1px solid transparent;\n font-family: var(--lens-font);\n font-size: 13px;\n font-weight: 600;\n white-space: nowrap;\n cursor: pointer;\n transition: background 150ms ease, border-color 150ms ease, opacity 150ms ease;\n}\n.lens-abtn span { white-space: nowrap; }\n.lens-abtn--compact { padding: 0 10px; font-size: 12px; }\n.lens-abtn svg { flex: none; }\n.lens-abtn--ghost { background: transparent; border-color: rgba(0, 0, 0, 0.14); color: #3f3f46; }\n.lens-abtn--ghost:hover { background: rgba(0, 0, 0, 0.04); }\n.lens-abtn--primary { background: var(--lens-accent); color: #fff; }\n.lens-abtn--primary:hover { background: var(--lens-accent-strong); }\n.lens-abtn:disabled { opacity: 0.55; cursor: default; }\n.lens-abtn:focus-visible { outline: 2px solid var(--lens-accent); outline-offset: 1px; }\n\n.lens-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n padding: 26px 18px;\n text-align: center;\n}\n.lens-state__badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n border-radius: 999px;\n}\n.lens-state__badge--ok { background: #dcfce7; color: #16a34a; }\n.lens-state__badge--err { background: #fee2e2; color: #dc2626; }\n.lens-state__title { font-size: 14px; font-weight: 600; }\n.lens-state__msg { font-size: 12.5px; color: #52525b; }\n.lens-idpill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 10px;\n border-radius: 8px;\n background: #f4f4f5;\n border: 1px solid rgba(0, 0, 0, 0.08);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12px;\n}\n.lens-idpill button {\n border: 0;\n background: transparent;\n color: #52525b;\n cursor: pointer;\n display: inline-flex;\n padding: 2px;\n border-radius: 4px;\n}\n.lens-idpill button:hover { background: rgba(0, 0, 0, 0.06); color: #18181b; }\n\n@media (prefers-color-scheme: dark) {\n .lens-panel { background: #1c1c1f; color: #f4f4f5; border-color: rgba(255, 255, 255, 0.1); }\n .lens-panel__head { border-bottom-color: rgba(255, 255, 255, 0.08); }\n .lens-panel__x { color: #a1a1aa; }\n .lens-panel__x:hover { background: rgba(255, 255, 255, 0.08); }\n .lens-textarea { background: #26262a; border-color: rgba(255, 255, 255, 0.14); color: #f4f4f5; }\n .lens-context { color: #a1a1aa; }\n .lens-includes__label { color: #a1a1aa; }\n .lens-tgl { background: #26262a; border-color: rgba(255, 255, 255, 0.12); color: #a1a1aa; }\n .lens-tgl.is-on { background: rgba(99, 102, 241, 0.18); border-color: rgba(99, 102, 241, 0.55); color: #c7d2fe; }\n .lens-chip { background: #26262a; border-color: rgba(255, 255, 255, 0.08); color: #d4d4d8; }\n .lens-chip--ok { color: #4ade80; background: rgba(34, 197, 94, 0.12); border-color: rgba(74, 222, 128, 0.22); }\n .lens-chip--target { background: rgba(99, 102, 241, 0.16); color: #c7d2fe; }\n .lens-abtn--ghost { border-color: rgba(255, 255, 255, 0.16); color: #d4d4d8; }\n .lens-abtn--ghost:hover { background: rgba(255, 255, 255, 0.06); }\n .lens-state__msg { color: #a1a1aa; }\n .lens-idpill { background: #26262a; border-color: rgba(255, 255, 255, 0.1); }\n .lens-idpill button { color: #a1a1aa; }\n .lens-idpill button:hover { background: rgba(255, 255, 255, 0.08); color: #f4f4f5; }\n}\n\n/* ---------------- Floating action chips (picker / annotator) ---------------- */\n.lens-pick-chip, .lens-annotate-chips {\n position: fixed;\n top: calc(16px + env(safe-area-inset-top));\n left: 50%;\n transform: translateX(-50%);\n z-index: var(--lens-z);\n display: inline-flex;\n align-items: center;\n gap: 10px;\n max-width: calc(100vw - 24px);\n padding: 6px 6px 6px 14px;\n border-radius: 999px;\n background: rgba(20, 20, 23, 0.92);\n -webkit-backdrop-filter: blur(12px) saturate(180%);\n backdrop-filter: blur(12px) saturate(180%);\n border: 1px solid rgba(255, 255, 255, 0.12);\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35);\n color: #f4f4f5;\n font-size: 13px;\n font-weight: 500;\n}\n.lens-annotate-chips { z-index: var(--lens-z); }\n\n/* Stacking inside the shadow layer: the panel, pill and floating chips always\n sit above the annotation layer/rects and picker highlight, so marked areas\n never paint over interactive UI. */\n.lens-panel, .lens-pill, .lens-recchip { z-index: var(--lens-z); }\n.lens-pick-chip__label, .lens-annotate-chips__label { white-space: nowrap; }\n.lens-pick-chip__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: 30px;\n padding: 0 14px;\n border: 0;\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.12);\n color: #f4f4f5;\n font-family: var(--lens-font);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: background 150ms ease;\n}\n.lens-pick-chip__btn:hover { background: rgba(255, 255, 255, 0.2); }\n.lens-pick-chip__btn--primary { background: var(--lens-accent); }\n.lens-pick-chip__btn--primary:hover { background: var(--lens-accent-strong); }\n\n/* ---------------- Recording chip ---------------- */\n.lens-rec-chip {\n position: fixed;\n top: calc(16px + env(safe-area-inset-top));\n left: 50%;\n transform: translateX(-50%);\n z-index: var(--lens-z);\n display: inline-flex;\n align-items: center;\n gap: 10px;\n max-width: calc(100vw - 24px);\n padding: 6px 6px 6px 14px;\n border-radius: 999px;\n background: rgba(20, 20, 23, 0.92);\n -webkit-backdrop-filter: blur(12px) saturate(180%);\n backdrop-filter: blur(12px) saturate(180%);\n border: 1px solid rgba(239, 68, 68, 0.4);\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35);\n color: #f4f4f5;\n font-size: 13px;\n font-weight: 600;\n}\n.lens-rec-chip__dot {\n width: 10px;\n height: 10px;\n border-radius: 999px;\n background: #ef4444;\n animation: lens-pulse 1.2s ease-in-out infinite;\n}\n@keyframes lens-pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.4; transform: scale(0.7); }\n}\n.lens-rec-chip__time { font-variant-numeric: tabular-nums; min-width: 34px; }\n.lens-rec-chip__stop {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 30px;\n padding: 0 14px;\n border: 0;\n border-radius: 999px;\n background: #ef4444;\n color: #fff;\n font-family: var(--lens-font);\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: background 150ms ease;\n}\n.lens-rec-chip__stop:hover { background: #dc2626; }\n.lens-chip--rec { gap: 6px; }\n\n/* ---------------- Coarse pointers (touch): ≥44px targets ---------------- */\n@media (pointer: coarse) {\n .lens-btn { height: 44px; padding: 0 16px; }\n .lens-btn--icon { width: 44px; }\n .lens-pill__dot { width: 40px; height: 40px; }\n .lens-abtn { height: 44px; }\n .lens-tgl { min-height: 40px; padding: 4px 14px; }\n .lens-panel__x { width: 44px; height: 44px; }\n .lens-chip__x { min-width: 32px; min-height: 32px; align-items: center; justify-content: center; }\n .lens-pick-chip__btn, .lens-rec-chip__stop { height: 40px; padding: 0 18px; }\n}\n\n/* ---------------- Bottom sheet under 640px ---------------- */\n@media (max-width: 640px) {\n .lens-panel {\n left: 0;\n right: 0;\n bottom: 0;\n width: 100%;\n max-width: 100%;\n max-height: 85dvh;\n border-radius: 16px 16px 0 0;\n overflow-y: auto;\n padding-bottom: env(safe-area-inset-bottom);\n animation: lens-sheet-in 180ms ease;\n }\n @keyframes lens-sheet-in {\n from { opacity: 0; transform: translateY(16px); }\n to { opacity: 1; transform: none; }\n }\n .lens-textarea { font-size: 16px; }\n}\n`;\n","import type { Annotation, TargetElement } from '@horus-lens/shared';\nimport { Annotator } from './annotator.js';\nimport { el } from './dom.js';\nimport { iconClose, iconCrosshair, iconEye, iconStop } from './icons.js';\nimport { formatDuration, Panel } from './panel.js';\nimport { ElementPicker } from './picker.js';\nimport { OVERLAY_CSS } from './styles.js';\nimport type { OverlayDeps, SubmitReportIncludes } from './types.js';\n\nimport { LENS_OVERLAY_HOST_ID } from '@horus-lens/core';\n\n/** Canonical host id — the core recorder/screenshot exclusions key off it. */\nexport const ROOT_ID = LENS_OVERLAY_HOST_ID;\n\n/** Auto-stop a manual recording at this ceiling (mirrors the core hard cap). */\nconst RECORDING_MAX_MS = 120000;\n\nexport interface OverlayHandle {\n open(): void;\n close(): void;\n destroy(): void;\n}\n\n/**\n * Root overlay controller. Owns the Shadow DOM host, the floating pill, and the\n * three interaction surfaces (element picker, annotator, report panel). Pure\n * DOM — no framework — so it can be dropped into any page.\n */\nclass Overlay implements OverlayHandle {\n private host: HTMLElement;\n private shadow: ShadowRoot;\n private layer: HTMLElement;\n private pickBtn!: HTMLButtonElement;\n private picker: ElementPicker;\n private annotator: Annotator;\n private panel: Panel | null = null;\n private target: TargetElement | null = null;\n private destroyed = false;\n\n private recordingChip: HTMLElement | null = null;\n private recordingTimerEl: HTMLElement | null = null;\n private recordingInterval: ReturnType<typeof setInterval> | null = null;\n private recordingStartTs = 0;\n /** Duration of a retained (stopped, not yet submitted/discarded) recording. */\n private recordedDurationMs: number | null = null;\n\n constructor(private readonly deps: OverlayDeps) {\n this.host = el('div', { attrs: { id: ROOT_ID } });\n this.shadow = this.host.attachShadow({ mode: 'open' });\n\n const style = document.createElement('style');\n style.textContent = OVERLAY_CSS;\n this.shadow.append(style);\n\n this.layer = el('div', { class: 'lens-layer' });\n this.shadow.append(this.layer);\n\n this.picker = new ElementPicker(this.layer, this.host);\n this.annotator = new Annotator(this.layer);\n\n this.layer.append(this.buildPill());\n document.documentElement.append(this.host);\n\n window.addEventListener('keydown', this.onGlobalKey, true);\n }\n\n private buildPill(): HTMLElement {\n this.pickBtn = el('button', {\n class: 'lens-btn lens-btn--icon',\n ariaLabel: 'Pick an element',\n title: 'Pick an element',\n html: iconCrosshair,\n on: { click: () => this.togglePicker() },\n });\n return el('div', { class: 'lens-pill', attrs: { role: 'toolbar', 'aria-label': 'Lens' } }, [\n el('span', { class: 'lens-pill__dot', html: iconEye }),\n el('button', {\n class: 'lens-btn',\n text: 'Report issue',\n on: { click: () => this.open() },\n }),\n this.pickBtn,\n el('span', { class: 'lens-pill__sep' }),\n el('button', {\n class: 'lens-btn lens-btn--icon',\n ariaLabel: 'Close Lens',\n title: 'Close Lens',\n html: iconClose,\n on: { click: () => this.dismiss() },\n }),\n ]);\n }\n\n open(): void {\n if (this.destroyed) return;\n this.stopPicker();\n if (!this.panel) {\n this.panel = new Panel({\n getStats: () => this.deps.snapshotStats(),\n getTarget: () => this.target,\n getAnnotationCount: () => this.annotator.count,\n getRecording: () =>\n this.recordedDurationMs !== null ? { durationMs: this.recordedDurationMs } : null,\n onRemoveTarget: () => {\n this.target = null;\n this.panel?.refresh();\n },\n onMarkArea: () => this.startAnnotating(),\n onRecordSteps: () => this.startRecording(),\n onDiscardRecording: () => this.discardRecording(),\n onClose: () => this.close(),\n onSubmit: (comment, include) => this.submit(comment, include),\n });\n this.layer.append(this.panel.root);\n }\n this.panel.root.style.display = '';\n this.panel.refresh();\n this.panel.focus();\n }\n\n close(): void {\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n private toggle(): void {\n if (this.panel && this.panel.root.style.display !== 'none') this.close();\n else this.open();\n }\n\n private togglePicker(): void {\n if (this.picker.isActive) {\n this.stopPicker();\n return;\n }\n this.close();\n this.pickBtn.classList.add('is-active');\n this.picker.start(\n (elem) => {\n this.pickBtn.classList.remove('is-active');\n this.target = this.deps.client.captureTarget(elem);\n this.open();\n },\n () => this.pickBtn.classList.remove('is-active'),\n );\n }\n\n private stopPicker(): void {\n if (this.picker.isActive) this.picker.stop();\n this.pickBtn.classList.remove('is-active');\n }\n\n private startAnnotating(): void {\n if (this.panel) this.panel.root.style.display = 'none';\n this.annotator.start(() => {\n if (this.panel) {\n this.panel.root.style.display = '';\n this.panel.refresh();\n }\n });\n }\n\n private startRecording(): void {\n if (this.deps.client.isRecording()) return;\n // A fresh recording supersedes any retained one.\n this.recordedDurationMs = null;\n this.deps.client.startRecording();\n this.recordingStartTs = Date.now();\n if (this.panel) this.panel.root.style.display = 'none';\n this.showRecordingChip();\n }\n\n private stopRecording(): void {\n const result = this.deps.client.stopRecording();\n this.recordedDurationMs = result?.durationMs ?? Date.now() - this.recordingStartTs;\n this.hideRecordingChip();\n // Reopen the panel; the retained recording surfaces as a context chip.\n if (this.panel) {\n this.panel.root.style.display = '';\n this.panel.refresh();\n } else {\n this.open();\n }\n }\n\n private discardRecording(): void {\n this.deps.client.discardRecording();\n this.recordedDurationMs = null;\n this.panel?.refresh();\n }\n\n private showRecordingChip(): void {\n this.recordingTimerEl = el('span', { class: 'lens-rec-chip__time', text: '0:00' });\n this.recordingChip = el('div', { class: 'lens-rec-chip' }, [\n el('span', { class: 'lens-rec-chip__dot' }),\n el('span', { class: 'lens-rec-chip__label', text: 'Recording' }),\n this.recordingTimerEl,\n el('button', {\n class: 'lens-rec-chip__stop',\n html: iconStop + '<span>Stop</span>',\n on: { click: () => this.stopRecording() },\n }),\n ]);\n this.layer.append(this.recordingChip);\n this.recordingInterval = setInterval(() => this.tickRecording(), 250);\n }\n\n private tickRecording(): void {\n const elapsed = Date.now() - this.recordingStartTs;\n if (this.recordingTimerEl) this.recordingTimerEl.textContent = formatDuration(elapsed);\n if (elapsed >= RECORDING_MAX_MS) this.stopRecording();\n }\n\n private hideRecordingChip(): void {\n if (this.recordingInterval) {\n clearInterval(this.recordingInterval);\n this.recordingInterval = null;\n }\n if (this.recordingChip) {\n this.recordingChip.remove();\n this.recordingChip = null;\n }\n this.recordingTimerEl = null;\n }\n\n private async submit(\n comment: string,\n include: SubmitReportIncludes,\n ): Promise<{ reportId: string }> {\n const annotations: Annotation[] = this.annotator.list();\n const result = await this.deps.client.submitReport({\n comment: comment || undefined,\n annotations,\n target: this.target ?? undefined,\n excludeFromScreenshot: this.host,\n include,\n });\n // Reset transient capture state after a successful submission.\n this.target = null;\n this.annotator.clear();\n this.recordedDurationMs = null;\n this.deps.client.discardRecording();\n return result;\n }\n\n private dismiss(): void {\n this.deps.onDismiss();\n this.destroy();\n }\n\n private onGlobalKey = (e: KeyboardEvent): void => {\n // Cmd/Ctrl+Shift+L toggles the panel.\n if ((e.metaKey || e.ctrlKey) && e.shiftKey && (e.key === 'l' || e.key === 'L')) {\n e.preventDefault();\n this.toggle();\n }\n };\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n window.removeEventListener('keydown', this.onGlobalKey, true);\n this.stopPicker();\n if (this.deps.client.isRecording()) this.deps.client.stopRecording();\n this.hideRecordingChip();\n if (this.annotator.isActive) this.annotator.exit();\n this.annotator.clear();\n this.close();\n this.host.remove();\n }\n}\n\nexport function mountOverlay(deps: OverlayDeps): OverlayHandle {\n return new Overlay(deps);\n}\n","import type { AppContext } from '@horus-lens/shared';\nimport type { LensBrowser } from './index.js';\n\n/**\n * GTM-style command stub. The loader snippet defines:\n * window.Lens = function(){(window.Lens.q = window.Lens.q||[]).push(arguments)}\n * so pages can call `Lens('init', ...)`, `Lens('identify', user)` etc. before\n * the bundle downloads. On load we drain that queue, then replace the global\n * with a live dispatcher that forwards subsequent calls to the running client.\n */\n\nexport type LensCommand = 'init' | 'identify' | 'app' | 'open';\n\nexport interface LensGlobal {\n (...args: unknown[]): void;\n q?: Array<ArrayLike<unknown>>;\n}\n\ndeclare global {\n interface Window {\n Lens?: LensGlobal;\n }\n}\n\n/** Structured result of replaying the pre-boot command queue. */\nexport interface QueuedCommands {\n /** `init` argument: an access id string or a partial config object. */\n init?: string | Record<string, unknown>;\n identify?: NonNullable<AppContext['user']>;\n app?: Partial<AppContext>;\n open: boolean;\n}\n\n/** Drain `window.Lens.q` into a structured shape consumed by boot(). */\nexport function processQueue(): QueuedCommands {\n const result: QueuedCommands = { open: false };\n if (typeof window === 'undefined') return result;\n\n const queue = window.Lens?.q;\n if (!queue) return result;\n\n for (const entry of queue) {\n const args = Array.from(entry as ArrayLike<unknown>);\n const command = args[0] as LensCommand | undefined;\n const payload = args[1];\n switch (command) {\n case 'init':\n if (typeof payload === 'string' || (payload && typeof payload === 'object')) {\n result.init = payload as string | Record<string, unknown>;\n }\n break;\n case 'identify':\n if (payload && typeof payload === 'object') {\n result.identify = payload as NonNullable<AppContext['user']>;\n }\n break;\n case 'app':\n if (payload && typeof payload === 'object') {\n result.app = payload as Partial<AppContext>;\n }\n break;\n case 'open':\n result.open = true;\n break;\n }\n }\n\n // Clear so a freshly installed live dispatcher never re-processes them.\n if (window.Lens) window.Lens.q = [];\n return result;\n}\n\n/**\n * Replace `window.Lens` with a live function that forwards commands to the\n * mounted overlay. Safe to call with `null` (gate inactive) — it installs a\n * no-op-ish dispatcher that only handles future `init`-less commands.\n */\nexport function installGlobal(browser: LensBrowser | null): void {\n if (typeof window === 'undefined') return;\n\n const dispatch: LensGlobal = (...args: unknown[]): void => {\n if (!browser) return;\n const command = args[0] as LensCommand | undefined;\n const payload = args[1];\n switch (command) {\n case 'identify':\n if (payload && typeof payload === 'object') {\n browser.client.setApp({ user: payload as NonNullable<AppContext['user']> });\n }\n break;\n case 'app':\n if (payload && typeof payload === 'object') {\n browser.client.setApp(payload as Partial<AppContext>);\n }\n break;\n case 'open':\n browser.open();\n break;\n case 'init':\n // Already booted — ignore duplicate init calls.\n break;\n }\n };\n\n window.Lens = dispatch;\n}\n\n/** Apply queued identify / app context to a started client. */\nexport function applyContext(browser: LensBrowser, commands: QueuedCommands): void {\n if (commands.identify) browser.client.setApp({ user: commands.identify });\n if (commands.app) browser.client.setApp(commands.app);\n if (commands.open) browser.open();\n}\n","/**\n * The documented loader snippet — a GTM-style inline stub that queues commands\n * until the async bundle loads and replays them. Ship this in docs / install\n * flows so a page can call `Lens('init', ...)` before the SDK is downloaded.\n */\n\nexport interface SnippetOptions {\n accessId: string;\n /** URL of the browser bundle (defaults to the public CDN latest build). */\n cdnUrl?: string;\n}\n\nexport const DEFAULT_CDN_URL = 'https://cdn.lens.dev/browser.js';\n\nexport function loaderSnippet(options: SnippetOptions): string {\n const cdn = options.cdnUrl ?? DEFAULT_CDN_URL;\n return `<script>\n(function(w,d,s,u,i){\n w.Lens=w.Lens||function(){(w.Lens.q=w.Lens.q||[]).push(arguments)};\n w.Lens('init', i);\n var g=d.createElement(s); g.async=1; g.src=u;\n var f=d.getElementsByTagName(s)[0]; f.parentNode.insertBefore(g,f);\n})(window,document,'script','${cdn}','${options.accessId}');\n</script>`;\n}\n\n/** Example snippet string for documentation (placeholder access id + CDN). */\nexport const LOADER_SNIPPET = loaderSnippet({ accessId: 'lai_YOUR_ACCESS_ID' });\n"],"mappings":";;;;;;ACUO,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AAIhC,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAE3B,IAAM,SAAS,oBAAI,IAAI,CAAC,IAAI,QAAQ,KAAK,MAAM,KAAK,CAAC;AACrD,IAAM,QAAQ,oBAAI,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,CAAC;AAEjD,SAAS,YAAqB;AAC5B,SAAO,OAAO,WAAW,eAAe,OAAO,aAAa;AAC9D;AAEA,SAAS,UAAU,WAAkC;AACnD,MAAI;AACF,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAEzD,UAAM,QAAQ,OAAO,IAAI,SAAS;AAClC,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,cAAc,mBAAoB,QAAO,OAAO,IAAI,iBAAiB;AACzE,WAAO;EACT,QAAQ;AACN,WAAO;EACT;AACF;AAEA,SAAS,cAAuB;AAC9B,MAAI;AACF,UAAM,IAAI,OAAO;AAEjB,WAAO,EAAE,QAAQ,gBAAgB,MAAM,OAAO,EAAE,QAAQ,kBAAkB,MAAM;EAClF,QAAQ;AACN,WAAO;EACT;AACF;AAEA,SAAS,aAAa,QAAuB;AAC3C,MAAI;AACF,QAAI,OAAQ,QAAO,eAAe,QAAQ,kBAAkB,GAAG;QAC1D,QAAO,eAAe,WAAW,gBAAgB;EACxD,QAAQ;EAER;AACF;AAMO,SAAS,aAAa,YAAoB,oBAA6B;AAC5E,MAAI,CAAC,UAAU,EAAG,QAAO;AAEzB,QAAM,MAAM,UAAU,SAAS;AAC/B,MAAI,QAAQ,MAAM;AAChB,UAAM,QAAQ,IAAI,KAAK,EAAE,YAAY;AACrC,QAAI,MAAM,IAAI,KAAK,GAAG;AACpB,mBAAa,KAAK;AAClB,aAAO;IACT;AACA,QAAI,OAAO,IAAI,KAAK,GAAG;AACrB,mBAAa,IAAI;AACjB,aAAO;IACT;EAEF;AAEA,SAAO,YAAY;AACrB;AAGO,SAAS,aAAa,YAAoB,oBAA6B;AAC5E,MAAI,CAAC,UAAU,EAAG,QAAO;AAEzB,QAAM,MAAM,UAAU,SAAS;AAC/B,MAAI,QAAQ,MAAM;AAChB,UAAM,QAAQ,IAAI,KAAK,EAAE,YAAY;AACrC,QAAI,MAAM,IAAI,KAAK,EAAG,QAAO;AAC7B,QAAI,OAAO,IAAI,KAAK,EAAG,QAAO;EAChC;AACA,SAAO,YAAY;AACrB;AAGO,SAAS,YAAkB;AAChC,MAAI,CAAC,UAAU,EAAG;AAClB,eAAa,KAAK;AACpB;AC5FO,SAAS,cAAc,KAAa,UAAU,WAAmB;AACtE,MAAI,QAAQ,KAAK,EAAE,EAAG,QAAO;AAC7B,MAAI,cAAc,KAAK,EAAE,EAAG,QAAO;AACnC,MAAI,YAAY,KAAK,EAAE,EAAG,QAAO;AACjC,MAAI,WAAW,KAAK,EAAE,KAAK,CAAC,WAAW,KAAK,EAAE,EAAG,QAAO;AACxD,MAAI,aAAa,KAAK,EAAE,EAAG,QAAO;AAClC,MAAI,WAAW,KAAK,EAAE,KAAK,YAAY,KAAK,EAAE,EAAG,QAAO;AACxD,SAAO;AACT;AAEO,SAAS,SAAS,KAAa,UAAU,WAAmB;AACjE,MAAI,aAAa,KAAK,EAAE,EAAG,QAAO;AAClC,MAAI,qBAAqB,KAAK,EAAE,EAAG,QAAO;AAC1C,MAAI,UAAU,KAAK,EAAE,EAAG,QAAO;AAC/B,MAAI,mBAAmB,KAAK,EAAE,EAAG,QAAO;AACxC,MAAI,QAAQ,KAAK,EAAE,EAAG,QAAO;AAC7B,SAAO;AACT;AAEO,SAAS,WAA8C;AAC5D,SAAO;IACL,OAAO,OAAO,cAAc,SAAS,gBAAgB,eAAe;IACpE,QAAQ,OAAO,eAAe,SAAS,gBAAgB,gBAAgB;EACzE;AACF;AAEO,SAAS,eAAuB;AACrC,UAAQ,OAAO,SAAS,YAAY,QAAQ,OAAO,SAAS,UAAU;AACxE;ACjBO,SAAS,GACd,KACA,QAAiB,CAAC,GAClB,WAAoB,CAAC,GACK;AAC1B,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,MAAI,MAAM,MAAO,MAAK,YAAY,MAAM;AACxC,MAAI,MAAM,SAAS,OAAW,MAAK,cAAc,MAAM;AACvD,MAAI,MAAM,SAAS,OAAW,MAAK,YAAY,MAAM;AACrD,MAAI,MAAM,MAAO,MAAK,QAAQ,MAAM;AACpC,MAAI,MAAM,UAAW,MAAK,aAAa,cAAc,MAAM,SAAS;AACpE,MAAI,MAAM,QAAQ,UAAU,KAAO,MAAqC,OAAO,MAAM;AACrF,MAAI,MAAM,eAAe,iBAAiB,MAAM;AAC7C,SAA4C,cAAc,MAAM;EACnE;AACA,MAAI,MAAM,OAAO;AACf,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,KAAK,EAAG,MAAK,aAAa,GAAG,CAAC;EAC1E;AACA,MAAI,MAAM,MAAO,QAAO,OAAO,KAAK,OAAO,MAAM,KAAK;AACtD,MAAI,MAAM,IAAI;AACZ,eAAW,CAAC,OAAO,OAAO,KAAK,OAAO,QAAQ,MAAM,EAAE,GAAG;AACvD,UAAI,QAAS,MAAK,iBAAiB,OAAO,OAAwB;IACpE;EACF;AACA,aAAW,SAAS,UAAU;AAC5B,QAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,MAAO;AAC9D,SAAK,OAAO,KAAK;EACnB;AACA,SAAO;AACT;AAEO,SAAS,MAAM,MAAkB;AACtC,SAAO,KAAK,WAAY,MAAK,YAAY,KAAK,UAAU;AAC1D;ACrCO,IAAM,YAAN,MAAgB;EAarB,YAA6B,MAAmB;AAAnB,SAAA,OAAA;EAAoB;EAApB;EAZrB,QAA4B;EAC5B,QAA4B;EAC5B,QAA4B;EAC5B,SAAS;EACT,SAAS;EACT,SAAS;EACT,WAAW;EACX,cAA4B,CAAC;EAC7B,gBAA+B,CAAC;EAChC,cAAc;EACd,SAA8B;EAItC,IAAI,WAAoB;AACtB,WAAO,KAAK;EACd;EAEA,IAAI,QAAgB;AAClB,WAAO,KAAK,YAAY;EAC1B;EAEA,OAAqB;AACnB,WAAO,KAAK,YAAY,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;EAC5E;EAEA,QAAc;AACZ,SAAK,cAAc,CAAC;AACpB,eAAW,QAAQ,KAAK,cAAe,MAAK,OAAO;AACnD,SAAK,gBAAgB,CAAC;EACxB;EAEA,MAAM,QAA0B;AAC9B,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,cAAc,KAAK,YAAY;AAEpC,SAAK,QAAQ,GAAG,OAAO,EAAE,OAAO,gBAAgB,CAAC;AACjD,SAAK,MAAM,iBAAiB,eAAe,KAAK,MAAM;AAEtD,SAAK,QAAQ,GAAG,OAAO,EAAE,OAAO,sBAAsB,GAAG;MACvD,GAAG,QAAQ,EAAE,OAAO,8BAA8B,MAAM,uBAAuB,CAAC;MAChF,GAAG,UAAU;QACX,OAAO;QACP,MAAM;QACN,IAAI,EAAE,OAAO,MAAM,KAAK,OAAO,EAAE;MACnC,CAAC;MACD,GAAG,UAAU;QACX,OAAO;QACP,MAAM;QACN,IAAI,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE;MACjC,CAAC;IACH,CAAC;AAED,SAAK,KAAK,OAAO,KAAK,OAAO,KAAK,KAAK;AACvC,WAAO,iBAAiB,WAAW,KAAK,OAAO,IAAI;EACrD;;EAGQ,SAAe;AACrB,UAAM,UAAU,KAAK,cAAc,OAAO,KAAK,WAAW;AAC1D,eAAW,QAAQ,QAAS,MAAK,OAAO;AACxC,SAAK,YAAY,OAAO,KAAK,WAAW;AACxC,SAAK,KAAK;EACZ;EAEA,OAAa;AACX,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,WAAO,oBAAoB,WAAW,KAAK,OAAO,IAAI;AACtD,WAAO,oBAAoB,eAAe,KAAK,QAAQ,IAAI;AAC3D,WAAO,oBAAoB,aAAa,KAAK,MAAM,IAAI;AACvD,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,OAAO;AAClB,WAAK,QAAQ;IACf;AACA,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,oBAAoB,eAAe,KAAK,MAAM;AACzD,WAAK,MAAM,OAAO;AAClB,WAAK,QAAQ;IACf;AACA,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,OAAO;AAClB,WAAK,QAAQ;IACf;AACA,UAAM,OAAO,KAAK;AAClB,SAAK,SAAS;AACd,WAAO;EACT;EAEQ,SAAS,CAAC,MAA0B;AAC1C,MAAE,eAAe;AACjB,SAAK,WAAW;AAChB,SAAK,SAAS,EAAE;AAChB,SAAK,SAAS,EAAE;AAChB,SAAK,QAAQ,GAAG,OAAO,EAAE,OAAO,YAAY,CAAC;AAC7C,SAAK,KAAK,OAAO,KAAK,KAAK;AAC3B,SAAK,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,OAAO;AAC9C,WAAO,iBAAiB,eAAe,KAAK,QAAQ,IAAI;AACxD,WAAO,iBAAiB,aAAa,KAAK,MAAM,IAAI;EACtD;EAEQ,SAAS,CAAC,MAA0B;AAC1C,QAAI,KAAK,YAAY,KAAK,MAAO,MAAK,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,OAAO;EACjF;EAEQ,OAAO,CAAC,MAA0B;AACxC,WAAO,oBAAoB,eAAe,KAAK,QAAQ,IAAI;AAC3D,WAAO,oBAAoB,aAAa,KAAK,MAAM,IAAI;AACvD,SAAK,WAAW;AAChB,UAAM,IAAI,KAAK,IAAI,KAAK,QAAQ,EAAE,OAAO;AACzC,UAAM,IAAI,KAAK,IAAI,KAAK,QAAQ,EAAE,OAAO;AACzC,UAAM,QAAQ,KAAK,IAAI,EAAE,UAAU,KAAK,MAAM;AAC9C,UAAM,SAAS,KAAK,IAAI,EAAE,UAAU,KAAK,MAAM;AAC/C,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,OAAO;AAClB,WAAK,QAAQ;IACf;AAEA,QAAI,QAAQ,KAAK,SAAS,EAAG;AAC7B,UAAM,OAAO,GAAG,OAAO,EAAE,OAAO,YAAY,CAAC;AAC7C,WAAO,OAAO,KAAK,OAAO;MACxB,MAAM,GAAG,CAAC;MACV,KAAK,GAAG,CAAC;MACT,OAAO,GAAG,KAAK;MACf,QAAQ,GAAG,MAAM;IACnB,CAAC;AACD,SAAK,KAAK,OAAO,IAAI;AACrB,SAAK,cAAc,KAAK,IAAI;AAC5B,SAAK,YAAY,KAAK;MACpB,MAAM;MACN;MACA;MACA;MACA;MACA,UAAU,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,YAAY;IACnE,CAAC;EACH;EAEQ,SAAS,MAAmB,MAAc,MAAoB;AACpE,UAAM,IAAI,KAAK,IAAI,KAAK,QAAQ,IAAI;AACpC,UAAM,IAAI,KAAK,IAAI,KAAK,QAAQ,IAAI;AACpC,WAAO,OAAO,KAAK,OAAO;MACxB,MAAM,GAAG,CAAC;MACV,KAAK,GAAG,CAAC;MACT,OAAO,GAAG,KAAK,IAAI,OAAO,KAAK,MAAM,CAAC;MACtC,QAAQ,GAAG,KAAK,IAAI,OAAO,KAAK,MAAM,CAAC;IACzC,CAAC;EACH;EAEQ,QAAQ,CAAC,MAA2B;AAC1C,QAAI,EAAE,QAAQ,SAAU;AACxB,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,SAAK,KAAK;EACZ;AACF;AC1KA,IAAM,MAAM,CAAC,UACX,wKAAwK,KAAK;AAExK,IAAM,UAAU;EACrB;AACF;AAEO,IAAM,gBAAgB;EAC3B;AACF;AAEO,IAAM,YAAY,IAAI,4EAA4E;AAElG,IAAM,WAAW;EACtB;AACF;AAEO,IAAM,WAAW;EACtB;AACF;AAEO,IAAM,YAAY,IAAI,qCAAqC;AAE3D,IAAM,WAAW,IAAI,qFAAqF;AAG1G,IAAM,aAAa;AAGnB,IAAM,WAAW;ACXxB,IAAM,gBAAmE;EACvE,EAAE,KAAK,UAAU,OAAO,SAAS;EACjC,EAAE,KAAK,WAAW,OAAO,UAAU;EACnC,EAAE,KAAK,WAAW,OAAO,UAAU;EACnC,EAAE,KAAK,UAAU,OAAO,SAAS;EACjC,EAAE,KAAK,cAAc,OAAO,aAAa;AAC3C;AAGO,IAAM,QAAN,MAAY;EAgBjB,YAA6B,IAAoB;AAApB,SAAA,KAAA;AAC3B,SAAK,OAAO,GAAG,OAAO,EAAE,OAAO,mBAAmB,CAAC;AACnD,SAAK,OAAO,GAAG,OAAO,EAAE,OAAO,cAAc,OAAO,EAAE,MAAM,UAAU,cAAc,kBAAkB,EAAE,GAAG;MACzG,GAAG,OAAO,EAAE,OAAO,mBAAmB,GAAG;QACvC,GAAG,OAAO,EAAE,OAAO,qBAAqB,MAAM,kBAAkB,CAAC;QACjE,GAAG,UAAU;UACX,OAAO;UACP,WAAW;UACX,MAAM;UACN,IAAI,EAAE,OAAO,MAAM,KAAK,GAAG,QAAQ,EAAE;QACvC,CAAC;MACH,CAAC;MACD,KAAK;IACP,CAAC;AACD,SAAK,WAAW;EAClB;EAf6B;EAfpB;EACD;EACA;EACA;EACA,iBAAuD;EACvD,aAAa;;EAEJ,UAAwB;IACvC,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,YAAY;EACd;;EAoBA,UAAgB;AACd,QAAI,CAAC,KAAK,WAAY,MAAK,WAAW;EACxC;EAEA,QAAc;AACZ,SAAK,UAAU,MAAM;EACvB;EAEA,UAAgB;AACd,QAAI,KAAK,eAAgB,cAAa,KAAK,cAAc;AACzD,SAAK,KAAK,OAAO;EACnB;EAEQ,aAAmB;AACzB,UAAM,QAAQ,KAAK,UAAU,SAAS;AACtC,UAAM,KAAK,IAAI;AAEf,SAAK,WAAW,GAAG,YAAY;MAC7B,OAAO;MACP,aAAa;MACb,WAAW;IACb,CAAC;AACD,SAAK,SAAS,QAAQ;AAEtB,SAAK,KAAK;MACR,KAAK;MACL,KAAK,aAAa;MAClB,KAAK,cAAc;MACnB,KAAK,WAAW;MAChB,KAAK,aAAa;IACpB;EACF;;EAGQ,eAA4B;AAClC,UAAM,IAAI,KAAK,GAAG,SAAS;AAC3B,UAAM,QAAQ;MACZ,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE;MAC7B,GAAG,EAAE,OAAO,SAAM,EAAE,EAAE;MACtB,GAAG,EAAE,SAAS,KAAK,OAAI,EAAE,SAAS,MAAM;IAC1C;AACA,UAAM,QAAkC,CAAC;AACzC,UAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,UAAI,IAAI,EAAG,OAAM,KAAK,GAAG,QAAQ,EAAE,OAAO,qBAAqB,MAAM,OAAI,CAAC,CAAC;AAC3E,YAAM,KAAK,GAAG,QAAQ,EAAE,OAAO,sBAAsB,MAAM,KAAK,CAAC,CAAC;IACpE,CAAC;AACD,WAAO,GAAG,OAAO,EAAE,OAAO,gBAAgB,OAAO,EAAE,IAAI,GAAG,KAAK;EACjE;;EAGQ,gBAA6B;AACnC,UAAM,IAAI,KAAK,GAAG,SAAS;AAC3B,UAAM,SAAqD;MACzD,SAAS,EAAE;MACX,SAAS,EAAE;MACX,QAAQ,EAAE;IACZ;AACA,UAAM,UAAU,cAAc,IAAI,CAAC,SAAS,KAAK,YAAY,KAAK,KAAK,KAAK,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC;AACpG,WAAO,GAAG,OAAO,EAAE,OAAO,gBAAgB,GAAG;MAC3C,GAAG,QAAQ,EAAE,OAAO,wBAAwB,MAAM,WAAW,CAAC;MAC9D,GAAG;IACL,CAAC;EACH;EAEQ,YAAY,KAAiB,OAAe,OAA0C;AAC5F,UAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,UAAM,MAAM,GAAG,UAAU;MACvB,OAAO,WAAW,KAAK,WAAW,EAAE;MACpC,OAAO,EAAE,MAAM,UAAU,MAAM,UAAU,gBAAgB,OAAO,EAAE,EAAE;MACpE,MAAM,oDAAoD,SAAS;IACrE,CAAC;AACD,QAAI,OAAO,GAAG,QAAQ,EAAE,OAAO,mBAAmB,MAAM,MAAM,CAAC,CAAC;AAChE,QAAI,OAAO,UAAU,YAAY,QAAQ,GAAG;AAC1C,UAAI,OAAO,GAAG,QAAQ,EAAE,OAAO,mBAAmB,MAAM,OAAO,KAAK,EAAE,CAAC,CAAC;IAC1E;AACA,QAAI,iBAAiB,SAAS,MAAM;AAClC,YAAM,OAAO,CAAC,KAAK,QAAQ,GAAG;AAC9B,WAAK,QAAQ,GAAG,IAAI;AACpB,UAAI,UAAU,OAAO,SAAS,IAAI;AAClC,UAAI,aAAa,gBAAgB,OAAO,IAAI,CAAC;IAC/C,CAAC;AACD,WAAO;EACT;;EAGQ,aAA0B;AAChC,UAAM,MAAM,GAAG,OAAO,EAAE,OAAO,aAAa,CAAC;AAE7C,UAAM,WAAW,KAAK,GAAG,mBAAmB;AAC5C,QAAI,WAAW,GAAG;AAChB,UAAI,OAAO,KAAK,GAAG,QAAQ,cAAc,aAAa,IAAI,KAAK,GAAG,EAAE,CAAC;IACvE;AAEA,UAAM,YAAY,KAAK,GAAG,aAAa;AACvC,QAAI,WAAW;AACb,YAAM,UAAU,GAAG,QAAQ,EAAE,OAAO,yCAAyC,GAAG;QAC9E,GAAG,QAAQ,EAAE,MAAM,oBAAe,eAAe,UAAU,UAAU,CAAC,GAAG,CAAC;QAC1E,GAAG,UAAU;UACX,OAAO;UACP,WAAW;UACX,MAAM;UACN,IAAI,EAAE,OAAO,MAAM,KAAK,GAAG,mBAAmB,EAAE;QAClD,CAAC;MACH,CAAC;AACD,UAAI,OAAO,OAAO;IACpB;AAEA,UAAM,SAAS,KAAK,GAAG,UAAU;AACjC,QAAI,QAAQ;AACV,YAAM,QAAQ,OAAO,WAAW,OAAO,WAAW;AAClD,YAAM,aAAa,GAAG,QAAQ,EAAE,OAAO,+BAA+B,OAAO,MAAM,GAAG;QACpF,GAAG,QAAQ,EAAE,OAAO,mBAAmB,MAAM,SAAS,OAAO,EAAE,EAAE,CAAC;QAClE,GAAG,UAAU;UACX,OAAO;UACP,WAAW;UACX,MAAM;UACN,IAAI,EAAE,OAAO,MAAM,KAAK,GAAG,eAAe,EAAE;QAC9C,CAAC;MACH,CAAC;AACD,UAAI,OAAO,UAAU;IACvB;AAGA,QAAI,MAAM,UAAU,IAAI,oBAAoB,IAAI,KAAK;AACrD,WAAO;EACT;EAEQ,eAA4B;AAClC,UAAM,OAAO,GAAG,UAAU;MACxB,OAAO;MACP,MAAM,WAAW;MACjB,IAAI,EAAE,OAAO,MAAM,KAAK,GAAG,WAAW,EAAE;IAC1C,CAAC;AACD,UAAM,SAAS,GAAG,UAAU;MAC1B,OAAO;MACP,MAAM,aAAa;MACnB,IAAI,EAAE,OAAO,MAAM,KAAK,GAAG,cAAc,EAAE;IAC7C,CAAC;AACD,UAAM,SAAS,GAAG,UAAU;MAC1B,OAAO;MACP,MAAM;MACN,IAAI,EAAE,OAAO,MAAM,KAAK,GAAG,QAAQ,EAAE;IACvC,CAAC;AACD,SAAK,YAAY,GAAG,UAAU;MAC5B,OAAO;MACP,MAAM,WAAW;MACjB,IAAI,EAAE,OAAO,MAAM,KAAK,KAAK,OAAO,EAAE;IACxC,CAAC;AACD,WAAO,GAAG,OAAO,EAAE,OAAO,eAAe,GAAG;MAC1C,GAAG,OAAO,EAAE,OAAO,4CAA4C,GAAG,CAAC,MAAM,MAAM,CAAC;MAChF,GAAG,OAAO,EAAE,OAAO,0CAA0C,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC;IAC1F,CAAC;EACH;EAEA,MAAc,SAAwB;AACpC,QAAI,KAAK,WAAY;AACrB,UAAM,UAAU,KAAK,SAAS,MAAM,KAAK;AACzC,SAAK,aAAa;AAClB,SAAK,UAAU,WAAW;AAC1B,SAAK,UAAU,YAAY;AAC3B,QAAI;AACF,YAAM,EAAE,SAAS,IAAI,MAAM,KAAK,GAAG,SAAS,SAAS,EAAE,GAAG,KAAK,QAAQ,CAAC;AACxE,WAAK,cAAc,QAAQ;IAC7B,SAAS,KAAK;AACZ,WAAK,YAAY,eAAe,QAAQ,IAAI,UAAU,sBAAsB;IAC9E,UAAA;AACE,WAAK,aAAa;IACpB;EACF;EAEQ,cAAc,UAAwB;AAC5C,UAAM,KAAK,IAAI;AACf,UAAM,SAAS,GAAG,OAAO,EAAE,OAAO,cAAc,GAAG;MACjD,GAAG,QAAQ,EAAE,MAAM,SAAS,CAAC;MAC7B,GAAG,UAAU;QACX,WAAW;QACX,MAAM;QACN,IAAI;UACF,OAAO,CAAC,MAAM;AACZ,kBAAM,MAAM,EAAE;AACd,iBAAK,KAAK,QAAQ,EAAE,KAAK,MAAM;AAC7B,kBAAI,YAAY;AAChB,yBAAW,MAAO,IAAI,YAAY,UAAW,IAAI;YACnD,CAAC;UACH;QACF;MACF,CAAC;IACH,CAAC;AACD,SAAK,KAAK;MACR,GAAG,OAAO,EAAE,OAAO,aAAa,GAAG;QACjC,GAAG,OAAO,EAAE,OAAO,2CAA2C,MAAM,UAAU,CAAC;QAC/E,GAAG,OAAO,EAAE,OAAO,qBAAqB,MAAM,mBAAmB,CAAC;QAClE,GAAG,OAAO,EAAE,OAAO,mBAAmB,MAAM,mDAA8C,CAAC;QAC3F;MACF,CAAC;IACH;AACA,SAAK,iBAAiB,WAAW,MAAM,KAAK,GAAG,QAAQ,GAAG,IAAI;EAChE;EAEQ,YAAY,SAAuB;AACzC,UAAM,KAAK,IAAI;AACf,SAAK,KAAK;MACR,GAAG,OAAO,EAAE,OAAO,aAAa,GAAG;QACjC,GAAG,OAAO,EAAE,OAAO,4CAA4C,MAAM,UAAU,CAAC;QAChF,GAAG,OAAO,EAAE,OAAO,qBAAqB,MAAM,oBAAoB,CAAC;QACnE,GAAG,OAAO,EAAE,OAAO,mBAAmB,MAAM,SAAS,SAAS,GAAG,EAAE,CAAC;QACpE,GAAG,OAAO,EAAE,OAAO,eAAe,GAAG;UACnC,GAAG,UAAU;YACX,OAAO;YACP,MAAM;YACN,IAAI,EAAE,OAAO,MAAM,KAAK,GAAG,QAAQ,EAAE;UACvC,CAAC;UACD,GAAG,UAAU;YACX,OAAO;YACP,MAAM;YACN,IAAI,EAAE,OAAO,MAAM,KAAK,WAAW,EAAE;UACvC,CAAC;QACH,CAAC;MACH,CAAC;IACH;EACF;AACF;AAEA,SAAS,KAAK,MAAc,OAAgB,OAA6B;AACvE,SAAO,GAAG,QAAQ,EAAE,OAAO,YAAY,QAAQ,MAAM,QAAQ,EAAE,IAAI,MAAM,OAAO,SAAS,KAAK,CAAC;AACjG;AAEA,SAAS,SAAS,OAAe,KAAqB;AACpD,SAAO,MAAM,SAAS,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,WAAM;AAC9D;AAGO,SAAS,eAAe,IAAoB;AACjD,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,GAAI,CAAC;AAC/C,QAAM,IAAI,KAAK,MAAM,QAAQ,EAAE;AAC/B,QAAM,IAAI,QAAQ;AAClB,SAAO,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAC9C;AAEA,eAAe,KAAK,MAA6B;AAC/C,MAAI;AACF,UAAM,UAAU,UAAU,UAAU,IAAI;EAC1C,QAAQ;EAER;AACF;ACrSO,IAAM,gBAAN,MAAoB;EASzB,YACmB,OACA,UACjB;AAFiB,SAAA,QAAA;AACA,SAAA,WAAA;AAEjB,SAAK,MAAM,GAAG,OAAO,EAAE,OAAO,sBAAsB,CAAC;AACrD,SAAK,YAAY,GAAG,OAAO,EAAE,OAAO,iBAAiB,GAAG,CAAC,KAAK,GAAG,CAAC;AAClE,SAAK,OAAO,GAAG,OAAO,EAAE,OAAO,iBAAiB,GAAG;MACjD,GAAG,QAAQ,EAAE,OAAO,yBAAyB,MAAM,iBAAiB,CAAC;MACrE,GAAG,UAAU;QACX,OAAO;QACP,MAAM;QACN,IAAI,EAAE,OAAO,MAAM,KAAK,OAAO,EAAE;MACnC,CAAC;IACH,CAAC;AACD,SAAK,MAAM,OAAO,KAAK,WAAW,KAAK,IAAI;AAC3C,SAAK,KAAK;EACZ;EAfmB;EACA;EAVX;EACA;EACA;EACA,UAA0B;EAC1B,SAAS;EACT,SAA2C;EAC3C,WAAgC;EAoBxC,IAAI,WAAoB;AACtB,WAAO,KAAK;EACd;EAEA,MAAM,QAAiC,UAA4B;AACjE,QAAI,KAAK,OAAQ;AACjB,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,KAAK,MAAM,UAAU;AAC1B,WAAO,iBAAiB,eAAe,KAAK,QAAQ,IAAI;AACxD,WAAO,iBAAiB,eAAe,KAAK,QAAQ,IAAI;AACxD,WAAO,iBAAiB,aAAa,KAAK,MAAM,IAAI;AACpD,WAAO,iBAAiB,SAAS,KAAK,SAAS,IAAI;AACnD,WAAO,iBAAiB,WAAW,KAAK,OAAO,IAAI;EACrD;EAEA,OAAa;AACX,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,KAAK;AACV,WAAO,oBAAoB,eAAe,KAAK,QAAQ,IAAI;AAC3D,WAAO,oBAAoB,eAAe,KAAK,QAAQ,IAAI;AAC3D,WAAO,oBAAoB,aAAa,KAAK,MAAM,IAAI;AACvD,WAAO,oBAAoB,SAAS,KAAK,SAAS,IAAI;AACtD,WAAO,oBAAoB,WAAW,KAAK,OAAO,IAAI;EACxD;EAEQ,SAAe;AACrB,UAAM,SAAS,KAAK;AACpB,SAAK,KAAK;AACV,aAAS;EACX;EAEQ,OAAa;AACnB,SAAK,UAAU,MAAM,UAAU;AAC/B,SAAK,KAAK,MAAM,UAAU;EAC5B;EAEQ,eAAe,GAAmB;AACxC,WAAO,EAAE,aAAa,EAAE,SAAS,KAAK,QAAQ;EAChD;EAEQ,WAAoB;AAC1B,WAAO,OAAO,OAAO,eAAe,cAAc,OAAO,WAAW,mBAAmB,EAAE;EAC3F;EAEQ,UAAU,GAAW,GAA2B;AACtD,UAAM,QAAQ,SAAS,iBAAiB,GAAG,CAAC;AAC5C,QAAI,CAAC,SAAS,UAAU,KAAK,SAAU,QAAO;AAC9C,WAAO;EACT;EAEQ,iBAAiB,QAAuB;AAC9C,SAAK,UAAU;AACf,UAAM,OAAO,OAAO,sBAAsB;AAC1C,WAAO,OAAO,KAAK,UAAU,OAAO;MAClC,SAAS;MACT,MAAM,GAAG,KAAK,IAAI;MAClB,KAAK,GAAG,KAAK,GAAG;MAChB,OAAO,GAAG,KAAK,KAAK;MACpB,QAAQ,GAAG,KAAK,MAAM;IACxB,CAAC;AACD,SAAK,IAAI,cAAc,SAAS,MAAM;EACxC;EAEQ,QAAQ,QAAuB;AACrC,UAAM,OAAO,KAAK;AAIlB,SAAK,kBAAkB;AACvB,SAAK,KAAK;AACV,WAAO,MAAM;EACf;EAEQ,oBAA0B;AAChC,UAAM,UAAU,CAAC,MAAwB;AACvC,QAAE,eAAe;AACjB,QAAE,yBAAyB;AAC3B,cAAQ;IACV;AACA,UAAM,UAAU,MAAY;AAC1B,aAAO,oBAAoB,SAAS,SAAS,IAAI;AACjD,mBAAa,KAAK;IACpB;AACA,WAAO,iBAAiB,SAAS,SAAS,EAAE,SAAS,KAAK,CAAC;AAG3D,UAAM,QAAQ,WAAW,SAAS,GAAG;EACvC;EAEQ,SAAS,CAAC,MAA0B;AAC1C,QAAI,KAAK,eAAe,CAAC,EAAG;AAE5B,QAAI,KAAK,SAAS,EAAG;AACrB,UAAM,SAAS,KAAK,UAAU,EAAE,SAAS,EAAE,OAAO;AAClD,QAAI,CAAC,UAAU,WAAW,KAAK,QAAS;AACxC,SAAK,iBAAiB,MAAM;EAC9B;EAEQ,SAAS,CAAC,MAA0B;AAC1C,QAAI,KAAK,eAAe,CAAC,EAAG;AAE5B,MAAE,eAAe;AACjB,MAAE,yBAAyB;EAC7B;EAEQ,OAAO,CAAC,MAA0B;AACxC,QAAI,KAAK,eAAe,CAAC,EAAG;AAC5B,MAAE,eAAe;AACjB,MAAE,yBAAyB;AAC3B,UAAM,SAAS,KAAK,UAAU,EAAE,SAAS,EAAE,OAAO;AAClD,QAAI,KAAK,SAAS,GAAG;AAGnB,UAAI,UAAU,WAAW,KAAK,SAAS;AACrC,aAAK,QAAQ,MAAM;MACrB,WAAW,QAAQ;AACjB,aAAK,iBAAiB,MAAM;MAC9B;AACA;IACF;AACA,UAAM,SAAS,UAAU,KAAK;AAC9B,QAAI,OAAQ,MAAK,QAAQ,MAAM;EACjC;EAEQ,UAAU,CAAC,MAAwB;AACzC,QAAI,KAAK,eAAe,CAAC,EAAG;AAE5B,MAAE,eAAe;AACjB,MAAE,yBAAyB;EAC7B;EAEQ,QAAQ,CAAC,MAA2B;AAC1C,QAAI,EAAE,QAAQ,SAAU;AACxB,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,SAAK,OAAO;EACd;AACF;AAEA,SAAS,SAAS,MAAuB;AACvC,QAAM,MAAM,KAAK,QAAQ,YAAY;AACrC,QAAM,KAAK,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK;AACrC,QAAM,MACJ,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,KAAK,IACtD,MAAM,KAAK,UAAU,KAAK,EAAE,MAAM,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAC7D;AACN,SAAO,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG;AAC1B;AC9LO,IAAM;;EAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACM9B,IAAM,UAAU;AAGvB,IAAM,mBAAmB;AAazB,IAAM,UAAN,MAAuC;EAkBrC,YAA6B,MAAmB;AAAnB,SAAA,OAAA;AAC3B,SAAK,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;AAChD,SAAK,SAAS,KAAK,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAErD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,cAAc;AACpB,SAAK,OAAO,OAAO,KAAK;AAExB,SAAK,QAAQ,GAAG,OAAO,EAAE,OAAO,aAAa,CAAC;AAC9C,SAAK,OAAO,OAAO,KAAK,KAAK;AAE7B,SAAK,SAAS,IAAI,cAAc,KAAK,OAAO,KAAK,IAAI;AACrD,SAAK,YAAY,IAAI,UAAU,KAAK,KAAK;AAEzC,SAAK,MAAM,OAAO,KAAK,UAAU,CAAC;AAClC,aAAS,gBAAgB,OAAO,KAAK,IAAI;AAEzC,WAAO,iBAAiB,WAAW,KAAK,aAAa,IAAI;EAC3D;EAlB6B;EAjBrB;EACA;EACA;EACA;EACA;EACA;EACA,QAAsB;EACtB,SAA+B;EAC/B,YAAY;EAEZ,gBAAoC;EACpC,mBAAuC;EACvC,oBAA2D;EAC3D,mBAAmB;;EAEnB,qBAAoC;EAsBpC,YAAyB;AAC/B,SAAK,UAAU,GAAG,UAAU;MAC1B,OAAO;MACP,WAAW;MACX,OAAO;MACP,MAAM;MACN,IAAI,EAAE,OAAO,MAAM,KAAK,aAAa,EAAE;IACzC,CAAC;AACD,WAAO,GAAG,OAAO,EAAE,OAAO,aAAa,OAAO,EAAE,MAAM,WAAW,cAAc,OAAO,EAAE,GAAG;MACzF,GAAG,QAAQ,EAAE,OAAO,kBAAkB,MAAM,QAAQ,CAAC;MACrD,GAAG,UAAU;QACX,OAAO;QACP,MAAM;QACN,IAAI,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE;MACjC,CAAC;MACD,KAAK;MACL,GAAG,QAAQ,EAAE,OAAO,iBAAiB,CAAC;MACtC,GAAG,UAAU;QACX,OAAO;QACP,WAAW;QACX,OAAO;QACP,MAAM;QACN,IAAI,EAAE,OAAO,MAAM,KAAK,QAAQ,EAAE;MACpC,CAAC;IACH,CAAC;EACH;EAEA,OAAa;AACX,QAAI,KAAK,UAAW;AACpB,SAAK,WAAW;AAChB,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,IAAI,MAAM;QACrB,UAAU,MAAM,KAAK,KAAK,cAAc;QACxC,WAAW,MAAM,KAAK;QACtB,oBAAoB,MAAM,KAAK,UAAU;QACzC,cAAc,MACZ,KAAK,uBAAuB,OAAO,EAAE,YAAY,KAAK,mBAAmB,IAAI;QAC/E,gBAAgB,MAAM;AACpB,eAAK,SAAS;AACd,eAAK,OAAO,QAAQ;QACtB;QACA,YAAY,MAAM,KAAK,gBAAgB;QACvC,eAAe,MAAM,KAAK,eAAe;QACzC,oBAAoB,MAAM,KAAK,iBAAiB;QAChD,SAAS,MAAM,KAAK,MAAM;QAC1B,UAAU,CAAC,SAAS,YAAY,KAAK,OAAO,SAAS,OAAO;MAC9D,CAAC;AACD,WAAK,MAAM,OAAO,KAAK,MAAM,IAAI;IACnC;AACA,SAAK,MAAM,KAAK,MAAM,UAAU;AAChC,SAAK,MAAM,QAAQ;AACnB,SAAK,MAAM,MAAM;EACnB;EAEA,QAAc;AACZ,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,QAAQ;AACnB,WAAK,QAAQ;IACf;EACF;EAEQ,SAAe;AACrB,QAAI,KAAK,SAAS,KAAK,MAAM,KAAK,MAAM,YAAY,OAAQ,MAAK,MAAM;QAClE,MAAK,KAAK;EACjB;EAEQ,eAAqB;AAC3B,QAAI,KAAK,OAAO,UAAU;AACxB,WAAK,WAAW;AAChB;IACF;AACA,SAAK,MAAM;AACX,SAAK,QAAQ,UAAU,IAAI,WAAW;AACtC,SAAK,OAAO;MACV,CAAC,SAAS;AACR,aAAK,QAAQ,UAAU,OAAO,WAAW;AACzC,aAAK,SAAS,KAAK,KAAK,OAAO,cAAc,IAAI;AACjD,aAAK,KAAK;MACZ;MACA,MAAM,KAAK,QAAQ,UAAU,OAAO,WAAW;IACjD;EACF;EAEQ,aAAmB;AACzB,QAAI,KAAK,OAAO,SAAU,MAAK,OAAO,KAAK;AAC3C,SAAK,QAAQ,UAAU,OAAO,WAAW;EAC3C;EAEQ,kBAAwB;AAC9B,QAAI,KAAK,MAAO,MAAK,MAAM,KAAK,MAAM,UAAU;AAChD,SAAK,UAAU,MAAM,MAAM;AACzB,UAAI,KAAK,OAAO;AACd,aAAK,MAAM,KAAK,MAAM,UAAU;AAChC,aAAK,MAAM,QAAQ;MACrB;IACF,CAAC;EACH;EAEQ,iBAAuB;AAC7B,QAAI,KAAK,KAAK,OAAO,YAAY,EAAG;AAEpC,SAAK,qBAAqB;AAC1B,SAAK,KAAK,OAAO,eAAe;AAChC,SAAK,mBAAmB,KAAK,IAAI;AACjC,QAAI,KAAK,MAAO,MAAK,MAAM,KAAK,MAAM,UAAU;AAChD,SAAK,kBAAkB;EACzB;EAEQ,gBAAsB;AAC5B,UAAM,SAAS,KAAK,KAAK,OAAO,cAAc;AAC9C,SAAK,qBAAqB,QAAQ,cAAc,KAAK,IAAI,IAAI,KAAK;AAClE,SAAK,kBAAkB;AAEvB,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,KAAK,MAAM,UAAU;AAChC,WAAK,MAAM,QAAQ;IACrB,OAAO;AACL,WAAK,KAAK;IACZ;EACF;EAEQ,mBAAyB;AAC/B,SAAK,KAAK,OAAO,iBAAiB;AAClC,SAAK,qBAAqB;AAC1B,SAAK,OAAO,QAAQ;EACtB;EAEQ,oBAA0B;AAChC,SAAK,mBAAmB,GAAG,QAAQ,EAAE,OAAO,uBAAuB,MAAM,OAAO,CAAC;AACjF,SAAK,gBAAgB,GAAG,OAAO,EAAE,OAAO,gBAAgB,GAAG;MACzD,GAAG,QAAQ,EAAE,OAAO,qBAAqB,CAAC;MAC1C,GAAG,QAAQ,EAAE,OAAO,wBAAwB,MAAM,YAAY,CAAC;MAC/D,KAAK;MACL,GAAG,UAAU;QACX,OAAO;QACP,MAAM,WAAW;QACjB,IAAI,EAAE,OAAO,MAAM,KAAK,cAAc,EAAE;MAC1C,CAAC;IACH,CAAC;AACD,SAAK,MAAM,OAAO,KAAK,aAAa;AACpC,SAAK,oBAAoB,YAAY,MAAM,KAAK,cAAc,GAAG,GAAG;EACtE;EAEQ,gBAAsB;AAC5B,UAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAClC,QAAI,KAAK,iBAAkB,MAAK,iBAAiB,cAAc,eAAe,OAAO;AACrF,QAAI,WAAW,iBAAkB,MAAK,cAAc;EACtD;EAEQ,oBAA0B;AAChC,QAAI,KAAK,mBAAmB;AAC1B,oBAAc,KAAK,iBAAiB;AACpC,WAAK,oBAAoB;IAC3B;AACA,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,OAAO;AAC1B,WAAK,gBAAgB;IACvB;AACA,SAAK,mBAAmB;EAC1B;EAEA,MAAc,OACZ,SACA,SAC+B;AAC/B,UAAM,cAA4B,KAAK,UAAU,KAAK;AACtD,UAAM,SAAS,MAAM,KAAK,KAAK,OAAO,aAAa;MACjD,SAAS,WAAW;MACpB;MACA,QAAQ,KAAK,UAAU;MACvB,uBAAuB,KAAK;MAC5B;IACF,CAAC;AAED,SAAK,SAAS;AACd,SAAK,UAAU,MAAM;AACrB,SAAK,qBAAqB;AAC1B,SAAK,KAAK,OAAO,iBAAiB;AAClC,WAAO;EACT;EAEQ,UAAgB;AACtB,SAAK,KAAK,UAAU;AACpB,SAAK,QAAQ;EACf;EAEQ,cAAc,CAAC,MAA2B;AAEhD,SAAK,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,OAAO,EAAE,QAAQ,MAAM;AAC9E,QAAE,eAAe;AACjB,WAAK,OAAO;IACd;EACF;EAEA,UAAgB;AACd,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY;AACjB,WAAO,oBAAoB,WAAW,KAAK,aAAa,IAAI;AAC5D,SAAK,WAAW;AAChB,QAAI,KAAK,KAAK,OAAO,YAAY,EAAG,MAAK,KAAK,OAAO,cAAc;AACnE,SAAK,kBAAkB;AACvB,QAAI,KAAK,UAAU,SAAU,MAAK,UAAU,KAAK;AACjD,SAAK,UAAU,MAAM;AACrB,SAAK,MAAM;AACX,SAAK,KAAK,OAAO;EACnB;AACF;AAEO,SAAS,aAAa,MAAkC;AAC7D,SAAO,IAAI,QAAQ,IAAI;AACzB;AClPO,SAAS,eAA+B;AAC7C,QAAM,SAAyB,EAAE,MAAM,MAAM;AAC7C,MAAI,OAAO,WAAW,YAAa,QAAO;AAE1C,QAAM,QAAQ,OAAO,MAAM;AAC3B,MAAI,CAAC,MAAO,QAAO;AAEnB,aAAW,SAAS,OAAO;AACzB,UAAM,OAAO,MAAM,KAAK,KAA2B;AACnD,UAAM,UAAU,KAAK,CAAC;AACtB,UAAM,UAAU,KAAK,CAAC;AACtB,YAAQ,SAAS;MACf,KAAK;AACH,YAAI,OAAO,YAAY,YAAa,WAAW,OAAO,YAAY,UAAW;AAC3E,iBAAO,OAAO;QAChB;AACA;MACF,KAAK;AACH,YAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,iBAAO,WAAW;QACpB;AACA;MACF,KAAK;AACH,YAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,iBAAO,MAAM;QACf;AACA;MACF,KAAK;AACH,eAAO,OAAO;AACd;IACJ;EACF;AAGA,MAAI,OAAO,KAAM,QAAO,KAAK,IAAI,CAAC;AAClC,SAAO;AACT;AAOO,SAAS,cAAc,SAAmC;AAC/D,MAAI,OAAO,WAAW,YAAa;AAEnC,QAAM,WAAuB,IAAI,SAA0B;AACzD,QAAI,CAAC,QAAS;AACd,UAAM,UAAU,KAAK,CAAC;AACtB,UAAM,UAAU,KAAK,CAAC;AACtB,YAAQ,SAAS;MACf,KAAK;AACH,YAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,kBAAQ,OAAO,OAAO,EAAE,MAAM,QAA2C,CAAC;QAC5E;AACA;MACF,KAAK;AACH,YAAI,WAAW,OAAO,YAAY,UAAU;AAC1C,kBAAQ,OAAO,OAAO,OAA8B;QACtD;AACA;MACF,KAAK;AACH,gBAAQ,KAAK;AACb;MACF,KAAK;AAEH;IACJ;EACF;AAEA,SAAO,OAAO;AAChB;AAGO,SAAS,aAAa,SAAsB,UAAgC;AACjF,MAAI,SAAS,SAAU,SAAQ,OAAO,OAAO,EAAE,MAAM,SAAS,SAAS,CAAC;AACxE,MAAI,SAAS,IAAK,SAAQ,OAAO,OAAO,SAAS,GAAG;AACpD,MAAI,SAAS,KAAM,SAAQ,KAAK;AAClC;ACpGO,IAAM,kBAAkB;AAExB,SAAS,cAAc,SAAiC;AAC7D,QAAM,MAAM,QAAQ,UAAU;AAC9B,SAAO;;;;;;+BAMsB,GAAG,MAAM,QAAQ,QAAQ;;AAExD;AAGO,IAAM,iBAAiB,cAAc,EAAE,UAAU,qBAAqB,CAAC;AXK9E,SAAS,SAAkB;AACzB,SAAO,OAAO,WAAW,eAAe,OAAO,aAAa;AAC9D;AAEA,SAAS,iBAAqC;AAC5C,QAAM,MAAM,SAAS,cAAc,sBAAsB;AACzD,SAAO,KAAK,aAAa,cAAc,KAAK;AAC9C;AAGA,SAAS,cACP,SACA,UACiD;AACjD,QAAM,EAAE,UAAU,aAAa,WAAW,IAAI,OAAO,IAAI,GAAG,KAAK,IAAI;AAErE,MAAI,eAAwC,CAAC;AAC7C,MAAI;AACJ,MAAI,OAAO,SAAS,SAAS,UAAU;AACrC,qBAAiB,SAAS;EAC5B,WAAW,SAAS,QAAQ,OAAO,SAAS,SAAS,UAAU;AAC7D,mBAAe,SAAS;AACxB,QAAI,OAAO,SAAS,KAAK,aAAa,SAAU,kBAAiB,SAAS,KAAK;EACjF;AAEA,QAAM,WAAW,eAAe,eAAe,KAAK;AACpD,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,SAAS,EAAE,GAAG,cAAc,GAAG,MAAM,SAAS;AACpD,SAAO,EAAE,UAAU,OAAO;AAC5B;AAOO,SAAS,KAAK,UAAuB,CAAC,GAAuB;AAClE,MAAI,CAAC,OAAO,EAAG,QAAO;AAEtB,QAAM,WAAW,aAAa;AAC9B,QAAM,YAAY,QAAQ,aAAa;AAEvC,QAAM,SAAS,QAAQ,UAAU,QAAQ,aAAa,SAAS;AAC/D,MAAI,CAAC,QAAQ;AACX,kBAAc,IAAI;AAClB,WAAO;EACT;AAEA,QAAM,WAAW,cAAc,SAAS,QAAQ;AAChD,MAAI,CAAC,UAAU;AACb,QAAI,QAAQ,MAAO,SAAQ,KAAK,8CAAyC;AACzE,kBAAc,IAAI;AAClB,WAAO;EACT;AAEA,QAAM,SAAS,IAAI,WAAW,SAAS,MAAM;AAC7C,SAAO,MAAM;AAEb,QAAM,gBAAgB,OAAqB;IACzC,KAAK,OAAO,SAAS;IACrB,OAAO,aAAa;IACpB,SAAS,cAAc;IACvB,IAAI,SAAS;IACb,UAAU,SAAS;IACnB,QAAQ,SAAS,OAAO,WAAW;;IAEnC,SAAS;IACT,SAAS;IACT,QAAQ;EACV;AAEA,MAAI,UAAgC;AACpC,QAAM,UAAuB;IAC3B;IACA,MAAM,MAAM,SAAS,KAAK;IAC1B,OAAO,MAAM,SAAS,MAAM;IAC5B,SAAS,MAAM;AACb,eAAS,QAAQ;AACjB,gBAAU;AACV,aAAO,KAAK;AACZ,gBAAU;AACV,oBAAc,IAAI;IACpB;EACF;AAEA,YAAU,aAAa;IACrB;IACA;IACA,WAAW,MAAM;AACf,aAAO,KAAK;AACZ,gBAAU;AACV,oBAAc,IAAI;IACpB;EACF,CAAC;AAED,gBAAc,OAAO;AACrB,eAAa,SAAS,QAAQ;AAE9B,SAAO;AACT;AAQO,SAAS,WAA+B;AAC7C,MAAI,CAAC,OAAO,EAAG,QAAO;AACtB,QAAM,gBAAgB,MAAM,KAAK,OAAO,MAAM,KAAK,CAAC,CAAC,EAAE;IACrD,CAAC,UAAW,MAA6B,CAAC,MAAM;EAClD;AACA,QAAM,cAAc,CAAC,CAAC,SAAS,cAAc,sBAAsB;AACnE,MAAI,CAAC,iBAAiB,CAAC,YAAa,QAAO;AAC3C,MAAI,CAAC,aAAa,EAAG,QAAO;AAC5B,SAAO,KAAK;AACd;AAMA,IAAI,OAAO,EAAG,UAAS;","names":[]}
|